diff --git a/.cargo/ci-config.toml b/.cargo/ci-config.toml index 09e1af5c18174f5b1024e223f4a0cd5dac256c6e..d5e312c2429ad8a4fa933d4080c8fcde217bd6eb 100644 --- a/.cargo/ci-config.toml +++ b/.cargo/ci-config.toml @@ -10,3 +10,15 @@ # Here, we opted to use `[target.'cfg(all())']` instead of `[build]` because `[target.'**']` is guaranteed to be cumulative. [target.'cfg(all())'] rustflags = ["-D", "warnings"] + +# Use Mold on Linux, because it's faster than GNU ld and LLD. +# +# We no longer set this in the default `config.toml` so that developers can opt in to Wild, which +# is faster than Mold, in their own ~/.cargo/config.toml. +[target.x86_64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=-fuse-ld=mold"] + +[target.aarch64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=-fuse-ld=mold"] diff --git a/.cargo/config.toml b/.cargo/config.toml index 717c5e18c8d294bacf65207bc6b8ecb7dba1b152..9b2e6f51c96e3ae98a54bbb11524210911d0e262 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -4,14 +4,9 @@ rustflags = ["-C", "symbol-mangling-version=v0", "--cfg", "tokio_unstable"] [alias] xtask = "run --package xtask --" - -[target.x86_64-unknown-linux-gnu] -linker = "clang" -rustflags = ["-C", "link-arg=-fuse-ld=mold"] - -[target.aarch64-unknown-linux-gnu] -linker = "clang" -rustflags = ["-C", "link-arg=-fuse-ld=mold"] +perf-test = ["test", "--profile", "release-fast", "--lib", "--bins", "--tests", "--all-features", "--config", "target.'cfg(true)'.runner='cargo run -p perf --release'", "--config", "target.'cfg(true)'.rustflags=[\"--cfg\", \"perf_enabled\"]"] +# Keep similar flags here to share some ccache +perf-compare = ["run", "--profile", "release-fast", "-p", "perf", "--config", "target.'cfg(true)'.rustflags=[\"--cfg\", \"perf_enabled\"]", "--", "compare"] [target.'cfg(target_os = "windows")'] rustflags = [ diff --git a/.config/hakari.toml b/.config/hakari.toml index b1e2954743b404f088c71c28aad1d6a699a22aeb..1e8386a14115be2e36b287ace0d47d464df9e620 100644 --- a/.config/hakari.toml +++ b/.config/hakari.toml @@ -24,9 +24,9 @@ workspace-members = [ third-party = [ { name = "reqwest", version = "0.11.27" }, # build of remote_server should not include scap / its x11 dependency - { name = "scap", git = "https://github.com/zed-industries/scap", rev = "808aa5c45b41e8f44729d02e38fd00a2fe2722e7" }, + { name = "zed-scap", git = "https://github.com/zed-industries/scap", rev = "4afea48c3b002197176fb19cd0f9b180dd36eaac", version = "0.0.8-zed" }, # build of remote_server should not need to include on libalsa through rodio - { name = "rodio", git = "https://github.com/RustAudio/rodio", branch = "better_wav_output"}, + { name = "rodio", git = "https://github.com/RustAudio/rodio" }, ] [final-excludes] @@ -37,8 +37,6 @@ workspace-members = [ "zed_glsl", "zed_html", "zed_proto", - "zed_ruff", "slash_commands_example", - "zed_snippets", "zed_test_extension", ] diff --git a/.github/ISSUE_TEMPLATE/07_bug_windows_alpha.yml b/.github/ISSUE_TEMPLATE/06_bug_windows_beta.yml similarity index 86% rename from .github/ISSUE_TEMPLATE/07_bug_windows_alpha.yml rename to .github/ISSUE_TEMPLATE/06_bug_windows_beta.yml index 826c2b8027144d4b658108e09c79e40490c3005d..b2b2a0f9dfcd5ddaa0dda41650864b053c5bb933 100644 --- a/.github/ISSUE_TEMPLATE/07_bug_windows_alpha.yml +++ b/.github/ISSUE_TEMPLATE/06_bug_windows_beta.yml @@ -1,8 +1,8 @@ -name: Bug Report (Windows Alpha) -description: Zed Windows Alpha Related Bugs +name: Bug Report (Windows Beta) +description: Zed Windows Beta Related Bugs type: "Bug" labels: ["windows"] -title: "Windows Alpha: " +title: "Windows Beta: " body: - type: textarea attributes: diff --git a/.github/ISSUE_TEMPLATE/07_bug_windows.yml b/.github/ISSUE_TEMPLATE/07_bug_windows.yml new file mode 100644 index 0000000000000000000000000000000000000000..4e90c15dbde1b2727b9508cee69b5c7fd9304fc3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/07_bug_windows.yml @@ -0,0 +1,35 @@ +name: Bug Report (Windows) +description: Zed Windows Related Bugs +type: "Bug" +labels: ["windows"] +title: "Windows: " +body: + - type: textarea + attributes: + label: Summary + description: Describe the bug with a one-line summary, and provide detailed reproduction steps + value: | + + SUMMARY_SENTENCE_HERE + + ### Description + + Steps to trigger the problem: + 1. + 2. + 3. + + **Expected Behavior**: + **Actual Behavior**: + + validations: + required: true + - type: textarea + id: environment + attributes: + label: Zed Version and System Specs + description: 'Open Zed, and in the command palette select "zed: copy system specs into clipboard"' + placeholder: | + Output of "zed: copy system specs into clipboard" + validations: + required: true diff --git a/.github/actions/run_tests/action.yml b/.github/actions/run_tests/action.yml index 7a4d3e948bb4d205412ca93fa5cc0e1351e65ebd..faf94017976f4b06fdaaa80a5db8083405a7950a 100644 --- a/.github/actions/run_tests/action.yml +++ b/.github/actions/run_tests/action.yml @@ -20,9 +20,4 @@ runs: - name: Run tests shell: bash -euxo pipefail {0} - run: cargo nextest run --workspace --no-fail-fast - - - name: Run doctests - shell: bash -euxo pipefail {0} - # Nextest currently doesn't support doctests - run: cargo test --workspace --doc --no-fail-fast + run: cargo nextest run --workspace --no-fail-fast --failure-output immediate-final diff --git a/.github/actions/run_tests_windows/action.yml b/.github/actions/run_tests_windows/action.yml index 8392ca1d375856c7f649e73d2445ce4f873924b1..d85d47cb969e22ca3c73c9ab8caca279a9b5ba88 100644 --- a/.github/actions/run_tests_windows/action.yml +++ b/.github/actions/run_tests_windows/action.yml @@ -24,4 +24,4 @@ runs: shell: powershell working-directory: ${{ inputs.working-directory }} run: | - cargo nextest run --workspace --no-fail-fast + cargo nextest run --workspace --no-fail-fast --failure-output immediate-final diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d416b4af0eedf38da249e39181bd8017b57f752c..f5bf5790e4b7daf02f4713d25b1017b494f88f1a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -373,6 +373,46 @@ jobs: if: always() run: rm -rf ./../.cargo + doctests: + # Nextest currently doesn't support doctests, so run them separately and in parallel. + timeout-minutes: 60 + name: (Linux) Run doctests + needs: [job_spec] + if: | + github.repository_owner == 'zed-industries' && + needs.job_spec.outputs.run_tests == 'true' + runs-on: + - namespace-profile-16x32-ubuntu-2204 + steps: + - name: Add Rust to the PATH + run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" + + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + clean: false + + - name: Cache dependencies + uses: swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2 + with: + save-if: ${{ github.ref == 'refs/heads/main' }} + # cache-provider: "buildjet" + + - name: Install Linux dependencies + run: ./script/linux + + - name: Configure CI + run: | + mkdir -p ./../.cargo + cp ./.cargo/ci-config.toml ./../.cargo/config.toml + + - name: Run doctests + run: cargo test --workspace --doc --no-fail-fast + + - name: Clean CI config file + if: always() + run: rm -rf ./../.cargo + build_remote_server: timeout-minutes: 60 name: (Linux) Build Remote Server @@ -786,8 +826,9 @@ jobs: timeout-minutes: 120 name: Create a Windows installer runs-on: [self-32vcpu-windows-2022] - if: contains(github.event.pull_request.labels.*.name, 'run-bundling') - # if: (startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-bundling')) + if: | + ( startsWith(github.ref, 'refs/tags/v') + || contains(github.event.pull_request.labels.*.name, 'run-bundling') ) needs: [windows_tests] env: AZURE_TENANT_ID: ${{ secrets.AZURE_SIGNING_TENANT_ID }} @@ -825,13 +866,12 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 if: contains(github.event.pull_request.labels.*.name, 'run-bundling') with: - name: ZedEditorUserSetup-x64-${{ github.event.pull_request.head.sha || github.sha }}.exe + name: Zed_${{ github.event.pull_request.head.sha || github.sha }}-x86_64.exe path: ${{ env.SETUP_PATH }} - name: Upload Artifacts to release uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v1 - # Re-enable when we are ready to publish windows preview releases - if: ${{ !(contains(github.event.pull_request.labels.*.name, 'run-bundling')) && env.RELEASE_CHANNEL == 'preview' }} # upload only preview + if: ${{ !(contains(github.event.pull_request.labels.*.name, 'run-bundling')) }} with: draft: true prerelease: ${{ env.RELEASE_CHANNEL == 'preview' }} diff --git a/.github/workflows/community_champion_auto_labeler.yml b/.github/workflows/community_champion_auto_labeler.yml new file mode 100644 index 0000000000000000000000000000000000000000..c525bf4738f888b5ca84230982ff1f4f5da2db2f --- /dev/null +++ b/.github/workflows/community_champion_auto_labeler.yml @@ -0,0 +1,48 @@ +name: Community Champion Auto Labeler + +on: + issues: + types: [opened] + pull_request_target: + types: [opened] + +jobs: + label_community_champion: + if: github.repository_owner == 'zed-industries' + runs-on: ubuntu-latest + steps: + - name: Check if author is a community champion and apply label + uses: actions/github-script@v7 + with: + script: | + const communityChampionBody = `${{ secrets.COMMUNITY_CHAMPIONS }}`; + + const communityChampions = communityChampionBody + .split('\n') + .map(handle => handle.trim().toLowerCase()); + + let author; + if (context.eventName === 'issues') { + author = context.payload.issue.user.login; + } else if (context.eventName === 'pull_request_target') { + author = context.payload.pull_request.user.login; + } + + if (!author || !communityChampions.includes(author.toLowerCase())) { + return; + } + + const issueNumber = context.payload.issue?.number || context.payload.pull_request?.number; + + try { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + labels: ['community champion'] + }); + + console.log(`Applied 'community champion' label to #${issueNumber} by ${author}`); + } catch (error) { + console.error(`Failed to apply label: ${error.message}`); + } diff --git a/.github/workflows/community_release_actions.yml b/.github/workflows/community_release_actions.yml index 37ade90574e76cd95755aad6b5601a43946a271c..4a042a5e06b499b1ca278f152798c171971129ee 100644 --- a/.github/workflows/community_release_actions.yml +++ b/.github/workflows/community_release_actions.yml @@ -1,3 +1,6 @@ +# IF YOU UPDATE THE NAME OF ANY GITHUB SECRET, YOU MUST CHERRY PICK THE COMMIT +# TO BOTH STABLE AND PREVIEW CHANNELS + name: Release Actions on: @@ -13,9 +16,9 @@ jobs: id: get-release-url run: | if [ "${{ github.event.release.prerelease }}" == "true" ]; then - URL="https://zed.dev/releases/preview/latest" + URL="https://zed.dev/releases/preview" else - URL="https://zed.dev/releases/stable/latest" + URL="https://zed.dev/releases/stable" fi echo "URL=$URL" >> "$GITHUB_OUTPUT" @@ -36,7 +39,7 @@ jobs: content: ${{ steps.get-content.outputs.string }} send_release_notes_email: - if: github.repository_owner == 'zed-industries' && !github.event.release.prerelease + if: false && github.repository_owner == 'zed-industries' && !github.event.release.prerelease runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 diff --git a/.github/workflows/issue_response.yml b/.github/workflows/issue_response.yml deleted file mode 100644 index f084b9ba9dfc4aba46a766986bafcffa3e9fd0ce..0000000000000000000000000000000000000000 --- a/.github/workflows/issue_response.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Issue Response - -on: - schedule: - - cron: "0 12 * * 2" - workflow_dispatch: - -jobs: - issue-response: - if: github.repository_owner == 'zed-industries' - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 - with: - version: 9 - - - name: Setup Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 - with: - node-version: "20" - cache: "pnpm" - cache-dependency-path: "script/issue_response/pnpm-lock.yaml" - - - run: pnpm install --dir script/issue_response - - - name: Run Issue Response - run: pnpm run --dir script/issue_response start - env: - ISSUE_RESPONSE_GITHUB_TOKEN: ${{ secrets.ISSUE_RESPONSE_GITHUB_TOKEN }} - SLACK_ISSUE_RESPONSE_WEBHOOK_URL: ${{ secrets.SLACK_ISSUE_RESPONSE_WEBHOOK_URL }} diff --git a/.gitignore b/.gitignore index 7b40c45adf614eb91f1676144e7b70a7b2a373f2..d248b1f7e5adf30cb286a1737c1cd4f72f0f5d20 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ .venv .vscode .wrangler +.perf-runs /assets/*licenses.* /crates/collab/seed.json /crates/theme/schemas/theme.json diff --git a/.rules b/.rules index 2f2b9cd705d95775bedf092bc4e6254136da6117..82d15eb9e88299ee7c7fe6c717b2da2646e676a7 100644 --- a/.rules +++ b/.rules @@ -59,7 +59,7 @@ Trying to update an entity while it's already being updated must be avoided as t When `read_with`, `update`, or `update_in` are used with an async context, the closure's return value is wrapped in an `anyhow::Result`. -`WeakEntity` is a weak handle. It has `read_with`, `update`, and `update_in` methods that work the same, but always return an `anyhow::Result` so that they can fail if the entity no longer exists. This can be useful to avoid memory leaks - if entities have mutually recursive handles to eachother they will never be dropped. +`WeakEntity` is a weak handle. It has `read_with`, `update`, and `update_in` methods that work the same, but always return an `anyhow::Result` so that they can fail if the entity no longer exists. This can be useful to avoid memory leaks - if entities have mutually recursive handles to each other they will never be dropped. ## Concurrency diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8615ba2c9ad324357792772392c49c7899ffa410..9cbac4af2b57f0350fa9f5665e110e0d6e7f6341 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,6 +63,7 @@ Although there are few hard and fast rules, typically we don't merge: - New file icons. Zed's default icon theme consists of icons that are hand-designed to fit together in a cohesive manner, please don't submit PRs with off-the-shelf SVGs. - Giant refactorings. - Non-trivial changes with no tests. +- Stylistic code changes that do not alter any app logic. Reducing allocations, removing `.unwrap()`s, fixing typos is great; making code "more readable" — maybe not so much. - Features where (in our subjective opinion) the extra complexity isn't worth it for the number of people who will benefit. - Anything that seems completely AI generated. diff --git a/Cargo.lock b/Cargo.lock index 8252dc5fe867fc0668ea94b41cee502b47e3aa84..14c4ab1fd13d0bcaa877eea987ce9f73a5edfd2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,7 +11,6 @@ dependencies = [ "agent_settings", "anyhow", "buffer_diff", - "collections", "editor", "env_logger 0.11.8", "file_icons", @@ -36,11 +35,11 @@ dependencies = [ "terminal", "ui", "url", - "util", "uuid", "watch", - "which 6.0.3", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -48,7 +47,6 @@ name = "acp_tools" version = "0.1.0" dependencies = [ "agent-client-protocol", - "collections", "gpui", "language", "markdown", @@ -58,9 +56,10 @@ dependencies = [ "settings", "theme", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -70,7 +69,6 @@ dependencies = [ "anyhow", "buffer_diff", "clock", - "collections", "ctor", "futures 0.3.31", "gpui", @@ -83,9 +81,10 @@ dependencies = [ "serde_json", "settings", "text", - "util", "watch", "workspace-hack", + "zed-collections", + "zed-util", "zlog", ] @@ -105,9 +104,9 @@ dependencies = [ "release_channel", "smallvec", "ui", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -150,7 +149,6 @@ dependencies = [ "chrono", "client", "cloud_llm_client", - "collections", "component", "context_server", "convert_case 0.8.0", @@ -159,7 +157,6 @@ dependencies = [ "git", "gpui", "heed", - "http_client", "icons", "indoc", "itertools 0.14.0", @@ -175,7 +172,7 @@ dependencies = [ "rand 0.9.1", "ref-cast", "rope", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", @@ -186,26 +183,29 @@ dependencies = [ "theme", "thiserror 2.0.12", "time", - "util", "uuid", "workspace", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", "zed_env_vars", "zstd", ] [[package]] name = "agent-client-protocol" -version = "0.2.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003fb91bf1b8d6e15f72c45fb9171839af8241e81e3839fbb73536af113b7a79" +checksum = "3aaa2bd05a2401887945f8bfd70026e90bc3cf96c62ab9eba2779835bf21dc60" dependencies = [ "anyhow", "async-broadcast", + "async-trait", "futures 0.3.31", "log", "parking_lot", - "schemars", + "schemars 1.0.1", "serde", "serde_json", ] @@ -228,7 +228,6 @@ dependencies = [ "client", "clock", "cloud_llm_client", - "collections", "context_server", "ctor", "db", @@ -241,7 +240,6 @@ dependencies = [ "gpui_tokio", "handlebars 4.5.0", "html_to_markdown", - "http_client", "indoc", "itertools 0.14.0", "language", @@ -257,7 +255,7 @@ dependencies = [ "prompt_store", "reqwest_client", "rust-embed", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", @@ -273,12 +271,14 @@ dependencies = [ "tree-sitter-rust", "ui", "unindent", - "util", "uuid", "watch", "web_search", "workspace-hack", "worktree", + "zed-collections", + "zed-http-client", + "zed-util", "zed_env_vars", "zlog", "zstd", @@ -294,8 +294,8 @@ dependencies = [ "agent-client-protocol", "agent_settings", "anyhow", + "async-trait", "client", - "collections", "env_logger 0.11.8", "fs", "futures 0.3.31", @@ -316,11 +316,15 @@ dependencies = [ "smol", "task", "tempfile", + "terminal", "thiserror 2.0.12", "ui", - "util", + "uuid", "watch", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -329,19 +333,20 @@ version = "0.1.0" dependencies = [ "anyhow", "cloud_llm_client", - "collections", "convert_case 0.8.0", "fs", "gpui", "language_model", "paths", - "schemars", + "project", + "schemars 1.0.1", "serde", "serde_json", "serde_json_lenient", "settings", - "util", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -368,7 +373,6 @@ dependencies = [ "chrono", "client", "cloud_llm_client", - "collections", "command_palette_hooks", "component", "context_server", @@ -383,7 +387,6 @@ dependencies = [ "fuzzy", "gpui", "html_to_markdown", - "http_client", "indoc", "itertools 0.14.0", "jsonschema", @@ -410,13 +413,12 @@ dependencies = [ "release_channel", "rope", "rules_library", - "schemars", + "schemars 1.0.1", "search", "serde", "serde_json", "serde_json_lenient", "settings", - "shlex", "smol", "streaming_diff", "task", @@ -434,10 +436,12 @@ dependencies = [ "unindent", "url", "urlencoding", - "util", "watch", "workspace", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", "zed_actions", ] @@ -483,7 +487,6 @@ dependencies = [ "client", "cloud_llm_client", "component", - "feature_flags", "gpui", "language_model", "serde", @@ -496,8 +499,9 @@ dependencies = [ [[package]] name = "alacritty_terminal" -version = "0.25.1-dev" -source = "git+https://github.com/zed-industries/alacritty.git?branch=add-hush-login-flag#828457c9ff1f7ea0a0469337cc8a37ee3a1b0590" +version = "0.25.1-rc1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb5f4f1ef69bdb8b2095ddd14b09dd74ee0303aae8bd5372667a54cff689a1b" dependencies = [ "base64 0.22.1", "bitflags 2.9.0", @@ -509,10 +513,11 @@ dependencies = [ "piper", "polling", "regex-automata", + "rustix 1.0.7", "rustix-openpty", "serde", "signal-hook", - "unicode-width 0.1.14", + "unicode-width", "vte", "windows-sys 0.59.0", ] @@ -565,12 +570,12 @@ checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" [[package]] name = "ammonia" -version = "4.1.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ada2ee439075a3e70b6992fce18ac4e407cd05aea9ca3f75d2c0b0c20bbb364" +checksum = "17e913097e1a2124b46746c980134e8c954bc17a6a59bb3fde96f088d126dde6" dependencies = [ "cssparser", - "html5ever 0.31.0", + "html5ever 0.35.0", "maplit", "tendril", "url", @@ -654,13 +659,14 @@ dependencies = [ "anyhow", "chrono", "futures 0.3.31", - "http_client", - "schemars", + "schemars 1.0.1", "serde", "serde_json", + "settings", "strum 0.27.1", "thiserror 2.0.12", "workspace-hack", + "zed-http-client", ] [[package]] @@ -689,12 +695,9 @@ name = "arbitrary" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +dependencies = [ + "derive_arbitrary", +] [[package]] name = "arg_enum_proc_macro" @@ -775,6 +778,9 @@ dependencies = [ "serde", "serde_repr", "url", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.32.6", "zbus", ] @@ -803,12 +809,14 @@ dependencies = [ "anyhow", "futures 0.3.31", "gpui", + "log", "net", - "parking_lot", "smol", "tempfile", - "util", + "windows 0.61.1", "workspace-hack", + "zed-util", + "zeroize", ] [[package]] @@ -833,7 +841,6 @@ dependencies = [ "client", "clock", "cloud_llm_client", - "collections", "context_server", "fs", "futures 0.3.31", @@ -862,10 +869,11 @@ dependencies = [ "text", "ui", "unindent", - "util", "uuid", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_env_vars", ] @@ -875,7 +883,6 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "collections", "derive_more", "extension", "futures 0.3.31", @@ -889,6 +896,8 @@ dependencies = [ "ui", "workspace", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -897,9 +906,7 @@ version = "0.1.0" dependencies = [ "anyhow", "assistant_slash_command", - "cargo_toml", "chrono", - "collections", "context_server", "editor", "feature_flags", @@ -909,7 +916,6 @@ dependencies = [ "globset", "gpui", "html_to_markdown", - "http_client", "language", "pretty_assertions", "project", @@ -920,12 +926,13 @@ dependencies = [ "settings", "smol", "text", - "toml 0.8.20", "ui", - "util", "workspace", "workspace-hack", "worktree", + "zed-collections", + "zed-http-client", + "zed-util", "zlog", ] @@ -937,7 +944,6 @@ dependencies = [ "anyhow", "buffer_diff", "clock", - "collections", "ctor", "derive_more", "gpui", @@ -955,9 +961,10 @@ dependencies = [ "serde_json", "settings", "text", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zlog", ] @@ -974,7 +981,6 @@ dependencies = [ "client", "clock", "cloud_llm_client", - "collections", "component", "derive_more", "diffy", @@ -986,7 +992,6 @@ dependencies = [ "gpui_tokio", "handlebars 4.5.0", "html_to_markdown", - "http_client", "indoc", "itertools 0.14.0", "language", @@ -1005,7 +1010,7 @@ dependencies = [ "regex", "reqwest_client", "rust-embed", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", @@ -1021,12 +1026,13 @@ dependencies = [ "tree-sitter-rust", "ui", "unindent", - "util", "watch", "web_search", - "which 6.0.3", "workspace", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", "zlog", ] @@ -1401,20 +1407,20 @@ version = "0.1.0" dependencies = [ "anyhow", "async-tar", - "collections", "crossbeam", + "denoise", "gpui", "libwebrtc", "log", "parking_lot", "rodio", - "schemars", "serde", "settings", "smol", "thiserror 2.0.12", - "util", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -1437,11 +1443,9 @@ dependencies = [ "client", "db", "gpui", - "http_client", "log", "paths", "release_channel", - "schemars", "serde", "serde_json", "settings", @@ -1450,6 +1454,7 @@ dependencies = [ "which 6.0.3", "workspace", "workspace-hack", + "zed-http-client", ] [[package]] @@ -1473,15 +1478,15 @@ dependencies = [ "client", "editor", "gpui", - "http_client", "markdown_preview", "release_channel", "serde", "serde_json", "smol", - "util", "workspace", "workspace-hack", + "zed-http-client", + "zed-util", ] [[package]] @@ -2008,8 +2013,8 @@ version = "0.1.0" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", - "http_client", "workspace-hack", + "zed-http-client", ] [[package]] @@ -2143,7 +2148,7 @@ dependencies = [ "aws-sdk-bedrockruntime", "aws-smithy-types", "futures 0.3.31", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "strum 0.27.1", @@ -2151,12 +2156,6 @@ dependencies = [ "workspace-hack", ] -[[package]] -name = "beef" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" - [[package]] name = "bigdecimal" version = "0.4.8" @@ -2312,14 +2311,15 @@ dependencies = [ [[package]] name = "blade-graphics" -version = "0.6.0" -source = "git+https://github.com/kvark/blade?rev=bfa594ea697d4b6326ea29f747525c85ecf933b9#bfa594ea697d4b6326ea29f747525c85ecf933b9" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4deb8f595ce7f00dee3543ebf6fd9a20ea86fc421ab79600dac30876250bdae" dependencies = [ "ash", "ash-window", "bitflags 2.9.0", "bytemuck", - "codespan-reporting 0.11.1", + "codespan-reporting", "glow", "gpu-alloc", "gpu-alloc-ash", @@ -2337,6 +2337,7 @@ dependencies = [ "objc2-metal", "objc2-quartz-core", "objc2-ui-kit", + "once_cell", "raw-window-handle", "slab", "wasm-bindgen", @@ -2346,7 +2347,8 @@ dependencies = [ [[package]] name = "blade-macros" version = "0.3.0" -source = "git+https://github.com/kvark/blade?rev=bfa594ea697d4b6326ea29f747525c85ecf933b9#bfa594ea697d4b6326ea29f747525c85ecf933b9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27142319e2f4c264581067eaccb9f80acccdde60d8b4bf57cc50cd3152f109ca" dependencies = [ "proc-macro2", "quote", @@ -2355,8 +2357,9 @@ dependencies = [ [[package]] name = "blade-util" -version = "0.2.0" -source = "git+https://github.com/kvark/blade?rev=bfa594ea697d4b6326ea29f747525c85ecf933b9#bfa594ea697d4b6326ea29f747525c85ecf933b9" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6be3a82c001ba7a17b6f8e413ede5d1004e6047213f8efaf0ffc15b5c4904c" dependencies = [ "blade-graphics", "bytemuck", @@ -2364,15 +2367,6 @@ dependencies = [ "profiling", ] -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - [[package]] name = "block" version = "0.1.6" @@ -2419,6 +2413,20 @@ dependencies = [ "piper", ] +[[package]] +name = "bm25" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cbd8ffdfb7b4c2ff038726178a780a94f90525ed0ad264c0afaa75dd8c18a64" +dependencies = [ + "cached", + "deunicode", + "fxhash", + "rust-stemmers", + "stop-words", + "unicode-segmentation", +] + [[package]] name = "borrow-or-share" version = "0.2.2" @@ -2490,11 +2498,11 @@ dependencies = [ "rand 0.9.1", "rope", "serde_json", - "sum_tree", "text", "unindent", - "util", "workspace-hack", + "zed-sum-tree", + "zed-util", "zlog", ] @@ -2625,6 +2633,39 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "cached" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801927ee168e17809ab8901d9f01f700cd7d8d6a6527997fee44e4b0327a253c" +dependencies = [ + "ahash 0.8.11", + "cached_proc_macro", + "cached_proc_macro_types", + "hashbrown 0.15.3", + "once_cell", + "thiserror 2.0.12", + "web-time", +] + +[[package]] +name = "cached_proc_macro" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9225bdcf4e4a9a4c08bf16607908eb2fbf746828d5e0b5e019726dbf6571f201" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "cached_proc_macro_types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" + [[package]] name = "call" version = "0.1.0" @@ -2632,25 +2673,23 @@ dependencies = [ "anyhow", "audio", "client", - "collections", "feature_flags", "fs", "futures 0.3.31", "gpui", "gpui_tokio", - "http_client", "language", "livekit_client", "log", "postage", "project", - "schemars", "serde", - "serde_derive", "settings", "telemetry", - "util", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -2688,6 +2727,53 @@ dependencies = [ "serde", ] +[[package]] +name = "candle-core" +version = "0.9.1" +source = "git+https://github.com/zed-industries/candle?branch=9.1-patched#724d75eb3deebefe83f2a7381a45d4fac6eda383" +dependencies = [ + "byteorder", + "float8", + "gemm 0.17.1", + "half", + "memmap2", + "num-traits", + "num_cpus", + "rand 0.9.1", + "rand_distr", + "rayon", + "safetensors", + "thiserror 1.0.69", + "ug", + "yoke", + "zip 1.1.4", +] + +[[package]] +name = "candle-nn" +version = "0.9.1" +source = "git+https://github.com/zed-industries/candle?branch=9.1-patched#724d75eb3deebefe83f2a7381a45d4fac6eda383" +dependencies = [ + "candle-core", + "half", + "libc", + "num-traits", + "rayon", + "safetensors", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "candle-onnx" +version = "0.9.1" +source = "git+https://github.com/zed-industries/candle?branch=9.1-patched#724d75eb3deebefe83f2a7381a45d4fac6eda383" +dependencies = [ + "candle-core", + "candle-nn", + "prost 0.12.6", +] + [[package]] name = "cap-fs-ext" version = "3.4.4" @@ -2821,7 +2907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" dependencies = [ "heck 0.4.1", - "indexmap", + "indexmap 2.9.0", "log", "proc-macro2", "quote", @@ -2902,10 +2988,8 @@ dependencies = [ "anyhow", "client", "clock", - "collections", "futures 0.3.31", "gpui", - "http_client", "language", "log", "postage", @@ -2914,8 +2998,10 @@ dependencies = [ "settings", "text", "time", - "util", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -2930,7 +3016,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -3049,8 +3135,8 @@ name = "cli" version = "0.1.0" dependencies = [ "anyhow", + "askpass", "clap", - "collections", "core-foundation 0.10.0", "core-services", "exec", @@ -3062,9 +3148,10 @@ dependencies = [ "release_channel", "serde", "tempfile", - "util", "windows 0.61.1", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -3078,7 +3165,6 @@ dependencies = [ "clock", "cloud_api_client", "cloud_llm_client", - "collections", "credentials_provider", "derive_more", "feature_flags", @@ -3086,7 +3172,6 @@ dependencies = [ "futures 0.3.31", "gpui", "gpui_tokio", - "http_client", "http_client_tls", "httparse", "log", @@ -3099,7 +3184,6 @@ dependencies = [ "release_channel", "rpc", "rustls-pki-types", - "schemars", "serde", "serde_json", "serde_urlencoded", @@ -3117,10 +3201,12 @@ dependencies = [ "tokio-rustls 0.26.2", "tokio-socks", "url", - "util", "windows 0.61.1", "workspace-hack", "worktree", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -3142,11 +3228,11 @@ dependencies = [ "futures 0.3.31", "gpui", "gpui_tokio", - "http_client", "parking_lot", "serde_json", "workspace-hack", "yawc", + "zed-http-client", ] [[package]] @@ -3168,6 +3254,7 @@ name = "cloud_llm_client" version = "0.1.0" dependencies = [ "anyhow", + "chrono", "pretty_assertions", "serde", "serde_json", @@ -3177,10 +3264,18 @@ dependencies = [ ] [[package]] -name = "clru" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59" +name = "cloud_zeta2_prompt" +version = "0.1.0" +dependencies = [ + "anyhow", + "cloud_llm_client", + "indoc", + "ordered-float 2.10.1", + "rustc-hash 2.1.1", + "serde", + "strum 0.27.1", + "workspace-hack", +] [[package]] name = "cmake" @@ -3259,23 +3354,34 @@ dependencies = [ [[package]] name = "codespan-reporting" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ + "serde", "termcolor", - "unicode-width 0.1.14", + "unicode-width", ] [[package]] -name = "codespan-reporting" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +name = "codestral" +version = "0.1.0" dependencies = [ + "anyhow", + "edit_prediction", + "edit_prediction_context", + "futures 0.3.31", + "gpui", + "language", + "language_models", + "log", + "mistral", "serde", - "termcolor", - "unicode-width 0.2.0", + "serde_json", + "smol", + "text", + "workspace-hack", + "zed-http-client", ] [[package]] @@ -3302,7 +3408,6 @@ dependencies = [ "client", "clock", "collab_ui", - "collections", "command_palette_hooks", "context_server", "ctor", @@ -3323,7 +3428,6 @@ dependencies = [ "gpui", "gpui_tokio", "hex", - "http_client", "hyper 0.14.32", "indoc", "language", @@ -3351,13 +3455,10 @@ dependencies = [ "reqwest 0.11.27", "reqwest_client", "rpc", - "rustc-demangle", "scrypt", "sea-orm", - "semantic_version", "semver", "serde", - "serde_derive", "serde_json", "session", "settings", @@ -3379,11 +3480,14 @@ dependencies = [ "tracing", "tracing-subscriber", "unindent", - "util", "uuid", "workspace", "workspace-hack", "worktree", + "zed-collections", + "zed-http-client", + "zed-semantic-version", + "zed-util", "zlog", ] @@ -3396,13 +3500,11 @@ dependencies = [ "channel", "chrono", "client", - "collections", "db", "editor", "futures 0.3.31", "fuzzy", "gpui", - "http_client", "log", "menu", "notifications", @@ -3411,9 +3513,7 @@ dependencies = [ "project", "release_channel", "rpc", - "schemars", "serde", - "serde_derive", "serde_json", "settings", "smallvec", @@ -3425,18 +3525,11 @@ dependencies = [ "title_bar", "tree-sitter-md", "ui", - "util", "workspace", "workspace-hack", -] - -[[package]] -name = "collections" -version = "0.1.0" -dependencies = [ - "indexmap", - "rustc-hash 2.1.1", - "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -3477,7 +3570,6 @@ version = "0.1.0" dependencies = [ "anyhow", "client", - "collections", "command_palette_hooks", "ctor", "db", @@ -3499,9 +3591,10 @@ dependencies = [ "theme", "time", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", ] @@ -3509,17 +3602,16 @@ dependencies = [ name = "command_palette_hooks" version = "0.1.0" dependencies = [ - "collections", "derive_more", "gpui", "workspace-hack", + "zed-collections", ] [[package]] name = "component" version = "0.1.0" dependencies = [ - "collections", "documented", "gpui", "inventory", @@ -3527,6 +3619,7 @@ dependencies = [ "strum 0.27.1", "theme", "workspace-hack", + "zed-collections", ] [[package]] @@ -3547,7 +3640,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.0", + "unicode-width", "windows-sys 0.59.0", ] @@ -3589,21 +3682,22 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "collections", "futures 0.3.31", "gpui", "log", "net", "parking_lot", "postage", - "schemars", + "schemars 1.0.1", "serde", "serde_json", + "settings", "smol", "tempfile", "url", - "util", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -3639,7 +3733,6 @@ dependencies = [ "chrono", "client", "clock", - "collections", "command_palette_hooks", "ctor", "dirs 4.0.0", @@ -3648,7 +3741,6 @@ dependencies = [ "fs", "futures 0.3.31", "gpui", - "http_client", "indoc", "itertools 0.14.0", "language", @@ -3660,16 +3752,19 @@ dependencies = [ "paths", "project", "rpc", + "semver", "serde", "serde_json", "settings", - "sum_tree", "task", "theme", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-sum-tree", + "zed-util", "zlog", ] @@ -4074,9 +4169,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -4335,7 +4430,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b4400e26ea4b99417e4263b1ce2d8452404d750ba0809a7bd043072593d430d" dependencies = [ "cc", - "codespan-reporting 0.12.0", + "codespan-reporting", "proc-macro2", "quote", "scratch", @@ -4349,7 +4444,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31860c98f69fc14da5742c5deaf78983e846c7b27804ca8c8319e32eef421bde" dependencies = [ "clap", - "codespan-reporting 0.12.0", + "codespan-reporting", "proc-macro2", "quote", "syn 2.0.101", @@ -4383,12 +4478,10 @@ dependencies = [ "async-tar", "async-trait", "client", - "collections", "dap-types", "fs", "futures 0.3.31", "gpui", - "http_client", "language", "libc", "log", @@ -4396,7 +4489,7 @@ dependencies = [ "parking_lot", "paths", "proto", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", @@ -4406,8 +4499,10 @@ dependencies = [ "telemetry", "tree-sitter", "tree-sitter-go", - "util", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", "zlog", ] @@ -4416,7 +4511,7 @@ name = "dap-types" version = "0.0.1" source = "git+https://github.com/zed-industries/dap-types?rev=1b461b310481d01e02b2603c16d7144b926339f8#1b461b310481d01e02b2603c16d7144b926339f8" dependencies = [ - "schemars", + "schemars 1.0.1", "serde", "serde_json", ] @@ -4427,7 +4522,6 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "collections", "dap", "dotenvy", "fs", @@ -4442,8 +4536,44 @@ dependencies = [ "shlex", "smol", "task", - "util", "workspace-hack", + "zed-collections", + "zed-util", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.101", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.101", ] [[package]] @@ -4505,8 +4635,8 @@ dependencies = [ "sqlez", "sqlez_macros", "tempfile", - "util", "workspace-hack", + "zed-util", "zed_env_vars", ] @@ -4532,8 +4662,8 @@ dependencies = [ "gpui", "serde_json", "task", - "util", "workspace-hack", + "zed-util", ] [[package]] @@ -4549,9 +4679,9 @@ dependencies = [ "serde_json", "settings", "smol", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -4562,7 +4692,6 @@ dependencies = [ "anyhow", "bitflags 2.9.0", "client", - "collections", "command_palette_hooks", "dap", "dap_adapters", @@ -4587,7 +4716,7 @@ dependencies = [ "pretty_assertions", "project", "rpc", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "serde_json_lenient", @@ -4605,9 +4734,10 @@ dependencies = [ "tree-sitter-json", "ui", "unindent", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", "zlog", ] @@ -4627,11 +4757,11 @@ version = "0.1.0" dependencies = [ "anyhow", "futures 0.3.31", - "http_client", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "workspace-hack", + "zed-http-client", ] [[package]] @@ -4640,6 +4770,20 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" +[[package]] +name = "denoise" +version = "0.1.0" +dependencies = [ + "candle-core", + "candle-onnx", + "log", + "realfft", + "rodio", + "rustfft", + "thiserror 2.0.12", + "workspace-hack", +] + [[package]] name = "der" version = "0.6.1" @@ -4672,35 +4816,41 @@ dependencies = [ ] [[package]] -name = "derive_more" -version = "0.99.19" +name = "derive_arbitrary" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ - "convert_case 0.4.0", "proc-macro2", "quote", - "rustc_version", "syn 2.0.101", ] [[package]] -name = "derive_refineable" -version = "0.1.0" +name = "derive_more" +version = "0.99.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" dependencies = [ + "convert_case 0.4.0", "proc-macro2", "quote", + "rustc_version", "syn 2.0.101", - "workspace-hack", ] +[[package]] +name = "deunicode" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" + [[package]] name = "diagnostics" version = "0.1.0" dependencies = [ "anyhow", "client", - "collections", "component", "ctor", "editor", @@ -4720,9 +4870,10 @@ dependencies = [ "theme", "ui", "unindent", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zlog", ] @@ -4826,7 +4977,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.0", - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -4877,9 +5028,11 @@ dependencies = [ "serde", "serde_json", "settings", - "util", + "task", + "theme", "workspace-hack", "zed", + "zed-util", "zlog", ] @@ -4984,6 +5137,25 @@ version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +[[package]] +name = "dyn-stack" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" +dependencies = [ + "bytemuck", + "reborrow", +] + +[[package]] +name = "dyn-stack" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490bd48eb68fffcfed519b4edbfd82c69cbe741d175b84f0e0cbe8c57cbe0bdd" +dependencies = [ + "bytemuck", +] + [[package]] name = "ec4rs" version = "1.2.0" @@ -5009,7 +5181,6 @@ dependencies = [ "client", "gpui", "language", - "project", "workspace-hack", ] @@ -5020,6 +5191,7 @@ dependencies = [ "anyhow", "client", "cloud_llm_client", + "codestral", "copilot", "edit_prediction", "editor", @@ -5046,56 +5218,89 @@ dependencies = [ ] [[package]] -name = "editor" +name = "edit_prediction_context" version = "0.1.0" dependencies = [ - "aho-corasick", "anyhow", - "assets", - "buffer_diff", - "client", - "clock", - "collections", - "convert_case 0.8.0", - "criterion", - "ctor", - "dap", - "db", - "edit_prediction", - "emojis", - "file_icons", - "fs", + "arrayvec", + "clap", + "cloud_llm_client", "futures 0.3.31", - "fuzzy", - "git", "gpui", - "http_client", + "hashbrown 0.15.3", "indoc", "itertools 0.14.0", "language", - "languages", - "linkify", "log", - "lsp", - "markdown", - "menu", - "multi_buffer", "ordered-float 2.10.1", - "parking_lot", + "postage", "pretty_assertions", "project", - "rand 0.9.1", "regex", - "release_channel", + "serde", + "serde_json", + "settings", + "slotmap", + "strum 0.27.1", + "text", + "tree-sitter", + "tree-sitter-c", + "tree-sitter-cpp", + "tree-sitter-go", + "workspace-hack", + "zed-collections", + "zed-util", + "zlog", +] + +[[package]] +name = "editor" +version = "0.1.0" +dependencies = [ + "aho-corasick", + "anyhow", + "assets", + "buffer_diff", + "client", + "clock", + "convert_case 0.8.0", + "criterion", + "ctor", + "dap", + "db", + "edit_prediction", + "emojis", + "file_icons", + "fs", + "futures 0.3.31", + "fuzzy", + "git", + "gpui", + "indoc", + "itertools 0.14.0", + "language", + "languages", + "linkify", + "log", + "lsp", + "markdown", + "menu", + "multi_buffer", + "ordered-float 2.10.1", + "parking_lot", + "pretty_assertions", + "project", + "rand 0.9.1", + "regex", + "release_channel", "rpc", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", "smallvec", "smol", "snippet", - "sum_tree", "task", "telemetry", "tempfile", @@ -5114,10 +5319,14 @@ dependencies = [ "unicode-segmentation", "unindent", "url", - "util", "uuid", + "vim_mode_setting", "workspace", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-sum-tree", + "zed-util", "zed_actions", "zlog", ] @@ -5228,6 +5437,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "enumflags2" version = "0.7.11" @@ -5387,7 +5608,6 @@ dependencies = [ "clap", "client", "cloud_llm_client", - "collections", "debug_adapter_extension", "dirs 4.0.0", "dotenvy", @@ -5422,10 +5642,11 @@ dependencies = [ "terminal_view", "toml 0.8.20", "unindent", - "util", "uuid", "watch", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -5504,28 +5725,28 @@ dependencies = [ "async-compression", "async-tar", "async-trait", - "collections", "dap", "fs", "futures 0.3.31", "gpui", "heck 0.5.0", - "http_client", "language", "log", "lsp", "parking_lot", "pretty_assertions", - "semantic_version", "serde", "serde_json", "task", "toml 0.8.20", "url", - "util", "wasm-encoder 0.221.3", "wasmparser 0.221.3", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-semantic-version", + "zed-util", ] [[package]] @@ -5561,7 +5782,6 @@ dependencies = [ "async-tar", "async-trait", "client", - "collections", "criterion", "ctor", "dap", @@ -5569,7 +5789,6 @@ dependencies = [ "fs", "futures 0.3.31", "gpui", - "http_client", "language", "language_extension", "log", @@ -5583,8 +5802,6 @@ dependencies = [ "release_channel", "remote", "reqwest_client", - "schemars", - "semantic_version", "serde", "serde_json", "serde_json_lenient", @@ -5596,11 +5813,14 @@ dependencies = [ "theme_extension", "toml 0.8.20", "url", - "util", "wasmparser 0.221.3", "wasmtime", "wasmtime-wasi", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-semantic-version", + "zed-util", "zlog", ] @@ -5610,7 +5830,6 @@ version = "0.1.0" dependencies = [ "anyhow", "client", - "collections", "db", "editor", "extension", @@ -5624,7 +5843,6 @@ dependencies = [ "picker", "project", "release_channel", - "semantic_version", "serde", "settings", "smallvec", @@ -5632,10 +5850,12 @@ dependencies = [ "telemetry", "theme", "ui", - "util", "vim_mode_setting", "workspace", "workspace-hack", + "zed-collections", + "zed-semantic-version", + "zed-util", "zed_actions", ] @@ -5673,25 +5893,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" -[[package]] -name = "faster-hex" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183" -dependencies = [ - "serde", -] - -[[package]] -name = "faster-hex" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7223ae2d2f179b803433d9c830478527e92b8117eab39460edae7f1614d9fb73" -dependencies = [ - "heapless", - "serde", -] - [[package]] name = "fastrand" version = "1.9.0" @@ -5743,13 +5944,11 @@ version = "0.1.0" dependencies = [ "editor", "gpui", - "menu", "system_specs", - "ui", "urlencoding", - "util", "workspace", "workspace-hack", + "zed-util", "zed_actions", ] @@ -5768,7 +5967,6 @@ name = "file_finder" version = "0.1.0" dependencies = [ "anyhow", - "collections", "ctor", "editor", "file_icons", @@ -5780,18 +5978,18 @@ dependencies = [ "picker", "pretty_assertions", "project", - "schemars", + "schemars 1.0.1", "search", "serde", - "serde_derive", "serde_json", "settings", "text", "theme", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zlog", ] @@ -5801,10 +5999,9 @@ version = "0.1.0" dependencies = [ "gpui", "serde", - "settings", "theme", - "util", "workspace-hack", + "zed-util", ] [[package]] @@ -5843,7 +6040,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", - "libz-rs-sys", "miniz_oxide", ] @@ -5859,6 +6055,18 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" +[[package]] +name = "float8" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4203231de188ebbdfb85c11f3c20ca2b063945710de04e7b59268731e728b462" +dependencies = [ + "half", + "num-traits", + "rand 0.9.1", + "rand_distr", +] + [[package]] name = "float_next_after" version = "1.0.0" @@ -5900,30 +6108,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "font-kit" -version = "0.14.1" -source = "git+https://github.com/zed-industries/font-kit?rev=5474cfad4b719a72ec8ed2cb7327b2b01fd10568#5474cfad4b719a72ec8ed2cb7327b2b01fd10568" -dependencies = [ - "bitflags 2.9.0", - "byteorder", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "core-text", - "dirs 5.0.1", - "dwrote", - "float-ord", - "freetype-sys", - "lazy_static", - "libc", - "log", - "pathfinder_geometry", - "pathfinder_simd", - "walkdir", - "winapi", - "yeslogic-fontconfig-sys", -] - [[package]] name = "font-types" version = "0.8.4" @@ -6060,7 +6244,6 @@ dependencies = [ "async-tar", "async-trait", "cocoa 0.26.0", - "collections", "fsevent", "futures 0.3.31", "git", @@ -6080,9 +6263,10 @@ dependencies = [ "tempfile", "text", "time", - "util", "windows 0.61.1", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -6119,6 +6303,7 @@ dependencies = [ "bitflags 2.9.0", "core-foundation 0.10.0", "fsevent-sys 3.1.0", + "log", "parking_lot", "tempfile", "workspace-hack", @@ -6300,8 +6485,8 @@ version = "0.1.0" dependencies = [ "gpui", "log", - "util", "workspace-hack", + "zed-util", ] [[package]] @@ -6313,6 +6498,252 @@ dependencies = [ "thread_local", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gemm" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab24cc62135b40090e31a76a9b2766a501979f3070fa27f689c27ec04377d32" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-c32 0.17.1", + "gemm-c64 0.17.1", + "gemm-common 0.17.1", + "gemm-f16 0.17.1", + "gemm-f32 0.17.1", + "gemm-f64 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-c32 0.18.2", + "gemm-c64 0.18.2", + "gemm-common 0.18.2", + "gemm-f16 0.18.2", + "gemm-f32 0.18.2", + "gemm-f64 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c030d0b983d1e34a546b86e08f600c11696fde16199f971cd46c12e67512c0" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb5f2e79fefb9693d18e1066a557b4546cd334b226beadc68b11a8f9431852a" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] + +[[package]] +name = "gemm-common" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2e7ea062c987abcd8db95db917b4ffb4ecdfd0668471d8dc54734fdff2354e8" +dependencies = [ + "bytemuck", + "dyn-stack 0.10.0", + "half", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp 0.18.22", + "raw-cpuid 10.7.0", + "rayon", + "seq-macro", + "sysctl 0.5.5", +] + +[[package]] +name = "gemm-common" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" +dependencies = [ + "bytemuck", + "dyn-stack 0.13.0", + "half", + "libm", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp 0.21.5", + "raw-cpuid 11.6.0", + "rayon", + "seq-macro", + "sysctl 0.6.0", +] + +[[package]] +name = "gemm-f16" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca4c06b9b11952071d317604acb332e924e817bd891bec8dfb494168c7cedd4" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "gemm-f32 0.17.1", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "rayon", + "seq-macro", +] + +[[package]] +name = "gemm-f16" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "gemm-f32 0.18.2", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "rayon", + "seq-macro", +] + +[[package]] +name = "gemm-f32" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9a69f51aaefbd9cf12d18faf273d3e982d9d711f60775645ed5c8047b4ae113" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-f32" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] + +[[package]] +name = "gemm-f64" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa397a48544fadf0b81ec8741e5c0fba0043008113f71f2034def1935645d2b0" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-f64" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" +dependencies = [ + "dyn-stack 0.13.0", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] + [[package]] name = "generator" version = "0.8.5" @@ -6391,7 +6822,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ "fallible-iterator", - "indexmap", + "indexmap 2.9.0", "stable_deref_trait", ] @@ -6402,32 +6833,34 @@ dependencies = [ "anyhow", "askpass", "async-trait", - "collections", "derive_more", "futures 0.3.31", "git2", "gpui", - "http_client", + "itertools 0.14.0", "log", "parking_lot", "pretty_assertions", "rand 0.9.1", "regex", "rope", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "smol", - "sum_tree", "tempfile", "text", "thiserror 2.0.12", "time", "unindent", "url", - "util", + "urlencoding", "uuid", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-sum-tree", + "zed-util", ] [[package]] @@ -6452,17 +6885,16 @@ dependencies = [ "futures 0.3.31", "git", "gpui", - "http_client", "indoc", "pretty_assertions", "regex", - "schemars", "serde", "serde_json", "settings", "url", - "util", "workspace-hack", + "zed-http-client", + "zed-util", ] [[package]] @@ -6476,7 +6908,6 @@ dependencies = [ "call", "chrono", "cloud_llm_client", - "collections", "command_palette_hooks", "component", "ctor", @@ -6501,9 +6932,8 @@ dependencies = [ "postage", "pretty_assertions", "project", - "schemars", + "schemars 1.0.1", "serde", - "serde_derive", "serde_json", "settings", "strum 0.27.1", @@ -6513,775 +6943,17 @@ dependencies = [ "time_format", "ui", "unindent", - "util", "watch", "windows 0.61.1", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", + "zeroize", "zlog", ] -[[package]] -name = "gix" -version = "0.71.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a61e71ec6817fc3c9f12f812682cfe51ee6ea0d2e27e02fc3849c35524617435" -dependencies = [ - "gix-actor", - "gix-attributes", - "gix-command", - "gix-commitgraph", - "gix-config", - "gix-date", - "gix-diff", - "gix-discover", - "gix-features 0.41.1", - "gix-filter", - "gix-fs 0.14.0", - "gix-glob", - "gix-hash 0.17.0", - "gix-hashtable", - "gix-ignore", - "gix-index", - "gix-lock", - "gix-object", - "gix-odb", - "gix-pack", - "gix-path", - "gix-pathspec", - "gix-protocol", - "gix-ref", - "gix-refspec", - "gix-revision", - "gix-revwalk", - "gix-sec", - "gix-shallow", - "gix-submodule", - "gix-tempfile", - "gix-trace", - "gix-traverse", - "gix-url", - "gix-utils 0.2.0", - "gix-validate 0.9.4", - "gix-worktree", - "once_cell", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-actor" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f438c87d4028aca4b82f82ba8d8ab1569823cfb3e5bc5fa8456a71678b2a20e7" -dependencies = [ - "bstr", - "gix-date", - "gix-utils 0.2.0", - "itoa", - "thiserror 2.0.12", - "winnow", -] - -[[package]] -name = "gix-attributes" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e25825e0430aa11096f8b65ced6780d4a96a133f81904edceebb5344c8dd7f" -dependencies = [ - "bstr", - "gix-glob", - "gix-path", - "gix-quote", - "gix-trace", - "kstring", - "smallvec", - "thiserror 2.0.12", - "unicode-bom", -] - -[[package]] -name = "gix-bitmap" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" -dependencies = [ - "thiserror 2.0.12", -] - -[[package]] -name = "gix-chunk" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" -dependencies = [ - "thiserror 2.0.12", -] - -[[package]] -name = "gix-command" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0378995847773a697f8e157fe2963ecf3462fe64be05b7b3da000b3b472def8" -dependencies = [ - "bstr", - "gix-path", - "gix-quote", - "gix-trace", - "shell-words", -] - -[[package]] -name = "gix-commitgraph" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043cbe49b7a7505150db975f3cb7c15833335ac1e26781f615454d9d640a28fe" -dependencies = [ - "bstr", - "gix-chunk", - "gix-hash 0.17.0", - "memmap2", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-config" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c6f830bf746604940261b49abf7f655d2c19cadc9f4142ae9379e3a316e8cfa" -dependencies = [ - "bstr", - "gix-config-value", - "gix-features 0.41.1", - "gix-glob", - "gix-path", - "gix-ref", - "gix-sec", - "memchr", - "once_cell", - "smallvec", - "thiserror 2.0.12", - "unicode-bom", - "winnow", -] - -[[package]] -name = "gix-config-value" -version = "0.14.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc2c844c4cf141884678cabef736fd91dd73068b9146e6f004ba1a0457944b6" -dependencies = [ - "bitflags 2.9.0", - "bstr", - "gix-path", - "libc", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-date" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa30058ec7d3511fbc229e4f9e696a35abd07ec5b82e635eff864a2726217e4" -dependencies = [ - "bstr", - "itoa", - "jiff", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-diff" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c975dad2afc85e4e233f444d1efbe436c3cdcf3a07173984509c436d00a3f8" -dependencies = [ - "bstr", - "gix-command", - "gix-filter", - "gix-fs 0.14.0", - "gix-hash 0.17.0", - "gix-object", - "gix-path", - "gix-tempfile", - "gix-trace", - "gix-traverse", - "gix-worktree", - "imara-diff", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-discover" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fb8a4349b854506a3915de18d3341e5f1daa6b489c8affc9ca0d69efe86781" -dependencies = [ - "bstr", - "dunce", - "gix-fs 0.14.0", - "gix-hash 0.17.0", - "gix-path", - "gix-ref", - "gix-sec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-features" -version = "0.41.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016d6050219458d14520fe22bdfdeb9cb71631dec9bc2724767c983f60109634" -dependencies = [ - "crc32fast", - "crossbeam-channel", - "flate2", - "gix-path", - "gix-trace", - "gix-utils 0.2.0", - "libc", - "once_cell", - "parking_lot", - "prodash", - "thiserror 2.0.12", - "walkdir", -] - -[[package]] -name = "gix-features" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f4399af6ec4fd9db84dd4cf9656c5c785ab492ab40a7c27ea92b4241923fed" -dependencies = [ - "gix-trace", - "gix-utils 0.3.0", - "libc", - "prodash", -] - -[[package]] -name = "gix-filter" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb2b2bbffdc5cc9b2b82fc82da1b98163c9b423ac2b45348baa83a947ac9ab89" -dependencies = [ - "bstr", - "encoding_rs", - "gix-attributes", - "gix-command", - "gix-hash 0.17.0", - "gix-object", - "gix-packetline-blocking", - "gix-path", - "gix-quote", - "gix-trace", - "gix-utils 0.2.0", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-fs" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951e886120dc5fa8cac053e5e5c89443f12368ca36811b2e43d1539081f9c111" -dependencies = [ - "bstr", - "fastrand 2.3.0", - "gix-features 0.41.1", - "gix-path", - "gix-utils 0.2.0", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-fs" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a0637149b4ef24d3ea55f81f77231401c8463fae6da27331c987957eb597c7" -dependencies = [ - "bstr", - "fastrand 2.3.0", - "gix-features 0.42.1", - "gix-path", - "gix-utils 0.3.0", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-glob" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20972499c03473e773a2099e5fd0c695b9b72465837797a51a43391a1635a030" -dependencies = [ - "bitflags 2.9.0", - "bstr", - "gix-features 0.41.1", - "gix-path", -] - -[[package]] -name = "gix-hash" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834e79722063958b03342edaa1e17595cd2939bb2b3306b3225d0815566dcb49" -dependencies = [ - "faster-hex 0.9.0", - "gix-features 0.41.1", - "sha1-checked", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-hash" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4900562c662852a6b42e2ef03442eccebf24f047d8eab4f23bc12ef0d785d8" -dependencies = [ - "faster-hex 0.10.0", - "gix-features 0.42.1", - "sha1-checked", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-hashtable" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b5cb3c308b4144f2612ff64e32130e641279fcf1a84d8d40dad843b4f64904" -dependencies = [ - "gix-hash 0.18.0", - "hashbrown 0.14.5", - "parking_lot", -] - -[[package]] -name = "gix-ignore" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a27c8380f493a10d1457f756a3f81924d578fc08d6535e304dfcafbf0261d18" -dependencies = [ - "bstr", - "gix-glob", - "gix-path", - "gix-trace", - "unicode-bom", -] - -[[package]] -name = "gix-index" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855bece2d4153453aa5d0a80d51deea1ce8cd6a3b4cf213da85ac344ccb908a7" -dependencies = [ - "bitflags 2.9.0", - "bstr", - "filetime", - "fnv", - "gix-bitmap", - "gix-features 0.41.1", - "gix-fs 0.14.0", - "gix-hash 0.17.0", - "gix-lock", - "gix-object", - "gix-traverse", - "gix-utils 0.2.0", - "gix-validate 0.9.4", - "hashbrown 0.14.5", - "itoa", - "libc", - "memmap2", - "rustix 0.38.44", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-lock" -version = "17.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570f8b034659f256366dc90f1a24924902f20acccd6a15be96d44d1269e7a796" -dependencies = [ - "gix-tempfile", - "gix-utils 0.3.0", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-object" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4943fcdae6ffc135920c9ea71e0362ed539182924ab7a85dd9dac8d89b0dd69a" -dependencies = [ - "bstr", - "gix-actor", - "gix-date", - "gix-features 0.41.1", - "gix-hash 0.17.0", - "gix-hashtable", - "gix-path", - "gix-utils 0.2.0", - "gix-validate 0.9.4", - "itoa", - "smallvec", - "thiserror 2.0.12", - "winnow", -] - -[[package]] -name = "gix-odb" -version = "0.68.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50306d40dcc982eb6b7593103f066ea6289c7b094cb9db14f3cd2be0b9f5e610" -dependencies = [ - "arc-swap", - "gix-date", - "gix-features 0.41.1", - "gix-fs 0.14.0", - "gix-hash 0.17.0", - "gix-hashtable", - "gix-object", - "gix-pack", - "gix-path", - "gix-quote", - "parking_lot", - "tempfile", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-pack" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b65fffb09393c26624ca408d32cfe8776fb94cd0a5cdf984905e1d2f39779cb" -dependencies = [ - "clru", - "gix-chunk", - "gix-features 0.41.1", - "gix-hash 0.17.0", - "gix-hashtable", - "gix-object", - "gix-path", - "memmap2", - "smallvec", - "thiserror 2.0.12", - "uluru", -] - -[[package]] -name = "gix-packetline" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123844a70cf4d5352441dc06bab0da8aef61be94ec239cb631e0ba01dc6d3a04" -dependencies = [ - "bstr", - "faster-hex 0.9.0", - "gix-trace", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-packetline-blocking" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecf3ea2e105c7e45587bac04099824301262a6c43357fad5205da36dbb233b3" -dependencies = [ - "bstr", - "faster-hex 0.9.0", - "gix-trace", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-path" -version = "0.10.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567f65fec4ef10dfab97ae71f26a27fd4d7fe7b8e3f90c8a58551c41ff3fb65b" -dependencies = [ - "bstr", - "gix-trace", - "gix-validate 0.10.0", - "home", - "once_cell", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-pathspec" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8422c3c9066d649074b24025125963f85232bfad32d6d16aea9453b82ec14" -dependencies = [ - "bitflags 2.9.0", - "bstr", - "gix-attributes", - "gix-config-value", - "gix-glob", - "gix-path", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-protocol" -version = "0.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5678ddae1d62880bc30e2200be1b9387af3372e0e88e21f81b4e7f8367355b5a" -dependencies = [ - "bstr", - "gix-date", - "gix-features 0.41.1", - "gix-hash 0.17.0", - "gix-ref", - "gix-shallow", - "gix-transport", - "gix-utils 0.2.0", - "maybe-async", - "thiserror 2.0.12", - "winnow", -] - -[[package]] -name = "gix-quote" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b005c550bf84de3b24aa5e540a23e6146a1c01c7d30470e35d75a12f827f969" -dependencies = [ - "bstr", - "gix-utils 0.2.0", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-ref" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e1f7eb6b7ce82d2d19961f74bd637bab3ea79b1bc7bfb23dbefc67b0415d8b" -dependencies = [ - "gix-actor", - "gix-features 0.41.1", - "gix-fs 0.14.0", - "gix-hash 0.17.0", - "gix-lock", - "gix-object", - "gix-path", - "gix-tempfile", - "gix-utils 0.2.0", - "gix-validate 0.9.4", - "memmap2", - "thiserror 2.0.12", - "winnow", -] - -[[package]] -name = "gix-refspec" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8587b21e2264a6e8938d940c5c99662779c13a10741a5737b15fc85c252ffc" -dependencies = [ - "bstr", - "gix-hash 0.17.0", - "gix-revision", - "gix-validate 0.9.4", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-revision" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "342caa4e158df3020cadf62f656307c3948fe4eacfdf67171d7212811860c3e9" -dependencies = [ - "bstr", - "gix-commitgraph", - "gix-date", - "gix-hash 0.17.0", - "gix-object", - "gix-revwalk", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-revwalk" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc7c3d7e5cdc1ab8d35130106e4af0a4f9f9eca0c81f4312b690780e92bde0d" -dependencies = [ - "gix-commitgraph", - "gix-date", - "gix-hash 0.17.0", - "gix-hashtable", - "gix-object", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-sec" -version = "0.10.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47aeb0f13de9ef2f3033f5ff218de30f44db827ac9f1286f9ef050aacddd5888" -dependencies = [ - "bitflags 2.9.0", - "gix-path", - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "gix-shallow" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc0598aacfe1d52575a21c9492fee086edbb21e228ec36c819c42ab923f434c3" -dependencies = [ - "bstr", - "gix-hash 0.17.0", - "gix-lock", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-submodule" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c7390c2059505c365e9548016d4edc9f35749c6a9112b7b1214400bbc68da2" -dependencies = [ - "bstr", - "gix-config", - "gix-path", - "gix-pathspec", - "gix-refspec", - "gix-url", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-tempfile" -version = "17.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c750e8c008453a2dba67a2b0d928b7716e05da31173a3f5e351d5457ad4470aa" -dependencies = [ - "dashmap 6.1.0", - "gix-fs 0.15.0", - "libc", - "once_cell", - "parking_lot", - "tempfile", -] - -[[package]] -name = "gix-trace" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c396a2036920c69695f760a65e7f2677267ccf483f25046977d87e4cb2665f7" - -[[package]] -name = "gix-transport" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3f68c2870bfca8278389d2484a7f2215b67d0b0cc5277d3c72ad72acf41787e" -dependencies = [ - "bstr", - "gix-command", - "gix-features 0.41.1", - "gix-packetline", - "gix-quote", - "gix-sec", - "gix-url", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-traverse" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c0b049f8bdb61b20016694102f7b507f2e1727e83e9c5e6dad4f7d84ff7384" -dependencies = [ - "bitflags 2.9.0", - "gix-commitgraph", - "gix-date", - "gix-hash 0.17.0", - "gix-hashtable", - "gix-object", - "gix-revwalk", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-url" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48dfe23f93f1ddb84977d80bb0dd7aa09d1bf5d5afc0c9b6820cccacc25ae860" -dependencies = [ - "bstr", - "gix-features 0.41.1", - "gix-path", - "percent-encoding", - "thiserror 2.0.12", - "url", -] - -[[package]] -name = "gix-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189f8724cf903e7fd57cfe0b7bc209db255cacdcb22c781a022f52c3a774f8d0" -dependencies = [ - "fastrand 2.3.0", - "unicode-normalization", -] - -[[package]] -name = "gix-utils" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5351af2b172caf41a3728eb4455326d84e0d70fe26fc4de74ab0bd37df4191c5" -dependencies = [ - "fastrand 2.3.0", - "unicode-normalization", -] - -[[package]] -name = "gix-validate" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b5f1253109da6c79ed7cf6e1e38437080bb6d704c76af14c93e2f255234084" -dependencies = [ - "bstr", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-validate" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" -dependencies = [ - "bstr", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-worktree" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7760dbc4b79aa274fed30adc0d41dca6b917641f26e7867c4071b1fb4dc727b" -dependencies = [ - "bstr", - "gix-attributes", - "gix-features 0.41.1", - "gix-fs 0.14.0", - "gix-glob", - "gix-hash 0.17.0", - "gix-ignore", - "gix-index", - "gix-object", - "gix-path", - "gix-validate 0.9.4", -] - [[package]] name = "glob" version = "0.3.2" @@ -7315,9 +6987,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.14.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" dependencies = [ "js-sys", "slotmap", @@ -7329,7 +7001,6 @@ dependencies = [ name = "go_to_line" version = "0.1.0" dependencies = [ - "anyhow", "editor", "gpui", "indoc", @@ -7337,7 +7008,6 @@ dependencies = [ "menu", "project", "rope", - "schemars", "serde", "serde_json", "settings", @@ -7346,9 +7016,9 @@ dependencies = [ "tree-sitter-rust", "tree-sitter-typescript", "ui", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -7368,12 +7038,13 @@ version = "0.1.0" dependencies = [ "anyhow", "futures 0.3.31", - "http_client", - "schemars", + "schemars 1.0.1", "serde", "serde_json", + "settings", "strum 0.27.1", "workspace-hack", + "zed-http-client", ] [[package]] @@ -7408,7 +7079,7 @@ dependencies = [ [[package]] name = "gpui" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", "as-raw-xcb-connection", @@ -7425,7 +7096,6 @@ dependencies = [ "calloop-wayland-source", "cbindgen", "cocoa 0.26.0", - "collections", "core-foundation 0.10.0", "core-foundation-sys", "core-graphics 0.24.0", @@ -7439,18 +7109,15 @@ dependencies = [ "etagere", "filedescriptor", "flume", - "font-kit", "foreign-types 0.5.0", "futures 0.3.31", - "gpui_macros", - "http_client", + "gpui-macros", "image", "inventory", "itertools 0.14.0", "libc", "log", "lyon", - "media", "metal", "naga", "num_cpus", @@ -7463,36 +7130,31 @@ dependencies = [ "parking_lot", "pathfinder_geometry", "postage", + "pretty_assertions", "profiling", "rand 0.9.1", "raw-window-handle", - "refineable", "reqwest_client", "resvg", - "scap", - "schemars", + "schemars 1.0.1", "seahash", - "semantic_version", "serde", - "serde_derive", "serde_json", "slotmap", "smallvec", "smol", "stacksafe", "strum 0.27.1", - "sum_tree", "taffy", "thiserror 2.0.12", "unicode-segmentation", "usvg", - "util", "uuid", "waker-fn", "wayland-backend", "wayland-client", "wayland-cursor", - "wayland-protocols", + "wayland-protocols 0.31.2", "wayland-protocols-plasma", "windows 0.61.1", "windows-core 0.61.0", @@ -7501,12 +7163,22 @@ dependencies = [ "workspace-hack", "x11-clipboard", "x11rb", - "xim", "xkbcommon", + "zed-collections", + "zed-font-kit", + "zed-http-client", + "zed-media", + "zed-refineable", + "zed-scap", + "zed-semantic-version", + "zed-sum-tree", + "zed-util", + "zed-util-macros", + "zed-xim", ] [[package]] -name = "gpui_macros" +name = "gpui-macros" version = "0.1.0" dependencies = [ "gpui", @@ -7524,8 +7196,8 @@ dependencies = [ "anyhow", "gpui", "tokio", - "util", "workspace-hack", + "zed-util", ] [[package]] @@ -7557,7 +7229,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -7576,7 +7248,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -7589,9 +7261,12 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ + "bytemuck", "cfg-if", "crunchy", "num-traits", + "rand 0.9.1", + "rand_distr", ] [[package]] @@ -7623,15 +7298,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "hash32" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" -dependencies = [ - "byteorder", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -7705,16 +7371,6 @@ dependencies = [ "http 0.2.12", ] -[[package]] -name = "heapless" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" -dependencies = [ - "hash32", - "stable_deref_trait", -] - [[package]] name = "heck" version = "0.3.3" @@ -7783,12 +7439,6 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - [[package]] name = "hermit-abi" version = "0.5.0" @@ -7867,13 +7517,12 @@ dependencies = [ [[package]] name = "html5ever" -version = "0.31.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953cbbe631aae7fc0a112702ad5d3aaf09da38beaf45ea84610d6e1c358f569c" +checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4" dependencies = [ "log", - "mac", - "markup5ever 0.16.1", + "markup5ever 0.35.0", "match_token", ] @@ -7952,25 +7601,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" -[[package]] -name = "http_client" -version = "0.1.0" -dependencies = [ - "anyhow", - "bytes 1.10.1", - "derive_more", - "futures 0.3.31", - "http 1.3.1", - "http-body 1.0.1", - "log", - "parking_lot", - "reqwest 0.12.15 (git+https://github.com/zed-industries/reqwest.git?rev=951c770a32f1998d6e999cef3e59e0013e6c4415)", - "serde", - "serde_json", - "url", - "workspace-hack", -] - [[package]] name = "http_client_tls" version = "0.1.0" @@ -8272,6 +7902,12 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.0.3" @@ -8354,14 +7990,13 @@ dependencies = [ "language", "log", "project", - "schemars", "serde", "settings", "theme", "ui", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -8385,6 +8020,17 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.9.0" @@ -8468,11 +8114,12 @@ dependencies = [ "serde_json", "serde_json_lenient", "theme", + "title_bar", "ui", - "util", - "util_macros", "workspace", "workspace-hack", + "zed-util", + "zed-util-macros", "zed_actions", ] @@ -8485,9 +8132,9 @@ dependencies = [ "gpui", "release_channel", "smol", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -8499,16 +8146,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "interim" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ce9099a85f468663d3225bf87e85d0548968441e1db12248b996b24f0f5b5a" -dependencies = [ - "chrono", - "logos", -] - [[package]] name = "interpolate_name" version = "0.2.4" @@ -8686,12 +8323,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a064218214dc6a10fbae5ec5fa888d80c45d611aba169222fc272072bf7aef6" dependencies = [ "jiff-static", - "jiff-tzdb-platform", "log", "portable-atomic", "portable-atomic-util", "serde", - "windows-sys 0.59.0", ] [[package]] @@ -8705,106 +8340,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "jiff-tzdb" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524" - -[[package]] -name = "jiff-tzdb-platform" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" -dependencies = [ - "jiff-tzdb", -] - -[[package]] -name = "jj" -version = "0.1.0" -dependencies = [ - "anyhow", - "gpui", - "jj-lib", - "workspace-hack", -] - -[[package]] -name = "jj-lib" -version = "0.29.0" -source = "git+https://github.com/jj-vcs/jj?rev=e18eb8e05efaa153fad5ef46576af145bba1807f#e18eb8e05efaa153fad5ef46576af145bba1807f" -dependencies = [ - "async-trait", - "blake2", - "bstr", - "chrono", - "clru", - "digest", - "dunce", - "either", - "futures 0.3.31", - "gix", - "glob", - "hashbrown 0.15.3", - "hex", - "ignore", - "indexmap", - "interim", - "itertools 0.14.0", - "jj-lib-proc-macros", - "maplit", - "once_cell", - "pest", - "pest_derive", - "pollster 0.4.0", - "prost 0.13.5", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rayon", - "ref-cast", - "regex", - "rustix 1.0.7", - "same-file", - "serde", - "serde_json", - "smallvec", - "strsim", - "tempfile", - "thiserror 2.0.12", - "toml_edit", - "tracing", - "version_check", - "winreg 0.52.0", -] - -[[package]] -name = "jj-lib-proc-macros" -version = "0.29.0" -source = "git+https://github.com/jj-vcs/jj?rev=e18eb8e05efaa153fad5ef46576af145bba1807f#e18eb8e05efaa153fad5ef46576af145bba1807f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "jj_ui" -version = "0.1.0" -dependencies = [ - "command_palette_hooks", - "feature_flags", - "fuzzy", - "gpui", - "jj", - "picker", - "ui", - "util", - "workspace", - "workspace-hack", - "zed_actions", -] - [[package]] name = "jni" version = "0.21.1" @@ -8846,7 +8381,6 @@ dependencies = [ "editor", "gpui", "log", - "schemars", "serde", "settings", "shellexpand 2.1.2", @@ -8882,6 +8416,28 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "json_schema_store" +version = "0.1.0" +dependencies = [ + "anyhow", + "dap", + "extension", + "gpui", + "language", + "paths", + "project", + "schemars 1.0.1", + "serde", + "serde_json", + "settings", + "snippet_provider", + "task", + "theme", + "workspace-hack", + "zed-util", +] + [[package]] name = "jsonschema" version = "0.30.0" @@ -8903,7 +8459,7 @@ dependencies = [ "referencing", "regex", "regex-syntax", - "reqwest 0.12.15 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.12.15", "serde", "serde_json", "uuid-simd", @@ -8960,7 +8516,6 @@ name = "keymap_editor" version = "0.1.0" dependencies = [ "anyhow", - "collections", "command_palette", "component", "db", @@ -8969,6 +8524,7 @@ dependencies = [ "fuzzy", "gpui", "itertools 0.14.0", + "json_schema_store", "language", "log", "menu", @@ -8986,10 +8542,11 @@ dependencies = [ "tree-sitter-rust", "ui", "ui_input", - "util", "vim", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", ] @@ -9023,15 +8580,6 @@ dependencies = [ "libc", ] -[[package]] -name = "kstring" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" -dependencies = [ - "static_assertions", -] - [[package]] name = "kurbo" version = "0.11.1" @@ -9058,7 +8606,6 @@ dependencies = [ "anyhow", "async-trait", "clock", - "collections", "ctor", "diffy", "ec4rs", @@ -9067,10 +8614,8 @@ dependencies = [ "fuzzy", "globset", "gpui", - "http_client", "imara-diff", "indoc", - "inventory", "itertools 0.14.0", "log", "lsp", @@ -9080,7 +8625,7 @@ dependencies = [ "rand 0.9.1", "regex", "rpc", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", @@ -9089,7 +8634,6 @@ dependencies = [ "smol", "streaming-iterator", "strsim", - "sum_tree", "task", "text", "theme", @@ -9107,9 +8651,12 @@ dependencies = [ "tree-sitter-typescript", "unicase", "unindent", - "util", "watch", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-sum-tree", + "zed-util", "zlog", ] @@ -9119,7 +8666,6 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "collections", "extension", "fs", "futures 0.3.31", @@ -9130,8 +8676,9 @@ dependencies = [ "project", "serde", "serde_json", - "util", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -9144,24 +8691,25 @@ dependencies = [ "client", "cloud_api_types", "cloud_llm_client", - "collections", "futures 0.3.31", "gpui", - "http_client", "icons", "image", "log", "open_router", "parking_lot", "proto", - "schemars", + "schemars 1.0.1", "serde", "serde_json", + "settings", "smol", "telemetry_events", "thiserror 2.0.12", - "util", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -9178,18 +8726,17 @@ dependencies = [ "chrono", "client", "cloud_llm_client", - "collections", "component", "convert_case 0.8.0", "copilot", "credentials_provider", "deepseek", "editor", + "fs", "futures 0.3.31", "google_ai", "gpui", "gpui_tokio", - "http_client", "language", "language_model", "lmstudio", @@ -9202,22 +8749,24 @@ dependencies = [ "partial-json-fixer", "project", "release_channel", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", "smol", "strum 0.27.1", - "theme", "thiserror 2.0.12", "tiktoken-rs", "tokio", "ui", "ui_input", - "util", "vercel", "workspace-hack", "x_ai", + "zed-collections", + "zed-http-client", + "zed-util", + "zed_env_vars", ] [[package]] @@ -9248,9 +8797,9 @@ dependencies = [ "project", "settings", "ui", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -9259,7 +8808,6 @@ version = "0.1.0" dependencies = [ "anyhow", "client", - "collections", "command_palette_hooks", "copilot", "editor", @@ -9276,9 +8824,10 @@ dependencies = [ "theme", "tree-sitter", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", "zlog", ] @@ -9293,39 +8842,33 @@ dependencies = [ "async-tar", "async-trait", "chrono", - "collections", - "dap", "futures 0.3.31", "gpui", - "http_client", + "itertools 0.14.0", + "json_schema_store", "language", "log", "lsp", "node_runtime", "parking_lot", - "paths", "pet", "pet-conda", "pet-core", "pet-fs", "pet-poetry", "pet-reporter", + "pet-virtualenv", "pretty_assertions", "project", "regex", "rope", "rust-embed", - "schemars", "serde", "serde_json", "serde_json_lenient", "settings", - "sha2", - "shlex", "smol", - "snippet_provider", "task", - "tempfile", "text", "theme", "toml 0.8.20", @@ -9349,9 +8892,11 @@ dependencies = [ "tree-sitter-yaml", "unindent", "url", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -9447,7 +8992,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -9511,15 +9056,6 @@ dependencies = [ "webrtc-sys", ] -[[package]] -name = "libz-rs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" -dependencies = [ - "zlib-rs", -] - [[package]] name = "libz-sys" version = "1.1.22" @@ -9542,9 +9078,9 @@ dependencies = [ "picker", "project", "ui", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -9667,9 +9203,9 @@ dependencies = [ "prost 0.9.0", "prost-build 0.9.0", "prost-types 0.9.0", - "reqwest 0.12.15 (git+https://github.com/zed-industries/reqwest.git?rev=951c770a32f1998d6e999cef3e59e0013e6c4415)", "serde", "workspace-hack", + "zed-reqwest", ] [[package]] @@ -9679,7 +9215,6 @@ dependencies = [ "anyhow", "async-trait", "audio", - "collections", "core-foundation 0.10.0", "core-video", "coreaudio-rs 0.12.1", @@ -9698,7 +9233,6 @@ dependencies = [ "parking_lot", "postage", "rodio", - "scap", "serde", "serde_json", "serde_urlencoded", @@ -9707,8 +9241,11 @@ dependencies = [ "simplelog", "smallvec", "tokio-tungstenite 0.26.2", - "util", + "ui", "workspace-hack", + "zed-collections", + "zed-scap", + "zed-util", ] [[package]] @@ -9728,11 +9265,11 @@ version = "0.1.0" dependencies = [ "anyhow", "futures 0.3.31", - "http_client", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "workspace-hack", + "zed-http-client", ] [[package]] @@ -9755,40 +9292,6 @@ dependencies = [ "value-bag", ] -[[package]] -name = "logos" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6f536c1af4c7cc81edf73da1f8029896e7e1e16a219ef09b184e76a296f3db" -dependencies = [ - "logos-derive", -] - -[[package]] -name = "logos-codegen" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189bbfd0b61330abea797e5e9276408f2edbe4f822d7ad08685d67419aafb34e" -dependencies = [ - "beef", - "fnv", - "lazy_static", - "proc-macro2", - "quote", - "regex-syntax", - "rustc_version", - "syn 2.0.101", -] - -[[package]] -name = "logos-derive" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfe8e1a19049ddbfccbd14ac834b215e11b85b90bab0c2dba7c7b92fb5d5cba" -dependencies = [ - "logos-codegen", -] - [[package]] name = "loom" version = "0.7.2" @@ -9826,7 +9329,6 @@ version = "0.1.0" dependencies = [ "anyhow", "async-pipe", - "collections", "ctor", "futures 0.3.31", "gpui", @@ -9835,12 +9337,13 @@ dependencies = [ "parking_lot", "postage", "release_channel", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "smol", - "util", "workspace-hack", + "zed-collections", + "zed-util", "zlog", ] @@ -9974,11 +9477,12 @@ dependencies = [ "node_runtime", "pulldown-cmark 0.12.2", "settings", - "sum_tree", "theme", "ui", - "util", "workspace-hack", + "zed-collections", + "zed-sum-tree", + "zed-util", ] [[package]] @@ -9987,7 +9491,6 @@ version = "0.1.0" dependencies = [ "anyhow", "async-recursion", - "collections", "editor", "fs", "gpui", @@ -10001,9 +9504,10 @@ dependencies = [ "settings", "theme", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -10022,9 +9526,9 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.16.1" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a8096766c229e8c88a3900c9b44b7e06aa7f7343cc229158c3e58ef8f9973a" +checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3" dependencies = [ "log", "tendril", @@ -10045,9 +9549,9 @@ dependencies = [ [[package]] name = "match_token" -version = "0.1.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf" dependencies = [ "proc-macro2", "quote", @@ -10069,17 +9573,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" -[[package]] -name = "maybe-async" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "maybe-owned" version = "0.3.4" @@ -10142,21 +9635,6 @@ dependencies = [ "warp", ] -[[package]] -name = "media" -version = "0.1.0" -dependencies = [ - "anyhow", - "bindgen 0.71.1", - "core-foundation 0.10.0", - "core-video", - "ctor", - "foreign-types 0.5.0", - "metal", - "objc", - "workspace-hack", -] - [[package]] name = "memchr" version = "2.7.4" @@ -10179,6 +9657,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", + "stable_deref_trait", ] [[package]] @@ -10218,14 +9697,18 @@ name = "migrator" version = "0.1.0" dependencies = [ "anyhow", - "collections", "convert_case 0.8.0", "log", "pretty_assertions", + "serde_json", + "serde_json_lenient", + "settings", "streaming-iterator", "tree-sitter", "tree-sitter-json", + "unindent", "workspace-hack", + "zed-collections", ] [[package]] @@ -10371,12 +9854,12 @@ version = "0.1.0" dependencies = [ "anyhow", "futures 0.3.31", - "http_client", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "strum 0.27.1", "workspace-hack", + "zed-http-client", ] [[package]] @@ -10414,7 +9897,6 @@ dependencies = [ "anyhow", "buffer_diff", "clock", - "collections", "ctor", "gpui", "indoc", @@ -10430,12 +9912,13 @@ dependencies = [ "settings", "smallvec", "smol", - "sum_tree", "text", "theme", "tree-sitter", - "util", "workspace-hack", + "zed-collections", + "zed-sum-tree", + "zed-util", "zlog", ] @@ -10445,12 +9928,6 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" -[[package]] -name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" - [[package]] name = "naga" version = "25.0.1" @@ -10461,11 +9938,11 @@ dependencies = [ "bit-set 0.8.0", "bitflags 2.9.0", "cfg_aliases 0.2.1", - "codespan-reporting 0.12.0", + "codespan-reporting", "half", "hashbrown 0.15.3", "hexf-parse", - "indexmap", + "indexmap 2.9.0", "log", "num-traits", "once_cell", @@ -10630,17 +10107,17 @@ dependencies = [ "async-tar", "async-trait", "futures 0.3.31", - "http_client", "log", "paths", "semver", "serde", "serde_json", "smol", - "util", "watch", "which 6.0.3", "workspace-hack", + "zed-http-client", + "zed-util", ] [[package]] @@ -10684,18 +10161,18 @@ dependencies = [ "anyhow", "channel", "client", - "collections", "component", "db", "gpui", "rpc", "settings", - "sum_tree", "time", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-sum-tree", + "zed-util", "zed_actions", ] @@ -10824,6 +10301,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ + "bytemuck", "num-traits", ] @@ -11123,7 +10601,7 @@ checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "crc32fast", "hashbrown 0.15.3", - "indexmap", + "indexmap 2.9.0", "memchr", ] @@ -11133,45 +10611,42 @@ version = "0.1.0" dependencies = [ "anyhow", "futures 0.3.31", - "http_client", - "schemars", + "schemars 1.0.1", "serde", "serde_json", + "settings", "workspace-hack", + "zed-http-client", ] [[package]] name = "onboarding" version = "0.1.0" dependencies = [ - "ai_onboarding", "anyhow", "client", "component", "db", "documented", - "editor", "fs", "fuzzy", "git", "gpui", - "itertools 0.14.0", - "language", - "language_model", "menu", "notifications", "picker", "project", - "schemars", + "schemars 1.0.1", "serde", "settings", "telemetry", "theme", "ui", - "util", + "ui_input", "vim_mode_setting", "workspace", "workspace-hack", + "zed-util", "zed_actions", "zlog", ] @@ -11240,13 +10715,14 @@ version = "0.1.0" dependencies = [ "anyhow", "futures 0.3.31", - "http_client", "log", - "schemars", + "schemars 1.0.1", "serde", "serde_json", + "settings", "strum 0.27.1", "workspace-hack", + "zed-http-client", ] [[package]] @@ -11255,14 +10731,14 @@ version = "0.1.0" dependencies = [ "anyhow", "futures 0.3.31", - "http_client", - "schemars", + "schemars 1.0.1", "serde", "serde_json", + "settings", "strum 0.27.1", "thiserror 2.0.12", - "util", "workspace-hack", + "zed-http-client", ] [[package]] @@ -11411,9 +10887,9 @@ dependencies = [ "tree-sitter-rust", "tree-sitter-typescript", "ui", - "util", "workspace", "workspace-hack", + "zed-util", "zed_actions", ] @@ -11422,7 +10898,6 @@ name = "outline_panel" version = "0.1.0" dependencies = [ "anyhow", - "collections", "db", "editor", "file_icons", @@ -11435,7 +10910,6 @@ dependencies = [ "outline", "pretty_assertions", "project", - "schemars", "search", "serde", "serde_json", @@ -11444,10 +10918,11 @@ dependencies = [ "smol", "theme", "ui", - "util", "workspace", "workspace-hack", "worktree", + "zed-collections", + "zed-util", "zed_actions", ] @@ -11617,8 +11092,8 @@ version = "0.1.0" dependencies = [ "dirs 4.0.0", "ignore", - "util", "workspace-hack", + "zed-util", ] [[package]] @@ -12136,7 +11611,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 2.9.0", ] [[package]] @@ -12210,9 +11685,10 @@ dependencies = [ "env_logger 0.11.8", "gpui", "menu", - "schemars", + "schemars 1.0.1", "serde", "serde_json", + "theme", "ui", "workspace", "workspace-hack", @@ -12317,7 +11793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d" dependencies = [ "base64 0.22.1", - "indexmap", + "indexmap 2.9.0", "quick-xml 0.32.0", "serde", "time", @@ -12366,30 +11842,23 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi 0.5.0", "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", + "rustix 1.0.7", + "windows-sys 0.61.0", ] [[package]] name = "pollster" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" - -[[package]] -name = "pollster" -version = "0.4.0" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" [[package]] name = "portable-atomic" @@ -12439,7 +11908,7 @@ dependencies = [ "log", "parking_lot", "pin-project", - "pollster 0.2.5", + "pollster", "static_assertions", "thiserror 1.0.69", ] @@ -12482,7 +11951,6 @@ name = "prettier" version = "0.1.0" dependencies = [ "anyhow", - "collections", "fs", "gpui", "language", @@ -12493,8 +11961,9 @@ dependencies = [ "paths", "serde", "serde_json", - "util", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -12517,6 +11986,15 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "primal-check" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" +dependencies = [ + "num-integer", +] + [[package]] name = "proc-macro-crate" version = "3.3.0" @@ -12580,16 +12058,6 @@ dependencies = [ "hex", ] -[[package]] -name = "prodash" -version = "29.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04bb108f648884c23b98a0e940ebc2c93c0c3b89f04dbaf7eb8256ce617d1bc" -dependencies = [ - "log", - "parking_lot", -] - [[package]] name = "profiling" version = "1.0.16" @@ -12622,7 +12090,6 @@ dependencies = [ "circular-buffer", "client", "clock", - "collections", "context_server", "dap", "dap_adapters", @@ -12636,9 +12103,8 @@ dependencies = [ "git_hosting_providers", "globset", "gpui", - "http_client", "image", - "indexmap", + "indexmap 2.9.0", "itertools 0.14.0", "language", "log", @@ -12646,7 +12112,6 @@ dependencies = [ "markdown", "node_runtime", "parking_lot", - "pathdiff", "paths", "postage", "prettier", @@ -12656,7 +12121,7 @@ dependencies = [ "release_channel", "remote", "rpc", - "schemars", + "schemars 1.0.1", "semver", "serde", "serde_json", @@ -12668,7 +12133,6 @@ dependencies = [ "smol", "snippet", "snippet_provider", - "sum_tree", "task", "tempfile", "terminal", @@ -12676,11 +12140,15 @@ dependencies = [ "toml 0.8.20", "unindent", "url", - "util", "watch", "which 6.0.3", "workspace-hack", "worktree", + "zed-collections", + "zed-http-client", + "zed-sum-tree", + "zed-util", + "zeroize", "zlog", ] @@ -12690,33 +12158,33 @@ version = "0.1.0" dependencies = [ "anyhow", "client", - "collections", "command_palette_hooks", + "criterion", "db", "editor", "file_icons", "git", "git_ui", "gpui", - "indexmap", "language", "menu", "pretty_assertions", "project", - "schemars", + "rayon", + "schemars 1.0.1", "search", "serde", - "serde_derive", "serde_json", "settings", "smallvec", "telemetry", "theme", "ui", - "util", "workspace", "workspace-hack", "worktree", + "zed-collections", + "zed-util", "zed_actions", ] @@ -12738,9 +12206,9 @@ dependencies = [ "serde_json", "settings", "theme", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -12765,7 +12233,6 @@ dependencies = [ "anyhow", "assets", "chrono", - "collections", "fs", "futures 0.3.31", "fuzzy", @@ -12780,9 +12247,10 @@ dependencies = [ "serde", "serde_json", "text", - "util", "uuid", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -12805,16 +12273,6 @@ dependencies = [ "prost-derive 0.12.6", ] -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes 1.10.1", - "prost-derive 0.13.5", -] - [[package]] name = "prost-build" version = "0.9.0" @@ -12826,7 +12284,7 @@ dependencies = [ "itertools 0.10.5", "lazy_static", "log", - "multimap 0.8.3", + "multimap", "petgraph", "prost 0.9.0", "prost-types 0.9.0", @@ -12845,7 +12303,7 @@ dependencies = [ "heck 0.5.0", "itertools 0.12.1", "log", - "multimap 0.10.0", + "multimap", "once_cell", "petgraph", "prettyplease", @@ -12882,19 +12340,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "prost-types" version = "0.9.0" @@ -12919,12 +12364,12 @@ name = "proto" version = "0.1.0" dependencies = [ "anyhow", - "collections", "prost 0.9.0", "prost-build 0.9.0", "serde", "typed-path", "workspace-hack", + "zed-collections", ] [[package]] @@ -13017,6 +12462,32 @@ dependencies = [ "wasmtime-math", ] +[[package]] +name = "pulp" +version = "0.18.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" +dependencies = [ + "bytemuck", + "libm", + "num-complex", + "reborrow", +] + +[[package]] +name = "pulp" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b86df24f0a7ddd5e4b95c94fc9ed8a98f1ca94d3b01bdce2824097e7835907" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "reborrow", + "version_check", +] + [[package]] name = "qoi" version = "0.4.1" @@ -13193,6 +12664,16 @@ dependencies = [ "getrandom 0.3.2", ] +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand 0.9.1", +] + [[package]] name = "range-map" version = "0.2.0" @@ -13258,6 +12739,24 @@ dependencies = [ "rgb", ] +[[package]] +name = "raw-cpuid" +version = "10.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.9.0", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -13306,11 +12805,27 @@ dependencies = [ "font-types", ] +[[package]] +name = "realfft" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f821338fddb99d089116342c46e9f1fbf3828dba077674613e734e01d6ea8677" +dependencies = [ + "rustfft", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + [[package]] name = "recent_projects" version = "0.1.0" dependencies = [ "anyhow", + "askpass", "auto_update", "dap", "editor", @@ -13319,6 +12834,7 @@ dependencies = [ "futures 0.3.31", "fuzzy", "gpui", + "indoc", "language", "log", "markdown", @@ -13329,7 +12845,6 @@ dependencies = [ "project", "release_channel", "remote", - "schemars", "serde", "serde_json", "settings", @@ -13338,9 +12853,10 @@ dependencies = [ "telemetry", "theme", "ui", - "util", + "windows-registry 0.6.0", "workspace", "workspace-hack", + "zed-util", "zed_actions", ] @@ -13418,14 +12934,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "refineable" -version = "0.1.0" -dependencies = [ - "derive_refineable", - "workspace-hack", -] - [[package]] name = "regalloc2" version = "0.11.2" @@ -13491,28 +12999,27 @@ dependencies = [ "anyhow", "askpass", "async-trait", - "collections", "fs", "futures 0.3.31", "gpui", - "itertools 0.14.0", "log", "parking_lot", "paths", "prost 0.9.0", "release_channel", "rpc", - "schemars", "serde", "serde_json", + "settings", "shlex", "smol", "tempfile", "thiserror 2.0.12", "urlencoding", - "util", "which 6.0.3", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -13545,7 +13052,7 @@ dependencies = [ "git_hosting_providers", "gpui", "gpui_tokio", - "http_client", + "json_schema_store", "language", "language_extension", "language_model", @@ -13556,6 +13063,7 @@ dependencies = [ "minidumper", "node_runtime", "paths", + "pretty_assertions", "project", "proto", "release_channel", @@ -13572,10 +13080,12 @@ dependencies = [ "thiserror 2.0.12", "toml 0.8.20", "unindent", - "util", "watch", "workspace", "worktree", + "zed-collections", + "zed-http-client", + "zed-util", "zlog", ] @@ -13598,7 +13108,6 @@ dependencies = [ "async-tungstenite", "base64 0.22.1", "client", - "collections", "command_palette_hooks", "editor", "env_logger 0.11.8", @@ -13606,7 +13115,6 @@ dependencies = [ "file_icons", "futures 0.3.31", "gpui", - "http_client", "image", "indoc", "jupyter-protocol", @@ -13621,7 +13129,6 @@ dependencies = [ "picker", "project", "runtimelib", - "schemars", "serde", "serde_json", "settings", @@ -13634,10 +13141,12 @@ dependencies = [ "tree-sitter-python", "tree-sitter-typescript", "ui", - "util", "uuid", "workspace", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -13721,55 +13230,6 @@ dependencies = [ "windows-registry 0.4.0", ] -[[package]] -name = "reqwest" -version = "0.12.15" -source = "git+https://github.com/zed-industries/reqwest.git?rev=951c770a32f1998d6e999cef3e59e0013e6c4415#951c770a32f1998d6e999cef3e59e0013e6c4415" -dependencies = [ - "base64 0.22.1", - "bytes 1.10.1", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.9", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.6.0", - "hyper-rustls 0.27.5", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls 0.23.26", - "rustls-native-certs 0.8.1", - "rustls-pemfile 2.2.0", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.2", - "system-configuration 0.6.1", - "tokio", - "tokio-rustls 0.26.2", - "tokio-socks", - "tokio-util", - "tower 0.5.2", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "windows-registry 0.4.0", -] - [[package]] name = "reqwest_client" version = "0.1.0" @@ -13778,14 +13238,14 @@ dependencies = [ "bytes 1.10.1", "futures 0.3.31", "gpui", - "http_client", "http_client_tls", "log", "regex", - "reqwest 0.12.15 (git+https://github.com/zed-industries/reqwest.git?rev=951c770a32f1998d6e999cef3e59e0013e6c4415)", "serde", "tokio", "workspace-hack", + "zed-http-client", + "zed-reqwest", ] [[package]] @@ -13833,8 +13293,8 @@ dependencies = [ "pulldown-cmark 0.12.2", "theme", "ui", - "util", "workspace-hack", + "zed-util", ] [[package]] @@ -13904,7 +13364,7 @@ dependencies = [ [[package]] name = "rodio" version = "0.21.1" -source = "git+https://github.com/RustAudio/rodio?branch=better_wav_output#82514bd1f2c6cfd9a1a885019b26a8ffea75bc5c" +source = "git+https://github.com/RustAudio/rodio#e2074c6c2acf07b57cf717e076bdda7a9ac6e70b" dependencies = [ "cpal", "dasp_sample", @@ -13927,10 +13387,10 @@ dependencies = [ "rand 0.9.1", "rayon", "smallvec", - "sum_tree", "unicode-segmentation", - "util", "workspace-hack", + "zed-sum-tree", + "zed-util", "zlog", ] @@ -13948,7 +13408,6 @@ dependencies = [ "async-tungstenite", "base64 0.22.1", "chrono", - "collections", "futures 0.3.31", "gpui", "parking_lot", @@ -13960,8 +13419,9 @@ dependencies = [ "sha2", "strum 0.27.1", "tracing", - "util", "workspace-hack", + "zed-collections", + "zed-util", "zlog", "zstd", ] @@ -13997,7 +13457,6 @@ name = "rules_library" version = "0.1.0" dependencies = [ "anyhow", - "collections", "editor", "gpui", "language", @@ -14013,9 +13472,10 @@ dependencies = [ "theme", "title_bar", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", ] @@ -14079,11 +13539,21 @@ dependencies = [ "walkdir", ] +[[package]] +name = "rust-stemmers" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e46a2036019fdb888131db7a4c847a1063a7493f971ed94ea82c67eada63ca54" +dependencies = [ + "serde", + "serde_derive", +] + [[package]] name = "rust_decimal" -version = "1.37.1" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa7de2ba56ac291bd90c6b9bece784a52ae1411f9506544b3eae36dd2356d50" +checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" dependencies = [ "arrayvec", "borsh", @@ -14122,6 +13592,20 @@ dependencies = [ "semver", ] +[[package]] +name = "rustfft" +version = "6.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f140db74548f7c9d7cce60912c9ac414e74df5e718dc947d514b051b42f3f4" +dependencies = [ + "num-complex", + "num-integer", + "num-traits", + "primal-check", + "strength_reduce", + "transpose", +] + [[package]] name = "rustix" version = "0.38.44" @@ -14130,7 +13614,6 @@ checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.9.0", "errno 0.3.11", - "itoa", "libc", "linux-raw-sys 0.4.15", "windows-sys 0.59.0", @@ -14161,13 +13644,13 @@ dependencies = [ [[package]] name = "rustix-openpty" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25c3aad9fc1424eb82c88087789a7d938e1829724f3e4043163baf0d13cfc12" +checksum = "1de16c7c59892b870a6336f185dc10943517f1327447096bbb7bb32cd85e2393" dependencies = [ "errno 0.3.11", "libc", - "rustix 0.38.44", + "rustix 1.0.7", ] [[package]] @@ -14346,6 +13829,16 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "safetensors" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "salsa20" version = "0.10.2" @@ -14364,27 +13857,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scap" -version = "0.0.8" -source = "git+https://github.com/zed-industries/scap?rev=808aa5c45b41e8f44729d02e38fd00a2fe2722e7#808aa5c45b41e8f44729d02e38fd00a2fe2722e7" -dependencies = [ - "anyhow", - "cocoa 0.25.0", - "core-graphics-helmer-fork", - "log", - "objc", - "rand 0.8.5", - "screencapturekit", - "screencapturekit-sys", - "sysinfo", - "tao-core-video-sys", - "windows 0.61.1", - "windows-capture", - "x11", - "xcb", -] - [[package]] name = "schannel" version = "0.1.27" @@ -14414,13 +13886,25 @@ dependencies = [ "anyhow", "clap", "env_logger 0.11.8", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "theme", "workspace-hack", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars" version = "1.0.1" @@ -14428,7 +13912,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe8c9d1c68d67dd9f97ecbc6f932b60eb289c5dbddd8aa1405484a8fd2fcd984" dependencies = [ "dyn-clone", - "indexmap", + "indexmap 2.9.0", "ref-cast", "schemars_derive", "serde", @@ -14632,14 +14116,13 @@ dependencies = [ "anyhow", "bitflags 2.9.0", "client", - "collections", "editor", "futures 0.3.31", "gpui", "language", "menu", "project", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", @@ -14647,9 +14130,10 @@ dependencies = [ "theme", "ui", "unindent", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", ] @@ -14709,15 +14193,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" -[[package]] -name = "semantic_version" -version = "0.1.0" -dependencies = [ - "anyhow", - "serde", - "workspace-hack", -] - [[package]] name = "semver" version = "1.0.26" @@ -14727,20 +14202,36 @@ dependencies = [ "serde", ] +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + [[package]] name = "serde" -version = "1.0.219" +version = "1.0.221" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "341877e04a22458705eb4e131a1508483c877dca2792b3781d4e5d8a6019ec43" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.221" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c459bc0a14c840cb403fc14b148620de1e0778c96ecd6e0c8c3cacb6d8d00fe" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.221" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d6185cf75117e20e62b1ff867b9518577271e58abe0037c40bb4794969355ab0" dependencies = [ "proc-macro2", "quote", @@ -14769,15 +14260,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "56177480b00303e689183f110b4e727bb4211d692c62d4fcd16d02be93077d40" dependencies = [ - "indexmap", + "indexmap 2.9.0", "itoa", "memchr", "ryu", - "serde", + "serde_core", ] [[package]] @@ -14786,7 +14277,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e033097bf0d2b59a62b42c18ebbb797503839b26afdda2c4e1415cb6c813540" dependencies = [ - "indexmap", + "indexmap 2.9.0", "itoa", "memchr", "ryu", @@ -14835,6 +14326,37 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf65a400f8f66fb7b0552869ad70157166676db75ed8181f8104ea91cf9d0b42" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.9.0", + "schemars 0.9.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81679d9ed988d5e9a5e6531dc3f2c28efbd639cbd1dfb628df08edea6004da77" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "serial2" version = "0.2.29" @@ -14853,9 +14375,9 @@ dependencies = [ "db", "gpui", "serde_json", - "util", "uuid", "workspace-hack", + "zed-util", ] [[package]] @@ -14863,7 +14385,7 @@ name = "settings" version = "0.1.0" dependencies = [ "anyhow", - "collections", + "derive_more", "ec4rs", "fs", "futures 0.3.31", @@ -14875,22 +14397,35 @@ dependencies = [ "pretty_assertions", "release_channel", "rust-embed", - "schemars", + "schemars 1.0.1", "serde", - "serde_derive", "serde_json", "serde_json_lenient", "serde_path_to_error", - "settings_ui_macros", + "serde_repr", + "serde_with", + "settings_macros", "smallvec", + "strum 0.27.1", "tree-sitter", "tree-sitter-json", "unindent", - "util", "workspace-hack", + "zed-collections", + "zed-util", "zlog", ] +[[package]] +name = "settings_macros" +version = "0.1.0" +dependencies = [ + "quote", + "settings", + "syn 2.0.101", + "workspace-hack", +] + [[package]] name = "settings_profile_selector" version = "0.1.0" @@ -14917,32 +14452,38 @@ name = "settings_ui" version = "0.1.0" dependencies = [ "anyhow", - "command_palette_hooks", - "debugger_ui", + "assets", + "bm25", + "client", "editor", "feature_flags", + "fs", + "futures 0.3.31", + "fuzzy", "gpui", + "heck 0.5.0", + "language", + "log", "menu", + "node_runtime", + "paths", + "pretty_assertions", + "project", + "schemars 1.0.1", + "search", "serde", - "serde_json", + "session", "settings", - "smallvec", + "strum 0.27.1", "theme", + "title_bar", "ui", + "ui_input", "workspace", "workspace-hack", -] - -[[package]] -name = "settings_ui_macros" -version = "0.1.0" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "settings", - "syn 2.0.101", - "workspace-hack", + "zed-util", + "zed_actions", + "zlog", ] [[package]] @@ -14956,16 +14497,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha1-checked" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89f599ac0c323ebb1c6082821a54962b839832b03984598375bff3975b804423" -dependencies = [ - "digest", - "sha1", -] - [[package]] name = "sha1_smol" version = "1.0.1" @@ -14974,9 +14505,9 @@ checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -15222,7 +14753,6 @@ name = "snippet_provider" version = "0.1.0" dependencies = [ "anyhow", - "collections", "extension", "fs", "futures 0.3.31", @@ -15230,12 +14760,14 @@ dependencies = [ "indoc", "parking_lot", "paths", - "schemars", + "schemars 1.0.1", "serde", + "serde_json", "serde_json_lenient", "snippet", - "util", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -15251,9 +14783,9 @@ dependencies = [ "picker", "settings", "ui", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -15324,7 +14856,6 @@ name = "sqlez" version = "0.1.0" dependencies = [ "anyhow", - "collections", "futures 0.3.31", "indoc", "libsqlite3-sys", @@ -15333,9 +14864,10 @@ dependencies = [ "smol", "sqlformat", "thread_local", - "util", "uuid", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -15391,7 +14923,7 @@ dependencies = [ "futures-util", "hashbrown 0.15.3", "hashlink 0.10.0", - "indexmap", + "indexmap 2.9.0", "log", "memchr", "once_cell", @@ -15614,6 +15146,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "stop-words" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645a3d441ccf4bf47f2e4b7681461986681a6eeea9937d4c3bc9febd61d17c71" +dependencies = [ + "serde_json", +] + [[package]] name = "story" version = "0.1.0" @@ -15668,10 +15209,16 @@ dependencies = [ "ordered-float 2.10.1", "rand 0.9.1", "rope", - "util", "workspace-hack", + "zed-util", ] +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + [[package]] name = "strict-num" version = "0.1.1" @@ -15773,32 +15320,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "sum_tree" -version = "0.1.0" -dependencies = [ - "arrayvec", - "ctor", - "log", - "rand 0.9.1", - "rayon", - "workspace-hack", - "zlog", -] - [[package]] name = "supermaven" version = "0.1.0" dependencies = [ "anyhow", "client", - "collections", "edit_prediction", "editor", "env_logger 0.11.8", "futures 0.3.31", "gpui", - "http_client", "language", "log", "postage", @@ -15812,8 +15344,10 @@ dependencies = [ "theme", "ui", "unicode-segmentation", - "util", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", ] [[package]] @@ -15822,13 +15356,13 @@ version = "0.1.0" dependencies = [ "anyhow", "futures 0.3.31", - "http_client", "paths", "serde", "serde_json", "smol", - "util", "workspace-hack", + "zed-http-client", + "zed-util", ] [[package]] @@ -16162,6 +15696,34 @@ dependencies = [ "libc", ] +[[package]] +name = "sysctl" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" +dependencies = [ + "bitflags 2.9.0", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "sysctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" +dependencies = [ + "bitflags 2.9.0", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + [[package]] name = "sysinfo" version = "0.31.4" @@ -16267,7 +15829,6 @@ name = "tab_switcher" version = "0.1.0" dependencies = [ "anyhow", - "collections", "ctor", "editor", "fuzzy", @@ -16276,16 +15837,17 @@ dependencies = [ "menu", "picker", "project", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "settings", "smol", "theme", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zlog", ] @@ -16348,7 +15910,6 @@ name = "task" version = "0.1.0" dependencies = [ "anyhow", - "collections", "futures 0.3.31", "gpui", "hex", @@ -16356,14 +15917,15 @@ dependencies = [ "parking_lot", "pretty_assertions", "proto", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "serde_json_lenient", "sha2", "shellexpand 2.1.2", - "util", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", ] @@ -16372,7 +15934,6 @@ name = "tasks_ui" version = "0.1.0" dependencies = [ "anyhow", - "collections", "editor", "file_icons", "fuzzy", @@ -16388,9 +15949,10 @@ dependencies = [ "tree-sitter-rust", "tree-sitter-typescript", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", ] @@ -16409,10 +15971,10 @@ dependencies = [ name = "telemetry_events" version = "0.1.0" dependencies = [ - "semantic_version", "serde", "serde_json", "workspace-hack", + "zed-semantic-version", ] [[package]] @@ -16454,17 +16016,16 @@ version = "0.1.0" dependencies = [ "alacritty_terminal", "anyhow", - "collections", "futures 0.3.31", "gpui", "itertools 0.14.0", "libc", + "log", "rand 0.9.1", "regex", "release_channel", - "schemars", + "schemars 1.0.1", "serde", - "serde_derive", "settings", "smol", "sysinfo", @@ -16473,9 +16034,10 @@ dependencies = [ "thiserror 2.0.12", "url", "urlencoding", - "util", "windows 0.61.1", "workspace-hack", + "zed-collections", + "zed-util", ] [[package]] @@ -16497,7 +16059,6 @@ dependencies = [ "async-recursion", "breadcrumbs", "client", - "collections", "db", "dirs 4.0.0", "editor", @@ -16506,10 +16067,11 @@ dependencies = [ "itertools 0.14.0", "language", "log", + "pretty_assertions", "project", "rand 0.9.1", "regex", - "schemars", + "schemars 1.0.1", "search", "serde", "serde_json", @@ -16520,9 +16082,10 @@ dependencies = [ "terminal", "theme", "ui", - "util", "workspace", "workspace-hack", + "zed-collections", + "zed-util", "zed_actions", ] @@ -16532,10 +16095,8 @@ version = "0.1.0" dependencies = [ "anyhow", "clock", - "collections", "ctor", "gpui", - "http_client", "log", "parking_lot", "postage", @@ -16543,9 +16104,11 @@ dependencies = [ "regex", "rope", "smallvec", - "sum_tree", - "util", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-sum-tree", + "zed-util", "zlog", ] @@ -16554,29 +16117,25 @@ name = "theme" version = "0.1.0" dependencies = [ "anyhow", - "collections", "derive_more", "fs", "futures 0.3.31", "gpui", - "indexmap", - "inventory", "log", "palette", "parking_lot", - "refineable", - "schemars", + "schemars 1.0.1", "serde", - "serde_derive", "serde_json", "serde_json_lenient", - "serde_repr", "settings", "strum 0.27.1", "thiserror 2.0.12", - "util", "uuid", "workspace-hack", + "zed-collections", + "zed-refineable", + "zed-util", ] [[package]] @@ -16598,7 +16157,7 @@ dependencies = [ "anyhow", "clap", "gpui", - "indexmap", + "indexmap 2.9.0", "log", "palette", "serde", @@ -16609,6 +16168,7 @@ dependencies = [ "theme", "vscode_theme", "workspace-hack", + "zed-collections", ] [[package]] @@ -16625,9 +16185,9 @@ dependencies = [ "telemetry", "theme", "ui", - "util", "workspace", "workspace-hack", + "zed-util", "zed_actions", ] @@ -16843,16 +16403,14 @@ dependencies = [ "chrono", "client", "cloud_llm_client", - "collections", "db", "gpui", - "http_client", "notifications", "pretty_assertions", "project", "remote", "rpc", - "schemars", + "schemars 1.0.1", "serde", "settings", "smallvec", @@ -16861,10 +16419,12 @@ dependencies = [ "theme", "tree-sitter-md", "ui", - "util", "windows 0.61.1", "workspace", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", "zed_actions", ] @@ -17051,7 +16611,7 @@ version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", @@ -17081,9 +16641,9 @@ dependencies = [ "picker", "project", "ui", - "util", "workspace", "workspace-hack", + "zed-util", ] [[package]] @@ -17258,11 +16818,21 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + [[package]] name = "tree-sitter" -version = "0.25.6" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cf18d43cbf0bfca51f657132cc616a5097edc4424d538bae6fa60142eaf9f0" +checksum = "78f873475d258561b06f1c595d93308a7ed124d9977cb26b148c2084a4a3cc87" dependencies = [ "cc", "regex", @@ -17435,8 +17005,9 @@ dependencies = [ [[package]] name = "tree-sitter-python" -version = "0.23.6" -source = "git+https://github.com/zed-industries/tree-sitter-python?rev=218fcbf3fda3d029225f3dec005cb497d111b35e#218fcbf3fda3d029225f3dec005cb497d111b35e" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c" dependencies = [ "cc", "tree-sitter-language", @@ -17475,8 +17046,7 @@ dependencies = [ [[package]] name = "tree-sitter-typescript" version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5f76ed8d947a75cc446d5fccd8b602ebf0cde64ccf2ffa434d873d7a575eff" +source = "git+https://github.com/zed-industries/tree-sitter-typescript?rev=e2c53597d6a5d9cf7bbe8dccde576fe1e46c5899#e2c53597d6a5d9cf7bbe8dccde576fe1e46c5899" dependencies = [ "cc", "tree-sitter-language", @@ -17619,6 +17189,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "ug" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90b70b37e9074642bc5f60bb23247fd072a84314ca9e71cdf8527593406a0dd3" +dependencies = [ + "gemm 0.18.2", + "half", + "libloading", + "memmap2", + "num", + "num-traits", + "num_cpus", + "rayon", + "safetensors", + "serde", + "thiserror 1.0.69", + "tracing", + "yoke", +] + [[package]] name = "ui" version = "0.1.0" @@ -17627,11 +17218,11 @@ dependencies = [ "component", "documented", "gpui", - "gpui_macros", + "gpui-macros", "icons", "itertools 0.14.0", "menu", - "schemars", + "schemars 1.0.1", "serde", "settings", "smallvec", @@ -17639,9 +17230,9 @@ dependencies = [ "strum 0.27.1", "theme", "ui_macros", - "util", "windows 0.61.1", "workspace-hack", + "zed-util", ] [[package]] @@ -17650,7 +17241,10 @@ version = "0.1.0" dependencies = [ "component", "editor", + "fuzzy", "gpui", + "menu", + "picker", "settings", "theme", "ui", @@ -17682,15 +17276,6 @@ dependencies = [ "workspace-hack", ] -[[package]] -name = "uluru" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c8a2469e56e6e5095c82ccd3afb98dad95f7af7929aab6d8ba8d6e0f73657da" -dependencies = [ - "arrayvec", -] - [[package]] name = "unicase" version = "2.8.1" @@ -17715,12 +17300,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" -[[package]] -name = "unicode-bom" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" - [[package]] name = "unicode-ccc" version = "0.2.0" @@ -17778,12 +17357,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-width" version = "0.2.0" @@ -17883,53 +17456,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "util" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-fs", - "async_zip", - "collections", - "command-fds", - "dirs 4.0.0", - "dunce", - "futures 0.3.31", - "futures-lite 1.13.0", - "git2", - "globset", - "indoc", - "itertools 0.14.0", - "libc", - "log", - "nix 0.29.0", - "rand 0.9.1", - "regex", - "rust-embed", - "schemars", - "serde", - "serde_json", - "serde_json_lenient", - "shlex", - "smol", - "take-until", - "tempfile", - "tendril", - "unicase", - "util_macros", - "walkdir", - "workspace-hack", -] - -[[package]] -name = "util_macros" -version = "0.1.0" -dependencies = [ - "quote", - "syn 2.0.101", - "workspace-hack", -] - [[package]] name = "uuid" version = "1.16.0" @@ -18016,7 +17542,7 @@ name = "vercel" version = "0.1.0" dependencies = [ "anyhow", - "schemars", + "schemars 1.0.1", "serde", "strum 0.27.1", "workspace-hack", @@ -18042,7 +17568,6 @@ dependencies = [ "assets", "async-compat", "async-trait", - "collections", "command_palette", "command_palette_hooks", "db", @@ -18056,6 +17581,7 @@ dependencies = [ "language", "log", "lsp", + "menu", "multi_buffer", "nvim-rs", "parking_lot", @@ -18064,10 +17590,9 @@ dependencies = [ "project_panel", "regex", "release_channel", - "schemars", + "schemars 1.0.1", "search", "serde", - "serde_derive", "serde_json", "settings", "task", @@ -18075,10 +17600,13 @@ dependencies = [ "theme", "tokio", "ui", - "util", "vim_mode_setting", "workspace", "workspace-hack", + "zed-collections", + "zed-perf", + "zed-util", + "zed-util-macros", "zed_actions", ] @@ -18086,10 +17614,7 @@ dependencies = [ name = "vim_mode_setting" version = "0.1.0" dependencies = [ - "anyhow", "gpui", - "schemars", - "serde", "settings", "workspace-hack", ] @@ -18324,7 +17849,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fd83062c17b9f4985d438603cde0a5e8c5c8198201a6937f778b607924c7da2" dependencies = [ "anyhow", - "indexmap", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -18342,7 +17867,7 @@ dependencies = [ "anyhow", "auditable-serde", "flate2", - "indexmap", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -18372,7 +17897,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84e5df6dba6c0d7fafc63a450f1738451ed7a0b52295d83e868218fa286bf708" dependencies = [ "bitflags 2.9.0", - "indexmap", + "indexmap 2.9.0", "semver", ] @@ -18384,7 +17909,7 @@ checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" dependencies = [ "bitflags 2.9.0", "hashbrown 0.15.3", - "indexmap", + "indexmap 2.9.0", "semver", "serde", ] @@ -18397,7 +17922,7 @@ checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" dependencies = [ "bitflags 2.9.0", "hashbrown 0.15.3", - "indexmap", + "indexmap 2.9.0", "semver", ] @@ -18426,7 +17951,7 @@ dependencies = [ "cfg-if", "encoding_rs", "hashbrown 0.14.5", - "indexmap", + "indexmap 2.9.0", "libc", "log", "mach2 0.4.2", @@ -18550,7 +18075,7 @@ dependencies = [ "cranelift-bitset", "cranelift-entity", "gimli", - "indexmap", + "indexmap 2.9.0", "log", "object", "postcard", @@ -18675,7 +18200,7 @@ checksum = "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap", + "indexmap 2.9.0", "wit-parser 0.221.3", ] @@ -18750,6 +18275,18 @@ dependencies = [ "wayland-scanner", ] +[[package]] +name = "wayland-protocols" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" +dependencies = [ + "bitflags 2.9.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + [[package]] name = "wayland-protocols-plasma" version = "0.2.0" @@ -18759,7 +18296,7 @@ dependencies = [ "bitflags 2.9.0", "wayland-backend", "wayland-client", - "wayland-protocols", + "wayland-protocols 0.31.2", "wayland-scanner", ] @@ -18824,10 +18361,10 @@ version = "0.1.0" dependencies = [ "anyhow", "cloud_llm_client", - "collections", "gpui", "serde", "workspace-hack", + "zed-collections", ] [[package]] @@ -18839,12 +18376,12 @@ dependencies = [ "cloud_llm_client", "futures 0.3.31", "gpui", - "http_client", "language_model", "serde", "serde_json", "web_search", "workspace-hack", + "zed-http-client", ] [[package]] @@ -18888,7 +18425,7 @@ dependencies = [ "reqwest 0.11.27", "scratch", "semver", - "zip", + "zip 0.6.6", ] [[package]] @@ -19061,7 +18598,7 @@ dependencies = [ "windows-collections", "windows-core 0.61.0", "windows-future", - "windows-link", + "windows-link 0.1.1", "windows-numerics", ] @@ -19131,7 +18668,7 @@ checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ "windows-implement 0.60.0", "windows-interface 0.59.1", - "windows-link", + "windows-link 0.1.1", "windows-result 0.3.2", "windows-strings 0.4.0", ] @@ -19143,7 +18680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" dependencies = [ "windows-core 0.61.0", - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -19218,6 +18755,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + [[package]] name = "windows-numerics" version = "0.2.0" @@ -19225,7 +18768,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ "windows-core 0.61.0", - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -19245,11 +18788,22 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad1da3e436dc7653dfdf3da67332e22bff09bb0e28b0239e1624499c7830842e" dependencies = [ - "windows-link", + "windows-link 0.1.1", "windows-result 0.3.2", "windows-strings 0.4.0", ] +[[package]] +name = "windows-registry" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f91f87ce112ffb7275000ea98eb1940912c21c1567c9312fde20261f3eadd29" +dependencies = [ + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", +] + [[package]] name = "windows-result" version = "0.1.2" @@ -19274,7 +18828,16 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-link", + "windows-link 0.1.1", +] + +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link 0.2.0", ] [[package]] @@ -19293,7 +18856,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -19302,7 +18865,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" dependencies = [ - "windows-link", + "windows-link 0.1.1", +] + +[[package]] +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link 0.2.0", ] [[package]] @@ -19350,6 +18922,15 @@ dependencies = [ "windows-targets 0.53.2", ] +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -19751,7 +19332,7 @@ checksum = "d8a39a15d1ae2077688213611209849cad40e9e5cccf6e61951a425850677ff3" dependencies = [ "anyhow", "heck 0.4.1", - "indexmap", + "indexmap 2.9.0", "wasm-metadata 0.201.0", "wit-bindgen-core 0.22.0", "wit-component 0.201.0", @@ -19765,7 +19346,7 @@ checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap", + "indexmap 2.9.0", "prettyplease", "syn 2.0.101", "wasm-metadata 0.227.1", @@ -19810,7 +19391,7 @@ checksum = "421c0c848a0660a8c22e2fd217929a0191f14476b68962afd2af89fd22e39825" dependencies = [ "anyhow", "bitflags 2.9.0", - "indexmap", + "indexmap 2.9.0", "log", "serde", "serde_derive", @@ -19829,7 +19410,7 @@ checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" dependencies = [ "anyhow", "bitflags 2.9.0", - "indexmap", + "indexmap 2.9.0", "log", "serde", "serde_derive", @@ -19848,7 +19429,7 @@ checksum = "196d3ecfc4b759a8573bf86a9b3f8996b304b3732e4c7de81655f875f6efdca6" dependencies = [ "anyhow", "id-arena", - "indexmap", + "indexmap 2.9.0", "log", "semver", "serde", @@ -19866,7 +19447,7 @@ checksum = "896112579ed56b4a538b07a3d16e562d101ff6265c46b515ce0c701eef16b2ac" dependencies = [ "anyhow", "id-arena", - "indexmap", + "indexmap 2.9.0", "log", "semver", "serde", @@ -19884,7 +19465,7 @@ checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" dependencies = [ "anyhow", "id-arena", - "indexmap", + "indexmap 2.9.0", "log", "semver", "serde", @@ -19916,14 +19497,12 @@ dependencies = [ "call", "client", "clock", - "collections", "component", "dap", "db", "fs", "futures 0.3.31", "gpui", - "http_client", "itertools 0.14.0", "language", "log", @@ -19934,7 +19513,7 @@ dependencies = [ "pretty_assertions", "project", "remote", - "schemars", + "schemars 1.0.1", "serde", "serde_json", "session", @@ -19947,10 +19526,12 @@ dependencies = [ "tempfile", "theme", "ui", - "util", "uuid", "windows 0.61.1", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-util", "zed_actions", "zlog", ] @@ -19964,6 +19545,7 @@ dependencies = [ "aho-corasick", "anstream", "arrayvec", + "ashpd 0.11.0", "async-compression", "async-std", "async-tungstenite", @@ -19991,12 +19573,11 @@ dependencies = [ "cipher", "clap", "clap_builder", - "codespan-reporting 0.12.0", + "codespan-reporting", "concurrent-queue", "core-foundation 0.9.4", "core-foundation-sys", "cranelift-codegen", - "crc32fast", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", @@ -20031,11 +19612,10 @@ dependencies = [ "hyper 0.14.32", "hyper-rustls 0.27.5", "idna", - "indexmap", + "indexmap 2.9.0", "inout", "itertools 0.12.1", "itertools 0.13.0", - "jiff", "lazy_static", "libc", "libsqlite3-sys", @@ -20047,6 +19627,7 @@ dependencies = [ "lyon_path", "md-5", "memchr", + "memmap2", "mime_guess", "miniz_oxide", "mio 1.0.3", @@ -20057,6 +19638,7 @@ dependencies = [ "nom 7.1.3", "num-bigint", "num-bigint-dig", + "num-complex", "num-integer", "num-iter", "num-rational", @@ -20072,6 +19654,7 @@ dependencies = [ "phf_shared", "prettyplease", "proc-macro2", + "prost 0.12.6", "prost 0.9.0", "prost-types 0.9.0", "quote", @@ -20079,6 +19662,7 @@ dependencies = [ "rand 0.9.1", "rand_chacha 0.3.1", "rand_core 0.6.4", + "rand_distr", "regalloc2", "regex", "regex-automata", @@ -20097,9 +19681,8 @@ dependencies = [ "security-framework-sys", "semver", "serde", - "serde_derive", + "serde_core", "serde_json", - "sha1", "simd-adler32", "smallvec", "spin", @@ -20108,6 +19691,7 @@ dependencies = [ "sqlx-macros-core", "sqlx-postgres", "sqlx-sqlite", + "stable_deref_trait", "strum 0.26.3", "subtle", "syn 1.0.109", @@ -20127,7 +19711,6 @@ dependencies = [ "tracing", "tracing-core", "tungstenite 0.26.2", - "unicode-normalization", "unicode-properties", "url", "uuid", @@ -20135,13 +19718,16 @@ dependencies = [ "wasmtime", "wasmtime-cranelift", "wasmtime-environ", + "wayland-backend", + "wayland-sys", "winapi", "windows-core 0.61.0", "windows-numerics", "windows-sys 0.48.0", "windows-sys 0.52.0", "windows-sys 0.59.0", - "winnow", + "windows-sys 0.61.0", + "zbus_macros", "zeroize", "zvariant", ] @@ -20152,14 +19738,12 @@ version = "0.1.0" dependencies = [ "anyhow", "clock", - "collections", "fs", "futures 0.3.31", "fuzzy", "git", "git2", "gpui", - "http_client", "ignore", "language", "log", @@ -20169,16 +19753,17 @@ dependencies = [ "pretty_assertions", "rand 0.9.1", "rpc", - "schemars", "serde", "serde_json", "settings", "smallvec", "smol", - "sum_tree", "text", - "util", "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-sum-tree", + "zed-util", "zlog", ] @@ -20247,7 +19832,7 @@ name = "x_ai" version = "0.1.0" dependencies = [ "anyhow", - "schemars", + "schemars 1.0.1", "serde", "strum 0.27.1", "workspace-hack", @@ -20277,26 +19862,13 @@ dependencies = [ [[package]] name = "xcursor" version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" - -[[package]] -name = "xim" -version = "0.4.0" -source = "git+https://github.com/zed-industries/xim-rs?rev=c0a70c1bd2ce197364216e5e818a2cb3adb99a8d#c0a70c1bd2ce197364216e5e818a2cb3adb99a8d" -dependencies = [ - "ahash 0.8.11", - "hashbrown 0.14.5", - "log", - "x11rb", - "xim-ctext", - "xim-parser", -] +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" [[package]] name = "xim-ctext" version = "0.3.0" -source = "git+https://github.com/zed-industries/xim-rs?rev=c0a70c1bd2ce197364216e5e818a2cb3adb99a8d#c0a70c1bd2ce197364216e5e818a2cb3adb99a8d" +source = "git+https://github.com/zed-industries/xim-rs.git?rev=16f35a2c881b815a2b6cdfd6687988e84f8447d8#16f35a2c881b815a2b6cdfd6687988e84f8447d8" dependencies = [ "encoding_rs", ] @@ -20304,7 +19876,7 @@ dependencies = [ [[package]] name = "xim-parser" version = "0.2.1" -source = "git+https://github.com/zed-industries/xim-rs?rev=c0a70c1bd2ce197364216e5e818a2cb3adb99a8d#c0a70c1bd2ce197364216e5e818a2cb3adb99a8d" +source = "git+https://github.com/zed-industries/xim-rs.git?rev=16f35a2c881b815a2b6cdfd6687988e84f8447d8#16f35a2c881b815a2b6cdfd6687988e84f8447d8" dependencies = [ "bitflags 2.9.0", ] @@ -20358,6 +19930,9 @@ dependencies = [ "cargo_metadata", "cargo_toml", "clap", + "indoc", + "toml 0.8.20", + "toml_edit", "workspace-hack", ] @@ -20510,7 +20085,7 @@ dependencies = [ [[package]] name = "zed" -version = "0.205.0" +version = "0.209.0" dependencies = [ "acp_tools", "activity_indicator", @@ -20533,8 +20108,8 @@ dependencies = [ "clap", "cli", "client", + "codestral", "collab_ui", - "collections", "command_palette", "component", "copilot", @@ -20557,109 +20132,368 @@ dependencies = [ "file_finder", "fs", "futures 0.3.31", - "git", - "git_hosting_providers", - "git_ui", - "go_to_line", - "gpui", - "gpui_tokio", - "http_client", - "image_viewer", - "inspector_ui", - "install_cli", + "git", + "git_hosting_providers", + "git_ui", + "go_to_line", + "gpui", + "gpui_tokio", + "image_viewer", + "inspector_ui", + "install_cli", + "itertools 0.14.0", + "journal", + "json_schema_store", + "keymap_editor", + "language", + "language_extension", + "language_model", + "language_models", + "language_onboarding", + "language_selector", + "language_tools", + "languages", + "line_ending_selector", + "log", + "markdown", + "markdown_preview", + "menu", + "migrator", + "mimalloc", + "nc", + "nix 0.29.0", + "node_runtime", + "notifications", + "onboarding", + "outline", + "outline_panel", + "parking_lot", + "paths", + "picker", + "pretty_assertions", + "profiling", + "project", + "project_panel", + "project_symbols", + "prompt_store", + "proto", + "recent_projects", + "release_channel", + "remote", + "repl", + "reqwest_client", + "rope", + "search", + "serde", + "serde_json", + "session", + "settings", + "settings_profile_selector", + "settings_ui", + "shellexpand 2.1.2", + "smol", + "snippet_provider", + "snippets_ui", + "supermaven", + "svg_preview", + "sysinfo", + "system_specs", + "tab_switcher", + "task", + "tasks_ui", + "telemetry", + "telemetry_events", + "terminal_view", + "theme", + "theme_extension", + "theme_selector", + "time", + "title_bar", + "toolchain_selector", + "tree-sitter-md", + "tree-sitter-rust", + "ui", + "ui_input", + "ui_prompt", + "url", + "urlencoding", + "uuid", + "vim", + "vim_mode_setting", + "watch", + "web_search", + "web_search_providers", + "windows 0.61.1", + "winresource", + "workspace", + "workspace-hack", + "zed-collections", + "zed-http-client", + "zed-reqwest", + "zed-util", + "zed_actions", + "zed_env_vars", + "zeta", + "zeta2", + "zeta2_tools", + "zlog", + "zlog_settings", +] + +[[package]] +name = "zed-collections" +version = "0.1.0" +dependencies = [ + "indexmap 2.9.0", + "rustc-hash 2.1.1", + "workspace-hack", +] + +[[package]] +name = "zed-derive-refineable" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "workspace-hack", +] + +[[package]] +name = "zed-font-kit" +version = "0.14.1-zed" +source = "git+https://github.com/zed-industries/font-kit?rev=110523127440aefb11ce0cf280ae7c5071337ec5#110523127440aefb11ce0cf280ae7c5071337ec5" +dependencies = [ + "bitflags 2.9.0", + "byteorder", + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "core-text", + "dirs 5.0.1", + "dwrote", + "float-ord", + "freetype-sys", + "lazy_static", + "libc", + "log", + "pathfinder_geometry", + "pathfinder_simd", + "walkdir", + "winapi", + "yeslogic-fontconfig-sys", +] + +[[package]] +name = "zed-http-client" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-compression", + "async-fs", + "async-tar", + "bytes 1.10.1", + "derive_more", + "futures 0.3.31", + "http 1.3.1", + "http-body 1.0.1", + "log", + "parking_lot", + "serde", + "serde_json", + "sha2", + "tempfile", + "url", + "workspace-hack", + "zed-reqwest", + "zed-util", +] + +[[package]] +name = "zed-media" +version = "0.1.0" +dependencies = [ + "anyhow", + "bindgen 0.71.1", + "core-foundation 0.10.0", + "core-video", + "ctor", + "foreign-types 0.5.0", + "metal", + "objc", + "workspace-hack", +] + +[[package]] +name = "zed-perf" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "workspace-hack", + "zed-collections", +] + +[[package]] +name = "zed-refineable" +version = "0.1.0" +dependencies = [ + "workspace-hack", + "zed-derive-refineable", +] + +[[package]] +name = "zed-reqwest" +version = "0.12.15-zed" +source = "git+https://github.com/zed-industries/reqwest.git?rev=c15662463bda39148ba154100dd44d3fba5873a4#c15662463bda39148ba154100dd44d3fba5873a4" +dependencies = [ + "base64 0.22.1", + "bytes 1.10.1", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.9", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-rustls 0.27.5", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.26", + "rustls-native-certs 0.8.1", + "rustls-pemfile 2.2.0", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "system-configuration 0.6.1", + "tokio", + "tokio-rustls 0.26.2", + "tokio-socks", + "tokio-util", + "tower 0.5.2", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "windows-registry 0.4.0", +] + +[[package]] +name = "zed-scap" +version = "0.0.8-zed" +source = "git+https://github.com/zed-industries/scap?rev=4afea48c3b002197176fb19cd0f9b180dd36eaac#4afea48c3b002197176fb19cd0f9b180dd36eaac" +dependencies = [ + "anyhow", + "cocoa 0.25.0", + "core-graphics-helmer-fork", + "log", + "objc", + "rand 0.8.5", + "screencapturekit", + "screencapturekit-sys", + "sysinfo", + "tao-core-video-sys", + "windows 0.61.1", + "windows-capture", + "x11", + "xcb", +] + +[[package]] +name = "zed-semantic-version" +version = "0.1.0" +dependencies = [ + "anyhow", + "serde", + "workspace-hack", +] + +[[package]] +name = "zed-sum-tree" +version = "0.1.0" +dependencies = [ + "arrayvec", + "ctor", + "log", + "rand 0.9.1", + "rayon", + "workspace-hack", + "zlog", +] + +[[package]] +name = "zed-util" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-fs", + "async_zip", + "command-fds", + "dirs 4.0.0", + "dunce", + "futures 0.3.31", + "futures-lite 1.13.0", + "git2", + "globset", + "indoc", "itertools 0.14.0", - "jj_ui", - "journal", - "keymap_editor", - "language", - "language_extension", - "language_model", - "language_models", - "language_onboarding", - "language_selector", - "language_tools", - "languages", - "line_ending_selector", + "libc", "log", - "markdown", - "markdown_preview", - "menu", - "migrator", - "mimalloc", - "nc", "nix 0.29.0", - "node_runtime", - "notifications", - "onboarding", - "outline", - "outline_panel", - "parking_lot", - "paths", - "picker", "pretty_assertions", - "profiling", - "project", - "project_panel", - "project_symbols", - "prompt_store", - "proto", - "recent_projects", - "release_channel", - "remote", - "repl", - "reqwest 0.12.15 (git+https://github.com/zed-industries/reqwest.git?rev=951c770a32f1998d6e999cef3e59e0013e6c4415)", - "reqwest_client", - "rope", - "search", + "rand 0.9.1", + "regex", + "rust-embed", + "schemars 1.0.1", "serde", "serde_json", - "session", - "settings", - "settings_profile_selector", - "settings_ui", - "shellexpand 2.1.2", + "serde_json_lenient", + "shlex", "smol", - "snippet_provider", - "snippets_ui", - "supermaven", - "svg_preview", - "sysinfo", - "system_specs", - "tab_switcher", - "task", - "tasks_ui", - "telemetry", - "telemetry_events", - "terminal_view", - "theme", - "theme_extension", - "theme_selector", - "time", - "title_bar", - "toolchain_selector", - "tree-sitter-md", - "tree-sitter-rust", - "ui", - "ui_input", - "ui_prompt", - "url", - "urlencoding", - "util", - "uuid", - "vim", - "vim_mode_setting", - "watch", - "web_search", - "web_search_providers", - "windows 0.61.1", - "winresource", - "workspace", + "take-until", + "tempfile", + "tendril", + "unicase", + "walkdir", + "which 6.0.3", "workspace-hack", - "zed_actions", - "zed_env_vars", - "zeta", - "zlog", - "zlog_settings", + "zed-collections", + "zed-util-macros", +] + +[[package]] +name = "zed-util-macros" +version = "0.1.0" +dependencies = [ + "quote", + "syn 2.0.101", + "workspace-hack", + "zed-perf", +] + +[[package]] +name = "zed-xim" +version = "0.4.0-zed" +source = "git+https://github.com/zed-industries/xim-rs.git?rev=16f35a2c881b815a2b6cdfd6687988e84f8447d8#16f35a2c881b815a2b6cdfd6687988e84f8447d8" +dependencies = [ + "ahash 0.8.11", + "hashbrown 0.14.5", + "log", + "x11rb", + "xim-ctext", + "xim-parser", ] [[package]] @@ -20667,7 +20501,7 @@ name = "zed_actions" version = "0.1.0" dependencies = [ "gpui", - "schemars", + "schemars 1.0.1", "serde", "uuid", "workspace-hack", @@ -20677,6 +20511,7 @@ dependencies = [ name = "zed_env_vars" version = "0.1.0" dependencies = [ + "gpui", "workspace-hack", ] @@ -20700,6 +20535,17 @@ dependencies = [ "wit-bindgen 0.41.0", ] +[[package]] +name = "zed_extension_api" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0729d50b4ca0a7e28e590bbe32e3ca0194d97ef654961451a424c661a366fca0" +dependencies = [ + "serde", + "serde_json", + "wit-bindgen 0.41.0", +] + [[package]] name = "zed_glsl" version = "0.1.0" @@ -20709,9 +20555,9 @@ dependencies = [ [[package]] name = "zed_html" -version = "0.2.2" +version = "0.2.3" dependencies = [ - "zed_extension_api 0.1.0", + "zed_extension_api 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -20721,21 +20567,6 @@ dependencies = [ "zed_extension_api 0.1.0", ] -[[package]] -name = "zed_ruff" -version = "0.1.1" -dependencies = [ - "zed_extension_api 0.1.0", -] - -[[package]] -name = "zed_snippets" -version = "0.0.6" -dependencies = [ - "serde_json", - "zed_extension_api 0.1.0", -] - [[package]] name = "zed_test_extension" version = "0.1.0" @@ -20888,7 +20719,6 @@ dependencies = [ "clock", "cloud_api_types", "cloud_llm_client", - "collections", "command_palette_hooks", "copilot", "ctor", @@ -20899,7 +20729,6 @@ dependencies = [ "fs", "futures 0.3.31", "gpui", - "http_client", "indoc", "itertools 0.14.0", "language", @@ -20925,15 +20754,83 @@ dependencies = [ "tree-sitter-go", "tree-sitter-rust", "ui", - "util", "uuid", "workspace", "workspace-hack", "worktree", + "zed-collections", + "zed-http-client", + "zed-util", "zed_actions", "zlog", ] +[[package]] +name = "zeta2" +version = "0.1.0" +dependencies = [ + "anyhow", + "arrayvec", + "chrono", + "client", + "clock", + "cloud_llm_client", + "cloud_zeta2_prompt", + "edit_prediction", + "edit_prediction_context", + "futures 0.3.31", + "gpui", + "indoc", + "language", + "language_model", + "log", + "lsp", + "pretty_assertions", + "project", + "release_channel", + "serde_json", + "settings", + "thiserror 2.0.12", + "uuid", + "workspace", + "workspace-hack", + "worktree", + "zed-util", +] + +[[package]] +name = "zeta2_tools" +version = "0.1.0" +dependencies = [ + "chrono", + "clap", + "client", + "cloud_llm_client", + "edit_prediction_context", + "editor", + "futures 0.3.31", + "gpui", + "indoc", + "language", + "log", + "multi_buffer", + "ordered-float 2.10.1", + "pretty_assertions", + "project", + "serde", + "serde_json", + "settings", + "text", + "ui", + "ui_input", + "workspace", + "workspace-hack", + "zed-collections", + "zed-util", + "zeta2", + "zlog", +] + [[package]] name = "zeta_cli" version = "0.1.0" @@ -20941,7 +20838,10 @@ dependencies = [ "anyhow", "clap", "client", + "cloud_llm_client", + "cloud_zeta2_prompt", "debug_adapter_extension", + "edit_prediction_context", "extension", "fs", "futures 0.3.31", @@ -20952,7 +20852,9 @@ dependencies = [ "language_model", "language_models", "languages", + "log", "node_runtime", + "ordered-float 2.10.1", "paths", "project", "prompt_store", @@ -20964,10 +20866,13 @@ dependencies = [ "shellexpand 2.1.2", "smol", "terminal_view", - "util", "watch", "workspace-hack", + "zed-collections", + "zed-util", "zeta", + "zeta2", + "zlog", ] [[package]] @@ -20991,10 +20896,19 @@ dependencies = [ ] [[package]] -name = "zlib-rs" -version = "0.5.0" +name = "zip" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" +checksum = "9cc23c04387f4da0374be4533ad1208cbb091d5c11d070dfef13676ad6497164" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "indexmap 2.9.0", + "num_enum", + "thiserror 1.0.69", +] [[package]] name = "zlog" @@ -21005,18 +20919,17 @@ dependencies = [ "log", "tempfile", "workspace-hack", + "zed-collections", ] [[package]] name = "zlog_settings" version = "0.1.0" dependencies = [ - "anyhow", "gpui", - "schemars", - "serde", "settings", "workspace-hack", + "zed-collections", "zlog", ] diff --git a/Cargo.toml b/Cargo.toml index 042bd8cf421b737130344242c2a58ad4cfb2a7f2..34214772f5f33f9b3521e6d1ae2744857cf1c2fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ members = [ "crates/cloud_api_client", "crates/cloud_api_types", "crates/cloud_llm_client", + "crates/cloud_zeta2_prompt", "crates/collab", "crates/collab_ui", "crates/collections", @@ -52,10 +53,13 @@ members = [ "crates/debugger_tools", "crates/debugger_ui", "crates/deepseek", + "crates/denoise", "crates/diagnostics", "crates/docs_preprocessor", "crates/edit_prediction", "crates/edit_prediction_button", + "crates/edit_prediction_context", + "crates/zeta2_tools", "crates/editor", "crates/eval", "crates/explorer_command_injector", @@ -86,9 +90,8 @@ members = [ "crates/image_viewer", "crates/inspector_ui", "crates/install_cli", - "crates/jj", - "crates/jj_ui", "crates/journal", + "crates/json_schema_store", "crates/keymap_editor", "crates/language", "crates/language_extension", @@ -147,9 +150,9 @@ members = [ "crates/semantic_version", "crates/session", "crates/settings", + "crates/settings_macros", "crates/settings_profile_selector", "crates/settings_ui", - "crates/settings_ui_macros", "crates/snippet", "crates/snippet_provider", "crates/snippets_ui", @@ -161,6 +164,7 @@ members = [ "crates/sum_tree", "crates/supermaven", "crates/supermaven_api", + "crates/codestral", "crates/svg_preview", "crates/system_specs", "crates/tab_switcher", @@ -197,6 +201,7 @@ members = [ "crates/zed_actions", "crates/zed_env_vars", "crates/zeta", + "crates/zeta2", "crates/zeta_cli", "crates/zlog", "crates/zlog_settings", @@ -208,15 +213,14 @@ members = [ "extensions/glsl", "extensions/html", "extensions/proto", - "extensions/ruff", "extensions/slash-commands-example", - "extensions/snippets", "extensions/test-extension", # # Tooling # + "tooling/perf", "tooling/workspace-hack", "tooling/xtask", ] @@ -267,9 +271,10 @@ clock = { path = "crates/clock" } cloud_api_client = { path = "crates/cloud_api_client" } cloud_api_types = { path = "crates/cloud_api_types" } cloud_llm_client = { path = "crates/cloud_llm_client" } +cloud_zeta2_prompt = { path = "crates/cloud_zeta2_prompt" } collab = { path = "crates/collab" } collab_ui = { path = "crates/collab_ui" } -collections = { path = "crates/collections" } +collections = { path = "crates/collections", package = "zed-collections", version = "0.1.0" } command_palette = { path = "crates/command_palette" } command_palette_hooks = { path = "crates/command_palette_hooks" } component = { path = "crates/component" } @@ -285,6 +290,7 @@ debug_adapter_extension = { path = "crates/debug_adapter_extension" } debugger_tools = { path = "crates/debugger_tools" } debugger_ui = { path = "crates/debugger_ui" } deepseek = { path = "crates/deepseek" } +derive_refineable = { path = "crates/refineable/derive_refineable", package = "zed-derive-refineable", version = "0.1.0" } diagnostics = { path = "crates/diagnostics" } editor = { path = "crates/editor" } extension = { path = "crates/extension" } @@ -303,20 +309,21 @@ git_ui = { path = "crates/git_ui" } go_to_line = { path = "crates/go_to_line" } google_ai = { path = "crates/google_ai" } gpui = { path = "crates/gpui", default-features = false } -gpui_macros = { path = "crates/gpui_macros" } +gpui_macros = { path = "crates/gpui_macros", package = "gpui-macros", version = "0.1.0" } gpui_tokio = { path = "crates/gpui_tokio" } html_to_markdown = { path = "crates/html_to_markdown" } -http_client = { path = "crates/http_client" } +http_client = { path = "crates/http_client", package = "zed-http-client", version = "0.1.0" } http_client_tls = { path = "crates/http_client_tls" } icons = { path = "crates/icons" } image_viewer = { path = "crates/image_viewer" } edit_prediction = { path = "crates/edit_prediction" } edit_prediction_button = { path = "crates/edit_prediction_button" } +edit_prediction_context = { path = "crates/edit_prediction_context" } +zeta2_tools = { path = "crates/zeta2_tools" } inspector_ui = { path = "crates/inspector_ui" } install_cli = { path = "crates/install_cli" } -jj = { path = "crates/jj" } -jj_ui = { path = "crates/jj_ui" } journal = { path = "crates/journal" } +json_schema_store = { path = "crates/json_schema_store" } keymap_editor = { path = "crates/keymap_editor" } language = { path = "crates/language" } language_extension = { path = "crates/language_extension" } @@ -334,7 +341,7 @@ lsp = { path = "crates/lsp" } markdown = { path = "crates/markdown" } markdown_preview = { path = "crates/markdown_preview" } svg_preview = { path = "crates/svg_preview" } -media = { path = "crates/media" } +media = { path = "crates/media", package = "zed-media", version = "0.1.0" } menu = { path = "crates/menu" } migrator = { path = "crates/migrator" } mistral = { path = "crates/mistral" } @@ -351,6 +358,7 @@ outline = { path = "crates/outline" } outline_panel = { path = "crates/outline_panel" } panel = { path = "crates/panel" } paths = { path = "crates/paths" } +perf = { path = "tooling/perf", package = "zed-perf", version = "0.1.0" } picker = { path = "crates/picker" } plugin = { path = "crates/plugin" } plugin_macros = { path = "crates/plugin_macros" } @@ -362,7 +370,7 @@ project_symbols = { path = "crates/project_symbols" } prompt_store = { path = "crates/prompt_store" } proto = { path = "crates/proto" } recent_projects = { path = "crates/recent_projects" } -refineable = { path = "crates/refineable" } +refineable = { path = "crates/refineable", package = "zed-refineable", version = "0.1.0" } release_channel = { path = "crates/release_channel" } scheduler = { path = "crates/scheduler" } remote = { path = "crates/remote" } @@ -370,16 +378,16 @@ remote_server = { path = "crates/remote_server" } repl = { path = "crates/repl" } reqwest_client = { path = "crates/reqwest_client" } rich_text = { path = "crates/rich_text" } -rodio = { git = "https://github.com/RustAudio/rodio", branch = "better_wav_output"} +rodio = { git = "https://github.com/RustAudio/rodio" } rope = { path = "crates/rope" } rpc = { path = "crates/rpc" } rules_library = { path = "crates/rules_library" } search = { path = "crates/search" } -semantic_version = { path = "crates/semantic_version" } +semantic_version = { path = "crates/semantic_version", package = "zed-semantic-version", version = "0.1.0" } session = { path = "crates/session" } settings = { path = "crates/settings" } +settings_macros = { path = "crates/settings_macros" } settings_ui = { path = "crates/settings_ui" } -settings_ui_macros = { path = "crates/settings_ui_macros" } snippet = { path = "crates/snippet" } snippet_provider = { path = "crates/snippet_provider" } snippets_ui = { path = "crates/snippets_ui" } @@ -388,9 +396,10 @@ sqlez_macros = { path = "crates/sqlez_macros" } story = { path = "crates/story" } storybook = { path = "crates/storybook" } streaming_diff = { path = "crates/streaming_diff" } -sum_tree = { path = "crates/sum_tree" } +sum_tree = { path = "crates/sum_tree", package = "zed-sum-tree", version = "0.1.0" } supermaven = { path = "crates/supermaven" } supermaven_api = { path = "crates/supermaven_api" } +codestral = { path = "crates/codestral" } system_specs = { path = "crates/system_specs" } tab_switcher = { path = "crates/tab_switcher" } task = { path = "crates/task" } @@ -411,8 +420,8 @@ ui = { path = "crates/ui" } ui_input = { path = "crates/ui_input" } ui_macros = { path = "crates/ui_macros" } ui_prompt = { path = "crates/ui_prompt" } -util = { path = "crates/util" } -util_macros = { path = "crates/util_macros" } +util = { path = "crates/util", package = "zed-util", version = "0.1.0" } +util_macros = { path = "crates/util_macros", package = "zed-util-macros", version = "0.1.0" } vercel = { path = "crates/vercel" } vim = { path = "crates/vim" } vim_mode_setting = { path = "crates/vim_mode_setting" } @@ -427,6 +436,7 @@ zed = { path = "crates/zed" } zed_actions = { path = "crates/zed_actions" } zed_env_vars = { path = "crates/zed_env_vars" } zeta = { path = "crates/zeta" } +zeta2 = { path = "crates/zeta2" } zlog = { path = "crates/zlog" } zlog_settings = { path = "crates/zlog_settings" } @@ -434,9 +444,9 @@ zlog_settings = { path = "crates/zlog_settings" } # External crates # -agent-client-protocol = { version = "0.2.1", features = ["unstable"] } +agent-client-protocol = { version = "0.4.3", features = ["unstable"] } aho-corasick = "1.1" -alacritty_terminal = { git = "https://github.com/zed-industries/alacritty.git", branch = "add-hush-login-flag" } +alacritty_terminal = "0.25.1-rc1" any_vec = "0.14" anyhow = "1.0.86" arrayvec = { version = "0.7.4", features = ["serde"] } @@ -465,10 +475,9 @@ backtrace = "0.3" base64 = "0.22" bincode = "1.2.1" bitflags = "2.6.0" -blade-graphics = { git = "https://github.com/kvark/blade", rev = "bfa594ea697d4b6326ea29f747525c85ecf933b9" } -blade-macros = { git = "https://github.com/kvark/blade", rev = "bfa594ea697d4b6326ea29f747525c85ecf933b9" } -blade-util = { git = "https://github.com/kvark/blade", rev = "bfa594ea697d4b6326ea29f747525c85ecf933b9" } -blake3 = "1.5.3" +blade-graphics = { version = "0.7.0" } +blade-macros = { version = "0.3.0" } +blade-util = { version = "0.3.0" } bytes = "1.0" cargo_metadata = "0.19" cargo_toml = "0.21" @@ -505,6 +514,7 @@ futures-lite = "1.13" git2 = { version = "0.20.1", default-features = false } globset = "0.4" handlebars = "4.3" +hashbrown = "0.15.3" heck = "0.5" heed = { version = "0.21.0", features = ["read-txn-no-tls"] } hex = "0.4.3" @@ -520,7 +530,6 @@ indexmap = { version = "2.7.0", features = ["serde"] } indoc = "2" inventory = "0.3.19" itertools = "0.14.0" -jj-lib = { git = "https://github.com/jj-vcs/jj", rev = "e18eb8e05efaa153fad5ef46576af145bba1807f" } json_dotpath = "1.1" jsonschema = "0.30.0" jsonwebtoken = "9.3" @@ -541,6 +550,7 @@ nanoid = "0.4" nbformat = { git = "https://github.com/ConradIrwin/runtimed", rev = "7130c804216b6914355d15d0b91ea91f6babd734" } nix = "0.29" num-format = "0.4.4" +num-traits = "0.2" objc = "0.2" objc2-foundation = { version = "0.3", default-features = false, features = [ "NSArray", @@ -582,6 +592,7 @@ pet-fs = { git = "https://github.com/microsoft/python-environment-tools.git", re pet-pixi = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "845945b830297a50de0e24020b980a65e4820559" } pet-poetry = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "845945b830297a50de0e24020b980a65e4820559" } pet-reporter = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "845945b830297a50de0e24020b980a65e4820559" } +pet-virtualenv = { git = "https://github.com/microsoft/python-environment-tools.git", rev = "845945b830297a50de0e24020b980a65e4820559" } portable-pty = "0.9.0" postage = { version = "0.5", features = ["futures-traits"] } pretty_assertions = { version = "1.3.0", features = ["unstable"] } @@ -596,7 +607,8 @@ rand = "0.9" rayon = "1.8" ref-cast = "1.0.24" regex = "1.5" -reqwest = { git = "https://github.com/zed-industries/reqwest.git", rev = "951c770a32f1998d6e999cef3e59e0013e6c4415", default-features = false, features = [ +# WARNING: If you change this, you must also publish a new version of zed-reqwest to crates.io +reqwest = { git = "https://github.com/zed-industries/reqwest.git", rev = "c15662463bda39148ba154100dd44d3fba5873a4", default-features = false, features = [ "charset", "http2", "macos-system-configuration", @@ -604,22 +616,21 @@ reqwest = { git = "https://github.com/zed-industries/reqwest.git", rev = "951c77 "rustls-tls-native-roots", "socks", "stream", -] } +], package = "zed-reqwest", version = "0.12.15-zed" } rsa = "0.9.6" runtimelib = { git = "https://github.com/ConradIrwin/runtimed", rev = "7130c804216b6914355d15d0b91ea91f6babd734", default-features = false, features = [ "async-dispatcher-runtime", ] } rust-embed = { version = "8.4", features = ["include-exclude"] } -rustc-demangle = "0.1.23" rustc-hash = "2.1.0" rustls = { version = "0.23.26" } rustls-platform-verifier = "0.5.0" -scap = { git = "https://github.com/zed-industries/scap", rev = "808aa5c45b41e8f44729d02e38fd00a2fe2722e7", default-features = false } +# WARNING: If you change this, you must also publish a new version of zed-scap to crates.io +scap = { git = "https://github.com/zed-industries/scap", rev = "4afea48c3b002197176fb19cd0f9b180dd36eaac", default-features = false, package = "zed-scap", version = "0.0.8-zed" } schemars = { version = "1.0", features = ["indexmap2"] } semver = "1.0" -serde = { version = "1.0", features = ["derive", "rc"] } -serde_derive = { version = "1.0", features = ["deserialize_in_place"] } -serde_json = { version = "1.0", features = ["preserve_order", "raw_value"] } +serde = { version = "1.0.221", features = ["derive", "rc"] } +serde_json = { version = "1.0.144", features = ["preserve_order", "raw_value"] } serde_json_lenient = { version = "0.2", features = [ "preserve_order", "raw_value", @@ -627,10 +638,12 @@ serde_json_lenient = { version = "0.2", features = [ serde_path_to_error = "0.1.17" serde_repr = "0.1" serde_urlencoded = "0.7" +serde_with = "3.4.0" sha2 = "0.10" shellexpand = "2.1.0" shlex = "1.3.0" simplelog = "0.12.2" +slotmap = "1.0.6" smallvec = { version = "1.6", features = ["union"] } smol = "2.0" sqlformat = "0.2" @@ -639,7 +652,7 @@ streaming-iterator = "0.1" strsim = "0.11" strum = { version = "0.27.0", features = ["derive"] } subtle = "2.5.0" -syn = { version = "2.0.101", features = ["full", "extra-traits"] } +syn = { version = "2.0.101", features = ["full", "extra-traits", "visit-mut"] } sys-locale = "0.3.1" sysinfo = "0.31.0" take-until = "0.2.0" @@ -657,8 +670,9 @@ tiny_http = "0.8" tokio = { version = "1" } tokio-tungstenite = { version = "0.26", features = ["__rustls-tls"] } toml = "0.8" +toml_edit = { version = "0.22", default-features = false, features = ["display", "parse", "serde"] } tower-http = "0.4.4" -tree-sitter = { version = "0.25.6", features = ["wasm"] } +tree-sitter = { version = "0.25.10", features = ["wasm"] } tree-sitter-bash = "0.25.0" tree-sitter-c = "0.23" tree-sitter-cpp = { git = "https://github.com/tree-sitter/tree-sitter-cpp", rev = "5cb9b693cfd7bfacab1d9ff4acac1a4150700609" } @@ -675,11 +689,11 @@ tree-sitter-html = "0.23" tree-sitter-jsdoc = "0.23" tree-sitter-json = "0.24" tree-sitter-md = { git = "https://github.com/tree-sitter-grammars/tree-sitter-markdown", rev = "9a23c1a96c0513d8fc6520972beedd419a973539" } -tree-sitter-python = { git = "https://github.com/zed-industries/tree-sitter-python", rev = "218fcbf3fda3d029225f3dec005cb497d111b35e" } +tree-sitter-python = "0.25" tree-sitter-regex = "0.24" tree-sitter-ruby = "0.23" tree-sitter-rust = "0.24" -tree-sitter-typescript = "0.23" +tree-sitter-typescript = { git = "https://github.com/zed-industries/tree-sitter-typescript", rev = "e2c53597d6a5d9cf7bbe8dccde576fe1e46c5899" } # https://github.com/tree-sitter/tree-sitter-typescript/pull/347 tree-sitter-yaml = { git = "https://github.com/zed-industries/tree-sitter-yaml", rev = "baff0b51c64ef6a1fb1f8390f3ad6015b83ec13a" } unicase = "2.6" unicode-script = "0.5.7" @@ -706,6 +720,7 @@ windows-core = "0.61" wit-component = "0.221" workspace-hack = "0.1.0" yawc = "0.2.5" +zeroize = "1.8" zstd = "0.11" [workspace.dependencies.windows] @@ -732,6 +747,7 @@ features = [ "Win32_Networking_WinSock", "Win32_Security", "Win32_Security_Credentials", + "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Com_StructuredStorage", @@ -789,7 +805,7 @@ wasmtime = { opt-level = 3 } activity_indicator = { codegen-units = 1 } assets = { codegen-units = 1 } breadcrumbs = { codegen-units = 1 } -collections = { codegen-units = 1 } +zed-collections = { codegen-units = 1 } command_palette = { codegen-units = 1 } command_palette_hooks = { codegen-units = 1 } extension_cli = { codegen-units = 1 } @@ -800,6 +816,7 @@ image_viewer = { codegen-units = 1 } edit_prediction_button = { codegen-units = 1 } install_cli = { codegen-units = 1 } journal = { codegen-units = 1 } +json_schema_store = { codegen-units = 1 } lmstudio = { codegen-units = 1 } menu = { codegen-units = 1 } notifications = { codegen-units = 1 } @@ -808,11 +825,11 @@ outline = { codegen-units = 1 } paths = { codegen-units = 1 } prettier = { codegen-units = 1 } project_symbols = { codegen-units = 1 } -refineable = { codegen-units = 1 } +zed-refineable = { codegen-units = 1 } release_channel = { codegen-units = 1 } reqwest_client = { codegen-units = 1 } rich_text = { codegen-units = 1 } -semantic_version = { codegen-units = 1 } +zed-semantic-version = { codegen-units = 1 } session = { codegen-units = 1 } snippet = { codegen-units = 1 } snippets_ui = { codegen-units = 1 } @@ -851,6 +868,7 @@ todo = "deny" declare_interior_mutable_const = "deny" redundant_clone = "deny" +disallowed_methods = "deny" # We currently do not restrict any style rules # as it slows down shipping code to Zed. diff --git a/Dockerfile-collab b/Dockerfile-collab index c1621d6ee67e42117315ea49eac99f6f6260f4b7..a85fe93f198475534cb7396abe594f9d02eeb57b 100644 --- a/Dockerfile-collab +++ b/Dockerfile-collab @@ -1,6 +1,6 @@ # syntax = docker/dockerfile:1.2 -FROM rust:1.89-bookworm as builder +FROM rust:1.90-bookworm as builder WORKDIR app COPY . . diff --git a/GEMINI.md b/GEMINI.md new file mode 120000 index 0000000000000000000000000000000000000000..8a63b64bdb0afcda986ba715cb39849ac574e096 --- /dev/null +++ b/GEMINI.md @@ -0,0 +1 @@ +.rules \ No newline at end of file diff --git a/assets/icons/editor_cursor.svg b/assets/icons/editor_cursor.svg index 338697be8a621e80099c308b3dda0a4e11fcfd61..e20013917d3c8b9d28f4fab631ae2fbd99b9297f 100644 --- a/assets/icons/editor_cursor.svg +++ b/assets/icons/editor_cursor.svg @@ -1,9 +1,3 @@ - - - - - - - + diff --git a/assets/icons/linux.svg b/assets/icons/linux.svg new file mode 100644 index 0000000000000000000000000000000000000000..fc76742a3f236650cb8c514c8263ec2c3b2d4521 --- /dev/null +++ b/assets/icons/linux.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/icons/paperclip.svg b/assets/icons/paperclip.svg new file mode 100644 index 0000000000000000000000000000000000000000..7a864103c013823096b523f3e0f56db2d7e76009 --- /dev/null +++ b/assets/icons/paperclip.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/keymaps/default-linux.json b/assets/keymaps/default-linux.json index 6b4c4e0fac95cf751c21cfaa0770d1279a35adcc..ae15492b804274bc3ceacaae156a19093344a9b7 100644 --- a/assets/keymaps/default-linux.json +++ b/assets/keymaps/default-linux.json @@ -31,6 +31,7 @@ "ctrl--": ["zed::DecreaseBufferFontSize", { "persist": false }], "ctrl-0": ["zed::ResetBufferFontSize", { "persist": false }], "ctrl-,": "zed::OpenSettings", + "ctrl-alt-,": "zed::OpenSettingsFile", "ctrl-q": "zed::Quit", "f4": "debugger::Start", "shift-f5": "debugger::Stop", @@ -250,7 +251,7 @@ "alt-enter": "agent::ContinueWithBurnMode", "ctrl-y": "agent::AllowOnce", "ctrl-alt-y": "agent::AllowAlways", - "ctrl-d": "agent::RejectOnce" + "ctrl-alt-z": "agent::RejectOnce" } }, { @@ -369,7 +370,8 @@ "bindings": { "new": "rules_library::NewRule", "ctrl-n": "rules_library::NewRule", - "ctrl-shift-s": "rules_library::ToggleDefaultRule" + "ctrl-shift-s": "rules_library::ToggleDefaultRule", + "ctrl-w": "workspace::CloseWindow" } }, { @@ -462,8 +464,8 @@ "ctrl-k ctrl-w": "workspace::CloseAllItemsAndPanes", "back": "pane::GoBack", "ctrl-alt--": "pane::GoBack", - "ctrl-alt-_": "pane::GoForward", "forward": "pane::GoForward", + "ctrl-alt-_": "pane::GoForward", "ctrl-alt-g": "search::SelectNextMatch", "f3": "search::SelectNextMatch", "ctrl-alt-shift-g": "search::SelectPreviousMatch", @@ -525,15 +527,15 @@ "ctrl-k ctrl-l": "editor::ToggleFold", "ctrl-k ctrl-[": "editor::FoldRecursive", "ctrl-k ctrl-]": "editor::UnfoldRecursive", - "ctrl-k ctrl-1": ["editor::FoldAtLevel", 1], - "ctrl-k ctrl-2": ["editor::FoldAtLevel", 2], - "ctrl-k ctrl-3": ["editor::FoldAtLevel", 3], - "ctrl-k ctrl-4": ["editor::FoldAtLevel", 4], - "ctrl-k ctrl-5": ["editor::FoldAtLevel", 5], - "ctrl-k ctrl-6": ["editor::FoldAtLevel", 6], - "ctrl-k ctrl-7": ["editor::FoldAtLevel", 7], - "ctrl-k ctrl-8": ["editor::FoldAtLevel", 8], - "ctrl-k ctrl-9": ["editor::FoldAtLevel", 9], + "ctrl-k ctrl-1": "editor::FoldAtLevel_1", + "ctrl-k ctrl-2": "editor::FoldAtLevel_2", + "ctrl-k ctrl-3": "editor::FoldAtLevel_3", + "ctrl-k ctrl-4": "editor::FoldAtLevel_4", + "ctrl-k ctrl-5": "editor::FoldAtLevel_5", + "ctrl-k ctrl-6": "editor::FoldAtLevel_6", + "ctrl-k ctrl-7": "editor::FoldAtLevel_7", + "ctrl-k ctrl-8": "editor::FoldAtLevel_8", + "ctrl-k ctrl-9": "editor::FoldAtLevel_9", "ctrl-k ctrl-0": "editor::FoldAll", "ctrl-k ctrl-j": "editor::UnfoldAll", "ctrl-space": "editor::ShowCompletions", @@ -619,7 +621,7 @@ "ctrl-shift-f": "pane::DeploySearch", "ctrl-shift-h": ["pane::DeploySearch", { "replace_enabled": true }], "ctrl-shift-t": "pane::ReopenClosedItem", - "ctrl-k ctrl-s": "zed::OpenKeymapEditor", + "ctrl-k ctrl-s": "zed::OpenKeymap", "ctrl-k ctrl-t": "theme_selector::Toggle", "ctrl-alt-super-p": "settings_profile_selector::Toggle", "ctrl-t": "project_symbols::Toggle", @@ -1140,6 +1142,13 @@ "ctrl-enter": "menu::Confirm" } }, + { + "context": "ContextServerToolsModal", + "use_key_equivalents": true, + "bindings": { + "escape": "menu::Cancel" + } + }, { "context": "OnboardingAiConfigurationModal", "use_key_equivalents": true, @@ -1220,9 +1229,6 @@ "context": "Onboarding", "use_key_equivalents": true, "bindings": { - "ctrl-1": "onboarding::ActivateBasicsPage", - "ctrl-2": "onboarding::ActivateEditingPage", - "ctrl-3": "onboarding::ActivateAISetupPage", "ctrl-enter": "onboarding::Finish", "alt-shift-l": "onboarding::SignIn", "alt-shift-a": "onboarding::OpenAccount" @@ -1234,5 +1240,41 @@ "bindings": { "ctrl-shift-enter": "workspace::OpenWithSystem" } + }, + { + "context": "SettingsWindow", + "use_key_equivalents": true, + "bindings": { + "ctrl-w": "workspace::CloseWindow", + "escape": "workspace::CloseWindow", + "ctrl-m": "settings_editor::Minimize", + "ctrl-f": "search::FocusSearch", + "ctrl-shift-e": "settings_editor::ToggleFocusNav", + // todo(settings_ui): cut this down based on the max files and overflow UI + "ctrl-1": ["settings_editor::FocusFile", 0], + "ctrl-2": ["settings_editor::FocusFile", 1], + "ctrl-3": ["settings_editor::FocusFile", 2], + "ctrl-4": ["settings_editor::FocusFile", 3], + "ctrl-5": ["settings_editor::FocusFile", 4], + "ctrl-6": ["settings_editor::FocusFile", 5], + "ctrl-7": ["settings_editor::FocusFile", 6], + "ctrl-8": ["settings_editor::FocusFile", 7], + "ctrl-9": ["settings_editor::FocusFile", 8], + "ctrl-0": ["settings_editor::FocusFile", 9], + "ctrl-pageup": "settings_editor::FocusPreviousFile", + "ctrl-pagedown": "settings_editor::FocusNextFile" + } + }, + { + "context": "SettingsWindow > NavigationMenu", + "use_key_equivalents": true, + "bindings": { + "right": "settings_editor::ExpandNavEntry", + "left": "settings_editor::CollapseNavEntry", + "pageup": "settings_editor::FocusPreviousRootNavEntry", + "pagedown": "settings_editor::FocusNextRootNavEntry", + "home": "settings_editor::FocusFirstNavEntry", + "end": "settings_editor::FocusLastNavEntry" + } } ] diff --git a/assets/keymaps/default-macos.json b/assets/keymaps/default-macos.json index 0ef4757fc523c9ae145175da07a52ced322efa0c..50528dca6f97e8b287333d4011ebc97bb1ed27a2 100644 --- a/assets/keymaps/default-macos.json +++ b/assets/keymaps/default-macos.json @@ -40,6 +40,7 @@ "cmd--": ["zed::DecreaseBufferFontSize", { "persist": false }], "cmd-0": ["zed::ResetBufferFontSize", { "persist": false }], "cmd-,": "zed::OpenSettings", + "cmd-alt-,": "zed::OpenSettingsFile", "cmd-q": "zed::Quit", "cmd-h": "zed::Hide", "alt-cmd-h": "zed::HideOthers", @@ -289,7 +290,7 @@ "alt-enter": "agent::ContinueWithBurnMode", "cmd-y": "agent::AllowOnce", "cmd-alt-y": "agent::AllowAlways", - "cmd-d": "agent::RejectOnce" + "cmd-alt-z": "agent::RejectOnce" } }, { @@ -550,6 +551,8 @@ "cmd-ctrl-left": "editor::SelectSmallerSyntaxNode", // Shrink selection "cmd-ctrl-right": "editor::SelectLargerSyntaxNode", // Expand selection "cmd-ctrl-up": "editor::SelectPreviousSyntaxNode", // Move selection up + "ctrl-shift-right": "editor::SelectLargerSyntaxNode", // Expand selection (VSCode version) + "ctrl-shift-left": "editor::SelectSmallerSyntaxNode", // Shrink selection (VSCode version) "cmd-ctrl-down": "editor::SelectNextSyntaxNode", // Move selection down "cmd-d": ["editor::SelectNext", { "replace_newest": false }], // editor.action.addSelectionToNextFindMatch / find_under_expand "cmd-shift-l": "editor::SelectAllMatches", // Select all occurrences of current selection @@ -579,15 +582,15 @@ "cmd-k cmd-l": "editor::ToggleFold", "cmd-k cmd-[": "editor::FoldRecursive", "cmd-k cmd-]": "editor::UnfoldRecursive", - "cmd-k cmd-1": ["editor::FoldAtLevel", 1], - "cmd-k cmd-2": ["editor::FoldAtLevel", 2], - "cmd-k cmd-3": ["editor::FoldAtLevel", 3], - "cmd-k cmd-4": ["editor::FoldAtLevel", 4], - "cmd-k cmd-5": ["editor::FoldAtLevel", 5], - "cmd-k cmd-6": ["editor::FoldAtLevel", 6], - "cmd-k cmd-7": ["editor::FoldAtLevel", 7], - "cmd-k cmd-8": ["editor::FoldAtLevel", 8], - "cmd-k cmd-9": ["editor::FoldAtLevel", 9], + "cmd-k cmd-1": "editor::FoldAtLevel_1", + "cmd-k cmd-2": "editor::FoldAtLevel_2", + "cmd-k cmd-3": "editor::FoldAtLevel_3", + "cmd-k cmd-4": "editor::FoldAtLevel_4", + "cmd-k cmd-5": "editor::FoldAtLevel_5", + "cmd-k cmd-6": "editor::FoldAtLevel_6", + "cmd-k cmd-7": "editor::FoldAtLevel_7", + "cmd-k cmd-8": "editor::FoldAtLevel_8", + "cmd-k cmd-9": "editor::FoldAtLevel_9", "cmd-k cmd-0": "editor::FoldAll", "cmd-k cmd-j": "editor::UnfoldAll", // Using `ctrl-space` / `ctrl-shift-space` in Zed requires disabling the macOS global shortcut. @@ -687,7 +690,7 @@ "cmd-shift-f": "pane::DeploySearch", "cmd-shift-h": ["pane::DeploySearch", { "replace_enabled": true }], "cmd-shift-t": "pane::ReopenClosedItem", - "cmd-k cmd-s": "zed::OpenKeymapEditor", + "cmd-k cmd-s": "zed::OpenKeymap", "cmd-k cmd-t": "theme_selector::Toggle", "ctrl-alt-cmd-p": "settings_profile_selector::Toggle", "cmd-t": "project_symbols::Toggle", @@ -1244,6 +1247,13 @@ "cmd-enter": "menu::Confirm" } }, + { + "context": "ContextServerToolsModal", + "use_key_equivalents": true, + "bindings": { + "escape": "menu::Cancel" + } + }, { "context": "OnboardingAiConfigurationModal", "use_key_equivalents": true, @@ -1324,10 +1334,7 @@ "context": "Onboarding", "use_key_equivalents": true, "bindings": { - "cmd-1": "onboarding::ActivateBasicsPage", - "cmd-2": "onboarding::ActivateEditingPage", - "cmd-3": "onboarding::ActivateAISetupPage", - "cmd-escape": "onboarding::Finish", + "cmd-enter": "onboarding::Finish", "alt-tab": "onboarding::SignIn", "alt-shift-a": "onboarding::OpenAccount" } @@ -1338,5 +1345,41 @@ "bindings": { "ctrl-shift-enter": "workspace::OpenWithSystem" } + }, + { + "context": "SettingsWindow", + "use_key_equivalents": true, + "bindings": { + "cmd-w": "workspace::CloseWindow", + "escape": "workspace::CloseWindow", + "cmd-m": "settings_editor::Minimize", + "cmd-f": "search::FocusSearch", + "cmd-shift-e": "settings_editor::ToggleFocusNav", + // todo(settings_ui): cut this down based on the max files and overflow UI + "ctrl-1": ["settings_editor::FocusFile", 0], + "ctrl-2": ["settings_editor::FocusFile", 1], + "ctrl-3": ["settings_editor::FocusFile", 2], + "ctrl-4": ["settings_editor::FocusFile", 3], + "ctrl-5": ["settings_editor::FocusFile", 4], + "ctrl-6": ["settings_editor::FocusFile", 5], + "ctrl-7": ["settings_editor::FocusFile", 6], + "ctrl-8": ["settings_editor::FocusFile", 7], + "ctrl-9": ["settings_editor::FocusFile", 8], + "ctrl-0": ["settings_editor::FocusFile", 9], + "cmd-{": "settings_editor::FocusPreviousFile", + "cmd-}": "settings_editor::FocusNextFile" + } + }, + { + "context": "SettingsWindow > NavigationMenu", + "use_key_equivalents": true, + "bindings": { + "right": "settings_editor::ExpandNavEntry", + "left": "settings_editor::CollapseNavEntry", + "pageup": "settings_editor::FocusPreviousRootNavEntry", + "pagedown": "settings_editor::FocusNextRootNavEntry", + "home": "settings_editor::FocusFirstNavEntry", + "end": "settings_editor::FocusLastNavEntry" + } } ] diff --git a/assets/keymaps/default-windows.json b/assets/keymaps/default-windows.json index e5839964ad545f3994d675da817a5f4571b88db4..570766e92ce8adddb6913fcc20acd71bf7ed240b 100644 --- a/assets/keymaps/default-windows.json +++ b/assets/keymaps/default-windows.json @@ -17,7 +17,6 @@ "up": "menu::SelectPrevious", "enter": "menu::Confirm", "ctrl-enter": "menu::SecondaryConfirm", - "ctrl-escape": "menu::Cancel", "ctrl-c": "menu::Cancel", "escape": "menu::Cancel", "shift-alt-enter": "menu::Restart", @@ -31,6 +30,7 @@ "ctrl--": ["zed::DecreaseBufferFontSize", { "persist": false }], "ctrl-0": ["zed::ResetBufferFontSize", { "persist": false }], "ctrl-,": "zed::OpenSettings", + "ctrl-alt-,": "zed::OpenSettingsFile", "ctrl-q": "zed::Quit", "f4": "debugger::Start", "shift-f5": "debugger::Stop", @@ -134,7 +134,7 @@ "ctrl-k z": "editor::ToggleSoftWrap", "ctrl-f": "buffer_search::Deploy", "ctrl-h": "buffer_search::DeployReplace", - "ctrl-shift-.": "assistant::QuoteSelection", + "ctrl-shift-.": "agent::QuoteSelection", "ctrl-shift-,": "assistant::InsertIntoEditor", "shift-alt-e": "editor::SelectEnclosingSymbol", "ctrl-shift-backspace": "editor::GoToPreviousChange", @@ -244,7 +244,7 @@ "ctrl-shift-i": "agent::ToggleOptionsMenu", // "ctrl-shift-alt-n": "agent::ToggleNewThreadMenu", "shift-alt-escape": "agent::ExpandMessageEditor", - "ctrl-shift-.": "assistant::QuoteSelection", + "ctrl-shift-.": "agent::QuoteSelection", "shift-alt-e": "agent::RemoveAllContext", "ctrl-shift-e": "project_panel::ToggleFocus", "ctrl-shift-enter": "agent::ContinueThread", @@ -252,7 +252,7 @@ "alt-enter": "agent::ContinueWithBurnMode", "ctrl-y": "agent::AllowOnce", "ctrl-alt-y": "agent::AllowAlways", - "ctrl-d": "agent::RejectOnce" + "ctrl-alt-z": "agent::RejectOnce" } }, { @@ -346,7 +346,7 @@ } }, { - "context": "AcpThread > Editor", + "context": "AcpThread > Editor && !use_modifier_to_send", "use_key_equivalents": true, "bindings": { "enter": "agent::Chat", @@ -356,6 +356,17 @@ "shift-tab": "agent::CycleModeSelector" } }, + { + "context": "AcpThread > Editor && use_modifier_to_send", + "use_key_equivalents": true, + "bindings": { + "ctrl-enter": "agent::Chat", + "ctrl-shift-r": "agent::OpenAgentDiff", + "ctrl-shift-y": "agent::KeepAll", + "ctrl-shift-n": "agent::RejectAll", + "shift-tab": "agent::CycleModeSelector" + } + }, { "context": "ThreadHistory", "use_key_equivalents": true, @@ -368,7 +379,8 @@ "use_key_equivalents": true, "bindings": { "ctrl-n": "rules_library::NewRule", - "ctrl-shift-s": "rules_library::ToggleDefaultRule" + "ctrl-shift-s": "rules_library::ToggleDefaultRule", + "ctrl-w": "workspace::CloseWindow" } }, { @@ -465,8 +477,8 @@ "ctrl-k ctrl-w": "workspace::CloseAllItemsAndPanes", "back": "pane::GoBack", "alt--": "pane::GoBack", - "alt-=": "pane::GoForward", "forward": "pane::GoForward", + "alt-=": "pane::GoForward", "f3": "search::SelectNextMatch", "shift-f3": "search::SelectPreviousMatch", "ctrl-shift-f": "project_search::ToggleFocus", @@ -524,15 +536,15 @@ "ctrl-k ctrl-l": "editor::ToggleFold", "ctrl-k ctrl-[": "editor::FoldRecursive", "ctrl-k ctrl-]": "editor::UnfoldRecursive", - "ctrl-k ctrl-1": ["editor::FoldAtLevel", 1], - "ctrl-k ctrl-2": ["editor::FoldAtLevel", 2], - "ctrl-k ctrl-3": ["editor::FoldAtLevel", 3], - "ctrl-k ctrl-4": ["editor::FoldAtLevel", 4], - "ctrl-k ctrl-5": ["editor::FoldAtLevel", 5], - "ctrl-k ctrl-6": ["editor::FoldAtLevel", 6], - "ctrl-k ctrl-7": ["editor::FoldAtLevel", 7], - "ctrl-k ctrl-8": ["editor::FoldAtLevel", 8], - "ctrl-k ctrl-9": ["editor::FoldAtLevel", 9], + "ctrl-k ctrl-1": "editor::FoldAtLevel_1", + "ctrl-k ctrl-2": "editor::FoldAtLevel_2", + "ctrl-k ctrl-3": "editor::FoldAtLevel_3", + "ctrl-k ctrl-4": "editor::FoldAtLevel_4", + "ctrl-k ctrl-5": "editor::FoldAtLevel_5", + "ctrl-k ctrl-6": "editor::FoldAtLevel_6", + "ctrl-k ctrl-7": "editor::FoldAtLevel_7", + "ctrl-k ctrl-8": "editor::FoldAtLevel_8", + "ctrl-k ctrl-9": "editor::FoldAtLevel_9", "ctrl-k ctrl-0": "editor::FoldAll", "ctrl-k ctrl-j": "editor::UnfoldAll", "ctrl-space": "editor::ShowCompletions", @@ -608,12 +620,10 @@ "shift-alt--": ["workspace::DecreaseActiveDockSize", { "px": 0 }], "shift-alt-=": ["workspace::IncreaseActiveDockSize", { "px": 0 }], "shift-alt-0": "workspace::ResetOpenDocksSize", - "ctrl-shift-alt--": ["workspace::DecreaseOpenDocksSize", { "px": 0 }], - "ctrl-shift-alt-=": ["workspace::IncreaseOpenDocksSize", { "px": 0 }], "ctrl-shift-f": "pane::DeploySearch", "ctrl-shift-h": ["pane::DeploySearch", { "replace_enabled": true }], "ctrl-shift-t": "pane::ReopenClosedItem", - "ctrl-k ctrl-s": "zed::OpenKeymapEditor", + "ctrl-k ctrl-s": "zed::OpenKeymap", "ctrl-k ctrl-t": "theme_selector::Toggle", "ctrl-alt-super-p": "settings_profile_selector::Toggle", "ctrl-t": "project_symbols::Toggle", @@ -1113,6 +1123,7 @@ "alt-f": ["terminal::SendText", "\u001bf"], "alt-.": ["terminal::SendText", "\u001b."], "ctrl-delete": ["terminal::SendText", "\u001bd"], + "ctrl-n": "workspace::NewTerminal", // Overrides for conflicting keybindings "ctrl-b": ["terminal::SendKeystroke", "ctrl-b"], "ctrl-c": ["terminal::SendKeystroke", "ctrl-c"], @@ -1158,6 +1169,13 @@ "ctrl-enter": "menu::Confirm" } }, + { + "context": "ContextServerToolsModal", + "use_key_equivalents": true, + "bindings": { + "escape": "menu::Cancel" + } + }, { "context": "OnboardingAiConfigurationModal", "use_key_equivalents": true, @@ -1239,12 +1257,45 @@ "context": "Onboarding", "use_key_equivalents": true, "bindings": { - "ctrl-1": "onboarding::ActivateBasicsPage", - "ctrl-2": "onboarding::ActivateEditingPage", - "ctrl-3": "onboarding::ActivateAISetupPage", - "ctrl-escape": "onboarding::Finish", - "alt-tab": "onboarding::SignIn", + "ctrl-enter": "onboarding::Finish", + "alt-shift-l": "onboarding::SignIn", "shift-alt-a": "onboarding::OpenAccount" } + }, + { + "context": "SettingsWindow", + "use_key_equivalents": true, + "bindings": { + "ctrl-w": "workspace::CloseWindow", + "escape": "workspace::CloseWindow", + "ctrl-m": "settings_editor::Minimize", + "ctrl-f": "search::FocusSearch", + "ctrl-shift-e": "settings_editor::ToggleFocusNav", + // todo(settings_ui): cut this down based on the max files and overflow UI + "ctrl-1": ["settings_editor::FocusFile", 0], + "ctrl-2": ["settings_editor::FocusFile", 1], + "ctrl-3": ["settings_editor::FocusFile", 2], + "ctrl-4": ["settings_editor::FocusFile", 3], + "ctrl-5": ["settings_editor::FocusFile", 4], + "ctrl-6": ["settings_editor::FocusFile", 5], + "ctrl-7": ["settings_editor::FocusFile", 6], + "ctrl-8": ["settings_editor::FocusFile", 7], + "ctrl-9": ["settings_editor::FocusFile", 8], + "ctrl-0": ["settings_editor::FocusFile", 9], + "ctrl-pageup": "settings_editor::FocusPreviousFile", + "ctrl-pagedown": "settings_editor::FocusNextFile" + } + }, + { + "context": "SettingsWindow > NavigationMenu", + "use_key_equivalents": true, + "bindings": { + "right": "settings_editor::ExpandNavEntry", + "left": "settings_editor::CollapseNavEntry", + "pageup": "settings_editor::FocusPreviousRootNavEntry", + "pagedown": "settings_editor::FocusNextRootNavEntry", + "home": "settings_editor::FocusFirstNavEntry", + "end": "settings_editor::FocusLastNavEntry" + } } ] diff --git a/assets/keymaps/linux/jetbrains.json b/assets/keymaps/linux/jetbrains.json index 59a182a968a849edb3359927e7647f611bcd44da..a5e387c014e1315bf51cfdf7c5226adaa8a20b27 100644 --- a/assets/keymaps/linux/jetbrains.json +++ b/assets/keymaps/linux/jetbrains.json @@ -1,7 +1,7 @@ [ { "bindings": { - "ctrl-alt-s": "zed::OpenSettings", + "ctrl-alt-s": "zed::OpenSettingsFile", "ctrl-{": "pane::ActivatePreviousItem", "ctrl-}": "pane::ActivateNextItem", "shift-escape": null, // Unmap workspace::zoom diff --git a/assets/keymaps/macos/emacs.json b/assets/keymaps/macos/emacs.json index 0f936ba2f968abe0759e4bb294271a5e5f501848..78e2235965335ac2914355fc0c51abe38d390897 100755 --- a/assets/keymaps/macos/emacs.json +++ b/assets/keymaps/macos/emacs.json @@ -4,6 +4,7 @@ // from the command palette. [ { + "context": "!GitPanel", "bindings": { "ctrl-g": "menu::Cancel" } diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index ed79b00c16a7586f4a121c3fbd6e71f883dbb2d4..c90b439c6abb60f4e3d826c171d7e2491fce1d90 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -95,8 +95,8 @@ "g g": "vim::StartOfDocument", "g h": "editor::Hover", "g B": "editor::BlameHover", - "g t": "pane::ActivateNextItem", - "g shift-t": "pane::ActivatePreviousItem", + "g t": "vim::GoToTab", + "g shift-t": "vim::GoToPreviousTab", "g d": "editor::GoToDefinition", "g shift-d": "editor::GoToDeclaration", "g y": "editor::GoToTypeDefinition", @@ -240,6 +240,7 @@ "delete": "vim::DeleteRight", "g shift-j": "vim::JoinLinesNoWhitespace", "y": "vim::PushYank", + "shift-y": "vim::YankLine", "x": "vim::DeleteRight", "shift-x": "vim::DeleteLeft", "ctrl-a": "vim::Increment", @@ -328,7 +329,7 @@ { "context": "vim_mode == helix_select", "bindings": { - "escape": "vim::NormalBefore", + "v": "vim::NormalBefore", ";": "vim::HelixCollapseSelection", "~": "vim::ChangeCase", "ctrl-a": "vim::Increment", @@ -426,6 +427,7 @@ ";": "vim::HelixCollapseSelection", ":": "command_palette::Toggle", "m": "vim::PushHelixMatch", + "s": "vim::HelixSelectRegex", "]": ["vim::PushHelixNext", { "around": true }], "[": ["vim::PushHelixPrevious", { "around": true }], "left": "vim::WrappingLeft", @@ -433,6 +435,8 @@ "h": "vim::WrappingLeft", "l": "vim::WrappingRight", "y": "vim::HelixYank", + "p": "vim::HelixPaste", + "shift-p": ["vim::HelixPaste", { "before": true }], "alt-;": "vim::OtherEnd", "ctrl-r": "vim::Redo", "f": ["vim::PushFindForward", { "before": false, "multiline": true }], @@ -442,9 +446,8 @@ ">": "vim::Indent", "<": "vim::Outdent", "=": "vim::AutoIndent", - "g u": "vim::PushLowercase", - "g shift-u": "vim::PushUppercase", - "g ~": "vim::PushOppositeCase", + "`": "vim::ConvertToLowerCase", + "alt-`": "vim::ConvertToUpperCase", "g q": "vim::PushRewrap", "g w": "vim::PushRewrap", "insert": "vim::InsertBefore", @@ -577,18 +580,18 @@ // "q": "vim::AnyQuotes", "q": "vim::MiniQuotes", "|": "vim::VerticalBars", - "(": "vim::Parentheses", + "(": ["vim::Parentheses", { "opening": true }], ")": "vim::Parentheses", "b": "vim::Parentheses", // "b": "vim::AnyBrackets", // "b": "vim::MiniBrackets", - "[": "vim::SquareBrackets", + "[": ["vim::SquareBrackets", { "opening": true }], "]": "vim::SquareBrackets", "r": "vim::SquareBrackets", - "{": "vim::CurlyBrackets", + "{": ["vim::CurlyBrackets", { "opening": true }], "}": "vim::CurlyBrackets", "shift-b": "vim::CurlyBrackets", - "<": "vim::AngleBrackets", + "<": ["vim::AngleBrackets", { "opening": true }], ">": "vim::AngleBrackets", "a": "vim::Argument", "i": "vim::IndentObj", @@ -881,10 +884,12 @@ "/": "project_panel::NewSearchInDirectory", "d": "project_panel::NewDirectory", "enter": "project_panel::OpenPermanent", - "escape": "project_panel::ToggleFocus", + "escape": "vim::ToggleProjectPanelFocus", "h": "project_panel::CollapseSelectedEntry", - "j": "menu::SelectNext", - "k": "menu::SelectPrevious", + "j": "vim::MenuSelectNext", + "k": "vim::MenuSelectPrevious", + "down": "vim::MenuSelectNext", + "up": "vim::MenuSelectPrevious", "l": "project_panel::ExpandSelectedEntry", "shift-d": "project_panel::Delete", "shift-r": "project_panel::Rename", @@ -903,7 +908,22 @@ "{": "project_panel::SelectPrevDirectory", "shift-g": "menu::SelectLast", "g g": "menu::SelectFirst", - "-": "project_panel::SelectParent" + "-": "project_panel::SelectParent", + "ctrl-u": "project_panel::ScrollUp", + "ctrl-d": "project_panel::ScrollDown", + "z t": "project_panel::ScrollCursorTop", + "z z": "project_panel::ScrollCursorCenter", + "z b": "project_panel::ScrollCursorBottom", + "0": ["vim::Number", 0], + "1": ["vim::Number", 1], + "2": ["vim::Number", 2], + "3": ["vim::Number", 3], + "4": ["vim::Number", 4], + "5": ["vim::Number", 5], + "6": ["vim::Number", 6], + "7": ["vim::Number", 7], + "8": ["vim::Number", 8], + "9": ["vim::Number", 9] } }, { diff --git a/assets/prompts/content_prompt.hbs b/assets/prompts/content_prompt.hbs index e601e6dc63376af54e6e1a9bfa53cdbd57190e22..6db53ff48ff251b90f9120398852a9160ca41755 100644 --- a/assets/prompts/content_prompt.hbs +++ b/assets/prompts/content_prompt.hbs @@ -29,7 +29,9 @@ Generate {{content_type}} based on the following prompt: Match the indentation in the original file in the inserted {{content_type}}, don't include any indentation on blank lines. -Immediately start with the following format with no remarks: +Return ONLY the {{content_type}} to insert. Do NOT include any XML tags like , , or any surrounding markup from the input. + +Respond with a code block containing the {{content_type}} to insert. Replace \{{INSERTED_CODE}} with your actual {{content_type}}: ``` \{{INSERTED_CODE}} @@ -66,7 +68,9 @@ Only make changes that are necessary to fulfill the prompt, leave everything els Start at the indentation level in the original file in the rewritten {{content_type}}. Don't stop until you've rewritten the entire section, even if you have no more changes to make, always write out the whole section with no unnecessary elisions. -Immediately start with the following format with no remarks: +Return ONLY the rewritten {{content_type}}. Do NOT include any XML tags like , , or any surrounding markup from the input. + +Respond with a code block containing the rewritten {{content_type}}. Replace \{{REWRITTEN_CODE}} with your actual rewritten {{content_type}}: ``` \{{REWRITTEN_CODE}} diff --git a/assets/settings/default.json b/assets/settings/default.json index b83025116cc4e2d9358b4274e33f598ebe198b7c..0526f178837b515f6a3f6421525380edf1b3417a 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -1,5 +1,8 @@ { - "project_name": null, + "$schema": "zed://schemas/settings", + /// The displayed name of this project. If not set or empty, the root directory name + /// will be displayed. + "project_name": "", // The name of the Zed theme to use for the UI. // // `mode` is one of: @@ -72,8 +75,10 @@ "ui_font_weight": 400, // The default font size for text in the UI "ui_font_size": 16, - // The default font size for text in the agent panel. Falls back to the UI font size if unset. - "agent_font_size": null, + // The default font size for agent responses in the agent panel. Falls back to the UI font size if unset. + "agent_ui_font_size": null, + // The default font size for user messages in the agent panel. + "agent_buffer_font_size": 12, // How much to fade out unused code. "unnecessary_code_fade": 0.3, // Active pane styling settings. @@ -115,6 +120,7 @@ // Whether to enable vim modes and key bindings. "vim_mode": false, // Whether to enable helix mode and key bindings. + // Enabling this mode will automatically enable vim mode. "helix_mode": false, // Whether to show the informational hover box when moving the mouse // over symbols in the editor. @@ -311,7 +317,7 @@ // bracket, brace, single or double quote characters. // For example, when you select text and type (, Zed will surround the text with (). "use_auto_surround": true, - /// Whether indentation should be adjusted based on the context whilst typing. + // Whether indentation should be adjusted based on the context whilst typing. "auto_indent": true, // Whether indentation of pasted content should be adjusted based on the context. "auto_indent_on_paste": true, @@ -406,6 +412,39 @@ // Whether to show the menus in the titlebar. "show_menus": false }, + "audio": { + // Opt into the new audio system. + "experimental.rodio_audio": false, + // Requires 'rodio_audio: true' + // + // Automatically increase or decrease you microphone's volume. This affects how + // loud you sound to others. + // + // Recommended: off (default) + // Microphones are too quite in zed, until everyone is on experimental + // audio and has auto speaker volume on this will make you very loud + // compared to other speakers. + "experimental.auto_microphone_volume": false, + // Requires 'rodio_audio: true' + // + // Automatically increate or decrease the volume of other call members. + // This only affects how things sound for you. + "experimental.auto_speaker_volume": true, + // Requires 'rodio_audio: true' + // + // Remove background noises. Works great for typing, cars, dogs, AC. Does + // not work well on music. + "experimental.denoise": true, + // Requires 'rodio_audio: true' + // + // Use audio parameters compatible with the previous versions of + // experimental audio and non-experimental audio. When this is false you + // will sound strange to anyone not on the latest experimental audio. In + // the future we will migrate by setting this to false + // + // You need to rejoin a call for this setting to apply + "experimental.legacy_audio_compatible": true + }, // Scrollbar related settings "scrollbar": { // When to show the scrollbar in the editor. @@ -586,6 +625,7 @@ // Toggle certain types of hints on and off, all switched on by default. "show_type_hints": true, "show_parameter_hints": true, + "show_value_hints": true, // Corresponds to null/None LSP hint type value. "show_other_hints": true, // Whether to show a background for inlay hints. @@ -682,7 +722,9 @@ // Whether to enable drag-and-drop operations in the project panel. "drag_and_drop": true, // Whether to hide the root entry when only one folder is open in the window. - "hide_root": false + "hide_root": false, + // Whether to hide the hidden entries in the project panel. + "hide_hidden": false }, "outline_panel": { // Whether to show the outline panel button in the status bar @@ -794,7 +836,7 @@ "agent": { // Whether the agent is enabled. "enabled": true, - /// What completion mode to start new threads in, if available. Can be 'normal' or 'burn'. + // What completion mode to start new threads in, if available. Can be 'normal' or 'burn'. "preferred_completion_mode": "normal", // Whether to show the agent panel button in the status bar. "button": true, @@ -804,6 +846,8 @@ "default_width": 640, // Default height when the agent panel is docked to the bottom. "default_height": 320, + // The view to use by default (thread, or text_thread) + "default_view": "thread", // The default model to use when creating new threads. "default_model": { // The provider to use. @@ -905,22 +949,22 @@ // Default: false "play_sound_when_agent_done": false, - /// Whether to have edit cards in the agent panel expanded, showing a preview of the full diff. - /// - /// Default: true + // Whether to have edit cards in the agent panel expanded, showing a preview of the full diff. + // + // Default: true "expand_edit_card": true, - /// Whether to have terminal cards in the agent panel expanded, showing the whole command output. - /// - /// Default: true - "expand_terminal_card": true - }, - // The settings for slash commands. - "slash_commands": { - // Settings for the `/project` slash command. - "project": { - // Whether `/project` is enabled. - "enabled": false - } + // Whether to have terminal cards in the agent panel expanded, showing the whole command output. + // + // Default: true + "expand_terminal_card": true, + // Whether to always use cmd-enter (or ctrl-enter on Linux or Windows) to send messages in the agent panel. + // + // Default: false + "use_modifier_to_send": false, + // Minimum number of lines to display in the agent message editor. + // + // Default: 4 + "message_editor_min_lines": 4 }, // Whether the screen sharing icon is shown in the os status bar. "show_call_status_icon": true, @@ -933,6 +977,7 @@ // // This is typically customized on a per-language basis. "language_servers": ["..."], + // When to automatically save edited buffers. This setting can // take four values. // @@ -1059,7 +1104,7 @@ // Removes any lines containing only whitespace at the end of the file and // ensures just one newline at the end. "ensure_final_newline_on_save": true, - // Whether or not to perform a buffer format before saving: [on, off, prettier, language_server] + // Whether or not to perform a buffer format before saving: [on, off] // Keep in mind, if the autosave with delay is enabled, format_on_save will be ignored "format_on_save": "on", // How to perform a buffer format. This setting can take 4 values: @@ -1189,6 +1234,10 @@ // 2. Hide the gutter // "git_gutter": "hide" "git_gutter": "tracked_files", + /// Sets the debounce threshold (in milliseconds) after which changes are reflected in the git gutter. + /// + /// Default: 0 + "gutter_debounce": 0, // Control whether the git blame information is shown inline, // in the currently focused line. "inline_blame": { @@ -1204,6 +1253,9 @@ // The minimum column number to show the inline blame information at "min_column": 0 }, + "blame": { + "show_avatar": true + }, // Control which information is shown in the branch picker. "branch_picker": { "show_author_name": true @@ -1262,6 +1314,15 @@ // "proxy": "", // "proxy_no_verify": false // }, + "copilot": { + "enterprise_uri": null, + "proxy": null, + "proxy_no_verify": null + }, + "codestral": { + "model": null, + "max_tokens": null + }, // Whether edit predictions are enabled when editing text threads. // This setting has no effect if globally disabled. "enabled_in_text_threads": true @@ -1278,6 +1339,8 @@ }, // Status bar-related settings. "status_bar": { + // Whether to show the status bar. + "experimental.show": true, // Whether to show the active language button in the status bar. "active_language_button": true, // Whether to show the cursor position button in the status bar. @@ -1344,8 +1407,8 @@ // 4. A box drawn around the following character // "hollow" // - // Default: not set, defaults to "block" - "cursor_shape": null, + // Default: "block" + "cursor_shape": "block", // Set whether Alternate Scroll mode (code: ?1007) is active by default. // Alternate Scroll mode converts mouse scroll events into up / down key // presses when in the alternate screen (e.g. when running applications @@ -1367,8 +1430,8 @@ // Whether or not selecting text in the terminal will automatically // copy to the system clipboard. "copy_on_select": false, - // Whether to keep the text selection after copying it to the clipboard - "keep_selection_on_copy": false, + // Whether to keep the text selection after copying it to the clipboard. + "keep_selection_on_copy": true, // Whether to show the terminal button in the status bar "button": true, // Any key-value pairs added to this list will be added to the terminal's @@ -1387,7 +1450,7 @@ // "line_height": { // "custom": 2 // }, - "line_height": "comfortable", + "line_height": "standard", // Activate the python virtual environment, if one is found, in the // terminal's working directory (as resolved by the working_directory // setting). Set this to "off" to disable this behavior. @@ -1407,7 +1470,7 @@ // // The shell running in the terminal needs to be configured to emit the title. // Example: `echo -e "\e]2;New Title\007";` - "breadcrumbs": true + "breadcrumbs": false }, // Scrollbar-related settings "scrollbar": { @@ -1458,7 +1521,6 @@ // A value of 45 preserves colorful themes while ensuring legibility. "minimum_contrast": 45 }, - "code_actions_on_format": {}, // Settings related to running tasks. "tasks": { "variables": {}, @@ -1487,7 +1549,7 @@ // } // "file_types": { - "JSONC": ["**/.zed/**/*.json", "**/zed/**/*.json", "**/Zed/**/*.json", "**/.vscode/**/*.json"], + "JSONC": ["**/.zed/**/*.json", "**/zed/**/*.json", "**/Zed/**/*.json", "**/.vscode/**/*.json", "tsconfig*.json"], "Shell Script": [".env.*"] }, // Settings for which version of Node.js and NPM to use when installing @@ -1513,6 +1575,14 @@ "auto_install_extensions": { "html": true }, + // The capabilities granted to extensions. + // + // This list can be customized to restrict what extensions are able to do. + "granted_extension_capabilities": [ + { "kind": "process:exec", "command": "*", "args": ["**"] }, + { "kind": "download_file", "host": "*", "path": ["**"] }, + { "kind": "npm:install", "package": "*" } + ], // Controls how completions are processed for this language. "completions": { // Controls how words are completed. @@ -1620,9 +1690,7 @@ "preferred_line_length": 72 }, "Go": { - "code_actions_on_format": { - "source.organizeImports": true - }, + "formatter": [{ "code_action": "source.organizeImports" }, { "language_server": {} }], "debuggers": ["Delve"] }, "GraphQL": { @@ -1767,6 +1835,7 @@ "anthropic": { "api_url": "https://api.anthropic.com" }, + "bedrock": {}, "google": { "api_url": "https://generativelanguage.googleapis.com" }, @@ -1788,27 +1857,41 @@ }, "mistral": { "api_url": "https://api.mistral.ai/v1" - } + }, + "vercel": { + "api_url": "https://api.v0.dev/v1" + }, + "x_ai": { + "api_url": "https://api.x.ai/v1" + }, + "zed.dev": {} + }, + "session": { + // Whether or not to restore unsaved buffers on restart. + // + // If this is true, user won't be prompted whether to save/discard + // dirty files when closing the application. + // + // Default: true + "restore_unsaved_buffers": true }, // Zed's Prettier integration settings. // Allows to enable/disable formatting with Prettier // and configure default Prettier, used when no project-level Prettier installation is found. "prettier": { - // // Whether to consider prettier formatter or not when attempting to format a file. - // "allowed": false, - // - // // Use regular Prettier json configuration. - // // If Prettier is allowed, Zed will use this for its Prettier instance for any applicable file, if - // // the project has no other Prettier installed. - // "plugins": [], - // - // // Use regular Prettier json configuration. - // // If Prettier is allowed, Zed will use this for its Prettier instance for any applicable file, if - // // the project has no other Prettier installed. + // Enables or disables formatting with Prettier for any given language. + "allowed": false, + // Forces Prettier integration to use a specific parser name when formatting files with the language. + "plugins": [], + // Default Prettier options, in the format as in package.json section for Prettier. + // If project installs Prettier via its package.json, these options will be ignored. // "trailingComma": "es5", // "tabWidth": 4, // "semi": false, // "singleQuote": true + // Forces Prettier integration to use a specific parser name when formatting files with the language + // when set to a non-empty string. + "parser": "" }, // Settings for auto-closing of JSX tags. "jsx_tag_auto_close": { @@ -1828,6 +1911,10 @@ // } // } }, + // DAP Specific settings. + "dap": { + // Specify the DAP name as a key here. + }, // Common language server settings. "global_lsp_settings": { // Whether to show the LSP servers button in the status bar. @@ -1835,13 +1922,23 @@ }, // Jupyter settings "jupyter": { - "enabled": true + "enabled": true, + "kernel_selections": {} // Specify the language name as the key and the kernel name as the value. // "kernel_selections": { // "python": "conda-base" // "typescript": "deno" // } }, + // REPL settings. + "repl": { + // Maximum number of columns to keep in REPL's scrollback buffer. + // Clamped with [20, 512] range. + "max_columns": 128, + // Maximum number of lines to keep in REPL's scrollback buffer. + // Clamped with [4, 256] range. + "max_lines": 32 + }, // Vim settings "vim": { "default_mode": "normal", @@ -1944,7 +2041,7 @@ // Examples: // "profiles": { // "Presenting": { - // "agent_font_size": 20.0, + // "agent_ui_font_size": 20.0, // "buffer_font_size": 20.0, // "theme": "One Light", // "ui_font_size": 20.0 @@ -1957,5 +2054,11 @@ // } // } // } - "profiles": [] + "profiles": {}, + + // A map of log scopes to the desired log level. + // Useful for filtering out noisy logs or enabling more verbose logging. + // + // Example: {"log": {"client": "warn"}} + "log": {} } diff --git a/assets/settings/initial_tasks.json b/assets/settings/initial_tasks.json index 5cead67b6d5bb89e878e3bfb8d250dcbbd2ce447..a79e98063237ca297a89b0d151bd48149061b7bb 100644 --- a/assets/settings/initial_tasks.json +++ b/assets/settings/initial_tasks.json @@ -43,7 +43,11 @@ // "args": ["--login"] // } // } - "shell": "system" + "shell": "system", + // Whether to show the task line in the output of the spawned task, defaults to `true`. + "show_summary": true, + // Whether to show the command line in the output of the spawned task, defaults to `true`. + "show_command": true // Represents the tags for inline runnable indicators, or spawning multiple tasks at once. // "tags": [] } diff --git a/assets/sounds/guest_joined_call.wav b/assets/sounds/guest_joined_call.wav new file mode 100644 index 0000000000000000000000000000000000000000..336a6ca754b09c408f63c411193157a20c14bb78 Binary files /dev/null and b/assets/sounds/guest_joined_call.wav differ diff --git a/assets/themes/ayu/ayu.json b/assets/themes/ayu/ayu.json index f71048caafba7156b53fd8637ca35c715ad300f2..7c84c603bda7fd7590067ec9f566f3582ba6aefd 100644 --- a/assets/themes/ayu/ayu.json +++ b/assets/themes/ayu/ayu.json @@ -192,7 +192,7 @@ "font_weight": null }, "comment": { - "color": "#abb5be8c", + "color": "#5c6773ff", "font_style": null, "font_weight": null }, @@ -239,7 +239,7 @@ "hint": { "color": "#628b80ff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#ff8f3fff", @@ -583,7 +583,7 @@ "font_weight": null }, "comment": { - "color": "#787b8099", + "color": "#abb0b6ff", "font_style": null, "font_weight": null }, @@ -630,7 +630,7 @@ "hint": { "color": "#8ca7c2ff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#fa8d3eff", @@ -974,7 +974,7 @@ "font_weight": null }, "comment": { - "color": "#b8cfe680", + "color": "#5c6773ff", "font_style": null, "font_weight": null }, @@ -1021,7 +1021,7 @@ "hint": { "color": "#7399a3ff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#ffad65ff", diff --git a/assets/themes/gruvbox/gruvbox.json b/assets/themes/gruvbox/gruvbox.json index fc11cac55f638349778c88869dcb217c89111022..4e6f8334b269e3e5090b0f91d995834906c09083 100644 --- a/assets/themes/gruvbox/gruvbox.json +++ b/assets/themes/gruvbox/gruvbox.json @@ -248,7 +248,7 @@ "hint": { "color": "#8c957dff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#fb4833ff", @@ -653,7 +653,7 @@ "hint": { "color": "#8c957dff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#fb4833ff", @@ -1058,7 +1058,7 @@ "hint": { "color": "#8c957dff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#fb4833ff", @@ -1463,7 +1463,7 @@ "hint": { "color": "#677562ff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#9d0006ff", @@ -1868,7 +1868,7 @@ "hint": { "color": "#677562ff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#9d0006ff", @@ -2273,7 +2273,7 @@ "hint": { "color": "#677562ff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#9d0006ff", diff --git a/assets/themes/one/one.json b/assets/themes/one/one.json index 7cc8c96a23f32aab69596722188e3c5ec87aba08..6849cd05dc70752216789ae04e81fad232f7b14b 100644 --- a/assets/themes/one/one.json +++ b/assets/themes/one/one.json @@ -244,7 +244,7 @@ "hint": { "color": "#788ca6ff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#b477cfff", @@ -643,7 +643,7 @@ "hint": { "color": "#7274a7ff", "font_style": null, - "font_weight": 700 + "font_weight": null }, "keyword": { "color": "#a449abff", diff --git a/clippy.toml b/clippy.toml index e606ad4c79b5cfe289b1f8460b1f46715103fe1b..57f6f59385a4885730015c3d09f040a5f340d379 100644 --- a/clippy.toml +++ b/clippy.toml @@ -5,3 +5,14 @@ ignore-interior-mutability = [ # and Hash impls do not use fields with interior mutability. "agent::context::AgentContextKey" ] +disallowed-methods = [ + { path = "std::process::Command::spawn", reason = "Spawning `std::process::Command` can block the current thread for an unknown duration", replacement = "smol::process::Command::spawn" }, + { path = "std::process::Command::output", reason = "Spawning `std::process::Command` can block the current thread for an unknown duration", replacement = "smol::process::Command::output" }, + { path = "std::process::Command::status", reason = "Spawning `std::process::Command` can block the current thread for an unknown duration", replacement = "smol::process::Command::status" }, +] +disallowed-types = [ + # { path = "std::collections::HashMap", replacement = "collections::HashMap" }, + # { path = "std::collections::HashSet", replacement = "collections::HashSet" }, + # { path = "indexmap::IndexSet", replacement = "collections::IndexSet" }, + # { path = "indexmap::IndexMap", replacement = "collections::IndexMap" }, +] diff --git a/compose.yml b/compose.yml index d0d9bac425356687bfb33efab9ee24e76d1b30a0..00a5780b597738260f90020f139627e7d0b0107c 100644 --- a/compose.yml +++ b/compose.yml @@ -1,6 +1,6 @@ services: postgres: - image: postgres:15 + image: docker.io/library/postgres:15 container_name: zed_postgres ports: - 5432:5432 @@ -23,7 +23,7 @@ services: - ./.blob_store:/data livekit_server: - image: livekit/livekit-server + image: docker.io/livekit/livekit-server container_name: livekit_server entrypoint: /livekit-server --config /livekit.yaml ports: @@ -34,7 +34,7 @@ services: - ./livekit.yaml:/livekit.yaml postgrest_app: - image: postgrest/postgrest + image: docker.io/postgrest/postgrest container_name: postgrest_app ports: - 8081:8081 @@ -47,7 +47,7 @@ services: - postgres postgrest_llm: - image: postgrest/postgrest + image: docker.io/postgrest/postgrest container_name: postgrest_llm ports: - 8082:8082 @@ -60,7 +60,7 @@ services: - postgres stripe-mock: - image: stripe/stripe-mock:v0.178.0 + image: docker.io/stripe/stripe-mock:v0.178.0 ports: - 12111:12111 - 12112:12112 diff --git a/crates/acp_thread/Cargo.toml b/crates/acp_thread/Cargo.toml index a0bbda848f9ec761aebdf66b644a8b2926685122..ac24a6ed0f41c75d5c4dcd9b9b4122336022ddf3 100644 --- a/crates/acp_thread/Cargo.toml +++ b/crates/acp_thread/Cargo.toml @@ -45,7 +45,6 @@ url.workspace = true util.workspace = true uuid.workspace = true watch.workspace = true -which.workspace = true workspace-hack.workspace = true [dev-dependencies] diff --git a/crates/acp_thread/src/acp_thread.rs b/crates/acp_thread/src/acp_thread.rs index afbb4781f61d5ccf1ea753df1fd0379e533e8e46..61486a475c4601a9d9201d3a6920c63566a1ba36 100644 --- a/crates/acp_thread/src/acp_thread.rs +++ b/crates/acp_thread/src/acp_thread.rs @@ -3,16 +3,17 @@ mod diff; mod mention; mod terminal; +use ::terminal::terminal_settings::TerminalSettings; use agent_settings::AgentSettings; use collections::HashSet; pub use connection::*; pub use diff::*; -use futures::future::Shared; use language::language_settings::FormatOnSave; pub use mention::*; use project::lsp_store::{FormatTrigger, LspFormatTarget}; use serde::{Deserialize, Serialize}; -use settings::Settings as _; +use settings::{Settings as _, SettingsLocation}; +use task::{Shell, ShellBuilder}; pub use terminal::*; use action_log::ActionLog; @@ -34,7 +35,7 @@ use std::rc::Rc; use std::time::{Duration, Instant}; use std::{fmt::Display, mem, path::PathBuf, sync::Arc}; use ui::App; -use util::{ResultExt, get_system_shell}; +use util::{ResultExt, get_default_system_shell_preferring_bash}; use uuid::Uuid; #[derive(Debug)] @@ -573,7 +574,7 @@ impl ToolCallContent { ))), acp::ToolCallContent::Diff { diff } => Ok(Self::Diff(cx.new(|cx| { Diff::finalized( - diff.path, + diff.path.to_string_lossy().into_owned(), diff.old_text, diff.new_text, language_registry, @@ -786,8 +787,9 @@ pub struct AcpThread { token_usage: Option, prompt_capabilities: acp::PromptCapabilities, _observe_prompt_capabilities: Task>, - determine_shell: Shared>, terminals: HashMap>, + pending_terminal_output: HashMap>>, + pending_terminal_exit: HashMap, } #[derive(Debug)] @@ -810,6 +812,126 @@ pub enum AcpThreadEvent { impl EventEmitter for AcpThread {} +#[derive(Debug, Clone)] +pub enum TerminalProviderEvent { + Created { + terminal_id: acp::TerminalId, + label: String, + cwd: Option, + output_byte_limit: Option, + terminal: Entity<::terminal::Terminal>, + }, + Output { + terminal_id: acp::TerminalId, + data: Vec, + }, + TitleChanged { + terminal_id: acp::TerminalId, + title: String, + }, + Exit { + terminal_id: acp::TerminalId, + status: acp::TerminalExitStatus, + }, +} + +#[derive(Debug, Clone)] +pub enum TerminalProviderCommand { + WriteInput { + terminal_id: acp::TerminalId, + bytes: Vec, + }, + Resize { + terminal_id: acp::TerminalId, + cols: u16, + rows: u16, + }, + Close { + terminal_id: acp::TerminalId, + }, +} + +impl AcpThread { + pub fn on_terminal_provider_event( + &mut self, + event: TerminalProviderEvent, + cx: &mut Context, + ) { + match event { + TerminalProviderEvent::Created { + terminal_id, + label, + cwd, + output_byte_limit, + terminal, + } => { + let entity = self.register_terminal_created( + terminal_id.clone(), + label, + cwd, + output_byte_limit, + terminal, + cx, + ); + + if let Some(mut chunks) = self.pending_terminal_output.remove(&terminal_id) { + for data in chunks.drain(..) { + entity.update(cx, |term, cx| { + term.inner().update(cx, |inner, cx| { + inner.write_output(&data, cx); + }) + }); + } + } + + if let Some(_status) = self.pending_terminal_exit.remove(&terminal_id) { + entity.update(cx, |_term, cx| { + cx.notify(); + }); + } + + cx.notify(); + } + TerminalProviderEvent::Output { terminal_id, data } => { + if let Some(entity) = self.terminals.get(&terminal_id) { + entity.update(cx, |term, cx| { + term.inner().update(cx, |inner, cx| { + inner.write_output(&data, cx); + }) + }); + } else { + self.pending_terminal_output + .entry(terminal_id) + .or_default() + .push(data); + } + } + TerminalProviderEvent::TitleChanged { terminal_id, title } => { + if let Some(entity) = self.terminals.get(&terminal_id) { + entity.update(cx, |term, cx| { + term.inner().update(cx, |inner, cx| { + inner.breadcrumb_text = title; + cx.emit(::terminal::Event::BreadcrumbsChanged); + }) + }); + } + } + TerminalProviderEvent::Exit { + terminal_id, + status, + } => { + if let Some(entity) = self.terminals.get(&terminal_id) { + entity.update(cx, |_term, cx| { + cx.notify(); + }); + } else { + self.pending_terminal_exit.insert(terminal_id, status); + } + } + } + } +} + #[derive(PartialEq, Eq, Debug)] pub enum ThreadStatus { Idle, @@ -873,20 +995,6 @@ impl AcpThread { } }); - let determine_shell = cx - .background_spawn(async move { - if cfg!(windows) { - return get_system_shell(); - } - - if which::which("bash").is_ok() { - "bash".into() - } else { - get_system_shell() - } - }) - .shared(); - Self { action_log, shared_buffers: Default::default(), @@ -901,7 +1009,8 @@ impl AcpThread { prompt_capabilities, _observe_prompt_capabilities: task, terminals: HashMap::default(), - determine_shell, + pending_terminal_output: HashMap::default(), + pending_terminal_exit: HashMap::default(), } } @@ -1127,9 +1236,33 @@ impl AcpThread { let update = update.into(); let languages = self.project.read(cx).languages().clone(); - let ix = self - .index_for_tool_call(update.id()) - .context("Tool call not found")?; + let ix = match self.index_for_tool_call(update.id()) { + Some(ix) => ix, + None => { + // Tool call not found - create a failed tool call entry + let failed_tool_call = ToolCall { + id: update.id().clone(), + label: cx.new(|cx| Markdown::new("Tool call not found".into(), None, None, cx)), + kind: acp::ToolKind::Fetch, + content: vec![ToolCallContent::ContentBlock(ContentBlock::new( + acp::ContentBlock::Text(acp::TextContent { + text: "Tool call not found".to_string(), + annotations: None, + meta: None, + }), + &languages, + cx, + ))], + status: ToolCallStatus::Failed, + locations: Vec::new(), + resolved_locations: Vec::new(), + raw_input: None, + raw_output: None, + }; + self.push_entry(AgentThreadEntry::ToolCall(failed_tool_call), cx); + return Ok(()); + } + }; let AgentThreadEntry::ToolCall(call) = &mut self.entries[ix] else { unreachable!() }; @@ -1772,17 +1905,26 @@ impl AcpThread { limit: Option, reuse_shared_snapshot: bool, cx: &mut Context, - ) -> Task> { + ) -> Task> { + // Args are 1-based, move to 0-based + let line = line.unwrap_or_default().saturating_sub(1); + let limit = limit.unwrap_or(u32::MAX); let project = self.project.clone(); let action_log = self.action_log.clone(); cx.spawn(async move |this, cx| { - let load = project.update(cx, |project, cx| { - let path = project - .project_path_for_absolute_path(&path, cx) - .context("invalid path")?; - anyhow::Ok(project.open_buffer(path, cx)) - }); - let buffer = load??.await?; + let load = project + .update(cx, |project, cx| { + let path = project + .project_path_for_absolute_path(&path, cx) + .ok_or_else(|| { + acp::Error::resource_not_found(Some(path.display().to_string())) + })?; + Ok(project.open_buffer(path, cx)) + }) + .map_err(|e| acp::Error::internal_error().with_data(e.to_string())) + .flatten()?; + + let buffer = load.await?; let snapshot = if reuse_shared_snapshot { this.read_with(cx, |this, _| { @@ -1800,44 +1942,39 @@ impl AcpThread { action_log.update(cx, |action_log, cx| { action_log.buffer_read(buffer.clone(), cx); })?; - project.update(cx, |project, cx| { - let position = buffer - .read(cx) - .snapshot() - .anchor_before(Point::new(line.unwrap_or_default(), 0)); - project.set_agent_location( - Some(AgentLocation { - buffer: buffer.downgrade(), - position, - }), - cx, - ); - })?; - buffer.update(cx, |buffer, _| buffer.snapshot())? + let snapshot = buffer.update(cx, |buffer, _| buffer.snapshot())?; + this.update(cx, |this, _| { + this.shared_buffers.insert(buffer.clone(), snapshot.clone()); + })?; + snapshot }; - this.update(cx, |this, _| { - let text = snapshot.text(); - this.shared_buffers.insert(buffer.clone(), snapshot); - if line.is_none() && limit.is_none() { - return Ok(text); - } - let limit = limit.unwrap_or(u32::MAX) as usize; - let Some(line) = line else { - return Ok(text.lines().take(limit).collect::()); - }; + let max_point = snapshot.max_point(); + let start_position = Point::new(line, 0); - let count = text.lines().count(); - if count < line as usize { - anyhow::bail!("There are only {} lines", count); - } - Ok(text - .lines() - .skip(line as usize + 1) - .take(limit) - .collect::()) - })? + if start_position > max_point { + return Err(acp::Error::invalid_params().with_data(format!( + "Attempting to read beyond the end of the file, line {}:{}", + max_point.row + 1, + max_point.column + ))); + } + + let start = snapshot.anchor_before(start_position); + let end = snapshot.anchor_before(Point::new(line.saturating_add(limit), 0)); + + project.update(cx, |project, cx| { + project.set_agent_location( + Some(AgentLocation { + buffer: buffer.downgrade(), + position: start, + }), + cx, + ); + })?; + + Ok(snapshot.text_for_range(start..end).collect::()) }) } @@ -1940,40 +2077,33 @@ impl AcpThread { pub fn create_terminal( &self, - mut command: String, + command: String, args: Vec, extra_env: Vec, cwd: Option, output_byte_limit: Option, cx: &mut Context, ) -> Task>> { - for arg in args { - command.push(' '); - command.push_str(&arg); - } - - let shell_command = if cfg!(windows) { - format!("$null | & {{{}}}", command.replace("\"", "'")) - } else if let Some(cwd) = cwd.as_ref().and_then(|cwd| cwd.as_os_str().to_str()) { - // Make sure once we're *inside* the shell, we cd into `cwd` - format!("(cd {cwd}; {}) self.project.update(cx, |project, cx| { - project.directory_environment(dir.as_path().into(), cx) + let worktree = project.find_worktree(dir.as_path(), cx); + let shell = TerminalSettings::get( + worktree.as_ref().map(|(worktree, path)| SettingsLocation { + worktree_id: worktree.read(cx).id(), + path: &path, + }), + cx, + ) + .shell + .clone(); + project.directory_environment(&shell, dir.as_path().into(), cx) }), None => Task::ready(None).shared(), }; - let env = cx.spawn(async move |_, _| { let mut env = env.await.unwrap_or_default(); - if cfg!(unix) { - env.insert("PAGER".into(), "cat".into()); - } + // Disables paging for `git` and hopefully other commands + env.insert("PAGER".into(), "".into()); for var in extra_env { env.insert(var.name, var.value); } @@ -1982,20 +2112,28 @@ impl AcpThread { let project = self.project.clone(); let language_registry = project.read(cx).languages().clone(); - let determine_shell = self.determine_shell.clone(); let terminal_id = acp::TerminalId(Uuid::new_v4().to_string().into()); let terminal_task = cx.spawn({ let terminal_id = terminal_id.clone(); async move |_this, cx| { - let program = determine_shell.await; let env = env.await; + let shell = project + .update(cx, |project, cx| { + project + .remote_client() + .and_then(|r| r.read(cx).default_system_shell()) + })? + .unwrap_or_else(|| get_default_system_shell_preferring_bash()); + let (task_command, task_args) = ShellBuilder::new(&Shell::Program(shell)) + .redirect_stdin_to_dev_null() + .build(Some(command.clone()), &args); let terminal = project .update(cx, |project, cx| { project.create_terminal_task( task::SpawnInTerminal { - command: Some(program), - args, + command: Some(task_command), + args: task_args, cwd: cwd.clone(), env, ..Default::default() @@ -2008,7 +2146,7 @@ impl AcpThread { cx.new(|cx| { Terminal::new( terminal_id, - command, + &format!("{} {}", command, args.join(" ")), cwd, output_byte_limit.map(|l| l as usize), terminal, @@ -2072,6 +2210,32 @@ impl AcpThread { pub fn emit_load_error(&mut self, error: LoadError, cx: &mut Context) { cx.emit(AcpThreadEvent::LoadError(error)); } + + pub fn register_terminal_created( + &mut self, + terminal_id: acp::TerminalId, + command_label: String, + working_dir: Option, + output_byte_limit: Option, + terminal: Entity<::terminal::Terminal>, + cx: &mut Context, + ) -> Entity { + let language_registry = self.project.read(cx).languages().clone(); + + let entity = cx.new(|cx| { + Terminal::new( + terminal_id.clone(), + &command_label, + working_dir.clone(), + output_byte_limit.map(|l| l as usize), + terminal, + language_registry, + cx, + ) + }); + self.terminals.insert(terminal_id.clone(), entity.clone()); + entity + } } fn markdown_for_raw_output( @@ -2148,6 +2312,145 @@ mod tests { }); } + #[gpui::test] + async fn test_terminal_output_buffered_before_created_renders(cx: &mut gpui::TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + let project = Project::test(fs, [], cx).await; + let connection = Rc::new(FakeAgentConnection::new()); + let thread = cx + .update(|cx| connection.new_thread(project, std::path::Path::new(path!("/test")), cx)) + .await + .unwrap(); + + let terminal_id = acp::TerminalId(uuid::Uuid::new_v4().to_string().into()); + + // Send Output BEFORE Created - should be buffered by acp_thread + thread.update(cx, |thread, cx| { + thread.on_terminal_provider_event( + TerminalProviderEvent::Output { + terminal_id: terminal_id.clone(), + data: b"hello buffered".to_vec(), + }, + cx, + ); + }); + + // Create a display-only terminal and then send Created + let lower = cx.new(|cx| { + let builder = ::terminal::TerminalBuilder::new_display_only( + ::terminal::terminal_settings::CursorShape::default(), + ::terminal::terminal_settings::AlternateScroll::On, + None, + 0, + ) + .unwrap(); + builder.subscribe(cx) + }); + + thread.update(cx, |thread, cx| { + thread.on_terminal_provider_event( + TerminalProviderEvent::Created { + terminal_id: terminal_id.clone(), + label: "Buffered Test".to_string(), + cwd: None, + output_byte_limit: None, + terminal: lower.clone(), + }, + cx, + ); + }); + + // After Created, buffered Output should have been flushed into the renderer + let content = thread.read_with(cx, |thread, cx| { + let term = thread.terminal(terminal_id.clone()).unwrap(); + term.read_with(cx, |t, cx| t.inner().read(cx).get_content()) + }); + + assert!( + content.contains("hello buffered"), + "expected buffered output to render, got: {content}" + ); + } + + #[gpui::test] + async fn test_terminal_output_and_exit_buffered_before_created(cx: &mut gpui::TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + let project = Project::test(fs, [], cx).await; + let connection = Rc::new(FakeAgentConnection::new()); + let thread = cx + .update(|cx| connection.new_thread(project, std::path::Path::new(path!("/test")), cx)) + .await + .unwrap(); + + let terminal_id = acp::TerminalId(uuid::Uuid::new_v4().to_string().into()); + + // Send Output BEFORE Created + thread.update(cx, |thread, cx| { + thread.on_terminal_provider_event( + TerminalProviderEvent::Output { + terminal_id: terminal_id.clone(), + data: b"pre-exit data".to_vec(), + }, + cx, + ); + }); + + // Send Exit BEFORE Created + thread.update(cx, |thread, cx| { + thread.on_terminal_provider_event( + TerminalProviderEvent::Exit { + terminal_id: terminal_id.clone(), + status: acp::TerminalExitStatus { + exit_code: Some(0), + signal: None, + meta: None, + }, + }, + cx, + ); + }); + + // Now create a display-only lower-level terminal and send Created + let lower = cx.new(|cx| { + let builder = ::terminal::TerminalBuilder::new_display_only( + ::terminal::terminal_settings::CursorShape::default(), + ::terminal::terminal_settings::AlternateScroll::On, + None, + 0, + ) + .unwrap(); + builder.subscribe(cx) + }); + + thread.update(cx, |thread, cx| { + thread.on_terminal_provider_event( + TerminalProviderEvent::Created { + terminal_id: terminal_id.clone(), + label: "Buffered Exit Test".to_string(), + cwd: None, + output_byte_limit: None, + terminal: lower.clone(), + }, + cx, + ); + }); + + // Output should be present after Created (flushed from buffer) + let content = thread.read_with(cx, |thread, cx| { + let term = thread.terminal(terminal_id.clone()).unwrap(); + term.read_with(cx, |t, cx| t.inner().read(cx).get_content()) + }); + + assert!( + content.contains("pre-exit data"), + "expected pre-exit data to render, got: {content}" + ); + } + #[gpui::test] async fn test_push_user_content_block(cx: &mut gpui::TestAppContext) { init_test(cx); @@ -2388,6 +2691,188 @@ mod tests { request.await.unwrap(); } + #[gpui::test] + async fn test_reading_from_line(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + fs.insert_tree(path!("/tmp"), json!({"foo": "one\ntwo\nthree\nfour\n"})) + .await; + let project = Project::test(fs.clone(), [], cx).await; + project + .update(cx, |project, cx| { + project.find_or_create_worktree(path!("/tmp/foo"), true, cx) + }) + .await + .unwrap(); + + let connection = Rc::new(FakeAgentConnection::new()); + + let thread = cx + .update(|cx| connection.new_thread(project, Path::new(path!("/tmp")), cx)) + .await + .unwrap(); + + // Whole file + let content = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), None, None, false, cx) + }) + .await + .unwrap(); + + assert_eq!(content, "one\ntwo\nthree\nfour\n"); + + // Only start line + let content = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), Some(3), None, false, cx) + }) + .await + .unwrap(); + + assert_eq!(content, "three\nfour\n"); + + // Only limit + let content = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), None, Some(2), false, cx) + }) + .await + .unwrap(); + + assert_eq!(content, "one\ntwo\n"); + + // Range + let content = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), Some(2), Some(2), false, cx) + }) + .await + .unwrap(); + + assert_eq!(content, "two\nthree\n"); + + // Invalid + let err = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), Some(6), Some(2), false, cx) + }) + .await + .unwrap_err(); + + assert_eq!( + err.to_string(), + "Invalid params: \"Attempting to read beyond the end of the file, line 5:0\"" + ); + } + + #[gpui::test] + async fn test_reading_empty_file(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + fs.insert_tree(path!("/tmp"), json!({"foo": ""})).await; + let project = Project::test(fs.clone(), [], cx).await; + project + .update(cx, |project, cx| { + project.find_or_create_worktree(path!("/tmp/foo"), true, cx) + }) + .await + .unwrap(); + + let connection = Rc::new(FakeAgentConnection::new()); + + let thread = cx + .update(|cx| connection.new_thread(project, Path::new(path!("/tmp")), cx)) + .await + .unwrap(); + + // Whole file + let content = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), None, None, false, cx) + }) + .await + .unwrap(); + + assert_eq!(content, ""); + + // Only start line + let content = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), Some(1), None, false, cx) + }) + .await + .unwrap(); + + assert_eq!(content, ""); + + // Only limit + let content = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), None, Some(2), false, cx) + }) + .await + .unwrap(); + + assert_eq!(content, ""); + + // Range + let content = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), Some(1), Some(1), false, cx) + }) + .await + .unwrap(); + + assert_eq!(content, ""); + + // Invalid + let err = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/tmp/foo").into(), Some(5), Some(2), false, cx) + }) + .await + .unwrap_err(); + + assert_eq!( + err.to_string(), + "Invalid params: \"Attempting to read beyond the end of the file, line 1:0\"" + ); + } + #[gpui::test] + async fn test_reading_non_existing_file(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + fs.insert_tree(path!("/tmp"), json!({})).await; + let project = Project::test(fs.clone(), [], cx).await; + project + .update(cx, |project, cx| { + project.find_or_create_worktree(path!("/tmp"), true, cx) + }) + .await + .unwrap(); + + let connection = Rc::new(FakeAgentConnection::new()); + + let thread = cx + .update(|cx| connection.new_thread(project, Path::new(path!("/tmp")), cx)) + .await + .unwrap(); + + // Out of project file + let err = thread + .update(cx, |thread, cx| { + thread.read_text_file(path!("/foo").into(), None, None, false, cx) + }) + .await + .unwrap_err(); + + assert_eq!(err.code, acp::ErrorCode::RESOURCE_NOT_FOUND.code); + } + #[gpui::test] async fn test_succeeding_canceled_toolcall(cx: &mut TestAppContext) { init_test(cx); @@ -3181,4 +3666,65 @@ mod tests { Task::ready(Ok(())) } } + + #[gpui::test] + async fn test_tool_call_not_found_creates_failed_entry(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + let project = Project::test(fs, [], cx).await; + let connection = Rc::new(FakeAgentConnection::new()); + let thread = cx + .update(|cx| connection.new_thread(project, Path::new(path!("/test")), cx)) + .await + .unwrap(); + + // Try to update a tool call that doesn't exist + let nonexistent_id = acp::ToolCallId("nonexistent-tool-call".into()); + thread.update(cx, |thread, cx| { + let result = thread.handle_session_update( + acp::SessionUpdate::ToolCallUpdate(acp::ToolCallUpdate { + id: nonexistent_id.clone(), + fields: acp::ToolCallUpdateFields { + status: Some(acp::ToolCallStatus::Completed), + ..Default::default() + }, + meta: None, + }), + cx, + ); + + // The update should succeed (not return an error) + assert!(result.is_ok()); + + // There should now be exactly one entry in the thread + assert_eq!(thread.entries.len(), 1); + + // The entry should be a failed tool call + if let AgentThreadEntry::ToolCall(tool_call) = &thread.entries[0] { + assert_eq!(tool_call.id, nonexistent_id); + assert!(matches!(tool_call.status, ToolCallStatus::Failed)); + assert_eq!(tool_call.kind, acp::ToolKind::Fetch); + + // Check that the content contains the error message + assert_eq!(tool_call.content.len(), 1); + if let ToolCallContent::ContentBlock(content_block) = &tool_call.content[0] { + match content_block { + ContentBlock::Markdown { markdown } => { + let markdown_text = markdown.read(cx).source(); + assert!(markdown_text.contains("Tool call not found")); + } + ContentBlock::Empty => panic!("Expected markdown content, got empty"), + ContentBlock::ResourceLink { .. } => { + panic!("Expected markdown content, got resource link") + } + } + } else { + panic!("Expected ContentBlock, got: {:?}", tool_call.content[0]); + } + } else { + panic!("Expected ToolCall entry, got: {:?}", thread.entries[0]); + } + }); + } } diff --git a/crates/acp_thread/src/connection.rs b/crates/acp_thread/src/connection.rs index 10c9dd22b6ec476f17fabeae7f6bd4f1a9672db7..fe66f954370f8118d054ee56f1e9f68f2de7e6f4 100644 --- a/crates/acp_thread/src/connection.rs +++ b/crates/acp_thread/src/connection.rs @@ -68,7 +68,7 @@ pub trait AgentConnection { /// /// If the agent does not support model selection, returns [None]. /// This allows sharing the selector in UI components. - fn model_selector(&self) -> Option> { + fn model_selector(&self, _session_id: &acp::SessionId) -> Option> { None } @@ -177,61 +177,48 @@ pub trait AgentModelSelector: 'static { /// If the session doesn't exist or the model is invalid, it returns an error. /// /// # Parameters - /// - `session_id`: The ID of the session (thread) to apply the model to. /// - `model`: The model to select (should be one from [list_models]). /// - `cx`: The GPUI app context. /// /// # Returns /// A task resolving to `Ok(())` on success or an error. - fn select_model( - &self, - session_id: acp::SessionId, - model_id: AgentModelId, - cx: &mut App, - ) -> Task>; + fn select_model(&self, model_id: acp::ModelId, cx: &mut App) -> Task>; /// Retrieves the currently selected model for a specific session (thread). /// /// # Parameters - /// - `session_id`: The ID of the session (thread) to query. /// - `cx`: The GPUI app context. /// /// # Returns /// A task resolving to the selected model (always set) or an error (e.g., session not found). - fn selected_model( - &self, - session_id: &acp::SessionId, - cx: &mut App, - ) -> Task>; + fn selected_model(&self, cx: &mut App) -> Task>; /// Whenever the model list is updated the receiver will be notified. - fn watch(&self, cx: &mut App) -> watch::Receiver<()>; -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct AgentModelId(pub SharedString); - -impl std::ops::Deref for AgentModelId { - type Target = SharedString; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl fmt::Display for AgentModelId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) + /// Optional for agents that don't update their model list. + fn watch(&self, _cx: &mut App) -> Option> { + None } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct AgentModelInfo { - pub id: AgentModelId, + pub id: acp::ModelId, pub name: SharedString, + pub description: Option, pub icon: Option, } +impl From for AgentModelInfo { + fn from(info: acp::ModelInfo) -> Self { + Self { + id: info.model_id, + name: info.name.into(), + description: info.description.map(|desc| desc.into()), + icon: None, + } + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct AgentModelGroupName(pub SharedString); diff --git a/crates/acp_thread/src/diff.rs b/crates/acp_thread/src/diff.rs index f75af0543e373b47b0c6de36760ba18b5d9da318..15de12af27fe233bad4ad8ebb2893ffa5fbdd598 100644 --- a/crates/acp_thread/src/diff.rs +++ b/crates/acp_thread/src/diff.rs @@ -6,12 +6,7 @@ use itertools::Itertools; use language::{ Anchor, Buffer, Capability, LanguageRegistry, OffsetRangeExt as _, Point, Rope, TextBuffer, }; -use std::{ - cmp::Reverse, - ops::Range, - path::{Path, PathBuf}, - sync::Arc, -}; +use std::{cmp::Reverse, ops::Range, path::Path, sync::Arc}; use util::ResultExt; pub enum Diff { @@ -21,7 +16,7 @@ pub enum Diff { impl Diff { pub fn finalized( - path: PathBuf, + path: String, old_text: Option, new_text: String, language_registry: Arc, @@ -36,7 +31,7 @@ impl Diff { let buffer = new_buffer.clone(); async move |_, cx| { let language = language_registry - .language_for_file_path(&path) + .load_language_for_file_path(Path::new(&path)) .await .log_err(); @@ -152,12 +147,15 @@ impl Diff { let path = match self { Diff::Pending(PendingDiff { new_buffer: buffer, .. - }) => buffer.read(cx).file().map(|file| file.path().as_ref()), - Diff::Finalized(FinalizedDiff { path, .. }) => Some(path.as_path()), + }) => buffer + .read(cx) + .file() + .map(|file| file.path().display(file.path_style(cx))), + Diff::Finalized(FinalizedDiff { path, .. }) => Some(path.as_str().into()), }; format!( "Diff: {}\n```\n{}\n```\n", - path.unwrap_or(Path::new("untitled")).display(), + path.unwrap_or("untitled".into()), buffer_text ) } @@ -244,8 +242,8 @@ impl PendingDiff { .new_buffer .read(cx) .file() - .map(|file| file.path().as_ref()) - .unwrap_or(Path::new("untitled")) + .map(|file| file.path().display(file.path_style(cx))) + .unwrap_or("untitled".into()) .into(); // Replace the buffer in the multibuffer with the snapshot @@ -348,7 +346,7 @@ impl PendingDiff { } pub struct FinalizedDiff { - path: PathBuf, + path: String, base_text: Arc, new_buffer: Entity, multibuffer: Entity, diff --git a/crates/acp_thread/src/mention.rs b/crates/acp_thread/src/mention.rs index 122cd9a5cabb9676b0a7afdf76c0de5862f979cb..bbd13da5fa4124546d5457755f2bd2f5d737ccac 100644 --- a/crates/acp_thread/src/mention.rs +++ b/crates/acp_thread/src/mention.rs @@ -126,6 +126,39 @@ impl MentionUri { abs_path: None, line_range, }) + } else if let Some(name) = path.strip_prefix("/agent/symbol/") { + let fragment = url + .fragment() + .context("Missing fragment for untitled buffer selection")?; + let line_range = parse_line_range(fragment)?; + let path = + single_query_param(&url, "path")?.context("Missing path for symbol")?; + Ok(Self::Symbol { + name: name.to_string(), + abs_path: path.into(), + line_range, + }) + } else if path.starts_with("/agent/file") { + let path = + single_query_param(&url, "path")?.context("Missing path for file")?; + Ok(Self::File { + abs_path: path.into(), + }) + } else if path.starts_with("/agent/directory") { + let path = + single_query_param(&url, "path")?.context("Missing path for directory")?; + Ok(Self::Directory { + abs_path: path.into(), + }) + } else if path.starts_with("/agent/selection") { + let fragment = url.fragment().context("Missing fragment for selection")?; + let line_range = parse_line_range(fragment)?; + let path = + single_query_param(&url, "path")?.context("Missing path for selection")?; + Ok(Self::Selection { + abs_path: Some(path.into()), + line_range, + }) } else { bail!("invalid zed url: {:?}", input); } @@ -180,20 +213,29 @@ impl MentionUri { pub fn to_uri(&self) -> Url { match self { MentionUri::File { abs_path } => { - Url::from_file_path(abs_path).expect("mention path should be absolute") + let mut url = Url::parse("zed:///").unwrap(); + url.set_path("/agent/file"); + url.query_pairs_mut() + .append_pair("path", &abs_path.to_string_lossy()); + url } MentionUri::PastedImage => Url::parse("zed:///agent/pasted-image").unwrap(), MentionUri::Directory { abs_path } => { - Url::from_directory_path(abs_path).expect("mention path should be absolute") + let mut url = Url::parse("zed:///").unwrap(); + url.set_path("/agent/directory"); + url.query_pairs_mut() + .append_pair("path", &abs_path.to_string_lossy()); + url } MentionUri::Symbol { abs_path, name, line_range, } => { - let mut url = - Url::from_file_path(abs_path).expect("mention path should be absolute"); - url.query_pairs_mut().append_pair("symbol", name); + let mut url = Url::parse("zed:///").unwrap(); + url.set_path(&format!("/agent/symbol/{name}")); + url.query_pairs_mut() + .append_pair("path", &abs_path.to_string_lossy()); url.set_fragment(Some(&format!( "L{}:{}", line_range.start() + 1, @@ -202,15 +244,16 @@ impl MentionUri { url } MentionUri::Selection { - abs_path: path, + abs_path, line_range, } => { - let mut url = if let Some(path) = path { - Url::from_file_path(path).expect("mention path should be absolute") + let mut url = Url::parse("zed:///").unwrap(); + if let Some(abs_path) = abs_path { + url.set_path("/agent/selection"); + url.query_pairs_mut() + .append_pair("path", &abs_path.to_string_lossy()); } else { - let mut url = Url::parse("zed:///").unwrap(); url.set_path("/agent/untitled-buffer"); - url }; url.set_fragment(Some(&format!( "L{}:{}", @@ -295,37 +338,32 @@ mod tests { #[test] fn test_parse_file_uri() { - let file_uri = uri!("file:///path/to/file.rs"); - let parsed = MentionUri::parse(file_uri).unwrap(); + let old_uri = uri!("file:///path/to/file.rs"); + let parsed = MentionUri::parse(old_uri).unwrap(); match &parsed { MentionUri::File { abs_path } => { assert_eq!(abs_path.to_str().unwrap(), path!("/path/to/file.rs")); } _ => panic!("Expected File variant"), } - assert_eq!(parsed.to_uri().to_string(), file_uri); + let new_uri = parsed.to_uri().to_string(); + assert!(new_uri.starts_with("zed:///agent/file")); + assert_eq!(MentionUri::parse(&new_uri).unwrap(), parsed); } #[test] fn test_parse_directory_uri() { - let file_uri = uri!("file:///path/to/dir/"); - let parsed = MentionUri::parse(file_uri).unwrap(); + let old_uri = uri!("file:///path/to/dir/"); + let parsed = MentionUri::parse(old_uri).unwrap(); match &parsed { MentionUri::Directory { abs_path } => { assert_eq!(abs_path.to_str().unwrap(), path!("/path/to/dir/")); } _ => panic!("Expected Directory variant"), } - assert_eq!(parsed.to_uri().to_string(), file_uri); - } - - #[test] - fn test_to_directory_uri_with_slash() { - let uri = MentionUri::Directory { - abs_path: PathBuf::from(path!("/path/to/dir/")), - }; - let expected = uri!("file:///path/to/dir/"); - assert_eq!(uri.to_uri().to_string(), expected); + let new_uri = parsed.to_uri().to_string(); + assert!(new_uri.starts_with("zed:///agent/directory")); + assert_eq!(MentionUri::parse(&new_uri).unwrap(), parsed); } #[test] @@ -333,14 +371,15 @@ mod tests { let uri = MentionUri::Directory { abs_path: PathBuf::from(path!("/path/to/dir")), }; - let expected = uri!("file:///path/to/dir/"); - assert_eq!(uri.to_uri().to_string(), expected); + let uri_string = uri.to_uri().to_string(); + assert!(uri_string.starts_with("zed:///agent/directory")); + assert_eq!(MentionUri::parse(&uri_string).unwrap(), uri); } #[test] fn test_parse_symbol_uri() { - let symbol_uri = uri!("file:///path/to/file.rs?symbol=MySymbol#L10:20"); - let parsed = MentionUri::parse(symbol_uri).unwrap(); + let old_uri = uri!("file:///path/to/file.rs?symbol=MySymbol#L10:20"); + let parsed = MentionUri::parse(old_uri).unwrap(); match &parsed { MentionUri::Symbol { abs_path: path, @@ -354,13 +393,15 @@ mod tests { } _ => panic!("Expected Symbol variant"), } - assert_eq!(parsed.to_uri().to_string(), symbol_uri); + let new_uri = parsed.to_uri().to_string(); + assert!(new_uri.starts_with("zed:///agent/symbol/MySymbol")); + assert_eq!(MentionUri::parse(&new_uri).unwrap(), parsed); } #[test] fn test_parse_selection_uri() { - let selection_uri = uri!("file:///path/to/file.rs#L5:15"); - let parsed = MentionUri::parse(selection_uri).unwrap(); + let old_uri = uri!("file:///path/to/file.rs#L5:15"); + let parsed = MentionUri::parse(old_uri).unwrap(); match &parsed { MentionUri::Selection { abs_path: path, @@ -375,7 +416,9 @@ mod tests { } _ => panic!("Expected Selection variant"), } - assert_eq!(parsed.to_uri().to_string(), selection_uri); + let new_uri = parsed.to_uri().to_string(); + assert!(new_uri.starts_with("zed:///agent/selection")); + assert_eq!(MentionUri::parse(&new_uri).unwrap(), parsed); } #[test] diff --git a/crates/acp_thread/src/terminal.rs b/crates/acp_thread/src/terminal.rs index a927083b0bd576f1580ba261d4028407fcea7a5c..888c7698c3d2270769f3afbe712ecba7d08b055f 100644 --- a/crates/acp_thread/src/terminal.rs +++ b/crates/acp_thread/src/terminal.rs @@ -28,7 +28,7 @@ pub struct TerminalOutput { impl Terminal { pub fn new( id: acp::TerminalId, - command: String, + command_label: &str, working_dir: Option, output_byte_limit: Option, terminal: Entity, @@ -40,7 +40,7 @@ impl Terminal { id, command: cx.new(|cx| { Markdown::new( - format!("```\n{}\n```", command).into(), + format!("```\n{}\n```", command_label).into(), Some(language_registry.clone()), None, cx, diff --git a/crates/action_log/src/action_log.rs b/crates/action_log/src/action_log.rs index 11ba596ac5a0ecd4ed49744d0eafa9defcde20c1..b7722f211afda3a77bc96292a50acf869e7424d6 100644 --- a/crates/action_log/src/action_log.rs +++ b/crates/action_log/src/action_log.rs @@ -8,10 +8,7 @@ use language::{Anchor, Buffer, BufferEvent, DiskState, Point, ToPoint}; use project::{Project, ProjectItem, lsp_store::OpenLspBufferHandle}; use std::{cmp, ops::Range, sync::Arc}; use text::{Edit, Patch, Rope}; -use util::{ - RangeExt, ResultExt as _, - paths::{PathStyle, RemotePathBuf}, -}; +use util::{RangeExt, ResultExt as _}; /// Tracks actions performed by tools in a thread pub struct ActionLog { @@ -62,7 +59,13 @@ impl ActionLog { let file_path = buffer .read(cx) .file() - .map(|file| RemotePathBuf::new(file.full_path(cx), PathStyle::Posix).to_proto()) + .map(|file| { + let mut path = file.full_path(cx).to_string_lossy().into_owned(); + if file.path_style(cx).is_windows() { + path = path.replace('\\', "/"); + } + path + }) .unwrap_or_else(|| format!("buffer_{}", buffer.entity_id())); let mut result = String::new(); @@ -2301,7 +2304,7 @@ mod tests { .await; fs.set_head_for_repo( path!("/project/.git").as_ref(), - &[("file.txt".into(), "a\nb\nc\nd\ne\nf\ng\nh\ni\nj".into())], + &[("file.txt", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj".into())], "0000000", ); cx.run_until_parked(); @@ -2384,7 +2387,7 @@ mod tests { // - Ignores the last line edit (j stays as j) fs.set_head_for_repo( path!("/project/.git").as_ref(), - &[("file.txt".into(), "A\nb\nc\nf\nG\nh\ni\nj".into())], + &[("file.txt", "A\nb\nc\nf\nG\nh\ni\nj".into())], "0000001", ); cx.run_until_parked(); @@ -2415,10 +2418,7 @@ mod tests { // Make another commit that accepts the NEW line but with different content fs.set_head_for_repo( path!("/project/.git").as_ref(), - &[( - "file.txt".into(), - "A\nb\nc\nf\nGGG\nh\nDIFFERENT\ni\nj".into(), - )], + &[("file.txt", "A\nb\nc\nf\nGGG\nh\nDIFFERENT\ni\nj".into())], "0000002", ); cx.run_until_parked(); @@ -2444,7 +2444,7 @@ mod tests { // Final commit that accepts all remaining edits fs.set_head_for_repo( path!("/project/.git").as_ref(), - &[("file.txt".into(), "A\nb\nc\nf\nGGG\nh\nNEW\ni\nJ".into())], + &[("file.txt", "A\nb\nc\nf\nGGG\nh\nNEW\ni\nJ".into())], "0000003", ); cx.run_until_parked(); diff --git a/crates/activity_indicator/src/activity_indicator.rs b/crates/activity_indicator/src/activity_indicator.rs index 1870ab74db214b518bb0b543166067e636f14965..f35b2ad17879c57b15ac8579e6b50a26110ff21d 100644 --- a/crates/activity_indicator/src/activity_indicator.rs +++ b/crates/activity_indicator/src/activity_indicator.rs @@ -1,4 +1,4 @@ -use auto_update::{AutoUpdateStatus, AutoUpdater, DismissErrorMessage, VersionCheckType}; +use auto_update::{AutoUpdateStatus, AutoUpdater, DismissMessage, VersionCheckType}; use editor::Editor; use extension_host::{ExtensionOperation, ExtensionStore}; use futures::StreamExt; @@ -280,18 +280,13 @@ impl ActivityIndicator { }); } - fn dismiss_error_message( - &mut self, - _: &DismissErrorMessage, - _: &mut Window, - cx: &mut Context, - ) { - let error_dismissed = if let Some(updater) = &self.auto_updater { - updater.update(cx, |updater, cx| updater.dismiss_error(cx)) + fn dismiss_message(&mut self, _: &DismissMessage, _: &mut Window, cx: &mut Context) { + let dismissed = if let Some(updater) = &self.auto_updater { + updater.update(cx, |updater, cx| updater.dismiss(cx)) } else { false }; - if error_dismissed { + if dismissed { return; } @@ -513,7 +508,7 @@ impl ActivityIndicator { on_click: Some(Arc::new(move |this, window, cx| { this.statuses .retain(|status| !downloading.contains(&status.name)); - this.dismiss_error_message(&DismissErrorMessage, window, cx) + this.dismiss_message(&DismissMessage, window, cx) })), tooltip_message: None, }); @@ -542,7 +537,7 @@ impl ActivityIndicator { on_click: Some(Arc::new(move |this, window, cx| { this.statuses .retain(|status| !checking_for_update.contains(&status.name)); - this.dismiss_error_message(&DismissErrorMessage, window, cx) + this.dismiss_message(&DismissMessage, window, cx) })), tooltip_message: None, }); @@ -650,13 +645,14 @@ impl ActivityIndicator { .and_then(|updater| match &updater.read(cx).status() { AutoUpdateStatus::Checking => Some(Content { icon: Some( - Icon::new(IconName::Download) + Icon::new(IconName::LoadCircle) .size(IconSize::Small) + .with_rotate_animation(3) .into_any_element(), ), message: "Checking for Zed updates…".to_string(), on_click: Some(Arc::new(|this, window, cx| { - this.dismiss_error_message(&DismissErrorMessage, window, cx) + this.dismiss_message(&DismissMessage, window, cx) })), tooltip_message: None, }), @@ -668,19 +664,20 @@ impl ActivityIndicator { ), message: "Downloading Zed update…".to_string(), on_click: Some(Arc::new(|this, window, cx| { - this.dismiss_error_message(&DismissErrorMessage, window, cx) + this.dismiss_message(&DismissMessage, window, cx) })), tooltip_message: Some(Self::version_tooltip_message(version)), }), AutoUpdateStatus::Installing { version } => Some(Content { icon: Some( - Icon::new(IconName::Download) + Icon::new(IconName::LoadCircle) .size(IconSize::Small) + .with_rotate_animation(3) .into_any_element(), ), message: "Installing Zed update…".to_string(), on_click: Some(Arc::new(|this, window, cx| { - this.dismiss_error_message(&DismissErrorMessage, window, cx) + this.dismiss_message(&DismissMessage, window, cx) })), tooltip_message: Some(Self::version_tooltip_message(version)), }), @@ -690,17 +687,18 @@ impl ActivityIndicator { on_click: Some(Arc::new(move |_, _, cx| workspace::reload(cx))), tooltip_message: Some(Self::version_tooltip_message(version)), }), - AutoUpdateStatus::Errored => Some(Content { + AutoUpdateStatus::Errored { error } => Some(Content { icon: Some( Icon::new(IconName::Warning) .size(IconSize::Small) .into_any_element(), ), - message: "Auto update failed".to_string(), + message: "Failed to update Zed".to_string(), on_click: Some(Arc::new(|this, window, cx| { - this.dismiss_error_message(&DismissErrorMessage, window, cx) + window.dispatch_action(Box::new(workspace::OpenLog), cx); + this.dismiss_message(&DismissMessage, window, cx); })), - tooltip_message: None, + tooltip_message: Some(format!("{error}")), }), AutoUpdateStatus::Idle => None, }) @@ -738,7 +736,7 @@ impl ActivityIndicator { })), message, on_click: Some(Arc::new(|this, window, cx| { - this.dismiss_error_message(&Default::default(), window, cx) + this.dismiss_message(&Default::default(), window, cx) })), tooltip_message: None, }) @@ -777,7 +775,7 @@ impl Render for ActivityIndicator { let result = h_flex() .id("activity-indicator") .on_action(cx.listener(Self::show_error_message)) - .on_action(cx.listener(Self::dismiss_error_message)); + .on_action(cx.listener(Self::dismiss_message)); let Some(content) = self.content_to_render(cx) else { return result; }; diff --git a/crates/agent/src/agent.rs b/crates/agent/src/agent.rs index 7e3590f05df18d258fae91fd8aa596c07c5fb516..9cd2a93d9bfc9a8a1940fea150f651b60f1a1073 100644 --- a/crates/agent/src/agent.rs +++ b/crates/agent/src/agent.rs @@ -9,12 +9,14 @@ pub mod tool_use; pub use context::{AgentContext, ContextId, ContextLoadResult}; pub use context_store::ContextStore; +use fs::Fs; +use std::sync::Arc; pub use thread::{ LastRestoreCheckpoint, Message, MessageCrease, MessageId, MessageSegment, Thread, ThreadError, ThreadEvent, ThreadFeedback, ThreadId, ThreadSummary, TokenUsageRatio, }; pub use thread_store::{SerializedThread, TextThreadStore, ThreadStore}; -pub fn init(cx: &mut gpui::App) { - thread_store::init(cx); +pub fn init(fs: Arc, cx: &mut gpui::App) { + thread_store::init(fs, cx); } diff --git a/crates/agent/src/agent_profile.rs b/crates/agent/src/agent_profile.rs index c9e73372f60686cf330531926f4129e9c9b25db8..40ba2f07db7ad425a5d0e9befe91499eb746b74e 100644 --- a/crates/agent/src/agent_profile.rs +++ b/crates/agent/src/agent_profile.rs @@ -49,10 +49,10 @@ impl AgentProfile { .unwrap_or_default(), }; - update_settings_file::(fs, cx, { + update_settings_file(fs, cx, { let id = id.clone(); move |settings, _cx| { - settings.create_profile(id, profile_settings).log_err(); + profile_settings.save_to_settings(id, settings).log_err(); } }); diff --git a/crates/agent/src/context.rs b/crates/agent/src/context.rs index 4510b0d3d3548b3ff807a3e549a9f2dc53951452..3b2922087a94c497c07f1df67a8d4d9adf759909 100644 --- a/crates/agent/src/context.rs +++ b/crates/agent/src/context.rs @@ -18,6 +18,7 @@ use std::path::PathBuf; use std::{ops::Range, path::Path, sync::Arc}; use text::{Anchor, OffsetRangeExt as _}; use util::markdown::MarkdownCodeBlock; +use util::rel_path::RelPath; use util::{ResultExt as _, post_inc}; pub const RULES_ICON: IconName = IconName::Reader; @@ -158,7 +159,7 @@ pub struct FileContextHandle { #[derive(Debug, Clone)] pub struct FileContext { pub handle: FileContextHandle, - pub full_path: Arc, + pub full_path: String, pub text: SharedString, pub is_outline: bool, } @@ -186,7 +187,7 @@ impl FileContextHandle { log::error!("file context missing path"); return Task::ready(None); }; - let full_path: Arc = file.full_path(cx).into(); + let full_path = file.full_path(cx).to_string_lossy().into_owned(); let rope = buffer_ref.as_rope().clone(); let buffer = self.buffer.clone(); @@ -235,14 +236,14 @@ pub struct DirectoryContextHandle { #[derive(Debug, Clone)] pub struct DirectoryContext { pub handle: DirectoryContextHandle, - pub full_path: Arc, + pub full_path: String, pub descendants: Vec, } #[derive(Debug, Clone)] pub struct DirectoryContextDescendant { /// Path within the directory. - pub rel_path: Arc, + pub rel_path: Arc, pub fenced_codeblock: SharedString, } @@ -273,13 +274,16 @@ impl DirectoryContextHandle { } let directory_path = entry.path.clone(); - let directory_full_path = worktree_ref.full_path(&directory_path).into(); + let directory_full_path = worktree_ref + .full_path(&directory_path) + .to_string_lossy() + .to_string(); let file_paths = collect_files_in_path(worktree_ref, &directory_path); let descendants_future = future::join_all(file_paths.into_iter().map(|path| { let worktree_ref = worktree.read(cx); let worktree_id = worktree_ref.id(); - let full_path = worktree_ref.full_path(&path); + let full_path = worktree_ref.full_path(&path).to_string_lossy().into_owned(); let rel_path = path .strip_prefix(&directory_path) @@ -360,7 +364,7 @@ pub struct SymbolContextHandle { #[derive(Debug, Clone)] pub struct SymbolContext { pub handle: SymbolContextHandle, - pub full_path: Arc, + pub full_path: String, pub line_range: Range, pub text: SharedString, } @@ -399,7 +403,7 @@ impl SymbolContextHandle { log::error!("symbol context's file has no path"); return Task::ready(None); }; - let full_path = file.full_path(cx).into(); + let full_path = file.full_path(cx).to_string_lossy().into_owned(); let line_range = self.enclosing_range.to_point(&buffer_ref.snapshot()); let text = self.text(cx); let buffer = self.buffer.clone(); @@ -433,7 +437,7 @@ pub struct SelectionContextHandle { #[derive(Debug, Clone)] pub struct SelectionContext { pub handle: SelectionContextHandle, - pub full_path: Arc, + pub full_path: String, pub line_range: Range, pub text: SharedString, } @@ -472,7 +476,7 @@ impl SelectionContextHandle { let text = self.text(cx); let buffer = self.buffer.clone(); let context = AgentContext::Selection(SelectionContext { - full_path: full_path.into(), + full_path: full_path.to_string_lossy().into_owned(), line_range: self.line_range(cx), text, handle: self, @@ -702,7 +706,7 @@ impl Display for RulesContext { #[derive(Debug, Clone)] pub struct ImageContext { pub project_path: Option, - pub full_path: Option>, + pub full_path: Option, pub original_image: Arc, // TODO: handle this elsewhere and remove `ignore-interior-mutability` opt-out in clippy.toml // needed due to a false positive of `clippy::mutable_key_type`. @@ -968,7 +972,7 @@ pub fn load_context( }) } -fn collect_files_in_path(worktree: &Worktree, path: &Path) -> Vec> { +fn collect_files_in_path(worktree: &Worktree, path: &RelPath) -> Vec> { let mut files = Vec::new(); for entry in worktree.child_entries(path) { @@ -982,14 +986,17 @@ fn collect_files_in_path(worktree: &Worktree, path: &Path) -> Vec> { files } -fn codeblock_tag(full_path: &Path, line_range: Option>) -> String { +fn codeblock_tag(full_path: &str, line_range: Option>) -> String { let mut result = String::new(); - if let Some(extension) = full_path.extension().and_then(|ext| ext.to_str()) { + if let Some(extension) = Path::new(full_path) + .extension() + .and_then(|ext| ext.to_str()) + { let _ = write!(result, "{} ", extension); } - let _ = write!(result, "{}", full_path.display()); + let _ = write!(result, "{}", full_path); if let Some(range) = line_range { if range.start.row == range.end.row { diff --git a/crates/agent/src/context_store.rs b/crates/agent/src/context_store.rs index b531852a184ffeaf86862990f03210ceb6033395..cf35840cc4215695a966931701257c838c00af18 100644 --- a/crates/agent/src/context_store.rs +++ b/crates/agent/src/context_store.rs @@ -14,7 +14,10 @@ use futures::{self, FutureExt}; use gpui::{App, Context, Entity, EventEmitter, Image, SharedString, Task, WeakEntity}; use language::{Buffer, File as _}; use language_model::LanguageModelImage; -use project::{Project, ProjectItem, ProjectPath, Symbol, image_store::is_image_file}; +use project::{ + Project, ProjectItem, ProjectPath, Symbol, image_store::is_image_file, + lsp_store::SymbolLocation, +}; use prompt_store::UserPromptId; use ref_cast::RefCast as _; use std::{ @@ -309,7 +312,7 @@ impl ContextStore { let item = image_item.read(cx); this.insert_image( Some(item.project_path(cx)), - Some(item.file.full_path(cx).into()), + Some(item.file.full_path(cx).to_string_lossy().into_owned()), item.image.clone(), remove_if_exists, cx, @@ -325,7 +328,7 @@ impl ContextStore { fn insert_image( &mut self, project_path: Option, - full_path: Option>, + full_path: Option, image: Arc, remove_if_exists: bool, cx: &mut Context, @@ -500,7 +503,7 @@ impl ContextStore { let Some(context_path) = buffer.project_path(cx) else { return false; }; - if context_path != symbol.path { + if symbol.path != SymbolLocation::InProject(context_path) { return false; } let context_range = context.range.to_point_utf16(&buffer.snapshot()); diff --git a/crates/agent/src/history_store.rs b/crates/agent/src/history_store.rs index 285ce7c04b7268aea24e0a746737f65d7c3608df..4b1795047b7444dc74f8a41097c0c66aa54ecfd9 100644 --- a/crates/agent/src/history_store.rs +++ b/crates/agent/src/history_store.rs @@ -155,7 +155,7 @@ impl HistoryStore { .iter() .filter_map(|entry| match entry { HistoryEntryId::Context(path) => path.file_name().map(|file| { - SerializedRecentOpen::ContextName(file.to_string_lossy().to_string()) + SerializedRecentOpen::ContextName(file.to_string_lossy().into_owned()) }), HistoryEntryId::Thread(id) => Some(SerializedRecentOpen::Thread(id.to_string())), }) diff --git a/crates/agent/src/thread.rs b/crates/agent/src/thread.rs index 7b70fde56ab1e7acb6705aeace82f142dc28a9f3..d189b7611209d2fbea5c882ea548318f73ddbfb3 100644 --- a/crates/agent/src/thread.rs +++ b/crates/agent/src/thread.rs @@ -234,7 +234,6 @@ impl MessageSegment { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct ProjectSnapshot { pub worktree_snapshots: Vec, - pub unsaved_buffer_paths: Vec, pub timestamp: DateTime, } @@ -1277,62 +1276,6 @@ impl Thread { ); } - pub fn retry_last_completion( - &mut self, - window: Option, - cx: &mut Context, - ) { - // Clear any existing error state - self.retry_state = None; - - // Use the last error context if available, otherwise fall back to configured model - let (model, intent) = if let Some((model, intent)) = self.last_error_context.take() { - (model, intent) - } else if let Some(configured_model) = self.configured_model.as_ref() { - let model = configured_model.model.clone(); - let intent = if self.has_pending_tool_uses() { - CompletionIntent::ToolResults - } else { - CompletionIntent::UserPrompt - }; - (model, intent) - } else if let Some(configured_model) = self.get_or_init_configured_model(cx) { - let model = configured_model.model.clone(); - let intent = if self.has_pending_tool_uses() { - CompletionIntent::ToolResults - } else { - CompletionIntent::UserPrompt - }; - (model, intent) - } else { - return; - }; - - self.send_to_model(model, intent, window, cx); - } - - pub fn enable_burn_mode_and_retry( - &mut self, - window: Option, - cx: &mut Context, - ) { - self.completion_mode = CompletionMode::Burn; - cx.emit(ThreadEvent::ProfileChanged); - self.retry_last_completion(window, cx); - } - - pub fn used_tools_since_last_user_message(&self) -> bool { - for message in self.messages.iter().rev() { - if self.tool_use.message_has_tool_results(message.id) { - return true; - } else if message.role == Role::User { - return false; - } - } - - false - } - pub fn to_completion_request( &self, model: Arc, @@ -2857,27 +2800,11 @@ impl Thread { .map(|worktree| Self::worktree_snapshot(worktree, git_store.clone(), cx)) .collect(); - cx.spawn(async move |_, cx| { + cx.spawn(async move |_, _| { let worktree_snapshots = futures::future::join_all(worktree_snapshots).await; - let mut unsaved_buffers = Vec::new(); - cx.update(|app_cx| { - let buffer_store = project.read(app_cx).buffer_store(); - for buffer_handle in buffer_store.read(app_cx).buffers() { - let buffer = buffer_handle.read(app_cx); - if buffer.is_dirty() - && let Some(file) = buffer.file() - { - let path = file.path().to_string_lossy().to_string(); - unsaved_buffers.push(path); - } - } - }) - .ok(); - Arc::new(ProjectSnapshot { worktree_snapshots, - unsaved_buffer_paths: unsaved_buffers, timestamp: Utc::now(), }) }) @@ -2892,7 +2819,7 @@ impl Thread { // Get worktree path and snapshot let worktree_info = cx.update(|app_cx| { let worktree = worktree.read(app_cx); - let path = worktree.abs_path().to_string_lossy().to_string(); + let path = worktree.abs_path().to_string_lossy().into_owned(); let snapshot = worktree.snapshot(); (path, snapshot) }); @@ -3272,9 +3199,10 @@ mod tests { // Test-specific constants const TEST_RATE_LIMIT_RETRY_SECS: u64 = 30; - use agent_settings::{AgentProfileId, AgentSettings, LanguageModelParameters}; + use agent_settings::{AgentProfileId, AgentSettings}; use assistant_tool::ToolRegistry; use assistant_tools; + use fs::Fs; use futures::StreamExt; use futures::future::BoxFuture; use futures::stream::BoxStream; @@ -3289,18 +3217,18 @@ mod tests { use project::{FakeFs, Project}; use prompt_store::PromptBuilder; use serde_json::json; - use settings::{Settings, SettingsStore}; + use settings::{LanguageModelParameters, Settings, SettingsStore}; use std::sync::Arc; use std::time::Duration; - use theme::ThemeSettings; use util::path; use workspace::Workspace; #[gpui::test] async fn test_message_with_context(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); let project = create_test_project( + &fs, cx, json!({"code.rs": "fn main() {\n println!(\"Hello, world!\");\n}"}), ) @@ -3375,9 +3303,10 @@ fn main() {{ #[gpui::test] async fn test_only_include_new_contexts(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); let project = create_test_project( + &fs, cx, json!({ "file1.rs": "fn function1() {}\n", @@ -3531,9 +3460,10 @@ fn main() {{ #[gpui::test] async fn test_message_without_files(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); let project = create_test_project( + &fs, cx, json!({"code.rs": "fn main() {\n println!(\"Hello, world!\");\n}"}), ) @@ -3610,9 +3540,10 @@ fn main() {{ #[gpui::test] #[ignore] // turn this test on when project_notifications tool is re-enabled async fn test_stale_buffer_notification(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); let project = create_test_project( + &fs, cx, json!({"code.rs": "fn main() {\n println!(\"Hello, world!\");\n}"}), ) @@ -3738,9 +3669,10 @@ fn main() {{ #[gpui::test] async fn test_storing_profile_setting_per_thread(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); let project = create_test_project( + &fs, cx, json!({"code.rs": "fn main() {\n println!(\"Hello, world!\");\n}"}), ) @@ -3760,9 +3692,10 @@ fn main() {{ #[gpui::test] async fn test_serializing_thread_profile(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); let project = create_test_project( + &fs, cx, json!({"code.rs": "fn main() {\n println!(\"Hello, world!\");\n}"}), ) @@ -3803,9 +3736,10 @@ fn main() {{ #[gpui::test] async fn test_temperature_setting(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); let project = create_test_project( + &fs, cx, json!({"code.rs": "fn main() {\n println!(\"Hello, world!\");\n}"}), ) @@ -3897,9 +3831,9 @@ fn main() {{ #[gpui::test] async fn test_thread_summary(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _thread_store, thread, _context_store, model) = setup_test_environment(cx, project.clone()).await; @@ -3982,9 +3916,9 @@ fn main() {{ #[gpui::test] async fn test_thread_summary_error_set_manually(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _thread_store, thread, _context_store, model) = setup_test_environment(cx, project.clone()).await; @@ -4004,9 +3938,9 @@ fn main() {{ #[gpui::test] async fn test_thread_summary_error_retry(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _thread_store, thread, _context_store, model) = setup_test_environment(cx, project.clone()).await; @@ -4158,9 +4092,9 @@ fn main() {{ #[gpui::test] async fn test_retry_on_overloaded_error(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Enable Burn Mode to allow retries @@ -4236,9 +4170,9 @@ fn main() {{ #[gpui::test] async fn test_retry_on_internal_server_error(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Enable Burn Mode to allow retries @@ -4318,9 +4252,9 @@ fn main() {{ #[gpui::test] async fn test_exponential_backoff_on_retries(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Enable Burn Mode to allow retries @@ -4438,9 +4372,9 @@ fn main() {{ #[gpui::test] async fn test_max_retries_exceeded(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Enable Burn Mode to allow retries @@ -4529,9 +4463,9 @@ fn main() {{ #[gpui::test] async fn test_retry_message_removed_on_retry(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Enable Burn Mode to allow retries @@ -4702,9 +4636,9 @@ fn main() {{ #[gpui::test] async fn test_successful_completion_clears_retry_state(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Enable Burn Mode to allow retries @@ -4868,9 +4802,9 @@ fn main() {{ #[gpui::test] async fn test_rate_limit_retry_single_attempt(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Enable Burn Mode to allow retries @@ -5053,9 +4987,9 @@ fn main() {{ #[gpui::test] async fn test_ui_only_messages_not_sent_to_model(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, model) = setup_test_environment(cx, project.clone()).await; // Insert a regular user message @@ -5153,9 +5087,9 @@ fn main() {{ #[gpui::test] async fn test_no_retry_without_burn_mode(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Ensure we're in Normal mode (not Burn mode) @@ -5226,9 +5160,9 @@ fn main() {{ #[gpui::test] async fn test_retry_canceled_on_stop(cx: &mut TestAppContext) { - init_test_settings(cx); + let fs = init_test_settings(cx); - let project = create_test_project(cx, json!({})).await; + let project = create_test_project(&fs, cx, json!({})).await; let (_, _, thread, _, _base_model) = setup_test_environment(cx, project.clone()).await; // Enable Burn Mode to allow retries @@ -5334,7 +5268,8 @@ fn main() {{ cx.run_until_parked(); } - fn init_test_settings(cx: &mut TestAppContext) { + fn init_test_settings(cx: &mut TestAppContext) -> Arc { + let fs = FakeFs::new(cx.executor()); cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); @@ -5342,10 +5277,10 @@ fn main() {{ Project::init_settings(cx); AgentSettings::register(cx); prompt_store::init(cx); - thread_store::init(cx); + thread_store::init(fs.clone(), cx); workspace::init_settings(cx); language_model::init_settings(cx); - ThemeSettings::register(cx); + theme::init(theme::LoadThemes::JustBase, cx); ToolRegistry::default_global(cx); assistant_tool::init(cx); @@ -5356,16 +5291,17 @@ fn main() {{ )); assistant_tools::init(http_client, cx); }); + fs } // Helper to create a test project with test files async fn create_test_project( + fs: &Arc, cx: &mut TestAppContext, files: serde_json::Value, ) -> Entity { - let fs = FakeFs::new(cx.executor()); - fs.insert_tree(path!("/test"), files).await; - Project::test(fs, [path!("/test").as_ref()], cx).await + fs.as_fake().insert_tree(path!("/test"), files).await; + Project::test(fs.clone(), [path!("/test").as_ref()], cx).await } async fn setup_test_environment( diff --git a/crates/agent/src/thread_store.rs b/crates/agent/src/thread_store.rs index 2eae758b835d5d79ccf86f18be032f2d9bb87c2b..2139f232e3e99b1affb78928dec70e1aaef2a03a 100644 --- a/crates/agent/src/thread_store.rs +++ b/crates/agent/src/thread_store.rs @@ -10,6 +10,7 @@ use assistant_tool::{Tool, ToolId, ToolWorkingSet}; use chrono::{DateTime, Utc}; use collections::HashMap; use context_server::ContextServerId; +use fs::{Fs, RemoveOptions}; use futures::{ FutureExt as _, StreamExt as _, channel::{mpsc, oneshot}, @@ -37,9 +38,9 @@ use std::{ cell::{Ref, RefCell}, path::{Path, PathBuf}, rc::Rc, - sync::{Arc, Mutex}, + sync::{Arc, LazyLock, Mutex}, }; -use util::ResultExt as _; +use util::{ResultExt as _, rel_path::RelPath}; use zed_env_vars::ZED_STATELESS; @@ -73,20 +74,22 @@ impl Column for DataType { } } -const RULES_FILE_NAMES: [&str; 9] = [ - ".rules", - ".cursorrules", - ".windsurfrules", - ".clinerules", - ".github/copilot-instructions.md", - "CLAUDE.md", - "AGENT.md", - "AGENTS.md", - "GEMINI.md", -]; - -pub fn init(cx: &mut App) { - ThreadsDatabase::init(cx); +static RULES_FILE_NAMES: LazyLock<[&RelPath; 9]> = LazyLock::new(|| { + [ + RelPath::unix(".rules").unwrap(), + RelPath::unix(".cursorrules").unwrap(), + RelPath::unix(".windsurfrules").unwrap(), + RelPath::unix(".clinerules").unwrap(), + RelPath::unix(".github/copilot-instructions.md").unwrap(), + RelPath::unix("CLAUDE.md").unwrap(), + RelPath::unix("AGENT.md").unwrap(), + RelPath::unix("AGENTS.md").unwrap(), + RelPath::unix("GEMINI.md").unwrap(), + ] +}); + +pub fn init(fs: Arc, cx: &mut App) { + ThreadsDatabase::init(fs, cx); } /// A system prompt shared by all threads created by this ThreadStore @@ -231,11 +234,10 @@ impl ThreadStore { self.enqueue_system_prompt_reload(); } project::Event::WorktreeUpdatedEntries(_, items) => { - if items.iter().any(|(path, _, _)| { - RULES_FILE_NAMES - .iter() - .any(|name| path.as_ref() == Path::new(name)) - }) { + if items + .iter() + .any(|(path, _, _)| RULES_FILE_NAMES.iter().any(|name| path.as_ref() == *name)) + { self.enqueue_system_prompt_reload(); } } @@ -327,7 +329,7 @@ impl ThreadStore { cx: &mut App, ) -> Task<(WorktreeContext, Option)> { let tree = worktree.read(cx); - let root_name = tree.root_name().into(); + let root_name = tree.root_name_str().into(); let abs_path = tree.abs_path(); let mut context = WorktreeContext { @@ -869,13 +871,13 @@ impl ThreadsDatabase { GlobalThreadsDatabase::global(cx).0.clone() } - fn init(cx: &mut App) { + fn init(fs: Arc, cx: &mut App) { let executor = cx.background_executor().clone(); let database_future = executor .spawn({ let executor = executor.clone(); let threads_dir = paths::data_dir().join("threads"); - async move { ThreadsDatabase::new(threads_dir, executor) } + async move { ThreadsDatabase::new(fs, threads_dir, executor).await } }) .then(|result| future::ready(result.map(Arc::new).map_err(Arc::new))) .boxed() @@ -884,13 +886,17 @@ impl ThreadsDatabase { cx.set_global(GlobalThreadsDatabase(database_future)); } - pub fn new(threads_dir: PathBuf, executor: BackgroundExecutor) -> Result { - std::fs::create_dir_all(&threads_dir)?; + pub async fn new( + fs: Arc, + threads_dir: PathBuf, + executor: BackgroundExecutor, + ) -> Result { + fs.create_dir(&threads_dir).await?; let sqlite_path = threads_dir.join("threads.db"); let mdb_path = threads_dir.join("threads-db.1.mdb"); - let needs_migration_from_heed = mdb_path.exists(); + let needs_migration_from_heed = fs.is_file(&mdb_path).await; let connection = if *ZED_STATELESS { Connection::open_memory(Some("THREAD_FALLBACK_DB")) @@ -932,7 +938,14 @@ impl ThreadsDatabase { .spawn(async move { log::info!("Starting threads.db migration"); Self::migrate_from_heed(&mdb_path, db_connection, executor_clone)?; - std::fs::remove_dir_all(mdb_path)?; + fs.remove_dir( + &mdb_path, + RemoveOptions { + recursive: true, + ignore_if_not_exists: true, + }, + ) + .await?; log::info!("threads.db migrated to sqlite"); Ok::<(), anyhow::Error>(()) }) diff --git a/crates/agent2/src/agent.rs b/crates/agent2/src/agent.rs index d72216208769de98c6ad408fec0c17133090b79b..bf1fe8b5bb72038e197eafc842ca02e417b9e7c3 100644 --- a/crates/agent2/src/agent.rs +++ b/crates/agent2/src/agent.rs @@ -6,7 +6,6 @@ use crate::{HistoryStore, TerminalHandle, ThreadEnvironment, TitleUpdated, Token use acp_thread::{AcpThread, AgentModelSelector}; use action_log::ActionLog; use agent_client_protocol as acp; -use agent_settings::AgentSettings; use anyhow::{Context as _, Result, anyhow}; use collections::{HashSet, IndexMap}; use fs::Fs; @@ -21,13 +20,14 @@ use project::{Project, ProjectItem, ProjectPath, Worktree}; use prompt_store::{ ProjectContext, PromptId, PromptStore, RulesFileContext, UserRulesContext, WorktreeContext, }; -use settings::update_settings_file; +use settings::{LanguageModelSelection, update_settings_file}; use std::any::Any; use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::rc::Rc; use std::sync::Arc; use util::ResultExt; +use util::rel_path::RelPath; const RULES_FILE_NAMES: [&str; 9] = [ ".rules", @@ -57,7 +57,7 @@ struct Session { pub struct LanguageModels { /// Access language model by ID - models: HashMap>, + models: HashMap>, /// Cached list for returning language model information model_list: acp_thread::AgentModelList, refresh_models_rx: watch::Receiver<()>, @@ -133,10 +133,7 @@ impl LanguageModels { self.refresh_models_rx.clone() } - pub fn model_from_id( - &self, - model_id: &acp_thread::AgentModelId, - ) -> Option> { + pub fn model_from_id(&self, model_id: &acp::ModelId) -> Option> { self.models.get(model_id).cloned() } @@ -147,12 +144,13 @@ impl LanguageModels { acp_thread::AgentModelInfo { id: Self::model_id(model), name: model.name().0, + description: None, icon: Some(provider.icon()), } } - fn model_id(model: &Arc) -> acp_thread::AgentModelId { - acp_thread::AgentModelId(format!("{}/{}", model.provider_id().0, model.id().0).into()) + fn model_id(model: &Arc) -> acp::ModelId { + acp::ModelId(format!("{}/{}", model.provider_id().0, model.id().0).into()) } fn authenticate_all_language_model_providers(cx: &mut App) -> Task<()> { @@ -166,33 +164,41 @@ impl LanguageModels { cx.background_spawn(async move { for (provider_id, provider_name, authenticate_task) in authenticate_all_providers { if let Err(err) = authenticate_task.await { - if matches!(err, language_model::AuthenticateError::CredentialsNotFound) { - // Since we're authenticating these providers in the - // background for the purposes of populating the - // language selector, we don't care about providers - // where the credentials are not found. - } else { - // Some providers have noisy failure states that we - // don't want to spam the logs with every time the - // language model selector is initialized. - // - // Ideally these should have more clear failure modes - // that we know are safe to ignore here, like what we do - // with `CredentialsNotFound` above. - match provider_id.0.as_ref() { - "lmstudio" | "ollama" => { - // LM Studio and Ollama both make fetch requests to the local APIs to determine if they are "authenticated". - // - // These fail noisily, so we don't log them. - } - "copilot_chat" => { - // Copilot Chat returns an error if Copilot is not enabled, so we don't log those errors. - } - _ => { - log::error!( - "Failed to authenticate provider: {}: {err}", - provider_name.0 - ); + match err { + language_model::AuthenticateError::CredentialsNotFound => { + // Since we're authenticating these providers in the + // background for the purposes of populating the + // language selector, we don't care about providers + // where the credentials are not found. + } + language_model::AuthenticateError::ConnectionRefused => { + // Not logging connection refused errors as they are mostly from LM Studio's noisy auth failures. + // LM Studio only has one auth method (endpoint call) which fails for users who haven't enabled it. + // TODO: Better manage LM Studio auth logic to avoid these noisy failures. + } + _ => { + // Some providers have noisy failure states that we + // don't want to spam the logs with every time the + // language model selector is initialized. + // + // Ideally these should have more clear failure modes + // that we know are safe to ignore here, like what we do + // with `CredentialsNotFound` above. + match provider_id.0.as_ref() { + "lmstudio" | "ollama" => { + // LM Studio and Ollama both make fetch requests to the local APIs to determine if they are "authenticated". + // + // These fail noisily, so we don't log them. + } + "copilot_chat" => { + // Copilot Chat returns an error if Copilot is not enabled, so we don't log those errors. + } + _ => { + log::error!( + "Failed to authenticate provider: {}: {err}", + provider_name.0 + ); + } } } } @@ -429,7 +435,7 @@ impl NativeAgent { cx: &mut App, ) -> Task<(WorktreeContext, Option)> { let tree = worktree.read(cx); - let root_name = tree.root_name().into(); + let root_name = tree.root_name_str().into(); let abs_path = tree.abs_path(); let mut context = WorktreeContext { @@ -469,7 +475,7 @@ impl NativeAgent { .into_iter() .filter_map(|name| { worktree - .entry_for_path(name) + .entry_for_path(RelPath::unix(name).unwrap()) .filter(|entry| entry.is_file()) .map(|entry| entry.path.clone()) }) @@ -553,7 +559,7 @@ impl NativeAgent { if items.iter().any(|(path, _, _)| { RULES_FILE_NAMES .iter() - .any(|name| path.as_ref() == Path::new(name)) + .any(|name| path.as_ref() == RelPath::unix(name).unwrap()) }) { self.project_context_needs_refresh.send(()).ok(); } @@ -829,10 +835,15 @@ impl NativeAgentConnection { } } -impl AgentModelSelector for NativeAgentConnection { +struct NativeAgentModelSelector { + session_id: acp::SessionId, + connection: NativeAgentConnection, +} + +impl acp_thread::AgentModelSelector for NativeAgentModelSelector { fn list_models(&self, cx: &mut App) -> Task> { log::debug!("NativeAgentConnection::list_models called"); - let list = self.0.read(cx).models.model_list.clone(); + let list = self.connection.0.read(cx).models.model_list.clone(); Task::ready(if list.is_empty() { Err(anyhow::anyhow!("No models available")) } else { @@ -840,24 +851,24 @@ impl AgentModelSelector for NativeAgentConnection { }) } - fn select_model( - &self, - session_id: acp::SessionId, - model_id: acp_thread::AgentModelId, - cx: &mut App, - ) -> Task> { - log::debug!("Setting model for session {}: {}", session_id, model_id); + fn select_model(&self, model_id: acp::ModelId, cx: &mut App) -> Task> { + log::debug!( + "Setting model for session {}: {}", + self.session_id, + model_id + ); let Some(thread) = self + .connection .0 .read(cx) .sessions - .get(&session_id) + .get(&self.session_id) .map(|session| session.thread.clone()) else { return Task::ready(Err(anyhow!("Session not found"))); }; - let Some(model) = self.0.read(cx).models.model_from_id(&model_id) else { + let Some(model) = self.connection.0.read(cx).models.model_from_id(&model_id) else { return Task::ready(Err(anyhow!("Invalid model ID {}", model_id))); }; @@ -865,29 +876,32 @@ impl AgentModelSelector for NativeAgentConnection { thread.set_model(model.clone(), cx); }); - update_settings_file::( - self.0.read(cx).fs.clone(), + update_settings_file( + self.connection.0.read(cx).fs.clone(), cx, move |settings, _cx| { - settings.set_model(model); + let provider = model.provider_id().0.to_string(); + let model = model.id().0.to_string(); + settings + .agent + .get_or_insert_default() + .set_model(LanguageModelSelection { + provider: provider.into(), + model, + }); }, ); Task::ready(Ok(())) } - fn selected_model( - &self, - session_id: &acp::SessionId, - cx: &mut App, - ) -> Task> { - let session_id = session_id.clone(); - + fn selected_model(&self, cx: &mut App) -> Task> { let Some(thread) = self + .connection .0 .read(cx) .sessions - .get(&session_id) + .get(&self.session_id) .map(|session| session.thread.clone()) else { return Task::ready(Err(anyhow!("Session not found"))); @@ -904,8 +918,8 @@ impl AgentModelSelector for NativeAgentConnection { ))) } - fn watch(&self, cx: &mut App) -> watch::Receiver<()> { - self.0.read(cx).models.watch() + fn watch(&self, cx: &mut App) -> Option> { + Some(self.connection.0.read(cx).models.watch()) } } @@ -961,8 +975,11 @@ impl acp_thread::AgentConnection for NativeAgentConnection { Task::ready(Ok(())) } - fn model_selector(&self) -> Option> { - Some(Rc::new(self.clone()) as Rc) + fn model_selector(&self, session_id: &acp::SessionId) -> Option> { + Some(Rc::new(NativeAgentModelSelector { + session_id: session_id.clone(), + connection: self.clone(), + }) as Rc) } fn prompt( @@ -1185,16 +1202,14 @@ mod tests { use crate::HistoryEntryId; use super::*; - use acp_thread::{ - AgentConnection, AgentModelGroupName, AgentModelId, AgentModelInfo, MentionUri, - }; + use acp_thread::{AgentConnection, AgentModelGroupName, AgentModelInfo, MentionUri}; use fs::FakeFs; use gpui::TestAppContext; - use indoc::indoc; + use indoc::formatdoc; use language_model::fake_provider::FakeLanguageModel; use serde_json::json; use settings::SettingsStore; - use util::path; + use util::{path, rel_path::rel_path}; #[gpui::test] async fn test_maintaining_project_context(cx: &mut TestAppContext) { @@ -1244,14 +1259,17 @@ mod tests { fs.insert_file("/a/.rules", Vec::new()).await; cx.run_until_parked(); agent.read_with(cx, |agent, cx| { - let rules_entry = worktree.read(cx).entry_for_path(".rules").unwrap(); + let rules_entry = worktree + .read(cx) + .entry_for_path(rel_path(".rules")) + .unwrap(); assert_eq!( agent.project_context.read(cx).worktrees, vec![WorktreeContext { root_name: "a".into(), abs_path: Path::new("/a").into(), rules_file: Some(RulesFileContext { - path_in_worktree: Path::new(".rules").into(), + path_in_worktree: rel_path(".rules").into(), text: "".into(), project_entry_id: rules_entry.id.to_usize() }) @@ -1281,7 +1299,25 @@ mod tests { .unwrap(), ); - let models = cx.update(|cx| connection.list_models(cx)).await.unwrap(); + // Create a thread/session + let acp_thread = cx + .update(|cx| { + Rc::new(connection.clone()).new_thread(project.clone(), Path::new("/a"), cx) + }) + .await + .unwrap(); + + let session_id = cx.update(|cx| acp_thread.read(cx).session_id().clone()); + + let models = cx + .update(|cx| { + connection + .model_selector(&session_id) + .unwrap() + .list_models(cx) + }) + .await + .unwrap(); let acp_thread::AgentModelList::Grouped(models) = models else { panic!("Unexpected model group"); @@ -1291,8 +1327,9 @@ mod tests { IndexMap::from_iter([( AgentModelGroupName("Fake".into()), vec![AgentModelInfo { - id: AgentModelId("fake/fake".into()), + id: acp::ModelId("fake/fake".into()), name: "Fake".into(), + description: None, icon: Some(ui::IconName::ZedAssistant), }] )]) @@ -1349,8 +1386,9 @@ mod tests { let session_id = cx.update(|cx| acp_thread.read(cx).session_id().clone()); // Select a model - let model_id = AgentModelId("fake/fake".into()); - cx.update(|cx| connection.select_model(session_id.clone(), model_id.clone(), cx)) + let selector = connection.model_selector(&session_id).unwrap(); + let model_id = acp::ModelId("fake/fake".into()); + cx.update(|cx| selector.select_model(model_id.clone(), cx)) .await .unwrap(); @@ -1380,7 +1418,6 @@ mod tests { } #[gpui::test] - #[cfg_attr(target_os = "windows", ignore)] // TODO: Fix this test on Windows async fn test_save_load_thread(cx: &mut TestAppContext) { init_test(cx); let fs = FakeFs::new(cx.executor()); @@ -1460,17 +1497,22 @@ mod tests { model.send_last_completion_stream_text_chunk("Lorem."); model.end_last_completion_stream(); cx.run_until_parked(); - summary_model.send_last_completion_stream_text_chunk("Explaining /a/b.md"); + summary_model + .send_last_completion_stream_text_chunk(&format!("Explaining {}", path!("/a/b.md"))); summary_model.end_last_completion_stream(); send.await.unwrap(); + let uri = MentionUri::File { + abs_path: path!("/a/b.md").into(), + } + .to_uri(); acp_thread.read_with(cx, |thread, cx| { assert_eq!( thread.to_markdown(cx), - indoc! {" + formatdoc! {" ## User - What does [@b.md](file:///a/b.md) mean? + What does [@b.md]({uri}) mean? ## Assistant @@ -1496,7 +1538,7 @@ mod tests { history_entries(&history_store, cx), vec![( HistoryEntryId::AcpThread(session_id.clone()), - "Explaining /a/b.md".into() + format!("Explaining {}", path!("/a/b.md")) )] ); let acp_thread = agent @@ -1506,10 +1548,10 @@ mod tests { acp_thread.read_with(cx, |thread, cx| { assert_eq!( thread.to_markdown(cx), - indoc! {" + formatdoc! {" ## User - What does [@b.md](file:///a/b.md) mean? + What does [@b.md]({uri}) mean? ## Assistant diff --git a/crates/agent2/src/db.rs b/crates/agent2/src/db.rs index 3be37bbb55a9b6820b59245ba05143e3432ab397..563ccdd7ca5b2c2cc63a8c7f30c59b9443f8a0bd 100644 --- a/crates/agent2/src/db.rs +++ b/crates/agent2/src/db.rs @@ -422,17 +422,15 @@ mod tests { use agent::MessageSegment; use agent::context::LoadedContext; use client::Client; - use fs::FakeFs; + use fs::{FakeFs, Fs}; use gpui::AppContext; use gpui::TestAppContext; use http_client::FakeHttpClient; use language_model::Role; use project::Project; - use serde_json::json; use settings::SettingsStore; - use util::test::TempTree; - fn init_test(cx: &mut TestAppContext) { + fn init_test(fs: Arc, cx: &mut TestAppContext) { env_logger::try_init().ok(); cx.update(|cx| { let settings_store = SettingsStore::test(cx); @@ -443,7 +441,7 @@ mod tests { let http_client = FakeHttpClient::with_404_response(); let clock = Arc::new(clock::FakeSystemClock::new()); let client = Client::new(clock, http_client, cx); - agent::init(cx); + agent::init(fs, cx); agent_settings::init(cx); language_model::init(client, cx); }); @@ -451,10 +449,8 @@ mod tests { #[gpui::test] async fn test_retrieving_old_thread(cx: &mut TestAppContext) { - let tree = TempTree::new(json!({})); - util::paths::set_home_dir(tree.path().into()); - init_test(cx); let fs = FakeFs::new(cx.executor()); + init_test(fs.clone(), cx); let project = Project::test(fs, [], cx).await; // Save a thread using the old agent. diff --git a/crates/agent2/src/history_store.rs b/crates/agent2/src/history_store.rs index c656456e01780505c355c878c26d2405286e56b2..ff6caacc78e5dba4ee38f160fa6ded7fcb45a845 100644 --- a/crates/agent2/src/history_store.rs +++ b/crates/agent2/src/history_store.rs @@ -262,7 +262,7 @@ impl HistoryStore { .iter() .filter_map(|entry| match entry { HistoryEntryId::TextThread(path) => path.file_name().map(|file| { - SerializedRecentOpen::TextThread(file.to_string_lossy().to_string()) + SerializedRecentOpen::TextThread(file.to_string_lossy().into_owned()) }), HistoryEntryId::AcpThread(id) => { Some(SerializedRecentOpen::AcpThread(id.to_string())) diff --git a/crates/agent2/src/templates/system_prompt.hbs b/crates/agent2/src/templates/system_prompt.hbs index a9f67460d81e79f03d0a0a9b60cd4d6c32fc3b20..ca324fad7acccb3e50f1140c8f99d52319d159d4 100644 --- a/crates/agent2/src/templates/system_prompt.hbs +++ b/crates/agent2/src/templates/system_prompt.hbs @@ -48,16 +48,15 @@ The one exception to this is if the user references something you don't know abo ## Code Block Formatting Whenever you mention a code block, you MUST use ONLY use the following format: + ```path/to/Something.blah#L123-456 (code goes here) ``` -The `#L123-456` means the line number range 123 through 456, and the path/to/Something.blah -is a path in the project. (If there is no valid path in the project, then you can use -/dev/null/path.extension for its path.) This is the ONLY valid way to format code blocks, because the Markdown parser -does not understand the more common ```language syntax, or bare ``` blocks. It only -understands this path-based syntax, and if the path is missing, then it will error and you will have to do it over again. + +The `#L123-456` means the line number range 123 through 456, and the path/to/Something.blah is a path in the project. (If there is no valid path in the project, then you can use /dev/null/path.extension for its path.) This is the ONLY valid way to format code blocks, because the Markdown parser does not understand the more common ```language syntax, or bare ``` blocks. It only understands this path-based syntax, and if the path is missing, then it will error and you will have to do it over again. Just to be really clear about this, if you ever find yourself writing three backticks followed by a language name, STOP! You have made a mistake. You can only ever put paths after triple backticks! + Based on all the information I've gathered, here's a summary of how this system works: 1. The README file is loaded into the system. @@ -74,6 +73,7 @@ This is the last header in the README. ``` 4. Finally, it passes this information on to the next process. + In Markdown, hash marks signify headings. For example: ```/dev/null/example.md#L1-3 @@ -82,6 +82,7 @@ In Markdown, hash marks signify headings. For example: ### Level 3 heading ``` + Here are examples of ways you must never render code blocks: In Markdown, hash marks signify headings. For example: @@ -91,7 +92,9 @@ In Markdown, hash marks signify headings. For example: ### Level 3 heading ``` + This example is unacceptable because it does not include the path. + In Markdown, hash marks signify headings. For example: ```markdown @@ -101,14 +104,15 @@ In Markdown, hash marks signify headings. For example: ``` This example is unacceptable because it has the language instead of the path. + In Markdown, hash marks signify headings. For example: # Level 1 heading ## Level 2 heading ### Level 3 heading -This example is unacceptable because it uses indentation to mark the code block -instead of backticks with a path. +This example is unacceptable because it uses indentation to mark the code block instead of backticks with a path. + In Markdown, hash marks signify headings. For example: ```markdown diff --git a/crates/agent2/src/tests/mod.rs b/crates/agent2/src/tests/mod.rs index c0f693afe6dc0decdce4447471191bd78cf345f1..2e63aa5856501f880fec94f7659b13be321b03b3 100644 --- a/crates/agent2/src/tests/mod.rs +++ b/crates/agent2/src/tests/mod.rs @@ -1850,8 +1850,18 @@ async fn test_agent_connection(cx: &mut TestAppContext) { .unwrap(); let connection = NativeAgentConnection(agent.clone()); + // Create a thread using new_thread + let connection_rc = Rc::new(connection.clone()); + let acp_thread = cx + .update(|cx| connection_rc.new_thread(project, cwd, cx)) + .await + .expect("new_thread should succeed"); + + // Get the session_id from the AcpThread + let session_id = acp_thread.read_with(cx, |thread, _| thread.session_id().clone()); + // Test model_selector returns Some - let selector_opt = connection.model_selector(); + let selector_opt = connection.model_selector(&session_id); assert!( selector_opt.is_some(), "agent2 should always support ModelSelector" @@ -1868,23 +1878,16 @@ async fn test_agent_connection(cx: &mut TestAppContext) { }; assert!(!listed_models.is_empty(), "should have at least one model"); assert_eq!( - listed_models[&AgentModelGroupName("Fake".into())][0].id.0, + listed_models[&AgentModelGroupName("Fake".into())][0] + .id + .0 + .as_ref(), "fake/fake" ); - // Create a thread using new_thread - let connection_rc = Rc::new(connection.clone()); - let acp_thread = cx - .update(|cx| connection_rc.new_thread(project, cwd, cx)) - .await - .expect("new_thread should succeed"); - - // Get the session_id from the AcpThread - let session_id = acp_thread.read_with(cx, |thread, _| thread.session_id().clone()); - // Test selected_model returns the default let model = cx - .update(|cx| selector.selected_model(&session_id, cx)) + .update(|cx| selector.selected_model(cx)) .await .expect("selected_model should succeed"); let model = cx diff --git a/crates/agent2/src/thread.rs b/crates/agent2/src/thread.rs index b19d34adafe4a7b6567be9a1864b88ea2504bf12..756b868dcfc26239911d6e5c0cd8ad984cd7dc4e 100644 --- a/crates/agent2/src/thread.rs +++ b/crates/agent2/src/thread.rs @@ -15,10 +15,11 @@ use agent_settings::{ use anyhow::{Context as _, Result, anyhow}; use assistant_tool::adapt_schema_to_format; use chrono::{DateTime, Utc}; -use client::{ModelRequestUsage, RequestUsage}; -use cloud_llm_client::{CompletionIntent, CompletionRequestStatus, UsageLimit}; +use client::{ModelRequestUsage, RequestUsage, UserStore}; +use cloud_llm_client::{CompletionIntent, CompletionRequestStatus, Plan, UsageLimit}; use collections::{HashMap, HashSet, IndexMap}; use fs::Fs; +use futures::stream; use futures::{ FutureExt, channel::{mpsc, oneshot}, @@ -34,7 +35,7 @@ use language_model::{ LanguageModelImage, LanguageModelProviderId, LanguageModelRegistry, LanguageModelRequest, LanguageModelRequestMessage, LanguageModelRequestTool, LanguageModelToolResult, LanguageModelToolResultContent, LanguageModelToolSchemaFormat, LanguageModelToolUse, - LanguageModelToolUseId, Role, SelectedModel, StopReason, TokenUsage, + LanguageModelToolUseId, Role, SelectedModel, StopReason, TokenUsage, ZED_CLOUD_PROVIDER_ID, }; use project::{ Project, @@ -585,6 +586,7 @@ pub struct Thread { pending_title_generation: Option>, summary: Option, messages: Vec, + user_store: Entity, completion_mode: CompletionMode, /// Holds the task that handles agent interaction until the end of the turn. /// Survives across multiple requests as the model performs tool calls and @@ -641,6 +643,7 @@ impl Thread { pending_title_generation: None, summary: None, messages: Vec::new(), + user_store: project.read(cx).user_store(), completion_mode: AgentSettings::get_global(cx).preferred_completion_mode, running_turn: None, pending_message: None, @@ -820,6 +823,7 @@ impl Thread { pending_title_generation: None, summary: db_thread.detailed_summary, messages: db_thread.messages, + user_store: project.read(cx).user_store(), completion_mode: db_thread.completion_mode.unwrap_or_default(), running_turn: None, pending_message: None, @@ -879,27 +883,11 @@ impl Thread { .map(|worktree| Self::worktree_snapshot(worktree, git_store.clone(), cx)) .collect(); - cx.spawn(async move |_, cx| { + cx.spawn(async move |_, _| { let worktree_snapshots = futures::future::join_all(worktree_snapshots).await; - let mut unsaved_buffers = Vec::new(); - cx.update(|app_cx| { - let buffer_store = project.read(app_cx).buffer_store(); - for buffer_handle in buffer_store.read(app_cx).buffers() { - let buffer = buffer_handle.read(app_cx); - if buffer.is_dirty() - && let Some(file) = buffer.file() - { - let path = file.path().to_string_lossy().to_string(); - unsaved_buffers.push(path); - } - } - }) - .ok(); - Arc::new(ProjectSnapshot { worktree_snapshots, - unsaved_buffer_paths: unsaved_buffers, timestamp: Utc::now(), }) }) @@ -914,7 +902,7 @@ impl Thread { // Get worktree path and snapshot let worktree_info = cx.update(|app_cx| { let worktree = worktree.read(app_cx); - let path = worktree.abs_path().to_string_lossy().to_string(); + let path = worktree.abs_path().to_string_lossy().into_owned(); let snapshot = worktree.snapshot(); (path, snapshot) }); @@ -1265,12 +1253,12 @@ impl Thread { ); log::debug!("Calling model.stream_completion, attempt {}", attempt); - let mut events = model - .stream_completion(request, cx) - .await - .map_err(|error| anyhow!(error))?; + + let (mut events, mut error) = match model.stream_completion(request, cx).await { + Ok(events) => (events, None), + Err(err) => (stream::empty().boxed(), Some(err)), + }; let mut tool_results = FuturesUnordered::new(); - let mut error = None; while let Some(event) = events.next().await { log::trace!("Received completion event: {:?}", event); match event { @@ -1318,8 +1306,10 @@ impl Thread { if let Some(error) = error { attempt += 1; - let retry = - this.update(cx, |this, _| this.handle_completion_error(error, attempt))??; + let retry = this.update(cx, |this, cx| { + let user_store = this.user_store.read(cx); + this.handle_completion_error(error, attempt, user_store.plan()) + })??; let timer = cx.background_executor().timer(retry.duration); event_stream.send_retry(retry); timer.await; @@ -1346,8 +1336,23 @@ impl Thread { &mut self, error: LanguageModelCompletionError, attempt: u8, + plan: Option, ) -> Result { - if self.completion_mode == CompletionMode::Normal { + let Some(model) = self.model.as_ref() else { + return Err(anyhow!(error)); + }; + + let auto_retry = if model.provider_id() == ZED_CLOUD_PROVIDER_ID { + match plan { + Some(Plan::V2(_)) => true, + Some(Plan::V1(_)) => self.completion_mode == CompletionMode::Burn, + None => false, + } + } else { + true + }; + + if !auto_retry { return Err(anyhow!(error)); } @@ -2477,8 +2482,11 @@ impl ToolCallEventStream { "always_allow" => { if let Some(fs) = fs.clone() { cx.update(|cx| { - update_settings_file::(fs, cx, |settings, _| { - settings.set_always_allow_tool_actions(true); + update_settings_file(fs, cx, |settings, _| { + settings + .agent + .get_or_insert_default() + .set_always_allow_tool_actions(true); }); })?; } diff --git a/crates/agent2/src/tools/copy_path_tool.rs b/crates/agent2/src/tools/copy_path_tool.rs index 8fcd80391f828c7503701a86e9e1b400115763d6..236978c78f0c2fee7ecf611486349bab094b3cec 100644 --- a/crates/agent2/src/tools/copy_path_tool.rs +++ b/crates/agent2/src/tools/copy_path_tool.rs @@ -9,14 +9,14 @@ use std::sync::Arc; use util::markdown::MarkdownInlineCode; /// Copies a file or directory in the project, and returns confirmation that the copy succeeded. -/// Directory contents will be copied recursively (like `cp -r`). +/// Directory contents will be copied recursively. /// /// This tool should be used when it's desirable to create a copy of a file or directory without modifying the original. /// It's much more efficient than doing this by separately reading and then writing the file or directory's contents, so this tool should be preferred over that approach whenever copying is the goal. #[derive(Debug, Serialize, Deserialize, JsonSchema)] pub struct CopyPathToolInput { /// The source path of the file or directory to copy. - /// If a directory is specified, its contents will be copied recursively (like `cp -r`). + /// If a directory is specified, its contents will be copied recursively. /// /// /// If the project has the following files: @@ -84,9 +84,7 @@ impl AgentTool for CopyPathTool { .and_then(|project_path| project.entry_for_path(&project_path, cx)) { Some(entity) => match project.find_project_path(&input.destination_path, cx) { - Some(project_path) => { - project.copy_entry(entity.id, None, project_path.path, cx) - } + Some(project_path) => project.copy_entry(entity.id, project_path, cx), None => Task::ready(Err(anyhow!( "Destination path {} was outside the project.", input.destination_path diff --git a/crates/agent2/src/tools/create_directory_tool.rs b/crates/agent2/src/tools/create_directory_tool.rs index 30bd6418db35182358ed6139a9078e40a29dfac5..b6240e99cf4dd6698bf9f46edd8d4681247d8f64 100644 --- a/crates/agent2/src/tools/create_directory_tool.rs +++ b/crates/agent2/src/tools/create_directory_tool.rs @@ -11,7 +11,7 @@ use crate::{AgentTool, ToolCallEventStream}; /// Creates a new directory at the specified path within the project. Returns confirmation that the directory was created. /// -/// This tool creates a directory and all necessary parent directories (similar to `mkdir -p`). It should be used whenever you need to create new directories within the project. +/// This tool creates a directory and all necessary parent directories. It should be used whenever you need to create new directories within the project. #[derive(Debug, Serialize, Deserialize, JsonSchema)] pub struct CreateDirectoryToolInput { /// The path of the new directory. diff --git a/crates/agent2/src/tools/diagnostics_tool.rs b/crates/agent2/src/tools/diagnostics_tool.rs index a38e317d43cb16d8ee652f1a5f7aabd8b1ce4c8f..f07ec4cfe6903ec454eb39a7afc7748327e026ec 100644 --- a/crates/agent2/src/tools/diagnostics_tool.rs +++ b/crates/agent2/src/tools/diagnostics_tool.rs @@ -6,7 +6,7 @@ use language::{DiagnosticSeverity, OffsetRangeExt}; use project::Project; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::{fmt::Write, path::Path, sync::Arc}; +use std::{fmt::Write, sync::Arc}; use ui::SharedString; use util::markdown::MarkdownInlineCode; @@ -147,9 +147,7 @@ impl AgentTool for DiagnosticsTool { has_diagnostics = true; output.push_str(&format!( "{}: {} error(s), {} warning(s)\n", - Path::new(worktree.read(cx).root_name()) - .join(project_path.path) - .display(), + worktree.read(cx).absolutize(&project_path.path).display(), summary.error_count, summary.warning_count )); diff --git a/crates/agent2/src/tools/edit_file_tool.rs b/crates/agent2/src/tools/edit_file_tool.rs index 1e725b8f59d1219a0761334c5364940ee0e8bf6a..7c51df0fae274e2d5906aa73e70c30105b1a2353 100644 --- a/crates/agent2/src/tools/edit_file_tool.rs +++ b/crates/agent2/src/tools/edit_file_tool.rs @@ -17,10 +17,12 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::Settings; use smol::stream::StreamExt as _; +use std::ffi::OsStr; use std::path::{Path, PathBuf}; use std::sync::Arc; use ui::SharedString; use util::ResultExt; +use util::rel_path::RelPath; const DEFAULT_UI_TEXT: &str = "Editing file"; @@ -148,12 +150,11 @@ impl EditFileTool { // If any path component matches the local settings folder, then this could affect // the editor in ways beyond the project source, so prompt. - let local_settings_folder = paths::local_settings_folder_relative_path(); + let local_settings_folder = paths::local_settings_folder_name(); let path = Path::new(&input.path); - if path - .components() - .any(|component| component.as_os_str() == local_settings_folder.as_os_str()) - { + if path.components().any(|component| { + component.as_os_str() == <_ as AsRef>::as_ref(&local_settings_folder) + }) { return event_stream.authorize( format!("{} (local settings)", input.display_description), cx, @@ -162,6 +163,7 @@ impl EditFileTool { // It's also possible that the global config dir is configured to be inside the project, // so check for that edge case too. + // TODO this is broken when remoting if let Ok(canonical_path) = std::fs::canonicalize(&input.path) && canonical_path.starts_with(paths::config_dir()) { @@ -216,9 +218,7 @@ impl AgentTool for EditFileTool { .read(cx) .short_full_path_for_project_path(&project_path, cx) }) - .unwrap_or(Path::new(&input.path).into()) - .to_string_lossy() - .to_string() + .unwrap_or(input.path.to_string_lossy().into_owned()) .into(), Err(raw_input) => { if let Some(input) = @@ -235,9 +235,7 @@ impl AgentTool for EditFileTool { .read(cx) .short_full_path_for_project_path(&project_path, cx) }) - .unwrap_or(Path::new(&input.path).into()) - .to_string_lossy() - .to_string() + .unwrap_or(input.path) .into(); } @@ -478,7 +476,7 @@ impl AgentTool for EditFileTool { ) -> Result<()> { event_stream.update_diff(cx.new(|cx| { Diff::finalized( - output.input_path, + output.input_path.to_string_lossy().into_owned(), Some(output.old_text.to_string()), output.new_text, self.language_registry.clone(), @@ -542,10 +540,12 @@ fn resolve_path( let file_name = input .path .file_name() + .and_then(|file_name| file_name.to_str()) + .and_then(|file_name| RelPath::unix(file_name).ok()) .context("Can't create file: invalid filename")?; let new_file_path = parent_project_path.map(|parent| ProjectPath { - path: Arc::from(parent.path.join(file_name)), + path: parent.path.join(file_name), ..parent }); @@ -565,7 +565,7 @@ mod tests { use prompt_store::ProjectContext; use serde_json::json; use settings::SettingsStore; - use util::path; + use util::{path, rel_path::rel_path}; #[gpui::test] async fn test_edit_nonexistent_file(cx: &mut TestAppContext) { @@ -614,13 +614,13 @@ mod tests { let mode = &EditFileMode::Create; let result = test_resolve_path(mode, "root/new.txt", cx); - assert_resolved_path_eq(result.await, "new.txt"); + assert_resolved_path_eq(result.await, rel_path("new.txt")); let result = test_resolve_path(mode, "new.txt", cx); - assert_resolved_path_eq(result.await, "new.txt"); + assert_resolved_path_eq(result.await, rel_path("new.txt")); let result = test_resolve_path(mode, "dir/new.txt", cx); - assert_resolved_path_eq(result.await, "dir/new.txt"); + assert_resolved_path_eq(result.await, rel_path("dir/new.txt")); let result = test_resolve_path(mode, "root/dir/subdir/existing.txt", cx); assert_eq!( @@ -642,10 +642,10 @@ mod tests { let path_with_root = "root/dir/subdir/existing.txt"; let path_without_root = "dir/subdir/existing.txt"; let result = test_resolve_path(mode, path_with_root, cx); - assert_resolved_path_eq(result.await, path_without_root); + assert_resolved_path_eq(result.await, rel_path(path_without_root)); let result = test_resolve_path(mode, path_without_root, cx); - assert_resolved_path_eq(result.await, path_without_root); + assert_resolved_path_eq(result.await, rel_path(path_without_root)); let result = test_resolve_path(mode, "root/nonexistent.txt", cx); assert_eq!( @@ -690,14 +690,10 @@ mod tests { cx.update(|cx| resolve_path(&input, project, cx)) } - fn assert_resolved_path_eq(path: anyhow::Result, expected: &str) { - let actual = path - .expect("Should return valid path") - .path - .to_str() - .unwrap() - .replace("\\", "/"); // Naive Windows paths normalization - assert_eq!(actual, expected); + #[track_caller] + fn assert_resolved_path_eq(path: anyhow::Result, expected: &RelPath) { + let actual = path.expect("Should return valid path").path; + assert_eq!(actual.as_ref(), expected); } #[gpui::test] @@ -791,14 +787,11 @@ mod tests { // First, test with format_on_save enabled cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::( - cx, - |settings| { - settings.defaults.format_on_save = Some(FormatOnSave::On); - settings.defaults.formatter = - Some(language::language_settings::SelectedFormatter::Auto); - }, - ); + store.update_user_settings(cx, |settings| { + settings.project.all_languages.defaults.format_on_save = Some(FormatOnSave::On); + settings.project.all_languages.defaults.formatter = + Some(language::language_settings::SelectedFormatter::Auto); + }); }); }); @@ -853,12 +846,10 @@ mod tests { // Next, test with format_on_save disabled cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::( - cx, - |settings| { - settings.defaults.format_on_save = Some(FormatOnSave::Off); - }, - ); + store.update_user_settings(cx, |settings| { + settings.project.all_languages.defaults.format_on_save = + Some(FormatOnSave::Off); + }); }); }); @@ -935,12 +926,13 @@ mod tests { // First, test with remove_trailing_whitespace_on_save enabled cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::( - cx, - |settings| { - settings.defaults.remove_trailing_whitespace_on_save = Some(true); - }, - ); + store.update_user_settings(cx, |settings| { + settings + .project + .all_languages + .defaults + .remove_trailing_whitespace_on_save = Some(true); + }); }); }); @@ -991,12 +983,13 @@ mod tests { // Next, test with remove_trailing_whitespace_on_save disabled cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::( - cx, - |settings| { - settings.defaults.remove_trailing_whitespace_on_save = Some(false); - }, - ); + store.update_user_settings(cx, |settings| { + settings + .project + .all_languages + .defaults + .remove_trailing_whitespace_on_save = Some(false); + }); }); }); @@ -1411,8 +1404,8 @@ mod tests { // Parent directory references - find_project_path resolves these ( "project/../other", - false, - "Path with .. is resolved by find_project_path", + true, + "Path with .. that goes outside of root directory", ), ( "project/./src/file.rs", @@ -1440,16 +1433,18 @@ mod tests { ) }); + cx.run_until_parked(); + if should_confirm { stream_rx.expect_authorization().await; } else { - auth.await.unwrap(); assert!( stream_rx.try_next().is_err(), "Failed for case: {} - path: {} - expected no confirmation but got one", description, path ); + auth.await.unwrap(); } } } diff --git a/crates/agent2/src/tools/find_path_tool.rs b/crates/agent2/src/tools/find_path_tool.rs index b8b60f79f4cf9808a730b0c6428885b23b32d998..59f203cec98a17fda9e46f6fc222f3157d125060 100644 --- a/crates/agent2/src/tools/find_path_tool.rs +++ b/crates/agent2/src/tools/find_path_tool.rs @@ -156,10 +156,14 @@ impl AgentTool for FindPathTool { } fn search_paths(glob: &str, project: Entity, cx: &mut App) -> Task>> { - let path_matcher = match PathMatcher::new([ - // Sometimes models try to search for "". In this case, return all paths in the project. - if glob.is_empty() { "*" } else { glob }, - ]) { + let path_style = project.read(cx).path_style(cx); + let path_matcher = match PathMatcher::new( + [ + // Sometimes models try to search for "". In this case, return all paths in the project. + if glob.is_empty() { "*" } else { glob }, + ], + path_style, + ) { Ok(matcher) => matcher, Err(err) => return Task::ready(Err(anyhow!("Invalid glob: {err}"))), }; @@ -173,9 +177,8 @@ fn search_paths(glob: &str, project: Entity, cx: &mut App) -> Task>(), + path_style, ) { Ok(matcher) => matcher, Err(error) => { @@ -132,7 +135,7 @@ impl AgentTool for GrepTool { .iter() .chain(global_settings.private_files.sources().iter()); - match PathMatcher::new(exclude_patterns) { + match PathMatcher::new(exclude_patterns, path_style) { Ok(matcher) => matcher, Err(error) => { return Task::ready(Err(anyhow!("invalid exclude pattern: {error}"))); @@ -308,7 +311,7 @@ mod tests { use super::*; use gpui::{TestAppContext, UpdateGlobal}; use language::{Language, LanguageConfig, LanguageMatcher}; - use project::{FakeFs, Project, WorktreeSettings}; + use project::{FakeFs, Project}; use serde_json::json; use settings::SettingsStore; use unindent::Unindent; @@ -827,19 +830,21 @@ mod tests { cx.update(|cx| { use gpui::UpdateGlobal; - use project::WorktreeSettings; use settings::SettingsStore; SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = Some(vec![ + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![ "**/.secretdir".to_string(), "**/.mymetadata".to_string(), ]); - settings.private_files = Some(vec![ - "**/.mysecrets".to_string(), - "**/*.privatekey".to_string(), - "**/*.mysensitive".to_string(), - ]); + settings.project.worktree.private_files = Some( + vec![ + "**/.mysecrets".to_string(), + "**/*.privatekey".to_string(), + "**/*.mysensitive".to_string(), + ] + .into(), + ); }); }); }); @@ -1062,10 +1067,11 @@ mod tests { // Set global settings cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/.git".to_string(), "**/node_modules".to_string()]); - settings.private_files = Some(vec!["**/.env".to_string()]); + settings.project.worktree.private_files = + Some(vec!["**/.env".to_string()].into()); }); }); }); diff --git a/crates/agent2/src/tools/list_directory_tool.rs b/crates/agent2/src/tools/list_directory_tool.rs index 0fbe23fe205e6a9bd5a77e737460c17b997f9175..cd8b46ddebc2d9ffb953f8aabef10c30a33dde37 100644 --- a/crates/agent2/src/tools/list_directory_tool.rs +++ b/crates/agent2/src/tools/list_directory_tool.rs @@ -2,12 +2,12 @@ use crate::{AgentTool, ToolCallEventStream}; use agent_client_protocol::ToolKind; use anyhow::{Result, anyhow}; use gpui::{App, Entity, SharedString, Task}; -use project::{Project, WorktreeSettings}; +use project::{Project, ProjectPath, WorktreeSettings}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::Settings; use std::fmt::Write; -use std::{path::Path, sync::Arc}; +use std::sync::Arc; use util::markdown::MarkdownInlineCode; /// Lists files and directories in a given path. Prefer the `grep` or `find_path` tools when searching the codebase. @@ -86,13 +86,13 @@ impl AgentTool for ListDirectoryTool { .read(cx) .worktrees(cx) .filter_map(|worktree| { - worktree.read(cx).root_entry().and_then(|entry| { - if entry.is_dir() { - entry.path.to_str() - } else { - None - } - }) + let worktree = worktree.read(cx); + let root_entry = worktree.root_entry()?; + if root_entry.is_dir() { + Some(root_entry.path.display(worktree.path_style())) + } else { + None + } }) .collect::>() .join("\n"); @@ -143,7 +143,7 @@ impl AgentTool for ListDirectoryTool { } let worktree_snapshot = worktree.read(cx).snapshot(); - let worktree_root_name = worktree.read(cx).root_name().to_string(); + let worktree_root_name = worktree.read(cx).root_name(); let Some(entry) = worktree_snapshot.entry_for_path(&project_path.path) else { return Task::ready(Err(anyhow!("Path not found: {}", input.path))); @@ -165,25 +165,17 @@ impl AgentTool for ListDirectoryTool { continue; } - if self - .project - .read(cx) - .find_project_path(&entry.path, cx) - .map(|project_path| { - let worktree_settings = WorktreeSettings::get(Some((&project_path).into()), cx); - - worktree_settings.is_path_excluded(&project_path.path) - || worktree_settings.is_path_private(&project_path.path) - }) - .unwrap_or(false) + let project_path: ProjectPath = (worktree_snapshot.id(), entry.path.clone()).into(); + if worktree_settings.is_path_excluded(&project_path.path) + || worktree_settings.is_path_private(&project_path.path) { continue; } - let full_path = Path::new(&worktree_root_name) + let full_path = worktree_root_name .join(&entry.path) - .display() - .to_string(); + .display(worktree_snapshot.path_style()) + .into_owned(); if entry.is_dir() { folders.push(full_path); } else { @@ -214,7 +206,7 @@ mod tests { use super::*; use gpui::{TestAppContext, UpdateGlobal}; use indoc::indoc; - use project::{FakeFs, Project, WorktreeSettings}; + use project::{FakeFs, Project}; use serde_json::json; use settings::SettingsStore; use util::path; @@ -421,17 +413,20 @@ mod tests { // Configure settings explicitly cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = Some(vec![ + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![ "**/.secretdir".to_string(), "**/.mymetadata".to_string(), "**/.hidden_subdir".to_string(), ]); - settings.private_files = Some(vec![ - "**/.mysecrets".to_string(), - "**/*.privatekey".to_string(), - "**/*.mysensitive".to_string(), - ]); + settings.project.worktree.private_files = Some( + vec![ + "**/.mysecrets".to_string(), + "**/*.privatekey".to_string(), + "**/*.mysensitive".to_string(), + ] + .into(), + ); }); }); }); @@ -565,10 +560,11 @@ mod tests { // Set global settings cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/.git".to_string(), "**/node_modules".to_string()]); - settings.private_files = Some(vec!["**/.env".to_string()]); + settings.project.worktree.private_files = + Some(vec!["**/.env".to_string()].into()); }); }); }); diff --git a/crates/agent2/src/tools/move_path_tool.rs b/crates/agent2/src/tools/move_path_tool.rs index 91880c1243e0aa48569ab8e6981ddd45b41ab411..ae58145126f6356beaa1457d719812bb56d6e7db 100644 --- a/crates/agent2/src/tools/move_path_tool.rs +++ b/crates/agent2/src/tools/move_path_tool.rs @@ -98,7 +98,7 @@ impl AgentTool for MovePathTool { .and_then(|project_path| project.entry_for_path(&project_path, cx)) { Some(entity) => match project.find_project_path(&input.destination_path, cx) { - Some(project_path) => project.rename_entry(entity.id, project_path.path, cx), + Some(project_path) => project.rename_entry(entity.id, project_path, cx), None => Task::ready(Err(anyhow!( "Destination path {} was outside the project.", input.destination_path diff --git a/crates/agent2/src/tools/open_tool.rs b/crates/agent2/src/tools/open_tool.rs index 595a9f380b752635f97ef5d1819a1140c1db8be0..b98ae9af3bd98cd44bc9348e72519ceea53c6292 100644 --- a/crates/agent2/src/tools/open_tool.rs +++ b/crates/agent2/src/tools/open_tool.rs @@ -104,7 +104,7 @@ mod tests { async fn test_to_absolute_path(cx: &mut TestAppContext) { init_test(cx); let temp_dir = TempDir::new().expect("Failed to create temp directory"); - let temp_path = temp_dir.path().to_string_lossy().to_string(); + let temp_path = temp_dir.path().to_string_lossy().into_owned(); let fs = FakeFs::new(cx.executor()); fs.insert_tree( diff --git a/crates/agent2/src/tools/read_file_tool.rs b/crates/agent2/src/tools/read_file_tool.rs index 87163e769c26b0cee053fcf149d047fc451c470f..ce8dcba10236aa194e8b30d3fe6855d8c5fa5148 100644 --- a/crates/agent2/src/tools/read_file_tool.rs +++ b/crates/agent2/src/tools/read_file_tool.rs @@ -82,12 +82,12 @@ impl AgentTool for ReadFileTool { { match (input.start_line, input.end_line) { (Some(start), Some(end)) => { - format!("Read file `{}` (lines {}-{})", path.display(), start, end,) + format!("Read file `{path}` (lines {}-{})", start, end,) } (Some(start), None) => { - format!("Read file `{}` (from line {})", path.display(), start) + format!("Read file `{path}` (from line {})", start) } - _ => format!("Read file `{}`", path.display()), + _ => format!("Read file `{path}`"), } .into() } else { @@ -201,7 +201,6 @@ impl AgentTool for ReadFileTool { // Check if specific line ranges are provided let result = if input.start_line.is_some() || input.end_line.is_some() { let result = buffer.read_with(cx, |buffer, _cx| { - let text = buffer.text(); // .max(1) because despite instructions to be 1-indexed, sometimes the model passes 0. let start = input.start_line.unwrap_or(1).max(1); let start_row = start - 1; @@ -210,13 +209,13 @@ impl AgentTool for ReadFileTool { anchor = Some(buffer.anchor_before(Point::new(start_row, column))); } - let lines = text.split('\n').skip(start_row as usize); - if let Some(end) = input.end_line { - let count = end.saturating_sub(start).saturating_add(1); // Ensure at least 1 line - itertools::intersperse(lines.take(count as usize), "\n").collect::() - } else { - itertools::intersperse(lines, "\n").collect::() + let mut end_row = input.end_line.unwrap_or(u32::MAX); + if end_row <= start_row { + end_row = start_row + 1; // read at least one lines } + let start = buffer.anchor_before(Point::new(start_row, 0)); + let end = buffer.anchor_before(Point::new(end_row, 0)); + buffer.text_for_range(start..end).collect::() })?; action_log.update(cx, |log, cx| { @@ -226,9 +225,12 @@ impl AgentTool for ReadFileTool { Ok(result.into()) } else { // No line ranges specified, so check file size to see if it's too big. - let buffer_content = - outline::get_buffer_content_or_outline(buffer.clone(), Some(&abs_path), cx) - .await?; + let buffer_content = outline::get_buffer_content_or_outline( + buffer.clone(), + Some(&abs_path.to_string_lossy()), + cx, + ) + .await?; action_log.update(cx, |log, cx| { log.buffer_read(buffer.clone(), cx); @@ -445,7 +447,7 @@ mod test { tool.run(input, ToolCallEventStream::test().0, cx) }) .await; - assert_eq!(result.unwrap(), "Line 2\nLine 3\nLine 4".into()); + assert_eq!(result.unwrap(), "Line 2\nLine 3\nLine 4\n".into()); } #[gpui::test] @@ -475,7 +477,7 @@ mod test { tool.clone().run(input, ToolCallEventStream::test().0, cx) }) .await; - assert_eq!(result.unwrap(), "Line 1\nLine 2".into()); + assert_eq!(result.unwrap(), "Line 1\nLine 2\n".into()); // end_line of 0 should result in at least 1 line let result = cx @@ -488,7 +490,7 @@ mod test { tool.clone().run(input, ToolCallEventStream::test().0, cx) }) .await; - assert_eq!(result.unwrap(), "Line 1".into()); + assert_eq!(result.unwrap(), "Line 1\n".into()); // when start_line > end_line, should still return at least 1 line let result = cx @@ -501,7 +503,7 @@ mod test { tool.clone().run(input, ToolCallEventStream::test().0, cx) }) .await; - assert_eq!(result.unwrap(), "Line 3".into()); + assert_eq!(result.unwrap(), "Line 3\n".into()); } fn init_test(cx: &mut TestAppContext) { @@ -587,19 +589,21 @@ mod test { cx.update(|cx| { use gpui::UpdateGlobal; - use project::WorktreeSettings; use settings::SettingsStore; SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = Some(vec![ + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![ "**/.secretdir".to_string(), "**/.mymetadata".to_string(), ]); - settings.private_files = Some(vec![ - "**/.mysecrets".to_string(), - "**/*.privatekey".to_string(), - "**/*.mysensitive".to_string(), - ]); + settings.project.worktree.private_files = Some( + vec![ + "**/.mysecrets".to_string(), + "**/*.privatekey".to_string(), + "**/*.mysensitive".to_string(), + ] + .into(), + ); }); }); }); @@ -803,10 +807,11 @@ mod test { // Set global settings cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/.git".to_string(), "**/node_modules".to_string()]); - settings.private_files = Some(vec!["**/.env".to_string()]); + settings.project.worktree.private_files = + Some(vec!["**/.env".to_string()].into()); }); }); }); diff --git a/crates/agent2/src/tools/terminal_tool.rs b/crates/agent2/src/tools/terminal_tool.rs index 7acfc2455093eac0f3d15e840abce47f38a6c8b0..6d30c19152001deaef5deeacbdf266e28ac03d08 100644 --- a/crates/agent2/src/tools/terminal_tool.rs +++ b/crates/agent2/src/tools/terminal_tool.rs @@ -82,7 +82,7 @@ impl AgentTool for TerminalTool { .into(), } } else { - "Run terminal command".into() + "".into() } } diff --git a/crates/agent_servers/Cargo.toml b/crates/agent_servers/Cargo.toml index bb3fe6ff9078535b500e28f4beeab957929546a5..bdf1b72fdc0c2c71d5e445633d1d4a8ce32a6ba4 100644 --- a/crates/agent_servers/Cargo.toml +++ b/crates/agent_servers/Cargo.toml @@ -23,6 +23,7 @@ action_log.workspace = true agent-client-protocol.workspace = true agent_settings.workspace = true anyhow.workspace = true +async-trait.workspace = true client.workspace = true collections.workspace = true env_logger = { workspace = true, optional = true } @@ -30,6 +31,7 @@ fs.workspace = true futures.workspace = true gpui.workspace = true gpui_tokio = { workspace = true, optional = true } +http_client.workspace = true indoc.workspace = true language.workspace = true language_model.workspace = true @@ -45,6 +47,8 @@ task.workspace = true tempfile.workspace = true thiserror.workspace = true ui.workspace = true +terminal.workspace = true +uuid.workspace = true util.workspace = true watch.workspace = true workspace-hack.workspace = true diff --git a/crates/agent_servers/src/acp.rs b/crates/agent_servers/src/acp.rs index cc897d85e7b4de149a0dca84df84d2b8c2c5bc98..57ddfcf9dc9d635e33f252e6b6f35f015581cfc4 100644 --- a/crates/agent_servers/src/acp.rs +++ b/crates/agent_servers/src/acp.rs @@ -9,17 +9,20 @@ use futures::io::BufReader; use project::Project; use project::agent_server_store::AgentServerCommand; use serde::Deserialize; +use task::Shell; use util::ResultExt as _; use std::path::PathBuf; use std::{any::Any, cell::RefCell}; -use std::{path::Path, rc::Rc, sync::Arc}; +use std::{path::Path, rc::Rc}; use thiserror::Error; use anyhow::{Context as _, Result}; use gpui::{App, AppContext as _, AsyncApp, Entity, SharedString, Task, WeakEntity}; -use acp_thread::{AcpThread, AuthRequired, LoadError}; +use acp_thread::{AcpThread, AuthRequired, LoadError, TerminalProviderEvent}; +use terminal::TerminalBuilder; +use terminal::terminal_settings::{AlternateScroll, CursorShape}; #[derive(Debug, Error)] #[error("Unsupported version")] @@ -44,6 +47,7 @@ pub struct AcpConnection { pub struct AcpSession { thread: WeakEntity, suppress_abort_err: bool, + models: Option>>, session_modes: Option>>, } @@ -78,7 +82,7 @@ impl AcpConnection { is_remote: bool, cx: &mut AsyncApp, ) -> Result { - let mut child = util::command::new_smol_command(command.path); + let mut child = util::command::new_smol_command(&command.path); child .args(command.args.iter().map(|arg| arg.as_str())) .envs(command.env.iter().flatten()) @@ -93,6 +97,11 @@ impl AcpConnection { let stdout = child.stdout.take().context("Failed to take stdout")?; let stdin = child.stdin.take().context("Failed to take stdin")?; let stderr = child.stderr.take().context("Failed to take stderr")?; + log::info!( + "Spawning external agent server: {:?}, {:?}", + command.path, + command.args + ); log::trace!("Spawned (pid: {})", child.id()); let sessions = Rc::new(RefCell::new(HashMap::default())); @@ -264,6 +273,7 @@ impl AgentConnection for AcpConnection { })?; let modes = response.modes.map(|modes| Rc::new(RefCell::new(modes))); + let models = response.models.map(|models| Rc::new(RefCell::new(models))); if let Some(default_mode) = default_mode { if let Some(modes) = modes.as_ref() { @@ -326,10 +336,12 @@ impl AgentConnection for AcpConnection { ) })?; + let session = AcpSession { thread: thread.downgrade(), suppress_abort_err: false, - session_modes: modes + session_modes: modes, + models, }; sessions.borrow_mut().insert(session_id, session); @@ -376,6 +388,10 @@ impl AgentConnection for AcpConnection { match result { Ok(response) => Ok(response), Err(err) => { + if err.code == acp::ErrorCode::AUTH_REQUIRED.code { + return Err(anyhow!(acp::Error::auth_required())); + } + if err.code != ErrorCode::INTERNAL_ERROR.code { anyhow::bail!(err) } @@ -450,6 +466,27 @@ impl AgentConnection for AcpConnection { } } + fn model_selector( + &self, + session_id: &acp::SessionId, + ) -> Option> { + let sessions = self.sessions.clone(); + let sessions_ref = sessions.borrow(); + let Some(session) = sessions_ref.get(session_id) else { + return None; + }; + + if let Some(models) = session.models.as_ref() { + Some(Rc::new(AcpModelSelector::new( + session_id.clone(), + self.connection.clone(), + models.clone(), + )) as _) + } else { + None + } + } + fn into_any(self: Rc) -> Rc { self } @@ -500,11 +537,88 @@ impl acp_thread::AgentSessionModes for AcpSessionModes { } } +struct AcpModelSelector { + session_id: acp::SessionId, + connection: Rc, + state: Rc>, +} + +impl AcpModelSelector { + fn new( + session_id: acp::SessionId, + connection: Rc, + state: Rc>, + ) -> Self { + Self { + session_id, + connection, + state, + } + } +} + +impl acp_thread::AgentModelSelector for AcpModelSelector { + fn list_models(&self, _cx: &mut App) -> Task> { + Task::ready(Ok(acp_thread::AgentModelList::Flat( + self.state + .borrow() + .available_models + .clone() + .into_iter() + .map(acp_thread::AgentModelInfo::from) + .collect(), + ))) + } + + fn select_model(&self, model_id: acp::ModelId, cx: &mut App) -> Task> { + let connection = self.connection.clone(); + let session_id = self.session_id.clone(); + let old_model_id; + { + let mut state = self.state.borrow_mut(); + old_model_id = state.current_model_id.clone(); + state.current_model_id = model_id.clone(); + }; + let state = self.state.clone(); + cx.foreground_executor().spawn(async move { + let result = connection + .set_session_model(acp::SetSessionModelRequest { + session_id, + model_id, + meta: None, + }) + .await; + + if result.is_err() { + state.borrow_mut().current_model_id = old_model_id; + } + + result?; + + Ok(()) + }) + } + + fn selected_model(&self, _cx: &mut App) -> Task> { + let state = self.state.borrow(); + Task::ready( + state + .available_models + .iter() + .find(|m| m.model_id == state.current_model_id) + .cloned() + .map(acp_thread::AgentModelInfo::from) + .ok_or_else(|| anyhow::anyhow!("Model not found")), + ) + } +} + struct ClientDelegate { sessions: Rc>>, cx: AsyncApp, } +#[async_trait::async_trait(?Send)] impl acp::Client for ClientDelegate { async fn request_permission( &self, @@ -594,10 +708,100 @@ impl acp::Client for ClientDelegate { } } + // Clone so we can inspect meta both before and after handing off to the thread + let update_clone = notification.update.clone(); + + // Pre-handle: if a ToolCall carries terminal_info, create/register a display-only terminal. + if let acp::SessionUpdate::ToolCall(tc) = &update_clone { + if let Some(meta) = &tc.meta { + if let Some(terminal_info) = meta.get("terminal_info") { + if let Some(id_str) = terminal_info.get("terminal_id").and_then(|v| v.as_str()) + { + let terminal_id = acp::TerminalId(id_str.into()); + let cwd = terminal_info + .get("cwd") + .and_then(|v| v.as_str().map(PathBuf::from)); + + // Create a minimal display-only lower-level terminal and register it. + let _ = session.thread.update(&mut self.cx.clone(), |thread, cx| { + let builder = TerminalBuilder::new_display_only( + CursorShape::default(), + AlternateScroll::On, + None, + 0, + )?; + let lower = cx.new(|cx| builder.subscribe(cx)); + thread.on_terminal_provider_event( + TerminalProviderEvent::Created { + terminal_id: terminal_id.clone(), + label: tc.title.clone(), + cwd, + output_byte_limit: None, + terminal: lower, + }, + cx, + ); + anyhow::Ok(()) + }); + } + } + } + } + + // Forward the update to the acp_thread as usual. session.thread.update(&mut self.cx.clone(), |thread, cx| { - thread.handle_session_update(notification.update, cx) + thread.handle_session_update(notification.update.clone(), cx) })??; + // Post-handle: stream terminal output/exit if present on ToolCallUpdate meta. + if let acp::SessionUpdate::ToolCallUpdate(tcu) = &update_clone { + if let Some(meta) = &tcu.meta { + if let Some(term_out) = meta.get("terminal_output") { + if let Some(id_str) = term_out.get("terminal_id").and_then(|v| v.as_str()) { + let terminal_id = acp::TerminalId(id_str.into()); + if let Some(s) = term_out.get("data").and_then(|v| v.as_str()) { + let data = s.as_bytes().to_vec(); + let _ = session.thread.update(&mut self.cx.clone(), |thread, cx| { + thread.on_terminal_provider_event( + TerminalProviderEvent::Output { + terminal_id: terminal_id.clone(), + data, + }, + cx, + ); + }); + } + } + } + + // terminal_exit + if let Some(term_exit) = meta.get("terminal_exit") { + if let Some(id_str) = term_exit.get("terminal_id").and_then(|v| v.as_str()) { + let terminal_id = acp::TerminalId(id_str.into()); + let status = acp::TerminalExitStatus { + exit_code: term_exit + .get("exit_code") + .and_then(|v| v.as_u64()) + .map(|i| i as u32), + signal: term_exit + .get("signal") + .and_then(|v| v.as_str().map(|s| s.to_string())), + meta: None, + }; + let _ = session.thread.update(&mut self.cx.clone(), |thread, cx| { + thread.on_terminal_provider_event( + TerminalProviderEvent::Exit { + terminal_id: terminal_id.clone(), + status, + }, + cx, + ); + }); + } + } + } + } + Ok(()) } @@ -605,25 +809,68 @@ impl acp::Client for ClientDelegate { &self, args: acp::CreateTerminalRequest, ) -> Result { - let terminal = self - .session_thread(&args.session_id)? - .update(&mut self.cx.clone(), |thread, cx| { - thread.create_terminal( - args.command, - args.args, - args.env, - args.cwd, - args.output_byte_limit, + let thread = self.session_thread(&args.session_id)?; + let project = thread.read_with(&self.cx, |thread, _cx| thread.project().clone())?; + + let mut env = if let Some(dir) = &args.cwd { + project + .update(&mut self.cx.clone(), |project, cx| { + project.directory_environment(&task::Shell::System, dir.clone().into(), cx) + })? + .await + .unwrap_or_default() + } else { + Default::default() + }; + for var in args.env { + env.insert(var.name, var.value); + } + + // Use remote shell or default system shell, as appropriate + let shell = project + .update(&mut self.cx.clone(), |project, cx| { + project + .remote_client() + .and_then(|r| r.read(cx).default_system_shell()) + .map(Shell::Program) + })? + .unwrap_or(task::Shell::System); + let (task_command, task_args) = task::ShellBuilder::new(&shell) + .redirect_stdin_to_dev_null() + .build(Some(args.command.clone()), &args.args); + + let terminal_entity = project + .update(&mut self.cx.clone(), |project, cx| { + project.create_terminal_task( + task::SpawnInTerminal { + command: Some(task_command), + args: task_args, + cwd: args.cwd.clone(), + env, + ..Default::default() + }, cx, ) })? .await?; - Ok( - terminal.read_with(&self.cx, |terminal, _| acp::CreateTerminalResponse { - terminal_id: terminal.id().clone(), - meta: None, - })?, - ) + + // Register with renderer + let terminal_entity = thread.update(&mut self.cx.clone(), |thread, cx| { + thread.register_terminal_created( + acp::TerminalId(uuid::Uuid::new_v4().to_string().into()), + format!("{} {}", args.command, args.args.join(" ")), + args.cwd.clone(), + args.output_byte_limit, + terminal_entity, + cx, + ) + })?; + let terminal_id = + terminal_entity.read_with(&self.cx, |terminal, _| terminal.id().clone())?; + Ok(acp::CreateTerminalResponse { + terminal_id, + meta: None, + }) } async fn kill_terminal_command( @@ -638,19 +885,11 @@ impl acp::Client for ClientDelegate { Ok(Default::default()) } - async fn ext_method( - &self, - _name: Arc, - _params: Arc, - ) -> Result, acp::Error> { + async fn ext_method(&self, _args: acp::ExtRequest) -> Result { Err(acp::Error::method_not_found()) } - async fn ext_notification( - &self, - _name: Arc, - _params: Arc, - ) -> Result<(), acp::Error> { + async fn ext_notification(&self, _args: acp::ExtNotification) -> Result<(), acp::Error> { Err(acp::Error::method_not_found()) } diff --git a/crates/agent_servers/src/agent_servers.rs b/crates/agent_servers/src/agent_servers.rs index 2c2900cb79328249355704606652c54d08f072e5..b44c2123fb5052e2487464d813936cd1edf9821a 100644 --- a/crates/agent_servers/src/agent_servers.rs +++ b/crates/agent_servers/src/agent_servers.rs @@ -1,5 +1,6 @@ mod acp; mod claude; +mod codex; mod custom; mod gemini; @@ -7,15 +8,20 @@ mod gemini; pub mod e2e_tests; pub use claude::*; +use client::ProxySettings; +pub use codex::*; +use collections::HashMap; pub use custom::*; use fs::Fs; pub use gemini::*; +use http_client::read_no_proxy_from_env; use project::agent_server_store::AgentServerStore; use acp_thread::AgentConnection; use anyhow::Result; -use gpui::{App, Entity, SharedString, Task}; +use gpui::{App, AppContext, Entity, SharedString, Task}; use project::Project; +use settings::SettingsStore; use std::{any::Any, path::Path, rc::Rc, sync::Arc}; pub use acp::AcpConnection; @@ -77,3 +83,28 @@ impl dyn AgentServer { self.into_any().downcast().ok() } } + +/// Load the default proxy environment variables to pass through to the agent +pub fn load_proxy_env(cx: &mut App) -> HashMap { + let proxy_url = cx + .read_global(|settings: &SettingsStore, _| settings.get::(None).proxy_url()); + let mut env = HashMap::default(); + + if let Some(proxy_url) = &proxy_url { + let env_var = if proxy_url.scheme() == "https" { + "HTTPS_PROXY" + } else { + "HTTP_PROXY" + }; + env.insert(env_var.to_owned(), proxy_url.to_string()); + } + + if let Some(no_proxy) = read_no_proxy_from_env() { + env.insert("NO_PROXY".to_owned(), no_proxy); + } else if proxy_url.is_some() { + // We sometimes need local MCP servers that we don't want to proxy + env.insert("NO_PROXY".to_owned(), "localhost,127.0.0.1".to_owned()); + } + + env +} diff --git a/crates/agent_servers/src/claude.rs b/crates/agent_servers/src/claude.rs index c75c9539abe5fdd03293d98719d4a905b368c4a4..b84a386679cee825be22d895634a6971b537fa89 100644 --- a/crates/agent_servers/src/claude.rs +++ b/crates/agent_servers/src/claude.rs @@ -10,7 +10,7 @@ use anyhow::{Context as _, Result}; use gpui::{App, AppContext as _, SharedString, Task}; use project::agent_server_store::{AllAgentServersSettings, CLAUDE_CODE_NAME}; -use crate::{AgentServer, AgentServerDelegate}; +use crate::{AgentServer, AgentServerDelegate, load_proxy_env}; use acp_thread::AgentConnection; #[derive(Clone)] @@ -45,8 +45,13 @@ impl AgentServer for ClaudeCode { } fn set_default_mode(&self, mode_id: Option, fs: Arc, cx: &mut App) { - update_settings_file::(fs, cx, |settings, _| { - settings.claude.get_or_insert_default().default_mode = mode_id.map(|m| m.to_string()) + update_settings_file(fs, cx, |settings, _| { + settings + .agent_servers + .get_or_insert_default() + .claude + .get_or_insert_default() + .default_mode = mode_id.map(|m| m.to_string()) }); } @@ -57,9 +62,10 @@ impl AgentServer for ClaudeCode { cx: &mut App, ) -> Task, Option)>> { let name = self.name(); - let root_dir = root_dir.map(|root_dir| root_dir.to_string_lossy().to_string()); + let root_dir = root_dir.map(|root_dir| root_dir.to_string_lossy().into_owned()); let is_remote = delegate.project.read(cx).is_via_remote_server(); let store = delegate.store.downgrade(); + let extra_env = load_proxy_env(cx); let default_mode = self.default_mode(cx); cx.spawn(async move |cx| { @@ -70,7 +76,7 @@ impl AgentServer for ClaudeCode { .context("Claude Code is not registered")?; anyhow::Ok(agent.get_command( root_dir.as_deref(), - Default::default(), + extra_env, delegate.status_tx, delegate.new_version_available, &mut cx.to_async(), diff --git a/crates/agent_servers/src/codex.rs b/crates/agent_servers/src/codex.rs new file mode 100644 index 0000000000000000000000000000000000000000..0a19cfd03214972e9c7cd62aee713f3689d525df --- /dev/null +++ b/crates/agent_servers/src/codex.rs @@ -0,0 +1,80 @@ +use std::rc::Rc; +use std::{any::Any, path::Path}; + +use crate::{AgentServer, AgentServerDelegate, load_proxy_env}; +use acp_thread::AgentConnection; +use anyhow::{Context as _, Result}; +use gpui::{App, SharedString, Task}; +use project::agent_server_store::CODEX_NAME; + +#[derive(Clone)] +pub struct Codex; + +#[cfg(test)] +pub(crate) mod tests { + use super::*; + + crate::common_e2e_tests!(async |_, _, _| Codex, allow_option_id = "proceed_once"); +} + +impl AgentServer for Codex { + fn telemetry_id(&self) -> &'static str { + "codex" + } + + fn name(&self) -> SharedString { + "Codex".into() + } + + fn logo(&self) -> ui::IconName { + ui::IconName::AiOpenAi + } + + fn connect( + &self, + root_dir: Option<&Path>, + delegate: AgentServerDelegate, + cx: &mut App, + ) -> Task, Option)>> { + let name = self.name(); + let root_dir = root_dir.map(|root_dir| root_dir.to_string_lossy().into_owned()); + let is_remote = delegate.project.read(cx).is_via_remote_server(); + let store = delegate.store.downgrade(); + let extra_env = load_proxy_env(cx); + let default_mode = self.default_mode(cx); + + cx.spawn(async move |cx| { + let (command, root_dir, login) = store + .update(cx, |store, cx| { + let agent = store + .get_external_agent(&CODEX_NAME.into()) + .context("Codex is not registered")?; + anyhow::Ok(agent.get_command( + root_dir.as_deref(), + extra_env, + delegate.status_tx, + // For now, report that there are no updates. + // (A future PR will use the GitHub Releases API to fetch them.) + delegate.new_version_available, + &mut cx.to_async(), + )) + })?? + .await?; + + let connection = crate::acp::connect( + name, + command, + root_dir.as_ref(), + default_mode, + is_remote, + cx, + ) + .await?; + Ok((connection, login)) + }) + } + + fn into_any(self: Rc) -> Rc { + self + } +} diff --git a/crates/agent_servers/src/custom.rs b/crates/agent_servers/src/custom.rs index f035952a7939201e4b7d990b97e1fc695105d505..406a18965111a44bc4e78469b20aaf199cbda037 100644 --- a/crates/agent_servers/src/custom.rs +++ b/crates/agent_servers/src/custom.rs @@ -1,4 +1,4 @@ -use crate::AgentServerDelegate; +use crate::{AgentServerDelegate, load_proxy_env}; use acp_thread::AgentConnection; use agent_client_protocol as acp; use anyhow::{Context as _, Result}; @@ -49,8 +49,14 @@ impl crate::AgentServer for CustomAgentServer { fn set_default_mode(&self, mode_id: Option, fs: Arc, cx: &mut App) { let name = self.name(); - update_settings_file::(fs, cx, move |settings, _| { - settings.custom.get_mut(&name).unwrap().default_mode = mode_id.map(|m| m.to_string()) + update_settings_file(fs, cx, move |settings, _| { + settings + .agent_servers + .get_or_insert_default() + .custom + .get_mut(&name) + .unwrap() + .default_mode = mode_id.map(|m| m.to_string()) }); } @@ -61,10 +67,11 @@ impl crate::AgentServer for CustomAgentServer { cx: &mut App, ) -> Task, Option)>> { let name = self.name(); - let root_dir = root_dir.map(|root_dir| root_dir.to_string_lossy().to_string()); + let root_dir = root_dir.map(|root_dir| root_dir.to_string_lossy().into_owned()); let is_remote = delegate.project.read(cx).is_via_remote_server(); let default_mode = self.default_mode(cx); let store = delegate.store.downgrade(); + let extra_env = load_proxy_env(cx); cx.spawn(async move |cx| { let (command, root_dir, login) = store @@ -76,7 +83,7 @@ impl crate::AgentServer for CustomAgentServer { })?; anyhow::Ok(agent.get_command( root_dir.as_deref(), - Default::default(), + extra_env, delegate.status_tx, delegate.new_version_available, &mut cx.to_async(), diff --git a/crates/agent_servers/src/e2e_tests.rs b/crates/agent_servers/src/e2e_tests.rs index 1ee2e099f0ae355267b5f0a5aaddb3371f427240..60480caa541ba1c39dba62ed709c157fd67fede0 100644 --- a/crates/agent_servers/src/e2e_tests.rs +++ b/crates/agent_servers/src/e2e_tests.rs @@ -483,6 +483,13 @@ pub async fn init_test(cx: &mut TestAppContext) -> Arc { default_mode: None, }), gemini: Some(crate::gemini::tests::local_command().into()), + codex: Some(BuiltinAgentServerSettings { + path: Some("codex-acp".into()), + args: None, + env: None, + ignore_system_version: None, + default_mode: None, + }), custom: collections::HashMap::default(), }, cx, diff --git a/crates/agent_servers/src/gemini.rs b/crates/agent_servers/src/gemini.rs index 01f15557899e1c7826e91d1555320996eccd0f45..8004f5caec4a7bd2e3e6b1d9a885f4943fa21147 100644 --- a/crates/agent_servers/src/gemini.rs +++ b/crates/agent_servers/src/gemini.rs @@ -1,15 +1,12 @@ use std::rc::Rc; use std::{any::Any, path::Path}; -use crate::{AgentServer, AgentServerDelegate}; +use crate::{AgentServer, AgentServerDelegate, load_proxy_env}; use acp_thread::AgentConnection; use anyhow::{Context as _, Result}; -use client::ProxySettings; -use collections::HashMap; -use gpui::{App, AppContext, SharedString, Task}; +use gpui::{App, SharedString, Task}; use language_models::provider::google::GoogleLanguageModelProvider; use project::agent_server_store::GEMINI_NAME; -use settings::SettingsStore; #[derive(Clone)] pub struct Gemini; @@ -34,20 +31,23 @@ impl AgentServer for Gemini { cx: &mut App, ) -> Task, Option)>> { let name = self.name(); - let root_dir = root_dir.map(|root_dir| root_dir.to_string_lossy().to_string()); + let root_dir = root_dir.map(|root_dir| root_dir.to_string_lossy().into_owned()); let is_remote = delegate.project.read(cx).is_via_remote_server(); let store = delegate.store.downgrade(); - let proxy_url = cx.read_global(|settings: &SettingsStore, _| { - settings.get::(None).proxy.clone() - }); + let mut extra_env = load_proxy_env(cx); let default_mode = self.default_mode(cx); cx.spawn(async move |cx| { - let mut extra_env = HashMap::default(); - if let Some(api_key) = cx.update(GoogleLanguageModelProvider::api_key)?.await.ok() { - extra_env.insert("GEMINI_API_KEY".into(), api_key.key); + extra_env.insert("SURFACE".to_owned(), "zed".to_owned()); + + if let Some(api_key) = cx + .update(GoogleLanguageModelProvider::api_key_for_gemini_cli)? + .await + .ok() + { + extra_env.insert("GEMINI_API_KEY".into(), api_key); } - let (mut command, root_dir, login) = store + let (command, root_dir, login) = store .update(cx, |store, cx| { let agent = store .get_external_agent(&GEMINI_NAME.into()) @@ -62,14 +62,6 @@ impl AgentServer for Gemini { })?? .await?; - // Add proxy flag if proxy settings are configured in Zed and not in the args - if let Some(proxy_url_value) = &proxy_url - && !command.args.iter().any(|arg| arg.contains("--proxy")) - { - command.args.push("--proxy".into()); - command.args.push(proxy_url_value.clone()); - } - let connection = crate::acp::connect( name, command, diff --git a/crates/agent_servers/src/settings.rs b/crates/agent_servers/src/settings.rs deleted file mode 100644 index 9a610465be5516664dafd9cd4cb46be96ad89c8b..0000000000000000000000000000000000000000 --- a/crates/agent_servers/src/settings.rs +++ /dev/null @@ -1,125 +0,0 @@ -use agent_client_protocol as acp; -use std::path::PathBuf; - -use crate::AgentServerCommand; -use anyhow::Result; -use collections::HashMap; -use gpui::{App, SharedString}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; - -pub fn init(cx: &mut App) { - AllAgentServersSettings::register(cx); -} - -#[derive(Default, Deserialize, Serialize, Clone, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[settings_key(key = "agent_servers")] -pub struct AllAgentServersSettings { - pub gemini: Option, - pub claude: Option, - - /// Custom agent servers configured by the user - #[serde(flatten)] - pub custom: HashMap, -} - -#[derive(Default, Deserialize, Serialize, Clone, JsonSchema, Debug, PartialEq)] -pub struct BuiltinAgentServerSettings { - /// Absolute path to a binary to be used when launching this agent. - /// - /// This can be used to run a specific binary without automatic downloads or searching `$PATH`. - #[serde(rename = "command")] - pub path: Option, - /// If a binary is specified in `command`, it will be passed these arguments. - pub args: Option>, - /// If a binary is specified in `command`, it will be passed these environment variables. - pub env: Option>, - /// Whether to skip searching `$PATH` for an agent server binary when - /// launching this agent. - /// - /// This has no effect if a `command` is specified. Otherwise, when this is - /// `false`, Zed will search `$PATH` for an agent server binary and, if one - /// is found, use it for threads with this agent. If no agent binary is - /// found on `$PATH`, Zed will automatically install and use its own binary. - /// When this is `true`, Zed will not search `$PATH`, and will always use - /// its own binary. - /// - /// Default: true - pub ignore_system_version: Option, - /// The default mode for new threads. - /// - /// Note: Not all agents support modes. - /// - /// Default: None - #[serde(skip_serializing_if = "Option::is_none")] - pub default_mode: Option, -} - -impl BuiltinAgentServerSettings { - pub(crate) fn custom_command(self) -> Option { - self.path.map(|path| AgentServerCommand { - path, - args: self.args.unwrap_or_default(), - env: self.env, - }) - } -} - -impl From for BuiltinAgentServerSettings { - fn from(value: AgentServerCommand) -> Self { - BuiltinAgentServerSettings { - path: Some(value.path), - args: Some(value.args), - env: value.env, - ..Default::default() - } - } -} - -#[derive(Deserialize, Serialize, Clone, JsonSchema, Debug, PartialEq)] -pub struct CustomAgentServerSettings { - #[serde(flatten)] - pub command: AgentServerCommand, - /// The default mode for new threads. - /// - /// Note: Not all agents support modes. - /// - /// Default: None - #[serde(skip_serializing_if = "Option::is_none")] - pub default_mode: Option, -} - -impl settings::Settings for AllAgentServersSettings { - type FileContent = Self; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - let mut settings = AllAgentServersSettings::default(); - - for AllAgentServersSettings { - gemini, - claude, - custom, - } in sources.defaults_and_customizations() - { - if gemini.is_some() { - settings.gemini = gemini.clone(); - } - if claude.is_some() { - settings.claude = claude.clone(); - } - - // Merge custom agents - for (name, config) in custom { - // Skip built-in agent names to avoid conflicts - if name != "gemini" && name != "claude" { - settings.custom.insert(name.clone(), config.clone()); - } - } - } - - Ok(settings) - } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} -} diff --git a/crates/agent_settings/Cargo.toml b/crates/agent_settings/Cargo.toml index 8af76053c2aabead30413c98e482ed97dbdbc361..a8b457a9dddb1f8932d015f895e6d2064944bfe9 100644 --- a/crates/agent_settings/Cargo.toml +++ b/crates/agent_settings/Cargo.toml @@ -19,6 +19,7 @@ convert_case.workspace = true fs.workspace = true gpui.workspace = true language_model.workspace = true +project.workspace = true schemars.workspace = true serde.workspace = true settings.workspace = true diff --git a/crates/agent_settings/src/agent_profile.rs b/crates/agent_settings/src/agent_profile.rs index 42a273e2dcfccfb839e6e7d97efb42dcd7b0bba9..999ddc8083a1a4b4c271ea9bde4c1e45307e9542 100644 --- a/crates/agent_settings/src/agent_profile.rs +++ b/crates/agent_settings/src/agent_profile.rs @@ -1,15 +1,17 @@ use std::sync::Arc; +use anyhow::{Result, bail}; use collections::IndexMap; use convert_case::{Case, Casing as _}; use fs::Fs; use gpui::{App, SharedString}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings as _, update_settings_file}; +use settings::{ + AgentProfileContent, ContextServerPresetContent, Settings as _, SettingsContent, + update_settings_file, +}; use util::ResultExt as _; -use crate::AgentSettings; +use crate::{AgentProfileId, AgentSettings}; pub mod builtin_profiles { use super::AgentProfileId; @@ -23,27 +25,6 @@ pub mod builtin_profiles { } } -#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize, JsonSchema)] -pub struct AgentProfileId(pub Arc); - -impl AgentProfileId { - pub fn as_str(&self) -> &str { - &self.0 - } -} - -impl std::fmt::Display for AgentProfileId { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.0) - } -} - -impl Default for AgentProfileId { - fn default() -> Self { - Self("write".into()) - } -} - #[derive(Clone, Debug, Eq, PartialEq)] pub struct AgentProfile { id: AgentProfileId, @@ -87,10 +68,10 @@ impl AgentProfile { .unwrap_or_default(), }; - update_settings_file::(fs, cx, { + update_settings_file(fs, cx, { let id = id.clone(); move |settings, _cx| { - settings.create_profile(id, profile_settings).log_err(); + profile_settings.save_to_settings(id, settings).log_err(); } }); @@ -129,9 +110,71 @@ impl AgentProfileSettings { .get(server_id) .is_some_and(|preset| preset.tools.get(tool_name) == Some(&true)) } + + pub fn save_to_settings( + &self, + profile_id: AgentProfileId, + content: &mut SettingsContent, + ) -> Result<()> { + let profiles = content + .agent + .get_or_insert_default() + .profiles + .get_or_insert_default(); + if profiles.contains_key(&profile_id.0) { + bail!("profile with ID '{profile_id}' already exists"); + } + + profiles.insert( + profile_id.0, + AgentProfileContent { + name: self.name.clone().into(), + tools: self.tools.clone(), + enable_all_context_servers: Some(self.enable_all_context_servers), + context_servers: self + .context_servers + .clone() + .into_iter() + .map(|(server_id, preset)| { + ( + server_id, + ContextServerPresetContent { + tools: preset.tools, + }, + ) + }) + .collect(), + }, + ); + + Ok(()) + } +} + +impl From for AgentProfileSettings { + fn from(content: AgentProfileContent) -> Self { + Self { + name: content.name.into(), + tools: content.tools, + enable_all_context_servers: content.enable_all_context_servers.unwrap_or_default(), + context_servers: content + .context_servers + .into_iter() + .map(|(server_id, preset)| (server_id, preset.into())) + .collect(), + } + } } #[derive(Debug, Clone, Default)] pub struct ContextServerPreset { pub tools: IndexMap, bool>, } + +impl From for ContextServerPreset { + fn from(content: settings::ContextServerPresetContent) -> Self { + Self { + tools: content.tools, + } + } +} diff --git a/crates/agent_settings/src/agent_settings.rs b/crates/agent_settings/src/agent_settings.rs index e850945a40f46f31543fad2631216139706b405a..ec05c95672fa29b6e4813207e3e592fff9d3be15 100644 --- a/crates/agent_settings/src/agent_settings.rs +++ b/crates/agent_settings/src/agent_settings.rs @@ -2,14 +2,16 @@ mod agent_profile; use std::sync::Arc; -use anyhow::{Result, bail}; use collections::IndexMap; -use gpui::{App, Pixels, SharedString}; +use gpui::{App, Pixels, px}; use language_model::LanguageModel; -use schemars::{JsonSchema, json_schema}; +use project::DisableAiSettings; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; -use std::borrow::Cow; +use settings::{ + DefaultAgentView, DockPosition, LanguageModelParameters, LanguageModelSelection, + NotifyWhenAgentWaiting, Settings, SettingsContent, +}; pub use crate::agent_profile::*; @@ -22,37 +24,11 @@ pub fn init(cx: &mut App) { AgentSettings::register(cx); } -#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum AgentDockPosition { - Left, - #[default] - Right, - Bottom, -} - -#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum DefaultView { - #[default] - Thread, - TextThread, -} - -#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum NotifyWhenAgentWaiting { - #[default] - PrimaryScreen, - AllScreens, - Never, -} - -#[derive(Default, Clone, Debug)] +#[derive(Clone, Debug)] pub struct AgentSettings { pub enabled: bool, pub button: bool, - pub dock: AgentDockPosition, + pub dock: DockPosition, pub default_width: Pixels, pub default_height: Pixels, pub default_model: Option, @@ -60,9 +36,8 @@ pub struct AgentSettings { pub commit_message_model: Option, pub thread_summary_model: Option, pub inline_alternatives: Vec, - pub using_outdated_settings_version: bool, pub default_profile: AgentProfileId, - pub default_view: DefaultView, + pub default_view: DefaultAgentView, pub profiles: IndexMap, pub always_allow_tool_actions: bool, pub notify_when_agent_waiting: NotifyWhenAgentWaiting, @@ -75,76 +50,30 @@ pub struct AgentSettings { pub expand_edit_card: bool, pub expand_terminal_card: bool, pub use_modifier_to_send: bool, + pub message_editor_min_lines: usize, } impl AgentSettings { - pub fn temperature_for_model(model: &Arc, cx: &App) -> Option { - let settings = Self::get_global(cx); - settings - .model_parameters - .iter() - .rfind(|setting| setting.matches(model)) - .and_then(|m| m.temperature) + pub fn enabled(&self, cx: &App) -> bool { + self.enabled && !DisableAiSettings::get_global(cx).disable_ai } - pub fn set_inline_assistant_model(&mut self, provider: String, model: String) { - self.inline_assistant_model = Some(LanguageModelSelection { - provider: provider.into(), - model, - }); - } - - pub fn set_commit_message_model(&mut self, provider: String, model: String) { - self.commit_message_model = Some(LanguageModelSelection { - provider: provider.into(), - model, - }); - } - - pub fn set_thread_summary_model(&mut self, provider: String, model: String) { - self.thread_summary_model = Some(LanguageModelSelection { - provider: provider.into(), - model, - }); - } -} - -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] -pub struct LanguageModelParameters { - pub provider: Option, - pub model: Option, - pub temperature: Option, -} - -impl LanguageModelParameters { - pub fn matches(&self, model: &Arc) -> bool { - if let Some(provider) = &self.provider - && provider.0 != model.provider_id().0 - { - return false; - } - if let Some(setting_model) = &self.model - && *setting_model != model.id().0 - { - return false; + pub fn temperature_for_model(model: &Arc, cx: &App) -> Option { + let settings = Self::get_global(cx); + for setting in settings.model_parameters.iter().rev() { + if let Some(provider) = &setting.provider + && provider.0 != model.provider_id().0 + { + continue; + } + if let Some(setting_model) = &setting.model + && *setting_model != model.id().0 + { + continue; + } + return setting.temperature; } - true - } -} - -impl AgentSettingsContent { - pub fn set_dock(&mut self, dock: AgentDockPosition) { - self.dock = Some(dock); - } - - pub fn set_model(&mut self, language_model: Arc) { - let model = language_model.id().0.to_string(); - let provider = language_model.provider_id().0.to_string(); - - self.default_model = Some(LanguageModelSelection { - provider: provider.into(), - model, - }); + return None; } pub fn set_inline_assistant_model(&mut self, provider: String, model: String) { @@ -168,160 +97,11 @@ impl AgentSettingsContent { }); } - pub fn set_always_allow_tool_actions(&mut self, allow: bool) { - self.always_allow_tool_actions = Some(allow); - } - - pub fn set_play_sound_when_agent_done(&mut self, allow: bool) { - self.play_sound_when_agent_done = Some(allow); - } - - pub fn set_single_file_review(&mut self, allow: bool) { - self.single_file_review = Some(allow); - } - - pub fn set_use_modifier_to_send(&mut self, always_use: bool) { - self.use_modifier_to_send = Some(always_use); - } - - pub fn set_profile(&mut self, profile_id: AgentProfileId) { - self.default_profile = Some(profile_id); - } - - pub fn create_profile( - &mut self, - profile_id: AgentProfileId, - profile_settings: AgentProfileSettings, - ) -> Result<()> { - let profiles = self.profiles.get_or_insert_default(); - if profiles.contains_key(&profile_id) { - bail!("profile with ID '{profile_id}' already exists"); - } - - profiles.insert( - profile_id, - AgentProfileContent { - name: profile_settings.name.into(), - tools: profile_settings.tools, - enable_all_context_servers: Some(profile_settings.enable_all_context_servers), - context_servers: profile_settings - .context_servers - .into_iter() - .map(|(server_id, preset)| { - ( - server_id, - ContextServerPresetContent { - tools: preset.tools, - }, - ) - }) - .collect(), - }, - ); - - Ok(()) + pub fn set_message_editor_max_lines(&self) -> usize { + self.message_editor_min_lines * 2 } } -#[derive(Clone, Serialize, Deserialize, JsonSchema, Debug, Default, SettingsUi, SettingsKey)] -#[settings_key(key = "agent", fallback_key = "assistant")] -pub struct AgentSettingsContent { - /// Whether the Agent is enabled. - /// - /// Default: true - enabled: Option, - /// Whether to show the agent panel button in the status bar. - /// - /// Default: true - button: Option, - /// Where to dock the agent panel. - /// - /// Default: right - dock: Option, - /// Default width in pixels when the agent panel is docked to the left or right. - /// - /// Default: 640 - default_width: Option, - /// Default height in pixels when the agent panel is docked to the bottom. - /// - /// Default: 320 - default_height: Option, - /// The default model to use when creating new chats and for other features when a specific model is not specified. - default_model: Option, - /// Model to use for the inline assistant. Defaults to default_model when not specified. - inline_assistant_model: Option, - /// Model to use for generating git commit messages. Defaults to default_model when not specified. - commit_message_model: Option, - /// Model to use for generating thread summaries. Defaults to default_model when not specified. - thread_summary_model: Option, - /// Additional models with which to generate alternatives when performing inline assists. - inline_alternatives: Option>, - /// The default profile to use in the Agent. - /// - /// Default: write - default_profile: Option, - /// Which view type to show by default in the agent panel. - /// - /// Default: "thread" - default_view: Option, - /// The available agent profiles. - pub profiles: Option>, - /// Whenever a tool action would normally wait for your confirmation - /// that you allow it, always choose to allow it. - /// - /// This setting has no effect on external agents that support permission modes, such as Claude Code. - /// - /// Set `agent_servers.claude.default_mode` to `bypassPermissions`, to disable all permission requests when using Claude Code. - /// - /// Default: false - always_allow_tool_actions: Option, - /// Where to show a popup notification when the agent is waiting for user input. - /// - /// Default: "primary_screen" - notify_when_agent_waiting: Option, - /// Whether to play a sound when the agent has either completed its response, or needs user input. - /// - /// Default: false - play_sound_when_agent_done: Option, - /// Whether to stream edits from the agent as they are received. - /// - /// Default: false - stream_edits: Option, - /// Whether to display agent edits in single-file editors in addition to the review multibuffer pane. - /// - /// Default: true - single_file_review: Option, - /// Additional parameters for language model requests. When making a request - /// to a model, parameters will be taken from the last entry in this list - /// that matches the model's provider and name. In each entry, both provider - /// and model are optional, so that you can specify parameters for either - /// one. - /// - /// Default: [] - #[serde(default)] - model_parameters: Vec, - /// What completion mode to enable for new threads - /// - /// Default: normal - preferred_completion_mode: Option, - /// Whether to show thumb buttons for feedback in the agent panel. - /// - /// Default: true - enable_feedback: Option, - /// Whether to have edit cards in the agent panel expanded, showing a preview of the full diff. - /// - /// Default: true - expand_edit_card: Option, - /// Whether to have terminal cards in the agent panel expanded, showing the whole command output. - /// - /// Default: true - expand_terminal_card: Option, - /// Whether to always use cmd-enter (or ctrl-enter on Linux or Windows) to send messages in the agent panel. - /// - /// Default: false - use_modifier_to_send: Option, -} - #[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Default)] #[serde(rename_all = "snake_case")] pub enum CompletionMode { @@ -340,202 +120,80 @@ impl From for cloud_llm_client::CompletionMode { } } -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] -pub struct LanguageModelSelection { - pub provider: LanguageModelProviderSetting, - pub model: String, +impl From for CompletionMode { + fn from(value: settings::CompletionMode) -> Self { + match value { + settings::CompletionMode::Normal => CompletionMode::Normal, + settings::CompletionMode::Burn => CompletionMode::Burn, + } + } } -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -pub struct LanguageModelProviderSetting(pub String); - -impl JsonSchema for LanguageModelProviderSetting { - fn schema_name() -> Cow<'static, str> { - "LanguageModelProviderSetting".into() - } +#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize, JsonSchema)] +pub struct AgentProfileId(pub Arc); - fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { - json_schema!({ - "enum": [ - "amazon-bedrock", - "anthropic", - "copilot_chat", - "deepseek", - "google", - "lmstudio", - "mistral", - "ollama", - "openai", - "openrouter", - "vercel", - "x_ai", - "zed.dev" - ] - }) +impl AgentProfileId { + pub fn as_str(&self) -> &str { + &self.0 } } -impl From for LanguageModelProviderSetting { - fn from(provider: String) -> Self { - Self(provider) +impl std::fmt::Display for AgentProfileId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) } } -impl From<&str> for LanguageModelProviderSetting { - fn from(provider: &str) -> Self { - Self(provider.to_string()) +impl Default for AgentProfileId { + fn default() -> Self { + Self("write".into()) } } -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, JsonSchema)] -pub struct AgentProfileContent { - pub name: Arc, - #[serde(default)] - pub tools: IndexMap, bool>, - /// Whether all context servers are enabled by default. - pub enable_all_context_servers: Option, - #[serde(default)] - pub context_servers: IndexMap, ContextServerPresetContent>, -} - -#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize, JsonSchema)] -pub struct ContextServerPresetContent { - pub tools: IndexMap, bool>, -} - impl Settings for AgentSettings { - const PRESERVED_KEYS: Option<&'static [&'static str]> = Some(&["version"]); - - type FileContent = AgentSettingsContent; - - fn load( - sources: SettingsSources, - _: &mut gpui::App, - ) -> anyhow::Result { - let mut settings = AgentSettings::default(); - - for value in sources.defaults_and_customizations() { - merge(&mut settings.enabled, value.enabled); - merge(&mut settings.button, value.button); - merge(&mut settings.dock, value.dock); - merge( - &mut settings.default_width, - value.default_width.map(Into::into), - ); - merge( - &mut settings.default_height, - value.default_height.map(Into::into), - ); - settings.default_model = value - .default_model - .clone() - .or(settings.default_model.take()); - settings.inline_assistant_model = value - .inline_assistant_model - .clone() - .or(settings.inline_assistant_model.take()); - settings.commit_message_model = value - .clone() - .commit_message_model - .or(settings.commit_message_model.take()); - settings.thread_summary_model = value - .clone() - .thread_summary_model - .or(settings.thread_summary_model.take()); - merge( - &mut settings.inline_alternatives, - value.inline_alternatives.clone(), - ); - merge( - &mut settings.notify_when_agent_waiting, - value.notify_when_agent_waiting, - ); - merge( - &mut settings.play_sound_when_agent_done, - value.play_sound_when_agent_done, - ); - merge(&mut settings.stream_edits, value.stream_edits); - merge(&mut settings.single_file_review, value.single_file_review); - merge(&mut settings.default_profile, value.default_profile.clone()); - merge(&mut settings.default_view, value.default_view); - merge( - &mut settings.preferred_completion_mode, - value.preferred_completion_mode, - ); - merge(&mut settings.enable_feedback, value.enable_feedback); - merge(&mut settings.expand_edit_card, value.expand_edit_card); - merge( - &mut settings.expand_terminal_card, - value.expand_terminal_card, - ); - merge( - &mut settings.use_modifier_to_send, - value.use_modifier_to_send, - ); - - settings - .model_parameters - .extend_from_slice(&value.model_parameters); - - if let Some(profiles) = value.profiles.as_ref() { - settings - .profiles - .extend(profiles.into_iter().map(|(id, profile)| { - ( - id.clone(), - AgentProfileSettings { - name: profile.name.clone().into(), - tools: profile.tools.clone(), - enable_all_context_servers: profile - .enable_all_context_servers - .unwrap_or_default(), - context_servers: profile - .context_servers - .iter() - .map(|(context_server_id, preset)| { - ( - context_server_id.clone(), - ContextServerPreset { - tools: preset.tools.clone(), - }, - ) - }) - .collect(), - }, - ) - })); - } + fn from_settings(content: &settings::SettingsContent) -> Self { + let agent = content.agent.clone().unwrap(); + Self { + enabled: agent.enabled.unwrap(), + button: agent.button.unwrap(), + dock: agent.dock.unwrap(), + default_width: px(agent.default_width.unwrap()), + default_height: px(agent.default_height.unwrap()), + default_model: Some(agent.default_model.unwrap()), + inline_assistant_model: agent.inline_assistant_model, + commit_message_model: agent.commit_message_model, + thread_summary_model: agent.thread_summary_model, + inline_alternatives: agent.inline_alternatives.unwrap_or_default(), + default_profile: AgentProfileId(agent.default_profile.unwrap()), + default_view: agent.default_view.unwrap(), + profiles: agent + .profiles + .unwrap() + .into_iter() + .map(|(key, val)| (AgentProfileId(key), val.into())) + .collect(), + always_allow_tool_actions: agent.always_allow_tool_actions.unwrap(), + notify_when_agent_waiting: agent.notify_when_agent_waiting.unwrap(), + play_sound_when_agent_done: agent.play_sound_when_agent_done.unwrap(), + stream_edits: agent.stream_edits.unwrap(), + single_file_review: agent.single_file_review.unwrap(), + model_parameters: agent.model_parameters, + preferred_completion_mode: agent.preferred_completion_mode.unwrap().into(), + enable_feedback: agent.enable_feedback.unwrap(), + expand_edit_card: agent.expand_edit_card.unwrap(), + expand_terminal_card: agent.expand_terminal_card.unwrap(), + use_modifier_to_send: agent.use_modifier_to_send.unwrap(), + message_editor_min_lines: agent.message_editor_min_lines.unwrap(), } - - debug_assert!( - !sources.default.always_allow_tool_actions.unwrap_or(false), - "For security, agent.always_allow_tool_actions should always be false in default.json. If it's true, that is a bug that should be fixed!" - ); - - // For security reasons, only trust the user's global settings for whether to always allow tool actions. - // If this could be overridden locally, an attacker could (e.g. by committing to source control and - // convincing you to switch branches) modify your project-local settings to disable the agent's safety checks. - settings.always_allow_tool_actions = sources - .user - .and_then(|setting| setting.always_allow_tool_actions) - .unwrap_or(false); - - Ok(settings) } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { + fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut SettingsContent) { if let Some(b) = vscode .read_value("chat.agent.enabled") .and_then(|b| b.as_bool()) { - current.enabled = Some(b); - current.button = Some(b); + current.agent.get_or_insert_default().enabled = Some(b); + current.agent.get_or_insert_default().button = Some(b); } } } - -fn merge(target: &mut T, value: Option) { - if let Some(value) = value { - *target = value; - } -} diff --git a/crates/agent_ui/Cargo.toml b/crates/agent_ui/Cargo.toml index 028db95c10a8c7a319bb05927dcabd0564a14683..47d9f6d6a27a2ad5102e831094912208e66a9b43 100644 --- a/crates/agent_ui/Cargo.toml +++ b/crates/agent_ui/Cargo.toml @@ -80,7 +80,6 @@ serde.workspace = true serde_json.workspace = true serde_json_lenient.workspace = true settings.workspace = true -shlex.workspace = true smol.workspace = true streaming_diff.workspace = true task.workspace = true diff --git a/crates/agent_ui/src/acp/completion_provider.rs b/crates/agent_ui/src/acp/completion_provider.rs index 8c14bd1642b05623b9236701630127c23f5e30af..8cbae5a5420a2f89d0f7ca478ae77a5d5d350411 100644 --- a/crates/agent_ui/src/acp/completion_provider.rs +++ b/crates/agent_ui/src/acp/completion_provider.rs @@ -1,5 +1,6 @@ use std::cell::RefCell; use std::ops::Range; +use std::path::PathBuf; use std::rc::Rc; use std::sync::Arc; use std::sync::atomic::AtomicBool; @@ -13,7 +14,7 @@ use fuzzy::{StringMatch, StringMatchCandidate}; use gpui::{App, Entity, Task, WeakEntity}; use language::{Buffer, CodeLabel, HighlightId}; use lsp::CompletionContext; -use project::lsp_store::CompletionDocumentation; +use project::lsp_store::{CompletionDocumentation, SymbolLocation}; use project::{ Completion, CompletionDisplayOptions, CompletionIntent, CompletionResponse, Project, ProjectPath, Symbol, WorktreeId, @@ -22,6 +23,7 @@ use prompt_store::PromptStore; use rope::Point; use text::{Anchor, ToPoint as _}; use ui::prelude::*; +use util::rel_path::RelPath; use workspace::Workspace; use crate::AgentPanel; @@ -187,7 +189,7 @@ impl ContextPickerCompletionProvider { pub(crate) fn completion_for_path( project_path: ProjectPath, - path_prefix: &str, + path_prefix: &RelPath, is_recent: bool, is_directory: bool, source_range: Range, @@ -195,10 +197,12 @@ impl ContextPickerCompletionProvider { project: Entity, cx: &mut App, ) -> Option { + let path_style = project.read(cx).path_style(cx); let (file_name, directory) = crate::context_picker::file_context_picker::extract_file_name_and_directory( &project_path.path, path_prefix, + path_style, ); let label = @@ -250,7 +254,15 @@ impl ContextPickerCompletionProvider { let label = CodeLabel::plain(symbol.name.clone(), None); - let abs_path = project.read(cx).absolute_path(&symbol.path, cx)?; + let abs_path = match &symbol.path { + SymbolLocation::InProject(project_path) => { + project.read(cx).absolute_path(&project_path, cx)? + } + SymbolLocation::OutsideProject { + abs_path, + signature: _, + } => PathBuf::from(abs_path.as_ref()), + }; let uri = MentionUri::Symbol { abs_path, name: symbol.name.clone(), diff --git a/crates/agent_ui/src/acp/entry_view_state.rs b/crates/agent_ui/src/acp/entry_view_state.rs index 0d4dfb0c206a78b2af932d5f3ef7d57c9bfbfc16..ee506b98810ba51d0fb933a2ca21e650d0cacc0b 100644 --- a/crates/agent_ui/src/acp/entry_view_state.rs +++ b/crates/agent_ui/src/acp/entry_view_state.rs @@ -203,7 +203,7 @@ impl EntryViewState { self.entries.drain(range); } - pub fn agent_font_size_changed(&mut self, cx: &mut App) { + pub fn agent_ui_font_size_changed(&mut self, cx: &mut App) { for entry in self.entries.iter() { match entry { Entry::UserMessage { .. } | Entry::AssistantMessage { .. } => {} @@ -387,7 +387,7 @@ fn diff_editor_text_style_refinement(cx: &mut App) -> TextStyleRefinement { font_size: Some( TextSize::Small .rems(cx) - .to_pixels(ThemeSettings::get_global(cx).agent_font_size(cx)) + .to_pixels(ThemeSettings::get_global(cx).agent_ui_font_size(cx)) .into(), ), ..Default::default() @@ -414,7 +414,6 @@ mod tests { use project::Project; use serde_json::json; use settings::{Settings as _, SettingsStore}; - use theme::ThemeSettings; use util::path; use workspace::Workspace; @@ -544,7 +543,7 @@ mod tests { Project::init_settings(cx); AgentSettings::register(cx); workspace::init_settings(cx); - ThemeSettings::register(cx); + theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); EditorSettings::register(cx); }); diff --git a/crates/agent_ui/src/acp/message_editor.rs b/crates/agent_ui/src/acp/message_editor.rs index ab4e8d680925c96e64fdb2e7707bea9c1e177b5c..626c9f3bb7bc3d9c146f584bb9acbc999c25c879 100644 --- a/crates/agent_ui/src/acp/message_editor.rs +++ b/crates/agent_ui/src/acp/message_editor.rs @@ -47,13 +47,8 @@ use std::{ }; use text::OffsetRangeExt; use theme::ThemeSettings; -use ui::{ - ActiveTheme, AnyElement, App, ButtonCommon, ButtonLike, ButtonStyle, Color, Element as _, - FluentBuilder as _, Icon, IconName, IconSize, InteractiveElement, IntoElement, Label, - LabelCommon, LabelSize, ParentElement, Render, SelectableButton, Styled, TextSize, TintColor, - Toggleable, Window, div, h_flex, -}; -use util::{ResultExt, debug_panic}; +use ui::{ButtonLike, TintColor, Toggleable, prelude::*}; +use util::{ResultExt, debug_panic, rel_path::RelPath}; use workspace::{Workspace, notifications::NotifyResultExt as _}; use zed_actions::agent::Chat; @@ -81,7 +76,7 @@ pub enum MessageEditorEvent { impl EventEmitter for MessageEditor {} -const COMMAND_HINT_INLAY_ID: usize = 0; +const COMMAND_HINT_INLAY_ID: u32 = 0; impl MessageEditor { pub fn new( @@ -295,18 +290,18 @@ impl MessageEditor { let snapshot = self .editor .update(cx, |editor, cx| editor.snapshot(window, cx)); - let Some((excerpt_id, _, _)) = snapshot.buffer_snapshot.as_singleton() else { + let Some((excerpt_id, _, _)) = snapshot.buffer_snapshot().as_singleton() else { return Task::ready(()); }; let Some(start_anchor) = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_in_excerpt(*excerpt_id, start) else { return Task::ready(()); }; let end_anchor = snapshot - .buffer_snapshot - .anchor_before(start_anchor.to_offset(&snapshot.buffer_snapshot) + content_len + 1); + .buffer_snapshot() + .anchor_before(start_anchor.to_offset(&snapshot.buffer_snapshot()) + content_len + 1); let crease = if let MentionUri::File { abs_path } = &mention_uri && let Some(extension) = abs_path.extension() @@ -364,7 +359,7 @@ impl MessageEditor { let task = match mention_uri.clone() { MentionUri::Fetch { url } => self.confirm_mention_for_fetch(url, cx), - MentionUri::Directory { abs_path } => self.confirm_mention_for_directory(abs_path, cx), + MentionUri::Directory { .. } => Task::ready(Ok(Mention::UriOnly)), MentionUri::Thread { id, .. } => self.confirm_mention_for_thread(id, cx), MentionUri::TextThread { path, .. } => self.confirm_mention_for_text_thread(path, cx), MentionUri::File { abs_path } => self.confirm_mention_for_file(abs_path, cx), @@ -457,9 +452,12 @@ impl MessageEditor { .update(cx, |project, cx| project.open_buffer(project_path, cx)); cx.spawn(async move |_, cx| { let buffer = buffer.await?; - let buffer_content = - outline::get_buffer_content_or_outline(buffer.clone(), Some(&abs_path), &cx) - .await?; + let buffer_content = outline::get_buffer_content_or_outline( + buffer.clone(), + Some(&abs_path.to_string_lossy()), + &cx, + ) + .await?; Ok(Mention::Text { content: buffer_content.text, @@ -468,97 +466,6 @@ impl MessageEditor { }) } - fn confirm_mention_for_directory( - &mut self, - abs_path: PathBuf, - cx: &mut Context, - ) -> Task> { - fn collect_files_in_path(worktree: &Worktree, path: &Path) -> Vec<(Arc, PathBuf)> { - let mut files = Vec::new(); - - for entry in worktree.child_entries(path) { - if entry.is_dir() { - files.extend(collect_files_in_path(worktree, &entry.path)); - } else if entry.is_file() { - files.push((entry.path.clone(), worktree.full_path(&entry.path))); - } - } - - files - } - - let Some(project_path) = self - .project - .read(cx) - .project_path_for_absolute_path(&abs_path, cx) - else { - return Task::ready(Err(anyhow!("project path not found"))); - }; - let Some(entry) = self.project.read(cx).entry_for_path(&project_path, cx) else { - return Task::ready(Err(anyhow!("project entry not found"))); - }; - let directory_path = entry.path.clone(); - let worktree_id = project_path.worktree_id; - let Some(worktree) = self.project.read(cx).worktree_for_id(worktree_id, cx) else { - return Task::ready(Err(anyhow!("worktree not found"))); - }; - let project = self.project.clone(); - cx.spawn(async move |_, cx| { - let file_paths = worktree.read_with(cx, |worktree, _cx| { - collect_files_in_path(worktree, &directory_path) - })?; - let descendants_future = cx.update(|cx| { - join_all(file_paths.into_iter().map(|(worktree_path, full_path)| { - let rel_path = worktree_path - .strip_prefix(&directory_path) - .log_err() - .map_or_else(|| worktree_path.clone(), |rel_path| rel_path.into()); - - let open_task = project.update(cx, |project, cx| { - project.buffer_store().update(cx, |buffer_store, cx| { - let project_path = ProjectPath { - worktree_id, - path: worktree_path, - }; - buffer_store.open_buffer(project_path, cx) - }) - }); - - cx.spawn(async move |cx| { - let buffer = open_task.await.log_err()?; - let buffer_content = outline::get_buffer_content_or_outline( - buffer.clone(), - Some(&full_path), - &cx, - ) - .await - .ok()?; - - Some((rel_path, full_path, buffer_content.text, buffer)) - }) - })) - })?; - - let contents = cx - .background_spawn(async move { - let (contents, tracked_buffers) = descendants_future - .await - .into_iter() - .flatten() - .map(|(rel_path, full_path, rope, buffer)| { - ((rel_path, full_path, rope), buffer) - }) - .unzip(); - Mention::Text { - content: render_directory_contents(contents), - tracked_buffers, - } - }) - .await; - anyhow::Ok(contents) - }) - } - fn confirm_mention_for_fetch( &mut self, url: url::Url, @@ -776,6 +683,7 @@ impl MessageEditor { pub fn contents( &self, + full_mention_content: bool, cx: &mut Context, ) -> Task, Vec>)>> { // Check for unsupported slash commands before spawning async task @@ -787,9 +695,12 @@ impl MessageEditor { return Task::ready(Err(err)); } - let contents = self - .mention_set - .contents(&self.prompt_capabilities.borrow(), cx); + let contents = self.mention_set.contents( + &self.prompt_capabilities.borrow(), + full_mention_content, + self.project.clone(), + cx, + ); let editor = self.editor.clone(); cx.spawn(async move |_, cx| { @@ -807,7 +718,7 @@ impl MessageEditor { continue; }; - let crease_range = crease.range().to_offset(&snapshot.buffer_snapshot); + let crease_range = crease.range().to_offset(&snapshot.buffer_snapshot()); if crease_range.start > ix { //todo(): Custom slash command ContentBlock? // let chunk = if prevent_slash_commands @@ -954,11 +865,11 @@ impl MessageEditor { self.editor.update(cx, |message_editor, cx| { let snapshot = message_editor.snapshot(window, cx); let (excerpt_id, _, buffer_snapshot) = - snapshot.buffer_snapshot.as_singleton().unwrap(); + snapshot.buffer_snapshot().as_singleton().unwrap(); let text_anchor = buffer_snapshot.anchor_before(buffer_snapshot.len()); let multibuffer_anchor = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_in_excerpt(*excerpt_id, text_anchor); message_editor.edit( [( @@ -1039,6 +950,7 @@ impl MessageEditor { window: &mut Window, cx: &mut Context, ) { + let path_style = self.project.read(cx).path_style(cx); let buffer = self.editor.read(cx).buffer().clone(); let Some(buffer) = buffer.read(cx).as_singleton() else { return; @@ -1048,18 +960,15 @@ impl MessageEditor { let Some(entry) = self.project.read(cx).entry_for_path(&path, cx) else { continue; }; - let Some(abs_path) = self.project.read(cx).absolute_path(&path, cx) else { + let Some(worktree) = self.project.read(cx).worktree_for_id(path.worktree_id, cx) else { continue; }; - let path_prefix = abs_path - .file_name() - .unwrap_or(path.path.as_os_str()) - .display() - .to_string(); + let abs_path = worktree.read(cx).absolutize(&path.path); let (file_name, _) = crate::context_picker::file_context_picker::extract_file_name_and_directory( &path.path, - &path_prefix, + worktree.read(cx).root_name(), + path_style, ); let uri = if entry.is_dir() { @@ -1099,11 +1008,16 @@ impl MessageEditor { } pub fn insert_selections(&mut self, window: &mut Window, cx: &mut Context) { - let buffer = self.editor.read(cx).buffer().clone(); - let Some(buffer) = buffer.read(cx).as_singleton() else { + let editor = self.editor.read(cx); + let editor_buffer = editor.buffer().read(cx); + let Some(buffer) = editor_buffer.as_singleton() else { return; }; - let anchor = buffer.update(cx, |buffer, _cx| buffer.anchor_before(buffer.len())); + let cursor_anchor = editor.selections.newest_anchor().head(); + let cursor_offset = cursor_anchor.to_offset(&editor_buffer.snapshot(cx)); + let anchor = buffer.update(cx, |buffer, _cx| { + buffer.anchor_before(cursor_offset.min(buffer.len())) + }); let Some(workspace) = self.workspace.upgrade() else { return; }; @@ -1116,14 +1030,9 @@ impl MessageEditor { ) else { return; }; + self.editor.update(cx, |message_editor, cx| { - message_editor.edit( - [( - multi_buffer::Anchor::max()..multi_buffer::Anchor::max(), - completion.new_text, - )], - cx, - ); + message_editor.edit([(cursor_anchor..cursor_anchor, completion.new_text)], cx); }); if let Some(confirm) = completion.confirm { confirm(CompletionIntent::Complete, window, cx); @@ -1264,7 +1173,103 @@ impl MessageEditor { } } -fn render_directory_contents(entries: Vec<(Arc, PathBuf, String)>) -> String { +fn full_mention_for_directory( + project: &Entity, + abs_path: &Path, + cx: &mut App, +) -> Task> { + fn collect_files_in_path(worktree: &Worktree, path: &RelPath) -> Vec<(Arc, String)> { + let mut files = Vec::new(); + + for entry in worktree.child_entries(path) { + if entry.is_dir() { + files.extend(collect_files_in_path(worktree, &entry.path)); + } else if entry.is_file() { + files.push(( + entry.path.clone(), + worktree + .full_path(&entry.path) + .to_string_lossy() + .to_string(), + )); + } + } + + files + } + + let Some(project_path) = project + .read(cx) + .project_path_for_absolute_path(&abs_path, cx) + else { + return Task::ready(Err(anyhow!("project path not found"))); + }; + let Some(entry) = project.read(cx).entry_for_path(&project_path, cx) else { + return Task::ready(Err(anyhow!("project entry not found"))); + }; + let directory_path = entry.path.clone(); + let worktree_id = project_path.worktree_id; + let Some(worktree) = project.read(cx).worktree_for_id(worktree_id, cx) else { + return Task::ready(Err(anyhow!("worktree not found"))); + }; + let project = project.clone(); + cx.spawn(async move |cx| { + let file_paths = worktree.read_with(cx, |worktree, _cx| { + collect_files_in_path(worktree, &directory_path) + })?; + let descendants_future = cx.update(|cx| { + join_all(file_paths.into_iter().map(|(worktree_path, full_path)| { + let rel_path = worktree_path + .strip_prefix(&directory_path) + .log_err() + .map_or_else(|| worktree_path.clone(), |rel_path| rel_path.into()); + + let open_task = project.update(cx, |project, cx| { + project.buffer_store().update(cx, |buffer_store, cx| { + let project_path = ProjectPath { + worktree_id, + path: worktree_path, + }; + buffer_store.open_buffer(project_path, cx) + }) + }); + + cx.spawn(async move |cx| { + let buffer = open_task.await.log_err()?; + let buffer_content = outline::get_buffer_content_or_outline( + buffer.clone(), + Some(&full_path), + &cx, + ) + .await + .ok()?; + + Some((rel_path, full_path, buffer_content.text, buffer)) + }) + })) + })?; + + let contents = cx + .background_spawn(async move { + let (contents, tracked_buffers) = descendants_future + .await + .into_iter() + .flatten() + .map(|(rel_path, full_path, rope, buffer)| { + ((rel_path, full_path, rope), buffer) + }) + .unzip(); + Mention::Text { + content: render_directory_contents(contents), + tracked_buffers, + } + }) + .await; + anyhow::Ok(contents) + }) +} + +fn render_directory_contents(entries: Vec<(Arc, String, String)>) -> String { let mut output = String::new(); for (_relative_path, full_path, content) in entries { let fence = codeblock_fence_for_path(Some(&full_path), None); @@ -1289,18 +1294,14 @@ impl Render for MessageEditor { .flex_1() .child({ let settings = ThemeSettings::get_global(cx); - let font_size = TextSize::Small - .rems(cx) - .to_pixels(settings.agent_font_size(cx)); - let line_height = settings.buffer_line_height.value() * font_size; let text_style = TextStyle { color: cx.theme().colors().text, font_family: settings.buffer_font.family.clone(), font_fallbacks: settings.buffer_font.fallbacks.clone(), font_features: settings.buffer_font.features.clone(), - font_size: font_size.into(), - line_height: line_height.into(), + font_size: settings.agent_buffer_font_size(cx).into(), + line_height: relative(settings.buffer_line_height.value()), ..Default::default() }; @@ -1515,6 +1516,8 @@ impl MentionSet { fn contents( &self, prompt_capabilities: &acp::PromptCapabilities, + full_mention_content: bool, + project: Entity, cx: &mut App, ) -> Task>> { if !prompt_capabilities.embedded_context { @@ -1528,13 +1531,19 @@ impl MentionSet { } let mentions = self.mentions.clone(); - cx.spawn(async move |_cx| { + cx.spawn(async move |cx| { let mut contents = HashMap::default(); for (crease_id, (mention_uri, task)) in mentions { - contents.insert( - crease_id, - (mention_uri, task.await.map_err(|e| anyhow!("{e}"))?), - ); + let content = if full_mention_content + && let MentionUri::Directory { abs_path } = &mention_uri + { + cx.update(|cx| full_mention_for_directory(&project, abs_path, cx))? + .await? + } else { + task.await.map_err(|e| anyhow!("{e}"))? + }; + + contents.insert(crease_id, (mention_uri, content)); } Ok(contents) }) @@ -1542,7 +1551,7 @@ impl MentionSet { fn remove_invalid(&mut self, snapshot: EditorSnapshot) { for (crease_id, crease) in snapshot.crease_snapshot.creases() { - if !crease.range().start.is_valid(&snapshot.buffer_snapshot) { + if !crease.range().start.is_valid(&snapshot.buffer_snapshot()) { self.mentions.remove(&crease_id); } } @@ -1594,7 +1603,7 @@ mod tests { use serde_json::json; use text::Point; use ui::{App, Context, IntoElement, Render, SharedString, Window}; - use util::{path, uri}; + use util::{path, paths::PathStyle, rel_path::rel_path}; use workspace::{AppState, Item, Workspace}; use crate::acp::{ @@ -1695,7 +1704,7 @@ mod tests { }); let (content, _) = message_editor - .update(cx, |message_editor, cx| message_editor.contents(cx)) + .update(cx, |message_editor, cx| message_editor.contents(false, cx)) .await .unwrap(); @@ -1758,7 +1767,7 @@ mod tests { }); let contents_result = message_editor - .update(cx, |message_editor, cx| message_editor.contents(cx)) + .update(cx, |message_editor, cx| message_editor.contents(false, cx)) .await; // Should fail because available_commands is empty (no commands supported) @@ -1781,7 +1790,7 @@ mod tests { }); let contents_result = message_editor - .update(cx, |message_editor, cx| message_editor.contents(cx)) + .update(cx, |message_editor, cx| message_editor.contents(false, cx)) .await; assert!(contents_result.is_err()); @@ -1796,7 +1805,7 @@ mod tests { }); let contents_result = message_editor - .update(cx, |message_editor, cx| message_editor.contents(cx)) + .update(cx, |message_editor, cx| message_editor.contents(false, cx)) .await; // Should succeed because /help is in available_commands @@ -1808,7 +1817,7 @@ mod tests { }); let (content, _) = message_editor - .update(cx, |message_editor, cx| message_editor.contents(cx)) + .update(cx, |message_editor, cx| message_editor.contents(false, cx)) .await .unwrap(); @@ -1826,7 +1835,7 @@ mod tests { // The @ mention functionality should not be affected let (content, _) = message_editor - .update(cx, |message_editor, cx| message_editor.contents(cx)) + .update(cx, |message_editor, cx| message_editor.contents(false, cx)) .await .unwrap(); @@ -2104,16 +2113,18 @@ mod tests { let mut cx = VisualTestContext::from_window(*window, cx); let paths = vec![ - path!("a/one.txt"), - path!("a/two.txt"), - path!("a/three.txt"), - path!("a/four.txt"), - path!("b/five.txt"), - path!("b/six.txt"), - path!("b/seven.txt"), - path!("b/eight.txt"), + rel_path("a/one.txt"), + rel_path("a/two.txt"), + rel_path("a/three.txt"), + rel_path("a/four.txt"), + rel_path("b/five.txt"), + rel_path("b/six.txt"), + rel_path("b/seven.txt"), + rel_path("b/eight.txt"), ]; + let slash = PathStyle::local().separator(); + let mut opened_editors = Vec::new(); for path in paths { let buffer = workspace @@ -2121,7 +2132,7 @@ mod tests { workspace.open_path( ProjectPath { worktree_id, - path: Path::new(path).into(), + path: path.into(), }, None, false, @@ -2182,10 +2193,10 @@ mod tests { assert_eq!( current_completion_labels(editor), &[ - "eight.txt dir/b/", - "seven.txt dir/b/", - "six.txt dir/b/", - "five.txt dir/b/", + format!("eight.txt dir{slash}b{slash}"), + format!("seven.txt dir{slash}b{slash}"), + format!("six.txt dir{slash}b{slash}"), + format!("five.txt dir{slash}b{slash}"), ] ); editor.set_text("", window, cx); @@ -2213,14 +2224,14 @@ mod tests { assert_eq!( current_completion_labels(editor), &[ - "eight.txt dir/b/", - "seven.txt dir/b/", - "six.txt dir/b/", - "five.txt dir/b/", - "Files & Directories", - "Symbols", - "Threads", - "Fetch" + format!("eight.txt dir{slash}b{slash}"), + format!("seven.txt dir{slash}b{slash}"), + format!("six.txt dir{slash}b{slash}"), + format!("five.txt dir{slash}b{slash}"), + "Files & Directories".into(), + "Symbols".into(), + "Threads".into(), + "Fetch".into() ] ); }); @@ -2247,7 +2258,10 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!(editor.text(cx), "Lorem @file one"); assert!(editor.has_visible_completions_menu()); - assert_eq!(current_completion_labels(editor), vec!["one.txt dir/a/"]); + assert_eq!( + current_completion_labels(editor), + vec![format!("one.txt dir{slash}a{slash}")] + ); }); editor.update_in(&mut cx, |editor, window, cx| { @@ -2255,7 +2269,11 @@ mod tests { editor.confirm_completion(&editor::actions::ConfirmCompletion::default(), window, cx); }); - let url_one = uri!("file:///dir/a/one.txt"); + let url_one = MentionUri::File { + abs_path: path!("/dir/a/one.txt").into(), + } + .to_uri() + .to_string(); editor.update(&mut cx, |editor, cx| { let text = editor.text(cx); assert_eq!(text, format!("Lorem [@one.txt]({url_one}) ")); @@ -2272,9 +2290,12 @@ mod tests { let contents = message_editor .update(&mut cx, |message_editor, cx| { - message_editor - .mention_set() - .contents(&all_prompt_capabilities, cx) + message_editor.mention_set().contents( + &all_prompt_capabilities, + false, + project.clone(), + cx, + ) }) .await .unwrap() @@ -2291,9 +2312,12 @@ mod tests { let contents = message_editor .update(&mut cx, |message_editor, cx| { - message_editor - .mention_set() - .contents(&acp::PromptCapabilities::default(), cx) + message_editor.mention_set().contents( + &acp::PromptCapabilities::default(), + false, + project.clone(), + cx, + ) }) .await .unwrap() @@ -2342,16 +2366,23 @@ mod tests { let contents = message_editor .update(&mut cx, |message_editor, cx| { - message_editor - .mention_set() - .contents(&all_prompt_capabilities, cx) + message_editor.mention_set().contents( + &all_prompt_capabilities, + false, + project.clone(), + cx, + ) }) .await .unwrap() .into_values() .collect::>(); - let url_eight = uri!("file:///dir/b/eight.txt"); + let url_eight = MentionUri::File { + abs_path: path!("/dir/b/eight.txt").into(), + } + .to_uri() + .to_string(); { let [_, (uri, Mention::Text { content, .. })] = contents.as_slice() else { @@ -2450,11 +2481,20 @@ mod tests { editor.confirm_completion(&editor::actions::ConfirmCompletion::default(), window, cx); }); + let symbol = MentionUri::Symbol { + abs_path: path!("/dir/a/one.txt").into(), + name: "MySymbol".into(), + line_range: 0..=0, + }; + let contents = message_editor .update(&mut cx, |message_editor, cx| { - message_editor - .mention_set() - .contents(&all_prompt_capabilities, cx) + message_editor.mention_set().contents( + &all_prompt_capabilities, + false, + project.clone(), + cx, + ) }) .await .unwrap() @@ -2466,12 +2506,7 @@ mod tests { panic!("Unexpected mentions"); }; pretty_assertions::assert_eq!(content, "1"); - pretty_assertions::assert_eq!( - uri, - &format!("{url_one}?symbol=MySymbol#L1:1") - .parse::() - .unwrap() - ); + pretty_assertions::assert_eq!(uri, &symbol); } cx.run_until_parked(); @@ -2479,7 +2514,10 @@ mod tests { editor.read_with(&cx, |editor, cx| { assert_eq!( editor.text(cx), - format!("Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({url_one}?symbol=MySymbol#L1:1) ") + format!( + "Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({}) ", + symbol.to_uri(), + ) ); }); @@ -2489,10 +2527,10 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - format!("Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({url_one}?symbol=MySymbol#L1:1) @file x.png") + format!("Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({}) @file x.png", symbol.to_uri()) ); assert!(editor.has_visible_completions_menu()); - assert_eq!(current_completion_labels(editor), &["x.png dir/"]); + assert_eq!(current_completion_labels(editor), &[format!("x.png dir{slash}")]); }); editor.update_in(&mut cx, |editor, window, cx| { @@ -2502,9 +2540,12 @@ mod tests { // Getting the message contents fails message_editor .update(&mut cx, |message_editor, cx| { - message_editor - .mention_set() - .contents(&all_prompt_capabilities, cx) + message_editor.mention_set().contents( + &all_prompt_capabilities, + false, + project.clone(), + cx, + ) }) .await .expect_err("Should fail to load x.png"); @@ -2515,7 +2556,10 @@ mod tests { editor.read_with(&cx, |editor, cx| { assert_eq!( editor.text(cx), - format!("Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({url_one}?symbol=MySymbol#L1:1) ") + format!( + "Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({}) ", + symbol.to_uri() + ) ); }); @@ -2525,10 +2569,10 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - format!("Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({url_one}?symbol=MySymbol#L1:1) @file x.png") + format!("Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({}) @file x.png", symbol.to_uri()) ); assert!(editor.has_visible_completions_menu()); - assert_eq!(current_completion_labels(editor), &["x.png dir/"]); + assert_eq!(current_completion_labels(editor), &[format!("x.png dir{slash}")]); }); editor.update_in(&mut cx, |editor, window, cx| { @@ -2540,18 +2584,24 @@ mod tests { // Mention was removed editor.read_with(&cx, |editor, cx| { - assert_eq!( - editor.text(cx), - format!("Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({url_one}?symbol=MySymbol#L1:1) ") - ); - }); + assert_eq!( + editor.text(cx), + format!( + "Lorem [@one.txt]({url_one}) Ipsum [@eight.txt]({url_eight}) [@MySymbol]({}) ", + symbol.to_uri() + ) + ); + }); // Now getting the contents succeeds, because the invalid mention was removed let contents = message_editor .update(&mut cx, |message_editor, cx| { - message_editor - .mention_set() - .contents(&all_prompt_capabilities, cx) + message_editor.mention_set().contents( + &all_prompt_capabilities, + false, + project.clone(), + cx, + ) }) .await .unwrap(); diff --git a/crates/agent_ui/src/acp/mode_selector.rs b/crates/agent_ui/src/acp/mode_selector.rs index d4d424f41a36652881a50b65bc3dbe00c18fdcde..410874126665b7d622c7cf45e81596dce7f96823 100644 --- a/crates/agent_ui/src/acp/mode_selector.rs +++ b/crates/agent_ui/src/acp/mode_selector.rs @@ -107,13 +107,15 @@ impl ModeSelector { .text_sm() .text_color(Color::Muted.color(cx)) .child("Hold") - .child(div().pt_0p5().children(ui::render_modifiers( - &gpui::Modifiers::secondary_key(), - PlatformStyle::platform(), - None, - Some(ui::TextSize::Default.rems(cx).into()), - true, - ))) + .child(h_flex().flex_shrink_0().children( + ui::render_modifiers( + &gpui::Modifiers::secondary_key(), + PlatformStyle::platform(), + None, + Some(ui::TextSize::Default.rems(cx).into()), + true, + ), + )) .child(div().map(|this| { if is_default { this.child("to also unset as default") diff --git a/crates/agent_ui/src/acp/model_selector.rs b/crates/agent_ui/src/acp/model_selector.rs index 95c0478aa3cf6b1ca78cf391a5bd734820c41454..381bdb01edec49e222c9bd9b3a97ce9ba21a9789 100644 --- a/crates/agent_ui/src/acp/model_selector.rs +++ b/crates/agent_ui/src/acp/model_selector.rs @@ -1,7 +1,6 @@ use std::{cmp::Reverse, rc::Rc, sync::Arc}; use acp_thread::{AgentModelInfo, AgentModelList, AgentModelSelector}; -use agent_client_protocol as acp; use anyhow::Result; use collections::IndexMap; use futures::FutureExt; @@ -10,20 +9,19 @@ use gpui::{Action, AsyncWindowContext, BackgroundExecutor, DismissEvent, Task, W use ordered_float::OrderedFloat; use picker::{Picker, PickerDelegate}; use ui::{ - AnyElement, App, Context, IntoElement, ListItem, ListItemSpacing, SharedString, Window, - prelude::*, rems, + AnyElement, App, Context, DocumentationAside, DocumentationEdge, DocumentationSide, + IntoElement, ListItem, ListItemSpacing, SharedString, Window, prelude::*, rems, }; use util::ResultExt; pub type AcpModelSelector = Picker; pub fn acp_model_selector( - session_id: acp::SessionId, selector: Rc, window: &mut Window, cx: &mut Context, ) -> AcpModelSelector { - let delegate = AcpModelPickerDelegate::new(session_id, selector, window, cx); + let delegate = AcpModelPickerDelegate::new(selector, window, cx); Picker::list(delegate, window, cx) .show_scrollbar(true) .width(rems(20.)) @@ -36,61 +34,63 @@ enum AcpModelPickerEntry { } pub struct AcpModelPickerDelegate { - session_id: acp::SessionId, selector: Rc, filtered_entries: Vec, models: Option, selected_index: usize, + selected_description: Option<(usize, SharedString)>, selected_model: Option, _refresh_models_task: Task<()>, } impl AcpModelPickerDelegate { fn new( - session_id: acp::SessionId, selector: Rc, window: &mut Window, cx: &mut Context, ) -> Self { - let mut rx = selector.watch(cx); - let refresh_models_task = cx.spawn_in(window, { - let session_id = session_id.clone(); - async move |this, cx| { - async fn refresh( - this: &WeakEntity>, - session_id: &acp::SessionId, - cx: &mut AsyncWindowContext, - ) -> Result<()> { - let (models_task, selected_model_task) = this.update(cx, |this, cx| { - ( - this.delegate.selector.list_models(cx), - this.delegate.selector.selected_model(session_id, cx), - ) - })?; - - let (models, selected_model) = futures::join!(models_task, selected_model_task); + let rx = selector.watch(cx); + let refresh_models_task = { + cx.spawn_in(window, { + async move |this, cx| { + async fn refresh( + this: &WeakEntity>, + cx: &mut AsyncWindowContext, + ) -> Result<()> { + let (models_task, selected_model_task) = this.update(cx, |this, cx| { + ( + this.delegate.selector.list_models(cx), + this.delegate.selector.selected_model(cx), + ) + })?; - this.update_in(cx, |this, window, cx| { - this.delegate.models = models.ok(); - this.delegate.selected_model = selected_model.ok(); - this.refresh(window, cx) - }) - } + let (models, selected_model) = + futures::join!(models_task, selected_model_task); - refresh(&this, &session_id, cx).await.log_err(); - while let Ok(()) = rx.recv().await { - refresh(&this, &session_id, cx).await.log_err(); + this.update_in(cx, |this, window, cx| { + this.delegate.models = models.ok(); + this.delegate.selected_model = selected_model.ok(); + this.refresh(window, cx) + }) + } + + refresh(&this, cx).await.log_err(); + if let Some(mut rx) = rx { + while let Ok(()) = rx.recv().await { + refresh(&this, cx).await.log_err(); + } + } } - } - }); + }) + }; Self { - session_id, selector, filtered_entries: Vec::new(), models: None, selected_model: None, selected_index: 0, + selected_description: None, _refresh_models_task: refresh_models_task, } } @@ -182,7 +182,7 @@ impl PickerDelegate for AcpModelPickerDelegate { self.filtered_entries.get(self.selected_index) { self.selector - .select_model(self.session_id.clone(), model_info.id.clone(), cx) + .select_model(model_info.id.clone(), cx) .detach_and_log_err(cx); self.selected_model = Some(model_info.clone()); let current_index = self.selected_index; @@ -233,31 +233,46 @@ impl PickerDelegate for AcpModelPickerDelegate { }; Some( - ListItem::new(ix) - .inset(true) - .spacing(ListItemSpacing::Sparse) - .toggle_state(selected) - .start_slot::(model_info.icon.map(|icon| { - Icon::new(icon) - .color(model_icon_color) - .size(IconSize::Small) - })) + div() + .id(("model-picker-menu-child", ix)) + .when_some(model_info.description.clone(), |this, description| { + this + .on_hover(cx.listener(move |menu, hovered, _, cx| { + if *hovered { + menu.delegate.selected_description = Some((ix, description.clone())); + } else if matches!(menu.delegate.selected_description, Some((id, _)) if id == ix) { + menu.delegate.selected_description = None; + } + cx.notify(); + })) + }) .child( - h_flex() - .w_full() - .pl_0p5() - .gap_1p5() - .w(px(240.)) - .child(Label::new(model_info.name.clone()).truncate()), + ListItem::new(ix) + .inset(true) + .spacing(ListItemSpacing::Sparse) + .toggle_state(selected) + .start_slot::(model_info.icon.map(|icon| { + Icon::new(icon) + .color(model_icon_color) + .size(IconSize::Small) + })) + .child( + h_flex() + .w_full() + .pl_0p5() + .gap_1p5() + .w(px(240.)) + .child(Label::new(model_info.name.clone()).truncate()), + ) + .end_slot(div().pr_3().when(is_selected, |this| { + this.child( + Icon::new(IconName::Check) + .color(Color::Accent) + .size(IconSize::Small), + ) + })), ) - .end_slot(div().pr_3().when(is_selected, |this| { - this.child( - Icon::new(IconName::Check) - .color(Color::Accent) - .size(IconSize::Small), - ) - })) - .into_any_element(), + .into_any_element() ) } } @@ -292,6 +307,21 @@ impl PickerDelegate for AcpModelPickerDelegate { .into_any(), ) } + + fn documentation_aside( + &self, + _window: &mut Window, + _cx: &mut Context>, + ) -> Option { + self.selected_description.as_ref().map(|(_, description)| { + let description = description.clone(); + DocumentationAside::new( + DocumentationSide::Left, + DocumentationEdge::Bottom, + Rc::new(move |_| Label::new(description.clone()).into_any_element()), + ) + }) + } } fn info_list_to_picker_entries( @@ -371,6 +401,7 @@ async fn fuzzy_search( #[cfg(test)] mod tests { + use agent_client_protocol as acp; use gpui::TestAppContext; use super::*; @@ -383,8 +414,9 @@ mod tests { models .into_iter() .map(|model| acp_thread::AgentModelInfo { - id: acp_thread::AgentModelId(model.to_string().into()), + id: acp::ModelId(model.to_string().into()), name: model.to_string().into(), + description: None, icon: None, }) .collect::>(), diff --git a/crates/agent_ui/src/acp/model_selector_popover.rs b/crates/agent_ui/src/acp/model_selector_popover.rs index fa771c695ecf8175859d145b8d08d2cf3447a77a..55f530c81b1cead74fd4ec4f6cc29ececcf2bf7e 100644 --- a/crates/agent_ui/src/acp/model_selector_popover.rs +++ b/crates/agent_ui/src/acp/model_selector_popover.rs @@ -1,7 +1,6 @@ use std::rc::Rc; use acp_thread::AgentModelSelector; -use agent_client_protocol as acp; use gpui::{Entity, FocusHandle}; use picker::popover_menu::PickerPopoverMenu; use ui::{ @@ -20,7 +19,6 @@ pub struct AcpModelSelectorPopover { impl AcpModelSelectorPopover { pub(crate) fn new( - session_id: acp::SessionId, selector: Rc, menu_handle: PopoverMenuHandle, focus_handle: FocusHandle, @@ -28,7 +26,7 @@ impl AcpModelSelectorPopover { cx: &mut Context, ) -> Self { Self { - selector: cx.new(move |cx| acp_model_selector(session_id, selector, window, cx)), + selector: cx.new(move |cx| acp_model_selector(selector, window, cx)), menu_handle, focus_handle, } diff --git a/crates/agent_ui/src/acp/thread_history.rs b/crates/agent_ui/src/acp/thread_history.rs index 999fda956b97943fd3debe62a767400d53e58c55..925dde27f46aa6da78e527fcb9e8af538a332d52 100644 --- a/crates/agent_ui/src/acp/thread_history.rs +++ b/crates/agent_ui/src/acp/thread_history.rs @@ -496,20 +496,24 @@ impl Render for AcpThreadHistory { ), ) } else { - view.pr_5() - .child( - uniform_list( - "thread-history", - self.visible_items.len(), - cx.processor(|this, range: Range, window, cx| { - this.render_list_items(range, window, cx) - }), - ) - .p_1() - .track_scroll(self.scroll_handle.clone()) - .flex_grow(), + view.child( + uniform_list( + "thread-history", + self.visible_items.len(), + cx.processor(|this, range: Range, window, cx| { + this.render_list_items(range, window, cx) + }), ) - .vertical_scrollbar_for(self.scroll_handle.clone(), window, cx) + .p_1() + .pr_4() + .track_scroll(self.scroll_handle.clone()) + .flex_grow(), + ) + .vertical_scrollbar_for( + self.scroll_handle.clone(), + window, + cx, + ) } }) } diff --git a/crates/agent_ui/src/acp/thread_view.rs b/crates/agent_ui/src/acp/thread_view.rs index d3986155d741393a01bce829a886aba4ee497948..8b8f127764ad36a9fb9afa029b22b2a113991d34 100644 --- a/crates/agent_ui/src/acp/thread_view.rs +++ b/crates/agent_ui/src/acp/thread_view.rs @@ -7,9 +7,9 @@ use acp_thread::{AgentConnection, Plan}; use action_log::ActionLog; use agent_client_protocol::{self as acp, PromptCapabilities}; use agent_servers::{AgentServer, AgentServerDelegate}; -use agent_settings::{AgentProfileId, AgentSettings, CompletionMode, NotifyWhenAgentWaiting}; +use agent_settings::{AgentProfileId, AgentSettings, CompletionMode}; use agent2::{DbThreadMetadata, HistoryEntry, HistoryEntryId, HistoryStore, NativeAgentServer}; -use anyhow::{Context as _, Result, anyhow, bail}; +use anyhow::{Result, anyhow, bail}; use arrayvec::ArrayVec; use audio::{Audio, Sound}; use buffer_diff::BufferDiff; @@ -26,7 +26,7 @@ use gpui::{ CursorStyle, EdgesRefinement, ElementId, Empty, Entity, FocusHandle, Focusable, Hsla, Length, ListOffset, ListState, PlatformDisplay, SharedString, StyleRefinement, Subscription, Task, TextStyle, TextStyleRefinement, UnderlineStyle, WeakEntity, Window, WindowHandle, div, - ease_in_out, linear_color_stop, linear_gradient, list, point, prelude::*, pulsating_between, + ease_in_out, linear_color_stop, linear_gradient, list, point, pulsating_between, }; use language::Buffer; @@ -35,7 +35,7 @@ use markdown::{HeadingLevelStyles, Markdown, MarkdownElement, MarkdownStyle}; use project::{Project, ProjectEntryId}; use prompt_store::{PromptId, PromptStore}; use rope::Point; -use settings::{Settings as _, SettingsStore}; +use settings::{NotifyWhenAgentWaiting, Settings as _, SettingsStore}; use std::cell::RefCell; use std::path::Path; use std::sync::Arc; @@ -71,9 +71,6 @@ use crate::{ RejectOnce, ToggleBurnMode, ToggleProfileSelector, }; -pub const MIN_EDITOR_LINES: usize = 4; -pub const MAX_EDITOR_LINES: usize = 8; - #[derive(Copy, Clone, Debug, PartialEq, Eq)] enum ThreadFeedback { Positive, @@ -292,8 +289,9 @@ pub struct AcpThreadView { available_commands: Rc>>, is_loading_contents: bool, new_server_version_available: Option, + resume_thread_metadata: Option, _cancel_task: Option>, - _subscriptions: [Subscription; 4], + _subscriptions: [Subscription; 5], } enum ThreadState { @@ -357,8 +355,8 @@ impl AcpThreadView { agent.name(), &placeholder, editor::EditorMode::AutoHeight { - min_lines: MIN_EDITOR_LINES, - max_lines: Some(MAX_EDITOR_LINES), + min_lines: AgentSettings::get_global(cx).message_editor_min_lines, + max_lines: Some(AgentSettings::get_global(cx).set_message_editor_max_lines()), }, window, cx, @@ -383,11 +381,17 @@ impl AcpThreadView { ) }); + let agent_server_store = project.read(cx).agent_server_store().clone(); let subscriptions = [ - cx.observe_global_in::(window, Self::agent_font_size_changed), - cx.observe_global_in::(window, Self::agent_font_size_changed), + cx.observe_global_in::(window, Self::agent_ui_font_size_changed), + cx.observe_global_in::(window, Self::agent_ui_font_size_changed), cx.subscribe_in(&message_editor, window, Self::handle_message_editor_event), cx.subscribe_in(&entry_view_state, window, Self::handle_entry_view_event), + cx.subscribe_in( + &agent_server_store, + window, + Self::handle_agent_servers_updated, + ), ]; Self { @@ -395,7 +399,14 @@ impl AcpThreadView { workspace: workspace.clone(), project: project.clone(), entry_view_state, - thread_state: Self::initial_state(agent, resume_thread, workspace, project, window, cx), + thread_state: Self::initial_state( + agent.clone(), + resume_thread.clone(), + workspace.clone(), + project.clone(), + window, + cx, + ), login: None, message_editor, model_selector: None, @@ -424,13 +435,14 @@ impl AcpThreadView { _cancel_task: None, focus_handle: cx.focus_handle(), new_server_version_available: None, + resume_thread_metadata: resume_thread, } } fn reset(&mut self, window: &mut Window, cx: &mut Context) { self.thread_state = Self::initial_state( self.agent.clone(), - None, + self.resume_thread_metadata.clone(), self.workspace.clone(), self.project.clone(), window, @@ -580,23 +592,21 @@ impl AcpThreadView { AgentDiff::set_active_thread(&workspace, thread.clone(), window, cx); - this.model_selector = - thread - .read(cx) - .connection() - .model_selector() - .map(|selector| { - cx.new(|cx| { - AcpModelSelectorPopover::new( - thread.read(cx).session_id().clone(), - selector, - PopoverMenuHandle::default(), - this.focus_handle(cx), - window, - cx, - ) - }) - }); + this.model_selector = thread + .read(cx) + .connection() + .model_selector(thread.read(cx).session_id()) + .map(|selector| { + cx.new(|cx| { + AcpModelSelectorPopover::new( + selector, + PopoverMenuHandle::default(), + this.focus_handle(cx), + window, + cx, + ) + }) + }); let mode_selector = thread .read(cx) @@ -780,6 +790,25 @@ impl AcpThreadView { cx.notify(); } + fn handle_agent_servers_updated( + &mut self, + _agent_server_store: &Entity, + _event: &project::AgentServersUpdated, + window: &mut Window, + cx: &mut Context, + ) { + // If we're in a LoadError state OR have a thread_error set (which can happen + // when agent.connect() fails during loading), retry loading the thread. + // This handles the case where a thread is restored before authentication completes. + let should_retry = + matches!(&self.thread_state, ThreadState::LoadError(_)) || self.thread_error.is_some(); + + if should_retry { + self.thread_error = None; + self.reset(window, cx); + } + } + pub fn workspace(&self) -> &WeakEntity { &self.workspace } @@ -857,10 +886,11 @@ impl AcpThreadView { cx, ) } else { + let agent_settings = AgentSettings::get_global(cx); editor.set_mode( EditorMode::AutoHeight { - min_lines: MIN_EDITOR_LINES, - max_lines: Some(MAX_EDITOR_LINES), + min_lines: agent_settings.message_editor_min_lines, + max_lines: Some(agent_settings.set_message_editor_max_lines()), }, cx, ) @@ -1016,36 +1046,36 @@ impl AcpThreadView { }; let connection = thread.read(cx).connection().clone(); - if !connection - .auth_methods() - .iter() - .any(|method| method.id.0.as_ref() == "claude-login") - { + let can_login = !connection.auth_methods().is_empty() || self.login.is_some(); + // Does the agent have a specific logout command? Prefer that in case they need to reset internal state. + let logout_supported = text == "/logout" + && self + .available_commands + .borrow() + .iter() + .any(|command| command.name == "logout"); + if can_login && !logout_supported { + let this = cx.weak_entity(); + let agent = self.agent.clone(); + window.defer(cx, |window, cx| { + Self::handle_auth_required( + this, + AuthRequired { + description: None, + provider_id: None, + }, + agent, + connection, + window, + cx, + ); + }); + cx.notify(); return; - }; - let this = cx.weak_entity(); - let agent = self.agent.clone(); - window.defer(cx, |window, cx| { - Self::handle_auth_required( - this, - AuthRequired { - description: None, - provider_id: None, - }, - agent, - connection, - window, - cx, - ); - }); - cx.notify(); - return; + } } - let contents = self - .message_editor - .update(cx, |message_editor, cx| message_editor.contents(cx)); - self.send_impl(contents, window, cx) + self.send_impl(self.message_editor.clone(), window, cx) } fn stop_current_and_send_new_message(&mut self, window: &mut Window, cx: &mut Context) { @@ -1055,15 +1085,11 @@ impl AcpThreadView { let cancelled = thread.update(cx, |thread, cx| thread.cancel(cx)); - let contents = self - .message_editor - .update(cx, |message_editor, cx| message_editor.contents(cx)); - cx.spawn_in(window, async move |this, cx| { cancelled.await; this.update_in(cx, |this, window, cx| { - this.send_impl(contents, window, cx); + this.send_impl(this.message_editor.clone(), window, cx); }) .ok(); }) @@ -1072,10 +1098,23 @@ impl AcpThreadView { fn send_impl( &mut self, - contents: Task, Vec>)>>, + message_editor: Entity, window: &mut Window, cx: &mut Context, ) { + let full_mention_content = self.as_native_thread(cx).is_some_and(|thread| { + // Include full contents when using minimal profile + let thread = thread.read(cx); + AgentSettings::get_global(cx) + .profiles + .get(thread.profile()) + .is_some_and(|profile| profile.tools.is_empty()) + }); + + let contents = message_editor.update(cx, |message_editor, cx| { + message_editor.contents(full_mention_content, cx) + }); + let agent_telemetry_id = self.agent.telemetry_id(); self.thread_error.take(); @@ -1204,10 +1243,8 @@ impl AcpThreadView { thread .update(cx, |thread, cx| thread.rewind(user_message_id, cx))? .await?; - let contents = - message_editor.update(cx, |message_editor, cx| message_editor.contents(cx))?; this.update_in(cx, |this, window, cx| { - this.send_impl(contents, window, cx); + this.send_impl(message_editor, window, cx); })?; anyhow::Ok(()) }) @@ -1579,34 +1616,23 @@ impl AcpThreadView { return Task::ready(Ok(())); }; let project = workspace.read(cx).project().clone(); - let cwd = project.read(cx).first_project_directory(cx); - let shell = project.read(cx).terminal_settings(&cwd, cx).shell.clone(); window.spawn(cx, async move |cx| { let mut task = login.clone(); - task.command = task - .command - .map(|command| anyhow::Ok(shlex::try_quote(&command)?.to_string())) - .transpose()?; - task.args = task - .args - .iter() - .map(|arg| { - Ok(shlex::try_quote(arg) - .context("Failed to quote argument")? - .to_string()) - }) - .collect::>>()?; + task.shell = task::Shell::WithArguments { + program: task.command.take().expect("login command should be set"), + args: std::mem::take(&mut task.args), + title_override: None + }; task.full_label = task.label.clone(); task.id = task::TaskId(format!("external-agent-{}-login", task.label)); task.command_label = task.label.clone(); task.use_new_terminal = true; task.allow_concurrent_runs = true; task.hide = task::HideStrategy::Always; - task.shell = shell; let terminal = terminal_panel.update_in(cx, |terminal_panel, window, cx| { - terminal_panel.spawn_task(login.clone(), window, cx) + terminal_panel.spawn_task(&task, window, cx) })?; let terminal = terminal.await?; @@ -2079,27 +2105,6 @@ impl AcpThreadView { let has_location = tool_call.locations.len() == 1; let card_header_id = SharedString::from("inner-tool-call-header"); - let tool_icon = if tool_call.kind == acp::ToolKind::Edit && has_location { - FileIcons::get_icon(&tool_call.locations[0].path, cx) - .map(Icon::from_path) - .unwrap_or(Icon::new(IconName::ToolPencil)) - } else { - Icon::new(match tool_call.kind { - acp::ToolKind::Read => IconName::ToolSearch, - acp::ToolKind::Edit => IconName::ToolPencil, - acp::ToolKind::Delete => IconName::ToolDeleteFile, - acp::ToolKind::Move => IconName::ArrowRightLeft, - acp::ToolKind::Search => IconName::ToolSearch, - acp::ToolKind::Execute => IconName::ToolTerminal, - acp::ToolKind::Think => IconName::ToolThink, - acp::ToolKind::Fetch => IconName::ToolWeb, - acp::ToolKind::SwitchMode => IconName::ArrowRightLeft, - acp::ToolKind::Other => IconName::ToolHammer, - }) - } - .size(IconSize::Small) - .color(Color::Muted); - let failed_or_canceled = match &tool_call.status { ToolCallStatus::Rejected | ToolCallStatus::Canceled | ToolCallStatus::Failed => true, _ => false, @@ -2109,41 +2114,16 @@ impl AcpThreadView { tool_call.status, ToolCallStatus::WaitingForConfirmation { .. } ); + let is_terminal_tool = matches!(tool_call.kind, acp::ToolKind::Execute); let is_edit = matches!(tool_call.kind, acp::ToolKind::Edit) || tool_call.diffs().next().is_some(); - let use_card_layout = needs_confirmation || is_edit; + + let use_card_layout = needs_confirmation || is_edit || is_terminal_tool; let is_collapsible = !tool_call.content.is_empty() && !needs_confirmation; let is_open = needs_confirmation || self.expanded_tool_calls.contains(&tool_call.id); - let gradient_overlay = { - div() - .absolute() - .top_0() - .right_0() - .w_12() - .h_full() - .map(|this| { - if use_card_layout { - this.bg(linear_gradient( - 90., - linear_color_stop(self.tool_card_header_bg(cx), 1.), - linear_color_stop(self.tool_card_header_bg(cx).opacity(0.2), 0.), - )) - } else { - this.bg(linear_gradient( - 90., - linear_color_stop(cx.theme().colors().panel_background, 1.), - linear_color_stop( - cx.theme().colors().panel_background.opacity(0.2), - 0., - ), - )) - } - }) - }; - let tool_output_display = if is_open { match &tool_call.status { @@ -2228,104 +2208,202 @@ impl AcpThreadView { } }) .mr_5() - .child( - h_flex() - .group(&card_header_id) - .relative() - .w_full() - .gap_1() - .justify_between() - .when(use_card_layout, |this| { - this.p_0p5() - .rounded_t(rems_from_px(5.)) + .map(|this| { + if is_terminal_tool { + this.child( + v_flex() + .p_1p5() + .gap_0p5() + .text_ui_sm(cx) .bg(self.tool_card_header_bg(cx)) - }) - .child( + .child( + Label::new("Run Command") + .buffer_font(cx) + .size(LabelSize::XSmall) + .color(Color::Muted), + ) + .child( + MarkdownElement::new( + tool_call.label.clone(), + terminal_command_markdown_style(window, cx), + ) + .code_block_renderer( + markdown::CodeBlockRenderer::Default { + copy_button: false, + copy_button_on_hover: false, + border: false, + }, + ) + ), + ) + } else { + this.child( h_flex() + .group(&card_header_id) .relative() .w_full() - .h(window.line_height() - px(2.)) - .text_size(self.tool_name_font_size()) - .gap_1p5() - .when(has_location || use_card_layout, |this| this.px_1()) - .when(has_location, |this| { - this.cursor(CursorStyle::PointingHand) - .rounded(rems_from_px(3.)) // Concentric border radius - .hover(|s| s.bg(cx.theme().colors().element_hover.opacity(0.5))) - }) - .overflow_hidden() - .child(tool_icon) - .child(if has_location { - h_flex() - .id(("open-tool-call-location", entry_ix)) - .w_full() - .map(|this| { - if use_card_layout { - this.text_color(cx.theme().colors().text) - } else { - this.text_color(cx.theme().colors().text_muted) - } - }) - .child(self.render_markdown( - tool_call.label.clone(), - MarkdownStyle { - prevent_mouse_interaction: true, - ..default_markdown_style(false, true, window, cx) - }, - )) - .tooltip(Tooltip::text("Jump to File")) - .on_click(cx.listener(move |this, _, window, cx| { - this.open_tool_call_location(entry_ix, 0, window, cx); - })) - .into_any_element() - } else { - h_flex() - .w_full() - .child(self.render_markdown( - tool_call.label.clone(), - default_markdown_style(false, true, window, cx), - )) - .into_any() + .gap_1() + .justify_between() + .when(use_card_layout, |this| { + this.p_0p5() + .rounded_t(rems_from_px(5.)) + .bg(self.tool_card_header_bg(cx)) }) - .when(!has_location, |this| this.child(gradient_overlay)), - ) - .when(is_collapsible || failed_or_canceled, |this| { - this.child( - h_flex() - .px_1() - .gap_px() - .when(is_collapsible, |this| { - this.child( - Disclosure::new(("expand", entry_ix), is_open) - .opened_icon(IconName::ChevronUp) - .closed_icon(IconName::ChevronDown) - .visible_on_hover(&card_header_id) - .on_click(cx.listener({ - let id = tool_call.id.clone(); - move |this: &mut Self, _, _, cx: &mut Context| { - if is_open { - this.expanded_tool_calls.remove(&id); - } else { - this.expanded_tool_calls.insert(id.clone()); - } - cx.notify(); - } - })), + .child(self.render_tool_call_label( + entry_ix, + tool_call, + is_edit, + use_card_layout, + window, + cx, + )) + .when(is_collapsible || failed_or_canceled, |this| { + this.child( + h_flex() + .px_1() + .gap_px() + .when(is_collapsible, |this| { + this.child( + Disclosure::new(("expand", entry_ix), is_open) + .opened_icon(IconName::ChevronUp) + .closed_icon(IconName::ChevronDown) + .visible_on_hover(&card_header_id) + .on_click(cx.listener({ + let id = tool_call.id.clone(); + move |this: &mut Self, _, _, cx: &mut Context| { + if is_open { + this.expanded_tool_calls.remove(&id); + } else { + this.expanded_tool_calls.insert(id.clone()); + } + cx.notify(); + } + })), + ) + }) + .when(failed_or_canceled, |this| { + this.child( + Icon::new(IconName::Close) + .color(Color::Error) + .size(IconSize::Small), + ) + }), ) - }) - .when(failed_or_canceled, |this| { - this.child( - Icon::new(IconName::Close) - .color(Color::Error) - .size(IconSize::Small), - ) - }), - ) - }), - ) + }), + ) + } + }) .children(tool_output_display) } + fn render_tool_call_label( + &self, + entry_ix: usize, + tool_call: &ToolCall, + is_edit: bool, + use_card_layout: bool, + window: &Window, + cx: &Context, + ) -> Div { + let has_location = tool_call.locations.len() == 1; + + let tool_icon = if tool_call.kind == acp::ToolKind::Edit && has_location { + FileIcons::get_icon(&tool_call.locations[0].path, cx) + .map(Icon::from_path) + .unwrap_or(Icon::new(IconName::ToolPencil)) + } else { + Icon::new(match tool_call.kind { + acp::ToolKind::Read => IconName::ToolSearch, + acp::ToolKind::Edit => IconName::ToolPencil, + acp::ToolKind::Delete => IconName::ToolDeleteFile, + acp::ToolKind::Move => IconName::ArrowRightLeft, + acp::ToolKind::Search => IconName::ToolSearch, + acp::ToolKind::Execute => IconName::ToolTerminal, + acp::ToolKind::Think => IconName::ToolThink, + acp::ToolKind::Fetch => IconName::ToolWeb, + acp::ToolKind::SwitchMode => IconName::ArrowRightLeft, + acp::ToolKind::Other => IconName::ToolHammer, + }) + } + .size(IconSize::Small) + .color(Color::Muted); + + let gradient_overlay = { + div() + .absolute() + .top_0() + .right_0() + .w_12() + .h_full() + .map(|this| { + if use_card_layout { + this.bg(linear_gradient( + 90., + linear_color_stop(self.tool_card_header_bg(cx), 1.), + linear_color_stop(self.tool_card_header_bg(cx).opacity(0.2), 0.), + )) + } else { + this.bg(linear_gradient( + 90., + linear_color_stop(cx.theme().colors().panel_background, 1.), + linear_color_stop( + cx.theme().colors().panel_background.opacity(0.2), + 0., + ), + )) + } + }) + }; + + h_flex() + .relative() + .w_full() + .h(window.line_height() - px(2.)) + .text_size(self.tool_name_font_size()) + .gap_1p5() + .when(has_location || use_card_layout, |this| this.px_1()) + .when(has_location, |this| { + this.cursor(CursorStyle::PointingHand) + .rounded(rems_from_px(3.)) // Concentric border radius + .hover(|s| s.bg(cx.theme().colors().element_hover.opacity(0.5))) + }) + .overflow_hidden() + .child(tool_icon) + .child(if has_location { + h_flex() + .id(("open-tool-call-location", entry_ix)) + .w_full() + .map(|this| { + if use_card_layout { + this.text_color(cx.theme().colors().text) + } else { + this.text_color(cx.theme().colors().text_muted) + } + }) + .child(self.render_markdown( + tool_call.label.clone(), + MarkdownStyle { + prevent_mouse_interaction: true, + ..default_markdown_style(false, true, window, cx) + }, + )) + .tooltip(Tooltip::text("Jump to File")) + .on_click(cx.listener(move |this, _, window, cx| { + this.open_tool_call_location(entry_ix, 0, window, cx); + })) + .into_any_element() + } else { + h_flex() + .w_full() + .child(self.render_markdown( + tool_call.label.clone(), + default_markdown_style(false, true, window, cx), + )) + .into_any() + }) + .when(!is_edit, |this| this.child(gradient_overlay)) + } + fn render_tool_call_content( &self, entry_ix: usize, @@ -2650,7 +2728,7 @@ impl AcpThreadView { let output_line_count = output.map(|output| output.content_line_count).unwrap_or(0); let command_failed = command_finished - && output.is_some_and(|o| o.exit_status.is_none_or(|status| !status.success())); + && output.is_some_and(|o| o.exit_status.is_some_and(|status| !status.success())); let time_elapsed = if let Some(output) = output { output.ended_at.duration_since(started_at) @@ -2673,7 +2751,7 @@ impl AcpThreadView { let working_dir = working_dir .as_ref() - .map(|path| format!("{}", path.display())) + .map(|path| path.display().to_string()) .unwrap_or_else(|| "current directory".to_string()); let is_expanded = self.expanded_tool_calls.contains(&tool_call.id); @@ -3197,10 +3275,14 @@ impl AcpThreadView { }; Button::new(SharedString::from(method_id.clone()), name) - .when(ix == 0, |el| { - el.style(ButtonStyle::Tinted(ui::TintColor::Warning)) - }) .label_size(LabelSize::Small) + .map(|this| { + if ix == 0 { + this.style(ButtonStyle::Tinted(TintColor::Warning)) + } else { + this.style(ButtonStyle::Outlined) + } + }) .on_click({ cx.listener(move |this, _, window, cx| { telemetry::event!( @@ -3307,6 +3389,12 @@ impl AcpThreadView { .into_any_element() } + fn activity_bar_bg(&self, cx: &Context) -> Hsla { + let editor_bg_color = cx.theme().colors().editor_background; + let active_color = cx.theme().colors().element_selected; + editor_bg_color.blend(active_color.opacity(0.3)) + } + fn render_activity_bar( &self, thread_entity: &Entity, @@ -3322,10 +3410,6 @@ impl AcpThreadView { return None; } - let editor_bg_color = cx.theme().colors().editor_background; - let active_color = cx.theme().colors().element_selected; - let bg_edit_files_disclosure = editor_bg_color.blend(active_color.opacity(0.3)); - // Temporarily always enable ACP edit controls. This is temporary, to lessen the // impact of a nasty bug that causes them to sometimes be disabled when they shouldn't // be, which blocks you from being able to accept or reject edits. This switches the @@ -3336,7 +3420,7 @@ impl AcpThreadView { v_flex() .mt_1() .mx_2() - .bg(bg_edit_files_disclosure) + .bg(self.activity_bar_bg(cx)) .border_1() .border_b_0() .border_color(cx.theme().colors().border) @@ -3377,27 +3461,33 @@ impl AcpThreadView { .into() } - fn render_plan_summary(&self, plan: &Plan, window: &mut Window, cx: &Context) -> Div { + fn render_plan_summary( + &self, + plan: &Plan, + window: &mut Window, + cx: &Context, + ) -> impl IntoElement { let stats = plan.stats(); let title = if let Some(entry) = stats.in_progress_entry && !self.plan_expanded { h_flex() - .w_full() .cursor_default() + .relative() + .w_full() .gap_1() - .text_xs() - .text_color(cx.theme().colors().text_muted) - .justify_between() + .truncate() .child( - h_flex() - .gap_1() - .child( - Label::new("Current:") - .size(LabelSize::Small) - .color(Color::Muted), - ) + Label::new("Current:") + .size(LabelSize::Small) + .color(Color::Muted), + ) + .child( + div() + .text_xs() + .text_color(cx.theme().colors().text_muted) + .line_clamp(1) .child(MarkdownElement::new( entry.content.clone(), plan_label_markdown_style(&entry.status, window, cx), @@ -3405,10 +3495,23 @@ impl AcpThreadView { ) .when(stats.pending > 0, |this| { this.child( - Label::new(format!("{} left", stats.pending)) - .size(LabelSize::Small) - .color(Color::Muted) - .mr_1(), + h_flex() + .absolute() + .top_0() + .right_0() + .h_full() + .child(div().min_w_8().h_full().bg(linear_gradient( + 90., + linear_color_stop(self.activity_bar_bg(cx), 1.), + linear_color_stop(self.activity_bar_bg(cx).opacity(0.2), 0.), + ))) + .child( + div().pr_0p5().bg(self.activity_bar_bg(cx)).child( + Label::new(format!("{} left", stats.pending)) + .size(LabelSize::Small) + .color(Color::Muted), + ), + ), ) }) } else { @@ -3438,23 +3541,19 @@ impl AcpThreadView { }; h_flex() + .id("plan_summary") .p_1() - .justify_between() + .w_full() + .gap_1() .when(self.plan_expanded, |this| { this.border_b_1().border_color(cx.theme().colors().border) }) - .child( - h_flex() - .id("plan_summary") - .w_full() - .gap_1() - .child(Disclosure::new("plan_disclosure", self.plan_expanded)) - .child(title) - .on_click(cx.listener(|this, _, _, cx| { - this.plan_expanded = !this.plan_expanded; - cx.notify(); - })), - ) + .child(Disclosure::new("plan_disclosure", self.plan_expanded)) + .child(title) + .on_click(cx.listener(|this, _, _, cx| { + this.plan_expanded = !this.plan_expanded; + cx.notify(); + })) } fn render_plan_entries(&self, plan: &Plan, window: &mut Window, cx: &Context) -> Div { @@ -3648,15 +3747,15 @@ impl AcpThreadView { |(index, (buffer, _diff))| { let file = buffer.read(cx).file()?; let path = file.path(); + let path_style = file.path_style(cx); + let separator = file.path_style(cx).separator(); let file_path = path.parent().and_then(|parent| { - let parent_str = parent.to_string_lossy(); - - if parent_str.is_empty() { + if parent.is_empty() { None } else { Some( - Label::new(format!("/{}{}", parent_str, std::path::MAIN_SEPARATOR_STR)) + Label::new(format!("{}{separator}", parent.display(path_style))) .color(Color::Muted) .size(LabelSize::XSmall) .buffer_font(cx), @@ -3665,12 +3764,12 @@ impl AcpThreadView { }); let file_name = path.file_name().map(|name| { - Label::new(name.to_string_lossy().to_string()) + Label::new(name.to_string()) .size(LabelSize::XSmall) .buffer_font(cx) }); - let file_icon = FileIcons::get_icon(path, cx) + let file_icon = FileIcons::get_icon(path.as_std_path(), cx) .map(Icon::from_path) .map(|icon| icon.color(Color::Muted).size(IconSize::Small)) .unwrap_or_else(|| { @@ -3703,7 +3802,7 @@ impl AcpThreadView { .id(("file-name", index)) .pr_8() .gap_1p5() - .max_w_full() + .w_full() .overflow_x_scroll() .child(file_icon) .child(h_flex().gap_0p5().children(file_name).children(file_path)) @@ -4513,7 +4612,7 @@ impl AcpThreadView { .read(cx) .visible_worktrees(cx) .next() - .map(|worktree| worktree.read(cx).root_name().to_string()) + .map(|worktree| worktree.read(cx).root_name_str().to_string()) }); if let Some(screen_window) = cx @@ -4855,9 +4954,9 @@ impl AcpThreadView { ) } - fn agent_font_size_changed(&mut self, _window: &mut Window, cx: &mut Context) { + fn agent_ui_font_size_changed(&mut self, _window: &mut Window, cx: &mut Context) { self.entry_view_state.update(cx, |entry_view_state, cx| { - entry_view_state.agent_font_size_changed(cx); + entry_view_state.agent_ui_font_size_changed(cx); }); } @@ -4873,10 +4972,12 @@ impl AcpThreadView { }) } + /// Inserts the selected text into the message editor or the message being + /// edited, if any. pub(crate) fn insert_selections(&self, window: &mut Window, cx: &mut Context) { - self.message_editor.update(cx, |message_editor, cx| { - message_editor.insert_selections(window, cx); - }) + self.active_editor(cx).update(cx, |editor, cx| { + editor.insert_selections(window, cx); + }); } fn render_thread_retry_status_callout( @@ -5287,6 +5388,23 @@ impl AcpThreadView { }; task.detach_and_log_err(cx); } + + /// Returns the currently active editor, either for a message that is being + /// edited or the editor for a new message. + fn active_editor(&self, cx: &App) -> Entity { + if let Some(index) = self.editing_message + && let Some(editor) = self + .entry_view_state + .read(cx) + .entry(index) + .and_then(|e| e.message_editor()) + .cloned() + { + editor + } else { + self.message_editor.clone() + } + } } fn loading_contents_spinner(size: IconSize) -> AnyElement { @@ -5301,7 +5419,7 @@ impl Focusable for AcpThreadView { fn focus_handle(&self, cx: &App) -> FocusHandle { match self.thread_state { ThreadState::Loading { .. } | ThreadState::Ready { .. } => { - self.message_editor.focus_handle(cx) + self.active_editor(cx).focus_handle(cx) } ThreadState::LoadError(_) | ThreadState::Unauthenticated { .. } => { self.focus_handle.clone() @@ -5487,23 +5605,23 @@ fn default_markdown_style( }), code_block: StyleRefinement { padding: EdgesRefinement { - top: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(Pixels(8.)))), - left: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(Pixels(8.)))), - right: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(Pixels(8.)))), - bottom: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(Pixels(8.)))), + top: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(8.)))), + left: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(8.)))), + right: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(8.)))), + bottom: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(8.)))), }, margin: EdgesRefinement { - top: Some(Length::Definite(Pixels(8.).into())), - left: Some(Length::Definite(Pixels(0.).into())), - right: Some(Length::Definite(Pixels(0.).into())), - bottom: Some(Length::Definite(Pixels(12.).into())), + top: Some(Length::Definite(px(8.).into())), + left: Some(Length::Definite(px(0.).into())), + right: Some(Length::Definite(px(0.).into())), + bottom: Some(Length::Definite(px(12.).into())), }, border_style: Some(BorderStyle::Solid), border_widths: EdgesRefinement { - top: Some(AbsoluteLength::Pixels(Pixels(1.))), - left: Some(AbsoluteLength::Pixels(Pixels(1.))), - right: Some(AbsoluteLength::Pixels(Pixels(1.))), - bottom: Some(AbsoluteLength::Pixels(Pixels(1.))), + top: Some(AbsoluteLength::Pixels(px(1.))), + left: Some(AbsoluteLength::Pixels(px(1.))), + right: Some(AbsoluteLength::Pixels(px(1.))), + bottom: Some(AbsoluteLength::Pixels(px(1.))), }, border_color: Some(colors.border_variant), background: Some(colors.editor_background.into()), @@ -5988,7 +6106,7 @@ pub(crate) mod tests { Project::init_settings(cx); AgentSettings::register(cx); workspace::init_settings(cx); - ThemeSettings::register(cx); + theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); EditorSettings::register(cx); prompt_store::init(cx) @@ -6562,4 +6680,146 @@ pub(crate) mod tests { ) }); } + + #[gpui::test] + async fn test_message_editing_insert_selections(cx: &mut TestAppContext) { + init_test(cx); + + let connection = StubAgentConnection::new(); + connection.set_next_prompt_updates(vec![acp::SessionUpdate::AgentMessageChunk { + content: acp::ContentBlock::Text(acp::TextContent { + text: "Response".into(), + annotations: None, + meta: None, + }), + }]); + + let (thread_view, cx) = setup_thread_view(StubAgentServer::new(connection), cx).await; + add_to_workspace(thread_view.clone(), cx); + + let message_editor = cx.read(|cx| thread_view.read(cx).message_editor.clone()); + message_editor.update_in(cx, |editor, window, cx| { + editor.set_text("Original message to edit", window, cx) + }); + thread_view.update_in(cx, |thread_view, window, cx| thread_view.send(window, cx)); + cx.run_until_parked(); + + let user_message_editor = thread_view.read_with(cx, |thread_view, cx| { + thread_view + .entry_view_state + .read(cx) + .entry(0) + .expect("Should have at least one entry") + .message_editor() + .expect("Should have message editor") + .clone() + }); + + cx.focus(&user_message_editor); + thread_view.read_with(cx, |thread_view, _cx| { + assert_eq!(thread_view.editing_message, Some(0)); + }); + + // Ensure to edit the focused message before proceeding otherwise, since + // its content is not different from what was sent, focus will be lost. + user_message_editor.update_in(cx, |editor, window, cx| { + editor.set_text("Original message to edit with ", window, cx) + }); + + // Create a simple buffer with some text so we can create a selection + // that will then be added to the message being edited. + let (workspace, project) = thread_view.read_with(cx, |thread_view, _cx| { + (thread_view.workspace.clone(), thread_view.project.clone()) + }); + let buffer = project.update(cx, |project, cx| { + project.create_local_buffer("let a = 10 + 10;", None, false, cx) + }); + + workspace + .update_in(cx, |workspace, window, cx| { + let editor = cx.new(|cx| { + let mut editor = + Editor::for_buffer(buffer.clone(), Some(project.clone()), window, cx); + + editor.change_selections(Default::default(), window, cx, |selections| { + selections.select_ranges([8..15]); + }); + + editor + }); + workspace.add_item_to_active_pane(Box::new(editor), None, false, window, cx); + }) + .unwrap(); + + thread_view.update_in(cx, |thread_view, window, cx| { + assert_eq!(thread_view.editing_message, Some(0)); + thread_view.insert_selections(window, cx); + }); + + user_message_editor.read_with(cx, |editor, cx| { + let text = editor.editor().read(cx).text(cx); + let expected_text = String::from("Original message to edit with selection "); + + assert_eq!(text, expected_text); + }); + } + + #[gpui::test] + async fn test_insert_selections(cx: &mut TestAppContext) { + init_test(cx); + + let connection = StubAgentConnection::new(); + connection.set_next_prompt_updates(vec![acp::SessionUpdate::AgentMessageChunk { + content: acp::ContentBlock::Text(acp::TextContent { + text: "Response".into(), + annotations: None, + meta: None, + }), + }]); + + let (thread_view, cx) = setup_thread_view(StubAgentServer::new(connection), cx).await; + add_to_workspace(thread_view.clone(), cx); + + let message_editor = cx.read(|cx| thread_view.read(cx).message_editor.clone()); + message_editor.update_in(cx, |editor, window, cx| { + editor.set_text("Can you review this snippet ", window, cx) + }); + + // Create a simple buffer with some text so we can create a selection + // that will then be added to the message being edited. + let (workspace, project) = thread_view.read_with(cx, |thread_view, _cx| { + (thread_view.workspace.clone(), thread_view.project.clone()) + }); + let buffer = project.update(cx, |project, cx| { + project.create_local_buffer("let a = 10 + 10;", None, false, cx) + }); + + workspace + .update_in(cx, |workspace, window, cx| { + let editor = cx.new(|cx| { + let mut editor = + Editor::for_buffer(buffer.clone(), Some(project.clone()), window, cx); + + editor.change_selections(Default::default(), window, cx, |selections| { + selections.select_ranges([8..15]); + }); + + editor + }); + workspace.add_item_to_active_pane(Box::new(editor), None, false, window, cx); + }) + .unwrap(); + + thread_view.update_in(cx, |thread_view, window, cx| { + assert_eq!(thread_view.editing_message, None); + thread_view.insert_selections(window, cx); + }); + + thread_view.read_with(cx, |thread_view, cx| { + let text = thread_view.message_editor.read(cx).text(cx); + let expected_txt = String::from("Can you review this snippet selection "); + + assert_eq!(text, expected_txt); + }) + } } diff --git a/crates/agent_ui/src/agent_configuration.rs b/crates/agent_ui/src/agent_configuration.rs index faa6b524ff49fffbd5c8113e164b2c9ab158d71a..b447617c340dedb6795c0c950f08eee8f0c6d59e 100644 --- a/crates/agent_ui/src/agent_configuration.rs +++ b/crates/agent_ui/src/agent_configuration.rs @@ -1,5 +1,6 @@ mod add_llm_provider_modal; mod configure_context_server_modal; +mod configure_context_server_tools_modal; mod manage_profiles_modal; mod tool_picker; @@ -25,12 +26,8 @@ use language_model::{ }; use notifications::status_toast::{StatusToast, ToastIcon}; use project::{ - agent_server_store::{ - AgentServerCommand, AgentServerStore, AllAgentServersSettings, CLAUDE_CODE_NAME, - CustomAgentServerSettings, GEMINI_NAME, - }, + agent_server_store::{AgentServerStore, CLAUDE_CODE_NAME, CODEX_NAME, GEMINI_NAME}, context_server_store::{ContextServerConfiguration, ContextServerStatus, ContextServerStore}, - project_settings::{ContextServerSettings, ProjectSettings}, }; use settings::{Settings, SettingsStore, update_settings_file}; use ui::{ @@ -42,12 +39,12 @@ use workspace::{Workspace, create_and_open_local_file}; use zed_actions::ExtensionCategoryFilter; pub(crate) use configure_context_server_modal::ConfigureContextServerModal; +pub(crate) use configure_context_server_tools_modal::ConfigureContextServerToolsModal; pub(crate) use manage_profiles_modal::ManageProfilesModal; use crate::{ - AddContextServer, ExternalAgent, NewExternalAgentThread, + AddContextServer, agent_configuration::add_llm_provider_modal::{AddLlmProviderModal, LlmCompatibleProvider}, - placeholder_command, }; pub struct AgentConfiguration { @@ -200,9 +197,8 @@ impl AgentConfiguration { .when(is_expanded, |this| this.mb_2()) .child( div() - .opacity(0.6) .px_2() - .child(Divider::horizontal().color(DividerColor::Border)), + .child(Divider::horizontal().color(DividerColor::BorderFaded)), ) .child( h_flex() @@ -227,7 +223,7 @@ impl AgentConfiguration { .child( h_flex() .w_full() - .gap_2() + .gap_1p5() .child( Icon::new(provider.icon()) .size(IconSize::Small) @@ -274,13 +270,28 @@ impl AgentConfiguration { *is_expanded = !*is_expanded; } })), - ) - .when(provider.is_authenticated(cx), |parent| { + ), + ) + .child( + v_flex() + .w_full() + .px_2() + .gap_1() + .when(is_expanded, |parent| match configuration_view { + Some(configuration_view) => parent.child(configuration_view), + None => parent.child(Label::new(format!( + "No configuration view for {provider_name}", + ))), + }) + .when(is_expanded && provider.is_authenticated(cx), |parent| { parent.child( Button::new( SharedString::from(format!("new-thread-{provider_id}")), "Start New Thread", ) + .full_width() + .style(ButtonStyle::Filled) + .layer(ElevationIndex::ModalSurface) .icon_position(IconPosition::Start) .icon(IconName::Thread) .icon_size(IconSize::Small) @@ -297,17 +308,6 @@ impl AgentConfiguration { ) }), ) - .child( - div() - .w_full() - .px_2() - .when(is_expanded, |parent| match configuration_view { - Some(configuration_view) => parent.child(configuration_view), - None => parent.child(Label::new(format!( - "No configuration view for {provider_name}", - ))), - }), - ) } fn render_provider_configuration_section( @@ -341,6 +341,8 @@ impl AgentConfiguration { PopoverMenu::new("add-provider-popover") .trigger( Button::new("add-provider", "Add Provider") + .style(ButtonStyle::Filled) + .layer(ElevationIndex::ModalSurface) .icon_position(IconPosition::Start) .icon(IconName::Plus) .icon_size(IconSize::Small) @@ -406,15 +408,15 @@ impl AgentConfiguration { SwitchField::new( "always-allow-tool-actions-switch", - "Allow running commands without asking for confirmation", + Some("Allow running commands without asking for confirmation"), Some( "The agent can perform potentially destructive actions without asking for your confirmation.".into(), ), always_allow_tool_actions, move |state, _window, cx| { let allow = state == &ToggleState::Selected; - update_settings_file::(fs.clone(), cx, move |settings, _| { - settings.set_always_allow_tool_actions(allow); + update_settings_file(fs.clone(), cx, move |settings, _| { + settings.agent.get_or_insert_default().set_always_allow_tool_actions(allow); }); }, ) @@ -426,13 +428,16 @@ impl AgentConfiguration { SwitchField::new( "single-file-review", - "Enable single-file agent reviews", + Some("Enable single-file agent reviews"), Some("Agent edits are also displayed in single-file editors for review.".into()), single_file_review, move |state, _window, cx| { let allow = state == &ToggleState::Selected; - update_settings_file::(fs.clone(), cx, move |settings, _| { - settings.set_single_file_review(allow); + update_settings_file(fs.clone(), cx, move |settings, _| { + settings + .agent + .get_or_insert_default() + .set_single_file_review(allow); }); }, ) @@ -444,15 +449,15 @@ impl AgentConfiguration { SwitchField::new( "sound-notification", - "Play sound when finished generating", + Some("Play sound when finished generating"), Some( "Hear a notification sound when the agent is done generating changes or needs your input.".into(), ), play_sound_when_agent_done, move |state, _window, cx| { let allow = state == &ToggleState::Selected; - update_settings_file::(fs.clone(), cx, move |settings, _| { - settings.set_play_sound_when_agent_done(allow); + update_settings_file(fs.clone(), cx, move |settings, _| { + settings.agent.get_or_insert_default().set_play_sound_when_agent_done(allow); }); }, ) @@ -464,15 +469,15 @@ impl AgentConfiguration { SwitchField::new( "modifier-send", - "Use modifier to submit a message", + Some("Use modifier to submit a message"), Some( "Make a modifier (cmd-enter on macOS, ctrl-enter on Linux or Windows) required to send messages.".into(), ), use_modifier_to_send, move |state, _window, cx| { let allow = state == &ToggleState::Selected; - update_settings_file::(fs.clone(), cx, move |settings, _| { - settings.set_use_modifier_to_send(allow); + update_settings_file(fs.clone(), cx, move |settings, _| { + settings.agent.get_or_insert_default().set_use_modifier_to_send(allow); }); }, ) @@ -529,10 +534,6 @@ impl AgentConfiguration { } } - fn card_item_bg_color(&self, cx: &mut Context) -> Hsla { - cx.theme().colors().background.opacity(0.25) - } - fn card_item_border_color(&self, cx: &mut Context) -> Hsla { cx.theme().colors().border.opacity(0.6) } @@ -542,61 +543,46 @@ impl AgentConfiguration { window: &mut Window, cx: &mut Context, ) -> impl IntoElement { - let context_server_ids = self.context_server_store.read(cx).configured_server_ids(); + let mut context_server_ids = self + .context_server_store + .read(cx) + .server_ids(cx) + .into_iter() + .collect::>(); - v_flex() - .p(DynamicSpacing::Base16.rems(cx)) - .pr(DynamicSpacing::Base20.rems(cx)) - .gap_2() - .border_b_1() - .border_color(cx.theme().colors().border) - .child( - v_flex() - .gap_0p5() - .child(Headline::new("Model Context Protocol (MCP) Servers")) - .child( - Label::new( - "All context servers connected through the Model Context Protocol.", - ) - .color(Color::Muted), - ), - ) - .children( - context_server_ids.into_iter().map(|context_server_id| { - self.render_context_server(context_server_id, window, cx) - }), + // Sort context servers: ones without mcp-server- prefix first, then prefixed ones + context_server_ids.sort_by(|a, b| { + const MCP_PREFIX: &str = "mcp-server-"; + match (a.0.strip_prefix(MCP_PREFIX), b.0.strip_prefix(MCP_PREFIX)) { + // If one has mcp-server- prefix and other doesn't, non-mcp comes first + (Some(_), None) => std::cmp::Ordering::Greater, + (None, Some(_)) => std::cmp::Ordering::Less, + // If both have same prefix status, sort by appropriate key + (Some(a), Some(b)) => a.cmp(b), + (None, None) => a.0.cmp(&b.0), + } + }); + + let add_server_popover = PopoverMenu::new("add-server-popover") + .trigger( + Button::new("add-server", "Add Server") + .style(ButtonStyle::Filled) + .layer(ElevationIndex::ModalSurface) + .icon_position(IconPosition::Start) + .icon(IconName::Plus) + .icon_size(IconSize::Small) + .icon_color(Color::Muted) + .label_size(LabelSize::Small), ) - .child( - h_flex() - .justify_between() - .gap_1p5() - .child( - h_flex().w_full().child( - Button::new("add-context-server", "Add Custom Server") - .style(ButtonStyle::Filled) - .layer(ElevationIndex::ModalSurface) - .full_width() - .icon(IconName::Plus) - .icon_size(IconSize::Small) - .icon_position(IconPosition::Start) - .on_click(|_event, window, cx| { - window.dispatch_action(AddContextServer.boxed_clone(), cx) - }), - ), - ) - .child( - h_flex().w_full().child( - Button::new( - "install-context-server-extensions", - "Install MCP Extensions", - ) - .style(ButtonStyle::Filled) - .layer(ElevationIndex::ModalSurface) - .full_width() - .icon(IconName::ToolHammer) - .icon_size(IconSize::Small) - .icon_position(IconPosition::Start) - .on_click(|_event, window, cx| { + .anchor(gpui::Corner::TopRight) + .menu({ + move |window, cx| { + Some(ContextMenu::build(window, cx, |menu, _window, _cx| { + menu.entry("Add Custom Server", None, { + |window, cx| window.dispatch_action(AddContextServer.boxed_clone(), cx) + }) + .entry("Install from Extensions", None, { + |window, cx| { window.dispatch_action( zed_actions::Extensions { category_filter: Some( @@ -607,10 +593,68 @@ impl AgentConfiguration { .boxed_clone(), cx, ) - }), - ), - ), + } + }) + })) + } + }); + + v_flex() + .p(DynamicSpacing::Base16.rems(cx)) + .pr(DynamicSpacing::Base20.rems(cx)) + .gap_2() + .border_b_1() + .border_color(cx.theme().colors().border) + .child( + h_flex() + .w_full() + .items_start() + .justify_between() + .gap_1() + .child( + v_flex() + .gap_0p5() + .child(Headline::new("Model Context Protocol (MCP) Servers")) + .child( + Label::new( + "All MCP servers connected directly or via a Zed extension.", + ) + .color(Color::Muted), + ), + ) + .child(add_server_popover), ) + .child(v_flex().w_full().gap_1().map(|mut parent| { + if context_server_ids.is_empty() { + parent.child( + h_flex() + .p_4() + .justify_center() + .border_1() + .border_dashed() + .border_color(cx.theme().colors().border.opacity(0.6)) + .rounded_sm() + .child( + Label::new("No MCP servers added yet.") + .color(Color::Muted) + .size(LabelSize::Small), + ), + ) + } else { + for (index, context_server_id) in context_server_ids.into_iter().enumerate() { + if index > 0 { + parent = parent.child( + Divider::horizontal() + .color(DividerColor::BorderFaded) + .into_any_element(), + ); + } + parent = + parent.child(self.render_context_server(context_server_id, window, cx)); + } + parent + } + })) } fn render_context_server( @@ -703,7 +747,7 @@ impl AgentConfiguration { IconButton::new("context-server-config-menu", IconName::Settings) .icon_color(Color::Muted) .icon_size(IconSize::Small), - Tooltip::text("Open MCP server options"), + Tooltip::text("Configure MCP Server"), ) .anchor(Corner::TopRight) .menu({ @@ -712,6 +756,8 @@ impl AgentConfiguration { let language_registry = self.language_registry.clone(); let context_server_store = self.context_server_store.clone(); let workspace = self.workspace.clone(); + let tools = self.tools.clone(); + move |window, cx| { Some(ContextMenu::build(window, cx, |menu, _window, _cx| { menu.entry("Configure Server", None, { @@ -728,7 +774,28 @@ impl AgentConfiguration { ) .detach_and_log_err(cx); } - }) + }).when(tool_count >= 1, |this| this.entry("View Tools", None, { + let context_server_id = context_server_id.clone(); + let tools = tools.clone(); + let workspace = workspace.clone(); + + move |window, cx| { + let context_server_id = context_server_id.clone(); + let tools = tools.clone(); + let workspace = workspace.clone(); + + workspace.update(cx, |workspace, cx| { + ConfigureContextServerToolsModal::toggle( + context_server_id, + tools, + workspace, + window, + cx, + ); + }) + .ok(); + } + })) .separator() .entry("Uninstall", None, { let fs = fs.clone(); @@ -774,14 +841,14 @@ impl AgentConfiguration { async move |cx| { uninstall_extension_task.await?; cx.update(|cx| { - update_settings_file::( + update_settings_file( fs.clone(), cx, { let context_server_id = context_server_id.clone(); move |settings, _| { - settings + settings.project .context_servers .remove(&context_server_id.0); } @@ -799,17 +866,11 @@ impl AgentConfiguration { v_flex() .id(item_id.clone()) - .border_1() - .rounded_md() - .border_color(self.card_item_border_color(cx)) - .bg(self.card_item_bg_color(cx)) - .overflow_hidden() .child( h_flex() - .p_1() .justify_between() .when( - error.is_some() || are_tools_expanded && tool_count >= 1, + error.is_none() && are_tools_expanded && tool_count >= 1, |element| { element .border_b_1() @@ -818,40 +879,25 @@ impl AgentConfiguration { ) .child( h_flex() - .child( - Disclosure::new( - "tool-list-disclosure", - are_tools_expanded || error.is_some(), - ) - .disabled(tool_count == 0) - .on_click(cx.listener({ - let context_server_id = context_server_id.clone(); - move |this, _event, _window, _cx| { - let is_open = this - .expanded_context_server_tools - .entry(context_server_id.clone()) - .or_insert(false); - - *is_open = !*is_open; - } - })), - ) + .flex_1() + .min_w_0() .child( h_flex() .id(SharedString::from(format!("tooltip-{}", item_id))) .h_full() .w_3() - .mx_1() + .mr_2() .justify_center() .tooltip(Tooltip::text(tooltip_text)) .child(status_indicator), ) - .child(Label::new(item_id).ml_0p5()) + .child(Label::new(item_id).truncate()) .child( div() .id("extension-source") .mt_0p5() .mx_1() + .flex_none() .tooltip(Tooltip::text(source_tooltip)) .child( Icon::new(source_icon) @@ -873,78 +919,65 @@ impl AgentConfiguration { ) .child( h_flex() - .gap_1() + .gap_0p5() + .flex_none() .child(context_server_configuration_menu) .child( - Switch::new("context-server-switch", is_running.into()) - .color(SwitchColor::Accent) - .on_click({ - let context_server_manager = - self.context_server_store.clone(); - let fs = self.fs.clone(); - - move |state, _window, cx| { - let is_enabled = match state { - ToggleState::Unselected - | ToggleState::Indeterminate => { - context_server_manager.update( - cx, - |this, cx| { - this.stop_server( - &context_server_id, - cx, - ) - .log_err(); - }, - ); - false - } - ToggleState::Selected => { - context_server_manager.update( - cx, - |this, cx| { - if let Some(server) = - this.get_server(&context_server_id) - { - this.start_server(server, cx); - } - }, - ); - true - } - }; - update_settings_file::( - fs.clone(), - cx, - { - let context_server_id = - context_server_id.clone(); - - move |settings, _| { - settings - .context_servers - .entry(context_server_id.0) - .or_insert_with(|| { - ContextServerSettings::Extension { - enabled: is_enabled, - settings: serde_json::json!({}), - } - }) - .set_enabled(is_enabled); + Switch::new("context-server-switch", is_running.into()) + .color(SwitchColor::Accent) + .on_click({ + let context_server_manager = self.context_server_store.clone(); + let fs = self.fs.clone(); + + move |state, _window, cx| { + let is_enabled = match state { + ToggleState::Unselected + | ToggleState::Indeterminate => { + context_server_manager.update(cx, |this, cx| { + this.stop_server(&context_server_id, cx) + .log_err(); + }); + false + } + ToggleState::Selected => { + context_server_manager.update(cx, |this, cx| { + if let Some(server) = + this.get_server(&context_server_id) + { + this.start_server(server, cx); } - }, - ); - } - }), - ), + }); + true + } + }; + update_settings_file(fs.clone(), cx, { + let context_server_id = context_server_id.clone(); + + move |settings, _| { + settings + .project + .context_servers + .entry(context_server_id.0) + .or_insert_with(|| { + settings::ContextServerSettingsContent::Extension { + enabled: is_enabled, + settings: serde_json::json!({}), + } + }) + .set_enabled(is_enabled); + } + }); + } + }), + ), ), ) .map(|parent| { if let Some(error) = error { return parent.child( h_flex() - .p_2() .gap_2() + .pr_4() .items_start() .child( h_flex() @@ -972,60 +1005,26 @@ impl AgentConfiguration { return parent; } - parent.child(v_flex().py_1p5().px_1().gap_1().children( - tools.iter().enumerate().map(|(ix, tool)| { - h_flex() - .id(("tool-item", ix)) - .px_1() - .gap_2() - .justify_between() - .hover(|style| style.bg(cx.theme().colors().element_hover)) - .rounded_sm() - .child( - Label::new(tool.name()) - .buffer_font(cx) - .size(LabelSize::Small), - ) - .child( - Icon::new(IconName::Info) - .size(IconSize::Small) - .color(Color::Ignored), - ) - .tooltip(Tooltip::text(tool.description())) - }), - )) + parent }) } fn render_agent_servers_section(&mut self, cx: &mut Context) -> impl IntoElement { - let custom_settings = cx - .global::() - .get::(None) - .custom - .clone(); let user_defined_agents = self .agent_server_store .read(cx) .external_agents() - .filter(|name| name.0 != GEMINI_NAME && name.0 != CLAUDE_CODE_NAME) + .filter(|name| { + name.0 != GEMINI_NAME && name.0 != CLAUDE_CODE_NAME && name.0 != CODEX_NAME + }) .cloned() .collect::>(); + let user_defined_agents = user_defined_agents .into_iter() .map(|name| { - self.render_agent_server( - IconName::Ai, - name.clone(), - ExternalAgent::Custom { - name: name.clone().into(), - command: custom_settings - .get(&name.0) - .map(|settings| settings.command.clone()) - .unwrap_or(placeholder_command()), - }, - cx, - ) - .into_any_element() + self.render_agent_server(IconName::Ai, name) + .into_any_element() }) .collect::>(); @@ -1049,6 +1048,8 @@ impl AgentConfiguration { .child(Headline::new("External Agents")) .child( Button::new("add-agent", "Add Agent") + .style(ButtonStyle::Filled) + .layer(ElevationIndex::ModalSurface) .icon_position(IconPosition::Start) .icon(IconName::Plus) .icon_size(IconSize::Small) @@ -1078,19 +1079,27 @@ impl AgentConfiguration { .color(Color::Muted), ), ) - .child(self.render_agent_server( - IconName::AiGemini, - "Gemini CLI", - ExternalAgent::Gemini, - cx, - )) .child(self.render_agent_server( IconName::AiClaude, "Claude Code", - ExternalAgent::ClaudeCode, - cx, )) - .children(user_defined_agents), + .child(Divider::horizontal().color(DividerColor::BorderFaded)) + .child(self.render_agent_server( + IconName::AiOpenAi, + "Codex", + )) + .child(Divider::horizontal().color(DividerColor::BorderFaded)) + .child(self.render_agent_server( + IconName::AiGemini, + "Gemini CLI", + )) + .map(|mut parent| { + for agent in user_defined_agents { + parent = parent.child(Divider::horizontal().color(DividerColor::BorderFaded)) + .child(agent); + } + parent + }) ) } @@ -1098,46 +1107,18 @@ impl AgentConfiguration { &self, icon: IconName, name: impl Into, - agent: ExternalAgent, - cx: &mut Context, ) -> impl IntoElement { - let name = name.into(); - h_flex() - .p_1() - .pl_2() - .gap_1p5() - .justify_between() - .border_1() - .rounded_md() - .border_color(self.card_item_border_color(cx)) - .bg(self.card_item_bg_color(cx)) - .overflow_hidden() - .child( - h_flex() - .gap_1p5() - .child(Icon::new(icon).size(IconSize::Small).color(Color::Muted)) - .child(Label::new(name.clone())), - ) - .child( - Button::new( - SharedString::from(format!("start_acp_thread-{name}")), - "Start New Thread", - ) - .label_size(LabelSize::Small) - .icon(IconName::Thread) - .icon_position(IconPosition::Start) - .icon_size(IconSize::XSmall) - .icon_color(Color::Muted) - .on_click(move |_, window, cx| { - window.dispatch_action( - NewExternalAgentThread { - agent: Some(agent.clone()), - } - .boxed_clone(), - cx, - ); - }), - ) + h_flex().gap_1p5().justify_between().child( + h_flex() + .gap_1p5() + .child(Icon::new(icon).size(IconSize::Small).color(Color::Muted)) + .child(Label::new(name.into())) + .child( + Icon::new(IconName::Check) + .size(IconSize::Small) + .color(Color::Success), + ), + ) } } @@ -1233,15 +1214,12 @@ fn show_unable_to_uninstall_extension_with_context_server( let context_server_id = context_server_id.clone(); async move |_workspace_handle, cx| { cx.update(|cx| { - update_settings_file::( - fs, - cx, - move |settings, _| { - settings - .context_servers - .remove(&context_server_id.0); - }, - ); + update_settings_file(fs, cx, move |settings, _| { + settings + .project + .context_servers + .remove(&context_server_id.0); + }); })?; anyhow::Ok(()) } @@ -1279,7 +1257,7 @@ async fn open_new_agent_servers_entry_in_settings_editor( let settings = cx.global::(); let mut unique_server_name = None; - let edits = settings.edits_for_update::(&text, |file| { + let edits = settings.edits_for_update(&text, |settings| { let server_name: Option = (0..u8::MAX) .map(|i| { if i == 0 { @@ -1288,20 +1266,27 @@ async fn open_new_agent_servers_entry_in_settings_editor( format!("your_agent_{}", i).into() } }) - .find(|name| !file.custom.contains_key(name)); + .find(|name| { + !settings + .agent_servers + .as_ref() + .is_some_and(|agent_servers| agent_servers.custom.contains_key(name)) + }); if let Some(server_name) = server_name { unique_server_name = Some(server_name.clone()); - file.custom.insert( - server_name, - CustomAgentServerSettings { - command: AgentServerCommand { + settings + .agent_servers + .get_or_insert_default() + .custom + .insert( + server_name, + settings::CustomAgentServerSettings { path: "path_to_executable".into(), args: vec![], env: Some(HashMap::default()), + default_mode: None, }, - default_mode: None, - }, - ); + ); } }); diff --git a/crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs b/crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs index 182831f488870997d175cce0ad7e1c94e392f1ea..5e1712e626da98c60834da28906afa3eb30b92e6 100644 --- a/crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs +++ b/crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs @@ -5,11 +5,8 @@ use collections::HashSet; use fs::Fs; use gpui::{DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Render, Task}; use language_model::LanguageModelRegistry; -use language_models::{ - AllLanguageModelSettings, OpenAiCompatibleSettingsContent, - provider::open_ai_compatible::{AvailableModel, ModelCapabilities}, -}; -use settings::update_settings_file; +use language_models::provider::open_ai_compatible::{AvailableModel, ModelCapabilities}; +use settings::{OpenAiCompatibleSettingsContent, update_settings_file}; use ui::{ Banner, Checkbox, KeyBinding, Modal, ModalFooter, ModalHeader, Section, ToggleState, prelude::*, }; @@ -238,14 +235,19 @@ fn save_provider_to_settings( task.await .map_err(|_| "Failed to write API key to keychain")?; cx.update(|cx| { - update_settings_file::(fs, cx, |settings, _cx| { - settings.openai_compatible.get_or_insert_default().insert( - provider_name, - OpenAiCompatibleSettingsContent { - api_url, - available_models: models, - }, - ); + update_settings_file(fs, cx, |settings, _cx| { + settings + .language_models + .get_or_insert_default() + .openai_compatible + .get_or_insert_default() + .insert( + provider_name, + OpenAiCompatibleSettingsContent { + api_url, + available_models: models, + }, + ); }); }) .ok(); @@ -617,10 +619,10 @@ mod tests { cx.update(|_window, cx| { LanguageModelRegistry::global(cx).update(cx, |registry, cx| { registry.register_provider( - FakeLanguageModelProvider::new( + Arc::new(FakeLanguageModelProvider::new( LanguageModelProviderId::new("someprovider"), LanguageModelProviderName::new("Some Provider"), - ), + )), cx, ); }); diff --git a/crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs b/crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs index 4d338840143fbcf007f7d5c66e2406ef4bb9fc88..ce8e167dab3ed2e4d84c4afd747cb266740f1d42 100644 --- a/crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs +++ b/crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs @@ -422,18 +422,17 @@ impl ConfigureContextServerModal { workspace.update(cx, |workspace, cx| { let fs = workspace.app_state().fs.clone(); let original_server_id = self.original_server_id.clone(); - update_settings_file::( - fs.clone(), - cx, - move |project_settings, _| { - if let Some(original_id) = original_server_id { - if original_id != id { - project_settings.context_servers.remove(&original_id.0); - } + update_settings_file(fs.clone(), cx, move |current, _| { + if let Some(original_id) = original_server_id { + if original_id != id { + current.project.context_servers.remove(&original_id.0); } - project_settings.context_servers.insert(id.0, settings); - }, - ); + } + current + .project + .context_servers + .insert(id.0, settings.into()); + }); }); } else if let Some(existing_server) = existing_server { self.context_server_store diff --git a/crates/agent_ui/src/agent_configuration/configure_context_server_tools_modal.rs b/crates/agent_ui/src/agent_configuration/configure_context_server_tools_modal.rs new file mode 100644 index 0000000000000000000000000000000000000000..5a59806972ecf1b6cbc0702809c98acf1a86b387 --- /dev/null +++ b/crates/agent_ui/src/agent_configuration/configure_context_server_tools_modal.rs @@ -0,0 +1,176 @@ +use assistant_tool::{ToolSource, ToolWorkingSet}; +use context_server::ContextServerId; +use gpui::{ + DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, ScrollHandle, Window, prelude::*, +}; +use ui::{Divider, DividerColor, Modal, ModalHeader, WithScrollbar, prelude::*}; +use workspace::{ModalView, Workspace}; + +pub struct ConfigureContextServerToolsModal { + context_server_id: ContextServerId, + tools: Entity, + focus_handle: FocusHandle, + expanded_tools: std::collections::HashMap, + scroll_handle: ScrollHandle, +} + +impl ConfigureContextServerToolsModal { + fn new( + context_server_id: ContextServerId, + tools: Entity, + _window: &mut Window, + cx: &mut Context, + ) -> Self { + Self { + context_server_id, + tools, + focus_handle: cx.focus_handle(), + expanded_tools: std::collections::HashMap::new(), + scroll_handle: ScrollHandle::new(), + } + } + + pub fn toggle( + context_server_id: ContextServerId, + tools: Entity, + workspace: &mut Workspace, + window: &mut Window, + cx: &mut Context, + ) { + workspace.toggle_modal(window, cx, |window, cx| { + Self::new(context_server_id, tools, window, cx) + }); + } + + fn cancel(&mut self, _: &menu::Cancel, _: &mut Window, cx: &mut Context) { + cx.emit(DismissEvent) + } + + fn render_modal_content( + &self, + window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + let tools_by_source = self.tools.read(cx).tools_by_source(cx); + let server_tools = tools_by_source + .get(&ToolSource::ContextServer { + id: self.context_server_id.0.clone().into(), + }) + .map(|tools| tools.as_slice()) + .unwrap_or(&[]); + + div() + .size_full() + .pb_2() + .child( + v_flex() + .id("modal_content") + .px_2() + .gap_1() + .max_h_128() + .overflow_y_scroll() + .track_scroll(&self.scroll_handle) + .children(server_tools.iter().enumerate().flat_map(|(index, tool)| { + let tool_name = tool.name(); + let is_expanded = self + .expanded_tools + .get(&tool_name) + .copied() + .unwrap_or(false); + + let icon = if is_expanded { + IconName::ChevronUp + } else { + IconName::ChevronDown + }; + + let mut items = vec![ + v_flex() + .child( + h_flex() + .id(SharedString::from(format!("tool-header-{}", index))) + .py_1() + .pl_1() + .pr_2() + .w_full() + .justify_between() + .rounded_sm() + .hover(|s| s.bg(cx.theme().colors().element_hover)) + .child( + Label::new(tool_name.clone()) + .buffer_font(cx) + .size(LabelSize::Small), + ) + .child( + Icon::new(icon) + .size(IconSize::Small) + .color(Color::Muted), + ) + .on_click(cx.listener({ + move |this, _event, _window, _cx| { + let current = this + .expanded_tools + .get(&tool_name) + .copied() + .unwrap_or(false); + this.expanded_tools + .insert(tool_name.clone(), !current); + _cx.notify(); + } + })), + ) + .when(is_expanded, |this| { + this.child( + Label::new(tool.description()).color(Color::Muted).mx_1(), + ) + }) + .into_any_element(), + ]; + + if index < server_tools.len() - 1 { + items.push( + h_flex() + .w_full() + .child(Divider::horizontal().color(DividerColor::BorderVariant)) + .into_any_element(), + ); + } + + items + })), + ) + .vertical_scrollbar_for(self.scroll_handle.clone(), window, cx) + .into_any_element() + } +} + +impl ModalView for ConfigureContextServerToolsModal {} + +impl Focusable for ConfigureContextServerToolsModal { + fn focus_handle(&self, _cx: &App) -> FocusHandle { + self.focus_handle.clone() + } +} + +impl EventEmitter for ConfigureContextServerToolsModal {} + +impl Render for ConfigureContextServerToolsModal { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + div() + .key_context("ContextServerToolsModal") + .occlude() + .elevation_3(cx) + .w(rems(34.)) + .on_action(cx.listener(Self::cancel)) + .track_focus(&self.focus_handle) + .child( + Modal::new("configure-context-server-tools", None::) + .header( + ModalHeader::new() + .headline(format!("Tools from {}", self.context_server_id.0)) + .show_dismiss_button(true), + ) + .child(self.render_modal_content(window, cx)), + ) + } +} diff --git a/crates/agent_ui/src/agent_configuration/manage_profiles_modal.rs b/crates/agent_ui/src/agent_configuration/manage_profiles_modal.rs index cb9aabab9250b2f6175912c0a73242bc7f331dc6..9a7f0ed602a52d3b27dde565383453f2c5c325fb 100644 --- a/crates/agent_ui/src/agent_configuration/manage_profiles_modal.rs +++ b/crates/agent_ui/src/agent_configuration/manage_profiles_modal.rs @@ -317,6 +317,8 @@ impl ManageProfilesModal { window: &mut Window, cx: &mut Context, ) -> impl IntoElement + use<> { + let is_focused = profile.navigation.focus_handle.contains_focused(window, cx); + div() .id(SharedString::from(format!("profile-{}", profile.id))) .track_focus(&profile.navigation.focus_handle) @@ -328,25 +330,27 @@ impl ManageProfilesModal { }) .child( ListItem::new(SharedString::from(format!("profile-{}", profile.id))) - .toggle_state(profile.navigation.focus_handle.contains_focused(window, cx)) + .toggle_state(is_focused) .inset(true) .spacing(ListItemSpacing::Sparse) .child(Label::new(profile.name.clone())) - .end_slot( - h_flex() - .gap_1() - .child( - Label::new("Customize") - .size(LabelSize::Small) - .color(Color::Muted), - ) - .children(KeyBinding::for_action_in( - &menu::Confirm, - &self.focus_handle, - window, - cx, - )), - ) + .when(is_focused, |this| { + this.end_slot( + h_flex() + .gap_1() + .child( + Label::new("Customize") + .size(LabelSize::Small) + .color(Color::Muted), + ) + .children(KeyBinding::for_action_in( + &menu::Confirm, + &self.focus_handle, + window, + cx, + )), + ) + }) .on_click({ let profile_id = profile.id.clone(); cx.listener(move |this, _, window, cx| { diff --git a/crates/agent_ui/src/agent_configuration/tool_picker.rs b/crates/agent_ui/src/agent_configuration/tool_picker.rs index 2ba92fa6b7993664d278cfd57d851dcfd9cb0922..c624948944c0624e75e385d1b4b15aa77fea9bcd 100644 --- a/crates/agent_ui/src/agent_configuration/tool_picker.rs +++ b/crates/agent_ui/src/agent_configuration/tool_picker.rs @@ -1,14 +1,11 @@ use std::{collections::BTreeMap, sync::Arc}; -use agent_settings::{ - AgentProfileContent, AgentProfileId, AgentProfileSettings, AgentSettings, AgentSettingsContent, - ContextServerPresetContent, -}; +use agent_settings::{AgentProfileId, AgentProfileSettings}; use assistant_tool::{ToolSource, ToolWorkingSet}; use fs::Fs; use gpui::{App, Context, DismissEvent, Entity, EventEmitter, Focusable, Task, WeakEntity, Window}; use picker::{Picker, PickerDelegate}; -use settings::update_settings_file; +use settings::{AgentProfileContent, ContextServerPresetContent, update_settings_file}; use ui::{ListItem, ListItemSpacing, prelude::*}; use util::ResultExt as _; @@ -266,15 +263,19 @@ impl PickerDelegate for ToolPickerDelegate { is_enabled }; - update_settings_file::(self.fs.clone(), cx, { + update_settings_file(self.fs.clone(), cx, { let profile_id = self.profile_id.clone(); let default_profile = self.profile_settings.clone(); let server_id = server_id.clone(); let tool_name = tool_name.clone(); - move |settings: &mut AgentSettingsContent, _cx| { - let profiles = settings.profiles.get_or_insert_default(); + move |settings, _cx| { + let profiles = settings + .agent + .get_or_insert_default() + .profiles + .get_or_insert_default(); let profile = profiles - .entry(profile_id) + .entry(profile_id.0) .or_insert_with(|| AgentProfileContent { name: default_profile.name.into(), tools: default_profile.tools, diff --git a/crates/agent_ui/src/agent_diff.rs b/crates/agent_ui/src/agent_diff.rs index 122d95f9e449a579868a470ef7e58a7b336a3197..15a217801640712f4039ea4b2b1371074b43d646 100644 --- a/crates/agent_ui/src/agent_diff.rs +++ b/crates/agent_ui/src/agent_diff.rs @@ -562,10 +562,6 @@ impl Item for AgentDiffPane { self.editor.for_each_project_item(cx, f) } - fn is_singleton(&self, _: &App) -> bool { - false - } - fn set_nav_history( &mut self, nav_history: ItemNavHistory, @@ -849,7 +845,7 @@ fn render_diff_hunk_controls( editor.update(cx, |editor, cx| { let snapshot = editor.snapshot(window, cx); let position = - hunk_range.end.to_point(&snapshot.buffer_snapshot); + hunk_range.end.to_point(&snapshot.buffer_snapshot()); editor.go_to_hunk_before_or_after_position( &snapshot, position, @@ -884,7 +880,7 @@ fn render_diff_hunk_controls( editor.update(cx, |editor, cx| { let snapshot = editor.snapshot(window, cx); let point = - hunk_range.start.to_point(&snapshot.buffer_snapshot); + hunk_range.start.to_point(&snapshot.buffer_snapshot()); editor.go_to_hunk_before_or_after_position( &snapshot, point, @@ -1816,7 +1812,6 @@ mod tests { use serde_json::json; use settings::{Settings, SettingsStore}; use std::{path::Path, rc::Rc}; - use theme::ThemeSettings; use util::path; #[gpui::test] @@ -1829,7 +1824,7 @@ mod tests { AgentSettings::register(cx); prompt_store::init(cx); workspace::init_settings(cx); - ThemeSettings::register(cx); + theme::init(theme::LoadThemes::JustBase, cx); EditorSettings::register(cx); language_model::init_settings(cx); }); @@ -1981,7 +1976,7 @@ mod tests { AgentSettings::register(cx); prompt_store::init(cx); workspace::init_settings(cx); - ThemeSettings::register(cx); + theme::init(theme::LoadThemes::JustBase, cx); EditorSettings::register(cx); language_model::init_settings(cx); workspace::register_project_item::(cx); diff --git a/crates/agent_ui/src/agent_model_selector.rs b/crates/agent_ui/src/agent_model_selector.rs index 58b95d9b1f1b1e8abe7335a2299bee7545b7653e..fe25cadc3c1df785c89318882a246e2209cb42e6 100644 --- a/crates/agent_ui/src/agent_model_selector.rs +++ b/crates/agent_ui/src/agent_model_selector.rs @@ -2,7 +2,6 @@ use crate::{ ModelUsageContext, language_model_selector::{LanguageModelSelector, language_model_selector}, }; -use agent_settings::AgentSettings; use fs::Fs; use gpui::{Entity, FocusHandle, SharedString}; use picker::popover_menu::PickerPopoverMenu; @@ -39,14 +38,12 @@ impl AgentModelSelector { let model_id = model.id().0.to_string(); match &model_usage_context { ModelUsageContext::InlineAssistant => { - update_settings_file::( - fs.clone(), - cx, - move |settings, _cx| { - settings - .set_inline_assistant_model(provider.clone(), model_id); - }, - ); + update_settings_file(fs.clone(), cx, move |settings, _cx| { + settings + .agent + .get_or_insert_default() + .set_inline_assistant_model(provider.clone(), model_id); + }); } } }, diff --git a/crates/agent_ui/src/agent_panel.rs b/crates/agent_ui/src/agent_panel.rs index 7334f1cf1283ad45e0e98d296b3641c9b8812ef5..480f3a2cd8b37b862ee67c96142ef4d5f370faad 100644 --- a/crates/agent_ui/src/agent_panel.rs +++ b/crates/agent_ui/src/agent_panel.rs @@ -1,4 +1,4 @@ -use std::ops::{Not, Range}; +use std::ops::Range; use std::path::Path; use std::rc::Rc; use std::sync::Arc; @@ -7,9 +7,12 @@ use acp_thread::AcpThread; use agent2::{DbThreadMetadata, HistoryEntry}; use db::kvp::{Dismissable, KEY_VALUE_STORE}; use project::agent_server_store::{ - AgentServerCommand, AllAgentServersSettings, CLAUDE_CODE_NAME, GEMINI_NAME, + AgentServerCommand, AllAgentServersSettings, CLAUDE_CODE_NAME, CODEX_NAME, GEMINI_NAME, }; use serde::{Deserialize, Serialize}; +use settings::{ + DefaultAgentView as DefaultView, LanguageModelProviderSetting, LanguageModelSelection, +}; use zed_actions::OpenBrowser; use zed_actions::agent::{OpenClaudeCodeOnboardingModal, ReauthenticateAgent}; @@ -33,7 +36,7 @@ use agent::{ history_store::{HistoryEntryId, HistoryStore}, thread_store::{TextThreadStore, ThreadStore}, }; -use agent_settings::{AgentDockPosition, AgentSettings, DefaultView}; +use agent_settings::AgentSettings; use ai_onboarding::AgentPanelOnboarding; use anyhow::{Result, anyhow}; use assistant_context::{AssistantContext, ContextEvent, ContextSummary}; @@ -50,7 +53,7 @@ use gpui::{ }; use language::LanguageRegistry; use language_model::{ConfigurationError, LanguageModelRegistry}; -use project::{DisableAiSettings, Project, ProjectPath, Worktree}; +use project::{Project, ProjectPath, Worktree}; use prompt_store::{PromptBuilder, PromptStore, UserPromptId}; use rules_library::{RulesLibrary, open_rules_library}; use search::{BufferSearchBar, buffer_search}; @@ -213,6 +216,7 @@ pub enum AgentType { TextThread, Gemini, ClaudeCode, + Codex, NativeAgent, Custom { name: SharedString, @@ -227,6 +231,7 @@ impl AgentType { Self::NativeAgent => "Agent 2".into(), Self::Gemini => "Gemini CLI".into(), Self::ClaudeCode => "Claude Code".into(), + Self::Codex => "Codex".into(), Self::Custom { name, .. } => name.into(), } } @@ -236,6 +241,7 @@ impl AgentType { Self::Zed | Self::NativeAgent | Self::TextThread => None, Self::Gemini => Some(IconName::AiGemini), Self::ClaudeCode => Some(IconName::AiClaude), + Self::Codex => Some(IconName::AiOpenAi), Self::Custom { .. } => Some(IconName::Terminal), } } @@ -246,6 +252,7 @@ impl From for AgentType { match value { ExternalAgent::Gemini => Self::Gemini, ExternalAgent::ClaudeCode => Self::ClaudeCode, + ExternalAgent::Codex => Self::Codex, ExternalAgent::Custom { name, command } => Self::Custom { name, command }, ExternalAgent::NativeAgent => Self::NativeAgent, } @@ -405,6 +412,7 @@ impl ActiveView { pub struct AgentPanel { workspace: WeakEntity, + loading: bool, user_store: Entity, project: Entity, fs: Arc, @@ -510,6 +518,8 @@ impl AgentPanel { cx, ) }); + + panel.as_mut(cx).loading = true; if let Some(serialized_panel) = serialized_panel { panel.update(cx, |panel, cx| { panel.width = serialized_panel.width.map(|w| w.round()); @@ -524,6 +534,7 @@ impl AgentPanel { panel.new_agent_thread(AgentType::NativeAgent, window, cx); }); } + panel.as_mut(cx).loading = false; panel })?; @@ -671,11 +682,9 @@ impl AgentPanel { prompt_store, configuration: None, configuration_subscription: None, - inline_assist_context_store, previous_view: None, history_store: history_store.clone(), - new_thread_menu_handle: PopoverMenuHandle::default(), agent_panel_menu_handle: PopoverMenuHandle::default(), assistant_navigation_menu_handle: PopoverMenuHandle::default(), @@ -688,6 +697,7 @@ impl AgentPanel { acp_history, acp_history_store, selected_agent: AgentType::default(), + loading: false, } } @@ -700,7 +710,6 @@ impl AgentPanel { if workspace .panel::(cx) .is_some_and(|panel| panel.read(cx).enabled(cx)) - && !DisableAiSettings::get_global(cx).disable_ai { workspace.toggle_panel_focus::(window, cx); } @@ -820,6 +829,7 @@ impl AgentPanel { agent: crate::ExternalAgent, } + let loading = self.loading; let history = self.acp_history_store.clone(); cx.spawn_in(window, async move |this, cx| { @@ -861,7 +871,9 @@ impl AgentPanel { } }; - telemetry::event!("Agent Thread Started", agent = ext_agent.name()); + if !loading { + telemetry::event!("Agent Thread Started", agent = ext_agent.name()); + } let server = ext_agent.server(fs, history); @@ -1058,19 +1070,16 @@ impl AgentPanel { match self.active_view.which_font_size_used() { WhichFontSize::AgentFont => { if persist { - update_settings_file::( - self.fs.clone(), - cx, - move |settings, cx| { - let agent_font_size = - ThemeSettings::get_global(cx).agent_font_size(cx) + delta; - let _ = settings - .agent_font_size - .insert(Some(theme::clamp_font_size(agent_font_size).into())); - }, - ); + update_settings_file(self.fs.clone(), cx, move |settings, cx| { + let agent_ui_font_size = + ThemeSettings::get_global(cx).agent_ui_font_size(cx) + delta; + let _ = settings + .theme + .agent_ui_font_size + .insert(theme::clamp_font_size(agent_ui_font_size).into()); + }); } else { - theme::adjust_agent_font_size(cx, |size| size + delta); + theme::adjust_agent_ui_font_size(cx, |size| size + delta); } } WhichFontSize::BufferFont => { @@ -1089,11 +1098,11 @@ impl AgentPanel { cx: &mut Context, ) { if action.persist { - update_settings_file::(self.fs.clone(), cx, move |settings, _| { - settings.agent_font_size = None; + update_settings_file(self.fs.clone(), cx, move |settings, _| { + settings.theme.agent_ui_font_size = None; }); } else { - theme::reset_agent_font_size(cx); + theme::reset_agent_ui_font_size(cx); } } @@ -1175,11 +1184,17 @@ impl AgentPanel { .is_none_or(|model| model.provider.id() != provider.id()) && let Some(model) = provider.default_model(cx) { - update_settings_file::( - self.fs.clone(), - cx, - move |settings, _| settings.set_model(model), - ); + update_settings_file(self.fs.clone(), cx, move |settings, _| { + let provider = model.provider_id().0.to_string(); + let model = model.id().0.to_string(); + settings + .agent + .get_or_insert_default() + .set_model(LanguageModelSelection { + provider: LanguageModelProviderSetting(provider), + model, + }) + }); } self.new_thread(&NewThread::default(), window, cx); @@ -1380,6 +1395,11 @@ impl AgentPanel { cx, ) } + AgentType::Codex => { + self.selected_agent = AgentType::Codex; + self.serialize(cx); + self.external_thread(Some(crate::ExternalAgent::Codex), None, None, window, cx) + } AgentType::Custom { name, command } => self.external_thread( Some(crate::ExternalAgent::Custom { name, command }), None, @@ -1424,11 +1444,7 @@ impl Focusable for AgentPanel { } fn agent_panel_dock_position(cx: &App) -> DockPosition { - match AgentSettings::get_global(cx).dock { - AgentDockPosition::Left => DockPosition::Left, - AgentDockPosition::Bottom => DockPosition::Bottom, - AgentDockPosition::Right => DockPosition::Right, - } + AgentSettings::get_global(cx).dock.into() } impl EventEmitter for AgentPanel {} @@ -1447,13 +1463,11 @@ impl Panel for AgentPanel { } fn set_position(&mut self, position: DockPosition, _: &mut Window, cx: &mut Context) { - settings::update_settings_file::(self.fs.clone(), cx, move |settings, _| { - let dock = match position { - DockPosition::Left => AgentDockPosition::Left, - DockPosition::Bottom => AgentDockPosition::Bottom, - DockPosition::Right => AgentDockPosition::Right, - }; - settings.set_dock(dock); + settings::update_settings_file(self.fs.clone(), cx, move |settings, _| { + settings + .agent + .get_or_insert_default() + .set_dock(position.into()); }); } @@ -1499,7 +1513,7 @@ impl Panel for AgentPanel { } fn enabled(&self, cx: &App) -> bool { - DisableAiSettings::get_global(cx).disable_ai.not() && AgentSettings::get_global(cx).enabled + AgentSettings::get_global(cx).enabled(cx) } fn is_zoomed(&self, _window: &Window, _cx: &App) -> bool { @@ -1899,10 +1913,10 @@ impl AgentPanel { .separator() .header("External Agents") .item( - ContextMenuEntry::new("New Gemini CLI Thread") - .icon(IconName::AiGemini) - .icon_color(Color::Muted) + ContextMenuEntry::new("New Claude Code Thread") + .icon(IconName::AiClaude) .disabled(is_via_collab) + .icon_color(Color::Muted) .handler({ let workspace = workspace.clone(); move |window, cx| { @@ -1913,7 +1927,7 @@ impl AgentPanel { { panel.update(cx, |panel, cx| { panel.new_agent_thread( - AgentType::Gemini, + AgentType::ClaudeCode, window, cx, ); @@ -1925,8 +1939,8 @@ impl AgentPanel { }), ) .item( - ContextMenuEntry::new("New Claude Code Thread") - .icon(IconName::AiClaude) + ContextMenuEntry::new("New Codex Thread") + .icon(IconName::AiOpenAi) .disabled(is_via_collab) .icon_color(Color::Muted) .handler({ @@ -1939,7 +1953,33 @@ impl AgentPanel { { panel.update(cx, |panel, cx| { panel.new_agent_thread( - AgentType::ClaudeCode, + AgentType::Codex, + window, + cx, + ); + }); + } + }); + } + } + }), + ) + .item( + ContextMenuEntry::new("New Gemini CLI Thread") + .icon(IconName::AiGemini) + .icon_color(Color::Muted) + .disabled(is_via_collab) + .handler({ + let workspace = workspace.clone(); + move |window, cx| { + if let Some(workspace) = workspace.upgrade() { + workspace.update(cx, |workspace, cx| { + if let Some(panel) = + workspace.panel::(cx) + { + panel.update(cx, |panel, cx| { + panel.new_agent_thread( + AgentType::Gemini, window, cx, ); @@ -1955,7 +1995,7 @@ impl AgentPanel { .read(cx) .external_agents() .filter(|name| { - name.0 != GEMINI_NAME && name.0 != CLAUDE_CODE_NAME + name.0 != GEMINI_NAME && name.0 != CLAUDE_CODE_NAME && name.0 != CODEX_NAME }) .cloned() .collect::>(); @@ -2491,7 +2531,7 @@ impl Render for AgentPanel { match self.active_view.which_font_size_used() { WhichFontSize::AgentFont => { - WithRemSize::new(ThemeSettings::get_global(cx).agent_font_size(cx)) + WithRemSize::new(ThemeSettings::get_global(cx).agent_ui_font_size(cx)) .size_full() .child(content) .into_any() diff --git a/crates/agent_ui/src/agent_ui.rs b/crates/agent_ui/src/agent_ui.rs index 94efa767c5f1cd126695b8345230fba78583eb2f..2c439a725456976f090ddc4cb754664c4953d626 100644 --- a/crates/agent_ui/src/agent_ui.rs +++ b/crates/agent_ui/src/agent_ui.rs @@ -14,7 +14,6 @@ mod message_editor; mod profile_selector; mod slash_command; mod slash_command_picker; -mod slash_command_settings; mod terminal_codegen; mod terminal_inline_assistant; mod text_thread_editor; @@ -24,7 +23,7 @@ use std::rc::Rc; use std::sync::Arc; use agent::ThreadId; -use agent_settings::{AgentProfileId, AgentSettings, LanguageModelSelection}; +use agent_settings::{AgentProfileId, AgentSettings}; use assistant_slash_command::SlashCommandRegistry; use client::Client; use command_palette_hooks::CommandPaletteFilter; @@ -40,13 +39,12 @@ use project::agent_server_store::AgentServerCommand; use prompt_store::PromptBuilder; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{Settings as _, SettingsStore}; +use settings::{LanguageModelSelection, Settings as _, SettingsStore}; use std::any::TypeId; use crate::agent_configuration::{ConfigureContextServerModal, ManageProfilesModal}; pub use crate::agent_panel::{AgentPanel, ConcreteAssistantPanelDelegate}; pub use crate::inline_assistant::InlineAssistant; -use crate::slash_command_settings::SlashCommandSettings; pub use agent_diff::{AgentDiffPane, AgentDiffToolbar}; pub use text_thread_editor::{AgentPanelDelegate, TextThreadEditor}; use zed_actions; @@ -169,6 +167,7 @@ enum ExternalAgent { #[default] Gemini, ClaudeCode, + Codex, NativeAgent, Custom { name: SharedString, @@ -190,6 +189,7 @@ impl ExternalAgent { Self::NativeAgent => "zed", Self::Gemini => "gemini-cli", Self::ClaudeCode => "claude-code", + Self::Codex => "codex", Self::Custom { .. } => "custom", } } @@ -202,6 +202,7 @@ impl ExternalAgent { match self { Self::Gemini => Rc::new(agent_servers::Gemini), Self::ClaudeCode => Rc::new(agent_servers::ClaudeCode), + Self::Codex => Rc::new(agent_servers::Codex), Self::NativeAgent => Rc::new(agent2::NativeAgentServer::new(fs, history)), Self::Custom { name, command: _ } => { Rc::new(agent_servers::CustomAgentServer::new(name.clone())) @@ -257,7 +258,6 @@ pub fn init( cx: &mut App, ) { AgentSettings::register(cx); - SlashCommandSettings::register(cx); assistant_context::init(client.clone(), cx); rules_library::init(cx); @@ -267,7 +267,7 @@ pub fn init( init_language_model_settings(cx); } assistant_slash_command::init(cx); - agent::init(cx); + agent::init(fs.clone(), cx); agent_panel::init(cx); context_server_configuration::init(language_registry.clone(), fs.clone(), cx); TextThreadEditor::init(cx); @@ -413,8 +413,6 @@ fn register_slash_commands(cx: &mut App) { slash_command_registry.register_command(assistant_slash_commands::DeltaSlashCommand, true); slash_command_registry.register_command(assistant_slash_commands::OutlineSlashCommand, true); slash_command_registry.register_command(assistant_slash_commands::TabSlashCommand, true); - slash_command_registry - .register_command(assistant_slash_commands::CargoWorkspaceSlashCommand, true); slash_command_registry.register_command(assistant_slash_commands::PromptSlashCommand, true); slash_command_registry.register_command(assistant_slash_commands::SelectionCommand, true); slash_command_registry.register_command(assistant_slash_commands::DefaultSlashCommand, false); @@ -434,21 +432,4 @@ fn register_slash_commands(cx: &mut App) { } }) .detach(); - - update_slash_commands_from_settings(cx); - cx.observe_global::(update_slash_commands_from_settings) - .detach(); -} - -fn update_slash_commands_from_settings(cx: &mut App) { - let slash_command_registry = SlashCommandRegistry::global(cx); - let settings = SlashCommandSettings::get_global(cx); - - if settings.cargo_workspace.enabled { - slash_command_registry - .register_command(assistant_slash_commands::CargoWorkspaceSlashCommand, true); - } else { - slash_command_registry - .unregister_command(assistant_slash_commands::CargoWorkspaceSlashCommand); - } } diff --git a/crates/agent_ui/src/context_picker.rs b/crates/agent_ui/src/context_picker.rs index bc309302896eb58c318fa79c108ab9adb5a41ab1..58edecdf3da6b16bca82a7d4c0e73dcac3969e03 100644 --- a/crates/agent_ui/src/context_picker.rs +++ b/crates/agent_ui/src/context_picker.rs @@ -33,6 +33,8 @@ use thread_context_picker::{ use ui::{ ButtonLike, ContextMenu, ContextMenuEntry, ContextMenuItem, Disclosure, TintColor, prelude::*, }; +use util::paths::PathStyle; +use util::rel_path::RelPath; use workspace::{Workspace, notifications::NotifyResultExt}; use agent::{ @@ -228,12 +230,19 @@ impl ContextPicker { let context_picker = cx.entity(); let menu = ContextMenu::build(window, cx, move |menu, _window, cx| { + let Some(workspace) = self.workspace.upgrade() else { + return menu; + }; + let path_style = workspace.read(cx).path_style(cx); let recent = self.recent_entries(cx); let has_recent = !recent.is_empty(); let recent_entries = recent .into_iter() .enumerate() - .map(|(ix, entry)| self.recent_menu_item(context_picker.clone(), ix, entry)); + .map(|(ix, entry)| { + self.recent_menu_item(context_picker.clone(), ix, entry, path_style) + }) + .collect::>(); let entries = self .workspace @@ -395,6 +404,7 @@ impl ContextPicker { context_picker: Entity, ix: usize, entry: RecentEntry, + path_style: PathStyle, ) -> ContextMenuItem { match entry { RecentEntry::File { @@ -413,6 +423,7 @@ impl ContextPicker { &path, &path_prefix, false, + path_style, context_store.clone(), cx, ) @@ -586,7 +597,7 @@ impl Render for ContextPicker { pub(crate) enum RecentEntry { File { project_path: ProjectPath, - path_prefix: Arc, + path_prefix: Arc, }, Thread(ThreadContextEntry), } diff --git a/crates/agent_ui/src/context_picker/completion_provider.rs b/crates/agent_ui/src/context_picker/completion_provider.rs index c9cd69bf8e49b2e4f20148640cd029caea51264f..33a5a621a1d1ea23ccdb49fd97010fea1856ce80 100644 --- a/crates/agent_ui/src/context_picker/completion_provider.rs +++ b/crates/agent_ui/src/context_picker/completion_provider.rs @@ -13,6 +13,7 @@ use http_client::HttpClientWithUrl; use itertools::Itertools; use language::{Buffer, CodeLabel, HighlightId}; use lsp::CompletionContext; +use project::lsp_store::SymbolLocation; use project::{ Completion, CompletionDisplayOptions, CompletionIntent, CompletionResponse, ProjectPath, Symbol, WorktreeId, @@ -22,6 +23,8 @@ use rope::Point; use text::{Anchor, OffsetRangeExt, ToPoint}; use ui::prelude::*; use util::ResultExt as _; +use util::paths::PathStyle; +use util::rel_path::RelPath; use workspace::Workspace; use agent::{ @@ -574,11 +577,12 @@ impl ContextPickerCompletionProvider { fn completion_for_path( project_path: ProjectPath, - path_prefix: &str, + path_prefix: &RelPath, is_recent: bool, is_directory: bool, excerpt_id: ExcerptId, source_range: Range, + path_style: PathStyle, editor: Entity, context_store: Entity, cx: &App, @@ -586,6 +590,7 @@ impl ContextPickerCompletionProvider { let (file_name, directory) = super::file_context_picker::extract_file_name_and_directory( &project_path.path, path_prefix, + path_style, ); let label = @@ -657,17 +662,22 @@ impl ContextPickerCompletionProvider { workspace: Entity, cx: &mut App, ) -> Option { + let path_style = workspace.read(cx).path_style(cx); + let SymbolLocation::InProject(symbol_path) = &symbol.path else { + return None; + }; let path_prefix = workspace .read(cx) .project() .read(cx) - .worktree_for_id(symbol.path.worktree_id, cx)? + .worktree_for_id(symbol_path.worktree_id, cx)? .read(cx) .root_name(); let (file_name, directory) = super::file_context_picker::extract_file_name_and_directory( - &symbol.path.path, + &symbol_path.path, path_prefix, + path_style, ); let full_path = if let Some(directory) = directory { format!("{}{}", directory, file_name) @@ -743,15 +753,15 @@ impl CompletionProvider for ContextPickerCompletionProvider { _window: &mut Window, cx: &mut Context, ) -> Task>> { - let state = buffer.update(cx, |buffer, _cx| { - let position = buffer_position.to_point(buffer); - let line_start = Point::new(position.row, 0); - let offset_to_line = buffer.point_to_offset(line_start); - let mut lines = buffer.text_for_range(line_start..position).lines(); - let line = lines.next()?; - MentionCompletion::try_parse(line, offset_to_line) - }); - let Some(state) = state else { + let snapshot = buffer.read(cx).snapshot(); + let position = buffer_position.to_point(&snapshot); + let line_start = Point::new(position.row, 0); + let offset_to_line = snapshot.point_to_offset(line_start); + let mut lines = snapshot.text_for_range(line_start..position).lines(); + let Some(line) = lines.next() else { + return Task::ready(Ok(Vec::new())); + }; + let Some(state) = MentionCompletion::try_parse(line, offset_to_line) else { return Task::ready(Ok(Vec::new())); }; @@ -761,7 +771,6 @@ impl CompletionProvider for ContextPickerCompletionProvider { return Task::ready(Ok(Vec::new())); }; - let snapshot = buffer.read(cx).snapshot(); let source_range = snapshot.anchor_before(state.source_range.start) ..snapshot.anchor_after(state.source_range.end); @@ -769,6 +778,7 @@ impl CompletionProvider for ContextPickerCompletionProvider { let text_thread_store = self.text_thread_store.clone(); let editor = self.editor.clone(); let http_client = workspace.read(cx).client().http_client(); + let path_style = workspace.read(cx).path_style(cx); let MentionCompletion { mode, argument, .. } = state; let query = argument.unwrap_or_else(|| "".to_string()); @@ -835,6 +845,7 @@ impl CompletionProvider for ContextPickerCompletionProvider { mat.is_dir, excerpt_id, source_range.clone(), + path_style, editor.clone(), context_store.clone(), cx, @@ -1065,7 +1076,7 @@ mod tests { use serde_json::json; use settings::SettingsStore; use std::{ops::Deref, rc::Rc}; - use util::path; + use util::{path, rel_path::rel_path}; use workspace::{AppState, Item}; #[test] @@ -1216,16 +1227,18 @@ mod tests { let mut cx = VisualTestContext::from_window(*window.deref(), cx); let paths = vec![ - path!("a/one.txt"), - path!("a/two.txt"), - path!("a/three.txt"), - path!("a/four.txt"), - path!("b/five.txt"), - path!("b/six.txt"), - path!("b/seven.txt"), - path!("b/eight.txt"), + rel_path("a/one.txt"), + rel_path("a/two.txt"), + rel_path("a/three.txt"), + rel_path("a/four.txt"), + rel_path("b/five.txt"), + rel_path("b/six.txt"), + rel_path("b/seven.txt"), + rel_path("b/eight.txt"), ]; + let slash = PathStyle::local().separator(); + let mut opened_editors = Vec::new(); for path in paths { let buffer = workspace @@ -1233,7 +1246,7 @@ mod tests { workspace.open_path( ProjectPath { worktree_id, - path: Path::new(path).into(), + path: path.into(), }, None, false, @@ -1309,13 +1322,13 @@ mod tests { assert_eq!( current_completion_labels(editor), &[ - "seven.txt dir/b/", - "six.txt dir/b/", - "five.txt dir/b/", - "four.txt dir/a/", - "Files & Directories", - "Symbols", - "Fetch" + format!("seven.txt dir{slash}b{slash}"), + format!("six.txt dir{slash}b{slash}"), + format!("five.txt dir{slash}b{slash}"), + format!("four.txt dir{slash}a{slash}"), + "Files & Directories".into(), + "Symbols".into(), + "Fetch".into() ] ); }); @@ -1342,7 +1355,10 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!(editor.text(cx), "Lorem @file one"); assert!(editor.has_visible_completions_menu()); - assert_eq!(current_completion_labels(editor), vec!["one.txt dir/a/"]); + assert_eq!( + current_completion_labels(editor), + vec![format!("one.txt dir{slash}a{slash}")] + ); }); editor.update_in(&mut cx, |editor, window, cx| { @@ -1351,7 +1367,10 @@ mod tests { }); editor.update(&mut cx, |editor, cx| { - assert_eq!(editor.text(cx), "Lorem [@one.txt](@file:dir/a/one.txt) "); + assert_eq!( + editor.text(cx), + format!("Lorem [@one.txt](@file:dir{slash}a{slash}one.txt) ") + ); assert!(!editor.has_visible_completions_menu()); assert_eq!( fold_ranges(editor, cx), @@ -1362,7 +1381,10 @@ mod tests { cx.simulate_input(" "); editor.update(&mut cx, |editor, cx| { - assert_eq!(editor.text(cx), "Lorem [@one.txt](@file:dir/a/one.txt) "); + assert_eq!( + editor.text(cx), + format!("Lorem [@one.txt](@file:dir{slash}a{slash}one.txt) ") + ); assert!(!editor.has_visible_completions_menu()); assert_eq!( fold_ranges(editor, cx), @@ -1375,7 +1397,7 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - "Lorem [@one.txt](@file:dir/a/one.txt) Ipsum ", + format!("Lorem [@one.txt](@file:dir{slash}a{slash}one.txt) Ipsum "), ); assert!(!editor.has_visible_completions_menu()); assert_eq!( @@ -1389,7 +1411,7 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - "Lorem [@one.txt](@file:dir/a/one.txt) Ipsum @file ", + format!("Lorem [@one.txt](@file:dir{slash}a{slash}one.txt) Ipsum @file "), ); assert!(editor.has_visible_completions_menu()); assert_eq!( @@ -1407,7 +1429,7 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - "Lorem [@one.txt](@file:dir/a/one.txt) Ipsum [@seven.txt](@file:dir/b/seven.txt) " + format!("Lorem [@one.txt](@file:dir{slash}a{slash}one.txt) Ipsum [@seven.txt](@file:dir{slash}b{slash}seven.txt) ") ); assert!(!editor.has_visible_completions_menu()); assert_eq!( @@ -1424,7 +1446,7 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - "Lorem [@one.txt](@file:dir/a/one.txt) Ipsum [@seven.txt](@file:dir/b/seven.txt) \n@" + format!("Lorem [@one.txt](@file:dir{slash}a{slash}one.txt) Ipsum [@seven.txt](@file:dir{slash}b{slash}seven.txt) \n@") ); assert!(editor.has_visible_completions_menu()); assert_eq!( @@ -1445,7 +1467,7 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - "Lorem [@one.txt](@file:dir/a/one.txt) Ipsum [@seven.txt](@file:dir/b/seven.txt) \n[@six.txt](@file:dir/b/six.txt) " + format!("Lorem [@one.txt](@file:dir{slash}a{slash}one.txt) Ipsum [@seven.txt](@file:dir{slash}b{slash}seven.txt) \n[@six.txt](@file:dir{slash}b{slash}six.txt) ") ); assert!(!editor.has_visible_completions_menu()); assert_eq!( diff --git a/crates/agent_ui/src/context_picker/file_context_picker.rs b/crates/agent_ui/src/context_picker/file_context_picker.rs index d64de23f4e42b8a79dc9bdcbc1c2fa9677c09372..4f7a4308406f9d9fbdfa42cc86adc1ffe7593396 100644 --- a/crates/agent_ui/src/context_picker/file_context_picker.rs +++ b/crates/agent_ui/src/context_picker/file_context_picker.rs @@ -1,4 +1,3 @@ -use std::path::Path; use std::sync::Arc; use std::sync::atomic::AtomicBool; @@ -10,7 +9,7 @@ use gpui::{ use picker::{Picker, PickerDelegate}; use project::{PathMatchCandidateSet, ProjectPath, WorktreeId}; use ui::{ListItem, Tooltip, prelude::*}; -use util::ResultExt as _; +use util::{ResultExt as _, paths::PathStyle, rel_path::RelPath}; use workspace::Workspace; use crate::context_picker::ContextPicker; @@ -161,6 +160,8 @@ impl PickerDelegate for FileContextPickerDelegate { cx: &mut Context>, ) -> Option { let FileMatch { mat, .. } = &self.matches.get(ix)?; + let workspace = self.workspace.upgrade()?; + let path_style = workspace.read(cx).path_style(cx); Some( ListItem::new(ix) @@ -172,6 +173,7 @@ impl PickerDelegate for FileContextPickerDelegate { &mat.path, &mat.path_prefix, mat.is_dir, + path_style, self.context_store.clone(), cx, )), @@ -214,14 +216,13 @@ pub(crate) fn search_files( let file_matches = project.worktrees(cx).flat_map(|worktree| { let worktree = worktree.read(cx); - let path_prefix: Arc = worktree.root_name().into(); worktree.entries(false, 0).map(move |entry| FileMatch { mat: PathMatch { score: 0., positions: Vec::new(), worktree_id: worktree.id().to_usize(), path: entry.path.clone(), - path_prefix: path_prefix.clone(), + path_prefix: worktree.root_name().into(), distance_to_relative_ancestor: 0, is_dir: entry.is_dir(), }, @@ -251,7 +252,7 @@ pub(crate) fn search_files( fuzzy::match_path_sets( candidate_sets.as_slice(), query.as_str(), - None, + &None, false, 100, &cancellation_flag, @@ -269,51 +270,31 @@ pub(crate) fn search_files( } pub fn extract_file_name_and_directory( - path: &Path, - path_prefix: &str, + path: &RelPath, + path_prefix: &RelPath, + path_style: PathStyle, ) -> (SharedString, Option) { - if path == Path::new("") { - ( - SharedString::from( - path_prefix - .trim_end_matches(std::path::MAIN_SEPARATOR) - .to_string(), - ), - None, - ) - } else { - let file_name = path - .file_name() - .unwrap_or_default() - .to_string_lossy() - .to_string() - .into(); - - let mut directory = path_prefix - .trim_end_matches(std::path::MAIN_SEPARATOR) - .to_string(); - if !directory.ends_with('/') { - directory.push('/'); - } - if let Some(parent) = path.parent().filter(|parent| parent != &Path::new("")) { - directory.push_str(&parent.to_string_lossy()); - directory.push('/'); - } - - (file_name, Some(directory.into())) - } + let full_path = path_prefix.join(path); + let file_name = full_path.file_name().unwrap_or_default(); + let display_path = full_path.display(path_style); + let (directory, file_name) = display_path.split_at(display_path.len() - file_name.len()); + ( + file_name.to_string().into(), + Some(SharedString::new(directory)).filter(|dir| !dir.is_empty()), + ) } pub fn render_file_context_entry( id: ElementId, worktree_id: WorktreeId, - path: &Arc, - path_prefix: &Arc, + path: &Arc, + path_prefix: &Arc, is_directory: bool, + path_style: PathStyle, context_store: WeakEntity, cx: &App, ) -> Stateful
{ - let (file_name, directory) = extract_file_name_and_directory(path, path_prefix); + let (file_name, directory) = extract_file_name_and_directory(path, path_prefix, path_style); let added = context_store.upgrade().and_then(|context_store| { let project_path = ProjectPath { @@ -330,9 +311,9 @@ pub fn render_file_context_entry( }); let file_icon = if is_directory { - FileIcons::get_folder_icon(false, path, cx) + FileIcons::get_folder_icon(false, path.as_std_path(), cx) } else { - FileIcons::get_icon(path, cx) + FileIcons::get_icon(path.as_std_path(), cx) } .map(Icon::from_path) .unwrap_or_else(|| Icon::new(IconName::File)); diff --git a/crates/agent_ui/src/context_picker/symbol_context_picker.rs b/crates/agent_ui/src/context_picker/symbol_context_picker.rs index 993d65bd12ee4e01ca8d9767ccd46dd3fd645dd3..5b89f09de884067a94832c7bf474a2949e78c420 100644 --- a/crates/agent_ui/src/context_picker/symbol_context_picker.rs +++ b/crates/agent_ui/src/context_picker/symbol_context_picker.rs @@ -2,13 +2,14 @@ use std::cmp::Reverse; use std::sync::Arc; use std::sync::atomic::AtomicBool; -use anyhow::Result; +use anyhow::{Result, anyhow}; use fuzzy::{StringMatch, StringMatchCandidate}; use gpui::{ App, AppContext, DismissEvent, Entity, FocusHandle, Focusable, Stateful, Task, WeakEntity, }; use ordered_float::OrderedFloat; use picker::{Picker, PickerDelegate}; +use project::lsp_store::SymbolLocation; use project::{DocumentSymbol, Symbol}; use ui::{ListItem, prelude::*}; use util::ResultExt as _; @@ -191,7 +192,10 @@ pub(crate) fn add_symbol( ) -> Task, bool)>> { let project = workspace.read(cx).project().clone(); let open_buffer_task = project.update(cx, |project, cx| { - project.open_buffer(symbol.path.clone(), cx) + let SymbolLocation::InProject(symbol_path) = &symbol.path else { + return Task::ready(Err(anyhow!("can't add symbol from outside of project"))); + }; + project.open_buffer(symbol_path.clone(), cx) }); cx.spawn(async move |cx| { let buffer = open_buffer_task.await?; @@ -291,10 +295,11 @@ pub(crate) fn search_symbols( .map(|(id, symbol)| { StringMatchCandidate::new(id, symbol.label.filter_text()) }) - .partition(|candidate| { - project - .entry_for_path(&symbols[candidate.id].path, cx) - .is_some_and(|e| !e.is_ignored) + .partition(|candidate| match &symbols[candidate.id].path { + SymbolLocation::InProject(project_path) => project + .entry_for_path(project_path, cx) + .is_some_and(|e| !e.is_ignored), + SymbolLocation::OutsideProject { .. } => false, }) }) .log_err() @@ -360,13 +365,18 @@ fn compute_symbol_entries( } pub fn render_symbol_context_entry(id: ElementId, entry: &SymbolEntry) -> Stateful
{ - let path = entry - .symbol - .path - .path - .file_name() - .map(|s| s.to_string_lossy()) - .unwrap_or_default(); + let path = match &entry.symbol.path { + SymbolLocation::InProject(project_path) => { + project_path.path.file_name().unwrap_or_default().into() + } + SymbolLocation::OutsideProject { + abs_path, + signature: _, + } => abs_path + .file_name() + .map(|f| f.to_string_lossy()) + .unwrap_or_default(), + }; let symbol_location = format!("{} L{}", path, entry.symbol.range.start.0.row + 1); h_flex() diff --git a/crates/agent_ui/src/context_server_configuration.rs b/crates/agent_ui/src/context_server_configuration.rs index fe15e8606d4026054ef0d04f1aab08375a440cf7..3a1a8695172fcb68e52b6269b88b7b1576c2a5cb 100644 --- a/crates/agent_ui/src/context_server_configuration.rs +++ b/crates/agent_ui/src/context_server_configuration.rs @@ -5,7 +5,6 @@ use extension::ExtensionManifest; use fs::Fs; use gpui::WeakEntity; use language::LanguageRegistry; -use project::project_settings::ProjectSettings; use settings::update_settings_file; use ui::prelude::*; use util::ResultExt; @@ -69,8 +68,9 @@ fn remove_context_server_settings( fs: Arc, cx: &mut App, ) { - update_settings_file::(fs, cx, move |settings, _| { + update_settings_file(fs, cx, move |settings, _| { settings + .project .context_servers .retain(|server_id, _| !context_server_ids.contains(server_id)); }); diff --git a/crates/agent_ui/src/inline_assistant.rs b/crates/agent_ui/src/inline_assistant.rs index 4ac88e6daa3d3623580e206c2759f27b218d1bac..d24dc4ab781585e9ebabc7f19016e4da2457a873 100644 --- a/crates/agent_ui/src/inline_assistant.rs +++ b/crates/agent_ui/src/inline_assistant.rs @@ -18,7 +18,9 @@ use agent_settings::AgentSettings; use anyhow::{Context as _, Result}; use client::telemetry::Telemetry; use collections::{HashMap, HashSet, VecDeque, hash_map}; +use editor::RowExt; use editor::SelectionEffects; +use editor::scroll::ScrollOffset; use editor::{ Anchor, AnchorRangeExt, CodeActionProvider, Editor, EditorEvent, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, ToOffset as _, ToPoint, @@ -144,8 +146,7 @@ impl InlineAssistant { let Some(terminal_panel) = workspace.read(cx).panel::(cx) else { return; }; - let enabled = !DisableAiSettings::get_global(cx).disable_ai - && AgentSettings::get_global(cx).enabled; + let enabled = AgentSettings::get_global(cx).enabled(cx); terminal_panel.update(cx, |terminal_panel, cx| { terminal_panel.set_assistant_enabled(enabled, cx) }); @@ -257,8 +258,7 @@ impl InlineAssistant { window: &mut Window, cx: &mut Context, ) { - let settings = AgentSettings::get_global(cx); - if !settings.enabled || DisableAiSettings::get_global(cx).disable_ai { + if !AgentSettings::get_global(cx).enabled(cx) { return; } @@ -382,7 +382,7 @@ impl InlineAssistant { if let Some(editor_assists) = self.assists_by_editor.get(&editor.downgrade()) { for assist_id in &editor_assists.assist_ids { let assist = &self.assists[assist_id]; - let range = assist.range.to_point(&snapshot.buffer_snapshot); + let range = assist.range.to_point(&snapshot.buffer_snapshot()); if range.start.row <= newest_selection.start.row && newest_selection.end.row <= range.end.row { @@ -402,16 +402,16 @@ impl InlineAssistant { selection.end.row -= 1; } selection.end.column = snapshot - .buffer_snapshot + .buffer_snapshot() .line_len(MultiBufferRow(selection.end.row)); } else if let Some(fold) = snapshot.crease_for_buffer_row(MultiBufferRow(selection.end.row)) { selection.start = fold.range().start; selection.end = fold.range().end; - if MultiBufferRow(selection.end.row) < snapshot.buffer_snapshot.max_row() { + if MultiBufferRow(selection.end.row) < snapshot.buffer_snapshot().max_row() { let chars = snapshot - .buffer_snapshot + .buffer_snapshot() .chars_at(Point::new(selection.end.row + 1, 0)); for c in chars { @@ -427,7 +427,7 @@ impl InlineAssistant { { selection.end.row += 1; selection.end.column = snapshot - .buffer_snapshot + .buffer_snapshot() .line_len(MultiBufferRow(selection.end.row)); } } @@ -447,7 +447,7 @@ impl InlineAssistant { } selections.push(selection); } - let snapshot = &snapshot.buffer_snapshot; + let snapshot = &snapshot.buffer_snapshot(); let newest_selection = newest_selection.unwrap(); let mut codegen_ranges = Vec::new(); @@ -744,19 +744,14 @@ impl InlineAssistant { .update(cx, |editor, cx| { let scroll_top = editor.scroll_position(cx).y; let scroll_bottom = scroll_top + editor.visible_line_count().unwrap_or(0.); - let prompt_row = editor + editor_assists.scroll_lock = editor .row_for_block(decorations.prompt_block_id, cx) - .unwrap() - .0 as f32; - - if (scroll_top..scroll_bottom).contains(&prompt_row) { - editor_assists.scroll_lock = Some(InlineAssistScrollLock { + .map(|row| row.as_f64()) + .filter(|prompt_row| (scroll_top..scroll_bottom).contains(&prompt_row)) + .map(|prompt_row| InlineAssistScrollLock { assist_id, distance_from_top: prompt_row - scroll_top, }); - } else { - editor_assists.scroll_lock = None; - } }) .ok(); } @@ -918,13 +913,13 @@ impl InlineAssistant { editor.update(cx, |editor, cx| { let scroll_position = editor.scroll_position(cx); let target_scroll_top = editor - .row_for_block(decorations.prompt_block_id, cx) - .unwrap() - .0 as f32 + .row_for_block(decorations.prompt_block_id, cx)? + .as_f64() - scroll_lock.distance_from_top; if target_scroll_top != scroll_position.y { editor.set_scroll_position(point(scroll_position.x, target_scroll_top), window, cx); } + Some(()) }); } @@ -969,13 +964,14 @@ impl InlineAssistant { let distance_from_top = editor.update(cx, |editor, cx| { let scroll_top = editor.scroll_position(cx).y; let prompt_row = editor - .row_for_block(decorations.prompt_block_id, cx) - .unwrap() - .0 as f32; - prompt_row - scroll_top + .row_for_block(decorations.prompt_block_id, cx)? + .0 as ScrollOffset; + Some(prompt_row - scroll_top) }); - if distance_from_top != scroll_lock.distance_from_top { + if distance_from_top.is_none_or(|distance_from_top| { + distance_from_top != scroll_lock.distance_from_top + }) { editor_assists.scroll_lock = None; } } @@ -1201,8 +1197,8 @@ impl InlineAssistant { let mut scroll_target_range = None; if let Some(decorations) = assist.decorations.as_ref() { scroll_target_range = maybe!({ - let top = editor.row_for_block(decorations.prompt_block_id, cx)?.0 as f32; - let bottom = editor.row_for_block(decorations.end_block_id, cx)?.0 as f32; + let top = editor.row_for_block(decorations.prompt_block_id, cx)?.0 as f64; + let bottom = editor.row_for_block(decorations.end_block_id, cx)?.0 as f64; Some((top, bottom)) }); if scroll_target_range.is_none() { @@ -1216,15 +1212,15 @@ impl InlineAssistant { .start .to_display_point(&snapshot.display_snapshot) .row(); - let top = start_row.0 as f32; + let top = start_row.0 as ScrollOffset; let bottom = top + 1.0; (top, bottom) }); let mut scroll_target_top = scroll_target_range.0; let mut scroll_target_bottom = scroll_target_range.1; - scroll_target_top -= editor.vertical_scroll_margin() as f32; - scroll_target_bottom += editor.vertical_scroll_margin() as f32; + scroll_target_top -= editor.vertical_scroll_margin() as ScrollOffset; + scroll_target_bottom += editor.vertical_scroll_margin() as ScrollOffset; let height_in_lines = editor.visible_line_count().unwrap_or(0.); let scroll_top = editor.scroll_position(cx).y; @@ -1552,7 +1548,7 @@ struct EditorInlineAssists { struct InlineAssistScrollLock { assist_id: InlineAssistId, - distance_from_top: f32, + distance_from_top: ScrollOffset, } impl EditorInlineAssists { @@ -1795,7 +1791,7 @@ impl CodeActionProvider for AssistantCodeActionProvider { _: &mut Window, cx: &mut App, ) -> Task>> { - if !AgentSettings::get_global(cx).enabled { + if !AgentSettings::get_global(cx).enabled(cx) { return Task::ready(Ok(Vec::new())); } diff --git a/crates/agent_ui/src/profile_selector.rs b/crates/agent_ui/src/profile_selector.rs index 85f74a0f7445df03a24bf083f31d56f97e5a07b2..d52b2436d68c4b43cd7e7ec73b27007e34a43153 100644 --- a/crates/agent_ui/src/profile_selector.rs +++ b/crates/agent_ui/src/profile_selector.rs @@ -1,15 +1,22 @@ use crate::{ManageProfiles, ToggleProfileSelector}; use agent_settings::{ - AgentDockPosition, AgentProfile, AgentProfileId, AgentSettings, AvailableProfiles, - builtin_profiles, + AgentProfile, AgentProfileId, AgentSettings, AvailableProfiles, builtin_profiles, }; use fs::Fs; -use gpui::{Action, Entity, FocusHandle, Subscription, prelude::*}; +use fuzzy::{StringMatch, StringMatchCandidate, match_strings}; +use gpui::{ + Action, AnyElement, App, BackgroundExecutor, Context, DismissEvent, Entity, FocusHandle, + Focusable, SharedString, Subscription, Task, Window, +}; +use picker::{Picker, PickerDelegate, popover_menu::PickerPopoverMenu}; use settings::{Settings as _, SettingsStore, update_settings_file}; -use std::sync::Arc; +use std::{ + sync::atomic::Ordering, + sync::{Arc, atomic::AtomicBool}, +}; use ui::{ - ContextMenu, ContextMenuEntry, DocumentationEdge, DocumentationSide, PopoverMenu, - PopoverMenuHandle, TintColor, Tooltip, prelude::*, + DocumentationAside, DocumentationEdge, DocumentationSide, HighlightedLabel, LabelSize, + ListItem, ListItemSpacing, PopoverMenuHandle, TintColor, Tooltip, prelude::*, }; /// Trait for types that can provide and manage agent profiles @@ -26,9 +33,11 @@ pub trait ProfileProvider { pub struct ProfileSelector { profiles: AvailableProfiles, + pending_refresh: bool, fs: Arc, provider: Arc, - menu_handle: PopoverMenuHandle, + picker: Option>>, + picker_handle: PopoverMenuHandle>, focus_handle: FocusHandle, _subscriptions: Vec, } @@ -41,185 +50,686 @@ impl ProfileSelector { cx: &mut Context, ) -> Self { let settings_subscription = cx.observe_global::(move |this, cx| { - this.refresh_profiles(cx); + this.pending_refresh = true; + cx.notify(); }); Self { profiles: AgentProfile::available_profiles(cx), + pending_refresh: false, fs, provider, - menu_handle: PopoverMenuHandle::default(), + picker: None, + picker_handle: PopoverMenuHandle::default(), focus_handle, _subscriptions: vec![settings_subscription], } } - pub fn menu_handle(&self) -> PopoverMenuHandle { - self.menu_handle.clone() - } - - fn refresh_profiles(&mut self, cx: &mut Context) { - self.profiles = AgentProfile::available_profiles(cx); + pub fn menu_handle(&self) -> PopoverMenuHandle> { + self.picker_handle.clone() } - fn build_context_menu( - &self, + fn ensure_picker( + &mut self, window: &mut Window, cx: &mut Context, - ) -> Entity { - ContextMenu::build(window, cx, |mut menu, _window, cx| { - let settings = AgentSettings::get_global(cx); - - let mut found_non_builtin = false; - for (profile_id, profile_name) in self.profiles.iter() { - if !builtin_profiles::is_builtin(profile_id) { - found_non_builtin = true; - continue; - } - menu = menu.item(self.menu_entry_for_profile( - profile_id.clone(), - profile_name, - settings, - cx, - )); - } + ) -> Entity> { + if self.picker.is_none() { + let delegate = ProfilePickerDelegate::new( + self.fs.clone(), + self.provider.clone(), + self.profiles.clone(), + cx.background_executor().clone(), + cx, + ); - if found_non_builtin { - menu = menu.separator().header("Custom Profiles"); - for (profile_id, profile_name) in self.profiles.iter() { - if builtin_profiles::is_builtin(profile_id) { - continue; - } - menu = menu.item(self.menu_entry_for_profile( - profile_id.clone(), - profile_name, - settings, - cx, - )); - } + let picker = cx.new(|cx| { + Picker::list(delegate, window, cx) + .show_scrollbar(true) + .width(rems(18.)) + .max_height(Some(rems(20.).into())) + }); + + self.picker = Some(picker); + } + + if self.pending_refresh { + if let Some(picker) = &self.picker { + let profiles = AgentProfile::available_profiles(cx); + self.profiles = profiles.clone(); + picker.update(cx, |picker, cx| { + let query = picker.query(cx); + picker + .delegate + .refresh_profiles(profiles.clone(), query, cx); + }); } + self.pending_refresh = false; + } - menu = menu.separator(); - menu = menu.item(ContextMenuEntry::new("Configure Profiles…").handler( - move |window, cx| { - window.dispatch_action(ManageProfiles::default().boxed_clone(), cx); - }, - )); + self.picker.as_ref().unwrap().clone() + } +} - menu - }) +impl Focusable for ProfileSelector { + fn focus_handle(&self, cx: &App) -> FocusHandle { + if let Some(picker) = &self.picker { + picker.focus_handle(cx) + } else { + self.focus_handle.clone() + } } +} - fn menu_entry_for_profile( - &self, - profile_id: AgentProfileId, - profile_name: &SharedString, - settings: &AgentSettings, - cx: &App, - ) -> ContextMenuEntry { - let documentation = match profile_name.to_lowercase().as_str() { +impl Render for ProfileSelector { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + if !self.provider.profiles_supported(cx) { + return Button::new("tools-not-supported-button", "Tools Unsupported") + .disabled(true) + .label_size(LabelSize::Small) + .color(Color::Muted) + .tooltip(Tooltip::text("This model does not support tools.")) + .into_any_element(); + } + + let picker = self.ensure_picker(window, cx); + + let settings = AgentSettings::get_global(cx); + let profile_id = self.provider.profile_id(cx); + let profile = settings.profiles.get(&profile_id); + + let selected_profile = profile + .map(|profile| profile.name.clone()) + .unwrap_or_else(|| "Unknown".into()); + let focus_handle = self.focus_handle.clone(); + + let trigger_button = Button::new("profile-selector", selected_profile) + .label_size(LabelSize::Small) + .color(Color::Muted) + .icon(IconName::ChevronDown) + .icon_size(IconSize::XSmall) + .icon_position(IconPosition::End) + .icon_color(Color::Muted) + .selected_style(ButtonStyle::Tinted(TintColor::Accent)); + + PickerPopoverMenu::new( + picker, + trigger_button, + move |window, cx| { + Tooltip::for_action_in( + "Toggle Profile Menu", + &ToggleProfileSelector, + &focus_handle, + window, + cx, + ) + }, + gpui::Corner::BottomRight, + cx, + ) + .with_handle(self.picker_handle.clone()) + .render(window, cx) + .into_any_element() + } +} + +#[derive(Clone)] +struct ProfileCandidate { + id: AgentProfileId, + name: SharedString, + is_builtin: bool, +} + +#[derive(Clone)] +struct ProfileMatchEntry { + candidate_index: usize, + positions: Vec, +} + +enum ProfilePickerEntry { + Header(SharedString), + Profile(ProfileMatchEntry), +} + +pub(crate) struct ProfilePickerDelegate { + fs: Arc, + provider: Arc, + background: BackgroundExecutor, + candidates: Vec, + string_candidates: Arc>, + filtered_entries: Vec, + selected_index: usize, + query: String, + cancel: Option>, +} + +impl ProfilePickerDelegate { + fn new( + fs: Arc, + provider: Arc, + profiles: AvailableProfiles, + background: BackgroundExecutor, + cx: &mut Context, + ) -> Self { + let candidates = Self::candidates_from(profiles); + let string_candidates = Arc::new(Self::string_candidates(&candidates)); + let filtered_entries = Self::entries_from_candidates(&candidates); + + let mut this = Self { + fs, + provider, + background, + candidates, + string_candidates, + filtered_entries, + selected_index: 0, + query: String::new(), + cancel: None, + }; + + this.selected_index = this + .index_of_profile(&this.provider.profile_id(cx)) + .unwrap_or_else(|| this.first_selectable_index().unwrap_or(0)); + + this + } + + fn refresh_profiles( + &mut self, + profiles: AvailableProfiles, + query: String, + cx: &mut Context>, + ) { + self.candidates = Self::candidates_from(profiles); + self.string_candidates = Arc::new(Self::string_candidates(&self.candidates)); + self.query = query; + + if self.query.is_empty() { + self.filtered_entries = Self::entries_from_candidates(&self.candidates); + } else { + let matches = self.search_blocking(&self.query); + self.filtered_entries = self.entries_from_matches(matches); + } + + self.selected_index = self + .index_of_profile(&self.provider.profile_id(cx)) + .unwrap_or_else(|| self.first_selectable_index().unwrap_or(0)); + cx.notify(); + } + + fn candidates_from(profiles: AvailableProfiles) -> Vec { + profiles + .into_iter() + .map(|(id, name)| ProfileCandidate { + is_builtin: builtin_profiles::is_builtin(&id), + id, + name, + }) + .collect() + } + + fn string_candidates(candidates: &[ProfileCandidate]) -> Vec { + candidates + .iter() + .enumerate() + .map(|(index, candidate)| StringMatchCandidate::new(index, candidate.name.as_ref())) + .collect() + } + + fn documentation(candidate: &ProfileCandidate) -> Option<&'static str> { + match candidate.id.as_str() { builtin_profiles::WRITE => Some("Get help to write anything."), builtin_profiles::ASK => Some("Chat about your codebase."), builtin_profiles::MINIMAL => Some("Chat about anything with no tools."), _ => None, + } + } + + fn entries_from_candidates(candidates: &[ProfileCandidate]) -> Vec { + let mut entries = Vec::new(); + let mut inserted_custom_header = false; + + for (idx, candidate) in candidates.iter().enumerate() { + if !candidate.is_builtin && !inserted_custom_header { + if !entries.is_empty() { + entries.push(ProfilePickerEntry::Header("Custom Profiles".into())); + } + inserted_custom_header = true; + } + + entries.push(ProfilePickerEntry::Profile(ProfileMatchEntry { + candidate_index: idx, + positions: Vec::new(), + })); + } + + entries + } + + fn entries_from_matches(&self, matches: Vec) -> Vec { + let mut entries = Vec::new(); + for mat in matches { + if self.candidates.get(mat.candidate_id).is_some() { + entries.push(ProfilePickerEntry::Profile(ProfileMatchEntry { + candidate_index: mat.candidate_id, + positions: mat.positions, + })); + } + } + entries + } + + fn first_selectable_index(&self) -> Option { + self.filtered_entries + .iter() + .position(|entry| matches!(entry, ProfilePickerEntry::Profile(_))) + } + + fn index_of_profile(&self, profile_id: &AgentProfileId) -> Option { + self.filtered_entries.iter().position(|entry| { + matches!(entry, ProfilePickerEntry::Profile(profile) if self + .candidates + .get(profile.candidate_index) + .map(|candidate| &candidate.id == profile_id) + .unwrap_or(false)) + }) + } + + fn search_blocking(&self, query: &str) -> Vec { + if query.is_empty() { + return self + .string_candidates + .iter() + .map(|candidate| StringMatch { + candidate_id: candidate.id, + score: 0.0, + positions: Vec::new(), + string: candidate.string.clone(), + }) + .collect(); + } + + let cancel_flag = AtomicBool::new(false); + + self.background.block(match_strings( + self.string_candidates.as_ref(), + query, + false, + true, + 100, + &cancel_flag, + self.background.clone(), + )) + } +} + +impl PickerDelegate for ProfilePickerDelegate { + type ListItem = AnyElement; + + fn placeholder_text(&self, _: &mut Window, _: &mut App) -> Arc { + "Search profiles…".into() + } + + fn no_matches_text(&self, _window: &mut Window, _cx: &mut App) -> Option { + let text = if self.candidates.is_empty() { + "No profiles.".into() + } else { + "No profiles match your search.".into() }; - let thread_profile_id = self.provider.profile_id(cx); + Some(text) + } + + fn match_count(&self) -> usize { + self.filtered_entries.len() + } - let entry = ContextMenuEntry::new(profile_name.clone()) - .toggleable(IconPosition::End, profile_id == thread_profile_id); + fn selected_index(&self) -> usize { + self.selected_index + } + + fn set_selected_index(&mut self, ix: usize, _: &mut Window, cx: &mut Context>) { + self.selected_index = ix.min(self.filtered_entries.len().saturating_sub(1)); + cx.notify(); + } - let entry = if let Some(doc_text) = documentation { - entry.documentation_aside( - documentation_side(settings.dock), - DocumentationEdge::Top, - move |_| Label::new(doc_text).into_any_element(), + fn can_select( + &mut self, + ix: usize, + _window: &mut Window, + _cx: &mut Context>, + ) -> bool { + match self.filtered_entries.get(ix) { + Some(ProfilePickerEntry::Profile(_)) => true, + Some(ProfilePickerEntry::Header(_)) | None => false, + } + } + + fn update_matches( + &mut self, + query: String, + window: &mut Window, + cx: &mut Context>, + ) -> Task<()> { + if query.is_empty() { + self.query.clear(); + self.filtered_entries = Self::entries_from_candidates(&self.candidates); + self.selected_index = self + .index_of_profile(&self.provider.profile_id(cx)) + .unwrap_or_else(|| self.first_selectable_index().unwrap_or(0)); + cx.notify(); + return Task::ready(()); + } + + if let Some(prev) = &self.cancel { + prev.store(true, Ordering::Relaxed); + } + let cancel = Arc::new(AtomicBool::new(false)); + self.cancel = Some(cancel.clone()); + + let string_candidates = self.string_candidates.clone(); + let background = self.background.clone(); + let provider = self.provider.clone(); + self.query = query.clone(); + + let cancel_for_future = cancel; + + cx.spawn_in(window, async move |this, cx| { + let matches = match_strings( + string_candidates.as_ref(), + &query, + false, + true, + 100, + cancel_for_future.as_ref(), + background, ) - } else { - entry + .await; + + this.update_in(cx, |this, _, cx| { + if this.delegate.query != query { + return; + } + + this.delegate.filtered_entries = this.delegate.entries_from_matches(matches); + this.delegate.selected_index = this + .delegate + .index_of_profile(&provider.profile_id(cx)) + .unwrap_or_else(|| this.delegate.first_selectable_index().unwrap_or(0)); + cx.notify(); + }) + .ok(); + }) + } + + fn confirm(&mut self, _: bool, _window: &mut Window, cx: &mut Context>) { + match self.filtered_entries.get(self.selected_index) { + Some(ProfilePickerEntry::Profile(entry)) => { + if let Some(candidate) = self.candidates.get(entry.candidate_index) { + let profile_id = candidate.id.clone(); + let fs = self.fs.clone(); + let provider = self.provider.clone(); + + update_settings_file(fs, cx, { + let profile_id = profile_id.clone(); + move |settings, _cx| { + settings + .agent + .get_or_insert_default() + .set_profile(profile_id.0); + } + }); + + provider.set_profile(profile_id.clone(), cx); + + telemetry::event!( + "agent_profile_switched", + profile_id = profile_id.as_str(), + source = "picker" + ); + } + + cx.emit(DismissEvent); + } + _ => {} + } + } + + fn dismissed(&mut self, window: &mut Window, cx: &mut Context>) { + cx.defer_in(window, |picker, window, cx| { + picker.set_query("", window, cx); + }); + cx.emit(DismissEvent); + } + + fn render_match( + &self, + ix: usize, + selected: bool, + _: &mut Window, + cx: &mut Context>, + ) -> Option { + match self.filtered_entries.get(ix)? { + ProfilePickerEntry::Header(label) => Some( + div() + .px_2p5() + .pb_0p5() + .when(ix > 0, |this| { + this.mt_1p5() + .pt_2() + .border_t_1() + .border_color(cx.theme().colors().border_variant) + }) + .child( + Label::new(label.clone()) + .size(LabelSize::XSmall) + .color(Color::Muted), + ) + .into_any_element(), + ), + ProfilePickerEntry::Profile(entry) => { + let candidate = self.candidates.get(entry.candidate_index)?; + let active_id = self.provider.profile_id(cx); + let is_active = active_id == candidate.id; + + Some( + ListItem::new(SharedString::from(candidate.id.0.clone())) + .inset(true) + .spacing(ListItemSpacing::Sparse) + .toggle_state(selected) + .child(HighlightedLabel::new( + candidate.name.clone(), + entry.positions.clone(), + )) + .when(is_active, |this| { + this.end_slot( + div() + .pr_2() + .child(Icon::new(IconName::Check).color(Color::Accent)), + ) + }) + .into_any_element(), + ) + } + } + } + + fn documentation_aside( + &self, + _window: &mut Window, + cx: &mut Context>, + ) -> Option { + use std::rc::Rc; + + let entry = match self.filtered_entries.get(self.selected_index)? { + ProfilePickerEntry::Profile(entry) => entry, + ProfilePickerEntry::Header(_) => return None, }; - entry.handler({ - let fs = self.fs.clone(); - let provider = self.provider.clone(); - move |_window, cx| { - update_settings_file::(fs.clone(), cx, { - let profile_id = profile_id.clone(); - move |settings, _cx| { - settings.set_profile(profile_id); - } - }); + let candidate = self.candidates.get(entry.candidate_index)?; + let docs_aside = Self::documentation(candidate)?.to_string(); - provider.set_profile(profile_id.clone(), cx); + let settings = AgentSettings::get_global(cx); + let side = match settings.dock { + settings::DockPosition::Left => DocumentationSide::Right, + settings::DockPosition::Bottom | settings::DockPosition::Right => { + DocumentationSide::Left } + }; + + Some(DocumentationAside { + side, + edge: DocumentationEdge::Top, + render: Rc::new(move |_| Label::new(docs_aside.clone()).into_any_element()), }) } + + fn render_footer( + &self, + _: &mut Window, + cx: &mut Context>, + ) -> Option { + Some( + h_flex() + .w_full() + .border_t_1() + .border_color(cx.theme().colors().border_variant) + .p_1() + .gap_4() + .justify_between() + .child( + Button::new("configure", "Configure") + .icon(IconName::Settings) + .icon_size(IconSize::Small) + .icon_color(Color::Muted) + .icon_position(IconPosition::Start) + .on_click(|_, window, cx| { + window.dispatch_action(ManageProfiles::default().boxed_clone(), cx); + }), + ) + .into_any(), + ) + } } -impl Render for ProfileSelector { - fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { - let settings = AgentSettings::get_global(cx); - let profile_id = self.provider.profile_id(cx); - let profile = settings.profiles.get(&profile_id); +#[cfg(test)] +mod tests { + use super::*; + use fs::FakeFs; + use gpui::TestAppContext; - let selected_profile = profile - .map(|profile| profile.name.clone()) - .unwrap_or_else(|| "Unknown".into()); + #[gpui::test] + fn entries_include_custom_profiles(_cx: &mut TestAppContext) { + let candidates = vec![ + ProfileCandidate { + id: AgentProfileId("write".into()), + name: SharedString::from("Write"), + is_builtin: true, + }, + ProfileCandidate { + id: AgentProfileId("my-custom".into()), + name: SharedString::from("My Custom"), + is_builtin: false, + }, + ]; - if self.provider.profiles_supported(cx) { - let this = cx.entity(); - let focus_handle = self.focus_handle.clone(); - let trigger_button = Button::new("profile-selector-model", selected_profile) - .label_size(LabelSize::Small) - .color(Color::Muted) - .icon(IconName::ChevronDown) - .icon_size(IconSize::XSmall) - .icon_position(IconPosition::End) - .icon_color(Color::Muted) - .selected_style(ButtonStyle::Tinted(TintColor::Accent)); - - PopoverMenu::new("profile-selector") - .trigger_with_tooltip(trigger_button, { - move |window, cx| { - Tooltip::for_action_in( - "Toggle Profile Menu", - &ToggleProfileSelector, - &focus_handle, - window, - cx, - ) - } - }) - .anchor( - if documentation_side(settings.dock) == DocumentationSide::Left { - gpui::Corner::BottomRight - } else { - gpui::Corner::BottomLeft - }, - ) - .with_handle(self.menu_handle.clone()) - .menu(move |window, cx| { - Some(this.update(cx, |this, cx| this.build_context_menu(window, cx))) - }) - .offset(gpui::Point { - x: px(0.0), - y: px(-2.0), - }) - .into_any_element() - } else { - Button::new("tools-not-supported-button", "Tools Unsupported") - .disabled(true) - .label_size(LabelSize::Small) - .color(Color::Muted) - .tooltip(Tooltip::text("This model does not support tools.")) - .into_any_element() + let entries = ProfilePickerDelegate::entries_from_candidates(&candidates); + + assert!(entries.iter().any(|entry| matches!( + entry, + ProfilePickerEntry::Profile(profile) + if candidates[profile.candidate_index].id.as_str() == "my-custom" + ))); + assert!(entries.iter().any(|entry| matches!( + entry, + ProfilePickerEntry::Header(label) if label.as_ref() == "Custom Profiles" + ))); + } + + #[gpui::test] + fn fuzzy_filter_returns_no_results_and_keeps_configure(cx: &mut TestAppContext) { + let candidates = vec![ProfileCandidate { + id: AgentProfileId("write".into()), + name: SharedString::from("Write"), + is_builtin: true, + }]; + + let delegate = ProfilePickerDelegate { + fs: FakeFs::new(cx.executor()), + provider: Arc::new(TestProfileProvider::new(AgentProfileId("write".into()))), + background: cx.executor(), + candidates, + string_candidates: Arc::new(Vec::new()), + filtered_entries: Vec::new(), + selected_index: 0, + query: String::new(), + cancel: None, + }; + + let matches = Vec::new(); // No matches + let _entries = delegate.entries_from_matches(matches); + } + + #[gpui::test] + fn active_profile_selection_logic_works(cx: &mut TestAppContext) { + let candidates = vec![ + ProfileCandidate { + id: AgentProfileId("write".into()), + name: SharedString::from("Write"), + is_builtin: true, + }, + ProfileCandidate { + id: AgentProfileId("ask".into()), + name: SharedString::from("Ask"), + is_builtin: true, + }, + ]; + + let delegate = ProfilePickerDelegate { + fs: FakeFs::new(cx.executor()), + provider: Arc::new(TestProfileProvider::new(AgentProfileId("write".into()))), + background: cx.executor(), + candidates, + string_candidates: Arc::new(Vec::new()), + filtered_entries: vec![ + ProfilePickerEntry::Profile(ProfileMatchEntry { + candidate_index: 0, + positions: Vec::new(), + }), + ProfilePickerEntry::Profile(ProfileMatchEntry { + candidate_index: 1, + positions: Vec::new(), + }), + ], + selected_index: 0, + query: String::new(), + cancel: None, + }; + + // Active profile should be found at index 0 + let active_index = delegate.index_of_profile(&AgentProfileId("write".into())); + assert_eq!(active_index, Some(0)); + } + + struct TestProfileProvider { + profile_id: AgentProfileId, + } + + impl TestProfileProvider { + fn new(profile_id: AgentProfileId) -> Self { + Self { profile_id } } } -} -fn documentation_side(position: AgentDockPosition) -> DocumentationSide { - match position { - AgentDockPosition::Left => DocumentationSide::Right, - AgentDockPosition::Bottom => DocumentationSide::Left, - AgentDockPosition::Right => DocumentationSide::Left, + impl ProfileProvider for TestProfileProvider { + fn profile_id(&self, _cx: &App) -> AgentProfileId { + self.profile_id.clone() + } + + fn set_profile(&self, _profile_id: AgentProfileId, _cx: &mut App) {} + + fn profiles_supported(&self, _cx: &App) -> bool { + true + } } } diff --git a/crates/agent_ui/src/slash_command_settings.rs b/crates/agent_ui/src/slash_command_settings.rs deleted file mode 100644 index 9580ffef0f317fbe726c57041fad4f0fa438e143..0000000000000000000000000000000000000000 --- a/crates/agent_ui/src/slash_command_settings.rs +++ /dev/null @@ -1,37 +0,0 @@ -use anyhow::Result; -use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; - -/// Settings for slash commands. -#[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(key = "slash_commands")] -pub struct SlashCommandSettings { - /// Settings for the `/cargo-workspace` slash command. - #[serde(default)] - pub cargo_workspace: CargoWorkspaceCommandSettings, -} - -/// Settings for the `/cargo-workspace` slash command. -#[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema)] -pub struct CargoWorkspaceCommandSettings { - /// Whether `/cargo-workspace` is enabled. - #[serde(default)] - pub enabled: bool, -} - -impl Settings for SlashCommandSettings { - type FileContent = Self; - - fn load(sources: SettingsSources, _cx: &mut App) -> Result { - SettingsSources::::json_merge_with( - [sources.default] - .into_iter() - .chain(sources.user) - .chain(sources.server), - ) - } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} -} diff --git a/crates/agent_ui/src/terminal_inline_assistant.rs b/crates/agent_ui/src/terminal_inline_assistant.rs index e7070c0d7fc4878c1f73a6d5f874607422ae53d6..4385d2420511c8a148b2a7a58fa8845bd2c19a07 100644 --- a/crates/agent_ui/src/terminal_inline_assistant.rs +++ b/crates/agent_ui/src/terminal_inline_assistant.rs @@ -238,7 +238,7 @@ impl TerminalInlineAssistant { let latest_output = terminal.last_n_non_empty_lines(DEFAULT_CONTEXT_LINES); let working_directory = terminal .working_directory() - .map(|path| path.to_string_lossy().to_string()); + .map(|path| path.to_string_lossy().into_owned()); (latest_output, working_directory) }) .ok() diff --git a/crates/agent_ui/src/text_thread_editor.rs b/crates/agent_ui/src/text_thread_editor.rs index d979db5e0468b696d32ed755aec1ef47e2fd3df3..e1265e923ef06b0bad945d3751dfbf24e0f1ee00 100644 --- a/crates/agent_ui/src/text_thread_editor.rs +++ b/crates/agent_ui/src/text_thread_editor.rs @@ -3,7 +3,7 @@ use crate::{ language_model_selector::{LanguageModelSelector, language_model_selector}, ui::BurnModeTooltip, }; -use agent_settings::{AgentSettings, CompletionMode}; +use agent_settings::CompletionMode; use anyhow::Result; use assistant_slash_command::{SlashCommand, SlashCommandOutputSection, SlashCommandWorkingSet}; use assistant_slash_commands::{DefaultSlashCommand, FileSlashCommand, selections_creases}; @@ -17,6 +17,7 @@ use editor::{ BlockPlacement, BlockProperties, BlockStyle, Crease, CreaseMetadata, CustomBlockId, FoldId, RenderBlock, ToDisplayPoint, }, + scroll::ScrollOffset, }; use editor::{FoldPlaceholder, display_map::CreaseId}; use fs::Fs; @@ -41,7 +42,10 @@ use project::{Project, Worktree}; use project::{ProjectPath, lsp_store::LocalLspAdapterDelegate}; use rope::Point; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore, update_settings_file}; +use settings::{ + LanguageModelProviderSetting, LanguageModelSelection, Settings, SettingsStore, + update_settings_file, +}; use std::{ any::TypeId, cmp, @@ -105,7 +109,7 @@ pub enum InsertDraggedFiles { #[derive(Copy, Clone, Debug, PartialEq)] struct ScrollPosition { - offset_before_cursor: gpui::Point, + offset_before_cursor: gpui::Point, cursor: Anchor, } @@ -294,11 +298,16 @@ impl TextThreadEditor { language_model_selector( |cx| LanguageModelRegistry::read_global(cx).default_model(), move |model, cx| { - update_settings_file::( - fs.clone(), - cx, - move |settings, _| settings.set_model(model.clone()), - ); + update_settings_file(fs.clone(), cx, move |settings, _| { + let provider = model.provider_id().0.to_string(); + let model = model.id().0.to_string(); + settings.agent.get_or_insert_default().set_model( + LanguageModelSelection { + provider: LanguageModelProviderSetting(provider), + model, + }, + ) + }); }, window, cx, @@ -477,7 +486,7 @@ impl TextThreadEditor { return; } - let selections = self.editor.read(cx).selections.disjoint_anchors(); + let selections = self.editor.read(cx).selections.disjoint_anchors_arc(); let mut commands_by_range = HashMap::default(); let workspace = self.workspace.clone(); self.context.update(cx, |context, cx| { @@ -623,7 +632,7 @@ impl TextThreadEditor { let snapshot = editor.snapshot(window, cx); let cursor_point = scroll_position.cursor.to_display_point(&snapshot); let scroll_top = - cursor_point.row().as_f32() - scroll_position.offset_before_cursor.y; + cursor_point.row().as_f64() - scroll_position.offset_before_cursor.y; editor.set_scroll_position( point(scroll_position.offset_before_cursor.x, scroll_top), window, @@ -971,7 +980,7 @@ impl TextThreadEditor { let cursor_row = cursor .to_display_point(&snapshot.display_snapshot) .row() - .as_f32(); + .as_f64(); let scroll_position = editor .scroll_manager .anchor() @@ -1423,10 +1432,14 @@ impl TextThreadEditor { else { continue; }; - let worktree_root_name = worktree.read(cx).root_name().to_string(); - let mut full_path = PathBuf::from(worktree_root_name.clone()); - full_path.push(&project_path.path); - file_slash_command_args.push(full_path.to_string_lossy().to_string()); + let path_style = worktree.read(cx).path_style(); + let full_path = worktree + .read(cx) + .root_name() + .join(&project_path.path) + .display(path_style) + .into_owned(); + file_slash_command_args.push(full_path); } let cmd_name = FileSlashCommand.name(); @@ -1823,7 +1836,7 @@ impl TextThreadEditor { fn split(&mut self, _: &Split, _window: &mut Window, cx: &mut Context) { self.context.update(cx, |context, cx| { - let selections = self.editor.read(cx).selections.disjoint_anchors(); + let selections = self.editor.read(cx).selections.disjoint_anchors_arc(); for selection in selections.as_ref() { let buffer = self.editor.read(cx).buffer().read(cx).snapshot(cx); let range = selection diff --git a/crates/agent_ui/src/ui/burn_mode_tooltip.rs b/crates/agent_ui/src/ui/burn_mode_tooltip.rs index 72faaa614d0d531365fef9ba5ff0e62a6fbcf145..f95dc1250e36bba388452ce11e6ec783e44248e1 100644 --- a/crates/agent_ui/src/ui/burn_mode_tooltip.rs +++ b/crates/agent_ui/src/ui/burn_mode_tooltip.rs @@ -48,7 +48,7 @@ impl Render for BurnModeTooltip { let keybinding = KeyBinding::for_action(&ToggleBurnMode, window, cx) .map(|kb| kb.size(rems_from_px(12.))); - tooltip_container(window, cx, |this, _, _| { + tooltip_container(cx, |this, _| { this .child( h_flex() diff --git a/crates/agent_ui/src/ui/context_pill.rs b/crates/agent_ui/src/ui/context_pill.rs index fdd4dbfc3dbd1b73ed3b0781f2f3aac342d2cce1..ce851dd66a12bc5cbb8aff4aecc03b80e3cb4e23 100644 --- a/crates/agent_ui/src/ui/context_pill.rs +++ b/crates/agent_ui/src/ui/context_pill.rs @@ -17,6 +17,7 @@ use agent::context::{ FileContextHandle, ImageContext, ImageStatus, RulesContextHandle, SelectionContextHandle, SymbolContextHandle, TextThreadContextHandle, ThreadContextHandle, }; +use util::paths::PathStyle; #[derive(IntoElement)] pub enum ContextPill { @@ -302,33 +303,54 @@ impl AddedContext { cx: &App, ) -> Option { match handle { - AgentContextHandle::File(handle) => Self::pending_file(handle, cx), + AgentContextHandle::File(handle) => { + Self::pending_file(handle, project.path_style(cx), cx) + } AgentContextHandle::Directory(handle) => Self::pending_directory(handle, project, cx), - AgentContextHandle::Symbol(handle) => Self::pending_symbol(handle, cx), - AgentContextHandle::Selection(handle) => Self::pending_selection(handle, cx), + AgentContextHandle::Symbol(handle) => { + Self::pending_symbol(handle, project.path_style(cx), cx) + } + AgentContextHandle::Selection(handle) => { + Self::pending_selection(handle, project.path_style(cx), cx) + } AgentContextHandle::FetchedUrl(handle) => Some(Self::fetched_url(handle)), AgentContextHandle::Thread(handle) => Some(Self::pending_thread(handle, cx)), AgentContextHandle::TextThread(handle) => Some(Self::pending_text_thread(handle, cx)), AgentContextHandle::Rules(handle) => Self::pending_rules(handle, prompt_store, cx), - AgentContextHandle::Image(handle) => Some(Self::image(handle, model, cx)), + AgentContextHandle::Image(handle) => { + Some(Self::image(handle, model, project.path_style(cx), cx)) + } } } - fn pending_file(handle: FileContextHandle, cx: &App) -> Option { - let full_path = handle.buffer.read(cx).file()?.full_path(cx); - Some(Self::file(handle, &full_path, cx)) + fn pending_file( + handle: FileContextHandle, + path_style: PathStyle, + cx: &App, + ) -> Option { + let full_path = handle + .buffer + .read(cx) + .file()? + .full_path(cx) + .to_string_lossy() + .to_string(); + Some(Self::file(handle, &full_path, path_style, cx)) } - fn file(handle: FileContextHandle, full_path: &Path, cx: &App) -> AddedContext { - let full_path_string: SharedString = full_path.to_string_lossy().into_owned().into(); - let (name, parent) = - extract_file_name_and_directory_from_full_path(full_path, &full_path_string); + fn file( + handle: FileContextHandle, + full_path: &str, + path_style: PathStyle, + cx: &App, + ) -> AddedContext { + let (name, parent) = extract_file_name_and_directory_from_full_path(full_path, path_style); AddedContext { kind: ContextKind::File, name, parent, - tooltip: Some(full_path_string), - icon_path: FileIcons::get_icon(full_path, cx), + tooltip: Some(SharedString::new(full_path)), + icon_path: FileIcons::get_icon(Path::new(full_path), cx), status: ContextStatus::Ready, render_hover: None, handle: AgentContextHandle::File(handle), @@ -342,19 +364,24 @@ impl AddedContext { ) -> Option { let worktree = project.worktree_for_entry(handle.entry_id, cx)?.read(cx); let entry = worktree.entry_for_id(handle.entry_id)?; - let full_path = worktree.full_path(&entry.path); - Some(Self::directory(handle, &full_path)) + let full_path = worktree + .full_path(&entry.path) + .to_string_lossy() + .to_string(); + Some(Self::directory(handle, &full_path, project.path_style(cx))) } - fn directory(handle: DirectoryContextHandle, full_path: &Path) -> AddedContext { - let full_path_string: SharedString = full_path.to_string_lossy().into_owned().into(); - let (name, parent) = - extract_file_name_and_directory_from_full_path(full_path, &full_path_string); + fn directory( + handle: DirectoryContextHandle, + full_path: &str, + path_style: PathStyle, + ) -> AddedContext { + let (name, parent) = extract_file_name_and_directory_from_full_path(full_path, path_style); AddedContext { kind: ContextKind::Directory, name, parent, - tooltip: Some(full_path_string), + tooltip: Some(SharedString::new(full_path)), icon_path: None, status: ContextStatus::Ready, render_hover: None, @@ -362,9 +389,17 @@ impl AddedContext { } } - fn pending_symbol(handle: SymbolContextHandle, cx: &App) -> Option { - let excerpt = - ContextFileExcerpt::new(&handle.full_path(cx)?, handle.enclosing_line_range(cx), cx); + fn pending_symbol( + handle: SymbolContextHandle, + path_style: PathStyle, + cx: &App, + ) -> Option { + let excerpt = ContextFileExcerpt::new( + &handle.full_path(cx)?.to_string_lossy(), + handle.enclosing_line_range(cx), + path_style, + cx, + ); Some(AddedContext { kind: ContextKind::Symbol, name: handle.symbol.clone(), @@ -382,8 +417,17 @@ impl AddedContext { }) } - fn pending_selection(handle: SelectionContextHandle, cx: &App) -> Option { - let excerpt = ContextFileExcerpt::new(&handle.full_path(cx)?, handle.line_range(cx), cx); + fn pending_selection( + handle: SelectionContextHandle, + path_style: PathStyle, + cx: &App, + ) -> Option { + let excerpt = ContextFileExcerpt::new( + &handle.full_path(cx)?.to_string_lossy(), + handle.line_range(cx), + path_style, + cx, + ); Some(AddedContext { kind: ContextKind::Selection, name: excerpt.file_name_and_range.clone(), @@ -484,13 +528,13 @@ impl AddedContext { fn image( context: ImageContext, model: Option<&Arc>, + path_style: PathStyle, cx: &App, ) -> AddedContext { let (name, parent, icon_path) = if let Some(full_path) = context.full_path.as_ref() { - let full_path_string: SharedString = full_path.to_string_lossy().into_owned().into(); let (name, parent) = - extract_file_name_and_directory_from_full_path(full_path, &full_path_string); - let icon_path = FileIcons::get_icon(full_path, cx); + extract_file_name_and_directory_from_full_path(full_path, path_style); + let icon_path = FileIcons::get_icon(Path::new(full_path), cx); (name, parent, icon_path) } else { ("Image".into(), None, None) @@ -539,19 +583,20 @@ impl AddedContext { } fn extract_file_name_and_directory_from_full_path( - path: &Path, - name_fallback: &SharedString, + path: &str, + path_style: PathStyle, ) -> (SharedString, Option) { - let name = path - .file_name() - .map(|n| n.to_string_lossy().into_owned().into()) - .unwrap_or_else(|| name_fallback.clone()); - let parent = path - .parent() - .and_then(|p| p.file_name()) - .map(|n| n.to_string_lossy().into_owned().into()); - - (name, parent) + let (parent, file_name) = path_style.split(path); + let parent = parent.and_then(|parent| { + let parent = parent.trim_end_matches(path_style.separator()); + let (_, parent) = path_style.split(parent); + if parent.is_empty() { + None + } else { + Some(SharedString::new(parent)) + } + }); + (SharedString::new(file_name), parent) } #[derive(Debug, Clone)] @@ -563,25 +608,25 @@ struct ContextFileExcerpt { } impl ContextFileExcerpt { - pub fn new(full_path: &Path, line_range: Range, cx: &App) -> Self { - let full_path_string = full_path.to_string_lossy().into_owned(); - let file_name = full_path - .file_name() - .map(|n| n.to_string_lossy().into_owned()) - .unwrap_or_else(|| full_path_string.clone()); - + pub fn new(full_path: &str, line_range: Range, path_style: PathStyle, cx: &App) -> Self { + let (parent, file_name) = path_style.split(full_path); let line_range_text = format!(" ({}-{})", line_range.start.row + 1, line_range.end.row + 1); - let mut full_path_and_range = full_path_string; + let mut full_path_and_range = full_path.to_owned(); full_path_and_range.push_str(&line_range_text); - let mut file_name_and_range = file_name; + let mut file_name_and_range = file_name.to_owned(); file_name_and_range.push_str(&line_range_text); - let parent_name = full_path - .parent() - .and_then(|p| p.file_name()) - .map(|n| n.to_string_lossy().into_owned().into()); + let parent_name = parent.and_then(|parent| { + let parent = parent.trim_end_matches(path_style.separator()); + let (_, parent) = path_style.split(parent); + if parent.is_empty() { + None + } else { + Some(SharedString::new(parent)) + } + }); - let icon_path = FileIcons::get_icon(full_path, cx); + let icon_path = FileIcons::get_icon(Path::new(full_path), cx); ContextFileExcerpt { file_name_and_range: file_name_and_range.into(), @@ -658,7 +703,7 @@ impl ContextPillHover { impl Render for ContextPillHover { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - tooltip_container(window, cx, move |this, window, cx| { + tooltip_container(cx, move |this, cx| { this.occlude() .on_mouse_move(|_, _, cx| cx.stop_propagation()) .on_mouse_down(MouseButton::Left, |_, _, cx| cx.stop_propagation()) @@ -689,6 +734,7 @@ impl Component for AddedContext { image_task: Task::ready(Some(LanguageModelImage::empty())).shared(), }, None, + PathStyle::local(), cx, ), ); @@ -709,6 +755,7 @@ impl Component for AddedContext { .shared(), }, None, + PathStyle::local(), cx, ), ); @@ -724,6 +771,7 @@ impl Component for AddedContext { image_task: Task::ready(None).shared(), }, None, + PathStyle::local(), cx, ), ); @@ -766,7 +814,8 @@ mod tests { full_path: None, }; - let added_context = AddedContext::image(image_context, Some(&model), cx); + let added_context = + AddedContext::image(image_context, Some(&model), PathStyle::local(), cx); assert!(matches!( added_context.status, @@ -789,7 +838,7 @@ mod tests { full_path: None, }; - let added_context = AddedContext::image(image_context, None, cx); + let added_context = AddedContext::image(image_context, None, PathStyle::local(), cx); assert!( matches!(added_context.status, ContextStatus::Ready), diff --git a/crates/agent_ui/src/ui/end_trial_upsell.rs b/crates/agent_ui/src/ui/end_trial_upsell.rs index 4db9244469cf1ad7fab414874a64e45f3b97e377..9c25519659056354ed5f575be885a46151497c2e 100644 --- a/crates/agent_ui/src/ui/end_trial_upsell.rs +++ b/crates/agent_ui/src/ui/end_trial_upsell.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use ai_onboarding::{AgentPanelOnboardingCard, PlanDefinitions}; use client::zed_urls; -use cloud_llm_client::{Plan, PlanV1}; +use cloud_llm_client::{Plan, PlanV2}; use gpui::{AnyElement, App, IntoElement, RenderOnce, Window}; use ui::{Divider, Tooltip, prelude::*}; @@ -112,7 +112,7 @@ impl Component for EndTrialUpsell { Some( v_flex() .child(EndTrialUpsell { - plan: Plan::V1(PlanV1::ZedFree), + plan: Plan::V2(PlanV2::ZedFree), dismiss_upsell: Arc::new(|_, _| {}), }) .into_any_element(), diff --git a/crates/agent_ui/src/ui/onboarding_modal.rs b/crates/agent_ui/src/ui/onboarding_modal.rs index b8b038bdfca334ba048aed0a59cecd0f3da285b0..ad404afa784974631f914e6fece2de6b6c7d6a46 100644 --- a/crates/agent_ui/src/ui/onboarding_modal.rs +++ b/crates/agent_ui/src/ui/onboarding_modal.rs @@ -40,7 +40,7 @@ impl AgentOnboardingModal { } fn view_blog(&mut self, _: &ClickEvent, _: &mut Window, cx: &mut Context) { - cx.open_url("http://zed.dev/blog/fastest-ai-code-editor"); + cx.open_url("https://zed.dev/blog/fastest-ai-code-editor"); cx.notify(); agent_onboarding_event!("Blog Link Clicked"); diff --git a/crates/agent_ui/src/ui/unavailable_editing_tooltip.rs b/crates/agent_ui/src/ui/unavailable_editing_tooltip.rs index 78d4c64e0acc7bff86516657f76007e78a54d304..2993fb89a989619ecfe3d79b06d82a2a6f71fc31 100644 --- a/crates/agent_ui/src/ui/unavailable_editing_tooltip.rs +++ b/crates/agent_ui/src/ui/unavailable_editing_tooltip.rs @@ -12,8 +12,8 @@ impl UnavailableEditingTooltip { } impl Render for UnavailableEditingTooltip { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - tooltip_container(window, cx, |this, _, _| { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + tooltip_container(cx, |this, _| { this.child(Label::new("Unavailable Editing")).child( div().max_w_64().child( Label::new(format!( diff --git a/crates/ai_onboarding/Cargo.toml b/crates/ai_onboarding/Cargo.toml index cf3e6e9cd66eff0ce412436d4dc1d2b4b01c0041..95a45b1a6fbe103f02532d33c21af707f2f51d45 100644 --- a/crates/ai_onboarding/Cargo.toml +++ b/crates/ai_onboarding/Cargo.toml @@ -18,7 +18,6 @@ default = [] client.workspace = true cloud_llm_client.workspace = true component.workspace = true -feature_flags.workspace = true gpui.workspace = true language_model.workspace = true serde.workspace = true diff --git a/crates/ai_onboarding/src/ai_onboarding.rs b/crates/ai_onboarding/src/ai_onboarding.rs index e131a60b12c2b330ff3a6c099713fa4a4a083358..d953ae612199cea15f6718bf3d5cd7dd55ef856e 100644 --- a/crates/ai_onboarding/src/ai_onboarding.rs +++ b/crates/ai_onboarding/src/ai_onboarding.rs @@ -18,7 +18,6 @@ pub use young_account_banner::YoungAccountBanner; use std::sync::Arc; use client::{Client, UserStore, zed_urls}; -use feature_flags::{BillingV2FeatureFlag, FeatureFlagAppExt as _}; use gpui::{AnyElement, Entity, IntoElement, ParentElement}; use ui::{Divider, RegisterComponent, Tooltip, prelude::*}; @@ -85,7 +84,7 @@ impl ZedAiOnboarding { self } - fn render_sign_in_disclaimer(&self, cx: &mut App) -> AnyElement { + fn render_sign_in_disclaimer(&self, _cx: &mut App) -> AnyElement { let signing_in = matches!(self.sign_in_status, SignInStatus::SigningIn); v_flex() @@ -96,7 +95,7 @@ impl ZedAiOnboarding { .color(Color::Muted) .mb_2(), ) - .child(PlanDefinitions.pro_plan(cx.has_flag::(), false)) + .child(PlanDefinitions.pro_plan(true, false)) .child( Button::new("sign_in", "Try Zed Pro for Free") .disabled(signing_in) @@ -307,7 +306,7 @@ impl RenderOnce for ZedAiOnboarding { fn render(self, _window: &mut ui::Window, cx: &mut App) -> impl IntoElement { if matches!(self.sign_in_status, SignInStatus::SignedIn) { match self.plan { - None => self.render_free_plan_state(cx.has_flag::(), cx), + None => self.render_free_plan_state(true, cx), Some(plan @ (Plan::V1(PlanV1::ZedFree) | Plan::V2(PlanV2::ZedFree))) => { self.render_free_plan_state(plan.is_v2(), cx) } @@ -372,7 +371,7 @@ impl Component for ZedAiOnboarding { "Free Plan", onboarding( SignInStatus::SignedIn, - Some(Plan::V1(PlanV1::ZedFree)), + Some(Plan::V2(PlanV2::ZedFree)), false, ), ), @@ -380,7 +379,7 @@ impl Component for ZedAiOnboarding { "Pro Trial", onboarding( SignInStatus::SignedIn, - Some(Plan::V1(PlanV1::ZedProTrial)), + Some(Plan::V2(PlanV2::ZedProTrial)), false, ), ), @@ -388,7 +387,7 @@ impl Component for ZedAiOnboarding { "Pro Plan", onboarding( SignInStatus::SignedIn, - Some(Plan::V1(PlanV1::ZedPro)), + Some(Plan::V2(PlanV2::ZedPro)), false, ), ), diff --git a/crates/ai_onboarding/src/ai_upsell_card.rs b/crates/ai_onboarding/src/ai_upsell_card.rs index 51758dd9ac123b309450018bd254a2aae31d68af..91191688b556d6b040ad8de760fba5ed0fd3659e 100644 --- a/crates/ai_onboarding/src/ai_upsell_card.rs +++ b/crates/ai_onboarding/src/ai_upsell_card.rs @@ -2,7 +2,6 @@ use std::sync::Arc; use client::{Client, UserStore, zed_urls}; use cloud_llm_client::{Plan, PlanV1, PlanV2}; -use feature_flags::{BillingV2FeatureFlag, FeatureFlagAppExt}; use gpui::{AnyElement, App, Entity, IntoElement, RenderOnce, Window}; use ui::{CommonAnimationExt, Divider, Vector, VectorName, prelude::*}; @@ -50,9 +49,7 @@ impl AiUpsellCard { impl RenderOnce for AiUpsellCard { fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement { - let is_v2_plan = self - .user_plan - .map_or(cx.has_flag::(), |plan| plan.is_v2()); + let is_v2_plan = self.user_plan.map_or(true, |plan| plan.is_v2()); let pro_section = v_flex() .flex_grow() @@ -215,7 +212,7 @@ impl RenderOnce for AiUpsellCard { .child( footer_container .child( - Button::new("start_trial", "Start 14-day Free Pro Trial") + Button::new("start_trial", "Start Pro Trial") .full_width() .style(ButtonStyle::Tinted(ui::TintColor::Accent)) .when_some(self.tab_index, |this, tab_index| { @@ -230,7 +227,7 @@ impl RenderOnce for AiUpsellCard { }), ) .child( - Label::new("No credit card required") + Label::new("14 days, no credit card required") .size(LabelSize::Small) .color(Color::Muted), ), @@ -327,7 +324,7 @@ impl Component for AiUpsellCard { sign_in_status: SignInStatus::SignedIn, sign_in: Arc::new(|_, _| {}), account_too_young: false, - user_plan: Some(Plan::V1(PlanV1::ZedFree)), + user_plan: Some(Plan::V2(PlanV2::ZedFree)), tab_index: Some(1), } .into_any_element(), @@ -338,7 +335,7 @@ impl Component for AiUpsellCard { sign_in_status: SignInStatus::SignedIn, sign_in: Arc::new(|_, _| {}), account_too_young: true, - user_plan: Some(Plan::V1(PlanV1::ZedFree)), + user_plan: Some(Plan::V2(PlanV2::ZedFree)), tab_index: Some(1), } .into_any_element(), @@ -349,7 +346,7 @@ impl Component for AiUpsellCard { sign_in_status: SignInStatus::SignedIn, sign_in: Arc::new(|_, _| {}), account_too_young: false, - user_plan: Some(Plan::V1(PlanV1::ZedProTrial)), + user_plan: Some(Plan::V2(PlanV2::ZedProTrial)), tab_index: Some(1), } .into_any_element(), @@ -360,7 +357,7 @@ impl Component for AiUpsellCard { sign_in_status: SignInStatus::SignedIn, sign_in: Arc::new(|_, _| {}), account_too_young: false, - user_plan: Some(Plan::V1(PlanV1::ZedPro)), + user_plan: Some(Plan::V2(PlanV2::ZedPro)), tab_index: Some(1), } .into_any_element(), diff --git a/crates/ai_onboarding/src/plan_definitions.rs b/crates/ai_onboarding/src/plan_definitions.rs index dce67d421006ce918018923b86dbe22012efef01..11f563117132bd6860d8aef655bd0ed6b392e0e7 100644 --- a/crates/ai_onboarding/src/plan_definitions.rs +++ b/crates/ai_onboarding/src/plan_definitions.rs @@ -7,33 +7,62 @@ pub struct PlanDefinitions; impl PlanDefinitions { pub const AI_DESCRIPTION: &'static str = "Zed offers a complete agentic experience, with robust editing and reviewing features to collaborate with AI."; - pub fn free_plan(&self, _is_v2: bool) -> impl IntoElement { - List::new() - .child(ListBulletItem::new("50 prompts with Claude models")) - .child(ListBulletItem::new("2,000 accepted edit predictions")) + pub fn free_plan(&self, is_v2: bool) -> impl IntoElement { + if is_v2 { + List::new() + .child(ListBulletItem::new("2,000 accepted edit predictions")) + .child(ListBulletItem::new( + "Unlimited prompts with your AI API keys", + )) + .child(ListBulletItem::new( + "Unlimited use of external agents like Claude Code", + )) + } else { + List::new() + .child(ListBulletItem::new("50 prompts with Claude models")) + .child(ListBulletItem::new("2,000 accepted edit predictions")) + } } - pub fn pro_trial(&self, _is_v2: bool, period: bool) -> impl IntoElement { - List::new() - .child(ListBulletItem::new("150 prompts with Claude models")) - .child(ListBulletItem::new( - "Unlimited edit predictions with Zeta, our open-source model", - )) - .when(period, |this| { - this.child(ListBulletItem::new( - "Try it out for 14 days for free, no credit card required", + pub fn pro_trial(&self, is_v2: bool, period: bool) -> impl IntoElement { + if is_v2 { + List::new() + .child(ListBulletItem::new("Unlimited edit predictions")) + .child(ListBulletItem::new("$20 of tokens")) + .when(period, |this| { + this.child(ListBulletItem::new( + "Try it out for 14 days, no credit card required", + )) + }) + } else { + List::new() + .child(ListBulletItem::new("150 prompts with Claude models")) + .child(ListBulletItem::new( + "Unlimited edit predictions with Zeta, our open-source model", )) - }) + .when(period, |this| { + this.child(ListBulletItem::new( + "Try it out for 14 days, no credit card required", + )) + }) + } } - pub fn pro_plan(&self, _is_v2: bool, price: bool) -> impl IntoElement { - List::new() - .child(ListBulletItem::new("500 prompts with Claude models")) - .child(ListBulletItem::new( - "Unlimited edit predictions with Zeta, our open-source model", - )) - .when(price, |this| { - this.child(ListBulletItem::new("$20 USD per month")) - }) + pub fn pro_plan(&self, is_v2: bool, price: bool) -> impl IntoElement { + if is_v2 { + List::new() + .child(ListBulletItem::new("Unlimited edit predictions")) + .child(ListBulletItem::new("$5 of tokens")) + .child(ListBulletItem::new("Usage-based billing beyond $5")) + } else { + List::new() + .child(ListBulletItem::new("500 prompts with Claude models")) + .child(ListBulletItem::new( + "Unlimited edit predictions with Zeta, our open-source model", + )) + .when(price, |this| { + this.child(ListBulletItem::new("$20 USD per month")) + }) + } } } diff --git a/crates/ai_onboarding/src/young_account_banner.rs b/crates/ai_onboarding/src/young_account_banner.rs index ae13b9556885c1552f7e90935f844347cd76a778..c4a7887364ddb71c2c3e7ebc05b77e6e8a68370e 100644 --- a/crates/ai_onboarding/src/young_account_banner.rs +++ b/crates/ai_onboarding/src/young_account_banner.rs @@ -6,7 +6,7 @@ pub struct YoungAccountBanner; impl RenderOnce for YoungAccountBanner { fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement { - const YOUNG_ACCOUNT_DISCLAIMER: &str = "To prevent abuse of our service, GitHub accounts created fewer than 30 days ago are not eligible for free plan usage or Pro plan free trial. To request an exception, reach out to billing-support@zed.dev."; + const YOUNG_ACCOUNT_DISCLAIMER: &str = "To prevent abuse of our service, GitHub accounts created fewer than 30 days ago are not eligible for the Pro trial. You can request an exception by reaching out to billing-support@zed.dev"; let label = div() .w_full() diff --git a/crates/anthropic/Cargo.toml b/crates/anthropic/Cargo.toml index 8e82c7cdd6a6a1ac7dd0e8b165f4d924c85d39ab..c8103e5bfb533a0f7f8e88995ac0927073a9793f 100644 --- a/crates/anthropic/Cargo.toml +++ b/crates/anthropic/Cargo.toml @@ -23,6 +23,7 @@ http_client.workspace = true schemars = { workspace = true, optional = true } serde.workspace = true serde_json.workspace = true +settings.workspace = true strum.workspace = true thiserror.workspace = true workspace-hack.workspace = true diff --git a/crates/anthropic/src/anthropic.rs b/crates/anthropic/src/anthropic.rs index 7fd0fb4bc5abd983c57507522c2a37dffcbfa258..93334fd950f27309000ff175aeafb18767bd2867 100644 --- a/crates/anthropic/src/anthropic.rs +++ b/crates/anthropic/src/anthropic.rs @@ -8,6 +8,7 @@ use futures::{AsyncBufReadExt, AsyncReadExt, StreamExt, io::BufReader, stream::B use http_client::http::{self, HeaderMap, HeaderValue}; use http_client::{AsyncBody, HttpClient, Method, Request as HttpRequest, StatusCode}; use serde::{Deserialize, Serialize}; +pub use settings::{AnthropicAvailableModel as AvailableModel, ModelMode}; use strum::{EnumIter, EnumString}; use thiserror::Error; @@ -31,6 +32,24 @@ pub enum AnthropicModelMode { }, } +impl From for AnthropicModelMode { + fn from(value: ModelMode) -> Self { + match value { + ModelMode::Default => AnthropicModelMode::Default, + ModelMode::Thinking { budget_tokens } => AnthropicModelMode::Thinking { budget_tokens }, + } + } +} + +impl From for ModelMode { + fn from(value: AnthropicModelMode) -> Self { + match value { + AnthropicModelMode::Default => ModelMode::Default, + AnthropicModelMode::Thinking { budget_tokens } => ModelMode::Thinking { budget_tokens }, + } + } +} + #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, EnumIter)] pub enum Model { @@ -48,7 +67,6 @@ pub enum Model { alias = "claude-opus-4-1-thinking-latest" )] ClaudeOpus4_1Thinking, - #[default] #[serde(rename = "claude-sonnet-4", alias = "claude-sonnet-4-latest")] ClaudeSonnet4, #[serde( @@ -56,6 +74,14 @@ pub enum Model { alias = "claude-sonnet-4-thinking-latest" )] ClaudeSonnet4Thinking, + #[default] + #[serde(rename = "claude-sonnet-4-5", alias = "claude-sonnet-4-5-latest")] + ClaudeSonnet4_5, + #[serde( + rename = "claude-sonnet-4-5-thinking", + alias = "claude-sonnet-4-5-thinking-latest" + )] + ClaudeSonnet4_5Thinking, #[serde(rename = "claude-3-7-sonnet", alias = "claude-3-7-sonnet-latest")] Claude3_7Sonnet, #[serde( @@ -114,6 +140,14 @@ impl Model { return Ok(Self::ClaudeOpus4); } + if id.starts_with("claude-sonnet-4-5-thinking") { + return Ok(Self::ClaudeSonnet4_5Thinking); + } + + if id.starts_with("claude-sonnet-4-5") { + return Ok(Self::ClaudeSonnet4_5); + } + if id.starts_with("claude-sonnet-4-thinking") { return Ok(Self::ClaudeSonnet4Thinking); } @@ -161,6 +195,8 @@ impl Model { Self::ClaudeOpus4_1Thinking => "claude-opus-4-1-thinking-latest", Self::ClaudeSonnet4 => "claude-sonnet-4-latest", Self::ClaudeSonnet4Thinking => "claude-sonnet-4-thinking-latest", + Self::ClaudeSonnet4_5 => "claude-sonnet-4-5-latest", + Self::ClaudeSonnet4_5Thinking => "claude-sonnet-4-5-thinking-latest", Self::Claude3_5Sonnet => "claude-3-5-sonnet-latest", Self::Claude3_7Sonnet => "claude-3-7-sonnet-latest", Self::Claude3_7SonnetThinking => "claude-3-7-sonnet-thinking-latest", @@ -178,6 +214,7 @@ impl Model { Self::ClaudeOpus4 | Self::ClaudeOpus4Thinking => "claude-opus-4-20250514", Self::ClaudeOpus4_1 | Self::ClaudeOpus4_1Thinking => "claude-opus-4-1-20250805", Self::ClaudeSonnet4 | Self::ClaudeSonnet4Thinking => "claude-sonnet-4-20250514", + Self::ClaudeSonnet4_5 | Self::ClaudeSonnet4_5Thinking => "claude-sonnet-4-5-20250929", Self::Claude3_5Sonnet => "claude-3-5-sonnet-latest", Self::Claude3_7Sonnet | Self::Claude3_7SonnetThinking => "claude-3-7-sonnet-latest", Self::Claude3_5Haiku => "claude-3-5-haiku-latest", @@ -196,6 +233,8 @@ impl Model { Self::ClaudeOpus4_1Thinking => "Claude Opus 4.1 Thinking", Self::ClaudeSonnet4 => "Claude Sonnet 4", Self::ClaudeSonnet4Thinking => "Claude Sonnet 4 Thinking", + Self::ClaudeSonnet4_5 => "Claude Sonnet 4.5", + Self::ClaudeSonnet4_5Thinking => "Claude Sonnet 4.5 Thinking", Self::Claude3_7Sonnet => "Claude 3.7 Sonnet", Self::Claude3_5Sonnet => "Claude 3.5 Sonnet", Self::Claude3_7SonnetThinking => "Claude 3.7 Sonnet Thinking", @@ -217,6 +256,8 @@ impl Model { | Self::ClaudeOpus4_1Thinking | Self::ClaudeSonnet4 | Self::ClaudeSonnet4Thinking + | Self::ClaudeSonnet4_5 + | Self::ClaudeSonnet4_5Thinking | Self::Claude3_5Sonnet | Self::Claude3_5Haiku | Self::Claude3_7Sonnet @@ -242,6 +283,8 @@ impl Model { | Self::ClaudeOpus4_1Thinking | Self::ClaudeSonnet4 | Self::ClaudeSonnet4Thinking + | Self::ClaudeSonnet4_5 + | Self::ClaudeSonnet4_5Thinking | Self::Claude3_5Sonnet | Self::Claude3_5Haiku | Self::Claude3_7Sonnet @@ -261,6 +304,8 @@ impl Model { | Self::ClaudeOpus4_1Thinking | Self::ClaudeSonnet4 | Self::ClaudeSonnet4Thinking + | Self::ClaudeSonnet4_5 + | Self::ClaudeSonnet4_5Thinking | Self::Claude3_5Sonnet | Self::Claude3_7Sonnet | Self::Claude3_7SonnetThinking @@ -280,6 +325,8 @@ impl Model { | Self::ClaudeOpus4_1Thinking | Self::ClaudeSonnet4 | Self::ClaudeSonnet4Thinking + | Self::ClaudeSonnet4_5 + | Self::ClaudeSonnet4_5Thinking | Self::Claude3_5Sonnet | Self::Claude3_7Sonnet | Self::Claude3_7SonnetThinking @@ -299,6 +346,7 @@ impl Model { Self::ClaudeOpus4 | Self::ClaudeOpus4_1 | Self::ClaudeSonnet4 + | Self::ClaudeSonnet4_5 | Self::Claude3_5Sonnet | Self::Claude3_7Sonnet | Self::Claude3_5Haiku @@ -308,6 +356,7 @@ impl Model { Self::ClaudeOpus4Thinking | Self::ClaudeOpus4_1Thinking | Self::ClaudeSonnet4Thinking + | Self::ClaudeSonnet4_5Thinking | Self::Claude3_7SonnetThinking => AnthropicModelMode::Thinking { budget_tokens: Some(4_096), }, diff --git a/crates/askpass/Cargo.toml b/crates/askpass/Cargo.toml index 0527399af8b6f45ef18650ee5c286c0b51a83608..6aec7e6d7e011c626a57c478fa65e161f43b2bdd 100644 --- a/crates/askpass/Cargo.toml +++ b/crates/askpass/Cargo.toml @@ -16,8 +16,15 @@ anyhow.workspace = true futures.workspace = true gpui.workspace = true net.workspace = true -parking_lot.workspace = true smol.workspace = true +log.workspace = true tempfile.workspace = true util.workspace = true workspace-hack.workspace = true +zeroize.workspace = true + +[target.'cfg(target_os = "windows")'.dependencies] +windows.workspace = true + +[package.metadata.cargo-machete] +ignored = ["log"] diff --git a/crates/askpass/src/askpass.rs b/crates/askpass/src/askpass.rs index 9e84a9fed03c8a620c7cb33cc76ef22c000c3fa6..dfe8a96ee6f19510df06948f94af48d621515747 100644 --- a/crates/askpass/src/askpass.rs +++ b/crates/askpass/src/askpass.rs @@ -1,4 +1,16 @@ -use std::{ffi::OsStr, time::Duration}; +mod encrypted_password; + +pub use encrypted_password::{EncryptedPassword, IKnowWhatIAmDoingAndIHaveReadTheDocs}; + +use net::async_net::UnixListener; +use smol::lock::Mutex; +use util::fs::make_file_executable; + +use std::ffi::OsStr; +use std::ops::ControlFlow; +use std::sync::Arc; +use std::sync::OnceLock; +use std::time::Duration; use anyhow::{Context as _, Result}; use futures::channel::{mpsc, oneshot}; @@ -8,7 +20,13 @@ use futures::{ }; use gpui::{AsyncApp, BackgroundExecutor, Task}; use smol::fs; -use util::ResultExt as _; +use util::{ResultExt as _, debug_panic, maybe, paths::PathExt}; + +/// Path to the program used for askpass +/// +/// On Unix and remote servers, this defaults to the current executable +/// On Windows, this is set to the CLI variant of zed +static ASKPASS_PROGRAM: OnceLock = OnceLock::new(); #[derive(PartialEq, Eq)] pub enum AskPassResult { @@ -17,39 +35,46 @@ pub enum AskPassResult { } pub struct AskPassDelegate { - tx: mpsc::UnboundedSender<(String, oneshot::Sender)>, + tx: mpsc::UnboundedSender<(String, oneshot::Sender)>, + executor: BackgroundExecutor, _task: Task<()>, } impl AskPassDelegate { pub fn new( cx: &mut AsyncApp, - password_prompt: impl Fn(String, oneshot::Sender, &mut AsyncApp) + Send + Sync + 'static, + password_prompt: impl Fn(String, oneshot::Sender, &mut AsyncApp) + + Send + + Sync + + 'static, ) -> Self { - let (tx, mut rx) = mpsc::unbounded::<(String, oneshot::Sender)>(); + let (tx, mut rx) = mpsc::unbounded::<(String, oneshot::Sender<_>)>(); let task = cx.spawn(async move |cx: &mut AsyncApp| { while let Some((prompt, channel)) = rx.next().await { password_prompt(prompt, channel, cx); } }); - Self { tx, _task: task } + Self { + tx, + _task: task, + executor: cx.background_executor().clone(), + } } - pub async fn ask_password(&mut self, prompt: String) -> Result { - let (tx, rx) = oneshot::channel(); - self.tx.send((prompt, tx)).await?; - Ok(rx.await?) + pub fn ask_password(&mut self, prompt: String) -> Task> { + let mut this_tx = self.tx.clone(); + self.executor.spawn(async move { + let (tx, rx) = oneshot::channel(); + this_tx.send((prompt, tx)).await.ok()?; + rx.await.ok() + }) } } pub struct AskPassSession { - #[cfg(not(target_os = "windows"))] - script_path: std::path::PathBuf, - #[cfg(target_os = "windows")] - askpass_helper: String, #[cfg(target_os = "windows")] - secret: std::sync::Arc>, - _askpass_task: Task<()>, + secret: std::sync::Arc>, + askpass_task: PasswordProxy, askpass_opened_rx: Option>, askpass_kill_master_rx: Option>, } @@ -64,102 +89,57 @@ impl AskPassSession { /// You must retain this session until the master process exits. #[must_use] pub async fn new(executor: &BackgroundExecutor, mut delegate: AskPassDelegate) -> Result { - use net::async_net::UnixListener; - use util::fs::make_file_executable; - #[cfg(target_os = "windows")] - let secret = std::sync::Arc::new(parking_lot::Mutex::new(String::new())); - let temp_dir = tempfile::Builder::new().prefix("zed-askpass").tempdir()?; - let askpass_socket = temp_dir.path().join("askpass.sock"); - let askpass_script_path = temp_dir.path().join(ASKPASS_SCRIPT_NAME); + let secret = std::sync::Arc::new(OnceLock::new()); let (askpass_opened_tx, askpass_opened_rx) = oneshot::channel::<()>(); - let listener = UnixListener::bind(&askpass_socket).context("creating askpass socket")?; - #[cfg(not(target_os = "windows"))] - let zed_path = util::get_shell_safe_zed_path()?; - #[cfg(target_os = "windows")] - let zed_path = std::env::current_exe() - .context("finding current executable path for use in askpass")?; + + let askpass_opened_tx = Arc::new(Mutex::new(Some(askpass_opened_tx))); let (askpass_kill_master_tx, askpass_kill_master_rx) = oneshot::channel::<()>(); - let mut kill_tx = Some(askpass_kill_master_tx); + let kill_tx = Arc::new(Mutex::new(Some(askpass_kill_master_tx))); #[cfg(target_os = "windows")] let askpass_secret = secret.clone(); - let askpass_task = executor.spawn(async move { - let mut askpass_opened_tx = Some(askpass_opened_tx); + let get_password = { + let executor = executor.clone(); - while let Ok((mut stream, _)) = listener.accept().await { - if let Some(askpass_opened_tx) = askpass_opened_tx.take() { - askpass_opened_tx.send(()).ok(); - } - let mut buffer = Vec::new(); - let mut reader = BufReader::new(&mut stream); - if reader.read_until(b'\0', &mut buffer).await.is_err() { - buffer.clear(); - } - let prompt = String::from_utf8_lossy(&buffer); - if let Some(password) = delegate - .ask_password(prompt.to_string()) - .await - .context("getting askpass password") - .log_err() - { - stream.write_all(password.as_bytes()).await.log_err(); - #[cfg(target_os = "windows")] - { - *askpass_secret.lock() = password; + move |prompt| { + let prompt = delegate.ask_password(prompt); + let kill_tx = kill_tx.clone(); + let askpass_opened_tx = askpass_opened_tx.clone(); + #[cfg(target_os = "windows")] + let askpass_secret = askpass_secret.clone(); + executor.spawn(async move { + if let Some(askpass_opened_tx) = askpass_opened_tx.lock().await.take() { + askpass_opened_tx.send(()).ok(); } - } else { - if let Some(kill_tx) = kill_tx.take() { - kill_tx.send(()).log_err(); + if let Some(password) = prompt.await { + #[cfg(target_os = "windows")] + { + _ = askpass_secret.set(password.clone()); + } + ControlFlow::Continue(Ok(password)) + } else { + if let Some(kill_tx) = kill_tx.lock().await.take() { + kill_tx.send(()).log_err(); + } + ControlFlow::Break(()) } - // note: we expect the caller to drop this task when it's done. - // We need to keep the stream open until the caller is done to avoid - // spurious errors from ssh. - std::future::pending::<()>().await; - drop(stream); - } + }) } - drop(temp_dir) - }); - - // Create an askpass script that communicates back to this process. - let askpass_script = generate_askpass_script(&zed_path, &askpass_socket); - fs::write(&askpass_script_path, askpass_script) - .await - .with_context(|| format!("creating askpass script at {askpass_script_path:?}"))?; - make_file_executable(&askpass_script_path).await?; - #[cfg(target_os = "windows")] - let askpass_helper = format!( - "powershell.exe -ExecutionPolicy Bypass -File {}", - askpass_script_path.display() - ); + }; + let askpass_task = PasswordProxy::new(get_password, executor.clone()).await?; Ok(Self { - #[cfg(not(target_os = "windows"))] - script_path: askpass_script_path, - #[cfg(target_os = "windows")] secret, - #[cfg(target_os = "windows")] - askpass_helper, - _askpass_task: askpass_task, + askpass_task, askpass_kill_master_rx: Some(askpass_kill_master_rx), askpass_opened_rx: Some(askpass_opened_rx), }) } - #[cfg(not(target_os = "windows"))] - pub fn script_path(&self) -> impl AsRef { - &self.script_path - } - - #[cfg(target_os = "windows")] - pub fn script_path(&self) -> impl AsRef { - &self.askpass_helper - } - // This will run the askpass task forever, resolving as many authentication requests as needed. // The caller is responsible for examining the result of their own commands and cancelling this // future when this is no longer needed. Note that this can only be called once, but due to the @@ -188,11 +168,112 @@ impl AskPassSession { /// This will return the password that was last set by the askpass script. #[cfg(target_os = "windows")] - pub fn get_password(&self) -> String { - self.secret.lock().clone() + pub fn get_password(&self) -> Option { + self.secret.get().cloned() + } + + pub fn script_path(&self) -> impl AsRef { + self.askpass_task.script_path() } } +pub struct PasswordProxy { + _task: Task<()>, + #[cfg(not(target_os = "windows"))] + askpass_script_path: std::path::PathBuf, + #[cfg(target_os = "windows")] + askpass_helper: String, +} + +impl PasswordProxy { + pub async fn new( + mut get_password: impl FnMut(String) -> Task>> + + 'static + + Send + + Sync, + executor: BackgroundExecutor, + ) -> Result { + let temp_dir = tempfile::Builder::new().prefix("zed-askpass").tempdir()?; + let askpass_socket = temp_dir.path().join("askpass.sock"); + let askpass_script_path = temp_dir.path().join(ASKPASS_SCRIPT_NAME); + let current_exec = + std::env::current_exe().context("Failed to determine current zed executable path.")?; + + let askpass_program = ASKPASS_PROGRAM + .get_or_init(|| current_exec) + .try_shell_safe() + .context("Failed to shell-escape Askpass program path.")? + .to_string(); + // Create an askpass script that communicates back to this process. + let askpass_script = generate_askpass_script(&askpass_program, &askpass_socket); + let _task = executor.spawn(async move { + maybe!(async move { + let listener = + UnixListener::bind(&askpass_socket).context("creating askpass socket")?; + + while let Ok((mut stream, _)) = listener.accept().await { + let mut buffer = Vec::new(); + let mut reader = BufReader::new(&mut stream); + if reader.read_until(b'\0', &mut buffer).await.is_err() { + buffer.clear(); + } + let prompt = String::from_utf8_lossy(&buffer).into_owned(); + let password = get_password(prompt).await; + match password { + ControlFlow::Continue(password) => { + if let Ok(password) = password + && let Ok(decrypted) = + password.decrypt(IKnowWhatIAmDoingAndIHaveReadTheDocs) + { + stream.write_all(decrypted.as_bytes()).await.log_err(); + } + } + ControlFlow::Break(()) => { + // note: we expect the caller to drop this task when it's done. + // We need to keep the stream open until the caller is done to avoid + // spurious errors from ssh. + std::future::pending::<()>().await; + drop(stream); + } + } + } + drop(temp_dir); + Result::<_, anyhow::Error>::Ok(()) + }) + .await + .log_err(); + }); + + fs::write(&askpass_script_path, askpass_script) + .await + .with_context(|| format!("creating askpass script at {askpass_script_path:?}"))?; + make_file_executable(&askpass_script_path).await?; + #[cfg(target_os = "windows")] + let askpass_helper = format!( + "powershell.exe -ExecutionPolicy Bypass -File {}", + askpass_script_path.display() + ); + + Ok(Self { + _task, + #[cfg(not(target_os = "windows"))] + askpass_script_path, + #[cfg(target_os = "windows")] + askpass_helper, + }) + } + + pub fn script_path(&self) -> impl AsRef { + #[cfg(not(target_os = "windows"))] + { + &self.askpass_script_path + } + #[cfg(target_os = "windows")] + { + &self.askpass_helper + } + } +} /// The main function for when Zed is running in netcat mode for use in askpass. /// Called from both the remote server binary and the zed binary in their respective main functions. pub fn main(socket: &str) { @@ -239,12 +320,17 @@ pub fn main(socket: &str) { } } +pub fn set_askpass_program(path: std::path::PathBuf) { + if ASKPASS_PROGRAM.set(path).is_err() { + debug_panic!("askpass program has already been set"); + } +} + #[inline] #[cfg(not(target_os = "windows"))] -fn generate_askpass_script(zed_path: &str, askpass_socket: &std::path::Path) -> String { +fn generate_askpass_script(askpass_program: &str, askpass_socket: &std::path::Path) -> String { format!( - "{shebang}\n{print_args} | {zed_exe} --askpass={askpass_socket} 2> /dev/null \n", - zed_exe = zed_path, + "{shebang}\n{print_args} | {askpass_program} --askpass={askpass_socket} 2> /dev/null \n", askpass_socket = askpass_socket.display(), print_args = "printf '%s\\0' \"$@\"", shebang = "#!/bin/sh", @@ -253,13 +339,12 @@ fn generate_askpass_script(zed_path: &str, askpass_socket: &std::path::Path) -> #[inline] #[cfg(target_os = "windows")] -fn generate_askpass_script(zed_path: &std::path::Path, askpass_socket: &std::path::Path) -> String { +fn generate_askpass_script(askpass_program: &str, askpass_socket: &std::path::Path) -> String { format!( r#" $ErrorActionPreference = 'Stop'; - ($args -join [char]0) | & "{zed_exe}" --askpass={askpass_socket} 2> $null + ($args -join [char]0) | & "{askpass_program}" --askpass={askpass_socket} 2> $null "#, - zed_exe = zed_path.display(), askpass_socket = askpass_socket.display(), ) } diff --git a/crates/askpass/src/encrypted_password.rs b/crates/askpass/src/encrypted_password.rs new file mode 100644 index 0000000000000000000000000000000000000000..b5d54c18a1c608fa21a9a16c4e27c04530950c3a --- /dev/null +++ b/crates/askpass/src/encrypted_password.rs @@ -0,0 +1,102 @@ +//! This module provides [EncryptedPassword] for storage of passwords in memory. +//! On Windows that's implemented with CryptProtectMemory/CryptUnprotectMemory; on other platforms it just falls through +//! to string for now. +//! +//! The "safety" of this module lies in exploiting visibility rules of Rust: +//! 1. No outside module has access to the internal representation of [EncryptedPassword]. +//! 2. [EncryptedPassword] cannot be converted into a [String] or any other plaintext representation. +//! All use cases that do need such functionality (of which we have two right now) are implemented within this module. +//! +//! Note that this is not bulletproof. +//! 1. [ProcessExt] is implemented for [smol::process::Command], which is a builder for smol processes. +//! Before the process itself is spawned the contents of [EncryptedPassword] are unencrypted in env var storage of said builder. +//! 2. We're also sending plaintext passwords over RPC with [proto::AskPassResponse]. Go figure how great that is. +//! +//! Still, the goal of this module is to not have passwords laying around nilly-willy in memory. +//! We do not claim that it is fool-proof. +use anyhow::Result; +use zeroize::Zeroize; + +type LengthWithoutPadding = u32; +#[derive(Clone)] +pub struct EncryptedPassword(Vec, LengthWithoutPadding); + +impl Drop for EncryptedPassword { + fn drop(&mut self) { + self.0.zeroize(); + self.1.zeroize(); + } +} + +impl TryFrom<&str> for EncryptedPassword { + type Error = anyhow::Error; + fn try_from(password: &str) -> Result { + let len: u32 = password.len().try_into()?; + #[cfg(windows)] + { + use windows::Win32::Security::Cryptography::{ + CRYPTPROTECTMEMORY_BLOCK_SIZE, CRYPTPROTECTMEMORY_SAME_PROCESS, CryptProtectMemory, + }; + let mut value = password.bytes().collect::>(); + let padded_length = len.next_multiple_of(CRYPTPROTECTMEMORY_BLOCK_SIZE); + if padded_length != len { + value.resize(padded_length as usize, 0); + } + if len != 0 { + unsafe { + CryptProtectMemory( + value.as_mut_ptr() as _, + padded_length, + CRYPTPROTECTMEMORY_SAME_PROCESS, + )?; + } + } + Ok(Self(value, len)) + } + #[cfg(not(windows))] + Ok(Self(String::from(password).into(), len)) + } +} + +/// Read the docs for [EncryptedPassword]; please take care of not storing the plaintext string in memory for extended +/// periods of time. +pub struct IKnowWhatIAmDoingAndIHaveReadTheDocs; + +impl EncryptedPassword { + pub fn decrypt(mut self, _: IKnowWhatIAmDoingAndIHaveReadTheDocs) -> Result { + #[cfg(windows)] + { + use anyhow::Context; + use windows::Win32::Security::Cryptography::{ + CRYPTPROTECTMEMORY_BLOCK_SIZE, CRYPTPROTECTMEMORY_SAME_PROCESS, + CryptUnprotectMemory, + }; + assert_eq!( + self.0.len() % CRYPTPROTECTMEMORY_BLOCK_SIZE as usize, + 0, + "Violated pre-condition (buffer size <{}> must be a multiple of CRYPTPROTECTMEMORY_BLOCK_SIZE <{}>) for CryptUnprotectMemory.", + self.0.len(), + CRYPTPROTECTMEMORY_BLOCK_SIZE + ); + if self.1 != 0 { + unsafe { + CryptUnprotectMemory( + self.0.as_mut_ptr() as _, + self.0.len().try_into()?, + CRYPTPROTECTMEMORY_SAME_PROCESS, + ) + .context("while decrypting a SSH password")? + }; + + { + // Remove padding + _ = self.0.drain(self.1 as usize..); + } + } + + Ok(String::from_utf8(std::mem::take(&mut self.0))?) + } + #[cfg(not(windows))] + Ok(String::from_utf8(std::mem::take(&mut self.0))?) + } +} diff --git a/crates/assistant_context/src/assistant_context.rs b/crates/assistant_context/src/assistant_context.rs index 12eda0954a2e1cca9ddc7df9816b8f5a37d0ce10..6c06cc2c8ec7f845b1e6d49631a1bea6755a62d0 100644 --- a/crates/assistant_context/src/assistant_context.rs +++ b/crates/assistant_context/src/assistant_context.rs @@ -2445,7 +2445,7 @@ impl AssistantContext { .message_anchors .get(next_message_ix) .map_or(buffer.len(), |message| { - buffer.clip_offset(message.start.to_offset(buffer) - 1, Bias::Left) + buffer.clip_offset(message.start.to_previous_offset(buffer), Bias::Left) }); Some(self.insert_message_at_offset(offset, role, status, cx)) } else { @@ -2669,7 +2669,7 @@ impl AssistantContext { } pub fn summarize(&mut self, mut replace_old: bool, cx: &mut Context) { - let Some(model) = LanguageModelRegistry::read_global(cx).default_model() else { + let Some(model) = LanguageModelRegistry::read_global(cx).thread_summary_model() else { return; }; diff --git a/crates/assistant_context/src/assistant_context_tests.rs b/crates/assistant_context/src/assistant_context_tests.rs index 8b182685cfeb4e3ae1b9df8c532b8f0c5ad91235..413e32dfcb14273920e9ae4110e5905bdbae5956 100644 --- a/crates/assistant_context/src/assistant_context_tests.rs +++ b/crates/assistant_context/src/assistant_context_tests.rs @@ -1329,13 +1329,12 @@ fn setup_context_editor_with_fake_model( cx.update(|cx| { init_test(cx); LanguageModelRegistry::global(cx).update(cx, |registry, cx| { - registry.set_default_model( - Some(ConfiguredModel { - provider: fake_provider.clone(), - model: fake_model.clone(), - }), - cx, - ) + let configured_model = ConfiguredModel { + provider: fake_provider.clone(), + model: fake_model.clone(), + }; + registry.set_default_model(Some(configured_model.clone()), cx); + registry.set_thread_summary_model(Some(configured_model), cx); }) }); diff --git a/crates/assistant_slash_command/Cargo.toml b/crates/assistant_slash_command/Cargo.toml index f7b7af9b879492cbb48f4e88d8379b45cbc2d053..0908cd61653d35dbb54ae325118a6091cd345a4e 100644 --- a/crates/assistant_slash_command/Cargo.toml +++ b/crates/assistant_slash_command/Cargo.toml @@ -25,6 +25,7 @@ parking_lot.workspace = true serde.workspace = true serde_json.workspace = true ui.workspace = true +util.workspace = true workspace.workspace = true workspace-hack.workspace = true diff --git a/crates/assistant_slash_command/src/extension_slash_command.rs b/crates/assistant_slash_command/src/extension_slash_command.rs index e47ae52c98740af17c90fe657386bb0120773d9b..6dd2c05f192358f9fcd843add21df94e301dc6b7 100644 --- a/crates/assistant_slash_command/src/extension_slash_command.rs +++ b/crates/assistant_slash_command/src/extension_slash_command.rs @@ -1,12 +1,11 @@ -use std::path::PathBuf; -use std::sync::{Arc, atomic::AtomicBool}; - use anyhow::Result; use async_trait::async_trait; use extension::{Extension, ExtensionHostProxy, ExtensionSlashCommandProxy, WorktreeDelegate}; use gpui::{App, Task, WeakEntity, Window}; use language::{BufferSnapshot, LspAdapterDelegate}; +use std::sync::{Arc, atomic::AtomicBool}; use ui::prelude::*; +use util::rel_path::RelPath; use workspace::Workspace; use crate::{ @@ -51,10 +50,10 @@ impl WorktreeDelegate for WorktreeDelegateAdapter { } fn root_path(&self) -> String { - self.0.worktree_root_path().to_string_lossy().to_string() + self.0.worktree_root_path().to_string_lossy().into_owned() } - async fn read_text_file(&self, path: PathBuf) -> Result { + async fn read_text_file(&self, path: &RelPath) -> Result { self.0.read_text_file(path).await } @@ -62,7 +61,7 @@ impl WorktreeDelegate for WorktreeDelegateAdapter { self.0 .which(binary_name.as_ref()) .await - .map(|path| path.to_string_lossy().to_string()) + .map(|path| path.to_string_lossy().into_owned()) } async fn shell_env(&self) -> Vec<(String, String)> { diff --git a/crates/assistant_slash_commands/Cargo.toml b/crates/assistant_slash_commands/Cargo.toml index c054c3ced84825bcd131bdd76644c00595c4c4a9..5844d21a51b0642a89fd13f29f53a074331ee10e 100644 --- a/crates/assistant_slash_commands/Cargo.toml +++ b/crates/assistant_slash_commands/Cargo.toml @@ -14,7 +14,6 @@ path = "src/assistant_slash_commands.rs" [dependencies] anyhow.workspace = true assistant_slash_command.workspace = true -cargo_toml.workspace = true chrono.workspace = true collections.workspace = true context_server.workspace = true @@ -35,7 +34,6 @@ serde.workspace = true serde_json.workspace = true smol.workspace = true text.workspace = true -toml.workspace = true ui.workspace = true util.workspace = true workspace.workspace = true @@ -43,6 +41,9 @@ worktree.workspace = true workspace-hack.workspace = true [dev-dependencies] +fs = { workspace = true, features = ["test-support"] } +gpui = { workspace = true, features = ["test-support"] } pretty_assertions.workspace = true -settings.workspace = true +project = { workspace = true, features = ["test-support"] } +settings = { workspace = true, features = ["test-support"] } zlog.workspace = true diff --git a/crates/assistant_slash_commands/src/assistant_slash_commands.rs b/crates/assistant_slash_commands/src/assistant_slash_commands.rs index fb00a912197e07942a67ad92418b85c4920ad66b..2bf2573e99d7a5a0140c1972967ec68523b0b56a 100644 --- a/crates/assistant_slash_commands/src/assistant_slash_commands.rs +++ b/crates/assistant_slash_commands/src/assistant_slash_commands.rs @@ -1,4 +1,3 @@ -mod cargo_workspace_command; mod context_server_command; mod default_command; mod delta_command; @@ -12,7 +11,6 @@ mod streaming_example_command; mod symbols_command; mod tab_command; -pub use crate::cargo_workspace_command::*; pub use crate::context_server_command::*; pub use crate::default_command::*; pub use crate::delta_command::*; diff --git a/crates/assistant_slash_commands/src/cargo_workspace_command.rs b/crates/assistant_slash_commands/src/cargo_workspace_command.rs index d58b2edc4c3dffd799dd9eb1c104686dc6488687..8a6950a4a2ff40d0452669dd388886d05d71022a 100644 --- a/crates/assistant_slash_commands/src/cargo_workspace_command.rs +++ b/crates/assistant_slash_commands/src/cargo_workspace_command.rs @@ -13,6 +13,7 @@ use std::{ sync::{Arc, atomic::AtomicBool}, }; use ui::prelude::*; +use util::rel_path::RelPath; use workspace::Workspace; pub struct CargoWorkspaceSlashCommand; @@ -79,7 +80,7 @@ impl CargoWorkspaceSlashCommand { fn path_to_cargo_toml(project: Entity, cx: &mut App) -> Option> { let worktree = project.read(cx).worktrees(cx).next()?; let worktree = worktree.read(cx); - let entry = worktree.entry_for_path("Cargo.toml")?; + let entry = worktree.entry_for_path(RelPath::new("Cargo.toml").unwrap())?; let path = ProjectPath { worktree_id: worktree.id(), path: entry.path.clone(), diff --git a/crates/assistant_slash_commands/src/diagnostics_command.rs b/crates/assistant_slash_commands/src/diagnostics_command.rs index 8b1dbd515cabeb498d2a639387b426527dcda651..3a9c33061575d385652b685dcca70ee87c6cac35 100644 --- a/crates/assistant_slash_commands/src/diagnostics_command.rs +++ b/crates/assistant_slash_commands/src/diagnostics_command.rs @@ -6,19 +6,19 @@ use assistant_slash_command::{ use fuzzy::{PathMatch, StringMatchCandidate}; use gpui::{App, Entity, Task, WeakEntity}; use language::{ - Anchor, BufferSnapshot, DiagnosticEntry, DiagnosticSeverity, LspAdapterDelegate, + Anchor, BufferSnapshot, DiagnosticEntryRef, DiagnosticSeverity, LspAdapterDelegate, OffsetRangeExt, ToOffset, }; use project::{DiagnosticSummary, PathMatchCandidateSet, Project}; use rope::Point; use std::{ fmt::Write, - path::{Path, PathBuf}, + path::Path, sync::{Arc, atomic::AtomicBool}, }; use ui::prelude::*; -use util::ResultExt; -use util::paths::PathMatcher; +use util::paths::{PathMatcher, PathStyle}; +use util::{ResultExt, rel_path::RelPath}; use workspace::Workspace; use crate::create_label_for_command; @@ -36,7 +36,7 @@ impl DiagnosticsSlashCommand { if query.is_empty() { let workspace = workspace.read(cx); let entries = workspace.recent_navigation_history(Some(10), cx); - let path_prefix: Arc = Arc::default(); + let path_prefix: Arc = RelPath::empty().into(); Task::ready( entries .into_iter() @@ -73,7 +73,7 @@ impl DiagnosticsSlashCommand { fuzzy::match_path_sets( candidate_sets.as_slice(), query.as_str(), - None, + &None, false, 100, &cancellation_flag, @@ -125,6 +125,7 @@ impl SlashCommand for DiagnosticsSlashCommand { let Some(workspace) = workspace.and_then(|workspace| workspace.upgrade()) else { return Task::ready(Err(anyhow!("workspace was dropped"))); }; + let path_style = workspace.read(cx).project().read(cx).path_style(cx); let query = arguments.last().cloned().unwrap_or_default(); let paths = self.search_paths(query.clone(), cancellation_flag.clone(), &workspace, cx); @@ -134,11 +135,11 @@ impl SlashCommand for DiagnosticsSlashCommand { .await .into_iter() .map(|path_match| { - format!( - "{}{}", - path_match.path_prefix, - path_match.path.to_string_lossy() - ) + path_match + .path_prefix + .join(&path_match.path) + .display(path_style) + .to_string() }) .collect(); @@ -183,9 +184,11 @@ impl SlashCommand for DiagnosticsSlashCommand { return Task::ready(Err(anyhow!("workspace was dropped"))); }; - let options = Options::parse(arguments); + let project = workspace.read(cx).project(); + let path_style = project.read(cx).path_style(cx); + let options = Options::parse(arguments, path_style); - let task = collect_diagnostics(workspace.read(cx).project().clone(), options, cx); + let task = collect_diagnostics(project.clone(), options, cx); window.spawn(cx, async move |_| { task.await? @@ -204,14 +207,14 @@ struct Options { const INCLUDE_WARNINGS_ARGUMENT: &str = "--include-warnings"; impl Options { - fn parse(arguments: &[String]) -> Self { + fn parse(arguments: &[String], path_style: PathStyle) -> Self { let mut include_warnings = false; let mut path_matcher = None; for arg in arguments { if arg == INCLUDE_WARNINGS_ARGUMENT { include_warnings = true; } else { - path_matcher = PathMatcher::new(&[arg.to_owned()]).log_err(); + path_matcher = PathMatcher::new(&[arg.to_owned()], path_style).log_err(); } } Self { @@ -237,21 +240,15 @@ fn collect_diagnostics( None }; + let path_style = project.read(cx).path_style(cx); let glob_is_exact_file_match = if let Some(path) = options .path_matcher .as_ref() .and_then(|pm| pm.sources().first()) { - PathBuf::try_from(path) - .ok() - .and_then(|path| { - project.read(cx).worktrees(cx).find_map(|worktree| { - let worktree = worktree.read(cx); - let worktree_root_path = Path::new(worktree.root_name()); - let relative_path = path.strip_prefix(worktree_root_path).ok()?; - worktree.absolutize(relative_path).ok() - }) - }) + project + .read(cx) + .find_project_path(Path::new(path), cx) .is_some() } else { false @@ -263,9 +260,8 @@ fn collect_diagnostics( .diagnostic_summaries(false, cx) .flat_map(|(path, _, summary)| { let worktree = project.read(cx).worktree_for_id(path.worktree_id, cx)?; - let mut path_buf = PathBuf::from(worktree.read(cx).root_name()); - path_buf.push(&path.path); - Some((path, path_buf, summary)) + let full_path = worktree.read(cx).root_name().join(&path.path); + Some((path, full_path, summary)) }) .collect(); @@ -281,7 +277,7 @@ fn collect_diagnostics( let mut project_summary = DiagnosticSummary::default(); for (project_path, path, summary) in diagnostic_summaries { if let Some(path_matcher) = &options.path_matcher - && !path_matcher.is_match(&path) + && !path_matcher.is_match(&path.as_std_path()) { continue; } @@ -294,7 +290,7 @@ fn collect_diagnostics( } let last_end = output.text.len(); - let file_path = path.to_string_lossy().to_string(); + let file_path = path.display(path_style).to_string(); if !glob_is_exact_file_match { writeln!(&mut output.text, "{file_path}").unwrap(); } @@ -371,7 +367,7 @@ pub fn collect_buffer_diagnostics( fn collect_diagnostic( output: &mut SlashCommandOutput, - entry: &DiagnosticEntry, + entry: &DiagnosticEntryRef<'_, Anchor>, snapshot: &BufferSnapshot, include_warnings: bool, ) { diff --git a/crates/assistant_slash_commands/src/file_command.rs b/crates/assistant_slash_commands/src/file_command.rs index 261e15bc0ae8b9e886d4d146696db78e5c0c831d..0968a297b82bb0da783ec18fb1cd0301acf50f4c 100644 --- a/crates/assistant_slash_commands/src/file_command.rs +++ b/crates/assistant_slash_commands/src/file_command.rs @@ -14,11 +14,11 @@ use smol::stream::StreamExt; use std::{ fmt::Write, ops::{Range, RangeInclusive}, - path::{Path, PathBuf}, + path::Path, sync::{Arc, atomic::AtomicBool}, }; use ui::prelude::*; -use util::ResultExt; +use util::{ResultExt, rel_path::RelPath}; use workspace::Workspace; use worktree::ChildEntriesOptions; @@ -48,7 +48,7 @@ impl FileSlashCommand { include_dirs: true, include_ignored: false, }; - let entries = worktree.child_entries_with_options(Path::new(""), options); + let entries = worktree.child_entries_with_options(RelPath::empty(), options); entries.map(move |entry| { ( project::ProjectPath { @@ -61,19 +61,18 @@ impl FileSlashCommand { })) .collect::>(); - let path_prefix: Arc = Arc::default(); + let path_prefix: Arc = RelPath::empty().into(); Task::ready( entries .into_iter() .filter_map(|(entry, is_dir)| { let worktree = project.worktree_for_id(entry.worktree_id, cx)?; - let mut full_path = PathBuf::from(worktree.read(cx).root_name()); - full_path.push(&entry.path); + let full_path = worktree.read(cx).root_name().join(&entry.path); Some(PathMatch { score: 0., positions: Vec::new(), worktree_id: entry.worktree_id.to_usize(), - path: full_path.into(), + path: full_path, path_prefix: path_prefix.clone(), distance_to_relative_ancestor: 0, is_dir, @@ -104,7 +103,7 @@ impl FileSlashCommand { fuzzy::match_path_sets( candidate_sets.as_slice(), query.as_str(), - None, + &None, false, 100, &cancellation_flag, @@ -149,6 +148,8 @@ impl SlashCommand for FileSlashCommand { return Task::ready(Err(anyhow!("workspace was dropped"))); }; + let path_style = workspace.read(cx).path_style(cx); + let paths = self.search_paths( arguments.last().cloned().unwrap_or_default(), cancellation_flag, @@ -161,14 +162,14 @@ impl SlashCommand for FileSlashCommand { .await .into_iter() .filter_map(|path_match| { - let text = format!( - "{}{}", - path_match.path_prefix, - path_match.path.to_string_lossy() - ); + let text = path_match + .path_prefix + .join(&path_match.path) + .display(path_style) + .to_string(); let mut label = CodeLabel::default(); - let file_name = path_match.path.file_name()?.to_string_lossy(); + let file_name = path_match.path.file_name()?; let label_text = if path_match.is_dir { format!("{}/ ", file_name) } else { @@ -247,14 +248,13 @@ fn collect_files( cx.spawn(async move |cx| { for snapshot in snapshots { let worktree_id = snapshot.id(); - let mut directory_stack: Vec> = Vec::new(); - let mut folded_directory_names_stack = Vec::new(); + let path_style = snapshot.path_style(); + let mut directory_stack: Vec> = Vec::new(); + let mut folded_directory_names: Arc = RelPath::empty().into(); let mut is_top_level_directory = true; for entry in snapshot.entries(false, 0) { - let mut path_including_worktree_name = PathBuf::new(); - path_including_worktree_name.push(snapshot.root_name()); - path_including_worktree_name.push(&entry.path); + let path_including_worktree_name = snapshot.root_name().join(&entry.path); if !matchers .iter() @@ -277,13 +277,7 @@ fn collect_files( )))?; } - let filename = entry - .path - .file_name() - .unwrap_or_default() - .to_str() - .unwrap_or_default() - .to_string(); + let filename = entry.path.file_name().unwrap_or_default().to_string(); if entry.is_dir() { // Auto-fold directories that contain no files @@ -292,24 +286,23 @@ fn collect_files( if child_entries.next().is_none() && child.kind.is_dir() { if is_top_level_directory { is_top_level_directory = false; - folded_directory_names_stack.push( - path_including_worktree_name.to_string_lossy().to_string(), - ); + folded_directory_names = + folded_directory_names.join(&path_including_worktree_name); } else { - folded_directory_names_stack.push(filename.to_string()); + folded_directory_names = + folded_directory_names.join(RelPath::unix(&filename).unwrap()); } continue; } } else { // Skip empty directories - folded_directory_names_stack.clear(); + folded_directory_names = RelPath::empty().into(); continue; } - let prefix_paths = folded_directory_names_stack.drain(..).as_slice().join("/"); - if prefix_paths.is_empty() { + if folded_directory_names.is_empty() { let label = if is_top_level_directory { is_top_level_directory = false; - path_including_worktree_name.to_string_lossy().to_string() + path_including_worktree_name.display(path_style).to_string() } else { filename }; @@ -320,28 +313,23 @@ fn collect_files( }))?; events_tx.unbounded_send(Ok(SlashCommandEvent::Content( SlashCommandContent::Text { - text: label, + text: label.to_string(), run_commands_in_text: false, }, )))?; directory_stack.push(entry.path.clone()); } else { - // todo(windows) - // Potential bug: this assumes that the path separator is always `\` on Windows - let entry_name = format!( - "{}{}{}", - prefix_paths, - std::path::MAIN_SEPARATOR_STR, - &filename - ); + let entry_name = + folded_directory_names.join(RelPath::unix(&filename).unwrap()); + let entry_name = entry_name.display(path_style); events_tx.unbounded_send(Ok(SlashCommandEvent::StartSection { icon: IconName::Folder, - label: entry_name.clone().into(), + label: entry_name.to_string().into(), metadata: None, }))?; events_tx.unbounded_send(Ok(SlashCommandEvent::Content( SlashCommandContent::Text { - text: entry_name, + text: entry_name.to_string(), run_commands_in_text: false, }, )))?; @@ -356,7 +344,7 @@ fn collect_files( } else if entry.is_file() { let Some(open_buffer_task) = project_handle .update(cx, |project, cx| { - project.open_buffer((worktree_id, &entry.path), cx) + project.open_buffer((worktree_id, entry.path.clone()), cx) }) .ok() else { @@ -367,7 +355,7 @@ fn collect_files( let snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot())?; append_buffer_to_output( &snapshot, - Some(&path_including_worktree_name), + Some(path_including_worktree_name.display(path_style).as_ref()), &mut output, ) .log_err(); @@ -392,18 +380,18 @@ fn collect_files( } pub fn codeblock_fence_for_path( - path: Option<&Path>, + path: Option<&str>, row_range: Option>, ) -> String { let mut text = String::new(); write!(text, "```").unwrap(); if let Some(path) = path { - if let Some(extension) = path.extension().and_then(|ext| ext.to_str()) { + if let Some(extension) = Path::new(path).extension().and_then(|ext| ext.to_str()) { write!(text, "{} ", extension).unwrap(); } - write!(text, "{}", path.display()).unwrap(); + write!(text, "{path}").unwrap(); } else { write!(text, "untitled").unwrap(); } @@ -423,12 +411,12 @@ pub struct FileCommandMetadata { pub fn build_entry_output_section( range: Range, - path: Option<&Path>, + path: Option<&str>, is_directory: bool, line_range: Option>, ) -> SlashCommandOutputSection { let mut label = if let Some(path) = path { - path.to_string_lossy().to_string() + path.to_string() } else { "untitled".to_string() }; @@ -451,7 +439,7 @@ pub fn build_entry_output_section( } else { path.and_then(|path| { serde_json::to_value(FileCommandMetadata { - path: path.to_string_lossy().to_string(), + path: path.to_string(), }) .ok() }) @@ -462,10 +450,9 @@ pub fn build_entry_output_section( /// This contains a small fork of the util::paths::PathMatcher, that is stricter about the prefix /// check. Only subpaths pass the prefix check, rather than any prefix. mod custom_path_matcher { - use std::{fmt::Debug as _, path::Path}; - use globset::{Glob, GlobSet, GlobSetBuilder}; - use util::paths::SanitizedPath; + use std::fmt::Debug as _; + use util::{paths::SanitizedPath, rel_path::RelPath}; #[derive(Clone, Debug, Default)] pub struct PathMatcher { @@ -492,12 +479,12 @@ mod custom_path_matcher { pub fn new(globs: &[String]) -> Result { let globs = globs .iter() - .map(|glob| Glob::new(&SanitizedPath::new(glob).to_glob_string())) + .map(|glob| Glob::new(&SanitizedPath::new(glob).to_string())) .collect::, _>>()?; let sources = globs.iter().map(|glob| glob.glob().to_owned()).collect(); let sources_with_trailing_slash = globs .iter() - .map(|glob| glob.glob().to_string() + std::path::MAIN_SEPARATOR_STR) + .map(|glob| glob.glob().to_string() + "/") .collect(); let mut glob_builder = GlobSetBuilder::new(); for single_glob in globs { @@ -511,16 +498,13 @@ mod custom_path_matcher { }) } - pub fn is_match>(&self, other: P) -> bool { - let other_path = other.as_ref(); + pub fn is_match(&self, other: &RelPath) -> bool { self.sources .iter() .zip(self.sources_with_trailing_slash.iter()) .any(|(source, with_slash)| { - let as_bytes = other_path.as_os_str().as_encoded_bytes(); - // todo(windows) - // Potential bug: this assumes that the path separator is always `\` on Windows - let with_slash = if source.ends_with(std::path::MAIN_SEPARATOR_STR) { + let as_bytes = other.as_unix_str().as_bytes(); + let with_slash = if source.ends_with('/') { source.as_bytes() } else { with_slash.as_bytes() @@ -528,13 +512,13 @@ mod custom_path_matcher { as_bytes.starts_with(with_slash) || as_bytes.ends_with(source.as_bytes()) }) - || self.glob.is_match(other_path) - || self.check_with_end_separator(other_path) + || self.glob.is_match(other.as_std_path()) + || self.check_with_end_separator(other) } - fn check_with_end_separator(&self, path: &Path) -> bool { - let path_str = path.to_string_lossy(); - let separator = std::path::MAIN_SEPARATOR_STR; + fn check_with_end_separator(&self, path: &RelPath) -> bool { + let path_str = path.as_unix_str(); + let separator = "/"; if path_str.ends_with(separator) { false } else { @@ -546,7 +530,7 @@ mod custom_path_matcher { pub fn append_buffer_to_output( buffer: &BufferSnapshot, - path: Option<&Path>, + path: Option<&str>, output: &mut SlashCommandOutput, ) -> Result<()> { let prev_len = output.text.len(); diff --git a/crates/assistant_slash_commands/src/selection_command.rs b/crates/assistant_slash_commands/src/selection_command.rs index c5f01ee94c670d359816d80eef3c0230fe8ad0d0..c8692dec718a03af777753f35ae646f245878ed9 100644 --- a/crates/assistant_slash_commands/src/selection_command.rs +++ b/crates/assistant_slash_commands/src/selection_command.rs @@ -137,7 +137,9 @@ pub fn selections_creases( None }; let language_name = language_name.as_deref().unwrap_or(""); - let filename = snapshot.file_at(range.start).map(|file| file.full_path(cx)); + let filename = snapshot + .file_at(range.start) + .map(|file| file.full_path(cx).to_string_lossy().into_owned()); let text = if language_name == "markdown" { selected_text .lines() @@ -187,9 +189,9 @@ pub fn selections_creases( let start_line = range.start.row + 1; let end_line = range.end.row + 1; if start_line == end_line { - format!("{}, Line {}", path.display(), start_line) + format!("{path}, Line {start_line}") } else { - format!("{}, Lines {} to {}", path.display(), start_line, end_line) + format!("{path}, Lines {start_line} to {end_line}") } } else { "Quoted selection".to_string() diff --git a/crates/assistant_slash_commands/src/symbols_command.rs b/crates/assistant_slash_commands/src/symbols_command.rs index c700319800769e3a6e45234355c850e746231200..c537ced2966bf0bfde912ba326890a935a20f220 100644 --- a/crates/assistant_slash_commands/src/symbols_command.rs +++ b/crates/assistant_slash_commands/src/symbols_command.rs @@ -7,8 +7,8 @@ use editor::Editor; use gpui::{AppContext as _, Task, WeakEntity}; use language::{BufferSnapshot, LspAdapterDelegate}; use std::sync::Arc; -use std::{path::Path, sync::atomic::AtomicBool}; -use ui::{App, IconName, Window}; +use std::sync::atomic::AtomicBool; +use ui::{App, IconName, SharedString, Window}; use workspace::Workspace; pub struct OutlineSlashCommand; @@ -67,13 +67,13 @@ impl SlashCommand for OutlineSlashCommand { }; let snapshot = buffer.read(cx).snapshot(); - let path = snapshot.resolve_file_path(cx, true); + let path = snapshot.resolve_file_path(true, cx); cx.background_spawn(async move { let outline = snapshot.outline(None); - let path = path.as_deref().unwrap_or(Path::new("untitled")); - let mut outline_text = format!("Symbols for {}:\n", path.display()); + let path = path.as_deref().unwrap_or("untitled"); + let mut outline_text = format!("Symbols for {path}:\n"); for item in &outline.path_candidates { outline_text.push_str("- "); outline_text.push_str(&item.string); @@ -84,7 +84,7 @@ impl SlashCommand for OutlineSlashCommand { sections: vec![SlashCommandOutputSection { range: 0..outline_text.len(), icon: IconName::ListTree, - label: path.to_string_lossy().to_string().into(), + label: SharedString::new(path), metadata: None, }], text: outline_text, diff --git a/crates/assistant_slash_commands/src/tab_command.rs b/crates/assistant_slash_commands/src/tab_command.rs index a124beed6302d6c67085ccb70f4c3aa58834d3f2..9fd38128cacd51db5bd48fc801d1238ae3f674c4 100644 --- a/crates/assistant_slash_commands/src/tab_command.rs +++ b/crates/assistant_slash_commands/src/tab_command.rs @@ -8,12 +8,9 @@ use editor::Editor; use futures::future::join_all; use gpui::{Task, WeakEntity}; use language::{BufferSnapshot, CodeLabel, HighlightId, LspAdapterDelegate}; -use std::{ - path::PathBuf, - sync::{Arc, atomic::AtomicBool}, -}; +use std::sync::{Arc, atomic::AtomicBool}; use ui::{ActiveTheme, App, Window, prelude::*}; -use util::ResultExt; +use util::{ResultExt, paths::PathStyle}; use workspace::Workspace; use crate::file_command::append_buffer_to_output; @@ -72,35 +69,42 @@ impl SlashCommand for TabSlashCommand { return Task::ready(Ok(Vec::new())); } - let active_item_path = workspace.as_ref().and_then(|workspace| { - workspace - .update(cx, |workspace, cx| { - let snapshot = active_item_buffer(workspace, cx).ok()?; - snapshot.resolve_file_path(cx, true) - }) - .ok() - .flatten() + let Some(workspace) = workspace.and_then(|workspace| workspace.upgrade()) else { + return Task::ready(Err(anyhow::anyhow!("no workspace"))); + }; + + let active_item_path = workspace.update(cx, |workspace, cx| { + let snapshot = active_item_buffer(workspace, cx).ok()?; + snapshot.resolve_file_path(true, cx) }); + let path_style = workspace.read(cx).path_style(cx); + let current_query = arguments.last().cloned().unwrap_or_default(); - let tab_items_search = - tab_items_for_queries(workspace, &[current_query], cancel, false, window, cx); + let tab_items_search = tab_items_for_queries( + Some(workspace.downgrade()), + &[current_query], + cancel, + false, + window, + cx, + ); let comment_id = cx.theme().syntax().highlight_id("comment").map(HighlightId); window.spawn(cx, async move |_| { let tab_items = tab_items_search.await?; let run_command = tab_items.len() == 1; let tab_completion_items = tab_items.into_iter().filter_map(|(path, ..)| { - let path_string = path.as_deref()?.to_string_lossy().to_string(); - if argument_set.contains(&path_string) { + let path = path?; + if argument_set.contains(&path) { return None; } - if active_item_path.is_some() && active_item_path == path { + if active_item_path.as_ref() == Some(&path) { return None; } - let label = create_tab_completion_label(path.as_ref()?, comment_id); + let label = create_tab_completion_label(&path, path_style, comment_id); Some(ArgumentCompletion { label, - new_text: path_string, + new_text: path, replace_previous_arguments: false, after_completion: run_command.into(), }) @@ -109,8 +113,9 @@ impl SlashCommand for TabSlashCommand { let active_item_completion = active_item_path .as_deref() .map(|active_item_path| { - let path_string = active_item_path.to_string_lossy().to_string(); - let label = create_tab_completion_label(active_item_path, comment_id); + let path_string = active_item_path.to_string(); + let label = + create_tab_completion_label(active_item_path, path_style, comment_id); ArgumentCompletion { label, new_text: path_string, @@ -169,7 +174,7 @@ fn tab_items_for_queries( strict_match: bool, window: &mut Window, cx: &mut App, -) -> Task, BufferSnapshot, usize)>>> { +) -> Task, BufferSnapshot, usize)>>> { let empty_query = queries.is_empty() || queries.iter().all(|query| query.trim().is_empty()); let queries = queries.to_owned(); window.spawn(cx, async move |cx| { @@ -179,7 +184,7 @@ fn tab_items_for_queries( .update(cx, |workspace, cx| { if strict_match && empty_query { let snapshot = active_item_buffer(workspace, cx)?; - let full_path = snapshot.resolve_file_path(cx, true); + let full_path = snapshot.resolve_file_path(true, cx); return anyhow::Ok(vec![(full_path, snapshot, 0)]); } @@ -201,7 +206,7 @@ fn tab_items_for_queries( && visited_buffers.insert(buffer.read(cx).remote_id()) { let snapshot = buffer.read(cx).snapshot(); - let full_path = snapshot.resolve_file_path(cx, true); + let full_path = snapshot.resolve_file_path(true, cx); open_buffers.push((full_path, snapshot, *timestamp)); } } @@ -224,10 +229,7 @@ fn tab_items_for_queries( let match_candidates = open_buffers .iter() .enumerate() - .filter_map(|(id, (full_path, ..))| { - let path_string = full_path.as_deref()?.to_string_lossy().to_string(); - Some((id, path_string)) - }) + .filter_map(|(id, (full_path, ..))| Some((id, full_path.clone()?))) .fold(HashMap::default(), |mut candidates, (id, path_string)| { candidates .entry(path_string) @@ -249,8 +251,7 @@ fn tab_items_for_queries( .iter() .enumerate() .filter_map(|(id, (full_path, ..))| { - let path_string = full_path.as_deref()?.to_string_lossy().to_string(); - Some(fuzzy::StringMatchCandidate::new(id, &path_string)) + Some(fuzzy::StringMatchCandidate::new(id, full_path.as_ref()?)) }) .collect::>(); let mut processed_matches = HashSet::default(); @@ -302,21 +303,15 @@ fn active_item_buffer( } fn create_tab_completion_label( - path: &std::path::Path, + path: &str, + path_style: PathStyle, comment_id: Option, ) -> CodeLabel { - let file_name = path - .file_name() - .map(|f| f.to_string_lossy()) - .unwrap_or_default(); - let parent_path = path - .parent() - .map(|p| p.to_string_lossy()) - .unwrap_or_default(); + let (parent_path, file_name) = path_style.split(path); let mut label = CodeLabel::default(); - label.push_str(&file_name, None); + label.push_str(file_name, None); label.push_str(" ", None); - label.push_str(&parent_path, comment_id); + label.push_str(parent_path.unwrap_or_default(), comment_id); label.filter_range = 0..file_name.len(); label } diff --git a/crates/assistant_tool/src/outline.rs b/crates/assistant_tool/src/outline.rs index fa5ad561eea94d92568ee36ab8835f8a87337314..4c8e2efefd67e25c630d38e16bda8a8dff34fb16 100644 --- a/crates/assistant_tool/src/outline.rs +++ b/crates/assistant_tool/src/outline.rs @@ -5,7 +5,6 @@ use language::{Buffer, OutlineItem, ParseStatus}; use project::Project; use regex::Regex; use std::fmt::Write; -use std::path::Path; use text::Point; /// For files over this size, instead of reading them (or including them in context), @@ -143,7 +142,7 @@ pub struct BufferContent { /// For smaller files, returns the full content. pub async fn get_buffer_content_or_outline( buffer: Entity, - path: Option<&Path>, + path: Option<&str>, cx: &AsyncApp, ) -> Result { let file_size = buffer.read_with(cx, |buffer, _| buffer.text().len())?; @@ -170,15 +169,10 @@ pub async fn get_buffer_content_or_outline( let text = if let Some(path) = path { format!( - "# File outline for {} (file too large to show full content)\n\n{}", - path.display(), - outline_text + "# File outline for {path} (file too large to show full content)\n\n{outline_text}", ) } else { - format!( - "# File outline (file too large to show full content)\n\n{}", - outline_text - ) + format!("# File outline (file too large to show full content)\n\n{outline_text}",) }; Ok(BufferContent { text, diff --git a/crates/assistant_tools/Cargo.toml b/crates/assistant_tools/Cargo.toml index 5a8ca8a5e995fd2c738eb3b309f2bb4ebe9595a1..9b9b8196d1c342c536d605306a1a062e73768c56 100644 --- a/crates/assistant_tools/Cargo.toml +++ b/crates/assistant_tools/Cargo.toml @@ -63,7 +63,6 @@ ui.workspace = true util.workspace = true watch.workspace = true web_search.workspace = true -which.workspace = true workspace-hack.workspace = true workspace.workspace = true diff --git a/crates/assistant_tools/src/assistant_tools.rs b/crates/assistant_tools/src/assistant_tools.rs index ce3b639cb2c46d3f736490c0b2153260f970963c..17e2ba12f706387859ca3393aa44f5c05570e50a 100644 --- a/crates/assistant_tools/src/assistant_tools.rs +++ b/crates/assistant_tools/src/assistant_tools.rs @@ -52,7 +52,7 @@ pub fn init(http_client: Arc, cx: &mut App) { assistant_tool::init(cx); let registry = ToolRegistry::global(cx); - registry.register_tool(TerminalTool::new(cx)); + registry.register_tool(TerminalTool); registry.register_tool(CreateDirectoryTool); registry.register_tool(CopyPathTool); registry.register_tool(DeletePathTool); diff --git a/crates/assistant_tools/src/copy_path_tool.rs b/crates/assistant_tools/src/copy_path_tool.rs index c56a864bd45efd83d605607962f6103f8da7d1da..572eddcb1079557b464ba29d125aa44929409cc5 100644 --- a/crates/assistant_tools/src/copy_path_tool.rs +++ b/crates/assistant_tools/src/copy_path_tool.rs @@ -96,9 +96,7 @@ impl Tool for CopyPathTool { .and_then(|project_path| project.entry_for_path(&project_path, cx)) { Some(entity) => match project.find_project_path(&input.destination_path, cx) { - Some(project_path) => { - project.copy_entry(entity.id, None, project_path.path, cx) - } + Some(project_path) => project.copy_entry(entity.id, project_path, cx), None => Task::ready(Err(anyhow!( "Destination path {} was outside the project.", input.destination_path diff --git a/crates/assistant_tools/src/diagnostics_tool.rs b/crates/assistant_tools/src/diagnostics_tool.rs index 4ec794e12783746e4e330e79f0c0cb14c84f5d2e..75bd683512b58d2fdb6c43fc319d266f6609f926 100644 --- a/crates/assistant_tools/src/diagnostics_tool.rs +++ b/crates/assistant_tools/src/diagnostics_tool.rs @@ -8,7 +8,7 @@ use language_model::{LanguageModel, LanguageModelRequest, LanguageModelToolSchem use project::Project; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::{fmt::Write, path::Path, sync::Arc}; +use std::{fmt::Write, sync::Arc}; use ui::IconName; use util::markdown::MarkdownInlineCode; @@ -150,9 +150,7 @@ impl Tool for DiagnosticsTool { has_diagnostics = true; output.push_str(&format!( "{}: {} error(s), {} warning(s)\n", - Path::new(worktree.read(cx).root_name()) - .join(project_path.path) - .display(), + worktree.read(cx).absolutize(&project_path.path).display(), summary.error_count, summary.warning_count )); diff --git a/crates/assistant_tools/src/edit_agent.rs b/crates/assistant_tools/src/edit_agent.rs index 29ac53e2a606d63873f515aff25326debf0486f1..829287f65478d56d793ed506c44a8331580cc4c5 100644 --- a/crates/assistant_tools/src/edit_agent.rs +++ b/crates/assistant_tools/src/edit_agent.rs @@ -26,13 +26,13 @@ use language_model::{ use project::{AgentLocation, Project}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::{cmp, iter, mem, ops::Range, path::PathBuf, pin::Pin, sync::Arc, task::Poll}; +use std::{cmp, iter, mem, ops::Range, pin::Pin, sync::Arc, task::Poll}; use streaming_diff::{CharOperation, StreamingDiff}; use streaming_fuzzy_matcher::StreamingFuzzyMatcher; #[derive(Serialize)] struct CreateFilePromptTemplate { - path: Option, + path: Option, edit_description: String, } @@ -42,7 +42,7 @@ impl Template for CreateFilePromptTemplate { #[derive(Serialize)] struct EditFileXmlPromptTemplate { - path: Option, + path: Option, edit_description: String, } @@ -52,7 +52,7 @@ impl Template for EditFileXmlPromptTemplate { #[derive(Serialize)] struct EditFileDiffFencedPromptTemplate { - path: Option, + path: Option, edit_description: String, } @@ -115,7 +115,7 @@ impl EditAgent { let conversation = conversation.clone(); let output = cx.spawn(async move |cx| { let snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot())?; - let path = cx.update(|cx| snapshot.resolve_file_path(cx, true))?; + let path = cx.update(|cx| snapshot.resolve_file_path(true, cx))?; let prompt = CreateFilePromptTemplate { path, edit_description, @@ -229,7 +229,7 @@ impl EditAgent { let edit_format = self.edit_format; let output = cx.spawn(async move |cx| { let snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot())?; - let path = cx.update(|cx| snapshot.resolve_file_path(cx, true))?; + let path = cx.update(|cx| snapshot.resolve_file_path(true, cx))?; let prompt = match edit_format { EditFormat::XmlTags => EditFileXmlPromptTemplate { path, diff --git a/crates/assistant_tools/src/edit_agent/create_file_parser.rs b/crates/assistant_tools/src/edit_agent/create_file_parser.rs index 5126f9c6b1fe4ee5cc600ae93b7300b7af09451f..2272434d796a92e53b741f8ed5f4303d94f88489 100644 --- a/crates/assistant_tools/src/edit_agent/create_file_parser.rs +++ b/crates/assistant_tools/src/edit_agent/create_file_parser.rs @@ -160,7 +160,7 @@ mod tests { &mut parser, &mut rng ), - // This output is marlformed, so we're doing our best effort + // This output is malformed, so we're doing our best effort "Hello world\n```\n\nThe end\n".to_string() ); } @@ -182,7 +182,7 @@ mod tests { &mut parser, &mut rng ), - // This output is marlformed, so we're doing our best effort + // This output is malformed, so we're doing our best effort "```\nHello world\n```\n".to_string() ); } diff --git a/crates/assistant_tools/src/edit_agent/evals/fixtures/use_wasi_sdk_in_compile_parser_to_wasm/before.rs b/crates/assistant_tools/src/edit_agent/evals/fixtures/use_wasi_sdk_in_compile_parser_to_wasm/before.rs index b51c74c798d88b3f84303ffe41f4ac2590e7f236..cfa28fe1ad6091c9adda22f610e1cf13166f8dfb 100644 --- a/crates/assistant_tools/src/edit_agent/evals/fixtures/use_wasi_sdk_in_compile_parser_to_wasm/before.rs +++ b/crates/assistant_tools/src/edit_agent/evals/fixtures/use_wasi_sdk_in_compile_parser_to_wasm/before.rs @@ -916,7 +916,7 @@ impl Loader { if !found_non_static { found_non_static = true; eprintln!( - "Warning: Found non-static non-tree-sitter functions in the external scannner" + "Warning: Found non-static non-tree-sitter functions in the external scanner" ); } eprintln!(" `{function_name}`"); diff --git a/crates/assistant_tools/src/edit_file_tool.rs b/crates/assistant_tools/src/edit_file_tool.rs index d13f9891c3af1933ee49428c223d3e6737871047..f88978650a32cdc6922a1ff864b0ee898721df80 100644 --- a/crates/assistant_tools/src/edit_file_tool.rs +++ b/crates/assistant_tools/src/edit_file_tool.rs @@ -17,7 +17,7 @@ use editor::{ use futures::StreamExt; use gpui::{ Animation, AnimationExt, AnyWindowHandle, App, AppContext, AsyncApp, Entity, Task, - TextStyleRefinement, WeakEntity, pulsating_between, px, + TextStyleRefinement, WeakEntity, pulsating_between, }; use indoc::formatdoc; use language::{ @@ -38,6 +38,7 @@ use settings::Settings; use std::{ cmp::Reverse, collections::HashSet, + ffi::OsStr, ops::Range, path::{Path, PathBuf}, sync::Arc, @@ -45,7 +46,7 @@ use std::{ }; use theme::ThemeSettings; use ui::{CommonAnimationExt, Disclosure, Tooltip, prelude::*}; -use util::ResultExt; +use util::{ResultExt, rel_path::RelPath}; use workspace::Workspace; pub struct EditFileTool; @@ -146,11 +147,11 @@ impl Tool for EditFileTool { // If any path component matches the local settings folder, then this could affect // the editor in ways beyond the project source, so prompt. - let local_settings_folder = paths::local_settings_folder_relative_path(); + let local_settings_folder = paths::local_settings_folder_name(); let path = Path::new(&input.path); if path .components() - .any(|component| component.as_os_str() == local_settings_folder.as_os_str()) + .any(|c| c.as_os_str() == >::as_ref(local_settings_folder)) { return true; } @@ -195,10 +196,10 @@ impl Tool for EditFileTool { let mut description = input.display_description.clone(); // Add context about why confirmation may be needed - let local_settings_folder = paths::local_settings_folder_relative_path(); + let local_settings_folder = paths::local_settings_folder_name(); if path .components() - .any(|c| c.as_os_str() == local_settings_folder.as_os_str()) + .any(|c| c.as_os_str() == >::as_ref(local_settings_folder)) { description.push_str(" (local settings)"); } else if let Ok(canonical_path) = std::fs::canonicalize(&input.path) @@ -377,7 +378,7 @@ impl Tool for EditFileTool { .await; let output = EditFileToolOutput { - original_path: project_path.path.to_path_buf(), + original_path: project_path.path.as_std_path().to_owned(), new_text, old_text, raw_output: Some(agent_output), @@ -549,10 +550,11 @@ fn resolve_path( let file_name = input .path .file_name() + .and_then(|file_name| file_name.to_str()) .context("Can't create file: invalid filename")?; let new_file_path = parent_project_path.map(|parent| ProjectPath { - path: Arc::from(parent.path.join(file_name)), + path: parent.path.join(RelPath::unix(file_name).unwrap()), ..parent }); @@ -1001,7 +1003,7 @@ impl ToolCard for EditFileToolCard { font_size: Some( TextSize::Small .rems(cx) - .to_pixels(ThemeSettings::get_global(cx).agent_font_size(cx)) + .to_pixels(ThemeSettings::get_global(cx).agent_ui_font_size(cx)) .into(), ), ..TextStyleRefinement::default() @@ -1100,7 +1102,7 @@ impl ToolCard for EditFileToolCard { .relative() .h_full() .when(!self.full_height_expanded, |editor_container| { - editor_container.max_h(px(COLLAPSED_LINES as f32 * editor_line_height.0)) + editor_container.max_h(COLLAPSED_LINES as f32 * editor_line_height) }) .overflow_hidden() .border_t_1() @@ -1159,7 +1161,7 @@ async fn build_buffer( LineEnding::normalize(&mut text); let text = Rope::from(text); let language = cx - .update(|_cx| language_registry.language_for_file_path(&path))? + .update(|_cx| language_registry.load_language_for_file_path(&path))? .await .ok(); let buffer = cx.new(|cx| { @@ -1236,7 +1238,7 @@ mod tests { use serde_json::json; use settings::SettingsStore; use std::fs; - use util::path; + use util::{path, rel_path::rel_path}; #[gpui::test] async fn test_edit_nonexistent_file(cx: &mut TestAppContext) { @@ -1355,14 +1357,10 @@ mod tests { cx.update(|cx| resolve_path(&input, project, cx)) } + #[track_caller] fn assert_resolved_path_eq(path: anyhow::Result, expected: &str) { - let actual = path - .expect("Should return valid path") - .path - .to_str() - .unwrap() - .replace("\\", "/"); // Naive Windows paths normalization - assert_eq!(actual, expected); + let actual = path.expect("Should return valid path").path; + assert_eq!(actual.as_ref(), rel_path(expected)); } #[test] @@ -1445,8 +1443,8 @@ mod tests { fn init_test_with_config(cx: &mut TestAppContext, data_dir: &Path) { cx.update(|cx| { - // Set custom data directory (config will be under data_dir/config) paths::set_custom_data_dir(data_dir.to_str().unwrap()); + // Set custom data directory (config will be under data_dir/config) let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); @@ -1537,14 +1535,11 @@ mod tests { // First, test with format_on_save enabled cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::( - cx, - |settings| { - settings.defaults.format_on_save = Some(FormatOnSave::On); - settings.defaults.formatter = - Some(language::language_settings::SelectedFormatter::Auto); - }, - ); + store.update_user_settings(cx, |settings| { + settings.project.all_languages.defaults.format_on_save = Some(FormatOnSave::On); + settings.project.all_languages.defaults.formatter = + Some(language::language_settings::SelectedFormatter::Auto); + }); }); }); @@ -1603,12 +1598,10 @@ mod tests { // Next, test with format_on_save disabled cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::( - cx, - |settings| { - settings.defaults.format_on_save = Some(FormatOnSave::Off); - }, - ); + store.update_user_settings(cx, |settings| { + settings.project.all_languages.defaults.format_on_save = + Some(FormatOnSave::Off); + }); }); }); @@ -1679,12 +1672,13 @@ mod tests { // First, test with remove_trailing_whitespace_on_save enabled cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::( - cx, - |settings| { - settings.defaults.remove_trailing_whitespace_on_save = Some(true); - }, - ); + store.update_user_settings(cx, |settings| { + settings + .project + .all_languages + .defaults + .remove_trailing_whitespace_on_save = Some(true); + }); }); }); @@ -1741,12 +1735,13 @@ mod tests { // Next, test with remove_trailing_whitespace_on_save disabled cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::( - cx, - |settings| { - settings.defaults.remove_trailing_whitespace_on_save = Some(false); - }, - ); + store.update_user_settings(cx, |settings| { + settings + .project + .all_languages + .defaults + .remove_trailing_whitespace_on_save = Some(false); + }); }); }); @@ -1979,25 +1974,22 @@ mod tests { let project = Project::test(fs.clone(), [path!("/home/user/myproject").as_ref()], cx).await; // Get the actual local settings folder name - let local_settings_folder = paths::local_settings_folder_relative_path(); + let local_settings_folder = paths::local_settings_folder_name(); // Test various config path patterns let test_cases = vec![ ( - format!("{}/settings.json", local_settings_folder.display()), + format!("{local_settings_folder}/settings.json"), true, "Top-level local settings file".to_string(), ), ( - format!( - "myproject/{}/settings.json", - local_settings_folder.display() - ), + format!("myproject/{local_settings_folder}/settings.json"), true, "Local settings in project path".to_string(), ), ( - format!("src/{}/config.toml", local_settings_folder.display()), + format!("src/{local_settings_folder}/config.toml"), true, "Local settings in subdirectory".to_string(), ), @@ -2208,12 +2200,7 @@ mod tests { ("", false, "Empty path is treated as project root"), // Root directory ("/", true, "Root directory should be outside project"), - // Parent directory references - find_project_path resolves these - ( - "project/../other", - false, - "Path with .. is resolved by find_project_path", - ), + ("project/../other", true, "Path with .. is outside project"), ( "project/./src/file.rs", false, diff --git a/crates/assistant_tools/src/find_path_tool.rs b/crates/assistant_tools/src/find_path_tool.rs index d1451132aeb066a5d4ff9e05f81db3855c1d513a..0bc478251cb5d3d558dda4fb41df02e85eaafde2 100644 --- a/crates/assistant_tools/src/find_path_tool.rs +++ b/crates/assistant_tools/src/find_path_tool.rs @@ -161,10 +161,13 @@ impl Tool for FindPathTool { } fn search_paths(glob: &str, project: Entity, cx: &mut App) -> Task>> { - let path_matcher = match PathMatcher::new([ - // Sometimes models try to search for "". In this case, return all paths in the project. - if glob.is_empty() { "*" } else { glob }, - ]) { + let path_matcher = match PathMatcher::new( + [ + // Sometimes models try to search for "". In this case, return all paths in the project. + if glob.is_empty() { "*" } else { glob }, + ], + project.read(cx).path_style(cx), + ) { Ok(matcher) => matcher, Err(err) => return Task::ready(Err(anyhow!("Invalid glob: {err}"))), }; @@ -178,10 +181,15 @@ fn search_paths(glob: &str, project: Entity, cx: &mut App) -> Task>(), + project.read(cx).path_style(cx), ) { Ok(matcher) => matcher, Err(error) => { @@ -141,7 +142,7 @@ impl Tool for GrepTool { .iter() .chain(global_settings.private_files.sources().iter()); - match PathMatcher::new(exclude_patterns) { + match PathMatcher::new(exclude_patterns, project.read(cx).path_style(cx)) { Ok(matcher) => matcher, Err(error) => { return Task::ready(Err(anyhow!("invalid exclude pattern: {error}"))).into(); @@ -314,7 +315,7 @@ mod tests { use gpui::{AppContext, TestAppContext, UpdateGlobal}; use language::{Language, LanguageConfig, LanguageMatcher}; use language_model::fake_provider::FakeLanguageModel; - use project::{FakeFs, Project, WorktreeSettings}; + use project::{FakeFs, Project}; use serde_json::json; use settings::SettingsStore; use unindent::Unindent; @@ -849,19 +850,21 @@ mod tests { cx.update(|cx| { use gpui::UpdateGlobal; - use project::WorktreeSettings; use settings::SettingsStore; SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = Some(vec![ + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![ "**/.secretdir".to_string(), "**/.mymetadata".to_string(), ]); - settings.private_files = Some(vec![ - "**/.mysecrets".to_string(), - "**/*.privatekey".to_string(), - "**/*.mysensitive".to_string(), - ]); + settings.project.worktree.private_files = Some( + vec![ + "**/.mysecrets".to_string(), + "**/*.privatekey".to_string(), + "**/*.mysensitive".to_string(), + ] + .into(), + ); }); }); }); @@ -1158,10 +1161,11 @@ mod tests { // Set global settings cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/.git".to_string(), "**/node_modules".to_string()]); - settings.private_files = Some(vec!["**/.env".to_string()]); + settings.project.worktree.private_files = + Some(vec!["**/.env".to_string()].into()); }); }); }); diff --git a/crates/assistant_tools/src/list_directory_tool.rs b/crates/assistant_tools/src/list_directory_tool.rs index 5471d8923b557ac26d06a16c90fdeffb152049d1..7d70f41a8c5000b433d47e8caa2a60d3a8024b99 100644 --- a/crates/assistant_tools/src/list_directory_tool.rs +++ b/crates/assistant_tools/src/list_directory_tool.rs @@ -4,11 +4,11 @@ use anyhow::{Result, anyhow}; use assistant_tool::{Tool, ToolResult}; use gpui::{AnyWindowHandle, App, Entity, Task}; use language_model::{LanguageModel, LanguageModelRequest, LanguageModelToolSchemaFormat}; -use project::{Project, WorktreeSettings}; +use project::{Project, ProjectPath, WorktreeSettings}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::Settings; -use std::{fmt::Write, path::Path, sync::Arc}; +use std::{fmt::Write, sync::Arc}; use ui::IconName; use util::markdown::MarkdownInlineCode; @@ -86,6 +86,7 @@ impl Tool for ListDirectoryTool { _window: Option, cx: &mut App, ) -> ToolResult { + let path_style = project.read(cx).path_style(cx); let input = match serde_json::from_value::(input) { Ok(input) => input, Err(err) => return Task::ready(Err(anyhow!(err))).into(), @@ -100,7 +101,7 @@ impl Tool for ListDirectoryTool { .filter_map(|worktree| { worktree.read(cx).root_entry().and_then(|entry| { if entry.is_dir() { - entry.path.to_str() + Some(entry.path.display(path_style)) } else { None } @@ -158,7 +159,6 @@ impl Tool for ListDirectoryTool { } let worktree_snapshot = worktree.read(cx).snapshot(); - let worktree_root_name = worktree.read(cx).root_name().to_string(); let Some(entry) = worktree_snapshot.entry_for_path(&project_path.path) else { return Task::ready(Err(anyhow!("Path not found: {}", input.path))).into(); @@ -180,23 +180,22 @@ impl Tool for ListDirectoryTool { continue; } - if project - .read(cx) - .find_project_path(&entry.path, cx) - .map(|project_path| { - let worktree_settings = WorktreeSettings::get(Some((&project_path).into()), cx); + let project_path = ProjectPath { + worktree_id: worktree_snapshot.id(), + path: entry.path.clone(), + }; + let worktree_settings = WorktreeSettings::get(Some((&project_path).into()), cx); - worktree_settings.is_path_excluded(&project_path.path) - || worktree_settings.is_path_private(&project_path.path) - }) - .unwrap_or(false) + if worktree_settings.is_path_excluded(&project_path.path) + || worktree_settings.is_path_private(&project_path.path) { continue; } - let full_path = Path::new(&worktree_root_name) + let full_path = worktree_snapshot + .root_name() .join(&entry.path) - .display() + .display(worktree_snapshot.path_style()) .to_string(); if entry.is_dir() { folders.push(full_path); @@ -230,7 +229,7 @@ mod tests { use gpui::{AppContext, TestAppContext, UpdateGlobal}; use indoc::indoc; use language_model::fake_provider::FakeLanguageModel; - use project::{FakeFs, Project, WorktreeSettings}; + use project::{FakeFs, Project}; use serde_json::json; use settings::SettingsStore; use util::path; @@ -507,17 +506,20 @@ mod tests { // Configure settings explicitly cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = Some(vec![ + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![ "**/.secretdir".to_string(), "**/.mymetadata".to_string(), "**/.hidden_subdir".to_string(), ]); - settings.private_files = Some(vec![ - "**/.mysecrets".to_string(), - "**/*.privatekey".to_string(), - "**/*.mysensitive".to_string(), - ]); + settings.project.worktree.private_files = Some( + vec![ + "**/.mysecrets".to_string(), + "**/*.privatekey".to_string(), + "**/*.mysensitive".to_string(), + ] + .into(), + ); }); }); }); @@ -698,10 +700,11 @@ mod tests { // Set global settings cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/.git".to_string(), "**/node_modules".to_string()]); - settings.private_files = Some(vec!["**/.env".to_string()]); + settings.project.worktree.private_files = + Some(vec!["**/.env".to_string()].into()); }); }); }); diff --git a/crates/assistant_tools/src/move_path_tool.rs b/crates/assistant_tools/src/move_path_tool.rs index 2c065488cea62a73e04c34a659961abc7b94ba54..22dbe9e625468d8c2688b60bdcd94a7da594730e 100644 --- a/crates/assistant_tools/src/move_path_tool.rs +++ b/crates/assistant_tools/src/move_path_tool.rs @@ -108,7 +108,7 @@ impl Tool for MovePathTool { .and_then(|project_path| project.entry_for_path(&project_path, cx)) { Some(entity) => match project.find_project_path(&input.destination_path, cx) { - Some(project_path) => project.rename_entry(entity.id, project_path.path, cx), + Some(project_path) => project.rename_entry(entity.id, project_path, cx), None => Task::ready(Err(anyhow!( "Destination path {} was outside the project.", input.destination_path diff --git a/crates/assistant_tools/src/open_tool.rs b/crates/assistant_tools/src/open_tool.rs index 6dbf66749b932804df6e00fed726360f0492c7f3..a1aafad041364b0ffca01cc1890c2cc10b3d7b01 100644 --- a/crates/assistant_tools/src/open_tool.rs +++ b/crates/assistant_tools/src/open_tool.rs @@ -104,7 +104,7 @@ mod tests { async fn test_to_absolute_path(cx: &mut TestAppContext) { init_test(cx); let temp_dir = TempDir::new().expect("Failed to create temp directory"); - let temp_path = temp_dir.path().to_string_lossy().to_string(); + let temp_path = temp_dir.path().to_string_lossy().into_owned(); let fs = FakeFs::new(cx.executor()); fs.insert_tree( diff --git a/crates/assistant_tools/src/read_file_tool.rs b/crates/assistant_tools/src/read_file_tool.rs index 7222f061c7caba54ee2e3294378c4a7d957914f5..f9f68491e5846fa1ead09d6976d1f9a9bc99b501 100644 --- a/crates/assistant_tools/src/read_file_tool.rs +++ b/crates/assistant_tools/src/read_file_tool.rs @@ -261,9 +261,8 @@ impl Tool for ReadFileTool { Ok(result) } else { // No line ranges specified, so check file size to see if it's too big. - let path_buf = std::path::PathBuf::from(&file_path); let buffer_content = - outline::get_buffer_content_or_outline(buffer.clone(), Some(&path_buf), cx) + outline::get_buffer_content_or_outline(buffer.clone(), Some(&file_path), cx) .await?; action_log.update(cx, |log, cx| { @@ -299,7 +298,7 @@ mod test { use gpui::{AppContext, TestAppContext, UpdateGlobal}; use language::{Language, LanguageConfig, LanguageMatcher}; use language_model::fake_provider::FakeLanguageModel; - use project::{FakeFs, Project, WorktreeSettings}; + use project::{FakeFs, Project}; use serde_json::json; use settings::SettingsStore; use util::path; @@ -677,19 +676,21 @@ mod test { cx.update(|cx| { use gpui::UpdateGlobal; - use project::WorktreeSettings; use settings::SettingsStore; SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = Some(vec![ + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![ "**/.secretdir".to_string(), "**/.mymetadata".to_string(), ]); - settings.private_files = Some(vec![ - "**/.mysecrets".to_string(), - "**/*.privatekey".to_string(), - "**/*.mysensitive".to_string(), - ]); + settings.project.worktree.private_files = Some( + vec![ + "**/.mysecrets".to_string(), + "**/*.privatekey".to_string(), + "**/*.mysensitive".to_string(), + ] + .into(), + ); }); }); }); @@ -968,10 +969,11 @@ mod test { // Set global settings cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/.git".to_string(), "**/node_modules".to_string()]); - settings.private_files = Some(vec!["**/.env".to_string()]); + settings.project.worktree.private_files = + Some(vec!["**/.env".to_string()].into()); }); }); }); diff --git a/crates/assistant_tools/src/terminal_tool.rs b/crates/assistant_tools/src/terminal_tool.rs index 1605003671621b90e58a5f62e521c0aba2c990c6..bc6f5f2a612bf17468577624e34d49119f3813c8 100644 --- a/crates/assistant_tools/src/terminal_tool.rs +++ b/crates/assistant_tools/src/terminal_tool.rs @@ -6,7 +6,7 @@ use action_log::ActionLog; use agent_settings; use anyhow::{Context as _, Result, anyhow}; use assistant_tool::{Tool, ToolCard, ToolResult, ToolUseStatus}; -use futures::{FutureExt as _, future::Shared}; +use futures::FutureExt as _; use gpui::{ AnyWindowHandle, App, AppContext, Empty, Entity, EntityId, Task, TextStyleRefinement, WeakEntity, Window, @@ -18,7 +18,7 @@ use portable_pty::{CommandBuilder, PtySize, native_pty_system}; use project::Project; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::Settings; +use settings::{Settings, SettingsLocation}; use std::{ env, path::{Path, PathBuf}, @@ -26,12 +26,14 @@ use std::{ sync::Arc, time::{Duration, Instant}, }; +use task::{Shell, ShellBuilder}; +use terminal::terminal_settings::TerminalSettings; use terminal_view::TerminalView; use theme::ThemeSettings; use ui::{CommonAnimationExt, Disclosure, Tooltip, prelude::*}; use util::{ - ResultExt, get_system_shell, markdown::MarkdownInlineCode, size::format_file_size, - time::duration_alt_display, + ResultExt, get_default_system_shell_preferring_bash, markdown::MarkdownInlineCode, + size::format_file_size, time::duration_alt_display, }; use workspace::Workspace; @@ -45,29 +47,10 @@ pub struct TerminalToolInput { cd: String, } -pub struct TerminalTool { - determine_shell: Shared>, -} +pub struct TerminalTool; impl TerminalTool { pub const NAME: &str = "terminal"; - - pub(crate) fn new(cx: &mut App) -> Self { - let determine_shell = cx.background_spawn(async move { - if cfg!(windows) { - return get_system_shell(); - } - - if which::which("bash").is_ok() { - "bash".into() - } else { - get_system_shell() - } - }); - Self { - determine_shell: determine_shell.shared(), - } - } } impl Tool for TerminalTool { @@ -135,27 +118,31 @@ impl Tool for TerminalTool { Ok(dir) => dir, Err(err) => return Task::ready(Err(err)).into(), }; - let program = self.determine_shell.clone(); - let command = if cfg!(windows) { - format!("$null | & {{{}}}", input.command.replace("\"", "'")) - } else if let Some(cwd) = working_dir - .as_ref() - .and_then(|cwd| cwd.as_os_str().to_str()) - { - // Make sure once we're *inside* the shell, we cd into `cwd` - format!("(cd {cwd}; {}) project.update(cx, |project, cx| { - project.directory_environment(dir.as_path().into(), cx) + let worktree = project.find_worktree(dir.as_path(), cx); + let shell = TerminalSettings::get( + worktree.as_ref().map(|(worktree, path)| SettingsLocation { + worktree_id: worktree.read(cx).id(), + path: &path, + }), + cx, + ) + .shell + .clone(); + project.directory_environment(&shell, dir.as_path().into(), cx) }), None => Task::ready(None).shared(), }; + let shell = project + .update(cx, |project, cx| { + project + .remote_client() + .and_then(|r| r.read(cx).default_system_shell()) + }) + .unwrap_or_else(|| get_default_system_shell_preferring_bash()); let env = cx.spawn(async move |_| { let mut env = env.await.unwrap_or_default(); @@ -165,14 +152,23 @@ impl Tool for TerminalTool { env }); + let build_cmd = { + let input_command = input.command.clone(); + move || { + ShellBuilder::new(&Shell::Program(shell)) + .redirect_stdin_to_dev_null() + .build(Some(input_command), &[]) + } + }; + let Some(window) = window else { // Headless setup, a test or eval. Our terminal subsystem requires a workspace, // so bypass it and provide a convincing imitation using a pty. let task = cx.background_spawn(async move { let env = env.await; let pty_system = native_pty_system(); - let program = program.await; - let mut cmd = CommandBuilder::new(program); + let (command, args) = build_cmd(); + let mut cmd = CommandBuilder::new(command); cmd.args(args); for (k, v) in env { cmd.env(k, v); @@ -211,13 +207,13 @@ impl Tool for TerminalTool { let terminal = cx.spawn({ let project = project.downgrade(); async move |cx| { - let program = program.await; + let (command, args) = build_cmd(); let env = env.await; project .update(cx, |project, cx| { project.create_terminal_task( task::SpawnInTerminal { - command: Some(program), + command: Some(command), args, cwd, env, @@ -239,14 +235,8 @@ impl Tool for TerminalTool { ) }); - let card = cx.new(|cx| { - TerminalToolCard::new( - command_markdown.clone(), - working_dir.clone(), - cx.entity_id(), - cx, - ) - }); + let card = + cx.new(|cx| TerminalToolCard::new(command_markdown, working_dir, cx.entity_id(), cx)); let output = cx.spawn({ let card = card.clone(); @@ -496,7 +486,7 @@ impl ToolCard for TerminalToolCard { .as_ref() .cloned() .or_else(|| env::current_dir().ok()) - .map(|path| format!("{}", path.display())) + .map(|path| path.display().to_string()) .unwrap_or_else(|| "current directory".to_string()); let header = h_flex() @@ -714,7 +704,6 @@ mod tests { use serde_json::json; use settings::{Settings, SettingsStore}; use terminal::terminal_settings::TerminalSettings; - use theme::ThemeSettings; use util::{ResultExt as _, test::TempTree}; use super::*; @@ -729,7 +718,7 @@ mod tests { language::init(cx); Project::init_settings(cx); workspace::init_settings(cx); - ThemeSettings::register(cx); + theme::init(theme::LoadThemes::JustBase, cx); TerminalSettings::register(cx); EditorSettings::register(cx); }); @@ -740,7 +729,6 @@ mod tests { if cfg!(windows) { return; } - init_test(&executor, cx); let fs = Arc::new(RealFs::new(None, executor)); @@ -763,7 +751,7 @@ mod tests { }; let result = cx.update(|cx| { TerminalTool::run( - Arc::new(TerminalTool::new(cx)), + Arc::new(TerminalTool), serde_json::to_value(input).unwrap(), Arc::default(), project.clone(), @@ -783,7 +771,6 @@ mod tests { if cfg!(windows) { return; } - init_test(&executor, cx); let fs = Arc::new(RealFs::new(None, executor)); @@ -798,7 +785,7 @@ mod tests { let check = |input, expected, cx: &mut App| { let headless_result = TerminalTool::run( - Arc::new(TerminalTool::new(cx)), + Arc::new(TerminalTool), serde_json::to_value(input).unwrap(), Arc::default(), project.clone(), diff --git a/crates/audio/Cargo.toml b/crates/audio/Cargo.toml index 85274f651417f8df91e2f785056e5ee8da0220de..7f2fed80e2315e51fca7d8477b04885998336632 100644 --- a/crates/audio/Cargo.toml +++ b/crates/audio/Cargo.toml @@ -18,10 +18,10 @@ async-tar.workspace = true collections.workspace = true crossbeam.workspace = true gpui.workspace = true +denoise = { path = "../denoise" } log.workspace = true parking_lot.workspace = true rodio = { workspace = true, features = [ "wav", "playback", "wav_output" ] } -schemars.workspace = true serde.workspace = true settings.workspace = true smol.workspace = true diff --git a/crates/audio/src/audio.rs b/crates/audio/src/audio.rs index ab8d85cdaa6bab7ed1be3fdab8a66b42f883533b..9ad5a36a374d87b2cdcc6434377da3652af97786 100644 --- a/crates/audio/src/audio.rs +++ b/crates/audio/src/audio.rs @@ -1,15 +1,15 @@ use anyhow::{Context as _, Result}; use collections::HashMap; use gpui::{App, BackgroundExecutor, BorrowAppContext, Global}; +use log::info; #[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))] mod non_windows_and_freebsd_deps { pub(super) use gpui::AsyncApp; pub(super) use libwebrtc::native::apm; - pub(super) use log::info; pub(super) use parking_lot::Mutex; pub(super) use rodio::cpal::Sample; - pub(super) use rodio::source::{LimitSettings, UniformSourceIterator}; + pub(super) use rodio::source::LimitSettings; pub(super) use std::sync::Arc; } @@ -31,18 +31,20 @@ pub use rodio_ext::RodioExt; use crate::audio_settings::LIVE_SETTINGS; -// NOTE: We used to use WebRTC's mixer which only supported -// 16kHz, 32kHz and 48kHz. As 48 is the most common "next step up" -// for audio output devices like speakers/bluetooth, we just hard-code -// this; and downsample when we need to. +// We are migrating to 16kHz sample rate from 48kHz. In the future +// once we are reasonably sure most users have upgraded we will +// remove the LEGACY parameters. // -// Since most noise cancelling requires 16kHz we will move to -// that in the future. -pub const SAMPLE_RATE: NonZero = nz!(48000); -pub const CHANNEL_COUNT: NonZero = nz!(2); +// We migrate to 16kHz because it is sufficient for speech and required +// by the denoiser and future Speech to Text layers. +pub const SAMPLE_RATE: NonZero = nz!(16000); +pub const CHANNEL_COUNT: NonZero = nz!(1); pub const BUFFER_SIZE: usize = // echo canceller and livekit want 10ms of audio (SAMPLE_RATE.get() as usize / 100) * CHANNEL_COUNT.get() as usize; +pub const LEGACY_SAMPLE_RATE: NonZero = nz!(48000); +pub const LEGACY_CHANNEL_COUNT: NonZero = nz!(2); + pub const REPLAY_DURATION: Duration = Duration::from_secs(30); pub fn init(cx: &mut App) { @@ -53,6 +55,7 @@ pub fn init(cx: &mut App) { #[derive(Debug, Copy, Clone, Eq, Hash, PartialEq)] pub enum Sound { Joined, + GuestJoined, Leave, Mute, Unmute, @@ -65,6 +68,7 @@ impl Sound { fn file(&self) -> &'static str { match self { Self::Joined => "joined_call", + Self::GuestJoined => "guest_joined_call", Self::Leave => "leave_call", Self::Mute => "mute", Self::Unmute => "unmute", @@ -106,11 +110,16 @@ impl Global for Audio {} impl Audio { fn ensure_output_exists(&mut self) -> Result<&Mixer> { + #[cfg(debug_assertions)] + log::warn!( + "Audio does not sound correct without optimizations. Use a release build to debug audio issues" + ); + if self.output_handle.is_none() { - self.output_handle = Some( - OutputStreamBuilder::open_default_stream() - .context("Could not open default output stream")?, - ); + let output_handle = OutputStreamBuilder::open_default_stream() + .context("Could not open default output stream")?; + info!("Output stream: {:?}", output_handle); + self.output_handle = Some(output_handle); if let Some(output_handle) = &self.output_handle { let (mixer, source) = rodio::mixer::mixer(CHANNEL_COUNT, SAMPLE_RATE); // or the mixer will end immediately as its empty. @@ -160,13 +169,20 @@ impl Audio { let stream = rodio::microphone::MicrophoneBuilder::new() .default_device()? .default_config()? - .prefer_sample_rates([SAMPLE_RATE, SAMPLE_RATE.saturating_mul(nz!(2))]) - // .prefer_channel_counts([nz!(1), nz!(2)]) + .prefer_sample_rates([ + SAMPLE_RATE, // sample rates trivially resamplable to `SAMPLE_RATE` + SAMPLE_RATE.saturating_mul(nz!(2)), + SAMPLE_RATE.saturating_mul(nz!(3)), + SAMPLE_RATE.saturating_mul(nz!(4)), + ]) + .prefer_channel_counts([nz!(1), nz!(2), nz!(3), nz!(4)]) .prefer_buffer_sizes(512..) .open_stream()?; info!("Opened microphone: {:?}", stream.config()); - let (replay, stream) = UniformSourceIterator::new(stream, CHANNEL_COUNT, SAMPLE_RATE) + let stream = stream + .possibly_disconnected_channels_to_mono() + .constant_samplerate(SAMPLE_RATE) .limit(LimitSettings::live_performance()) .process_buffer::(move |buffer| { let mut int_buffer: [i16; _] = buffer.map(|s| s.to_sample()); @@ -187,15 +203,27 @@ impl Audio { } } }) - .automatic_gain_control(1.0, 4.0, 0.0, 5.0) + .denoise() + .context("Could not set up denoiser")? + .automatic_gain_control(0.90, 1.0, 0.0, 5.0) .periodic_access(Duration::from_millis(100), move |agc_source| { - agc_source.set_enabled(LIVE_SETTINGS.control_input_volume.load(Ordering::Relaxed)); - }) - .replayable(REPLAY_DURATION)?; - + agc_source + .set_enabled(LIVE_SETTINGS.auto_microphone_volume.load(Ordering::Relaxed)); + let denoise = agc_source.inner_mut(); + denoise.set_enabled(LIVE_SETTINGS.denoise.load(Ordering::Relaxed)); + }); + + let stream = if voip_parts.legacy_audio_compatible { + stream.constant_params(LEGACY_CHANNEL_COUNT, LEGACY_SAMPLE_RATE) + } else { + stream.constant_params(CHANNEL_COUNT, SAMPLE_RATE) + }; + + let (replay, stream) = stream.replayable(REPLAY_DURATION)?; voip_parts .replays .add_voip_stream("local microphone".to_string(), replay); + Ok(stream) } @@ -206,12 +234,13 @@ impl Audio { cx: &mut App, ) -> anyhow::Result<()> { let (replay_source, source) = source - .automatic_gain_control(1.0, 4.0, 0.0, 5.0) + .constant_params(CHANNEL_COUNT, SAMPLE_RATE) + .automatic_gain_control(0.90, 1.0, 0.0, 5.0) .periodic_access(Duration::from_millis(100), move |agc_source| { - agc_source.set_enabled(LIVE_SETTINGS.control_input_volume.load(Ordering::Relaxed)); + agc_source.set_enabled(LIVE_SETTINGS.auto_speaker_volume.load(Ordering::Relaxed)); }) .replayable(REPLAY_DURATION) - .expect("REPLAY_DURATION is longer then 100ms"); + .expect("REPLAY_DURATION is longer than 100ms"); cx.update_default_global(|this: &mut Self, _cx| { let output_mixer = this @@ -269,6 +298,7 @@ impl Audio { pub struct VoipParts { echo_canceller: Arc>, replays: replays::Replays, + legacy_audio_compatible: bool, } #[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))] @@ -277,8 +307,12 @@ impl VoipParts { let (apm, replays) = cx.try_read_default_global::(|audio, _| { (Arc::clone(&audio.echo_canceller), audio.replays.clone()) })?; + let legacy_audio_compatible = + AudioSettings::try_read_global(cx, |settings| settings.legacy_audio_compatible) + .unwrap_or(true); Ok(Self { + legacy_audio_compatible, echo_canceller: apm, replays, }) diff --git a/crates/audio/src/audio_settings.rs b/crates/audio/src/audio_settings.rs index ea0ea5f3558e015f5579cca43eeb8c529273cb52..61a993c3358e5e2bf39b626a0764833508bee742 100644 --- a/crates/audio/src/audio_settings.rs +++ b/crates/audio/src/audio_settings.rs @@ -1,91 +1,110 @@ use std::sync::atomic::{AtomicBool, Ordering}; -use anyhow::Result; use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsStore, SettingsUi}; +use settings::{Settings, SettingsStore}; -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi)] +#[derive(Clone, Debug)] pub struct AudioSettings { /// Opt into the new audio system. - #[serde(rename = "experimental.rodio_audio", default)] + /// + /// You need to rejoin a call for this setting to apply pub rodio_audio: bool, // default is false /// Requires 'rodio_audio: true' /// - /// Use the new audio systems automatic gain control for your microphone. - /// This affects how loud you sound to others. - #[serde(rename = "experimental.control_input_volume", default)] - pub control_input_volume: bool, + /// Automatically increase or decrease you microphone's volume. This affects how + /// loud you sound to others. + /// + /// Recommended: off (default) + /// Microphones are too quite in zed, until everyone is on experimental + /// audio and has auto speaker volume on this will make you very loud + /// compared to other speakers. + pub auto_microphone_volume: bool, /// Requires 'rodio_audio: true' /// - /// Use the new audio systems automatic gain control on everyone in the - /// call. This makes call members who are too quite louder and those who are - /// too loud quieter. This only affects how things sound for you. - #[serde(rename = "experimental.control_output_volume", default)] - pub control_output_volume: bool, -} - -/// Configuration of audio in Zed. -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[serde(default)] -#[settings_key(key = "audio")] -pub struct AudioSettingsContent { - /// Opt into the new audio system. - #[serde(rename = "experimental.rodio_audio", default)] - pub rodio_audio: bool, // default is false + /// Automatically increate or decrease the volume of other call members. + /// This only affects how things sound for you. + pub auto_speaker_volume: bool, /// Requires 'rodio_audio: true' /// - /// Use the new audio systems automatic gain control for your microphone. - /// This affects how loud you sound to others. - #[serde(rename = "experimental.control_input_volume", default)] - pub control_input_volume: bool, + /// Remove background noises. Works great for typing, cars, dogs, AC. Does + /// not work well on music. + pub denoise: bool, /// Requires 'rodio_audio: true' /// - /// Use the new audio systems automatic gain control on everyone in the - /// call. This makes call members who are too quite louder and those who are - /// too loud quieter. This only affects how things sound for you. - #[serde(rename = "experimental.control_output_volume", default)] - pub control_output_volume: bool, + /// Use audio parameters compatible with the previous versions of + /// experimental audio and non-experimental audio. When this is false you + /// will sound strange to anyone not on the latest experimental audio. In + /// the future we will migrate by setting this to false + /// + /// You need to rejoin a call for this setting to apply + pub legacy_audio_compatible: bool, } +/// Configuration of audio in Zed impl Settings for AudioSettings { - type FileContent = AudioSettingsContent; - - fn load(sources: SettingsSources, _cx: &mut App) -> Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let audio = &content.audio.as_ref().unwrap(); + AudioSettings { + rodio_audio: audio.rodio_audio.unwrap(), + auto_microphone_volume: audio.auto_microphone_volume.unwrap(), + auto_speaker_volume: audio.auto_speaker_volume.unwrap(), + denoise: audio.denoise.unwrap(), + legacy_audio_compatible: audio.legacy_audio_compatible.unwrap(), + } } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } /// See docs on [LIVE_SETTINGS] pub(crate) struct LiveSettings { - pub(crate) control_input_volume: AtomicBool, - pub(crate) control_output_volume: AtomicBool, + pub(crate) auto_microphone_volume: AtomicBool, + pub(crate) auto_speaker_volume: AtomicBool, + pub(crate) denoise: AtomicBool, } impl LiveSettings { pub(crate) fn initialize(&self, cx: &mut App) { cx.observe_global::(move |cx| { - LIVE_SETTINGS.control_input_volume.store( - AudioSettings::get_global(cx).control_input_volume, + LIVE_SETTINGS.auto_microphone_volume.store( + AudioSettings::get_global(cx).auto_microphone_volume, Ordering::Relaxed, ); - LIVE_SETTINGS.control_output_volume.store( - AudioSettings::get_global(cx).control_output_volume, + LIVE_SETTINGS.auto_speaker_volume.store( + AudioSettings::get_global(cx).auto_speaker_volume, Ordering::Relaxed, ); + + let denoise_enabled = AudioSettings::get_global(cx).denoise; + #[cfg(debug_assertions)] + { + static DENOISE_WARNING_SEND: AtomicBool = AtomicBool::new(false); + if denoise_enabled && !DENOISE_WARNING_SEND.load(Ordering::Relaxed) { + DENOISE_WARNING_SEND.store(true, Ordering::Relaxed); + log::warn!("Denoise does not work on debug builds, not enabling") + } + } + #[cfg(not(debug_assertions))] + LIVE_SETTINGS + .denoise + .store(denoise_enabled, Ordering::Relaxed); }) .detach(); let init_settings = AudioSettings::get_global(cx); LIVE_SETTINGS - .control_input_volume - .store(init_settings.control_input_volume, Ordering::Relaxed); + .auto_microphone_volume + .store(init_settings.auto_microphone_volume, Ordering::Relaxed); + LIVE_SETTINGS + .auto_speaker_volume + .store(init_settings.auto_speaker_volume, Ordering::Relaxed); + let denoise_enabled = AudioSettings::get_global(cx).denoise; + #[cfg(debug_assertions)] + if denoise_enabled { + log::warn!("Denoise does not work on debug builds, not enabling") + } + #[cfg(not(debug_assertions))] LIVE_SETTINGS - .control_output_volume - .store(init_settings.control_output_volume, Ordering::Relaxed); + .denoise + .store(denoise_enabled, Ordering::Relaxed); } } @@ -94,6 +113,7 @@ impl LiveSettings { /// real time and must each run in a dedicated OS thread, therefore we can not /// use the background executor. pub(crate) static LIVE_SETTINGS: LiveSettings = LiveSettings { - control_input_volume: AtomicBool::new(true), - control_output_volume: AtomicBool::new(true), + auto_microphone_volume: AtomicBool::new(true), + auto_speaker_volume: AtomicBool::new(true), + denoise: AtomicBool::new(true), }; diff --git a/crates/audio/src/rodio_ext.rs b/crates/audio/src/rodio_ext.rs index ba4e4ff0554dd3c9bc2a7e2691de270c0d00908b..af4cc89252dfdc1498471ec7ac09b56d59b62eca 100644 --- a/crates/audio/src/rodio_ext.rs +++ b/crates/audio/src/rodio_ext.rs @@ -1,4 +1,5 @@ use std::{ + num::NonZero, sync::{ Arc, Mutex, atomic::{AtomicBool, Ordering}, @@ -7,12 +8,22 @@ use std::{ }; use crossbeam::queue::ArrayQueue; -use rodio::{ChannelCount, Sample, SampleRate, Source}; +use denoise::{Denoiser, DenoiserError}; +use log::warn; +use rodio::{ + ChannelCount, Sample, SampleRate, Source, conversions::SampleRateConverter, nz, + source::UniformSourceIterator, +}; + +const MAX_CHANNELS: usize = 8; #[derive(Debug, thiserror::Error)] #[error("Replay duration is too short must be >= 100ms")] pub struct ReplayDurationTooShort; +// These all require constant sources (so the span is infinitely long) +// this is not guaranteed by rodio however we know it to be true in all our +// applications. Rodio desperately needs a constant source concept. pub trait RodioExt: Source + Sized { fn process_buffer(self, callback: F) -> ProcessBuffer where @@ -25,6 +36,14 @@ pub trait RodioExt: Source + Sized { duration: Duration, ) -> Result<(Replay, Replayable), ReplayDurationTooShort>; fn take_samples(self, n: usize) -> TakeSamples; + fn denoise(self) -> Result, DenoiserError>; + fn constant_params( + self, + channel_count: ChannelCount, + sample_rate: SampleRate, + ) -> UniformSourceIterator; + fn constant_samplerate(self, sample_rate: SampleRate) -> ConstantSampleRate; + fn possibly_disconnected_channels_to_mono(self) -> ToMono; } impl RodioExt for S { @@ -57,7 +76,7 @@ impl RodioExt for S { /// replay is being read /// /// # Errors - /// If duration is smaller then 100ms + /// If duration is smaller than 100ms fn replayable( self, duration: Duration, @@ -101,8 +120,149 @@ impl RodioExt for S { left_to_take: n, } } + fn denoise(self) -> Result, DenoiserError> { + let res = Denoiser::try_new(self); + res + } + fn constant_params( + self, + channel_count: ChannelCount, + sample_rate: SampleRate, + ) -> UniformSourceIterator { + UniformSourceIterator::new(self, channel_count, sample_rate) + } + fn constant_samplerate(self, sample_rate: SampleRate) -> ConstantSampleRate { + ConstantSampleRate::new(self, sample_rate) + } + fn possibly_disconnected_channels_to_mono(self) -> ToMono { + ToMono::new(self) + } +} + +pub struct ConstantSampleRate { + inner: SampleRateConverter, + channels: ChannelCount, + sample_rate: SampleRate, +} + +impl ConstantSampleRate { + fn new(source: S, target_rate: SampleRate) -> Self { + let input_sample_rate = source.sample_rate(); + let channels = source.channels(); + let inner = SampleRateConverter::new(source, input_sample_rate, target_rate, channels); + Self { + inner, + channels, + sample_rate: target_rate, + } + } +} + +impl Iterator for ConstantSampleRate { + type Item = rodio::Sample; + + fn next(&mut self) -> Option { + self.inner.next() + } + + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } +} + +impl Source for ConstantSampleRate { + fn current_span_len(&self) -> Option { + None + } + + fn channels(&self) -> ChannelCount { + self.channels + } + + fn sample_rate(&self) -> SampleRate { + self.sample_rate + } + + fn total_duration(&self) -> Option { + None // not supported (not used by us) + } +} + +const TYPICAL_NOISE_FLOOR: Sample = 1e-3; + +/// constant source, only works on a single span +pub struct ToMono { + inner: S, + input_channel_count: ChannelCount, + connected_channels: ChannelCount, + /// running mean of second channel 'volume' + means: [f32; MAX_CHANNELS], +} +impl ToMono { + fn new(input: S) -> Self { + let channels = input + .channels() + .min(const { NonZero::::new(MAX_CHANNELS as u16).unwrap() }); + if channels < input.channels() { + warn!("Ignoring input channels {}..", channels.get()); + } + + Self { + connected_channels: channels, + input_channel_count: channels, + inner: input, + means: [TYPICAL_NOISE_FLOOR; MAX_CHANNELS], + } + } +} + +impl Source for ToMono { + fn current_span_len(&self) -> Option { + None + } + + fn channels(&self) -> ChannelCount { + rodio::nz!(1) + } + + fn sample_rate(&self) -> SampleRate { + self.inner.sample_rate() + } + + fn total_duration(&self) -> Option { + self.inner.total_duration() + } +} + +fn update_mean(mean: &mut f32, sample: Sample) { + const HISTORY: f32 = 500.0; + *mean *= (HISTORY - 1.0) / HISTORY; + *mean += sample.abs() / HISTORY; +} + +impl Iterator for ToMono { + type Item = Sample; + + fn next(&mut self) -> Option { + let mut mono_sample = 0f32; + let mut active_channels = 0; + for channel in 0..self.input_channel_count.get() as usize { + let sample = self.inner.next()?; + mono_sample += sample; + + update_mean(&mut self.means[channel], sample); + if self.means[channel] > TYPICAL_NOISE_FLOOR / 10.0 { + active_channels += 1; + } + } + mono_sample /= self.connected_channels.get() as f32; + self.connected_channels = NonZero::new(active_channels).unwrap_or(nz!(1)); + + Some(mono_sample) + } } +/// constant source, only works on a single span pub struct TakeSamples { inner: S, left_to_take: usize, @@ -147,11 +307,12 @@ impl Source for TakeSamples { } } +/// constant source, only works on a single span #[derive(Debug)] struct ReplayQueue { inner: ArrayQueue>, normal_chunk_len: usize, - /// The last chunk in the queue may be smaller then + /// The last chunk in the queue may be smaller than /// the normal chunk size. This is always equal to the /// size of the last element in the queue. /// (so normally chunk_size) @@ -193,6 +354,7 @@ impl ReplayQueue { } } +/// constant source, only works on a single span pub struct ProcessBuffer where S: Source + Sized, @@ -260,6 +422,7 @@ where } } +/// constant source, only works on a single span pub struct InspectBuffer where S: Source + Sized, @@ -324,6 +487,7 @@ where } } +/// constant source, only works on a single span #[derive(Debug)] pub struct Replayable { inner: S, @@ -375,6 +539,7 @@ impl Source for Replayable { } } +/// constant source, only works on a single span #[derive(Debug)] pub struct Replay { rx: Arc, @@ -535,7 +700,7 @@ mod tests { let (mut replay, mut source) = input .replayable(Duration::from_secs(3)) - .expect("longer then 100ms"); + .expect("longer than 100ms"); source.by_ref().take(3).count(); let yielded: Vec = replay.by_ref().take(3).collect(); @@ -552,7 +717,7 @@ mod tests { let (mut replay, mut source) = input .replayable(Duration::from_secs(2)) - .expect("longer then 100ms"); + .expect("longer than 100ms"); source.by_ref().take(5).count(); // get all items but do not end the source let yielded: Vec = replay.by_ref().take(2).collect(); @@ -567,7 +732,7 @@ mod tests { let (replay, mut source) = input .replayable(Duration::from_secs(2)) - .expect("longer then 100ms"); + .expect("longer than 100ms"); // exhaust but do not yet end source source.by_ref().take(40_000).count(); @@ -586,7 +751,7 @@ mod tests { let input = StaticSamplesBuffer::new(nz!(1), nz!(16_000), &[0.0; 40_000]); let (mut replay, source) = input .replayable(Duration::from_secs(2)) - .expect("longer then 100ms"); + .expect("longer than 100ms"); assert_eq!(replay.by_ref().samples_ready(), 0); source.take(8000).count(); // half a second diff --git a/crates/auto_update/Cargo.toml b/crates/auto_update/Cargo.toml index 1a772710c98f8437932d6e8918df65d003d7962e..21df028a88f027b1ce3796ef3e04998ca205ce51 100644 --- a/crates/auto_update/Cargo.toml +++ b/crates/auto_update/Cargo.toml @@ -21,7 +21,6 @@ http_client.workspace = true log.workspace = true paths.workspace = true release_channel.workspace = true -schemars.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true @@ -32,3 +31,6 @@ workspace-hack.workspace = true [target.'cfg(not(target_os = "windows"))'.dependencies] which.workspace = true + +[dev-dependencies] +gpui = { workspace = true, "features" = ["test-support"] } diff --git a/crates/auto_update/src/auto_update.rs b/crates/auto_update/src/auto_update.rs index c1e318ee84f5228156826c340c3463fde2ef1bb8..9f93dd27900e4b90de8c6d61d41b3b6c287eaaf0 100644 --- a/crates/auto_update/src/auto_update.rs +++ b/crates/auto_update/src/auto_update.rs @@ -3,16 +3,17 @@ use client::{Client, TelemetrySettings}; use db::RELEASE_CHANNEL; use db::kvp::KEY_VALUE_STORE; use gpui::{ - App, AppContext as _, AsyncApp, Context, Entity, Global, SemanticVersion, Task, Window, actions, + App, AppContext as _, AsyncApp, BackgroundExecutor, Context, Entity, Global, SemanticVersion, + Task, Window, actions, }; use http_client::{AsyncBody, HttpClient, HttpClientWithUrl}; use paths::remote_servers_dir; use release_channel::{AppCommitSha, ReleaseChannel}; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsStore, SettingsUi}; +use settings::{Settings, SettingsStore}; use smol::{fs, io::AsyncReadExt}; use smol::{fs::File, process::Command}; +use std::mem; use std::{ env::{ self, @@ -34,7 +35,7 @@ actions!( /// Checks for available updates. Check, /// Dismisses the update error message. - DismissErrorMessage, + DismissMessage, /// Opens the release notes for the current version in a browser. ViewReleaseNotes, ] @@ -55,14 +56,14 @@ pub enum VersionCheckType { Semantic(SemanticVersion), } -#[derive(Clone, PartialEq, Eq)] +#[derive(Clone)] pub enum AutoUpdateStatus { Idle, Checking, Downloading { version: VersionCheckType }, Installing { version: VersionCheckType }, Updated { version: VersionCheckType }, - Errored, + Errored { error: Arc }, } impl AutoUpdateStatus { @@ -85,75 +86,49 @@ pub struct JsonRelease { pub url: String, } -struct MacOsUnmounter { +struct MacOsUnmounter<'a> { mount_path: PathBuf, + background_executor: &'a BackgroundExecutor, } -impl Drop for MacOsUnmounter { +impl Drop for MacOsUnmounter<'_> { fn drop(&mut self) { - let unmount_output = std::process::Command::new("hdiutil") - .args(["detach", "-force"]) - .arg(&self.mount_path) - .output(); - - match unmount_output { - Ok(output) if output.status.success() => { - log::info!("Successfully unmounted the disk image"); - } - Ok(output) => { - log::error!( - "Failed to unmount disk image: {:?}", - String::from_utf8_lossy(&output.stderr) - ); - } - Err(error) => { - log::error!("Error while trying to unmount disk image: {:?}", error); - } - } + let mount_path = mem::take(&mut self.mount_path); + self.background_executor + .spawn(async move { + let unmount_output = Command::new("hdiutil") + .args(["detach", "-force"]) + .arg(&mount_path) + .output() + .await; + match unmount_output { + Ok(output) if output.status.success() => { + log::info!("Successfully unmounted the disk image"); + } + Ok(output) => { + log::error!( + "Failed to unmount disk image: {:?}", + String::from_utf8_lossy(&output.stderr) + ); + } + Err(error) => { + log::error!("Error while trying to unmount disk image: {:?}", error); + } + } + }) + .detach(); } } +#[derive(Clone, Copy, Debug)] struct AutoUpdateSetting(bool); /// Whether or not to automatically check for updates. /// /// Default: true -#[derive(Clone, Copy, Default, JsonSchema, Deserialize, Serialize, SettingsUi, SettingsKey)] -#[settings_key(None)] -#[settings_ui(group = "Auto Update")] -struct AutoUpdateSettingContent { - pub auto_update: Option, -} - impl Settings for AutoUpdateSetting { - type FileContent = AutoUpdateSettingContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - let auto_update = [ - sources.server, - sources.release_channel, - sources.operating_system, - sources.user, - ] - .into_iter() - .find_map(|value| value.and_then(|val| val.auto_update)) - .or(sources.default.auto_update) - .ok_or_else(Self::missing_default)?; - - Ok(Self(auto_update)) - } - - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { - let mut cur = &mut Some(*current); - vscode.enum_setting("update.mode", &mut cur, |s| match s { - "none" | "manual" => Some(AutoUpdateSettingContent { - auto_update: Some(false), - }), - _ => Some(AutoUpdateSettingContent { - auto_update: Some(true), - }), - }); - *current = cur.unwrap(); + fn from_settings(content: &settings::SettingsContent) -> Self { + Self(content.auto_update.unwrap()) } } @@ -335,10 +310,10 @@ impl AutoUpdater { // the app after an update, we use `set_restart_path` to run the auto // update helper instead of the app, so that it can overwrite the app // and then spawn the new binary. - let quit_subscription = Some(cx.on_app_quit(|_, _| async move { - #[cfg(target_os = "windows")] - finalize_auto_update_on_quit(); - })); + #[cfg(target_os = "windows")] + let quit_subscription = Some(cx.on_app_quit(|_, _| finalize_auto_update_on_quit())); + #[cfg(not(target_os = "windows"))] + let quit_subscription = None; cx.on_app_restart(|this, _| { this.quit_subscription.take(); @@ -383,7 +358,9 @@ impl AutoUpdater { } UpdateCheckType::Manual => { log::error!("auto-update failed: error:{:?}", error); - AutoUpdateStatus::Errored + AutoUpdateStatus::Errored { + error: Arc::new(error), + } } }; @@ -402,8 +379,8 @@ impl AutoUpdater { self.status.clone() } - pub fn dismiss_error(&mut self, cx: &mut Context) -> bool { - if self.status == AutoUpdateStatus::Idle { + pub fn dismiss(&mut self, cx: &mut Context) -> bool { + if let AutoUpdateStatus::Idle = self.status { return false; } self.status = AutoUpdateStatus::Idle; @@ -672,7 +649,7 @@ impl AutoUpdater { #[cfg(not(target_os = "windows"))] anyhow::ensure!( which::which("rsync").is_ok(), - "Aborting. Could not find rsync which is required for auto-updates." + "Could not auto-update because the required rsync utility was not found." ); Ok(()) } @@ -681,7 +658,7 @@ impl AutoUpdater { let filename = match OS { "macos" => anyhow::Ok("Zed.dmg"), "linux" => Ok("zed.tar.gz"), - "windows" => Ok("zed_editor_installer.exe"), + "windows" => Ok("Zed.exe"), unsupported_os => anyhow::bail!("not supported: {unsupported_os}"), }?; @@ -927,6 +904,7 @@ async fn install_release_macos( // Create an MacOsUnmounter that will be dropped (and thus unmount the disk) when this function exits let _unmounter = MacOsUnmounter { mount_path: mount_path.clone(), + background_executor: cx.background_executor(), }; let output = Command::new("rsync") @@ -964,11 +942,12 @@ async fn install_release_windows(downloaded_installer: PathBuf) -> Result
ˇ
"); + + // Test typing . do extend linked pair + cx.set_state(""); + cx.update_editor(|editor, _, cx| { + set_linked_edit_ranges( + (Point::new(0, 1), Point::new(0, 9)), + (Point::new(0, 12), Point::new(0, 20)), + editor, + cx, + ); + }); + cx.update_editor(|editor, window, cx| { + editor.handle_input(".", window, cx); + }); + cx.assert_editor_state(""); + cx.update_editor(|editor, _, cx| { + set_linked_edit_ranges( + (Point::new(0, 1), Point::new(0, 10)), + (Point::new(0, 13), Point::new(0, 21)), + editor, + cx, + ); + }); + cx.update_editor(|editor, window, cx| { + editor.handle_input("V", window, cx); + }); + cx.assert_editor_state(""); +} + #[gpui::test] async fn test_invisible_worktree_servers(cx: &mut TestAppContext) { init_test(cx, |_| {}); @@ -23983,7 +24182,7 @@ async fn test_invisible_worktree_servers(cx: &mut TestAppContext) { let main_editor = workspace .update_in(cx, |workspace, window, cx| { workspace.open_path( - (worktree_id, "main.rs"), + (worktree_id, rel_path("main.rs")), Some(pane.downgrade()), true, window, @@ -25120,18 +25319,18 @@ pub(crate) fn update_test_language_settings( ) { cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, f); + store.update_user_settings(cx, |settings| f(&mut settings.project.all_languages)); }); }); } pub(crate) fn update_test_project_settings( cx: &mut TestAppContext, - f: impl Fn(&mut ProjectSettings), + f: impl Fn(&mut ProjectSettingsContent), ) { cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, f); + store.update_user_settings(cx, |settings| f(&mut settings.project)); }); }); } @@ -25168,8 +25367,8 @@ fn assert_hunk_revert( let actual_hunk_statuses_before = cx.update_editor(|editor, window, cx| { let snapshot = editor.snapshot(window, cx); let reverted_hunk_statuses = snapshot - .buffer_snapshot - .diff_hunks_in_range(0..snapshot.buffer_snapshot.len()) + .buffer_snapshot() + .diff_hunks_in_range(0..snapshot.buffer_snapshot().len()) .map(|hunk| hunk.status().kind) .collect::>(); @@ -25507,7 +25706,7 @@ async fn test_document_colors(cx: &mut TestAppContext) { .set_request_handler::(move |_, _| async move { panic!("Should not be called"); }); - cx.executor().advance_clock(Duration::from_millis(100)); + cx.executor().advance_clock(FETCH_COLORS_DEBOUNCE_TIMEOUT); color_request_handle.next().await.unwrap(); cx.run_until_parked(); assert_eq!( @@ -25565,7 +25764,7 @@ async fn test_document_colors(cx: &mut TestAppContext) { .path(); assert_eq!( editor_file.as_ref(), - Path::new("first.rs"), + rel_path("first.rs"), "Both editors should be opened for the same file" ) } @@ -25591,9 +25790,9 @@ async fn test_document_colors(cx: &mut TestAppContext) { color_request_handle.next().await.unwrap(); cx.run_until_parked(); assert_eq!( - 3, + 2, requests_made.load(atomic::Ordering::Acquire), - "Should query for colors once per save and once per formatting after save" + "Should query for colors once per save (deduplicated) and once per formatting after save" ); drop(editor); @@ -25614,7 +25813,7 @@ async fn test_document_colors(cx: &mut TestAppContext) { .unwrap(); close.await.unwrap(); assert_eq!( - 3, + 2, requests_made.load(atomic::Ordering::Acquire), "After saving and closing all editors, no extra requests should be made" ); @@ -25630,11 +25829,11 @@ async fn test_document_colors(cx: &mut TestAppContext) { workspace .update(cx, |workspace, window, cx| { workspace.active_pane().update(cx, |pane, cx| { - pane.navigate_backward(&Default::default(), window, cx); + pane.navigate_backward(&workspace::GoBack, window, cx); }) }) .unwrap(); - cx.executor().advance_clock(Duration::from_millis(100)); + cx.executor().advance_clock(FETCH_COLORS_DEBOUNCE_TIMEOUT); cx.run_until_parked(); let editor = workspace .update(cx, |workspace, _, cx| { @@ -25645,9 +25844,9 @@ async fn test_document_colors(cx: &mut TestAppContext) { .expect("Should be an editor") }) .unwrap(); - color_request_handle.next().await.unwrap(); + assert_eq!( - 3, + 2, requests_made.load(atomic::Ordering::Acquire), "Cache should be reused on buffer close and reopen" ); @@ -25658,6 +25857,51 @@ async fn test_document_colors(cx: &mut TestAppContext) { "Should have an initial inlay" ); }); + + drop(color_request_handle); + let closure_requests_made = Arc::clone(&requests_made); + let mut empty_color_request_handle = fake_language_server + .set_request_handler::(move |params, _| { + let requests_made = Arc::clone(&closure_requests_made); + async move { + assert_eq!( + params.text_document.uri, + lsp::Uri::from_file_path(path!("/a/first.rs")).unwrap() + ); + requests_made.fetch_add(1, atomic::Ordering::Release); + Ok(Vec::new()) + } + }); + let save = editor.update_in(cx, |editor, window, cx| { + editor.move_to_end(&MoveToEnd, window, cx); + editor.handle_input("dirty_again", window, cx); + editor.save( + SaveOptions { + format: false, + autosave: true, + }, + project.clone(), + window, + cx, + ) + }); + save.await.unwrap(); + + cx.executor().advance_clock(FETCH_COLORS_DEBOUNCE_TIMEOUT); + empty_color_request_handle.next().await.unwrap(); + cx.run_until_parked(); + assert_eq!( + 3, + requests_made.load(atomic::Ordering::Acquire), + "Should query for colors once per save only, as formatting was not requested" + ); + editor.update(cx, |editor, cx| { + assert_eq!( + Vec::::new(), + extract_color_inlays(editor, cx), + "Should clear all colors when the server returns an empty response" + ); + }); } #[gpui::test] @@ -25701,7 +25945,7 @@ async fn test_non_utf_8_opens(cx: &mut TestAppContext) { let handle = workspace .update_in(cx, |workspace, window, cx| { - let project_path = (worktree_id, "one.pdf"); + let project_path = (worktree_id, rel_path("one.pdf")); workspace.open_path(project_path, None, true, window, cx) }) .await @@ -25903,6 +26147,329 @@ let result = variable * 2;", ); } +#[gpui::test] +async fn test_paste_url_from_other_app_creates_markdown_link_over_selected_text( + cx: &mut gpui::TestAppContext, +) { + init_test(cx, |_| {}); + + let url = "https://zed.dev"; + + let markdown_language = Arc::new(Language::new( + LanguageConfig { + name: "Markdown".into(), + ..LanguageConfig::default() + }, + None, + )); + + let mut cx = EditorTestContext::new(cx).await; + cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx)); + cx.set_state("Hello, «editorˇ».\nZed is «ˇgreat» (see this link: ˇ)"); + + cx.update_editor(|editor, window, cx| { + cx.write_to_clipboard(ClipboardItem::new_string(url.to_string())); + editor.paste(&Paste, window, cx); + }); + + cx.assert_editor_state(&format!( + "Hello, [editor]({url})ˇ.\nZed is [great]({url})ˇ (see this link: {url}ˇ)" + )); +} + +#[gpui::test] +async fn test_paste_url_from_zed_copy_creates_markdown_link_over_selected_text( + cx: &mut gpui::TestAppContext, +) { + init_test(cx, |_| {}); + + let url = "https://zed.dev"; + + let markdown_language = Arc::new(Language::new( + LanguageConfig { + name: "Markdown".into(), + ..LanguageConfig::default() + }, + None, + )); + + let mut cx = EditorTestContext::new(cx).await; + cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx)); + cx.set_state(&format!( + "Hello, editor.\nZed is great (see this link: )\n«{url}ˇ»" + )); + + cx.update_editor(|editor, window, cx| { + editor.copy(&Copy, window, cx); + }); + + cx.set_state(&format!( + "Hello, «editorˇ».\nZed is «ˇgreat» (see this link: ˇ)\n{url}" + )); + + cx.update_editor(|editor, window, cx| { + editor.paste(&Paste, window, cx); + }); + + cx.assert_editor_state(&format!( + "Hello, [editor]({url})ˇ.\nZed is [great]({url})ˇ (see this link: {url}ˇ)\n{url}" + )); +} + +#[gpui::test] +async fn test_paste_url_from_other_app_replaces_existing_url_without_creating_markdown_link( + cx: &mut gpui::TestAppContext, +) { + init_test(cx, |_| {}); + + let url = "https://zed.dev"; + + let markdown_language = Arc::new(Language::new( + LanguageConfig { + name: "Markdown".into(), + ..LanguageConfig::default() + }, + None, + )); + + let mut cx = EditorTestContext::new(cx).await; + cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx)); + cx.set_state("Please visit zed's homepage: «https://www.apple.comˇ»"); + + cx.update_editor(|editor, window, cx| { + cx.write_to_clipboard(ClipboardItem::new_string(url.to_string())); + editor.paste(&Paste, window, cx); + }); + + cx.assert_editor_state(&format!("Please visit zed's homepage: {url}ˇ")); +} + +#[gpui::test] +async fn test_paste_plain_text_from_other_app_replaces_selection_without_creating_markdown_link( + cx: &mut gpui::TestAppContext, +) { + init_test(cx, |_| {}); + + let text = "Awesome"; + + let markdown_language = Arc::new(Language::new( + LanguageConfig { + name: "Markdown".into(), + ..LanguageConfig::default() + }, + None, + )); + + let mut cx = EditorTestContext::new(cx).await; + cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx)); + cx.set_state("Hello, «editorˇ».\nZed is «ˇgreat»"); + + cx.update_editor(|editor, window, cx| { + cx.write_to_clipboard(ClipboardItem::new_string(text.to_string())); + editor.paste(&Paste, window, cx); + }); + + cx.assert_editor_state(&format!("Hello, {text}ˇ.\nZed is {text}ˇ")); +} + +#[gpui::test] +async fn test_paste_url_from_other_app_without_creating_markdown_link_in_non_markdown_language( + cx: &mut gpui::TestAppContext, +) { + init_test(cx, |_| {}); + + let url = "https://zed.dev"; + + let markdown_language = Arc::new(Language::new( + LanguageConfig { + name: "Rust".into(), + ..LanguageConfig::default() + }, + None, + )); + + let mut cx = EditorTestContext::new(cx).await; + cx.update_buffer(|buffer, cx| buffer.set_language(Some(markdown_language), cx)); + cx.set_state("// Hello, «editorˇ».\n// Zed is «ˇgreat» (see this link: ˇ)"); + + cx.update_editor(|editor, window, cx| { + cx.write_to_clipboard(ClipboardItem::new_string(url.to_string())); + editor.paste(&Paste, window, cx); + }); + + cx.assert_editor_state(&format!( + "// Hello, {url}ˇ.\n// Zed is {url}ˇ (see this link: {url}ˇ)" + )); +} + +#[gpui::test] +async fn test_paste_url_from_other_app_creates_markdown_link_selectively_in_multi_buffer( + cx: &mut TestAppContext, +) { + init_test(cx, |_| {}); + + let url = "https://zed.dev"; + + let markdown_language = Arc::new(Language::new( + LanguageConfig { + name: "Markdown".into(), + ..LanguageConfig::default() + }, + None, + )); + + let (editor, cx) = cx.add_window_view(|window, cx| { + let multi_buffer = MultiBuffer::build_multi( + [ + ("this will embed -> link", vec![Point::row_range(0..1)]), + ("this will replace -> link", vec![Point::row_range(0..1)]), + ], + cx, + ); + let mut editor = Editor::new(EditorMode::full(), multi_buffer.clone(), None, window, cx); + editor.change_selections(SelectionEffects::no_scroll(), window, cx, |s| { + s.select_ranges(vec![ + Point::new(0, 19)..Point::new(0, 23), + Point::new(1, 21)..Point::new(1, 25), + ]) + }); + let first_buffer_id = multi_buffer + .read(cx) + .excerpt_buffer_ids() + .into_iter() + .next() + .unwrap(); + let first_buffer = multi_buffer.read(cx).buffer(first_buffer_id).unwrap(); + first_buffer.update(cx, |buffer, cx| { + buffer.set_language(Some(markdown_language.clone()), cx); + }); + + editor + }); + let mut cx = EditorTestContext::for_editor_in(editor.clone(), cx).await; + + cx.update_editor(|editor, window, cx| { + cx.write_to_clipboard(ClipboardItem::new_string(url.to_string())); + editor.paste(&Paste, window, cx); + }); + + cx.assert_editor_state(&format!( + "this will embed -> [link]({url})ˇ\nthis will replace -> {url}ˇ" + )); +} + +#[gpui::test] +async fn test_race_in_multibuffer_save(cx: &mut TestAppContext) { + init_test(cx, |_| {}); + + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + path!("/project"), + json!({ + "first.rs": "# First Document\nSome content here.", + "second.rs": "Plain text content for second file.", + }), + ) + .await; + + let project = Project::test(fs, [path!("/project").as_ref()], cx).await; + let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let cx = &mut VisualTestContext::from_window(*workspace, cx); + + let language = rust_lang(); + let language_registry = project.read_with(cx, |project, _| project.languages().clone()); + language_registry.add(language.clone()); + let mut fake_servers = language_registry.register_fake_lsp( + "Rust", + FakeLspAdapter { + ..FakeLspAdapter::default() + }, + ); + + let buffer1 = project + .update(cx, |project, cx| { + project.open_local_buffer(PathBuf::from(path!("/project/first.rs")), cx) + }) + .await + .unwrap(); + let buffer2 = project + .update(cx, |project, cx| { + project.open_local_buffer(PathBuf::from(path!("/project/second.rs")), cx) + }) + .await + .unwrap(); + + let multi_buffer = cx.new(|cx| { + let mut multi_buffer = MultiBuffer::new(Capability::ReadWrite); + multi_buffer.set_excerpts_for_path( + PathKey::for_buffer(&buffer1, cx), + buffer1.clone(), + [Point::zero()..buffer1.read(cx).max_point()], + 3, + cx, + ); + multi_buffer.set_excerpts_for_path( + PathKey::for_buffer(&buffer2, cx), + buffer2.clone(), + [Point::zero()..buffer1.read(cx).max_point()], + 3, + cx, + ); + multi_buffer + }); + + let (editor, cx) = cx.add_window_view(|window, cx| { + Editor::new( + EditorMode::full(), + multi_buffer, + Some(project.clone()), + window, + cx, + ) + }); + + let fake_language_server = fake_servers.next().await.unwrap(); + + buffer1.update(cx, |buffer, cx| buffer.edit([(0..0, "hello!")], None, cx)); + + let save = editor.update_in(cx, |editor, window, cx| { + assert!(editor.is_dirty(cx)); + + editor.save( + SaveOptions { + format: true, + autosave: true, + }, + project, + window, + cx, + ) + }); + let (start_edit_tx, start_edit_rx) = oneshot::channel(); + let (done_edit_tx, done_edit_rx) = oneshot::channel(); + let mut done_edit_rx = Some(done_edit_rx); + let mut start_edit_tx = Some(start_edit_tx); + + fake_language_server.set_request_handler::(move |_, _| { + start_edit_tx.take().unwrap().send(()).unwrap(); + let done_edit_rx = done_edit_rx.take().unwrap(); + async move { + done_edit_rx.await.unwrap(); + Ok(None) + } + }); + + start_edit_rx.await.unwrap(); + buffer2 + .update(cx, |buffer, cx| buffer.edit([(0..0, "world!")], None, cx)) + .unwrap(); + + done_edit_tx.send(()).unwrap(); + + save.await.unwrap(); + cx.update(|_, cx| assert!(editor.is_dirty(cx))); +} + #[track_caller] fn extract_color_inlays(editor: &Editor, cx: &App) -> Vec { editor @@ -25912,3 +26479,64 @@ fn extract_color_inlays(editor: &Editor, cx: &App) -> Vec { .map(Rgba::from) .collect() } + +#[gpui::test] +fn test_duplicate_line_up_on_last_line_without_newline(cx: &mut TestAppContext) { + init_test(cx, |_| {}); + + let editor = cx.add_window(|window, cx| { + let buffer = MultiBuffer::build_simple("line1\nline2", cx); + build_editor(buffer, window, cx) + }); + + editor + .update(cx, |editor, window, cx| { + editor.change_selections(SelectionEffects::no_scroll(), window, cx, |s| { + s.select_display_ranges([ + DisplayPoint::new(DisplayRow(1), 0)..DisplayPoint::new(DisplayRow(1), 0) + ]) + }); + + editor.duplicate_line_up(&DuplicateLineUp, window, cx); + + assert_eq!( + editor.display_text(cx), + "line1\nline2\nline2", + "Duplicating last line upward should create duplicate above, not on same line" + ); + + assert_eq!( + editor.selections.display_ranges(cx), + vec![DisplayPoint::new(DisplayRow(1), 0)..DisplayPoint::new(DisplayRow(1), 0)], + "Selection should remain on the original line" + ); + }) + .unwrap(); +} + +#[gpui::test] +async fn test_copy_line_without_trailing_newline(cx: &mut TestAppContext) { + init_test(cx, |_| {}); + + let mut cx = EditorTestContext::new(cx).await; + + cx.set_state("line1\nline2ˇ"); + + cx.update_editor(|e, window, cx| e.copy(&Copy, window, cx)); + + let clipboard_text = cx + .read_from_clipboard() + .and_then(|item| item.text().as_deref().map(str::to_string)); + + assert_eq!( + clipboard_text, + Some("line2\n".to_string()), + "Copying a line without trailing newline should include a newline" + ); + + cx.set_state("line1\nˇ"); + + cx.update_editor(|e, window, cx| e.paste(&Paste, window, cx)); + + cx.assert_editor_state("line1\nline2\nˇ"); +} diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 4ea7a073a2b5b5cdb1c029401c39fbe7cfd90474..e863bb84131980d2c593a7e3d269c822d73b89ea 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -28,7 +28,10 @@ use crate::{ inlay_hint_settings, items::BufferSearchHighlights, mouse_context_menu::{self, MenuPosition}, - scroll::{ActiveScrollbarState, ScrollbarThumbState, scroll_amount::ScrollAmount}, + scroll::{ + ActiveScrollbarState, ScrollOffset, ScrollPixelOffset, ScrollbarThumbState, + scroll_amount::ScrollAmount, + }, }; use buffer_diff::{DiffHunkStatus, DiffHunkStatusKind}; use collections::{BTreeMap, HashMap}; @@ -43,7 +46,7 @@ use gpui::{ Bounds, ClickEvent, ClipboardItem, ContentMask, Context, Corner, Corners, CursorStyle, DispatchPhase, Edges, Element, ElementInputHandler, Entity, Focusable as _, FontId, GlobalElementId, Hitbox, HitboxBehavior, Hsla, InteractiveElement, IntoElement, IsZero, - KeybindingKeystroke, Length, ModifiersChangedEvent, MouseButton, MouseClickEvent, + KeybindingKeystroke, Length, Modifiers, ModifiersChangedEvent, MouseButton, MouseClickEvent, MouseDownEvent, MouseMoveEvent, MouseUpEvent, PaintQuad, ParentElement, Pixels, ScrollDelta, ScrollHandle, ScrollWheelEvent, ShapedLine, SharedString, Size, StatefulInteractiveElement, Style, Styled, TextRun, TextStyleRefinement, WeakEntity, Window, anchored, deferred, div, fill, @@ -51,9 +54,7 @@ use gpui::{ transparent_black, }; use itertools::Itertools; -use language::language_settings::{ - IndentGuideBackgroundColoring, IndentGuideColoring, IndentGuideSettings, ShowWhitespaceSetting, -}; +use language::{IndentGuideSettings, language_settings::ShowWhitespaceSetting}; use markdown::Markdown; use multi_buffer::{ Anchor, ExcerptId, ExcerptInfo, ExpandExcerptDirection, ExpandInfo, MultiBufferPoint, @@ -63,9 +64,12 @@ use multi_buffer::{ use project::{ Entry, ProjectPath, debugger::breakpoint_store::{Breakpoint, BreakpointSessionState}, - project_settings::{GitGutterSetting, GitHunkStyleSetting, ProjectSettings}, + project_settings::ProjectSettings, +}; +use settings::{ + GitGutterSetting, GitHunkStyleSetting, IndentGuideBackgroundColoring, IndentGuideColoring, + Settings, }; -use settings::Settings; use smallvec::{SmallVec, smallvec}; use std::{ any::TypeId, @@ -85,14 +89,15 @@ use theme::{ActiveTheme, Appearance, BufferLineHeight, PlayerColor}; use ui::utils::ensure_minimum_contrast; use ui::{ ButtonLike, ContextMenu, Indicator, KeyBinding, POPOVER_Y_PADDING, Tooltip, h_flex, prelude::*, - right_click_menu, scrollbars::ShowScrollbar, + right_click_menu, scrollbars::ShowScrollbar, text_for_keystroke, }; use unicode_segmentation::UnicodeSegmentation; use util::post_inc; use util::{RangeExt, ResultExt, debug_panic}; use workspace::{ CollaboratorId, ItemSettings, OpenInTerminal, OpenTerminal, RevealInProjectPanel, Workspace, - item::Item, notifications::NotifyTaskExt, + item::{Item, ItemBufferKind}, + notifications::NotifyTaskExt, }; /// Determines what kinds of highlights should be applied to a lines background. @@ -131,7 +136,7 @@ impl SelectionLayout { is_local: bool, user_name: Option, ) -> Self { - let point_selection = selection.map(|p| p.to_point(&map.buffer_snapshot)); + let point_selection = selection.map(|p| p.to_point(map.buffer_snapshot())); let display_selection = point_selection.map(|p| p.to_display_point(map)); let mut range = display_selection.range(); let mut head = display_selection.head(); @@ -372,7 +377,7 @@ impl EditorElement { register_action(editor, window, Editor::move_to_enclosing_bracket); register_action(editor, window, Editor::undo_selection); register_action(editor, window, Editor::redo_selection); - if !editor.read(cx).is_singleton(cx) { + if editor.read(cx).buffer_kind(cx) == ItemBufferKind::Multibuffer { register_action(editor, window, Editor::expand_excerpts); register_action(editor, window, Editor::expand_excerpts_up); register_action(editor, window, Editor::expand_excerpts_down); @@ -427,6 +432,15 @@ impl EditorElement { register_action(editor, window, Editor::open_selected_filename); register_action(editor, window, Editor::fold); register_action(editor, window, Editor::fold_at_level); + register_action(editor, window, Editor::fold_at_level_1); + register_action(editor, window, Editor::fold_at_level_2); + register_action(editor, window, Editor::fold_at_level_3); + register_action(editor, window, Editor::fold_at_level_4); + register_action(editor, window, Editor::fold_at_level_5); + register_action(editor, window, Editor::fold_at_level_6); + register_action(editor, window, Editor::fold_at_level_7); + register_action(editor, window, Editor::fold_at_level_8); + register_action(editor, window, Editor::fold_at_level_9); register_action(editor, window, Editor::fold_all); register_action(editor, window, Editor::fold_function_bodies); register_action(editor, window, Editor::fold_recursive); @@ -695,11 +709,11 @@ impl EditorElement { // and run the selection logic. modifiers.alt = false; } else { - let scroll_position_row = - position_map.scroll_pixel_position.y / position_map.line_height; + let scroll_position_row = position_map.scroll_position.y; let display_row = (((event.position - gutter_hitbox.bounds.origin).y - + position_map.scroll_pixel_position.y) / position_map.line_height) + as f64 + + position_map.scroll_position.y) as u32; let multi_buffer_row = position_map .snapshot @@ -725,6 +739,35 @@ impl EditorElement { } } + if !is_singleton { + let display_row = (ScrollPixelOffset::from( + (event.position - gutter_hitbox.bounds.origin).y / position_map.line_height, + ) + position_map.scroll_position.y) as u32; + let multi_buffer_row = position_map + .snapshot + .display_point_to_point(DisplayPoint::new(DisplayRow(display_row), 0), Bias::Right) + .row; + if line_numbers + .get(&MultiBufferRow(multi_buffer_row)) + .and_then(|line_number| line_number.hitbox.as_ref()) + .is_some_and(|hitbox| hitbox.contains(&event.position)) + { + let line_offset_from_top = display_row - position_map.scroll_position.y as u32; + + editor.open_excerpts_common( + Some(JumpData::MultiBufferRow { + row: MultiBufferRow(multi_buffer_row), + line_offset_from_top, + }), + modifiers.alt, + window, + cx, + ); + cx.stop_propagation(); + return; + } + } + let position = point_for_position.previous_valid; if let Some(mode) = Editor::columnar_selection_mode(&modifiers, cx) { editor.select( @@ -762,36 +805,6 @@ impl EditorElement { ); } cx.stop_propagation(); - - if !is_singleton { - let display_row = (((event.position - gutter_hitbox.bounds.origin).y - + position_map.scroll_pixel_position.y) - / position_map.line_height) as u32; - let multi_buffer_row = position_map - .snapshot - .display_point_to_point(DisplayPoint::new(DisplayRow(display_row), 0), Bias::Right) - .row; - if line_numbers - .get(&MultiBufferRow(multi_buffer_row)) - .and_then(|line_number| line_number.hitbox.as_ref()) - .is_some_and(|hitbox| hitbox.contains(&event.position)) - { - let scroll_position_row = - position_map.scroll_pixel_position.y / position_map.line_height; - let line_offset_from_top = display_row - scroll_position_row as u32; - - editor.open_excerpts_common( - Some(JumpData::MultiBufferRow { - row: MultiBufferRow(multi_buffer_row), - line_offset_from_top, - }), - modifiers.alt, - window, - cx, - ); - cx.stop_propagation(); - } - } } fn mouse_right_down( @@ -1060,7 +1073,7 @@ impl EditorElement { ); if mouse_down_time.elapsed() >= drag_and_drop_delay { let drop_cursor = Selection { - id: post_inc(&mut editor.selections.next_selection_id), + id: post_inc(&mut editor.selections.next_selection_id()), start: drop_anchor, end: drop_anchor, reversed: false, @@ -1190,7 +1203,7 @@ impl EditorElement { if let Some((buffer_snapshot, file)) = position_map .snapshot - .buffer_snapshot + .buffer_snapshot() .buffer_for_excerpt(buffer_anchor.excerpt_id) .and_then(|buffer| buffer.file().map(|file| (buffer, file))) { @@ -1272,7 +1285,7 @@ impl EditorElement { if let Some(point) = point_for_position.as_valid() { let anchor = position_map .snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(point.to_offset(&position_map.snapshot, Bias::Left)); hover_at(editor, Some(anchor), window, cx); Self::update_visible_cursor(editor, point, position_map, window, cx); @@ -1309,11 +1322,11 @@ impl EditorElement { ); let range = snapshot - .buffer_snapshot - .anchor_at(start.to_point(&snapshot.display_snapshot), Bias::Left) + .buffer_snapshot() + .anchor_before(start.to_point(&snapshot.display_snapshot)) ..snapshot - .buffer_snapshot - .anchor_at(end.to_point(&snapshot.display_snapshot), Bias::Right); + .buffer_snapshot() + .anchor_after(end.to_point(&snapshot.display_snapshot)); let Some(selection) = snapshot.remote_selections_in_range(&range, hub, cx).next() else { return; @@ -1370,7 +1383,7 @@ impl EditorElement { let layout = SelectionLayout::new( selection, - editor.selections.line_mode, + editor.selections.line_mode(), editor.cursor_shape, &snapshot.display_snapshot, is_newest, @@ -1403,11 +1416,11 @@ impl EditorElement { && !hide_drop_cursor && (drop_cursor .start - .cmp(&selection.start, &snapshot.buffer_snapshot) + .cmp(&selection.start, &snapshot.buffer_snapshot()) .eq(&Ordering::Less) || drop_cursor .end - .cmp(&selection.end, &snapshot.buffer_snapshot) + .cmp(&selection.end, &snapshot.buffer_snapshot()) .eq(&Ordering::Greater)) { let drag_cursor_layout = SelectionLayout::new( @@ -1487,7 +1500,7 @@ impl EditorElement { selections.extend(remote_selections.into_values()); } else if !editor.is_focused(window) && editor.show_cursor_when_unfocused { let layouts = snapshot - .buffer_snapshot + .buffer_snapshot() .selections_in_range(&(start_anchor..end_anchor), true) .map(move |(_, line_mode, cursor_shape, selection)| { SelectionLayout::new( @@ -1505,6 +1518,15 @@ impl EditorElement { selections.push((player, layouts)); } }); + + #[cfg(debug_assertions)] + Self::layout_debug_ranges( + &mut selections, + start_anchor..end_anchor, + &snapshot.display_snapshot, + cx, + ); + (selections, active_rows, newest_selection_head) } @@ -1538,9 +1560,13 @@ impl EditorElement { // Local cursors if !skip_local { let color = cx.theme().players().local().cursor; - editor.selections.disjoint.iter().for_each(|selection| { - add_cursor(selection.head(), color); - }); + editor + .selections + .disjoint_anchors() + .iter() + .for_each(|selection| { + add_cursor(selection.head(), color); + }); if let Some(ref selection) = editor.selections.pending_anchor() { add_cursor(selection.head(), color); } @@ -1557,8 +1583,8 @@ impl EditorElement { line_layouts: &[LineWithInvisibles], text_hitbox: &Hitbox, content_origin: gpui::Point, - scroll_position: gpui::Point, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, + scroll_pixel_position: gpui::Point, line_height: Pixels, em_width: Pixels, em_advance: Pixels, @@ -1609,12 +1635,13 @@ impl EditorElement { .map(|text| { let len = text.len(); - let font = cursor_row_layout + let mut font = cursor_row_layout .font_id_for_index(cursor_column) .and_then(|cursor_font_id| { window.text_system().get_font_for_id(cursor_font_id) }) .unwrap_or(self.style.text.font()); + font.features = self.style.text.font_features.clone(); // Invert the text color for the block cursor. Ensure that the text // color is opaque enough to be visible against the background color. @@ -1650,10 +1677,10 @@ impl EditorElement { None }; - let x = cursor_character_x - scroll_pixel_position.x; - let y = (cursor_position.row().as_f32() - - scroll_pixel_position.y / line_height) - * line_height; + let x = cursor_character_x - scroll_pixel_position.x.into(); + let y = ((cursor_position.row().as_f64() - scroll_position.y) + * ScrollPixelOffset::from(line_height)) + .into(); if selection.is_newest { editor.pixel_position_of_newest_cursor = Some(point( text_hitbox.origin.x + x + block_width / 2., @@ -1662,19 +1689,27 @@ impl EditorElement { if autoscroll_containing_element { let top = text_hitbox.origin.y - + (cursor_position.row().as_f32() - scroll_position.y - 3.).max(0.) - * line_height; + + ((cursor_position.row().as_f64() - scroll_position.y - 3.) + .max(0.) + * ScrollPixelOffset::from(line_height)) + .into(); let left = text_hitbox.origin.x - + (cursor_position.column() as f32 - scroll_position.x - 3.) + + ((cursor_position.column() as ScrollOffset + - scroll_position.x + - 3.) .max(0.) - * em_width; + * ScrollPixelOffset::from(em_width)) + .into(); let bottom = text_hitbox.origin.y - + (cursor_position.row().as_f32() - scroll_position.y + 4.) - * line_height; + + ((cursor_position.row().as_f64() - scroll_position.y + 4.) + * ScrollPixelOffset::from(line_height)) + .into(); let right = text_hitbox.origin.x - + (cursor_position.column() as f32 - scroll_position.x + 4.) - * em_width; + + ((cursor_position.column() as ScrollOffset - scroll_position.x + + 4.) + * ScrollPixelOffset::from(em_width)) + .into(); autoscroll_bounds = Some(Bounds::from_corners(point(left, top), point(right, bottom))) @@ -1715,7 +1750,7 @@ impl EditorElement { snapshot: &EditorSnapshot, scrollbar_layout_information: &ScrollbarLayoutInformation, content_offset: gpui::Point, - scroll_position: gpui::Point, + scroll_position: gpui::Point, non_visible_cursors: bool, right_margin: Pixels, editor_width: Pixels, @@ -1742,9 +1777,9 @@ impl EditorElement { let show_scrollbars = match scrollbar_settings.show { ShowScrollbar::Auto => { let editor = self.editor.read(cx); - let is_singleton = editor.is_singleton(cx); + let is_singleton = editor.buffer_kind(cx) == ItemBufferKind::Singleton; // Git - (is_singleton && scrollbar_settings.git_diff && snapshot.buffer_snapshot.has_diff_hunks()) + (is_singleton && scrollbar_settings.git_diff && snapshot.buffer_snapshot().has_diff_hunks()) || // Buffer Search Results (is_singleton && scrollbar_settings.search_results && editor.has_background_highlights::()) @@ -1756,7 +1791,7 @@ impl EditorElement { (is_singleton && scrollbar_settings.selected_symbol && (editor.has_background_highlights::() || editor.has_background_highlights::())) || // Diagnostics - (is_singleton && scrollbar_settings.diagnostics != ScrollbarDiagnostics::None && snapshot.buffer_snapshot.has_diagnostics()) + (is_singleton && scrollbar_settings.diagnostics != ScrollbarDiagnostics::None && snapshot.buffer_snapshot().has_diagnostics()) || // Cursors out of sight non_visible_cursors @@ -1803,7 +1838,7 @@ impl EditorElement { &self, snapshot: &EditorSnapshot, minimap_width: Pixels, - scroll_position: gpui::Point, + scroll_position: gpui::Point, scrollbar_layout_information: &ScrollbarLayoutInformation, scrollbar_layout: Option<&EditorScrollbars>, window: &mut Window, @@ -1878,9 +1913,9 @@ impl EditorElement { ); let minimap_height = minimap_bounds.size.height; - let visible_editor_lines = editor_bounds.size.height / line_height; - let total_editor_lines = scroll_range.height / line_height; - let minimap_lines = minimap_height / minimap_line_height; + let visible_editor_lines = (editor_bounds.size.height / line_height) as f64; + let total_editor_lines = (scroll_range.height / line_height) as f64; + let minimap_lines = (minimap_height / minimap_line_height) as f64; let minimap_scroll_top = MinimapLayout::calculate_minimap_top_offset( total_editor_lines, @@ -1986,7 +2021,7 @@ impl EditorElement { line_height: Pixels, gutter_dimensions: &GutterDimensions, gutter_settings: crate::editor_settings::Gutter, - scroll_pixel_position: gpui::Point, + scroll_pixel_position: gpui::Point, gutter_hitbox: &Hitbox, window: &mut Window, cx: &mut App, @@ -2002,7 +2037,8 @@ impl EditorElement { let position = point( gutter_dimensions.width - gutter_dimensions.right_padding, - ix as f32 * line_height - (scroll_pixel_position.y % line_height), + ix as f32 * line_height + - (scroll_pixel_position.y % ScrollPixelOffset::from(line_height)).into(), ); let centering_offset = point( (gutter_dimensions.fold_area_width() - crease_toggle_size.width) / 2., @@ -2033,7 +2069,7 @@ impl EditorElement { lines: &[LineWithInvisibles], line_height: Pixels, content_origin: gpui::Point, - scroll_pixel_position: gpui::Point, + scroll_pixel_position: gpui::Point, em_width: Pixels, window: &mut Window, cx: &mut App, @@ -2056,8 +2092,9 @@ impl EditorElement { 4. * em_width }; let position = point( - scroll_pixel_position.x + line.width + padding, - ix as f32 * line_height - (scroll_pixel_position.y % line_height), + Pixels::from(scroll_pixel_position.x) + line.width + padding, + ix as f32 * line_height + - (scroll_pixel_position.y % ScrollPixelOffset::from(line_height)).into(), ); let centering_offset = point(px(0.), (line_height - size.height) / 2.); let origin = content_origin + position + centering_offset; @@ -2086,10 +2123,7 @@ impl EditorElement { .display_diff_hunks_for_rows(display_rows, folded_buffers) .map(|hunk| (hunk, None)) .collect::>(); - let git_gutter_setting = ProjectSettings::get_global(cx) - .git - .git_gutter - .unwrap_or_default(); + let git_gutter_setting = ProjectSettings::get_global(cx).git.git_gutter; if let GitGutterSetting::TrackedFiles = git_gutter_setting { for (hunk, hitbox) in &mut display_hunks { if matches!(hunk, DisplayDiffHunk::Unfolded { .. }) { @@ -2109,7 +2143,8 @@ impl EditorElement { crease_trailers: &[Option], row_block_types: &HashMap, content_origin: gpui::Point, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, + scroll_pixel_position: gpui::Point, edit_prediction_popover_origin: Option>, start_row: DisplayRow, end_row: DisplayRow, @@ -2209,8 +2244,7 @@ impl EditorElement { continue; }; - let pos_y = content_origin.y - + line_height * (row.0 as f32 - scroll_pixel_position.y / line_height); + let pos_y = content_origin.y + line_height * (row.0 as f64 - scroll_position.y) as f32; let window_ix = row.0.saturating_sub(start_row.0) as usize; let pos_x = { @@ -2220,11 +2254,16 @@ impl EditorElement { let line_end = if let Some(crease_trailer) = crease_trailer_layout { crease_trailer.bounds.right() } else { - content_origin.x - scroll_pixel_position.x + line_layout.width + Pixels::from( + ScrollPixelOffset::from(content_origin.x + line_layout.width) + - scroll_pixel_position.x, + ) }; let padded_line = line_end + padding; - let min_start = content_origin.x - scroll_pixel_position.x + min_x; + let min_start = Pixels::from( + ScrollPixelOffset::from(content_origin.x + min_x) - scroll_pixel_position.x, + ); cmp::max(padded_line, min_start) }; @@ -2268,7 +2307,8 @@ impl EditorElement { &self, display_point: DisplayPoint, content_origin: gpui::Point, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, + scroll_pixel_position: gpui::Point, line_height: Pixels, snapshot: &EditorSnapshot, window: &mut Window, @@ -2313,7 +2353,7 @@ impl EditorElement { // do not show code action for blank line with cursor let line_indent = snapshot .display_snapshot - .buffer_snapshot + .buffer_snapshot() .line_indent_for_row(MultiBufferRow(buffer_point.row)); if line_indent.is_line_blank() { return None; @@ -2324,7 +2364,7 @@ impl EditorElement { let excerpt_id = snapshot .display_snapshot - .buffer_snapshot + .buffer_snapshot() .excerpt_containing(buffer_point..buffer_point) .map(|excerpt| excerpt.id()); @@ -2345,7 +2385,7 @@ impl EditorElement { }; let candidate_excerpt_id = snapshot .display_snapshot - .buffer_snapshot + .buffer_snapshot() .excerpt_containing(candidate_point..candidate_point) .map(|excerpt| excerpt.id()); // move to other row if different excerpt @@ -2355,7 +2395,7 @@ impl EditorElement { } let line_indent = snapshot .display_snapshot - .buffer_snapshot + .buffer_snapshot() .line_indent_for_row(MultiBufferRow(row_candidate)); // use this row if it's blank if line_indent.is_line_blank() { @@ -2364,7 +2404,7 @@ impl EditorElement { // use this row if code starts after slot let indent_size = snapshot .display_snapshot - .buffer_snapshot + .buffer_snapshot() .indent_size_for_line(MultiBufferRow(row_candidate)); indent_size.len >= INLINE_SLOT_CHAR_LIMIT } @@ -2373,7 +2413,7 @@ impl EditorElement { let new_buffer_row = if is_valid_row(buffer_point.row) { Some(buffer_point.row) } else { - let max_row = snapshot.display_snapshot.buffer_snapshot.max_point().row; + let max_row = snapshot.display_snapshot.buffer_snapshot().max_point().row; (1..=MAX_ALTERNATE_DISTANCE).find_map(|offset| { let row_above = buffer_point.row.saturating_sub(offset); let row_below = buffer_point.row + offset; @@ -2399,10 +2439,12 @@ impl EditorElement { .row(); let start_y = content_origin.y - + ((new_display_row.as_f32() - (scroll_pixel_position.y / line_height)) * line_height) + + (((new_display_row.as_f64() - scroll_position.y) as f32) * line_height) + (line_height / 2.0) - (icon_size.square(window, cx) / 2.); - let start_x = content_origin.x - scroll_pixel_position.x + (window.rem_size() * 0.1); + let start_x = (ScrollPixelOffset::from(content_origin.x) - scroll_pixel_position.x + + ScrollPixelOffset::from(window.rem_size() * 0.1)) + .into(); let absolute_offset = gpui::point(start_x, start_y); button.layout_as_root(gpui::AvailableSpace::min_size(), window, cx); @@ -2423,7 +2465,8 @@ impl EditorElement { crease_trailer: Option<&CreaseTrailerLayout>, em_width: Pixels, content_origin: gpui::Point, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, + scroll_pixel_position: gpui::Point, line_height: Pixels, text_hitbox: &Hitbox, window: &mut Window, @@ -2441,11 +2484,7 @@ impl EditorElement { let padding = { const INLINE_ACCEPT_SUGGESTION_EM_WIDTHS: f32 = 14.; - let mut padding = ProjectSettings::get_global(cx) - .git - .inline_blame - .unwrap_or_default() - .padding as f32; + let mut padding = ProjectSettings::get_global(cx).git.inline_blame.padding as f32; if let Some(edit_prediction) = editor.active_edit_prediction.as_ref() && let EditPrediction::Edit { @@ -2467,25 +2506,29 @@ impl EditorElement { let mut element = render_inline_blame_entry(entry.clone(), &self.style, cx)?; - let start_y = content_origin.y - + line_height * (display_row.as_f32() - scroll_pixel_position.y / line_height); + let start_y = + content_origin.y + line_height * ((display_row.as_f64() - scroll_position.y) as f32); let start_x = { let line_end = if let Some(crease_trailer) = crease_trailer { crease_trailer.bounds.right() } else { - content_origin.x - scroll_pixel_position.x + line_layout.width + Pixels::from( + ScrollPixelOffset::from(content_origin.x + line_layout.width) + - scroll_pixel_position.x, + ) }; let padded_line_end = line_end + padding; - let min_column_in_pixels = ProjectSettings::get_global(cx) - .git - .inline_blame - .map(|settings| settings.min_column) - .map(|col| self.column_pixels(col as usize, window)) - .unwrap_or(px(0.)); - let min_start = content_origin.x - scroll_pixel_position.x + min_column_in_pixels; + let min_column_in_pixels = self.column_pixels( + ProjectSettings::get_global(cx).git.inline_blame.min_column as usize, + window, + ); + let min_start = Pixels::from( + ScrollPixelOffset::from(content_origin.x + min_column_in_pixels) + - scroll_pixel_position.x, + ); cmp::max(padded_line_end, min_start) }; @@ -2585,7 +2628,7 @@ impl EditorElement { &self, buffer_rows: &[RowInfo], em_width: Pixels, - scroll_position: gpui::Point, + scroll_position: gpui::Point, line_height: Pixels, gutter_hitbox: &Hitbox, max_width: Option, @@ -2610,10 +2653,10 @@ impl EditorElement { } else { AvailableSpace::MaxContent }; - let scroll_top = scroll_position.y * line_height; + let scroll_top = scroll_position.y * ScrollPixelOffset::from(line_height); let start_x = em_width; - let mut last_used_color: Option<(PlayerColor, Oid)> = None; + let mut last_used_color: Option<(Hsla, Oid)> = None; let blame_renderer = cx.global::().0.clone(); let shaped_lines = blamed_rows @@ -2630,11 +2673,13 @@ impl EditorElement { self.editor.clone(), workspace.clone(), buffer_id, - blame_renderer.clone(), + &*blame_renderer, + window, cx, )?; - let start_y = ix as f32 * line_height - (scroll_top % line_height); + let start_y = ix as f32 * line_height + - Pixels::from(scroll_top % ScrollPixelOffset::from(line_height)); let absolute_offset = gutter_hitbox.origin + point(start_x, start_y); element.prepaint_as_root( @@ -2656,7 +2701,7 @@ impl EditorElement { content_origin: gpui::Point, text_origin: gpui::Point, visible_buffer_range: Range, - scroll_pixel_position: gpui::Point, + scroll_pixel_position: gpui::Point, line_height: Pixels, snapshot: &DisplaySnapshot, window: &mut Window, @@ -2680,7 +2725,10 @@ impl EditorElement { let single_indent_width = self.column_pixels(indent_guide.tab_size as usize, window); let total_width = single_indent_width * indent_guide.depth as f32; - let start_x = content_origin.x + total_width - scroll_pixel_position.x; + let start_x = Pixels::from( + ScrollOffset::from(content_origin.x + total_width) + - scroll_pixel_position.x, + ); if start_x >= text_origin.x { let (offset_y, length) = Self::calculate_indent_guide_bounds( indent_guide.start_row..indent_guide.end_row, @@ -2688,7 +2736,10 @@ impl EditorElement { snapshot, ); - let start_y = content_origin.y + offset_y - scroll_pixel_position.y; + let start_y = Pixels::from( + ScrollOffset::from(content_origin.y) + offset_y + - scroll_pixel_position.y, + ); Some(IndentGuideLayout { origin: point(start_x, start_y), @@ -2709,7 +2760,7 @@ impl EditorElement { fn layout_wrap_guides( &self, em_advance: Pixels, - scroll_position: gpui::Point, + scroll_position: gpui::Point, content_origin: gpui::Point, scrollbar_layout: Option<&EditorScrollbars>, vertical_scrollbar_width: Pixels, @@ -2717,7 +2768,7 @@ impl EditorElement { window: &Window, cx: &App, ) -> SmallVec<[(Pixels, bool); 2]> { - let scroll_left = scroll_position.x * em_advance; + let scroll_left = scroll_position.x as f32 * em_advance; let content_origin = content_origin.x; let horizontal_offset = content_origin - scroll_left; let vertical_scrollbar_width = scrollbar_layout @@ -2743,7 +2794,7 @@ impl EditorElement { row_range: Range, line_height: Pixels, snapshot: &DisplaySnapshot, - ) -> (gpui::Pixels, gpui::Pixels) { + ) -> (f64, gpui::Pixels) { let start_point = Point::new(row_range.start.0, 0); let end_point = Point::new(row_range.end.0, 0); @@ -2758,7 +2809,7 @@ impl EditorElement { cons_line.row += 1; let cons_line = cons_line.to_display_point(snapshot).row(); - let mut offset_y = row_range.start.0 as f32 * line_height; + let mut offset_y = row_range.start.as_f64() * f64::from(line_height); let mut length = (cons_line.0.saturating_sub(row_range.start.0)) as f32 * line_height; // If we are at the end of the buffer, ensure that the indent guide extends to the end of the line. @@ -2783,7 +2834,7 @@ impl EditorElement { block_height += block.height(); } if !found_excerpt_header { - offset_y -= block_offset as f32 * line_height; + offset_y -= block_offset as f64 * f64::from(line_height); length += block_height as f32 * line_height; } @@ -2811,7 +2862,7 @@ impl EditorElement { &self, line_height: Pixels, range: Range, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, gutter_dimensions: &GutterDimensions, gutter_hitbox: &Hitbox, display_hunks: &[(DisplayDiffHunk, Option)], @@ -2854,7 +2905,7 @@ impl EditorElement { display_row, line_height, gutter_dimensions, - scroll_pixel_position, + scroll_position, gutter_hitbox, display_hunks, window, @@ -2872,7 +2923,7 @@ impl EditorElement { line_height: Pixels, range: Range, row_infos: &[RowInfo], - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, gutter_dimensions: &GutterDimensions, gutter_hitbox: &Hitbox, display_hunks: &[(DisplayDiffHunk, Option)], @@ -2911,7 +2962,7 @@ impl EditorElement { .tasks .iter() .filter_map(|(_, tasks)| { - let multibuffer_point = tasks.offset.to_point(&snapshot.buffer_snapshot); + let multibuffer_point = tasks.offset.to_point(&snapshot.buffer_snapshot()); if multibuffer_point < offset_range_start || multibuffer_point > offset_range_end { @@ -2919,7 +2970,7 @@ impl EditorElement { } let multibuffer_row = MultiBufferRow(multibuffer_point.row); let buffer_folded = snapshot - .buffer_snapshot + .buffer_snapshot() .buffer_line_for_row(multibuffer_row) .map(|(buffer_snapshot, _)| buffer_snapshot.remote_id()) .map(|buffer_id| editor.is_buffer_folded(buffer_id, cx)) @@ -2965,7 +3016,7 @@ impl EditorElement { display_row, line_height, gutter_dimensions, - scroll_pixel_position, + scroll_position, gutter_hitbox, display_hunks, window, @@ -2983,7 +3034,7 @@ impl EditorElement { gutter_dimensions: GutterDimensions, em_width: Pixels, line_height: Pixels, - scroll_position: gpui::Point, + scroll_position: gpui::Point, buffer_rows: &[RowInfo], window: &mut Window, cx: &mut App, @@ -2994,7 +3045,7 @@ impl EditorElement { let editor_font_size = self.style.text.font_size.to_pixels(window.rem_size()) * 1.2; - let scroll_top = scroll_position.y * line_height; + let scroll_top = scroll_position.y * ScrollPixelOffset::from(line_height); let max_line_number_length = self .editor @@ -3006,6 +3057,12 @@ impl EditorElement { .ilog10() + 1; + let git_gutter_width = Self::gutter_strip_width(line_height) + + gutter_dimensions + .git_blame_entries_width + .unwrap_or_default(); + let available_width = gutter_dimensions.left_padding - git_gutter_width; + buffer_rows .iter() .enumerate() @@ -3021,9 +3078,6 @@ impl EditorElement { ExpandExcerptDirection::UpAndDown => IconName::ExpandVertical, }; - let git_gutter_width = Self::gutter_strip_width(line_height); - let available_width = gutter_dimensions.left_padding - git_gutter_width; - let editor = self.editor.clone(); let is_wide = max_line_number_length >= EditorSettings::get_global(cx).gutter.min_line_number_digits as u32 @@ -3057,7 +3111,9 @@ impl EditorElement { let position = point( git_gutter_width + px(1.), - ix as f32 * line_height - (scroll_top % line_height) + px(1.), + ix as f32 * line_height + - Pixels::from(scroll_top % ScrollPixelOffset::from(line_height)) + + px(1.), ); let origin = gutter_hitbox.origin + position; @@ -3121,7 +3177,7 @@ impl EditorElement { gutter_hitbox: Option<&Hitbox>, gutter_dimensions: GutterDimensions, line_height: Pixels, - scroll_position: gpui::Point, + scroll_position: gpui::Point, rows: Range, buffer_rows: &[RowInfo], active_rows: &BTreeMap, @@ -3142,7 +3198,7 @@ impl EditorElement { let newest = editor.selections.newest::(cx); SelectionLayout::new( newest, - editor.selections.line_mode, + editor.selections.line_mode(), editor.cursor_shape, &snapshot.display_snapshot, true, @@ -3192,12 +3248,13 @@ impl EditorElement { .unwrap_or_else(|| cx.theme().colors().editor_line_number); let shaped_line = self.shape_line_number(SharedString::from(&line_number), color, window); - let scroll_top = scroll_position.y * line_height; + let scroll_top = scroll_position.y * ScrollPixelOffset::from(line_height); let line_origin = gutter_hitbox.map(|hitbox| { hitbox.origin + point( hitbox.size.width - shaped_line.width - gutter_dimensions.right_padding, - ix as f32 * line_height - (scroll_top % line_height), + ix as f32 * line_height + - Pixels::from(scroll_top % ScrollPixelOffset::from(line_height)), ) }); @@ -3237,7 +3294,7 @@ impl EditorElement { ) -> Vec> { let include_fold_statuses = EditorSettings::get_global(cx).gutter.folds && snapshot.mode.is_full() - && self.editor.read(cx).is_singleton(cx); + && self.editor.read(cx).buffer_kind(cx) == ItemBufferKind::Singleton; if include_fold_statuses { row_infos .iter() @@ -3509,7 +3566,8 @@ impl EditorElement { start_row: DisplayRow, line_layouts: &mut [LineWithInvisibles], line_height: Pixels, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, + scroll_pixel_position: gpui::Point, content_origin: gpui::Point, window: &mut Window, cx: &mut App, @@ -3519,6 +3577,7 @@ impl EditorElement { let row = start_row + DisplayRow(ix as u32); line.prepaint( line_height, + scroll_position, scroll_pixel_position, row, content_origin, @@ -3558,8 +3617,8 @@ impl EditorElement { let mut x_position = None; let mut element = match block { Block::Custom(custom) => { - let block_start = custom.start().to_point(&snapshot.buffer_snapshot); - let block_end = custom.end().to_point(&snapshot.buffer_snapshot); + let block_start = custom.start().to_point(&snapshot.buffer_snapshot()); + let block_end = custom.end().to_point(&snapshot.buffer_snapshot()); if block.place_near() && snapshot.is_line_folded(MultiBufferRow(block_start.row)) { return None; } @@ -3772,14 +3831,20 @@ impl EditorElement { .as_ref() .map(|project| project.read(cx).visible_worktrees(cx).count() > 1) .unwrap_or_default(); - let can_open_excerpts = Editor::can_open_excerpts_in_file(for_excerpt.buffer.file()); - let relative_path = for_excerpt.buffer.resolve_file_path(cx, include_root); - let filename = relative_path - .as_ref() - .and_then(|path| Some(path.file_name()?.to_string_lossy().to_string())); - let parent_path = relative_path.as_ref().and_then(|path| { - Some(path.parent()?.to_string_lossy().to_string() + std::path::MAIN_SEPARATOR_STR) - }); + let file = for_excerpt.buffer.file(); + let can_open_excerpts = Editor::can_open_excerpts_in_file(file); + let path_style = file.map(|file| file.path_style(cx)); + let relative_path = for_excerpt.buffer.resolve_file_path(include_root, cx); + let (parent_path, filename) = if let Some(path) = &relative_path { + if let Some(path_style) = path_style { + let (dir, file_name) = path_style.split(path); + (dir.map(|dir| dir.to_owned()), Some(file_name.to_owned())) + } else { + (None, Some(path.clone())) + } + } else { + (None, None) + }; let focus_handle = editor.focus_handle(cx); let colors = cx.theme().colors(); @@ -3831,7 +3896,14 @@ impl EditorElement { Tooltip::with_meta_in( "Toggle Excerpt Fold", Some(&ToggleFold), - "Alt+click to toggle all", + format!( + "{} to toggle all", + text_for_keystroke( + &Modifiers::alt(), + "click", + cx + ) + ), &focus_handle, window, cx, @@ -3873,12 +3945,7 @@ impl EditorElement { }) .take(1), ) - .child( - h_flex() - .size(Pixels(12.0)) - .justify_center() - .children(indicator), - ) + .child(h_flex().size(px(12.0)).justify_center().children(indicator)) .child( h_flex() .cursor_pointer() @@ -3979,12 +4046,13 @@ impl EditorElement { && let Some(worktree) = project.read(cx).worktree_for_id(file.worktree_id(cx), cx) { + let path_style = file.path_style(cx); let worktree = worktree.read(cx); let relative_path = file.path(); let entry_for_path = worktree.entry_for_path(relative_path); let abs_path = entry_for_path.map(|e| { e.canonical_path.as_deref().map_or_else( - || worktree.abs_path().join(relative_path), + || worktree.absolutize(relative_path), Path::to_path_buf, ) }); @@ -4009,7 +4077,7 @@ impl EditorElement { Some(Box::new(zed_actions::workspace::CopyPath)), window.handler_for(&editor, move |_, _, cx| { cx.write_to_clipboard(ClipboardItem::new_string( - abs_path.to_string_lossy().to_string(), + abs_path.to_string_lossy().into_owned(), )); }), ) @@ -4020,7 +4088,7 @@ impl EditorElement { Some(Box::new(zed_actions::workspace::CopyRelativePath)), window.handler_for(&editor, move |_, _, cx| { cx.write_to_clipboard(ClipboardItem::new_string( - relative_path.to_string_lossy().to_string(), + relative_path.display(path_style).to_string(), )); }), ) @@ -4268,7 +4336,8 @@ impl EditorElement { blocks: &mut Vec, hitbox: &Hitbox, line_height: Pixels, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, + scroll_pixel_position: gpui::Point, window: &mut Window, cx: &mut App, ) { @@ -4277,7 +4346,10 @@ impl EditorElement { hitbox.origin + point( block.x_offset, - row.as_f32() * line_height - scroll_pixel_position.y, + Pixels::from( + (row.as_f64() - scroll_position.y) + * ScrollPixelOffset::from(line_height), + ), ) } else { // Position the block outside the visible area @@ -4285,7 +4357,7 @@ impl EditorElement { }; if !matches!(block.style, BlockStyle::Sticky) { - origin += point(-scroll_pixel_position.x, Pixels::ZERO); + origin += point(Pixels::from(-scroll_pixel_position.x), Pixels::ZERO); } let focus_handle = @@ -4307,7 +4379,7 @@ impl EditorElement { fn layout_sticky_buffer_header( &self, StickyHeaderExcerpt { excerpt }: StickyHeaderExcerpt<'_>, - scroll_position: f32, + scroll_position: gpui::Point, line_height: Pixels, right_margin: Pixels, snapshot: &EditorSnapshot, @@ -4319,7 +4391,7 @@ impl EditorElement { ) -> AnyElement { let jump_data = header_jump_data( snapshot, - DisplayRow(scroll_position as u32), + DisplayRow(scroll_position.y as u32), FILE_HEADER_HEIGHT + MULTI_BUFFER_EXCERPT_HEADER_HEIGHT, excerpt, ); @@ -4358,15 +4430,15 @@ impl EditorElement { continue; } - let Some(display_row) = block.row.filter(|row| row.0 > scroll_position as u32) else { + let Some(display_row) = block.row.filter(|row| row.0 > scroll_position.y as u32) else { continue; }; let max_row = display_row.0.saturating_sub(FILE_HEADER_HEIGHT); - let offset = scroll_position - max_row as f32; + let offset = scroll_position.y - max_row as f64; if offset > 0.0 { - origin.y -= offset * line_height; + origin.y -= Pixels::from(offset * ScrollPixelOffset::from(line_height)); } break; } @@ -4388,7 +4460,7 @@ impl EditorElement { content_origin: gpui::Point, right_margin: Pixels, start_row: DisplayRow, - scroll_pixel_position: gpui::Point, + scroll_pixel_position: gpui::Point, line_layouts: &[LineWithInvisibles], cursor: DisplayPoint, cursor_point: Point, @@ -4443,12 +4515,18 @@ impl EditorElement { + gpui::Point { x: cmp::max( px(0.), - cursor_row_layout.x_for_index(cursor.column() as usize) - - scroll_pixel_position.x, + Pixels::from( + ScrollPixelOffset::from( + cursor_row_layout.x_for_index(cursor.column() as usize), + ) - scroll_pixel_position.x, + ), ), y: cmp::max( px(0.), - cursor.row().next_row().as_f32() * line_height - scroll_pixel_position.y, + Pixels::from( + cursor.row().next_row().as_f64() * ScrollPixelOffset::from(line_height) + - scroll_pixel_position.y, + ), ), }; @@ -4601,7 +4679,7 @@ impl EditorElement { text_hitbox: &Hitbox, content_origin: gpui::Point, right_margin: Pixels, - scroll_pixel_position: gpui::Point, + scroll_pixel_position: gpui::Point, gutter_overshoot: Pixels, window: &mut Window, cx: &mut App, @@ -4620,7 +4698,10 @@ impl EditorElement { let target_position = content_origin + gpui::Point { x: -gutter_overshoot, - y: gutter_row.next_row().as_f32() * line_height - scroll_pixel_position.y, + y: Pixels::from( + gutter_row.next_row().as_f64() * ScrollPixelOffset::from(line_height) + - scroll_pixel_position.y, + ), }; let (min_height_in_lines, max_height_in_lines) = editor @@ -4986,7 +5067,7 @@ impl EditorElement { hitbox: &Hitbox, visible_display_row_range: Range, content_origin: gpui::Point, - scroll_pixel_position: gpui::Point, + scroll_pixel_position: gpui::Point, line_layouts: &[LineWithInvisibles], line_height: Pixels, em_width: Pixels, @@ -5027,9 +5108,12 @@ impl EditorElement { &line_layouts[position.row().minus(visible_display_row_range.start) as usize]; // Compute Hovered Point - let x = - hovered_row_layout.x_for_index(position.column() as usize) - scroll_pixel_position.x; - let y = position.row().as_f32() * line_height - scroll_pixel_position.y; + let x = hovered_row_layout.x_for_index(position.column() as usize) + - Pixels::from(scroll_pixel_position.x); + let y = Pixels::from( + position.row().as_f64() * ScrollPixelOffset::from(line_height) + - scroll_pixel_position.y, + ); let hovered_point = content_origin + point(x, y); let mut overall_height = Pixels::ZERO; @@ -5240,7 +5324,7 @@ impl EditorElement { newest_cursor_position: Option, line_height: Pixels, right_margin: Pixels, - scroll_pixel_position: gpui::Point, + scroll_pixel_position: gpui::Point, display_hunks: &[(DisplayDiffHunk, Option)], highlighted_rows: &BTreeMap, editor: Entity, @@ -5304,9 +5388,11 @@ impl EditorElement { .iter() .any(|p| p.is_some_and(|p| display_row_range.contains(&p.row()))) { - let y = display_row_range.start.as_f32() * line_height - + text_hitbox.bounds.top() - - scroll_pixel_position.y; + let y = (display_row_range.start.as_f64() + * ScrollPixelOffset::from(line_height) + + ScrollPixelOffset::from(text_hitbox.bounds.top()) + - scroll_pixel_position.y) + .into(); let mut element = render_diff_hunk_controls( display_row_range.start.0, @@ -5341,7 +5427,7 @@ impl EditorElement { &self, hitbox: &Hitbox, content_origin: gpui::Point, - scroll_pixel_position: gpui::Point, + scroll_pixel_position: gpui::Point, newest_selection_head: Option, start_row: DisplayRow, line_layouts: &[LineWithInvisibles], @@ -5388,8 +5474,10 @@ impl EditorElement { }; let target_x = cursor_row_layout.x_for_index(newest_selection_head.column() as usize) - - scroll_pixel_position.x; - let target_y = selection_row.as_f32() * line_height - scroll_pixel_position.y; + - Pixels::from(scroll_pixel_position.x); + let target_y = Pixels::from( + selection_row.as_f64() * ScrollPixelOffset::from(line_height) - scroll_pixel_position.y, + ); let target_point = content_origin + point(target_x, target_y); let actual_size = element.layout_as_root(Size::::default(), window, cx); @@ -5532,8 +5620,12 @@ impl EditorElement { origin: point( range.start, layout.hitbox.origin.y - + (start_row.as_f32() - scroll_top) - * layout.position_map.line_height, + + Pixels::from( + (start_row.as_f64() - scroll_top) + * ScrollPixelOffset::from( + layout.position_map.line_height, + ), + ), ), size: size( range.end - range.start, @@ -5560,8 +5652,10 @@ impl EditorElement { let origin = point( origin_x, layout.hitbox.origin.y - + (highlight_row_start.as_f32() - scroll_top) - * layout.position_map.line_height, + + Pixels::from( + (highlight_row_start.as_f64() - scroll_top) + * ScrollPixelOffset::from(layout.position_map.line_height), + ), ); let size = size( width, @@ -5658,7 +5752,7 @@ impl EditorElement { for indent_guide in indent_guides { let indent_accent_colors = cx.theme().accents().color_for_index(indent_guide.depth); - let settings = indent_guide.settings; + let settings = &indent_guide.settings; // TODO fixed for now, expose them through themes later const INDENT_AWARE_ALPHA: f32 = 0.2; @@ -5729,7 +5823,7 @@ impl EditorElement { } fn paint_line_numbers(&mut self, layout: &mut EditorLayout, window: &mut Window, cx: &mut App) { - let is_singleton = self.editor.read(cx).is_singleton(cx); + let is_singleton = self.editor.read(cx).buffer_kind(cx) == ItemBufferKind::Singleton; let line_height = layout.position_map.line_height; window.set_cursor_style(CursorStyle::Arrow, &layout.gutter_hitbox); @@ -5856,7 +5950,7 @@ impl EditorElement { hunk_bounds, corner_radii, flattened_unstaged_background_color, - Edges::all(Pixels(1.0)), + Edges::all(px(1.0)), flattened_background_color, BorderStyle::Solid, )); @@ -5877,12 +5971,14 @@ impl EditorElement { hunk: &DisplayDiffHunk, ) -> Bounds { let scroll_position = snapshot.scroll_position(); - let scroll_top = scroll_position.y * line_height; + let scroll_top = scroll_position.y * ScrollPixelOffset::from(line_height); let gutter_strip_width = Self::gutter_strip_width(line_height); match hunk { DisplayDiffHunk::Folded { display_row, .. } => { - let start_y = display_row.as_f32() * line_height - scroll_top; + let start_y = (display_row.as_f64() * ScrollPixelOffset::from(line_height) + - scroll_top) + .into(); let end_y = start_y + line_height; let highlight_origin = gutter_bounds.origin + point(px(0.), start_y); let highlight_size = size(gutter_strip_width, end_y - start_y); @@ -5896,8 +5992,10 @@ impl EditorElement { if status.is_deleted() && display_row_range.is_empty() { let row = display_row_range.start; - let offset = line_height / 2.; - let start_y = row.as_f32() * line_height - offset - scroll_top; + let offset = ScrollPixelOffset::from(line_height / 2.); + let start_y = + (row.as_f64() * ScrollPixelOffset::from(line_height) - offset - scroll_top) + .into(); let end_y = start_y + line_height; let width = (0.35 * line_height).floor(); @@ -5927,8 +6025,13 @@ impl EditorElement { }) .unwrap_or(end_row); - let start_y = start_row.as_f32() * line_height - scroll_top; - let end_y = end_row_in_current_excerpt.as_f32() * line_height - scroll_top; + let start_y = (start_row.as_f64() * ScrollPixelOffset::from(line_height) + - scroll_top) + .into(); + let end_y = Pixels::from( + end_row_in_current_excerpt.as_f64() * ScrollPixelOffset::from(line_height) + - scroll_top, + ); let highlight_origin = gutter_bounds.origin + point(px(0.), start_y); let highlight_size = size(gutter_strip_width, end_y - start_y); @@ -5993,7 +6096,7 @@ impl EditorElement { .unwrap_or_else(|| { matches!( ProjectSettings::get_global(cx).git.git_gutter, - Some(GitGutterSetting::TrackedFiles) + GitGutterSetting::TrackedFiles ) }); if show_git_gutter { @@ -6016,11 +6119,17 @@ impl EditorElement { }; let start_y = layout.gutter_hitbox.top() - + start_row.0 as f32 * layout.position_map.line_height - - layout.position_map.scroll_pixel_position.y; + + Pixels::from( + start_row.0 as f64 + * ScrollPixelOffset::from(layout.position_map.line_height) + - layout.position_map.scroll_pixel_position.y, + ); let end_y = layout.gutter_hitbox.top() - + (end_row.0 + 1) as f32 * layout.position_map.line_height - - layout.position_map.scroll_pixel_position.y; + + Pixels::from( + (end_row.0 + 1) as f64 + * ScrollPixelOffset::from(layout.position_map.line_height) + - layout.position_map.scroll_pixel_position.y, + ); let bounds = Bounds::from_corners( point(layout.gutter_hitbox.left(), start_y), point(layout.gutter_hitbox.left() + highlight_width, end_y), @@ -6386,7 +6495,10 @@ impl EditorElement { .contains(&old_position) { let position = editor.scroll_position(cx).apply_along(axis, |p| { - (p + (new_position - old_position) / *text_unit_size).max(0.) + (p + ScrollOffset::from( + (new_position - old_position) / *text_unit_size, + )) + .max(0.) }); editor.set_scroll_position(position, window, cx); } @@ -6479,7 +6591,7 @@ impl EditorElement { let position = editor .scroll_position(cx) - .apply_along(axis, |_| start_position as f32); + .apply_along(axis, |_| start_position as ScrollOffset); editor.set_scroll_position(position, window, cx); } else { @@ -6523,7 +6635,7 @@ impl EditorElement { cx: &mut App, ) { self.editor.update(cx, |editor, cx| { - if !editor.is_singleton(cx) + if editor.buffer_kind(cx) != ItemBufferKind::Singleton || !editor .scrollbar_marker_state .should_refresh(scrollbar_layout.hitbox.size) @@ -6543,11 +6655,11 @@ impl EditorElement { let scrollbar_size = scrollbar_layout.hitbox.size; let scrollbar_markers = cx .background_spawn(async move { - let max_point = snapshot.display_snapshot.buffer_snapshot.max_point(); + let max_point = snapshot.display_snapshot.buffer_snapshot().max_point(); let mut marker_quads = Vec::new(); if scrollbar_settings.git_diff { let marker_row_ranges = - snapshot.buffer_snapshot.diff_hunks().map(|hunk| { + snapshot.buffer_snapshot().diff_hunks().map(|hunk| { let start_display_row = MultiBufferPoint::new(hunk.row_range.start.0, 0) .to_display_point(&snapshot.display_snapshot) @@ -6625,7 +6737,7 @@ impl EditorElement { if scrollbar_settings.diagnostics != ScrollbarDiagnostics::None { let diagnostics = snapshot - .buffer_snapshot + .buffer_snapshot() .diagnostics_in_range::(Point::zero()..max_point) // Don't show diagnostics the user doesn't care about .filter(|diagnostic| { @@ -6725,8 +6837,10 @@ impl EditorElement { line_height: layout.position_map.line_height, corner_radius, start_y: layout.content_origin.y - + row_range.start.as_f32() * layout.position_map.line_height - - layout.position_map.scroll_pixel_position.y, + + Pixels::from( + (row_range.start.as_f64() - layout.position_map.scroll_position.y) + * ScrollOffset::from(layout.position_map.line_height), + ), lines: row_range .iter_rows() .map(|row| { @@ -6735,19 +6849,30 @@ impl EditorElement { HighlightedRangeLine { start_x: if row == range.start.row() { layout.content_origin.x - + line_layout.x_for_index(range.start.column() as usize) - - layout.position_map.scroll_pixel_position.x + + Pixels::from( + ScrollPixelOffset::from( + line_layout.x_for_index(range.start.column() as usize), + ) - layout.position_map.scroll_pixel_position.x, + ) } else { layout.content_origin.x - - layout.position_map.scroll_pixel_position.x + - Pixels::from(layout.position_map.scroll_pixel_position.x) }, end_x: if row == range.end.row() { layout.content_origin.x - + line_layout.x_for_index(range.end.column() as usize) - - layout.position_map.scroll_pixel_position.x + + Pixels::from( + ScrollPixelOffset::from( + line_layout.x_for_index(range.end.column() as usize), + ) - layout.position_map.scroll_pixel_position.x, + ) } else { - layout.content_origin.x + line_layout.width + line_end_overshoot - - layout.position_map.scroll_pixel_position.x + Pixels::from( + ScrollPixelOffset::from( + layout.content_origin.x + + line_layout.width + + line_end_overshoot, + ) - layout.position_map.scroll_pixel_position.x, + ) }, } }) @@ -6863,8 +6988,10 @@ impl EditorElement { } let minimap_axis = ScrollbarAxis::Vertical; - let pixels_per_line = (minimap_hitbox.size.height / layout.max_scroll_top) - .min(layout.minimap_line_height); + let pixels_per_line = Pixels::from( + ScrollPixelOffset::from(minimap_hitbox.size.height) / layout.max_scroll_top, + ) + .min(layout.minimap_line_height); let mut mouse_position = window.mouse_position(); @@ -6890,9 +7017,12 @@ impl EditorElement { { let position = editor.scroll_position(cx).apply_along(minimap_axis, |p| { - (p + (new_position - old_position) / pixels_per_line) - .max(0.) + (p + ScrollPixelOffset::from( + (new_position - old_position) / pixels_per_line, + )) + .max(0.) }); + editor.set_scroll_position(position, window, cx); } cx.stop_propagation(); @@ -6968,8 +7098,10 @@ impl EditorElement { .max(Pixels::ZERO); let scroll_offset = (layout.minimap_scroll_top - + top_position / layout.minimap_line_height) - .min(layout.max_scroll_top); + + ScrollPixelOffset::from( + top_position / layout.minimap_line_height, + )) + .min(layout.max_scroll_top); let scroll_position = editor .scroll_position(cx) @@ -7076,12 +7208,13 @@ impl EditorElement { }; let current_scroll_position = position_map.snapshot.scroll_position(); - let x = (current_scroll_position.x * max_glyph_advance - - (delta.x * scroll_sensitivity)) - / max_glyph_advance; - let y = (current_scroll_position.y * line_height - - (delta.y * scroll_sensitivity)) - / line_height; + let x = (current_scroll_position.x + * ScrollPixelOffset::from(max_glyph_advance) + - ScrollPixelOffset::from(delta.x * scroll_sensitivity)) + / ScrollPixelOffset::from(max_glyph_advance); + let y = (current_scroll_position.y * ScrollPixelOffset::from(line_height) + - ScrollPixelOffset::from(delta.y * scroll_sensitivity)) + / ScrollPixelOffset::from(line_height); let mut scroll_position = point(x, y).clamp(&point(0., 0.), &position_map.scroll_max); let forbid_vertical_scroll = editor.scroll_manager.forbid_vertical_scroll(); @@ -7288,13 +7421,61 @@ impl EditorElement { fn diff_hunk_hollow(status: DiffHunkStatus, cx: &mut App) -> bool { let unstaged = status.has_secondary_hunk(); - let unstaged_hollow = ProjectSettings::get_global(cx) - .git - .hunk_style - .is_some_and(|style| matches!(style, GitHunkStyleSetting::UnstagedHollow)); + let unstaged_hollow = matches!( + ProjectSettings::get_global(cx).git.hunk_style, + GitHunkStyleSetting::UnstagedHollow + ); unstaged == unstaged_hollow } + + #[cfg(debug_assertions)] + fn layout_debug_ranges( + selections: &mut Vec<(PlayerColor, Vec)>, + anchor_range: Range, + display_snapshot: &DisplaySnapshot, + cx: &App, + ) { + let theme = cx.theme(); + text::debug::GlobalDebugRanges::with_locked(|debug_ranges| { + if debug_ranges.ranges.is_empty() { + return; + } + let buffer_snapshot = &display_snapshot.buffer_snapshot(); + for (buffer, buffer_range, excerpt_id) in + buffer_snapshot.range_to_buffer_ranges(anchor_range) + { + let buffer_range = + buffer.anchor_after(buffer_range.start)..buffer.anchor_before(buffer_range.end); + selections.extend(debug_ranges.ranges.iter().flat_map(|debug_range| { + let player_color = theme + .players() + .color_for_participant(debug_range.occurrence_index as u32 + 1); + debug_range.ranges.iter().filter_map(move |range| { + if range.start.buffer_id != Some(buffer.remote_id()) { + return None; + } + let clipped_start = range.start.max(&buffer_range.start, buffer); + let clipped_end = range.end.min(&buffer_range.end, buffer); + let range = buffer_snapshot.anchor_in_excerpt(excerpt_id, clipped_start)? + ..buffer_snapshot.anchor_in_excerpt(excerpt_id, clipped_end)?; + let start = range.start.to_display_point(display_snapshot); + let end = range.end.to_display_point(display_snapshot); + let selection_layout = SelectionLayout { + head: start, + range: start..end, + cursor_shape: CursorShape::Bar, + is_newest: false, + is_local: false, + active_rows: start.row()..end.row(), + user_name: Some(SharedString::new(debug_range.value.clone())), + }; + Some((player_color, vec![selection_layout])) + }) + })); + } + }); + } } fn header_jump_data( @@ -7352,7 +7533,7 @@ fn prepaint_gutter_button( row: DisplayRow, line_height: Pixels, gutter_dimensions: &GutterDimensions, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, gutter_hitbox: &Hitbox, display_hunks: &[(DisplayDiffHunk, Option)], window: &mut Window, @@ -7392,7 +7573,8 @@ fn prepaint_gutter_button( - left_offset; x += available_width / 2.; - let mut y = row.as_f32() * line_height - scroll_pixel_position.y; + let mut y = + Pixels::from((row.as_f64() - scroll_position.y) * ScrollPixelOffset::from(line_height)); y += (line_height - indicator_size.height) / 2.; button.prepaint_as_root( @@ -7444,27 +7626,25 @@ fn render_blame_entry( blame: &Entity, blame_entry: BlameEntry, style: &EditorStyle, - last_used_color: &mut Option<(PlayerColor, Oid)>, + last_used_color: &mut Option<(Hsla, Oid)>, editor: Entity, workspace: Entity, buffer: BufferId, - renderer: Arc, + renderer: &dyn BlameRenderer, + window: &mut Window, cx: &mut App, ) -> Option { - let mut sha_color = cx - .theme() - .players() - .color_for_participant(blame_entry.sha.into()); + let index: u32 = blame_entry.sha.into(); + let mut sha_color = cx.theme().players().color_for_participant(index).cursor; // If the last color we used is the same as the one we get for this line, but // the commit SHAs are different, then we try again to get a different color. - match *last_used_color { - Some((color, sha)) if sha != blame_entry.sha && color.cursor == sha_color.cursor => { - let index: u32 = blame_entry.sha.into(); - sha_color = cx.theme().players().color_for_participant(index + 1); - } - _ => {} - }; + if let Some((color, sha)) = *last_used_color + && sha != blame_entry.sha + && color == sha_color + { + sha_color = cx.theme().players().color_for_participant(index + 1).cursor; + } last_used_color.replace((sha_color, blame_entry.sha)); let blame = blame.read(cx); @@ -7478,7 +7658,8 @@ fn render_blame_entry( workspace.downgrade(), editor, ix, - sha_color.cursor, + sha_color, + window, cx, ) } @@ -7557,7 +7738,7 @@ impl LineWithInvisibles { let text_runs: &[TextRun] = if segments.is_empty() { &styles } else { - &Self::split_runs_by_bg_segments(&styles, segments, min_contrast) + &Self::split_runs_by_bg_segments(&styles, segments, min_contrast, len) }; let shaped_line = window.text_system().shape_line( line.clone().into(), @@ -7644,7 +7825,7 @@ impl LineWithInvisibles { let text_runs = if segments.is_empty() { &styles } else { - &Self::split_runs_by_bg_segments(&styles, segments, min_contrast) + &Self::split_runs_by_bg_segments(&styles, segments, min_contrast, len) }; let shaped_line = window.text_system().shape_line( line.clone().into(), @@ -7743,9 +7924,10 @@ impl LineWithInvisibles { text_runs: &[TextRun], bg_segments: &[(Range, Hsla)], min_contrast: f32, + start_col_offset: usize, ) -> Vec { let mut output_runs: Vec = Vec::with_capacity(text_runs.len()); - let mut line_col = 0usize; + let mut line_col = start_col_offset; let mut segment_ix = 0usize; for text_run in text_runs.iter() { @@ -7815,15 +7997,17 @@ impl LineWithInvisibles { fn prepaint( &mut self, line_height: Pixels, - scroll_pixel_position: gpui::Point, + scroll_position: gpui::Point, + scroll_pixel_position: gpui::Point, row: DisplayRow, content_origin: gpui::Point, line_elements: &mut SmallVec<[AnyElement; 1]>, window: &mut Window, cx: &mut App, ) { - let line_y = line_height * (row.as_f32() - scroll_pixel_position.y / line_height); - let mut fragment_origin = content_origin + gpui::point(-scroll_pixel_position.x, line_y); + let line_y = f32::from(line_height) * Pixels::from(row.as_f64() - scroll_position.y); + let mut fragment_origin = + content_origin + gpui::point(Pixels::from(-scroll_pixel_position.x), line_y); for fragment in &mut self.fragments { match fragment { LineFragment::Text(line) => { @@ -7857,11 +8041,13 @@ impl LineWithInvisibles { cx: &mut App, ) { let line_height = layout.position_map.line_height; - let line_y = line_height - * (row.as_f32() - layout.position_map.scroll_pixel_position.y / line_height); + let line_y = line_height * (row.as_f64() - layout.position_map.scroll_position.y) as f32; - let mut fragment_origin = - content_origin + gpui::point(-layout.position_map.scroll_pixel_position.x, line_y); + let mut fragment_origin = content_origin + + gpui::point( + Pixels::from(-layout.position_map.scroll_pixel_position.x), + line_y, + ); for fragment in &self.fragments { match fragment { @@ -7898,11 +8084,13 @@ impl LineWithInvisibles { cx: &mut App, ) { let line_height = layout.position_map.line_height; - let line_y = line_height - * (row.as_f32() - layout.position_map.scroll_pixel_position.y / line_height); + let line_y = line_height * (row.as_f64() - layout.position_map.scroll_position.y) as f32; - let mut fragment_origin = - content_origin + gpui::point(-layout.position_map.scroll_pixel_position.x, line_y); + let mut fragment_origin = content_origin + + gpui::point( + Pixels::from(-layout.position_map.scroll_pixel_position.x), + line_y, + ); for fragment in &self.fragments { match fragment { @@ -7941,12 +8129,15 @@ impl LineWithInvisibles { } }; - let x_offset = self.x_for_index(token_offset); - let invisible_offset = - (layout.position_map.em_width - invisible_symbol.width).max(Pixels::ZERO) / 2.0; + let x_offset: ScrollPixelOffset = self.x_for_index(token_offset).into(); + let invisible_offset: ScrollPixelOffset = + ((layout.position_map.em_width - invisible_symbol.width).max(Pixels::ZERO) / 2.0) + .into(); let origin = content_origin + gpui::point( - x_offset + invisible_offset - layout.position_map.scroll_pixel_position.x, + Pixels::from( + x_offset + invisible_offset - layout.position_map.scroll_pixel_position.x, + ), line_y, ); @@ -8360,8 +8551,12 @@ impl Element for EditorElement { snapshot = self.editor.update(cx, |editor, cx| { editor.last_bounds = Some(bounds); editor.gutter_dimensions = gutter_dimensions; - editor.set_visible_line_count(bounds.size.height / line_height, window, cx); - editor.set_visible_column_count(editor_width / em_advance); + editor.set_visible_line_count( + (bounds.size.height / line_height) as f64, + window, + cx, + ); + editor.set_visible_column_count(f64::from(editor_width / em_advance)); if matches!( editor.mode, @@ -8406,8 +8601,8 @@ impl Element for EditorElement { let content_offset = point(editor_margins.gutter.margin, Pixels::ZERO); let content_origin = text_hitbox.origin + content_offset; - let height_in_lines = bounds.size.height / line_height; - let max_row = snapshot.max_point().row().as_f32(); + let height_in_lines = f64::from(bounds.size.height / line_height); + let max_row = snapshot.max_point().row().as_f64(); // The max scroll position for the top of the window let max_scroll_top = if matches!( @@ -8485,14 +8680,14 @@ impl Element for EditorElement { let start_anchor = if start_row == Default::default() { Anchor::min() } else { - snapshot.buffer_snapshot.anchor_before( + snapshot.buffer_snapshot().anchor_before( DisplayPoint::new(start_row, 0).to_offset(&snapshot, Bias::Left), ) }; let end_anchor = if end_row > max_row { Anchor::max() } else { - snapshot.buffer_snapshot.anchor_before( + snapshot.buffer_snapshot().anchor_before( DisplayPoint::new(end_row, 0).to_offset(&snapshot, Bias::Right), ) }; @@ -8592,25 +8787,26 @@ impl Element for EditorElement { .map(|editor| { editor.update(cx, |editor, cx| { let all_selections = editor.selections.all::(cx); - let selected_buffer_ids = if editor.is_singleton(cx) { - Vec::new() - } else { - let mut selected_buffer_ids = - Vec::with_capacity(all_selections.len()); - - for selection in all_selections { - for buffer_id in snapshot - .buffer_snapshot - .buffer_ids_for_range(selection.range()) - { - if selected_buffer_ids.last() != Some(&buffer_id) { - selected_buffer_ids.push(buffer_id); + let selected_buffer_ids = + if editor.buffer_kind(cx) == ItemBufferKind::Singleton { + Vec::new() + } else { + let mut selected_buffer_ids = + Vec::with_capacity(all_selections.len()); + + for selection in all_selections { + for buffer_id in snapshot + .buffer_snapshot() + .buffer_ids_for_range(selection.range()) + { + if selected_buffer_ids.last() != Some(&buffer_id) { + selected_buffer_ids.push(buffer_id); + } } } - } - selected_buffer_ids - }; + selected_buffer_ids + }; let mut selections = editor .selections @@ -8780,13 +8976,9 @@ impl Element for EditorElement { }) .flatten()?; let mut element = render_inline_blame_entry(blame_entry, style, cx)?; - let inline_blame_padding = ProjectSettings::get_global(cx) - .git - .inline_blame - .unwrap_or_default() - .padding - as f32 - * em_advance; + let inline_blame_padding = + ProjectSettings::get_global(cx).git.inline_blame.padding as f32 + * em_advance; Some( element .layout_as_root(AvailableSpace::min_size(), window, cx) @@ -8810,14 +9002,17 @@ impl Element for EditorElement { let scrollbar_layout_information = ScrollbarLayoutInformation::new( text_hitbox.bounds, glyph_grid_cell, - size(longest_line_width, max_row.as_f32() * line_height), + size( + longest_line_width, + Pixels::from(max_row.as_f64() * f64::from(line_height)), + ), longest_line_blame_width, EditorSettings::get_global(cx), ); let mut scroll_width = scrollbar_layout_information.scroll_range.width; - let sticky_header_excerpt = if snapshot.buffer_snapshot.show_headers() { + let sticky_header_excerpt = if snapshot.buffer_snapshot().show_headers() { snapshot.sticky_header_excerpt(scroll_position.y) } else { None @@ -8868,7 +9063,7 @@ impl Element for EditorElement { window.with_element_namespace("blocks", |window| { self.layout_sticky_buffer_header( sticky_header_excerpt, - scroll_position.y, + scroll_position, line_height, right_margin, &snapshot, @@ -8882,12 +9077,14 @@ impl Element for EditorElement { }); let start_buffer_row = - MultiBufferRow(start_anchor.to_point(&snapshot.buffer_snapshot).row); + MultiBufferRow(start_anchor.to_point(&snapshot.buffer_snapshot()).row); let end_buffer_row = - MultiBufferRow(end_anchor.to_point(&snapshot.buffer_snapshot).row); + MultiBufferRow(end_anchor.to_point(&snapshot.buffer_snapshot()).row); - let scroll_max = point( - ((scroll_width - editor_width) / em_advance).max(0.0), + let scroll_max: gpui::Point = point( + ScrollPixelOffset::from( + ((scroll_width - editor_width) / em_advance).max(0.0), + ), max_scroll_top, ); @@ -8913,8 +9110,8 @@ impl Element for EditorElement { }); let scroll_pixel_position = point( - scroll_position.x * em_advance, - scroll_position.y * line_height, + scroll_position.x * f64::from(em_advance), + scroll_position.y * f64::from(line_height), ); let indent_guides = self.layout_indent_guides( content_origin, @@ -8954,6 +9151,7 @@ impl Element for EditorElement { scroll_position.y + height_in_lines, &line_layouts, line_height, + scroll_position, scroll_pixel_position, newest_selection_head, editor_width, @@ -8969,6 +9167,7 @@ impl Element for EditorElement { &crease_trailers, &row_block_types, content_origin, + scroll_position, scroll_pixel_position, edit_prediction_popover_origin, start_row, @@ -8990,6 +9189,7 @@ impl Element for EditorElement { inline_code_actions = self.layout_inline_code_actions( newest_selection_head, content_origin, + scroll_position, scroll_pixel_position, line_height, &snapshot, @@ -9011,6 +9211,7 @@ impl Element for EditorElement { crease_trailer_layout, em_width, content_origin, + scroll_position, scroll_pixel_position, line_height, &text_hitbox, @@ -9050,6 +9251,7 @@ impl Element for EditorElement { start_row, &mut line_layouts, line_height, + scroll_position, scroll_pixel_position, content_origin, window, @@ -9061,6 +9263,7 @@ impl Element for EditorElement { &mut blocks, &hitbox, line_height, + scroll_position, scroll_pixel_position, window, cx, @@ -9147,7 +9350,7 @@ impl Element for EditorElement { line_height, start_row..end_row, &row_infos, - scroll_pixel_position, + scroll_position, &gutter_dimensions, &gutter_hitbox, &display_hunks, @@ -9167,7 +9370,7 @@ impl Element for EditorElement { self.layout_breakpoints( line_height, start_row..end_row, - scroll_pixel_position, + scroll_position, &gutter_dimensions, &gutter_hitbox, &display_hunks, @@ -9268,7 +9471,7 @@ impl Element for EditorElement { .language_settings(cx) .whitespace_map; - let tab_char = whitespace_map.tab(); + let tab_char = whitespace_map.tab.clone(); let tab_len = tab_char.len(); let tab_invisible = window.text_system().shape_line( tab_char, @@ -9284,7 +9487,7 @@ impl Element for EditorElement { None, ); - let space_char = whitespace_map.space(); + let space_char = whitespace_map.space.clone(); let space_len = space_char.len(); let space_invisible = window.text_system().shape_line( space_char, @@ -9324,6 +9527,7 @@ impl Element for EditorElement { let position_map = Rc::new(PositionMap { size: bounds.size, visible_row_range, + scroll_position, scroll_pixel_position, scroll_max, line_layouts, @@ -9500,7 +9704,7 @@ impl ScrollbarLayoutInformation { ScrollBeyondLastLine::OnePage => editor_bounds.size.height, ScrollBeyondLastLine::Off => glyph_grid_cell.height, ScrollBeyondLastLine::VerticalScrollMargin => { - (1.0 + settings.vertical_scroll_margin) * glyph_grid_cell.height + (1.0 + settings.vertical_scroll_margin) as f32 * glyph_grid_cell.height } }; @@ -9616,7 +9820,7 @@ impl EditorScrollbars { show_scrollbar: ScrollbarAxes, layout_information: &ScrollbarLayoutInformation, content_offset: gpui::Point, - scroll_position: gpui::Point, + scroll_position: gpui::Point, scrollbar_width: Pixels, right_margin: Pixels, editor_width: Pixels, @@ -9638,7 +9842,7 @@ impl EditorScrollbars { editor_bounds.bottom_left(), size( // The horizontal viewport size differs from the space available for the - // horizontal scrollbar, so we have to manually stich it together here. + // horizontal scrollbar, so we have to manually stitch it together here. editor_bounds.size.width - right_margin, scrollbar_width, ), @@ -9700,7 +9904,7 @@ impl EditorScrollbars { #[derive(Clone)] struct ScrollbarLayout { hitbox: Hitbox, - visible_range: Range, + visible_range: Range, text_unit_size: Pixels, thumb_bounds: Option>, thumb_state: ScrollbarThumbState, @@ -9718,7 +9922,7 @@ impl ScrollbarLayout { scroll_range: Pixels, glyph_space: Pixels, content_offset: Pixels, - scroll_position: f32, + scroll_position: ScrollOffset, show_thumb: bool, axis: ScrollbarAxis, ) -> Self { @@ -9731,9 +9935,9 @@ impl ScrollbarLayout { scrollbar_track_hitbox, track_length, viewport_size, - scroll_range, + scroll_range.into(), glyph_space, - content_offset, + content_offset.into(), scroll_position, show_thumb, axis, @@ -9742,11 +9946,11 @@ impl ScrollbarLayout { fn for_minimap( minimap_track_hitbox: Hitbox, - visible_lines: f32, - total_editor_lines: f32, + visible_lines: f64, + total_editor_lines: f64, minimap_line_height: Pixels, - scroll_position: f32, - minimap_scroll_top: f32, + scroll_position: ScrollOffset, + minimap_scroll_top: ScrollOffset, show_thumb: bool, ) -> Self { // The scrollbar thumb size is calculated as @@ -9763,15 +9967,15 @@ impl ScrollbarLayout { // This approach ensures that the minimap thumb accurately reflects the // editor's current scroll position whilst nicely synchronizing the minimap // thumb and scrollbar thumb. - let scroll_range = total_editor_lines * minimap_line_height; - let viewport_size = visible_lines * minimap_line_height; + let scroll_range = total_editor_lines * f64::from(minimap_line_height); + let viewport_size = visible_lines * f64::from(minimap_line_height); - let track_top_offset = -minimap_scroll_top * minimap_line_height; + let track_top_offset = -minimap_scroll_top * f64::from(minimap_line_height); Self::new_with_hitbox_and_track_length( minimap_track_hitbox, - scroll_range, - viewport_size, + Pixels::from(scroll_range), + Pixels::from(viewport_size), scroll_range, minimap_line_height, track_top_offset, @@ -9785,19 +9989,19 @@ impl ScrollbarLayout { scrollbar_track_hitbox: Hitbox, track_length: Pixels, viewport_size: Pixels, - scroll_range: Pixels, + scroll_range: f64, glyph_space: Pixels, - content_offset: Pixels, - scroll_position: f32, + content_offset: ScrollOffset, + scroll_position: ScrollOffset, show_thumb: bool, axis: ScrollbarAxis, ) -> Self { - let text_units_per_page = viewport_size / glyph_space; + let text_units_per_page = f64::from(viewport_size / glyph_space); let visible_range = scroll_position..scroll_position + text_units_per_page; - let total_text_units = scroll_range / glyph_space; + let total_text_units = scroll_range / f64::from(glyph_space); let thumb_percentage = text_units_per_page / total_text_units; - let thumb_size = (track_length * thumb_percentage) + let thumb_size = Pixels::from(ScrollOffset::from(track_length) * thumb_percentage) .max(ScrollbarLayout::MIN_THUMB_SIZE) .min(track_length); @@ -9806,7 +10010,7 @@ impl ScrollbarLayout { let content_larger_than_viewport = text_unit_divisor > 0.; let text_unit_size = if content_larger_than_viewport { - (track_length - thumb_size) / text_unit_divisor + Pixels::from(ScrollOffset::from(track_length - thumb_size) / text_unit_divisor) } else { glyph_space }; @@ -9844,14 +10048,17 @@ impl ScrollbarLayout { fn thumb_bounds( scrollbar_track: &Hitbox, - content_offset: Pixels, - visible_range_start: f32, + content_offset: f64, + visible_range_start: f64, text_unit_size: Pixels, thumb_size: Pixels, axis: ScrollbarAxis, ) -> Bounds { let thumb_origin = scrollbar_track.origin.apply_along(axis, |origin| { - origin + content_offset + visible_range_start * text_unit_size + origin + + Pixels::from( + content_offset + visible_range_start * ScrollOffset::from(text_unit_size), + ) }); Bounds::new( thumb_origin, @@ -9874,7 +10081,7 @@ impl ScrollbarLayout { max: Pixels, } let (x_range, height_limit) = if let Some(column) = column { - let column_width = px(((self.hitbox.size.width - Self::BORDER_WIDTH).0 / 3.0).floor()); + let column_width = ((self.hitbox.size.width - Self::BORDER_WIDTH) / 3.0).floor(); let start = Self::BORDER_WIDTH + (column as f32 * column_width); let end = start + column_width; ( @@ -9897,7 +10104,7 @@ impl ScrollbarLayout { ) }; - let row_to_y = |row: DisplayRow| row.as_f32() * self.text_unit_size; + let row_to_y = |row: DisplayRow| row.as_f64() as f32 * self.text_unit_size; let mut pixel_ranges = row_ranges .into_iter() .map(|range| { @@ -9949,10 +10156,10 @@ impl ScrollbarLayout { struct MinimapLayout { pub minimap: AnyElement, pub thumb_layout: ScrollbarLayout, - pub minimap_scroll_top: f32, + pub minimap_scroll_top: ScrollOffset, pub minimap_line_height: Pixels, pub thumb_border_style: MinimapThumbBorder, - pub max_scroll_top: f32, + pub max_scroll_top: ScrollOffset, } impl MinimapLayout { @@ -9963,11 +10170,11 @@ impl MinimapLayout { /// Calculates the scroll top offset the minimap editor has to have based on the /// current scroll progress. fn calculate_minimap_top_offset( - document_lines: f32, - visible_editor_lines: f32, - visible_minimap_lines: f32, - scroll_position: f32, - ) -> f32 { + document_lines: f64, + visible_editor_lines: f64, + visible_minimap_lines: f64, + scroll_position: f64, + ) -> ScrollOffset { let non_visible_document_lines = (document_lines - visible_editor_lines).max(0.); if non_visible_document_lines == 0. { 0. @@ -9986,8 +10193,9 @@ struct CreaseTrailerLayout { pub(crate) struct PositionMap { pub size: Size, pub line_height: Pixels, - pub scroll_pixel_position: gpui::Point, - pub scroll_max: gpui::Point, + pub scroll_position: gpui::Point, + pub scroll_pixel_position: gpui::Point, + pub scroll_max: gpui::Point, pub em_width: Pixels, pub em_advance: Pixels, pub visible_row_range: Range, @@ -10051,8 +10259,8 @@ impl PositionMap { let scroll_position = self.snapshot.scroll_position(); let position = position - text_bounds.origin; let y = position.y.max(px(0.)).min(self.size.height); - let x = position.x + (scroll_position.x * self.em_advance); - let row = ((y / self.line_height) + scroll_position.y) as u32; + let x = position.x + (scroll_position.x as f32 * self.em_advance); + let row = ((y / self.line_height) as f64 + scroll_position.y) as u32; let (column, x_overshoot_after_line_end) = if let Some(line) = self .line_layouts @@ -10982,7 +11190,7 @@ mod tests { ) -> Vec { info!( "Creating editor with mode {editor_mode:?}, width {}px and text '{input_text}'", - editor_width.0 + f32::from(editor_width) ); let window = cx.add_window(|window, cx| { let buffer = MultiBuffer::build_simple(input_text, cx); @@ -11199,102 +11407,143 @@ mod tests { fn test_split_runs_by_bg_segments(cx: &mut gpui::TestAppContext) { init_test(cx, |_| {}); + let dx = |start: u32, end: u32| { + DisplayPoint::new(DisplayRow(0), start)..DisplayPoint::new(DisplayRow(0), end) + }; + let text_color = Hsla { h: 210.0, s: 0.1, l: 0.4, a: 1.0, }; - let bg1 = Hsla { + let bg_1 = Hsla { h: 30.0, s: 0.6, l: 0.8, a: 1.0, }; - let bg2 = Hsla { + let bg_2 = Hsla { h: 200.0, s: 0.6, l: 0.2, a: 1.0, }; let min_contrast = 45.0; + let adjusted_bg1 = ensure_minimum_contrast(text_color, bg_1, min_contrast); + let adjusted_bg2 = ensure_minimum_contrast(text_color, bg_2, min_contrast); // Case A: single run; disjoint segments inside the run - let runs = vec![generate_test_run(20, text_color)]; - let segs = vec![ - ( - DisplayPoint::new(DisplayRow(0), 5)..DisplayPoint::new(DisplayRow(0), 10), - bg1, - ), - ( - DisplayPoint::new(DisplayRow(0), 12)..DisplayPoint::new(DisplayRow(0), 16), - bg2, - ), - ]; - let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast); - // Expected slices: [0,5) [5,10) [10,12) [12,16) [16,20) - assert_eq!( - out.iter().map(|r| r.len).collect::>(), - vec![5, 5, 2, 4, 4] - ); - assert_eq!(out[0].color, text_color); - assert_eq!( - out[1].color, - ensure_minimum_contrast(text_color, bg1, min_contrast) - ); - assert_eq!(out[2].color, text_color); - assert_eq!( - out[3].color, - ensure_minimum_contrast(text_color, bg2, min_contrast) - ); - assert_eq!(out[4].color, text_color); + { + let runs = vec![generate_test_run(20, text_color)]; + let segs = vec![(dx(5, 10), bg_1), (dx(12, 16), bg_2)]; + let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast, 0); + // Expected slices: [0,5) [5,10) [10,12) [12,16) [16,20) + assert_eq!( + out.iter().map(|r| r.len).collect::>(), + vec![5, 5, 2, 4, 4] + ); + assert_eq!(out[0].color, text_color); + assert_eq!(out[1].color, adjusted_bg1); + assert_eq!(out[2].color, text_color); + assert_eq!(out[3].color, adjusted_bg2); + assert_eq!(out[4].color, text_color); + } // Case B: multiple runs; segment extends to end of line (u32::MAX) - let runs = vec![ - generate_test_run(8, text_color), - generate_test_run(7, text_color), - ]; - let segs = vec![( - DisplayPoint::new(DisplayRow(0), 6)..DisplayPoint::new(DisplayRow(0), u32::MAX), - bg1, - )]; - let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast); - // Expected slices across runs: [0,6) [6,8) | [0,7) - assert_eq!(out.iter().map(|r| r.len).collect::>(), vec![6, 2, 7]); - let adjusted = ensure_minimum_contrast(text_color, bg1, min_contrast); - assert_eq!(out[0].color, text_color); - assert_eq!(out[1].color, adjusted); - assert_eq!(out[2].color, adjusted); + { + let runs = vec![ + generate_test_run(8, text_color), + generate_test_run(7, text_color), + ]; + let segs = vec![(dx(6, u32::MAX), bg_1)]; + let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast, 0); + // Expected slices across runs: [0,6) [6,8) | [0,7) + assert_eq!(out.iter().map(|r| r.len).collect::>(), vec![6, 2, 7]); + assert_eq!(out[0].color, text_color); + assert_eq!(out[1].color, adjusted_bg1); + assert_eq!(out[2].color, adjusted_bg1); + } // Case C: multi-byte characters - // for text: "Hello 🌍 世界!" - let runs = vec![ - generate_test_run(5, text_color), // "Hello" - generate_test_run(6, text_color), // " 🌍 " - generate_test_run(6, text_color), // "世界" - generate_test_run(1, text_color), // "!" - ]; - // selecting "🌍 世" - let segs = vec![( - DisplayPoint::new(DisplayRow(0), 6)..DisplayPoint::new(DisplayRow(0), 14), - bg1, - )]; - let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast); - // "Hello" | " " | "🌍 " | "世" | "界" | "!" - assert_eq!( - out.iter().map(|r| r.len).collect::>(), - vec![5, 1, 5, 3, 3, 1] - ); - assert_eq!(out[0].color, text_color); // "Hello" - assert_eq!( - out[2].color, - ensure_minimum_contrast(text_color, bg1, min_contrast) - ); // "🌍 " - assert_eq!( - out[3].color, - ensure_minimum_contrast(text_color, bg1, min_contrast) - ); // "世" - assert_eq!(out[4].color, text_color); // "界" - assert_eq!(out[5].color, text_color); // "!" + { + // for text: "Hello 🌍 世界!" + let runs = vec![ + generate_test_run(5, text_color), // "Hello" + generate_test_run(6, text_color), // " 🌍 " + generate_test_run(6, text_color), // "世界" + generate_test_run(1, text_color), // "!" + ]; + // selecting "🌍 世" + let segs = vec![(dx(6, 14), bg_1)]; + let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast, 0); + // "Hello" | " " | "🌍 " | "世" | "界" | "!" + assert_eq!( + out.iter().map(|r| r.len).collect::>(), + vec![5, 1, 5, 3, 3, 1] + ); + assert_eq!(out[0].color, text_color); // "Hello" + assert_eq!(out[2].color, adjusted_bg1); // "🌍 " + assert_eq!(out[3].color, adjusted_bg1); // "世" + assert_eq!(out[4].color, text_color); // "界" + assert_eq!(out[5].color, text_color); // "!" + } + + // Case D: split multiple consecutive text runs with segments + { + let segs = vec![ + (dx(2, 4), bg_1), // selecting "cd" + (dx(4, 8), bg_2), // selecting "efgh" + (dx(9, 11), bg_1), // selecting "jk" + (dx(12, 16), bg_2), // selecting "mnop" + (dx(18, 19), bg_1), // selecting "s" + ]; + + // for text: "abcdef" + let runs = vec![ + generate_test_run(2, text_color), // ab + generate_test_run(4, text_color), // cdef + ]; + let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast, 0); + // new splits "ab", "cd", "ef" + assert_eq!(out.iter().map(|r| r.len).collect::>(), vec![2, 2, 2]); + assert_eq!(out[0].color, text_color); + assert_eq!(out[1].color, adjusted_bg1); + assert_eq!(out[2].color, adjusted_bg2); + + // for text: "ghijklmn" + let runs = vec![ + generate_test_run(3, text_color), // ghi + generate_test_run(2, text_color), // jk + generate_test_run(3, text_color), // lmn + ]; + let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast, 6); // 2 + 4 from first run + // new splits "gh", "i", "jk", "l", "mn" + assert_eq!( + out.iter().map(|r| r.len).collect::>(), + vec![2, 1, 2, 1, 2] + ); + assert_eq!(out[0].color, adjusted_bg2); + assert_eq!(out[1].color, text_color); + assert_eq!(out[2].color, adjusted_bg1); + assert_eq!(out[3].color, text_color); + assert_eq!(out[4].color, adjusted_bg2); + + // for text: "opqrs" + let runs = vec![ + generate_test_run(1, text_color), // o + generate_test_run(4, text_color), // pqrs + ]; + let out = LineWithInvisibles::split_runs_by_bg_segments(&runs, &segs, min_contrast, 14); // 6 + 3 + 2 + 3 from first two runs + // new splits "o", "p", "qr", "s" + assert_eq!( + out.iter().map(|r| r.len).collect::>(), + vec![1, 1, 2, 1] + ); + assert_eq!(out[0].color, adjusted_bg2); + assert_eq!(out[1].color, adjusted_bg2); + assert_eq!(out[2].color, text_color); + assert_eq!(out[3].color, adjusted_bg1); + } } } diff --git a/crates/editor/src/git/blame.rs b/crates/editor/src/git/blame.rs index 51719048ef81cf273bc58e7d810d66d454a04805..836b61d56674f070abc13dbf6c67981c78818ff6 100644 --- a/crates/editor/src/git/blame.rs +++ b/crates/editor/src/git/blame.rs @@ -38,29 +38,27 @@ pub struct GitBlameEntrySummary { impl sum_tree::Item for GitBlameEntry { type Summary = GitBlameEntrySummary; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { GitBlameEntrySummary { rows: self.rows } } } -impl sum_tree::Summary for GitBlameEntrySummary { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl sum_tree::ContextLessSummary for GitBlameEntrySummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _cx: &()) { + fn add_summary(&mut self, summary: &Self) { self.rows += summary.rows; } } impl<'a> sum_tree::Dimension<'a, GitBlameEntrySummary> for u32 { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a GitBlameEntrySummary, _cx: &()) { + fn add_summary(&mut self, summary: &'a GitBlameEntrySummary, _cx: ()) { *self += summary.rows; } } @@ -97,6 +95,7 @@ pub trait BlameRenderer { _: Entity, _: usize, _: Hsla, + window: &mut Window, _: &mut App, ) -> Option; @@ -144,6 +143,7 @@ impl BlameRenderer for () { _: Entity, _: usize, _: Hsla, + _: &mut Window, _: &mut App, ) -> Option { None @@ -298,7 +298,7 @@ impl GitBlame { self.sync(cx, buffer_id); let buffer_row = info.buffer_row?; - let mut cursor = self.buffers.get(&buffer_id)?.entries.cursor::(&()); + let mut cursor = self.buffers.get(&buffer_id)?.entries.cursor::(()); cursor.seek_forward(&buffer_row, Bias::Right); Some((buffer_id, cursor.item()?.blame.clone()?)) }) @@ -406,7 +406,7 @@ impl GitBlame { .peekable(); let mut new_entries = SumTree::default(); - let mut cursor = blame_buffer.entries.cursor::(&()); + let mut cursor = blame_buffer.entries.cursor::(()); while let Some(mut edit) = row_edits.next() { while let Some(next_edit) = row_edits.peek() { @@ -419,7 +419,7 @@ impl GitBlame { } } - new_entries.append(cursor.slice(&edit.old.start, Bias::Right), &()); + new_entries.append(cursor.slice(&edit.old.start, Bias::Right), ()); if edit.new.start > new_entries.summary().rows { new_entries.push( @@ -427,7 +427,7 @@ impl GitBlame { rows: edit.new.start - new_entries.summary().rows, blame: cursor.item().and_then(|entry| entry.blame.clone()), }, - &(), + (), ); } @@ -438,7 +438,7 @@ impl GitBlame { rows: edit.new.len() as u32, blame: None, }, - &(), + (), ); } @@ -454,14 +454,14 @@ impl GitBlame { rows: cursor.end() - edit.old.end, blame: entry.blame.clone(), }, - &(), + (), ); } cursor.next(); } } - new_entries.append(cursor.suffix(), &()); + new_entries.append(cursor.suffix(), ()); drop(cursor); blame_buffer.buffer_snapshot = new_snapshot; @@ -632,7 +632,7 @@ fn build_blame_entry_sum_tree(entries: Vec, max_row: u32) -> SumTree current_row = entry.range.end; entries }), - &(), + (), ); if max_row >= current_row { @@ -641,7 +641,7 @@ fn build_blame_entry_sum_tree(entries: Vec, max_row: u32) -> SumTree rows: (max_row + 1) - current_row, blame: None, }, - &(), + (), ); } @@ -675,8 +675,8 @@ async fn parse_commit_messages( .as_ref() .map(|(provider, remote)| GitRemote { host: provider.clone(), - owner: remote.owner.to_string(), - repo: remote.repo.to_string(), + owner: remote.owner.clone().into(), + repo: remote.repo.clone().into(), }); let pull_request = parsed_remote_url @@ -700,6 +700,7 @@ async fn parse_commit_messages( #[cfg(test)] mod tests { use super::*; + use git::repository::repo_path; use gpui::Context; use language::{Point, Rope}; use project::FakeFs; @@ -852,7 +853,7 @@ mod tests { fs.set_blame_for_repo( Path::new("/my-repo/.git"), vec![( - "file.txt".into(), + repo_path("file.txt"), Blame { entries: vec![ blame_entry("1b1b1b", 0..1), @@ -969,7 +970,7 @@ mod tests { fs.set_blame_for_repo( Path::new(path!("/my-repo/.git")), vec![( - "file.txt".into(), + repo_path("file.txt"), Blame { entries: vec![blame_entry("1b1b1b", 0..4)], ..Default::default() @@ -1137,7 +1138,7 @@ mod tests { fs.set_blame_for_repo( Path::new(path!("/my-repo/.git")), vec![( - "file.txt".into(), + repo_path("file.txt"), Blame { entries: blame_entries, ..Default::default() @@ -1180,7 +1181,7 @@ mod tests { fs.set_blame_for_repo( Path::new(path!("/my-repo/.git")), vec![( - "file.txt".into(), + repo_path("file.txt"), Blame { entries: blame_entries, ..Default::default() diff --git a/crates/editor/src/highlight_matching_bracket.rs b/crates/editor/src/highlight_matching_bracket.rs index aa4e616924ad6bd47627bfd95e9a5c58587afc25..da0f847fe10b7365ac3f4686d183a5d83d17e73a 100644 --- a/crates/editor/src/highlight_matching_bracket.rs +++ b/crates/editor/src/highlight_matching_bracket.rs @@ -1,45 +1,46 @@ use crate::{Editor, RangeToAnchorExt}; -use gpui::{Context, HighlightStyle, Window}; +use gpui::{Context, HighlightStyle}; use language::CursorShape; +use multi_buffer::ToOffset; use theme::ActiveTheme; enum MatchingBracketHighlight {} -pub fn refresh_matching_bracket_highlights( - editor: &mut Editor, - window: &mut Window, - cx: &mut Context, -) { +pub fn refresh_matching_bracket_highlights(editor: &mut Editor, cx: &mut Context) { editor.clear_highlights::(cx); - let newest_selection = editor.selections.newest::(cx); + let buffer_snapshot = editor.buffer.read(cx).snapshot(cx); + let newest_selection = editor + .selections + .newest_anchor() + .map(|anchor| anchor.to_offset(&buffer_snapshot)); // Don't highlight brackets if the selection isn't empty if !newest_selection.is_empty() { return; } - let snapshot = editor.snapshot(window, cx); let head = newest_selection.head(); - if head > snapshot.buffer_snapshot.len() { + if head > buffer_snapshot.len() { log::error!("bug: cursor offset is out of range while refreshing bracket highlights"); return; } let mut tail = head; if (editor.cursor_shape == CursorShape::Block || editor.cursor_shape == CursorShape::Hollow) - && head < snapshot.buffer_snapshot.len() + && head < buffer_snapshot.len() { - tail += 1; + if let Some(tail_ch) = buffer_snapshot.chars_at(tail).next() { + tail += tail_ch.len_utf8(); + } } - if let Some((opening_range, closing_range)) = snapshot - .buffer_snapshot - .innermost_enclosing_bracket_ranges(head..tail, None) + if let Some((opening_range, closing_range)) = + buffer_snapshot.innermost_enclosing_bracket_ranges(head..tail, None) { editor.highlight_text::( vec![ - opening_range.to_anchors(&snapshot.buffer_snapshot), - closing_range.to_anchors(&snapshot.buffer_snapshot), + opening_range.to_anchors(&buffer_snapshot), + closing_range.to_anchors(&buffer_snapshot), ], HighlightStyle { background_color: Some( diff --git a/crates/editor/src/hover_links.rs b/crates/editor/src/hover_links.rs index ba0b6f88683969aca3818a2795aa6b8454de3bb8..d2073633dd149f9536838732f25ee89aa630a57c 100644 --- a/crates/editor/src/hover_links.rs +++ b/crates/editor/src/hover_links.rs @@ -1,6 +1,7 @@ use crate::{ Anchor, Editor, EditorSettings, EditorSnapshot, FindAllReferences, GoToDefinition, - GoToTypeDefinition, GotoDefinitionKind, InlayId, Navigated, PointForPosition, SelectPhase, + GoToDefinitionSplit, GoToTypeDefinition, GoToTypeDefinitionSplit, GotoDefinitionKind, InlayId, + Navigated, PointForPosition, SelectPhase, editor_settings::GoToDefinitionFallback, hover_popover::{self, InlayHover}, scroll::ScrollAmount, @@ -48,8 +49,8 @@ impl RangeInEditor { ) -> bool { match (self, trigger_point) { (Self::Text(range), TriggerPoint::Text(point)) => { - let point_after_start = range.start.cmp(point, &snapshot.buffer_snapshot).is_le(); - point_after_start && range.end.cmp(point, &snapshot.buffer_snapshot).is_ge() + let point_after_start = range.start.cmp(point, &snapshot.buffer_snapshot()).is_le(); + point_after_start && range.end.cmp(point, &snapshot.buffer_snapshot()).is_ge() } (Self::Inlay(highlight), TriggerPoint::InlayHint(point, _, _)) => { highlight.inlay == point.inlay @@ -130,7 +131,7 @@ impl Editor { Some(point) => { let trigger_point = TriggerPoint::Text( snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(point.to_offset(&snapshot.display_snapshot, Bias::Left)), ); @@ -266,10 +267,13 @@ impl Editor { ); let navigate_task = if point.as_valid().is_some() { - if modifiers.shift { - self.go_to_type_definition(&GoToTypeDefinition, window, cx) - } else { - self.go_to_definition(&GoToDefinition, window, cx) + match (modifiers.shift, modifiers.alt) { + (true, true) => { + self.go_to_type_definition_split(&GoToTypeDefinitionSplit, window, cx) + } + (true, false) => self.go_to_type_definition(&GoToTypeDefinition, window, cx), + (false, true) => self.go_to_definition_split(&GoToDefinitionSplit, window, cx), + (false, false) => self.go_to_definition(&GoToDefinition, window, cx), } } else { Task::ready(Ok(Navigated::No)) @@ -297,14 +301,10 @@ pub fn update_inlay_link_and_hover_points( let mut hover_updated = false; if let Some(hovered_offset) = hovered_offset { let buffer_snapshot = editor.buffer().read(cx).snapshot(cx); - let previous_valid_anchor = buffer_snapshot.anchor_at( - point_for_position.previous_valid.to_point(snapshot), - Bias::Left, - ); - let next_valid_anchor = buffer_snapshot.anchor_at( - point_for_position.next_valid.to_point(snapshot), - Bias::Right, - ); + let previous_valid_anchor = + buffer_snapshot.anchor_before(point_for_position.previous_valid.to_point(snapshot)); + let next_valid_anchor = + buffer_snapshot.anchor_after(point_for_position.next_valid.to_point(snapshot)); if let Some(hovered_hint) = editor .visible_inlay_hints(cx) .into_iter() @@ -326,7 +326,7 @@ pub fn update_inlay_link_and_hover_points( match cached_hint.resolve_state { ResolveState::CanResolve(_, _) => { if let Some(buffer_id) = snapshot - .buffer_snapshot + .buffer_snapshot() .buffer_id_for_anchor(previous_valid_anchor) { inlay_hint_cache.spawn_hint_resolve( @@ -370,7 +370,7 @@ pub fn update_inlay_link_and_hover_points( inlay: hovered_hint.id, inlay_position: hovered_hint.position, range: extra_shift_left - ..hovered_hint.text.len() + extra_shift_right, + ..hovered_hint.text().len() + extra_shift_right, }, }, window, @@ -534,7 +534,7 @@ pub fn show_link_definition( let project = editor.project.clone(); let provider = editor.semantics_provider.clone(); - let snapshot = snapshot.buffer_snapshot.clone(); + let snapshot = snapshot.buffer_snapshot().clone(); hovered_link_state.task = Some(cx.spawn_in(window, async move |this, cx| { async move { let result = match &trigger_point { @@ -627,7 +627,7 @@ pub fn show_link_definition( TriggerPoint::Text(trigger_anchor) => { // If no symbol range returned from language server, use the surrounding word. let (offset_range, _) = - snapshot.surrounding_word(*trigger_anchor, false); + snapshot.surrounding_word(*trigger_anchor, None); RangeInEditor::Text( snapshot.anchor_before(offset_range.start) ..snapshot.anchor_after(offset_range.end), @@ -666,9 +666,7 @@ pub(crate) fn find_url( ) -> Option<(Range, String)> { const LIMIT: usize = 2048; - let Ok(snapshot) = buffer.read_with(&cx, |buffer, _| buffer.snapshot()) else { - return None; - }; + let snapshot = buffer.read_with(&cx, |buffer, _| buffer.snapshot()).ok()?; let offset = position.to_offset(&snapshot); let mut token_start = offset; @@ -898,6 +896,7 @@ fn surrounding_filename( } else { // Otherwise, we skip the quote inside_quotes = true; + token_end += ch.len_utf8(); continue; } } @@ -931,8 +930,8 @@ mod tests { use futures::StreamExt; use gpui::Modifiers; use indoc::indoc; - use language::language_settings::InlayHintSettings; use lsp::request::{GotoDefinition, GotoTypeDefinition}; + use settings::InlayHintSettingsContent; use util::{assert_set_eq, path}; use workspace::item::Item; @@ -1280,15 +1279,15 @@ mod tests { #[gpui::test] async fn test_inlay_hover_links(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - enabled: true, - show_value_hints: false, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + enabled: Some(true), + show_value_hints: Some(false), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -1397,7 +1396,7 @@ mod tests { let buffer_snapshot = editor.buffer().update(cx, |buffer, cx| buffer.snapshot(cx)); let expected_highlight = InlayHighlight { inlay: InlayId::Hint(0), - inlay_position: buffer_snapshot.anchor_at(inlay_range.start, Bias::Right), + inlay_position: buffer_snapshot.anchor_after(inlay_range.start), range: 0..hint_label.len(), }; assert_set_eq!(actual_highlights, vec![&expected_highlight]); @@ -1545,6 +1544,10 @@ mod tests { ("'fˇile.txt'", Some("file.txt")), ("ˇ'file.txt'", Some("file.txt")), ("ˇ'fi\\ le.txt'", Some("fi le.txt")), + // Quoted multibyte characters + (" ˇ\"常\"", Some("常")), + (" \"ˇ常\"", Some("常")), + ("ˇ\"常\"", Some("常")), ]; for (input, expected) in test_cases { @@ -1857,4 +1860,42 @@ mod tests { cx.simulate_click(screen_coord, Modifiers::secondary_key()); cx.update_workspace(|workspace, _, cx| assert_eq!(workspace.items(cx).count(), 1)); } + + #[gpui::test] + async fn test_hover_unicode(cx: &mut gpui::TestAppContext) { + init_test(cx, |_| {}); + let mut cx = EditorLspTestContext::new_rust( + lsp::ServerCapabilities { + ..Default::default() + }, + cx, + ) + .await; + + cx.set_state(indoc! {" + You can't open ˇ\"🤩\" because it's an emoji. + "}); + + // File does not exist + let screen_coord = cx.pixel_position(indoc! {" + You can't open ˇ\"🤩\" because it's an emoji. + "}); + cx.simulate_mouse_move(screen_coord, None, Modifiers::secondary_key()); + + // No highlight, does not panic... + cx.update_editor(|editor, window, cx| { + assert!( + editor + .snapshot(window, cx) + .text_highlight_ranges::() + .unwrap_or_default() + .1 + .is_empty() + ); + }); + + // Does not open the directory + cx.simulate_click(screen_coord, Modifiers::secondary_key()); + cx.update_workspace(|workspace, _, cx| assert_eq!(workspace.items(cx).count(), 1)); + } } diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index 51be0d234eca9c2e6b908c0aba6f3746b3eff460..863ce297be9149f62bb7e880658e8a084968fb81 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -16,7 +16,7 @@ use itertools::Itertools; use language::{DiagnosticEntry, Language, LanguageRegistry}; use lsp::DiagnosticSeverity; use markdown::{Markdown, MarkdownElement, MarkdownStyle}; -use multi_buffer::{MultiOrSingleBufferOffsetRange, ToOffset, ToPoint}; +use multi_buffer::{ToOffset, ToPoint}; use project::{HoverBlock, HoverBlockKind, InlayHintLabelPart}; use settings::Settings; use std::{borrow::Cow, cell::RefCell}; @@ -269,7 +269,7 @@ fn show_hover( // Don't request again if the location is the same as the previous request if let Some(triggered_from) = &editor.hover_state.triggered_from && triggered_from - .cmp(&anchor, &snapshot.buffer_snapshot) + .cmp(&anchor, &snapshot.buffer_snapshot()) .is_eq() { return None; @@ -308,12 +308,12 @@ fn show_hover( delay.await; } - let offset = anchor.to_offset(&snapshot.buffer_snapshot); + let offset = anchor.to_offset(&snapshot.buffer_snapshot()); let local_diagnostic = if all_diagnostics_active { None } else { snapshot - .buffer_snapshot + .buffer_snapshot() .diagnostics_with_buffer_ids_in_range::(offset..offset) .filter(|(_, diagnostic)| { Some(diagnostic.diagnostic.group_id) != active_group_id @@ -324,17 +324,17 @@ fn show_hover( let diagnostic_popover = if let Some((buffer_id, local_diagnostic)) = local_diagnostic { let group = snapshot - .buffer_snapshot + .buffer_snapshot() .diagnostic_group(buffer_id, local_diagnostic.diagnostic.group_id) .collect::>(); let point_range = local_diagnostic .range .start - .to_point(&snapshot.buffer_snapshot) + .to_point(&snapshot.buffer_snapshot()) ..local_diagnostic .range .end - .to_point(&snapshot.buffer_snapshot); + .to_point(&snapshot.buffer_snapshot()); let markdown = cx.update(|_, cx| { renderer .as_ref() @@ -371,12 +371,12 @@ fn show_hover( this.update(cx, |_, cx| cx.observe(&markdown, |_, _, cx| cx.notify()))?; let local_diagnostic = DiagnosticEntry { - diagnostic: local_diagnostic.diagnostic, + diagnostic: local_diagnostic.diagnostic.to_owned(), range: snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(local_diagnostic.range.start) ..snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_after(local_diagnostic.range.end), }; @@ -401,23 +401,23 @@ fn show_hover( })?; let invisible_char = if let Some(invisible) = snapshot - .buffer_snapshot + .buffer_snapshot() .chars_at(anchor) .next() .filter(|&c| is_invisible(c)) { - let after = snapshot.buffer_snapshot.anchor_after( - anchor.to_offset(&snapshot.buffer_snapshot) + invisible.len_utf8(), + let after = snapshot.buffer_snapshot().anchor_after( + anchor.to_offset(&snapshot.buffer_snapshot()) + invisible.len_utf8(), ); Some((invisible, anchor..after)) } else if let Some(invisible) = snapshot - .buffer_snapshot + .buffer_snapshot() .reversed_chars_at(anchor) .next() .filter(|&c| is_invisible(c)) { - let before = snapshot.buffer_snapshot.anchor_before( - anchor.to_offset(&snapshot.buffer_snapshot) - invisible.len_utf8(), + let before = snapshot.buffer_snapshot().anchor_before( + anchor.to_offset(&snapshot.buffer_snapshot()) - invisible.len_utf8(), ); Some((invisible, before..anchor)) @@ -468,22 +468,17 @@ fn show_hover( .range .and_then(|range| { let start = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_in_excerpt(excerpt_id, range.start)?; let end = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_in_excerpt(excerpt_id, range.end)?; Some(start..end) }) .or_else(|| { - let snapshot = &snapshot.buffer_snapshot; - match snapshot.syntax_ancestor(anchor..anchor)?.1 { - MultiOrSingleBufferOffsetRange::Multi(range) => Some( - snapshot.anchor_before(range.start) - ..snapshot.anchor_after(range.end), - ), - MultiOrSingleBufferOffsetRange::Single(_) => None, - } + let snapshot = &snapshot.buffer_snapshot(); + let range = snapshot.syntax_ancestor(anchor..anchor)?.1; + Some(snapshot.anchor_before(range.start)..snapshot.anchor_after(range.end)) }) .unwrap_or_else(|| anchor..anchor); @@ -547,8 +542,8 @@ fn same_info_hover(editor: &Editor, snapshot: &EditorSnapshot, anchor: Anchor) - symbol_range .as_text_range() .map(|range| { - let hover_range = range.to_offset(&snapshot.buffer_snapshot); - let offset = anchor.to_offset(&snapshot.buffer_snapshot); + let hover_range = range.to_offset(&snapshot.buffer_snapshot()); + let offset = anchor.to_offset(&snapshot.buffer_snapshot()); // LSP returns a hover result for the end index of ranges that should be hovered, so we need to // use an inclusive range here to check if we should dismiss the popover (hover_range.start..=hover_range.end).contains(&offset) @@ -566,8 +561,8 @@ fn same_diagnostic_hover(editor: &Editor, snapshot: &EditorSnapshot, anchor: Anc let hover_range = diagnostic .local_diagnostic .range - .to_offset(&snapshot.buffer_snapshot); - let offset = anchor.to_offset(&snapshot.buffer_snapshot); + .to_offset(&snapshot.buffer_snapshot()); + let offset = anchor.to_offset(&snapshot.buffer_snapshot()); // Here we do basically the same as in `same_info_hover`, see comment there for an explanation (hover_range.start..=hover_range.end).contains(&offset) @@ -1004,8 +999,8 @@ mod tests { use collections::BTreeSet; use gpui::App; use indoc::indoc; - use language::language_settings::InlayHintSettings; use markdown::parser::MarkdownEvent; + use settings::InlayHintSettingsContent; use smol::stream::StreamExt; use std::sync::atomic; use std::sync::atomic::AtomicUsize; @@ -1095,7 +1090,7 @@ mod tests { cx.update_editor(|editor, window, cx| { let snapshot = editor.snapshot(window, cx); let anchor = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(hover_point.to_offset(&snapshot, Bias::Left)); hover_at(editor, Some(anchor), window, cx) }); @@ -1195,7 +1190,7 @@ mod tests { cx.update_editor(|editor, window, cx| { let snapshot = editor.snapshot(window, cx); let anchor = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(hover_point.to_offset(&snapshot, Bias::Left)); hover_at(editor, Some(anchor), window, cx) }); @@ -1233,7 +1228,7 @@ mod tests { cx.update_editor(|editor, window, cx| { let snapshot = editor.snapshot(window, cx); let anchor = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(hover_point.to_offset(&snapshot, Bias::Left)); hover_at(editor, Some(anchor), window, cx) }); @@ -1287,7 +1282,7 @@ mod tests { cx.update_editor(|editor, window, cx| { let snapshot = editor.snapshot(window, cx); let anchor = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(hover_point.to_offset(&snapshot, Bias::Left)); hover_at(editor, Some(anchor), window, cx) }); @@ -1551,15 +1546,15 @@ mod tests { #[gpui::test] async fn test_hover_inlay_label_parts(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -1790,7 +1785,7 @@ mod tests { popover.symbol_range, RangeInEditor::Inlay(InlayHighlight { inlay: InlayId::Hint(0), - inlay_position: buffer_snapshot.anchor_at(inlay_range.start, Bias::Right), + inlay_position: buffer_snapshot.anchor_after(inlay_range.start), range: ": ".len()..": ".len() + new_type_label.len(), }), "Popover range should match the new type label part" @@ -1845,7 +1840,7 @@ mod tests { popover.symbol_range, RangeInEditor::Inlay(InlayHighlight { inlay: InlayId::Hint(0), - inlay_position: buffer_snapshot.anchor_at(inlay_range.start, Bias::Right), + inlay_position: buffer_snapshot.anchor_after(inlay_range.start), range: ": ".len() + new_type_label.len() + "<".len() ..": ".len() + new_type_label.len() + "<".len() + struct_label.len(), }), diff --git a/crates/editor/src/indent_guides.rs b/crates/editor/src/indent_guides.rs index 23717eeb158cea0f01e6a4efca6d2ff14a8fa824..22b57bd80579c61405cf46b5e84d1fa128a38ffb 100644 --- a/crates/editor/src/indent_guides.rs +++ b/crates/editor/src/indent_guides.rs @@ -155,19 +155,19 @@ pub fn indent_guides_in_range( cx: &App, ) -> Vec { let start_offset = snapshot - .buffer_snapshot + .buffer_snapshot() .point_to_offset(Point::new(visible_buffer_range.start.0, 0)); let end_offset = snapshot - .buffer_snapshot + .buffer_snapshot() .point_to_offset(Point::new(visible_buffer_range.end.0, 0)); - let start_anchor = snapshot.buffer_snapshot.anchor_before(start_offset); - let end_anchor = snapshot.buffer_snapshot.anchor_after(end_offset); + let start_anchor = snapshot.buffer_snapshot().anchor_before(start_offset); + let end_anchor = snapshot.buffer_snapshot().anchor_after(end_offset); let mut fold_ranges = Vec::>::new(); let folds = snapshot.folds_in_range(start_offset..end_offset).peekable(); for fold in folds { - let start = fold.range.start.to_point(&snapshot.buffer_snapshot); - let end = fold.range.end.to_point(&snapshot.buffer_snapshot); + let start = fold.range.start.to_point(&snapshot.buffer_snapshot()); + let end = fold.range.end.to_point(&snapshot.buffer_snapshot()); if let Some(last_range) = fold_ranges.last_mut() && last_range.end >= start { @@ -178,7 +178,7 @@ pub fn indent_guides_in_range( } snapshot - .buffer_snapshot + .buffer_snapshot() .indent_guides_in_range(start_anchor..end_anchor, ignore_disabled_for_language, cx) .filter(|indent_guide| { if editor.is_buffer_folded(indent_guide.buffer_id, cx) { @@ -207,7 +207,7 @@ async fn resolve_indented_range( buffer_row: MultiBufferRow, ) -> Option { snapshot - .buffer_snapshot + .buffer_snapshot() .enclosing_indent(buffer_row) .await .map(|(row_range, indent)| ActiveIndentedRange { row_range, indent }) @@ -222,23 +222,23 @@ fn should_recalculate_indented_range( if prev_row.0 == new_row.0 { return false; } - if snapshot.buffer_snapshot.is_singleton() { + if snapshot.buffer_snapshot().is_singleton() { if !current_indent_range.row_range.contains(&new_row) { return true; } - let old_line_indent = snapshot.buffer_snapshot.line_indent_for_row(prev_row); - let new_line_indent = snapshot.buffer_snapshot.line_indent_for_row(new_row); + let old_line_indent = snapshot.buffer_snapshot().line_indent_for_row(prev_row); + let new_line_indent = snapshot.buffer_snapshot().line_indent_for_row(new_row); if old_line_indent.is_line_empty() || new_line_indent.is_line_empty() || old_line_indent != new_line_indent - || snapshot.buffer_snapshot.max_point().row == new_row.0 + || snapshot.buffer_snapshot().max_point().row == new_row.0 { return true; } - let next_line_indent = snapshot.buffer_snapshot.line_indent_for_row(new_row + 1); + let next_line_indent = snapshot.buffer_snapshot().line_indent_for_row(new_row + 1); next_line_indent.is_line_empty() || next_line_indent != old_line_indent } else { true diff --git a/crates/editor/src/inlay_hint_cache.rs b/crates/editor/src/inlay_hint_cache.rs index c1b0a7640c155fff02f0b778e8996a9b68ea452e..9a1e07ba3946d0f2b05e2096201287334dd02534 100644 --- a/crates/editor/src/inlay_hint_cache.rs +++ b/crates/editor/src/inlay_hint_cache.rs @@ -20,12 +20,14 @@ use anyhow::Context as _; use clock::Global; use futures::future; use gpui::{AppContext as _, AsyncApp, Context, Entity, Task, Window}; -use language::{Buffer, BufferSnapshot, language_settings::InlayHintKind}; +use language::{ + Buffer, BufferSnapshot, + language_settings::{InlayHintKind, InlayHintSettings}, +}; use parking_lot::RwLock; use project::{InlayHint, ResolveState}; use collections::{HashMap, HashSet, hash_map}; -use language::language_settings::InlayHintSettings; use smol::lock::Semaphore; use sum_tree::Bias; use text::{BufferId, ToOffset, ToPoint}; @@ -1301,13 +1303,13 @@ pub mod tests { use futures::StreamExt; use gpui::{AppContext as _, Context, SemanticVersion, TestAppContext, WindowHandle}; use itertools::Itertools as _; - use language::{Capability, FakeLspAdapter, language_settings::AllLanguageSettingsContent}; + use language::{Capability, FakeLspAdapter}; use language::{Language, LanguageConfig, LanguageMatcher}; use lsp::FakeLanguageServer; use parking_lot::Mutex; use project::{FakeFs, Project}; use serde_json::json; - use settings::SettingsStore; + use settings::{AllLanguageSettingsContent, InlayHintSettingsContent, SettingsStore}; use std::sync::atomic::{AtomicBool, AtomicU32, AtomicUsize, Ordering}; use text::Point; use util::path; @@ -1318,15 +1320,17 @@ pub mod tests { async fn test_basic_cache_update_with_duplicate_hints(cx: &mut gpui::TestAppContext) { let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), - show_other_hints: allowed_hint_kinds.contains(&None), - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(allowed_hint_kinds.contains(&Some(InlayHintKind::Type))), + show_parameter_hints: Some( + allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), + ), + show_other_hints: Some(allowed_hint_kinds.contains(&None)), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -1428,15 +1432,15 @@ pub mod tests { #[gpui::test] async fn test_cache_update_on_lsp_completion_tasks(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -1491,7 +1495,7 @@ pub mod tests { .into_response() .expect("work done progress create request failed"); cx.executor().run_until_parked(); - fake_server.notify::(&lsp::ProgressParams { + fake_server.notify::(lsp::ProgressParams { token: lsp::ProgressToken::String(progress_token.to_string()), value: lsp::ProgressParamsValue::WorkDone(lsp::WorkDoneProgress::Begin( lsp::WorkDoneProgressBegin::default(), @@ -1511,7 +1515,7 @@ pub mod tests { }) .unwrap(); - fake_server.notify::(&lsp::ProgressParams { + fake_server.notify::(lsp::ProgressParams { token: lsp::ProgressToken::String(progress_token.to_string()), value: lsp::ProgressParamsValue::WorkDone(lsp::WorkDoneProgress::End( lsp::WorkDoneProgressEnd::default(), @@ -1535,15 +1539,15 @@ pub mod tests { #[gpui::test] async fn test_no_hint_updates_for_unrelated_language_files(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -1765,15 +1769,17 @@ pub mod tests { async fn test_hint_setting_changes(cx: &mut gpui::TestAppContext) { let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), - show_other_hints: allowed_hint_kinds.contains(&None), - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(allowed_hint_kinds.contains(&Some(InlayHintKind::Type))), + show_parameter_hints: Some( + allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), + ), + show_other_hints: Some(allowed_hint_kinds.contains(&None)), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -1926,16 +1932,19 @@ pub mod tests { ), ] { update_test_language_settings(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: new_allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: new_allowed_hint_kinds - .contains(&Some(InlayHintKind::Parameter)), - show_other_hints: new_allowed_hint_kinds.contains(&None), - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some( + new_allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), + ), + show_parameter_hints: Some( + new_allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), + ), + show_other_hints: Some(new_allowed_hint_kinds.contains(&None)), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -1970,16 +1979,19 @@ pub mod tests { let another_allowed_hint_kinds = HashSet::from_iter([Some(InlayHintKind::Type)]); update_test_language_settings(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: false, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: another_allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: another_allowed_hint_kinds - .contains(&Some(InlayHintKind::Parameter)), - show_other_hints: another_allowed_hint_kinds.contains(&None), - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(false), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some( + another_allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), + ), + show_parameter_hints: Some( + another_allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), + ), + show_other_hints: Some(another_allowed_hint_kinds.contains(&None)), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -2027,16 +2039,19 @@ pub mod tests { let final_allowed_hint_kinds = HashSet::from_iter([Some(InlayHintKind::Parameter)]); update_test_language_settings(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: final_allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: final_allowed_hint_kinds - .contains(&Some(InlayHintKind::Parameter)), - show_other_hints: final_allowed_hint_kinds.contains(&None), - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some( + final_allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), + ), + show_parameter_hints: Some( + final_allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), + ), + show_other_hints: Some(final_allowed_hint_kinds.contains(&None)), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -2102,15 +2117,15 @@ pub mod tests { #[gpui::test] async fn test_hint_request_cancellation(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -2236,18 +2251,18 @@ pub mod tests { .unwrap(); } - #[gpui::test(iterations = 10)] + #[gpui::test(iterations = 4)] async fn test_large_buffer_inlay_requests_split(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -2540,15 +2555,15 @@ pub mod tests { #[gpui::test] async fn test_multiple_excerpts_large_multibuffer(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -2864,15 +2879,15 @@ pub mod tests { #[gpui::test] async fn test_excerpts_removed(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: false, - show_parameter_hints: false, - show_other_hints: false, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(false), + show_parameter_hints: Some(false), + show_other_hints: Some(false), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -3041,15 +3056,15 @@ pub mod tests { .unwrap(); update_test_language_settings(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -3074,15 +3089,15 @@ pub mod tests { #[gpui::test] async fn test_inside_char_boundary_range_hints(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -3167,15 +3182,15 @@ pub mod tests { #[gpui::test] async fn test_toggle_inlay_hints(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: false, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(false), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -3244,15 +3259,15 @@ pub mod tests { .unwrap(); update_test_language_settings(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -3305,15 +3320,15 @@ pub mod tests { #[gpui::test] async fn test_inlays_at_the_same_place(cx: &mut gpui::TestAppContext) { init_test(cx, |settings| { - settings.defaults.inlay_hints = Some(InlayHintSettings { - show_value_hints: true, - enabled: true, - edit_debounce_ms: 0, - scroll_debounce_ms: 0, - show_type_hints: true, - show_parameter_hints: true, - show_other_hints: true, - show_background: false, + settings.defaults.inlay_hints = Some(InlayHintSettingsContent { + show_value_hints: Some(true), + enabled: Some(true), + edit_debounce_ms: Some(0), + scroll_debounce_ms: Some(0), + show_type_hints: Some(true), + show_parameter_hints: Some(true), + show_other_hints: Some(true), + show_background: Some(false), toggle_on_modifiers_press: None, }) }); @@ -3556,7 +3571,7 @@ pub mod tests { editor .visible_inlay_hints(cx) .into_iter() - .map(|hint| hint.text.to_string()) + .map(|hint| hint.text().to_string()) .collect() } } diff --git a/crates/editor/src/items.rs b/crates/editor/src/items.rs index 253d0c27518107dc1cad3733cefbfef5bc12b807..f56e7dbaf87fa05e1423f639c7473259c8fc956c 100644 --- a/crates/editor/src/items.rs +++ b/crates/editor/src/items.rs @@ -5,7 +5,7 @@ use crate::{ display_map::HighlightKey, editor_settings::SeedQuerySetting, persistence::{DB, SerializedEditor}, - scroll::ScrollAnchor, + scroll::{ScrollAnchor, ScrollOffset}, }; use anyhow::{Context as _, Result, anyhow}; use collections::{HashMap, HashSet}; @@ -17,8 +17,8 @@ use gpui::{ ParentElement, Pixels, SharedString, Styled, Task, WeakEntity, Window, point, }; use language::{ - Bias, Buffer, BufferRow, CharKind, DiskState, LocalFile, Point, SelectionGoal, - proto::serialize_anchor as serialize_text_anchor, + Bias, Buffer, BufferRow, CharKind, CharScopeContext, DiskState, LocalFile, Point, + SelectionGoal, proto::serialize_anchor as serialize_text_anchor, }; use lsp::DiagnosticSeverity; use project::{ @@ -43,8 +43,10 @@ use util::{ResultExt, TryFutureExt, paths::PathExt}; use workspace::{ CollaboratorId, ItemId, ItemNavHistory, ToolbarItemLocation, ViewId, Workspace, WorkspaceId, invalid_buffer_view::InvalidBufferView, - item::{FollowableItem, Item, ItemEvent, ProjectItem, SaveOptions}, - searchable::{Direction, SearchEvent, SearchableItem, SearchableItemHandle}, + item::{FollowableItem, Item, ItemBufferKind, ItemEvent, ProjectItem, SaveOptions}, + searchable::{ + Direction, FilteredSearchRange, SearchEvent, SearchableItem, SearchableItemHandle, + }, }; use workspace::{ OpenOptions, @@ -187,8 +189,8 @@ impl FollowableItem for Editor { } else if self.focus_handle.is_focused(window) { self.buffer.update(cx, |buffer, cx| { buffer.set_active_selections( - &self.selections.disjoint_anchors(), - self.selections.line_mode, + &self.selections.disjoint_anchors_arc(), + self.selections.line_mode(), self.cursor_shape, cx, ); @@ -231,7 +233,7 @@ impl FollowableItem for Editor { scroll_y: scroll_anchor.offset.y, selections: self .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .map(|s| serialize_selection(s, &snapshot)) .collect(), @@ -310,7 +312,7 @@ impl FollowableItem for Editor { let snapshot = self.buffer.read(cx).snapshot(cx); update.selections = self .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .map(|s| serialize_selection(s, &snapshot)) .collect(); @@ -576,12 +578,11 @@ fn deserialize_selection( fn deserialize_anchor(buffer: &MultiBufferSnapshot, anchor: proto::EditorAnchor) -> Option { let excerpt_id = ExcerptId::from_proto(anchor.excerpt_id); - Some(Anchor { + Some(Anchor::in_buffer( excerpt_id, - text_anchor: language::proto::deserialize_anchor(anchor.anchor?)?, - buffer_id: buffer.buffer_id_for_excerpt(excerpt_id), - diff_base_anchor: None, - }) + buffer.buffer_id_for_excerpt(excerpt_id)?, + language::proto::deserialize_anchor(anchor.anchor?)?, + )) } impl Item for Editor { @@ -638,7 +639,7 @@ impl Item for Editor { .and_then(|f| f.as_local())? .abs_path(cx); - let file_path = file_path.compact().to_string_lossy().to_string(); + let file_path = file_path.compact().to_string_lossy().into_owned(); Some(file_path.into()) } @@ -649,7 +650,7 @@ impl Item for Editor { fn tab_content_text(&self, detail: usize, cx: &App) -> SharedString { if let Some(path) = path_for_buffer(&self.buffer, detail, true, cx) { - path.to_string_lossy().to_string().into() + path.to_string().into() } else { // Use the same logic as the displayed title for consistency self.buffer.read(cx).title(cx).to_string().into() @@ -665,7 +666,7 @@ impl Item for Editor { .file_icons .then(|| { path_for_buffer(&self.buffer, 0, true, cx) - .and_then(|path| FileIcons::get_icon(path.as_ref(), cx)) + .and_then(|path| FileIcons::get_icon(Path::new(&*path), cx)) }) .flatten() .map(Icon::from_path) @@ -701,8 +702,7 @@ impl Item for Editor { let description = params.detail.and_then(|detail| { let path = path_for_buffer(&self.buffer, detail, false, cx)?; - let description = path.to_string_lossy(); - let description = description.trim(); + let description = path.trim(); if description.is_empty() { return None; @@ -747,8 +747,11 @@ impl Item for Editor { .for_each_buffer(|buffer| f(buffer.entity_id(), buffer.read(cx))); } - fn is_singleton(&self, cx: &App) -> bool { - self.buffer.read(cx).is_singleton() + fn buffer_kind(&self, cx: &App) -> ItemBufferKind { + match self.buffer.read(cx).is_singleton() { + true => ItemBufferKind::Singleton, + false => ItemBufferKind::Multibuffer, + } } fn can_save_as(&self, cx: &App) -> bool { @@ -832,12 +835,11 @@ impl Item for Editor { // let mut buffers_to_save = let buffers_to_save = if self.buffer.read(cx).is_singleton() && !options.autosave { - buffers.clone() + buffers } else { buffers - .iter() + .into_iter() .filter(|buffer| buffer.read(cx).is_dirty()) - .cloned() .collect() }; @@ -863,22 +865,6 @@ impl Item for Editor { .await?; } - // Notify about clean buffers for language server events - let buffers_that_were_not_saved: Vec<_> = buffers - .into_iter() - .filter(|b| !buffers_to_save.contains(b)) - .collect(); - - for buffer in buffers_that_were_not_saved { - buffer - .update(cx, |buffer, cx| { - let version = buffer.saved_version().clone(); - let mtime = buffer.saved_mtime(); - buffer.did_save(version, mtime, cx); - }) - .ok(); - } - Ok(()) }) } @@ -896,10 +882,7 @@ impl Item for Editor { .as_singleton() .expect("cannot call save_as on an excerpt list"); - let file_extension = path - .path - .extension() - .map(|a| a.to_string_lossy().to_string()); + let file_extension = path.path.extension().map(|a| a.to_string()); self.report_editor_event( ReportEditorEvent::Saved { auto_saved: false }, file_extension, @@ -965,13 +948,12 @@ impl Item for Editor { buffer .snapshot() .resolve_file_path( - cx, self.project .as_ref() .map(|project| project.read(cx).visible_worktrees(cx).count() > 1) .unwrap_or_default(), + cx, ) - .map(|path| path.to_string_lossy().to_string()) .unwrap_or_else(|| { if multibuffer.is_singleton() { multibuffer.title(cx).to_string() @@ -1165,7 +1147,7 @@ impl SerializableItem for Editor { let (worktree, path) = project.find_worktree(&abs_path, cx)?; let project_path = ProjectPath { worktree_id: worktree.read(cx).id(), - path: path.into(), + path: path, }; Some(project.open_path(project_path, cx)) }); @@ -1286,7 +1268,7 @@ impl SerializableItem for Editor { project .read(cx) .worktree_for_id(worktree_id, cx) - .and_then(|worktree| worktree.read(cx).absolutize(file.path()).ok()) + .map(|worktree| worktree.read(cx).absolutize(file.path())) .or_else(|| { let full_path = file.full_path(cx); let project_path = project.read(cx).find_project_path(&full_path, cx)?; @@ -1342,7 +1324,7 @@ struct EditorRestorationData { #[derive(Default, Debug)] pub struct RestorationData { - pub scroll_position: (BufferRow, gpui::Point), + pub scroll_position: (BufferRow, gpui::Point), pub folds: Vec>, pub selections: Vec>, } @@ -1510,7 +1492,7 @@ impl SearchableItem for Editor { fn toggle_filtered_search_ranges( &mut self, - enabled: bool, + enabled: Option, _: &mut Window, cx: &mut Context, ) { @@ -1520,15 +1502,16 @@ impl SearchableItem for Editor { .map(|(_, ranges)| ranges) } - if !enabled { - return; - } + if let Some(range) = enabled { + let ranges = self.selections.disjoint_anchor_ranges().collect::>(); - let ranges = self.selections.disjoint_anchor_ranges().collect::>(); - if ranges.iter().any(|s| s.start != s.end) { - self.set_search_within_ranges(&ranges, cx); - } else if let Some(previous_search_ranges) = self.previous_search_ranges.take() { - self.set_search_within_ranges(&previous_search_ranges, cx) + if ranges.iter().any(|s| s.start != s.end) { + self.set_search_within_ranges(&ranges, cx); + } else if let Some(previous_search_ranges) = self.previous_search_ranges.take() + && range != FilteredSearchRange::Selection + { + self.set_search_within_ranges(&previous_search_ranges, cx); + } } } @@ -1556,7 +1539,8 @@ impl SearchableItem for Editor { fn query_suggestion(&mut self, window: &mut Window, cx: &mut Context) -> String { let setting = EditorSettings::get_global(cx).seed_search_query_from_cursor; - let snapshot = &self.snapshot(window, cx).buffer_snapshot; + let snapshot = self.snapshot(window, cx); + let snapshot = snapshot.buffer_snapshot(); let selection = self.selections.newest_adjusted(cx); match setting { @@ -1573,7 +1557,8 @@ impl SearchableItem for Editor { } SeedQuerySetting::Selection => String::new(), SeedQuerySetting::Always => { - let (range, kind) = snapshot.surrounding_word(selection.start, true); + let (range, kind) = + snapshot.surrounding_word(selection.start, Some(CharScopeContext::Completion)); if kind == Some(CharKind::Word) { let text: String = snapshot.text_for_range(range).collect(); if !text.trim().is_empty() { @@ -1675,7 +1660,7 @@ impl SearchableItem for Editor { cx: &mut Context, ) -> usize { let buffer = self.buffer().read(cx).snapshot(cx); - let current_index_position = if self.selections.disjoint_anchors().len() == 1 { + let current_index_position = if self.selections.disjoint_anchors_arc().len() == 1 { self.selections.newest_anchor().head() } else { matches[current_index].start @@ -1753,13 +1738,8 @@ impl SearchableItem for Editor { .anchor_after(search_range.start + match_range.start); let end = search_buffer .anchor_before(search_range.start + match_range.end); - Anchor { - diff_base_anchor: Some(start), - ..deleted_hunk_anchor - }..Anchor { - diff_base_anchor: Some(end), - ..deleted_hunk_anchor - } + deleted_hunk_anchor.with_diff_base_anchor(start) + ..deleted_hunk_anchor.with_diff_base_anchor(end) } else { let start = search_buffer .anchor_after(search_range.start + match_range.start); @@ -1878,7 +1858,7 @@ fn path_for_buffer<'a>( height: usize, include_filename: bool, cx: &'a App, -) -> Option> { +) -> Option> { let file = buffer.read(cx).as_singleton()?.read(cx).file()?; path_for_file(file.as_ref(), height, include_filename, cx) } @@ -1888,7 +1868,7 @@ fn path_for_file<'a>( mut height: usize, include_filename: bool, cx: &'a App, -) -> Option> { +) -> Option> { // Ensure we always render at least the filename. height += 1; @@ -1902,22 +1882,21 @@ fn path_for_file<'a>( } } - // Here we could have just always used `full_path`, but that is very - // allocation-heavy and so we try to use a `Cow` if we haven't - // traversed all the way up to the worktree's root. + // The full_path method allocates, so avoid calling it if height is zero. if height > 0 { - let full_path = file.full_path(cx); - if include_filename { - Some(full_path.into()) - } else { - Some(full_path.parent()?.to_path_buf().into()) + let mut full_path = file.full_path(cx); + if !include_filename { + if !full_path.pop() { + return None; + } } + Some(full_path.to_string_lossy().into_owned().into()) } else { let mut path = file.path().strip_prefix(prefix).ok()?; if !include_filename { path = path.parent()?; } - Some(path.into()) + Some(path.display(file.path_style(cx))) } } @@ -1932,12 +1911,12 @@ mod tests { use language::{LanguageMatcher, TestFile}; use project::FakeFs; use std::path::{Path, PathBuf}; - use util::path; + use util::{path, rel_path::RelPath}; #[gpui::test] fn test_path_for_file(cx: &mut App) { let file = TestFile { - path: Path::new("").into(), + path: RelPath::empty().into(), root_name: String::new(), local_root: None, }; diff --git a/crates/editor/src/jsx_tag_auto_close.rs b/crates/editor/src/jsx_tag_auto_close.rs index e6c518beae3ecf3741b5f74be6087628f5231c8c..0e32bc686ad98a45b83712841c13fffc07421acb 100644 --- a/crates/editor/src/jsx_tag_auto_close.rs +++ b/crates/editor/src/jsx_tag_auto_close.rs @@ -328,7 +328,7 @@ pub(crate) fn refresh_enabled_in_any_buffer( snapshot.file(), cx, ); - if language_settings.jsx_tag_auto_close.enabled { + if language_settings.jsx_tag_auto_close { found_enabled = true; } } @@ -406,7 +406,7 @@ pub(crate) fn handle_from( }; let language_settings = snapshot.settings_at(edit.new.end, cx); - if !language_settings.jsx_tag_auto_close.enabled { + if !language_settings.jsx_tag_auto_close { continue; } @@ -507,7 +507,7 @@ pub(crate) fn handle_from( { let selections = this - .read_with(cx, |this, _| this.selections.disjoint_anchors()) + .read_with(cx, |this, _| this.selections.disjoint_anchors_arc()) .ok()?; for selection in selections.iter() { let Some(selection_buffer_offset_head) = @@ -620,14 +620,17 @@ mod jsx_tag_autoclose_tests { use super::*; use gpui::{AppContext as _, TestAppContext}; - use language::language_settings::JsxTagAutoCloseSettings; use languages::language; use multi_buffer::ExcerptRange; use text::Selection; async fn test_setup(cx: &mut TestAppContext) -> EditorTestContext { init_test(cx, |settings| { - settings.defaults.jsx_tag_auto_close = Some(JsxTagAutoCloseSettings { enabled: true }); + settings + .defaults + .jsx_tag_auto_close + .get_or_insert_default() + .enabled = Some(true); }); let mut cx = EditorTestContext::new(cx).await; @@ -789,7 +792,11 @@ mod jsx_tag_autoclose_tests { #[gpui::test] async fn test_multibuffer(cx: &mut TestAppContext) { init_test(cx, |settings| { - settings.defaults.jsx_tag_auto_close = Some(JsxTagAutoCloseSettings { enabled: true }); + settings + .defaults + .jsx_tag_auto_close + .get_or_insert_default() + .enabled = Some(true); }); let buffer_a = cx.new(|cx| { diff --git a/crates/editor/src/lsp_colors.rs b/crates/editor/src/lsp_colors.rs index 29eb9f249abca71ff3cfbb9f5ad3f56464efe942..f13ffd69206d3d3d89ba8dd29ff6f73fd93e0bec 100644 --- a/crates/editor/src/lsp_colors.rs +++ b/crates/editor/src/lsp_colors.rs @@ -13,8 +13,8 @@ use ui::{App, Context, Window}; use util::post_inc; use crate::{ - DisplayPoint, Editor, EditorSettings, EditorSnapshot, InlayId, InlaySplice, RangeToAnchorExt, - display_map::Inlay, editor_settings::DocumentColorsRenderMode, + DisplayPoint, Editor, EditorSettings, EditorSnapshot, FETCH_COLORS_DEBOUNCE_TIMEOUT, InlayId, + InlaySplice, RangeToAnchorExt, display_map::Inlay, editor_settings::DocumentColorsRenderMode, }; #[derive(Debug)] @@ -193,7 +193,12 @@ impl Editor { }) .collect::>() }); - cx.spawn(async move |editor, cx| { + + self.refresh_colors_task = cx.spawn(async move |editor, cx| { + cx.background_executor() + .timer(FETCH_COLORS_DEBOUNCE_TIMEOUT) + .await; + let all_colors = join_all(all_colors_task).await; if all_colors.is_empty() { return; @@ -228,60 +233,70 @@ impl Editor { }; match colors { Ok(colors) => { - for color in colors.colors { - let color_start = point_from_lsp(color.lsp_range.start); - let color_end = point_from_lsp(color.lsp_range.end); + if colors.colors.is_empty() { + let new_entry = + new_editor_colors.entry(buffer_id).or_insert_with(|| { + (Vec::<(Range, DocumentColor)>::new(), None) + }); + new_entry.0.clear(); + new_entry.1 = colors.cache_version; + } else { + for color in colors.colors { + let color_start = point_from_lsp(color.lsp_range.start); + let color_end = point_from_lsp(color.lsp_range.end); - for (excerpt_id, buffer_snapshot, excerpt_range) in excerpts { - if !excerpt_range.contains(&color_start.0) - || !excerpt_range.contains(&color_end.0) - { - continue; - } - let Some(color_start_anchor) = multi_buffer_snapshot - .anchor_in_excerpt( - *excerpt_id, - buffer_snapshot.anchor_before( - buffer_snapshot - .clip_point_utf16(color_start, Bias::Left), - ), - ) - else { - continue; - }; - let Some(color_end_anchor) = multi_buffer_snapshot - .anchor_in_excerpt( - *excerpt_id, - buffer_snapshot.anchor_after( - buffer_snapshot - .clip_point_utf16(color_end, Bias::Right), - ), - ) - else { - continue; - }; + for (excerpt_id, buffer_snapshot, excerpt_range) in excerpts { + if !excerpt_range.contains(&color_start.0) + || !excerpt_range.contains(&color_end.0) + { + continue; + } + let Some(color_start_anchor) = multi_buffer_snapshot + .anchor_in_excerpt( + *excerpt_id, + buffer_snapshot.anchor_before( + buffer_snapshot + .clip_point_utf16(color_start, Bias::Left), + ), + ) + else { + continue; + }; + let Some(color_end_anchor) = multi_buffer_snapshot + .anchor_in_excerpt( + *excerpt_id, + buffer_snapshot.anchor_after( + buffer_snapshot + .clip_point_utf16(color_end, Bias::Right), + ), + ) + else { + continue; + }; - let new_entry = - new_editor_colors.entry(buffer_id).or_insert_with(|| { - (Vec::<(Range, DocumentColor)>::new(), None) - }); - new_entry.1 = colors.cache_version; - let new_buffer_colors = &mut new_entry.0; + let new_entry = + new_editor_colors.entry(buffer_id).or_insert_with(|| { + (Vec::<(Range, DocumentColor)>::new(), None) + }); + new_entry.1 = colors.cache_version; + let new_buffer_colors = &mut new_entry.0; - let (Ok(i) | Err(i)) = - new_buffer_colors.binary_search_by(|(probe, _)| { - probe - .start - .cmp(&color_start_anchor, &multi_buffer_snapshot) - .then_with(|| { - probe - .end - .cmp(&color_end_anchor, &multi_buffer_snapshot) - }) - }); - new_buffer_colors - .insert(i, (color_start_anchor..color_end_anchor, color)); - break; + let (Ok(i) | Err(i)) = + new_buffer_colors.binary_search_by(|(probe, _)| { + probe + .start + .cmp(&color_start_anchor, &multi_buffer_snapshot) + .then_with(|| { + probe.end.cmp( + &color_end_anchor, + &multi_buffer_snapshot, + ) + }) + }); + new_buffer_colors + .insert(i, (color_start_anchor..color_end_anchor, color)); + break; + } } } } @@ -410,7 +425,6 @@ impl Editor { } }) .ok(); - }) - .detach(); + }); } } diff --git a/crates/editor/src/lsp_ext.rs b/crates/editor/src/lsp_ext.rs index 18ad2d71c835e5ec7e3bbd540de21f7e38425c39..0c4760f5684acf450b793a1deac54be983dcafd0 100644 --- a/crates/editor/src/lsp_ext.rs +++ b/crates/editor/src/lsp_ext.rs @@ -35,7 +35,7 @@ where let project = editor.project.clone()?; editor .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .filter_map(|selection| Some((selection.head(), selection.head().buffer_id?))) .unique_by(|(_, buffer_id)| *buffer_id) diff --git a/crates/editor/src/mouse_context_menu.rs b/crates/editor/src/mouse_context_menu.rs index 3bc334c54c2f58e6dda2b404039369907c275422..3d8bbb36103f2e82ce421c9ba83dea0bd6396780 100644 --- a/crates/editor/src/mouse_context_menu.rs +++ b/crates/editor/src/mouse_context_menu.rs @@ -54,7 +54,7 @@ impl MouseContextMenu { let content_origin = editor.last_bounds?.origin + Point { x: editor.gutter_dimensions.width, - y: Pixels(0.0), + y: Pixels::ZERO, }; let source_position = editor.to_pixel_point(source, &editor_snapshot, window)?; let menu_position = MenuPosition::PinnedToEditor { @@ -130,12 +130,9 @@ fn display_ranges<'a>( display_map: &'a DisplaySnapshot, selections: &'a SelectionsCollection, ) -> impl Iterator> + 'a { - let pending = selections - .pending - .as_ref() - .map(|pending| &pending.selection); + let pending = selections.pending_anchor(); selections - .disjoint + .disjoint_anchors() .iter() .chain(pending) .map(move |s| s.start.to_display_point(display_map)..s.end.to_display_point(display_map)) @@ -173,7 +170,8 @@ pub fn deploy_context_menu( }; let display_map = editor.selections.display_map(cx); - let buffer = &editor.snapshot(window, cx).buffer_snapshot; + let snapshot = editor.snapshot(window, cx); + let buffer = snapshot.buffer_snapshot(); let anchor = buffer.anchor_before(point.to_point(&display_map)); if !display_ranges(&display_map, &editor.selections).any(|r| r.contains(&point)) { // Move the cursor to the clicked location so that dispatched actions make sense diff --git a/crates/editor/src/movement.rs b/crates/editor/src/movement.rs index 4bd353a2873431d8102dfc15dea9a74ac2b2c241..486a14e3741989c1632e361e6ae6324d697cf2c7 100644 --- a/crates/editor/src/movement.rs +++ b/crates/editor/src/movement.rs @@ -2,7 +2,10 @@ //! in editor given a given motion (e.g. it handles converting a "move left" command into coordinates in editor). It is exposed mostly for use by vim crate. use super::{Bias, DisplayPoint, DisplaySnapshot, SelectionGoal, ToDisplayPoint}; -use crate::{DisplayRow, EditorStyle, ToOffset, ToPoint, scroll::ScrollAnchor}; +use crate::{ + DisplayRow, EditorStyle, ToOffset, ToPoint, + scroll::{ScrollAnchor, ScrollOffset}, +}; use gpui::{Pixels, WindowTextSystem}; use language::{CharClassifier, Point}; use multi_buffer::{MultiBufferRow, MultiBufferSnapshot}; @@ -27,8 +30,8 @@ pub struct TextLayoutDetails { pub(crate) editor_style: EditorStyle, pub(crate) rem_size: Pixels, pub scroll_anchor: ScrollAnchor, - pub visible_rows: Option, - pub vertical_scroll_margin: f32, + pub visible_rows: Option, + pub vertical_scroll_margin: ScrollOffset, } /// Returns a column to the left of the current point, wrapping @@ -220,7 +223,7 @@ pub fn indented_line_beginning( let soft_line_start = map.clip_point(DisplayPoint::new(display_point.row(), 0), Bias::Right); let indent_start = Point::new( point.row, - map.buffer_snapshot + map.buffer_snapshot() .indent_size_for_line(MultiBufferRow(point.row)) .len, ) @@ -262,7 +265,7 @@ pub fn line_end( /// uppercase letter, lowercase letter, '_' character or language-specific word character (like '-' in CSS). pub fn previous_word_start(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayPoint { let raw_point = point.to_point(map); - let classifier = map.buffer_snapshot.char_classifier_at(raw_point); + let classifier = map.buffer_snapshot().char_classifier_at(raw_point); let mut is_first_iteration = true; find_preceding_boundary_display_point(map, point, FindRange::MultiLine, |left, right| { @@ -286,7 +289,7 @@ pub fn previous_word_start(map: &DisplaySnapshot, point: DisplayPoint) -> Displa /// uppercase letter, lowercase letter, '_' character, language-specific word character (like '-' in CSS) or newline. pub fn previous_word_start_or_newline(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayPoint { let raw_point = point.to_point(map); - let classifier = map.buffer_snapshot.char_classifier_at(raw_point); + let classifier = map.buffer_snapshot().char_classifier_at(raw_point); find_preceding_boundary_display_point(map, point, FindRange::MultiLine, |left, right| { (classifier.kind(left) != classifier.kind(right) && !classifier.is_whitespace(right)) @@ -311,23 +314,23 @@ pub fn adjust_greedy_deletion( let is_backward = delete_from > delete_until; let delete_range = if is_backward { map.display_point_to_point(delete_until, Bias::Left) - .to_offset(&map.buffer_snapshot) + .to_offset(map.buffer_snapshot()) ..map .display_point_to_point(delete_from, Bias::Right) - .to_offset(&map.buffer_snapshot) + .to_offset(map.buffer_snapshot()) } else { map.display_point_to_point(delete_from, Bias::Left) - .to_offset(&map.buffer_snapshot) + .to_offset(map.buffer_snapshot()) ..map .display_point_to_point(delete_until, Bias::Right) - .to_offset(&map.buffer_snapshot) + .to_offset(map.buffer_snapshot()) }; let trimmed_delete_range = if ignore_brackets { delete_range } else { let brackets_in_delete_range = map - .buffer_snapshot + .buffer_snapshot() .bracket_ranges(delete_range.clone()) .into_iter() .flatten() @@ -358,7 +361,7 @@ pub fn adjust_greedy_deletion( let mut whitespace_sequence_length = 0; let mut whitespace_sequence_start = 0; for ch in map - .buffer_snapshot + .buffer_snapshot() .text_for_range(trimmed_delete_range.clone()) .flat_map(str::chars) { @@ -402,7 +405,7 @@ pub fn adjust_greedy_deletion( /// lowerspace characters and uppercase characters. pub fn previous_subword_start(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayPoint { let raw_point = point.to_point(map); - let classifier = map.buffer_snapshot.char_classifier_at(raw_point); + let classifier = map.buffer_snapshot().char_classifier_at(raw_point); find_preceding_boundary_display_point(map, point, FindRange::MultiLine, |left, right| { is_subword_start(left, right, &classifier) || left == '\n' @@ -421,7 +424,7 @@ pub fn is_subword_start(left: char, right: char, classifier: &CharClassifier) -> /// uppercase letter, lowercase letter, '_' character or language-specific word character (like '-' in CSS). pub fn next_word_end(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayPoint { let raw_point = point.to_point(map); - let classifier = map.buffer_snapshot.char_classifier_at(raw_point); + let classifier = map.buffer_snapshot().char_classifier_at(raw_point); let mut is_first_iteration = true; find_boundary(map, point, FindRange::MultiLine, |left, right| { // Make alt-right skip punctuation to respect VSCode behaviour. For example: |.hello goes to .hello| @@ -444,7 +447,7 @@ pub fn next_word_end(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayPoint /// uppercase letter, lowercase letter, '_' character, language-specific word character (like '-' in CSS) or newline. pub fn next_word_end_or_newline(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayPoint { let raw_point = point.to_point(map); - let classifier = map.buffer_snapshot.char_classifier_at(raw_point); + let classifier = map.buffer_snapshot().char_classifier_at(raw_point); let mut on_starting_row = true; find_boundary(map, point, FindRange::MultiLine, |left, right| { @@ -463,7 +466,7 @@ pub fn next_word_end_or_newline(map: &DisplaySnapshot, point: DisplayPoint) -> D /// lowerspace characters and uppercase characters. pub fn next_subword_end(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayPoint { let raw_point = point.to_point(map); - let classifier = map.buffer_snapshot.char_classifier_at(raw_point); + let classifier = map.buffer_snapshot().char_classifier_at(raw_point); find_boundary(map, point, FindRange::MultiLine, |left, right| { is_subword_end(left, right, &classifier) || right == '\n' @@ -493,7 +496,7 @@ pub fn start_of_paragraph( let mut found_non_blank_line = false; for row in (0..point.row + 1).rev() { - let blank = map.buffer_snapshot.is_line_blank(MultiBufferRow(row)); + let blank = map.buffer_snapshot().is_line_blank(MultiBufferRow(row)); if found_non_blank_line && blank { if count <= 1 { return Point::new(row, 0).to_display_point(map); @@ -516,13 +519,13 @@ pub fn end_of_paragraph( mut count: usize, ) -> DisplayPoint { let point = display_point.to_point(map); - if point.row == map.buffer_snapshot.max_row().0 { + if point.row == map.buffer_snapshot().max_row().0 { return map.max_point(); } let mut found_non_blank_line = false; - for row in point.row..=map.buffer_snapshot.max_row().0 { - let blank = map.buffer_snapshot.is_line_blank(MultiBufferRow(row)); + for row in point.row..=map.buffer_snapshot().max_row().0 { + let blank = map.buffer_snapshot().is_line_blank(MultiBufferRow(row)); if found_non_blank_line && blank { if count <= 1 { return Point::new(row, 0).to_display_point(map); @@ -543,14 +546,14 @@ pub fn start_of_excerpt( direction: Direction, ) -> DisplayPoint { let point = map.display_point_to_point(display_point, Bias::Left); - let Some(excerpt) = map.buffer_snapshot.excerpt_containing(point..point) else { + let Some(excerpt) = map.buffer_snapshot().excerpt_containing(point..point) else { return display_point; }; match direction { Direction::Prev => { let mut start = excerpt.start_anchor().to_display_point(map); if start >= display_point && start.row() > DisplayRow(0) { - let Some(excerpt) = map.buffer_snapshot.excerpt_before(excerpt.id()) else { + let Some(excerpt) = map.buffer_snapshot().excerpt_before(excerpt.id()) else { return display_point; }; start = excerpt.start_anchor().to_display_point(map); @@ -571,7 +574,7 @@ pub fn end_of_excerpt( direction: Direction, ) -> DisplayPoint { let point = map.display_point_to_point(display_point, Bias::Left); - let Some(excerpt) = map.buffer_snapshot.excerpt_containing(point..point) else { + let Some(excerpt) = map.buffer_snapshot().excerpt_containing(point..point) else { return display_point; }; match direction { @@ -590,7 +593,9 @@ pub fn end_of_excerpt( if end <= display_point { *end.row_mut() += 1; let point_end = map.display_point_to_point(end, Bias::Right); - let Some(excerpt) = map.buffer_snapshot.excerpt_containing(point_end..point_end) + let Some(excerpt) = map + .buffer_snapshot() + .excerpt_containing(point_end..point_end) else { return display_point; }; @@ -643,7 +648,7 @@ pub fn find_preceding_boundary_display_point( is_boundary: impl FnMut(char, char) -> bool, ) -> DisplayPoint { let result = find_preceding_boundary_point( - &map.buffer_snapshot, + map.buffer_snapshot(), from.to_point(map), find_range, is_boundary, @@ -667,7 +672,7 @@ pub fn find_boundary_point( let mut prev_offset = offset; let mut prev_ch = None; - for ch in map.buffer_snapshot.chars_at(offset) { + for ch in map.buffer_snapshot().chars_at(offset) { if find_range == FindRange::SingleLine && ch == '\n' { break; } @@ -695,8 +700,8 @@ pub fn find_preceding_boundary_trail( let mut offset = head.to_offset(map, Bias::Left); let mut trail_offset = None; - let mut prev_ch = map.buffer_snapshot.chars_at(offset).next(); - let mut forward = map.buffer_snapshot.reversed_chars_at(offset).peekable(); + let mut prev_ch = map.buffer_snapshot().chars_at(offset).next(); + let mut forward = map.buffer_snapshot().reversed_chars_at(offset).peekable(); // Skip newlines while let Some(&ch) = forward.peek() { @@ -743,8 +748,8 @@ pub fn find_boundary_trail( let mut offset = head.to_offset(map, Bias::Right); let mut trail_offset = None; - let mut prev_ch = map.buffer_snapshot.reversed_chars_at(offset).next(); - let mut forward = map.buffer_snapshot.chars_at(offset).peekable(); + let mut prev_ch = map.buffer_snapshot().reversed_chars_at(offset).next(); + let mut forward = map.buffer_snapshot().chars_at(offset).peekable(); // Skip newlines while let Some(&ch) = forward.peek() { @@ -807,7 +812,7 @@ pub fn chars_after( map: &DisplaySnapshot, mut offset: usize, ) -> impl Iterator)> + '_ { - map.buffer_snapshot.chars_at(offset).map(move |ch| { + map.buffer_snapshot().chars_at(offset).map(move |ch| { let before = offset; offset += ch.len_utf8(); (ch, before..offset) @@ -821,7 +826,7 @@ pub fn chars_before( map: &DisplaySnapshot, mut offset: usize, ) -> impl Iterator)> + '_ { - map.buffer_snapshot + map.buffer_snapshot() .reversed_chars_at(offset) .map(move |ch| { let after = offset; @@ -1018,22 +1023,22 @@ mod tests { [ Inlay::edit_prediction( post_inc(&mut id), - buffer_snapshot.anchor_at(offset, Bias::Left), + buffer_snapshot.anchor_before(offset), "test", ), Inlay::edit_prediction( post_inc(&mut id), - buffer_snapshot.anchor_at(offset, Bias::Right), + buffer_snapshot.anchor_after(offset), "test", ), Inlay::mock_hint( post_inc(&mut id), - buffer_snapshot.anchor_at(offset, Bias::Left), + buffer_snapshot.anchor_before(offset), "test", ), Inlay::mock_hint( post_inc(&mut id), - buffer_snapshot.anchor_at(offset, Bias::Right), + buffer_snapshot.anchor_after(offset), "test", ), ] @@ -1052,7 +1057,7 @@ mod tests { |left, _| left == 'e', ), snapshot - .buffer_snapshot + .buffer_snapshot() .offset_to_point(5) .to_display_point(&snapshot), "Should not stop at inlays when looking for boundaries" @@ -1220,13 +1225,13 @@ mod tests { up( &snapshot, DisplayPoint::new(DisplayRow(0), 2), - SelectionGoal::HorizontalPosition(col_2_x.0), + SelectionGoal::HorizontalPosition(f64::from(col_2_x)), false, &text_layout_details ), ( DisplayPoint::new(DisplayRow(0), 0), - SelectionGoal::HorizontalPosition(col_2_x.0), + SelectionGoal::HorizontalPosition(f64::from(col_2_x)), ), ); assert_eq!( @@ -1251,26 +1256,26 @@ mod tests { up( &snapshot, DisplayPoint::new(DisplayRow(1), 4), - SelectionGoal::HorizontalPosition(col_4_x.0), + SelectionGoal::HorizontalPosition(col_4_x.into()), false, &text_layout_details ), ( DisplayPoint::new(DisplayRow(0), 3), - SelectionGoal::HorizontalPosition(col_4_x.0) + SelectionGoal::HorizontalPosition(col_4_x.into()) ), ); assert_eq!( down( &snapshot, DisplayPoint::new(DisplayRow(0), 3), - SelectionGoal::HorizontalPosition(col_4_x.0), + SelectionGoal::HorizontalPosition(col_4_x.into()), false, &text_layout_details ), ( DisplayPoint::new(DisplayRow(1), 4), - SelectionGoal::HorizontalPosition(col_4_x.0) + SelectionGoal::HorizontalPosition(col_4_x.into()) ), ); @@ -1282,26 +1287,26 @@ mod tests { up( &snapshot, DisplayPoint::new(DisplayRow(3), 5), - SelectionGoal::HorizontalPosition(col_5_x.0), + SelectionGoal::HorizontalPosition(col_5_x.into()), false, &text_layout_details ), ( DisplayPoint::new(DisplayRow(1), 4), - SelectionGoal::HorizontalPosition(col_5_x.0) + SelectionGoal::HorizontalPosition(col_5_x.into()) ), ); assert_eq!( down( &snapshot, DisplayPoint::new(DisplayRow(1), 4), - SelectionGoal::HorizontalPosition(col_5_x.0), + SelectionGoal::HorizontalPosition(col_5_x.into()), false, &text_layout_details ), ( DisplayPoint::new(DisplayRow(3), 5), - SelectionGoal::HorizontalPosition(col_5_x.0) + SelectionGoal::HorizontalPosition(col_5_x.into()) ), ); @@ -1326,13 +1331,13 @@ mod tests { down( &snapshot, DisplayPoint::new(DisplayRow(4), 2), - SelectionGoal::HorizontalPosition(max_point_x.0), + SelectionGoal::HorizontalPosition(max_point_x.into()), false, &text_layout_details ), ( DisplayPoint::new(DisplayRow(4), 2), - SelectionGoal::HorizontalPosition(max_point_x.0) + SelectionGoal::HorizontalPosition(max_point_x.into()) ), ); }); diff --git a/crates/editor/src/persistence.rs b/crates/editor/src/persistence.rs index ec7c149b4e107600c35e70ef3dffcdb2e8f8bcb7..840398474bb02542e452c79864b722cc91b111b3 100644 --- a/crates/editor/src/persistence.rs +++ b/crates/editor/src/persistence.rs @@ -35,7 +35,7 @@ impl Bind for SerializedEditor { &self .abs_path .as_ref() - .map(|p| p.to_string_lossy().to_string()), + .map(|p| p.to_string_lossy().into_owned()), start_index, )?; let start_index = statement.bind(&self.contents, start_index)?; @@ -235,7 +235,7 @@ impl EditorDb { // Returns the scroll top row, and offset query! { - pub fn get_scroll_position(item_id: ItemId, workspace_id: WorkspaceId) -> Result> { + pub fn get_scroll_position(item_id: ItemId, workspace_id: WorkspaceId) -> Result> { SELECT scroll_top_row, scroll_horizontal_offset, scroll_vertical_offset FROM editors WHERE item_id = ? AND workspace_id = ? @@ -247,8 +247,8 @@ impl EditorDb { item_id: ItemId, workspace_id: WorkspaceId, top_row: u32, - vertical_offset: f32, - horizontal_offset: f32 + vertical_offset: f64, + horizontal_offset: f64 ) -> Result<()> { UPDATE OR IGNORE editors SET diff --git a/crates/editor/src/rust_analyzer_ext.rs b/crates/editor/src/rust_analyzer_ext.rs index f4059ca03d2ad70106aa958b4fe0c545cb4988ea..ffa0c017c0eb157df776cc49e0dba51e617e3379 100644 --- a/crates/editor/src/rust_analyzer_ext.rs +++ b/crates/editor/src/rust_analyzer_ext.rs @@ -319,7 +319,7 @@ fn cancel_flycheck_action( }; let buffer_id = editor .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .find_map(|selection| { let buffer_id = selection.start.buffer_id.or(selection.end.buffer_id)?; @@ -344,7 +344,7 @@ fn run_flycheck_action( }; let buffer_id = editor .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .find_map(|selection| { let buffer_id = selection.start.buffer_id.or(selection.end.buffer_id)?; @@ -369,7 +369,7 @@ fn clear_flycheck_action( }; let buffer_id = editor .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .find_map(|selection| { let buffer_id = selection.start.buffer_id.or(selection.end.buffer_id)?; diff --git a/crates/editor/src/scroll.rs b/crates/editor/src/scroll.rs index 828ab0594daf09081bf10af02ec5a4a6a470cd7d..dae668a4b4f9cd718d034f45259d3706e515fafb 100644 --- a/crates/editor/src/scroll.rs +++ b/crates/editor/src/scroll.rs @@ -30,9 +30,11 @@ const SCROLLBAR_SHOW_INTERVAL: Duration = Duration::from_secs(1); pub struct WasScrolled(pub(crate) bool); +pub type ScrollOffset = f64; +pub type ScrollPixelOffset = f64; #[derive(Clone, Copy, Debug, PartialEq)] pub struct ScrollAnchor { - pub offset: gpui::Point, + pub offset: gpui::Point, pub anchor: Anchor, } @@ -44,12 +46,12 @@ impl ScrollAnchor { } } - pub fn scroll_position(&self, snapshot: &DisplaySnapshot) -> gpui::Point { + pub fn scroll_position(&self, snapshot: &DisplaySnapshot) -> gpui::Point { self.offset.apply_along(Axis::Vertical, |offset| { if self.anchor == Anchor::min() { 0. } else { - let scroll_top = self.anchor.to_display_point(snapshot).row().as_f32(); + let scroll_top = self.anchor.to_display_point(snapshot).row().as_f64(); (offset + scroll_top).max(0.) } }) @@ -147,19 +149,24 @@ impl ActiveScrollbarState { } pub struct ScrollManager { - pub(crate) vertical_scroll_margin: f32, + pub(crate) vertical_scroll_margin: ScrollOffset, anchor: ScrollAnchor, ongoing: OngoingScroll, /// The second element indicates whether the autoscroll request is local /// (true) or remote (false). Local requests are initiated by user actions, /// while remote requests come from external sources. autoscroll_request: Option<(Autoscroll, bool)>, - last_autoscroll: Option<(gpui::Point, f32, f32, AutoscrollStrategy)>, + last_autoscroll: Option<( + gpui::Point, + ScrollOffset, + ScrollOffset, + AutoscrollStrategy, + )>, show_scrollbars: bool, hide_scrollbar_task: Option>, active_scrollbar: Option, - visible_line_count: Option, - visible_column_count: Option, + visible_line_count: Option, + visible_column_count: Option, forbid_vertical_scroll: bool, minimap_thumb_state: Option, } @@ -200,13 +207,13 @@ impl ScrollManager { self.ongoing.axis = axis; } - pub fn scroll_position(&self, snapshot: &DisplaySnapshot) -> gpui::Point { + pub fn scroll_position(&self, snapshot: &DisplaySnapshot) -> gpui::Point { self.anchor.scroll_position(snapshot) } fn set_scroll_position( &mut self, - scroll_position: gpui::Point, + scroll_position: gpui::Point, map: &DisplaySnapshot, local: bool, autoscroll: bool, @@ -219,7 +226,7 @@ impl ScrollManager { ScrollBeyondLastLine::OnePage => scroll_top, ScrollBeyondLastLine::Off => { if let Some(height_in_lines) = self.visible_line_count { - let max_row = map.max_point().row().0 as f32; + let max_row = map.max_point().row().as_f64(); scroll_top.min(max_row - height_in_lines + 1.).max(0.) } else { scroll_top @@ -227,7 +234,7 @@ impl ScrollManager { } ScrollBeyondLastLine::VerticalScrollMargin => { if let Some(height_in_lines) = self.visible_line_count { - let max_row = map.max_point().row().0 as f32; + let max_row = map.max_point().row().as_f64(); scroll_top .min(max_row - height_in_lines + 1. + self.vertical_scroll_margin) .max(0.) @@ -244,16 +251,14 @@ impl ScrollManager { Bias::Left, ) .to_point(map); - let top_anchor = map - .buffer_snapshot - .anchor_at(scroll_top_buffer_point, Bias::Right); + let top_anchor = map.buffer_snapshot().anchor_after(scroll_top_buffer_point); self.set_anchor( ScrollAnchor { anchor: top_anchor, offset: point( scroll_position.x.max(0.), - scroll_top - top_anchor.to_display_point(map).row().as_f32(), + scroll_top - top_anchor.to_display_point(map).row().as_f64(), ), }, scroll_top_buffer_point.row, @@ -439,7 +444,7 @@ impl ScrollManager { self.minimap_thumb_state } - pub fn clamp_scroll_left(&mut self, max: f32) -> bool { + pub fn clamp_scroll_left(&mut self, max: f64) -> bool { if max < self.anchor.offset.x { self.anchor.offset.x = max; true @@ -463,11 +468,11 @@ impl Editor { } pub fn set_vertical_scroll_margin(&mut self, margin_rows: usize, cx: &mut Context) { - self.scroll_manager.vertical_scroll_margin = margin_rows as f32; + self.scroll_manager.vertical_scroll_margin = margin_rows as f64; cx.notify(); } - pub fn visible_line_count(&self) -> Option { + pub fn visible_line_count(&self) -> Option { self.scroll_manager.visible_line_count } @@ -476,13 +481,13 @@ impl Editor { .map(|line_count| line_count as u32 - 1) } - pub fn visible_column_count(&self) -> Option { + pub fn visible_column_count(&self) -> Option { self.scroll_manager.visible_column_count } pub(crate) fn set_visible_line_count( &mut self, - lines: f32, + lines: f64, window: &mut Window, cx: &mut Context, ) { @@ -501,7 +506,7 @@ impl Editor { } } - pub(crate) fn set_visible_column_count(&mut self, columns: f32) { + pub(crate) fn set_visible_column_count(&mut self, columns: f64) { self.scroll_manager.visible_column_count = Some(columns); } @@ -516,13 +521,14 @@ impl Editor { delta.y = 0.0; } let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); - let position = self.scroll_manager.anchor.scroll_position(&display_map) + delta; + let position = + self.scroll_manager.anchor.scroll_position(&display_map) + delta.map(f64::from); self.set_scroll_position_taking_display_map(position, true, false, display_map, window, cx); } pub fn set_scroll_position( &mut self, - scroll_position: gpui::Point, + scroll_position: gpui::Point, window: &mut Window, cx: &mut Context, ) -> WasScrolled { @@ -544,7 +550,7 @@ impl Editor { let snapshot = self.snapshot(window, cx).display_snapshot; let new_screen_top = DisplayPoint::new(row, 0); let new_screen_top = new_screen_top.to_offset(&snapshot, Bias::Left); - let new_anchor = snapshot.buffer_snapshot.anchor_before(new_screen_top); + let new_anchor = snapshot.buffer_snapshot().anchor_before(new_screen_top); self.set_scroll_anchor( ScrollAnchor { @@ -558,7 +564,7 @@ impl Editor { pub(crate) fn set_scroll_position_internal( &mut self, - scroll_position: gpui::Point, + scroll_position: gpui::Point, local: bool, autoscroll: bool, window: &mut Window, @@ -577,7 +583,7 @@ impl Editor { fn set_scroll_position_taking_display_map( &mut self, - scroll_position: gpui::Point, + scroll_position: gpui::Point, local: bool, autoscroll: bool, display_map: DisplaySnapshot, @@ -612,7 +618,7 @@ impl Editor { editor_was_scrolled } - pub fn scroll_position(&self, cx: &mut Context) -> gpui::Point { + pub fn scroll_position(&self, cx: &mut Context) -> gpui::Point { let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); self.scroll_manager.anchor.scroll_position(&display_map) } @@ -699,9 +705,9 @@ impl Editor { if matches!( settings.defaults.soft_wrap, SoftWrap::PreferredLineLength | SoftWrap::Bounded - ) && (settings.defaults.preferred_line_length as f32) < visible_column_count + ) && (settings.defaults.preferred_line_length as f64) < visible_column_count { - visible_column_count = settings.defaults.preferred_line_length as f32; + visible_column_count = settings.defaults.preferred_line_length as f64; } // If the scroll position is currently at the left edge of the document @@ -712,7 +718,8 @@ impl Editor { && amount.columns(visible_column_count) > 0. && let Some(last_position_map) = &self.last_position_map { - current_position.x += self.gutter_dimensions.margin / last_position_map.em_advance; + current_position.x += + f64::from(self.gutter_dimensions.margin / last_position_map.em_advance); } let new_position = current_position + point( @@ -767,7 +774,7 @@ impl Editor { .buffer() .read(cx) .snapshot(cx) - .anchor_at(Point::new(top_row, 0), Bias::Left); + .anchor_before(Point::new(top_row, 0)); let scroll_anchor = ScrollAnchor { offset: gpui::Point::new(x, y), anchor: top_anchor, diff --git a/crates/editor/src/scroll/actions.rs b/crates/editor/src/scroll/actions.rs index f8104665f904e08466c72f3c410e58cb941c6b6f..1d98cb537ab8cc9dcf7aac23e6c43f6c1a26ff0a 100644 --- a/crates/editor/src/scroll/actions.rs +++ b/crates/editor/src/scroll/actions.rs @@ -2,7 +2,7 @@ use super::Axis; use crate::{ Autoscroll, Editor, EditorMode, NextScreen, NextScrollCursorCenterTopBottom, SCROLL_CENTER_TOP_BOTTOM_DEBOUNCE_TIMEOUT, ScrollCursorBottom, ScrollCursorCenter, - ScrollCursorCenterTopBottom, ScrollCursorTop, display_map::DisplayRow, + ScrollCursorCenterTopBottom, ScrollCursorTop, display_map::DisplayRow, scroll::ScrollOffset, }; use gpui::{Context, Point, Window}; @@ -25,7 +25,7 @@ impl Editor { pub fn scroll( &mut self, - scroll_position: Point, + scroll_position: Point, axis: Option, window: &mut Window, cx: &mut Context, diff --git a/crates/editor/src/scroll/autoscroll.rs b/crates/editor/src/scroll/autoscroll.rs index 057d622903ed12b4d996759cd93dc76f2ba9ee8d..9130e3cbf879d1b38461a34470b79cc5a50a3cac 100644 --- a/crates/editor/src/scroll/autoscroll.rs +++ b/crates/editor/src/scroll/autoscroll.rs @@ -1,11 +1,12 @@ use crate::{ DisplayRow, Editor, EditorMode, LineWithInvisibles, RowExt, SelectionEffects, - display_map::ToDisplayPoint, scroll::WasScrolled, + display_map::ToDisplayPoint, + scroll::{ScrollOffset, WasScrolled}, }; -use gpui::{Bounds, Context, Pixels, Window, px}; +use gpui::{Bounds, Context, Pixels, Window}; use language::Point; use multi_buffer::Anchor; -use std::{cmp, f32}; +use std::cmp; #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum Autoscroll { @@ -106,20 +107,21 @@ impl Editor { &mut self, bounds: Bounds, line_height: Pixels, - max_scroll_top: f32, + max_scroll_top: ScrollOffset, autoscroll_request: Option<(Autoscroll, bool)>, window: &mut Window, cx: &mut Context, ) -> (NeedsHorizontalAutoscroll, WasScrolled) { let viewport_height = bounds.size.height; - let visible_lines = viewport_height / line_height; + let visible_lines = ScrollOffset::from(viewport_height / line_height); let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); let mut scroll_position = self.scroll_manager.scroll_position(&display_map); let original_y = scroll_position.y; if let Some(last_bounds) = self.expect_bounds_change.take() && scroll_position.y != 0. { - scroll_position.y += (bounds.top() - last_bounds.top()) / line_height; + scroll_position.y += + ScrollOffset::from((bounds.top() - last_bounds.top()) / line_height); if scroll_position.y < 0. { scroll_position.y = 0.; } @@ -143,7 +145,7 @@ impl Editor { if let Some(first_highlighted_row) = self.highlighted_display_row_for_autoscroll(&display_map) { - target_top = first_highlighted_row.as_f32(); + target_top = first_highlighted_row.as_f64(); target_bottom = target_top + 1.; } else { let selections = self.selections.all::(cx); @@ -154,7 +156,7 @@ impl Editor { .head() .to_display_point(&display_map) .row() - .as_f32(); + .as_f64(); target_bottom = selections .last() .unwrap() @@ -162,7 +164,7 @@ impl Editor { .to_display_point(&display_map) .row() .next_row() - .as_f32(); + .as_f64(); let selections_fit = target_bottom - target_top <= visible_lines; if matches!( @@ -178,7 +180,7 @@ impl Editor { .head() .to_display_point(&display_map) .row() - .as_f32(); + .as_f64(); target_top = newest_selection_top; target_bottom = newest_selection_top + 1.; } @@ -209,7 +211,7 @@ impl Editor { } }; if let Autoscroll::Strategy(_, Some(anchor)) = autoscroll { - target_top = anchor.to_display_point(&display_map).row().as_f32(); + target_top = anchor.to_display_point(&display_map).row().as_f64(); target_bottom = target_top + 1.; } @@ -254,11 +256,11 @@ impl Editor { self.set_scroll_position_internal(scroll_position, local, true, window, cx) } AutoscrollStrategy::TopRelative(lines) => { - scroll_position.y = target_top - lines as f32; + scroll_position.y = target_top - lines as ScrollOffset; self.set_scroll_position_internal(scroll_position, local, true, window, cx) } AutoscrollStrategy::BottomRelative(lines) => { - scroll_position.y = target_bottom + lines as f32; + scroll_position.y = target_bottom + lines as ScrollOffset; self.set_scroll_position_internal(scroll_position, local, true, window, cx) } }; @@ -284,22 +286,25 @@ impl Editor { autoscroll_request: Option<(Autoscroll, bool)>, window: &mut Window, cx: &mut Context, - ) -> Option> { + ) -> Option> { let (_, local) = autoscroll_request?; + let em_advance = ScrollOffset::from(em_advance); + let viewport_width = ScrollOffset::from(viewport_width); + let scroll_width = ScrollOffset::from(scroll_width); let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); let selections = self.selections.all::(cx); let mut scroll_position = self.scroll_manager.scroll_position(&display_map); let mut target_left; - let mut target_right; + let mut target_right: f64; if self .highlighted_display_row_for_autoscroll(&display_map) .is_none() { - target_left = px(f32::INFINITY); - target_right = px(0.); + target_left = f64::INFINITY; + target_right = 0.; for selection in selections { let head = selection.head().to_display_point(&display_map); if head.row() >= start_row @@ -307,21 +312,22 @@ impl Editor { { let start_column = head.column(); let end_column = cmp::min(display_map.line_len(head.row()), head.column()); - target_left = target_left.min( + target_left = target_left.min(ScrollOffset::from( layouts[head.row().minus(start_row) as usize] .x_for_index(start_column as usize) + self.gutter_dimensions.margin, - ); + )); target_right = target_right.max( - layouts[head.row().minus(start_row) as usize] - .x_for_index(end_column as usize) - + em_advance, + ScrollOffset::from( + layouts[head.row().minus(start_row) as usize] + .x_for_index(end_column as usize), + ) + em_advance, ); } } } else { - target_left = px(0.); - target_right = px(0.); + target_left = 0.; + target_right = 0.; } target_right = target_right.min(scroll_width); diff --git a/crates/editor/src/scroll/scroll_amount.rs b/crates/editor/src/scroll/scroll_amount.rs index 43f1aa128548597ee07cbb297ab5aaf0e8f79b6e..3280290d6e5ccc1ca3eecc3755c2039bd024cc24 100644 --- a/crates/editor/src/scroll/scroll_amount.rs +++ b/crates/editor/src/scroll/scroll_amount.rs @@ -1,5 +1,5 @@ use serde::Deserialize; -use ui::{Pixels, px}; +use ui::Pixels; #[derive(Debug)] pub enum ScrollDirection { @@ -28,41 +28,41 @@ pub enum ScrollAmount { } impl ScrollAmount { - pub fn lines(&self, mut visible_line_count: f32) -> f32 { + pub fn lines(&self, mut visible_line_count: f64) -> f64 { match self { - Self::Line(count) => *count, + Self::Line(count) => *count as f64, Self::Page(count) => { // for full pages subtract one to leave an anchor line if self.is_full_page() { visible_line_count -= 1.0 } - (visible_line_count * count).trunc() + (visible_line_count * (*count as f64)).trunc() } Self::Column(_count) => 0.0, Self::PageWidth(_count) => 0.0, } } - pub fn columns(&self, visible_column_count: f32) -> f32 { + pub fn columns(&self, visible_column_count: f64) -> f64 { match self { Self::Line(_count) => 0.0, Self::Page(_count) => 0.0, - Self::Column(count) => *count, - Self::PageWidth(count) => (visible_column_count * count).trunc(), + Self::Column(count) => *count as f64, + Self::PageWidth(count) => (visible_column_count * *count as f64).trunc(), } } pub fn pixels(&self, line_height: Pixels, height: Pixels) -> Pixels { match self { - ScrollAmount::Line(x) => px(line_height.0 * x), - ScrollAmount::Page(x) => px(height.0 * x), + ScrollAmount::Line(x) => line_height * *x, + ScrollAmount::Page(x) => height * *x, // This function seems to only be leveraged by the popover that is // displayed by the editor when, for example, viewing a function's // documentation. Right now that only supports vertical scrolling, // so I'm leaving this at 0.0 for now to try and make it clear that // this should not have an impact on that? - ScrollAmount::Column(_) => px(0.0), - ScrollAmount::PageWidth(_) => px(0.0), + ScrollAmount::Column(_) => Pixels::ZERO, + ScrollAmount::PageWidth(_) => Pixels::ZERO, } } diff --git a/crates/editor/src/selections_collection.rs b/crates/editor/src/selections_collection.rs index 0a02390b641e1020aff8d9cf0167b44485baf489..5ab6d25eb9abcfa0846a176f83e2f2620245bb47 100644 --- a/crates/editor/src/selections_collection.rs +++ b/crates/editor/src/selections_collection.rs @@ -1,6 +1,6 @@ use std::{ cell::Ref, - cmp, iter, mem, + cmp, fmt, iter, mem, ops::{Deref, DerefMut, Range, Sub}, sync::Arc, }; @@ -28,13 +28,13 @@ pub struct PendingSelection { pub struct SelectionsCollection { display_map: Entity, buffer: Entity, - pub next_selection_id: usize, - pub line_mode: bool, + next_selection_id: usize, + line_mode: bool, /// The non-pending, non-overlapping selections. /// The [SelectionsCollection::pending] selection could possibly overlap these - pub disjoint: Arc<[Selection]>, + disjoint: Arc<[Selection]>, /// A pending selection, such as when the mouse is being dragged - pub pending: Option, + pending: Option, } impl SelectionsCollection { @@ -84,20 +84,27 @@ impl SelectionsCollection { /// The non-pending, non-overlapping selections. There could be a pending selection that /// overlaps these if the mouse is being dragged, etc. This could also be empty if there is a /// pending selection. Returned as selections over Anchors. - pub fn disjoint_anchors(&self) -> Arc<[Selection]> { + pub fn disjoint_anchors_arc(&self) -> Arc<[Selection]> { self.disjoint.clone() } + /// The non-pending, non-overlapping selections. There could be a pending selection that + /// overlaps these if the mouse is being dragged, etc. This could also be empty if there is a + /// pending selection. Returned as selections over Anchors. + pub fn disjoint_anchors(&self) -> &[Selection] { + &self.disjoint + } + pub fn disjoint_anchor_ranges(&self) -> impl Iterator> { // Mapping the Arc slice would borrow it, whereas indexing captures it. - let disjoint = self.disjoint_anchors(); + let disjoint = self.disjoint_anchors_arc(); (0..disjoint.len()).map(move |ix| disjoint[ix].range()) } /// Non-overlapping selections using anchors, including the pending selection. pub fn all_anchors(&self, cx: &mut App) -> Arc<[Selection]> { if self.pending.is_none() { - self.disjoint_anchors() + self.disjoint_anchors_arc() } else { let all_offset_selections = self.all::(cx); let buffer = self.buffer(cx); @@ -108,10 +115,12 @@ impl SelectionsCollection { } } - pub fn pending_anchor(&self) -> Option> { - self.pending - .as_ref() - .map(|pending| pending.selection.clone()) + pub fn pending_anchor(&self) -> Option<&Selection> { + self.pending.as_ref().map(|pending| &pending.selection) + } + + pub fn pending_anchor_mut(&mut self) -> Option<&mut Selection> { + self.pending.as_mut().map(|pending| &mut pending.selection) } pub fn pending>( @@ -120,7 +129,7 @@ impl SelectionsCollection { ) -> Option> { let map = self.display_map(cx); - resolve_selections(self.pending_anchor().as_ref(), &map).next() + resolve_selections(self.pending_anchor(), &map).next() } pub(crate) fn pending_mode(&self) -> Option { @@ -175,6 +184,27 @@ impl SelectionsCollection { selections } + /// Returns all of the selections, adjusted to take into account the selection line_mode. Uses a provided snapshot to resolve selections. + pub fn all_adjusted_with_snapshot( + &self, + snapshot: &MultiBufferSnapshot, + ) -> Vec> { + let mut selections = self + .disjoint + .iter() + .chain(self.pending_anchor()) + .map(|anchor| anchor.map(|anchor| anchor.to_point(&snapshot))) + .collect::>(); + if self.line_mode { + for selection in &mut selections { + let new_range = snapshot.expand_to_line(selection.range()); + selection.start = new_range.start; + selection.end = new_range.end; + } + } + selections + } + /// Returns the newest selection, adjusted to take into account the selection line_mode pub fn newest_adjusted(&self, cx: &mut App) -> Selection { let mut selection = self.newest::(cx); @@ -216,13 +246,13 @@ impl SelectionsCollection { let map = self.display_map(cx); let start_ix = match self .disjoint - .binary_search_by(|probe| probe.end.cmp(&range.start, &map.buffer_snapshot)) + .binary_search_by(|probe| probe.end.cmp(&range.start, map.buffer_snapshot())) { Ok(ix) | Err(ix) => ix, }; let end_ix = match self .disjoint - .binary_search_by(|probe| probe.start.cmp(&range.end, &map.buffer_snapshot)) + .binary_search_by(|probe| probe.start.cmp(&range.end, map.buffer_snapshot())) { Ok(ix) => ix + 1, Err(ix) => ix, @@ -234,8 +264,7 @@ impl SelectionsCollection { let map = self.display_map(cx); let disjoint_anchors = &self.disjoint; let mut disjoint = resolve_selections_display(disjoint_anchors.iter(), &map).peekable(); - let mut pending_opt = - resolve_selections_display(self.pending_anchor().as_ref(), &map).next(); + let mut pending_opt = resolve_selections_display(self.pending_anchor(), &map).next(); let selections = iter::from_fn(move || { if let Some(pending) = pending_opt.as_mut() { while let Some(next_selection) = disjoint.peek() { @@ -324,6 +353,9 @@ impl SelectionsCollection { self.all(cx).last().unwrap().clone() } + /// Returns a list of (potentially backwards!) ranges representing the selections. + /// Useful for test assertions, but prefer `.all()` instead. + #[cfg(any(test, feature = "test-support"))] pub fn ranges>( &self, cx: &mut App, @@ -343,9 +375,9 @@ impl SelectionsCollection { #[cfg(any(test, feature = "test-support"))] pub fn display_ranges(&self, cx: &mut App) -> Vec> { let display_map = self.display_map(cx); - self.disjoint_anchors() + self.disjoint_anchors_arc() .iter() - .chain(self.pending_anchor().as_ref()) + .chain(self.pending_anchor()) .map(|s| { if s.reversed { s.end.to_display_point(&display_map)..s.start.to_display_point(&display_map) @@ -412,6 +444,18 @@ impl SelectionsCollection { ); (mutable_collection.selections_changed, result) } + + pub fn next_selection_id(&self) -> usize { + self.next_selection_id + } + + pub fn line_mode(&self) -> bool { + self.line_mode + } + + pub fn set_line_mode(&mut self, line_mode: bool) { + self.line_mode = line_mode; + } } pub struct MutableSelectionsCollection<'a> { @@ -420,6 +464,15 @@ pub struct MutableSelectionsCollection<'a> { cx: &'a mut App, } +impl<'a> fmt::Debug for MutableSelectionsCollection<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("MutableSelectionsCollection") + .field("collection", &self.collection) + .field("selections_changed", &self.selections_changed) + .finish() + } +} + impl<'a> MutableSelectionsCollection<'a> { pub fn display_map(&mut self) -> DisplaySnapshot { self.collection.display_map(self.cx) @@ -457,13 +510,24 @@ impl<'a> MutableSelectionsCollection<'a> { } pub(crate) fn set_pending_anchor_range(&mut self, range: Range, mode: SelectMode) { + let buffer = self.buffer.read(self.cx).snapshot(self.cx); self.collection.pending = Some(PendingSelection { - selection: Selection { - id: post_inc(&mut self.collection.next_selection_id), - start: range.start, - end: range.end, - reversed: false, - goal: SelectionGoal::None, + selection: { + let mut start = range.start; + let mut end = range.end; + let reversed = if start.cmp(&end, &buffer).is_gt() { + mem::swap(&mut start, &mut end); + true + } else { + false + }; + Selection { + id: post_inc(&mut self.collection.next_selection_id), + start, + end, + reversed, + goal: SelectionGoal::None, + } }, mode, }); @@ -891,10 +955,10 @@ fn selection_to_anchor_selection( where T: ToOffset + Ord, { - let end_bias = if selection.end > selection.start { - Bias::Left - } else { + let end_bias = if selection.start == selection.end { Bias::Right + } else { + Bias::Left }; Selection { id: selection.id, @@ -905,49 +969,59 @@ where } } -// Panics if passed selections are not in order -fn resolve_selections_display<'a>( +fn resolve_selections_point<'a>( selections: impl 'a + IntoIterator>, map: &'a DisplaySnapshot, -) -> impl 'a + Iterator> { +) -> impl 'a + Iterator> { let (to_summarize, selections) = selections.into_iter().tee(); let mut summaries = map - .buffer_snapshot + .buffer_snapshot() .summaries_for_anchors::(to_summarize.flat_map(|s| [&s.start, &s.end])) .into_iter(); - let mut selections = selections - .map(move |s| { - let start = summaries.next().unwrap(); - let end = summaries.next().unwrap(); - - let display_start = map.point_to_display_point(start, Bias::Left); - let display_end = if start == end { - map.point_to_display_point(end, Bias::Right) - } else { - map.point_to_display_point(end, Bias::Left) - }; + selections.map(move |s| { + let start = summaries.next().unwrap(); + let end = summaries.next().unwrap(); + assert!(start <= end, "start: {:?}, end: {:?}", start, end); + Selection { + id: s.id, + start, + end, + reversed: s.reversed, + goal: s.goal, + } + }) +} - Selection { - id: s.id, - start: display_start, - end: display_end, - reversed: s.reversed, - goal: s.goal, - } - }) - .peekable(); - iter::from_fn(move || { - let mut selection = selections.next()?; - while let Some(next_selection) = selections.peek() { - if selection.end >= next_selection.start { - selection.end = cmp::max(selection.end, next_selection.end); - selections.next(); +// Panics if passed selections are not in order +fn resolve_selections_display<'a>( + selections: impl 'a + IntoIterator>, + map: &'a DisplaySnapshot, +) -> impl 'a + Iterator> { + let selections = resolve_selections_point(selections, map).map(move |s| { + let display_start = map.point_to_display_point(s.start, Bias::Left); + let display_end = map.point_to_display_point( + s.end, + if s.start == s.end { + Bias::Right } else { - break; - } + Bias::Left + }, + ); + assert!( + display_start <= display_end, + "display_start: {:?}, display_end: {:?}", + display_start, + display_end + ); + Selection { + id: s.id, + start: display_start, + end: display_end, + reversed: s.reversed, + goal: s.goal, } - Some(selection) - }) + }); + coalesce_selections(selections) } // Panics if passed selections are not in order @@ -961,15 +1035,17 @@ where { let (to_convert, selections) = resolve_selections_display(selections, map).tee(); let mut converted_endpoints = - map.buffer_snapshot + map.buffer_snapshot() .dimensions_from_points::(to_convert.flat_map(|s| { let start = map.display_point_to_point(s.start, Bias::Left); let end = map.display_point_to_point(s.end, Bias::Right); + assert!(start <= end, "start: {:?}, end: {:?}", start, end); [start, end] })); selections.map(move |s| { let start = converted_endpoints.next().unwrap(); let end = converted_endpoints.next().unwrap(); + assert!(start <= end, "start: {:?}, end: {:?}", start, end); Selection { id: s.id, start, @@ -979,3 +1055,33 @@ where } }) } + +fn coalesce_selections( + selections: impl Iterator>, +) -> impl Iterator> { + let mut selections = selections.peekable(); + iter::from_fn(move || { + let mut selection = selections.next()?; + while let Some(next_selection) = selections.peek() { + if selection.end >= next_selection.start { + if selection.reversed == next_selection.reversed { + selection.end = cmp::max(selection.end, next_selection.end); + selections.next(); + } else { + selection.end = cmp::max(selection.start, next_selection.start); + break; + } + } else { + break; + } + } + assert!( + selection.start <= selection.end, + "selection.start: {:?}, selection.end: {:?}, selection.reversed: {:?}", + selection.start, + selection.end, + selection.reversed + ); + Some(selection) + }) +} diff --git a/crates/editor/src/signature_help.rs b/crates/editor/src/signature_help.rs index 74d7e3ecd2ad1f315274f99afbbd67273be3956a..dd1a4b4f36462f4fc11495ae9aaafd9e1bd9252c 100644 --- a/crates/editor/src/signature_help.rs +++ b/crates/editor/src/signature_help.rs @@ -389,7 +389,7 @@ impl SignatureHelpPopover { ) }), ) - .vertical_scrollbar(window, cx); + .vertical_scrollbar_for(self.scroll_handle.clone(), window, cx); let controls = if self.signatures.len() > 1 { let prev_button = IconButton::new("signature_help_prev", IconName::ChevronUp) diff --git a/crates/editor/src/tasks.rs b/crates/editor/src/tasks.rs index 8be2a3a2e14d7b815d2ca3496adc6f70ec16055e..d27e4564057ae9b0827ddec98bb3cfaeaf455211 100644 --- a/crates/editor/src/tasks.rs +++ b/crates/editor/src/tasks.rs @@ -28,12 +28,12 @@ impl Editor { let selection_range = selection.range(); let start = editor_snapshot .display_snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_after(selection_range.start) .text_anchor; let end = editor_snapshot .display_snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_after(selection_range.end) .text_anchor; let location = Location { diff --git a/crates/editor/src/test.rs b/crates/editor/src/test.rs index 03e99b9fff9a89fcac28605fe6bf7a08b23f8f02..a3a8d81c64a709b65d8d7a894e338800cdeb71c5 100644 --- a/crates/editor/src/test.rs +++ b/crates/editor/src/test.rs @@ -186,7 +186,7 @@ pub fn editor_content_with_blocks(editor: &Entity, cx: &mut VisualTestCo match block { Block::Custom(custom_block) => { if let BlockPlacement::Near(x) = &custom_block.placement - && snapshot.intersects_fold(x.to_point(&snapshot.buffer_snapshot)) + && snapshot.intersects_fold(x.to_point(&snapshot.buffer_snapshot())) { continue; }; @@ -217,15 +217,7 @@ pub fn editor_content_with_blocks(editor: &Entity, cx: &mut VisualTestCo height, } => { lines[row.0 as usize].push_str(&cx.update(|_, cx| { - format!( - "§ {}", - first_excerpt - .buffer - .file() - .unwrap() - .file_name(cx) - .to_string_lossy() - ) + format!("§ {}", first_excerpt.buffer.file().unwrap().file_name(cx)) })); for row in row.0 + 1..row.0 + height { lines[row as usize].push_str("§ -----"); @@ -237,17 +229,11 @@ pub fn editor_content_with_blocks(editor: &Entity, cx: &mut VisualTestCo } } Block::BufferHeader { excerpt, height } => { - lines[row.0 as usize].push_str(&cx.update(|_, cx| { - format!( - "§ {}", - excerpt - .buffer - .file() - .unwrap() - .file_name(cx) - .to_string_lossy() - ) - })); + lines[row.0 as usize].push_str( + &cx.update(|_, cx| { + format!("§ {}", excerpt.buffer.file().unwrap().file_name(cx)) + }), + ); for row in row.0 + 1..row.0 + height { lines[row as usize].push_str("§ -----"); } diff --git a/crates/editor/src/test/editor_lsp_test_context.rs b/crates/editor/src/test/editor_lsp_test_context.rs index 79935340358662350dbbc640d96f5d60ec8aaf6b..72060a11f07d297f578f933b0f6fd809dc915bb5 100644 --- a/crates/editor/src/test/editor_lsp_test_context.rs +++ b/crates/editor/src/test/editor_lsp_test_context.rs @@ -262,6 +262,77 @@ impl EditorLspTestContext { Self::new(language, capabilities, cx).await } + pub async fn new_tsx( + capabilities: lsp::ServerCapabilities, + cx: &mut gpui::TestAppContext, + ) -> EditorLspTestContext { + let mut word_characters: HashSet = Default::default(); + word_characters.insert('$'); + word_characters.insert('#'); + let language = Language::new( + LanguageConfig { + name: "TSX".into(), + matcher: LanguageMatcher { + path_suffixes: vec!["tsx".to_string()], + ..Default::default() + }, + brackets: language::BracketPairConfig { + pairs: vec![language::BracketPair { + start: "{".to_string(), + end: "}".to_string(), + close: true, + surround: true, + newline: true, + }], + disabled_scopes_by_bracket_ix: Default::default(), + }, + word_characters, + ..Default::default() + }, + Some(tree_sitter_typescript::LANGUAGE_TSX.into()), + ) + .with_queries(LanguageQueries { + brackets: Some(Cow::from(indoc! {r#" + ("(" @open ")" @close) + ("[" @open "]" @close) + ("{" @open "}" @close) + ("<" @open ">" @close) + ("<" @open "/>" @close) + ("" @close) + ("\"" @open "\"" @close) + ("'" @open "'" @close) + ("`" @open "`" @close) + ((jsx_element (jsx_opening_element) @open (jsx_closing_element) @close) (#set! newline.only))"#})), + indents: Some(Cow::from(indoc! {r#" + [ + (call_expression) + (assignment_expression) + (member_expression) + (lexical_declaration) + (variable_declaration) + (assignment_expression) + (if_statement) + (for_statement) + ] @indent + + (_ "[" "]" @end) @indent + (_ "<" ">" @end) @indent + (_ "{" "}" @end) @indent + (_ "(" ")" @end) @indent + + (jsx_opening_element ">" @end) @indent + + (jsx_element + (jsx_opening_element) @start + (jsx_closing_element)? @end) @indent + "#})), + ..Default::default() + }) + .expect("Could not parse queries"); + + Self::new(language, capabilities, cx).await + } + pub async fn new_html(cx: &mut gpui::TestAppContext) -> Self { let language = Language::new( LanguageConfig { @@ -303,8 +374,8 @@ impl EditorLspTestContext { #[expect(clippy::wrong_self_convention, reason = "This is test code")] pub fn to_lsp_range(&mut self, range: Range) -> lsp::Range { let snapshot = self.update_editor(|editor, window, cx| editor.snapshot(window, cx)); - let start_point = range.start.to_point(&snapshot.buffer_snapshot); - let end_point = range.end.to_point(&snapshot.buffer_snapshot); + let start_point = range.start.to_point(&snapshot.buffer_snapshot()); + let end_point = range.end.to_point(&snapshot.buffer_snapshot()); self.editor(|editor, _, cx| { let buffer = editor.buffer().read(cx); @@ -330,7 +401,7 @@ impl EditorLspTestContext { #[expect(clippy::wrong_self_convention, reason = "This is test code")] pub fn to_lsp(&mut self, offset: usize) -> lsp::Position { let snapshot = self.update_editor(|editor, window, cx| editor.snapshot(window, cx)); - let point = offset.to_point(&snapshot.buffer_snapshot); + let point = offset.to_point(&snapshot.buffer_snapshot()); self.editor(|editor, _, cx| { let buffer = editor.buffer().read(cx); @@ -369,7 +440,7 @@ impl EditorLspTestContext { } pub fn notify(&self, params: T::Params) { - self.lsp.notify::(¶ms); + self.lsp.notify::(params); } #[cfg(target_os = "windows")] diff --git a/crates/editor/src/test/editor_test_context.rs b/crates/editor/src/test/editor_test_context.rs index 8c54c265edf7a19af9d17e982a5f4cb6a0079cc3..601eb9512cdef472ce0a5d660309d671c339ebe9 100644 --- a/crates/editor/src/test/editor_test_context.rs +++ b/crates/editor/src/test/editor_test_context.rs @@ -1,5 +1,5 @@ use crate::{ - AnchorRangeExt, DisplayPoint, Editor, MultiBuffer, RowExt, + AnchorRangeExt, DisplayPoint, Editor, ExcerptId, MultiBuffer, MultiBufferSnapshot, RowExt, display_map::{HighlightKey, ToDisplayPoint}, }; use buffer_diff::DiffHunkStatusKind; @@ -24,6 +24,7 @@ use std::{ atomic::{AtomicUsize, Ordering}, }, }; +use text::Selection; use util::{ assert_set_eq, test::{generate_marked_text, marked_text_ranges}, @@ -275,7 +276,8 @@ impl EditorTestContext { let details = editor.text_layout_details(window); let y = pixel_position.y - + line_height * (display_point.row().as_f32() - newest_point.row().as_f32()); + + f32::from(line_height) + * Pixels::from(display_point.row().as_f64() - newest_point.row().as_f64()); let x = pixel_position.x + snapshot.x_for_display_point(display_point, &details) - snapshot.x_for_display_point(newest_point, &details); Point::new(x, y) @@ -296,7 +298,7 @@ impl EditorTestContext { let path = self.update_buffer(|buffer, _| buffer.file().unwrap().path().clone()); fs.set_head_for_repo( &Self::root_path().join(".git"), - &[(path.into(), diff_base.to_string())], + &[(path.as_unix_str(), diff_base.to_string())], "deadbeef", ); self.cx.run_until_parked(); @@ -317,7 +319,7 @@ impl EditorTestContext { let path = self.update_buffer(|buffer, _| buffer.file().unwrap().path().clone()); fs.set_index_for_repo( &Self::root_path().join(".git"), - &[(path.into(), diff_base.to_string())], + &[(path.as_unix_str(), diff_base.to_string())], ); self.cx.run_until_parked(); } @@ -329,7 +331,7 @@ impl EditorTestContext { let path = self.update_buffer(|buffer, _| buffer.file().unwrap().path().clone()); let mut found = None; fs.with_git_state(&Self::root_path().join(".git"), false, |git_state| { - found = git_state.index_contents.get(path.as_ref()).cloned(); + found = git_state.index_contents.get(&path.into()).cloned(); }) .unwrap(); assert_eq!(expected, found.as_deref()); @@ -387,6 +389,23 @@ impl EditorTestContext { #[track_caller] pub fn assert_excerpts_with_selections(&mut self, marked_text: &str) { + let actual_text = self.to_format_multibuffer_as_marked_text(); + let fmt_additional_notes = || { + struct Format<'a, T: std::fmt::Display>(&'a str, &'a T); + + impl std::fmt::Display for Format<'_, T> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "\n\n----- EXPECTED: -----\n\n{}\n\n----- ACTUAL: -----\n\n{}\n\n", + self.0, self.1 + ) + } + } + + Format(marked_text, &actual_text) + }; + let expected_excerpts = marked_text .strip_prefix("[EXCERPT]\n") .unwrap() @@ -396,7 +415,7 @@ impl EditorTestContext { let (multibuffer_snapshot, selections, excerpts) = self.update_editor(|editor, _, cx| { let multibuffer_snapshot = editor.buffer.read(cx).snapshot(cx); - let selections = editor.selections.disjoint_anchors(); + let selections = editor.selections.disjoint_anchors_arc(); let excerpts = multibuffer_snapshot .excerpts() .map(|(e_id, snapshot, range)| (e_id, snapshot.clone(), range)) @@ -407,9 +426,10 @@ impl EditorTestContext { assert!( excerpts.len() == expected_excerpts.len(), - "should have {} excerpts, got {}", + "should have {} excerpts, got {}{}", expected_excerpts.len(), - excerpts.len() + excerpts.len(), + fmt_additional_notes(), ); for (ix, (excerpt_id, snapshot, range)) in excerpts.into_iter().enumerate() { @@ -423,18 +443,25 @@ impl EditorTestContext { if !expected_selections.is_empty() { assert!( is_selected, - "excerpt {ix} should be selected. got {:?}", + "excerpt {ix} should contain selections. got {:?}{}", self.editor_state(), + fmt_additional_notes(), ); } else { assert!( !is_selected, - "excerpt {ix} should not be selected, got: {selections:?}", + "excerpt {ix} should not contain selections, got: {selections:?}{}", + fmt_additional_notes(), ); } continue; } - assert!(!is_folded, "excerpt {} should not be folded", ix); + assert!( + !is_folded, + "excerpt {} should not be folded{}", + ix, + fmt_additional_notes() + ); assert_eq!( multibuffer_snapshot .text_for_range(Anchor::range_in_buffer( @@ -443,7 +470,9 @@ impl EditorTestContext { range.context.clone() )) .collect::(), - expected_text + expected_text, + "{}", + fmt_additional_notes(), ); let selections = selections @@ -459,13 +488,38 @@ impl EditorTestContext { .collect::>(); // todo: selections that cross excerpt boundaries.. assert_eq!( - selections, expected_selections, - "excerpt {} has incorrect selections", + selections, + expected_selections, + "excerpt {} has incorrect selections{}", ix, + fmt_additional_notes() ); } } + fn to_format_multibuffer_as_marked_text(&mut self) -> FormatMultiBufferAsMarkedText { + let (multibuffer_snapshot, selections, excerpts) = self.update_editor(|editor, _, cx| { + let multibuffer_snapshot = editor.buffer.read(cx).snapshot(cx); + + let selections = editor.selections.disjoint_anchors_arc().to_vec(); + let excerpts = multibuffer_snapshot + .excerpts() + .map(|(e_id, snapshot, range)| { + let is_folded = editor.is_buffer_folded(snapshot.remote_id(), cx); + (e_id, snapshot.clone(), range, is_folded) + }) + .collect::>(); + + (multibuffer_snapshot, selections, excerpts) + }); + + FormatMultiBufferAsMarkedText { + multibuffer_snapshot, + selections, + excerpts, + } + } + /// Make an assertion about the editor's text and the ranges and directions /// of its selections using a string containing embedded range markers. /// @@ -503,7 +557,7 @@ impl EditorTestContext { .map(|h| h.1.clone()) .unwrap_or_default() .iter() - .map(|range| range.to_offset(&snapshot.buffer_snapshot)) + .map(|range| range.to_offset(&snapshot.buffer_snapshot())) .collect() }); assert_set_eq!(actual_ranges, expected_ranges); @@ -518,7 +572,7 @@ impl EditorTestContext { .map(|ranges| ranges.as_ref().clone().1) .unwrap_or_default() .into_iter() - .map(|range| range.to_offset(&snapshot.buffer_snapshot)) + .map(|range| range.to_offset(&snapshot.buffer_snapshot())) .collect(); assert_set_eq!(actual_ranges, expected_ranges); } @@ -570,6 +624,63 @@ impl EditorTestContext { } } +struct FormatMultiBufferAsMarkedText { + multibuffer_snapshot: MultiBufferSnapshot, + selections: Vec>, + excerpts: Vec<(ExcerptId, BufferSnapshot, ExcerptRange, bool)>, +} + +impl std::fmt::Display for FormatMultiBufferAsMarkedText { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let Self { + multibuffer_snapshot, + selections, + excerpts, + } = self; + + for (excerpt_id, snapshot, range, is_folded) in excerpts.into_iter() { + write!(f, "[EXCERPT]\n")?; + if *is_folded { + write!(f, "[FOLDED]\n")?; + } + + let mut text = multibuffer_snapshot + .text_for_range(Anchor::range_in_buffer( + *excerpt_id, + snapshot.remote_id(), + range.context.clone(), + )) + .collect::(); + + let selections = selections + .iter() + .filter(|&s| s.head().excerpt_id == *excerpt_id) + .map(|s| { + let head = text::ToOffset::to_offset(&s.head().text_anchor, &snapshot) + - text::ToOffset::to_offset(&range.context.start, &snapshot); + let tail = text::ToOffset::to_offset(&s.head().text_anchor, &snapshot) + - text::ToOffset::to_offset(&range.context.start, &snapshot); + tail..head + }) + .rev() + .collect::>(); + + for selection in selections { + if selection.is_empty() { + text.insert(selection.start, 'ˇ'); + continue; + } + text.insert(selection.end, '»'); + text.insert(selection.start, '«'); + } + + write!(f, "{text}")?; + } + + Ok(()) + } +} + #[track_caller] pub fn assert_state_with_diff( editor: &Entity, @@ -578,7 +689,7 @@ pub fn assert_state_with_diff( ) { let (snapshot, selections) = editor.update_in(cx, |editor, window, cx| { ( - editor.snapshot(window, cx).buffer_snapshot.clone(), + editor.snapshot(window, cx).buffer_snapshot().clone(), editor.selections.ranges::(cx), ) }); diff --git a/crates/eval/src/eval.rs b/crates/eval/src/eval.rs index 32399e26c020b315f948e7e9013c7000ef9bd899..40d8c14f4f7ddc441f31581951ee4d6c26376a04 100644 --- a/crates/eval/src/eval.rs +++ b/crates/eval/src/eval.rs @@ -340,10 +340,7 @@ pub fn init(cx: &mut App) -> Arc { release_channel::init(app_version, cx); gpui_tokio::init(cx); - let mut settings_store = SettingsStore::new(cx); - settings_store - .set_default_settings(settings::default_settings().as_ref(), cx) - .unwrap(); + let settings_store = SettingsStore::new(cx, &settings::default_settings()); cx.set_global(settings_store); client::init_settings(cx); diff --git a/crates/eval/src/example.rs b/crates/eval/src/example.rs index 457b62e98ca4cabf83fb379cbaa70f07957ac6b7..c0f0900a6cfa5dd942bd27eed852ee4a52896c2c 100644 --- a/crates/eval/src/example.rs +++ b/crates/eval/src/example.rs @@ -1,7 +1,6 @@ use std::{ error::Error, fmt::{self, Debug}, - path::Path, sync::{Arc, Mutex}, time::Duration, }; @@ -20,6 +19,7 @@ use collections::HashMap; use futures::{FutureExt as _, StreamExt, channel::mpsc, select_biased}; use gpui::{App, AppContext, AsyncApp, Entity}; use language_model::{LanguageModel, Role, StopReason}; +use util::rel_path::RelPath; pub const THREAD_EVENT_TIMEOUT: Duration = Duration::from_secs(60 * 2); @@ -354,7 +354,7 @@ impl ExampleContext { Ok(response) } - pub fn edits(&self) -> HashMap, FileEdits> { + pub fn edits(&self) -> HashMap, FileEdits> { self.agent_thread .read_with(&self.app, |thread, cx| { let action_log = thread.action_log().read(cx); diff --git a/crates/eval/src/examples/add_arg_to_trait_method.rs b/crates/eval/src/examples/add_arg_to_trait_method.rs index 084f12bc6263da030d313c362cc3d051dfdb8ea8..41fa7c3dc6361c25868e2bbe73b71010b5d07d80 100644 --- a/crates/eval/src/examples/add_arg_to_trait_method.rs +++ b/crates/eval/src/examples/add_arg_to_trait_method.rs @@ -1,8 +1,7 @@ -use std::path::Path; - use agent_settings::AgentProfileId; use anyhow::Result; use async_trait::async_trait; +use util::rel_path::RelPath; use crate::example::{Example, ExampleContext, ExampleMetadata, JudgeAssertion, LanguageServer}; @@ -68,7 +67,7 @@ impl Example for AddArgToTraitMethod { for tool_name in add_ignored_window_paths { let path_str = format!("crates/assistant_tools/src/{}.rs", tool_name); - let edits = edits.get(Path::new(&path_str)); + let edits = edits.get(RelPath::unix(&path_str).unwrap()); let ignored = edits.is_some_and(|edits| { edits.has_added_line(" _window: Option,\n") @@ -86,7 +85,8 @@ impl Example for AddArgToTraitMethod { // Adds unignored argument to `batch_tool` - let batch_tool_edits = edits.get(Path::new("crates/assistant_tools/src/batch_tool.rs")); + let batch_tool_edits = + edits.get(RelPath::unix("crates/assistant_tools/src/batch_tool.rs").unwrap()); cx.assert( batch_tool_edits.is_some_and(|edits| { diff --git a/crates/eval/src/examples/code_block_citations.rs b/crates/eval/src/examples/code_block_citations.rs index 2239ccdfddcc023fdae6f56bd91fd73c1f851ac6..8150d68ac3e54772e35fe52f086fb942d8923ffb 100644 --- a/crates/eval/src/examples/code_block_citations.rs +++ b/crates/eval/src/examples/code_block_citations.rs @@ -65,7 +65,7 @@ impl Example for CodeBlockCitations { thread .project() .read(cx) - .find_project_path(path_range.path, cx) + .find_project_path(path_range.path.as_ref(), cx) }) .ok() .flatten(); diff --git a/crates/eval/src/examples/mod.rs b/crates/eval/src/examples/mod.rs index d74fbdb937bb3fce089ac1e0dd1b4abb75657ca3..afe258aa76b1abb5406ce212af4f223c56cb2020 100644 --- a/crates/eval/src/examples/mod.rs +++ b/crates/eval/src/examples/mod.rs @@ -106,7 +106,7 @@ impl DeclarativeExample { } pub fn name_from_path(path: &Path) -> String { - path.file_stem().unwrap().to_string_lossy().to_string() + path.file_stem().unwrap().to_string_lossy().into_owned() } } @@ -115,6 +115,10 @@ pub struct ExampleToml { pub url: String, pub revision: String, pub language_extension: Option, + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] pub insert_id: Option, #[serde(default = "default_true")] pub require_lsp: bool, diff --git a/crates/eval/src/instance.rs b/crates/eval/src/instance.rs index c6e4e0b6ec683b63b90920861f3cd023069666e6..208147e2f04b26a7337c071d36f4f687ca0fe184 100644 --- a/crates/eval/src/instance.rs +++ b/crates/eval/src/instance.rs @@ -164,7 +164,7 @@ impl ExampleInstance { } else { println!("{}Creating worktree", self.log_prefix); - let worktree_path_string = worktree_path.to_string_lossy().to_string(); + let worktree_path_string = worktree_path.to_string_lossy().into_owned(); run_git( &self.repo_path, @@ -250,7 +250,7 @@ impl ExampleInstance { worktree .files(false, 0) .find_map(|e| { - if e.path.clone().extension().and_then(|ext| ext.to_str()) + if e.path.clone().extension() == Some(&language_server.file_extension) { Some(ProjectPath { diff --git a/crates/explorer_command_injector/src/explorer_command_injector.rs b/crates/explorer_command_injector/src/explorer_command_injector.rs index 57454bc3a87e6574d43bba05ff353c6cffc31601..bfa2a0326c9975037ed860acfdee7cd32e3075d8 100644 --- a/crates/explorer_command_injector/src/explorer_command_injector.rs +++ b/crates/explorer_command_injector/src/explorer_command_injector.rs @@ -77,6 +77,7 @@ impl IExplorerCommand_Impl for ExplorerCommandInjector_Impl { for idx in 0..count { let item = unsafe { items.GetItemAt(idx)? }; let item_path = unsafe { item.GetDisplayName(SIGDN_FILESYSPATH)?.to_string()? }; + #[allow(clippy::disallowed_methods, reason = "no async context in sight..")] std::process::Command::new(&zed_exe) .arg(&item_path) .spawn() @@ -180,7 +181,7 @@ fn get_zed_install_folder() -> Option { #[inline] fn get_zed_exe_path() -> Option { - get_zed_install_folder().map(|path| path.join("Zed.exe").to_string_lossy().to_string()) + get_zed_install_folder().map(|path| path.join("Zed.exe").to_string_lossy().into_owned()) } #[inline] diff --git a/crates/extension/src/extension.rs b/crates/extension/src/extension.rs index 6af793253bce2d122a5361f6b83f33cb39d45253..bd2b37c337dcaca448e2175472ea46c126d2f9a3 100644 --- a/crates/extension/src/extension.rs +++ b/crates/extension/src/extension.rs @@ -16,6 +16,7 @@ use gpui::{App, Task}; use language::LanguageName; use semantic_version::SemanticVersion; use task::{SpawnInTerminal, ZedDebugConfig}; +use util::rel_path::RelPath; pub use crate::capabilities::*; pub use crate::extension_events::*; @@ -33,7 +34,7 @@ pub fn init(cx: &mut App) { pub trait WorktreeDelegate: Send + Sync + 'static { fn id(&self) -> u64; fn root_path(&self) -> String; - async fn read_text_file(&self, path: PathBuf) -> Result; + async fn read_text_file(&self, path: &RelPath) -> Result; async fn which(&self, binary_name: String) -> Option; async fn shell_env(&self) -> Vec<(String, String)>; } diff --git a/crates/extension/src/extension_builder.rs b/crates/extension/src/extension_builder.rs index 3a3026f19c1961a6f4ac4c7fe5ac217ef6855cea..15ff230ec7d1d1b99f4fd91400065f78b88b0b9d 100644 --- a/crates/extension/src/extension_builder.rs +++ b/crates/extension/src/extension_builder.rs @@ -142,7 +142,7 @@ impl ExtensionBuilder { manifest: &mut ExtensionManifest, options: CompileExtensionOptions, ) -> anyhow::Result<()> { - self.install_rust_wasm_target_if_needed()?; + self.install_rust_wasm_target_if_needed().await?; let cargo_toml_content = fs::read_to_string(extension_dir.join("Cargo.toml"))?; let cargo_toml: CargoToml = toml::from_str(&cargo_toml_content)?; @@ -151,7 +151,7 @@ impl ExtensionBuilder { "compiling Rust crate for extension {}", extension_dir.display() ); - let output = util::command::new_std_command("cargo") + let output = util::command::new_smol_command("cargo") .args(["build", "--target", RUST_TARGET]) .args(options.release.then_some("--release")) .arg("--target-dir") @@ -160,6 +160,7 @@ impl ExtensionBuilder { .env("RUSTC_WRAPPER", "") .current_dir(extension_dir) .output() + .await .context("failed to run `cargo`")?; if !output.status.success() { bail!( @@ -235,7 +236,8 @@ impl ExtensionBuilder { &grammar_repo_dir, &grammar_metadata.repository, &grammar_metadata.rev, - )?; + ) + .await?; let base_grammar_path = grammar_metadata .path @@ -248,7 +250,7 @@ impl ExtensionBuilder { let scanner_path = src_path.join("scanner.c"); log::info!("compiling {grammar_name} parser"); - let clang_output = util::command::new_std_command(&clang_path) + let clang_output = util::command::new_smol_command(&clang_path) .args(["-fPIC", "-shared", "-Os"]) .arg(format!("-Wl,--export=tree_sitter_{grammar_name}")) .arg("-o") @@ -258,6 +260,7 @@ impl ExtensionBuilder { .arg(&parser_path) .args(scanner_path.exists().then_some(scanner_path)) .output() + .await .context("failed to run clang")?; if !clang_output.status.success() { @@ -271,15 +274,16 @@ impl ExtensionBuilder { Ok(()) } - fn checkout_repo(&self, directory: &Path, url: &str, rev: &str) -> Result<()> { + async fn checkout_repo(&self, directory: &Path, url: &str, rev: &str) -> Result<()> { let git_dir = directory.join(".git"); if directory.exists() { - let remotes_output = util::command::new_std_command("git") + let remotes_output = util::command::new_smol_command("git") .arg("--git-dir") .arg(&git_dir) .args(["remote", "-v"]) - .output()?; + .output() + .await?; let has_remote = remotes_output.status.success() && String::from_utf8_lossy(&remotes_output.stdout) .lines() @@ -298,10 +302,11 @@ impl ExtensionBuilder { fs::create_dir_all(directory).with_context(|| { format!("failed to create grammar directory {}", directory.display(),) })?; - let init_output = util::command::new_std_command("git") + let init_output = util::command::new_smol_command("git") .arg("init") .current_dir(directory) - .output()?; + .output() + .await?; if !init_output.status.success() { bail!( "failed to run `git init` in directory '{}'", @@ -309,11 +314,12 @@ impl ExtensionBuilder { ); } - let remote_add_output = util::command::new_std_command("git") + let remote_add_output = util::command::new_smol_command("git") .arg("--git-dir") .arg(&git_dir) .args(["remote", "add", "origin", url]) .output() + .await .context("failed to execute `git remote add`")?; if !remote_add_output.status.success() { bail!( @@ -323,19 +329,21 @@ impl ExtensionBuilder { } } - let fetch_output = util::command::new_std_command("git") + let fetch_output = util::command::new_smol_command("git") .arg("--git-dir") .arg(&git_dir) .args(["fetch", "--depth", "1", "origin", rev]) .output() + .await .context("failed to execute `git fetch`")?; - let checkout_output = util::command::new_std_command("git") + let checkout_output = util::command::new_smol_command("git") .arg("--git-dir") .arg(&git_dir) .args(["checkout", rev]) .current_dir(directory) .output() + .await .context("failed to execute `git checkout`")?; if !checkout_output.status.success() { if !fetch_output.status.success() { @@ -356,11 +364,12 @@ impl ExtensionBuilder { Ok(()) } - fn install_rust_wasm_target_if_needed(&self) -> Result<()> { - let rustc_output = util::command::new_std_command("rustc") + async fn install_rust_wasm_target_if_needed(&self) -> Result<()> { + let rustc_output = util::command::new_smol_command("rustc") .arg("--print") .arg("sysroot") .output() + .await .context("failed to run rustc")?; if !rustc_output.status.success() { bail!( @@ -374,11 +383,12 @@ impl ExtensionBuilder { return Ok(()); } - let output = util::command::new_std_command("rustup") + let output = util::command::new_smol_command("rustup") .args(["target", "add", RUST_TARGET]) .stderr(Stdio::piped()) .stdout(Stdio::inherit()) .output() + .await .context("failed to run `rustup target add`")?; if !output.status.success() { bail!( diff --git a/crates/extension/src/extension_events.rs b/crates/extension/src/extension_events.rs index 94f3277b05b76aa93717458c57d0280a15b8435f..6dc99470dfb5abad524e5a7cbc326b2dd5e0bd26 100644 --- a/crates/extension/src/extension_events.rs +++ b/crates/extension/src/extension_events.rs @@ -32,7 +32,7 @@ impl ExtensionEvents { } } -#[derive(Clone)] +#[derive(Clone, Debug)] pub enum Event { ExtensionInstalled(Arc), ExtensionUninstalled(Arc), diff --git a/crates/extension_cli/src/main.rs b/crates/extension_cli/src/main.rs index d6c0501efdacff2a9eaf542695ed44325908ea56..367dba98a32f5e8b0ade64095fbac5cad641b5ad 100644 --- a/crates/extension_cli/src/main.rs +++ b/crates/extension_cli/src/main.rs @@ -2,7 +2,6 @@ use std::collections::{BTreeSet, HashMap}; use std::env; use std::fs; use std::path::{Path, PathBuf}; -use std::process::Command; use std::sync::Arc; use ::fs::{CopyOptions, Fs, RealFs, copy_recursive}; @@ -13,6 +12,7 @@ use extension::extension_builder::{CompileExtensionOptions, ExtensionBuilder}; use language::LanguageConfig; use reqwest_client::ReqwestClient; use rpc::ExtensionProvides; +use tokio::process::Command; use tree_sitter::{Language, Query, WasmStore}; #[derive(Parser, Debug)] @@ -89,6 +89,7 @@ async fn main() -> Result<()> { .current_dir(&output_dir) .args(["-czvf", "archive.tar.gz", "-C", "archive", "."]) .output() + .await .context("failed to run tar")?; if !tar_output.status.success() { bail!( diff --git a/crates/extension_host/Cargo.toml b/crates/extension_host/Cargo.toml index c933d253c65b525b29eb072ce6910514b15e5932..ba7f056866f41dbc61e7aea38dac8d8aca35979f 100644 --- a/crates/extension_host/Cargo.toml +++ b/crates/extension_host/Cargo.toml @@ -37,7 +37,6 @@ paths.workspace = true project.workspace = true remote.workspace = true release_channel.workspace = true -schemars.workspace = true semantic_version.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/extension_host/src/extension_host.rs b/crates/extension_host/src/extension_host.rs index 2d5839e96a1cf5c7550300e762bb97d357864fc6..3397f770c241ab0b29deab661e014811fed7f852 100644 --- a/crates/extension_host/src/extension_host.rs +++ b/crates/extension_host/src/extension_host.rs @@ -73,6 +73,12 @@ const FS_WATCH_LATENCY: Duration = Duration::from_millis(100); /// The current extension [`SchemaVersion`] supported by Zed. const CURRENT_SCHEMA_VERSION: SchemaVersion = SchemaVersion(1); +/// Extensions that should no longer be loaded or downloaded. +/// +/// These snippets should no longer be downloaded or loaded, because their +/// functionality has been integrated into the core editor. +const SUPPRESSED_EXTENSIONS: &[&str] = &["snippets", "ruff", "ty", "basedpyright"]; + /// Returns the [`SchemaVersion`] range that is compatible with this version of Zed. pub fn schema_version_range() -> RangeInclusive { SchemaVersion::ZERO..=CURRENT_SCHEMA_VERSION @@ -682,7 +688,12 @@ impl ExtensionStore { ); } - let response: GetExtensionsResponse = serde_json::from_slice(&body)?; + let mut response: GetExtensionsResponse = serde_json::from_slice(&body)?; + + response + .data + .retain(|extension| !SUPPRESSED_EXTENSIONS.contains(&extension.id.as_ref())); + Ok(response.data) }) } @@ -1076,6 +1087,10 @@ impl ExtensionStore { ) -> Task<()> { let old_index = &self.extension_index; + new_index + .extensions + .retain(|extension_id, _| !SUPPRESSED_EXTENSIONS.contains(&extension_id.as_ref())); + // Determine which extensions need to be loaded and unloaded, based // on the changes to the manifest and the extensions that we know have been // modified. @@ -1256,7 +1271,7 @@ impl ExtensionStore { self.proxy.register_grammars(grammars_to_add); let languages_to_add = new_index .languages - .iter_mut() + .iter() .filter(|(_, entry)| extensions_to_load.contains(&entry.extension)) .collect::>(); for (language_name, language) in languages_to_add { @@ -1506,6 +1521,10 @@ impl ExtensionStore { let mut extension_manifest = ExtensionManifest::load(fs.clone(), &extension_dir).await?; let extension_id = extension_manifest.id.clone(); + if SUPPRESSED_EXTENSIONS.contains(&extension_id.as_ref()) { + return Ok(()); + } + // TODO: distinguish dev extensions more explicitly, by the absence // of a checksum file that we'll create when downloading normal extensions. let is_dev = fs @@ -1752,7 +1771,14 @@ impl ExtensionStore { })? .await?; let dest_dir = RemotePathBuf::new( - PathBuf::from(&response.tmp_dir).join(missing_extension.clone().id), + path_style + .join(&response.tmp_dir, &missing_extension.id) + .with_context(|| { + format!( + "failed to construct destination path: {:?}, {:?}", + response.tmp_dir, missing_extension.id, + ) + })?, path_style, ); log::info!("Uploading extension {}", missing_extension.clone().id); diff --git a/crates/extension_host/src/extension_settings.rs b/crates/extension_host/src/extension_settings.rs index fa5a613c55a76a0b5660b114d49acc17fcf79120..2f6b66ed0999a541febf368c7f75f22f89fcd6d0 100644 --- a/crates/extension_host/src/extension_settings.rs +++ b/crates/extension_host/src/extension_settings.rs @@ -1,13 +1,11 @@ -use anyhow::Result; use collections::HashMap; -use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use extension::{ + DownloadFileCapability, ExtensionCapability, NpmInstallPackageCapability, ProcessExecCapability, +}; +use settings::Settings; use std::sync::Arc; -#[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] +#[derive(Debug, Default, Clone)] pub struct ExtensionSettings { /// The extensions that should be automatically installed by Zed. /// @@ -15,10 +13,9 @@ pub struct ExtensionSettings { /// available out-of-the-box. /// /// Default: { "html": true } - #[serde(default)] pub auto_install_extensions: HashMap, bool>, - #[serde(default)] pub auto_update_extensions: HashMap, bool>, + pub granted_capabilities: Vec, } impl ExtensionSettings { @@ -39,20 +36,30 @@ impl ExtensionSettings { } impl Settings for ExtensionSettings { - type FileContent = Self; - - fn load(sources: SettingsSources, _cx: &mut App) -> Result { - SettingsSources::::json_merge_with( - [sources.default] + fn from_settings(content: &settings::SettingsContent) -> Self { + Self { + auto_install_extensions: content.extension.auto_install_extensions.clone(), + auto_update_extensions: content.extension.auto_update_extensions.clone(), + granted_capabilities: content + .extension + .granted_extension_capabilities + .clone() + .unwrap_or_default() .into_iter() - .chain(sources.user) - .chain(sources.server), - ) - } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) { - // settingsSync.ignoredExtensions controls autoupdate for vscode extensions, but we - // don't have a mapping to zed-extensions. there's also extensions.autoCheckUpdates - // and extensions.autoUpdate which are global switches, we don't support those yet + .map(|capability| match capability { + settings::ExtensionCapabilityContent::ProcessExec { command, args } => { + ExtensionCapability::ProcessExec(ProcessExecCapability { command, args }) + } + settings::ExtensionCapabilityContent::DownloadFile { host, path } => { + ExtensionCapability::DownloadFile(DownloadFileCapability { host, path }) + } + settings::ExtensionCapabilityContent::NpmInstallPackage { package } => { + ExtensionCapability::NpmInstallPackage(NpmInstallPackageCapability { + package, + }) + } + }) + .collect(), + } } } diff --git a/crates/extension_host/src/headless_host.rs b/crates/extension_host/src/headless_host.rs index a6305118cd3355f69a42914ec86bb5edcfc74810..f14bb811a6742a60899ac4301cfac096bb41a07f 100644 --- a/crates/extension_host/src/headless_host.rs +++ b/crates/extension_host/src/headless_host.rs @@ -1,10 +1,7 @@ use std::{path::PathBuf, sync::Arc}; use anyhow::{Context as _, Result}; -use client::{ - TypedEnvelope, - proto::{self, FromProto}, -}; +use client::{TypedEnvelope, proto}; use collections::{HashMap, HashSet}; use extension::{ Extension, ExtensionDebugAdapterProviderProxy, ExtensionHostProxy, ExtensionLanguageProxy, @@ -342,7 +339,7 @@ impl HeadlessExtensionStore { version: extension.version, dev: extension.dev, }, - PathBuf::from_proto(envelope.payload.tmp_dir), + PathBuf::from(envelope.payload.tmp_dir), cx, ) })? diff --git a/crates/extension_host/src/wasm_host.rs b/crates/extension_host/src/wasm_host.rs index a14bb860dbf19b3a42a989a33fa7fd6ea84d26a5..f77258e8957fa1be7579b931de82fd633a0f6ae4 100644 --- a/crates/extension_host/src/wasm_host.rs +++ b/crates/extension_host/src/wasm_host.rs @@ -1,15 +1,15 @@ pub mod wit; -use crate::ExtensionManifest; use crate::capability_granter::CapabilityGranter; +use crate::{ExtensionManifest, ExtensionSettings}; use anyhow::{Context as _, Result, anyhow, bail}; use async_trait::async_trait; use dap::{DebugRequest, StartDebuggingRequestArgumentsRequest}; use extension::{ CodeLabel, Command, Completion, ContextServerConfiguration, DebugAdapterBinary, - DebugTaskDefinition, DownloadFileCapability, ExtensionCapability, ExtensionHostProxy, - KeyValueStoreDelegate, NpmInstallPackageCapability, ProcessExecCapability, ProjectDelegate, - SlashCommand, SlashCommandArgumentCompletion, SlashCommandOutput, Symbol, WorktreeDelegate, + DebugTaskDefinition, ExtensionCapability, ExtensionHostProxy, KeyValueStoreDelegate, + ProjectDelegate, SlashCommand, SlashCommandArgumentCompletion, SlashCommandOutput, Symbol, + WorktreeDelegate, }; use fs::{Fs, normalize_path}; use futures::future::LocalBoxFuture; @@ -29,6 +29,7 @@ use moka::sync::Cache; use node_runtime::NodeRuntime; use release_channel::ReleaseChannel; use semantic_version::SemanticVersion; +use settings::Settings; use std::borrow::Cow; use std::sync::{LazyLock, OnceLock}; use std::time::Duration; @@ -569,6 +570,9 @@ impl WasmHost { message(cx).await; } }); + + let extension_settings = ExtensionSettings::get_global(cx); + Arc::new(Self { engine: wasm_engine(cx.background_executor()), fs, @@ -577,19 +581,7 @@ impl WasmHost { node_runtime, proxy, release_channel: ReleaseChannel::global(cx), - granted_capabilities: vec![ - ExtensionCapability::ProcessExec(ProcessExecCapability { - command: "*".to_string(), - args: vec!["**".to_string()], - }), - ExtensionCapability::DownloadFile(DownloadFileCapability { - host: "*".to_string(), - path: vec!["**".to_string()], - }), - ExtensionCapability::NpmInstallPackage(NpmInstallPackageCapability { - package: "*".to_string(), - }), - ], + granted_capabilities: extension_settings.granted_capabilities.clone(), _main_thread_message_task: task, main_thread_message_tx: tx, }) diff --git a/crates/extension_host/src/wasm_host/wit/since_v0_0_6.rs b/crates/extension_host/src/wasm_host/wit/since_v0_0_6.rs index 084c24f2ec2d5c0071e894acf1a4a1050ed14c40..2fc29abadb2eb60d051b37e072727931aee72d69 100644 --- a/crates/extension_host/src/wasm_host/wit/since_v0_0_6.rs +++ b/crates/extension_host/src/wasm_host/wit/since_v0_0_6.rs @@ -23,6 +23,7 @@ wasmtime::component::bindgen!({ }); mod settings { + #![allow(dead_code)] include!(concat!(env!("OUT_DIR"), "/since_v0.0.6/settings.rs")); } diff --git a/crates/extension_host/src/wasm_host/wit/since_v0_1_0.rs b/crates/extension_host/src/wasm_host/wit/since_v0_1_0.rs index 9c726ebd1c45d868d0794f26044cbc53d87eb00f..26347ec4426c421909e5cd01b73fdc89751f1dfb 100644 --- a/crates/extension_host/src/wasm_host/wit/since_v0_1_0.rs +++ b/crates/extension_host/src/wasm_host/wit/since_v0_1_0.rs @@ -16,6 +16,8 @@ use std::{ path::{Path, PathBuf}, sync::{Arc, OnceLock}, }; +use util::paths::PathStyle; +use util::rel_path::RelPath; use util::{archive::extract_zip, fs::make_file_executable, maybe}; use wasmtime::component::{Linker, Resource}; @@ -421,11 +423,15 @@ impl ExtensionImports for WasmState { ) -> wasmtime::Result> { self.on_main_thread(|cx| { async move { - let location = location + let path = location.as_ref().and_then(|location| { + RelPath::new(Path::new(&location.path), PathStyle::Posix).ok() + }); + let location = path .as_ref() - .map(|location| ::settings::SettingsLocation { + .zip(location.as_ref()) + .map(|(path, location)| ::settings::SettingsLocation { worktree_id: WorktreeId::from_proto(location.worktree_id), - path: Path::new(&location.path), + path, }); cx.update(|cx| match category.as_str() { diff --git a/crates/extension_host/src/wasm_host/wit/since_v0_2_0.rs b/crates/extension_host/src/wasm_host/wit/since_v0_2_0.rs index c6c3a8475f4b230947e03285e851c332fcdef7f6..9475438b660d2e126ae6ca24d276795d51d4ce8b 100644 --- a/crates/extension_host/src/wasm_host/wit/since_v0_2_0.rs +++ b/crates/extension_host/src/wasm_host/wit/since_v0_2_0.rs @@ -30,6 +30,7 @@ wasmtime::component::bindgen!({ pub use self::zed::extension::*; mod settings { + #![allow(dead_code)] include!(concat!(env!("OUT_DIR"), "/since_v0.2.0/settings.rs")); } diff --git a/crates/extension_host/src/wasm_host/wit/since_v0_3_0.rs b/crates/extension_host/src/wasm_host/wit/since_v0_3_0.rs index a2d02cc07a2496e13b9d344ee339a0a4f1e1e124..b6a75ba7dda6ded2e074a2ece35b4b3f881f1619 100644 --- a/crates/extension_host/src/wasm_host/wit/since_v0_3_0.rs +++ b/crates/extension_host/src/wasm_host/wit/since_v0_3_0.rs @@ -30,6 +30,7 @@ wasmtime::component::bindgen!({ }); mod settings { + #![allow(dead_code)] include!(concat!(env!("OUT_DIR"), "/since_v0.3.0/settings.rs")); } diff --git a/crates/extension_host/src/wasm_host/wit/since_v0_4_0.rs b/crates/extension_host/src/wasm_host/wit/since_v0_4_0.rs index 4e2650bba7d4b44557f091e697bf8f25a9403fa2..7c8be1322f94e35ded911d64e13f5afb4bf3702c 100644 --- a/crates/extension_host/src/wasm_host/wit/since_v0_4_0.rs +++ b/crates/extension_host/src/wasm_host/wit/since_v0_4_0.rs @@ -30,6 +30,7 @@ wasmtime::component::bindgen!({ }); mod settings { + #![allow(dead_code)] include!(concat!(env!("OUT_DIR"), "/since_v0.4.0/settings.rs")); } diff --git a/crates/extension_host/src/wasm_host/wit/since_v0_5_0.rs b/crates/extension_host/src/wasm_host/wit/since_v0_5_0.rs index bb73d77f7f0470a0b700e87931be9cac2bb51a86..6d04663de7772e9c965cf1b88840727cfdcb4b59 100644 --- a/crates/extension_host/src/wasm_host/wit/since_v0_5_0.rs +++ b/crates/extension_host/src/wasm_host/wit/since_v0_5_0.rs @@ -31,6 +31,7 @@ wasmtime::component::bindgen!({ }); mod settings { + #![allow(dead_code)] include!(concat!(env!("OUT_DIR"), "/since_v0.5.0/settings.rs")); } diff --git a/crates/extension_host/src/wasm_host/wit/since_v0_6_0.rs b/crates/extension_host/src/wasm_host/wit/since_v0_6_0.rs index 84794d5386eda1517808d181eb259a3264f7b82d..9942f8aeea04b8c466f5d16fc82ae7545b8bb7b1 100644 --- a/crates/extension_host/src/wasm_host/wit/since_v0_6_0.rs +++ b/crates/extension_host/src/wasm_host/wit/since_v0_6_0.rs @@ -31,11 +31,13 @@ use std::{ }; use task::{SpawnInTerminal, ZedDebugConfig}; use url::Url; -use util::{archive::extract_zip, fs::make_file_executable, maybe}; +use util::{ + archive::extract_zip, fs::make_file_executable, maybe, paths::PathStyle, rel_path::RelPath, +}; use wasmtime::component::{Linker, Resource}; pub const MIN_VERSION: SemanticVersion = SemanticVersion::new(0, 6, 0); -pub const MAX_VERSION: SemanticVersion = SemanticVersion::new(0, 6, 0); +pub const MAX_VERSION: SemanticVersion = SemanticVersion::new(0, 7, 0); wasmtime::component::bindgen!({ async: true, @@ -52,6 +54,7 @@ wasmtime::component::bindgen!({ pub use self::zed::extension::*; mod settings { + #![allow(dead_code)] include!(concat!(env!("OUT_DIR"), "/since_v0.6.0/settings.rs")); } @@ -309,7 +312,14 @@ impl TryFrom for ResolvedTask { command: value.command.context("missing command")?, args: value.args, env: value.env.into_iter().collect(), - cwd: value.cwd.map(|s| s.to_string_lossy().into_owned()), + cwd: value.cwd.map(|s| { + let s = s.to_string_lossy(); + if cfg!(target_os = "windows") { + s.replace('\\', "/") + } else { + s.into_owned() + } + }), }) } } @@ -556,7 +566,7 @@ impl HostWorktree for WasmState { ) -> wasmtime::Result> { let delegate = self.table.get(&delegate)?; Ok(delegate - .read_text_file(path.into()) + .read_text_file(&RelPath::new(Path::new(&path), PathStyle::Posix)?) .await .map_err(|error| error.to_string())) } @@ -714,7 +724,7 @@ impl nodejs::Host for WasmState { .node_runtime .binary_path() .await - .map(|path| path.to_string_lossy().to_string()) + .map(|path| path.to_string_lossy().into_owned()) .to_wasmtime_result() } @@ -906,11 +916,15 @@ impl ExtensionImports for WasmState { ) -> wasmtime::Result> { self.on_main_thread(|cx| { async move { - let location = location + let path = location.as_ref().and_then(|location| { + RelPath::new(Path::new(&location.path), PathStyle::Posix).ok() + }); + let location = path .as_ref() - .map(|location| ::settings::SettingsLocation { + .zip(location.as_ref()) + .map(|(path, location)| ::settings::SettingsLocation { worktree_id: WorktreeId::from_proto(location.worktree_id), - path: Path::new(&location.path), + path, }); cx.update(|cx| match category.as_str() { diff --git a/crates/extensions_ui/src/extension_suggest.rs b/crates/extensions_ui/src/extension_suggest.rs index 65572eb0241be52dc0fb2ebf9891d3a5858caa83..5dcd1e210527ee89a35a3b89008a901cf1f9f036 100644 --- a/crates/extensions_ui/src/extension_suggest.rs +++ b/crates/extensions_ui/src/extension_suggest.rs @@ -1,5 +1,4 @@ use std::collections::HashMap; -use std::path::Path; use std::sync::{Arc, OnceLock}; use db::kvp::KEY_VALUE_STORE; @@ -8,6 +7,7 @@ use extension_host::ExtensionStore; use gpui::{AppContext as _, Context, Entity, SharedString, Window}; use language::Buffer; use ui::prelude::*; +use util::rel_path::RelPath; use workspace::notifications::simple_message_notification::MessageNotification; use workspace::{Workspace, notifications::NotificationId}; @@ -100,15 +100,9 @@ struct SuggestedExtension { } /// Returns the suggested extension for the given [`Path`]. -fn suggested_extension(path: impl AsRef) -> Option { - let path = path.as_ref(); - - let file_extension: Option> = path - .extension() - .and_then(|extension| Some(extension.to_str()?.into())); - let file_name: Option> = path - .file_name() - .and_then(|file_name| Some(file_name.to_str()?.into())); +fn suggested_extension(path: &RelPath) -> Option { + let file_extension: Option> = path.extension().map(|extension| extension.into()); + let file_name: Option> = path.file_name().map(|name| name.into()); let (file_name_or_extension, extension_id) = None // We suggest against file names first, as these suggestions will be more @@ -210,39 +204,40 @@ pub(crate) fn suggest(buffer: Entity, window: &mut Window, cx: &mut Cont #[cfg(test)] mod tests { use super::*; + use util::rel_path::rel_path; #[test] pub fn test_suggested_extension() { assert_eq!( - suggested_extension("Cargo.toml"), + suggested_extension(rel_path("Cargo.toml")), Some(SuggestedExtension { extension_id: "toml".into(), file_name_or_extension: "toml".into() }) ); assert_eq!( - suggested_extension("Cargo.lock"), + suggested_extension(rel_path("Cargo.lock")), Some(SuggestedExtension { extension_id: "toml".into(), file_name_or_extension: "Cargo.lock".into() }) ); assert_eq!( - suggested_extension("Dockerfile"), + suggested_extension(rel_path("Dockerfile")), Some(SuggestedExtension { extension_id: "dockerfile".into(), file_name_or_extension: "Dockerfile".into() }) ); assert_eq!( - suggested_extension("a/b/c/d/.gitignore"), + suggested_extension(rel_path("a/b/c/d/.gitignore")), Some(SuggestedExtension { extension_id: "git-firefly".into(), file_name_or_extension: ".gitignore".into() }) ); assert_eq!( - suggested_extension("a/b/c/d/test.gleam"), + suggested_extension(rel_path("a/b/c/d/test.gleam")), Some(SuggestedExtension { extension_id: "gleam".into(), file_name_or_extension: "gleam".into() diff --git a/crates/extensions_ui/src/extension_version_selector.rs b/crates/extensions_ui/src/extension_version_selector.rs index fe7a419fbe8001b99d5c3ebf16dfc38cda3fc713..d38c27375f6c32324d4832d308768af8473869eb 100644 --- a/crates/extensions_ui/src/extension_version_selector.rs +++ b/crates/extensions_ui/src/extension_version_selector.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use std::sync::Arc; use client::ExtensionMetadata; -use extension_host::{ExtensionSettings, ExtensionStore}; +use extension_host::ExtensionStore; use fs::Fs; use fuzzy::{StringMatch, StringMatchCandidate, match_strings}; use gpui::{App, DismissEvent, Entity, EventEmitter, Focusable, Task, WeakEntity, prelude::*}; @@ -183,10 +183,13 @@ impl PickerDelegate for ExtensionVersionSelectorDelegate { let extension_id = extension_version.id.clone(); let version = extension_version.manifest.version.clone(); - update_settings_file::(self.fs.clone(), cx, { + update_settings_file(self.fs.clone(), cx, { let extension_id = extension_id.clone(); move |settings, _| { - settings.auto_update_extensions.insert(extension_id, false); + settings + .extension + .auto_update_extensions + .insert(extension_id, false); } }); diff --git a/crates/extensions_ui/src/extensions_ui.rs b/crates/extensions_ui/src/extensions_ui.rs index dab238dc8be1ae6f2243e94fc7c00ce363a79469..dc40bad4e0476f5e714aa24fa3ef4d618d2bdcc9 100644 --- a/crates/extensions_ui/src/extensions_ui.rs +++ b/crates/extensions_ui/src/extensions_ui.rs @@ -20,7 +20,7 @@ use gpui::{ use num_format::{Locale, ToFormattedString}; use project::DirectoryLister; use release_channel::ReleaseChannel; -use settings::Settings; +use settings::{Settings, SettingsContent}; use strum::IntoEnumIterator as _; use theme::ThemeSettings; use ui::{ @@ -29,7 +29,7 @@ use ui::{ }; use vim_mode_setting::VimModeSetting; use workspace::{ - Workspace, WorkspaceId, + Workspace, item::{Item, ItemEvent}, }; use zed_actions::ExtensionCategoryFilter; @@ -1269,17 +1269,17 @@ impl ExtensionsPage { Label::new(message) } - fn update_settings( + fn update_settings( &mut self, selection: &ToggleState, cx: &mut Context, - callback: impl 'static + Send + Fn(&mut T::FileContent, bool), + callback: impl 'static + Send + Fn(&mut SettingsContent, bool), ) { if let Some(workspace) = self.workspace.upgrade() { let fs = workspace.read(cx).app_state().fs.clone(); let selection = *selection; - settings::update_settings_file::(fs, cx, move |settings, _| { + settings::update_settings_file(fs, cx, move |settings, _| { let value = match selection { ToggleState::Unselected => false, ToggleState::Selected => true, @@ -1340,11 +1340,9 @@ impl ExtensionsPage { }, cx.listener(move |this, selection, _, cx| { telemetry::event!("Vim Mode Toggled", source = "Feature Upsell"); - this.update_settings::( - selection, - cx, - |setting, value| setting.vim_mode = Some(value), - ); + this.update_settings(selection, cx, |setting, value| { + setting.vim_mode = Some(value) + }); }), )), Feature::LanguageBash => FeatureUpsell::new("Shell support is built-in to Zed!") @@ -1505,39 +1503,28 @@ impl Render for ExtensionsPage { })), ) .child(self.render_feature_upsells(cx)) - .child( - v_flex() - .pl_4() - .pr_6() - .size_full() - .overflow_y_hidden() - .map(|this| { - let mut count = self.filtered_remote_extension_indices.len(); - if self.filter.include_dev_extensions() { - count += self.dev_extension_entries.len(); - } + .child(v_flex().px_4().size_full().overflow_y_hidden().map(|this| { + let mut count = self.filtered_remote_extension_indices.len(); + if self.filter.include_dev_extensions() { + count += self.dev_extension_entries.len(); + } - if count == 0 { - this.py_4() - .child(self.render_empty_state(cx)) - .into_any_element() - } else { - let scroll_handle = self.list.clone(); - this.child( - uniform_list( - "entries", - count, - cx.processor(Self::render_extensions), - ) - .flex_grow() - .pb_4() - .track_scroll(scroll_handle.clone()), - ) - .vertical_scrollbar_for(scroll_handle, window, cx) - .into_any_element() - } - }), - ) + if count == 0 { + this.py_4() + .child(self.render_empty_state(cx)) + .into_any_element() + } else { + let scroll_handle = self.list.clone(); + this.child( + uniform_list("entries", count, cx.processor(Self::render_extensions)) + .flex_grow() + .pb_4() + .track_scroll(scroll_handle.clone()), + ) + .vertical_scrollbar_for(scroll_handle, window, cx) + .into_any_element() + } + })) } } @@ -1564,15 +1551,6 @@ impl Item for ExtensionsPage { false } - fn clone_on_split( - &self, - _workspace_id: Option, - _window: &mut Window, - _: &mut Context, - ) -> Option> { - None - } - fn to_item_events(event: &Self::Event, mut f: impl FnMut(workspace::item::ItemEvent)) { f(*event) } diff --git a/crates/feature_flags/src/flags.rs b/crates/feature_flags/src/flags.rs index eaae9ce42519a8ebfd40d73d242536c5188fa3dd..47b6f1230ac747c2633327d1be923d33388cf179 100644 --- a/crates/feature_flags/src/flags.rs +++ b/crates/feature_flags/src/flags.rs @@ -6,12 +6,6 @@ impl FeatureFlag for PredictEditsRateCompletionsFeatureFlag { const NAME: &'static str = "predict-edits-rate-completions"; } -pub struct BillingV2FeatureFlag {} - -impl FeatureFlag for BillingV2FeatureFlag { - const NAME: &'static str = "billing-v2"; -} - pub struct NotebookFeatureFlag; impl FeatureFlag for NotebookFeatureFlag { @@ -23,9 +17,3 @@ pub struct PanicFeatureFlag; impl FeatureFlag for PanicFeatureFlag { const NAME: &'static str = "panic"; } - -pub struct JjUiFeatureFlag {} - -impl FeatureFlag for JjUiFeatureFlag { - const NAME: &'static str = "jj-ui"; -} diff --git a/crates/feedback/Cargo.toml b/crates/feedback/Cargo.toml index db872f7a15035c5012d42680c2d812d3486c6a89..34ff692f446c776218cf100b8c912b496a1b41cc 100644 --- a/crates/feedback/Cargo.toml +++ b/crates/feedback/Cargo.toml @@ -16,14 +16,12 @@ test-support = [] [dependencies] gpui.workspace = true -menu.workspace = true system_specs.workspace = true -ui.workspace = true urlencoding.workspace = true util.workspace = true +workspace-hack.workspace = true workspace.workspace = true zed_actions.workspace = true -workspace-hack.workspace = true [dev-dependencies] editor = { workspace = true, features = ["test-support"] } diff --git a/crates/feedback/src/feedback.rs b/crates/feedback/src/feedback.rs index 3822dd7ba38ac8131df4f391b8b0a5c05978fe8d..57bddb6ae7ee19e4b6df8fcf7ebcaeb32e5105bb 100644 --- a/crates/feedback/src/feedback.rs +++ b/crates/feedback/src/feedback.rs @@ -2,19 +2,13 @@ use gpui::{App, ClipboardItem, PromptLevel, actions}; use system_specs::{CopySystemSpecsIntoClipboard, SystemSpecs}; use util::ResultExt; use workspace::Workspace; -use zed_actions::feedback::FileBugReport; - -pub mod feedback_modal; +use zed_actions::feedback::{EmailZed, FileBugReport, RequestFeature}; actions!( zed, [ - /// Opens email client to send feedback to Zed support. - EmailZed, /// Opens the Zed repository on GitHub. OpenZedRepo, - /// Opens the feature request form. - RequestFeature, ] ); @@ -48,11 +42,7 @@ fn email_body(specs: &SystemSpecs) -> String { } pub fn init(cx: &mut App) { - cx.observe_new(|workspace: &mut Workspace, window, cx| { - let Some(window) = window else { - return; - }; - feedback_modal::FeedbackModal::register(workspace, window, cx); + cx.observe_new(|workspace: &mut Workspace, _, _| { workspace .register_action(|_, _: &CopySystemSpecsIntoClipboard, window, cx| { let specs = SystemSpecs::new(window, cx); diff --git a/crates/feedback/src/feedback_modal.rs b/crates/feedback/src/feedback_modal.rs deleted file mode 100644 index beb879efe718e9709fc5d0e9aad8d2b96ff27066..0000000000000000000000000000000000000000 --- a/crates/feedback/src/feedback_modal.rs +++ /dev/null @@ -1,113 +0,0 @@ -use gpui::{App, Context, DismissEvent, EventEmitter, FocusHandle, Focusable, Render, Window}; -use ui::{IconPosition, prelude::*}; -use workspace::{ModalView, Workspace}; -use zed_actions::feedback::GiveFeedback; - -use crate::{EmailZed, FileBugReport, OpenZedRepo, RequestFeature}; - -pub struct FeedbackModal { - focus_handle: FocusHandle, -} - -impl Focusable for FeedbackModal { - fn focus_handle(&self, _: &App) -> FocusHandle { - self.focus_handle.clone() - } -} -impl EventEmitter for FeedbackModal {} - -impl ModalView for FeedbackModal {} - -impl FeedbackModal { - pub fn register(workspace: &mut Workspace, _: &mut Window, cx: &mut Context) { - let _handle = cx.entity().downgrade(); - workspace.register_action(move |workspace, _: &GiveFeedback, window, cx| { - workspace.toggle_modal(window, cx, move |_, cx| FeedbackModal::new(cx)); - }); - } - - pub fn new(cx: &mut Context) -> Self { - Self { - focus_handle: cx.focus_handle(), - } - } - - fn cancel(&mut self, _: &menu::Cancel, _: &mut Window, cx: &mut Context) { - cx.emit(DismissEvent) - } -} - -impl Render for FeedbackModal { - fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let open_zed_repo = - cx.listener(|_, _, window, cx| window.dispatch_action(Box::new(OpenZedRepo), cx)); - - v_flex() - .key_context("GiveFeedback") - .on_action(cx.listener(Self::cancel)) - .elevation_3(cx) - .w_96() - .h_auto() - .p_4() - .gap_2() - .child( - h_flex() - .w_full() - .justify_between() - .child(Headline::new("Give Feedback")) - .child( - IconButton::new("close-btn", IconName::Close) - .icon_color(Color::Muted) - .on_click(cx.listener(move |_, _, window, cx| { - cx.spawn_in(window, async move |this, cx| { - this.update(cx, |_, cx| cx.emit(DismissEvent)).ok(); - }) - .detach(); - })), - ), - ) - .child(Label::new("Thanks for using Zed! To share your experience with us, reach for the channel that's the most appropriate:")) - .child( - Button::new("file-a-bug-report", "File a Bug Report") - .full_width() - .icon(IconName::Debug) - .icon_size(IconSize::XSmall) - .icon_color(Color::Muted) - .icon_position(IconPosition::Start) - .on_click(cx.listener(|_, _, window, cx| { - window.dispatch_action(Box::new(FileBugReport), cx); - })), - ) - .child( - Button::new("request-a-feature", "Request a Feature") - .full_width() - .icon(IconName::Sparkle) - .icon_size(IconSize::XSmall) - .icon_color(Color::Muted) - .icon_position(IconPosition::Start) - .on_click(cx.listener(|_, _, window, cx| { - window.dispatch_action(Box::new(RequestFeature), cx); - })), - ) - .child( - Button::new("send-us_an-email", "Send an Email") - .full_width() - .icon(IconName::Envelope) - .icon_size(IconSize::XSmall) - .icon_color(Color::Muted) - .icon_position(IconPosition::Start) - .on_click(cx.listener(|_, _, window, cx| { - window.dispatch_action(Box::new(EmailZed), cx); - })), - ) - .child( - Button::new("zed_repository", "GitHub Repository") - .full_width() - .icon(IconName::Github) - .icon_size(IconSize::XSmall) - .icon_color(Color::Muted) - .icon_position(IconPosition::Start) - .on_click(open_zed_repo), - ) - } -} diff --git a/crates/file_finder/Cargo.toml b/crates/file_finder/Cargo.toml index aabfa4362afcf644e5d7e882ef9f9c1b97d261cb..edb7031f939f117ae5d5ec126a1edec58cb157c3 100644 --- a/crates/file_finder/Cargo.toml +++ b/crates/file_finder/Cargo.toml @@ -27,7 +27,6 @@ schemars.workspace = true search.workspace = true settings.workspace = true serde.workspace = true -serde_derive.workspace = true text.workspace = true theme.workspace = true ui.workspace = true diff --git a/crates/file_finder/src/file_finder.rs b/crates/file_finder/src/file_finder.rs index 53cf0552f22a59c31ab2422d86eb8cbb76145908..979cfa72fffffd0ef9ffc74cec5a8f33aa23488c 100644 --- a/crates/file_finder/src/file_finder.rs +++ b/crates/file_finder/src/file_finder.rs @@ -39,7 +39,12 @@ use ui::{ ButtonLike, ContextMenu, HighlightedLabel, Indicator, KeyBinding, ListItem, ListItemSpacing, PopoverMenu, PopoverMenuHandle, TintColor, Tooltip, prelude::*, }; -use util::{ResultExt, maybe, paths::PathWithPosition, post_inc}; +use util::{ + ResultExt, maybe, + paths::{PathStyle, PathWithPosition}, + post_inc, + rel_path::RelPath, +}; use workspace::{ ModalView, OpenOptions, OpenVisible, SplitDirection, Workspace, item::PreviewTabsSettings, notifications::NotifyResultExt, pane, @@ -126,38 +131,34 @@ impl FileFinder { let project = workspace.project().read(cx); let fs = project.fs(); - let currently_opened_path = workspace - .active_item(cx) - .and_then(|item| item.project_path(cx)) - .map(|project_path| { - let abs_path = project - .worktree_for_id(project_path.worktree_id, cx) - .map(|worktree| worktree.read(cx).abs_path().join(&project_path.path)); - FoundPath::new(project_path, abs_path) - }); + let currently_opened_path = workspace.active_item(cx).and_then(|item| { + let project_path = item.project_path(cx)?; + let abs_path = project + .worktree_for_id(project_path.worktree_id, cx)? + .read(cx) + .absolutize(&project_path.path); + Some(FoundPath::new(project_path, abs_path)) + }); let history_items = workspace .recent_navigation_history(Some(MAX_RECENT_SELECTIONS), cx) .into_iter() .filter_map(|(project_path, abs_path)| { if project.entry_for_path(&project_path, cx).is_some() { - return Some(Task::ready(Some(FoundPath::new(project_path, abs_path)))); + return Some(Task::ready(Some(FoundPath::new(project_path, abs_path?)))); } let abs_path = abs_path?; if project.is_local() { let fs = fs.clone(); Some(cx.background_spawn(async move { if fs.is_file(&abs_path).await { - Some(FoundPath::new(project_path, Some(abs_path))) + Some(FoundPath::new(project_path, abs_path)) } else { None } })) } else { - Some(Task::ready(Some(FoundPath::new( - project_path, - Some(abs_path), - )))) + Some(Task::ready(Some(FoundPath::new(project_path, abs_path)))) } }) .collect::>(); @@ -347,16 +348,16 @@ impl FileFinder { }) } - pub fn modal_max_width(width_setting: Option, window: &mut Window) -> Pixels { + pub fn modal_max_width(width_setting: FileFinderWidth, window: &mut Window) -> Pixels { let window_width = window.viewport_size().width; let small_width = rems(34.).to_pixels(window.rem_size()); match width_setting { - None | Some(FileFinderWidth::Small) => small_width, - Some(FileFinderWidth::Full) => window_width, - Some(FileFinderWidth::XLarge) => (window_width - Pixels(512.)).max(small_width), - Some(FileFinderWidth::Large) => (window_width - Pixels(768.)).max(small_width), - Some(FileFinderWidth::Medium) => (window_width - Pixels(1024.)).max(small_width), + FileFinderWidth::Small => small_width, + FileFinderWidth::Full => window_width, + FileFinderWidth::XLarge => (window_width - px(512.)).max(small_width), + FileFinderWidth::Large => (window_width - px(768.)).max(small_width), + FileFinderWidth::Medium => (window_width - px(1024.)).max(small_width), } } } @@ -465,7 +466,7 @@ enum Match { } impl Match { - fn relative_path(&self) -> Option<&Arc> { + fn relative_path(&self) -> Option<&Arc> { match self { Match::History { path, .. } => Some(&path.project.path), Match::Search(panel_match) => Some(&panel_match.0.path), @@ -475,20 +476,14 @@ impl Match { fn abs_path(&self, project: &Entity, cx: &App) -> Option { match self { - Match::History { path, .. } => path.absolute.clone().or_else(|| { + Match::History { path, .. } => Some(path.absolute.clone()), + Match::Search(ProjectPanelOrdMatch(path_match)) => Some( project .read(cx) - .worktree_for_id(path.project.worktree_id, cx)? + .worktree_for_id(WorktreeId::from_usize(path_match.worktree_id), cx)? .read(cx) - .absolutize(&path.project.path) - .ok() - }), - Match::Search(ProjectPanelOrdMatch(path_match)) => project - .read(cx) - .worktree_for_id(WorktreeId::from_usize(path_match.worktree_id), cx)? - .read(cx) - .absolutize(&path_match.path) - .ok(), + .absolutize(&path_match.path), + ), Match::CreateNew(_) => None, } } @@ -564,7 +559,12 @@ impl Matches { let new_history_matches = matching_history_items(history_items, currently_opened, query); let new_search_matches: Vec = new_search_matches - .filter(|path_match| !new_history_matches.contains_key(&path_match.0.path)) + .filter(|path_match| { + !new_history_matches.contains_key(&ProjectPath { + path: path_match.0.path.clone(), + worktree_id: WorktreeId::from_usize(path_match.0.worktree_id), + }) + }) .map(Match::Search) .collect(); @@ -671,10 +671,9 @@ impl Matches { } if let Some(filename) = panel_match.0.path.file_name() { - let path_str = panel_match.0.path.to_string_lossy(); - let filename_str = filename.to_string_lossy(); + let path_str = panel_match.0.path.as_unix_str(); - if let Some(filename_pos) = path_str.rfind(&*filename_str) + if let Some(filename_pos) = path_str.rfind(filename) && panel_match.0.positions[0] >= filename_pos { let mut prev_position = panel_match.0.positions[0]; @@ -696,7 +695,7 @@ fn matching_history_items<'a>( history_items: impl IntoIterator, currently_opened: Option<&'a FoundPath>, query: &FileSearchQuery, -) -> HashMap, Match> { +) -> HashMap { let mut candidates_paths = HashMap::default(); let history_items_by_worktrees = history_items @@ -714,7 +713,7 @@ fn matching_history_items<'a>( .project .path .file_name()? - .to_string_lossy() + .to_string() .to_lowercase() .chars(), ), @@ -750,9 +749,9 @@ fn matching_history_items<'a>( worktree_id: WorktreeId::from_usize(path_match.worktree_id), path: Arc::clone(&path_match.path), }) - .map(|(_, found_path)| { + .map(|(project_path, found_path)| { ( - Arc::clone(&path_match.path), + project_path.clone(), Match::History { path: found_path.clone(), panel_match: Some(ProjectPanelOrdMatch(path_match)), @@ -768,11 +767,11 @@ fn matching_history_items<'a>( #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] struct FoundPath { project: ProjectPath, - absolute: Option, + absolute: PathBuf, } impl FoundPath { - fn new(project: ProjectPath, absolute: Option) -> Self { + fn new(project: ProjectPath, absolute: PathBuf) -> Self { Self { project, absolute } } } @@ -886,14 +885,14 @@ impl FileFinderDelegate { .collect::>(); let search_id = util::post_inc(&mut self.search_count); - self.cancel_flag.store(true, atomic::Ordering::Relaxed); + self.cancel_flag.store(true, atomic::Ordering::Release); self.cancel_flag = Arc::new(AtomicBool::new(false)); let cancel_flag = self.cancel_flag.clone(); cx.spawn_in(window, async move |picker, cx| { let matches = fuzzy::match_path_sets( candidate_sets.as_slice(), query.path_query(), - relative_to, + &relative_to, false, 100, &cancel_flag, @@ -902,7 +901,7 @@ impl FileFinderDelegate { .await .into_iter() .map(ProjectPanelOrdMatch); - let did_cancel = cancel_flag.load(atomic::Ordering::Relaxed); + let did_cancel = cancel_flag.load(atomic::Ordering::Acquire); picker .update(cx, |picker, cx| { picker @@ -944,47 +943,44 @@ impl FileFinderDelegate { extend_old_matches, ); - let filename = &query.raw_query; - let mut query_path = Path::new(filename); - // add option of creating new file only if path is relative - let available_worktree = self - .project - .read(cx) - .visible_worktrees(cx) - .filter(|worktree| !worktree.read(cx).is_single_file()) - .collect::>(); - let worktree_count = available_worktree.len(); - let mut expect_worktree = available_worktree.first().cloned(); - for worktree in available_worktree { - let worktree_root = worktree + let path_style = self.project.read(cx).path_style(cx); + let query_path = query.raw_query.as_str(); + if let Ok(mut query_path) = RelPath::new(Path::new(query_path), path_style) { + let available_worktree = self + .project .read(cx) - .abs_path() - .file_name() - .map_or(String::new(), |f| f.to_string_lossy().to_string()); - if worktree_count > 1 && query_path.starts_with(&worktree_root) { - query_path = query_path - .strip_prefix(&worktree_root) - .unwrap_or(query_path); - expect_worktree = Some(worktree); - break; + .visible_worktrees(cx) + .filter(|worktree| !worktree.read(cx).is_single_file()) + .collect::>(); + let worktree_count = available_worktree.len(); + let mut expect_worktree = available_worktree.first().cloned(); + for worktree in available_worktree { + let worktree_root = worktree.read(cx).root_name(); + if worktree_count > 1 { + if let Ok(suffix) = query_path.strip_prefix(worktree_root) { + query_path = Cow::Owned(suffix.to_owned()); + expect_worktree = Some(worktree); + break; + } + } } - } - if let Some(FoundPath { ref project, .. }) = self.currently_opened_path { - let worktree_id = project.worktree_id; - expect_worktree = self.project.read(cx).worktree_for_id(worktree_id, cx); - } + if let Some(FoundPath { ref project, .. }) = self.currently_opened_path { + let worktree_id = project.worktree_id; + expect_worktree = self.project.read(cx).worktree_for_id(worktree_id, cx); + } - if let Some(worktree) = expect_worktree { - let worktree = worktree.read(cx); - if query_path.is_relative() - && worktree.entry_for_path(&query_path).is_none() - && !filename.ends_with("/") - { - self.matches.matches.push(Match::CreateNew(ProjectPath { - worktree_id: worktree.id(), - path: Arc::from(query_path), - })); + if let Some(worktree) = expect_worktree { + let worktree = worktree.read(cx); + if worktree.entry_for_path(&query_path).is_none() + && !query.raw_query.ends_with("/") + && !(path_style.is_windows() && query.raw_query.ends_with("\\")) + { + self.matches.matches.push(Match::CreateNew(ProjectPath { + worktree_id: worktree.id(), + path: query_path.into_arc(), + })); + } } } @@ -1009,8 +1005,8 @@ impl FileFinderDelegate { path_match: &Match, window: &mut Window, cx: &App, - ix: usize, ) -> (HighlightedLabel, HighlightedLabel) { + let path_style = self.project.read(cx).path_style(cx); let (file_name, file_name_positions, mut full_path, mut full_path_positions) = match &path_match { Match::History { @@ -1018,68 +1014,52 @@ impl FileFinderDelegate { panel_match, } => { let worktree_id = entry_path.project.worktree_id; - let project_relative_path = &entry_path.project.path; - let has_worktree = self + let worktree = self .project .read(cx) .worktree_for_id(worktree_id, cx) - .is_some(); - - if let Some(absolute_path) = - entry_path.absolute.as_ref().filter(|_| !has_worktree) - { + .filter(|worktree| worktree.read(cx).is_visible()); + + if let Some(panel_match) = panel_match { + self.labels_for_path_match(&panel_match.0, path_style) + } else if let Some(worktree) = worktree { + let full_path = + worktree.read(cx).root_name().join(&entry_path.project.path); + let mut components = full_path.components(); + let filename = components.next_back().unwrap_or(""); + let prefix = components.rest(); ( - absolute_path - .file_name() - .map_or_else( - || project_relative_path.to_string_lossy(), - |file_name| file_name.to_string_lossy(), - ) - .to_string(), + filename.to_string(), Vec::new(), - absolute_path.to_string_lossy().to_string(), + prefix.display(path_style).to_string() + path_style.separator(), Vec::new(), ) } else { - let mut path = Arc::clone(project_relative_path); - if project_relative_path.as_ref() == Path::new("") - && let Some(absolute_path) = &entry_path.absolute - { - path = Arc::from(absolute_path.as_path()); - } - - let mut path_match = PathMatch { - score: ix as f64, - positions: Vec::new(), - worktree_id: worktree_id.to_usize(), - path, - is_dir: false, // File finder doesn't support directories - path_prefix: "".into(), - distance_to_relative_ancestor: usize::MAX, - }; - if let Some(found_path_match) = &panel_match { - path_match - .positions - .extend(found_path_match.0.positions.iter()) - } - - self.labels_for_path_match(&path_match) + ( + entry_path + .absolute + .file_name() + .map_or(String::new(), |f| f.to_string_lossy().into_owned()), + Vec::new(), + entry_path.absolute.parent().map_or(String::new(), |path| { + path.to_string_lossy().into_owned() + path_style.separator() + }), + Vec::new(), + ) } } - Match::Search(path_match) => self.labels_for_path_match(&path_match.0), + Match::Search(path_match) => self.labels_for_path_match(&path_match.0, path_style), Match::CreateNew(project_path) => ( - format!("Create file: {}", project_path.path.display()), + format!("Create file: {}", project_path.path.display(path_style)), vec![], String::from(""), vec![], ), }; - if file_name_positions.is_empty() - && let Some(user_home_path) = std::env::var("HOME").ok() - { - let user_home_path = user_home_path.trim(); - if !user_home_path.is_empty() && full_path.starts_with(user_home_path) { + if file_name_positions.is_empty() { + let user_home_path = util::paths::home_dir().to_string_lossy(); + if !user_home_path.is_empty() && full_path.starts_with(&*user_home_path) { full_path.replace_range(0..user_home_path.len(), "~"); full_path_positions.retain_mut(|pos| { if *pos >= user_home_path.len() { @@ -1147,17 +1127,13 @@ impl FileFinderDelegate { fn labels_for_path_match( &self, path_match: &PathMatch, + path_style: PathStyle, ) -> (String, Vec, String, Vec) { - let path = &path_match.path; - let path_string = path.to_string_lossy(); - let full_path = [path_match.path_prefix.as_ref(), path_string.as_ref()].join(""); + let full_path = path_match.path_prefix.join(&path_match.path); let mut path_positions = path_match.positions.clone(); - let file_name = path.file_name().map_or_else( - || path_match.path_prefix.to_string(), - |file_name| file_name.to_string_lossy().to_string(), - ); - let file_name_start = path_match.path_prefix.len() + path_string.len() - file_name.len(); + let file_name = full_path.file_name().unwrap_or(""); + let file_name_start = full_path.as_unix_str().len() - file_name.len(); let file_name_positions = path_positions .iter() .filter_map(|pos| { @@ -1167,26 +1143,54 @@ impl FileFinderDelegate { None } }) - .collect(); + .collect::>(); - let full_path = full_path.trim_end_matches(&file_name).to_string(); + let full_path = full_path + .display(path_style) + .trim_end_matches(&file_name) + .to_string(); path_positions.retain(|idx| *idx < full_path.len()); - (file_name, file_name_positions, full_path, path_positions) + debug_assert!( + file_name_positions + .iter() + .all(|ix| file_name[*ix..].chars().next().is_some()), + "invalid file name positions {file_name:?} {file_name_positions:?}" + ); + debug_assert!( + path_positions + .iter() + .all(|ix| full_path[*ix..].chars().next().is_some()), + "invalid path positions {full_path:?} {path_positions:?}" + ); + + ( + file_name.to_string(), + file_name_positions, + full_path, + path_positions, + ) } + /// Attempts to resolve an absolute file path and update the search matches if found. + /// + /// If the query path resolves to an absolute file that exists in the project, + /// this method will find the corresponding worktree and relative path, create a + /// match for it, and update the picker's search results. + /// + /// Returns `true` if the absolute path exists, otherwise returns `false`. fn lookup_absolute_path( &self, query: FileSearchQuery, window: &mut Window, cx: &mut Context>, - ) -> Task<()> { + ) -> Task { cx.spawn_in(window, async move |picker, cx| { let Some(project) = picker .read_with(cx, |picker, _| picker.delegate.project.clone()) .log_err() else { - return; + return false; }; let query_path = Path::new(query.path_query()); @@ -1210,8 +1214,8 @@ impl FileFinderDelegate { score: 1.0, positions: Vec::new(), worktree_id: worktree.read(cx).id().to_usize(), - path: Arc::from(relative_path), - path_prefix: "".into(), + path: relative_path, + path_prefix: RelPath::empty().into(), is_dir: false, // File finder doesn't support directories distance_to_relative_ancestor: usize::MAX, })); @@ -1219,7 +1223,7 @@ impl FileFinderDelegate { }) .log_err(); if update_result.is_none() { - return; + return abs_file_exists; } } @@ -1232,6 +1236,7 @@ impl FileFinderDelegate { anyhow::Ok(()) }) .log_err(); + abs_file_exists }) } @@ -1323,8 +1328,8 @@ impl PickerDelegate for FileFinderDelegate { let raw_query = raw_query.trim(); let raw_query = match &raw_query.get(0..2) { - Some(".\\") | Some("./") => &raw_query[2..], - Some("a\\") | Some("a/") => { + Some(".\\" | "./") => &raw_query[2..], + Some(prefix @ ("a\\" | "a/" | "b\\" | "b/")) => { if self .workspace .upgrade() @@ -1333,25 +1338,7 @@ impl PickerDelegate for FileFinderDelegate { .all(|worktree| { worktree .read(cx) - .entry_for_path(Path::new("a")) - .is_none_or(|entry| !entry.is_dir()) - }) - { - &raw_query[2..] - } else { - raw_query - } - } - Some("b\\") | Some("b/") => { - if self - .workspace - .upgrade() - .into_iter() - .flat_map(|workspace| workspace.read(cx).worktrees(cx)) - .all(|worktree| { - worktree - .read(cx) - .entry_for_path(Path::new("b")) + .entry_for_path(RelPath::unix(prefix.split_at(1).0).unwrap()) .is_none_or(|entry| !entry.is_dir()) }) { @@ -1381,8 +1368,8 @@ impl PickerDelegate for FileFinderDelegate { project .worktree_for_id(history_item.project.worktree_id, cx) .is_some() - || ((project.is_local() || project.is_via_remote_server()) - && history_item.absolute.is_some()) + || project.is_local() + || project.is_via_remote_server() }), self.currently_opened_path.as_ref(), None, @@ -1397,20 +1384,15 @@ impl PickerDelegate for FileFinderDelegate { Task::ready(()) } else { let path_position = PathWithPosition::parse_str(raw_query); - - #[cfg(windows)] - let raw_query = raw_query.trim().to_owned().replace("/", "\\"); - #[cfg(not(windows))] - let raw_query = raw_query.trim(); - - let raw_query = raw_query.trim_end_matches(':').to_owned(); - let path = path_position.path.to_str(); - let path_trimmed = path.unwrap_or(&raw_query).trim_end_matches(':'); + let raw_query = raw_query.trim().trim_end_matches(':').to_owned(); + let path = path_position.path.clone(); + let path_str = path_position.path.to_str(); + let path_trimmed = path_str.unwrap_or(&raw_query).trim_end_matches(':'); let file_query_end = if path_trimmed == raw_query { None } else { // Safe to unwrap as we won't get here when the unwrap in if fails - Some(path.unwrap().len()) + Some(path_str.unwrap().len()) }; let query = FileSearchQuery { @@ -1419,11 +1401,29 @@ impl PickerDelegate for FileFinderDelegate { path_position, }; - if Path::new(query.path_query()).is_absolute() { - self.lookup_absolute_path(query, window, cx) - } else { - self.spawn_search(query, window, cx) - } + cx.spawn_in(window, async move |this, cx| { + let _ = maybe!(async move { + let is_absolute_path = path.is_absolute(); + let did_resolve_abs_path = is_absolute_path + && this + .update_in(cx, |this, window, cx| { + this.delegate + .lookup_absolute_path(query.clone(), window, cx) + })? + .await; + + // Only check for relative paths if no absolute paths were + // found. + if !did_resolve_abs_path { + this.update_in(cx, |this, window, cx| { + this.delegate.spawn_search(query, window, cx) + })? + .await; + } + anyhow::Ok(()) + }) + .await; + }) } } @@ -1505,38 +1505,18 @@ impl PickerDelegate for FileFinderDelegate { window, cx, ) + } else if secondary { + workspace.split_abs_path(path.absolute.clone(), false, window, cx) } else { - match path.absolute.as_ref() { - Some(abs_path) => { - if secondary { - workspace.split_abs_path( - abs_path.to_path_buf(), - false, - window, - cx, - ) - } else { - workspace.open_abs_path( - abs_path.to_path_buf(), - OpenOptions { - visible: Some(OpenVisible::None), - ..Default::default() - }, - window, - cx, - ) - } - } - None => split_or_open( - workspace, - ProjectPath { - worktree_id, - path: Arc::clone(&path.project.path), - }, - window, - cx, - ), - } + workspace.open_abs_path( + path.absolute.clone(), + OpenOptions { + visible: Some(OpenVisible::None), + ..Default::default() + }, + window, + cx, + ) } } Match::Search(m) => split_or_open( @@ -1615,7 +1595,7 @@ impl PickerDelegate for FileFinderDelegate { .size(IconSize::Small) .into_any_element(), }; - let (file_name_label, full_path_label) = self.labels_for_match(path_match, window, cx, ix); + let (file_name_label, full_path_label) = self.labels_for_match(path_match, window, cx); let file_icon = maybe!({ if !settings.file_icons { diff --git a/crates/file_finder/src/file_finder_settings.rs b/crates/file_finder/src/file_finder_settings.rs index 6a6b98b8ea3e1c7e7f0e3cc0385fdd7f413b659f..8689e0ad1e3df2c90c2c033953f08eb31aff052d 100644 --- a/crates/file_finder/src/file_finder_settings.rs +++ b/crates/file_finder/src/file_finder_settings.rs @@ -1,55 +1,26 @@ -use anyhow::Result; use schemars::JsonSchema; -use serde_derive::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use serde::{Deserialize, Serialize}; +use settings::Settings; #[derive(Deserialize, Debug, Clone, Copy, PartialEq)] pub struct FileFinderSettings { pub file_icons: bool, - pub modal_max_width: Option, + pub modal_max_width: FileFinderWidth, pub skip_focus_for_active_in_search: bool, pub include_ignored: Option, } -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[settings_key(key = "file_finder")] -pub struct FileFinderSettingsContent { - /// Whether to show file icons in the file finder. - /// - /// Default: true - pub file_icons: Option, - /// Determines how much space the file finder can take up in relation to the available window width. - /// - /// Default: small - pub modal_max_width: Option, - /// Determines whether the file finder should skip focus for the active file in search results. - /// - /// Default: true - pub skip_focus_for_active_in_search: Option, - /// Determines whether to show the git status in the file finder - /// - /// Default: true - pub git_status: Option, - /// Whether to use gitignored files when searching. - /// Only the file Zed had indexed will be used, not necessary all the gitignored files. - /// - /// Can accept 3 values: - /// * `Some(true)`: Use all gitignored files - /// * `Some(false)`: Use only the files Zed had indexed - /// * `None`: Be smart and search for ignored when called from a gitignored worktree - /// - /// Default: None - pub include_ignored: Option>, -} - impl Settings for FileFinderSettings { - type FileContent = FileFinderSettingsContent; + fn from_settings(content: &settings::SettingsContent) -> Self { + let file_finder = content.file_finder.as_ref().unwrap(); - fn load(sources: SettingsSources, _: &mut gpui::App) -> Result { - sources.json_merge() + Self { + file_icons: file_finder.file_icons.unwrap(), + modal_max_width: file_finder.modal_max_width.unwrap().into(), + skip_focus_for_active_in_search: file_finder.skip_focus_for_active_in_search.unwrap(), + include_ignored: file_finder.include_ignored, + } } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } #[derive(Debug, PartialEq, Eq, Clone, Copy, Default, Serialize, Deserialize, JsonSchema)] @@ -62,3 +33,15 @@ pub enum FileFinderWidth { XLarge, Full, } + +impl From for FileFinderWidth { + fn from(content: settings::FileFinderWidthContent) -> Self { + match content { + settings::FileFinderWidthContent::Small => FileFinderWidth::Small, + settings::FileFinderWidthContent::Medium => FileFinderWidth::Medium, + settings::FileFinderWidthContent::Large => FileFinderWidth::Large, + settings::FileFinderWidthContent::XLarge => FileFinderWidth::XLarge, + settings::FileFinderWidthContent::Full => FileFinderWidth::Full, + } + } +} diff --git a/crates/file_finder/src/file_finder_tests.rs b/crates/file_finder/src/file_finder_tests.rs index cd0f203d6a300b4039df74a646bf0a9d56818347..00b47bf44ec0817d0ab37ae9a610316fcdf5d3e1 100644 --- a/crates/file_finder/src/file_finder_tests.rs +++ b/crates/file_finder/src/file_finder_tests.rs @@ -4,10 +4,10 @@ use super::*; use editor::Editor; use gpui::{Entity, TestAppContext, VisualTestContext}; use menu::{Confirm, SelectNext, SelectPrevious}; -use pretty_assertions::assert_eq; +use pretty_assertions::{assert_eq, assert_matches}; use project::{FS_WATCH_LATENCY, RemoveOptions}; use serde_json::json; -use util::path; +use util::{path, rel_path::rel_path}; use workspace::{AppState, CloseActiveItem, OpenOptions, ToggleFileFinder, Workspace}; #[ctor::ctor] @@ -77,8 +77,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 0.5, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("b0.5")), - path_prefix: Arc::default(), + path: rel_path("b0.5").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -86,8 +86,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 1.0, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("c1.0")), - path_prefix: Arc::default(), + path: rel_path("c1.0").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -95,8 +95,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 1.0, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("a1.0")), - path_prefix: Arc::default(), + path: rel_path("a1.0").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -104,8 +104,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 0.5, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("a0.5")), - path_prefix: Arc::default(), + path: rel_path("a0.5").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -113,8 +113,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 1.0, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("b1.0")), - path_prefix: Arc::default(), + path: rel_path("b1.0").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -128,8 +128,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 1.0, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("a1.0")), - path_prefix: Arc::default(), + path: rel_path("a1.0").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -137,8 +137,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 1.0, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("b1.0")), - path_prefix: Arc::default(), + path: rel_path("b1.0").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -146,8 +146,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 1.0, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("c1.0")), - path_prefix: Arc::default(), + path: rel_path("c1.0").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -155,8 +155,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 0.5, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("a0.5")), - path_prefix: Arc::default(), + path: rel_path("a0.5").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -164,8 +164,8 @@ fn test_custom_project_search_ordering_in_file_finder() { score: 0.5, positions: Vec::new(), worktree_id: 0, - path: Arc::from(Path::new("b0.5")), - path_prefix: Arc::default(), + path: rel_path("b0.5").into(), + path_prefix: rel_path("").into(), distance_to_relative_ancestor: 0, is_dir: false, }), @@ -366,7 +366,7 @@ async fn test_absolute_paths(cx: &mut TestAppContext) { picker.update(cx, |picker, _| { assert_eq!( collect_search_matches(picker).search_paths_only(), - vec![PathBuf::from("a/b/file2.txt")], + vec![rel_path("a/b/file2.txt").into()], "Matching abs path should be the only match" ) }); @@ -388,7 +388,7 @@ async fn test_absolute_paths(cx: &mut TestAppContext) { picker.update(cx, |picker, _| { assert_eq!( collect_search_matches(picker).search_paths_only(), - Vec::::new(), + Vec::new(), "Mismatching abs path should produce no matches" ) }); @@ -421,7 +421,7 @@ async fn test_complex_path(cx: &mut TestAppContext) { assert_eq!(picker.delegate.matches.len(), 2); assert_eq!( collect_search_matches(picker).search_paths_only(), - vec![PathBuf::from("其他/S数据表格/task.xlsx")], + vec![rel_path("其他/S数据表格/task.xlsx").into()], ) }); cx.dispatch_action(Confirm); @@ -713,13 +713,13 @@ async fn test_ignored_root(cx: &mut TestAppContext) { assert_eq!( matches.search, vec![ - PathBuf::from("ignored-root/hi"), - PathBuf::from("tracked-root/hi"), - PathBuf::from("ignored-root/hiccup"), - PathBuf::from("tracked-root/hiccup"), - PathBuf::from("ignored-root/height"), - PathBuf::from("ignored-root/happiness"), - PathBuf::from("tracked-root/happiness"), + rel_path("ignored-root/hi").into(), + rel_path("tracked-root/hi").into(), + rel_path("ignored-root/hiccup").into(), + rel_path("tracked-root/hiccup").into(), + rel_path("ignored-root/height").into(), + rel_path("ignored-root/happiness").into(), + rel_path("tracked-root/happiness").into(), ], "All ignored files that were indexed are found for default ignored mode" ); @@ -738,14 +738,14 @@ async fn test_ignored_root(cx: &mut TestAppContext) { assert_eq!( matches.search, vec![ - PathBuf::from("ignored-root/hi"), - PathBuf::from("tracked-root/hi"), - PathBuf::from("ignored-root/hiccup"), - PathBuf::from("tracked-root/hiccup"), - PathBuf::from("ignored-root/height"), - PathBuf::from("tracked-root/height"), - PathBuf::from("ignored-root/happiness"), - PathBuf::from("tracked-root/happiness"), + rel_path("ignored-root/hi").into(), + rel_path("tracked-root/hi").into(), + rel_path("ignored-root/hiccup").into(), + rel_path("tracked-root/hiccup").into(), + rel_path("ignored-root/height").into(), + rel_path("tracked-root/height").into(), + rel_path("ignored-root/happiness").into(), + rel_path("tracked-root/happiness").into(), ], "All ignored files should be found, for the toggled on ignored mode" ); @@ -765,9 +765,9 @@ async fn test_ignored_root(cx: &mut TestAppContext) { assert_eq!( matches.search, vec![ - PathBuf::from("tracked-root/hi"), - PathBuf::from("tracked-root/hiccup"), - PathBuf::from("tracked-root/happiness"), + rel_path("tracked-root/hi").into(), + rel_path("tracked-root/hiccup").into(), + rel_path("tracked-root/happiness").into(), ], "Only non-ignored files should be found for the turned off ignored mode" ); @@ -812,13 +812,13 @@ async fn test_ignored_root(cx: &mut TestAppContext) { assert_eq!( matches.search, vec![ - PathBuf::from("ignored-root/hi"), - PathBuf::from("tracked-root/hi"), - PathBuf::from("ignored-root/hiccup"), - PathBuf::from("tracked-root/hiccup"), - PathBuf::from("ignored-root/height"), - PathBuf::from("ignored-root/happiness"), - PathBuf::from("tracked-root/happiness"), + rel_path("ignored-root/hi").into(), + rel_path("tracked-root/hi").into(), + rel_path("ignored-root/hiccup").into(), + rel_path("tracked-root/hiccup").into(), + rel_path("ignored-root/height").into(), + rel_path("ignored-root/happiness").into(), + rel_path("tracked-root/happiness").into(), ], "Only for the worktree with the ignored root, all indexed ignored files are found in the auto ignored mode" ); @@ -838,16 +838,16 @@ async fn test_ignored_root(cx: &mut TestAppContext) { assert_eq!( matches.search, vec![ - PathBuf::from("ignored-root/hi"), - PathBuf::from("tracked-root/hi"), - PathBuf::from("ignored-root/hiccup"), - PathBuf::from("tracked-root/hiccup"), - PathBuf::from("ignored-root/height"), - PathBuf::from("tracked-root/height"), - PathBuf::from("tracked-root/heights/height_1"), - PathBuf::from("tracked-root/heights/height_2"), - PathBuf::from("ignored-root/happiness"), - PathBuf::from("tracked-root/happiness"), + rel_path("ignored-root/hi").into(), + rel_path("tracked-root/hi").into(), + rel_path("ignored-root/hiccup").into(), + rel_path("tracked-root/hiccup").into(), + rel_path("ignored-root/height").into(), + rel_path("tracked-root/height").into(), + rel_path("tracked-root/heights/height_1").into(), + rel_path("tracked-root/heights/height_2").into(), + rel_path("ignored-root/happiness").into(), + rel_path("tracked-root/happiness").into(), ], "All ignored files that were indexed are found in the turned on ignored mode" ); @@ -867,9 +867,9 @@ async fn test_ignored_root(cx: &mut TestAppContext) { assert_eq!( matches.search, vec![ - PathBuf::from("tracked-root/hi"), - PathBuf::from("tracked-root/hiccup"), - PathBuf::from("tracked-root/happiness"), + rel_path("tracked-root/hi").into(), + rel_path("tracked-root/hiccup").into(), + rel_path("tracked-root/happiness").into(), ], "Only non-ignored files should be found for the turned off ignored mode" ); @@ -910,7 +910,7 @@ async fn test_single_file_worktrees(cx: &mut TestAppContext) { assert_eq!(matches.len(), 1); let (file_name, file_name_positions, full_path, full_path_positions) = - delegate.labels_for_path_match(&matches[0]); + delegate.labels_for_path_match(&matches[0], PathStyle::local()); assert_eq!(file_name, "the-file"); assert_eq!(file_name_positions, &[0, 1, 4]); assert_eq!(full_path, ""); @@ -929,6 +929,114 @@ async fn test_single_file_worktrees(cx: &mut TestAppContext) { picker.update(cx, |f, _| assert_eq!(f.delegate.matches.len(), 0)); } +#[gpui::test] +async fn test_history_items_uniqueness_for_multiple_worktree(cx: &mut TestAppContext) { + let app_state = init_test(cx); + app_state + .fs + .as_fake() + .insert_tree( + path!("/repo1"), + json!({ + "package.json": r#"{"name": "repo1"}"#, + "src": { + "index.js": "// Repo 1 index", + } + }), + ) + .await; + + app_state + .fs + .as_fake() + .insert_tree( + path!("/repo2"), + json!({ + "package.json": r#"{"name": "repo2"}"#, + "src": { + "index.js": "// Repo 2 index", + } + }), + ) + .await; + + let project = Project::test( + app_state.fs.clone(), + [path!("/repo1").as_ref(), path!("/repo2").as_ref()], + cx, + ) + .await; + + let (workspace, cx) = cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx)); + let (worktree_id1, worktree_id2) = cx.read(|cx| { + let worktrees = workspace.read(cx).worktrees(cx).collect::>(); + (worktrees[0].read(cx).id(), worktrees[1].read(cx).id()) + }); + + workspace + .update_in(cx, |workspace, window, cx| { + workspace.open_path( + ProjectPath { + worktree_id: worktree_id1, + path: rel_path("package.json").into(), + }, + None, + true, + window, + cx, + ) + }) + .await + .unwrap(); + + cx.dispatch_action(workspace::CloseActiveItem { + save_intent: None, + close_pinned: false, + }); + + let picker = open_file_picker(&workspace, cx); + cx.simulate_input("package.json"); + + picker.update(cx, |finder, _| { + let matches = &finder.delegate.matches.matches; + + assert_eq!( + matches.len(), + 2, + "Expected 1 history match + 1 search matches, but got {} matches: {:?}", + matches.len(), + matches + ); + + assert_matches!(matches[0], Match::History { .. }); + + let search_matches = collect_search_matches(finder); + assert_eq!( + search_matches.history.len(), + 1, + "Should have exactly 1 history match" + ); + assert_eq!( + search_matches.search.len(), + 1, + "Should have exactly 1 search match (the other package.json)" + ); + + if let Match::History { path, .. } = &matches[0] { + assert_eq!(path.project.worktree_id, worktree_id1); + assert_eq!(path.project.path.as_ref(), rel_path("package.json")); + } + + if let Match::Search(path_match) = &matches[1] { + assert_eq!( + WorktreeId::from_usize(path_match.0.worktree_id), + worktree_id2 + ); + assert_eq!(path_match.0.path.as_ref(), rel_path("package.json")); + } + }); +} + #[gpui::test] async fn test_create_file_for_multiple_worktrees(cx: &mut TestAppContext) { let app_state = init_test(cx); @@ -968,7 +1076,7 @@ async fn test_create_file_for_multiple_worktrees(cx: &mut TestAppContext) { let b_path = ProjectPath { worktree_id: worktree_id2, - path: Arc::from(Path::new(path!("the-parent-dirb/fileb"))), + path: rel_path("the-parent-dirb/fileb").into(), }; workspace .update_in(cx, |workspace, window, cx| { @@ -1001,7 +1109,7 @@ async fn test_create_file_for_multiple_worktrees(cx: &mut TestAppContext) { project_path, Some(ProjectPath { worktree_id: worktree_id2, - path: Arc::from(Path::new(path!("the-parent-dirb/filec"))) + path: rel_path("the-parent-dirb/filec").into() }) ); }); @@ -1038,10 +1146,7 @@ async fn test_create_file_no_focused_with_multiple_worktrees(cx: &mut TestAppCon let (workspace, cx) = cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx)); let (_worktree_id1, worktree_id2) = cx.read(|cx| { let worktrees = workspace.read(cx).worktrees(cx).collect::>(); - ( - WorktreeId::from_usize(worktrees[0].entity_id().as_u64() as usize), - WorktreeId::from_usize(worktrees[1].entity_id().as_u64() as usize), - ) + (worktrees[0].read(cx).id(), worktrees[1].read(cx).id()) }); let finder = open_file_picker(&workspace, cx); @@ -1065,7 +1170,7 @@ async fn test_create_file_no_focused_with_multiple_worktrees(cx: &mut TestAppCon project_path, Some(ProjectPath { worktree_id: worktree_id2, - path: Arc::from(Path::new("filec")) + path: rel_path("filec").into() }) ); }); @@ -1103,7 +1208,7 @@ async fn test_path_distance_ordering(cx: &mut TestAppContext) { // so that one should be sorted earlier let b_path = ProjectPath { worktree_id, - path: Arc::from(Path::new("dir2/b.txt")), + path: rel_path("dir2/b.txt").into(), }; workspace .update_in(cx, |workspace, window, cx| { @@ -1121,8 +1226,8 @@ async fn test_path_distance_ordering(cx: &mut TestAppContext) { finder.update(cx, |picker, _| { let matches = collect_search_matches(picker).search_paths_only(); - assert_eq!(matches[0].as_path(), Path::new("dir2/a.txt")); - assert_eq!(matches[1].as_path(), Path::new("dir1/a.txt")); + assert_eq!(matches[0].as_ref(), rel_path("dir2/a.txt")); + assert_eq!(matches[1].as_ref(), rel_path("dir1/a.txt")); }); } @@ -1207,9 +1312,9 @@ async fn test_query_history(cx: &mut gpui::TestAppContext) { vec![FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/first.rs")), + path: rel_path("test/first.rs").into(), }, - Some(PathBuf::from(path!("/src/test/first.rs"))) + PathBuf::from(path!("/src/test/first.rs")) )], "Should show 1st opened item in the history when opening the 2nd item" ); @@ -1222,16 +1327,16 @@ async fn test_query_history(cx: &mut gpui::TestAppContext) { FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/second.rs")), + path: rel_path("test/second.rs").into(), }, - Some(PathBuf::from(path!("/src/test/second.rs"))) + PathBuf::from(path!("/src/test/second.rs")) ), FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/first.rs")), + path: rel_path("test/first.rs").into(), }, - Some(PathBuf::from(path!("/src/test/first.rs"))) + PathBuf::from(path!("/src/test/first.rs")) ), ], "Should show 1st and 2nd opened items in the history when opening the 3rd item. \ @@ -1246,23 +1351,23 @@ async fn test_query_history(cx: &mut gpui::TestAppContext) { FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/third.rs")), + path: rel_path("test/third.rs").into(), }, - Some(PathBuf::from(path!("/src/test/third.rs"))) + PathBuf::from(path!("/src/test/third.rs")) ), FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/second.rs")), + path: rel_path("test/second.rs").into(), }, - Some(PathBuf::from(path!("/src/test/second.rs"))) + PathBuf::from(path!("/src/test/second.rs")) ), FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/first.rs")), + path: rel_path("test/first.rs").into(), }, - Some(PathBuf::from(path!("/src/test/first.rs"))) + PathBuf::from(path!("/src/test/first.rs")) ), ], "Should show 1st, 2nd and 3rd opened items in the history when opening the 2nd item again. \ @@ -1277,23 +1382,23 @@ async fn test_query_history(cx: &mut gpui::TestAppContext) { FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/second.rs")), + path: rel_path("test/second.rs").into(), }, - Some(PathBuf::from(path!("/src/test/second.rs"))) + PathBuf::from(path!("/src/test/second.rs")) ), FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/third.rs")), + path: rel_path("test/third.rs").into(), }, - Some(PathBuf::from(path!("/src/test/third.rs"))) + PathBuf::from(path!("/src/test/third.rs")) ), FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/first.rs")), + path: rel_path("test/first.rs").into(), }, - Some(PathBuf::from(path!("/src/test/first.rs"))) + PathBuf::from(path!("/src/test/first.rs")) ), ], "Should show 1st, 2nd and 3rd opened items in the history when opening the 3rd item again. \ @@ -1301,6 +1406,62 @@ async fn test_query_history(cx: &mut gpui::TestAppContext) { ); } +#[gpui::test] +async fn test_history_match_positions(cx: &mut gpui::TestAppContext) { + let app_state = init_test(cx); + + app_state + .fs + .as_fake() + .insert_tree( + path!("/src"), + json!({ + "test": { + "first.rs": "// First Rust file", + "second.rs": "// Second Rust file", + "third.rs": "// Third Rust file", + } + }), + ) + .await; + + let project = Project::test(app_state.fs.clone(), [path!("/src").as_ref()], cx).await; + let (workspace, cx) = cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx)); + + workspace.update_in(cx, |_workspace, window, cx| window.focused(cx)); + + open_close_queried_buffer("efir", 1, "first.rs", &workspace, cx).await; + let history = open_close_queried_buffer("second", 1, "second.rs", &workspace, cx).await; + assert_eq!(history.len(), 1); + + let picker = open_file_picker(&workspace, cx); + cx.simulate_input("fir"); + picker.update_in(cx, |finder, window, cx| { + let matches = &finder.delegate.matches.matches; + assert_matches!( + matches.as_slice(), + [Match::History { .. }, Match::CreateNew { .. }] + ); + assert_eq!( + matches[0].panel_match().unwrap().0.path.as_ref(), + rel_path("test/first.rs") + ); + assert_eq!(matches[0].panel_match().unwrap().0.positions, &[5, 6, 7]); + + let (file_label, path_label) = + finder + .delegate + .labels_for_match(&finder.delegate.matches.matches[0], window, cx); + assert_eq!(file_label.text(), "first.rs"); + assert_eq!(file_label.highlight_indices(), &[0, 1, 2]); + assert_eq!( + path_label.text(), + format!("test{}", PathStyle::local().separator()) + ); + assert_eq!(path_label.highlight_indices(), &[] as &[usize]); + }); +} + #[gpui::test] async fn test_external_files_history(cx: &mut gpui::TestAppContext) { let app_state = init_test(cx); @@ -1392,9 +1553,9 @@ async fn test_external_files_history(cx: &mut gpui::TestAppContext) { vec![FoundPath::new( ProjectPath { worktree_id: external_worktree_id, - path: Arc::from(Path::new("")), + path: rel_path("").into(), }, - Some(PathBuf::from(path!("/external-src/test/third.rs"))) + PathBuf::from(path!("/external-src/test/third.rs")) )], "Should show external file with its full path in the history after it was open" ); @@ -1407,16 +1568,16 @@ async fn test_external_files_history(cx: &mut gpui::TestAppContext) { FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/second.rs")), + path: rel_path("test/second.rs").into(), }, - Some(PathBuf::from(path!("/src/test/second.rs"))) + PathBuf::from(path!("/src/test/second.rs")) ), FoundPath::new( ProjectPath { worktree_id: external_worktree_id, - path: Arc::from(Path::new("")), + path: rel_path("").into(), }, - Some(PathBuf::from(path!("/external-src/test/third.rs"))) + PathBuf::from(path!("/external-src/test/third.rs")) ), ], "Should keep external file with history updates", @@ -1529,12 +1690,12 @@ async fn test_search_preserves_history_items(cx: &mut gpui::TestAppContext) { assert_eq!(history_match, &FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/first.rs")), + path: rel_path("test/first.rs").into(), }, - Some(PathBuf::from(path!("/src/test/first.rs"))) + PathBuf::from(path!("/src/test/first.rs")), )); assert_eq!(matches.search.len(), 1, "Only one non-history item contains {first_query}, it should be present"); - assert_eq!(matches.search.first().unwrap(), Path::new("test/fourth.rs")); + assert_eq!(matches.search.first().unwrap().as_ref(), rel_path("test/fourth.rs")); }); let second_query = "fsdasdsa"; @@ -1572,12 +1733,12 @@ async fn test_search_preserves_history_items(cx: &mut gpui::TestAppContext) { assert_eq!(history_match, &FoundPath::new( ProjectPath { worktree_id, - path: Arc::from(Path::new("test/first.rs")), + path: rel_path("test/first.rs").into(), }, - Some(PathBuf::from(path!("/src/test/first.rs"))) + PathBuf::from(path!("/src/test/first.rs")) )); assert_eq!(matches.search.len(), 1, "Only one non-history item contains {first_query_again}, it should be present, even after non-matching query"); - assert_eq!(matches.search.first().unwrap(), Path::new("test/fourth.rs")); + assert_eq!(matches.search.first().unwrap().as_ref(), rel_path("test/fourth.rs")); }); } @@ -1626,13 +1787,16 @@ async fn test_search_sorts_history_items(cx: &mut gpui::TestAppContext) { let search_matches = collect_search_matches(finder); assert_eq!( search_matches.history, - vec![PathBuf::from("test/1_qw"), PathBuf::from("test/6_qwqwqw"),], + vec![ + rel_path("test/1_qw").into(), + rel_path("test/6_qwqwqw").into() + ], ); assert_eq!( search_matches.search, vec![ - PathBuf::from("test/5_qwqwqw"), - PathBuf::from("test/7_qwqwqw"), + rel_path("test/5_qwqwqw").into(), + rel_path("test/7_qwqwqw").into() ], ); }); @@ -2083,10 +2247,10 @@ async fn test_history_items_vs_very_good_external_match(cx: &mut gpui::TestAppCo assert_eq!( search_entries, vec![ - PathBuf::from("collab_ui/collab_ui.rs"), - PathBuf::from("collab_ui/first.rs"), - PathBuf::from("collab_ui/third.rs"), - PathBuf::from("collab_ui/second.rs"), + rel_path("collab_ui/collab_ui.rs").into(), + rel_path("collab_ui/first.rs").into(), + rel_path("collab_ui/third.rs").into(), + rel_path("collab_ui/second.rs").into(), ], "Despite all search results having the same directory name, the most matching one should be on top" ); @@ -2135,8 +2299,8 @@ async fn test_nonexistent_history_items_not_shown(cx: &mut gpui::TestAppContext) assert_eq!( collect_search_matches(picker).history, vec![ - PathBuf::from("test/first.rs"), - PathBuf::from("test/third.rs"), + rel_path("test/first.rs").into(), + rel_path("test/third.rs").into() ], "Should have all opened files in the history, except the ones that do not exist on disk" ); @@ -2766,15 +2930,15 @@ fn active_file_picker( #[derive(Debug, Default)] struct SearchEntries { - history: Vec, + history: Vec>, history_found_paths: Vec, - search: Vec, + search: Vec>, search_matches: Vec, } impl SearchEntries { #[track_caller] - fn search_paths_only(self) -> Vec { + fn search_paths_only(self) -> Vec> { assert!( self.history.is_empty(), "Should have no history matches, but got: {:?}", @@ -2802,20 +2966,15 @@ fn collect_search_matches(picker: &Picker) -> SearchEntries path: history_path, panel_match: path_match, } => { - search_entries.history.push( - path_match - .as_ref() - .map(|path_match| { - Path::new(path_match.0.path_prefix.as_ref()).join(&path_match.0.path) - }) - .unwrap_or_else(|| { - history_path - .absolute - .as_deref() - .unwrap_or_else(|| &history_path.project.path) - .to_path_buf() - }), - ); + if let Some(path_match) = path_match.as_ref() { + search_entries + .history + .push(path_match.0.path_prefix.join(&path_match.0.path)); + } else { + // This occurs when the query is empty and we show history matches + // that are outside the project. + panic!("currently not exercised in tests"); + } search_entries .history_found_paths .push(history_path.clone()); @@ -2823,7 +2982,7 @@ fn collect_search_matches(picker: &Picker) -> SearchEntries Match::Search(path_match) => { search_entries .search - .push(Path::new(path_match.0.path_prefix.as_ref()).join(&path_match.0.path)); + .push(path_match.0.path_prefix.join(&path_match.0.path)); search_entries.search_matches.push(path_match.0.clone()); } Match::CreateNew(_) => {} @@ -2858,12 +3017,11 @@ fn assert_match_at_position( .get(match_index) .unwrap_or_else(|| panic!("Finder has no match for index {match_index}")); let match_file_name = match &match_item { - Match::History { path, .. } => path.absolute.as_deref().unwrap().file_name(), + Match::History { path, .. } => path.absolute.file_name().and_then(|s| s.to_str()), Match::Search(path_match) => path_match.0.path.file_name(), Match::CreateNew(project_path) => project_path.path.file_name(), } - .unwrap() - .to_string_lossy(); + .unwrap(); assert_eq!(match_file_name, expected_file_name); } @@ -2901,13 +3059,59 @@ async fn test_filename_precedence(cx: &mut TestAppContext) { assert_eq!( search_matches, vec![ - PathBuf::from("routes/+layout.svelte"), - PathBuf::from("layout/app.css"), - PathBuf::from("layout/app.d.ts"), - PathBuf::from("layout/app.html"), - PathBuf::from("layout/+page.svelte"), + rel_path("routes/+layout.svelte").into(), + rel_path("layout/app.css").into(), + rel_path("layout/app.d.ts").into(), + rel_path("layout/app.html").into(), + rel_path("layout/+page.svelte").into(), ], "File with 'layout' in filename should be prioritized over files in 'layout' directory" ); }); } + +#[gpui::test] +async fn test_paths_with_starting_slash(cx: &mut TestAppContext) { + let app_state = init_test(cx); + app_state + .fs + .as_fake() + .insert_tree( + path!("/root"), + json!({ + "a": { + "file1.txt": "", + "b": { + "file2.txt": "", + }, + } + }), + ) + .await; + + let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; + + let (picker, workspace, cx) = build_find_picker(project, cx); + + let matching_abs_path = "/file1.txt".to_string(); + picker + .update_in(cx, |picker, window, cx| { + picker + .delegate + .update_matches(matching_abs_path, window, cx) + }) + .await; + picker.update(cx, |picker, _| { + assert_eq!( + collect_search_matches(picker).search_paths_only(), + vec![rel_path("a/file1.txt").into()], + "Relative path starting with slash should match" + ) + }); + cx.dispatch_action(SelectNext); + cx.dispatch_action(Confirm); + cx.read(|cx| { + let active_editor = workspace.read(cx).active_item_as::(cx).unwrap(); + assert_eq!(active_editor.read(cx).title(cx), "file1.txt"); + }); +} diff --git a/crates/file_finder/src/open_path_prompt.rs b/crates/file_finder/src/open_path_prompt.rs index 63f2f37ab18cbd1ab210685eeda01ac535a8118f..b0417b1d13fc4f82c8b16b0ac87249405b6f4129 100644 --- a/crates/file_finder/src/open_path_prompt.rs +++ b/crates/file_finder/src/open_path_prompt.rs @@ -7,7 +7,7 @@ use picker::{Picker, PickerDelegate}; use project::{DirectoryItem, DirectoryLister}; use settings::Settings; use std::{ - path::{self, MAIN_SEPARATOR_STR, Path, PathBuf}, + path::{self, Path, PathBuf}, sync::{ Arc, atomic::{self, AtomicBool}, @@ -217,7 +217,7 @@ impl OpenPathPrompt { ) { workspace.toggle_modal(window, cx, |window, cx| { let delegate = - OpenPathDelegate::new(tx, lister.clone(), creating_path, PathStyle::current()); + OpenPathDelegate::new(tx, lister.clone(), creating_path, PathStyle::local()); let picker = Picker::uniform_list(delegate, window, cx).width(rems(34.)); let query = lister.default_query(cx); picker.set_query(query, window, cx); @@ -822,7 +822,7 @@ impl PickerDelegate for OpenPathDelegate { } fn placeholder_text(&self, _window: &mut Window, _cx: &mut App) -> Arc { - Arc::from(format!("[directory{MAIN_SEPARATOR_STR}]filename.ext")) + Arc::from(format!("[directory{}]filename.ext", self.path_style.separator()).as_str()) } fn separators_after_indices(&self) -> Vec { diff --git a/crates/file_finder/src/open_path_prompt_tests.rs b/crates/file_finder/src/open_path_prompt_tests.rs index fd7cc1c6c612d28b1cc8f2352f6dbb0a254e7e98..5e8874cd01e06bb05f4ff6918bc02ea6883ea064 100644 --- a/crates/file_finder/src/open_path_prompt_tests.rs +++ b/crates/file_finder/src/open_path_prompt_tests.rs @@ -37,7 +37,7 @@ async fn test_open_path_prompt(cx: &mut TestAppContext) { let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; - let (picker, cx) = build_open_path_prompt(project, false, PathStyle::current(), cx); + let (picker, cx) = build_open_path_prompt(project, false, PathStyle::local(), cx); insert_query(path!("sadjaoislkdjasldj"), &picker, cx).await; assert_eq!(collect_match_candidates(&picker, cx), Vec::::new()); @@ -119,7 +119,7 @@ async fn test_open_path_prompt_completion(cx: &mut TestAppContext) { let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; - let (picker, cx) = build_open_path_prompt(project, false, PathStyle::current(), cx); + let (picker, cx) = build_open_path_prompt(project, false, PathStyle::local(), cx); // Confirm completion for the query "/root", since it's a directory, it should add a trailing slash. let query = path!("/root"); @@ -227,7 +227,7 @@ async fn test_open_path_prompt_on_windows(cx: &mut TestAppContext) { let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; - let (picker, cx) = build_open_path_prompt(project, false, PathStyle::current(), cx); + let (picker, cx) = build_open_path_prompt(project, false, PathStyle::local(), cx); // Support both forward and backward slashes. let query = "C:/root/"; @@ -372,7 +372,7 @@ async fn test_new_path_prompt(cx: &mut TestAppContext) { let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; - let (picker, cx) = build_open_path_prompt(project, true, PathStyle::current(), cx); + let (picker, cx) = build_open_path_prompt(project, true, PathStyle::local(), cx); insert_query(path!("/root"), &picker, cx).await; assert_eq!(collect_match_candidates(&picker, cx), vec!["root"]); diff --git a/crates/file_icons/Cargo.toml b/crates/file_icons/Cargo.toml index 1c271f4132a5a2083cc0072367a32c9850f83802..b87827618e8a927f882f177854c41fa90eeebd0b 100644 --- a/crates/file_icons/Cargo.toml +++ b/crates/file_icons/Cargo.toml @@ -15,7 +15,6 @@ doctest = false [dependencies] gpui.workspace = true serde.workspace = true -settings.workspace = true theme.workspace = true util.workspace = true workspace-hack.workspace = true diff --git a/crates/file_icons/src/file_icons.rs b/crates/file_icons/src/file_icons.rs index 327b1451523748aa91356bdb5854e2ef165a5085..e8650a83b920142a3b6ab2f69bdc6e2eca6b7470 100644 --- a/crates/file_icons/src/file_icons.rs +++ b/crates/file_icons/src/file_icons.rs @@ -2,8 +2,7 @@ use std::sync::Arc; use std::{path::Path, str}; use gpui::{App, SharedString}; -use settings::Settings; -use theme::{IconTheme, ThemeRegistry, ThemeSettings}; +use theme::{GlobalTheme, IconTheme, ThemeRegistry}; use util::paths::PathExt; #[derive(Debug)] @@ -13,10 +12,8 @@ pub struct FileIcons { impl FileIcons { pub fn get(cx: &App) -> Self { - let theme_settings = ThemeSettings::get_global(cx); - Self { - icon_theme: theme_settings.active_icon_theme.clone(), + icon_theme: GlobalTheme::icon_theme(cx).clone(), } } @@ -52,6 +49,15 @@ impl FileIcons { } } + // handle cases where the file extension is made up of multiple important + // parts (e.g Component.stories.tsx) that refer to an alternative icon style + if let Some(suffix) = path.multiple_extensions() { + let maybe_path = get_icon_from_suffix(suffix.as_str()); + if maybe_path.is_some() { + return maybe_path; + } + } + // primary case: check if the files extension or the hidden file name // matches some icon path if let Some(suffix) = path.extension_or_hidden_file_name() { @@ -88,7 +94,7 @@ impl FileIcons { .map(|icon_definition| icon_definition.path.clone()) } - get_icon_for_type(&ThemeSettings::get_global(cx).active_icon_theme, typ).or_else(|| { + get_icon_for_type(GlobalTheme::icon_theme(cx), typ).or_else(|| { Self::default_icon_theme(cx).and_then(|icon_theme| get_icon_for_type(&icon_theme, typ)) }) } @@ -113,20 +119,16 @@ impl FileIcons { } } - get_folder_icon( - &ThemeSettings::get_global(cx).active_icon_theme, - path, - expanded, - ) - .or_else(|| { - Self::default_icon_theme(cx) - .and_then(|icon_theme| get_folder_icon(&icon_theme, path, expanded)) - }) - .or_else(|| { - // If we can't find a specific folder icon for the folder at the given path, fall back to the generic folder - // icon. - Self::get_generic_folder_icon(expanded, cx) - }) + get_folder_icon(GlobalTheme::icon_theme(cx), path, expanded) + .or_else(|| { + Self::default_icon_theme(cx) + .and_then(|icon_theme| get_folder_icon(&icon_theme, path, expanded)) + }) + .or_else(|| { + // If we can't find a specific folder icon for the folder at the given path, fall back to the generic folder + // icon. + Self::get_generic_folder_icon(expanded, cx) + }) } fn get_generic_folder_icon(expanded: bool, cx: &App) -> Option { @@ -141,12 +143,10 @@ impl FileIcons { } } - get_generic_folder_icon(&ThemeSettings::get_global(cx).active_icon_theme, expanded).or_else( - || { - Self::default_icon_theme(cx) - .and_then(|icon_theme| get_generic_folder_icon(&icon_theme, expanded)) - }, - ) + get_generic_folder_icon(GlobalTheme::icon_theme(cx), expanded).or_else(|| { + Self::default_icon_theme(cx) + .and_then(|icon_theme| get_generic_folder_icon(&icon_theme, expanded)) + }) } pub fn get_chevron_icon(expanded: bool, cx: &App) -> Option { @@ -158,7 +158,7 @@ impl FileIcons { } } - get_chevron_icon(&ThemeSettings::get_global(cx).active_icon_theme, expanded).or_else(|| { + get_chevron_icon(GlobalTheme::icon_theme(cx), expanded).or_else(|| { Self::default_icon_theme(cx) .and_then(|icon_theme| get_chevron_icon(&icon_theme, expanded)) }) diff --git a/crates/fs/src/fake_git_repo.rs b/crates/fs/src/fake_git_repo.rs index 549c788dfac6acbb69fec8c715fb2a31b3674040..2c6db5b53987013d24a3a922e8f3b67adc9d43f5 100644 --- a/crates/fs/src/fake_git_repo.rs +++ b/crates/fs/src/fake_git_repo.rs @@ -1,5 +1,5 @@ use crate::{FakeFs, FakeFsEntry, Fs}; -use anyhow::{Context as _, Result}; +use anyhow::{Context as _, Result, bail}; use collections::{HashMap, HashSet}; use futures::future::{self, BoxFuture, join_all}; use git::{ @@ -17,6 +17,7 @@ use parking_lot::Mutex; use rope::Rope; use smol::future::FutureExt as _; use std::{path::PathBuf, sync::Arc}; +use util::{paths::PathStyle, rel_path::RelPath}; #[derive(Clone)] pub struct FakeGitRepository { @@ -82,7 +83,7 @@ impl GitRepository for FakeGitRepository { self.with_state_async(false, move |state| { state .index_contents - .get(path.as_ref()) + .get(&path) .context("not present in index") .cloned() }) @@ -97,7 +98,7 @@ impl GitRepository for FakeGitRepository { self.with_state_async(false, move |state| { state .head_contents - .get(path.as_ref()) + .get(&path) .context("not present in HEAD") .cloned() }) @@ -225,6 +226,7 @@ impl GitRepository for FakeGitRepository { .read_file_sync(path) .ok() .map(|content| String::from_utf8(content).unwrap())?; + let repo_path = RelPath::new(repo_path, PathStyle::local()).ok()?; Some((repo_path.into(), (content, is_ignored))) }) .collect(); @@ -354,6 +356,19 @@ impl GitRepository for FakeGitRepository { }) } + fn rename_branch(&self, branch: String, new_name: String) -> BoxFuture<'_, Result<()>> { + self.with_state_async(true, move |state| { + if !state.branches.remove(&branch) { + bail!("no such branch: {branch}"); + } + state.branches.insert(new_name.clone()); + if state.current_branch_name == Some(branch) { + state.current_branch_name = Some(new_name); + } + Ok(()) + }) + } + fn blame(&self, path: RepoPath, _content: Rope) -> BoxFuture<'_, Result> { self.with_state_async(false, move |state| { state @@ -373,7 +388,11 @@ impl GitRepository for FakeGitRepository { let contents = paths .into_iter() .map(|path| { - let abs_path = self.dot_git_path.parent().unwrap().join(&path); + let abs_path = self + .dot_git_path + .parent() + .unwrap() + .join(&path.as_std_path()); Box::pin(async move { (path.clone(), self.fs.load(&abs_path).await.ok()) }) }) .collect::>(); @@ -589,7 +608,9 @@ mod tests { .await; fs.with_git_state(Path::new("/foo/.git"), true, |_git| {}) .unwrap(); - let repository = fs.open_repo(Path::new("/foo/.git")).unwrap(); + let repository = fs + .open_repo(Path::new("/foo/.git"), Some("git".as_ref())) + .unwrap(); let checkpoint_1 = repository.checkpoint().await.unwrap(); fs.write(Path::new("/foo/b"), b"IPSUM").await.unwrap(); diff --git a/crates/fs/src/fs.rs b/crates/fs/src/fs.rs index bd7c94c1d71dd64b5c6caec6f2ffaa4517ac2db7..03cf78d74eb0e0ed8caf22c710acc131960e97c0 100644 --- a/crates/fs/src/fs.rs +++ b/crates/fs/src/fs.rs @@ -12,7 +12,7 @@ use gpui::BackgroundExecutor; use gpui::Global; use gpui::ReadGlobal as _; use std::borrow::Cow; -use util::command::{new_smol_command, new_std_command}; +use util::command::new_smol_command; #[cfg(unix)] use std::os::fd::{AsFd, AsRawFd}; @@ -47,7 +47,7 @@ use collections::{BTreeMap, btree_map}; use fake_git_repo::FakeGitRepositoryState; #[cfg(any(test, feature = "test-support"))] use git::{ - repository::RepoPath, + repository::{RepoPath, repo_path}, status::{FileStatus, StatusCode, TrackedStatus, UnmergedStatus}, }; #[cfg(any(test, feature = "test-support"))] @@ -134,8 +134,13 @@ pub trait Fs: Send + Sync { Arc, ); - fn open_repo(&self, abs_dot_git: &Path) -> Option>; - fn git_init(&self, abs_work_directory: &Path, fallback_branch_name: String) -> Result<()>; + fn open_repo( + &self, + abs_dot_git: &Path, + system_git_binary_path: Option<&Path>, + ) -> Option>; + async fn git_init(&self, abs_work_directory: &Path, fallback_branch_name: String) + -> Result<()>; async fn git_clone(&self, repo_url: &str, abs_work_directory: &Path) -> Result<()>; fn is_fake(&self) -> bool; async fn is_case_sensitive(&self) -> Result; @@ -246,7 +251,7 @@ impl From for proto::Timestamp { } pub struct RealFs { - git_binary_path: Option, + bundled_git_binary_path: Option, executor: BackgroundExecutor, } @@ -324,7 +329,7 @@ pub struct RealWatcher {} impl RealFs { pub fn new(git_binary_path: Option, executor: BackgroundExecutor) -> Self { Self { - git_binary_path, + bundled_git_binary_path: git_binary_path, executor, } } @@ -693,7 +698,7 @@ impl Fs for RealFs { Ok(Some(Metadata { inode, - mtime: MTime(metadata.modified().unwrap()), + mtime: MTime(metadata.modified().unwrap_or(SystemTime::UNIX_EPOCH)), len: metadata.len(), is_symlink, is_dir: metadata.file_type().is_dir(), @@ -748,7 +753,9 @@ impl Fs for RealFs { Some(PathEventKind::Removed) } else if event.flags.contains(StreamFlags::ITEM_CREATED) { Some(PathEventKind::Created) - } else if event.flags.contains(StreamFlags::ITEM_MODIFIED) { + } else if event.flags.contains(StreamFlags::ITEM_MODIFIED) + | event.flags.contains(StreamFlags::ITEM_RENAMED) + { Some(PathEventKind::Changed) } else { None @@ -786,11 +793,15 @@ impl Fs for RealFs { let watcher = Arc::new(fs_watcher::FsWatcher::new(tx, pending_paths.clone())); // If the path doesn't exist yet (e.g. settings.json), watch the parent dir to learn when it's created. - if watcher.add(path).is_err() + if let Err(e) = watcher.add(path) && let Some(parent) = path.parent() - && let Err(e) = watcher.add(parent) + && let Err(parent_e) = watcher.add(parent) { - log::warn!("Failed to watch: {e}"); + log::warn!( + "Failed to watch {} and its parent directory {}:\n{e}\n{parent_e}", + path.display(), + parent.display() + ); } // Check if path is a symlink and follow the target parent @@ -827,19 +838,29 @@ impl Fs for RealFs { ) } - fn open_repo(&self, dotgit_path: &Path) -> Option> { + fn open_repo( + &self, + dotgit_path: &Path, + system_git_binary_path: Option<&Path>, + ) -> Option> { Some(Arc::new(RealGitRepository::new( dotgit_path, - self.git_binary_path.clone(), + self.bundled_git_binary_path.clone(), + system_git_binary_path.map(|path| path.to_path_buf()), self.executor.clone(), )?)) } - fn git_init(&self, abs_work_directory_path: &Path, fallback_branch_name: String) -> Result<()> { - let config = new_std_command("git") + async fn git_init( + &self, + abs_work_directory_path: &Path, + fallback_branch_name: String, + ) -> Result<()> { + let config = new_smol_command("git") .current_dir(abs_work_directory_path) .args(&["config", "--global", "--get", "init.defaultBranch"]) - .output()?; + .output() + .await?; let branch_name; @@ -849,11 +870,12 @@ impl Fs for RealFs { branch_name = Cow::Borrowed(fallback_branch_name.as_str()); } - new_std_command("git") + new_smol_command("git") .current_dir(abs_work_directory_path) .args(&["init", "-b"]) .arg(branch_name.trim()) - .output()?; + .output() + .await?; Ok(()) } @@ -1241,7 +1263,7 @@ impl FakeFs { async move { while let Ok(git_event) = rx.recv().await { if let Some(mut state) = this.state.try_lock() { - state.emit_event([(git_event, None)]); + state.emit_event([(git_event, Some(PathEventKind::Changed))]); } else { panic!("Failed to lock file system state, this execution would have caused a test hang"); } @@ -1288,7 +1310,7 @@ impl FakeFs { Ok(()) }) .unwrap(); - state.emit_event([(path.to_path_buf(), None)]); + state.emit_event([(path.to_path_buf(), Some(PathEventKind::Changed))]); } pub async fn insert_file(&self, path: impl AsRef, content: Vec) { @@ -1311,7 +1333,7 @@ impl FakeFs { } }) .unwrap(); - state.emit_event([(path, None)]); + state.emit_event([(path, Some(PathEventKind::Created))]); } fn write_file_internal( @@ -1502,7 +1524,7 @@ impl FakeFs { drop(repo_state); if emit_git_event { - state.emit_event([(dot_git, None)]); + state.emit_event([(dot_git, Some(PathEventKind::Changed))]); } Ok(result) @@ -1553,7 +1575,7 @@ impl FakeFs { if emit_git_event { drop(repo_state); - state.emit_event([(canonical_path, None)]); + state.emit_event([(canonical_path, Some(PathEventKind::Changed))]); } Ok(result) @@ -1608,13 +1630,13 @@ impl FakeFs { .unwrap(); } - pub fn set_index_for_repo(&self, dot_git: &Path, index_state: &[(RepoPath, String)]) { + pub fn set_index_for_repo(&self, dot_git: &Path, index_state: &[(&str, String)]) { self.with_git_state(dot_git, true, |state| { state.index_contents.clear(); state.index_contents.extend( index_state .iter() - .map(|(path, content)| (path.clone(), content.clone())), + .map(|(path, content)| (repo_path(path), content.clone())), ); }) .unwrap(); @@ -1623,7 +1645,7 @@ impl FakeFs { pub fn set_head_for_repo( &self, dot_git: &Path, - head_state: &[(RepoPath, String)], + head_state: &[(&str, String)], sha: impl Into, ) { self.with_git_state(dot_git, true, |state| { @@ -1631,50 +1653,22 @@ impl FakeFs { state.head_contents.extend( head_state .iter() - .map(|(path, content)| (path.clone(), content.clone())), + .map(|(path, content)| (repo_path(path), content.clone())), ); state.refs.insert("HEAD".into(), sha.into()); }) .unwrap(); } - pub fn set_git_content_for_repo( - &self, - dot_git: &Path, - head_state: &[(RepoPath, String, Option)], - ) { + pub fn set_head_and_index_for_repo(&self, dot_git: &Path, contents_by_path: &[(&str, String)]) { self.with_git_state(dot_git, true, |state| { state.head_contents.clear(); state.head_contents.extend( - head_state + contents_by_path .iter() - .map(|(path, head_content, _)| (path.clone(), head_content.clone())), + .map(|(path, contents)| (repo_path(path), contents.clone())), ); - state.index_contents.clear(); - state.index_contents.extend(head_state.iter().map( - |(path, head_content, index_content)| { - ( - path.clone(), - index_content.as_ref().unwrap_or(head_content).clone(), - ) - }, - )); - }) - .unwrap(); - } - - pub fn set_head_and_index_for_repo( - &self, - dot_git: &Path, - contents_by_path: &[(RepoPath, String)], - ) { - self.with_git_state(dot_git, true, |state| { - state.head_contents.clear(); - state.index_contents.clear(); - state.head_contents.extend(contents_by_path.iter().cloned()); - state - .index_contents - .extend(contents_by_path.iter().cloned()); + state.index_contents = state.head_contents.clone(); }) .unwrap(); } @@ -1689,7 +1683,7 @@ impl FakeFs { /// Put the given git repository into a state with the given status, /// by mutating the head, index, and unmerged state. - pub fn set_status_for_repo(&self, dot_git: &Path, statuses: &[(&Path, FileStatus)]) { + pub fn set_status_for_repo(&self, dot_git: &Path, statuses: &[(&str, FileStatus)]) { let workdir_path = dot_git.parent().unwrap(); let workdir_contents = self.files_with_contents(workdir_path); self.with_git_state(dot_git, true, |state| { @@ -1697,10 +1691,12 @@ impl FakeFs { state.head_contents.clear(); state.unmerged_paths.clear(); for (path, content) in workdir_contents { - let repo_path: RepoPath = path.strip_prefix(&workdir_path).unwrap().into(); + use util::{paths::PathStyle, rel_path::RelPath}; + + let repo_path: RepoPath = RelPath::new(path.strip_prefix(&workdir_path).unwrap(), PathStyle::local()).unwrap().into(); let status = statuses .iter() - .find_map(|(p, status)| (**p == *repo_path.0).then_some(status)); + .find_map(|(p, status)| (*p == repo_path.as_unix_str()).then_some(status)); let mut content = String::from_utf8_lossy(&content).to_string(); let mut index_content = None; @@ -1892,6 +1888,10 @@ impl FakeFs { .unwrap_or(0) } + pub fn emit_fs_event(&self, path: impl Into, event: Option) { + self.state.lock().emit_event(std::iter::once((path, event))); + } + fn simulate_random_delay(&self) -> impl futures::Future { self.executor.simulate_random_delay() } @@ -2059,7 +2059,7 @@ impl Fs for FakeFs { } }) .unwrap(); - state.emit_event([(path, None)]); + state.emit_event([(path, Some(PathEventKind::Created))]); Ok(()) } @@ -2444,7 +2444,11 @@ impl Fs for FakeFs { ) } - fn open_repo(&self, abs_dot_git: &Path) -> Option> { + fn open_repo( + &self, + abs_dot_git: &Path, + _system_git_binary: Option<&Path>, + ) -> Option> { use util::ResultExt as _; self.with_git_state_and_paths( @@ -2464,12 +2468,12 @@ impl Fs for FakeFs { .log_err() } - fn git_init( + async fn git_init( &self, abs_work_directory_path: &Path, _fallback_branch_name: String, ) -> Result<()> { - smol::block_on(self.create_dir(&abs_work_directory_path.join(".git"))) + self.create_dir(&abs_work_directory_path.join(".git")).await } async fn git_clone(&self, _repo_url: &str, _abs_work_directory: &Path) -> Result<()> { @@ -2661,8 +2665,8 @@ fn atomic_replace>( unsafe { ReplaceFileW( - &HSTRING::from(replaced_file.as_ref().to_string_lossy().to_string()), - &HSTRING::from(replacement_file.as_ref().to_string_lossy().to_string()), + &HSTRING::from(replaced_file.as_ref().to_string_lossy().into_owned()), + &HSTRING::from(replacement_file.as_ref().to_string_lossy().into_owned()), None, REPLACE_FILE_FLAGS::default(), None, @@ -3096,7 +3100,7 @@ mod tests { // With the file handle still open, the file should be replaced // https://github.com/zed-industries/zed/issues/30054 let fs = RealFs { - git_binary_path: None, + bundled_git_binary_path: None, executor, }; let temp_dir = TempDir::new().unwrap(); @@ -3114,7 +3118,7 @@ mod tests { #[gpui::test] async fn test_realfs_atomic_write_non_existing_file(executor: BackgroundExecutor) { let fs = RealFs { - git_binary_path: None, + bundled_git_binary_path: None, executor, }; let temp_dir = TempDir::new().unwrap(); diff --git a/crates/fs/src/fs_watcher.rs b/crates/fs/src/fs_watcher.rs index 07374b7f40455f09cf52d31ddd1a1f64ab6abcd3..0d6d914ae4c0bc3f8b92ec9f8be67d92c9ac6b64 100644 --- a/crates/fs/src/fs_watcher.rs +++ b/crates/fs/src/fs_watcher.rs @@ -1,7 +1,8 @@ use notify::EventKind; use parking_lot::Mutex; use std::{ - collections::HashMap, + collections::{BTreeMap, HashMap}, + ops::DerefMut, sync::{Arc, OnceLock}, }; use util::{ResultExt, paths::SanitizedPath}; @@ -11,7 +12,7 @@ use crate::{PathEvent, PathEventKind, Watcher}; pub struct FsWatcher { tx: smol::channel::Sender<()>, pending_path_events: Arc>>, - registrations: Mutex, WatcherRegistrationId>>, + registrations: Mutex, WatcherRegistrationId>>, } impl FsWatcher { @@ -29,8 +30,11 @@ impl FsWatcher { impl Drop for FsWatcher { fn drop(&mut self) { - let mut registrations = self.registrations.lock(); - let registrations = registrations.drain(); + let mut registrations = BTreeMap::new(); + { + let old = &mut self.registrations.lock(); + std::mem::swap(old.deref_mut(), &mut registrations); + } let _ = global(|g| { for (_, registration) in registrations { @@ -42,57 +46,77 @@ impl Drop for FsWatcher { impl Watcher for FsWatcher { fn add(&self, path: &std::path::Path) -> anyhow::Result<()> { - let root_path = SanitizedPath::new_arc(path); - let tx = self.tx.clone(); let pending_paths = self.pending_path_events.clone(); + #[cfg(target_os = "windows")] + { + // Return early if an ancestor of this path was already being watched. + // saves a huge amount of memory + if let Some((watched_path, _)) = self + .registrations + .lock() + .range::(( + std::ops::Bound::Unbounded, + std::ops::Bound::Included(path), + )) + .next_back() + && path.starts_with(watched_path.as_ref()) + { + return Ok(()); + } + } + #[cfg(target_os = "linux")] + { + if self.registrations.lock().contains_key(path) { + return Ok(()); + } + } + + let root_path = SanitizedPath::new_arc(path); let path: Arc = path.into(); - if self.registrations.lock().contains_key(&path) { - return Ok(()); - } + #[cfg(target_os = "windows")] + let mode = notify::RecursiveMode::Recursive; + #[cfg(target_os = "linux")] + let mode = notify::RecursiveMode::NonRecursive; let registration_id = global({ let path = path.clone(); |g| { - g.add( - path, - notify::RecursiveMode::NonRecursive, - move |event: ¬ify::Event| { - let kind = match event.kind { - EventKind::Create(_) => Some(PathEventKind::Created), - EventKind::Modify(_) => Some(PathEventKind::Changed), - EventKind::Remove(_) => Some(PathEventKind::Removed), - _ => None, - }; - let mut path_events = event - .paths - .iter() - .filter_map(|event_path| { - let event_path = SanitizedPath::new(event_path); - event_path.starts_with(&root_path).then(|| PathEvent { - path: event_path.as_path().to_path_buf(), - kind, - }) + g.add(path, mode, move |event: ¬ify::Event| { + let kind = match event.kind { + EventKind::Create(_) => Some(PathEventKind::Created), + EventKind::Modify(_) => Some(PathEventKind::Changed), + EventKind::Remove(_) => Some(PathEventKind::Removed), + _ => None, + }; + let mut path_events = event + .paths + .iter() + .filter_map(|event_path| { + let event_path = SanitizedPath::new(event_path); + event_path.starts_with(&root_path).then(|| PathEvent { + path: event_path.as_path().to_path_buf(), + kind, }) - .collect::>(); - - if !path_events.is_empty() { - path_events.sort(); - let mut pending_paths = pending_paths.lock(); - if pending_paths.is_empty() { - tx.try_send(()).ok(); - } - util::extend_sorted( - &mut *pending_paths, - path_events, - usize::MAX, - |a, b| a.path.cmp(&b.path), - ); + }) + .collect::>(); + + if !path_events.is_empty() { + path_events.sort(); + let mut pending_paths = pending_paths.lock(); + if pending_paths.is_empty() { + tx.try_send(()).ok(); } - }, - ) + util::extend_sorted( + &mut *pending_paths, + path_events, + usize::MAX, + |a, b| a.path.cmp(&b.path), + ); + } + }) } })??; diff --git a/crates/fs/src/mac_watcher.rs b/crates/fs/src/mac_watcher.rs index 7bd176639f1dccef2da4c4ae8dcb317d0be602cb..698014de9716f6505ccd23cd344a62815d9ba0f7 100644 --- a/crates/fs/src/mac_watcher.rs +++ b/crates/fs/src/mac_watcher.rs @@ -6,6 +6,7 @@ use parking_lot::Mutex; use std::{ path::{Path, PathBuf}, sync::Weak, + thread, time::Duration, }; @@ -48,9 +49,12 @@ impl Watcher for MacWatcher { let (stream, handle) = EventStream::new(&[path], self.latency); let tx = self.events_tx.clone(); - std::thread::spawn(move || { - stream.run(move |events| smol::block_on(tx.send(events)).is_ok()); - }); + thread::Builder::new() + .name("MacWatcher".to_owned()) + .spawn(move || { + stream.run(move |events| smol::block_on(tx.send(events)).is_ok()); + }) + .unwrap(); handles.insert(path.into(), handle); Ok(()) diff --git a/crates/fsevent/Cargo.toml b/crates/fsevent/Cargo.toml index c9cec9c1e1a09f73e0464a18ed2e5ac6cadab2d4..a421294785cee5546db9d9c2066cde530f0c8b2c 100644 --- a/crates/fsevent/Cargo.toml +++ b/crates/fsevent/Cargo.toml @@ -15,6 +15,7 @@ doctest = false [dependencies] bitflags.workspace = true parking_lot.workspace = true +log.workspace = true workspace-hack.workspace = true [target.'cfg(target_os = "macos")'.dependencies] diff --git a/crates/fsevent/src/fsevent.rs b/crates/fsevent/src/fsevent.rs index c97ab5f35d1b1e8463e895da7a309dc7ef3be998..e4060f3ae06a8d9412baf1cd75a9503c1b6d359b 100644 --- a/crates/fsevent/src/fsevent.rs +++ b/crates/fsevent/src/fsevent.rs @@ -70,10 +70,14 @@ impl EventStream { path_bytes.len() as cf::CFIndex, false, ); - let cf_path = cf::CFURLCopyFileSystemPath(cf_url, cf::kCFURLPOSIXPathStyle); - cf::CFArrayAppendValue(cf_paths, cf_path); - cf::CFRelease(cf_path); - cf::CFRelease(cf_url); + if !cf_url.is_null() { + let cf_path = cf::CFURLCopyFileSystemPath(cf_url, cf::kCFURLPOSIXPathStyle); + cf::CFArrayAppendValue(cf_paths, cf_path); + cf::CFRelease(cf_path); + cf::CFRelease(cf_url); + } else { + log::error!("Failed to create CFURL for path: {}", path.display()); + } } let mut state = Box::new(State { diff --git a/crates/fuzzy/Cargo.toml b/crates/fuzzy/Cargo.toml index 534d7d4db5bc2637f7b093f67cead7a3fa52b416..35e134236d619e51467ef96a204df3fc8cc7681c 100644 --- a/crates/fuzzy/Cargo.toml +++ b/crates/fuzzy/Cargo.toml @@ -17,3 +17,6 @@ gpui.workspace = true util.workspace = true log.workspace = true workspace-hack.workspace = true + +[dev-dependencies] +util = {workspace = true, features = ["test-support"]} diff --git a/crates/fuzzy/src/matcher.rs b/crates/fuzzy/src/matcher.rs index e649d47dd646b80e312e2465f0929f630fecf81f..eb844e349821394785bb61a34600f04a6fa985eb 100644 --- a/crates/fuzzy/src/matcher.rs +++ b/crates/fuzzy/src/matcher.rs @@ -1,5 +1,5 @@ use std::{ - borrow::{Borrow, Cow}, + borrow::Borrow, collections::BTreeMap, sync::atomic::{self, AtomicBool}, }; @@ -27,7 +27,7 @@ pub struct Matcher<'a> { pub trait MatchCandidate { fn has_chars(&self, bag: CharBag) -> bool; - fn to_string(&self) -> Cow<'_, str>; + fn candidate_chars(&self) -> impl Iterator; } impl<'a> Matcher<'a> { @@ -76,14 +76,14 @@ impl<'a> Matcher<'a> { continue; } - if cancel_flag.load(atomic::Ordering::Relaxed) { + if cancel_flag.load(atomic::Ordering::Acquire) { break; } candidate_chars.clear(); lowercase_candidate_chars.clear(); extra_lowercase_chars.clear(); - for (i, c) in candidate.borrow().to_string().chars().enumerate() { + for (i, c) in candidate.borrow().candidate_chars().enumerate() { candidate_chars.push(c); let mut char_lowercased = c.to_lowercase().collect::>(); if char_lowercased.len() > 1 { @@ -202,8 +202,6 @@ impl<'a> Matcher<'a> { cur_score: f64, extra_lowercase_chars: &BTreeMap, ) -> f64 { - use std::path::MAIN_SEPARATOR; - if query_idx == self.query.len() { return 1.0; } @@ -245,17 +243,11 @@ impl<'a> Matcher<'a> { None => continue, } }; - let is_path_sep = path_char == MAIN_SEPARATOR; + let is_path_sep = path_char == '/'; if query_idx == 0 && is_path_sep { last_slash = j_regular; } - - #[cfg(not(target_os = "windows"))] - let need_to_score = - query_char == path_char || (is_path_sep && query_char == '_' || query_char == '\\'); - // `query_char == '\\'` breaks `test_match_path_entries` on Windows, `\` is only used as a path separator on Windows. - #[cfg(target_os = "windows")] let need_to_score = query_char == path_char || (is_path_sep && query_char == '_'); if need_to_score { let curr = match prefix.get(j_regular) { @@ -270,7 +262,7 @@ impl<'a> Matcher<'a> { None => path[j_regular - 1 - prefix.len()], }; - if last == MAIN_SEPARATOR { + if last == '/' { char_score = 0.9; } else if (last == '-' || last == '_' || last == ' ' || last.is_numeric()) || (last.is_lowercase() && curr.is_uppercase()) @@ -291,7 +283,7 @@ impl<'a> Matcher<'a> { // Apply a severe penalty if the case doesn't match. // This will make the exact matches have higher score than the case-insensitive and the // path insensitive matches. - if (self.smart_case || curr == MAIN_SEPARATOR) && self.query[query_idx] != curr { + if (self.smart_case || curr == '/') && self.query[query_idx] != curr { char_score *= 0.001; } @@ -348,13 +340,12 @@ impl<'a> Matcher<'a> { #[cfg(test)] mod tests { + use util::rel_path::{RelPath, rel_path}; + use crate::{PathMatch, PathMatchCandidate}; use super::*; - use std::{ - path::{Path, PathBuf}, - sync::Arc, - }; + use std::sync::Arc; #[test] fn test_get_last_positions() { @@ -376,7 +367,6 @@ mod tests { assert_eq!(matcher.last_positions, vec![0, 3, 4, 8]); } - #[cfg(not(target_os = "windows"))] #[test] fn test_match_path_entries() { let paths = vec![ @@ -388,9 +378,9 @@ mod tests { "alphabravocharlie", "AlphaBravoCharlie", "thisisatestdir", - "/////ThisIsATestDir", - "/this/is/a/test/dir", - "/test/tiatd", + "ThisIsATestDir", + "this/is/a/test/dir", + "test/tiatd", ]; assert_eq!( @@ -404,63 +394,15 @@ mod tests { ); assert_eq!( match_single_path_query("t/i/a/t/d", false, &paths), - vec![("/this/is/a/test/dir", vec![1, 5, 6, 8, 9, 10, 11, 15, 16]),] - ); - - assert_eq!( - match_single_path_query("tiatd", false, &paths), - vec![ - ("/test/tiatd", vec![6, 7, 8, 9, 10]), - ("/this/is/a/test/dir", vec![1, 6, 9, 11, 16]), - ("/////ThisIsATestDir", vec![5, 9, 11, 12, 16]), - ("thisisatestdir", vec![0, 2, 6, 7, 11]), - ] - ); - } - - /// todo(windows) - /// Now, on Windows, users can only use the backslash as a path separator. - /// I do want to support both the backslash and the forward slash as path separators on Windows. - #[cfg(target_os = "windows")] - #[test] - fn test_match_path_entries() { - let paths = vec![ - "", - "a", - "ab", - "abC", - "abcd", - "alphabravocharlie", - "AlphaBravoCharlie", - "thisisatestdir", - "\\\\\\\\\\ThisIsATestDir", - "\\this\\is\\a\\test\\dir", - "\\test\\tiatd", - ]; - - assert_eq!( - match_single_path_query("abc", false, &paths), - vec![ - ("abC", vec![0, 1, 2]), - ("abcd", vec![0, 1, 2]), - ("AlphaBravoCharlie", vec![0, 5, 10]), - ("alphabravocharlie", vec![4, 5, 10]), - ] - ); - assert_eq!( - match_single_path_query("t\\i\\a\\t\\d", false, &paths), - vec![( - "\\this\\is\\a\\test\\dir", - vec![1, 5, 6, 8, 9, 10, 11, 15, 16] - ),] + vec![("this/is/a/test/dir", vec![0, 4, 5, 7, 8, 9, 10, 14, 15]),] ); assert_eq!( match_single_path_query("tiatd", false, &paths), vec![ - ("\\test\\tiatd", vec![6, 7, 8, 9, 10]), - ("\\this\\is\\a\\test\\dir", vec![1, 6, 9, 11, 16]), - ("\\\\\\\\\\ThisIsATestDir", vec![5, 9, 11, 12, 16]), + ("test/tiatd", vec![5, 6, 7, 8, 9]), + ("ThisIsATestDir", vec![0, 4, 6, 7, 11]), + ("this/is/a/test/dir", vec![0, 5, 8, 10, 15]), ("thisisatestdir", vec![0, 2, 6, 7, 11]), ] ); @@ -491,7 +433,7 @@ mod tests { "aαbβ/cγdδ", "αβγδ/bcde", "c1️⃣2️⃣3️⃣/d4️⃣5️⃣6️⃣/e7️⃣8️⃣9️⃣/f", - "/d/🆒/h", + "d/🆒/h", ]; assert_eq!("1️⃣".len(), 7); assert_eq!( @@ -602,9 +544,9 @@ mod tests { let query = query.chars().collect::>(); let query_chars = CharBag::from(&lowercase_query[..]); - let path_arcs: Vec> = paths + let path_arcs: Vec> = paths .iter() - .map(|path| Arc::from(PathBuf::from(path))) + .map(|path| Arc::from(rel_path(path))) .collect::>(); let mut path_entries = Vec::new(); for (i, path) in paths.iter().enumerate() { @@ -632,8 +574,8 @@ mod tests { score, worktree_id: 0, positions: positions.clone(), - path: Arc::from(candidate.path), - path_prefix: "".into(), + path: candidate.path.into(), + path_prefix: RelPath::empty().into(), distance_to_relative_ancestor: usize::MAX, is_dir: false, }, @@ -647,7 +589,7 @@ mod tests { paths .iter() .copied() - .find(|p| result.path.as_ref() == Path::new(p)) + .find(|p| result.path.as_ref() == rel_path(p)) .unwrap(), result.positions, ) diff --git a/crates/fuzzy/src/paths.rs b/crates/fuzzy/src/paths.rs index 78030d5f964edb73e0f43f43ad412446dfbc9b34..6fc52361e37750400aa308733865fc6fee435134 100644 --- a/crates/fuzzy/src/paths.rs +++ b/crates/fuzzy/src/paths.rs @@ -1,13 +1,12 @@ use gpui::BackgroundExecutor; use std::{ - borrow::Cow, cmp::{self, Ordering}, - path::Path, sync::{ Arc, atomic::{self, AtomicBool}, }, }; +use util::{paths::PathStyle, rel_path::RelPath}; use crate::{ CharBag, @@ -17,7 +16,7 @@ use crate::{ #[derive(Clone, Debug)] pub struct PathMatchCandidate<'a> { pub is_dir: bool, - pub path: &'a Path, + pub path: &'a RelPath, pub char_bag: CharBag, } @@ -26,8 +25,8 @@ pub struct PathMatch { pub score: f64, pub positions: Vec, pub worktree_id: usize, - pub path: Arc, - pub path_prefix: Arc, + pub path: Arc, + pub path_prefix: Arc, pub is_dir: bool, /// Number of steps removed from a shared parent with the relative path /// Used to order closer paths first in the search list @@ -41,8 +40,10 @@ pub trait PathMatchCandidateSet<'a>: Send + Sync { fn is_empty(&self) -> bool { self.len() == 0 } - fn prefix(&self) -> Arc; + fn root_is_file(&self) -> bool; + fn prefix(&self) -> Arc; fn candidates(&'a self, start: usize) -> Self::Candidates; + fn path_style(&self) -> PathStyle; } impl<'a> MatchCandidate for PathMatchCandidate<'a> { @@ -50,8 +51,8 @@ impl<'a> MatchCandidate for PathMatchCandidate<'a> { self.char_bag.is_superset(bag) } - fn to_string(&self) -> Cow<'a, str> { - self.path.to_string_lossy() + fn candidate_chars(&self) -> impl Iterator { + self.path.as_unix_str().chars() } } @@ -109,8 +110,8 @@ pub fn match_fixed_path_set( worktree_id, positions: positions.clone(), is_dir: candidate.is_dir, - path: Arc::from(candidate.path), - path_prefix: Arc::default(), + path: candidate.path.into(), + path_prefix: RelPath::empty().into(), distance_to_relative_ancestor: usize::MAX, }, ); @@ -121,7 +122,7 @@ pub fn match_fixed_path_set( pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>( candidate_sets: &'a [Set], query: &str, - relative_to: Option>, + relative_to: &Option>, smart_case: bool, max_results: usize, cancel_flag: &AtomicBool, @@ -132,12 +133,27 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>( return Vec::new(); } - let lowercase_query = query.to_lowercase().chars().collect::>(); - let query = query.chars().collect::>(); + let path_style = candidate_sets[0].path_style(); + + let query = query + .chars() + .map(|char| { + if path_style.is_windows() && char == '\\' { + '/' + } else { + char + } + }) + .collect::>(); + + let lowercase_query = query + .iter() + .map(|query| query.to_ascii_lowercase()) + .collect::>(); - let lowercase_query = &lowercase_query; let query = &query; - let query_char_bag = CharBag::from(&lowercase_query[..]); + let lowercase_query = &lowercase_query; + let query_char_bag = CharBag::from_iter(lowercase_query.iter().copied()); let num_cpus = executor.num_cpus().min(path_count); let segment_size = path_count.div_ceil(num_cpus); @@ -148,7 +164,6 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>( executor .scoped(|scope| { for (segment_idx, results) in segment_results.iter_mut().enumerate() { - let relative_to = relative_to.clone(); scope.spawn(async move { let segment_start = segment_idx * segment_size; let segment_end = segment_start + segment_size; @@ -157,7 +172,7 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>( let mut tree_start = 0; for candidate_set in candidate_sets { - if cancel_flag.load(atomic::Ordering::Relaxed) { + if cancel_flag.load(atomic::Ordering::Acquire) { break; } @@ -169,7 +184,14 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>( let candidates = candidate_set.candidates(start).take(end - start); let worktree_id = candidate_set.id(); - let prefix = candidate_set.prefix().chars().collect::>(); + let mut prefix = candidate_set + .prefix() + .as_unix_str() + .chars() + .collect::>(); + if !candidate_set.root_is_file() && !prefix.is_empty() { + prefix.push('/'); + } let lowercase_prefix = prefix .iter() .map(|c| c.to_ascii_lowercase()) @@ -209,7 +231,7 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>( }) .await; - if cancel_flag.load(atomic::Ordering::Relaxed) { + if cancel_flag.load(atomic::Ordering::Acquire) { return Vec::new(); } @@ -220,7 +242,7 @@ pub async fn match_path_sets<'a, Set: PathMatchCandidateSet<'a>>( /// Compute the distance from a given path to some other path /// If there is no shared path, returns usize::MAX -fn distance_between_paths(path: &Path, relative_to: &Path) -> usize { +fn distance_between_paths(path: &RelPath, relative_to: &RelPath) -> usize { let mut path_components = path.components(); let mut relative_components = relative_to.components(); @@ -235,12 +257,12 @@ fn distance_between_paths(path: &Path, relative_to: &Path) -> usize { #[cfg(test)] mod tests { - use std::path::Path; + use util::rel_path::RelPath; use super::distance_between_paths; #[test] fn test_distance_between_paths_empty() { - distance_between_paths(Path::new(""), Path::new("")); + distance_between_paths(RelPath::empty(), RelPath::empty()); } } diff --git a/crates/fuzzy/src/strings.rs b/crates/fuzzy/src/strings.rs index 5bd7b66c0b5352370d010a479e85d01177aac8bd..54539840cfb0ca251428d9f78d5d134f16afdf4c 100644 --- a/crates/fuzzy/src/strings.rs +++ b/crates/fuzzy/src/strings.rs @@ -4,7 +4,7 @@ use crate::{ }; use gpui::BackgroundExecutor; use std::{ - borrow::{Borrow, Cow}, + borrow::Borrow, cmp::{self, Ordering}, iter, ops::Range, @@ -28,13 +28,13 @@ impl StringMatchCandidate { } } -impl<'a> MatchCandidate for &'a StringMatchCandidate { +impl MatchCandidate for &StringMatchCandidate { fn has_chars(&self, bag: CharBag) -> bool { self.char_bag.is_superset(bag) } - fn to_string(&self) -> Cow<'a, str> { - self.string.as_str().into() + fn candidate_chars(&self) -> impl Iterator { + self.string.chars() } } @@ -189,7 +189,7 @@ where }) .await; - if cancel_flag.load(atomic::Ordering::Relaxed) { + if cancel_flag.load(atomic::Ordering::Acquire) { return Vec::new(); } diff --git a/crates/git/Cargo.toml b/crates/git/Cargo.toml index 74656f1d4c86936b630cb8c1b05030f8d46ccb5c..e91b5c7c6480076481cd25b963a7d8012e67ee34 100644 --- a/crates/git/Cargo.toml +++ b/crates/git/Cargo.toml @@ -23,6 +23,7 @@ derive_more.workspace = true git2.workspace = true gpui.workspace = true http_client.workspace = true +itertools.workspace = true log.workspace = true parking_lot.workspace = true regex.workspace = true @@ -36,6 +37,7 @@ text.workspace = true thiserror.workspace = true time.workspace = true url.workspace = true +urlencoding.workspace = true util.workspace = true uuid.workspace = true futures.workspace = true diff --git a/crates/git/src/blame.rs b/crates/git/src/blame.rs index 24b2c44218120b1237fb42e04edc9b6784356c57..e58b9cb7e0427bf3af1c88f473debba0b6f94f59 100644 --- a/crates/git/src/blame.rs +++ b/crates/git/src/blame.rs @@ -1,4 +1,5 @@ use crate::commit::get_messages; +use crate::repository::RepoPath; use crate::{GitRemote, Oid}; use anyhow::{Context as _, Result}; use collections::{HashMap, HashSet}; @@ -33,7 +34,7 @@ impl Blame { pub async fn for_path( git_binary: &Path, working_directory: &Path, - path: &Path, + path: &RepoPath, content: &Rope, remote_url: Option, ) -> Result { @@ -66,7 +67,7 @@ const GIT_BLAME_NO_PATH: &str = "fatal: no such path"; async fn run_git_blame( git_binary: &Path, working_directory: &Path, - path: &Path, + path: &RepoPath, contents: &Rope, ) -> Result { let mut child = util::command::new_smol_command(git_binary) @@ -76,7 +77,7 @@ async fn run_git_blame( .arg("-w") .arg("--contents") .arg("-") - .arg(path.as_os_str()) + .arg(path.as_unix_str()) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) diff --git a/crates/git/src/commit.rs b/crates/git/src/commit.rs index 1a2aa7b43331aca97e6d9d26bac3569448aafc4a..ece1d76b8ae9c9f40f27178da1ef13fe1a78e659 100644 --- a/crates/git/src/commit.rs +++ b/crates/git/src/commit.rs @@ -8,38 +8,57 @@ pub async fn get_messages(working_directory: &Path, shas: &[Oid]) -> Result>()) +} - let output = util::command::new_smol_command("git") - .current_dir(working_directory) +async fn get_messages_impl(working_directory: &Path, shas: &[Oid]) -> Result> { + const MARKER: &str = ""; + let mut cmd = util::command::new_smol_command("git"); + cmd.current_dir(working_directory) .arg("show") .arg("-s") .arg(format!("--format=%B{}", MARKER)) - .args(shas.iter().map(ToString::to_string)) + .args(shas.iter().map(ToString::to_string)); + let output = cmd .output() .await - .context("starting git blame process")?; - + .with_context(|| format!("starting git blame process: {:?}", cmd))?; anyhow::ensure!( output.status.success(), "'git show' failed with error {:?}", output.status ); - - Ok(shas - .iter() - .cloned() - .zip( - String::from_utf8_lossy(&output.stdout) - .trim() - .split_terminator(MARKER) - .map(|str| str.trim().replace("<", "<").replace(">", ">")), - ) - .collect::>()) + Ok(String::from_utf8_lossy(&output.stdout) + .trim() + .split_terminator(MARKER) + .map(|str| str.trim().replace("<", "<").replace(">", ">")) + .collect::>()) } /// Parse the output of `git diff --name-status -z` -pub fn parse_git_diff_name_status(content: &str) -> impl Iterator { +pub fn parse_git_diff_name_status(content: &str) -> impl Iterator { let mut parts = content.split('\0'); std::iter::from_fn(move || { loop { @@ -51,13 +70,14 @@ pub fn parse_git_diff_name_status(content: &str) -> impl Iterator StatusCode::Deleted, _ => continue, }; - return Some((Path::new(path), status)); + return Some((path, status)); } }) } #[cfg(test)] mod tests { + use super::*; #[test] @@ -78,31 +98,19 @@ mod tests { assert_eq!( output, &[ - (Path::new("Cargo.lock"), StatusCode::Modified), - (Path::new("crates/project/Cargo.toml"), StatusCode::Modified), - ( - Path::new("crates/project/src/buffer_store.rs"), - StatusCode::Modified - ), - (Path::new("crates/project/src/git.rs"), StatusCode::Deleted), - ( - Path::new("crates/project/src/git_store.rs"), - StatusCode::Added - ), + ("Cargo.lock", StatusCode::Modified), + ("crates/project/Cargo.toml", StatusCode::Modified), + ("crates/project/src/buffer_store.rs", StatusCode::Modified), + ("crates/project/src/git.rs", StatusCode::Deleted), + ("crates/project/src/git_store.rs", StatusCode::Added), ( - Path::new("crates/project/src/git_store/git_traversal.rs"), + "crates/project/src/git_store/git_traversal.rs", StatusCode::Added, ), + ("crates/project/src/project.rs", StatusCode::Modified), + ("crates/project/src/worktree_store.rs", StatusCode::Modified), ( - Path::new("crates/project/src/project.rs"), - StatusCode::Modified - ), - ( - Path::new("crates/project/src/worktree_store.rs"), - StatusCode::Modified - ), - ( - Path::new("crates/project_panel/src/project_panel.rs"), + "crates/project_panel/src/project_panel.rs", StatusCode::Modified ), ] diff --git a/crates/git/src/git.rs b/crates/git/src/git.rs index 73d32ac9e468b57e13fc9bf714bc96d55549167c..29fa50ddd2bc2a2ae32a60b1b95dd66ca503d9de 100644 --- a/crates/git/src/git.rs +++ b/crates/git/src/git.rs @@ -11,22 +11,18 @@ pub use crate::remote::*; use anyhow::{Context as _, Result}; pub use git2 as libgit; use gpui::{Action, actions}; -pub use repository::WORK_DIRECTORY_REPO_PATH; +pub use repository::RemoteCommandOutput; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use std::ffi::OsStr; use std::fmt; use std::str::FromStr; -use std::sync::LazyLock; -pub static DOT_GIT: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new(".git")); -pub static GITIGNORE: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new(".gitignore")); -pub static FSMONITOR_DAEMON: LazyLock<&'static OsStr> = - LazyLock::new(|| OsStr::new("fsmonitor--daemon")); -pub static LFS_DIR: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new("lfs")); -pub static COMMIT_MESSAGE: LazyLock<&'static OsStr> = - LazyLock::new(|| OsStr::new("COMMIT_EDITMSG")); -pub static INDEX_LOCK: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new("index.lock")); +pub const DOT_GIT: &str = ".git"; +pub const GITIGNORE: &str = ".gitignore"; +pub const FSMONITOR_DAEMON: &str = "fsmonitor--daemon"; +pub const LFS_DIR: &str = "lfs"; +pub const COMMIT_MESSAGE: &str = "COMMIT_EDITMSG"; +pub const INDEX_LOCK: &str = "index.lock"; actions!( git, @@ -98,9 +94,23 @@ actions!( OpenModifiedFiles, /// Clones a repository. Clone, + /// Adds a file to .gitignore. + AddToGitignore, ] ); +/// Renames a git branch. +#[derive(Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Action)] +#[action(namespace = git)] +#[serde(deny_unknown_fields)] +pub struct RenameBranch { + /// The branch to rename. + /// + /// Default: the current branch. + #[serde(default)] + pub branch: Option, +} + /// Restores a file to its last committed state, discarding local changes. #[derive(Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Action)] #[action(namespace = git, deprecated_aliases = ["editor::RevertFile"])] diff --git a/crates/git/src/hosting_provider.rs b/crates/git/src/hosting_provider.rs index 5c11cb5504723432c8a041de42749138c4337915..225d4a3e2354fbd11e11b617ecdd9cb4202a63fe 100644 --- a/crates/git/src/hosting_provider.rs +++ b/crates/git/src/hosting_provider.rs @@ -5,9 +5,12 @@ use async_trait::async_trait; use derive_more::{Deref, DerefMut}; use gpui::{App, Global, SharedString}; use http_client::HttpClient; +use itertools::Itertools; use parking_lot::RwLock; use url::Url; +use crate::repository::RepoPath; + #[derive(Debug, PartialEq, Eq, Clone)] pub struct PullRequest { pub number: u32, @@ -17,8 +20,8 @@ pub struct PullRequest { #[derive(Clone)] pub struct GitRemote { pub host: Arc, - pub owner: String, - pub repo: String, + pub owner: SharedString, + pub repo: SharedString, } impl std::fmt::Debug for GitRemote { @@ -55,10 +58,21 @@ pub struct BuildCommitPermalinkParams<'a> { pub struct BuildPermalinkParams<'a> { pub sha: &'a str, - pub path: &'a str, + /// URL-escaped path using unescaped `/` as the directory separator. + pub path: String, pub selection: Option>, } +impl<'a> BuildPermalinkParams<'a> { + pub fn new(sha: &'a str, path: &RepoPath, selection: Option>) -> Self { + Self { + sha, + path: path.components().map(urlencoding::encode).join("/"), + selection, + } + } +} + /// A Git hosting provider. #[async_trait] pub trait GitHostingProvider { diff --git a/crates/git/src/repository.rs b/crates/git/src/repository.rs index 10aaca38bbb3f7326e9bae27d4e6b1e9c20bb59a..2e132d4eaca55c9307bf3368c412f77ed6726df2 100644 --- a/crates/git/src/repository.rs +++ b/crates/git/src/repository.rs @@ -5,6 +5,7 @@ use crate::{Oid, SHORT_SHA_LENGTH}; use anyhow::{Context as _, Result, anyhow, bail}; use collections::HashMap; use futures::future::BoxFuture; +use futures::io::BufWriter; use futures::{AsyncWriteExt, FutureExt as _, select_biased}; use git2::BranchType; use gpui::{AppContext as _, AsyncApp, BackgroundExecutor, SharedString, Task}; @@ -12,22 +13,21 @@ use parking_lot::Mutex; use rope::Rope; use schemars::JsonSchema; use serde::Deserialize; -use std::borrow::{Borrow, Cow}; +use smol::io::{AsyncBufReadExt, AsyncReadExt, BufReader}; +use std::borrow::Cow; use std::ffi::{OsStr, OsString}; -use std::io::prelude::*; -use std::path::Component; use std::process::{ExitStatus, Stdio}; -use std::sync::LazyLock; use std::{ cmp::Ordering, future, - io::{BufRead, BufReader, BufWriter, Read}, path::{Path, PathBuf}, sync::Arc, }; use sum_tree::MapSeekTarget; use thiserror::Error; -use util::command::{new_smol_command, new_std_command}; +use util::command::new_smol_command; +use util::paths::PathStyle; +use util::rel_path::RelPath; use util::{ResultExt, paths}; use uuid::Uuid; @@ -242,8 +242,20 @@ pub struct GitExcludeOverride { } impl GitExcludeOverride { + const START_BLOCK_MARKER: &str = "\n\n# ====== Auto-added by Zed: =======\n"; + const END_BLOCK_MARKER: &str = "\n# ====== End of auto-added by Zed =======\n"; + pub async fn new(git_exclude_path: PathBuf) -> Result { - let original_excludes = smol::fs::read_to_string(&git_exclude_path).await.ok(); + let original_excludes = + smol::fs::read_to_string(&git_exclude_path) + .await + .ok() + .map(|content| { + // Auto-generated lines are normally cleaned up in + // `restore_original()` or `drop()`, but may stuck in rare cases. + // Make sure to remove them. + Self::remove_auto_generated_block(&content) + }); Ok(GitExcludeOverride { git_exclude_path, @@ -260,9 +272,10 @@ impl GitExcludeOverride { }); let mut content = self.original_excludes.clone().unwrap_or_default(); - content.push_str("\n\n# ====== Auto-added by Zed: =======\n"); + + content.push_str(Self::START_BLOCK_MARKER); content.push_str(self.added_excludes.as_ref().unwrap()); - content.push('\n'); + content.push_str(Self::END_BLOCK_MARKER); smol::fs::write(&self.git_exclude_path, content).await?; Ok(()) @@ -279,6 +292,33 @@ impl GitExcludeOverride { Ok(()) } + + fn remove_auto_generated_block(content: &str) -> String { + let start_marker = Self::START_BLOCK_MARKER; + let end_marker = Self::END_BLOCK_MARKER; + let mut content = content.to_string(); + + let start_index = content.find(start_marker); + let end_index = content.rfind(end_marker); + + if let (Some(start), Some(end)) = (start_index, end_index) { + if end > start { + content.replace_range(start..end + end_marker.len(), ""); + } + } + + // Older versions of Zed didn't have end-of-block markers, + // so it's impossible to determine auto-generated lines. + // Conservatively remove the standard list of excludes + let standard_excludes = format!( + "{}{}", + Self::START_BLOCK_MARKER, + include_str!("./checkpoint.gitignore") + ); + content = content.replace(&standard_excludes, ""); + + content + } } impl Drop for GitExcludeOverride { @@ -346,6 +386,7 @@ pub trait GitRepository: Send + Sync { fn change_branch(&self, name: String) -> BoxFuture<'_, Result<()>>; fn create_branch(&self, name: String) -> BoxFuture<'_, Result<()>>; + fn rename_branch(&self, branch: String, new_name: String) -> BoxFuture<'_, Result<()>>; fn reset( &self, @@ -504,21 +545,25 @@ impl std::fmt::Debug for dyn GitRepository { pub struct RealGitRepository { pub repository: Arc>, - pub git_binary_path: PathBuf, + pub system_git_binary_path: Option, + pub any_git_binary_path: PathBuf, executor: BackgroundExecutor, } impl RealGitRepository { pub fn new( dotgit_path: &Path, - git_binary_path: Option, + bundled_git_binary_path: Option, + system_git_binary_path: Option, executor: BackgroundExecutor, ) -> Option { + let any_git_binary_path = system_git_binary_path.clone().or(bundled_git_binary_path)?; let workdir_root = dotgit_path.parent()?; let repository = git2::Repository::open(workdir_root).log_err()?; Some(Self { repository: Arc::new(Mutex::new(repository)), - git_binary_path: git_binary_path.unwrap_or_else(|| PathBuf::from("git")), + system_git_binary_path, + any_git_binary_path, executor, }) } @@ -599,11 +644,12 @@ impl GitRepository for RealGitRepository { } fn show(&self, commit: String) -> BoxFuture<'_, Result> { + let git_binary_path = self.any_git_binary_path.clone(); let working_directory = self.working_directory(); self.executor .spawn(async move { let working_directory = working_directory?; - let output = new_std_command("git") + let output = new_smol_command(git_binary_path) .current_dir(&working_directory) .args([ "--no-optional-locks", @@ -612,7 +658,8 @@ impl GitRepository for RealGitRepository { "--format=%H%x00%B%x00%at%x00%ae%x00%an%x00", &commit, ]) - .output()?; + .output() + .await?; let output = std::str::from_utf8(&output.stdout)?; let fields = output.split('\0').collect::>(); if fields.len() != 6 { @@ -639,8 +686,9 @@ impl GitRepository for RealGitRepository { else { return future::ready(Err(anyhow!("no working directory"))).boxed(); }; + let git_binary_path = self.any_git_binary_path.clone(); cx.background_spawn(async move { - let show_output = util::command::new_std_command("git") + let show_output = util::command::new_smol_command(&git_binary_path) .current_dir(&working_directory) .args([ "--no-optional-locks", @@ -655,6 +703,7 @@ impl GitRepository for RealGitRepository { .stdout(Stdio::piped()) .stderr(Stdio::piped()) .output() + .await .context("starting git show process")?; let show_stdout = String::from_utf8_lossy(&show_output.stdout); @@ -662,7 +711,7 @@ impl GitRepository for RealGitRepository { let parent_sha = lines.next().unwrap().trim().trim_end_matches('\0'); let changes = parse_git_diff_name_status(lines.next().unwrap_or("")); - let mut cat_file_process = util::command::new_std_command("git") + let mut cat_file_process = util::command::new_smol_command(&git_binary_path) .current_dir(&working_directory) .args(["--no-optional-locks", "cat-file", "--batch=%(objectsize)"]) .stdin(Stdio::piped()) @@ -671,37 +720,53 @@ impl GitRepository for RealGitRepository { .spawn() .context("starting git cat-file process")?; - use std::io::Write as _; let mut files = Vec::::new(); let mut stdin = BufWriter::with_capacity(512, cat_file_process.stdin.take().unwrap()); let mut stdout = BufReader::new(cat_file_process.stdout.take().unwrap()); let mut info_line = String::new(); let mut newline = [b'\0']; for (path, status_code) in changes { + // git-show outputs `/`-delimited paths even on Windows. + let Some(rel_path) = RelPath::unix(path).log_err() else { + continue; + }; + match status_code { StatusCode::Modified => { - writeln!(&mut stdin, "{commit}:{}", path.display())?; - writeln!(&mut stdin, "{parent_sha}:{}", path.display())?; + stdin.write_all(commit.as_bytes()).await?; + stdin.write_all(b":").await?; + stdin.write_all(path.as_bytes()).await?; + stdin.write_all(b"\n").await?; + stdin.write_all(parent_sha.as_bytes()).await?; + stdin.write_all(b":").await?; + stdin.write_all(path.as_bytes()).await?; + stdin.write_all(b"\n").await?; } StatusCode::Added => { - writeln!(&mut stdin, "{commit}:{}", path.display())?; + stdin.write_all(commit.as_bytes()).await?; + stdin.write_all(b":").await?; + stdin.write_all(path.as_bytes()).await?; + stdin.write_all(b"\n").await?; } StatusCode::Deleted => { - writeln!(&mut stdin, "{parent_sha}:{}", path.display())?; + stdin.write_all(parent_sha.as_bytes()).await?; + stdin.write_all(b":").await?; + stdin.write_all(path.as_bytes()).await?; + stdin.write_all(b"\n").await?; } _ => continue, } - stdin.flush()?; + stdin.flush().await?; info_line.clear(); - stdout.read_line(&mut info_line)?; + stdout.read_line(&mut info_line).await?; let len = info_line.trim_end().parse().with_context(|| { format!("invalid object size output from cat-file {info_line}") })?; let mut text = vec![0; len]; - stdout.read_exact(&mut text)?; - stdout.read_exact(&mut newline)?; + stdout.read_exact(&mut text).await?; + stdout.read_exact(&mut newline).await?; let text = String::from_utf8_lossy(&text).to_string(); let mut old_text = None; @@ -709,13 +774,13 @@ impl GitRepository for RealGitRepository { match status_code { StatusCode::Modified => { info_line.clear(); - stdout.read_line(&mut info_line)?; + stdout.read_line(&mut info_line).await?; let len = info_line.trim_end().parse().with_context(|| { format!("invalid object size output from cat-file {}", info_line) })?; let mut parent_text = vec![0; len]; - stdout.read_exact(&mut parent_text)?; - stdout.read_exact(&mut newline)?; + stdout.read_exact(&mut parent_text).await?; + stdout.read_exact(&mut newline).await?; old_text = Some(String::from_utf8_lossy(&parent_text).to_string()); new_text = Some(text); } @@ -725,7 +790,7 @@ impl GitRepository for RealGitRepository { } files.push(CommitFile { - path: path.into(), + path: rel_path.into(), old_text, new_text, }) @@ -750,7 +815,7 @@ impl GitRepository for RealGitRepository { ResetMode::Soft => "--soft", }; - let output = new_smol_command(&self.git_binary_path) + let output = new_smol_command(&self.any_git_binary_path) .envs(env.iter()) .current_dir(&working_directory?) .args(["reset", mode_flag, &commit]) @@ -773,7 +838,7 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); async move { if paths.is_empty() { return Ok(()); @@ -783,7 +848,7 @@ impl GitRepository for RealGitRepository { .current_dir(&working_directory?) .envs(env.iter()) .args(["checkout", &commit, "--"]) - .args(paths.iter().map(|path| path.as_ref())) + .args(paths.iter().map(|path| path.as_unix_str())) .output() .await?; anyhow::ensure!( @@ -805,13 +870,11 @@ impl GitRepository for RealGitRepository { .spawn(async move { fn logic(repo: &git2::Repository, path: &RepoPath) -> Result> { // This check is required because index.get_path() unwraps internally :( - check_path_to_repo_path_errors(path)?; - let mut index = repo.index()?; index.read(false)?; const STAGE_NORMAL: i32 = 0; - let oid = match index.get_path(path, STAGE_NORMAL) { + let oid = match index.get_path(path.as_std_path(), STAGE_NORMAL) { Some(entry) if entry.mode != GIT_MODE_SYMLINK => entry.id, _ => return Ok(None), }; @@ -835,7 +898,7 @@ impl GitRepository for RealGitRepository { .spawn(async move { let repo = repo.lock(); let head = repo.head().ok()?.peel_to_tree().log_err()?; - let entry = head.get_path(&path).ok()?; + let entry = head.get_path(path.as_std_path()).ok()?; if entry.filemode() == i32::from(git2::FileMode::Link) { return None; } @@ -852,7 +915,7 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, anyhow::Result<()>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { let working_directory = working_directory?; @@ -877,7 +940,7 @@ impl GitRepository for RealGitRepository { .current_dir(&working_directory) .envs(env.iter()) .args(["update-index", "--add", "--cacheinfo", "100644", sha]) - .arg(path.to_unix_style()) + .arg(path.as_unix_str()) .output() .await?; @@ -892,7 +955,7 @@ impl GitRepository for RealGitRepository { .current_dir(&working_directory) .envs(env.iter()) .args(["update-index", "--force-remove"]) - .arg(path.to_unix_style()) + .arg(path.as_unix_str()) .output() .await?; anyhow::ensure!( @@ -915,10 +978,11 @@ impl GitRepository for RealGitRepository { fn revparse_batch(&self, revs: Vec) -> BoxFuture<'_, Result>>> { let working_directory = self.working_directory(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { let working_directory = working_directory?; - let mut process = new_std_command("git") + let mut process = new_smol_command(&git_binary_path) .current_dir(&working_directory) .args([ "--no-optional-locks", @@ -936,12 +1000,13 @@ impl GitRepository for RealGitRepository { .context("no stdin for git cat-file subprocess")?; let mut stdin = BufWriter::new(stdin); for rev in &revs { - writeln!(&mut stdin, "{rev}")?; + stdin.write_all(rev.as_bytes()).await?; + stdin.write_all(b"\n").await?; } - stdin.flush()?; + stdin.flush().await?; drop(stdin); - let output = process.wait_with_output()?; + let output = process.output().await?; let output = std::str::from_utf8(&output.stdout)?; let shas = output .lines() @@ -972,7 +1037,7 @@ impl GitRepository for RealGitRepository { } fn status(&self, path_prefixes: &[RepoPath]) -> Task> { - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let working_directory = match self.working_directory() { Ok(working_directory) => working_directory, Err(e) => return Task::ready(Err(e)), @@ -980,10 +1045,11 @@ impl GitRepository for RealGitRepository { let args = git_status_args(path_prefixes); log::debug!("Checking for git status in {path_prefixes:?}"); self.executor.spawn(async move { - let output = new_std_command(&git_binary_path) + let output = new_smol_command(&git_binary_path) .current_dir(working_directory) .args(args) - .output()?; + .output() + .await?; if output.status.success() { let stdout = String::from_utf8_lossy(&output.stdout); stdout.parse() @@ -995,14 +1061,15 @@ impl GitRepository for RealGitRepository { } fn stash_entries(&self) -> BoxFuture<'_, Result> { - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let working_directory = self.working_directory(); self.executor .spawn(async move { - let output = new_std_command(&git_binary_path) + let output = new_smol_command(&git_binary_path) .current_dir(working_directory?) .args(&["stash", "list", "--pretty=format:%gd%x00%H%x00%ct%x00%s"]) - .output()?; + .output() + .await?; if output.status.success() { let stdout = String::from_utf8_lossy(&output.stdout); stdout.parse() @@ -1016,7 +1083,7 @@ impl GitRepository for RealGitRepository { fn branches(&self) -> BoxFuture<'_, Result>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { let fields = [ @@ -1085,7 +1152,7 @@ impl GitRepository for RealGitRepository { fn change_branch(&self, name: String) -> BoxFuture<'_, Result<()>> { let repo = self.repository.clone(); let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let executor = self.executor.clone(); let branch = self.executor.spawn(async move { let repo = repo.lock(); @@ -1095,11 +1162,11 @@ impl GitRepository for RealGitRepository { let (_, branch_name) = name.split_once("/").context("Unexpected branch format")?; let revision = revision.get(); let branch_commit = revision.peel_to_commit()?; - let mut branch = repo.branch(branch_name, &branch_commit, false)?; + let mut branch = repo.branch(&branch_name, &branch_commit, false)?; branch.set_upstream(Some(&name))?; branch } else { - anyhow::bail!("Branch not found"); + anyhow::bail!("Branch '{}' not found", name); }; Ok(branch @@ -1115,7 +1182,6 @@ impl GitRepository for RealGitRepository { GitBinary::new(git_binary_path, working_directory?, executor) .run(&["checkout", &branch]) .await?; - anyhow::Ok(()) }) .boxed() @@ -1133,9 +1199,24 @@ impl GitRepository for RealGitRepository { .boxed() } + fn rename_branch(&self, branch: String, new_name: String) -> BoxFuture<'_, Result<()>> { + let git_binary_path = self.any_git_binary_path.clone(); + let working_directory = self.working_directory(); + let executor = self.executor.clone(); + + self.executor + .spawn(async move { + GitBinary::new(git_binary_path, working_directory?, executor) + .run(&["branch", "-m", &branch, &new_name]) + .await?; + anyhow::Ok(()) + }) + .boxed() + } + fn blame(&self, path: RepoPath, content: Rope) -> BoxFuture<'_, Result> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let remote_url = self .remote_url("upstream") @@ -1157,7 +1238,7 @@ impl GitRepository for RealGitRepository { fn diff(&self, diff: DiffType) -> BoxFuture<'_, Result> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { let args = match diff { @@ -1188,7 +1269,7 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { if !paths.is_empty() { @@ -1196,7 +1277,7 @@ impl GitRepository for RealGitRepository { .current_dir(&working_directory?) .envs(env.iter()) .args(["update-index", "--add", "--remove", "--"]) - .args(paths.iter().map(|p| p.to_unix_style())) + .args(paths.iter().map(|p| p.as_unix_str())) .output() .await?; anyhow::ensure!( @@ -1216,7 +1297,7 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { @@ -1225,7 +1306,7 @@ impl GitRepository for RealGitRepository { .current_dir(&working_directory?) .envs(env.iter()) .args(["reset", "--quiet", "--"]) - .args(paths.iter().map(|p| p.as_ref())) + .args(paths.iter().map(|p| p.as_std_path())) .output() .await?; @@ -1246,15 +1327,16 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { - let mut cmd = new_smol_command("git"); + let mut cmd = new_smol_command(&git_binary_path); cmd.current_dir(&working_directory?) .envs(env.iter()) .args(["stash", "push", "--quiet"]) .arg("--include-untracked"); - cmd.args(paths.iter().map(|p| p.as_ref())); + cmd.args(paths.iter().map(|p| p.as_unix_str())); let output = cmd.output().await?; @@ -1274,9 +1356,10 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { - let mut cmd = new_smol_command("git"); + let mut cmd = new_smol_command(git_binary_path); let mut args = vec!["stash".to_string(), "pop".to_string()]; if let Some(index) = index { args.push(format!("stash@{{{}}}", index)); @@ -1303,9 +1386,10 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { - let mut cmd = new_smol_command("git"); + let mut cmd = new_smol_command(git_binary_path); let mut args = vec!["stash".to_string(), "apply".to_string()]; if let Some(index) = index { args.push(format!("stash@{{{}}}", index)); @@ -1332,9 +1416,10 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { - let mut cmd = new_smol_command("git"); + let mut cmd = new_smol_command(git_binary_path); let mut args = vec!["stash".to_string(), "drop".to_string()]; if let Some(index) = index { args.push(format!("stash@{{{}}}", index)); @@ -1363,9 +1448,10 @@ impl GitRepository for RealGitRepository { env: Arc>, ) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { - let mut cmd = new_smol_command("git"); + let mut cmd = new_smol_command(git_binary_path); cmd.current_dir(&working_directory?) .envs(env.iter()) .args(["commit", "--quiet", "-m"]) @@ -1407,9 +1493,11 @@ impl GitRepository for RealGitRepository { ) -> BoxFuture<'_, Result> { let working_directory = self.working_directory(); let executor = cx.background_executor().clone(); + let git_binary_path = self.system_git_binary_path.clone(); async move { + let git_binary_path = git_binary_path.context("git not found on $PATH, can't push")?; let working_directory = working_directory?; - let mut command = new_smol_command("git"); + let mut command = new_smol_command(git_binary_path); command .envs(env.iter()) .current_dir(&working_directory) @@ -1439,8 +1527,10 @@ impl GitRepository for RealGitRepository { ) -> BoxFuture<'_, Result> { let working_directory = self.working_directory(); let executor = cx.background_executor().clone(); + let git_binary_path = self.system_git_binary_path.clone(); async move { - let mut command = new_smol_command("git"); + let git_binary_path = git_binary_path.context("git not found on $PATH, can't pull")?; + let mut command = new_smol_command(git_binary_path); command .envs(env.iter()) .current_dir(&working_directory?) @@ -1464,9 +1554,11 @@ impl GitRepository for RealGitRepository { ) -> BoxFuture<'_, Result> { let working_directory = self.working_directory(); let remote_name = format!("{}", fetch_options); + let git_binary_path = self.system_git_binary_path.clone(); let executor = cx.background_executor().clone(); async move { - let mut command = new_smol_command("git"); + let git_binary_path = git_binary_path.context("git not found on $PATH, can't fetch")?; + let mut command = new_smol_command(git_binary_path); command .envs(env.iter()) .current_dir(&working_directory?) @@ -1481,7 +1573,7 @@ impl GitRepository for RealGitRepository { fn get_remotes(&self, branch_name: Option) -> BoxFuture<'_, Result>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { let working_directory = working_directory?; @@ -1527,7 +1619,7 @@ impl GitRepository for RealGitRepository { fn check_for_pushed_commit(&self) -> BoxFuture<'_, Result>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); self.executor .spawn(async move { let working_directory = working_directory?; @@ -1586,7 +1678,7 @@ impl GitRepository for RealGitRepository { fn checkpoint(&self) -> BoxFuture<'static, Result> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let executor = self.executor.clone(); self.executor .spawn(async move { @@ -1619,7 +1711,7 @@ impl GitRepository for RealGitRepository { fn restore_checkpoint(&self, checkpoint: GitRepositoryCheckpoint) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let executor = self.executor.clone(); self.executor @@ -1658,7 +1750,7 @@ impl GitRepository for RealGitRepository { right: GitRepositoryCheckpoint, ) -> BoxFuture<'_, Result> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let executor = self.executor.clone(); self.executor @@ -1696,7 +1788,7 @@ impl GitRepository for RealGitRepository { target_checkpoint: GitRepositoryCheckpoint, ) -> BoxFuture<'_, Result> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let executor = self.executor.clone(); self.executor @@ -1717,7 +1809,7 @@ impl GitRepository for RealGitRepository { fn default_branch(&self) -> BoxFuture<'_, Result>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let executor = self.executor.clone(); self.executor @@ -1757,10 +1849,10 @@ fn git_status_args(path_prefixes: &[RepoPath]) -> Vec { OsString::from("-z"), ]; args.extend(path_prefixes.iter().map(|path_prefix| { - if path_prefix.0.as_ref() == Path::new("") { + if path_prefix.is_empty() { Path::new(".").into() } else { - path_prefix.as_os_str().into() + path_prefix.as_std_path().into() } })); args @@ -1795,7 +1887,7 @@ async fn exclude_files(git: &GitBinary) -> Result { if !excluded_paths.is_empty() { let exclude_patterns = excluded_paths .into_iter() - .map(|path| path.to_string_lossy().to_string()) + .map(|path| path.to_string_lossy().into_owned()) .collect::>() .join("\n"); excludes.add_excludes(&exclude_patterns).await?; @@ -2011,99 +2103,71 @@ async fn run_askpass_command( } } -pub static WORK_DIRECTORY_REPO_PATH: LazyLock = - LazyLock::new(|| RepoPath(Path::new("").into())); - #[derive(Clone, Debug, Ord, Hash, PartialOrd, Eq, PartialEq)] -pub struct RepoPath(pub Arc); +pub struct RepoPath(pub Arc); impl RepoPath { - pub fn new(path: PathBuf) -> Self { - debug_assert!(path.is_relative(), "Repo paths must be relative"); - - RepoPath(path.into()) - } - - pub fn from_str(path: &str) -> Self { - let path = Path::new(path); - debug_assert!(path.is_relative(), "Repo paths must be relative"); - - RepoPath(path.into()) + pub fn new + ?Sized>(s: &S) -> Result { + let rel_path = RelPath::unix(s.as_ref())?; + Ok(rel_path.into()) } - pub fn to_unix_style(&self) -> Cow<'_, OsStr> { - #[cfg(target_os = "windows")] - { - use std::ffi::OsString; - - let path = self.0.as_os_str().to_string_lossy().replace("\\", "/"); - Cow::Owned(OsString::from(path)) - } - #[cfg(not(target_os = "windows"))] - { - Cow::Borrowed(self.0.as_os_str()) - } + pub fn from_proto(proto: &str) -> Result { + let rel_path = RelPath::from_proto(proto)?; + Ok(rel_path.into()) } -} -impl std::fmt::Display for RepoPath { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - self.0.to_string_lossy().fmt(f) + pub fn from_std_path(path: &Path, path_style: PathStyle) -> Result { + let rel_path = RelPath::new(path, path_style)?; + Ok(Self(rel_path.as_ref().into())) } } -impl From<&Path> for RepoPath { - fn from(value: &Path) -> Self { - RepoPath::new(value.into()) - } +#[cfg(any(test, feature = "test-support"))] +pub fn repo_path + ?Sized>(s: &S) -> RepoPath { + RepoPath(RelPath::unix(s.as_ref()).unwrap().into()) } -impl From> for RepoPath { - fn from(value: Arc) -> Self { - RepoPath(value) +impl From<&RelPath> for RepoPath { + fn from(value: &RelPath) -> Self { + RepoPath(value.into()) } } -impl From for RepoPath { - fn from(value: PathBuf) -> Self { - RepoPath::new(value) +impl<'a> From> for RepoPath { + fn from(value: Cow<'a, RelPath>) -> Self { + value.as_ref().into() } } -impl From<&str> for RepoPath { - fn from(value: &str) -> Self { - Self::from_str(value) +impl From> for RepoPath { + fn from(value: Arc) -> Self { + RepoPath(value) } } impl Default for RepoPath { fn default() -> Self { - RepoPath(Path::new("").into()) - } -} - -impl AsRef for RepoPath { - fn as_ref(&self) -> &Path { - self.0.as_ref() + RepoPath(RelPath::empty().into()) } } impl std::ops::Deref for RepoPath { - type Target = Path; + type Target = RelPath; fn deref(&self) -> &Self::Target { &self.0 } } -impl Borrow for RepoPath { - fn borrow(&self) -> &Path { - self.0.as_ref() - } -} +// impl AsRef for RepoPath { +// fn as_ref(&self) -> &Path { +// RelPath::as_ref(&self.0) +// } +// } #[derive(Debug)] -pub struct RepoPathDescendants<'a>(pub &'a Path); +pub struct RepoPathDescendants<'a>(pub &'a RepoPath); impl MapSeekTarget for RepoPathDescendants<'_> { fn cmp_cursor(&self, key: &RepoPath) -> Ordering { @@ -2189,35 +2253,6 @@ fn parse_upstream_track(upstream_track: &str) -> Result { })) } -fn check_path_to_repo_path_errors(relative_file_path: &Path) -> Result<()> { - match relative_file_path.components().next() { - None => anyhow::bail!("repo path should not be empty"), - Some(Component::Prefix(_)) => anyhow::bail!( - "repo path `{}` should be relative, not a windows prefix", - relative_file_path.to_string_lossy() - ), - Some(Component::RootDir) => { - anyhow::bail!( - "repo path `{}` should be relative", - relative_file_path.to_string_lossy() - ) - } - Some(Component::CurDir) => { - anyhow::bail!( - "repo path `{}` should not start with `.`", - relative_file_path.to_string_lossy() - ) - } - Some(Component::ParentDir) => { - anyhow::bail!( - "repo path `{}` should not start with `..`", - relative_file_path.to_string_lossy() - ) - } - _ => Ok(()), - } -} - fn checkpoint_author_envs() -> HashMap { HashMap::from_iter([ ("GIT_AUTHOR_NAME".to_string(), "Zed".to_string()), @@ -2242,14 +2277,16 @@ mod tests { let file_path = repo_dir.path().join("file"); smol::fs::write(&file_path, "initial").await.unwrap(); - let repo = - RealGitRepository::new(&repo_dir.path().join(".git"), None, cx.executor()).unwrap(); - repo.stage_paths( - vec![RepoPath::from_str("file")], - Arc::new(HashMap::default()), + let repo = RealGitRepository::new( + &repo_dir.path().join(".git"), + None, + Some("git".into()), + cx.executor(), ) - .await .unwrap(); + repo.stage_paths(vec![repo_path("file")], Arc::new(HashMap::default())) + .await + .unwrap(); repo.commit( "Initial commit".into(), None, @@ -2273,12 +2310,9 @@ mod tests { smol::fs::write(&file_path, "modified after checkpoint") .await .unwrap(); - repo.stage_paths( - vec![RepoPath::from_str("file")], - Arc::new(HashMap::default()), - ) - .await - .unwrap(); + repo.stage_paths(vec![repo_path("file")], Arc::new(HashMap::default())) + .await + .unwrap(); repo.commit( "Commit after checkpoint".into(), None, @@ -2324,8 +2358,13 @@ mod tests { let repo_dir = tempfile::tempdir().unwrap(); git2::Repository::init(repo_dir.path()).unwrap(); - let repo = - RealGitRepository::new(&repo_dir.path().join(".git"), None, cx.executor()).unwrap(); + let repo = RealGitRepository::new( + &repo_dir.path().join(".git"), + None, + Some("git".into()), + cx.executor(), + ) + .unwrap(); smol::fs::write(repo_dir.path().join("foo"), "foo") .await @@ -2363,8 +2402,13 @@ mod tests { let repo_dir = tempfile::tempdir().unwrap(); git2::Repository::init(repo_dir.path()).unwrap(); - let repo = - RealGitRepository::new(&repo_dir.path().join(".git"), None, cx.executor()).unwrap(); + let repo = RealGitRepository::new( + &repo_dir.path().join(".git"), + None, + Some("git".into()), + cx.executor(), + ) + .unwrap(); smol::fs::write(repo_dir.path().join("file1"), "content1") .await @@ -2407,16 +2451,18 @@ mod tests { .await .unwrap(); - let repo = - RealGitRepository::new(&repo_dir.path().join(".git"), None, cx.executor()).unwrap(); - - // initial commit - repo.stage_paths( - vec![RepoPath::from_str("main.rs")], - Arc::new(HashMap::default()), + let repo = RealGitRepository::new( + &repo_dir.path().join(".git"), + None, + Some("git".into()), + cx.executor(), ) - .await .unwrap(); + + // initial commit + repo.stage_paths(vec![repo_path("main.rs")], Arc::new(HashMap::default())) + .await + .unwrap(); repo.commit( "Initial commit".into(), None, @@ -2482,7 +2528,7 @@ mod tests { /// Force a Git garbage collection on the repository. fn gc(&self) -> BoxFuture<'_, Result<()>> { let working_directory = self.working_directory(); - let git_binary_path = self.git_binary_path.clone(); + let git_binary_path = self.any_git_binary_path.clone(); let executor = self.executor.clone(); self.executor .spawn(async move { diff --git a/crates/git/src/status.rs b/crates/git/src/status.rs index 71ca14c5b2c4b82ae7dc21e832a2a07c55de8fc3..c3f28aa2040446822f81990804a63fcb5a53300c 100644 --- a/crates/git/src/status.rs +++ b/crates/git/src/status.rs @@ -1,8 +1,8 @@ use crate::repository::RepoPath; use anyhow::Result; use serde::{Deserialize, Serialize}; -use std::{path::Path, str::FromStr, sync::Arc}; -use util::ResultExt; +use std::{str::FromStr, sync::Arc}; +use util::{ResultExt, rel_path::RelPath}; #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum FileStatus { @@ -378,14 +378,12 @@ impl From for GitSummary { } } -impl sum_tree::Summary for GitSummary { - type Context = (); - - fn zero(_: &Self::Context) -> Self { +impl sum_tree::ContextLessSummary for GitSummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, rhs: &Self, _: &Self::Context) { + fn add_summary(&mut self, rhs: &Self) { *self += *rhs; } } @@ -449,7 +447,8 @@ impl FromStr for GitStatus { } let status = entry.as_bytes()[0..2].try_into().unwrap(); let status = FileStatus::from_bytes(status).log_err()?; - let path = RepoPath(Path::new(path).into()); + // git-status outputs `/`-delimited repo paths, even on Windows. + let path = RepoPath(RelPath::unix(path).log_err()?.into()); Some((path, status)) }) .collect::>(); diff --git a/crates/git_hosting_providers/Cargo.toml b/crates/git_hosting_providers/Cargo.toml index cce7ea439ecfb7ea51cbf5bd89dae5e6c6a6f350..dd189f64bf08dabafa18d1132bc36d36e6f5ab8e 100644 --- a/crates/git_hosting_providers/Cargo.toml +++ b/crates/git_hosting_providers/Cargo.toml @@ -19,7 +19,6 @@ git.workspace = true gpui.workspace = true http_client.workspace = true regex.workspace = true -schemars.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true @@ -31,3 +30,4 @@ workspace-hack.workspace = true indoc.workspace = true serde_json.workspace = true pretty_assertions.workspace = true +git = { workspace = true, features = ["test-support"] } diff --git a/crates/git_hosting_providers/src/providers/bitbucket.rs b/crates/git_hosting_providers/src/providers/bitbucket.rs index 26df7b567ae007553657a0075038c0762ce0063e..a6bb83b0f9d6025301db309c4d64ea39ade42076 100644 --- a/crates/git_hosting_providers/src/providers/bitbucket.rs +++ b/crates/git_hosting_providers/src/providers/bitbucket.rs @@ -126,6 +126,7 @@ impl GitHostingProvider for Bitbucket { #[cfg(test)] mod tests { + use git::repository::repo_path; use pretty_assertions::assert_eq; use super::*; @@ -182,11 +183,7 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "f00b4r", - path: "main.rs", - selection: None, - }, + BuildPermalinkParams::new("f00b4r", &repo_path("main.rs"), None), ); let expected_url = "https://bitbucket.org/zed-industries/zed/src/f00b4r/main.rs"; @@ -200,11 +197,7 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "f00b4r", - path: "main.rs", - selection: Some(6..6), - }, + BuildPermalinkParams::new("f00b4r", &repo_path("main.rs"), Some(6..6)), ); let expected_url = "https://bitbucket.org/zed-industries/zed/src/f00b4r/main.rs#lines-7"; @@ -218,11 +211,7 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "f00b4r", - path: "main.rs", - selection: Some(23..47), - }, + BuildPermalinkParams::new("f00b4r", &repo_path("main.rs"), Some(23..47)), ); let expected_url = diff --git a/crates/git_hosting_providers/src/providers/chromium.rs b/crates/git_hosting_providers/src/providers/chromium.rs index 5d940fb496be6fde2778272abe640987e3b2a4af..0826e31b309918fb0967f7b3019b53fe483837b9 100644 --- a/crates/git_hosting_providers/src/providers/chromium.rs +++ b/crates/git_hosting_providers/src/providers/chromium.rs @@ -191,6 +191,7 @@ impl GitHostingProvider for Chromium { #[cfg(test)] mod tests { + use git::repository::repo_path; use indoc::indoc; use pretty_assertions::assert_eq; @@ -218,11 +219,11 @@ mod tests { owner: Arc::from(""), repo: "chromium/src".into(), }, - BuildPermalinkParams { - sha: "fea5080b182fc92e3be0c01c5dece602fe70b588", - path: "ui/base/cursor/cursor.h", - selection: None, - }, + BuildPermalinkParams::new( + "fea5080b182fc92e3be0c01c5dece602fe70b588", + &repo_path("ui/base/cursor/cursor.h"), + None, + ), ); let expected_url = "https://chromium.googlesource.com/chromium/src/+/fea5080b182fc92e3be0c01c5dece602fe70b588/ui/base/cursor/cursor.h"; @@ -236,11 +237,11 @@ mod tests { owner: Arc::from(""), repo: "chromium/src".into(), }, - BuildPermalinkParams { - sha: "fea5080b182fc92e3be0c01c5dece602fe70b588", - path: "ui/base/cursor/cursor.h", - selection: Some(18..18), - }, + BuildPermalinkParams::new( + "fea5080b182fc92e3be0c01c5dece602fe70b588", + &repo_path("ui/base/cursor/cursor.h"), + Some(18..18), + ), ); let expected_url = "https://chromium.googlesource.com/chromium/src/+/fea5080b182fc92e3be0c01c5dece602fe70b588/ui/base/cursor/cursor.h#19"; @@ -254,11 +255,11 @@ mod tests { owner: Arc::from(""), repo: "chromium/src".into(), }, - BuildPermalinkParams { - sha: "fea5080b182fc92e3be0c01c5dece602fe70b588", - path: "ui/base/cursor/cursor.h", - selection: Some(18..30), - }, + BuildPermalinkParams::new( + "fea5080b182fc92e3be0c01c5dece602fe70b588", + &repo_path("ui/base/cursor/cursor.h"), + Some(18..30), + ), ); let expected_url = "https://chromium.googlesource.com/chromium/src/+/fea5080b182fc92e3be0c01c5dece602fe70b588/ui/base/cursor/cursor.h#19"; diff --git a/crates/git_hosting_providers/src/providers/codeberg.rs b/crates/git_hosting_providers/src/providers/codeberg.rs index b9f2542d5b00d32b476e20e4925b7805c886d636..4cd7dd2c04aa30973d6409300eadd9fbc980ddc4 100644 --- a/crates/git_hosting_providers/src/providers/codeberg.rs +++ b/crates/git_hosting_providers/src/providers/codeberg.rs @@ -16,25 +16,53 @@ use git::{ #[derive(Debug, Deserialize)] struct CommitDetails { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] commit: Commit, author: Option, } #[derive(Debug, Deserialize)] struct Commit { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] author: Author, } #[derive(Debug, Deserialize)] struct Author { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] name: String, + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] email: String, + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] date: String, } #[derive(Debug, Deserialize)] struct User { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] pub login: String, + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] pub id: u64, pub avatar_url: String, } @@ -176,6 +204,7 @@ impl GitHostingProvider for Codeberg { #[cfg(test)] mod tests { + use git::repository::repo_path; use pretty_assertions::assert_eq; use super::*; @@ -217,11 +246,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "faa6f979be417239b2e070dbbf6392b909224e0b", - path: "crates/editor/src/git/permalink.rs", - selection: None, - }, + BuildPermalinkParams::new( + "faa6f979be417239b2e070dbbf6392b909224e0b", + &repo_path("crates/editor/src/git/permalink.rs"), + None, + ), ); let expected_url = "https://codeberg.org/zed-industries/zed/src/commit/faa6f979be417239b2e070dbbf6392b909224e0b/crates/editor/src/git/permalink.rs"; @@ -235,11 +264,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "faa6f979be417239b2e070dbbf6392b909224e0b", - path: "crates/editor/src/git/permalink.rs", - selection: Some(6..6), - }, + BuildPermalinkParams::new( + "faa6f979be417239b2e070dbbf6392b909224e0b", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(6..6), + ), ); let expected_url = "https://codeberg.org/zed-industries/zed/src/commit/faa6f979be417239b2e070dbbf6392b909224e0b/crates/editor/src/git/permalink.rs#L7"; @@ -253,11 +282,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "faa6f979be417239b2e070dbbf6392b909224e0b", - path: "crates/editor/src/git/permalink.rs", - selection: Some(23..47), - }, + BuildPermalinkParams::new( + "faa6f979be417239b2e070dbbf6392b909224e0b", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(23..47), + ), ); let expected_url = "https://codeberg.org/zed-industries/zed/src/commit/faa6f979be417239b2e070dbbf6392b909224e0b/crates/editor/src/git/permalink.rs#L24-L48"; diff --git a/crates/git_hosting_providers/src/providers/gitee.rs b/crates/git_hosting_providers/src/providers/gitee.rs index 5090cd0d74d775af490976758f39fdabe062b43b..e2bcb6668240fa43120555f9b3c11a10dd1418d7 100644 --- a/crates/git_hosting_providers/src/providers/gitee.rs +++ b/crates/git_hosting_providers/src/providers/gitee.rs @@ -84,6 +84,7 @@ impl GitHostingProvider for Gitee { #[cfg(test)] mod tests { + use git::repository::repo_path; use pretty_assertions::assert_eq; use super::*; @@ -125,11 +126,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", - path: "crates/editor/src/git/permalink.rs", - selection: None, - }, + BuildPermalinkParams::new( + "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + &repo_path("crates/editor/src/git/permalink.rs"), + None, + ), ); let expected_url = "https://gitee.com/zed-industries/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs"; @@ -143,11 +144,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", - path: "crates/editor/src/git/permalink.rs", - selection: Some(6..6), - }, + BuildPermalinkParams::new( + "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(6..6), + ), ); let expected_url = "https://gitee.com/zed-industries/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs#L7"; @@ -161,11 +162,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", - path: "crates/editor/src/git/permalink.rs", - selection: Some(23..47), - }, + BuildPermalinkParams::new( + "e5fe811d7ad0fc26934edd76f891d20bdc3bb194", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(23..47), + ), ); let expected_url = "https://gitee.com/zed-industries/zed/blob/e5fe811d7ad0fc26934edd76f891d20bdc3bb194/crates/editor/src/git/permalink.rs#L24-48"; diff --git a/crates/git_hosting_providers/src/providers/github.rs b/crates/git_hosting_providers/src/providers/github.rs index 4475afeb495f41e89273ce0336d830db4cc869cf..4f5c71830da4e5ce4112812d0737ebc878df7b76 100644 --- a/crates/git_hosting_providers/src/providers/github.rs +++ b/crates/git_hosting_providers/src/providers/github.rs @@ -25,22 +25,38 @@ fn pull_request_number_regex() -> &'static Regex { #[derive(Debug, Deserialize)] struct CommitDetails { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] commit: Commit, author: Option, } #[derive(Debug, Deserialize)] struct Commit { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] author: Author, } #[derive(Debug, Deserialize)] struct Author { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] email: String, } #[derive(Debug, Deserialize)] struct User { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] pub id: u64, pub avatar_url: String, } @@ -243,6 +259,7 @@ impl GitHostingProvider for Github { #[cfg(test)] mod tests { + use git::repository::repo_path; use indoc::indoc; use pretty_assertions::assert_eq; @@ -384,11 +401,11 @@ mod tests { }; let permalink = Github::public_instance().build_permalink( remote, - BuildPermalinkParams { - sha: "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", - path: "crates/editor/src/git/permalink.rs", - selection: None, - }, + BuildPermalinkParams::new( + "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", + &repo_path("crates/editor/src/git/permalink.rs"), + None, + ), ); let expected_url = "https://github.com/zed-industries/zed/blob/e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7/crates/editor/src/git/permalink.rs"; @@ -402,11 +419,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "b2efec9824c45fcc90c9a7eb107a50d1772a60aa", - path: "crates/zed/src/main.rs", - selection: None, - }, + BuildPermalinkParams::new( + "b2efec9824c45fcc90c9a7eb107a50d1772a60aa", + &repo_path("crates/zed/src/main.rs"), + None, + ), ); let expected_url = "https://github.com/zed-industries/zed/blob/b2efec9824c45fcc90c9a7eb107a50d1772a60aa/crates/zed/src/main.rs"; @@ -420,11 +437,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", - path: "crates/editor/src/git/permalink.rs", - selection: Some(6..6), - }, + BuildPermalinkParams::new( + "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(6..6), + ), ); let expected_url = "https://github.com/zed-industries/zed/blob/e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7/crates/editor/src/git/permalink.rs#L7"; @@ -438,11 +455,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", - path: "crates/editor/src/git/permalink.rs", - selection: Some(23..47), - }, + BuildPermalinkParams::new( + "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(23..47), + ), ); let expected_url = "https://github.com/zed-industries/zed/blob/e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7/crates/editor/src/git/permalink.rs#L24-L48"; @@ -490,4 +507,23 @@ mod tests { }; assert_eq!(github.extract_pull_request(&remote, message), None); } + + /// Regression test for issue #39875 + #[test] + fn test_git_permalink_url_escaping() { + let permalink = Github::public_instance().build_permalink( + ParsedGitRemote { + owner: "zed-industries".into(), + repo: "nonexistent".into(), + }, + BuildPermalinkParams::new( + "3ef1539900037dd3601be7149b2b39ed6d0ce3db", + &repo_path("app/blog/[slug]/page.tsx"), + Some(7..7), + ), + ); + + let expected_url = "https://github.com/zed-industries/nonexistent/blob/3ef1539900037dd3601be7149b2b39ed6d0ce3db/app/blog/%5Bslug%5D/page.tsx#L8"; + assert_eq!(permalink.to_string(), expected_url.to_string()) + } } diff --git a/crates/git_hosting_providers/src/providers/gitlab.rs b/crates/git_hosting_providers/src/providers/gitlab.rs index 969a2ff1d5951400a38946531c1da4527462169a..d18af7cccae058a7b9746f7dfe86beef8d6fda94 100644 --- a/crates/git_hosting_providers/src/providers/gitlab.rs +++ b/crates/git_hosting_providers/src/providers/gitlab.rs @@ -126,6 +126,7 @@ impl GitHostingProvider for Gitlab { #[cfg(test)] mod tests { + use git::repository::repo_path; use pretty_assertions::assert_eq; use super::*; @@ -209,11 +210,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", - path: "crates/editor/src/git/permalink.rs", - selection: None, - }, + BuildPermalinkParams::new( + "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", + &repo_path("crates/editor/src/git/permalink.rs"), + None, + ), ); let expected_url = "https://gitlab.com/zed-industries/zed/-/blob/e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7/crates/editor/src/git/permalink.rs"; @@ -227,11 +228,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", - path: "crates/editor/src/git/permalink.rs", - selection: Some(6..6), - }, + BuildPermalinkParams::new( + "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(6..6), + ), ); let expected_url = "https://gitlab.com/zed-industries/zed/-/blob/e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7/crates/editor/src/git/permalink.rs#L7"; @@ -245,11 +246,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", - path: "crates/editor/src/git/permalink.rs", - selection: Some(23..47), - }, + BuildPermalinkParams::new( + "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(23..47), + ), ); let expected_url = "https://gitlab.com/zed-industries/zed/-/blob/e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7/crates/editor/src/git/permalink.rs#L24-48"; @@ -266,11 +267,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", - path: "crates/editor/src/git/permalink.rs", - selection: None, - }, + BuildPermalinkParams::new( + "e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7", + &repo_path("crates/editor/src/git/permalink.rs"), + None, + ), ); let expected_url = "https://gitlab.some-enterprise.com/zed-industries/zed/-/blob/e6ebe7974deb6bb6cc0e2595c8ec31f0c71084b7/crates/editor/src/git/permalink.rs"; @@ -287,11 +288,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "b2efec9824c45fcc90c9a7eb107a50d1772a60aa", - path: "crates/zed/src/main.rs", - selection: None, - }, + BuildPermalinkParams::new( + "b2efec9824c45fcc90c9a7eb107a50d1772a60aa", + &repo_path("crates/zed/src/main.rs"), + None, + ), ); let expected_url = "https://gitlab-instance.big-co.com/zed-industries/zed/-/blob/b2efec9824c45fcc90c9a7eb107a50d1772a60aa/crates/zed/src/main.rs"; diff --git a/crates/git_hosting_providers/src/providers/sourcehut.rs b/crates/git_hosting_providers/src/providers/sourcehut.rs index c64f72193da4f5affde69b61e27452cb831e9501..55bff551846b5f69bad8ccaeaccf3ad55868303f 100644 --- a/crates/git_hosting_providers/src/providers/sourcehut.rs +++ b/crates/git_hosting_providers/src/providers/sourcehut.rs @@ -89,6 +89,7 @@ impl GitHostingProvider for Sourcehut { #[cfg(test)] mod tests { + use git::repository::repo_path; use pretty_assertions::assert_eq; use super::*; @@ -145,11 +146,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "faa6f979be417239b2e070dbbf6392b909224e0b", - path: "crates/editor/src/git/permalink.rs", - selection: None, - }, + BuildPermalinkParams::new( + "faa6f979be417239b2e070dbbf6392b909224e0b", + &repo_path("crates/editor/src/git/permalink.rs"), + None, + ), ); let expected_url = "https://git.sr.ht/~zed-industries/zed/tree/faa6f979be417239b2e070dbbf6392b909224e0b/item/crates/editor/src/git/permalink.rs"; @@ -163,11 +164,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed.git".into(), }, - BuildPermalinkParams { - sha: "faa6f979be417239b2e070dbbf6392b909224e0b", - path: "crates/editor/src/git/permalink.rs", - selection: None, - }, + BuildPermalinkParams::new( + "faa6f979be417239b2e070dbbf6392b909224e0b", + &repo_path("crates/editor/src/git/permalink.rs"), + None, + ), ); let expected_url = "https://git.sr.ht/~zed-industries/zed.git/tree/faa6f979be417239b2e070dbbf6392b909224e0b/item/crates/editor/src/git/permalink.rs"; @@ -181,11 +182,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "faa6f979be417239b2e070dbbf6392b909224e0b", - path: "crates/editor/src/git/permalink.rs", - selection: Some(6..6), - }, + BuildPermalinkParams::new( + "faa6f979be417239b2e070dbbf6392b909224e0b", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(6..6), + ), ); let expected_url = "https://git.sr.ht/~zed-industries/zed/tree/faa6f979be417239b2e070dbbf6392b909224e0b/item/crates/editor/src/git/permalink.rs#L7"; @@ -199,11 +200,11 @@ mod tests { owner: "zed-industries".into(), repo: "zed".into(), }, - BuildPermalinkParams { - sha: "faa6f979be417239b2e070dbbf6392b909224e0b", - path: "crates/editor/src/git/permalink.rs", - selection: Some(23..47), - }, + BuildPermalinkParams::new( + "faa6f979be417239b2e070dbbf6392b909224e0b", + &repo_path("crates/editor/src/git/permalink.rs"), + Some(23..47), + ), ); let expected_url = "https://git.sr.ht/~zed-industries/zed/tree/faa6f979be417239b2e070dbbf6392b909224e0b/item/crates/editor/src/git/permalink.rs#L24-48"; diff --git a/crates/git_hosting_providers/src/settings.rs b/crates/git_hosting_providers/src/settings.rs index 3249981db91015479bab728484341519db357683..9a1625c8debac5fc83004eae26e6b9673a17290c 100644 --- a/crates/git_hosting_providers/src/settings.rs +++ b/crates/git_hosting_providers/src/settings.rs @@ -1,11 +1,8 @@ use std::sync::Arc; -use anyhow::Result; use git::GitHostingProviderRegistry; use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsStore, SettingsUi}; +use settings::{GitHostingProviderConfig, GitHostingProviderKind, Settings, SettingsStore}; use url::Url; use util::ResultExt as _; @@ -55,43 +52,20 @@ fn update_git_hosting_providers_from_settings(cx: &mut App) { provider_registry.set_setting_providers(iter); } -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum GitHostingProviderKind { - Github, - Gitlab, - Bitbucket, -} - -/// A custom Git hosting provider. -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] -pub struct GitHostingProviderConfig { - /// The type of the provider. - /// - /// Must be one of `github`, `gitlab`, or `bitbucket`. - pub provider: GitHostingProviderKind, - - /// The base URL for the provider (e.g., "https://code.corp.big.com"). - pub base_url: String, - - /// The display name for the provider (e.g., "BigCorp GitHub"). - pub name: String, -} - -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] +#[derive(Debug, Clone)] pub struct GitHostingProviderSettings { - /// The list of custom Git hosting providers. - #[serde(default)] pub git_hosting_providers: Vec, } impl Settings for GitHostingProviderSettings { - type FileContent = Self; - - fn load(sources: settings::SettingsSources, _: &mut App) -> Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + Self { + git_hosting_providers: content + .project + .git_hosting_providers + .clone() + .unwrap() + .into(), + } } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } diff --git a/crates/git_ui/Cargo.toml b/crates/git_ui/Cargo.toml index 35f7a603544ae72134a2c6c1b08dcb8a0119b79b..6905b3eb890b5ac96d9ccd75a08dd88f0288787b 100644 --- a/crates/git_ui/Cargo.toml +++ b/crates/git_ui/Cargo.toml @@ -48,7 +48,6 @@ postage.workspace = true project.workspace = true schemars.workspace = true serde.workspace = true -serde_derive.workspace = true serde_json.workspace = true settings.workspace = true strum.workspace = true @@ -62,6 +61,7 @@ watch.workspace = true workspace-hack.workspace = true workspace.workspace = true zed_actions.workspace = true +zeroize.workspace = true [target.'cfg(windows)'.dependencies] windows.workspace = true diff --git a/crates/git_ui/src/askpass_modal.rs b/crates/git_ui/src/askpass_modal.rs index 149833ad3535bb69ba35e199ece5166e194745a9..bbd507cfc4cce55f02e3c77a4317a6ca69049987 100644 --- a/crates/git_ui/src/askpass_modal.rs +++ b/crates/git_ui/src/askpass_modal.rs @@ -1,18 +1,22 @@ +use askpass::EncryptedPassword; use editor::Editor; use futures::channel::oneshot; use gpui::{AppContext, DismissEvent, Entity, EventEmitter, Focusable, Styled}; use ui::{ - ActiveTheme, App, Context, DynamicSpacing, Headline, HeadlineSize, Icon, IconName, IconSize, - InteractiveElement, IntoElement, ParentElement, Render, SharedString, StyledExt, - StyledTypography, Window, div, h_flex, v_flex, + ActiveTheme, AnyElement, App, Button, Clickable, Color, Context, DynamicSpacing, Headline, + HeadlineSize, Icon, IconName, IconSize, InteractiveElement, IntoElement, Label, LabelCommon, + LabelSize, ParentElement, Render, SharedString, StyledExt, StyledTypography, Window, div, + h_flex, v_flex, }; +use util::maybe; use workspace::ModalView; +use zeroize::Zeroize; pub(crate) struct AskPassModal { operation: SharedString, prompt: SharedString, editor: Entity, - tx: Option>, + tx: Option>, } impl EventEmitter for AskPassModal {} @@ -27,13 +31,13 @@ impl AskPassModal { pub fn new( operation: SharedString, prompt: SharedString, - tx: oneshot::Sender, + tx: oneshot::Sender, window: &mut Window, cx: &mut Context, ) -> Self { let editor = cx.new(|cx| { let mut editor = Editor::single_line(window, cx); - if prompt.contains("yes/no") { + if prompt.contains("yes/no") || prompt.contains("Username") { editor.set_masked(false, cx); } else { editor.set_masked(true, cx); @@ -52,12 +56,52 @@ impl AskPassModal { cx.emit(DismissEvent); } - fn confirm(&mut self, _: &menu::Confirm, _window: &mut Window, cx: &mut Context) { - if let Some(tx) = self.tx.take() { - tx.send(self.editor.read(cx).text(cx)).ok(); - } + fn confirm(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { + maybe!({ + let tx = self.tx.take()?; + let mut text = self.editor.update(cx, |this, cx| { + let text = this.text(cx); + this.clear(window, cx); + text + }); + let pw = askpass::EncryptedPassword::try_from(text.as_ref()).ok()?; + text.zeroize(); + tx.send(pw).ok(); + Some(()) + }); + cx.emit(DismissEvent); } + + fn render_hint(&mut self, cx: &mut Context) -> Option { + let color = cx.theme().status().info_background; + if (self.prompt.contains("Password") || self.prompt.contains("Username")) + && self.prompt.contains("github.com") + { + return Some( + div() + .p_2() + .bg(color) + .border_t_1() + .border_color(cx.theme().status().info_border) + .child( + h_flex().gap_2() + .child( + Icon::new(IconName::Github).size(IconSize::Small) + ) + .child( + Label::new("You may need to configure git for Github.") + .size(LabelSize::Small), + ) + .child(Button::new("learn-more", "Learn more").color(Color::Accent).label_size(LabelSize::Small).on_click(|_, _, cx| { + cx.open_url("https://docs.github.com/en/get-started/git-basics/set-up-git#authenticating-with-github-from-git") + })), + ) + .into_any_element(), + ); + } + None + } } impl Render for AskPassModal { @@ -68,9 +112,9 @@ impl Render for AskPassModal { .on_action(cx.listener(Self::confirm)) .elevation_2(cx) .size_full() - .font_buffer(cx) .child( h_flex() + .font_buffer(cx) .px(DynamicSpacing::Base12.rems(cx)) .pt(DynamicSpacing::Base08.rems(cx)) .pb(DynamicSpacing::Base04.rems(cx)) @@ -86,6 +130,7 @@ impl Render for AskPassModal { ) .child( div() + .font_buffer(cx) .text_buffer(cx) .py_2() .px_3() @@ -97,5 +142,6 @@ impl Render for AskPassModal { .child(self.prompt.clone()) .child(self.editor.clone()), ) + .children(self.render_hint(cx)) } } diff --git a/crates/git_ui/src/blame_ui.rs b/crates/git_ui/src/blame_ui.rs index 31a94ffa284521b2d4ba5a31cc83b7fa1bd3bea1..0fb6edfa71b0051fec19342a2621dc163e5b8511 100644 --- a/crates/git_ui/src/blame_ui.rs +++ b/crates/git_ui/src/blame_ui.rs @@ -1,5 +1,5 @@ use crate::{ - commit_tooltip::{CommitAvatar, CommitDetails, CommitTooltip}, + commit_tooltip::{CommitAvatar, CommitTooltip}, commit_view::CommitView, }; use editor::{BlameRenderer, Editor, hover_markdown_style}; @@ -39,6 +39,7 @@ impl BlameRenderer for GitBlameRenderer { editor: Entity, ix: usize, sha_color: Hsla, + window: &mut Window, cx: &mut App, ) -> Option { let relative_timestamp = blame_entry_relative_timestamp(&blame_entry); @@ -46,76 +47,95 @@ impl BlameRenderer for GitBlameRenderer { let author_name = blame_entry.author.as_deref().unwrap_or(""); let name = util::truncate_and_trailoff(author_name, GIT_BLAME_MAX_AUTHOR_CHARS_DISPLAYED); + let avatar = if ProjectSettings::get_global(cx).git.blame.show_avatar { + CommitAvatar::new( + &blame_entry.sha.to_string().into(), + details.as_ref().and_then(|it| it.remote.as_ref()), + ) + .render(window, cx) + } else { + None + }; Some( - h_flex() - .w_full() - .justify_between() - .font_family(style.font().family) - .line_height(style.line_height) - .id(("blame", ix)) - .text_color(cx.theme().status().hint) - .pr_2() - .gap_2() + div() + .mr_2() .child( h_flex() - .items_center() + .w_full() + .justify_between() + .font_family(style.font().family) + .line_height(style.line_height) + .id(("blame", ix)) + .text_color(cx.theme().status().hint) .gap_2() - .child(div().text_color(sha_color).child(short_commit_id)) - .child(name), - ) - .child(relative_timestamp) - .hover(|style| style.bg(cx.theme().colors().element_hover)) - .cursor_pointer() - .on_mouse_down(MouseButton::Right, { - let blame_entry = blame_entry.clone(); - let details = details.clone(); - move |event, window, cx| { - deploy_blame_entry_context_menu( - &blame_entry, - details.as_ref(), - editor.clone(), - event.position, - window, - cx, - ); - } - }) - .on_click({ - let blame_entry = blame_entry.clone(); - let repository = repository.clone(); - let workspace = workspace.clone(); - move |_, window, cx| { - CommitView::open( - CommitSummary { - sha: blame_entry.sha.to_string().into(), - subject: blame_entry.summary.clone().unwrap_or_default().into(), - commit_timestamp: blame_entry.committer_time.unwrap_or_default(), - author_name: blame_entry - .committer_name - .clone() - .unwrap_or_default() - .into(), - has_parent: true, - }, - repository.downgrade(), - workspace.clone(), - window, - cx, + .child( + h_flex() + .items_center() + .gap_2() + .child(div().text_color(sha_color).child(short_commit_id)) + .children(avatar) + .child(name), ) - } - }) - .hoverable_tooltip(move |_window, cx| { - cx.new(|cx| { - CommitTooltip::blame_entry( - &blame_entry, - details.clone(), - repository.clone(), - workspace.clone(), - cx, - ) - }) - .into() - }) + .child(relative_timestamp) + .hover(|style| style.bg(cx.theme().colors().element_hover)) + .cursor_pointer() + .on_mouse_down(MouseButton::Right, { + let blame_entry = blame_entry.clone(); + let details = details.clone(); + move |event, window, cx| { + deploy_blame_entry_context_menu( + &blame_entry, + details.as_ref(), + editor.clone(), + event.position, + window, + cx, + ); + } + }) + .on_click({ + let blame_entry = blame_entry.clone(); + let repository = repository.clone(); + let workspace = workspace.clone(); + move |_, window, cx| { + CommitView::open( + CommitSummary { + sha: blame_entry.sha.to_string().into(), + subject: blame_entry + .summary + .clone() + .unwrap_or_default() + .into(), + commit_timestamp: blame_entry + .committer_time + .unwrap_or_default(), + author_name: blame_entry + .committer_name + .clone() + .unwrap_or_default() + .into(), + has_parent: true, + }, + repository.downgrade(), + workspace.clone(), + window, + cx, + ) + } + }) + .hoverable_tooltip(move |_window, cx| { + cx.new(|cx| { + CommitTooltip::blame_entry( + &blame_entry, + details.clone(), + repository.clone(), + workspace.clone(), + cx, + ) + }) + .into() + }), + ) .into_any(), ) } @@ -130,7 +150,8 @@ impl BlameRenderer for GitBlameRenderer { let author = blame_entry.author.as_deref().unwrap_or_default(); let summary_enabled = ProjectSettings::get_global(cx) .git - .show_inline_commit_summary(); + .inline_blame + .show_commit_summary; let text = match blame_entry.summary.as_ref() { Some(summary) if summary_enabled => { @@ -169,31 +190,22 @@ impl BlameRenderer for GitBlameRenderer { .and_then(|t| OffsetDateTime::from_unix_timestamp(t).ok()) .unwrap_or(OffsetDateTime::now_utc()); - let commit_details = CommitDetails { - sha: blame.sha.to_string().into(), - commit_time, - author_name: blame - .author - .clone() - .unwrap_or("".to_string()) - .into(), - author_email: blame.author_mail.unwrap_or("".to_string()).into(), - message: details, - }; - - let avatar = CommitAvatar::new(&commit_details).render(window, cx); - - let author = commit_details.author_name.clone(); - let author_email = commit_details.author_email.clone(); + let sha = blame.sha.to_string().into(); + let author: SharedString = blame + .author + .clone() + .unwrap_or("".to_string()) + .into(); + let author_email = blame.author_mail.as_deref().unwrap_or_default(); + let avatar = CommitAvatar::new(&sha, details.as_ref().and_then(|it| it.remote.as_ref())) + .render(window, cx); - let short_commit_id = commit_details - .sha - .get(0..8) + let short_commit_id = sha + .get(..8) .map(|sha| sha.to_string().into()) - .unwrap_or_else(|| commit_details.sha.clone()); - let full_sha = commit_details.sha.to_string(); + .unwrap_or_else(|| sha.clone()); let absolute_timestamp = format_local_timestamp( - commit_details.commit_time, + commit_time, OffsetDateTime::now_utc(), time_format::TimestampFormat::MediumAbsolute, ); @@ -205,164 +217,142 @@ impl BlameRenderer for GitBlameRenderer { style }; - let message = commit_details - .message + let message = details .as_ref() .map(|_| MarkdownElement::new(markdown.clone(), markdown_style).into_any()) .unwrap_or("".into_any()); - let pull_request = commit_details - .message + let pull_request = details .as_ref() .and_then(|details| details.pull_request.clone()); let ui_font_size = ThemeSettings::get_global(cx).ui_font_size(cx); let message_max_height = window.line_height() * 12 + (ui_font_size / 0.4); let commit_summary = CommitSummary { - sha: commit_details.sha.clone(), - subject: commit_details - .message + sha: sha.clone(), + subject: details .as_ref() - .map_or(Default::default(), |message| { - message - .message - .split('\n') - .next() - .unwrap() - .trim_end() - .to_string() - .into() - }), - commit_timestamp: commit_details.commit_time.unix_timestamp(), - author_name: commit_details.author_name.clone(), + .and_then(|details| { + Some( + details + .message + .split('\n') + .next()? + .trim_end() + .to_string() + .into(), + ) + }) + .unwrap_or_default(), + commit_timestamp: commit_time.unix_timestamp(), + author_name: author.clone(), has_parent: false, }; - let ui_font = ThemeSettings::get_global(cx).ui_font.clone(); - - // padding to avoid tooltip appearing right below the mouse cursor - // TODO: use tooltip_container here Some( - div() - .pl_2() - .pt_2p5() - .child( - v_flex() - .elevation_2(cx) - .font(ui_font) - .text_ui(cx) - .text_color(cx.theme().colors().text) - .py_1() - .px_2() - .map(|el| { - el.occlude() - .on_mouse_move(|_, _, cx| cx.stop_propagation()) - .on_mouse_down(MouseButton::Left, |_, _, cx| cx.stop_propagation()) - .child( - v_flex() - .w(gpui::rems(30.)) - .gap_4() - .child( - h_flex() - .pb_1p5() - .gap_x_2() - .overflow_x_hidden() - .flex_wrap() - .children(avatar) - .child(author) - .when(!author_email.is_empty(), |this| { - this.child( - div() - .text_color( - cx.theme().colors().text_muted, - ) - .child(author_email), - ) - }) - .border_b_1() - .border_color(cx.theme().colors().border_variant), - ) - .child( + tooltip_container(cx, |d, cx| { + d.occlude() + .on_mouse_move(|_, _, cx| cx.stop_propagation()) + .on_mouse_down(MouseButton::Left, |_, _, cx| cx.stop_propagation()) + .child( + v_flex() + .w(gpui::rems(30.)) + .gap_4() + .child( + h_flex() + .pb_1p5() + .gap_x_2() + .overflow_x_hidden() + .flex_wrap() + .children(avatar) + .child(author) + .when(!author_email.is_empty(), |this| { + this.child( div() - .id("inline-blame-commit-message") - .child(message) - .max_h(message_max_height) - .overflow_y_scroll() - .track_scroll(&scroll_handle), - ) - .child( - h_flex() .text_color(cx.theme().colors().text_muted) - .w_full() - .justify_between() - .pt_1p5() - .border_t_1() - .border_color(cx.theme().colors().border_variant) - .child(absolute_timestamp) - .child( - h_flex() - .gap_1p5() - .when_some(pull_request, |this, pr| { - this.child( - Button::new( - "pull-request-button", - format!("#{}", pr.number), - ) - .color(Color::Muted) - .icon(IconName::PullRequest) - .icon_color(Color::Muted) - .icon_position(IconPosition::Start) - .style(ButtonStyle::Subtle) - .on_click(move |_, _, cx| { - cx.stop_propagation(); - cx.open_url(pr.url.as_str()) - }), - ) - }) - .child(Divider::vertical()) - .child( - Button::new( - "commit-sha-button", - short_commit_id.clone(), - ) - .style(ButtonStyle::Subtle) - .color(Color::Muted) - .icon(IconName::FileGit) - .icon_color(Color::Muted) - .icon_position(IconPosition::Start) - .on_click(move |_, window, cx| { - CommitView::open( - commit_summary.clone(), - repository.downgrade(), - workspace.clone(), - window, - cx, - ); - cx.stop_propagation(); - }), + .child(author_email.to_owned()), + ) + }) + .border_b_1() + .border_color(cx.theme().colors().border_variant), + ) + .child( + div() + .id("inline-blame-commit-message") + .child(message) + .max_h(message_max_height) + .overflow_y_scroll() + .track_scroll(&scroll_handle), + ) + .child( + h_flex() + .text_color(cx.theme().colors().text_muted) + .w_full() + .justify_between() + .pt_1p5() + .border_t_1() + .border_color(cx.theme().colors().border_variant) + .child(absolute_timestamp) + .child( + h_flex() + .gap_1p5() + .when_some(pull_request, |this, pr| { + this.child( + Button::new( + "pull-request-button", + format!("#{}", pr.number), + ) + .color(Color::Muted) + .icon(IconName::PullRequest) + .icon_color(Color::Muted) + .icon_position(IconPosition::Start) + .style(ButtonStyle::Subtle) + .on_click(move |_, _, cx| { + cx.stop_propagation(); + cx.open_url(pr.url.as_str()) + }), + ) + }) + .child(Divider::vertical()) + .child( + Button::new( + "commit-sha-button", + short_commit_id.clone(), + ) + .style(ButtonStyle::Subtle) + .color(Color::Muted) + .icon(IconName::FileGit) + .icon_color(Color::Muted) + .icon_position(IconPosition::Start) + .on_click(move |_, window, cx| { + CommitView::open( + commit_summary.clone(), + repository.downgrade(), + workspace.clone(), + window, + cx, + ); + cx.stop_propagation(); + }), + ) + .child( + IconButton::new("copy-sha-button", IconName::Copy) + .icon_size(IconSize::Small) + .icon_color(Color::Muted) + .on_click(move |_, _, cx| { + cx.stop_propagation(); + cx.write_to_clipboard( + ClipboardItem::new_string( + sha.to_string(), + ), ) - .child( - IconButton::new( - "copy-sha-button", - IconName::Copy, - ) - .icon_size(IconSize::Small) - .icon_color(Color::Muted) - .on_click(move |_, _, cx| { - cx.stop_propagation(); - cx.write_to_clipboard( - ClipboardItem::new_string( - full_sha.clone(), - ), - ) - }), - ), - ), - ), - ) - }), - ) - .into_any_element(), + }), + ), + ), + ), + ) + }) + .into_any_element(), ) } diff --git a/crates/git_ui/src/branch_picker.rs b/crates/git_ui/src/branch_picker.rs index 42558b7b79bca1892b9d36ae4b39bb3cdb196d4f..b9a8dfea9ea167bf7ee807ee2b459444f4fa4f4d 100644 --- a/crates/git_ui/src/branch_picker.rs +++ b/crates/git_ui/src/branch_picker.rs @@ -521,6 +521,14 @@ impl PickerDelegate for BranchListDelegate { .inset(true) .spacing(ListItemSpacing::Sparse) .toggle_state(selected) + .tooltip({ + let branch_name = entry.branch.name().to_string(); + if entry.is_new { + Tooltip::text(format!("Create branch \"{}\"", branch_name)) + } else { + Tooltip::text(branch_name) + } + }) .child( v_flex() .w_full() @@ -556,7 +564,6 @@ impl PickerDelegate for BranchListDelegate { let show_author_name = ProjectSettings::get_global(cx) .git .branch_picker - .unwrap_or_default() .show_author_name; subject.map_or("no commits found".into(), |subject| { diff --git a/crates/git_ui/src/commit_modal.rs b/crates/git_ui/src/commit_modal.rs index a2f84726543af50312dc24d0fcd9e0486b51d9c5..6c93e03e4bf4009a622206195c12b49bbedf4038 100644 --- a/crates/git_ui/src/commit_modal.rs +++ b/crates/git_ui/src/commit_modal.rs @@ -40,7 +40,8 @@ impl ModalContainerProperties { let font_size = style.font_size.to_pixels(window.rem_size()); if let Ok(em_width) = window.text_system().em_width(font_id, font_size) { - modal_width = preferred_char_width as f32 * em_width.0 + (container_padding * 2.0); + modal_width = + f32::from(preferred_char_width as f32 * em_width + px(container_padding * 2.0)); } Self { @@ -368,10 +369,6 @@ impl CommitModal { .icon_color(Color::Placeholder) .color(Color::Muted) .icon_position(IconPosition::Start) - .tooltip(Tooltip::for_action_title( - "Switch Branch", - &zed_actions::git::Branch, - )) .on_click(cx.listener(|_, _, window, cx| { window.dispatch_action(zed_actions::git::Branch.boxed_clone(), cx); })) @@ -459,7 +456,11 @@ impl CommitModal { if can_commit { Tooltip::with_meta_in( tooltip, - Some(&git::Commit), + Some(if is_amend_pending { + &git::Amend + } else { + &git::Commit + }), format!( "git commit{}{}", if is_amend_pending { " --amend" } else { "" }, diff --git a/crates/git_ui/src/commit_tooltip.rs b/crates/git_ui/src/commit_tooltip.rs index 1c7a0050a562787a2704b00a0ea1ad13b87ce416..0868d379f5e74b4336e477ef49808d4bba501e5c 100644 --- a/crates/git_ui/src/commit_tooltip.rs +++ b/crates/git_ui/src/commit_tooltip.rs @@ -28,25 +28,33 @@ pub struct CommitDetails { } pub struct CommitAvatar<'a> { - commit: &'a CommitDetails, + sha: &'a SharedString, + remote: Option<&'a GitRemote>, } impl<'a> CommitAvatar<'a> { - pub fn new(details: &'a CommitDetails) -> Self { - Self { commit: details } + pub fn new(sha: &'a SharedString, remote: Option<&'a GitRemote>) -> Self { + Self { sha, remote } + } + + pub fn from_commit_details(details: &'a CommitDetails) -> Self { + Self { + sha: &details.sha, + remote: details + .message + .as_ref() + .and_then(|details| details.remote.as_ref()), + } } } impl<'a> CommitAvatar<'a> { pub fn render(&'a self, window: &mut Window, cx: &mut App) -> Option> { let remote = self - .commit - .message - .as_ref() - .and_then(|details| details.remote.clone()) + .remote .filter(|remote| remote.host_supports_avatars())?; - let avatar_url = CommitAvatarAsset::new(remote, self.commit.sha.clone()); + let avatar_url = CommitAvatarAsset::new(remote.clone(), self.sha.clone()); let element = match window.use_asset::(&avatar_url, cx) { // Loading or no avatar found @@ -169,7 +177,7 @@ impl CommitTooltip { impl Render for CommitTooltip { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - let avatar = CommitAvatar::new(&self.commit).render(window, cx); + let avatar = CommitAvatar::from_commit_details(&self.commit).render(window, cx); let author = self.commit.author_name.clone(); @@ -233,7 +241,7 @@ impl Render for CommitTooltip { has_parent: false, }; - tooltip_container(window, cx, move |this, _, cx| { + tooltip_container(cx, move |this, cx| { this.occlude() .on_mouse_move(|_, _, cx| cx.stop_propagation()) .on_mouse_down(MouseButton::Left, |_, _, cx| cx.stop_propagation()) diff --git a/crates/git_ui/src/commit_view.rs b/crates/git_ui/src/commit_view.rs index ac51cee8e42567a607891dd242c2bf103ae7fc0e..201a699e2f0e8527ed62babdc941febcf9426a2d 100644 --- a/crates/git_ui/src/commit_view.rs +++ b/crates/git_ui/src/commit_view.rs @@ -14,13 +14,12 @@ use multi_buffer::PathKey; use project::{Project, WorktreeId, git_store::Repository}; use std::{ any::{Any, TypeId}, - ffi::OsStr, fmt::Write as _, - path::{Path, PathBuf}, + path::PathBuf, sync::Arc, }; use ui::{Color, Icon, IconName, Label, LabelCommon as _, SharedString}; -use util::{ResultExt, truncate_and_trailoff}; +use util::{ResultExt, paths::PathStyle, rel_path::RelPath, truncate_and_trailoff}; use workspace::{ Item, ItemHandle as _, ItemNavHistory, ToolbarItemLocation, Workspace, item::{BreadcrumbText, ItemEvent, TabContentParams}, @@ -40,12 +39,12 @@ struct GitBlob { } struct CommitMetadataFile { - title: Arc, + title: Arc, worktree_id: WorktreeId, } -const COMMIT_METADATA_NAMESPACE: u32 = 0; -const FILE_NAMESPACE: u32 = 1; +const COMMIT_METADATA_SORT_PREFIX: u64 = 0; +const FILE_NAMESPACE_SORT_PREFIX: u64 = 1; impl CommitView { pub fn open( @@ -129,7 +128,9 @@ impl CommitView { let mut metadata_buffer_id = None; if let Some(worktree_id) = first_worktree_id { let file = Arc::new(CommitMetadataFile { - title: PathBuf::from(format!("commit {}", commit.sha)).into(), + title: RelPath::unix(&format!("commit {}", commit.sha)) + .unwrap() + .into(), worktree_id, }); let buffer = cx.new(|cx| { @@ -144,7 +145,7 @@ impl CommitView { }); multibuffer.update(cx, |multibuffer, cx| { multibuffer.set_excerpts_for_path( - PathKey::namespaced(COMMIT_METADATA_NAMESPACE, file.title.clone()), + PathKey::with_sort_prefix(COMMIT_METADATA_SORT_PREFIX, file.title.clone()), buffer.clone(), vec![Point::zero()..buffer.read(cx).max_point()], 0, @@ -192,7 +193,7 @@ impl CommitView { .collect::>(); let path = snapshot.file().unwrap().path().clone(); let _is_newly_added = multibuffer.set_excerpts_for_path( - PathKey::namespaced(FILE_NAMESPACE, path), + PathKey::with_sort_prefix(FILE_NAMESPACE_SORT_PREFIX, path), buffer, diff_hunk_ranges, multibuffer_context_lines(cx), @@ -227,15 +228,19 @@ impl language::File for GitBlob { } } - fn path(&self) -> &Arc { + fn path_style(&self, _: &App) -> PathStyle { + PathStyle::Posix + } + + fn path(&self) -> &Arc { &self.path.0 } fn full_path(&self, _: &App) -> PathBuf { - self.path.to_path_buf() + self.path.as_std_path().to_path_buf() } - fn file_name<'a>(&'a self, _: &'a App) -> &'a OsStr { + fn file_name<'a>(&'a self, _: &'a App) -> &'a str { self.path.file_name().unwrap() } @@ -261,15 +266,19 @@ impl language::File for CommitMetadataFile { DiskState::New } - fn path(&self) -> &Arc { + fn path_style(&self, _: &App) -> PathStyle { + PathStyle::Posix + } + + fn path(&self) -> &Arc { &self.title } fn full_path(&self, _: &App) -> PathBuf { - self.title.as_ref().into() + PathBuf::from(self.title.as_unix_str().to_owned()) } - fn file_name<'a>(&'a self, _: &'a App) -> &'a OsStr { + fn file_name<'a>(&'a self, _: &'a App) -> &'a str { self.title.file_name().unwrap() } @@ -443,10 +452,6 @@ impl Item for CommitView { .update(cx, |editor, cx| editor.deactivated(window, cx)); } - fn is_singleton(&self, _: &App) -> bool { - false - } - fn act_as_type<'a>( &'a self, type_id: TypeId, @@ -513,6 +518,29 @@ impl Item for CommitView { editor.added_to_workspace(workspace, window, cx) }); } + + fn clone_on_split( + &self, + _workspace_id: Option, + window: &mut Window, + cx: &mut Context, + ) -> Option> + where + Self: Sized, + { + Some(cx.new(|cx| { + let editor = cx.new(|cx| { + self.editor + .update(cx, |editor, cx| editor.clone(window, cx)) + }); + let multibuffer = editor.read(cx).buffer().clone(); + Self { + editor, + multibuffer, + commit: self.commit.clone(), + } + })) + } } impl Render for CommitView { diff --git a/crates/git_ui/src/file_diff_view.rs b/crates/git_ui/src/file_diff_view.rs index a320888b3b409a79866818887b898ea853eb0609..387bda808708cf38beded2fe17edd92466885672 100644 --- a/crates/git_ui/src/file_diff_view.rs +++ b/crates/git_ui/src/file_diff_view.rs @@ -241,7 +241,7 @@ impl Item for FileDiffView { buffer .read(cx) .file() - .map(|file| file.full_path(cx).compact().to_string_lossy().to_string()) + .map(|file| file.full_path(cx).compact().to_string_lossy().into_owned()) .unwrap_or_else(|| "untitled".into()) }; let old_path = path(&self.old_buffer); @@ -263,10 +263,6 @@ impl Item for FileDiffView { .update(cx, |editor, cx| editor.deactivated(window, cx)); } - fn is_singleton(&self, _: &App) -> bool { - false - } - fn act_as_type<'a>( &'a self, type_id: TypeId, @@ -364,7 +360,7 @@ mod tests { use editor::test::editor_test_context::assert_state_with_diff; use gpui::TestAppContext; use project::{FakeFs, Fs, Project}; - use settings::{Settings, SettingsStore}; + use settings::SettingsStore; use std::path::PathBuf; use unindent::unindent; use util::path; @@ -378,7 +374,7 @@ mod tests { Project::init_settings(cx); workspace::init_settings(cx); editor::init_settings(cx); - theme::ThemeSettings::register(cx) + theme::init(theme::LoadThemes::JustBase, cx); }); } diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index 3063206723021d00aa21e0f8163b4fe3b941fcb7..ce6ddf43f6dbf1e4df32c45f7c96f7c08447df06 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -2,7 +2,6 @@ use crate::askpass_modal::AskPassModal; use crate::commit_modal::CommitModal; use crate::commit_tooltip::CommitTooltip; use crate::commit_view::CommitView; -use crate::git_panel_settings::StatusStyle; use crate::project_diff::{self, Diff, ProjectDiff}; use crate::remote_output::{self, RemoteAction, SuccessMessage}; use crate::{branch_picker, picker_prompt, render_remote_button}; @@ -47,14 +46,14 @@ use panel::{ panel_icon_button, }; use project::{ - DisableAiSettings, Fs, Project, ProjectPath, + Fs, Project, ProjectPath, git_store::{GitStoreEvent, Repository, RepositoryEvent, RepositoryId}, }; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore}; +use settings::{Settings, SettingsStore, StatusStyle}; use std::future::Future; use std::ops::Range; -use std::path::{Path, PathBuf}; +use std::path::Path; use std::{collections::HashSet, sync::Arc, time::Duration, usize}; use strum::{IntoEnumIterator, VariantNames}; use time::OffsetDateTime; @@ -62,6 +61,7 @@ use ui::{ Checkbox, CommonAnimationExt, ContextMenu, ElevationIndex, IconPosition, Label, LabelSize, PopoverMenu, ScrollAxes, Scrollbars, SplitButton, Tooltip, WithScrollbar, prelude::*, }; +use util::paths::PathStyle; use util::{ResultExt, TryFutureExt, maybe}; use workspace::SERIALIZATION_THROTTLE_TIME; @@ -252,23 +252,22 @@ impl GitListEntry { #[derive(Debug, PartialEq, Eq, Clone)] pub struct GitStatusEntry { pub(crate) repo_path: RepoPath, - pub(crate) abs_path: PathBuf, pub(crate) status: FileStatus, pub(crate) staging: StageStatus, } impl GitStatusEntry { - fn display_name(&self) -> String { + fn display_name(&self, path_style: PathStyle) -> String { self.repo_path .file_name() - .map(|name| name.to_string_lossy().into_owned()) - .unwrap_or_else(|| self.repo_path.to_string_lossy().into_owned()) + .map(|name| name.to_owned()) + .unwrap_or_else(|| self.repo_path.display(path_style).to_string()) } - fn parent_dir(&self) -> Option { + fn parent_dir(&self, path_style: PathStyle) -> Option { self.repo_path .parent() - .map(|parent| parent.to_string_lossy().into_owned()) + .map(|parent| parent.display(path_style).to_string()) } } @@ -348,7 +347,7 @@ pub(crate) fn commit_message_editor( let max_lines = if in_panel { MAX_PANEL_EDITOR_LINES } else { 18 }; let mut commit_editor = Editor::new( EditorMode::AutoHeight { - min_lines: 1, + min_lines: max_lines, max_lines: Some(max_lines), }, buffer, @@ -387,6 +386,7 @@ impl GitPanel { cx.observe_global_in::(window, move |this, window, cx| { let is_sort_by_path = GitPanelSettings::get_global(cx).sort_by_path; if is_sort_by_path != was_sort_by_path { + this.entries.clear(); this.update_visible_entries(window, cx); } was_sort_by_path = is_sort_by_path @@ -406,15 +406,11 @@ impl GitPanel { let scroll_handle = UniformListScrollHandle::new(); - let mut assistant_enabled = AgentSettings::get_global(cx).enabled; - let mut was_ai_disabled = DisableAiSettings::get_global(cx).disable_ai; + let mut was_ai_enabled = AgentSettings::get_global(cx).enabled(cx); let _settings_subscription = cx.observe_global::(move |_, cx| { - let is_ai_disabled = DisableAiSettings::get_global(cx).disable_ai; - if assistant_enabled != AgentSettings::get_global(cx).enabled - || was_ai_disabled != is_ai_disabled - { - assistant_enabled = AgentSettings::get_global(cx).enabled; - was_ai_disabled = is_ai_disabled; + let is_ai_enabled = AgentSettings::get_global(cx).enabled(cx); + if was_ai_enabled != is_ai_enabled { + was_ai_enabled = is_ai_enabled; cx.notify(); } }); @@ -831,6 +827,7 @@ impl GitPanel { window: &mut Window, cx: &mut Context, ) { + let path_style = self.project.read(cx).path_style(cx); maybe!({ let list_entry = self.entries.get(self.selected_entry?)?.clone(); let entry = list_entry.status_entry()?.to_owned(); @@ -846,8 +843,7 @@ impl GitPanel { entry .repo_path .file_name() - .unwrap_or(entry.repo_path.as_os_str()) - .to_string_lossy() + .unwrap_or(entry.repo_path.display(path_style).as_ref()), ), None, &["Restore", "Cancel"], @@ -874,6 +870,77 @@ impl GitPanel { }); } + fn add_to_gitignore( + &mut self, + _: &git::AddToGitignore, + _window: &mut Window, + cx: &mut Context, + ) { + maybe!({ + let list_entry = self.entries.get(self.selected_entry?)?.clone(); + let entry = list_entry.status_entry()?.to_owned(); + + if !entry.status.is_created() { + return Some(()); + } + + let project = self.project.downgrade(); + let repo_path = entry.repo_path; + let active_repository = self.active_repository.as_ref()?.downgrade(); + + cx.spawn(async move |_, cx| { + let file_path_str = repo_path.0.display(PathStyle::Posix); + + let repo_root = active_repository.read_with(cx, |repository, _| { + repository.snapshot().work_directory_abs_path + })?; + + let gitignore_abs_path = repo_root.join(".gitignore"); + + let buffer = project + .update(cx, |project, cx| { + project.open_local_buffer(gitignore_abs_path, cx) + })? + .await?; + + let mut should_save = false; + buffer.update(cx, |buffer, cx| { + let existing_content = buffer.text(); + + if existing_content + .lines() + .any(|line| line.trim() == file_path_str) + { + return; + } + + let insert_position = existing_content.len(); + let new_entry = if existing_content.is_empty() { + format!("{}\n", file_path_str) + } else if existing_content.ends_with('\n') { + format!("{}\n", file_path_str) + } else { + format!("\n{}\n", file_path_str) + }; + + buffer.edit([(insert_position..insert_position, new_entry)], None, cx); + should_save = true; + })?; + + if should_save { + project + .update(cx, |project, cx| project.save_buffer(buffer, cx))? + .await?; + } + + anyhow::Ok(()) + }) + .detach_and_log_err(cx); + + Some(()) + }); + } + fn revert_entry( &mut self, entry: &GitStatusEntry, @@ -890,7 +957,7 @@ impl GitPanel { if entry.status.staging().has_staged() { self.change_file_stage(false, vec![entry.clone()], cx); } - let filename = path.path.file_name()?.to_string_lossy(); + let filename = path.path.file_name()?.to_string(); if !entry.status.is_created() { self.perform_checkout(vec![entry.clone()], window, cx); @@ -1033,7 +1100,7 @@ impl GitPanel { let mut details = entries .iter() .filter_map(|entry| entry.repo_path.0.file_name()) - .map(|filename| filename.to_string_lossy()) + .map(|filename| filename.to_string()) .take(5) .join("\n"); if entries.len() > 5 { @@ -1089,7 +1156,7 @@ impl GitPanel { .repo_path .0 .file_name() - .map(|f| f.to_string_lossy()) + .map(|f| f.to_string()) .unwrap_or_default() }) .take(5) @@ -1430,7 +1497,6 @@ impl GitPanel { self.load_last_commit_message_if_empty(cx); } else { telemetry::event!("Git Amended", source = "Git Panel"); - self.set_amend_pending(false, cx); self.commit_changes( CommitOptions { amend: true, @@ -1604,6 +1670,9 @@ impl GitPanel { }); self.pending_commit = Some(task); + if options.amend { + self.set_amend_pending(false, cx); + } } pub(crate) fn uncommit(&mut self, window: &mut Window, cx: &mut Context) { @@ -1724,7 +1793,7 @@ impl GitPanel { .repo_path .file_name() .unwrap_or_default() - .to_string_lossy(); + .to_string(); Some(format!("{} {}", action_text, file_name)) } @@ -1740,10 +1809,7 @@ impl GitPanel { /// Generates a commit message using an LLM. pub fn generate_commit_message(&mut self, cx: &mut Context) { - if !self.can_commit() - || DisableAiSettings::get_global(cx).disable_ai - || !agent_settings::AgentSettings::get_global(cx).enabled - { + if !self.can_commit() || !AgentSettings::get_global(cx).enabled(cx) { return; } @@ -1979,11 +2045,7 @@ impl GitPanel { cx.spawn_in(window, async move |this, cx| { let mut paths = path.await.ok()?.ok()??; let mut path = paths.pop()?; - let repo_name = repo - .split(std::path::MAIN_SEPARATOR_STR) - .last()? - .strip_suffix(".git")? - .to_owned(); + let repo_name = repo.split("/").last()?.strip_suffix(".git")?.to_owned(); let fs = this.read_with(cx, |this, _| this.fs.clone()).ok()?; @@ -2095,7 +2157,7 @@ impl GitPanel { .to_string() .into() } else { - worktree_abs_path.to_string_lossy().to_string().into() + worktree_abs_path.to_string_lossy().into_owned().into() } }) .collect_vec(); @@ -2439,8 +2501,9 @@ impl GitPanel { let workspace = workspace.read(cx); let fs = workspace.app_state().fs.clone(); cx.update_global::(|store, _cx| { - store.update_settings_file::(fs, move |settings, _cx| { - settings.sort_by_path = Some(!current_setting); + store.update_settings_file(fs, move |settings, _cx| { + settings.git_panel.get_or_insert_default().sort_by_path = + Some(!current_setting); }); }); } @@ -2563,6 +2626,7 @@ impl GitPanel { } fn update_visible_entries(&mut self, window: &mut Window, cx: &mut Context) { + let path_style = self.project.read(cx).path_style(cx); let bulk_staging = self.bulk_staging.take(); let last_staged_path_prev_index = bulk_staging .as_ref() @@ -2614,10 +2678,8 @@ impl GitPanel { continue; } - let abs_path = repo.work_directory_abs_path.join(&entry.repo_path.0); let entry = GitStatusEntry { repo_path: entry.repo_path.clone(), - abs_path, status: entry.status, staging, }; @@ -2628,8 +2690,8 @@ impl GitPanel { } let width_estimate = Self::item_width_estimate( - entry.parent_dir().map(|s| s.len()).unwrap_or(0), - entry.display_name().len(), + entry.parent_dir(path_style).map(|s| s.len()).unwrap_or(0), + entry.display_name(path_style).len(), ); match max_width_item.as_mut() { @@ -2996,8 +3058,7 @@ impl GitPanel { &self, cx: &Context, ) -> Option { - if !agent_settings::AgentSettings::get_global(cx).enabled - || DisableAiSettings::get_global(cx).disable_ai + if !agent_settings::AgentSettings::get_global(cx).enabled(cx) || LanguageModelRegistry::read_global(cx) .commit_message_model() .is_none() @@ -3453,7 +3514,6 @@ impl GitPanel { telemetry::event!("Git Committed", source = "Git Panel"); git_panel .update(cx, |git_panel, cx| { - git_panel.set_amend_pending(false, cx); git_panel.commit_changes( CommitOptions { amend, signoff }, window, @@ -3470,7 +3530,7 @@ impl GitPanel { if can_commit { Tooltip::with_meta_in( tooltip, - Some(&git::Commit), + Some(if amend { &git::Amend } else { &git::Commit }), format!( "git commit{}{}", if amend { " --amend" } else { "" }, @@ -3539,7 +3599,7 @@ impl GitPanel { div() .flex_grow() .overflow_hidden() - .max_w(relative(0.85)) + .line_clamp(1) .child( Label::new(commit.subject.clone()) .size(LabelSize::Small) @@ -3641,7 +3701,7 @@ impl GitPanel { cx: &App, ) -> Option { let repo = self.active_repository.as_ref()?.read(cx); - let project_path = (file.worktree_id(cx), file.path()).into(); + let project_path = (file.worktree_id(cx), file.path().clone()).into(); let repo_path = repo.project_path_to_repo_path(&project_path, cx)?; let ix = self.entry_by_path(&repo_path, cx)?; let entry = self.entries.get(ix)?; @@ -3748,7 +3808,10 @@ impl GitPanel { .custom_scrollbars( Scrollbars::for_settings::() .tracked_scroll_handle(self.scroll_handle.clone()) - .with_track_along(ScrollAxes::Horizontal), + .with_track_along( + ScrollAxes::Horizontal, + cx.theme().colors().panel_background, + ), window, cx, ), @@ -3825,10 +3888,17 @@ impl GitPanel { "Restore File" }; let context_menu = ContextMenu::build(window, cx, |context_menu, _, _| { - context_menu + let mut context_menu = context_menu .context(self.focus_handle.clone()) .action(stage_title, ToggleStaged.boxed_clone()) - .action(restore_title, git::RestoreFile::default().boxed_clone()) + .action(restore_title, git::RestoreFile::default().boxed_clone()); + + if entry.status.is_created() { + context_menu = + context_menu.action("Add to .gitignore", git::AddToGitignore.boxed_clone()); + } + + context_menu .separator() .action("Open Diff", Confirm.boxed_clone()) .action("Open File", SecondaryConfirm.boxed_clone()) @@ -3891,7 +3961,8 @@ impl GitPanel { window: &Window, cx: &Context, ) -> AnyElement { - let display_name = entry.display_name(); + let path_style = self.project.read(cx).path_style(cx); + let display_name = entry.display_name(path_style); let selected = self.selected_entry == Some(ix); let marked = self.marked_entries.contains(&ix); @@ -4064,11 +4135,14 @@ impl GitPanel { .items_center() .flex_1() // .overflow_hidden() - .when_some(entry.parent_dir(), |this, parent| { + .when_some(entry.parent_dir(path_style), |this, parent| { if !parent.is_empty() { this.child( - self.entry_label(format!("{}/", parent), path_color) - .when(status.is_deleted(), |this| this.strikethrough()), + self.entry_label( + format!("{parent}{}", path_style.separator()), + path_color, + ) + .when(status.is_deleted(), |this| this.strikethrough()), ) } else { this @@ -4247,6 +4321,7 @@ impl Render for GitPanel { .on_action(cx.listener(Self::unstage_selected)) .on_action(cx.listener(Self::restore_tracked_files)) .on_action(cx.listener(Self::revert_selected)) + .on_action(cx.listener(Self::add_to_gitignore)) .on_action(cx.listener(Self::clean_all)) .on_action(cx.listener(Self::generate_commit_message_action)) .on_action(cx.listener(Self::stash_all)) @@ -4353,11 +4428,9 @@ impl Panel for GitPanel { } fn set_position(&mut self, position: DockPosition, _: &mut Window, cx: &mut Context) { - settings::update_settings_file::( - self.fs.clone(), - cx, - move |settings, _| settings.dock = Some(position), - ); + settings::update_settings_file(self.fs.clone(), cx, move |settings, _| { + settings.git_panel.get_or_insert_default().dock = Some(position.into()) + }); } fn size(&self, _: &Window, cx: &App) -> Pixels { @@ -4557,7 +4630,6 @@ impl RenderOnce for PanelRepoFooter { }; let repo_selector_trigger = Button::new("repo-selector", truncated_repo_name) - .style(ButtonStyle::Transparent) .size(ButtonSize::None) .label_size(LabelSize::Small) .color(Color::Muted); @@ -4578,14 +4650,9 @@ impl RenderOnce for PanelRepoFooter { .into_any_element(); let branch_selector_button = Button::new("branch-selector", truncated_branch_name) - .style(ButtonStyle::Transparent) .size(ButtonSize::None) .label_size(LabelSize::Small) .truncate(true) - .tooltip(Tooltip::for_action_title( - "Switch Branch", - &zed_actions::git::Switch, - )) .on_click(|_, window, cx| { window.dispatch_action(zed_actions::git::Switch.boxed_clone(), cx); }); @@ -4603,34 +4670,31 @@ impl RenderOnce for PanelRepoFooter { }); h_flex() + .h(px(36.)) .w_full() .px_2() - .h(px(36.)) - .items_center() .justify_between() .gap_1() .child( h_flex() .flex_1() .overflow_hidden() - .items_center() + .gap_px() .child( - div().child( - Icon::new(IconName::GitBranchAlt) - .size(IconSize::Small) - .color(if single_repo { - Color::Disabled - } else { - Color::Muted - }), - ), + Icon::new(IconName::GitBranchAlt) + .size(IconSize::Small) + .color(if single_repo { + Color::Disabled + } else { + Color::Muted + }), ) .child(repo_selector) .when(show_separator, |this| { this.child( div() - .text_color(cx.theme().colors().text_muted) .text_sm() + .text_color(cx.theme().colors().icon_muted.opacity(0.5)) .child("/"), ) }) @@ -4899,13 +4963,17 @@ impl Component for PanelRepoFooter { #[cfg(test)] mod tests { - use git::status::{StatusCode, UnmergedStatus, UnmergedStatusCode}; - use gpui::{TestAppContext, VisualTestContext}; + use git::{ + repository::repo_path, + status::{StatusCode, UnmergedStatus, UnmergedStatusCode}, + }; + use gpui::{TestAppContext, UpdateGlobal, VisualTestContext}; use project::{FakeFs, WorktreeSettings}; use serde_json::json; use settings::SettingsStore; use theme::LoadThemes; use util::path; + use util::rel_path::rel_path; use super::*; @@ -4951,14 +5019,8 @@ mod tests { fs.set_status_for_repo( Path::new(path!("/root/zed/.git")), &[ - ( - Path::new("crates/gpui/gpui.rs"), - StatusCode::Modified.worktree(), - ), - ( - Path::new("crates/util/util.rs"), - StatusCode::Modified.worktree(), - ), + ("crates/gpui/gpui.rs", StatusCode::Modified.worktree()), + ("crates/util/util.rs", StatusCode::Modified.worktree()), ], ); @@ -4999,14 +5061,12 @@ mod tests { header: Section::Tracked }), GitListEntry::Status(GitStatusEntry { - abs_path: path!("/root/zed/crates/gpui/gpui.rs").into(), - repo_path: "crates/gpui/gpui.rs".into(), + repo_path: repo_path("crates/gpui/gpui.rs"), status: StatusCode::Modified.worktree(), staging: StageStatus::Unstaged, }), GitListEntry::Status(GitStatusEntry { - abs_path: path!("/root/zed/crates/util/util.rs").into(), - repo_path: "crates/util/util.rs".into(), + repo_path: repo_path("crates/util/util.rs"), status: StatusCode::Modified.worktree(), staging: StageStatus::Unstaged, },), @@ -5026,14 +5086,12 @@ mod tests { header: Section::Tracked }), GitListEntry::Status(GitStatusEntry { - abs_path: path!("/root/zed/crates/gpui/gpui.rs").into(), - repo_path: "crates/gpui/gpui.rs".into(), + repo_path: repo_path("crates/gpui/gpui.rs"), status: StatusCode::Modified.worktree(), staging: StageStatus::Unstaged, }), GitListEntry::Status(GitStatusEntry { - abs_path: path!("/root/zed/crates/util/util.rs").into(), - repo_path: "crates/util/util.rs".into(), + repo_path: repo_path("crates/util/util.rs"), status: StatusCode::Modified.worktree(), staging: StageStatus::Unstaged, },), @@ -5071,14 +5129,14 @@ mod tests { fs.set_status_for_repo( Path::new(path!("/root/project/.git")), &[ - (Path::new("src/main.rs"), StatusCode::Modified.worktree()), - (Path::new("src/lib.rs"), StatusCode::Modified.worktree()), - (Path::new("tests/test.rs"), StatusCode::Modified.worktree()), - (Path::new("new_file.txt"), FileStatus::Untracked), - (Path::new("another_new.rs"), FileStatus::Untracked), - (Path::new("src/utils.rs"), FileStatus::Untracked), + ("src/main.rs", StatusCode::Modified.worktree()), + ("src/lib.rs", StatusCode::Modified.worktree()), + ("tests/test.rs", StatusCode::Modified.worktree()), + ("new_file.txt", FileStatus::Untracked), + ("another_new.rs", FileStatus::Untracked), + ("src/utils.rs", FileStatus::Untracked), ( - Path::new("conflict.txt"), + "conflict.txt", UnmergedStatus { first_head: UnmergedStatusCode::Updated, second_head: UnmergedStatusCode::Updated, @@ -5233,6 +5291,242 @@ mod tests { ); } + #[gpui::test] + async fn test_bulk_staging_with_sort_by_paths(cx: &mut TestAppContext) { + use GitListEntry::*; + + init_test(cx); + let fs = FakeFs::new(cx.background_executor.clone()); + fs.insert_tree( + "/root", + json!({ + "project": { + ".git": {}, + "src": { + "main.rs": "fn main() {}", + "lib.rs": "pub fn hello() {}", + "utils.rs": "pub fn util() {}" + }, + "tests": { + "test.rs": "fn test() {}" + }, + "new_file.txt": "new content", + "another_new.rs": "// new file", + "conflict.txt": "conflicted content" + } + }), + ) + .await; + + fs.set_status_for_repo( + Path::new(path!("/root/project/.git")), + &[ + ("src/main.rs", StatusCode::Modified.worktree()), + ("src/lib.rs", StatusCode::Modified.worktree()), + ("tests/test.rs", StatusCode::Modified.worktree()), + ("new_file.txt", FileStatus::Untracked), + ("another_new.rs", FileStatus::Untracked), + ("src/utils.rs", FileStatus::Untracked), + ( + "conflict.txt", + UnmergedStatus { + first_head: UnmergedStatusCode::Updated, + second_head: UnmergedStatusCode::Updated, + } + .into(), + ), + ], + ); + + let project = Project::test(fs.clone(), [Path::new(path!("/root/project"))], cx).await; + let workspace = + cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let cx = &mut VisualTestContext::from_window(*workspace, cx); + + cx.read(|cx| { + project + .read(cx) + .worktrees(cx) + .next() + .unwrap() + .read(cx) + .as_local() + .unwrap() + .scan_complete() + }) + .await; + + cx.executor().run_until_parked(); + + let panel = workspace.update(cx, GitPanel::new).unwrap(); + + let handle = cx.update_window_entity(&panel, |panel, _, _| { + std::mem::replace(&mut panel.update_visible_entries_task, Task::ready(())) + }); + cx.executor().advance_clock(2 * UPDATE_DEBOUNCE); + handle.await; + + let entries = panel.read_with(cx, |panel, _| panel.entries.clone()); + #[rustfmt::skip] + pretty_assertions::assert_matches!( + entries.as_slice(), + &[ + Header(GitHeaderEntry { header: Section::Conflict }), + Status(GitStatusEntry { staging: StageStatus::Unstaged, .. }), + Header(GitHeaderEntry { header: Section::Tracked }), + Status(GitStatusEntry { staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { staging: StageStatus::Unstaged, .. }), + Header(GitHeaderEntry { header: Section::New }), + Status(GitStatusEntry { staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { staging: StageStatus::Unstaged, .. }), + ], + ); + + assert_entry_paths( + &entries, + &[ + None, + Some("conflict.txt"), + None, + Some("src/lib.rs"), + Some("src/main.rs"), + Some("tests/test.rs"), + None, + Some("another_new.rs"), + Some("new_file.txt"), + Some("src/utils.rs"), + ], + ); + + let second_status_entry = entries[3].clone(); + panel.update_in(cx, |panel, window, cx| { + panel.toggle_staged_for_entry(&second_status_entry, window, cx); + }); + + cx.update(|_window, cx| { + SettingsStore::update_global(cx, |store, cx| { + store.update_user_settings(cx, |settings| { + settings.git_panel.get_or_insert_default().sort_by_path = Some(true); + }) + }); + }); + + panel.update_in(cx, |panel, window, cx| { + panel.selected_entry = Some(7); + panel.stage_range(&git::StageRange, window, cx); + }); + + cx.read(|cx| { + project + .read(cx) + .worktrees(cx) + .next() + .unwrap() + .read(cx) + .as_local() + .unwrap() + .scan_complete() + }) + .await; + + cx.executor().run_until_parked(); + + let handle = cx.update_window_entity(&panel, |panel, _, _| { + std::mem::replace(&mut panel.update_visible_entries_task, Task::ready(())) + }); + cx.executor().advance_clock(2 * UPDATE_DEBOUNCE); + handle.await; + + let entries = panel.read_with(cx, |panel, _| panel.entries.clone()); + #[rustfmt::skip] + pretty_assertions::assert_matches!( + entries.as_slice(), + &[ + Status(GitStatusEntry { status: FileStatus::Untracked, staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Unmerged(..), staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Untracked, staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Tracked(..), staging: StageStatus::Staged, .. }), + Status(GitStatusEntry { status: FileStatus::Tracked(..), staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Untracked, staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Tracked(..), staging: StageStatus::Unstaged, .. }), + ], + ); + + assert_entry_paths( + &entries, + &[ + Some("another_new.rs"), + Some("conflict.txt"), + Some("new_file.txt"), + Some("src/lib.rs"), + Some("src/main.rs"), + Some("src/utils.rs"), + Some("tests/test.rs"), + ], + ); + + let third_status_entry = entries[4].clone(); + panel.update_in(cx, |panel, window, cx| { + panel.toggle_staged_for_entry(&third_status_entry, window, cx); + }); + + panel.update_in(cx, |panel, window, cx| { + panel.selected_entry = Some(9); + panel.stage_range(&git::StageRange, window, cx); + }); + + cx.read(|cx| { + project + .read(cx) + .worktrees(cx) + .next() + .unwrap() + .read(cx) + .as_local() + .unwrap() + .scan_complete() + }) + .await; + + cx.executor().run_until_parked(); + + let handle = cx.update_window_entity(&panel, |panel, _, _| { + std::mem::replace(&mut panel.update_visible_entries_task, Task::ready(())) + }); + cx.executor().advance_clock(2 * UPDATE_DEBOUNCE); + handle.await; + + let entries = panel.read_with(cx, |panel, _| panel.entries.clone()); + #[rustfmt::skip] + pretty_assertions::assert_matches!( + entries.as_slice(), + &[ + Status(GitStatusEntry { status: FileStatus::Untracked, staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Unmerged(..), staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Untracked, staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Tracked(..), staging: StageStatus::Staged, .. }), + Status(GitStatusEntry { status: FileStatus::Tracked(..), staging: StageStatus::Staged, .. }), + Status(GitStatusEntry { status: FileStatus::Untracked, staging: StageStatus::Unstaged, .. }), + Status(GitStatusEntry { status: FileStatus::Tracked(..), staging: StageStatus::Unstaged, .. }), + ], + ); + + assert_entry_paths( + &entries, + &[ + Some("another_new.rs"), + Some("conflict.txt"), + Some("new_file.txt"), + Some("src/lib.rs"), + Some("src/main.rs"), + Some("src/utils.rs"), + Some("tests/test.rs"), + ], + ); + } + #[gpui::test] async fn test_amend_commit_message_handling(cx: &mut TestAppContext) { init_test(cx); @@ -5252,7 +5546,7 @@ mod tests { fs.set_status_for_repo( Path::new(path!("/root/project/.git")), - &[(Path::new("src/main.rs"), StatusCode::Modified.worktree())], + &[("src/main.rs", StatusCode::Modified.worktree())], ); let project = Project::test(fs.clone(), [Path::new(path!("/root/project"))], cx).await; @@ -5301,4 +5595,81 @@ mod tests { assert_eq!(current_message, ""); }); } + + #[gpui::test] + async fn test_open_diff(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.background_executor.clone()); + fs.insert_tree( + path!("/project"), + json!({ + ".git": {}, + "tracked": "tracked\n", + "untracked": "\n", + }), + ) + .await; + + fs.set_head_and_index_for_repo( + path!("/project/.git").as_ref(), + &[("tracked", "old tracked\n".into())], + ); + + let project = Project::test(fs.clone(), [Path::new(path!("/project"))], cx).await; + let workspace = + cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let cx = &mut VisualTestContext::from_window(*workspace, cx); + let panel = workspace.update(cx, GitPanel::new).unwrap(); + + // Enable the `sort_by_path` setting and wait for entries to be updated, + // as there should no longer be separators between Tracked and Untracked + // files. + cx.update(|_window, cx| { + SettingsStore::update_global(cx, |store, cx| { + store.update_user_settings(cx, |settings| { + settings.git_panel.get_or_insert_default().sort_by_path = Some(true); + }) + }); + }); + + cx.update_window_entity(&panel, |panel, _, _| { + std::mem::replace(&mut panel.update_visible_entries_task, Task::ready(())) + }) + .await; + + // Confirm that `Open Diff` still works for the untracked file, updating + // the Project Diff's active path. + panel.update_in(cx, |panel, window, cx| { + panel.selected_entry = Some(1); + panel.open_diff(&Confirm, window, cx); + }); + cx.run_until_parked(); + + let _ = workspace.update(cx, |workspace, _window, cx| { + let active_path = workspace + .item_of_type::(cx) + .expect("ProjectDiff should exist") + .read(cx) + .active_path(cx) + .expect("active_path should exist"); + + assert_eq!(active_path.path, rel_path("untracked").into_arc()); + }); + } + + fn assert_entry_paths(entries: &[GitListEntry], expected_paths: &[Option<&str>]) { + assert_eq!(entries.len(), expected_paths.len()); + for (entry, expected_path) in entries.iter().zip(expected_paths) { + assert_eq!( + entry.status_entry().map(|status| status + .repo_path + .0 + .as_std_path() + .to_string_lossy() + .to_string()), + expected_path.map(|s| s.to_string()) + ); + } + } } diff --git a/crates/git_ui/src/git_panel_settings.rs b/crates/git_ui/src/git_panel_settings.rs index 74e8e25927f07ec1f159d12023669fab9e518114..f98493d1d9ef4bcf9b53393671091c8b72dcd998 100644 --- a/crates/git_ui/src/git_panel_settings.rs +++ b/crates/git_ui/src/git_panel_settings.rs @@ -1,85 +1,20 @@ use editor::EditorSettings; use gpui::Pixels; use schemars::JsonSchema; -use serde_derive::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; -use ui::scrollbars::{ScrollbarVisibility, ShowScrollbar}; +use serde::{Deserialize, Serialize}; +use settings::{Settings, SettingsContent, StatusStyle}; +use ui::{ + px, + scrollbars::{ScrollbarVisibility, ShowScrollbar}, +}; use workspace::dock::DockPosition; -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -pub struct ScrollbarSettingsContent { - /// When to show the scrollbar in the git panel. - /// - /// Default: inherits editor scrollbar settings - pub show: Option>, -} - #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] pub struct ScrollbarSettings { pub show: Option, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -// Style of the git status indicator in the panel. -// -// Default: icon -pub enum StatusStyleContent { - Icon, - LabelColor, -} - -#[derive(Default, Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum StatusStyle { - #[default] - Icon, - LabelColor, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[settings_key(key = "git_panel")] -pub struct GitPanelSettingsContent { - /// Whether to show the panel button in the status bar. - /// - /// Default: true - pub button: Option, - /// Where to dock the panel. - /// - /// Default: left - pub dock: Option, - /// Default width of the panel in pixels. - /// - /// Default: 360 - pub default_width: Option, - /// How entry statuses are displayed. - /// - /// Default: icon - pub status_style: Option, - /// How and when the scrollbar should be displayed. - /// - /// Default: inherits editor scrollbar settings - pub scrollbar: Option, - - /// What the default branch name should be when - /// `init.defaultBranch` is not set in git - /// - /// Default: main - pub fallback_branch_name: Option, - - /// Whether to sort entries in the panel by path - /// or by status (the default). - /// - /// Default: false - pub sort_by_path: Option, - - /// Whether to collapse untracked files in the diff panel. - /// - /// Default: false - pub collapse_untracked_diff: Option, -} - -#[derive(Deserialize, Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq)] pub struct GitPanelSettings { pub button: bool, pub dock: DockPosition, @@ -108,17 +43,31 @@ impl ScrollbarVisibility for GitPanelSettings { } impl Settings for GitPanelSettings { - type FileContent = GitPanelSettingsContent; - - fn load( - sources: SettingsSources, - _: &mut gpui::App, - ) -> anyhow::Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let git_panel = content.git_panel.clone().unwrap(); + Self { + button: git_panel.button.unwrap(), + dock: git_panel.dock.unwrap().into(), + default_width: px(git_panel.default_width.unwrap()), + status_style: git_panel.status_style.unwrap(), + scrollbar: ScrollbarSettings { + show: git_panel.scrollbar.unwrap().show.map(Into::into), + }, + fallback_branch_name: git_panel.fallback_branch_name.unwrap(), + sort_by_path: git_panel.sort_by_path.unwrap(), + collapse_untracked_diff: git_panel.collapse_untracked_diff.unwrap(), + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { - vscode.bool_setting("git.enabled", &mut current.button); - vscode.string_setting("git.defaultBranchName", &mut current.fallback_branch_name); + fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut SettingsContent) { + if let Some(git_enabled) = vscode.read_bool("git.enabled") { + current.git_panel.get_or_insert_default().button = Some(git_enabled); + } + if let Some(default_branch) = vscode.read_string("git.defaultBranchName") { + current + .git_panel + .get_or_insert_default() + .fallback_branch_name = Some(default_branch.to_string()); + } } } diff --git a/crates/git_ui/src/git_ui.rs b/crates/git_ui/src/git_ui.rs index 000b6639b440914f117e30cc3272bf4cc38d8be6..da2e2ca032aa005ad619eabf094ae6981975b050 100644 --- a/crates/git_ui/src/git_ui.rs +++ b/crates/git_ui/src/git_ui.rs @@ -4,20 +4,28 @@ use ::settings::Settings; use command_palette_hooks::CommandPaletteFilter; use commit_modal::CommitModal; use editor::{Editor, actions::DiffClipboardWithSelectionData}; +use ui::{ + Headline, HeadlineSize, Icon, IconName, IconSize, IntoElement, ParentElement, Render, Styled, + StyledExt, div, h_flex, rems, v_flex, +}; + mod blame_ui; + use git::{ repository::{Branch, Upstream, UpstreamTracking, UpstreamTrackingStatus}, status::{FileStatus, StatusCode, UnmergedStatus, UnmergedStatusCode}, }; use git_panel_settings::GitPanelSettings; use gpui::{ - Action, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Window, - actions, + Action, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, SharedString, + Window, actions, }; +use menu::{Cancel, Confirm}; use onboarding::GitOnboardingModal; +use project::git_store::Repository; use project_diff::ProjectDiff; use ui::prelude::*; -use workspace::{ModalView, Workspace}; +use workspace::{ModalView, Workspace, notifications::DetachAndPromptErr}; use zed_actions; use crate::{git_panel::GitPanel, text_diff_view::TextDiffView}; @@ -202,6 +210,9 @@ pub fn init(cx: &mut App) { workspace.register_action(|workspace, _: &git::OpenModifiedFiles, window, cx| { open_modified_files(workspace, window, cx); }); + workspace.register_action(|workspace, _: &git::RenameBranch, window, cx| { + rename_current_branch(workspace, window, cx); + }); workspace.register_action( |workspace, action: &DiffClipboardWithSelectionData, window, cx| { if let Some(task) = TextDiffView::open(action, workspace, window, cx) { @@ -245,6 +256,122 @@ pub fn git_status_icon(status: FileStatus) -> impl IntoElement { GitStatusIcon::new(status) } +struct RenameBranchModal { + current_branch: SharedString, + editor: Entity, + repo: Entity, +} + +impl RenameBranchModal { + fn new( + current_branch: String, + repo: Entity, + window: &mut Window, + cx: &mut Context, + ) -> Self { + let editor = cx.new(|cx| { + let mut editor = Editor::single_line(window, cx); + editor.set_text(current_branch.clone(), window, cx); + editor + }); + Self { + current_branch: current_branch.into(), + editor, + repo, + } + } + + fn cancel(&mut self, _: &Cancel, _window: &mut Window, cx: &mut Context) { + cx.emit(DismissEvent); + } + + fn confirm(&mut self, _: &Confirm, window: &mut Window, cx: &mut Context) { + let new_name = self.editor.read(cx).text(cx); + if new_name.is_empty() || new_name == self.current_branch.as_ref() { + cx.emit(DismissEvent); + return; + } + + let repo = self.repo.clone(); + let current_branch = self.current_branch.to_string(); + cx.spawn(async move |_, cx| { + match repo + .update(cx, |repo, _| { + repo.rename_branch(current_branch, new_name.clone()) + })? + .await + { + Ok(Ok(_)) => Ok(()), + Ok(Err(error)) => Err(error), + Err(_) => Err(anyhow::anyhow!("Operation was canceled")), + } + }) + .detach_and_prompt_err("Failed to rename branch", window, cx, |_, _, _| None); + cx.emit(DismissEvent); + } +} + +impl EventEmitter for RenameBranchModal {} +impl ModalView for RenameBranchModal {} +impl Focusable for RenameBranchModal { + fn focus_handle(&self, cx: &App) -> FocusHandle { + self.editor.focus_handle(cx) + } +} + +impl Render for RenameBranchModal { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + v_flex() + .key_context("RenameBranchModal") + .on_action(cx.listener(Self::cancel)) + .on_action(cx.listener(Self::confirm)) + .elevation_2(cx) + .w(rems(34.)) + .child( + h_flex() + .px_3() + .pt_2() + .pb_1() + .w_full() + .gap_1p5() + .child(Icon::new(IconName::GitBranch).size(IconSize::XSmall)) + .child( + Headline::new(format!("Rename Branch ({})", self.current_branch)) + .size(HeadlineSize::XSmall), + ), + ) + .child(div().px_3().pb_3().w_full().child(self.editor.clone())) + } +} + +fn rename_current_branch( + workspace: &mut Workspace, + window: &mut Window, + cx: &mut Context, +) { + let Some(panel) = workspace.panel::(cx) else { + return; + }; + let current_branch: Option = panel.update(cx, |panel, cx| { + let repo = panel.active_repository.as_ref()?; + let repo = repo.read(cx); + repo.branch.as_ref().map(|branch| branch.name().to_string()) + }); + + let Some(current_branch_name) = current_branch else { + return; + }; + + let repo = panel.read(cx).active_repository.clone(); + let Some(repo) = repo else { + return; + }; + + workspace.toggle_modal(window, cx, |window, cx| { + RenameBranchModal::new(current_branch_name, repo, window, cx) + }); +} + fn render_remote_button( id: impl Into, branch: &Branch, @@ -518,7 +645,6 @@ mod remote_button { this.child( h_flex() .ml_neg_0p5() - .mr_1() .when(behind_count > 0, |this| { this.child(Icon::new(IconName::ArrowDown).size(IconSize::XSmall)) .child(count(behind_count)) @@ -533,7 +659,6 @@ mod remote_button { this.child( h_flex() .ml_neg_0p5() - .mr_1() .child(Icon::new(left_icon).size(IconSize::XSmall)), ) }) diff --git a/crates/git_ui/src/project_diff.rs b/crates/git_ui/src/project_diff.rs index 9d0a575247427ec5fe674b342d0f2660e40e2299..e0eda7d8bef40ae622eb03b2df981d28d61de5d0 100644 --- a/crates/git_ui/src/project_diff.rs +++ b/crates/git_ui/src/project_diff.rs @@ -16,7 +16,7 @@ use editor::{ use futures::StreamExt; use git::{ Commit, StageAll, StageAndNext, ToggleStaged, UnstageAll, UnstageAndNext, - repository::{Branch, Upstream, UpstreamTracking, UpstreamTrackingStatus}, + repository::{Branch, RepoPath, Upstream, UpstreamTracking, UpstreamTrackingStatus}, status::FileStatus, }; use gpui::{ @@ -27,7 +27,7 @@ use language::{Anchor, Buffer, Capability, OffsetRangeExt}; use multi_buffer::{MultiBuffer, PathKey}; use project::{ Project, ProjectPath, - git_store::{GitStore, GitStoreEvent, RepositoryEvent}, + git_store::{GitStore, GitStoreEvent, Repository}, }; use settings::{Settings, SettingsStore}; use std::any::{Any, TypeId}; @@ -73,9 +73,9 @@ struct DiffBuffer { file_status: FileStatus, } -const CONFLICT_NAMESPACE: u32 = 1; -const TRACKED_NAMESPACE: u32 = 2; -const NEW_NAMESPACE: u32 = 3; +const CONFLICT_SORT_PREFIX: u64 = 1; +const TRACKED_SORT_PREFIX: u64 = 2; +const NEW_SORT_PREFIX: u64 = 3; impl ProjectDiff { pub(crate) fn register(workspace: &mut Workspace, cx: &mut Context) { @@ -177,7 +177,7 @@ impl ProjectDiff { window, move |this, _git_store, event, _window, _cx| match event { GitStoreEvent::ActiveRepositoryChanged(_) - | GitStoreEvent::RepositoryUpdated(_, RepositoryEvent::Updated { .. }, true) + | GitStoreEvent::RepositoryUpdated(_, _, true) | GitStoreEvent::ConflictsUpdated => { *this.update_needed.borrow_mut() = (); } @@ -234,16 +234,8 @@ impl ProjectDiff { return; }; let repo = git_repo.read(cx); - - let namespace = if repo.had_conflict_on_last_merge_head_change(&entry.repo_path) { - CONFLICT_NAMESPACE - } else if entry.status.is_created() { - NEW_NAMESPACE - } else { - TRACKED_NAMESPACE - }; - - let path_key = PathKey::namespaced(namespace, entry.repo_path.0); + let sort_prefix = sort_prefix(repo, &entry.repo_path, entry.status, cx); + let path_key = PathKey::with_sort_prefix(sort_prefix, entry.repo_path.0); self.move_to_path(path_key, window, cx) } @@ -388,16 +380,8 @@ impl ProjectDiff { else { continue; }; - let namespace = if GitPanelSettings::get_global(cx).sort_by_path { - TRACKED_NAMESPACE - } else if repo.had_conflict_on_last_merge_head_change(&entry.repo_path) { - CONFLICT_NAMESPACE - } else if entry.status.is_created() { - NEW_NAMESPACE - } else { - TRACKED_NAMESPACE - }; - let path_key = PathKey::namespaced(namespace, entry.repo_path.0.clone()); + let sort_prefix = sort_prefix(repo, &entry.repo_path, entry.status, cx); + let path_key = PathKey::with_sort_prefix(sort_prefix, entry.repo_path.0.clone()); previous_paths.remove(&path_key); let load_buffer = self @@ -531,15 +515,28 @@ impl ProjectDiff { } #[cfg(any(test, feature = "test-support"))] - pub fn excerpt_paths(&self, cx: &App) -> Vec { + pub fn excerpt_paths(&self, cx: &App) -> Vec> { self.multibuffer .read(cx) .excerpt_paths() - .map(|key| key.path().to_string_lossy().to_string()) + .map(|key| key.path()) + .cloned() .collect() } } +fn sort_prefix(repo: &Repository, repo_path: &RepoPath, status: FileStatus, cx: &App) -> u64 { + if GitPanelSettings::get_global(cx).sort_by_path { + TRACKED_SORT_PREFIX + } else if repo.had_conflict_on_last_merge_head_change(repo_path) { + CONFLICT_SORT_PREFIX + } else if status.is_created() { + NEW_SORT_PREFIX + } else { + TRACKED_SORT_PREFIX + } +} + impl EventEmitter for ProjectDiff {} impl Focusable for ProjectDiff { @@ -612,10 +609,6 @@ impl Item for ProjectDiff { self.editor.for_each_project_item(cx, f) } - fn is_singleton(&self, _: &App) -> bool { - false - } - fn set_nav_history( &mut self, nav_history: ItemNavHistory, @@ -1349,7 +1342,6 @@ fn merge_anchor_ranges<'a>( }) } -#[cfg(not(target_os = "windows"))] #[cfg(test)] mod tests { use db::indoc; @@ -1361,7 +1353,7 @@ mod tests { use settings::SettingsStore; use std::path::Path; use unindent::Unindent as _; - use util::path; + use util::{path, rel_path::rel_path}; use super::*; @@ -1406,12 +1398,12 @@ mod tests { fs.set_head_for_repo( path!("/project/.git").as_ref(), - &[("foo.txt".into(), "foo\n".into())], + &[("foo.txt", "foo\n".into())], "deadbeef", ); fs.set_index_for_repo( path!("/project/.git").as_ref(), - &[("foo.txt".into(), "foo\n".into())], + &[("foo.txt", "foo\n".into())], ); cx.run_until_parked(); @@ -1461,16 +1453,13 @@ mod tests { fs.set_head_and_index_for_repo( path!("/project/.git").as_ref(), - &[ - ("bar".into(), "bar\n".into()), - ("foo".into(), "foo\n".into()), - ], + &[("bar", "bar\n".into()), ("foo", "foo\n".into())], ); cx.run_until_parked(); let editor = cx.update_window_entity(&diff, |diff, window, cx| { diff.move_to_path( - PathKey::namespaced(TRACKED_NAMESPACE, Path::new("foo").into()), + PathKey::with_sort_prefix(TRACKED_SORT_PREFIX, rel_path("foo").into_arc()), window, cx, ); @@ -1491,7 +1480,7 @@ mod tests { let editor = cx.update_window_entity(&diff, |diff, window, cx| { diff.move_to_path( - PathKey::namespaced(TRACKED_NAMESPACE, Path::new("bar").into()), + PathKey::with_sort_prefix(TRACKED_SORT_PREFIX, rel_path("bar").into_arc()), window, cx, ); @@ -1543,7 +1532,7 @@ mod tests { fs.set_head_for_repo( path!("/project/.git").as_ref(), - &[("foo".into(), "original\n".into())], + &[("foo", "original\n".into())], "deadbeef", ); cx.run_until_parked(); @@ -1563,7 +1552,7 @@ mod tests { let prev_buffer_hunks = cx.update_window_entity(&buffer_editor, |buffer_editor, window, cx| { let snapshot = buffer_editor.snapshot(window, cx); - let snapshot = &snapshot.buffer_snapshot; + let snapshot = &snapshot.buffer_snapshot(); let prev_buffer_hunks = buffer_editor .diff_hunks_in_ranges(&[editor::Anchor::min()..editor::Anchor::max()], snapshot) .collect::>(); @@ -1576,7 +1565,7 @@ mod tests { let new_buffer_hunks = cx.update_window_entity(&buffer_editor, |buffer_editor, window, cx| { let snapshot = buffer_editor.snapshot(window, cx); - let snapshot = &snapshot.buffer_snapshot; + let snapshot = &snapshot.buffer_snapshot(); buffer_editor .diff_hunks_in_ranges(&[editor::Anchor::min()..editor::Anchor::max()], snapshot) .collect::>() @@ -1636,7 +1625,7 @@ mod tests { let fs = FakeFs::new(cx.executor()); fs.insert_tree( - "/a", + path!("/a"), json!({ ".git": {}, "a.txt": "created\n", @@ -1646,16 +1635,16 @@ mod tests { ) .await; - fs.set_git_content_for_repo( - Path::new("/a/.git"), + fs.set_head_and_index_for_repo( + Path::new(path!("/a/.git")), &[ - ("b.txt".into(), "before\n".to_string(), None), - ("c.txt".into(), "unchanged\n".to_string(), None), - ("d.txt".into(), "deleted\n".to_string(), None), + ("b.txt", "before\n".to_string()), + ("c.txt", "unchanged\n".to_string()), + ("d.txt", "deleted\n".to_string()), ], ); - let project = Project::test(fs, [Path::new("/a")], cx).await; + let project = Project::test(fs, [Path::new(path!("/a"))], cx).await; let (workspace, cx) = cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx)); @@ -1756,7 +1745,7 @@ mod tests { let fs = FakeFs::new(cx.executor()); fs.insert_tree( - "/a", + path!("/a"), json!({ ".git": {}, "main.rs": buffer_contents, @@ -1764,12 +1753,12 @@ mod tests { ) .await; - fs.set_git_content_for_repo( - Path::new("/a/.git"), - &[("main.rs".into(), git_contents.to_owned(), None)], + fs.set_head_and_index_for_repo( + Path::new(path!("/a/.git")), + &[("main.rs", git_contents.to_owned())], ); - let project = Project::test(fs, [Path::new("/a")], cx).await; + let project = Project::test(fs, [Path::new(path!("/a"))], cx).await; let (workspace, cx) = cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx)); @@ -1816,7 +1805,7 @@ mod tests { fs.set_status_for_repo( Path::new(path!("/project/.git")), &[( - Path::new("foo"), + "foo", UnmergedStatus { first_head: UnmergedStatusCode::Updated, second_head: UnmergedStatusCode::Updated, @@ -1875,4 +1864,129 @@ mod tests { let contents = String::from_utf8(contents).unwrap(); assert_eq!(contents, "ours\n"); } + + #[gpui::test] + async fn test_new_hunk_in_modified_file(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + path!("/project"), + json!({ + ".git": {}, + "foo.txt": " + one + two + three + four + five + six + seven + eight + nine + ten + ELEVEN + twelve + ".unindent() + }), + ) + .await; + let project = Project::test(fs.clone(), [path!("/project").as_ref()], cx).await; + let (workspace, cx) = + cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let diff = cx.new_window_entity(|window, cx| { + ProjectDiff::new(project.clone(), workspace, window, cx) + }); + cx.run_until_parked(); + + fs.set_head_and_index_for_repo( + Path::new(path!("/project/.git")), + &[( + "foo.txt", + " + one + two + three + four + five + six + seven + eight + nine + ten + eleven + twelve + " + .unindent(), + )], + ); + cx.run_until_parked(); + + let editor = diff.read_with(cx, |diff, _| diff.editor.clone()); + + assert_state_with_diff( + &editor, + cx, + &" + ˇnine + ten + - eleven + + ELEVEN + twelve + " + .unindent(), + ); + + let buffer = project + .update(cx, |project, cx| { + project.open_local_buffer(path!("/project/foo.txt"), cx) + }) + .await + .unwrap(); + buffer.update(cx, |buffer, cx| { + buffer.edit_via_marked_text( + &" + one + «TWO» + three + four + five + six + seven + eight + nine + ten + ELEVEN + twelve + " + .unindent(), + None, + cx, + ); + }); + project + .update(cx, |project, cx| project.save_buffer(buffer.clone(), cx)) + .await + .unwrap(); + cx.run_until_parked(); + + assert_state_with_diff( + &editor, + cx, + &" + one + - two + + TWO + three + four + five + ˇnine + ten + - eleven + + ELEVEN + twelve + " + .unindent(), + ); + } } diff --git a/crates/git_ui/src/repository_selector.rs b/crates/git_ui/src/repository_selector.rs index db080ab0b4974dfc3ef83ffb3a0ec71481c683bc..5e60bebc4279df4bbf90a685ccffa957803253f7 100644 --- a/crates/git_ui/src/repository_selector.rs +++ b/crates/git_ui/src/repository_selector.rs @@ -1,6 +1,6 @@ use gpui::{App, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Task, WeakEntity}; use itertools::Itertools; -use picker::{Picker, PickerDelegate}; +use picker::{Picker, PickerDelegate, PickerEditorPosition}; use project::{Project, git_store::Repository}; use std::sync::Arc; use ui::{ListItem, ListItemSpacing, prelude::*}; @@ -36,11 +36,11 @@ impl RepositorySelector { ) -> Self { let git_store = project_handle.read(cx).git_store().clone(); let repository_entries = git_store.update(cx, |git_store, _cx| { - git_store - .repositories() - .values() - .cloned() - .collect::>() + let mut repos: Vec<_> = git_store.repositories().values().cloned().collect(); + + repos.sort_by_key(|a| a.read(_cx).display_name()); + + repos }); let filtered_repositories = repository_entries.clone(); @@ -59,7 +59,7 @@ impl RepositorySelector { }; let picker = cx.new(|cx| { - Picker::nonsearchable_uniform_list(delegate, window, cx) + Picker::uniform_list(delegate, window, cx) .widest_item(widest_item_ix) .max_height(Some(rems(20.).into())) }); @@ -158,6 +158,10 @@ impl PickerDelegate for RepositorySelectorDelegate { "Select a repository...".into() } + fn editor_position(&self) -> PickerEditorPosition { + PickerEditorPosition::End + } + fn update_matches( &mut self, query: String, @@ -166,25 +170,31 @@ impl PickerDelegate for RepositorySelectorDelegate { ) -> Task<()> { let all_repositories = self.repository_entries.clone(); + let repo_names: Vec<(Entity, String)> = all_repositories + .iter() + .map(|repo| (repo.clone(), repo.read(cx).display_name().to_lowercase())) + .collect(); + cx.spawn_in(window, async move |this, cx| { let filtered_repositories = cx .background_spawn(async move { if query.is_empty() { all_repositories } else { - all_repositories + let query_lower = query.to_lowercase(); + repo_names .into_iter() - .filter(|_repo_info| { - // TODO: Implement repository filtering logic - true - }) + .filter(|(_, display_name)| display_name.contains(&query_lower)) + .map(|(repo, _)| repo) .collect() } }) .await; this.update_in(cx, |this, window, cx| { - this.delegate.filtered_repositories = filtered_repositories; + let mut sorted_repositories = filtered_repositories; + sorted_repositories.sort_by_key(|a| a.read(cx).display_name()); + this.delegate.filtered_repositories = sorted_repositories; this.delegate.set_selected_index(0, window, cx); cx.notify(); }) diff --git a/crates/git_ui/src/stash_picker.rs b/crates/git_ui/src/stash_picker.rs index 4d142d6383a9a4e79e342420bada00c790770902..d82498007d3d38e509e34e86044fa0a0e188c910 100644 --- a/crates/git_ui/src/stash_picker.rs +++ b/crates/git_ui/src/stash_picker.rs @@ -400,27 +400,38 @@ impl PickerDelegate for StashListDelegate { let stash_label = HighlightedLabel::new(stash_message, positions) .truncate() .into_any_element(); + let branch_name = entry_match.entry.branch.clone().unwrap_or_default(); let branch_label = h_flex() - .gap_1() + .gap_1p5() .w_full() .child( - Icon::new(IconName::GitBranch) + h_flex() + .gap_0p5() + .child( + Icon::new(IconName::GitBranch) + .color(Color::Muted) + .size(IconSize::Small), + ) + .child( + Label::new(branch_name) + .truncate() + .color(Color::Muted) + .size(LabelSize::Small), + ), + ) + .child( + Label::new("•") + .alpha(0.5) .color(Color::Muted) - .size(IconSize::Small), + .size(LabelSize::Small), ) .child( - Label::new(branch_name) - .truncate() + Label::new(entry_match.formatted_timestamp.clone()) .color(Color::Muted) .size(LabelSize::Small), ); - let tooltip_text = format!( - "stash@{{{}}} created {}", - entry_match.entry.index, entry_match.formatted_timestamp - ); - Some( ListItem::new(SharedString::from(format!("stash-{ix}"))) .inset(true) @@ -433,7 +444,10 @@ impl PickerDelegate for StashListDelegate { .child(stash_label) .child(branch_label.into_element()), ) - .tooltip(Tooltip::text(tooltip_text)), + .tooltip(Tooltip::text(format!( + "stash@{{{}}}", + entry_match.entry.index + ))), ) } @@ -452,60 +466,49 @@ impl PickerDelegate for StashListDelegate { h_flex() .w_full() .p_1p5() - .justify_between() + .gap_0p5() + .justify_end() .border_t_1() .border_color(cx.theme().colors().border_variant) .child( - h_flex() - .gap_0p5() - .child( - Button::new("apply-stash", "Apply") - .key_binding( - KeyBinding::for_action_in( - &menu::Confirm, - &focus_handle, - window, - cx, - ) - .map(|kb| kb.size(rems_from_px(12.))), - ) - .on_click(|_, window, cx| { - window.dispatch_action(menu::Confirm.boxed_clone(), cx) - }), + Button::new("apply-stash", "Apply") + .key_binding( + KeyBinding::for_action_in(&menu::Confirm, &focus_handle, window, cx) + .map(|kb| kb.size(rems_from_px(12.))), ) - .child( - Button::new("pop-stash", "Pop") - .key_binding( - KeyBinding::for_action_in( - &menu::SecondaryConfirm, - &focus_handle, - window, - cx, - ) - .map(|kb| kb.size(rems_from_px(12.))), - ) - .on_click(|_, window, cx| { - window.dispatch_action(menu::SecondaryConfirm.boxed_clone(), cx) - }), + .on_click(|_, window, cx| { + window.dispatch_action(menu::Confirm.boxed_clone(), cx) + }), + ) + .child( + Button::new("pop-stash", "Pop") + .key_binding( + KeyBinding::for_action_in( + &menu::SecondaryConfirm, + &focus_handle, + window, + cx, + ) + .map(|kb| kb.size(rems_from_px(12.))), + ) + .on_click(|_, window, cx| { + window.dispatch_action(menu::SecondaryConfirm.boxed_clone(), cx) + }), + ) + .child( + Button::new("drop-stash", "Drop") + .key_binding( + KeyBinding::for_action_in( + &stash_picker::DropStashItem, + &focus_handle, + window, + cx, + ) + .map(|kb| kb.size(rems_from_px(12.))), ) - .child( - Button::new("drop-stash", "Drop") - .key_binding( - KeyBinding::for_action_in( - &stash_picker::DropStashItem, - &focus_handle, - window, - cx, - ) - .map(|kb| kb.size(rems_from_px(12.))), - ) - .on_click(|_, window, cx| { - window.dispatch_action( - stash_picker::DropStashItem.boxed_clone(), - cx, - ) - }), - ), + .on_click(|_, window, cx| { + window.dispatch_action(stash_picker::DropStashItem.boxed_clone(), cx) + }), ) .into_any(), ) diff --git a/crates/git_ui/src/text_diff_view.rs b/crates/git_ui/src/text_diff_view.rs index ebf32d1b994814fa277201176b555efed5e85e66..8f7dac4e4049a65dbd630966cea249664d22ba61 100644 --- a/crates/git_ui/src/text_diff_view.rs +++ b/crates/git_ui/src/text_diff_view.rs @@ -193,7 +193,7 @@ impl TextDiffView { .and_then(|b| { b.read(cx) .file() - .map(|f| f.full_path(cx).compact().to_string_lossy().to_string()) + .map(|f| f.full_path(cx).compact().to_string_lossy().into_owned()) }) .unwrap_or("untitled".into()); @@ -324,10 +324,6 @@ impl Item for TextDiffView { .update(cx, |editor, cx| editor.deactivated(window, cx)); } - fn is_singleton(&self, _: &App) -> bool { - false - } - fn act_as_type<'a>( &'a self, type_id: TypeId, @@ -416,7 +412,7 @@ impl Item for TextDiffView { pub fn selection_location_text(editor: &Editor, cx: &App) -> Option { let buffer = editor.buffer().read(cx); let buffer_snapshot = buffer.snapshot(cx); - let first_selection = editor.selections.disjoint.first()?; + let first_selection = editor.selections.disjoint_anchors().first()?; let selection_start = first_selection.start.to_point(&buffer_snapshot); let selection_end = first_selection.end.to_point(&buffer_snapshot); @@ -454,7 +450,7 @@ mod tests { use gpui::{TestAppContext, VisualContext}; use project::{FakeFs, Project}; use serde_json::json; - use settings::{Settings, SettingsStore}; + use settings::SettingsStore; use unindent::unindent; use util::{path, test::marked_text_ranges}; @@ -466,7 +462,7 @@ mod tests { Project::init_settings(cx); workspace::init_settings(cx); editor::init_settings(cx); - theme::ThemeSettings::register(cx) + theme::init(theme::LoadThemes::JustBase, cx); }); } diff --git a/crates/go_to_line/Cargo.toml b/crates/go_to_line/Cargo.toml index 57438910fbef39f2b0308a3f4706d5e01df0f832..54a9b4d37c7a237cdedf20e0cc683895384caa03 100644 --- a/crates/go_to_line/Cargo.toml +++ b/crates/go_to_line/Cargo.toml @@ -13,12 +13,10 @@ path = "src/go_to_line.rs" doctest = false [dependencies] -anyhow.workspace = true editor.workspace = true gpui.workspace = true language.workspace = true menu.workspace = true -schemars.workspace = true serde.workspace = true settings.workspace = true text.workspace = true diff --git a/crates/go_to_line/src/cursor_position.rs b/crates/go_to_line/src/cursor_position.rs index 5d7e0d27d362f8b6245d8ce25774342495a90427..0d17e746701759aef4a0521f1fb0afcb578eb02a 100644 --- a/crates/go_to_line/src/cursor_position.rs +++ b/crates/go_to_line/src/cursor_position.rs @@ -1,8 +1,6 @@ -use editor::{Editor, EditorSettings, MultiBufferSnapshot}; +use editor::{Editor, MultiBufferSnapshot}; use gpui::{App, Entity, FocusHandle, Focusable, Subscription, Task, WeakEntity}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::Settings; use std::{fmt::Write, num::NonZeroU32, time::Duration}; use text::{Point, Selection}; use ui::{ @@ -10,7 +8,7 @@ use ui::{ Render, Tooltip, Window, div, }; use util::paths::FILE_ROW_COLUMN_DELIMITER; -use workspace::{StatusItemView, Workspace, item::ItemHandle}; +use workspace::{StatusBarSettings, StatusItemView, Workspace, item::ItemHandle}; #[derive(Copy, Clone, Debug, Default, PartialOrd, PartialEq)] pub(crate) struct SelectionStats { @@ -115,7 +113,9 @@ impl CursorPosition { let mut last_selection = None::>; let snapshot = editor.buffer().read(cx).snapshot(cx); if snapshot.excerpts().count() > 0 { - for selection in editor.selections.all_adjusted(cx) { + for selection in + editor.selections.all_adjusted_with_snapshot(&snapshot) + { let selection_summary = snapshot .text_summary_for_range::( selection.start..selection.end, @@ -207,10 +207,7 @@ impl CursorPosition { impl Render for CursorPosition { fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { - if !EditorSettings::get_global(cx) - .status_bar - .cursor_position_button - { + if !StatusBarSettings::get_global(cx).cursor_position_button { return div(); } @@ -293,41 +290,23 @@ impl StatusItemView for CursorPosition { } } -#[derive(Clone, Copy, Default, PartialEq, Debug, JsonSchema, Deserialize, Serialize)] -#[serde(rename_all = "snake_case")] -pub(crate) enum LineIndicatorFormat { +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum LineIndicatorFormat { Short, - #[default] Long, } -#[derive( - Clone, Copy, Default, Debug, JsonSchema, Deserialize, Serialize, SettingsUi, SettingsKey, -)] -#[settings_key(None)] -pub(crate) struct LineIndicatorFormatContent { - line_indicator_format: Option, +impl From for LineIndicatorFormat { + fn from(format: settings::LineIndicatorFormat) -> Self { + match format { + settings::LineIndicatorFormat::Short => LineIndicatorFormat::Short, + settings::LineIndicatorFormat::Long => LineIndicatorFormat::Long, + } + } } impl Settings for LineIndicatorFormat { - type FileContent = LineIndicatorFormatContent; - - fn load(sources: SettingsSources, _: &mut App) -> anyhow::Result { - let format = [ - sources.release_channel, - sources.profile, - sources.user, - sources.operating_system, - Some(sources.default), - ] - .into_iter() - .flatten() - .filter_map(|val| val.line_indicator_format) - .next() - .ok_or_else(Self::missing_default)?; - - Ok(format) + fn from_settings(content: &settings::SettingsContent) -> Self { + content.line_indicator_format.unwrap().into() } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } diff --git a/crates/go_to_line/src/go_to_line.rs b/crates/go_to_line/src/go_to_line.rs index 9b573d7071b64c7470e81079e7be5a5f048fc5eb..f9dd0178922b1a479caade3953d2eb0c0e75c83d 100644 --- a/crates/go_to_line/src/go_to_line.rs +++ b/crates/go_to_line/src/go_to_line.rs @@ -3,7 +3,8 @@ pub mod cursor_position; use cursor_position::{LineIndicatorFormat, UserCaretPosition}; use editor::{ Anchor, Editor, MultiBufferSnapshot, RowHighlightOptions, SelectionEffects, ToOffset, ToPoint, - actions::Tab, scroll::Autoscroll, + actions::Tab, + scroll::{Autoscroll, ScrollOffset}, }; use gpui::{ App, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Render, SharedString, Styled, @@ -26,7 +27,7 @@ pub struct GoToLine { line_editor: Entity, active_editor: Entity, current_text: SharedString, - prev_scroll_position: Option>, + prev_scroll_position: Option>, _subscriptions: Vec, } @@ -311,7 +312,7 @@ mod tests { use project::{FakeFs, Project}; use serde_json::json; use std::{num::NonZeroU32, sync::Arc, time::Duration}; - use util::path; + use util::{path, rel_path::rel_path}; use workspace::{AppState, Workspace}; #[gpui::test] @@ -356,7 +357,7 @@ mod tests { .unwrap(); let editor = workspace .update_in(cx, |workspace, window, cx| { - workspace.open_path((worktree_id, "a.rs"), None, true, window, cx) + workspace.open_path((worktree_id, rel_path("a.rs")), None, true, window, cx) }) .await .unwrap() @@ -460,7 +461,7 @@ mod tests { .unwrap(); let editor = workspace .update_in(cx, |workspace, window, cx| { - workspace.open_path((worktree_id, "a.rs"), None, true, window, cx) + workspace.open_path((worktree_id, rel_path("a.rs")), None, true, window, cx) }) .await .unwrap() @@ -545,7 +546,7 @@ mod tests { .unwrap(); let editor = workspace .update_in(cx, |workspace, window, cx| { - workspace.open_path((worktree_id, "a.rs"), None, true, window, cx) + workspace.open_path((worktree_id, rel_path("a.rs")), None, true, window, cx) }) .await .unwrap() @@ -623,7 +624,7 @@ mod tests { .unwrap(); let editor = workspace .update_in(cx, |workspace, window, cx| { - workspace.open_path((worktree_id, "a.rs"), None, true, window, cx) + workspace.open_path((worktree_id, rel_path("a.rs")), None, true, window, cx) }) .await .unwrap() diff --git a/crates/google_ai/Cargo.toml b/crates/google_ai/Cargo.toml index bc9213ca8f81d8f1bccfd84cbffe95aa61923cd8..ce759698ed5f986663fe1cae4a83b65cd76a8e4f 100644 --- a/crates/google_ai/Cargo.toml +++ b/crates/google_ai/Cargo.toml @@ -21,5 +21,6 @@ http_client.workspace = true schemars = { workspace = true, optional = true } serde.workspace = true serde_json.workspace = true +settings.workspace = true strum.workspace = true workspace-hack.workspace = true diff --git a/crates/google_ai/src/google_ai.rs b/crates/google_ai/src/google_ai.rs index 92fd53189327fabccdc1472ac0fa2a20dc665646..9b7e5ec8d1c42fc846d131cfd063de5bba8287ae 100644 --- a/crates/google_ai/src/google_ai.rs +++ b/crates/google_ai/src/google_ai.rs @@ -4,6 +4,7 @@ use anyhow::{Result, anyhow, bail}; use futures::{AsyncBufReadExt, AsyncReadExt, StreamExt, io::BufReader, stream::BoxStream}; use http_client::{AsyncBody, HttpClient, Method, Request as HttpRequest}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; +pub use settings::ModelMode as GoogleModelMode; pub const API_URL: &str = "https://generativelanguage.googleapis.com"; @@ -295,16 +296,6 @@ pub struct ThinkingConfig { pub thinking_budget: u32, } -#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] -pub enum GoogleModelMode { - #[default] - Default, - Thinking { - budget_tokens: Option, - }, -} - #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GenerationConfig { diff --git a/crates/gpui/Cargo.toml b/crates/gpui/Cargo.toml index a6e8d090f0bd1f4eac7218ae1adff5d5f65b05b5..fca9a0c4d7a3d2915ea3ec6409067c3735fae5ed 100644 --- a/crates/gpui/Cargo.toml +++ b/crates/gpui/Cargo.toml @@ -1,12 +1,17 @@ [package] name = "gpui" -version = "0.1.0" +version = "0.2.0" edition.workspace = true authors = ["Nathan Sobo "] description = "Zed's GPU-accelerated UI framework" repository = "https://github.com/zed-industries/zed" -publish.workspace = true +publish = true license = "Apache-2.0" +homepage = "https://gpui.rs" +readme = "README.md" +keywords = ["desktop", "gui", "immediate"] +categories = ["gui"] + [lints] workspace = true @@ -38,7 +43,7 @@ wayland = [ "blade-macros", "blade-util", "bytemuck", - "ashpd", + "ashpd/wayland", "cosmic-text", "font-kit", "calloop-wayland-source", @@ -110,13 +115,13 @@ resvg = { version = "0.45.0", default-features = false, features = [ "memmap-fonts", ] } usvg = { version = "0.45.0", default-features = false } +util_macros.workspace = true schemars.workspace = true seahash = "4.1" semantic_version.workspace = true serde.workspace = true -serde_derive.workspace = true serde_json.workspace = true -slotmap = "1.0.6" +slotmap.workspace = true smallvec.workspace = true smol.workspace = true stacksafe.workspace = true @@ -139,7 +144,8 @@ core-foundation-sys.workspace = true core-graphics = "0.24" core-video.workspace = true core-text = "21" -font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "5474cfad4b719a72ec8ed2cb7327b2b01fd10568", optional = true } +# WARNING: If you change this, you must also publish a new version of zed-font-kit to crates.io +font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "110523127440aefb11ce0cf280ae7c5071337ec5", package = "zed-font-kit", version = "0.14.1-zed", optional = true } foreign-types = "0.5" log.workspace = true media.workspace = true @@ -170,7 +176,8 @@ blade-macros = { workspace = true, optional = true } blade-util = { workspace = true, optional = true } bytemuck = { version = "1", optional = true } cosmic-text = { version = "0.14.0", optional = true } -font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "5474cfad4b719a72ec8ed2cb7327b2b01fd10568", features = [ +# WARNING: If you change this, you must also publish a new version of zed-font-kit to crates.io +font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "110523127440aefb11ce0cf280ae7c5071337ec5", package = "zed-font-kit", version = "0.14.1-zed", features = [ "source-fontconfig-dlopen", ], optional = true } @@ -210,10 +217,11 @@ xkbcommon = { version = "0.8.0", features = [ "wayland", "x11", ], optional = true } -xim = { git = "https://github.com/zed-industries/xim-rs", rev = "c0a70c1bd2ce197364216e5e818a2cb3adb99a8d" , features = [ +# WARNING: If you change this, you must also publish a new version of zed-xim to crates.io +xim = { git = "https://github.com/zed-industries/xim-rs.git", rev = "16f35a2c881b815a2b6cdfd6687988e84f8447d8" , features = [ "x11rb-xcb", "x11rb-client", -], optional = true } +], package = "zed-xim", version = "0.4.0-zed", optional = true } x11-clipboard = { version = "0.9.3", optional = true } [target.'cfg(target_os = "windows")'.dependencies] @@ -230,9 +238,10 @@ collections = { workspace = true, features = ["test-support"] } env_logger.workspace = true http_client = { workspace = true, features = ["test-support"] } lyon = { version = "1.0", features = ["extra"] } +pretty_assertions.workspace = true rand.workspace = true -unicode-segmentation.workspace = true reqwest_client = { workspace = true, features = ["test-support"] } +unicode-segmentation.workspace = true util = { workspace = true, features = ["test-support"] } [target.'cfg(target_os = "windows")'.build-dependencies] diff --git a/crates/gpui/README.md b/crates/gpui/README.md index 672d83e8ff0d72f641598d1a0b2c69a98650d45c..4b2ba8818b7e983a52730c8399e8afaab79d5e5e 100644 --- a/crates/gpui/README.md +++ b/crates/gpui/README.md @@ -5,12 +5,14 @@ for Rust, designed to support a wide variety of applications. ## Getting Started -GPUI is still in active development as we work on the Zed code editor and isn't yet on crates.io. You'll also need to use the latest version of stable Rust and be on macOS or Linux. Add the following to your `Cargo.toml`: +GPUI is still in active development as we work on the Zed code editor, and is still pre-1.0. There will often be breaking changes between versions. You'll also need to use the latest version of stable Rust and be on macOS or Linux. Add the following to your `Cargo.toml`: ```toml -gpui = { git = "https://github.com/zed-industries/zed" } +gpui = { version = "*" } ``` + - [Ownership and data flow](_ownership_and_data_flow) + Everything in GPUI starts with an `Application`. You can create one with `Application::new()`, and kick off your application by passing a callback to `Application::run()`. Inside this callback, you can create a new window with `App::open_window()`, and register your first root view. See [gpui.rs](https://www.gpui.rs/) for a complete example. ### Dependencies @@ -23,7 +25,7 @@ On macOS, GPUI uses Metal for rendering. In order to use Metal, you need to do t - Install [Xcode](https://apps.apple.com/us/app/xcode/id497799835?mt=12) from the macOS App Store, or from the [Apple Developer](https://developer.apple.com/download/all/) website. Note this requires a developer account. -> Ensure you launch Xcode after installing, and install the macOS components, which is the default option. If you are on macOS 26 (Tahoe) you will need to use `--features gpui/runtime_shaders` or add the feature in the root `Cargo.toml` +> Ensure you launch Xcode after installing, and install the macOS components, which is the default option. - Install [Xcode command line tools](https://developer.apple.com/xcode/resources/) diff --git a/crates/gpui/build.rs b/crates/gpui/build.rs index 0040046f90554ecd3cb4c010faf18e7b98b62159..e48594101f9cab5f945623df5b1ae47f8fd5a058 100644 --- a/crates/gpui/build.rs +++ b/crates/gpui/build.rs @@ -1,3 +1,4 @@ +#![allow(clippy::disallowed_methods, reason = "build scripts are exempt")] #![cfg_attr(any(not(target_os = "macos"), feature = "macos-blade"), allow(unused))] //TODO: consider generating shader code for WGSL diff --git a/crates/gpui/examples/animation.rs b/crates/gpui/examples/animation.rs index 6bfe75dd0a51fa5807efc6cd579751460aa8b187..16d6e1b269975f61316fa35880d5d3924790fed1 100644 --- a/crates/gpui/examples/animation.rs +++ b/crates/gpui/examples/animation.rs @@ -3,8 +3,8 @@ use std::time::Duration; use anyhow::Result; use gpui::{ Animation, AnimationExt as _, App, Application, AssetSource, Bounds, Context, SharedString, - Transformation, Window, WindowBounds, WindowOptions, black, bounce, div, ease_in_out, - percentage, prelude::*, px, rgb, size, svg, + Transformation, Window, WindowBounds, WindowOptions, bounce, div, ease_in_out, percentage, + prelude::*, px, size, svg, }; struct Assets {} @@ -21,7 +21,7 @@ impl AssetSource for Assets { Ok(std::fs::read_dir(path)? .filter_map(|entry| { Some(SharedString::from( - entry.ok()?.path().to_string_lossy().to_string(), + entry.ok()?.path().to_string_lossy().into_owned(), )) }) .collect::>()) @@ -37,37 +37,66 @@ struct AnimationExample {} impl Render for AnimationExample { fn render(&mut self, _window: &mut Window, _cx: &mut Context) -> impl IntoElement { - div().flex().flex_col().size_full().justify_around().child( - div().flex().flex_row().w_full().justify_around().child( + div() + .flex() + .flex_col() + .size_full() + .bg(gpui::white()) + .text_color(gpui::black()) + .justify_around() + .child( div() .flex() - .bg(rgb(0x2e7d32)) - .size(px(300.0)) - .justify_center() - .items_center() - .shadow_lg() - .text_xl() - .text_color(black()) - .child("hello") + .flex_col() + .size_full() + .justify_around() .child( - svg() - .size_8() - .path(ARROW_CIRCLE_SVG) - .text_color(black()) - .with_animation( - "image_circle", - Animation::new(Duration::from_secs(2)) - .repeat() - .with_easing(bounce(ease_in_out)), - |svg, delta| { - svg.with_transformation(Transformation::rotate(percentage( - delta, - ))) - }, + div() + .id("content") + .flex() + .flex_col() + .h(px(150.)) + .overflow_y_scroll() + .w_full() + .flex_1() + .justify_center() + .items_center() + .text_xl() + .gap_4() + .child("Hello Animation") + .child( + svg() + .size_20() + .overflow_hidden() + .path(ARROW_CIRCLE_SVG) + .text_color(gpui::black()) + .with_animation( + "image_circle", + Animation::new(Duration::from_secs(2)) + .repeat() + .with_easing(bounce(ease_in_out)), + |svg, delta| { + svg.with_transformation(Transformation::rotate( + percentage(delta), + )) + }, + ), ), + ) + .child( + div() + .flex() + .h(px(64.)) + .w_full() + .p_2() + .justify_center() + .items_center() + .border_t_1() + .border_color(gpui::black().opacity(0.1)) + .bg(gpui::black().opacity(0.05)) + .child("Other Panel"), ), - ), - ) + ) } } diff --git a/crates/gpui/examples/data_table.rs b/crates/gpui/examples/data_table.rs index 10e22828a8e8f5c8778cbcb06a087d4bdfac3adc..e176c44d530ecbc6d5d3140f5c2defaa30a6149e 100644 --- a/crates/gpui/examples/data_table.rs +++ b/crates/gpui/examples/data_table.rs @@ -238,7 +238,7 @@ impl RenderOnce for TableRow { .flex_row() .border_b_1() .border_color(rgb(0xE0E0E0)) - .bg(if self.ix % 2 == 0 { + .bg(if self.ix.is_multiple_of(2) { rgb(0xFFFFFF) } else { rgb(0xFAFAFA) diff --git a/crates/gpui/examples/image_loading.rs b/crates/gpui/examples/image_loading.rs index 2c4d6e9437191405129e52a3af17a6ac8bcc883d..399bd2634f9bfb363d3ff9614150f2082e824eca 100644 --- a/crates/gpui/examples/image_loading.rs +++ b/crates/gpui/examples/image_loading.rs @@ -2,9 +2,9 @@ use std::{path::Path, sync::Arc, time::Duration}; use gpui::{ Animation, AnimationExt, App, Application, Asset, AssetLogger, AssetSource, Bounds, Context, - Hsla, ImageAssetLoader, ImageCacheError, ImgResourceLoader, LOADING_DELAY, Length, Pixels, - RenderImage, Resource, SharedString, Window, WindowBounds, WindowOptions, black, div, img, - prelude::*, pulsating_between, px, red, size, + Hsla, ImageAssetLoader, ImageCacheError, ImgResourceLoader, LOADING_DELAY, Length, RenderImage, + Resource, SharedString, Window, WindowBounds, WindowOptions, black, div, img, prelude::*, + pulsating_between, px, red, size, }; struct Assets {} @@ -21,7 +21,7 @@ impl AssetSource for Assets { Ok(std::fs::read_dir(path)? .filter_map(|entry| { Some(SharedString::from( - entry.ok()?.path().to_string_lossy().to_string(), + entry.ok()?.path().to_string_lossy().into_owned(), )) }) .collect::>()) @@ -105,7 +105,7 @@ impl Render for ImageLoadingExample { div() .flex() .bg(gpui::white()) - .size(Length::Definite(Pixels(300.0).into())) + .size(Length::Definite(px(300.0).into())) .justify_center() .items_center() .child({ @@ -199,7 +199,7 @@ fn main() { let options = WindowOptions { window_bounds: Some(WindowBounds::Windowed(Bounds::centered( None, - size(px(300.), Pixels(300.)), + size(px(300.), px(300.)), cx, ))), ..Default::default() diff --git a/crates/gpui/examples/opacity.rs b/crates/gpui/examples/opacity.rs index 634df29a4c0be14ac3efd97b39f6db70d95e383a..b6c01fc3cf3866d29e184ccf975e6796e7d07df7 100644 --- a/crates/gpui/examples/opacity.rs +++ b/crates/gpui/examples/opacity.rs @@ -1,10 +1,9 @@ -use std::{fs, path::PathBuf, time::Duration}; +use std::{fs, path::PathBuf}; use anyhow::Result; use gpui::{ App, Application, AssetSource, Bounds, BoxShadow, ClickEvent, Context, SharedString, Task, - Timer, Window, WindowBounds, WindowOptions, div, hsla, img, point, prelude::*, px, rgb, size, - svg, + Window, WindowBounds, WindowOptions, div, hsla, img, point, prelude::*, px, rgb, size, svg, }; struct Assets { @@ -37,6 +36,7 @@ impl AssetSource for Assets { struct HelloWorld { _task: Option>, opacity: f32, + animating: bool, } impl HelloWorld { @@ -44,39 +44,29 @@ impl HelloWorld { Self { _task: None, opacity: 0.5, + animating: false, } } - fn change_opacity(&mut self, _: &ClickEvent, window: &mut Window, cx: &mut Context) { + fn start_animation(&mut self, _: &ClickEvent, _: &mut Window, cx: &mut Context) { self.opacity = 0.0; + self.animating = true; cx.notify(); - - self._task = Some(cx.spawn_in(window, async move |view, cx| { - loop { - Timer::after(Duration::from_secs_f32(0.05)).await; - let mut stop = false; - let _ = cx.update(|_, cx| { - view.update(cx, |view, cx| { - if view.opacity >= 1.0 { - stop = true; - return; - } - - view.opacity += 0.1; - cx.notify(); - }) - }); - - if stop { - break; - } - } - })); } } impl Render for HelloWorld { - fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + if self.animating { + self.opacity += 0.005; + if self.opacity >= 1.0 { + self.animating = false; + self.opacity = 1.0; + } else { + window.request_animation_frame(); + } + } + div() .flex() .flex_row() @@ -96,7 +86,7 @@ impl Render for HelloWorld { .child( div() .id("panel") - .on_click(cx.listener(Self::change_opacity)) + .on_click(cx.listener(Self::start_animation)) .absolute() .top_8() .left_8() @@ -150,7 +140,15 @@ impl Render for HelloWorld { .text_2xl() .size_8(), ) - .child("🎊✈️🎉🎈🎁🎂") + .child( + div() + .flex() + .children(["🎊", "✈️", "🎉", "🎈", "🎁", "🎂"].map(|emoji| { + div() + .child(emoji.to_string()) + .hover(|style| style.opacity(0.5)) + })), + ) .child(img("image/black-cat-typing.gif").size_12()), ), ) diff --git a/crates/gpui/examples/text.rs b/crates/gpui/examples/text.rs index 66e9cff0aa9773d99b412ea7249ca64ea103b138..3cb95897b668eeb142d6b84f13af83b1ad3ff5f4 100644 --- a/crates/gpui/examples/text.rs +++ b/crates/gpui/examples/text.rs @@ -132,11 +132,11 @@ impl RenderOnce for Specimen { let mut line_height = global_style.line_height; if let Some(style_override) = style_override { - font_size = style_override.font_size.to_pixels(rem_size).0; + font_size = style_override.font_size.to_pixels(rem_size).into(); line_height = match style_override.line_height { DefiniteLength::Absolute(absolute_len) => match absolute_len { - AbsoluteLength::Rems(absolute_len) => absolute_len.to_pixels(rem_size).0, - AbsoluteLength::Pixels(absolute_len) => absolute_len.0, + AbsoluteLength::Rems(absolute_len) => absolute_len.to_pixels(rem_size).into(), + AbsoluteLength::Pixels(absolute_len) => absolute_len.into(), }, DefiniteLength::Fraction(value) => value, }; diff --git a/crates/gpui/src/_ownership_and_data_flow.rs b/crates/gpui/src/_ownership_and_data_flow.rs new file mode 100644 index 0000000000000000000000000000000000000000..9bb8bf66956a101cc8d9db170e34512628a6b0be --- /dev/null +++ b/crates/gpui/src/_ownership_and_data_flow.rs @@ -0,0 +1,140 @@ +//! In GPUI, every model or view in the application is actually owned by a single top-level object called the `App`. When a new entity or view is created (referred to collectively as _entities_), the application is given ownership of their state to enable their participation in a variety of app services and interaction with other entities. +//! +//! To illustrate, consider the trivial app below. We start the app by calling `run` with a callback, which is passed a reference to the `App` that owns all the state for the application. This `App` is our gateway to all application-level services, such as opening windows, presenting dialogs, etc. It also has an `insert_entity` method, which is called below to create an entity and give ownership of it to the application. +//! +//! ```no_run +//! # use gpui::{App, AppContext, Application, Entity}; +//! # struct Counter { +//! # count: usize, +//! # } +//! Application::new().run(|cx: &mut App| { +//! let _counter: Entity = cx.new(|_cx| Counter { count: 0 }); +//! // ... +//! }); +//! ``` +//! +//! The call to `new_entity` returns an _entity handle_, which carries a type parameter based on the type of object it references. By itself, this `Entity` handle doesn't provide access to the entity's state. It's merely an inert identifier plus a compile-time type tag, and it maintains a reference counted pointer to the underlying `Counter` object that is owned by the app. +//! +//! Much like an `Rc` from the Rust standard library, this reference count is incremented when the handle is cloned and decremented when it is dropped to enable shared ownership over the underlying model, but unlike an `Rc` it only provides access to the model's state when a reference to an `App` is available. The handle doesn't truly _own_ the state, but it can be used to access the state from its true owner, the `App`. Stripping away some of the setup code for brevity: +//! +//! ```no_run +//! # use gpui::{App, AppContext, Application, Context, Entity}; +//! # struct Counter { +//! # count: usize, +//! # } +//! Application::new().run(|cx: &mut App| { +//! let counter: Entity = cx.new(|_cx| Counter { count: 0 }); +//! // Call `update` to access the model's state. +//! counter.update(cx, |counter: &mut Counter, _cx: &mut Context| { +//! counter.count += 1; +//! }); +//! }); +//! ``` +//! +//! To update the counter, we call `update` on the handle, passing the context reference and a callback. The callback is yielded a mutable reference to the counter, which can be used to manipulate state. +//! +//! The callback is also provided a second `Context` reference. This reference is similar to the `App` reference provided to the `run` callback. A `Context` is actually a wrapper around the `App`, including some additional data to indicate which particular entity it is tied to; in this case the counter. +//! +//! In addition to the application-level services provided by `App`, a `Context` provides access to entity-level services. For example, it can be used it to inform observers of this entity that its state has changed. Let's add that to our example, by calling `cx.notify()`. +//! +//! ```no_run +//! # use gpui::{App, AppContext, Application, Entity}; +//! # struct Counter { +//! # count: usize, +//! # } +//! Application::new().run(|cx: &mut App| { +//! let counter: Entity = cx.new(|_cx| Counter { count: 0 }); +//! counter.update(cx, |counter, cx| { +//! counter.count += 1; +//! cx.notify(); // Notify observers +//! }); +//! }); +//! ``` +//! +//! Next, these notifications need to be observed and reacted to. Before updating the counter, we'll construct a second counter that observes it. Whenever the first counter changes, twice its count is assigned to the second counter. Note how `observe` is called on the `Context` belonging to our second counter to arrange for it to be notified whenever the first counter notifies. The call to `observe` returns a `Subscription`, which is `detach`ed to preserve this behavior for as long as both counters exist. We could also store this subscription and drop it at a time of our choosing to cancel this behavior. +//! +//! The `observe` callback is passed a mutable reference to the observer and a _handle_ to the observed counter, whose state we access with the `read` method. +//! +//! ```no_run +//! # use gpui::{App, AppContext, Application, Entity, prelude::*}; +//! # struct Counter { +//! # count: usize, +//! # } +//! Application::new().run(|cx: &mut App| { +//! let first_counter: Entity = cx.new(|_cx| Counter { count: 0 }); +//! +//! let second_counter = cx.new(|cx: &mut Context| { +//! // Note we can set up the callback before the Counter is even created! +//! cx.observe( +//! &first_counter, +//! |second: &mut Counter, first: Entity, cx| { +//! second.count = first.read(cx).count * 2; +//! }, +//! ) +//! .detach(); +//! +//! Counter { count: 0 } +//! }); +//! +//! first_counter.update(cx, |counter, cx| { +//! counter.count += 1; +//! cx.notify(); +//! }); +//! +//! assert_eq!(second_counter.read(cx).count, 2); +//! }); +//! ``` +//! +//! After updating the first counter, it can be noted that the observing counter's state is maintained according to our subscription. +//! +//! In addition to `observe` and `notify`, which indicate that an entity's state has changed, GPUI also offers `subscribe` and `emit`, which enables entities to emit typed events. To opt into this system, the emitting object must implement the `EventEmitter` trait. +//! +//! Let's introduce a new event type called `CounterChangeEvent`, then indicate that `Counter` can emit this type of event: +//! +//! ```no_run +//! use gpui::EventEmitter; +//! # struct Counter { +//! # count: usize, +//! # } +//! struct CounterChangeEvent { +//! increment: usize, +//! } +//! +//! impl EventEmitter for Counter {} +//! ``` +//! +//! Next, the example should be updated, replacing the observation with a subscription. Whenever the counter is incremented, a `Change` event is emitted to indicate the magnitude of the increase. +//! +//! ```no_run +//! # use gpui::{App, AppContext, Application, Context, Entity, EventEmitter}; +//! # struct Counter { +//! # count: usize, +//! # } +//! # struct CounterChangeEvent { +//! # increment: usize, +//! # } +//! # impl EventEmitter for Counter {} +//! Application::new().run(|cx: &mut App| { +//! let first_counter: Entity = cx.new(|_cx| Counter { count: 0 }); +//! +//! let second_counter = cx.new(|cx: &mut Context| { +//! // Note we can set up the callback before the Counter is even created! +//! cx.subscribe(&first_counter, |second: &mut Counter, _first: Entity, event, _cx| { +//! second.count += event.increment * 2; +//! }) +//! .detach(); +//! +//! Counter { +//! count: first_counter.read(cx).count * 2, +//! } +//! }); +//! +//! first_counter.update(cx, |first, cx| { +//! first.count += 2; +//! cx.emit(CounterChangeEvent { increment: 2 }); +//! cx.notify(); +//! }); +//! +//! assert_eq!(second_counter.read(cx).count, 4); +//! }); +//! ``` diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 8b0b404d1dffbf8a27de1f29437ce9cc2ba63f0f..07ff04e32abc19dbe681ab6214d06469fe7917ff 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -958,6 +958,14 @@ impl App { cx.window_update_stack.pop(); window.root.replace(root_view.into()); window.defer(cx, |window: &mut Window, cx| window.appearance_changed(cx)); + + // allow a window to draw at least once before returning + // this didn't cause any issues on non windows platforms as it seems we always won the race to on_request_frame + // on windows we quite frequently lose the race and return a window that has never rendered, which leads to a crash + // where DispatchTree::root_node_id asserts on empty nodes + let clear = window.draw(cx); + clear.clear(); + cx.window_handles.insert(id, window.handle); cx.windows.get_mut(id).unwrap().replace(window); Ok(handle) @@ -2393,6 +2401,20 @@ impl<'a, T: 'static> std::borrow::BorrowMut for GpuiBorrow<'a, T> { } } +impl<'a, T: 'static> std::ops::Deref for GpuiBorrow<'a, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.inner.as_ref().unwrap() + } +} + +impl<'a, T: 'static> std::ops::DerefMut for GpuiBorrow<'a, T> { + fn deref_mut(&mut self) -> &mut T { + self.inner.as_mut().unwrap() + } +} + impl<'a, T> Drop for GpuiBorrow<'a, T> { fn drop(&mut self) { let lease = self.inner.take().unwrap(); diff --git a/crates/gpui/src/app/context.rs b/crates/gpui/src/app/context.rs index 1112878a66b07c133031086c3b14aa8427617bea..41d6cac82b7c179040d61ddfd22b003c143a5fb9 100644 --- a/crates/gpui/src/app/context.rs +++ b/crates/gpui/src/app/context.rs @@ -4,12 +4,12 @@ use crate::{ Subscription, Task, WeakEntity, WeakFocusHandle, Window, WindowHandle, }; use anyhow::Result; -use derive_more::{Deref, DerefMut}; use futures::FutureExt; use std::{ any::{Any, TypeId}, borrow::{Borrow, BorrowMut}, future::Future, + ops, sync::Arc, }; use util::Deferred; @@ -17,14 +17,25 @@ use util::Deferred; use super::{App, AsyncWindowContext, Entity, KeystrokeEvent}; /// The app context, with specialized behavior for the given entity. -#[derive(Deref, DerefMut)] pub struct Context<'a, T> { - #[deref] - #[deref_mut] app: &'a mut App, entity_state: WeakEntity, } +impl<'a, T> ops::Deref for Context<'a, T> { + type Target = App; + + fn deref(&self) -> &Self::Target { + self.app + } +} + +impl<'a, T> ops::DerefMut for Context<'a, T> { + fn deref_mut(&mut self) -> &mut Self::Target { + self.app + } +} + impl<'a, T: 'static> Context<'a, T> { pub(crate) fn new_context(app: &'a mut App, entity_state: WeakEntity) -> Self { Self { app, entity_state } @@ -69,6 +80,20 @@ impl<'a, T: 'static> Context<'a, T> { }) } + /// Observe changes to ourselves + pub fn observe_self( + &mut self, + mut on_event: impl FnMut(&mut T, &mut Context) + 'static, + ) -> Subscription + where + T: 'static, + { + let this = self.entity(); + self.app.observe(&this, move |this, cx| { + this.update(cx, |this, cx| on_event(this, cx)) + }) + } + /// Subscribe to an event type from another entity pub fn subscribe( &mut self, diff --git a/crates/gpui/src/color.rs b/crates/gpui/src/color.rs index c6c4cdc77b133105a7c233417efae06d5c7aa220..3af5731bb57dad81a522d93a77c0aec871ae47cb 100644 --- a/crates/gpui/src/color.rs +++ b/crates/gpui/src/color.rs @@ -151,9 +151,9 @@ impl From for Rgba { }; Rgba { - r, - g, - b, + r: r.clamp(0., 1.), + g: g.clamp(0., 1.), + b: b.clamp(0., 1.), a: color.a, } } @@ -362,7 +362,7 @@ pub const fn transparent_black() -> Hsla { } } -/// Transparent black in [`Hsla`] +/// Transparent white in [`Hsla`] pub const fn transparent_white() -> Hsla { Hsla { h: 0., diff --git a/crates/gpui/src/elements/div.rs b/crates/gpui/src/elements/div.rs index bd2eed33973eb520305ab7b185f41569ef778dbf..06fe5902bf6eca527f5f16d84e88c9c847e3e08a 100644 --- a/crates/gpui/src/elements/div.rs +++ b/crates/gpui/src/elements/div.rs @@ -618,10 +618,37 @@ pub trait InteractiveElement: Sized { self } - /// Set index of the tab stop order. + /// Set whether this element is a tab stop. + /// + /// When false, the element remains in tab-index order but cannot be reached via keyboard navigation. + /// Useful for container elements: focus the container, then call `window.focus_next()` to focus + /// the first tab stop inside it while having the container element itself be unreachable via the keyboard. + /// Should only be used with `tab_index`. + fn tab_stop(mut self, tab_stop: bool) -> Self { + self.interactivity().tab_stop = tab_stop; + self + } + + /// Set index of the tab stop order, and set this node as a tab stop. + /// This will default the element to being a tab stop. See [`Self::tab_stop`] for more information. + /// This should only be used in conjunction with `tab_group` + /// in order to not interfere with the tab index of other elements. fn tab_index(mut self, index: isize) -> Self { self.interactivity().focusable = true; self.interactivity().tab_index = Some(index); + self.interactivity().tab_stop = true; + self + } + + /// Designate this div as a "tab group". Tab groups have their own location in the tab-index order, + /// but for children of the tab group, the tab index is reset to 0. This can be useful for swapping + /// the order of tab stops within the group, without having to renumber all the tab stops in the whole + /// application. + fn tab_group(mut self) -> Self { + self.interactivity().tab_group = true; + if self.interactivity().tab_index.is_none() { + self.interactivity().tab_index = Some(0); + } self } @@ -1365,6 +1392,10 @@ impl Element for Div { (child_max - child_min).into() }; + if let Some(scroll_handle) = self.interactivity.tracked_scroll_handle.as_ref() { + scroll_handle.scroll_to_active_item(); + } + self.interactivity.prepaint( global_id, inspector_id, @@ -1481,6 +1512,8 @@ pub struct Interactivity { pub(crate) window_control: Option, pub(crate) hitbox_behavior: HitboxBehavior, pub(crate) tab_index: Option, + pub(crate) tab_group: bool, + pub(crate) tab_stop: bool, #[cfg(any(feature = "inspector", debug_assertions))] pub(crate) source_location: Option<&'static core::panic::Location<'static>>, @@ -1545,10 +1578,10 @@ impl Interactivity { .focus_handle .get_or_insert_with(|| cx.focus_handle()) .clone() - .tab_stop(false); + .tab_stop(self.tab_stop); if let Some(index) = self.tab_index { - handle = handle.tab_index(index).tab_stop(true); + handle = handle.tab_index(index); } self.tracked_focus_handle = Some(handle); @@ -1766,8 +1799,12 @@ impl Interactivity { return ((), element_state); } + let mut tab_group = None; + if self.tab_group { + tab_group = self.tab_index; + } if let Some(focus_handle) = &self.tracked_focus_handle { - window.next_frame.tab_handles.insert(focus_handle); + window.next_frame.tab_stops.insert(focus_handle); } window.with_element_opacity(style.opacity, |window| { @@ -1776,55 +1813,59 @@ impl Interactivity { window.with_content_mask( style.overflow_mask(bounds, window.rem_size()), |window| { - if let Some(hitbox) = hitbox { - #[cfg(debug_assertions)] - self.paint_debug_info( - global_id, hitbox, &style, window, cx, - ); - - if let Some(drag) = cx.active_drag.as_ref() { - if let Some(mouse_cursor) = drag.cursor_style { - window.set_window_cursor_style(mouse_cursor); + window.with_tab_group(tab_group, |window| { + if let Some(hitbox) = hitbox { + #[cfg(debug_assertions)] + self.paint_debug_info( + global_id, hitbox, &style, window, cx, + ); + + if let Some(drag) = cx.active_drag.as_ref() { + if let Some(mouse_cursor) = drag.cursor_style { + window.set_window_cursor_style(mouse_cursor); + } + } else { + if let Some(mouse_cursor) = style.mouse_cursor { + window.set_cursor_style(mouse_cursor, hitbox); + } } - } else { - if let Some(mouse_cursor) = style.mouse_cursor { - window.set_cursor_style(mouse_cursor, hitbox); + + if let Some(group) = self.group.clone() { + GroupHitboxes::push(group, hitbox.id, cx); } - } - if let Some(group) = self.group.clone() { - GroupHitboxes::push(group, hitbox.id, cx); - } + if let Some(area) = self.window_control { + window.insert_window_control_hitbox( + area, + hitbox.clone(), + ); + } - if let Some(area) = self.window_control { - window - .insert_window_control_hitbox(area, hitbox.clone()); + self.paint_mouse_listeners( + hitbox, + element_state.as_mut(), + window, + cx, + ); + self.paint_scroll_listener(hitbox, &style, window, cx); } - self.paint_mouse_listeners( - hitbox, - element_state.as_mut(), - window, - cx, - ); - self.paint_scroll_listener(hitbox, &style, window, cx); - } - - self.paint_keyboard_listeners(window, cx); - f(&style, window, cx); + self.paint_keyboard_listeners(window, cx); + f(&style, window, cx); - if let Some(_hitbox) = hitbox { - #[cfg(any(feature = "inspector", debug_assertions))] - window.insert_inspector_hitbox( - _hitbox.id, - _inspector_id, - cx, - ); + if let Some(_hitbox) = hitbox { + #[cfg(any(feature = "inspector", debug_assertions))] + window.insert_inspector_hitbox( + _hitbox.id, + _inspector_id, + cx, + ); - if let Some(group) = self.group.as_ref() { - GroupHitboxes::pop(group, cx); + if let Some(group) = self.group.as_ref() { + GroupHitboxes::pop(group, cx); + } } - } + }) }, ); }); @@ -2958,8 +2999,7 @@ where } /// Represents an element that can be scrolled *to* in its parent element. -/// -/// Contrary to [ScrollHandle::scroll_to_item], an anchored element does not have to be an immediate child of the parent. +/// Contrary to [ScrollHandle::scroll_to_active_item], an anchored element does not have to be an immediate child of the parent. #[derive(Clone)] pub struct ScrollAnchor { handle: ScrollHandle, @@ -2994,6 +3034,20 @@ struct ScrollHandleState { child_bounds: Vec>, scroll_to_bottom: bool, overflow: Point, + active_item: Option, +} + +#[derive(Default, Debug, Clone, Copy)] +struct ScrollActiveItem { + index: usize, + strategy: ScrollStrategy, +} + +#[derive(Default, Debug, Clone, Copy)] +enum ScrollStrategy { + #[default] + FirstVisible, + Top, } /// A handle to the scrollable aspects of an element. @@ -3043,6 +3097,25 @@ impl ScrollHandle { } } + /// Get the bottom child that's scrolled into view. + pub fn bottom_item(&self) -> usize { + let state = self.0.borrow(); + let bottom = state.bounds.bottom() - state.offset.borrow().y; + + match state.child_bounds.binary_search_by(|bounds| { + if bottom < bounds.top() { + Ordering::Greater + } else if bottom > bounds.bottom() { + Ordering::Less + } else { + Ordering::Equal + } + }) { + Ok(ix) => ix, + Err(ix) => ix.min(state.child_bounds.len().saturating_sub(1)), + } + } + /// Return the bounds into which this child is painted pub fn bounds(&self) -> Bounds { self.0.borrow().bounds @@ -3053,32 +3126,66 @@ impl ScrollHandle { self.0.borrow().child_bounds.get(ix).cloned() } - /// scroll_to_item scrolls the minimal amount to ensure that the child is - /// fully visible + /// Update [ScrollHandleState]'s active item for scrolling to in prepaint pub fn scroll_to_item(&self, ix: usize) { - let state = self.0.borrow(); + let mut state = self.0.borrow_mut(); + state.active_item = Some(ScrollActiveItem { + index: ix, + strategy: ScrollStrategy::default(), + }); + } + + /// Update [ScrollHandleState]'s active item for scrolling to in prepaint + /// This scrolls the minimal amount to ensure that the child is the first visible element + pub fn scroll_to_top_of_item(&self, ix: usize) { + let mut state = self.0.borrow_mut(); + state.active_item = Some(ScrollActiveItem { + index: ix, + strategy: ScrollStrategy::Top, + }); + } + + /// Scrolls the minimal amount to either ensure that the child is + /// fully visible or the top element of the view depends on the + /// scroll strategy + fn scroll_to_active_item(&self) { + let mut state = self.0.borrow_mut(); - let Some(bounds) = state.child_bounds.get(ix) else { + let Some(active_item) = state.active_item else { return; }; - let mut scroll_offset = state.offset.borrow_mut(); - - if state.overflow.y == Overflow::Scroll { - if bounds.top() + scroll_offset.y < state.bounds.top() { - scroll_offset.y = state.bounds.top() - bounds.top(); - } else if bounds.bottom() + scroll_offset.y > state.bounds.bottom() { - scroll_offset.y = state.bounds.bottom() - bounds.bottom(); - } - } + let active_item = match state.child_bounds.get(active_item.index) { + Some(bounds) => { + let mut scroll_offset = state.offset.borrow_mut(); + + match active_item.strategy { + ScrollStrategy::FirstVisible => { + if state.overflow.y == Overflow::Scroll { + if bounds.top() + scroll_offset.y < state.bounds.top() { + scroll_offset.y = state.bounds.top() - bounds.top(); + } else if bounds.bottom() + scroll_offset.y > state.bounds.bottom() { + scroll_offset.y = state.bounds.bottom() - bounds.bottom(); + } + } + } + ScrollStrategy::Top => { + scroll_offset.y = state.bounds.top() - bounds.top(); + } + } - if state.overflow.x == Overflow::Scroll { - if bounds.left() + scroll_offset.x < state.bounds.left() { - scroll_offset.x = state.bounds.left() - bounds.left(); - } else if bounds.right() + scroll_offset.x > state.bounds.right() { - scroll_offset.x = state.bounds.right() - bounds.right(); + if state.overflow.x == Overflow::Scroll { + if bounds.left() + scroll_offset.x < state.bounds.left() { + scroll_offset.x = state.bounds.left() - bounds.left(); + } else if bounds.right() + scroll_offset.x > state.bounds.right() { + scroll_offset.x = state.bounds.right() - bounds.right(); + } + } + None } - } + None => Some(active_item), + }; + state.active_item = active_item; } /// Scrolls to the bottom. @@ -3110,6 +3217,21 @@ impl ScrollHandle { } } + /// Get the logical scroll bottom, based on a child index and a pixel offset. + pub fn logical_scroll_bottom(&self) -> (usize, Pixels) { + let ix = self.bottom_item(); + let state = self.0.borrow(); + + if let Some(child_bounds) = state.child_bounds.get(ix) { + ( + ix, + child_bounds.bottom() + state.offset.borrow().y - state.bounds.bottom(), + ) + } else { + (ix, px(0.)) + } + } + /// Get the count of children for scrollable item. pub fn children_count(&self) -> usize { self.0.borrow().child_bounds.len() diff --git a/crates/gpui/src/elements/img.rs b/crates/gpui/src/elements/img.rs index 40d1b5e44981b7cfd0de92ddbb10f2f715008c70..9760dd7d9ed953c9a335bcdeee42dc60cac08fde 100644 --- a/crates/gpui/src/elements/img.rs +++ b/crates/gpui/src/elements/img.rs @@ -352,7 +352,7 @@ impl Element for Img { Length::Definite(DefiniteLength::Absolute( AbsoluteLength::Pixels(width), )) => Length::Definite( - px(image_size.height.0 * width.0 / image_size.width.0) + px(image_size.height * f32::from(width) / image_size.width) .into(), ), _ => Length::Definite(image_size.height.into()), diff --git a/crates/gpui/src/elements/list.rs b/crates/gpui/src/elements/list.rs index ed4ca64e83513531b9176f05c4c00b0af71aea74..d82d7a67a12190a19acde5715378d295c2eb9bc8 100644 --- a/crates/gpui/src/elements/list.rs +++ b/crates/gpui/src/elements/list.rs @@ -245,7 +245,7 @@ impl ListState { ) { let state = &mut *self.0.borrow_mut(); - let mut old_items = state.items.cursor::(&()); + let mut old_items = state.items.cursor::(()); let mut new_items = old_items.slice(&Count(old_range.start), Bias::Right); old_items.seek_forward(&Count(old_range.end), Bias::Right); @@ -255,9 +255,9 @@ impl ListState { spliced_count += 1; ListItem::Unmeasured { focus_handle } }), - &(), + (), ); - new_items.append(old_items.suffix(), &()); + new_items.append(old_items.suffix(), ()); drop(old_items); state.items = new_items; @@ -296,7 +296,7 @@ impl ListState { let current_offset = self.logical_scroll_top(); let state = &mut *self.0.borrow_mut(); - let mut cursor = state.items.cursor::(&()); + let mut cursor = state.items.cursor::(()); cursor.seek(&Count(current_offset.item_ix), Bias::Right); let start_pixel_offset = cursor.start().height + current_offset.offset_in_item; @@ -339,7 +339,7 @@ impl ListState { scroll_top.item_ix = ix; scroll_top.offset_in_item = px(0.); } else { - let mut cursor = state.items.cursor::(&()); + let mut cursor = state.items.cursor::(()); cursor.seek(&Count(ix + 1), Bias::Right); let bottom = cursor.start().height + padding.top; let goal_top = px(0.).max(bottom - height + padding.bottom); @@ -368,7 +368,7 @@ impl ListState { return None; } - let mut cursor = state.items.cursor::>(&()); + let mut cursor = state.items.cursor::>(()); cursor.seek(&Count(scroll_top.item_ix), Bias::Right); let scroll_top = cursor.start().1.0 + scroll_top.offset_in_item; @@ -426,7 +426,7 @@ impl ListState { let state = &self.0.borrow(); let logical_scroll_top = state.logical_scroll_top(); - let mut cursor = state.items.cursor::(&()); + let mut cursor = state.items.cursor::(()); let summary: ListItemSummary = cursor.summary(&Count(logical_scroll_top.item_ix), Bias::Right); let content_height = state.items.summary().height; @@ -446,7 +446,7 @@ impl ListState { impl StateInner { fn visible_range(&self, height: Pixels, scroll_top: &ListOffset) -> Range { - let mut cursor = self.items.cursor::(&()); + let mut cursor = self.items.cursor::(()); cursor.seek(&Count(scroll_top.item_ix), Bias::Right); let start_y = cursor.start().height + scroll_top.offset_in_item; cursor.seek_forward(&Height(start_y + height), Bias::Left); @@ -478,7 +478,7 @@ impl StateInner { if self.alignment == ListAlignment::Bottom && new_scroll_top == scroll_max { self.logical_scroll_top = None; } else { - let mut cursor = self.items.cursor::(&()); + let mut cursor = self.items.cursor::(()); cursor.seek(&Height(new_scroll_top), Bias::Right); let item_ix = cursor.start().count; let offset_in_item = new_scroll_top - cursor.start().height; @@ -519,7 +519,7 @@ impl StateInner { } fn scroll_top(&self, logical_scroll_top: &ListOffset) -> Pixels { - let mut cursor = self.items.cursor::(&()); + let mut cursor = self.items.cursor::(()); cursor.seek(&Count(logical_scroll_top.item_ix), Bias::Right); cursor.start().height + logical_scroll_top.offset_in_item } @@ -548,7 +548,7 @@ impl StateInner { AvailableSpace::MinContent, ); - let mut cursor = old_items.cursor::(&()); + let mut cursor = old_items.cursor::(()); // Render items after the scroll top, including those in the trailing overdraw cursor.seek(&Count(scroll_top.item_ix), Bias::Right); @@ -663,11 +663,11 @@ impl StateInner { } let measured_range = cursor.start().0..(cursor.start().0 + measured_items.len()); - let mut cursor = old_items.cursor::(&()); + let mut cursor = old_items.cursor::(()); let mut new_items = cursor.slice(&Count(measured_range.start), Bias::Right); - new_items.extend(measured_items, &()); + new_items.extend(measured_items, ()); cursor.seek(&Count(measured_range.end), Bias::Right); - new_items.append(cursor.suffix(), &()); + new_items.append(cursor.suffix(), ()); self.items = new_items; // If none of the visible items are focused, check if an off-screen item is focused @@ -676,7 +676,7 @@ impl StateInner { if !rendered_focused_item { let mut cursor = self .items - .filter::<_, Count>(&(), |summary| summary.has_focus_handles); + .filter::<_, Count>((), |summary| summary.has_focus_handles); cursor.next(); while let Some(item) = cursor.item() { if item.contains_focused(window, cx) { @@ -741,7 +741,7 @@ impl StateInner { offset_in_item: autoscroll_bounds.top() - item_origin.y, }); } else if autoscroll_bounds.bottom() > bounds.bottom() { - let mut cursor = self.items.cursor::(&()); + let mut cursor = self.items.cursor::(()); cursor.seek(&Count(item.index), Bias::Right); let mut height = bounds.size.height - padding.top - padding.bottom; @@ -802,7 +802,7 @@ impl StateInner { if self.alignment == ListAlignment::Bottom && new_scroll_top == scroll_max { self.logical_scroll_top = None; } else { - let mut cursor = self.items.cursor::(&()); + let mut cursor = self.items.cursor::(()); cursor.seek(&Height(new_scroll_top), Bias::Right); let item_ix = cursor.start().count; @@ -946,7 +946,7 @@ impl Element for List { state.items.iter().map(|item| ListItem::Unmeasured { focus_handle: item.focus_handle(), }), - &(), + (), ); state.items = new_items; @@ -1027,7 +1027,7 @@ impl Styled for List { impl sum_tree::Item for ListItem { type Summary = ListItemSummary; - fn summary(&self, _: &()) -> Self::Summary { + fn summary(&self, _: ()) -> Self::Summary { match self { ListItem::Unmeasured { focus_handle } => ListItemSummary { count: 1, @@ -1049,14 +1049,12 @@ impl sum_tree::Item for ListItem { } } -impl sum_tree::Summary for ListItemSummary { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl sum_tree::ContextLessSummary for ListItemSummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &()) { + fn add_summary(&mut self, summary: &Self) { self.count += summary.count; self.rendered_count += summary.rendered_count; self.unrendered_count += summary.unrendered_count; @@ -1066,33 +1064,33 @@ impl sum_tree::Summary for ListItemSummary { } impl<'a> sum_tree::Dimension<'a, ListItemSummary> for Count { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ListItemSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ListItemSummary, _: ()) { self.0 += summary.count; } } impl<'a> sum_tree::Dimension<'a, ListItemSummary> for Height { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ListItemSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ListItemSummary, _: ()) { self.0 += summary.height; } } impl sum_tree::SeekTarget<'_, ListItemSummary, ListItemSummary> for Count { - fn cmp(&self, other: &ListItemSummary, _: &()) -> std::cmp::Ordering { + fn cmp(&self, other: &ListItemSummary, _: ()) -> std::cmp::Ordering { self.0.partial_cmp(&other.count).unwrap() } } impl sum_tree::SeekTarget<'_, ListItemSummary, ListItemSummary> for Height { - fn cmp(&self, other: &ListItemSummary, _: &()) -> std::cmp::Ordering { + fn cmp(&self, other: &ListItemSummary, _: ()) -> std::cmp::Ordering { self.0.partial_cmp(&other.height).unwrap() } } diff --git a/crates/gpui/src/elements/uniform_list.rs b/crates/gpui/src/elements/uniform_list.rs index 9c601aac1d72d915b2e8c4b3866de88b966c05f0..949d4339e616cd9f49b3783f46da0f80424c474f 100644 --- a/crates/gpui/src/elements/uniform_list.rs +++ b/crates/gpui/src/elements/uniform_list.rs @@ -88,6 +88,10 @@ pub enum ScrollStrategy { /// May not be possible if there's not enough list items above the item scrolled to: /// in this case, the element will be placed at the closest possible position. Center, + /// Attempt to place the element at the bottom of the list's viewport. + /// May not be possible if there's not enough list items above the item scrolled to: + /// in this case, the element will be placed at the closest possible position. + Bottom, } #[derive(Clone, Copy, Debug)] @@ -99,6 +103,7 @@ pub struct DeferredScrollToItem { pub strategy: ScrollStrategy, /// The offset in number of items pub offset: usize, + pub scroll_strict: bool, } #[derive(Clone, Debug, Default)] @@ -133,25 +138,73 @@ impl UniformListScrollHandle { }))) } - /// Scroll the list to the given item index. + /// Scroll the list so that the given item index is visible. + /// + /// This uses non-strict scrolling: if the item is already fully visible, no scrolling occurs. + /// If the item is out of view, it scrolls the minimum amount to bring it into view according + /// to the strategy. pub fn scroll_to_item(&self, ix: usize, strategy: ScrollStrategy) { self.0.borrow_mut().deferred_scroll_to_item = Some(DeferredScrollToItem { item_index: ix, strategy, offset: 0, + scroll_strict: false, }); } - /// Scroll the list to the given item index with an offset. + /// Scroll the list so that the given item index is at scroll strategy position. /// - /// For ScrollStrategy::Top, the item will be placed at the offset position from the top. + /// This uses strict scrolling: the item will always be scrolled to match the strategy position, + /// even if it's already visible. Use this when you need precise positioning. + pub fn scroll_to_item_strict(&self, ix: usize, strategy: ScrollStrategy) { + self.0.borrow_mut().deferred_scroll_to_item = Some(DeferredScrollToItem { + item_index: ix, + strategy, + offset: 0, + scroll_strict: true, + }); + } + + /// Scroll the list to the given item index with an offset in number of items. /// - /// For ScrollStrategy::Center, the item will be centered between offset and the last visible item. + /// This uses non-strict scrolling: if the item is already visible within the offset region, + /// no scrolling occurs. + /// + /// The offset parameter shrinks the effective viewport by the specified number of items + /// from the corresponding edge, then applies the scroll strategy within that reduced viewport: + /// - `ScrollStrategy::Top`: Shrinks from top, positions item at the new top + /// - `ScrollStrategy::Center`: Shrinks from top, centers item in the reduced viewport + /// - `ScrollStrategy::Bottom`: Shrinks from bottom, positions item at the new bottom pub fn scroll_to_item_with_offset(&self, ix: usize, strategy: ScrollStrategy, offset: usize) { self.0.borrow_mut().deferred_scroll_to_item = Some(DeferredScrollToItem { item_index: ix, strategy, offset, + scroll_strict: false, + }); + } + + /// Scroll the list so that the given item index is at the exact scroll strategy position with an offset. + /// + /// This uses strict scrolling: the item will always be scrolled to match the strategy position, + /// even if it's already visible. + /// + /// The offset parameter shrinks the effective viewport by the specified number of items + /// from the corresponding edge, then applies the scroll strategy within that reduced viewport: + /// - `ScrollStrategy::Top`: Shrinks from top, positions item at the new top + /// - `ScrollStrategy::Center`: Shrinks from top, centers item in the reduced viewport + /// - `ScrollStrategy::Bottom`: Shrinks from bottom, positions item at the new bottom + pub fn scroll_to_item_strict_with_offset( + &self, + ix: usize, + strategy: ScrollStrategy, + offset: usize, + ) { + self.0.borrow_mut().deferred_scroll_to_item = Some(DeferredScrollToItem { + item_index: ix, + strategy, + offset, + scroll_strict: true, }); } @@ -368,24 +421,36 @@ impl Element for UniformList { updated_scroll_offset.y = -(item_bottom - list_height) - padding.bottom; } - match deferred_scroll.strategy { - ScrollStrategy::Top => {} - ScrollStrategy::Center => { - if scrolled_to_top { + if deferred_scroll.scroll_strict + || (scrolled_to_top + && (item_top < scroll_top + offset_pixels + || item_bottom > scroll_top + list_height)) + { + match deferred_scroll.strategy { + ScrollStrategy::Top => { + updated_scroll_offset.y = -(item_top - offset_pixels) + .max(Pixels::ZERO) + .min(content_height - list_height) + .max(Pixels::ZERO); + } + ScrollStrategy::Center => { let item_center = item_top + item_height / 2.0; let viewport_height = list_height - offset_pixels; let viewport_center = offset_pixels + viewport_height / 2.0; let target_scroll_top = item_center - viewport_center; - if item_top < scroll_top + offset_pixels - || item_bottom > scroll_top + list_height - { - updated_scroll_offset.y = -target_scroll_top - .max(Pixels::ZERO) - .min(content_height - list_height) - .max(Pixels::ZERO); - } + updated_scroll_offset.y = -target_scroll_top + .max(Pixels::ZERO) + .min(content_height - list_height) + .max(Pixels::ZERO); + } + ScrollStrategy::Bottom => { + updated_scroll_offset.y = -(item_bottom - list_height + + offset_pixels) + .max(Pixels::ZERO) + .min(content_height - list_height) + .max(Pixels::ZERO); } } } diff --git a/crates/gpui/src/geometry.rs b/crates/gpui/src/geometry.rs index 8b98bab2cda655d66d76c39a8570d9b4ffa3d93b..fa6f90b9ac9949ed7b5444e13045aaef6f9c0224 100644 --- a/crates/gpui/src/geometry.rs +++ b/crates/gpui/src/geometry.rs @@ -200,9 +200,9 @@ impl Point { /// /// ``` /// # use gpui::{Point, Pixels, ScaledPixels}; - /// let p = Point { x: Pixels(10.0), y: Pixels(20.0) }; + /// let p = Point { x: Pixels::from(10.0), y: Pixels::from(20.0) }; /// let scaled_p = p.scale(1.5); - /// assert_eq!(scaled_p, Point { x: ScaledPixels(15.0), y: ScaledPixels(30.0) }); + /// assert_eq!(scaled_p, Point { x: ScaledPixels::from(15.0), y: ScaledPixels::from(30.0) }); /// ``` pub fn scale(&self, factor: f32) -> Point { Point { @@ -217,7 +217,7 @@ impl Point { /// /// ``` /// # use gpui::{Pixels, Point}; - /// let p = Point { x: Pixels(3.0), y: Pixels(4.0) }; + /// let p = Point { x: Pixels::from(3.0), y: Pixels::from(4.0) }; /// assert_eq!(p.magnitude(), 5.0); /// ``` pub fn magnitude(&self) -> f64 { @@ -493,9 +493,9 @@ impl Size { /// /// ``` /// # use gpui::{Size, Pixels, ScaledPixels}; - /// let size = Size { width: Pixels(100.0), height: Pixels(50.0) }; + /// let size = Size { width: Pixels::from(100.0), height: Pixels::from(50.0) }; /// let scaled_size = size.scale(2.0); - /// assert_eq!(scaled_size, Size { width: ScaledPixels(200.0), height: ScaledPixels(100.0) }); + /// assert_eq!(scaled_size, Size { width: ScaledPixels::from(200.0), height: ScaledPixels::from(100.0) }); /// ``` pub fn scale(&self, factor: f32) -> Size { Size { @@ -1628,19 +1628,19 @@ impl Bounds { /// ``` /// # use gpui::{Bounds, Point, Size, Pixels, ScaledPixels, DevicePixels}; /// let bounds = Bounds { - /// origin: Point { x: Pixels(10.0), y: Pixels(20.0) }, - /// size: Size { width: Pixels(30.0), height: Pixels(40.0) }, + /// origin: Point { x: Pixels::from(10.0), y: Pixels::from(20.0) }, + /// size: Size { width: Pixels::from(30.0), height: Pixels::from(40.0) }, /// }; /// let display_scale_factor = 2.0; /// let scaled_bounds = bounds.scale(display_scale_factor); /// assert_eq!(scaled_bounds, Bounds { /// origin: Point { - /// x: ScaledPixels(20.0), - /// y: ScaledPixels(40.0), + /// x: ScaledPixels::from(20.0), + /// y: ScaledPixels::from(40.0), /// }, /// size: Size { - /// width: ScaledPixels(60.0), - /// height: ScaledPixels(80.0) + /// width: ScaledPixels::from(60.0), + /// height: ScaledPixels::from(80.0) /// }, /// }); /// ``` @@ -1888,10 +1888,10 @@ impl Edges { /// ``` /// # use gpui::{DefiniteLength, Edges, Length, Pixels}; /// let no_edges = Edges::::zero(); - /// assert_eq!(no_edges.top, Length::Definite(DefiniteLength::from(Pixels(0.)))); - /// assert_eq!(no_edges.right, Length::Definite(DefiniteLength::from(Pixels(0.)))); - /// assert_eq!(no_edges.bottom, Length::Definite(DefiniteLength::from(Pixels(0.)))); - /// assert_eq!(no_edges.left, Length::Definite(DefiniteLength::from(Pixels(0.)))); + /// assert_eq!(no_edges.top, Length::Definite(DefiniteLength::from(Pixels::ZERO))); + /// assert_eq!(no_edges.right, Length::Definite(DefiniteLength::from(Pixels::ZERO))); + /// assert_eq!(no_edges.bottom, Length::Definite(DefiniteLength::from(Pixels::ZERO))); + /// assert_eq!(no_edges.left, Length::Definite(DefiniteLength::from(Pixels::ZERO))); /// ``` pub fn zero() -> Self { Self { @@ -1993,10 +1993,10 @@ impl Edges { /// ``` /// # use gpui::{AbsoluteLength, Edges, Pixels}; /// let no_edges = Edges::::zero(); - /// assert_eq!(no_edges.top, AbsoluteLength::Pixels(Pixels(0.0))); - /// assert_eq!(no_edges.right, AbsoluteLength::Pixels(Pixels(0.0))); - /// assert_eq!(no_edges.bottom, AbsoluteLength::Pixels(Pixels(0.0))); - /// assert_eq!(no_edges.left, AbsoluteLength::Pixels(Pixels(0.0))); + /// assert_eq!(no_edges.top, AbsoluteLength::Pixels(Pixels::ZERO)); + /// assert_eq!(no_edges.right, AbsoluteLength::Pixels(Pixels::ZERO)); + /// assert_eq!(no_edges.bottom, AbsoluteLength::Pixels(Pixels::ZERO)); + /// assert_eq!(no_edges.left, AbsoluteLength::Pixels(Pixels::ZERO)); /// ``` pub fn zero() -> Self { Self { @@ -2066,16 +2066,16 @@ impl Edges { /// ``` /// # use gpui::{Edges, Pixels, ScaledPixels}; /// let edges = Edges { - /// top: Pixels(10.0), - /// right: Pixels(20.0), - /// bottom: Pixels(30.0), - /// left: Pixels(40.0), + /// top: Pixels::from(10.0), + /// right: Pixels::from(20.0), + /// bottom: Pixels::from(30.0), + /// left: Pixels::from(40.0), /// }; /// let scaled_edges = edges.scale(2.0); - /// assert_eq!(scaled_edges.top, ScaledPixels(20.0)); - /// assert_eq!(scaled_edges.right, ScaledPixels(40.0)); - /// assert_eq!(scaled_edges.bottom, ScaledPixels(60.0)); - /// assert_eq!(scaled_edges.left, ScaledPixels(80.0)); + /// assert_eq!(scaled_edges.top, ScaledPixels::from(20.0)); + /// assert_eq!(scaled_edges.right, ScaledPixels::from(40.0)); + /// assert_eq!(scaled_edges.bottom, ScaledPixels::from(60.0)); + /// assert_eq!(scaled_edges.left, ScaledPixels::from(80.0)); /// ``` pub fn scale(&self, factor: f32) -> Edges { Edges { @@ -2273,18 +2273,18 @@ impl Corners { /// ``` /// # use gpui::{Corners, AbsoluteLength, Pixels, Rems, Size}; /// let corners = Corners { - /// top_left: AbsoluteLength::Pixels(Pixels(15.0)), + /// top_left: AbsoluteLength::Pixels(Pixels::from(15.0)), /// top_right: AbsoluteLength::Rems(Rems(1.0)), - /// bottom_right: AbsoluteLength::Pixels(Pixels(30.0)), + /// bottom_right: AbsoluteLength::Pixels(Pixels::from(30.0)), /// bottom_left: AbsoluteLength::Rems(Rems(2.0)), /// }; - /// let rem_size = Pixels(16.0); + /// let rem_size = Pixels::from(16.0); /// let corners_in_pixels = corners.to_pixels(rem_size); /// - /// assert_eq!(corners_in_pixels.top_left, Pixels(15.0)); - /// assert_eq!(corners_in_pixels.top_right, Pixels(16.0)); // 1 rem converted to pixels - /// assert_eq!(corners_in_pixels.bottom_right, Pixels(30.0)); - /// assert_eq!(corners_in_pixels.bottom_left, Pixels(32.0)); // 2 rems converted to pixels + /// assert_eq!(corners_in_pixels.top_left, Pixels::from(15.0)); + /// assert_eq!(corners_in_pixels.top_right, Pixels::from(16.0)); // 1 rem converted to pixels + /// assert_eq!(corners_in_pixels.bottom_right, Pixels::from(30.0)); + /// assert_eq!(corners_in_pixels.bottom_left, Pixels::from(32.0)); // 2 rems converted to pixels /// ``` pub fn to_pixels(self, rem_size: Pixels) -> Corners { Corners { @@ -2314,16 +2314,16 @@ impl Corners { /// ``` /// # use gpui::{Corners, Pixels, ScaledPixels}; /// let corners = Corners { - /// top_left: Pixels(10.0), - /// top_right: Pixels(20.0), - /// bottom_right: Pixels(30.0), - /// bottom_left: Pixels(40.0), + /// top_left: Pixels::from(10.0), + /// top_right: Pixels::from(20.0), + /// bottom_right: Pixels::from(30.0), + /// bottom_left: Pixels::from(40.0), /// }; /// let scaled_corners = corners.scale(2.0); - /// assert_eq!(scaled_corners.top_left, ScaledPixels(20.0)); - /// assert_eq!(scaled_corners.top_right, ScaledPixels(40.0)); - /// assert_eq!(scaled_corners.bottom_right, ScaledPixels(60.0)); - /// assert_eq!(scaled_corners.bottom_left, ScaledPixels(80.0)); + /// assert_eq!(scaled_corners.top_left, ScaledPixels::from(20.0)); + /// assert_eq!(scaled_corners.top_right, ScaledPixels::from(40.0)); + /// assert_eq!(scaled_corners.bottom_right, ScaledPixels::from(60.0)); + /// assert_eq!(scaled_corners.bottom_left, ScaledPixels::from(80.0)); /// ``` #[must_use] pub fn scale(&self, factor: f32) -> Corners { @@ -2391,12 +2391,12 @@ impl Corners { /// ``` /// # use gpui::{Corners, Pixels, Rems}; /// let corners = Corners { - /// top_left: Pixels(10.0), - /// top_right: Pixels(20.0), - /// bottom_right: Pixels(30.0), - /// bottom_left: Pixels(40.0), + /// top_left: Pixels::from(10.0), + /// top_right: Pixels::from(20.0), + /// bottom_right: Pixels::from(30.0), + /// bottom_left: Pixels::from(40.0), /// }; - /// let corners_in_rems = corners.map(|&px| Rems(px.0 / 16.0)); + /// let corners_in_rems = corners.map(|&px| Rems(f32::from(px) / 16.0)); /// assert_eq!(corners_in_rems, Corners { /// top_left: Rems(0.625), /// top_right: Rems(1.25), @@ -2547,11 +2547,11 @@ impl From for Radians { /// use gpui::{Pixels, ScaledPixels}; /// /// // Define a length of 10 pixels -/// let length = Pixels(10.0); +/// let length = Pixels::from(10.0); /// /// // Define a length and scale it by a factor of 2 /// let scaled_length = length.scale(2.0); -/// assert_eq!(scaled_length, ScaledPixels(20.0)); +/// assert_eq!(scaled_length, ScaledPixels::from(20.0)); /// ``` #[derive( Clone, @@ -2570,7 +2570,7 @@ impl From for Radians { JsonSchema, )] #[repr(transparent)] -pub struct Pixels(pub f32); +pub struct Pixels(pub(crate) f32); impl Div for Pixels { type Output = f32; @@ -2809,6 +2809,12 @@ impl From for u32 { } } +impl From<&Pixels> for u32 { + fn from(pixels: &Pixels) -> Self { + pixels.0 as u32 + } +} + impl From for Pixels { fn from(pixels: u32) -> Self { Pixels(pixels as f32) @@ -2945,7 +2951,7 @@ impl From for DevicePixels { /// display resolutions. #[derive(Clone, Copy, Default, Add, AddAssign, Sub, SubAssign, Div, DivAssign, PartialEq)] #[repr(transparent)] -pub struct ScaledPixels(pub f32); +pub struct ScaledPixels(pub(crate) f32); impl ScaledPixels { /// Floors the `ScaledPixels` value to the nearest whole number. @@ -2962,6 +2968,15 @@ impl ScaledPixels { /// # Returns /// /// Returns a new `ScaledPixels` instance with the rounded value. + pub fn round(&self) -> Self { + Self(self.0.round()) + } + + /// Ceils the `ScaledPixels` value to the nearest whole number. + /// + /// # Returns + /// + /// Returns a new `ScaledPixels` instance with the ceiled value. pub fn ceil(&self) -> Self { Self(self.0.ceil()) } @@ -3011,6 +3026,12 @@ impl From for u32 { } } +impl From for ScaledPixels { + fn from(pixels: f32) -> Self { + Self(pixels) + } +} + impl Div for ScaledPixels { type Output = f32; @@ -3180,12 +3201,12 @@ impl AbsoluteLength { /// /// ``` /// # use gpui::{AbsoluteLength, Pixels, Rems}; - /// let length_in_pixels = AbsoluteLength::Pixels(Pixels(42.0)); + /// let length_in_pixels = AbsoluteLength::Pixels(Pixels::from(42.0)); /// let length_in_rems = AbsoluteLength::Rems(Rems(2.0)); - /// let rem_size = Pixels(16.0); + /// let rem_size = Pixels::from(16.0); /// - /// assert_eq!(length_in_pixels.to_pixels(rem_size), Pixels(42.0)); - /// assert_eq!(length_in_rems.to_pixels(rem_size), Pixels(32.0)); + /// assert_eq!(length_in_pixels.to_pixels(rem_size), Pixels::from(42.0)); + /// assert_eq!(length_in_rems.to_pixels(rem_size), Pixels::from(32.0)); /// ``` pub fn to_pixels(self, rem_size: Pixels) -> Pixels { match self { @@ -3330,9 +3351,9 @@ impl DefiniteLength { /// let base_size = AbsoluteLength::Pixels(px(100.0)); /// let rem_size = px(16.0); /// - /// assert_eq!(length_in_pixels.to_pixels(base_size, rem_size), Pixels(42.0)); - /// assert_eq!(length_in_rems.to_pixels(base_size, rem_size), Pixels(32.0)); - /// assert_eq!(length_as_fraction.to_pixels(base_size, rem_size), Pixels(50.0)); + /// assert_eq!(length_in_pixels.to_pixels(base_size, rem_size), Pixels::from(42.0)); + /// assert_eq!(length_in_rems.to_pixels(base_size, rem_size), Pixels::from(32.0)); + /// assert_eq!(length_as_fraction.to_pixels(base_size, rem_size), Pixels::from(50.0)); /// ``` pub fn to_pixels(self, base_size: AbsoluteLength, rem_size: Pixels) -> Pixels { match self { diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index 7cc56265bd0401eac67305b636ba29ccec6df9ea..805dbbdfe740acbac4929170953e70c923403bb7 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -1,70 +1,11 @@ -//! # Welcome to GPUI! -//! -//! GPUI is a hybrid immediate and retained mode, GPU accelerated, UI framework -//! for Rust, designed to support a wide variety of applications. -//! -//! ## Getting Started -//! -//! GPUI is still in active development as we work on the Zed code editor and isn't yet on crates.io. -//! You'll also need to use the latest version of stable rust. Add the following to your Cargo.toml: -//! -//! ```toml -//! [dependencies] -//! gpui = { git = "https://github.com/zed-industries/zed" } -//! ``` -//! -//! Everything in GPUI starts with an [`Application`]. You can create one with [`Application::new`], and -//! kick off your application by passing a callback to [`Application::run`]. Inside this callback, -//! you can create a new window with [`App::open_window`], and register your first root -//! view. See [gpui.rs](https://www.gpui.rs/) for a complete example. -//! -//! ## The Big Picture -//! -//! GPUI offers three different [registers](https://en.wikipedia.org/wiki/Register_(sociolinguistics)) depending on your needs: -//! -//! - State management and communication with [`Entity`]'s. Whenever you need to store application state -//! that communicates between different parts of your application, you'll want to use GPUI's -//! entities. Entities are owned by GPUI and are only accessible through an owned smart pointer -//! similar to an [`std::rc::Rc`]. See [`app::Context`] for more information. -//! -//! - High level, declarative UI with views. All UI in GPUI starts with a view. A view is simply -//! a [`Entity`] that can be rendered, by implementing the [`Render`] trait. At the start of each frame, GPUI -//! will call this render method on the root view of a given window. Views build a tree of -//! [`Element`]s, lay them out and style them with a tailwind-style API, and then give them to -//! GPUI to turn into pixels. See the [`elements::Div`] element for an all purpose swiss-army -//! knife for UI. -//! -//! - Low level, imperative UI with Elements. Elements are the building blocks of UI in GPUI, and they -//! provide a nice wrapper around an imperative API that provides as much flexibility and control as -//! you need. Elements have total control over how they and their child elements are rendered and -//! can be used for making efficient views into large lists, implement custom layouting for a code editor, -//! and anything else you can think of. See the [`elements`] module for more information. -//! -//! Each of these registers has one or more corresponding contexts that can be accessed from all GPUI services. -//! This context is your main interface to GPUI, and is used extensively throughout the framework. -//! -//! ## Other Resources -//! -//! In addition to the systems above, GPUI provides a range of smaller services that are useful for building -//! complex applications: -//! -//! - Actions are user-defined structs that are used for converting keystrokes into logical operations in your UI. -//! Use this for implementing keyboard shortcuts, such as cmd-q (See `action` module for more information). -//! - Platform services, such as `quit the app` or `open a URL` are available as methods on the [`app::App`]. -//! - An async executor that is integrated with the platform's event loop. See the [`executor`] module for more information., -//! - The [`gpui::test`](macro@test) macro provides a convenient way to write tests for your GPUI applications. Tests also have their -//! own kind of context, a [`TestAppContext`] which provides ways of simulating common platform input. See [`TestAppContext`] -//! and [`mod@test`] modules for more details. -//! -//! Currently, the best way to learn about these APIs is to read the Zed source code, ask us about it at a fireside hack, or drop -//! a question in the [Zed Discord](https://zed.dev/community-links). We're working on improving the documentation, creating more examples, -//! and will be publishing more guides to GPUI on our [blog](https://zed.dev/blog). - +#![doc = include_str!("../README.md")] #![deny(missing_docs)] #![allow(clippy::type_complexity)] // Not useful, GPUI makes heavy use of callbacks #![allow(clippy::collapsible_else_if)] // False positives in platform specific code #![allow(unused_mut)] // False positives in platform specific code +extern crate self as gpui; + #[macro_use] mod action; mod app; @@ -105,6 +46,9 @@ mod util; mod view; mod window; +#[cfg(doc)] +pub mod _ownership_and_data_flow; + /// Do not touch, here be dragons for use by gpui_macros and such. #[doc(hidden)] pub mod private { @@ -112,7 +56,6 @@ pub mod private { pub use inventory; pub use schemars; pub use serde; - pub use serde_derive; pub use serde_json; } @@ -158,6 +101,8 @@ pub use taffy::{AvailableSpace, LayoutId}; #[cfg(any(test, feature = "test-support"))] pub use test::*; pub use text_system::*; +#[cfg(any(test, feature = "test-support"))] +pub use util::smol_timeout; pub use util::{FutureExt, Timeout, arc_cow::ArcCow}; pub use view::*; pub use window::*; diff --git a/crates/gpui/src/interactive.rs b/crates/gpui/src/interactive.rs index 218ae5fcdfbb60b2dd99c8a656d95c3962edc98c..dafe623dfada7ba7b21140fc36c7c824e8b5f3f6 100644 --- a/crates/gpui/src/interactive.rs +++ b/crates/gpui/src/interactive.rs @@ -259,6 +259,14 @@ impl ClickEvent { ClickEvent::Mouse(event) => event.up.click_count, } } + + /// Returns whether the click event is generated by a keyboard event + pub fn is_keyboard(&self) -> bool { + match self { + ClickEvent::Mouse(_) => false, + ClickEvent::Keyboard(_) => true, + } + } } /// An enum representing the keyboard button that was pressed for a click event. diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 444b60ac154424c423c3cd6a827b22cd7024694f..555a75879795d85bc20698b5a4c7cf76555f11ac 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -1213,6 +1213,11 @@ impl WindowBounds { WindowBounds::Fullscreen(bounds) => *bounds, } } + + /// Creates a new window bounds that centers the window on the screen. + pub fn centered(size: Size, cx: &App) -> Self { + WindowBounds::Windowed(Bounds::centered(None, size, cx)) + } } impl Default for WindowOptions { @@ -1263,6 +1268,9 @@ pub enum WindowKind { /// A window that appears above all other windows, usually used for alerts or popups /// use sparingly! PopUp, + + /// A floating window that appears on top of its parent window + Floating, } /// The appearance of the window, as defined by the operating system. diff --git a/crates/gpui/src/platform/blade/blade_atlas.rs b/crates/gpui/src/platform/blade/blade_atlas.rs index 74500ebf8324e4747122ac425388bc122953185e..9b9299df9958e71713269312c12610fe176798ed 100644 --- a/crates/gpui/src/platform/blade/blade_atlas.rs +++ b/crates/gpui/src/platform/blade/blade_atlas.rs @@ -163,7 +163,7 @@ impl BladeAtlasState { usage = gpu::TextureUsage::COPY | gpu::TextureUsage::RESOURCE; } AtlasTextureKind::Polychrome => { - format = gpu::TextureFormat::Bgra8UnormSrgb; + format = gpu::TextureFormat::Bgra8Unorm; usage = gpu::TextureUsage::COPY | gpu::TextureUsage::RESOURCE; } } diff --git a/crates/gpui/src/platform/blade/blade_renderer.rs b/crates/gpui/src/platform/blade/blade_renderer.rs index 1f60920bcc928c97c1f2b2c06e22ed235217c87e..d00fbdc7f128e2f51ce7a2786aa7fdb57f296ea2 100644 --- a/crates/gpui/src/platform/blade/blade_renderer.rs +++ b/crates/gpui/src/platform/blade/blade_renderer.rs @@ -83,6 +83,8 @@ struct ShaderUnderlinesData { #[derive(blade_macros::ShaderData)] struct ShaderMonoSpritesData { globals: GlobalParams, + gamma_ratios: [f32; 4], + grayscale_enhanced_contrast: f32, t_sprite: gpu::TextureView, s_sprite: gpu::Sampler, b_mono_sprites: gpu::BufferPiece, @@ -334,11 +336,11 @@ pub struct BladeRenderer { atlas_sampler: gpu::Sampler, #[cfg(target_os = "macos")] core_video_texture_cache: CVMetalTextureCache, - path_sample_count: u32, path_intermediate_texture: gpu::Texture, path_intermediate_texture_view: gpu::TextureView, path_intermediate_msaa_texture: Option, path_intermediate_msaa_texture_view: Option, + rendering_parameters: RenderingParameters, } impl BladeRenderer { @@ -351,7 +353,7 @@ impl BladeRenderer { size: config.size, usage: gpu::TextureUsage::TARGET, display_sync: gpu::DisplaySync::Recent, - color_space: gpu::ColorSpace::Linear, + color_space: gpu::ColorSpace::Srgb, allow_exclusive_full_screen: false, transparent: config.transparent, }; @@ -364,17 +366,12 @@ impl BladeRenderer { name: "main", buffer_count: 2, }); - // workaround for https://github.com/zed-industries/zed/issues/26143 - let path_sample_count = std::env::var("ZED_PATH_SAMPLE_COUNT") - .ok() - .and_then(|v| v.parse().ok()) - .or_else(|| { - [4, 2, 1] - .into_iter() - .find(|&n| (context.gpu.capabilities().sample_count_mask & n) != 0) - }) - .unwrap_or(1); - let pipelines = BladePipelines::new(&context.gpu, surface.info(), path_sample_count); + let rendering_parameters = RenderingParameters::from_env(context); + let pipelines = BladePipelines::new( + &context.gpu, + surface.info(), + rendering_parameters.path_sample_count, + ); let instance_belt = BufferBelt::new(BufferBeltDescriptor { memory: gpu::Memory::Shared, min_chunk_size: 0x1000, @@ -401,7 +398,7 @@ impl BladeRenderer { surface.info().format, config.size.width, config.size.height, - path_sample_count, + rendering_parameters.path_sample_count, ) .unzip(); @@ -425,11 +422,11 @@ impl BladeRenderer { atlas_sampler, #[cfg(target_os = "macos")] core_video_texture_cache, - path_sample_count, path_intermediate_texture, path_intermediate_texture_view, path_intermediate_msaa_texture, path_intermediate_msaa_texture_view, + rendering_parameters, }) } @@ -506,7 +503,7 @@ impl BladeRenderer { self.surface.info().format, gpu_size.width, gpu_size.height, - self.path_sample_count, + self.rendering_parameters.path_sample_count, ) .unzip(); self.path_intermediate_msaa_texture = path_intermediate_msaa_texture; @@ -521,8 +518,11 @@ impl BladeRenderer { self.gpu .reconfigure_surface(&mut self.surface, self.surface_config); self.pipelines.destroy(&self.gpu); - self.pipelines = - BladePipelines::new(&self.gpu, self.surface.info(), self.path_sample_count); + self.pipelines = BladePipelines::new( + &self.gpu, + self.surface.info(), + self.rendering_parameters.path_sample_count, + ); } } @@ -783,6 +783,10 @@ impl BladeRenderer { 0, &ShaderMonoSpritesData { globals, + gamma_ratios: self.rendering_parameters.gamma_ratios, + grayscale_enhanced_contrast: self + .rendering_parameters + .grayscale_enhanced_contrast, t_sprite: tex_info.raw_view, s_sprite: self.atlas_sampler, b_mono_sprites: instance_buf, @@ -984,3 +988,85 @@ fn create_msaa_texture_if_needed( Some((texture_msaa, texture_view_msaa)) } + +/// A set of parameters that can be set using a corresponding environment variable. +struct RenderingParameters { + // Env var: ZED_PATH_SAMPLE_COUNT + // workaround for https://github.com/zed-industries/zed/issues/26143 + path_sample_count: u32, + + // Env var: ZED_FONTS_GAMMA + // Allowed range [1.0, 2.2], other values are clipped + // Default: 1.8 + gamma_ratios: [f32; 4], + // Env var: ZED_FONTS_GRAYSCALE_ENHANCED_CONTRAST + // Allowed range: [0.0, ..), other values are clipped + // Default: 1.0 + grayscale_enhanced_contrast: f32, +} + +impl RenderingParameters { + fn from_env(context: &BladeContext) -> Self { + use std::env; + + let path_sample_count = env::var("ZED_PATH_SAMPLE_COUNT") + .ok() + .and_then(|v| v.parse().ok()) + .or_else(|| { + [4, 2, 1] + .into_iter() + .find(|&n| (context.gpu.capabilities().sample_count_mask & n) != 0) + }) + .unwrap_or(1); + let gamma = env::var("ZED_FONTS_GAMMA") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(1.8_f32) + .clamp(1.0, 2.2); + let gamma_ratios = Self::get_gamma_ratios(gamma); + let grayscale_enhanced_contrast = env::var("ZED_FONTS_GRAYSCALE_ENHANCED_CONTRAST") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(1.0_f32) + .max(0.0); + + Self { + path_sample_count, + gamma_ratios, + grayscale_enhanced_contrast, + } + } + + // Gamma ratios for brightening/darkening edges for better contrast + // https://github.com/microsoft/terminal/blob/1283c0f5b99a2961673249fa77c6b986efb5086c/src/renderer/atlas/dwrite.cpp#L50 + fn get_gamma_ratios(gamma: f32) -> [f32; 4] { + const GAMMA_INCORRECT_TARGET_RATIOS: [[f32; 4]; 13] = [ + [0.0000 / 4.0, 0.0000 / 4.0, 0.0000 / 4.0, 0.0000 / 4.0], // gamma = 1.0 + [0.0166 / 4.0, -0.0807 / 4.0, 0.2227 / 4.0, -0.0751 / 4.0], // gamma = 1.1 + [0.0350 / 4.0, -0.1760 / 4.0, 0.4325 / 4.0, -0.1370 / 4.0], // gamma = 1.2 + [0.0543 / 4.0, -0.2821 / 4.0, 0.6302 / 4.0, -0.1876 / 4.0], // gamma = 1.3 + [0.0739 / 4.0, -0.3963 / 4.0, 0.8167 / 4.0, -0.2287 / 4.0], // gamma = 1.4 + [0.0933 / 4.0, -0.5161 / 4.0, 0.9926 / 4.0, -0.2616 / 4.0], // gamma = 1.5 + [0.1121 / 4.0, -0.6395 / 4.0, 1.1588 / 4.0, -0.2877 / 4.0], // gamma = 1.6 + [0.1300 / 4.0, -0.7649 / 4.0, 1.3159 / 4.0, -0.3080 / 4.0], // gamma = 1.7 + [0.1469 / 4.0, -0.8911 / 4.0, 1.4644 / 4.0, -0.3234 / 4.0], // gamma = 1.8 + [0.1627 / 4.0, -1.0170 / 4.0, 1.6051 / 4.0, -0.3347 / 4.0], // gamma = 1.9 + [0.1773 / 4.0, -1.1420 / 4.0, 1.7385 / 4.0, -0.3426 / 4.0], // gamma = 2.0 + [0.1908 / 4.0, -1.2652 / 4.0, 1.8650 / 4.0, -0.3476 / 4.0], // gamma = 2.1 + [0.2031 / 4.0, -1.3864 / 4.0, 1.9851 / 4.0, -0.3501 / 4.0], // gamma = 2.2 + ]; + + const NORM13: f32 = ((0x10000 as f64) / (255.0 * 255.0) * 4.0) as f32; + const NORM24: f32 = ((0x100 as f64) / (255.0) * 4.0) as f32; + + let index = ((gamma * 10.0).round() as usize).clamp(10, 22) - 10; + let ratios = GAMMA_INCORRECT_TARGET_RATIOS[index]; + + [ + ratios[0] * NORM13, + ratios[1] * NORM24, + ratios[2] * NORM13, + ratios[3] * NORM24, + ] + } +} diff --git a/crates/gpui/src/platform/blade/shaders.wgsl b/crates/gpui/src/platform/blade/shaders.wgsl index 95980b54fe4f25b3936d6b095219c5674211dd0a..1de8ad442018624b4322901136ec777e66d96b18 100644 --- a/crates/gpui/src/platform/blade/shaders.wgsl +++ b/crates/gpui/src/platform/blade/shaders.wgsl @@ -28,6 +28,35 @@ fn heat_map_color(value: f32, minValue: f32, maxValue: f32, position: vec2) */ +fn color_brightness(color: vec3) -> f32 { + // REC. 601 luminance coefficients for perceived brightness + return dot(color, vec3(0.30, 0.59, 0.11)); +} + +fn light_on_dark_contrast(enhancedContrast: f32, color: vec3) -> f32 { + let brightness = color_brightness(color); + let multiplier = saturate(4.0 * (0.75 - brightness)); + return enhancedContrast * multiplier; +} + +fn enhance_contrast(alpha: f32, k: f32) -> f32 { + return alpha * (k + 1.0) / (alpha * k + 1.0); +} + +fn apply_alpha_correction(a: f32, b: f32, g: vec4) -> f32 { + let brightness_adjustment = g.x * b + g.y; + let correction = brightness_adjustment * a + (g.z * b + g.w); + return a + a * (1.0 - a) * correction; +} + +fn apply_contrast_and_gamma_correction(sample: f32, color: vec3, enhanced_contrast_factor: f32, gamma_ratios: vec4) -> f32 { + let enhanced_contrast = light_on_dark_contrast(enhanced_contrast_factor, color); + let brightness = color_brightness(color); + + let contrasted = enhance_contrast(sample, enhanced_contrast); + return apply_alpha_correction(contrasted, brightness, gamma_ratios); +} + struct GlobalParams { viewport_size: vec2, premultiplied_alpha: u32, @@ -35,6 +64,8 @@ struct GlobalParams { } var globals: GlobalParams; +var gamma_ratios: vec4; +var grayscale_enhanced_contrast: f32; var t_sprite: texture_2d; var s_sprite: sampler; @@ -141,6 +172,12 @@ fn distance_from_clip_rect(unit_vertex: vec2, bounds: Bounds, clip_bounds: return distance_from_clip_rect_impl(position, clip_bounds); } +fn distance_from_clip_rect_transformed(unit_vertex: vec2, bounds: Bounds, clip_bounds: Bounds, transform: TransformationMatrix) -> vec4 { + let position = unit_vertex * vec2(bounds.size) + bounds.origin; + let transformed = transpose(transform.rotation_scale) * position + transform.translation; + return distance_from_clip_rect_impl(transformed, clip_bounds); +} + // https://gamedev.stackexchange.com/questions/92015/optimized-linear-to-srgb-glsl fn srgb_to_linear(srgb: vec3) -> vec3 { let cutoff = srgb < vec3(0.04045); @@ -149,6 +186,13 @@ fn srgb_to_linear(srgb: vec3) -> vec3 { return select(higher, lower, cutoff); } +fn srgb_to_linear_component(a: f32) -> f32 { + let cutoff = a < 0.04045; + let higher = pow((a + 0.055) / 1.055, 2.4); + let lower = a / 12.92; + return select(higher, lower, cutoff); +} + fn linear_to_srgb(linear: vec3) -> vec3 { let cutoff = linear < vec3(0.0031308); let higher = vec3(1.055) * pow(linear, vec3(1.0 / 2.4)) - vec3(0.055); @@ -198,12 +242,7 @@ fn hsla_to_rgba(hsla: Hsla) -> vec4 { color.b += x; } - // Input colors are assumed to be in sRGB space, - // but blending and rendering needs to happen in linear space. - // The output will be converted to sRGB by either the target - // texture format or the swapchain color space. - let linear = srgb_to_linear(color); - return vec4(linear, a); + return vec4(color, a); } /// Convert a linear sRGB to Oklab space. @@ -644,7 +683,24 @@ fn fs_quad(input: QuadVarying) -> @location(0) vec4 { let is_horizontal = corner_center_to_point.x < corner_center_to_point.y; - let border_width = select(border.y, border.x, is_horizontal); + + // When applying dashed borders to just some, not all, the sides. + // The way we chose border widths above sometimes comes with a 0 width value. + // So we choose again to avoid division by zero. + // TODO: A better solution exists taking a look at the whole file. + // this does not fix single dashed borders at the corners + let dashed_border = vec2( + max( + quad.border_widths.bottom, + quad.border_widths.top, + ), + max( + quad.border_widths.right, + quad.border_widths.left, + ) + ); + + let border_width = select(dashed_border.y, dashed_border.x, is_horizontal); dash_velocity = dv_numerator / border_width; t = select(point.y, point.x, is_horizontal) * dash_velocity; max_t = select(size.y, size.x, is_horizontal) * dash_velocity; @@ -1117,18 +1173,22 @@ fn vs_mono_sprite(@builtin(vertex_index) vertex_id: u32, @builtin(instance_index out.tile_position = to_tile_position(unit_vertex, sprite.tile); out.color = hsla_to_rgba(sprite.color); - out.clip_distances = distance_from_clip_rect(unit_vertex, sprite.bounds, sprite.content_mask); + out.clip_distances = distance_from_clip_rect_transformed(unit_vertex, sprite.bounds, sprite.content_mask, sprite.transformation); return out; } @fragment fn fs_mono_sprite(input: MonoSpriteVarying) -> @location(0) vec4 { let sample = textureSample(t_sprite, s_sprite, input.tile_position).r; + let alpha_corrected = apply_contrast_and_gamma_correction(sample, input.color.rgb, grayscale_enhanced_contrast, gamma_ratios); + // Alpha clip after using the derivatives. if (any(input.clip_distances < vec4(0.0))) { return vec4(0.0); } - return blend_color(input.color, sample); + + // convert to srgb space as the rest of the code (output swapchain) expects that + return blend_color(input.color, alpha_corrected); } // --- polychrome sprites --- // diff --git a/crates/gpui/src/platform/linux/dispatcher.rs b/crates/gpui/src/platform/linux/dispatcher.rs index 3d32dbd2fdece5259f48e52550f6983b6a8c5b1d..2f6cd83756054bdbca2c764b046b0c37f51d3515 100644 --- a/crates/gpui/src/platform/linux/dispatcher.rs +++ b/crates/gpui/src/platform/linux/dispatcher.rs @@ -37,51 +37,57 @@ impl LinuxDispatcher { let mut background_threads = (0..thread_count) .map(|i| { let receiver = background_receiver.clone(); - std::thread::spawn(move || { - for runnable in receiver { - let start = Instant::now(); - - runnable.run(); - - log::trace!( - "background thread {}: ran runnable. took: {:?}", - i, - start.elapsed() - ); - } - }) + std::thread::Builder::new() + .name(format!("Worker-{i}")) + .spawn(move || { + for runnable in receiver { + let start = Instant::now(); + + runnable.run(); + + log::trace!( + "background thread {}: ran runnable. took: {:?}", + i, + start.elapsed() + ); + } + }) + .unwrap() }) .collect::>(); let (timer_sender, timer_channel) = calloop::channel::channel::(); - let timer_thread = std::thread::spawn(|| { - let mut event_loop: EventLoop<()> = - EventLoop::try_new().expect("Failed to initialize timer loop!"); - - let handle = event_loop.handle(); - let timer_handle = event_loop.handle(); - handle - .insert_source(timer_channel, move |e, _, _| { - if let channel::Event::Msg(timer) = e { - // This has to be in an option to satisfy the borrow checker. The callback below should only be scheduled once. - let mut runnable = Some(timer.runnable); - timer_handle - .insert_source( - calloop::timer::Timer::from_duration(timer.duration), - move |_, _, _| { - if let Some(runnable) = runnable.take() { - runnable.run(); - } - TimeoutAction::Drop - }, - ) - .expect("Failed to start timer"); - } - }) - .expect("Failed to start timer thread"); - - event_loop.run(None, &mut (), |_| {}).log_err(); - }); + let timer_thread = std::thread::Builder::new() + .name("Timer".to_owned()) + .spawn(|| { + let mut event_loop: EventLoop<()> = + EventLoop::try_new().expect("Failed to initialize timer loop!"); + + let handle = event_loop.handle(); + let timer_handle = event_loop.handle(); + handle + .insert_source(timer_channel, move |e, _, _| { + if let channel::Event::Msg(timer) = e { + // This has to be in an option to satisfy the borrow checker. The callback below should only be scheduled once. + let mut runnable = Some(timer.runnable); + timer_handle + .insert_source( + calloop::timer::Timer::from_duration(timer.duration), + move |_, _, _| { + if let Some(runnable) = runnable.take() { + runnable.run(); + } + TimeoutAction::Drop + }, + ) + .expect("Failed to start timer"); + } + }) + .expect("Failed to start timer thread"); + + event_loop.run(None, &mut (), |_| {}).log_err(); + }) + .unwrap(); background_threads.push(timer_thread); diff --git a/crates/gpui/src/platform/linux/platform.rs b/crates/gpui/src/platform/linux/platform.rs index 196e5b65d04125ca90c588212c140d3a63345c2e..322f5d76110ee36e3cfdf26449bbec85c3d51af5 100644 --- a/crates/gpui/src/platform/linux/platform.rs +++ b/crates/gpui/src/platform/linux/platform.rs @@ -73,6 +73,13 @@ pub trait LinuxClient { fn active_window(&self) -> Option; fn window_stack(&self) -> Option>; fn run(&self); + + #[cfg(any(feature = "wayland", feature = "x11"))] + fn window_identifier( + &self, + ) -> impl Future> + Send + 'static { + std::future::ready::>(None) + } } #[derive(Default)] @@ -204,6 +211,10 @@ impl Platform for P { app_path = app_path.display() ); + #[allow( + clippy::disallowed_methods, + reason = "We are restarting ourselves, using std command thus is fine" + )] let restart_process = Command::new("/usr/bin/env") .arg("bash") .arg("-c") @@ -286,6 +297,9 @@ impl Platform for P { #[cfg(not(any(feature = "wayland", feature = "x11")))] let _ = (done_tx.send(Ok(None)), options); + #[cfg(any(feature = "wayland", feature = "x11"))] + let identifier = self.window_identifier(); + #[cfg(any(feature = "wayland", feature = "x11"))] self.foreground_executor() .spawn(async move { @@ -296,6 +310,7 @@ impl Platform for P { }; let request = match ashpd::desktop::file_chooser::OpenFileRequest::default() + .identifier(identifier.await) .modal(true) .title(title) .accept_label(options.prompt.as_ref().map(crate::SharedString::as_str)) @@ -342,6 +357,9 @@ impl Platform for P { #[cfg(not(any(feature = "wayland", feature = "x11")))] let _ = (done_tx.send(Ok(None)), directory, suggested_name); + #[cfg(any(feature = "wayland", feature = "x11"))] + let identifier = self.window_identifier(); + #[cfg(any(feature = "wayland", feature = "x11"))] self.foreground_executor() .spawn({ @@ -351,6 +369,7 @@ impl Platform for P { async move { let mut request_builder = ashpd::desktop::file_chooser::SaveFileRequest::default() + .identifier(identifier.await) .modal(true) .title("Save File") .current_folder(directory) @@ -403,11 +422,15 @@ impl Platform for P { let path = path.to_owned(); self.background_executor() .spawn(async move { - let _ = std::process::Command::new("xdg-open") + let _ = smol::process::Command::new("xdg-open") .arg(path) .spawn() .context("invoking xdg-open") - .log_err(); + .log_err()? + .status() + .await + .log_err()?; + Some(()) }) .detach(); } @@ -591,10 +614,14 @@ pub(super) fn open_uri_internal( if let Some(token) = activation_token.as_ref() { command.env("XDG_ACTIVATION_TOKEN", token); } - match command.spawn() { - Ok(_) => return, + let program = format!("{:?}", command.get_program()); + match smol::process::Command::from(command).spawn() { + Ok(mut cmd) => { + cmd.status().await.log_err(); + return; + } Err(e) => { - log::error!("Failed to open with {:?}: {}", command.get_program(), e) + log::error!("Failed to open with {}: {}", program, e) } } } diff --git a/crates/gpui/src/platform/linux/text_system.rs b/crates/gpui/src/platform/linux/text_system.rs index f66a2e71d49f39c0e82770e23aa8eca752970daf..958d509d5317aea32815eee2850e3a196d6586ed 100644 --- a/crates/gpui/src/platform/linux/text_system.rs +++ b/crates/gpui/src/platform/linux/text_system.rs @@ -1,7 +1,7 @@ use crate::{ Bounds, DevicePixels, Font, FontFeatures, FontId, FontMetrics, FontRun, FontStyle, FontWeight, - GlyphId, LineLayout, Pixels, PlatformTextSystem, Point, RenderGlyphParams, SUBPIXEL_VARIANTS, - ShapedGlyph, ShapedRun, SharedString, Size, point, size, + GlyphId, LineLayout, Pixels, PlatformTextSystem, Point, RenderGlyphParams, SUBPIXEL_VARIANTS_X, + SUBPIXEL_VARIANTS_Y, ShapedGlyph, ShapedRun, SharedString, Size, point, size, }; use anyhow::{Context as _, Ok, Result}; use collections::HashMap; @@ -274,9 +274,10 @@ impl CosmicTextSystemState { fn raster_bounds(&mut self, params: &RenderGlyphParams) -> Result> { let font = &self.loaded_fonts[params.font_id.0].font; - let subpixel_shift = params - .subpixel_variant - .map(|v| v as f32 / (SUBPIXEL_VARIANTS as f32 * params.scale_factor)); + let subpixel_shift = point( + params.subpixel_variant.x as f32 / SUBPIXEL_VARIANTS_X as f32 / params.scale_factor, + params.subpixel_variant.y as f32 / SUBPIXEL_VARIANTS_Y as f32 / params.scale_factor, + ); let image = self .swash_cache .get_image( @@ -309,9 +310,10 @@ impl CosmicTextSystemState { } else { let bitmap_size = glyph_bounds.size; let font = &self.loaded_fonts[params.font_id.0].font; - let subpixel_shift = params - .subpixel_variant - .map(|v| v as f32 / (SUBPIXEL_VARIANTS as f32 * params.scale_factor)); + let subpixel_shift = point( + params.subpixel_variant.x as f32 / SUBPIXEL_VARIANTS_X as f32 / params.scale_factor, + params.subpixel_variant.y as f32 / SUBPIXEL_VARIANTS_Y as f32 / params.scale_factor, + ); let mut image = self .swash_cache .get_image( diff --git a/crates/gpui/src/platform/linux/wayland/client.rs b/crates/gpui/src/platform/linux/wayland/client.rs index 8596bddc8dd821426982d618f661d6da621096bb..1ebdda3a266af0f9e8d82dabd5b36372e0972438 100644 --- a/crates/gpui/src/platform/linux/wayland/client.rs +++ b/crates/gpui/src/platform/linux/wayland/client.rs @@ -7,6 +7,7 @@ use std::{ time::{Duration, Instant}, }; +use ashpd::WindowIdentifier; use calloop::{ EventLoop, LoopHandle, timer::{TimeoutAction, Timer}, @@ -694,6 +695,8 @@ impl LinuxClient for WaylandClient { ) -> anyhow::Result> { let mut state = self.0.borrow_mut(); + let parent = state.keyboard_focused_window.as_ref().map(|w| w.toplevel()); + let (window, surface_id) = WaylandWindow::new( handle, state.globals.clone(), @@ -701,6 +704,7 @@ impl LinuxClient for WaylandClient { WaylandClientStatePtr(Rc::downgrade(&self.0)), params, state.common.appearance, + parent, )?; state.windows.insert(surface_id, window.0.clone()); @@ -858,6 +862,20 @@ impl LinuxClient for WaylandClient { fn compositor_name(&self) -> &'static str { "Wayland" } + + fn window_identifier(&self) -> impl Future> + Send + 'static { + async fn inner(surface: Option) -> Option { + if let Some(surface) = surface { + ashpd::WindowIdentifier::from_wayland(&surface).await + } else { + None + } + } + + let client_state = self.0.borrow(); + let active_window = client_state.keyboard_focused_window.as_ref(); + inner(active_window.map(|aw| aw.surface())) + } } impl Dispatch for WaylandClientStatePtr { diff --git a/crates/gpui/src/platform/linux/wayland/window.rs b/crates/gpui/src/platform/linux/wayland/window.rs index 76dd89c940c615d726af1cf5922be226d91dfd41..aa3b7141be77dbdc73893783620523c6c8d68e4e 100644 --- a/crates/gpui/src/platform/linux/wayland/window.rs +++ b/crates/gpui/src/platform/linux/wayland/window.rs @@ -14,14 +14,16 @@ use raw_window_handle as rwh; use wayland_backend::client::ObjectId; use wayland_client::WEnum; use wayland_client::{Proxy, protocol::wl_surface}; -use wayland_protocols::wp::fractional_scale::v1::client::wp_fractional_scale_v1; use wayland_protocols::wp::viewporter::client::wp_viewport; use wayland_protocols::xdg::decoration::zv1::client::zxdg_toplevel_decoration_v1; use wayland_protocols::xdg::shell::client::xdg_surface; use wayland_protocols::xdg::shell::client::xdg_toplevel::{self}; +use wayland_protocols::{ + wp::fractional_scale::v1::client::wp_fractional_scale_v1, + xdg::shell::client::xdg_toplevel::XdgToplevel, +}; use wayland_protocols_plasma::blur::client::org_kde_kwin_blur; -use crate::scene::Scene; use crate::{ AnyWindowHandle, Bounds, Decorations, Globals, GpuSpecs, Modifiers, Output, Pixels, PlatformDisplay, PlatformInput, Point, PromptButton, PromptLevel, RequestFrameOptions, @@ -36,6 +38,7 @@ use crate::{ linux::wayland::{display::WaylandDisplay, serial::SerialKind}, }, }; +use crate::{WindowKind, scene::Scene}; #[derive(Default)] pub(crate) struct Callbacks { @@ -276,6 +279,7 @@ impl WaylandWindow { client: WaylandClientStatePtr, params: WindowParams, appearance: WindowAppearance, + parent: Option, ) -> anyhow::Result<(Self, ObjectId)> { let surface = globals.compositor.create_surface(&globals.qh, ()); let xdg_surface = globals @@ -283,6 +287,10 @@ impl WaylandWindow { .get_xdg_surface(&surface, &globals.qh, surface.id()); let toplevel = xdg_surface.get_toplevel(&globals.qh, surface.id()); + if params.kind == WindowKind::Floating { + toplevel.set_parent(parent.as_ref()); + } + if let Some(size) = params.window_min_size { toplevel.set_min_size(size.width.0 as i32, size.height.0 as i32); } @@ -337,6 +345,10 @@ impl WaylandWindowStatePtr { self.state.borrow().surface.clone() } + pub fn toplevel(&self) -> xdg_toplevel::XdgToplevel { + self.state.borrow().toplevel.clone() + } + pub fn ptr_eq(&self, other: &Self) -> bool { Rc::ptr_eq(&self.state, &other.state) } diff --git a/crates/gpui/src/platform/linux/x11/client.rs b/crates/gpui/src/platform/linux/x11/client.rs index 42c59701d3ee644b99bc8bb58002b429265c1a45..fa9d0181c095819823553da9e7f6be27598aea78 100644 --- a/crates/gpui/src/platform/linux/x11/client.rs +++ b/crates/gpui/src/platform/linux/x11/client.rs @@ -1,5 +1,6 @@ use crate::{Capslock, xcb_flush}; use anyhow::{Context as _, anyhow}; +use ashpd::WindowIdentifier; use calloop::{ EventLoop, LoopHandle, RegistrationToken, generic::{FdWrapper, Generic}, @@ -28,7 +29,7 @@ use x11rb::{ protocol::xkb::ConnectionExt as _, protocol::xproto::{ AtomEnum, ChangeWindowAttributesAux, ClientMessageData, ClientMessageEvent, - ConnectionExt as _, EventMask, KeyPressEvent, Visibility, + ConnectionExt as _, EventMask, Visibility, }, protocol::{Event, randr, render, xinput, xkb, xproto}, resource_manager::Database, @@ -525,7 +526,6 @@ impl X11Client { let mut windows_to_refresh = HashSet::new(); let mut last_key_release = None; - let mut last_key_press: Option = None; // event handlers for new keyboard / remapping refresh the state without using event // details, this deduplicates them. @@ -545,7 +545,6 @@ impl X11Client { if let Some(last_key_release) = last_key_release.take() { events.push(last_key_release); } - last_key_press = None; events.push(last_keymap_change_event); } @@ -558,16 +557,9 @@ impl X11Client { if let Some(last_key_release) = last_key_release.take() { events.push(last_key_release); } - last_key_press = None; events.push(last_keymap_change_event); } - if let Some(last_press) = last_key_press.as_ref() - && last_press.detail == key_press.detail - { - continue; - } - if let Some(Event::KeyRelease(key_release)) = last_key_release.take() { @@ -580,7 +572,6 @@ impl X11Client { } } events.push(Event::KeyPress(key_press)); - last_key_press = Some(key_press); } Event::XkbNewKeyboardNotify(_) | Event::XkbMapNotify(_) => { if let Some(release_event) = last_key_release.take() { @@ -1325,17 +1316,9 @@ impl X11Client { return None; }; let mut state = self.0.borrow_mut(); - let keystroke = state.pre_key_char_down.take(); state.composing = false; drop(state); - if let Some(mut keystroke) = keystroke { - keystroke.key_char = Some(text); - window.handle_input(PlatformInput::KeyDown(crate::KeyDownEvent { - keystroke, - is_held: false, - })); - } - + window.handle_ime_commit(text); Some(()) } @@ -1465,6 +1448,10 @@ impl LinuxClient for X11Client { params: WindowParams, ) -> anyhow::Result> { let mut state = self.0.borrow_mut(); + let parent_window = state + .keyboard_focused_window + .and_then(|focused_window| state.windows.get(&focused_window)) + .map(|window| window.window.x_window); let x_window = state .xcb_connection .generate_id() @@ -1483,6 +1470,7 @@ impl LinuxClient for X11Client { &state.atoms, state.scale_factor, state.common.appearance, + parent_window, )?; check_reply( || "Failed to set XdndAware property", @@ -1670,6 +1658,16 @@ impl LinuxClient for X11Client { Some(handles) } + + fn window_identifier(&self) -> impl Future> + Send + 'static { + let state = self.0.borrow(); + state + .keyboard_focused_window + .and_then(|focused_window| state.windows.get(&focused_window)) + .map(|window| window.window.x_window as u64) + .map(|x_window| std::future::ready(Some(WindowIdentifier::from_xid(x_window)))) + .unwrap_or(std::future::ready(None)) + } } impl X11ClientState { diff --git a/crates/gpui/src/platform/linux/x11/clipboard.rs b/crates/gpui/src/platform/linux/x11/clipboard.rs index a6f96d38c4254da5a2f92261700126962c16e91c..65ad16e82bf103c4ef08e79c692196d3fae58777 100644 --- a/crates/gpui/src/platform/linux/x11/clipboard.rs +++ b/crates/gpui/src/platform/linux/x11/clipboard.rs @@ -957,15 +957,17 @@ impl Clipboard { } // At this point we know that the clipboard does not exist. let ctx = Arc::new(Inner::new()?); - let join_handle; - { - let ctx = Arc::clone(&ctx); - join_handle = std::thread::spawn(move || { - if let Err(error) = serve_requests(ctx) { - log::error!("Worker thread errored with: {}", error); + let join_handle = std::thread::Builder::new() + .name("Clipboard".to_owned()) + .spawn({ + let ctx = Arc::clone(&ctx); + move || { + if let Err(error) = serve_requests(ctx) { + log::error!("Worker thread errored with: {}", error); + } } - }); - } + }) + .unwrap(); *global_cb = Some(GlobalClipboard { inner: Arc::clone(&ctx), server_handle: join_handle, diff --git a/crates/gpui/src/platform/linux/x11/window.rs b/crates/gpui/src/platform/linux/x11/window.rs index 79a43837252f7dc702b43176d2f06172a3acec18..fe197a670177689ce776b6b55d439483c43921e0 100644 --- a/crates/gpui/src/platform/linux/x11/window.rs +++ b/crates/gpui/src/platform/linux/x11/window.rs @@ -57,6 +57,7 @@ x11rb::atom_manager! { WM_PROTOCOLS, WM_DELETE_WINDOW, WM_CHANGE_STATE, + WM_TRANSIENT_FOR, _NET_WM_PID, _NET_WM_NAME, _NET_WM_STATE, @@ -72,6 +73,7 @@ x11rb::atom_manager! { _NET_WM_MOVERESIZE, _NET_WM_WINDOW_TYPE, _NET_WM_WINDOW_TYPE_NOTIFICATION, + _NET_WM_WINDOW_TYPE_DIALOG, _NET_WM_SYNC, _NET_SUPPORTED, _MOTIF_WM_HINTS, @@ -284,7 +286,7 @@ pub(crate) struct X11WindowStatePtr { pub state: Rc>, pub(crate) callbacks: Rc>, xcb: Rc, - x_window: xproto::Window, + pub(crate) x_window: xproto::Window, } impl rwh::HasWindowHandle for RawWindow { @@ -392,6 +394,7 @@ impl X11WindowState { atoms: &XcbAtoms, scale_factor: f32, appearance: WindowAppearance, + parent_window: Option, ) -> anyhow::Result { let x_screen_index = params .display_id @@ -529,6 +532,7 @@ impl X11WindowState { ), )?; } + if params.kind == WindowKind::PopUp { check_reply( || "X11 ChangeProperty32 setting window type for pop-up failed.", @@ -542,6 +546,38 @@ impl X11WindowState { )?; } + if params.kind == WindowKind::Floating { + if let Some(parent_window) = parent_window { + // WM_TRANSIENT_FOR hint indicating the main application window. For floating windows, we set + // a parent window (WM_TRANSIENT_FOR) such that the window manager knows where to + // place the floating window in relation to the main window. + // https://specifications.freedesktop.org/wm-spec/1.4/ar01s05.html + check_reply( + || "X11 ChangeProperty32 setting WM_TRANSIENT_FOR for floating window failed.", + xcb.change_property32( + xproto::PropMode::REPLACE, + x_window, + atoms.WM_TRANSIENT_FOR, + xproto::AtomEnum::WINDOW, + &[parent_window], + ), + )?; + } + + // _NET_WM_WINDOW_TYPE_DIALOG indicates that this is a dialog (floating) window + // https://specifications.freedesktop.org/wm-spec/1.4/ar01s05.html + check_reply( + || "X11 ChangeProperty32 setting window type for floating window failed.", + xcb.change_property32( + xproto::PropMode::REPLACE, + x_window, + atoms._NET_WM_WINDOW_TYPE, + xproto::AtomEnum::ATOM, + &[atoms._NET_WM_WINDOW_TYPE_DIALOG], + ), + )?; + } + check_reply( || "X11 ChangeProperty32 setting protocols failed.", xcb.change_property32( @@ -737,6 +773,7 @@ impl X11Window { atoms: &XcbAtoms, scale_factor: f32, appearance: WindowAppearance, + parent_window: Option, ) -> anyhow::Result { let ptr = X11WindowStatePtr { state: Rc::new(RefCell::new(X11WindowState::new( @@ -752,6 +789,7 @@ impl X11Window { atoms, scale_factor, appearance, + parent_window, )?)), callbacks: Rc::new(RefCell::new(Callbacks::default())), xcb: xcb.clone(), @@ -1204,7 +1242,7 @@ impl PlatformWindow for X11Window { self.0.xcb.query_pointer(self.0.x_window), ) .log_err() - .map_or(Point::new(Pixels(0.0), Pixels(0.0)), |reply| { + .map_or(Point::new(Pixels::ZERO, Pixels::ZERO), |reply| { Point::new((reply.root_x as u32).into(), (reply.root_y as u32).into()) }) } diff --git a/crates/gpui/src/platform/mac/metal_atlas.rs b/crates/gpui/src/platform/mac/metal_atlas.rs index 5d2d8e63e06a1ea6251c1fd2edf461eeeedec612..8282530c5efdc13ca95a1f04c0f6ef1a23c8366c 100644 --- a/crates/gpui/src/platform/mac/metal_atlas.rs +++ b/crates/gpui/src/platform/mac/metal_atlas.rs @@ -167,11 +167,14 @@ impl MetalAtlasState { if let Some(ix) = index { texture_list.textures[ix] = Some(atlas_texture); - texture_list.textures.get_mut(ix).unwrap().as_mut().unwrap() + texture_list.textures.get_mut(ix) } else { texture_list.textures.push(Some(atlas_texture)); - texture_list.textures.last_mut().unwrap().as_mut().unwrap() + texture_list.textures.last_mut() } + .unwrap() + .as_mut() + .unwrap() } fn texture(&self, id: AtlasTextureId) -> &MetalAtlasTexture { diff --git a/crates/gpui/src/platform/mac/platform.rs b/crates/gpui/src/platform/mac/platform.rs index dea04d89a06acac526a8b033681829fdc1e148fd..bf92ca6dfb649a6b7b3850e796742464785889a8 100644 --- a/crates/gpui/src/platform/mac/platform.rs +++ b/crates/gpui/src/platform/mac/platform.rs @@ -82,6 +82,10 @@ unsafe fn build_classes() { APP_DELEGATE_CLASS = unsafe { let mut decl = ClassDecl::new("GPUIApplicationDelegate", class!(NSResponder)).unwrap(); decl.add_ivar::<*mut c_void>(MAC_PLATFORM_IVAR); + decl.add_method( + sel!(applicationWillFinishLaunching:), + will_finish_launching as extern "C" fn(&mut Object, Sel, id), + ); decl.add_method( sel!(applicationDidFinishLaunching:), did_finish_launching as extern "C" fn(&mut Object, Sel, id), @@ -539,6 +543,10 @@ impl Platform for MacPlatform { open "$1" "#; + #[allow( + clippy::disallowed_methods, + reason = "We are restarting ourselves, using std command thus is fine" + )] let restart_process = Command::new("/bin/bash") .arg("-c") .arg(script) @@ -851,11 +859,14 @@ impl Platform for MacPlatform { .lock() .background_executor .spawn(async move { - let _ = std::process::Command::new("open") + if let Some(mut child) = smol::process::Command::new("open") .arg(path) .spawn() .context("invoking open command") - .log_err(); + .log_err() + { + child.status().await.log_err(); + } }) .detach(); } @@ -1356,6 +1367,23 @@ unsafe fn get_mac_platform(object: &mut Object) -> &MacPlatform { } } +extern "C" fn will_finish_launching(_this: &mut Object, _: Sel, _: id) { + unsafe { + let user_defaults: id = msg_send![class!(NSUserDefaults), standardUserDefaults]; + + // The autofill heuristic controller causes slowdown and high CPU usage. + // We don't know exactly why. This disables the full heuristic controller. + // + // Adapted from: https://github.com/ghostty-org/ghostty/pull/8625 + let name = ns_string("NSAutoFillHeuristicControllerEnabled"); + let existing_value: id = msg_send![user_defaults, objectForKey: name]; + if existing_value == nil { + let false_value: id = msg_send![class!(NSNumber), numberWithBool:false]; + let _: () = msg_send![user_defaults, setObject: false_value forKey: name]; + } + } +} + extern "C" fn did_finish_launching(this: &mut Object, _: Sel, _: id) { unsafe { let app: id = msg_send![APP_CLASS, sharedApplication]; diff --git a/crates/gpui/src/platform/mac/shaders.metal b/crates/gpui/src/platform/mac/shaders.metal index 83c978b853443d5c612f514625f94b6d6725be8a..7c3886031ab915e674469a6d85ef368c35b2b759 100644 --- a/crates/gpui/src/platform/mac/shaders.metal +++ b/crates/gpui/src/platform/mac/shaders.metal @@ -18,6 +18,8 @@ float2 to_tile_position(float2 unit_vertex, AtlasTile tile, constant Size_DevicePixels *atlas_size); float4 distance_from_clip_rect(float2 unit_vertex, Bounds_ScaledPixels bounds, Bounds_ScaledPixels clip_bounds); +float4 distance_from_clip_rect_transformed(float2 unit_vertex, Bounds_ScaledPixels bounds, + Bounds_ScaledPixels clip_bounds, TransformationMatrix transformation); float corner_dash_velocity(float dv1, float dv2); float dash_alpha(float t, float period, float length, float dash_velocity, float antialias_threshold); @@ -243,7 +245,15 @@ fragment float4 quad_fragment(QuadFragmentInput input [[stage_in]], // out on each straight line, rather than around the whole // perimeter. This way each line starts and ends with a dash. bool is_horizontal = corner_center_to_point.x < corner_center_to_point.y; - float border_width = is_horizontal ? border.x : border.y; + + // Choosing the right border width for dashed borders. + // TODO: A better solution exists taking a look at the whole file. + // this does not fix single dashed borders at the corners + float2 dashed_border = float2( + fmax(quad.border_widths.bottom, quad.border_widths.top), + fmax(quad.border_widths.right, quad.border_widths.left)); + + float border_width = is_horizontal ? dashed_border.x : dashed_border.y; dash_velocity = dv_numerator / border_width; t = is_horizontal ? point.x : point.y; t *= dash_velocity; @@ -599,13 +609,14 @@ struct MonochromeSpriteVertexOutput { float4 position [[position]]; float2 tile_position; float4 color [[flat]]; - float clip_distance [[clip_distance]][4]; + float4 clip_distance; }; struct MonochromeSpriteFragmentInput { float4 position [[position]]; float2 tile_position; float4 color [[flat]]; + float4 clip_distance; }; vertex MonochromeSpriteVertexOutput monochrome_sprite_vertex( @@ -620,8 +631,8 @@ vertex MonochromeSpriteVertexOutput monochrome_sprite_vertex( MonochromeSprite sprite = sprites[sprite_id]; float4 device_position = to_device_position_transformed(unit_vertex, sprite.bounds, sprite.transformation, viewport_size); - float4 clip_distance = distance_from_clip_rect(unit_vertex, sprite.bounds, - sprite.content_mask.bounds); + float4 clip_distance = distance_from_clip_rect_transformed(unit_vertex, sprite.bounds, + sprite.content_mask.bounds, sprite.transformation); float2 tile_position = to_tile_position(unit_vertex, sprite.tile, atlas_size); float4 color = hsla_to_rgba(sprite.color); return MonochromeSpriteVertexOutput{ @@ -635,6 +646,10 @@ fragment float4 monochrome_sprite_fragment( MonochromeSpriteFragmentInput input [[stage_in]], constant MonochromeSprite *sprites [[buffer(SpriteInputIndex_Sprites)]], texture2d atlas_texture [[texture(SpriteInputIndex_AtlasTexture)]]) { + if (any(input.clip_distance < float4(0.0))) { + return float4(0.0); + } + constexpr sampler atlas_texture_sampler(mag_filter::linear, min_filter::linear); float4 sample = @@ -1096,6 +1111,23 @@ float4 distance_from_clip_rect(float2 unit_vertex, Bounds_ScaledPixels bounds, clip_bounds.origin.y + clip_bounds.size.height - position.y); } +float4 distance_from_clip_rect_transformed(float2 unit_vertex, Bounds_ScaledPixels bounds, + Bounds_ScaledPixels clip_bounds, TransformationMatrix transformation) { + float2 position = + unit_vertex * float2(bounds.size.width, bounds.size.height) + + float2(bounds.origin.x, bounds.origin.y); + float2 transformed_position = float2(0, 0); + transformed_position[0] = position[0] * transformation.rotation_scale[0][0] + position[1] * transformation.rotation_scale[0][1]; + transformed_position[1] = position[0] * transformation.rotation_scale[1][0] + position[1] * transformation.rotation_scale[1][1]; + transformed_position[0] += transformation.translation[0]; + transformed_position[1] += transformation.translation[1]; + + return float4(transformed_position.x - clip_bounds.origin.x, + clip_bounds.origin.x + clip_bounds.size.width - transformed_position.x, + transformed_position.y - clip_bounds.origin.y, + clip_bounds.origin.y + clip_bounds.size.height - transformed_position.y); +} + float4 over(float4 below, float4 above) { float4 result; float alpha = above.a + below.a * (1.0 - above.a); diff --git a/crates/gpui/src/platform/mac/text_system.rs b/crates/gpui/src/platform/mac/text_system.rs index 9144b2a23a40bd527e1441cf71adcc2562c33f3c..aa9c5850d5375cad41166161ba595c3fab85d457 100644 --- a/crates/gpui/src/platform/mac/text_system.rs +++ b/crates/gpui/src/platform/mac/text_system.rs @@ -1,7 +1,7 @@ use crate::{ Bounds, DevicePixels, Font, FontFallbacks, FontFeatures, FontId, FontMetrics, FontRun, FontStyle, FontWeight, GlyphId, LineLayout, Pixels, PlatformTextSystem, Point, - RenderGlyphParams, Result, SUBPIXEL_VARIANTS, ShapedGlyph, ShapedRun, SharedString, Size, + RenderGlyphParams, Result, SUBPIXEL_VARIANTS_X, ShapedGlyph, ShapedRun, SharedString, Size, point, px, size, swap_rgba_pa_to_bgra, }; use anyhow::anyhow; @@ -395,9 +395,7 @@ impl MacTextSystemState { let subpixel_shift = params .subpixel_variant - .map(|v| v as f32 / SUBPIXEL_VARIANTS as f32); - cx.set_allows_font_smoothing(true); - cx.set_should_smooth_fonts(true); + .map(|v| v as f32 / SUBPIXEL_VARIANTS_X as f32); cx.set_text_drawing_mode(CGTextDrawingMode::CGTextFill); cx.set_gray_fill_color(0.0, 1.0); cx.set_allows_antialiasing(true); @@ -432,6 +430,8 @@ impl MacTextSystemState { fn layout_line(&mut self, text: &str, font_size: Pixels, font_runs: &[FontRun]) -> LineLayout { // Construct the attributed string, converting UTF8 ranges to UTF16 ranges. let mut string = CFMutableAttributedString::new(); + let mut max_ascent = 0.0f32; + let mut max_descent = 0.0f32; { string.replace_str(&CFString::new(text), CFRange::init(0, 0)); let utf16_line_len = string.char_len() as usize; @@ -453,6 +453,11 @@ impl MacTextSystemState { let font: &FontKitFont = &self.fonts[run.font_id.0]; + let font_metrics = font.metrics(); + let font_scale = font_size.0 / font_metrics.units_per_em as f32; + max_ascent = max_ascent.max(font_metrics.ascent * font_scale); + max_descent = max_descent.max(-font_metrics.descent * font_scale); + unsafe { string.set_attribute( cf_range, @@ -510,8 +515,8 @@ impl MacTextSystemState { runs, font_size, width: typographic_bounds.width.into(), - ascent: typographic_bounds.ascent.into(), - descent: typographic_bounds.descent.into(), + ascent: max_ascent.into(), + descent: max_descent.into(), len: text.len(), } } diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index 1230a704062ba835bceb5db5d2ecf05b688e34df..95efffa3e77cdbeebf53acd47dd1aa9b33cb24ab 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -418,6 +418,7 @@ struct MacWindowState { select_next_tab_callback: Option>, select_previous_tab_callback: Option>, toggle_tab_bar_callback: Option>, + activated_least_once: bool, } impl MacWindowState { @@ -513,10 +514,11 @@ impl MacWindowState { fn bounds(&self) -> Bounds { let mut window_frame = unsafe { NSWindow::frame(self.native_window) }; - let screen_frame = unsafe { - let screen = NSWindow::screen(self.native_window); - NSScreen::frame(screen) - }; + let screen = unsafe { NSWindow::screen(self.native_window) }; + if screen == nil { + return Bounds::new(point(px(0.), px(0.)), crate::DEFAULT_WINDOW_SIZE); + } + let screen_frame = unsafe { NSScreen::frame(screen) }; // Flip the y coordinate to be top-left origin window_frame.origin.y = @@ -616,7 +618,7 @@ impl MacWindow { } let native_window: id = match kind { - WindowKind::Normal => msg_send![WINDOW_CLASS, alloc], + WindowKind::Normal | WindowKind::Floating => msg_send![WINDOW_CLASS, alloc], WindowKind::PopUp => { style_mask |= NSWindowStyleMaskNonactivatingPanel; msg_send![PANEL_CLASS, alloc] @@ -722,6 +724,7 @@ impl MacWindow { select_next_tab_callback: None, select_previous_tab_callback: None, toggle_tab_bar_callback: None, + activated_least_once: false, }))); (*native_window).set_ivar( @@ -773,7 +776,7 @@ impl MacWindow { native_window.makeFirstResponder_(native_view); match kind { - WindowKind::Normal => { + WindowKind::Normal | WindowKind::Floating => { native_window.setLevel_(NSNormalWindowLevel); native_window.setAcceptsMouseMovedEvents_(YES); @@ -1519,6 +1522,9 @@ impl PlatformWindow for MacWindow { }; match action_str.as_ref() { + "None" => { + // "Do Nothing" selected, so do no action + } "Minimize" => { window.miniaturize_(nil); } @@ -1565,7 +1571,7 @@ fn get_scale_factor(native_window: id) -> f32 { let factor = unsafe { let screen: id = msg_send![native_window, screen]; if screen.is_null() { - return 1.0; + return 2.0; } NSScreen::backingScaleFactor(screen) as f32 }; @@ -1991,23 +1997,32 @@ extern "C" fn window_did_change_key_status(this: &Object, selector: Sel, _: id) let executor = lock.executor.clone(); drop(lock); - // If window is becoming active, trigger immediate synchronous frame request. + // When a window becomes active, trigger an immediate synchronous frame request to prevent + // tab flicker when switching between windows in native tabs mode. + // + // This is only done on subsequent activations (not the first) to ensure the initial focus + // path is properly established. Without this guard, the focus state would remain unset until + // the first mouse click, causing keybindings to be non-functional. if selector == sel!(windowDidBecomeKey:) && is_active { let window_state = unsafe { get_window_state(this) }; let mut lock = window_state.lock(); - if let Some(mut callback) = lock.request_frame_callback.take() { - #[cfg(not(feature = "macos-blade"))] - lock.renderer.set_presents_with_transaction(true); - lock.stop_display_link(); - drop(lock); - callback(Default::default()); + if lock.activated_least_once { + if let Some(mut callback) = lock.request_frame_callback.take() { + #[cfg(not(feature = "macos-blade"))] + lock.renderer.set_presents_with_transaction(true); + lock.stop_display_link(); + drop(lock); + callback(Default::default()); - let mut lock = window_state.lock(); - lock.request_frame_callback = Some(callback); - #[cfg(not(feature = "macos-blade"))] - lock.renderer.set_presents_with_transaction(false); - lock.start_display_link(); + let mut lock = window_state.lock(); + lock.request_frame_callback = Some(callback); + #[cfg(not(feature = "macos-blade"))] + lock.renderer.set_presents_with_transaction(false); + lock.start_display_link(); + } + } else { + lock.activated_least_once = true; } } diff --git a/crates/gpui/src/platform/windows/clipboard.rs b/crates/gpui/src/platform/windows/clipboard.rs index 915dbab3901aef2fc092626f13fbad783f68858a..90d97a84c0bedcc241f7432a7f14f09d46018b49 100644 --- a/crates/gpui/src/platform/windows/clipboard.rs +++ b/crates/gpui/src/platform/windows/clipboard.rs @@ -3,7 +3,6 @@ use std::sync::LazyLock; use anyhow::Result; use collections::{FxHashMap, FxHashSet}; use itertools::Itertools; -use util::ResultExt; use windows::Win32::{ Foundation::{HANDLE, HGLOBAL}, System::{ @@ -76,14 +75,18 @@ enum ClipboardFormatType { } pub(crate) fn write_to_clipboard(item: ClipboardItem) { - write_to_clipboard_inner(item).log_err(); - unsafe { CloseClipboard().log_err() }; + with_clipboard(|| write_to_clipboard_inner(item)); } pub(crate) fn read_from_clipboard() -> Option { - let result = read_from_clipboard_inner(); - unsafe { CloseClipboard().log_err() }; - result + with_clipboard(|| { + with_best_match_format(|item_format| match format_to_type(item_format) { + ClipboardFormatType::Text => read_string_from_clipboard(), + ClipboardFormatType::Image => read_image_from_clipboard(item_format), + ClipboardFormatType::Files => read_files_from_clipboard(), + }) + }) + .flatten() } pub(crate) fn with_file_names(hdrop: HDROP, mut f: F) @@ -96,11 +99,33 @@ where let mut buffer = vec![0u16; filename_length + 1]; let ret = unsafe { DragQueryFileW(hdrop, file_index, Some(buffer.as_mut_slice())) }; if ret == 0 { - log::error!("unable to read file name"); + log::error!("unable to read file name of dragged file"); continue; } - if let Some(file_name) = String::from_utf16(&buffer[0..filename_length]).log_err() { - f(file_name); + match String::from_utf16(&buffer[0..filename_length]) { + Ok(file_name) => f(file_name), + Err(e) => { + log::error!("dragged file name is not UTF-16: {}", e) + } + } + } +} + +fn with_clipboard(f: F) -> Option +where + F: FnOnce() -> T, +{ + match unsafe { OpenClipboard(None) } { + Ok(()) => { + let result = f(); + if let Err(e) = unsafe { CloseClipboard() } { + log::error!("Failed to close clipboard: {e}",); + } + Some(result) + } + Err(e) => { + log::error!("Failed to open clipboard: {e}",); + None } } } @@ -124,7 +149,6 @@ fn format_to_type(item_format: u32) -> &'static ClipboardFormatType { // Currently, we only write the first item. fn write_to_clipboard_inner(item: ClipboardItem) -> Result<()> { unsafe { - OpenClipboard(None)?; EmptyClipboard()?; } match item.entries().first() { @@ -215,15 +239,6 @@ fn convert_image_to_png_format(bytes: &[u8], image_format: ImageFormat) -> Resul Ok(output_buf) } -fn read_from_clipboard_inner() -> Option { - unsafe { OpenClipboard(None) }.log_err()?; - with_best_match_format(|item_format| match format_to_type(item_format) { - ClipboardFormatType::Text => read_string_from_clipboard(), - ClipboardFormatType::Image => read_image_from_clipboard(item_format), - ClipboardFormatType::Files => read_files_from_clipboard(), - }) -} - // Here, we enumerate all formats on the clipboard and find the first one that we can process. // The reason we don't use `GetPriorityClipboardFormat` is that it sometimes returns the // wrong format. @@ -266,7 +281,7 @@ where } fn read_string_from_clipboard() -> Option { - let text = with_clipboard_data(CF_UNICODETEXT.0 as u32, |data_ptr| { + let text = with_clipboard_data(CF_UNICODETEXT.0 as u32, |data_ptr, _| { let pcwstr = PCWSTR(data_ptr as *const u16); String::from_utf16_lossy(unsafe { pcwstr.as_wide() }) })?; @@ -290,20 +305,22 @@ fn read_hash_from_clipboard() -> Option { if unsafe { IsClipboardFormatAvailable(*CLIPBOARD_HASH_FORMAT).is_err() } { return None; } - with_clipboard_data(*CLIPBOARD_HASH_FORMAT, |data_ptr| { + with_clipboard_data(*CLIPBOARD_HASH_FORMAT, |data_ptr, size| { + if size < 8 { + return None; + } let hash_bytes: [u8; 8] = unsafe { std::slice::from_raw_parts(data_ptr.cast::(), 8) - .to_vec() .try_into() - .log_err() + .ok() }?; Some(u64::from_ne_bytes(hash_bytes)) })? } fn read_metadata_from_clipboard() -> Option { - unsafe { IsClipboardFormatAvailable(*CLIPBOARD_METADATA_FORMAT).log_err()? }; - with_clipboard_data(*CLIPBOARD_METADATA_FORMAT, |data_ptr| { + unsafe { IsClipboardFormatAvailable(*CLIPBOARD_METADATA_FORMAT).ok()? }; + with_clipboard_data(*CLIPBOARD_METADATA_FORMAT, |data_ptr, _size| { let pcwstr = PCWSTR(data_ptr as *const u16); String::from_utf16_lossy(unsafe { pcwstr.as_wide() }) }) @@ -320,7 +337,7 @@ fn format_number_to_image_format(format_number: u32) -> Option<&'static ImageFor } fn read_image_for_type(format_number: u32, format: ImageFormat) -> Option { - let (bytes, id) = with_clipboard_data_and_size(format_number, |data_ptr, size| { + let (bytes, id) = with_clipboard_data(format_number, |data_ptr, size| { let bytes = unsafe { std::slice::from_raw_parts(data_ptr as *mut u8 as _, size).to_vec() }; let id = hash(&bytes); (bytes, id) @@ -329,7 +346,7 @@ fn read_image_for_type(format_number: u32, format: ImageFormat) -> Option Option { - let text = with_clipboard_data(CF_HDROP.0 as u32, |data_ptr| { + let text = with_clipboard_data(CF_HDROP.0 as u32, |data_ptr, _size| { let hdrop = HDROP(data_ptr); let mut filenames = String::new(); with_file_names(hdrop, |file_name| { @@ -344,25 +361,14 @@ fn read_files_from_clipboard() -> Option { } fn with_clipboard_data(format: u32, f: F) -> Option -where - F: FnOnce(*mut std::ffi::c_void) -> R, -{ - let global = HGLOBAL(unsafe { GetClipboardData(format).log_err() }?.0); - let data_ptr = unsafe { GlobalLock(global) }; - let result = f(data_ptr); - unsafe { GlobalUnlock(global).log_err() }; - Some(result) -} - -fn with_clipboard_data_and_size(format: u32, f: F) -> Option where F: FnOnce(*mut std::ffi::c_void, usize) -> R, { - let global = HGLOBAL(unsafe { GetClipboardData(format).log_err() }?.0); + let global = HGLOBAL(unsafe { GetClipboardData(format).ok() }?.0); let size = unsafe { GlobalSize(global) }; let data_ptr = unsafe { GlobalLock(global) }; let result = f(data_ptr, size); - unsafe { GlobalUnlock(global).log_err() }; + unsafe { GlobalUnlock(global).ok() }; Some(result) } diff --git a/crates/gpui/src/platform/windows/direct_write.rs b/crates/gpui/src/platform/windows/direct_write.rs index df3161bf079a8eb0cb04908e586f5d344519821e..e187fc4b09176906102a1bf8fe50b410aae3cb2b 100644 --- a/crates/gpui/src/platform/windows/direct_write.rs +++ b/crates/gpui/src/platform/windows/direct_write.rs @@ -723,11 +723,10 @@ impl DirectWriteState { dx: 0.0, dy: 0.0, }; - let subpixel_shift = params - .subpixel_variant - .map(|v| v as f32 / SUBPIXEL_VARIANTS as f32); - let baseline_origin_x = subpixel_shift.x / params.scale_factor; - let baseline_origin_y = subpixel_shift.y / params.scale_factor; + let baseline_origin_x = + params.subpixel_variant.x as f32 / SUBPIXEL_VARIANTS_X as f32 / params.scale_factor; + let baseline_origin_y = + params.subpixel_variant.y as f32 / SUBPIXEL_VARIANTS_Y as f32 / params.scale_factor; let mut rendering_mode = DWRITE_RENDERING_MODE1::default(); let mut grid_fit_mode = DWRITE_GRID_FIT_MODE::default(); @@ -859,7 +858,7 @@ impl DirectWriteState { let bitmap_size = glyph_bounds.size; let subpixel_shift = params .subpixel_variant - .map(|v| v as f32 / SUBPIXEL_VARIANTS as f32); + .map(|v| v as f32 / SUBPIXEL_VARIANTS_X as f32); let baseline_origin_x = subpixel_shift.x / params.scale_factor; let baseline_origin_y = subpixel_shift.y / params.scale_factor; diff --git a/crates/gpui/src/platform/windows/directx_devices.rs b/crates/gpui/src/platform/windows/directx_devices.rs index 4fa4db827492faffaa0d8912b1f37b52f8cfc88f..a6a2381777b11fd1863735f3c7f4b71aafbf6a39 100644 --- a/crates/gpui/src/platform/windows/directx_devices.rs +++ b/crates/gpui/src/platform/windows/directx_devices.rs @@ -14,10 +14,11 @@ use windows::Win32::{ }, Dxgi::{ CreateDXGIFactory2, DXGI_CREATE_FACTORY_DEBUG, DXGI_CREATE_FACTORY_FLAGS, - DXGI_GPU_PREFERENCE_MINIMUM_POWER, IDXGIAdapter1, IDXGIFactory6, + IDXGIAdapter1, IDXGIFactory6, }, }, }; +use windows::core::Interface; pub(crate) fn try_to_recover_from_device_lost( mut f: impl FnMut() -> Result, @@ -121,10 +122,7 @@ fn get_dxgi_factory(debug_layer_available: bool) -> Result { #[inline] fn get_adapter(dxgi_factory: &IDXGIFactory6, debug_layer_available: bool) -> Result { for adapter_index in 0.. { - let adapter: IDXGIAdapter1 = unsafe { - dxgi_factory - .EnumAdapterByGpuPreference(adapter_index, DXGI_GPU_PREFERENCE_MINIMUM_POWER) - }?; + let adapter: IDXGIAdapter1 = unsafe { dxgi_factory.EnumAdapters(adapter_index)?.cast()? }; if let Ok(desc) = unsafe { adapter.GetDesc1() } { let gpu_name = String::from_utf16_lossy(&desc.Description) .trim_matches(char::from(0)) diff --git a/crates/gpui/src/platform/windows/events.rs b/crates/gpui/src/platform/windows/events.rs index c1e2040d377da814b261682eb93321fda4ebdb2d..a9873c109c7547547ea13b5e7ed4f71194c778a0 100644 --- a/crates/gpui/src/platform/windows/events.rs +++ b/crates/gpui/src/platform/windows/events.rs @@ -57,7 +57,10 @@ impl WindowsWindowInner { WM_MOUSEMOVE => self.handle_mouse_move_msg(handle, lparam, wparam), WM_MOUSELEAVE | WM_NCMOUSELEAVE => self.handle_mouse_leave_msg(), WM_NCMOUSEMOVE => self.handle_nc_mouse_move_msg(handle, lparam), - WM_NCLBUTTONDOWN => { + // Treat double click as a second single click, since we track the double clicks ourselves. + // If you don't interact with any elements, this will fall through to the windows default + // behavior of toggling whether the window is maximized. + WM_NCLBUTTONDBLCLK | WM_NCLBUTTONDOWN => { self.handle_nc_mouse_down_msg(handle, MouseButton::Left, wparam, lparam) } WM_NCRBUTTONDOWN => { @@ -1446,9 +1449,11 @@ fn is_virtual_key_pressed(vkey: VIRTUAL_KEY) -> bool { #[inline] pub(crate) fn current_modifiers() -> Modifiers { + let altgr = is_virtual_key_pressed(VK_RMENU) && is_virtual_key_pressed(VK_LCONTROL); + Modifiers { - control: is_virtual_key_pressed(VK_CONTROL), - alt: is_virtual_key_pressed(VK_MENU), + control: is_virtual_key_pressed(VK_CONTROL) && !altgr, + alt: is_virtual_key_pressed(VK_MENU) && !altgr, shift: is_virtual_key_pressed(VK_SHIFT), platform: is_virtual_key_pressed(VK_LWIN) || is_virtual_key_pressed(VK_RWIN), function: false, diff --git a/crates/gpui/src/platform/windows/platform.rs b/crates/gpui/src/platform/windows/platform.rs index 4d0e6ea56f7d90f303f6634de1239a6a4542429a..5219d8c8177f7c3dc76a7afab258e2c58a0ce6f8 100644 --- a/crates/gpui/src/platform/windows/platform.rs +++ b/crates/gpui/src/platform/windows/platform.rs @@ -243,29 +243,32 @@ impl WindowsPlatform { let validation_number = self.inner.validation_number; let all_windows = Arc::downgrade(&self.raw_window_handles); let text_system = Arc::downgrade(&self.text_system); - std::thread::spawn(move || { - let vsync_provider = VSyncProvider::new(); - loop { - vsync_provider.wait_for_vsync(); - if check_device_lost(&directx_device.device) { - handle_gpu_device_lost( - &mut directx_device, - platform_window.as_raw(), - validation_number, - &all_windows, - &text_system, - ); - } - let Some(all_windows) = all_windows.upgrade() else { - break; - }; - for hwnd in all_windows.read().iter() { - unsafe { - let _ = RedrawWindow(Some(hwnd.as_raw()), None, None, RDW_INVALIDATE); + std::thread::Builder::new() + .name("VSyncProvider".to_owned()) + .spawn(move || { + let vsync_provider = VSyncProvider::new(); + loop { + vsync_provider.wait_for_vsync(); + if check_device_lost(&directx_device.device) { + handle_gpu_device_lost( + &mut directx_device, + platform_window.as_raw(), + validation_number, + &all_windows, + &text_system, + ); + } + let Some(all_windows) = all_windows.upgrade() else { + break; + }; + for hwnd in all_windows.read().iter() { + unsafe { + let _ = RedrawWindow(Some(hwnd.as_raw()), None, None, RDW_INVALIDATE); + } } } - } - }); + }) + .unwrap(); } } @@ -346,6 +349,11 @@ impl Platform for WindowsPlatform { pid, app_path.display(), ); + + #[allow( + clippy::disallowed_methods, + reason = "We are restarting ourselves, using std command thus is fine" + )] let restart_process = util::command::new_std_command("powershell.exe") .arg("-command") .arg(script) @@ -1016,7 +1024,7 @@ fn handle_gpu_device_lost( all_windows: &std::sync::Weak>>, text_system: &std::sync::Weak, ) { - // Here we wait a bit to ensure the the system has time to recover from the device lost state. + // Here we wait a bit to ensure the system has time to recover from the device lost state. // If we don't wait, the final drawing result will be blank. std::thread::sleep(std::time::Duration::from_millis(350)); diff --git a/crates/gpui/src/platform/windows/shaders.hlsl b/crates/gpui/src/platform/windows/shaders.hlsl index 2cef54ae6166e313795eb42210b5f07c1bc378fc..c3ad2952dbf7122672104135f432e0257471642d 100644 --- a/crates/gpui/src/platform/windows/shaders.hlsl +++ b/crates/gpui/src/platform/windows/shaders.hlsl @@ -107,6 +107,12 @@ float4 distance_from_clip_rect(float2 unit_vertex, Bounds bounds, Bounds clip_bo return distance_from_clip_rect_impl(position, clip_bounds); } +float4 distance_from_clip_rect_transformed(float2 unit_vertex, Bounds bounds, Bounds clip_bounds, TransformationMatrix transformation) { + float2 position = unit_vertex * bounds.size + bounds.origin; + float2 transformed = mul(position, transformation.rotation_scale) + transformation.translation; + return distance_from_clip_rect_impl(transformed, clip_bounds); +} + // Convert linear RGB to sRGB float3 linear_to_srgb(float3 color) { return pow(color, float3(2.2, 2.2, 2.2)); @@ -654,7 +660,14 @@ float4 quad_fragment(QuadFragmentInput input): SV_Target { // out on each straight line, rather than around the whole // perimeter. This way each line starts and ends with a dash. bool is_horizontal = corner_center_to_point.x < corner_center_to_point.y; - float border_width = is_horizontal ? border.x : border.y; + // Choosing the right border width for dashed borders. + // TODO: A better solution exists taking a look at the whole file. + // this does not fix single dashed borders at the corners + float2 dashed_border = float2( + max(quad.border_widths.bottom, quad.border_widths.top), + max(quad.border_widths.right, quad.border_widths.left) + ); + float border_width = is_horizontal ? dashed_border.x : dashed_border.y; dash_velocity = dv_numerator / border_width; t = is_horizontal ? the_point.x : the_point.y; t *= dash_velocity; @@ -1088,7 +1101,7 @@ MonochromeSpriteVertexOutput monochrome_sprite_vertex(uint vertex_id: SV_VertexI MonochromeSprite sprite = mono_sprites[sprite_id]; float4 device_position = to_device_position_transformed(unit_vertex, sprite.bounds, sprite.transformation); - float4 clip_distance = distance_from_clip_rect(unit_vertex, sprite.bounds, sprite.content_mask); + float4 clip_distance = distance_from_clip_rect_transformed(unit_vertex, sprite.bounds, sprite.content_mask, sprite.transformation); float2 tile_position = to_tile_position(unit_vertex, sprite.tile); float4 color = hsla_to_rgba(sprite.color); diff --git a/crates/gpui/src/platform/windows/window.rs b/crates/gpui/src/platform/windows/window.rs index aa907c8d734973fc4fc795b6d8ebf7654d1b40de..7abb4ee21a1a28356e15d09be3c22c688bb7e033 100644 --- a/crates/gpui/src/platform/windows/window.rs +++ b/crates/gpui/src/platform/windows/window.rs @@ -684,8 +684,16 @@ impl PlatformWindow for WindowsWindow { .executor .spawn(async move { this.set_window_placement().log_err(); - unsafe { SetActiveWindow(hwnd).log_err() }; - unsafe { SetFocus(Some(hwnd)).log_err() }; + + unsafe { + // If the window is minimized, restore it. + if IsIconic(hwnd).as_bool() { + ShowWindowAsync(hwnd, SW_RESTORE).ok().log_err(); + } + + SetActiveWindow(hwnd).log_err(); + SetFocus(Some(hwnd)).log_err(); + } // premium ragebait by windows, this is needed because the window // must have received an input event to be able to set itself to foreground diff --git a/crates/gpui/src/style.rs b/crates/gpui/src/style.rs index 78bca5a4993271883c555fe05366a7c9a0c472ac..8afb4e4eb8af70a78c1cd4fc0176a7fe3baf3c3e 100644 --- a/crates/gpui/src/style.rs +++ b/crates/gpui/src/style.rs @@ -1300,7 +1300,9 @@ mod tests { use super::*; - #[test] + use util_macros::perf; + + #[perf] fn test_basic_highlight_style_combination() { let style_a = HighlightStyle::default(); let style_b = HighlightStyle::default(); @@ -1385,7 +1387,7 @@ mod tests { ); } - #[test] + #[perf] fn test_combine_highlights() { assert_eq!( combine_highlights( diff --git a/crates/gpui/src/svg_renderer.rs b/crates/gpui/src/svg_renderer.rs index 0107624bc8d0e6a26c6acc4a085cbddc7e14c4c5..b2bf126967cd0c533eb6faac8c168508fe5c1d34 100644 --- a/crates/gpui/src/svg_renderer.rs +++ b/crates/gpui/src/svg_renderer.rs @@ -54,7 +54,10 @@ impl SvgRenderer { } } - pub(crate) fn render(&self, params: &RenderSvgParams) -> Result>> { + pub(crate) fn render( + &self, + params: &RenderSvgParams, + ) -> Result, Vec)>> { anyhow::ensure!(!params.size.is_zero(), "can't render at a zero size"); // Load the tree. @@ -65,30 +68,33 @@ impl SvgRenderer { let pixmap = self.render_pixmap(&bytes, SvgSize::Size(params.size))?; // Convert the pixmap's pixels into an alpha mask. + let size = Size::new( + DevicePixels(pixmap.width() as i32), + DevicePixels(pixmap.height() as i32), + ); let alpha_mask = pixmap .pixels() .iter() .map(|p| p.alpha()) .collect::>(); - Ok(Some(alpha_mask)) + Ok(Some((size, alpha_mask))) } pub fn render_pixmap(&self, bytes: &[u8], size: SvgSize) -> Result { let tree = usvg::Tree::from_data(bytes, &self.usvg_options)?; - - let size = match size { - SvgSize::Size(size) => size, - SvgSize::ScaleFactor(scale) => crate::size( - DevicePixels((tree.size().width() * scale) as i32), - DevicePixels((tree.size().height() * scale) as i32), - ), + let svg_size = tree.size(); + let scale = match size { + SvgSize::Size(size) => size.width.0 as f32 / svg_size.width(), + SvgSize::ScaleFactor(scale) => scale, }; // Render the SVG to a pixmap with the specified width and height. - let mut pixmap = resvg::tiny_skia::Pixmap::new(size.width.into(), size.height.into()) - .ok_or(usvg::Error::InvalidSize)?; + let mut pixmap = resvg::tiny_skia::Pixmap::new( + (svg_size.width() * scale) as u32, + (svg_size.height() * scale) as u32, + ) + .ok_or(usvg::Error::InvalidSize)?; - let scale = size.width.0 as f32 / tree.size().width(); let transform = resvg::tiny_skia::Transform::from_scale(scale, scale); resvg::render(&tree, transform, &mut pixmap.as_mut()); diff --git a/crates/gpui/src/tab_stop.rs b/crates/gpui/src/tab_stop.rs index c4d2fda6e9a9c3e0adfb2d02cf5c372869d42751..8a95a3975af736d544e01cbf6e212994b8e7e8c6 100644 --- a/crates/gpui/src/tab_stop.rs +++ b/crates/gpui/src/tab_stop.rs @@ -1,74 +1,324 @@ +use std::fmt::Debug; + +use ::sum_tree::SumTree; +use collections::FxHashMap; +use sum_tree::Bias; + use crate::{FocusHandle, FocusId}; -/// Represents a collection of tab handles. -/// -/// Used to manage the `Tab` event to switch between focus handles. -#[derive(Default)] -pub(crate) struct TabHandles { - pub(crate) handles: Vec, +/// Represents a collection of focus handles using the tab-index APIs. +#[derive(Debug)] +pub(crate) struct TabStopMap { + current_path: TabStopPath, + pub(crate) insertion_history: Vec, + by_id: FxHashMap, + order: SumTree, } -impl TabHandles { - pub(crate) fn insert(&mut self, focus_handle: &FocusHandle) { - if !focus_handle.tab_stop { - return; +#[derive(Debug, Clone)] +pub enum TabStopOperation { + Insert(FocusHandle), + Group(TabIndex), + GroupEnd, +} + +impl TabStopOperation { + fn focus_handle(&self) -> Option<&FocusHandle> { + match self { + TabStopOperation::Insert(focus_handle) => Some(focus_handle), + _ => None, } + } +} + +type TabIndex = isize; + +#[derive(Debug, Default, PartialEq, Eq, Clone, Ord, PartialOrd)] +struct TabStopPath(smallvec::SmallVec<[TabIndex; 6]>); + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +struct TabStopNode { + /// Path to access the node in the tree + /// The final node in the list is a leaf node corresponding to an actual focus handle, + /// all other nodes are group nodes + path: TabStopPath, + /// index into the backing array of nodes. Corresponds to insertion order + node_insertion_index: usize, - let focus_handle = focus_handle.clone(); + /// Whether this node is a tab stop + tab_stop: bool, +} + +impl Ord for TabStopNode { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.path + .cmp(&other.path) + .then(self.node_insertion_index.cmp(&other.node_insertion_index)) + } +} + +impl PartialOrd for TabStopNode { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(&other)) + } +} + +impl Default for TabStopMap { + fn default() -> Self { + Self { + current_path: TabStopPath::default(), + insertion_history: Vec::new(), + by_id: FxHashMap::default(), + order: SumTree::new(()), + } + } +} + +impl TabStopMap { + pub fn insert(&mut self, focus_handle: &FocusHandle) { + self.insertion_history + .push(TabStopOperation::Insert(focus_handle.clone())); + let mut path = self.current_path.clone(); + path.0.push(focus_handle.tab_index); + let order = TabStopNode { + node_insertion_index: self.insertion_history.len() - 1, + tab_stop: focus_handle.tab_stop, + path, + }; + self.by_id.insert(focus_handle.id, order.clone()); + self.order.insert_or_replace(order, ()); + } + + pub fn begin_group(&mut self, tab_index: isize) { + self.insertion_history + .push(TabStopOperation::Group(tab_index)); + self.current_path.0.push(tab_index); + } + + pub fn end_group(&mut self) { + self.insertion_history.push(TabStopOperation::GroupEnd); + self.current_path.0.pop(); + } + + pub fn clear(&mut self) { + *self = Self::default(); + self.current_path.0.clear(); + self.insertion_history.clear(); + self.by_id.clear(); + self.order = SumTree::new(()); + } + + pub fn next(&self, focused_id: Option<&FocusId>) -> Option { + let Some(focused_id) = focused_id else { + let first = self.order.first()?; + if first.tab_stop { + return self.focus_handle_for_order(first); + } else { + return self + .next_inner(first) + .and_then(|order| self.focus_handle_for_order(order)); + } + }; + + let Some(node) = self.tab_node_for_focus_id(focused_id) else { + return self.next(None); + }; + let item = self.next_inner(node); + + if let Some(item) = item { + self.focus_handle_for_order(&item) + } else { + self.next(None) + } + } - // Insert handle with same tab_index last - if let Some(ix) = self - .handles - .iter() - .position(|tab| tab.tab_index > focus_handle.tab_index) + fn next_inner(&self, node: &TabStopNode) -> Option<&TabStopNode> { + let mut cursor = self.order.cursor::(()); + cursor.seek(&node, Bias::Left); + cursor.next(); + while let Some(item) = cursor.item() + && !item.tab_stop { - self.handles.insert(ix, focus_handle); + cursor.next(); + } + + cursor.item() + } + + pub fn prev(&self, focused_id: Option<&FocusId>) -> Option { + let Some(focused_id) = focused_id else { + let last = self.order.last()?; + if last.tab_stop { + return self.focus_handle_for_order(last); + } else { + return self + .prev_inner(last) + .and_then(|order| self.focus_handle_for_order(order)); + } + }; + + let Some(node) = self.tab_node_for_focus_id(focused_id) else { + return self.prev(None); + }; + let item = self.prev_inner(node); + + if let Some(item) = item { + self.focus_handle_for_order(&item) } else { - self.handles.push(focus_handle); + self.prev(None) } } - pub(crate) fn clear(&mut self) { - self.handles.clear(); + fn prev_inner(&self, node: &TabStopNode) -> Option<&TabStopNode> { + let mut cursor = self.order.cursor::(()); + cursor.seek(&node, Bias::Left); + cursor.prev(); + while let Some(item) = cursor.item() + && !item.tab_stop + { + cursor.prev(); + } + + cursor.item() } - fn current_index(&self, focused_id: Option<&FocusId>) -> Option { - self.handles.iter().position(|h| Some(&h.id) == focused_id) + pub fn replay(&mut self, nodes: &[TabStopOperation]) { + for node in nodes { + match node { + TabStopOperation::Insert(focus_handle) => self.insert(focus_handle), + TabStopOperation::Group(tab_index) => self.begin_group(*tab_index), + TabStopOperation::GroupEnd => self.end_group(), + } + } } - pub(crate) fn next(&self, focused_id: Option<&FocusId>) -> Option { - let next_ix = self - .current_index(focused_id) - .and_then(|ix| { - let next_ix = ix + 1; - (next_ix < self.handles.len()).then_some(next_ix) - }) - .unwrap_or_default(); + pub fn paint_index(&self) -> usize { + self.insertion_history.len() + } - self.handles.get(next_ix).cloned() + fn focus_handle_for_order(&self, order: &TabStopNode) -> Option { + let handle = self.insertion_history[order.node_insertion_index].focus_handle(); + debug_assert!( + handle.is_some(), + "The order node did not correspond to an element, this is a GPUI bug" + ); + handle.cloned() } - pub(crate) fn prev(&self, focused_id: Option<&FocusId>) -> Option { - let ix = self.current_index(focused_id).unwrap_or_default(); - let prev_ix = if ix == 0 { - self.handles.len().saturating_sub(1) - } else { - ix.saturating_sub(1) + fn tab_node_for_focus_id(&self, focused_id: &FocusId) -> Option<&TabStopNode> { + let Some(order) = self.by_id.get(focused_id) else { + return None; }; + Some(order) + } +} + +mod sum_tree_impl { + use sum_tree::SeekTarget; + + use crate::tab_stop::{TabStopNode, TabStopPath}; + + #[derive(Clone, Debug)] + pub struct TabStopOrderNodeSummary { + max_index: usize, + max_path: TabStopPath, + pub tab_stops: usize, + } + + pub type TabStopCount = usize; + + impl sum_tree::ContextLessSummary for TabStopOrderNodeSummary { + fn zero() -> Self { + TabStopOrderNodeSummary { + max_index: 0, + max_path: TabStopPath::default(), + tab_stops: 0, + } + } + + fn add_summary(&mut self, summary: &Self) { + self.max_index = summary.max_index; + self.max_path = summary.max_path.clone(); + self.tab_stops += summary.tab_stops; + } + } + + impl sum_tree::KeyedItem for TabStopNode { + type Key = Self; + + fn key(&self) -> Self::Key { + self.clone() + } + } + + impl sum_tree::Item for TabStopNode { + type Summary = TabStopOrderNodeSummary; - self.handles.get(prev_ix).cloned() + fn summary(&self, _cx: ::Context<'_>) -> Self::Summary { + TabStopOrderNodeSummary { + max_index: self.node_insertion_index, + max_path: self.path.clone(), + tab_stops: if self.tab_stop { 1 } else { 0 }, + } + } + } + + impl<'a> sum_tree::Dimension<'a, TabStopOrderNodeSummary> for TabStopCount { + fn zero(_: ::Context<'_>) -> Self { + 0 + } + + fn add_summary( + &mut self, + summary: &'a TabStopOrderNodeSummary, + _: ::Context<'_>, + ) { + *self += summary.tab_stops; + } + } + + impl<'a> sum_tree::Dimension<'a, TabStopOrderNodeSummary> for TabStopNode { + fn zero(_: ::Context<'_>) -> Self { + TabStopNode::default() + } + + fn add_summary( + &mut self, + summary: &'a TabStopOrderNodeSummary, + _: ::Context<'_>, + ) { + self.node_insertion_index = summary.max_index; + self.path = summary.max_path.clone(); + } + } + + impl<'a, 'b> SeekTarget<'a, TabStopOrderNodeSummary, TabStopNode> for &'b TabStopNode { + fn cmp( + &self, + cursor_location: &TabStopNode, + _: ::Context<'_>, + ) -> std::cmp::Ordering { + Iterator::cmp(self.path.0.iter(), cursor_location.path.0.iter()).then( + ::cmp( + &self.node_insertion_index, + &cursor_location.node_insertion_index, + ), + ) + } } } #[cfg(test)] mod tests { - use crate::{FocusHandle, FocusMap, TabHandles}; + use itertools::Itertools as _; + + use crate::{FocusHandle, FocusId, FocusMap, TabStopMap}; use std::sync::Arc; #[test] fn test_tab_handles() { let focus_map = Arc::new(FocusMap::default()); - let mut tab = TabHandles::default(); + let mut tab_index_map = TabStopMap::default(); let focus_handles = vec![ FocusHandle::new(&focus_map).tab_stop(true).tab_index(0), @@ -81,72 +331,281 @@ mod tests { ]; for handle in focus_handles.iter() { - tab.insert(handle); + tab_index_map.insert(handle); + } + let expected = [ + focus_handles[0].clone(), + focus_handles[5].clone(), + focus_handles[1].clone(), + focus_handles[2].clone(), + focus_handles[6].clone(), + ]; + + let mut prev = None; + let mut found = vec![]; + for _ in 0..expected.len() { + let handle = tab_index_map.next(prev.as_ref()).unwrap(); + prev = Some(handle.id); + found.push(handle.id); } + assert_eq!( - tab.handles - .iter() - .map(|handle| handle.id) - .collect::>(), - vec![ - focus_handles[0].id, - focus_handles[5].id, - focus_handles[1].id, - focus_handles[2].id, - focus_handles[6].id, - ] + found, + expected.iter().map(|handle| handle.id).collect::>() ); // Select first tab index if no handle is currently focused. - assert_eq!(tab.next(None), Some(tab.handles[0].clone())); + assert_eq!(tab_index_map.next(None), Some(expected[0].clone())); // Select last tab index if no handle is currently focused. - assert_eq!( - tab.prev(None), - Some(tab.handles[tab.handles.len() - 1].clone()) - ); + assert_eq!(tab_index_map.prev(None), expected.last().cloned(),); assert_eq!( - tab.next(Some(&tab.handles[0].id)), - Some(tab.handles[1].clone()) + tab_index_map.next(Some(&expected[0].id)), + Some(expected[1].clone()) ); assert_eq!( - tab.next(Some(&tab.handles[1].id)), - Some(tab.handles[2].clone()) + tab_index_map.next(Some(&expected[1].id)), + Some(expected[2].clone()) ); assert_eq!( - tab.next(Some(&tab.handles[2].id)), - Some(tab.handles[3].clone()) + tab_index_map.next(Some(&expected[2].id)), + Some(expected[3].clone()) ); assert_eq!( - tab.next(Some(&tab.handles[3].id)), - Some(tab.handles[4].clone()) + tab_index_map.next(Some(&expected[3].id)), + Some(expected[4].clone()) ); assert_eq!( - tab.next(Some(&tab.handles[4].id)), - Some(tab.handles[0].clone()) + tab_index_map.next(Some(&expected[4].id)), + Some(expected[0].clone()) ); // prev - assert_eq!(tab.prev(None), Some(tab.handles[4].clone())); + assert_eq!(tab_index_map.prev(None), Some(expected[4].clone())); assert_eq!( - tab.prev(Some(&tab.handles[0].id)), - Some(tab.handles[4].clone()) + tab_index_map.prev(Some(&expected[0].id)), + Some(expected[4].clone()) ); assert_eq!( - tab.prev(Some(&tab.handles[1].id)), - Some(tab.handles[0].clone()) + tab_index_map.prev(Some(&expected[1].id)), + Some(expected[0].clone()) ); assert_eq!( - tab.prev(Some(&tab.handles[2].id)), - Some(tab.handles[1].clone()) + tab_index_map.prev(Some(&expected[2].id)), + Some(expected[1].clone()) ); assert_eq!( - tab.prev(Some(&tab.handles[3].id)), - Some(tab.handles[2].clone()) + tab_index_map.prev(Some(&expected[3].id)), + Some(expected[2].clone()) ); assert_eq!( - tab.prev(Some(&tab.handles[4].id)), - Some(tab.handles[3].clone()) + tab_index_map.prev(Some(&expected[4].id)), + Some(expected[3].clone()) ); } + + #[test] + fn test_tab_non_stop_filtering() { + let focus_map = Arc::new(FocusMap::default()); + let mut tab_index_map = TabStopMap::default(); + + // Check that we can query next from a non-stop tab + let tab_non_stop_1 = FocusHandle::new(&focus_map).tab_stop(false).tab_index(1); + let tab_stop_2 = FocusHandle::new(&focus_map).tab_stop(true).tab_index(2); + tab_index_map.insert(&tab_non_stop_1); + tab_index_map.insert(&tab_stop_2); + let result = tab_index_map.next(Some(&tab_non_stop_1.id)).unwrap(); + assert_eq!(result.id, tab_stop_2.id); + + // Check that we skip over non-stop tabs + let tab_stop_0 = FocusHandle::new(&focus_map).tab_stop(true).tab_index(0); + let tab_non_stop_0 = FocusHandle::new(&focus_map).tab_stop(false).tab_index(0); + tab_index_map.insert(&tab_stop_0); + tab_index_map.insert(&tab_non_stop_0); + let result = tab_index_map.next(Some(&tab_stop_0.id)).unwrap(); + assert_eq!(result.id, tab_stop_2.id); + } + + #[must_use] + struct TabStopMapTest { + tab_map: TabStopMap, + focus_map: Arc, + expected: Vec<(usize, FocusId)>, + } + + impl TabStopMapTest { + #[must_use] + fn new() -> Self { + Self { + tab_map: TabStopMap::default(), + focus_map: Arc::new(FocusMap::default()), + expected: Vec::default(), + } + } + + #[must_use] + fn tab_non_stop(mut self, index: isize) -> Self { + let handle = FocusHandle::new(&self.focus_map) + .tab_stop(false) + .tab_index(index); + self.tab_map.insert(&handle); + self + } + + #[must_use] + fn tab_stop(mut self, index: isize, expected: usize) -> Self { + let handle = FocusHandle::new(&self.focus_map) + .tab_stop(true) + .tab_index(index); + self.tab_map.insert(&handle); + self.expected.push((expected, handle.id)); + self.expected.sort_by_key(|(expected, _)| *expected); + self + } + + #[must_use] + fn tab_group(mut self, tab_index: isize, children: impl FnOnce(Self) -> Self) -> Self { + self.tab_map.begin_group(tab_index); + self = children(self); + self.tab_map.end_group(); + self + } + + fn traverse_tab_map( + &self, + traverse: impl Fn(&TabStopMap, Option<&FocusId>) -> Option, + ) -> Vec { + let mut last_focus_id = None; + let mut found = vec![]; + for _ in 0..self.expected.len() { + let handle = traverse(&self.tab_map, last_focus_id.as_ref()).unwrap(); + last_focus_id = Some(handle.id); + found.push(handle.id); + } + found + } + + fn assert(self) { + let mut expected = self.expected.iter().map(|(_, id)| *id).collect_vec(); + + // Check next order + let forward_found = self.traverse_tab_map(|tab_map, prev| tab_map.next(prev)); + assert_eq!(forward_found, expected); + + // Test overflow. Last to first + assert_eq!( + self.tab_map + .next(forward_found.last()) + .map(|handle| handle.id), + expected.first().cloned() + ); + + // Check previous order + let reversed_found = self.traverse_tab_map(|tab_map, prev| tab_map.prev(prev)); + expected.reverse(); + assert_eq!(reversed_found, expected); + + // Test overflow. First to last + assert_eq!( + self.tab_map + .prev(reversed_found.last()) + .map(|handle| handle.id), + expected.first().cloned(), + ); + } + } + + #[test] + fn test_with_disabled_tab_stop() { + TabStopMapTest::new() + .tab_stop(0, 0) + .tab_non_stop(1) + .tab_stop(2, 1) + .tab_stop(3, 2) + .assert(); + } + + #[test] + fn test_with_multiple_disabled_tab_stops() { + TabStopMapTest::new() + .tab_non_stop(0) + .tab_stop(1, 0) + .tab_non_stop(3) + .tab_stop(3, 1) + .tab_non_stop(4) + .assert(); + } + + #[test] + fn test_tab_group_functionality() { + TabStopMapTest::new() + .tab_stop(0, 0) + .tab_stop(0, 1) + .tab_group(2, |t| t.tab_stop(0, 2).tab_stop(1, 3)) + .tab_stop(3, 4) + .tab_stop(4, 5) + .assert() + } + + #[test] + fn test_sibling_groups() { + TabStopMapTest::new() + .tab_stop(0, 0) + .tab_stop(1, 1) + .tab_group(2, |test| test.tab_stop(0, 2).tab_stop(1, 3)) + .tab_stop(3, 4) + .tab_stop(4, 5) + .tab_group(6, |test| test.tab_stop(0, 6).tab_stop(1, 7)) + .tab_stop(7, 8) + .tab_stop(8, 9) + .assert(); + } + + #[test] + fn test_nested_group() { + TabStopMapTest::new() + .tab_stop(0, 0) + .tab_stop(1, 1) + .tab_group(2, |t| { + t.tab_group(0, |t| t.tab_stop(0, 2).tab_stop(1, 3)) + .tab_stop(1, 4) + }) + .tab_stop(3, 5) + .tab_stop(4, 6) + .assert(); + } + + #[test] + fn test_sibling_nested_groups() { + TabStopMapTest::new() + .tab_stop(0, 0) + .tab_stop(1, 1) + .tab_group(2, |builder| { + builder + .tab_stop(0, 2) + .tab_stop(2, 5) + .tab_group(1, |builder| builder.tab_stop(0, 3).tab_stop(1, 4)) + .tab_group(3, |builder| builder.tab_stop(0, 6).tab_stop(1, 7)) + }) + .tab_stop(3, 8) + .tab_stop(4, 9) + .assert(); + } + + #[test] + fn test_sibling_nested_groups_out_of_order() { + TabStopMapTest::new() + .tab_stop(9, 9) + .tab_stop(8, 8) + .tab_group(7, |builder| { + builder + .tab_stop(0, 2) + .tab_stop(2, 5) + .tab_group(3, |builder| builder.tab_stop(1, 7).tab_stop(0, 6)) + .tab_group(1, |builder| builder.tab_stop(0, 3).tab_stop(1, 4)) + }) + .tab_stop(3, 0) + .tab_stop(4, 1) + .assert(); + } } diff --git a/crates/gpui/src/taffy.rs b/crates/gpui/src/taffy.rs index 288726d379b9fa4c1dbb58f2341b4bc2145a9551..bc35dcec1eb126931cd71a6f3a17ce05054e8dbe 100644 --- a/crates/gpui/src/taffy.rs +++ b/crates/gpui/src/taffy.rs @@ -1,5 +1,6 @@ use crate::{ AbsoluteLength, App, Bounds, DefiniteLength, Edges, Length, Pixels, Point, Size, Style, Window, + point, size, }; use collections::{FxHashMap, FxHashSet}; use smallvec::SmallVec; @@ -37,7 +38,7 @@ const EXPECT_MESSAGE: &str = "we should avoid taffy layout errors by constructio impl TaffyLayoutEngine { pub fn new() -> Self { let mut taffy = TaffyTree::new(); - taffy.disable_rounding(); + taffy.enable_rounding(); TaffyLayoutEngine { taffy, absolute_layout_bounds: FxHashMap::default(), @@ -55,9 +56,10 @@ impl TaffyLayoutEngine { &mut self, style: Style, rem_size: Pixels, + scale_factor: f32, children: &[LayoutId], ) -> LayoutId { - let taffy_style = style.to_taffy(rem_size); + let taffy_style = style.to_taffy(rem_size, scale_factor); if children.is_empty() { self.taffy @@ -79,6 +81,7 @@ impl TaffyLayoutEngine { &mut self, style: Style, rem_size: Pixels, + scale_factor: f32, measure: impl FnMut( Size>, Size, @@ -87,7 +90,7 @@ impl TaffyLayoutEngine { ) -> Size + 'static, ) -> LayoutId { - let taffy_style = style.to_taffy(rem_size); + let taffy_style = style.to_taffy(rem_size, scale_factor); self.taffy .new_leaf_with_context( @@ -181,7 +184,20 @@ impl TaffyLayoutEngine { } } - // let started_at = std::time::Instant::now(); + let scale_factor = window.scale_factor(); + + let transform = |v: AvailableSpace| match v { + AvailableSpace::Definite(pixels) => { + AvailableSpace::Definite(Pixels(pixels.0 * scale_factor)) + } + AvailableSpace::MinContent => AvailableSpace::MinContent, + AvailableSpace::MaxContent => AvailableSpace::MaxContent, + }; + let available_space = size( + transform(available_space.width), + transform(available_space.height), + ); + self.taffy .compute_layout_with_measure( id.into(), @@ -192,32 +208,50 @@ impl TaffyLayoutEngine { }; let known_dimensions = Size { - width: known_dimensions.width.map(Pixels), - height: known_dimensions.height.map(Pixels), + width: known_dimensions.width.map(|e| Pixels(e / scale_factor)), + height: known_dimensions.height.map(|e| Pixels(e / scale_factor)), }; - (node_context.measure)(known_dimensions, available_space.into(), window, cx) - .into() + let available_space: Size = available_space.into(); + let untransform = |ev: AvailableSpace| match ev { + AvailableSpace::Definite(pixels) => { + AvailableSpace::Definite(Pixels(pixels.0 / scale_factor)) + } + AvailableSpace::MinContent => AvailableSpace::MinContent, + AvailableSpace::MaxContent => AvailableSpace::MaxContent, + }; + let available_space = size( + untransform(available_space.width), + untransform(available_space.height), + ); + + let a: Size = + (node_context.measure)(known_dimensions, available_space, window, cx); + size(a.width.0 * scale_factor, a.height.0 * scale_factor).into() }, ) .expect(EXPECT_MESSAGE); - - // println!("compute_layout took {:?}", started_at.elapsed()); } - pub fn layout_bounds(&mut self, id: LayoutId) -> Bounds { + pub fn layout_bounds(&mut self, id: LayoutId, scale_factor: f32) -> Bounds { if let Some(layout) = self.absolute_layout_bounds.get(&id).cloned() { return layout; } let layout = self.taffy.layout(id.into()).expect(EXPECT_MESSAGE); let mut bounds = Bounds { - origin: layout.location.into(), - size: layout.size.into(), + origin: point( + Pixels(layout.location.x / scale_factor), + Pixels(layout.location.y / scale_factor), + ), + size: size( + Pixels(layout.size.width / scale_factor), + Pixels(layout.size.height / scale_factor), + ), }; if let Some(parent_id) = self.taffy.parent(id.0) { - let parent_bounds = self.layout_bounds(parent_id.into()); + let parent_bounds = self.layout_bounds(parent_id.into(), scale_factor); bounds.origin += parent_bounds.origin; } self.absolute_layout_bounds.insert(id, bounds); @@ -250,11 +284,11 @@ impl From for NodeId { } trait ToTaffy { - fn to_taffy(&self, rem_size: Pixels) -> Output; + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> Output; } impl ToTaffy for Style { - fn to_taffy(&self, rem_size: Pixels) -> taffy::style::Style { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> taffy::style::Style { use taffy::style_helpers::{fr, length, minmax, repeat}; fn to_grid_line( @@ -277,24 +311,24 @@ impl ToTaffy for Style { taffy::style::Style { display: self.display.into(), overflow: self.overflow.into(), - scrollbar_width: self.scrollbar_width.to_taffy(rem_size), + scrollbar_width: self.scrollbar_width.to_taffy(rem_size, scale_factor), position: self.position.into(), - inset: self.inset.to_taffy(rem_size), - size: self.size.to_taffy(rem_size), - min_size: self.min_size.to_taffy(rem_size), - max_size: self.max_size.to_taffy(rem_size), + inset: self.inset.to_taffy(rem_size, scale_factor), + size: self.size.to_taffy(rem_size, scale_factor), + min_size: self.min_size.to_taffy(rem_size, scale_factor), + max_size: self.max_size.to_taffy(rem_size, scale_factor), aspect_ratio: self.aspect_ratio, - margin: self.margin.to_taffy(rem_size), - padding: self.padding.to_taffy(rem_size), - border: self.border_widths.to_taffy(rem_size), + margin: self.margin.to_taffy(rem_size, scale_factor), + padding: self.padding.to_taffy(rem_size, scale_factor), + border: self.border_widths.to_taffy(rem_size, scale_factor), align_items: self.align_items.map(|x| x.into()), align_self: self.align_self.map(|x| x.into()), align_content: self.align_content.map(|x| x.into()), justify_content: self.justify_content.map(|x| x.into()), - gap: self.gap.to_taffy(rem_size), + gap: self.gap.to_taffy(rem_size, scale_factor), flex_direction: self.flex_direction.into(), flex_wrap: self.flex_wrap.into(), - flex_basis: self.flex_basis.to_taffy(rem_size), + flex_basis: self.flex_basis.to_taffy(rem_size, scale_factor), flex_grow: self.flex_grow, flex_shrink: self.flex_shrink, grid_template_rows: to_grid_repeat(&self.grid_rows), @@ -315,41 +349,53 @@ impl ToTaffy for Style { } impl ToTaffy for AbsoluteLength { - fn to_taffy(&self, rem_size: Pixels) -> f32 { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> f32 { match self { - AbsoluteLength::Pixels(pixels) => pixels.into(), - AbsoluteLength::Rems(rems) => (*rems * rem_size).into(), + AbsoluteLength::Pixels(pixels) => { + let pixels: f32 = pixels.into(); + pixels * scale_factor + } + AbsoluteLength::Rems(rems) => { + let pixels: f32 = (*rems * rem_size).into(); + pixels * scale_factor + } } } } impl ToTaffy for Length { - fn to_taffy(&self, rem_size: Pixels) -> taffy::prelude::LengthPercentageAuto { + fn to_taffy( + &self, + rem_size: Pixels, + scale_factor: f32, + ) -> taffy::prelude::LengthPercentageAuto { match self { - Length::Definite(length) => length.to_taffy(rem_size), + Length::Definite(length) => length.to_taffy(rem_size, scale_factor), Length::Auto => taffy::prelude::LengthPercentageAuto::auto(), } } } impl ToTaffy for Length { - fn to_taffy(&self, rem_size: Pixels) -> taffy::prelude::Dimension { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> taffy::prelude::Dimension { match self { - Length::Definite(length) => length.to_taffy(rem_size), + Length::Definite(length) => length.to_taffy(rem_size, scale_factor), Length::Auto => taffy::prelude::Dimension::auto(), } } } impl ToTaffy for DefiniteLength { - fn to_taffy(&self, rem_size: Pixels) -> taffy::style::LengthPercentage { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> taffy::style::LengthPercentage { match self { DefiniteLength::Absolute(length) => match length { AbsoluteLength::Pixels(pixels) => { - taffy::style::LengthPercentage::length(pixels.into()) + let pixels: f32 = pixels.into(); + taffy::style::LengthPercentage::length(pixels * scale_factor) } AbsoluteLength::Rems(rems) => { - taffy::style::LengthPercentage::length((*rems * rem_size).into()) + let pixels: f32 = (*rems * rem_size).into(); + taffy::style::LengthPercentage::length(pixels * scale_factor) } }, DefiniteLength::Fraction(fraction) => { @@ -360,14 +406,16 @@ impl ToTaffy for DefiniteLength { } impl ToTaffy for DefiniteLength { - fn to_taffy(&self, rem_size: Pixels) -> taffy::style::LengthPercentageAuto { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> taffy::style::LengthPercentageAuto { match self { DefiniteLength::Absolute(length) => match length { AbsoluteLength::Pixels(pixels) => { - taffy::style::LengthPercentageAuto::length(pixels.into()) + let pixels: f32 = pixels.into(); + taffy::style::LengthPercentageAuto::length(pixels * scale_factor) } AbsoluteLength::Rems(rems) => { - taffy::style::LengthPercentageAuto::length((*rems * rem_size).into()) + let pixels: f32 = (*rems * rem_size).into(); + taffy::style::LengthPercentageAuto::length(pixels * scale_factor) } }, DefiniteLength::Fraction(fraction) => { @@ -378,12 +426,15 @@ impl ToTaffy for DefiniteLength { } impl ToTaffy for DefiniteLength { - fn to_taffy(&self, rem_size: Pixels) -> taffy::style::Dimension { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> taffy::style::Dimension { match self { DefiniteLength::Absolute(length) => match length { - AbsoluteLength::Pixels(pixels) => taffy::style::Dimension::length(pixels.into()), + AbsoluteLength::Pixels(pixels) => { + let pixels: f32 = pixels.into(); + taffy::style::Dimension::length(pixels * scale_factor) + } AbsoluteLength::Rems(rems) => { - taffy::style::Dimension::length((*rems * rem_size).into()) + taffy::style::Dimension::length((*rems * rem_size * scale_factor).into()) } }, DefiniteLength::Fraction(fraction) => taffy::style::Dimension::percent(*fraction), @@ -392,11 +443,15 @@ impl ToTaffy for DefiniteLength { } impl ToTaffy for AbsoluteLength { - fn to_taffy(&self, rem_size: Pixels) -> taffy::style::LengthPercentage { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> taffy::style::LengthPercentage { match self { - AbsoluteLength::Pixels(pixels) => taffy::style::LengthPercentage::length(pixels.into()), + AbsoluteLength::Pixels(pixels) => { + let pixels: f32 = pixels.into(); + taffy::style::LengthPercentage::length(pixels * scale_factor) + } AbsoluteLength::Rems(rems) => { - taffy::style::LengthPercentage::length((*rems * rem_size).into()) + let pixels: f32 = (*rems * rem_size).into(); + taffy::style::LengthPercentage::length(pixels * scale_factor) } } } @@ -431,10 +486,10 @@ impl ToTaffy> for Size where T: ToTaffy + Clone + Debug + Default + PartialEq, { - fn to_taffy(&self, rem_size: Pixels) -> TaffySize { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> TaffySize { TaffySize { - width: self.width.to_taffy(rem_size), - height: self.height.to_taffy(rem_size), + width: self.width.to_taffy(rem_size, scale_factor), + height: self.height.to_taffy(rem_size, scale_factor), } } } @@ -443,12 +498,12 @@ impl ToTaffy> for Edges where T: ToTaffy + Clone + Debug + Default + PartialEq, { - fn to_taffy(&self, rem_size: Pixels) -> TaffyRect { + fn to_taffy(&self, rem_size: Pixels, scale_factor: f32) -> TaffyRect { TaffyRect { - top: self.top.to_taffy(rem_size), - right: self.right.to_taffy(rem_size), - bottom: self.bottom.to_taffy(rem_size), - left: self.left.to_taffy(rem_size), + top: self.top.to_taffy(rem_size, scale_factor), + right: self.right.to_taffy(rem_size, scale_factor), + bottom: self.bottom.to_taffy(rem_size, scale_factor), + left: self.left.to_taffy(rem_size, scale_factor), } } } diff --git a/crates/gpui/src/text_system.rs b/crates/gpui/src/text_system.rs index 4d4087f45d4093c239218f96f015d153fa77dc10..efac0087387e394e0e43859ea1dabdeb087d6b34 100644 --- a/crates/gpui/src/text_system.rs +++ b/crates/gpui/src/text_system.rs @@ -19,7 +19,7 @@ use crate::{ use anyhow::{Context as _, anyhow}; use collections::FxHashMap; use core::fmt; -use derive_more::Deref; +use derive_more::{Add, Deref, FromStr, Sub}; use itertools::Itertools; use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard}; use smallvec::{SmallVec, smallvec}; @@ -41,7 +41,14 @@ pub struct FontId(pub usize); #[derive(Hash, PartialEq, Eq, Clone, Copy, Debug)] pub struct FontFamilyId(pub usize); -pub(crate) const SUBPIXEL_VARIANTS: u8 = 4; +pub(crate) const SUBPIXEL_VARIANTS_X: u8 = 4; + +pub(crate) const SUBPIXEL_VARIANTS_Y: u8 = + if cfg!(target_os = "windows") || cfg!(target_os = "linux") { + 1 + } else { + SUBPIXEL_VARIANTS_X + }; /// The GPUI text rendering sub system. pub struct TextSystem { @@ -598,9 +605,22 @@ impl DerefMut for LineWrapperHandle { /// The degree of blackness or stroke thickness of a font. This value ranges from 100.0 to 900.0, /// with 400.0 as normal. -#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Serialize, Deserialize, Add, Sub, FromStr)] +#[serde(transparent)] pub struct FontWeight(pub f32); +impl Display for FontWeight { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl From for FontWeight { + fn from(weight: f32) -> Self { + FontWeight(weight) + } +} + impl Default for FontWeight { #[inline] fn default() -> FontWeight { @@ -650,6 +670,23 @@ impl FontWeight { ]; } +impl schemars::JsonSchema for FontWeight { + fn schema_name() -> std::borrow::Cow<'static, str> { + "FontWeight".into() + } + + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + use schemars::json_schema; + json_schema!({ + "type": "number", + "minimum": Self::THIN, + "maximum": Self::BLACK, + "default": Self::default(), + "description": "Font weight value between 100 (thin) and 900 (black)" + }) + } +} + /// Allows italic or oblique faces to be selected. #[derive(Clone, Copy, Eq, PartialEq, Debug, Hash, Default, Serialize, Deserialize, JsonSchema)] pub enum FontStyle { diff --git a/crates/gpui/src/text_system/font_fallbacks.rs b/crates/gpui/src/text_system/font_fallbacks.rs index 2be17e0021e42a809547188861ee00641535b110..63dc89ba41ea9cf44bdffb7d81d3015d696f4413 100644 --- a/crates/gpui/src/text_system/font_fallbacks.rs +++ b/crates/gpui/src/text_system/font_fallbacks.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use schemars::JsonSchema; -use serde_derive::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; /// The fallback fonts that can be configured for a given font. /// Fallback fonts family names are stored here. diff --git a/crates/gpui/src/text_system/line.rs b/crates/gpui/src/text_system/line.rs index 8d559f981581858990fa545b8e0ba65bccdf80a8..189a3e85c6b4fed52eddb45d5fa151314830c0e9 100644 --- a/crates/gpui/src/text_system/line.rs +++ b/crates/gpui/src/text_system/line.rs @@ -585,7 +585,7 @@ fn aligned_origin_x( match align { TextAlign::Left => origin.x, - TextAlign::Center => (2.0 * origin.x + align_width - line_width) / 2.0, + TextAlign::Center => (origin.x * 2.0 + align_width - line_width) / 2.0, TextAlign::Right => origin.x + align_width - line_width, } } diff --git a/crates/gpui/src/text_system/line_layout.rs b/crates/gpui/src/text_system/line_layout.rs index 43694702a82566b8f84199dcfc4ff996da93588e..eff4e640efb28a9b70c0da2008cd2293ee2dae47 100644 --- a/crates/gpui/src/text_system/line_layout.rs +++ b/crates/gpui/src/text_system/line_layout.rs @@ -634,15 +634,15 @@ struct CacheKeyRef<'a> { force_width: Option, } -impl PartialEq for (dyn AsCacheKeyRef + '_) { +impl PartialEq for dyn AsCacheKeyRef + '_ { fn eq(&self, other: &dyn AsCacheKeyRef) -> bool { self.as_cache_key_ref() == other.as_cache_key_ref() } } -impl Eq for (dyn AsCacheKeyRef + '_) {} +impl Eq for dyn AsCacheKeyRef + '_ {} -impl Hash for (dyn AsCacheKeyRef + '_) { +impl Hash for dyn AsCacheKeyRef + '_ { fn hash(&self, state: &mut H) { self.as_cache_key_ref().hash(state) } diff --git a/crates/gpui/src/util.rs b/crates/gpui/src/util.rs index 3704784a954f14b8317202e227ffb1b17092d70d..badb68008216400464e997f3252e9467edb234c6 100644 --- a/crates/gpui/src/util.rs +++ b/crates/gpui/src/util.rs @@ -114,6 +114,8 @@ impl Future for WithTimeout { } #[cfg(any(test, feature = "test-support"))] +/// Uses smol executor to run a given future no longer than the timeout specified. +/// Note that this won't "rewind" on `cx.executor().advance_clock` call, truly waiting for the timeout to elapse. pub async fn smol_timeout(timeout: Duration, f: F) -> Result where F: Future, @@ -140,3 +142,35 @@ pub(crate) fn atomic_incr_if_not_zero(counter: &AtomicUsize) -> usize { } } } + +#[cfg(test)] +mod tests { + use crate::TestAppContext; + + use super::*; + + #[gpui::test] + async fn test_with_timeout(cx: &mut TestAppContext) { + Task::ready(()) + .with_timeout(Duration::from_secs(1), &cx.executor()) + .await + .expect("Timeout should be noop"); + + let long_duration = Duration::from_secs(6000); + let short_duration = Duration::from_secs(1); + cx.executor() + .timer(long_duration) + .with_timeout(short_duration, &cx.executor()) + .await + .expect_err("timeout should have triggered"); + + let fut = cx + .executor() + .timer(long_duration) + .with_timeout(short_duration, &cx.executor()); + cx.executor().advance_clock(short_duration * 2); + futures::FutureExt::now_or_never(fut) + .unwrap_or_else(|| panic!("timeout should have triggered")) + .expect_err("timeout"); + } +} diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 307197acca7cd3eba7f69e7731288449a96ad35a..caf78fe407ea0a61a88efd9462be5fce005dedbf 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -11,9 +11,9 @@ use crate::{ MouseMoveEvent, MouseUpEvent, Path, Pixels, PlatformAtlas, PlatformDisplay, PlatformInput, PlatformInputHandler, PlatformWindow, Point, PolychromeSprite, PromptButton, PromptLevel, Quad, Render, RenderGlyphParams, RenderImage, RenderImageParams, RenderSvgParams, Replay, ResizeEdge, - SMOOTH_SVG_SCALE_FACTOR, SUBPIXEL_VARIANTS, ScaledPixels, Scene, Shadow, SharedString, Size, - StrikethroughStyle, Style, SubscriberSet, Subscription, SystemWindowTab, - SystemWindowTabController, TabHandles, TaffyLayoutEngine, Task, TextStyle, TextStyleRefinement, + SMOOTH_SVG_SCALE_FACTOR, SUBPIXEL_VARIANTS_X, SUBPIXEL_VARIANTS_Y, ScaledPixels, Scene, Shadow, + SharedString, Size, StrikethroughStyle, Style, SubscriberSet, Subscription, SystemWindowTab, + SystemWindowTabController, TabStopMap, TaffyLayoutEngine, Task, TextStyle, TextStyleRefinement, TransformationMatrix, Underline, UnderlineStyle, WindowAppearance, WindowBackgroundAppearance, WindowBounds, WindowControls, WindowDecorations, WindowOptions, WindowParams, WindowTextSystem, point, prelude::*, px, rems, size, transparent_black, @@ -58,7 +58,7 @@ mod prompts; use crate::util::atomic_incr_if_not_zero; pub use prompts::*; -pub(crate) const DEFAULT_WINDOW_SIZE: Size = size(px(1024.), px(700.)); +pub(crate) const DEFAULT_WINDOW_SIZE: Size = size(px(1536.), px(864.)); /// Represents the two different phases when dispatching events. #[derive(Default, Copy, Clone, Debug, Eq, PartialEq)] @@ -684,7 +684,7 @@ pub(crate) struct Frame { pub(crate) next_inspector_instance_ids: FxHashMap, usize>, #[cfg(any(feature = "inspector", debug_assertions))] pub(crate) inspector_hitboxes: FxHashMap, - pub(crate) tab_handles: TabHandles, + pub(crate) tab_stops: TabStopMap, } #[derive(Clone, Default)] @@ -733,7 +733,7 @@ impl Frame { #[cfg(any(feature = "inspector", debug_assertions))] inspector_hitboxes: FxHashMap::default(), - tab_handles: TabHandles::default(), + tab_stops: TabStopMap::default(), } } @@ -749,7 +749,7 @@ impl Frame { self.hitboxes.clear(); self.window_control_hitboxes.clear(); self.deferred_draws.clear(); - self.tab_handles.clear(); + self.tab_stops.clear(); self.focus = None; #[cfg(any(feature = "inspector", debug_assertions))] @@ -837,7 +837,7 @@ pub struct Window { pub(crate) text_style_stack: Vec, pub(crate) rendered_entity_stack: Vec, pub(crate) element_offset_stack: Vec>, - pub(crate) element_opacity: Option, + pub(crate) element_opacity: f32, pub(crate) content_mask_stack: Vec>, pub(crate) requested_autoscroll: Option>, pub(crate) image_cache_stack: Vec, @@ -1222,7 +1222,7 @@ impl Window { rendered_entity_stack: Vec::new(), element_offset_stack: Vec::new(), content_mask_stack: Vec::new(), - element_opacity: None, + element_opacity: 1.0, requested_autoscroll: None, rendered_frame: Frame::new(DispatchTree::new(cx.keymap.clone(), cx.actions.clone())), next_frame: Frame::new(DispatchTree::new(cx.keymap.clone(), cx.actions.clone())), @@ -1415,7 +1415,7 @@ impl Window { return; } - if let Some(handle) = self.rendered_frame.tab_handles.next(self.focus.as_ref()) { + if let Some(handle) = self.rendered_frame.tab_stops.next(self.focus.as_ref()) { self.focus(&handle) } } @@ -1426,7 +1426,7 @@ impl Window { return; } - if let Some(handle) = self.rendered_frame.tab_handles.prev(self.focus.as_ref()) { + if let Some(handle) = self.rendered_frame.tab_stops.prev(self.focus.as_ref()) { self.focus(&handle) } } @@ -2285,7 +2285,7 @@ impl Window { input_handlers_index: self.next_frame.input_handlers.len(), cursor_styles_index: self.next_frame.cursor_styles.len(), accessed_element_states_index: self.next_frame.accessed_element_states.len(), - tab_handle_index: self.next_frame.tab_handles.handles.len(), + tab_handle_index: self.next_frame.tab_stops.paint_index(), line_layout_index: self.text_system.layout_index(), } } @@ -2315,11 +2315,9 @@ impl Window { .iter() .map(|(id, type_id)| (GlobalElementId(id.0.clone()), *type_id)), ); - self.next_frame.tab_handles.handles.extend( - self.rendered_frame.tab_handles.handles - [range.start.tab_handle_index..range.end.tab_handle_index] - .iter() - .cloned(), + self.next_frame.tab_stops.replay( + &self.rendered_frame.tab_stops.insertion_history + [range.start.tab_handle_index..range.end.tab_handle_index], ); self.text_system @@ -2437,14 +2435,16 @@ impl Window { opacity: Option, f: impl FnOnce(&mut Self) -> R, ) -> R { - if opacity.is_none() { + self.invalidator.debug_assert_paint_or_prepaint(); + + let Some(opacity) = opacity else { return f(self); - } + }; - self.invalidator.debug_assert_paint_or_prepaint(); - self.element_opacity = opacity; + let previous_opacity = self.element_opacity; + self.element_opacity = previous_opacity * opacity; let result = f(self); - self.element_opacity = None; + self.element_opacity = previous_opacity; result } @@ -2541,9 +2541,10 @@ impl Window { /// Obtain the current element opacity. This method should only be called during the /// prepaint phase of element drawing. + #[inline] pub(crate) fn element_opacity(&self) -> f32 { self.invalidator.debug_assert_paint_or_prepaint(); - self.element_opacity.unwrap_or(1.0) + self.element_opacity } /// Obtain the current content mask. This method should only be called during element drawing. @@ -2734,6 +2735,19 @@ impl Window { } } + /// Executes the given closure within the context of a tab group. + #[inline] + pub fn with_tab_group(&mut self, index: Option, f: impl FnOnce(&mut Self) -> R) -> R { + if let Some(index) = index { + self.next_frame.tab_stops.begin_group(index); + let result = f(self); + self.next_frame.tab_stops.end_group(); + result + } else { + f(self) + } + } + /// Defers the drawing of the given element, scheduling it to be painted on top of the currently-drawn tree /// at a later time. The `priority` parameter determines the drawing order relative to other deferred elements, /// with higher values being drawn on top. @@ -2944,9 +2958,10 @@ impl Window { let element_opacity = self.element_opacity(); let scale_factor = self.scale_factor(); let glyph_origin = origin.scale(scale_factor); + let subpixel_variant = Point { - x: (glyph_origin.x.0.fract() * SUBPIXEL_VARIANTS as f32).floor() as u8, - y: (glyph_origin.y.0.fract() * SUBPIXEL_VARIANTS as f32).floor() as u8, + x: (glyph_origin.x.0.fract() * SUBPIXEL_VARIANTS_X as f32).floor() as u8, + y: (glyph_origin.y.0.fract() * SUBPIXEL_VARIANTS_Y as f32).floor() as u8, }; let params = RenderGlyphParams { font_id, @@ -3059,6 +3074,7 @@ impl Window { let element_opacity = self.element_opacity(); let scale_factor = self.scale_factor(); + let bounds = bounds.scale(scale_factor); let params = RenderSvgParams { path, @@ -3070,21 +3086,32 @@ impl Window { let Some(tile) = self.sprite_atlas .get_or_insert_with(¶ms.clone().into(), &mut || { - let Some(bytes) = cx.svg_renderer.render(¶ms)? else { + let Some((size, bytes)) = cx.svg_renderer.render(¶ms)? else { return Ok(None); }; - Ok(Some((params.size, Cow::Owned(bytes)))) + Ok(Some((size, Cow::Owned(bytes)))) })? else { return Ok(()); }; let content_mask = self.content_mask().scale(scale_factor); + let svg_bounds = Bounds { + origin: bounds.center() + - Point::new( + ScaledPixels(tile.bounds.size.width.0 as f32 / SMOOTH_SVG_SCALE_FACTOR / 2.), + ScaledPixels(tile.bounds.size.height.0 as f32 / SMOOTH_SVG_SCALE_FACTOR / 2.), + ), + size: tile + .bounds + .size + .map(|value| ScaledPixels(value.0 as f32 / SMOOTH_SVG_SCALE_FACTOR)), + }; self.next_frame.scene.insert_primitive(MonochromeSprite { order: 0, pad: 0, - bounds: bounds - .map_origin(|origin| origin.floor()) + bounds: svg_bounds + .map_origin(|origin| origin.round()) .map_size(|size| size.ceil()), content_mask, color: color.opacity(element_opacity), @@ -3198,11 +3225,14 @@ impl Window { cx.layout_id_buffer.clear(); cx.layout_id_buffer.extend(children); let rem_size = self.rem_size(); + let scale_factor = self.scale_factor(); - self.layout_engine - .as_mut() - .unwrap() - .request_layout(style, rem_size, &cx.layout_id_buffer) + self.layout_engine.as_mut().unwrap().request_layout( + style, + rem_size, + scale_factor, + &cx.layout_id_buffer, + ) } /// Add a node to the layout tree for the current frame. Instead of taking a `Style` and children, @@ -3224,10 +3254,11 @@ impl Window { self.invalidator.debug_assert_prepaint(); let rem_size = self.rem_size(); + let scale_factor = self.scale_factor(); self.layout_engine .as_mut() .unwrap() - .request_measured_layout(style, rem_size, measure) + .request_measured_layout(style, rem_size, scale_factor, measure) } /// Compute the layout for the given id within the given available space. @@ -3255,11 +3286,12 @@ impl Window { pub fn layout_bounds(&mut self, layout_id: LayoutId) -> Bounds { self.invalidator.debug_assert_prepaint(); + let scale_factor = self.scale_factor(); let mut bounds = self .layout_engine .as_mut() .unwrap() - .layout_bounds(layout_id) + .layout_bounds(layout_id, scale_factor) .map(Into::into); bounds.origin += self.element_offset(); bounds @@ -4547,7 +4579,7 @@ impl Window { if let Some(inspector) = self.inspector.clone() { inspector.update(cx, |inspector, _cx| { if let Some(depth) = inspector.pick_depth.as_mut() { - *depth += delta_y.0 / SCROLL_PIXELS_PER_LAYER; + *depth += f32::from(delta_y) / SCROLL_PIXELS_PER_LAYER; let max_depth = self.mouse_hit_test.ids.len() as f32 - 0.5; if *depth < 0.0 { *depth = 0.0; @@ -4621,6 +4653,14 @@ pub struct WindowHandle { state_type: PhantomData, } +impl Debug for WindowHandle { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("WindowHandle") + .field("any_handle", &self.any_handle.id.as_u64()) + .finish() + } +} + impl WindowHandle { /// Creates a new handle from a window ID. /// This does not check if the root type of the window is `V`. diff --git a/crates/gpui/tests/action_macros.rs b/crates/gpui/tests/action_macros.rs index 7bff3a97b1c3d22e6c0e9841a26f2adf5d7f3a70..66ef6fba2c9b980e27150bb3bf8d9d07f35ab030 100644 --- a/crates/gpui/tests/action_macros.rs +++ b/crates/gpui/tests/action_macros.rs @@ -1,7 +1,7 @@ use gpui::{Action, actions}; use gpui_macros::register_action; use schemars::JsonSchema; -use serde_derive::Deserialize; +use serde::Deserialize; #[test] fn test_action_macros() { @@ -19,7 +19,7 @@ fn test_action_macros() { #[serde(deny_unknown_fields)] struct AnotherAction; - #[derive(PartialEq, Clone, gpui::private::serde_derive::Deserialize)] + #[derive(PartialEq, Clone, gpui::private::serde::Deserialize)] #[serde(deny_unknown_fields)] struct RegisterableAction {} diff --git a/crates/gpui_macros/Cargo.toml b/crates/gpui_macros/Cargo.toml index 6dad698177af0bed634fc70f296bf52285f851a7..0722d8d229108c999a8f4b0ff45621b1d53587a6 100644 --- a/crates/gpui_macros/Cargo.toml +++ b/crates/gpui_macros/Cargo.toml @@ -1,9 +1,10 @@ [package] -name = "gpui_macros" +name = "gpui-macros" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "Macros used by gpui" [lints] workspace = true diff --git a/crates/gpui_macros/src/test.rs b/crates/gpui_macros/src/test.rs index 648d3499edb0a8f13031092e37d761368363af08..42ce304b97a2708bac8dc081b22a561162bdbb1a 100644 --- a/crates/gpui_macros/src/test.rs +++ b/crates/gpui_macros/src/test.rs @@ -100,7 +100,7 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream { }; let inner_fn_attributes = mem::take(&mut inner_fn.attrs); - let inner_fn_name = format_ident!("_{}", inner_fn.sig.ident); + let inner_fn_name = format_ident!("__{}", inner_fn.sig.ident); let outer_fn_name = mem::replace(&mut inner_fn.sig.ident, inner_fn_name.clone()); let result = generate_test_function( diff --git a/crates/http_client/Cargo.toml b/crates/http_client/Cargo.toml index f63bff295e22c36512dbc6285e68d4686714f411..3a4d875f6a99a868d4adfe39bc83bf5ee2007023 100644 --- a/crates/http_client/Cargo.toml +++ b/crates/http_client/Cargo.toml @@ -1,9 +1,10 @@ [package] -name = "http_client" +name = "zed-http-client" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "A HTTP client library for Zed and GPUI" [lints] workspace = true @@ -16,16 +17,22 @@ path = "src/http_client.rs" doctest = true [dependencies] -bytes.workspace = true anyhow.workspace = true +async-compression.workspace = true +async-fs.workspace = true +async-tar.workspace = true +bytes.workspace = true derive_more.workspace = true futures.workspace = true -http.workspace = true http-body.workspace = true +http.workspace = true log.workspace = true parking_lot.workspace = true reqwest.workspace = true serde.workspace = true serde_json.workspace = true +sha2.workspace = true +tempfile.workspace = true url.workspace = true +util.workspace = true workspace-hack.workspace = true diff --git a/crates/languages/src/github_download.rs b/crates/http_client/src/github_download.rs similarity index 91% rename from crates/languages/src/github_download.rs rename to crates/http_client/src/github_download.rs index 766c894fbb2b660778f09933b4facd2114ebb5bf..02dee08b215e547d632caaf5f94b0872aa6aa20d 100644 --- a/crates/languages/src/github_download.rs +++ b/crates/http_client/src/github_download.rs @@ -3,18 +3,18 @@ use std::{path::Path, pin::Pin, task::Poll}; use anyhow::{Context, Result}; use async_compression::futures::bufread::GzipDecoder; use futures::{AsyncRead, AsyncSeek, AsyncSeekExt, AsyncWrite, io::BufReader}; -use http_client::github::AssetKind; -use language::LspAdapterDelegate; use sha2::{Digest, Sha256}; +use crate::{HttpClient, github::AssetKind}; + #[derive(serde::Deserialize, serde::Serialize, Debug)] -pub(crate) struct GithubBinaryMetadata { - pub(crate) metadata_version: u64, - pub(crate) digest: Option, +pub struct GithubBinaryMetadata { + pub metadata_version: u64, + pub digest: Option, } impl GithubBinaryMetadata { - pub(crate) async fn read_from_file(metadata_path: &Path) -> Result { + pub async fn read_from_file(metadata_path: &Path) -> Result { let metadata_content = async_fs::read_to_string(metadata_path) .await .with_context(|| format!("reading metadata file at {metadata_path:?}"))?; @@ -22,7 +22,7 @@ impl GithubBinaryMetadata { .with_context(|| format!("parsing metadata file at {metadata_path:?}")) } - pub(crate) async fn write_to_file(&self, metadata_path: &Path) -> Result<()> { + pub async fn write_to_file(&self, metadata_path: &Path) -> Result<()> { let metadata_content = serde_json::to_string(self) .with_context(|| format!("serializing metadata for {metadata_path:?}"))?; async_fs::write(metadata_path, metadata_content.as_bytes()) @@ -32,16 +32,15 @@ impl GithubBinaryMetadata { } } -pub(crate) async fn download_server_binary( - delegate: &dyn LspAdapterDelegate, +pub async fn download_server_binary( + http_client: &dyn HttpClient, url: &str, digest: Option<&str>, destination_path: &Path, asset_kind: AssetKind, ) -> Result<(), anyhow::Error> { log::info!("downloading github artifact from {url}"); - let mut response = delegate - .http_client() + let mut response = http_client .get(url, Default::default(), true) .await .with_context(|| format!("downloading release from {url}"))?; @@ -143,7 +142,7 @@ async fn extract_gz( from: impl AsyncRead + Unpin, ) -> Result<(), anyhow::Error> { let mut decompressed_bytes = GzipDecoder::new(BufReader::new(from)); - let mut file = smol::fs::File::create(&destination_path) + let mut file = async_fs::File::create(&destination_path) .await .with_context(|| { format!("creating a file {destination_path:?} for a download from {url}") diff --git a/crates/http_client/src/http_client.rs b/crates/http_client/src/http_client.rs index 62468573ed29687c0436e98a0174baa515b0ee3d..76bf0b905dbdc827f38aa37a95edc0e3b9e834eb 100644 --- a/crates/http_client/src/http_client.rs +++ b/crates/http_client/src/http_client.rs @@ -1,5 +1,6 @@ mod async_body; pub mod github; +pub mod github_download; pub use anyhow::{Result, anyhow}; pub use async_body::{AsyncBody, Inner}; @@ -28,6 +29,25 @@ pub enum RedirectPolicy { pub struct FollowRedirects(pub bool); pub trait HttpRequestExt { + /// Conditionally modify self with the given closure. + fn when(self, condition: bool, then: impl FnOnce(Self) -> Self) -> Self + where + Self: Sized, + { + if condition { then(self) } else { self } + } + + /// Conditionally unwrap and modify self with the given closure, if the given option is Some. + fn when_some(self, option: Option, then: impl FnOnce(Self, T) -> Self) -> Self + where + Self: Sized, + { + match option { + Some(value) => then(self, value), + None => self, + } + } + /// Whether or not to follow redirects fn follow_redirects(self, follow: RedirectPolicy) -> Self; } @@ -48,12 +68,12 @@ pub trait HttpClient: 'static + Send + Sync { req: http::Request, ) -> BoxFuture<'static, anyhow::Result>>; - fn get<'a>( - &'a self, + fn get( + &self, uri: &str, body: AsyncBody, follow_redirects: bool, - ) -> BoxFuture<'a, anyhow::Result>> { + ) -> BoxFuture<'static, anyhow::Result>> { let request = Builder::new() .uri(uri) .follow_redirects(if follow_redirects { @@ -64,16 +84,16 @@ pub trait HttpClient: 'static + Send + Sync { .body(body); match request { - Ok(request) => Box::pin(async move { self.send(request).await }), + Ok(request) => self.send(request), Err(e) => Box::pin(async move { Err(e.into()) }), } } - fn post_json<'a>( - &'a self, + fn post_json( + &self, uri: &str, body: AsyncBody, - ) -> BoxFuture<'a, anyhow::Result>> { + ) -> BoxFuture<'static, anyhow::Result>> { let request = Builder::new() .uri(uri) .method(Method::POST) @@ -81,7 +101,7 @@ pub trait HttpClient: 'static + Send + Sync { .body(body); match request { - Ok(request) => Box::pin(async move { self.send(request).await }), + Ok(request) => self.send(request), Err(e) => Box::pin(async move { Err(e.into()) }), } } @@ -318,6 +338,12 @@ pub fn read_proxy_from_env() -> Option { .and_then(|env| env.parse().ok()) } +pub fn read_no_proxy_from_env() -> Option { + const ENV_VARS: &[&str] = &["NO_PROXY", "no_proxy"]; + + ENV_VARS.iter().find_map(|var| std::env::var(var).ok()) +} + pub struct BlockedHttpClient; impl BlockedHttpClient { diff --git a/crates/icons/src/icons.rs b/crates/icons/src/icons.rs index f3609f7ea8706f33eb07eaaf456731e14c85555a..4c026bc2b82deebb0cb24da40d476b2cd91bb012 100644 --- a/crates/icons/src/icons.rs +++ b/crates/icons/src/icons.rs @@ -165,6 +165,7 @@ pub enum IconName { Option, PageDown, PageUp, + Paperclip, Pencil, PencilUnavailable, Person, @@ -263,6 +264,7 @@ pub enum IconName { ZedPredictError, ZedPredictUp, ZedXCopilot, + Linux, } impl IconName { diff --git a/crates/image_viewer/Cargo.toml b/crates/image_viewer/Cargo.toml index 254c916789df2cdfa3e3458ed30572e84153ad61..1afa2c5f9dd90956b93c2e9dfac3537c7253a610 100644 --- a/crates/image_viewer/Cargo.toml +++ b/crates/image_viewer/Cargo.toml @@ -24,7 +24,6 @@ gpui.workspace = true language.workspace = true log.workspace = true project.workspace = true -schemars.workspace = true serde.workspace = true settings.workspace = true theme.workspace = true diff --git a/crates/image_viewer/src/image_viewer.rs b/crates/image_viewer/src/image_viewer.rs index 2dca57424b86e2221acc271efac19cdf39a3f79f..8a4f2ebfe237c66d33e5d97a461b34552d0e5974 100644 --- a/crates/image_viewer/src/image_viewer.rs +++ b/crates/image_viewer/src/image_viewer.rs @@ -1,8 +1,6 @@ mod image_info; mod image_viewer_settings; -use std::path::PathBuf; - use anyhow::Context as _; use editor::{EditorSettings, items::entry_git_aware_label_color}; use file_icons::FileIcons; @@ -100,13 +98,9 @@ impl Item for ImageView { f(self.image_item.entity_id(), self.image_item.read(cx)) } - fn is_singleton(&self, _cx: &App) -> bool { - true - } - fn tab_tooltip_text(&self, cx: &App) -> Option { let abs_path = self.image_item.read(cx).abs_path(cx)?; - let file_path = abs_path.compact().to_string_lossy().to_string(); + let file_path = abs_path.compact().to_string_lossy().into_owned(); Some(file_path.into()) } @@ -144,7 +138,6 @@ impl Item for ImageView { .read(cx) .file .file_name(cx) - .to_string_lossy() .to_string() .into() } @@ -198,20 +191,14 @@ impl Item for ImageView { } fn breadcrumbs_text_for_image(project: &Project, image: &ImageItem, cx: &App) -> String { - let path = image.file.file_name(cx); - if project.visible_worktrees(cx).count() <= 1 { - return path.to_string_lossy().to_string(); + let mut path = image.file.path().clone(); + if project.visible_worktrees(cx).count() > 1 + && let Some(worktree) = project.worktree_for_id(image.project_path(cx).worktree_id, cx) + { + path = worktree.read(cx).root_name().join(&path); } - project - .worktree_for_id(image.project_path(cx).worktree_id, cx) - .map(|worktree| { - PathBuf::from(worktree.read(cx).root_name()) - .join(path) - .to_string_lossy() - .to_string() - }) - .unwrap_or_else(|| path.to_string_lossy().to_string()) + path.display(project.path_style(cx)).to_string() } impl SerializableItem for ImageView { @@ -242,7 +229,7 @@ impl SerializableItem for ImageView { let project_path = ProjectPath { worktree_id, - path: relative_path.into(), + path: relative_path, }; let image_item = project @@ -312,10 +299,10 @@ impl Render for ImageView { _cx: &mut App| { let square_size = 32.0; - let start_y = bounds.origin.y.0; - let height = bounds.size.height.0; - let start_x = bounds.origin.x.0; - let width = bounds.size.width.0; + let start_y = bounds.origin.y.into(); + let height: f32 = bounds.size.height.into(); + let start_x = bounds.origin.x.into(); + let width: f32 = bounds.size.width.into(); let mut y = start_y; let mut x = start_x; diff --git a/crates/image_viewer/src/image_viewer_settings.rs b/crates/image_viewer/src/image_viewer_settings.rs index 510de69b522fbb07cb8eedba43edfe3a95e4a591..839d5fbfe44fc624351953018c1437e9fa2c32e0 100644 --- a/crates/image_viewer/src/image_viewer_settings.rs +++ b/crates/image_viewer/src/image_viewer_settings.rs @@ -1,40 +1,19 @@ -use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +pub use settings::ImageFileSizeUnit; +use settings::Settings; /// The settings for the image viewer. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, Default, SettingsUi, SettingsKey)] -#[settings_key(key = "image_viewer")] +#[derive(Clone, Debug, Default)] pub struct ImageViewerSettings { /// The unit to use for displaying image file sizes. /// /// Default: "binary" - #[serde(default)] pub unit: ImageFileSizeUnit, } -#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, Default)] -#[serde(rename_all = "snake_case")] -pub enum ImageFileSizeUnit { - /// Displays file size in binary units (e.g., KiB, MiB). - #[default] - Binary, - /// Displays file size in decimal units (e.g., KB, MB). - Decimal, -} - impl Settings for ImageViewerSettings { - type FileContent = Self; - - fn load(sources: SettingsSources, _: &mut App) -> anyhow::Result { - SettingsSources::::json_merge_with( - [sources.default] - .into_iter() - .chain(sources.user) - .chain(sources.server), - ) + fn from_settings(content: &settings::SettingsContent) -> Self { + Self { + unit: content.image_viewer.clone().unwrap().unit.unwrap(), + } } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } diff --git a/crates/inspector_ui/Cargo.toml b/crates/inspector_ui/Cargo.toml index cefe888974da2c9d164ad97079441ddec2d7fdff..9272e5e72be941adc610ec343583a5e04448394f 100644 --- a/crates/inspector_ui/Cargo.toml +++ b/crates/inspector_ui/Cargo.toml @@ -22,6 +22,7 @@ project.workspace = true serde_json.workspace = true serde_json_lenient.workspace = true theme.workspace = true +title_bar.workspace = true ui.workspace = true util.workspace = true util_macros.workspace = true diff --git a/crates/inspector_ui/README.md b/crates/inspector_ui/README.md index 5c720dfea2df3ff2ddf75112fec8793ba1851ed1..74886e611108fd4fd3f5f5015746f913e2697cae 100644 --- a/crates/inspector_ui/README.md +++ b/crates/inspector_ui/README.md @@ -68,7 +68,7 @@ With both approaches, would need to record the buffer version and use that when * Mode to navigate to source code on every element change while picking. -* Tracking of more source locations - currently the source location is often in a ui compoenent. Ideally this would have a way for the components to indicate that they are probably not the source location the user is looking for. +* Tracking of more source locations - currently the source location is often in a ui component. Ideally this would have a way for the components to indicate that they are probably not the source location the user is looking for. - Could have `InspectorElementId` be `Vec<(ElementId, Option)>`, but if there are multiple code paths that construct the same element this would cause them to be considered different. diff --git a/crates/inspector_ui/src/div_inspector.rs b/crates/inspector_ui/src/div_inspector.rs index fa8b76517f0125e7319f035b41996e445451510a..da99c5b92c1e6ad4d8a3e92ed2e565bcb518e227 100644 --- a/crates/inspector_ui/src/div_inspector.rs +++ b/crates/inspector_ui/src/div_inspector.rs @@ -24,6 +24,7 @@ use std::path::Path; use std::rc::Rc; use std::sync::LazyLock; use ui::{Label, LabelSize, Tooltip, prelude::*, styled_ext_reflection, v_flex}; +use util::rel_path::RelPath; use util::split_str_with_ranges; /// Path used for unsaved buffer that contains style json. To support the json language server, this @@ -466,7 +467,7 @@ impl DivInspector { let project_path = worktree.read_with(cx, |worktree, _cx| ProjectPath { worktree_id: worktree.id(), - path: Path::new("").into(), + path: RelPath::empty().into(), })?; let buffer = project @@ -575,7 +576,12 @@ fn render_layout_state(inspector_state: &DivInspectorState, cx: &App) -> Div { .child( div() .text_ui(cx) - .child(format!("Bounds: {}", inspector_state.bounds)), + .child(format!( + "Bounds: ⌜{} - {}⌟", + inspector_state.bounds.origin, + inspector_state.bounds.bottom_right() + )) + .child(format!("Size: {}", inspector_state.bounds.size)), ) .child( div() diff --git a/crates/inspector_ui/src/inspector.rs b/crates/inspector_ui/src/inspector.rs index 8d24b93fa9265be44e871c1a825d4ce17316392a..7f7985df9b98ee286c79e18a665802b1f73fbc1e 100644 --- a/crates/inspector_ui/src/inspector.rs +++ b/crates/inspector_ui/src/inspector.rs @@ -1,6 +1,7 @@ use anyhow::{Context as _, anyhow}; use gpui::{App, DivInspectorState, Inspector, InspectorElementId, IntoElement, Window}; use std::{cell::OnceCell, path::Path, sync::Arc}; +use title_bar::platform_title_bar::PlatformTitleBar; use ui::{Label, Tooltip, prelude::*}; use util::{ResultExt as _, command::new_smol_command}; use workspace::AppState; @@ -56,6 +57,8 @@ fn render_inspector( let ui_font = theme::setup_ui_font(window, cx); let colors = cx.theme().colors(); let inspector_id = inspector.active_element_id(); + let toolbar_height = PlatformTitleBar::height(window); + v_flex() .size_full() .bg(colors.panel_background) @@ -65,7 +68,11 @@ fn render_inspector( .border_color(colors.border) .child( h_flex() - .p_2() + .justify_between() + .pr_2() + .pl_1() + .mt_px() + .h(toolbar_height) .border_b_1() .border_color(colors.border_variant) .child( @@ -78,18 +85,14 @@ fn render_inspector( window.refresh(); })), ) - .child( - h_flex() - .w_full() - .justify_end() - .child(Label::new("GPUI Inspector").size(LabelSize::Large)), - ), + .child(h_flex().justify_end().child(Label::new("GPUI Inspector"))), ) .child( v_flex() .id("gpui-inspector-content") .overflow_y_scroll() - .p_2() + .px_2() + .py_0p5() .gap_2() .when_some(inspector_id, |this, inspector_id| { this.child(render_inspector_id(inspector_id, cx)) @@ -110,15 +113,19 @@ fn render_inspector_id(inspector_id: &InspectorElementId, cx: &App) -> Div { .unwrap_or(source_location_string); v_flex() - .child(Label::new("Element ID").size(LabelSize::Large)) .child( - div() - .id("instance-id") - .text_ui(cx) - .tooltip(Tooltip::text( - "Disambiguates elements from the same source location", - )) - .child(format!("Instance {}", inspector_id.instance_id)), + h_flex() + .justify_between() + .child(Label::new("Element ID").size(LabelSize::Large)) + .child( + div() + .id("instance-id") + .text_ui(cx) + .tooltip(Tooltip::text( + "Disambiguates elements from the same source location", + )) + .child(format!("Instance {}", inspector_id.instance_id)), + ), ) .child( div() @@ -126,8 +133,10 @@ fn render_inspector_id(inspector_id: &InspectorElementId, cx: &App) -> Div { .text_ui(cx) .bg(cx.theme().colors().editor_foreground.opacity(0.025)) .underline() + .font_buffer(cx) + .text_xs() .child(source_location_string) - .tooltip(Tooltip::text("Click to open by running zed cli")) + .tooltip(Tooltip::text("Click to open by running Zed CLI")) .on_click(move |_, _window, cx| { cx.background_spawn(open_zed_source_location(source_location)) .detach_and_log_err(cx); diff --git a/crates/jj/Cargo.toml b/crates/jj/Cargo.toml deleted file mode 100644 index 3bce6b2b47d66be82a5ba7c7c08d1ead7bbc765b..0000000000000000000000000000000000000000 --- a/crates/jj/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "jj" -version = "0.1.0" -publish.workspace = true -edition.workspace = true -license = "GPL-3.0-or-later" - -[lints] -workspace = true - -[lib] -path = "src/jj.rs" - -[dependencies] -anyhow.workspace = true -gpui.workspace = true -jj-lib.workspace = true -workspace-hack.workspace = true diff --git a/crates/jj/src/jj.rs b/crates/jj/src/jj.rs deleted file mode 100644 index 45fa2b07e14e8bcfb3693df0f88405a5f52516e8..0000000000000000000000000000000000000000 --- a/crates/jj/src/jj.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod jj_repository; -mod jj_store; - -pub use jj_repository::*; -pub use jj_store::*; diff --git a/crates/jj/src/jj_repository.rs b/crates/jj/src/jj_repository.rs deleted file mode 100644 index afbe54c99dcb40a039e8f7cc87c14dc393ebac3a..0000000000000000000000000000000000000000 --- a/crates/jj/src/jj_repository.rs +++ /dev/null @@ -1,69 +0,0 @@ -use std::path::Path; -use std::sync::Arc; - -use anyhow::Result; -use gpui::SharedString; -use jj_lib::config::StackedConfig; -use jj_lib::repo::StoreFactories; -use jj_lib::settings::UserSettings; -use jj_lib::workspace::{self, DefaultWorkspaceLoaderFactory, WorkspaceLoaderFactory}; - -#[derive(Debug, Clone)] -pub struct Bookmark { - pub ref_name: SharedString, -} - -pub trait JujutsuRepository: Send + Sync { - fn list_bookmarks(&self) -> Vec; -} - -pub struct RealJujutsuRepository { - repository: Arc, -} - -impl RealJujutsuRepository { - pub fn new(cwd: &Path) -> Result { - let workspace_loader_factory = DefaultWorkspaceLoaderFactory; - let workspace_loader = workspace_loader_factory.create(Self::find_workspace_dir(cwd))?; - - let config = StackedConfig::with_defaults(); - let settings = UserSettings::from_config(config)?; - - let workspace = workspace_loader.load( - &settings, - &StoreFactories::default(), - &workspace::default_working_copy_factories(), - )?; - - let repo_loader = workspace.repo_loader(); - let repository = repo_loader.load_at_head()?; - - Ok(Self { repository }) - } - - fn find_workspace_dir(cwd: &Path) -> &Path { - cwd.ancestors() - .find(|path| path.join(".jj").is_dir()) - .unwrap_or(cwd) - } -} - -impl JujutsuRepository for RealJujutsuRepository { - fn list_bookmarks(&self) -> Vec { - self.repository - .view() - .bookmarks() - .map(|(ref_name, _target)| Bookmark { - ref_name: ref_name.as_str().to_string().into(), - }) - .collect() - } -} - -pub struct FakeJujutsuRepository {} - -impl JujutsuRepository for FakeJujutsuRepository { - fn list_bookmarks(&self) -> Vec { - Vec::new() - } -} diff --git a/crates/jj/src/jj_store.rs b/crates/jj/src/jj_store.rs deleted file mode 100644 index 2d2d958d7f964cdfc7723827fb2241e50d172697..0000000000000000000000000000000000000000 --- a/crates/jj/src/jj_store.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::path::Path; -use std::sync::Arc; - -use gpui::{App, Entity, Global, prelude::*}; - -use crate::{JujutsuRepository, RealJujutsuRepository}; - -/// Note: We won't ultimately be storing the jj store in a global, we're just doing this for exploration purposes. -struct GlobalJujutsuStore(Entity); - -impl Global for GlobalJujutsuStore {} - -pub struct JujutsuStore { - repository: Arc, -} - -impl JujutsuStore { - pub fn init_global(cx: &mut App) { - let Some(repository) = RealJujutsuRepository::new(Path::new(".")).ok() else { - return; - }; - - let repository = Arc::new(repository); - let jj_store = cx.new(|cx| JujutsuStore::new(repository, cx)); - - cx.set_global(GlobalJujutsuStore(jj_store)); - } - - pub fn try_global(cx: &App) -> Option> { - cx.try_global::() - .map(|global| global.0.clone()) - } - - pub fn new(repository: Arc, _cx: &mut Context) -> Self { - Self { repository } - } - - pub fn repository(&self) -> &Arc { - &self.repository - } -} diff --git a/crates/jj_ui/Cargo.toml b/crates/jj_ui/Cargo.toml deleted file mode 100644 index 34dac76db11bf9cae6a4277ae8fff58d073e19be..0000000000000000000000000000000000000000 --- a/crates/jj_ui/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "jj_ui" -version = "0.1.0" -publish.workspace = true -edition.workspace = true -license = "GPL-3.0-or-later" - -[lints] -workspace = true - -[lib] -path = "src/jj_ui.rs" - -[dependencies] -command_palette_hooks.workspace = true -feature_flags.workspace = true -fuzzy.workspace = true -gpui.workspace = true -jj.workspace = true -picker.workspace = true -ui.workspace = true -util.workspace = true -workspace-hack.workspace = true -workspace.workspace = true -zed_actions.workspace = true diff --git a/crates/jj_ui/src/bookmark_picker.rs b/crates/jj_ui/src/bookmark_picker.rs deleted file mode 100644 index 95c23e73f56059c92397222a132700351c710147..0000000000000000000000000000000000000000 --- a/crates/jj_ui/src/bookmark_picker.rs +++ /dev/null @@ -1,198 +0,0 @@ -use std::sync::Arc; - -use fuzzy::{StringMatchCandidate, match_strings}; -use gpui::{ - App, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Task, WeakEntity, Window, - prelude::*, -}; -use jj::{Bookmark, JujutsuStore}; -use picker::{Picker, PickerDelegate}; -use ui::{HighlightedLabel, ListItem, ListItemSpacing, prelude::*}; -use util::ResultExt as _; -use workspace::{ModalView, Workspace}; - -pub fn register(workspace: &mut Workspace) { - workspace.register_action(open); -} - -fn open( - workspace: &mut Workspace, - _: &zed_actions::jj::BookmarkList, - window: &mut Window, - cx: &mut Context, -) { - let Some(jj_store) = JujutsuStore::try_global(cx) else { - return; - }; - - workspace.toggle_modal(window, cx, |window, cx| { - let delegate = BookmarkPickerDelegate::new(cx.entity().downgrade(), jj_store, cx); - BookmarkPicker::new(delegate, window, cx) - }); -} - -pub struct BookmarkPicker { - picker: Entity>, -} - -impl BookmarkPicker { - pub fn new( - delegate: BookmarkPickerDelegate, - window: &mut Window, - cx: &mut Context, - ) -> Self { - let picker = cx.new(|cx| Picker::uniform_list(delegate, window, cx)); - Self { picker } - } -} - -impl ModalView for BookmarkPicker {} - -impl EventEmitter for BookmarkPicker {} - -impl Focusable for BookmarkPicker { - fn focus_handle(&self, cx: &App) -> FocusHandle { - self.picker.focus_handle(cx) - } -} - -impl Render for BookmarkPicker { - fn render(&mut self, _window: &mut Window, _cx: &mut Context) -> impl IntoElement { - v_flex().w(rems(34.)).child(self.picker.clone()) - } -} - -#[derive(Debug, Clone)] -struct BookmarkEntry { - bookmark: Bookmark, - positions: Vec, -} - -pub struct BookmarkPickerDelegate { - picker: WeakEntity, - matches: Vec, - all_bookmarks: Vec, - selected_index: usize, -} - -impl BookmarkPickerDelegate { - fn new( - picker: WeakEntity, - jj_store: Entity, - cx: &mut Context, - ) -> Self { - let bookmarks = jj_store.read(cx).repository().list_bookmarks(); - - Self { - picker, - matches: Vec::new(), - all_bookmarks: bookmarks, - selected_index: 0, - } - } -} - -impl PickerDelegate for BookmarkPickerDelegate { - type ListItem = ListItem; - - fn placeholder_text(&self, _window: &mut Window, _cx: &mut App) -> Arc { - "Select Bookmark…".into() - } - - fn match_count(&self) -> usize { - self.matches.len() - } - - fn selected_index(&self) -> usize { - self.selected_index - } - - fn set_selected_index( - &mut self, - ix: usize, - _window: &mut Window, - _cx: &mut Context>, - ) { - self.selected_index = ix; - } - - fn update_matches( - &mut self, - query: String, - window: &mut Window, - cx: &mut Context>, - ) -> Task<()> { - let background = cx.background_executor().clone(); - let all_bookmarks = self.all_bookmarks.clone(); - - cx.spawn_in(window, async move |this, cx| { - let matches = if query.is_empty() { - all_bookmarks - .into_iter() - .map(|bookmark| BookmarkEntry { - bookmark, - positions: Vec::new(), - }) - .collect() - } else { - let candidates = all_bookmarks - .iter() - .enumerate() - .map(|(ix, bookmark)| StringMatchCandidate::new(ix, &bookmark.ref_name)) - .collect::>(); - match_strings( - &candidates, - &query, - false, - true, - 100, - &Default::default(), - background, - ) - .await - .into_iter() - .map(|mat| BookmarkEntry { - bookmark: all_bookmarks[mat.candidate_id].clone(), - positions: mat.positions, - }) - .collect() - }; - - this.update(cx, |this, _cx| { - this.delegate.matches = matches; - }) - .log_err(); - }) - } - - fn confirm(&mut self, _secondary: bool, _window: &mut Window, _cx: &mut Context>) { - // - } - - fn dismissed(&mut self, _window: &mut Window, cx: &mut Context>) { - self.picker - .update(cx, |_, cx| cx.emit(DismissEvent)) - .log_err(); - } - - fn render_match( - &self, - ix: usize, - selected: bool, - _window: &mut Window, - _cx: &mut Context>, - ) -> Option { - let entry = &self.matches.get(ix)?; - - Some( - ListItem::new(ix) - .inset(true) - .spacing(ListItemSpacing::Sparse) - .toggle_state(selected) - .child(HighlightedLabel::new( - entry.bookmark.ref_name.clone(), - entry.positions.clone(), - )), - ) - } -} diff --git a/crates/jj_ui/src/jj_ui.rs b/crates/jj_ui/src/jj_ui.rs deleted file mode 100644 index 5a2ecb78b1102ea27d6a661b4ab736206ad3151d..0000000000000000000000000000000000000000 --- a/crates/jj_ui/src/jj_ui.rs +++ /dev/null @@ -1,39 +0,0 @@ -mod bookmark_picker; - -use command_palette_hooks::CommandPaletteFilter; -use feature_flags::FeatureFlagAppExt as _; -use gpui::App; -use jj::JujutsuStore; -use workspace::Workspace; - -pub fn init(cx: &mut App) { - JujutsuStore::init_global(cx); - - cx.observe_new(|workspace: &mut Workspace, _window, _cx| { - bookmark_picker::register(workspace); - }) - .detach(); - - feature_gate_jj_ui_actions(cx); -} - -fn feature_gate_jj_ui_actions(cx: &mut App) { - const JJ_ACTION_NAMESPACE: &str = "jj"; - - CommandPaletteFilter::update_global(cx, |filter, _cx| { - filter.hide_namespace(JJ_ACTION_NAMESPACE); - }); - - cx.observe_flag::({ - move |is_enabled, cx| { - CommandPaletteFilter::update_global(cx, |filter, _cx| { - if is_enabled { - filter.show_namespace(JJ_ACTION_NAMESPACE); - } else { - filter.hide_namespace(JJ_ACTION_NAMESPACE); - } - }); - } - }) - .detach(); -} diff --git a/crates/journal/Cargo.toml b/crates/journal/Cargo.toml index 041badd10490a8ea876eb43975a911ca6811fa05..1b32c9cdbb7a20a13e39a2d61554e4dd7018d81b 100644 --- a/crates/journal/Cargo.toml +++ b/crates/journal/Cargo.toml @@ -18,7 +18,6 @@ chrono.workspace = true editor.workspace = true gpui.workspace = true log.workspace = true -schemars.workspace = true serde.workspace = true settings.workspace = true shellexpand.workspace = true diff --git a/crates/journal/src/journal.rs b/crates/journal/src/journal.rs index 5cdfa6c1df034deaf06e1c99ea99415757b84c29..9062081f66da0e920b99af8816432b4f006d2295 100644 --- a/crates/journal/src/journal.rs +++ b/crates/journal/src/journal.rs @@ -1,11 +1,9 @@ -use anyhow::Result; use chrono::{Datelike, Local, NaiveTime, Timelike}; use editor::scroll::Autoscroll; use editor::{Editor, SelectionEffects}; use gpui::{App, AppContext as _, Context, Window, actions}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +pub use settings::HourFormat; +use settings::Settings; use std::{ fs::OpenOptions, path::{Path, PathBuf}, @@ -22,44 +20,27 @@ actions!( ); /// Settings specific to journaling -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(key = "journal")] +#[derive(Clone, Debug)] pub struct JournalSettings { /// The path of the directory where journal entries are stored. /// /// Default: `~` - pub path: Option, + pub path: String, /// What format to display the hours in. /// /// Default: hour12 - pub hour_format: Option, -} - -impl Default for JournalSettings { - fn default() -> Self { - Self { - path: Some("~".into()), - hour_format: Some(Default::default()), - } - } -} - -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum HourFormat { - #[default] - Hour12, - Hour24, + pub hour_format: HourFormat, } impl settings::Settings for JournalSettings { - type FileContent = Self; + fn from_settings(content: &settings::SettingsContent) -> Self { + let journal = content.journal.clone().unwrap(); - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() + Self { + path: journal.path.unwrap(), + hour_format: journal.hour_format.unwrap(), + } } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } pub fn init(_: Arc, cx: &mut App) { @@ -77,7 +58,7 @@ pub fn init(_: Arc, cx: &mut App) { pub fn new_journal_entry(workspace: &Workspace, window: &mut Window, cx: &mut App) { let settings = JournalSettings::get_global(cx); - let journal_dir = match journal_dir(settings.path.as_ref().unwrap()) { + let journal_dir = match journal_dir(&settings.path) { Some(journal_dir) => journal_dir, None => { log::error!("Can't determine journal directory"); @@ -113,7 +94,7 @@ pub fn new_journal_entry(workspace: &Workspace, window: &mut Window, cx: &mut Ap break; } for directory in worktree.read(cx).directories(true, 1) { - let full_directory_path = worktree_root.join(&directory.path); + let full_directory_path = worktree_root.join(directory.path.as_std_path()); if full_directory_path.ends_with(&journal_dir_clone) { open_new_workspace = false; break 'outer; @@ -199,13 +180,13 @@ fn journal_dir(path: &str) -> Option { .map(|dir| Path::new(&dir.to_string()).to_path_buf().join("journal")) } -fn heading_entry(now: NaiveTime, hour_format: &Option) -> String { +fn heading_entry(now: NaiveTime, hour_format: &HourFormat) -> String { match hour_format { - Some(HourFormat::Hour24) => { + HourFormat::Hour24 => { let hour = now.hour(); format!("# {}:{:02}", hour, now.minute()) } - _ => { + HourFormat::Hour12 => { let (pm, hour) = now.hour12(); let am_or_pm = if pm { "PM" } else { "AM" }; format!("# {}:{:02} {}", hour, now.minute(), am_or_pm) @@ -221,7 +202,7 @@ mod tests { #[test] fn test_heading_entry_defaults_to_hour_12() { let naive_time = NaiveTime::from_hms_milli_opt(15, 0, 0, 0).unwrap(); - let actual_heading_entry = heading_entry(naive_time, &None); + let actual_heading_entry = heading_entry(naive_time, &HourFormat::Hour12); let expected_heading_entry = "# 3:00 PM"; assert_eq!(actual_heading_entry, expected_heading_entry); @@ -230,7 +211,7 @@ mod tests { #[test] fn test_heading_entry_is_hour_12() { let naive_time = NaiveTime::from_hms_milli_opt(15, 0, 0, 0).unwrap(); - let actual_heading_entry = heading_entry(naive_time, &Some(HourFormat::Hour12)); + let actual_heading_entry = heading_entry(naive_time, &HourFormat::Hour12); let expected_heading_entry = "# 3:00 PM"; assert_eq!(actual_heading_entry, expected_heading_entry); @@ -239,7 +220,7 @@ mod tests { #[test] fn test_heading_entry_is_hour_24() { let naive_time = NaiveTime::from_hms_milli_opt(15, 0, 0, 0).unwrap(); - let actual_heading_entry = heading_entry(naive_time, &Some(HourFormat::Hour24)); + let actual_heading_entry = heading_entry(naive_time, &HourFormat::Hour24); let expected_heading_entry = "# 15:00"; assert_eq!(actual_heading_entry, expected_heading_entry); diff --git a/crates/json_schema_store/Cargo.toml b/crates/json_schema_store/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..05c8cbfd9d5a83011f51b6a38f0f776e535c732f --- /dev/null +++ b/crates/json_schema_store/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "json_schema_store" +version = "0.1.0" +edition.workspace = true +publish.workspace = true +license = "GPL-3.0-or-later" + +[lints] +workspace = true + +[lib] +path = "src/json_schema_store.rs" + +[features] +default = [] + +[dependencies] +anyhow.workspace = true +dap.workspace = true +extension.workspace = true +gpui.workspace = true +language.workspace = true +paths.workspace = true +project.workspace = true +schemars.workspace = true +serde_json.workspace = true +serde.workspace = true +settings.workspace = true +snippet_provider.workspace = true +task.workspace = true +theme.workspace = true +util.workspace = true +workspace-hack.workspace = true + + + +# Uncomment other workspace dependencies as needed +# assistant.workspace = true +# client.workspace = true +# project.workspace = true +# settings.workspace = true diff --git a/crates/json_schema_store/LICENSE-GPL b/crates/json_schema_store/LICENSE-GPL new file mode 120000 index 0000000000000000000000000000000000000000..89e542f750cd3860a0598eff0dc34b56d7336dc4 --- /dev/null +++ b/crates/json_schema_store/LICENSE-GPL @@ -0,0 +1 @@ +../../LICENSE-GPL \ No newline at end of file diff --git a/crates/json_schema_store/src/json_schema_store.rs b/crates/json_schema_store/src/json_schema_store.rs new file mode 100644 index 0000000000000000000000000000000000000000..b44efb8b1b135850ab78460a428b5088e5fa0928 --- /dev/null +++ b/crates/json_schema_store/src/json_schema_store.rs @@ -0,0 +1,310 @@ +//! # json_schema_store +use std::{str::FromStr, sync::Arc}; + +use anyhow::{Context as _, Result}; +use gpui::{App, AsyncApp, BorrowAppContext as _, Entity, WeakEntity}; +use language::LanguageRegistry; +use project::LspStore; + +// Origin: https://github.com/SchemaStore/schemastore +const TSCONFIG_SCHEMA: &str = include_str!("schemas/tsconfig.json"); +const PACKAGE_JSON_SCHEMA: &str = include_str!("schemas/package.json"); + +pub fn init(cx: &mut App) { + cx.set_global(SchemaStore::default()); + project::lsp_store::json_language_server_ext::register_schema_handler( + handle_schema_request, + cx, + ); + + cx.observe_new(|_, _, cx| { + let lsp_store = cx.weak_entity(); + cx.global_mut::().lsp_stores.push(lsp_store); + }) + .detach(); + + if let Some(extension_events) = extension::ExtensionEvents::try_global(cx) { + cx.subscribe(&extension_events, |_, evt, cx| { + match evt { + extension::Event::ExtensionInstalled(_) + | extension::Event::ExtensionUninstalled(_) + | extension::Event::ConfigureExtensionRequested(_) => return, + extension::Event::ExtensionsInstalledChanged => {} + } + cx.update_global::(|schema_store, cx| { + schema_store.notify_schema_changed("zed://schemas/settings", cx); + }); + }) + .detach(); + } + + cx.observe_global::(|cx| { + cx.update_global::(|schema_store, cx| { + schema_store.notify_schema_changed("zed://schemas/debug_tasks", cx); + }); + }) + .detach(); +} + +#[derive(Default)] +pub struct SchemaStore { + lsp_stores: Vec>, +} + +impl gpui::Global for SchemaStore {} + +impl SchemaStore { + fn notify_schema_changed(&mut self, uri: &str, cx: &mut App) { + let uri = uri.to_string(); + self.lsp_stores.retain(|lsp_store| { + let Some(lsp_store) = lsp_store.upgrade() else { + return false; + }; + project::lsp_store::json_language_server_ext::notify_schema_changed( + lsp_store, + uri.clone(), + cx, + ); + true + }) + } +} + +fn handle_schema_request( + lsp_store: Entity, + uri: String, + cx: &mut AsyncApp, +) -> Result { + let languages = lsp_store.read_with(cx, |lsp_store, _| lsp_store.languages.clone())?; + let schema = resolve_schema_request(&languages, uri, cx)?; + serde_json::to_string(&schema).context("Failed to serialize schema") +} + +pub fn resolve_schema_request( + languages: &Arc, + uri: String, + cx: &mut AsyncApp, +) -> Result { + let path = uri.strip_prefix("zed://schemas/").context("Invalid URI")?; + resolve_schema_request_inner(languages, path, cx) +} + +pub fn resolve_schema_request_inner( + languages: &Arc, + path: &str, + cx: &mut AsyncApp, +) -> Result { + let (schema_name, rest) = path.split_once('/').unzip(); + let schema_name = schema_name.unwrap_or(path); + + let schema = match schema_name { + "settings" => cx.update(|cx| { + let font_names = &cx.text_system().all_font_names(); + let language_names = &languages + .language_names() + .into_iter() + .map(|name| name.to_string()) + .collect::>(); + + let mut icon_theme_names = vec![]; + let mut theme_names = vec![]; + if let Some(registry) = theme::ThemeRegistry::try_global(cx) { + icon_theme_names.extend( + registry + .list_icon_themes() + .into_iter() + .map(|icon_theme| icon_theme.name), + ); + theme_names.extend(registry.list_names()); + } + let icon_theme_names = icon_theme_names.as_slice(); + let theme_names = theme_names.as_slice(); + + cx.global::().json_schema( + &settings::SettingsJsonSchemaParams { + language_names, + font_names, + theme_names, + icon_theme_names, + }, + ) + })?, + "keymap" => cx.update(settings::KeymapFile::generate_json_schema_for_registered_actions)?, + "action" => { + let normalized_action_name = rest.context("No Action name provided")?; + let action_name = denormalize_action_name(normalized_action_name); + let mut generator = settings::KeymapFile::action_schema_generator(); + let schema = cx + // PERF: cx.action_schema_by_name(action_name, &mut generator) + .update(|cx| cx.action_schemas(&mut generator))? + .into_iter() + .find_map(|(name, schema)| (name == action_name).then_some(schema)) + .flatten(); + root_schema_from_action_schema(schema, &mut generator).to_value() + } + "tasks" => task::TaskTemplates::generate_json_schema(), + "debug_tasks" => { + let adapter_schemas = cx.read_global::(|dap_registry, _| { + dap_registry.adapters_schema() + })?; + task::DebugTaskFile::generate_json_schema(&adapter_schemas) + } + "package_json" => package_json_schema(), + "tsconfig" => tsconfig_schema(), + "zed_inspector_style" => { + if cfg!(debug_assertions) { + generate_inspector_style_schema() + } else { + schemars::json_schema!(true).to_value() + } + } + "snippets" => snippet_provider::format::VsSnippetsFile::generate_json_schema(), + _ => { + anyhow::bail!("Unrecognized builtin JSON schema: {}", schema_name); + } + }; + Ok(schema) +} + +pub fn all_schema_file_associations(cx: &mut App) -> serde_json::Value { + let mut file_associations = serde_json::json!([ + { + "fileMatch": [ + schema_file_match(paths::settings_file()), + paths::local_settings_file_relative_path() + ], + "url": "zed://schemas/settings", + }, + { + "fileMatch": [schema_file_match(paths::keymap_file())], + "url": "zed://schemas/keymap", + }, + { + "fileMatch": [ + schema_file_match(paths::tasks_file()), + paths::local_tasks_file_relative_path() + ], + "url": "zed://schemas/tasks", + }, + { + "fileMatch": [ + schema_file_match(paths::debug_scenarios_file()), + paths::local_debug_file_relative_path() + ], + "url": "zed://schemas/debug_tasks", + }, + { + "fileMatch": [ + schema_file_match( + paths::snippets_dir() + .join("*.json") + .as_path() + ) + ], + "url": "zed://schemas/snippets", + }, + { + "fileMatch": ["tsconfig.json"], + "url": "zed://schemas/tsconfig" + }, + { + "fileMatch": ["package.json"], + "url": "zed://schemas/package_json" + }, + ]); + + #[cfg(debug_assertions)] + { + file_associations + .as_array_mut() + .unwrap() + .push(serde_json::json!({ + "fileMatch": [ + "zed-inspector-style.json" + ], + "url": "zed://schemas/zed_inspector_style" + })); + } + + file_associations.as_array_mut().unwrap().extend( + // ?PERF: use all_action_schemas() and don't include action schemas with no arguments + cx.all_action_names().into_iter().map(|&name| { + let normalized_name = normalize_action_name(name); + let file_name = normalized_action_name_to_file_name(normalized_name.clone()); + serde_json::json!({ + "fileMatch": [file_name], + "url": format!("zed://schemas/action/{}", normalized_name) + }) + }), + ); + + file_associations +} + +fn tsconfig_schema() -> serde_json::Value { + serde_json::Value::from_str(TSCONFIG_SCHEMA).unwrap() +} + +fn package_json_schema() -> serde_json::Value { + serde_json::Value::from_str(PACKAGE_JSON_SCHEMA).unwrap() +} + +fn generate_inspector_style_schema() -> serde_json::Value { + let schema = schemars::generate::SchemaSettings::draft2019_09() + .with_transform(util::schemars::DefaultDenyUnknownFields) + .into_generator() + .root_schema_for::(); + + serde_json::to_value(schema).unwrap() +} + +pub fn normalize_action_name(action_name: &str) -> String { + action_name.replace("::", "__") +} + +pub fn denormalize_action_name(action_name: &str) -> String { + action_name.replace("__", "::") +} + +pub fn normalized_action_file_name(action_name: &str) -> String { + normalized_action_name_to_file_name(normalize_action_name(action_name)) +} + +pub fn normalized_action_name_to_file_name(mut normalized_action_name: String) -> String { + normalized_action_name.push_str(".json"); + normalized_action_name +} + +fn root_schema_from_action_schema( + action_schema: Option, + generator: &mut schemars::SchemaGenerator, +) -> schemars::Schema { + let Some(mut action_schema) = action_schema else { + return schemars::json_schema!(false); + }; + let meta_schema = generator + .settings() + .meta_schema + .as_ref() + .expect("meta_schema should be present in schemars settings") + .to_string(); + let defs = generator.definitions(); + let mut schema = schemars::json_schema!({ + "$schema": meta_schema, + "allowTrailingCommas": true, + "$defs": defs, + }); + schema + .ensure_object() + .extend(std::mem::take(action_schema.ensure_object())); + schema +} + +#[inline] +fn schema_file_match(path: &std::path::Path) -> String { + path.strip_prefix(path.parent().unwrap().parent().unwrap()) + .unwrap() + .display() + .to_string() + .replace('\\', "/") +} diff --git a/crates/languages/src/json/schemas/package.json b/crates/json_schema_store/src/schemas/package.json similarity index 88% rename from crates/languages/src/json/schemas/package.json rename to crates/json_schema_store/src/schemas/package.json index 664149eca92b81946420c98405219440c7be7c08..a24583fa8848891d661114291951d4df28f463fd 100644 --- a/crates/languages/src/json/schemas/package.json +++ b/crates/json_schema_store/src/schemas/package.json @@ -160,6 +160,11 @@ "$ref": "#/definitions/packageExportsEntryOrFallback", "description": "The module path that is resolved when this specifier is imported as an ECMAScript module using an `import` declaration or the dynamic `import(...)` function." }, + "module-sync": { + "$ref": "#/definitions/packageExportsEntryOrFallback", + "$comment": "https://nodejs.org/api/packages.html#conditional-exports#:~:text=%22module-sync%22", + "description": "The same as `import`, but can be used with require(esm) in Node 20+. This requires the files to not use any top-level awaits." + }, "node": { "$ref": "#/definitions/packageExportsEntryOrFallback", "description": "The module path that is resolved when this environment is Node.js." @@ -304,6 +309,33 @@ "required": [ "url" ] + }, + "devEngineDependency": { + "description": "Specifies requirements for development environment components such as operating systems, runtimes, or package managers. Used to ensure consistent development environments across the team.", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the dependency, with allowed values depending on the parent field" + }, + "version": { + "type": "string", + "description": "The version range for the dependency" + }, + "onFail": { + "type": "string", + "enum": [ + "ignore", + "warn", + "error", + "download" + ], + "description": "What action to take if validation fails" + } + } } }, "type": "object", @@ -755,7 +787,7 @@ ] }, "resolutions": { - "description": "Resolutions is used to support selective version resolutions using yarn, which lets you define custom package versions or ranges inside your dependencies. For npm, use overrides instead. See: https://classic.yarnpkg.com/en/docs/selective-version-resolutions", + "description": "Resolutions is used to support selective version resolutions using yarn, which lets you define custom package versions or ranges inside your dependencies. For npm, use overrides instead. See: https://yarnpkg.com/configuration/manifest#resolutions", "type": "object" }, "overrides": { @@ -810,6 +842,82 @@ "type": "string" } }, + "devEngines": { + "description": "Define the runtime and package manager for developing the current project.", + "type": "object", + "properties": { + "os": { + "oneOf": [ + { + "$ref": "#/definitions/devEngineDependency" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/devEngineDependency" + } + } + ], + "description": "Specifies which operating systems are supported for development" + }, + "cpu": { + "oneOf": [ + { + "$ref": "#/definitions/devEngineDependency" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/devEngineDependency" + } + } + ], + "description": "Specifies which CPU architectures are supported for development" + }, + "libc": { + "oneOf": [ + { + "$ref": "#/definitions/devEngineDependency" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/devEngineDependency" + } + } + ], + "description": "Specifies which C standard libraries are supported for development" + }, + "runtime": { + "oneOf": [ + { + "$ref": "#/definitions/devEngineDependency" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/devEngineDependency" + } + } + ], + "description": "Specifies which JavaScript runtimes (like Node.js, Deno, Bun) are supported for development. Values should use WinterCG Runtime Keys (see https://runtime-keys.proposal.wintercg.org/)" + }, + "packageManager": { + "oneOf": [ + { + "$ref": "#/definitions/devEngineDependency" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/devEngineDependency" + } + } + ], + "description": "Specifies which package managers are supported for development" + } + } + }, "preferGlobal": { "type": "boolean", "description": "DEPRECATED: This option used to trigger an npm warning, but it will no longer warn. It is purely there for informational purposes. It is now recommended that you install any binaries as local devDependencies wherever possible." @@ -973,6 +1081,7 @@ "additionalProperties": false }, "peerDependencyRules": { + "type": "object", "properties": { "ignoreMissing": { "description": "pnpm will not print warnings about missing peer dependencies from this list.", @@ -1032,6 +1141,10 @@ "description": "When true, installation won't fail if some of the patches from the \"patchedDependencies\" field were not applied.", "type": "boolean" }, + "allowUnusedPatches": { + "description": "When true, installation won't fail if some of the patches from the \"patchedDependencies\" field were not applied.", + "type": "boolean" + }, "updateConfig": { "type": "object", "properties": { @@ -1122,6 +1235,41 @@ } }, "additionalProperties": false + }, + "stackblitz": { + "description": "Defines the StackBlitz configuration for the project.", + "type": "object", + "properties": { + "installDependencies": { + "description": "StackBlitz automatically installs npm dependencies when opening a project.", + "type": "boolean" + }, + "startCommand": { + "description": "A terminal command to be executed when opening the project, after installing npm dependencies.", + "type": [ + "string", + "boolean" + ] + }, + "compileTrigger": { + "description": "The compileTrigger option controls how file changes in the editor are written to the WebContainers in-memory filesystem. ", + "oneOf": [ + { + "type": "string", + "enum": [ + "auto", + "keystroke", + "save" + ] + } + ] + }, + "env": { + "description": "A map of default environment variables that will be set in each top-level shell process.", + "type": "object" + } + }, + "additionalProperties": false } }, "anyOf": [ diff --git a/crates/languages/src/json/schemas/tsconfig.json b/crates/json_schema_store/src/schemas/tsconfig.json similarity index 100% rename from crates/languages/src/json/schemas/tsconfig.json rename to crates/json_schema_store/src/schemas/tsconfig.json diff --git a/crates/keymap_editor/Cargo.toml b/crates/keymap_editor/Cargo.toml index ae3af21239f22a8d01ec9e792a3ab0daed6080bb..ccd42dfa01a081efe940e6f309d87d61aa9472c7 100644 --- a/crates/keymap_editor/Cargo.toml +++ b/crates/keymap_editor/Cargo.toml @@ -22,6 +22,7 @@ fs.workspace = true fuzzy.workspace = true gpui.workspace = true itertools.workspace = true +json_schema_store.workspace = true language.workspace = true log.workspace = true menu.workspace = true @@ -29,16 +30,16 @@ notifications.workspace = true paths.workspace = true project.workspace = true search.workspace = true -serde.workspace = true serde_json.workspace = true +serde.workspace = true settings.workspace = true telemetry.workspace = true tempfile.workspace = true theme.workspace = true tree-sitter-json.workspace = true tree-sitter-rust.workspace = true -ui.workspace = true ui_input.workspace = true +ui.workspace = true util.workspace = true vim.workspace = true workspace-hack.workspace = true diff --git a/crates/keymap_editor/src/keymap_editor.rs b/crates/keymap_editor/src/keymap_editor.rs index 9f7bdfa6e7c04c48c58a6cbcae542107446b6233..073b64f2c292f08a92aae2ccf61d221ca7484f5b 100644 --- a/crates/keymap_editor/src/keymap_editor.rs +++ b/crates/keymap_editor/src/keymap_editor.rs @@ -25,9 +25,10 @@ use notifications::status_toast::{StatusToast, ToastIcon}; use project::{CompletionDisplayOptions, Project}; use settings::{BaseKeymap, KeybindSource, KeymapFile, Settings as _, SettingsAssets}; use ui::{ - ActiveTheme as _, App, Banner, BorrowAppContext, ContextMenu, Indicator, Modal, ModalFooter, - ModalHeader, ParentElement as _, Render, Section, SharedString, Styled as _, Tooltip, Window, - prelude::*, right_click_menu, + ActiveTheme as _, App, Banner, BorrowAppContext, ContextMenu, IconButtonShape, Indicator, + Modal, ModalFooter, ModalHeader, ParentElement as _, PopoverMenu, Render, Section, + SharedString, Styled as _, Table, TableColumnWidths, TableInteractionState, + TableResizeBehavior, Tooltip, Window, prelude::*, }; use ui_input::SingleLineInput; use util::ResultExt; @@ -37,13 +38,12 @@ use workspace::{ }; pub use ui_components::*; -use zed_actions::OpenKeymapEditor; +use zed_actions::OpenKeymap; use crate::{ persistence::KEYBINDING_EDITORS, - ui_components::{ - keystroke_input::{ClearKeystrokes, KeystrokeInput, StartRecording, StopRecording}, - table::{ColumnWidths, ResizeBehavior, Table, TableInteractionState}, + ui_components::keystroke_input::{ + ClearKeystrokes, KeystrokeInput, StartRecording, StopRecording, }, }; @@ -77,7 +77,7 @@ pub fn init(cx: &mut App) { let keymap_event_channel = KeymapEventChannel::new(); cx.set_global(keymap_event_channel); - cx.on_action(|_: &OpenKeymapEditor, cx| { + cx.on_action(|_: &OpenKeymap, cx| { workspace::with_active_or_new_workspace(cx, move |workspace, window, cx| { workspace .with_local_workspace(window, cx, |workspace, window, cx| { @@ -369,7 +369,7 @@ struct KeymapEditor { context_menu: Option<(Entity, Point, Subscription)>, previous_edit: Option, humanized_action_names: HumanizedActionNameCache, - current_widths: Entity>, + current_widths: Entity>, show_hover_menus: bool, /// In order for the JSON LSP to run in the actions arguments editor, we /// require a backing file In order to avoid issues (primarily log spam) @@ -425,7 +425,10 @@ impl KeymapEditor { fn new(workspace: WeakEntity, window: &mut Window, cx: &mut Context) -> Self { let _keymap_subscription = cx.observe_global_in::(window, Self::on_keymap_changed); - let table_interaction_state = TableInteractionState::new(cx); + let table_interaction_state = cx.new(|cx| { + TableInteractionState::new(cx) + .with_custom_scrollbar(ui::Scrollbars::for_settings::()) + }); let keystroke_editor = cx.new(|cx| { let mut keystroke_editor = KeystrokeInput::new(None, window, cx); @@ -496,7 +499,7 @@ impl KeymapEditor { show_hover_menus: true, action_args_temp_dir: None, action_args_temp_dir_worktree: None, - current_widths: cx.new(|cx| ColumnWidths::new(cx)), + current_widths: cx.new(|cx| TableColumnWidths::new(cx)), }; this.on_keymap_changed(window, cx); @@ -1566,7 +1569,7 @@ impl Render for KeymapEditor { h_flex() .gap_2() .child( - div() + h_flex() .key_context({ let mut context = KeyContext::new_with_defaults(); context.add("BufferSearchBar"); @@ -1660,56 +1663,61 @@ impl Render for KeymapEditor { }), ) .child( - div() - .ml_1() + h_flex() + .w_full() .pl_2() - .border_l_1() - .border_color(cx.theme().colors().border_variant) + .gap_1() + .justify_end() .child( - right_click_menu("open-keymap-menu") - .menu(|window, cx| { - ContextMenu::build(window, cx, |menu, _, _| { - menu.header("Open Keymap JSON") - .action( - "User", - zed_actions::OpenKeymap.boxed_clone(), - ) + PopoverMenu::new("open-keymap-menu") + .menu(move |window, cx| { + Some(ContextMenu::build(window, cx, |menu, _, _| { + menu.header("View Default...") .action( - "Zed Default", + "Zed Key Bindings", zed_actions::OpenDefaultKeymap .boxed_clone(), ) .action( - "Vim Default", + "Vim Bindings", vim::OpenDefaultKeymap.boxed_clone(), ) - }) + })) + }) + .anchor(gpui::Corner::TopRight) + .offset(gpui::Point { + x: px(0.0), + y: px(2.0), }) - .anchor(gpui::Corner::TopLeft) - .trigger(|open, _, _| { + .trigger_with_tooltip( IconButton::new( "OpenKeymapJsonButton", - IconName::Json, + IconName::Ellipsis, ) - .icon_size(IconSize::Small) - .when(!open, |this| { - this.tooltip(move |window, cx| { - Tooltip::with_meta( - "Open keymap.json", - Some(&zed_actions::OpenKeymap), - "Right click to view more options", + .icon_size(IconSize::Small), + { + let focus_handle = focus_handle.clone(); + move |window, cx| { + Tooltip::for_action_in( + "View Default...", + &zed_actions::OpenKeymapFile, + &focus_handle, window, cx, ) - }) - }) - .on_click(|_, window, cx| { - window.dispatch_action( - zed_actions::OpenKeymap.boxed_clone(), - cx, - ); - }) - }), + } + }, + ), + ) + .child( + Button::new("edit-in-json", "Edit in keymap.json") + .style(ButtonStyle::Outlined) + .on_click(|_, window, cx| { + window.dispatch_action( + zed_actions::OpenKeymapFile.boxed_clone(), + cx, + ); + }) ), ) ), @@ -1779,12 +1787,12 @@ impl Render for KeymapEditor { ]) .resizable_columns( [ - ResizeBehavior::None, - ResizeBehavior::Resizable, - ResizeBehavior::Resizable, - ResizeBehavior::Resizable, - ResizeBehavior::Resizable, - ResizeBehavior::Resizable, // this column doesn't matter + TableResizeBehavior::None, + TableResizeBehavior::Resizable, + TableResizeBehavior::Resizable, + TableResizeBehavior::Resizable, + TableResizeBehavior::Resizable, + TableResizeBehavior::Resizable, // this column doesn't matter ], &self.current_widths, cx, @@ -2702,10 +2710,7 @@ impl ActionArgumentsEditor { ) })?; - let file_name = - project::lsp_store::json_language_server_ext::normalized_action_file_name( - action_name, - ); + let file_name = json_schema_store::normalized_action_file_name(action_name); let (buffer, backup_temp_dir) = Self::create_temp_buffer(temp_dir, file_name.clone(), project.clone(), fs, cx) diff --git a/crates/keymap_editor/src/ui_components/mod.rs b/crates/keymap_editor/src/ui_components/mod.rs index 5d6463a61a21afd5208b75af0362f6f7956f5e56..c093bab554d9e4f3f2f74818d5016a0480053903 100644 --- a/crates/keymap_editor/src/ui_components/mod.rs +++ b/crates/keymap_editor/src/ui_components/mod.rs @@ -1,2 +1 @@ pub mod keystroke_input; -pub mod table; diff --git a/crates/language/Cargo.toml b/crates/language/Cargo.toml index 4ab56d6647db5246bf0af7343c8485d946c8b156..4a4f51a58be7e4ffc61617dd74c2ed0ad7b49d34 100644 --- a/crates/language/Cargo.toml +++ b/crates/language/Cargo.toml @@ -39,7 +39,6 @@ globset.workspace = true gpui.workspace = true http_client.workspace = true imara-diff.workspace = true -inventory.workspace = true itertools.workspace = true log.workspace = true lsp.workspace = true diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index f03df08a55b2759885d133b9a7dc3556b549a184..1605eea051b660f7285481223b0b3b9f97aef732 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1,7 +1,7 @@ use crate::{ DebuggerTextObject, LanguageScope, Outline, OutlineConfig, RunnableCapture, RunnableTag, TextObject, TreeSitterOptions, - diagnostic_set::{DiagnosticEntry, DiagnosticGroup}, + diagnostic_set::{DiagnosticEntry, DiagnosticEntryRef, DiagnosticGroup}, language_settings::{LanguageSettings, language_settings}, outline::OutlineItem, syntax_map::{ @@ -30,10 +30,9 @@ use gpui::{ use lsp::{LanguageServerId, NumberOrString}; use parking_lot::Mutex; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::Value; -use settings::{SettingsUi, WorktreeId}; +use settings::WorktreeId; use smallvec::SmallVec; use smol::future::yield_now; use std::{ @@ -42,13 +41,12 @@ use std::{ cell::Cell, cmp::{self, Ordering, Reverse}, collections::{BTreeMap, BTreeSet}, - ffi::OsStr, future::Future, iter::{self, Iterator, Peekable}, mem, num::NonZeroU32, ops::{Deref, Range}, - path::{Path, PathBuf}, + path::PathBuf, rc, sync::{Arc, LazyLock}, time::{Duration, Instant}, @@ -66,7 +64,7 @@ pub use text::{ use theme::{ActiveTheme as _, SyntaxTheme}; #[cfg(any(test, feature = "test-support"))] use util::RandomCharIter; -use util::{RangeExt, debug_panic, maybe}; +use util::{RangeExt, debug_panic, maybe, paths::PathStyle, rel_path::RelPath}; #[cfg(any(test, feature = "test-support"))] pub use {tree_sitter_python, tree_sitter_rust, tree_sitter_typescript}; @@ -145,7 +143,7 @@ struct BufferBranchState { /// state of a buffer. pub struct BufferSnapshot { pub text: text::BufferSnapshot, - pub(crate) syntax: SyntaxSnapshot, + pub syntax: SyntaxSnapshot, file: Option>, diagnostics: SmallVec<[(LanguageServerId, DiagnosticSet); 2]>, remote_selections: TreeMap, @@ -174,10 +172,7 @@ pub enum IndentKind { } /// The shape of a selection cursor. -#[derive( - Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, SettingsUi, -)] -#[serde(rename_all = "snake_case")] +#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] pub enum CursorShape { /// A vertical bar #[default] @@ -190,6 +185,17 @@ pub enum CursorShape { Hollow, } +impl From for CursorShape { + fn from(shape: settings::CursorShape) -> Self { + match shape { + settings::CursorShape::Bar => CursorShape::Bar, + settings::CursorShape::Block => CursorShape::Block, + settings::CursorShape::Underline => CursorShape::Underline, + settings::CursorShape::Hollow => CursorShape::Hollow, + } + } +} + #[derive(Clone, Debug)] struct SelectionSet { line_mode: bool, @@ -342,15 +348,18 @@ pub trait File: Send + Sync + Any { fn disk_state(&self) -> DiskState; /// Returns the path of this file relative to the worktree's root directory. - fn path(&self) -> &Arc; + fn path(&self) -> &Arc; /// Returns the path of this file relative to the worktree's parent directory (this means it /// includes the name of the worktree's root folder). fn full_path(&self, cx: &App) -> PathBuf; + /// Returns the path style of this file. + fn path_style(&self, cx: &App) -> PathStyle; + /// Returns the last component of this handle's absolute path. If this handle refers to the root /// of its worktree, then this method will return the name of the worktree itself. - fn file_name<'a>(&'a self, cx: &'a App) -> &'a OsStr; + fn file_name<'a>(&'a self, cx: &'a App) -> &'a str; /// Returns the id of the worktree to which this file belongs. /// @@ -539,6 +548,23 @@ pub enum CharKind { Word, } +/// Context for character classification within a specific scope. +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +pub enum CharScopeContext { + /// Character classification for completion queries. + /// + /// This context treats certain characters as word constituents that would + /// normally be considered punctuation, such as '-' in Tailwind classes + /// ("bg-yellow-100") or '.' in import paths ("foo.ts"). + Completion, + /// Character classification for linked edits. + /// + /// This context handles characters that should be treated as part of + /// identifiers during linked editing operations, such as '.' in JSX + /// component names like ``. + LinkedEdit, +} + /// A runnable is a set of data about a region that could be resolved into a task pub struct Runnable { pub tags: SmallVec<[RunnableTag; 1]>, @@ -555,7 +581,7 @@ pub struct HighlightedText { #[derive(Default, Debug)] struct HighlightedTextBuilder { pub text: String, - pub highlights: Vec<(Range, HighlightStyle)>, + highlights: Vec<(Range, HighlightStyle)>, } impl HighlightedText { @@ -598,10 +624,11 @@ impl HighlightedText { let preview_highlights = self .highlights .into_iter() + .skip_while(|(range, _)| range.end <= preview_start_ix) .take_while(|(range, _)| range.start < newline_ix) .filter_map(|(mut range, highlight)| { range.start = range.start.saturating_sub(preview_start_ix); - range.end = range.end.saturating_sub(preview_start_ix).min(newline_ix); + range.end = range.end.min(newline_ix).saturating_sub(preview_start_ix); if range.is_empty() { None } else { @@ -660,7 +687,10 @@ impl HighlightedTextBuilder { syntax_snapshot: &'a SyntaxSnapshot, ) -> BufferChunks<'a> { let captures = syntax_snapshot.captures(range.clone(), snapshot, |grammar| { - grammar.highlights_query.as_ref() + grammar + .highlights_config + .as_ref() + .map(|config| &config.query) }); let highlight_maps = captures @@ -1283,9 +1313,8 @@ impl Buffer { mtime: Option, cx: &mut Context, ) { - self.saved_version = version; - self.has_unsaved_edits - .set((self.saved_version().clone(), false)); + self.saved_version = version.clone(); + self.has_unsaved_edits.set((version, false)); self.has_conflict = false; self.saved_mtime = mtime; self.was_changed(); @@ -3246,7 +3275,10 @@ impl BufferSnapshot { fn get_highlights(&self, range: Range) -> (SyntaxMapCaptures<'_>, Vec) { let captures = self.syntax.captures(range, &self.text, |grammar| { - grammar.highlights_query.as_ref() + grammar + .highlights_config + .as_ref() + .map(|config| &config.query) }); let highlight_maps = captures .grammars() @@ -3310,18 +3342,25 @@ impl BufferSnapshot { /// Iterates over every [`SyntaxLayer`] in the buffer. pub fn syntax_layers(&self) -> impl Iterator> + '_ { - self.syntax - .layers_for_range(0..self.len(), &self.text, true) + self.syntax_layers_for_range(0..self.len(), true) } pub fn syntax_layer_at(&self, position: D) -> Option> { let offset = position.to_offset(self); - self.syntax - .layers_for_range(offset..offset, &self.text, false) + self.syntax_layers_for_range(offset..offset, false) .filter(|l| l.node().end_byte() > offset) .last() } + pub fn syntax_layers_for_range( + &self, + range: Range, + include_hidden: bool, + ) -> impl Iterator> + '_ { + self.syntax + .layers_for_range(range, &self.text, include_hidden) + } + pub fn smallest_syntax_layer_containing( &self, range: Range, @@ -3429,16 +3468,14 @@ impl BufferSnapshot { pub fn surrounding_word( &self, start: T, - for_completion: bool, + scope_context: Option, ) -> (Range, Option) { let mut start = start.to_offset(self); let mut end = start; let mut next_chars = self.chars_at(start).take(128).peekable(); let mut prev_chars = self.reversed_chars_at(start).take(128).peekable(); - let classifier = self - .char_classifier_at(start) - .for_completion(for_completion); + let classifier = self.char_classifier_at(start).scope_context(scope_context); let word_kind = cmp::max( prev_chars.peek().copied().map(|c| classifier.kind(c)), next_chars.peek().copied().map(|c| classifier.kind(c)), @@ -3721,11 +3758,9 @@ impl BufferSnapshot { theme: Option<&SyntaxTheme>, ) -> Vec> { let position = position.to_offset(self); - let mut items = self.outline_items_containing( - position.saturating_sub(1)..self.len().min(position + 1), - false, - theme, - ); + let start = self.clip_offset(position.saturating_sub(1), Bias::Left); + let end = self.clip_offset(position + 1, Bias::Right); + let mut items = self.outline_items_containing(start..end, false, theme); let mut prev_depth = None; items.retain(|item| { let result = prev_depth.is_none_or(|prev_depth| item.depth > prev_depth); @@ -3859,9 +3894,9 @@ impl BufferSnapshot { text: item.text, highlight_ranges: item.highlight_ranges, name_ranges: item.name_ranges, - body_range: item.body_range.map(|body_range| { - self.anchor_after(body_range.start)..self.anchor_before(body_range.end) - }), + body_range: item + .body_range + .map(|r| self.anchor_after(r.start)..self.anchor_before(r.end)), annotation_range: annotation_row_range.map(|annotation_range| { self.anchor_after(Point::new(annotation_range.start, 0)) ..self.anchor_before(Point::new( @@ -3901,38 +3936,40 @@ impl BufferSnapshot { let mut open_point = None; let mut close_point = None; + let mut buffer_ranges = Vec::new(); + let mut add_to_buffer_ranges = |node: tree_sitter::Node, node_is_name| { + let mut range = node.start_byte()..node.end_byte(); + let start = node.start_position(); + if node.end_position().row > start.row { + range.end = range.start + self.line_len(start.row as u32) as usize - start.column; + } + + if !range.is_empty() { + buffer_ranges.push((range, node_is_name)); + } + }; + for capture in mat.captures { - let node_is_name; if capture.index == config.name_capture_ix { - node_is_name = true; + add_to_buffer_ranges(capture.node, true); } else if Some(capture.index) == config.context_capture_ix || (Some(capture.index) == config.extra_context_capture_ix && include_extra_context) { - node_is_name = false; + add_to_buffer_ranges(capture.node, false); } else { if Some(capture.index) == config.open_capture_ix { open_point = Some(Point::from_ts_point(capture.node.end_position())); } else if Some(capture.index) == config.close_capture_ix { close_point = Some(Point::from_ts_point(capture.node.start_position())); } - - continue; - } - - let mut range = capture.node.start_byte()..capture.node.end_byte(); - let start = capture.node.start_position(); - if capture.node.end_position().row > start.row { - range.end = range.start + self.line_len(start.row as u32) as usize - start.column; - } - - if !range.is_empty() { - buffer_ranges.push((range, node_is_name)); } } + if buffer_ranges.is_empty() { return None; } + let mut text = String::new(); let mut highlight_ranges = Vec::new(); let mut name_ranges = Vec::new(); @@ -3941,7 +3978,6 @@ impl BufferSnapshot { true, ); let mut last_buffer_range_end = 0; - for (buffer_range, is_name) in buffer_ranges { let space_added = !text.is_empty() && buffer_range.start > last_buffer_range_end; if space_added { @@ -4066,8 +4102,7 @@ impl BufferSnapshot { range: Range, ) -> impl Iterator + '_ { // Find bracket pairs that *inclusively* contain the given range. - let range = range.start.to_offset(self).saturating_sub(1) - ..self.len().min(range.end.to_offset(self) + 1); + let range = range.start.to_previous_offset(self)..range.end.to_next_offset(self); self.all_bracket_ranges(range) .filter(|pair| !pair.newline_only) } @@ -4076,8 +4111,7 @@ impl BufferSnapshot { &self, range: Range, ) -> impl Iterator, DebuggerTextObject)> + '_ { - let range = range.start.to_offset(self).saturating_sub(1) - ..self.len().min(range.end.to_offset(self) + 1); + let range = range.start.to_previous_offset(self)..range.end.to_next_offset(self); let mut matches = self.syntax.matches_with_options( range.clone(), @@ -4145,8 +4179,8 @@ impl BufferSnapshot { range: Range, options: TreeSitterOptions, ) -> impl Iterator, TextObject)> + '_ { - let range = range.start.to_offset(self).saturating_sub(1) - ..self.len().min(range.end.to_offset(self) + 1); + let range = + range.start.to_previous_offset(self)..self.len().min(range.end.to_next_offset(self)); let mut matches = self.syntax @@ -4485,7 +4519,7 @@ impl BufferSnapshot { &'a self, search_range: Range, reversed: bool, - ) -> impl 'a + Iterator> + ) -> impl 'a + Iterator> where T: 'a + Clone + ToOffset, O: 'a + FromAnchor, @@ -4518,21 +4552,29 @@ impl BufferSnapshot { })?; iterators[next_ix] .next() - .map(|DiagnosticEntry { range, diagnostic }| DiagnosticEntry { - diagnostic, - range: FromAnchor::from_anchor(&range.start, self) - ..FromAnchor::from_anchor(&range.end, self), - }) + .map( + |DiagnosticEntryRef { range, diagnostic }| DiagnosticEntryRef { + diagnostic, + range: FromAnchor::from_anchor(&range.start, self) + ..FromAnchor::from_anchor(&range.end, self), + }, + ) }) } + /// Raw access to the diagnostic sets. Typically `diagnostic_groups` or `diagnostic_group` + /// should be used instead. + pub fn diagnostic_sets(&self) -> &SmallVec<[(LanguageServerId, DiagnosticSet); 2]> { + &self.diagnostics + } + /// Returns all the diagnostic groups associated with the given /// language server ID. If no language server ID is provided, /// all diagnostics groups are returned. pub fn diagnostic_groups( &self, language_server_id: Option, - ) -> Vec<(LanguageServerId, DiagnosticGroup)> { + ) -> Vec<(LanguageServerId, DiagnosticGroup<'_, Anchor>)> { let mut groups = Vec::new(); if let Some(language_server_id) = language_server_id { @@ -4563,7 +4605,7 @@ impl BufferSnapshot { pub fn diagnostic_group( &self, group_id: usize, - ) -> impl Iterator> + '_ + ) -> impl Iterator> + use<'_, O> where O: FromAnchor + 'static, { @@ -4588,13 +4630,12 @@ impl BufferSnapshot { self.file.as_ref() } - /// Resolves the file path (relative to the worktree root) associated with the underlying file. - pub fn resolve_file_path(&self, cx: &App, include_root: bool) -> Option { + pub fn resolve_file_path(&self, include_root: bool, cx: &App) -> Option { if let Some(file) = self.file() { if file.path().file_name().is_none() || include_root { - Some(file.full_path(cx)) + Some(file.full_path(cx).to_string_lossy().into_owned()) } else { - Some(file.path().to_path_buf()) + Some(file.path().display(file.path_style(cx)).to_string()) } } else { None @@ -5079,19 +5120,19 @@ impl IndentSize { #[cfg(any(test, feature = "test-support"))] pub struct TestFile { - pub path: Arc, + pub path: Arc, pub root_name: String, pub local_root: Option, } #[cfg(any(test, feature = "test-support"))] impl File for TestFile { - fn path(&self) -> &Arc { + fn path(&self) -> &Arc { &self.path } fn full_path(&self, _: &gpui::App) -> PathBuf { - PathBuf::from(&self.root_name).join(self.path.as_ref()) + PathBuf::from(self.root_name.clone()).join(self.path.as_std_path()) } fn as_local(&self) -> Option<&dyn LocalFile> { @@ -5106,7 +5147,7 @@ impl File for TestFile { unimplemented!() } - fn file_name<'a>(&'a self, _: &'a gpui::App) -> &'a std::ffi::OsStr { + fn file_name<'a>(&'a self, _: &'a gpui::App) -> &'a str { self.path().file_name().unwrap_or(self.root_name.as_ref()) } @@ -5121,6 +5162,10 @@ impl File for TestFile { fn is_private(&self) -> bool { false } + + fn path_style(&self, _cx: &App) -> PathStyle { + PathStyle::local() + } } #[cfg(any(test, feature = "test-support"))] @@ -5128,7 +5173,7 @@ impl LocalFile for TestFile { fn abs_path(&self, _cx: &App) -> PathBuf { PathBuf::from(self.local_root.as_ref().unwrap()) .join(&self.root_name) - .join(self.path.as_ref()) + .join(self.path.as_std_path()) } fn load(&self, _cx: &App) -> Task> { @@ -5172,7 +5217,7 @@ pub(crate) fn contiguous_ranges( #[derive(Default, Debug)] pub struct CharClassifier { scope: Option, - for_completion: bool, + scope_context: Option, ignore_punctuation: bool, } @@ -5180,14 +5225,14 @@ impl CharClassifier { pub fn new(scope: Option) -> Self { Self { scope, - for_completion: false, + scope_context: None, ignore_punctuation: false, } } - pub fn for_completion(self, for_completion: bool) -> Self { + pub fn scope_context(self, scope_context: Option) -> Self { Self { - for_completion, + scope_context, ..self } } @@ -5217,10 +5262,10 @@ impl CharClassifier { } if let Some(scope) = &self.scope { - let characters = if self.for_completion { - scope.completion_query_characters() - } else { - scope.word_characters() + let characters = match self.scope_context { + Some(CharScopeContext::Completion) => scope.completion_query_characters(), + Some(CharScopeContext::LinkedEdit) => scope.linked_edit_characters(), + None => scope.word_characters(), }; if let Some(characters) = characters && characters.contains(&c) diff --git a/crates/language/src/buffer_tests.rs b/crates/language/src/buffer_tests.rs index fcd93390c891f1d65b2f424a5bc70cd7f23c7912..6c87ec5b5183bd5b37e9dd52d53c8fa0f8f28db1 100644 --- a/crates/language/src/buffer_tests.rs +++ b/crates/language/src/buffer_tests.rs @@ -1,8 +1,5 @@ use super::*; use crate::Buffer; -use crate::language_settings::{ - AllLanguageSettings, AllLanguageSettingsContent, LanguageSettingsContent, -}; use clock::ReplicaId; use collections::BTreeMap; use futures::FutureExt as _; @@ -13,6 +10,7 @@ use proto::deserialize_operation; use rand::prelude::*; use regex::RegexBuilder; use settings::SettingsStore; +use settings::{AllLanguageSettingsContent, LanguageSettingsContent}; use std::collections::BTreeSet; use std::{ env, @@ -26,6 +24,7 @@ use text::{BufferId, LineEnding}; use text::{Point, ToPoint}; use theme::ActiveTheme; use unindent::Unindent as _; +use util::rel_path::rel_path; use util::test::marked_text_offsets; use util::{RandomCharIter, assert_set_eq, post_inc, test::marked_text_ranges}; @@ -271,15 +270,15 @@ async fn test_language_for_file_with_custom_file_types(cx: &mut TestAppContext) cx.update(|cx| { init_settings(cx, |settings| { settings.file_types.extend([ - ("TypeScript".into(), vec!["js".into()]), + ("TypeScript".into(), vec!["js".into()].into()), ( "JavaScript".into(), - vec!["*longer.ts".into(), "ecmascript".into()], + vec!["*longer.ts".into(), "ecmascript".into()].into(), ), - ("C++".into(), vec!["c".into(), "*.dev".into()]), + ("C++".into(), vec!["c".into(), "*.dev".into()].into()), ( "Dockerfile".into(), - vec!["Dockerfile".into(), "Dockerfile.*".into()], + vec!["Dockerfile".into(), "Dockerfile.*".into()].into(), ), ]); }) @@ -382,7 +381,7 @@ async fn test_language_for_file_with_custom_file_types(cx: &mut TestAppContext) fn file(path: &str) -> Arc { Arc::new(TestFile { - path: Path::new(path).into(), + path: Arc::from(rel_path(path)), root_name: "zed".into(), local_root: None, }) @@ -1054,6 +1053,21 @@ async fn test_symbols_containing(cx: &mut gpui::TestAppContext) { }) .collect() } + + let (text, offsets) = marked_text_offsets( + &" + // ˇ😅 // + fn test() { + } + " + .unindent(), + ); + let buffer = cx.new(|cx| Buffer::local(text, cx).with_language(Arc::new(rust_lang()), cx)); + let snapshot = buffer.update(cx, |buffer, _| buffer.snapshot()); + + // note, it would be nice to actually return the method test in this + // case, but primarily asserting we don't crash because of the multibyte character. + assert_eq!(snapshot.symbols_containing(offsets[0], None), vec![]); } #[gpui::test] @@ -3849,7 +3863,7 @@ fn init_settings(cx: &mut App, f: fn(&mut AllLanguageSettingsContent)) { cx.set_global(settings_store); crate::init(cx); cx.update_global::(|settings, cx| { - settings.update_user_settings::(cx, f); + settings.update_user_settings(cx, |content| f(&mut content.project.all_languages)); }); } diff --git a/crates/language/src/diagnostic_set.rs b/crates/language/src/diagnostic_set.rs index 613c445652fbcfe87232afec559480ce943b15e3..fa3263df48ff773b32332980e7341fa8a453ba4f 100644 --- a/crates/language/src/diagnostic_set.rs +++ b/crates/language/src/diagnostic_set.rs @@ -34,19 +34,66 @@ pub struct DiagnosticEntry { pub diagnostic: Diagnostic, } +/// A single diagnostic in a set. Generic over its range type, because +/// the diagnostics are stored internally as [`Anchor`]s, but can be +/// resolved to different coordinates types like [`usize`] byte offsets or +/// [`Point`](gpui::Point)s. +#[derive(Clone, Debug, PartialEq, Eq, Serialize)] +pub struct DiagnosticEntryRef<'a, T> { + /// The range of the buffer where the diagnostic applies. + pub range: Range, + /// The information about the diagnostic. + pub diagnostic: &'a Diagnostic, +} + +impl PartialEq> for DiagnosticEntryRef<'_, T> { + fn eq(&self, other: &DiagnosticEntry) -> bool { + self.range == other.range && *self.diagnostic == other.diagnostic + } +} + +impl PartialEq> for DiagnosticEntry { + fn eq(&self, other: &DiagnosticEntryRef<'_, T>) -> bool { + self.range == other.range && self.diagnostic == *other.diagnostic + } +} + +impl DiagnosticEntryRef<'_, T> { + pub fn to_owned(&self) -> DiagnosticEntry { + DiagnosticEntry { + range: self.range.clone(), + diagnostic: self.diagnostic.clone(), + } + } +} + +impl<'a> DiagnosticEntryRef<'a, Anchor> { + /// Converts the [DiagnosticEntry] to a different buffer coordinate type. + pub fn resolve( + &self, + buffer: &text::BufferSnapshot, + ) -> DiagnosticEntryRef<'a, O> { + DiagnosticEntryRef { + range: O::from_anchor(&self.range.start, buffer) + ..O::from_anchor(&self.range.end, buffer), + diagnostic: &self.diagnostic, + } + } +} + /// A group of related diagnostics, ordered by their start position /// in the buffer. #[derive(Debug, Serialize)] -pub struct DiagnosticGroup { +pub struct DiagnosticGroup<'a, T> { /// The diagnostics. - pub entries: Vec>, + pub entries: Vec>, /// The index into `entries` where the primary diagnostic is stored. pub primary_ix: usize, } -impl DiagnosticGroup { +impl<'a> DiagnosticGroup<'a, Anchor> { /// Converts the entries in this [`DiagnosticGroup`] to a different buffer coordinate type. - pub fn resolve(&self, buffer: &text::BufferSnapshot) -> DiagnosticGroup { + pub fn resolve(&self, buffer: &text::BufferSnapshot) -> DiagnosticGroup<'a, O> { DiagnosticGroup { entries: self .entries @@ -84,6 +131,23 @@ impl DiagnosticEntry { }) } } +impl DiagnosticEntryRef<'_, PointUtf16> { + /// Returns a raw LSP diagnostic used to provide diagnostic context to LSP + /// codeAction request + pub fn to_lsp_diagnostic_stub(&self) -> Result { + let range = range_to_lsp(self.range.clone())?; + + Ok(lsp::Diagnostic { + range, + code: self.diagnostic.code.clone(), + severity: Some(self.diagnostic.severity), + source: self.diagnostic.source.clone(), + message: self.diagnostic.message.clone(), + data: self.diagnostic.data.clone(), + ..Default::default() + }) + } +} impl DiagnosticSet { /// Constructs a [DiagnosticSet] from a sequence of entries, ordered by @@ -138,7 +202,7 @@ impl DiagnosticSet { buffer: &'a text::BufferSnapshot, inclusive: bool, reversed: bool, - ) -> impl 'a + Iterator> + ) -> impl 'a + Iterator> where T: 'a + ToOffset, O: FromAnchor, @@ -179,10 +243,10 @@ impl DiagnosticSet { } /// Adds all of this set's diagnostic groups to the given output vector. - pub fn groups( - &self, + pub fn groups<'a>( + &'a self, language_server_id: LanguageServerId, - output: &mut Vec<(LanguageServerId, DiagnosticGroup)>, + output: &mut Vec<(LanguageServerId, DiagnosticGroup<'a, Anchor>)>, buffer: &text::BufferSnapshot, ) { let mut groups = HashMap::default(); @@ -190,7 +254,10 @@ impl DiagnosticSet { groups .entry(entry.diagnostic.group_id) .or_insert(Vec::new()) - .push(entry.clone()); + .push(DiagnosticEntryRef { + range: entry.range.clone(), + diagnostic: &entry.diagnostic, + }); } let start_ix = output.len(); @@ -224,7 +291,7 @@ impl DiagnosticSet { &'a self, group_id: usize, buffer: &'a text::BufferSnapshot, - ) -> impl 'a + Iterator> { + ) -> impl 'a + Iterator> { self.iter() .filter(move |entry| entry.diagnostic.group_id == group_id) .map(|entry| entry.resolve(buffer)) @@ -247,11 +314,14 @@ impl sum_tree::Item for DiagnosticEntry { impl DiagnosticEntry { /// Converts the [DiagnosticEntry] to a different buffer coordinate type. - pub fn resolve(&self, buffer: &text::BufferSnapshot) -> DiagnosticEntry { - DiagnosticEntry { + pub fn resolve<'a, O: FromAnchor>( + &'a self, + buffer: &text::BufferSnapshot, + ) -> DiagnosticEntryRef<'a, O> { + DiagnosticEntryRef { range: O::from_anchor(&self.range.start, buffer) ..O::from_anchor(&self.range.end, buffer), - diagnostic: self.diagnostic.clone(), + diagnostic: &self.diagnostic, } } } @@ -269,13 +339,13 @@ impl Default for Summary { } impl sum_tree::Summary for Summary { - type Context = text::BufferSnapshot; + type Context<'a> = &'a text::BufferSnapshot; - fn zero(_cx: &Self::Context) -> Self { + fn zero(_cx: Self::Context<'_>) -> Self { Default::default() } - fn add_summary(&mut self, other: &Self, buffer: &Self::Context) { + fn add_summary(&mut self, other: &Self, buffer: Self::Context<'_>) { if other.min_start.cmp(&self.min_start, buffer).is_lt() { self.min_start = other.min_start; } diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 77e8ee0232819a830e48d1d12a778ef19026d7b6..c16e90bd0f6c02fe49e2845ab24f8d767b32d82b 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -22,8 +22,8 @@ mod toolchain; #[cfg(test)] pub mod buffer_tests; -pub use crate::language_settings::EditPredictionsMode; use crate::language_settings::SoftWrap; +pub use crate::language_settings::{EditPredictionsMode, IndentGuideSettings}; use anyhow::{Context as _, Result}; use async_trait::async_trait; use collections::{HashMap, HashSet, IndexSet}; @@ -55,7 +55,7 @@ use std::{ str, sync::{ Arc, LazyLock, - atomic::{AtomicU64, AtomicUsize, Ordering::SeqCst}, + atomic::{AtomicUsize, Ordering::SeqCst}, }, }; use syntax_map::{QueryCursorHandle, SyntaxSnapshot}; @@ -70,18 +70,21 @@ pub use toolchain::{ ToolchainMetadata, ToolchainScope, }; use tree_sitter::{self, Query, QueryCursor, WasmStore, wasmtime}; +use util::rel_path::RelPath; use util::serde::default_true; pub use buffer::Operation; pub use buffer::*; -pub use diagnostic_set::{DiagnosticEntry, DiagnosticGroup}; +pub use diagnostic_set::{DiagnosticEntry, DiagnosticEntryRef, DiagnosticGroup}; pub use language_registry::{ AvailableLanguage, BinaryStatus, LanguageNotFound, LanguageQueries, LanguageRegistry, QUERY_FILENAME_PREFIXES, }; pub use lsp::{LanguageServerId, LanguageServerName}; pub use outline::*; -pub use syntax_map::{OwnedSyntaxLayer, SyntaxLayer, ToTreeSitterPoint, TreeSitterOptions}; +pub use syntax_map::{ + OwnedSyntaxLayer, SyntaxLayer, SyntaxMapMatches, ToTreeSitterPoint, TreeSitterOptions, +}; pub use text::{AnchorRangeExt, LineEnding}; pub use tree_sitter::{Node, Parser, Tree, TreeCursor}; @@ -166,7 +169,6 @@ pub struct CachedLspAdapter { pub disk_based_diagnostics_progress_token: Option, language_ids: HashMap, pub adapter: Arc, - pub reinstall_attempt_count: AtomicU64, cached_binary: ServerBinaryCache, } @@ -183,7 +185,6 @@ impl Debug for CachedLspAdapter { &self.disk_based_diagnostics_progress_token, ) .field("language_ids", &self.language_ids) - .field("reinstall_attempt_count", &self.reinstall_attempt_count) .finish_non_exhaustive() } } @@ -202,7 +203,6 @@ impl CachedLspAdapter { language_ids, adapter, cached_binary: Default::default(), - reinstall_attempt_count: AtomicU64::new(0), }) } @@ -308,7 +308,7 @@ pub trait LspAdapterDelegate: Send + Sync { ) -> Result>; async fn which(&self, command: &OsStr) -> Option; async fn shell_env(&self) -> HashMap; - async fn read_text_file(&self, path: PathBuf) -> Result; + async fn read_text_file(&self, path: &RelPath) -> Result; async fn try_exec(&self, binary: LanguageServerBinary) -> Result<()>; } @@ -463,17 +463,6 @@ pub trait LspAdapter: 'static + Send + Sync + DynLspInstaller { false } - /// Method only implemented by the default JSON language server adapter. - /// Used to clear the cache of JSON schemas that are used to provide - /// autocompletion and diagnostics in Zed settings and keybinds files. - /// Should not be called unless the callee is sure that - /// `Self::is_primary_zed_json_schema_adapter` returns `true` - async fn clear_zed_json_schema_cache(&self) { - unreachable!( - "Not implemented for this adapter. This method should only be called on the default JSON language server adapter" - ); - } - /// True for the extension adapter and false otherwise. fn is_extension(&self) -> bool { false @@ -760,6 +749,7 @@ pub struct LanguageConfig { pub hard_tabs: Option, /// How many columns a tab should occupy. #[serde(default)] + #[schemars(range(min = 1, max = 128))] pub tab_size: Option, /// How to soft-wrap long lines of text. #[serde(default)] @@ -781,9 +771,21 @@ pub struct LanguageConfig { /// A list of characters that Zed should treat as word characters for completion queries. #[serde(default)] pub completion_query_characters: HashSet, + /// A list of characters that Zed should treat as word characters for linked edit operations. + #[serde(default)] + pub linked_edit_characters: HashSet, /// A list of preferred debuggers for this language. #[serde(default)] pub debuggers: IndexSet, + /// A list of import namespace segments that aren't expected to appear in file paths. For + /// example, "super" and "crate" in Rust. + #[serde(default)] + pub ignored_import_segments: HashSet>, + /// Regular expression that matches substrings to omit from import paths, to make the paths more + /// similar to how they are specified when imported. For example, "/mod\.rs$" or "/__init__\.py$". + #[serde(default, deserialize_with = "deserialize_regex")] + #[schemars(schema_with = "regex_json_schema")] + pub import_path_strip_regex: Option, } #[derive(Clone, Debug, Deserialize, Default, JsonSchema)] @@ -853,6 +855,7 @@ pub struct BlockCommentConfig { /// A character to add as a prefix when a new line is added to a block comment. pub prefix: Arc, /// A indent to add for prefix and end line upon new line. + #[schemars(range(min = 1, max = 128))] pub tab_size: u32, } @@ -917,6 +920,8 @@ pub struct LanguageConfigOverride { #[serde(default)] pub completion_query_characters: Override>, #[serde(default)] + pub linked_edit_characters: Override>, + #[serde(default)] pub opt_into_language_servers: Vec, #[serde(default)] pub prefer_label_for_snippet: Option, @@ -975,7 +980,10 @@ impl Default for LanguageConfig { hidden: false, jsx_tag_auto_close: None, completion_query_characters: Default::default(), + linked_edit_characters: Default::default(), debuggers: Default::default(), + ignored_import_segments: Default::default(), + import_path_strip_regex: None, } } } @@ -1154,7 +1162,7 @@ pub struct Grammar { id: GrammarId, pub ts_language: tree_sitter::Language, pub(crate) error_query: Option, - pub(crate) highlights_query: Option, + pub highlights_config: Option, pub(crate) brackets_config: Option, pub(crate) redactions_config: Option, pub(crate) runnable_config: Option, @@ -1165,9 +1173,15 @@ pub struct Grammar { pub(crate) injection_config: Option, pub(crate) override_config: Option, pub(crate) debug_variables_config: Option, + pub(crate) imports_config: Option, pub(crate) highlight_map: Mutex, } +pub struct HighlightsConfig { + pub query: Query, + pub identifier_capture_indices: Vec, +} + struct IndentConfig { query: Query, indent_capture_ix: u32, @@ -1312,6 +1326,17 @@ pub struct DebugVariablesConfig { pub objects_by_capture_ix: Vec<(u32, DebuggerTextObject)>, } +pub struct ImportsConfig { + pub query: Query, + pub import_ix: u32, + pub name_ix: Option, + pub namespace_ix: Option, + pub source_ix: Option, + pub list_ix: Option, + pub wildcard_ix: Option, + pub alias_ix: Option, +} + impl Language { pub fn new(config: LanguageConfig, ts_language: Option) -> Self { Self::new_with_id(LanguageId::new(), config, ts_language) @@ -1332,7 +1357,7 @@ impl Language { grammar: ts_language.map(|ts_language| { Arc::new(Grammar { id: GrammarId::new(), - highlights_query: None, + highlights_config: None, brackets_config: None, outline_config: None, text_object_config: None, @@ -1344,6 +1369,7 @@ impl Language { runnable_config: None, error_query: Query::new(&ts_language, "(ERROR) @error").ok(), debug_variables_config: None, + imports_config: None, ts_language, highlight_map: Default::default(), }) @@ -1425,12 +1451,39 @@ impl Language { .with_debug_variables_query(query.as_ref()) .context("Error loading debug variables query")?; } + if let Some(query) = queries.imports { + self = self + .with_imports_query(query.as_ref()) + .context("Error loading imports query")?; + } Ok(self) } pub fn with_highlights_query(mut self, source: &str) -> Result { let grammar = self.grammar_mut()?; - grammar.highlights_query = Some(Query::new(&grammar.ts_language, source)?); + let query = Query::new(&grammar.ts_language, source)?; + + let mut identifier_capture_indices = Vec::new(); + for name in [ + "variable", + "constant", + "constructor", + "function", + "function.method", + "function.method.call", + "function.special", + "property", + "type", + "type.interface", + ] { + identifier_capture_indices.extend(query.capture_index_for_name(name)); + } + + grammar.highlights_config = Some(HighlightsConfig { + query, + identifier_capture_indices, + }); + Ok(self) } @@ -1571,6 +1624,45 @@ impl Language { Ok(self) } + pub fn with_imports_query(mut self, source: &str) -> Result { + let query = Query::new(&self.expect_grammar()?.ts_language, source)?; + + let mut import_ix = 0; + let mut name_ix = None; + let mut namespace_ix = None; + let mut source_ix = None; + let mut list_ix = None; + let mut wildcard_ix = None; + let mut alias_ix = None; + if populate_capture_indices( + &query, + &self.config.name, + "imports", + &[], + &mut [ + Capture::Required("import", &mut import_ix), + Capture::Optional("name", &mut name_ix), + Capture::Optional("namespace", &mut namespace_ix), + Capture::Optional("source", &mut source_ix), + Capture::Optional("list", &mut list_ix), + Capture::Optional("wildcard", &mut wildcard_ix), + Capture::Optional("alias", &mut alias_ix), + ], + ) { + self.grammar_mut()?.imports_config = Some(ImportsConfig { + query, + import_ix, + name_ix, + namespace_ix, + source_ix, + list_ix, + wildcard_ix, + alias_ix, + }); + } + return Ok(self); + } + pub fn with_brackets_query(mut self, source: &str) -> Result { let query = Query::new(&self.expect_grammar()?.ts_language, source)?; let mut open_capture_ix = 0; @@ -1856,7 +1948,10 @@ impl Language { let tree = grammar.parse_text(text, None); let captures = SyntaxSnapshot::single_tree_captures(range.clone(), text, &tree, self, |grammar| { - grammar.highlights_query.as_ref() + grammar + .highlights_config + .as_ref() + .map(|config| &config.query) }); let highlight_maps = vec![grammar.highlight_map()]; let mut offset = 0; @@ -1885,10 +1980,10 @@ impl Language { pub fn set_theme(&self, theme: &SyntaxTheme) { if let Some(grammar) = self.grammar.as_ref() - && let Some(highlights_query) = &grammar.highlights_query + && let Some(highlights_config) = &grammar.highlights_config { *grammar.highlight_map.lock() = - HighlightMap::new(highlights_query.capture_names(), theme); + HighlightMap::new(highlights_config.query.capture_names(), theme); } } @@ -1982,6 +2077,15 @@ impl LanguageScope { ) } + /// Returns a list of language-specific characters that are considered part of + /// identifiers during linked editing operations. + pub fn linked_edit_characters(&self) -> Option<&HashSet> { + Override::as_option( + self.config_override().map(|o| &o.linked_edit_characters), + Some(&self.language.config.linked_edit_characters), + ) + } + /// Returns whether to prefer snippet `label` over `new_text` to replace text when /// completion is accepted. /// @@ -2103,8 +2207,9 @@ impl Grammar { pub fn highlight_id_for_name(&self, name: &str) -> Option { let capture_id = self - .highlights_query + .highlights_config .as_ref()? + .query .capture_index_for_name(name)?; Some(self.highlight_map.lock().get(capture_id)) } @@ -2112,6 +2217,10 @@ impl Grammar { pub fn debug_variables_config(&self) -> Option<&DebugVariablesConfig> { self.debug_variables_config.as_ref() } + + pub fn imports_config(&self) -> Option<&ImportsConfig> { + self.imports_config.as_ref() + } } impl CodeLabel { diff --git a/crates/language/src/language_registry.rs b/crates/language/src/language_registry.rs index 5d9d5529c145a8769d142a1f943b6ae00aeaaeb8..022eb89e6d2b378b8c4305c81887060d776bb411 100644 --- a/crates/language/src/language_registry.rs +++ b/crates/language/src/language_registry.rs @@ -1,14 +1,11 @@ use crate::{ CachedLspAdapter, File, Language, LanguageConfig, LanguageId, LanguageMatcher, LanguageServerName, LspAdapter, ManifestName, PLAIN_TEXT, ToolchainLister, - language_settings::{ - AllLanguageSettingsContent, LanguageSettingsContent, all_language_settings, - }, - task_context::ContextProvider, - with_parser, + language_settings::all_language_settings, task_context::ContextProvider, with_parser, }; use anyhow::{Context as _, Result, anyhow}; use collections::{FxHashMap, HashMap, HashSet, hash_map}; +use settings::{AllLanguageSettingsContent, LanguageSettingsContent}; use futures::{ Future, @@ -232,6 +229,7 @@ pub const QUERY_FILENAME_PREFIXES: &[( ("runnables", |q| &mut q.runnables), ("debugger", |q| &mut q.debugger), ("textobjects", |q| &mut q.text_objects), + ("imports", |q| &mut q.imports), ]; /// Tree-sitter language queries for a given language. @@ -248,6 +246,7 @@ pub struct LanguageQueries { pub runnables: Option>, pub text_objects: Option>, pub debugger: Option>, + pub imports: Option>, } #[derive(Clone, Default)] @@ -649,6 +648,24 @@ impl LanguageRegistry { async move { rx.await? } } + pub async fn language_for_id(self: &Arc, id: LanguageId) -> Result> { + let available_language = { + let state = self.state.read(); + + let Some(available_language) = state + .available_languages + .iter() + .find(|lang| lang.id == id) + .cloned() + else { + anyhow::bail!(LanguageNotFound); + }; + available_language + }; + + self.load_language(&available_language).await? + } + pub fn language_name_for_extension(self: &Arc, extension: &str) -> Option { self.state.try_read().and_then(|state| { state @@ -716,15 +733,19 @@ impl LanguageRegistry { ) } - pub fn language_for_file_path<'a>( + pub fn language_for_file_path(self: &Arc, path: &Path) -> Option { + self.language_for_file_internal(path, None, None) + } + + pub fn load_language_for_file_path<'a>( self: &Arc, path: &'a Path, ) -> impl Future>> + 'a { - let available_language = self.language_for_file_internal(path, None, None); + let language = self.language_for_file_path(path); let this = self.clone(); async move { - if let Some(language) = available_language { + if let Some(language) = language { this.load_language(&language).await? } else { Err(anyhow!(LanguageNotFound)) @@ -738,7 +759,7 @@ impl LanguageRegistry { content: Option<&Rope>, user_file_types: Option<&FxHashMap, GlobSet>>, ) -> Option { - let filename = path.file_name().and_then(|name| name.to_str()); + let filename = path.file_name().and_then(|filename| filename.to_str()); // `Path.extension()` returns None for files with a leading '.' // and no other extension which is not the desired behavior here, // as we want `.zshrc` to result in extension being `Some("zshrc")` @@ -1175,7 +1196,7 @@ impl LanguageRegistryState { language.set_theme(theme.syntax()); } self.language_settings.languages.0.insert( - language.name(), + language.name().0, LanguageSettingsContent { tab_size: language.config.tab_size, hard_tabs: language.config.hard_tabs, diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index af9e6edbfa4ed2ef44d7a5789069a83b7db829c7..689a3f90f5a1d8826cd68ccc26bc7427c0aab29d 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -1,7 +1,6 @@ //! Provides `language`-related settings. use crate::{File, Language, LanguageName, LanguageServerName}; -use anyhow::Result; use collections::{FxHashMap, HashMap, HashSet}; use ec4rs::{ Properties as EditorconfigProperties, @@ -10,20 +9,15 @@ use ec4rs::{ use globset::{Glob, GlobMatcher, GlobSet, GlobSetBuilder}; use gpui::{App, Modifiers, SharedString}; use itertools::{Either, Itertools}; -use schemars::{JsonSchema, json_schema}; -use serde::{ - Deserialize, Deserializer, Serialize, - de::{self, IntoDeserializer, MapAccess, SeqAccess, Visitor}, -}; -use settings::{ - ParameterizedJsonSchema, Settings, SettingsKey, SettingsLocation, SettingsSources, - SettingsStore, SettingsUi, +pub use settings::{ + CompletionSettingsContent, EditPredictionProvider, EditPredictionsMode, FormatOnSave, + Formatter, FormatterList, InlayHintKind, LanguageSettingsContent, LspInsertMode, + RewrapBehavior, SelectedFormatter, ShowWhitespaceSetting, SoftWrap, WordsCompletionMode, }; +use settings::{ExtendingVec, Settings, SettingsContent, SettingsLocation, SettingsStore}; use shellexpand; -use std::{borrow::Cow, num::NonZeroU32, path::Path, slice, sync::Arc}; -use util::schemars::replace_subschema; -use util::serde::default_true; +use std::{borrow::Cow, num::NonZeroU32, path::Path, sync::Arc}; /// Initializes the language settings. pub fn init(cx: &mut App) { @@ -65,8 +59,14 @@ pub struct AllLanguageSettings { pub(crate) file_types: FxHashMap, GlobSet>, } +#[derive(Debug, Clone)] +pub struct WhitespaceMap { + pub space: SharedString, + pub tab: SharedString, +} + /// The settings for a particular language. -#[derive(Debug, Clone, Deserialize)] +#[derive(Debug, Clone)] pub struct LanguageSettings { /// How many columns a tab should occupy. pub tab_size: NonZeroU32, @@ -74,7 +74,7 @@ pub struct LanguageSettings { /// spaces. pub hard_tabs: bool, /// How to soft-wrap long lines of text. - pub soft_wrap: SoftWrap, + pub soft_wrap: settings::SoftWrap, /// The column at which to soft-wrap lines, for buffers where soft-wrap /// is enabled. pub preferred_line_length: u32, @@ -96,11 +96,11 @@ pub struct LanguageSettings { /// when saving it. pub ensure_final_newline_on_save: bool, /// How to perform a buffer format. - pub formatter: SelectedFormatter, + pub formatter: settings::SelectedFormatter, /// Zed's Prettier integration settings. pub prettier: PrettierSettings, /// Whether to automatically close JSX tags. - pub jsx_tag_auto_close: JsxTagAutoCloseSettings, + pub jsx_tag_auto_close: bool, /// Whether to use language servers to provide code intelligence. pub enable_language_server: bool, /// The list of language servers to use (or disable) for this language. @@ -122,7 +122,7 @@ pub struct LanguageSettings { /// scopes. pub edit_predictions_disabled_in: Vec, /// Whether to show tabs and spaces in the editor. - pub show_whitespaces: ShowWhitespaceSetting, + pub show_whitespaces: settings::ShowWhitespaceSetting, /// Visible characters used to render whitespace when show_whitespaces is enabled. pub whitespace_map: WhitespaceMap, /// Whether to start a new line with a comment when a previous line is a comment as well. @@ -142,12 +142,10 @@ pub struct LanguageSettings { pub auto_indent_on_paste: bool, /// Controls how the editor handles the autoclosed characters. pub always_treat_brackets_as_autoclosed: bool, - /// Which code actions to run on save - pub code_actions_on_format: HashMap, /// Whether to perform linked edits pub linked_edits: bool, /// Task configuration for this language. - pub tasks: LanguageTaskConfig, + pub tasks: LanguageTaskSettings, /// Whether to pop the completions menu while typing in an editor without /// explicitly requesting it. pub show_completions_on_input: bool, @@ -160,965 +158,164 @@ pub struct LanguageSettings { pub debuggers: Vec, } -impl LanguageSettings { - /// A token representing the rest of the available language servers. - const REST_OF_LANGUAGE_SERVERS: &'static str = "..."; - - /// Returns the customized list of language servers from the list of - /// available language servers. - pub fn customized_language_servers( - &self, - available_language_servers: &[LanguageServerName], - ) -> Vec { - Self::resolve_language_servers(&self.language_servers, available_language_servers) - } - - pub(crate) fn resolve_language_servers( - configured_language_servers: &[String], - available_language_servers: &[LanguageServerName], - ) -> Vec { - let (disabled_language_servers, enabled_language_servers): ( - Vec, - Vec, - ) = configured_language_servers.iter().partition_map( - |language_server| match language_server.strip_prefix('!') { - Some(disabled) => Either::Left(LanguageServerName(disabled.to_string().into())), - None => Either::Right(LanguageServerName(language_server.clone().into())), - }, - ); - - let rest = available_language_servers - .iter() - .filter(|&available_language_server| { - !disabled_language_servers.contains(available_language_server) - && !enabled_language_servers.contains(available_language_server) - }) - .cloned() - .collect::>(); - - enabled_language_servers - .into_iter() - .flat_map(|language_server| { - if language_server.0.as_ref() == Self::REST_OF_LANGUAGE_SERVERS { - rest.clone() - } else { - vec![language_server] - } - }) - .collect::>() - } -} - -/// The provider that supplies edit predictions. -#[derive( - Copy, Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, JsonSchema, SettingsUi, -)] -#[serde(rename_all = "snake_case")] -pub enum EditPredictionProvider { - None, - #[default] - Copilot, - Supermaven, - Zed, -} - -impl EditPredictionProvider { - pub fn is_zed(&self) -> bool { - match self { - EditPredictionProvider::Zed => true, - EditPredictionProvider::None - | EditPredictionProvider::Copilot - | EditPredictionProvider::Supermaven => false, - } - } -} - -/// The settings for edit predictions, such as [GitHub Copilot](https://github.com/features/copilot) -/// or [Supermaven](https://supermaven.com). -#[derive(Clone, Debug, Default, SettingsUi)] -pub struct EditPredictionSettings { - /// The provider that supplies edit predictions. - pub provider: EditPredictionProvider, - /// A list of globs representing files that edit predictions should be disabled for. - /// This list adds to a pre-existing, sensible default set of globs. - /// Any additional ones you add are combined with them. - #[settings_ui(skip)] - pub disabled_globs: Vec, - /// Configures how edit predictions are displayed in the buffer. - pub mode: EditPredictionsMode, - /// Settings specific to GitHub Copilot. - pub copilot: CopilotSettings, - /// Whether edit predictions are enabled in the assistant panel. - /// This setting has no effect if globally disabled. - pub enabled_in_text_threads: bool, -} - -impl EditPredictionSettings { - /// Returns whether edit predictions are enabled for the given path. - pub fn enabled_for_file(&self, file: &Arc, cx: &App) -> bool { - !self.disabled_globs.iter().any(|glob| { - if glob.is_absolute { - file.as_local() - .is_some_and(|local| glob.matcher.is_match(local.abs_path(cx))) - } else { - glob.matcher.is_match(file.path()) - } - }) - } -} - -#[derive(Clone, Debug)] -pub struct DisabledGlob { - matcher: GlobMatcher, - is_absolute: bool, -} - -/// The mode in which edit predictions should be displayed. -#[derive( - Copy, Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, JsonSchema, SettingsUi, -)] -#[serde(rename_all = "snake_case")] -pub enum EditPredictionsMode { - /// If provider supports it, display inline when holding modifier key (e.g., alt). - /// Otherwise, eager preview is used. - #[serde(alias = "auto")] - Subtle, - /// Display inline when there are no language server completions available. - #[default] - #[serde(alias = "eager_preview")] - Eager, -} - -#[derive(Clone, Debug, Default, SettingsUi)] -pub struct CopilotSettings { - /// HTTP/HTTPS proxy to use for Copilot. - #[settings_ui(skip)] - pub proxy: Option, - /// Disable certificate verification for proxy (not recommended). - pub proxy_no_verify: Option, - /// Enterprise URI for Copilot. - #[settings_ui(skip)] - pub enterprise_uri: Option, -} - -/// The settings for all languages. -#[derive( - Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey, -)] -#[settings_key(None)] -#[settings_ui(group = "Default Language Settings")] -pub struct AllLanguageSettingsContent { - /// The settings for enabling/disabling features. - #[serde(default)] - pub features: Option, - /// The edit prediction settings. - #[serde(default)] - pub edit_predictions: Option, - /// The default language settings. - #[serde(flatten)] - pub defaults: LanguageSettingsContent, - /// The settings for individual languages. - #[serde(default)] - pub languages: LanguageToSettingsMap, - /// Settings for associating file extensions and filenames - /// with languages. - #[serde(default)] - #[settings_ui(skip)] - pub file_types: HashMap, Vec>, -} - -/// Map from language name to settings. Its `ParameterizedJsonSchema` allows only known language -/// names in the keys. -#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct LanguageToSettingsMap(pub HashMap); - -impl SettingsUi for LanguageToSettingsMap { - fn settings_ui_item() -> settings::SettingsUiItem { - settings::SettingsUiItem::DynamicMap(settings::SettingsUiItemDynamicMap { - item: LanguageSettingsContent::settings_ui_item, - defaults_path: &[], - determine_items: |settings_value, cx| { - use settings::SettingsUiEntryMetaData; - - // todo(settings_ui): We should be using a global LanguageRegistry, but it's not implemented yet - _ = cx; - - let Some(settings_language_map) = settings_value.as_object() else { - return Vec::new(); - }; - let mut languages = Vec::with_capacity(settings_language_map.len()); - - for language_name in settings_language_map.keys().map(gpui::SharedString::from) { - languages.push(SettingsUiEntryMetaData { - title: language_name.clone(), - path: language_name, - // todo(settings_ui): Implement documentation for each language - // ideally based on the language's official docs from extension or builtin info - documentation: None, - }); - } - return languages; - }, - }) - } -} - -inventory::submit! { - ParameterizedJsonSchema { - add_and_get_ref: |generator, params, _cx| { - let language_settings_content_ref = generator - .subschema_for::() - .to_value(); - replace_subschema::(generator, || json_schema!({ - "type": "object", - "properties": params - .language_names - .iter() - .map(|name| { - ( - name.clone(), - language_settings_content_ref.clone(), - ) - }) - .collect::>() - })) - } - } -} - -/// Controls how completions are processed for this language. -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, SettingsUi)] -#[serde(rename_all = "snake_case")] +#[derive(Debug, Clone)] pub struct CompletionSettings { /// Controls how words are completed. /// For large documents, not all words may be fetched for completion. /// /// Default: `fallback` - #[serde(default = "default_words_completion_mode")] pub words: WordsCompletionMode, /// How many characters has to be in the completions query to automatically show the words-based completions. /// Before that value, it's still possible to trigger the words-based completion manually with the corresponding editor command. /// /// Default: 3 - #[serde(default = "default_3")] pub words_min_length: usize, /// Whether to fetch LSP completions or not. /// /// Default: true - #[serde(default = "default_true")] pub lsp: bool, /// When fetching LSP completions, determines how long to wait for a response of a particular server. /// When set to 0, waits indefinitely. /// /// Default: 0 - #[serde(default)] pub lsp_fetch_timeout_ms: u64, /// Controls how LSP completions are inserted. /// /// Default: "replace_suffix" - #[serde(default = "default_lsp_insert_mode")] pub lsp_insert_mode: LspInsertMode, } -/// Controls how document's words are completed. -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum WordsCompletionMode { - /// Always fetch document's words for completions along with LSP completions. - Enabled, - /// Only if LSP response errors or times out, - /// use document's words to show completions. - Fallback, - /// Never fetch or complete document's words for completions. - /// (Word-based completions can still be queried via a separate action) - Disabled, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum LspInsertMode { - /// Replaces text before the cursor, using the `insert` range described in the LSP specification. - Insert, - /// Replaces text before and after the cursor, using the `replace` range described in the LSP specification. - Replace, - /// Behaves like `"replace"` if the text that would be replaced is a subsequence of the completion text, - /// and like `"insert"` otherwise. - ReplaceSubsequence, - /// Behaves like `"replace"` if the text after the cursor is a suffix of the completion, and like - /// `"insert"` otherwise. - ReplaceSuffix, -} - -fn default_words_completion_mode() -> WordsCompletionMode { - WordsCompletionMode::Fallback -} - -fn default_lsp_insert_mode() -> LspInsertMode { - LspInsertMode::ReplaceSuffix -} - -fn default_3() -> usize { - 3 -} - -/// The settings for a particular language. -#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, SettingsUi)] -#[settings_ui(group = "Default")] -pub struct LanguageSettingsContent { - /// How many columns a tab should occupy. - /// - /// Default: 4 - #[serde(default)] - #[settings_ui(skip)] - pub tab_size: Option, - /// Whether to indent lines using tab characters, as opposed to multiple - /// spaces. - /// - /// Default: false - #[serde(default)] - pub hard_tabs: Option, - /// How to soft-wrap long lines of text. - /// - /// Default: none - #[serde(default)] - pub soft_wrap: Option, - /// The column at which to soft-wrap lines, for buffers where soft-wrap - /// is enabled. - /// - /// Default: 80 - #[serde(default)] - pub preferred_line_length: Option, - /// Whether to show wrap guides in the editor. Setting this to true will - /// show a guide at the 'preferred_line_length' value if softwrap is set to - /// 'preferred_line_length', and will show any additional guides as specified - /// by the 'wrap_guides' setting. - /// - /// Default: true - #[serde(default)] - pub show_wrap_guides: Option, - /// Character counts at which to show wrap guides in the editor. - /// - /// Default: [] - #[serde(default)] - #[settings_ui(skip)] - pub wrap_guides: Option>, - /// Indent guide related settings. - #[serde(default)] - pub indent_guides: Option, - /// Whether or not to perform a buffer format before saving. - /// - /// Default: on - #[serde(default)] - pub format_on_save: Option, - /// Whether or not to remove any trailing whitespace from lines of a buffer - /// before saving it. - /// - /// Default: true - #[serde(default)] - pub remove_trailing_whitespace_on_save: Option, - /// Whether or not to ensure there's a single newline at the end of a buffer - /// when saving it. - /// - /// Default: true - #[serde(default)] - pub ensure_final_newline_on_save: Option, - /// How to perform a buffer format. - /// - /// Default: auto - #[serde(default)] - #[settings_ui(skip)] - pub formatter: Option, - /// Zed's Prettier integration settings. - /// Allows to enable/disable formatting with Prettier - /// and configure default Prettier, used when no project-level Prettier installation is found. - /// - /// Default: off - #[serde(default)] - pub prettier: Option, - /// Whether to automatically close JSX tags. - #[serde(default)] - pub jsx_tag_auto_close: Option, - /// Whether to use language servers to provide code intelligence. - /// - /// Default: true - #[serde(default)] - pub enable_language_server: Option, - /// The list of language servers to use (or disable) for this language. - /// - /// This array should consist of language server IDs, as well as the following - /// special tokens: - /// - `"!"` - A language server ID prefixed with a `!` will be disabled. - /// - `"..."` - A placeholder to refer to the **rest** of the registered language servers for this language. - /// - /// Default: ["..."] - #[serde(default)] - #[settings_ui(skip)] - pub language_servers: Option>, - /// Controls where the `editor::Rewrap` action is allowed for this language. - /// - /// Note: This setting has no effect in Vim mode, as rewrap is already - /// allowed everywhere. - /// - /// Default: "in_comments" - #[serde(default)] - pub allow_rewrap: Option, - /// Controls whether edit predictions are shown immediately (true) - /// or manually by triggering `editor::ShowEditPrediction` (false). - /// - /// Default: true - #[serde(default)] - pub show_edit_predictions: Option, - /// Controls whether edit predictions are shown in the given language - /// scopes. - /// - /// Example: ["string", "comment"] - /// - /// Default: [] - #[serde(default)] - #[settings_ui(skip)] - pub edit_predictions_disabled_in: Option>, - /// Whether to show tabs and spaces in the editor. - #[serde(default)] - pub show_whitespaces: Option, - /// Visible characters used to render whitespace when show_whitespaces is enabled. - /// - /// Default: "•" for spaces, "→" for tabs. - #[serde(default)] - pub whitespace_map: Option, - /// Whether to start a new line with a comment when a previous line is a comment as well. - /// - /// Default: true - #[serde(default)] - pub extend_comment_on_newline: Option, - /// Inlay hint related settings. - #[serde(default)] - pub inlay_hints: Option, - /// Whether to automatically type closing characters for you. For example, - /// when you type (, Zed will automatically add a closing ) at the correct position. - /// - /// Default: true - pub use_autoclose: Option, - /// Whether to automatically surround text with characters for you. For example, - /// when you select text and type (, Zed will automatically surround text with (). - /// - /// Default: true - pub use_auto_surround: Option, - /// Controls how the editor handles the autoclosed characters. - /// When set to `false`(default), skipping over and auto-removing of the closing characters - /// happen only for auto-inserted characters. - /// Otherwise(when `true`), the closing characters are always skipped over and auto-removed - /// no matter how they were inserted. - /// - /// Default: false - pub always_treat_brackets_as_autoclosed: Option, - /// Whether to use additional LSP queries to format (and amend) the code after - /// every "trigger" symbol input, defined by LSP server capabilities. - /// - /// Default: true - pub use_on_type_format: Option, - /// Which code actions to run on save after the formatter. - /// These are not run if formatting is off. - /// - /// Default: {} (or {"source.organizeImports": true} for Go). - #[settings_ui(skip)] - pub code_actions_on_format: Option>, - /// Whether to perform linked edits of associated ranges, if the language server supports it. - /// For example, when editing opening tag, the contents of the closing tag will be edited as well. - /// - /// Default: true - pub linked_edits: Option, - /// Whether indentation should be adjusted based on the context whilst typing. - /// - /// Default: true - pub auto_indent: Option, - /// Whether indentation of pasted content should be adjusted based on the context. - /// - /// Default: true - pub auto_indent_on_paste: Option, - /// Task configuration for this language. - /// - /// Default: {} - pub tasks: Option, - /// Whether to pop the completions menu while typing in an editor without - /// explicitly requesting it. - /// - /// Default: true - pub show_completions_on_input: Option, - /// Whether to display inline and alongside documentation for items in the - /// completions menu. - /// - /// Default: true - pub show_completion_documentation: Option, - /// Controls how completions are processed for this language. - pub completions: Option, - /// Preferred debuggers for this language. - /// - /// Default: [] - #[settings_ui(skip)] - pub debuggers: Option>, -} - -/// The behavior of `editor::Rewrap`. -#[derive( - Debug, PartialEq, Clone, Copy, Default, Serialize, Deserialize, JsonSchema, SettingsUi, -)] -#[serde(rename_all = "snake_case")] -pub enum RewrapBehavior { - /// Only rewrap within comments. - #[default] - InComments, - /// Only rewrap within the current selection(s). - InSelections, - /// Allow rewrapping anywhere. - Anywhere, -} - -/// The contents of the edit prediction settings. -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, SettingsUi)] -pub struct EditPredictionSettingsContent { - /// A list of globs representing files that edit predictions should be disabled for. - /// This list adds to a pre-existing, sensible default set of globs. - /// Any additional ones you add are combined with them. - #[serde(default)] - #[settings_ui(skip)] - pub disabled_globs: Option>, - /// The mode used to display edit predictions in the buffer. - /// Provider support required. - #[serde(default)] - pub mode: EditPredictionsMode, - /// Settings specific to GitHub Copilot. - #[serde(default)] - pub copilot: CopilotSettingsContent, - /// Whether edit predictions are enabled in the assistant prompt editor. - /// This has no effect if globally disabled. - #[serde(default = "default_true")] - pub enabled_in_text_threads: bool, -} - -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, SettingsUi)] -pub struct CopilotSettingsContent { - /// HTTP/HTTPS proxy to use for Copilot. - /// - /// Default: none - #[serde(default)] - #[settings_ui(skip)] - pub proxy: Option, - /// Disable certificate verification for the proxy (not recommended). - /// - /// Default: false - #[serde(default)] - pub proxy_no_verify: Option, - /// Enterprise URI for Copilot. - /// - /// Default: none - #[serde(default)] - #[settings_ui(skip)] - pub enterprise_uri: Option, -} - -/// The settings for enabling/disabling features. -#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, SettingsUi)] -#[serde(rename_all = "snake_case")] -#[settings_ui(group = "Features")] -pub struct FeaturesContent { - /// Determines which edit prediction provider to use. - pub edit_prediction_provider: Option, -} - -/// Controls the soft-wrapping behavior in the editor. -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, SettingsUi)] -#[serde(rename_all = "snake_case")] -pub enum SoftWrap { - /// Prefer a single line generally, unless an overly long line is encountered. - None, - /// Deprecated: use None instead. Left to avoid breaking existing users' configs. - /// Prefer a single line generally, unless an overly long line is encountered. - PreferLine, - /// Soft wrap lines that exceed the editor width. - EditorWidth, - /// Soft wrap lines at the preferred line length. - PreferredLineLength, - /// Soft wrap line at the preferred line length or the editor width (whichever is smaller). - Bounded, -} - -/// Controls the behavior of formatting files when they are saved. -#[derive(Debug, Clone, PartialEq, Eq, SettingsUi)] -pub enum FormatOnSave { - /// Files should be formatted on save. - On, - /// Files should not be formatted on save. - Off, - List(FormatterList), -} - -impl JsonSchema for FormatOnSave { - fn schema_name() -> Cow<'static, str> { - "OnSaveFormatter".into() - } - - fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema { - let formatter_schema = Formatter::json_schema(generator); - - json_schema!({ - "oneOf": [ - { - "type": "array", - "items": formatter_schema - }, - { - "type": "string", - "enum": ["on", "off", "language_server"] - }, - formatter_schema - ] - }) - } -} - -impl Serialize for FormatOnSave { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - match self { - Self::On => serializer.serialize_str("on"), - Self::Off => serializer.serialize_str("off"), - Self::List(list) => list.serialize(serializer), - } - } -} - -impl<'de> Deserialize<'de> for FormatOnSave { - fn deserialize(deserializer: D) -> std::result::Result - where - D: Deserializer<'de>, - { - struct FormatDeserializer; - - impl<'d> Visitor<'d> for FormatDeserializer { - type Value = FormatOnSave; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str("a valid on-save formatter kind") - } - fn visit_str(self, v: &str) -> std::result::Result - where - E: serde::de::Error, - { - if v == "on" { - Ok(Self::Value::On) - } else if v == "off" { - Ok(Self::Value::Off) - } else if v == "language_server" { - Ok(Self::Value::List(FormatterList::Single( - Formatter::LanguageServer { name: None }, - ))) - } else { - let ret: Result = - Deserialize::deserialize(v.into_deserializer()); - ret.map(Self::Value::List) - } - } - fn visit_map
(self, map: A) -> Result - where - A: MapAccess<'d>, - { - let ret: Result = - Deserialize::deserialize(de::value::MapAccessDeserializer::new(map)); - ret.map(Self::Value::List) - } - fn visit_seq(self, map: A) -> Result - where - A: SeqAccess<'d>, - { - let ret: Result = - Deserialize::deserialize(de::value::SeqAccessDeserializer::new(map)); - ret.map(Self::Value::List) - } - } - deserializer.deserialize_any(FormatDeserializer) - } -} - -/// Controls how whitespace should be displayedin the editor. -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, SettingsUi)] -#[serde(rename_all = "snake_case")] -pub enum ShowWhitespaceSetting { - /// Draw whitespace only for the selected text. - Selection, - /// Do not draw any tabs or spaces. - None, - /// Draw all invisible symbols. - All, - /// Draw whitespaces at boundaries only. - /// - /// For a whitespace to be on a boundary, any of the following conditions need to be met: - /// - It is a tab - /// - It is adjacent to an edge (start or end) - /// - It is adjacent to a whitespace (left or right) - Boundary, - /// Draw whitespaces only after non-whitespace characters. - Trailing, -} - -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, SettingsUi)] -pub struct WhitespaceMap { - #[serde(default)] - pub space: Option, - #[serde(default)] - pub tab: Option, -} - -impl WhitespaceMap { - pub fn space(&self) -> SharedString { - self.space - .as_ref() - .map_or_else(|| SharedString::from("•"), |s| SharedString::from(s)) - } - - pub fn tab(&self) -> SharedString { - self.tab - .as_ref() - .map_or_else(|| SharedString::from("→"), |s| SharedString::from(s)) - } -} - -/// Controls which formatter should be used when formatting code. -#[derive(Clone, Debug, Default, PartialEq, Eq, SettingsUi)] -pub enum SelectedFormatter { - /// Format files using Zed's Prettier integration (if applicable), - /// or falling back to formatting via language server. - #[default] - Auto, - List(FormatterList), -} - -impl JsonSchema for SelectedFormatter { - fn schema_name() -> Cow<'static, str> { - "Formatter".into() - } - - fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema { - let formatter_schema = Formatter::json_schema(generator); - - json_schema!({ - "oneOf": [ - { - "type": "array", - "items": formatter_schema - }, - { - "type": "string", - "enum": ["auto", "language_server"] - }, - formatter_schema - ] - }) - } -} - -impl Serialize for SelectedFormatter { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - match self { - SelectedFormatter::Auto => serializer.serialize_str("auto"), - SelectedFormatter::List(list) => list.serialize(serializer), - } - } -} - -impl<'de> Deserialize<'de> for SelectedFormatter { - fn deserialize(deserializer: D) -> std::result::Result - where - D: Deserializer<'de>, - { - struct FormatDeserializer; - - impl<'d> Visitor<'d> for FormatDeserializer { - type Value = SelectedFormatter; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str("a valid formatter kind") - } - fn visit_str(self, v: &str) -> std::result::Result - where - E: serde::de::Error, - { - if v == "auto" { - Ok(Self::Value::Auto) - } else if v == "language_server" { - Ok(Self::Value::List(FormatterList::Single( - Formatter::LanguageServer { name: None }, - ))) - } else { - let ret: Result = - Deserialize::deserialize(v.into_deserializer()); - ret.map(SelectedFormatter::List) - } - } - fn visit_map(self, map: A) -> Result - where - A: MapAccess<'d>, - { - let ret: Result = - Deserialize::deserialize(de::value::MapAccessDeserializer::new(map)); - ret.map(SelectedFormatter::List) - } - fn visit_seq(self, map: A) -> Result - where - A: SeqAccess<'d>, - { - let ret: Result = - Deserialize::deserialize(de::value::SeqAccessDeserializer::new(map)); - ret.map(SelectedFormatter::List) - } - } - deserializer.deserialize_any(FormatDeserializer) - } -} - -/// Controls which formatters should be used when formatting code. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, SettingsUi)] -#[serde(untagged)] -pub enum FormatterList { - Single(Formatter), - Vec(#[settings_ui(skip)] Vec), -} - -impl Default for FormatterList { - fn default() -> Self { - Self::Single(Formatter::default()) - } -} - -impl AsRef<[Formatter]> for FormatterList { - fn as_ref(&self) -> &[Formatter] { - match &self { - Self::Single(single) => slice::from_ref(single), - Self::Vec(v) => v, - } - } -} - -/// Controls which formatter should be used when formatting code. If there are multiple formatters, they are executed in the order of declaration. -#[derive(Clone, Default, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, SettingsUi)] -#[serde(rename_all = "snake_case")] -pub enum Formatter { - /// Format code using the current language server. - LanguageServer { - #[settings_ui(skip)] - name: Option, - }, - /// Format code using Zed's Prettier integration. - #[default] - Prettier, - /// Format code using an external command. - External { - /// The external program to run. - #[settings_ui(skip)] - command: Arc, - /// The arguments to pass to the program. - #[settings_ui(skip)] - arguments: Option>, - }, - /// Files should be formatted using code actions executed by language servers. - CodeActions(#[settings_ui(skip)] HashMap), -} - /// The settings for indent guides. -#[derive( - Default, Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, SettingsUi, -)] +#[derive(Debug, Clone, PartialEq)] pub struct IndentGuideSettings { /// Whether to display indent guides in the editor. /// /// Default: true - #[serde(default = "default_true")] pub enabled: bool, /// The width of the indent guides in pixels, between 1 and 10. /// /// Default: 1 - #[serde(default = "line_width")] pub line_width: u32, /// The width of the active indent guide in pixels, between 1 and 10. /// /// Default: 1 - #[serde(default = "active_line_width")] pub active_line_width: u32, /// Determines how indent guides are colored. /// /// Default: Fixed - #[serde(default)] - pub coloring: IndentGuideColoring, + pub coloring: settings::IndentGuideColoring, /// Determines how indent guide backgrounds are colored. /// /// Default: Disabled - #[serde(default)] - pub background_coloring: IndentGuideBackgroundColoring, + pub background_coloring: settings::IndentGuideBackgroundColoring, } -fn line_width() -> u32 { - 1 -} +#[derive(Debug, Clone)] +pub struct LanguageTaskSettings { + /// Extra task variables to set for a particular language. + pub variables: HashMap, + pub enabled: bool, + /// Use LSP tasks over Zed language extension ones. + /// If no LSP tasks are returned due to error/timeout or regular execution, + /// Zed language extension tasks will be used instead. + /// + /// Other Zed tasks will still be shown: + /// * Zed task from either of the task config file + /// * Zed task from history (e.g. one-off task was spawned before) + pub prefer_lsp: bool, +} + +/// Allows to enable/disable formatting with Prettier +/// and configure default Prettier, used when no project-level Prettier installation is found. +/// Prettier formatting is disabled by default. +#[derive(Debug, Clone)] +pub struct PrettierSettings { + /// Enables or disables formatting with Prettier for a given language. + pub allowed: bool, + + /// Forces Prettier integration to use a specific parser name when formatting files with the language. + pub parser: Option, -fn active_line_width() -> u32 { - line_width() -} + /// Forces Prettier integration to use specific plugins when formatting files with the language. + /// The default Prettier will be installed with these plugins. + pub plugins: HashSet, -/// Determines how indent guides are colored. -#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum IndentGuideColoring { - /// Do not render any lines for indent guides. - Disabled, - /// Use the same color for all indentation levels. - #[default] - Fixed, - /// Use a different color for each indentation level. - IndentAware, + /// Default Prettier options, in the format as in package.json section for Prettier. + /// If project installs Prettier via its package.json, these options will be ignored. + pub options: HashMap, } -/// Determines how indent guide backgrounds are colored. -#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum IndentGuideBackgroundColoring { - /// Do not render any background for indent guides. - #[default] - Disabled, - /// Use a different color for each indentation level. - IndentAware, +impl LanguageSettings { + /// A token representing the rest of the available language servers. + const REST_OF_LANGUAGE_SERVERS: &'static str = "..."; + + /// Returns the customized list of language servers from the list of + /// available language servers. + pub fn customized_language_servers( + &self, + available_language_servers: &[LanguageServerName], + ) -> Vec { + Self::resolve_language_servers(&self.language_servers, available_language_servers) + } + + pub(crate) fn resolve_language_servers( + configured_language_servers: &[String], + available_language_servers: &[LanguageServerName], + ) -> Vec { + let (disabled_language_servers, enabled_language_servers): ( + Vec, + Vec, + ) = configured_language_servers.iter().partition_map( + |language_server| match language_server.strip_prefix('!') { + Some(disabled) => Either::Left(LanguageServerName(disabled.to_string().into())), + None => Either::Right(LanguageServerName(language_server.clone().into())), + }, + ); + + let rest = available_language_servers + .iter() + .filter(|&available_language_server| { + !disabled_language_servers.contains(available_language_server) + && !enabled_language_servers.contains(available_language_server) + }) + .cloned() + .collect::>(); + + enabled_language_servers + .into_iter() + .flat_map(|language_server| { + if language_server.0.as_ref() == Self::REST_OF_LANGUAGE_SERVERS { + rest.clone() + } else { + vec![language_server] + } + }) + .collect::>() + } } -/// The settings for inlay hints. -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq, SettingsUi)] +// The settings for inlay hints. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct InlayHintSettings { /// Global switch to toggle hints on and off. /// /// Default: false - #[serde(default)] pub enabled: bool, /// Global switch to toggle inline values on and off when debugging. /// /// Default: true - #[serde(default = "default_true")] pub show_value_hints: bool, /// Whether type hints should be shown. /// /// Default: true - #[serde(default = "default_true")] pub show_type_hints: bool, /// Whether parameter hints should be shown. /// /// Default: true - #[serde(default = "default_true")] pub show_parameter_hints: bool, /// Whether other hints should be shown. /// /// Default: true - #[serde(default = "default_true")] pub show_other_hints: bool, /// Whether to show a background for inlay hints. /// @@ -1126,58 +323,27 @@ pub struct InlayHintSettings { /// from the current theme. /// /// Default: false - #[serde(default)] pub show_background: bool, /// Whether or not to debounce inlay hints updates after buffer edits. /// /// Set to 0 to disable debouncing. /// /// Default: 700 - #[serde(default = "edit_debounce_ms")] pub edit_debounce_ms: u64, /// Whether or not to debounce inlay hints updates after buffer scrolls. /// /// Set to 0 to disable debouncing. /// /// Default: 50 - #[serde(default = "scroll_debounce_ms")] pub scroll_debounce_ms: u64, /// Toggles inlay hints (hides or shows) when the user presses the modifiers specified. /// If only a subset of the modifiers specified is pressed, hints are not toggled. /// If no modifiers are specified, this is equivalent to `None`. /// /// Default: None - #[serde(default)] pub toggle_on_modifiers_press: Option, } -fn edit_debounce_ms() -> u64 { - 700 -} - -fn scroll_debounce_ms() -> u64 { - 50 -} - -/// The task settings for a particular language. -#[derive(Debug, Clone, Deserialize, PartialEq, Serialize, JsonSchema, SettingsUi)] -pub struct LanguageTaskConfig { - /// Extra task variables to set for a particular language. - #[serde(default)] - pub variables: HashMap, - #[serde(default = "default_true")] - pub enabled: bool, - /// Use LSP tasks over Zed language extension ones. - /// If no LSP tasks are returned due to error/timeout or regular execution, - /// Zed language extension tasks will be used instead. - /// - /// Other Zed tasks will still be shown: - /// * Zed task from either of the task config file - /// * Zed task from history (e.g. one-off task was spawned before) - #[serde(default = "default_true")] - pub prefer_lsp: bool, -} - impl InlayHintSettings { /// Returns the kinds of inlay hints that are enabled based on the settings. pub fn enabled_inlay_hint_kinds(&self) -> HashSet> { @@ -1195,6 +361,65 @@ impl InlayHintSettings { } } +/// The settings for edit predictions, such as [GitHub Copilot](https://github.com/features/copilot) +/// or [Supermaven](https://supermaven.com). +#[derive(Clone, Debug, Default)] +pub struct EditPredictionSettings { + /// The provider that supplies edit predictions. + pub provider: settings::EditPredictionProvider, + /// A list of globs representing files that edit predictions should be disabled for. + /// This list adds to a pre-existing, sensible default set of globs. + /// Any additional ones you add are combined with them. + pub disabled_globs: Vec, + /// Configures how edit predictions are displayed in the buffer. + pub mode: settings::EditPredictionsMode, + /// Settings specific to GitHub Copilot. + pub copilot: CopilotSettings, + /// Settings specific to Codestral. + pub codestral: CodestralSettings, + /// Whether edit predictions are enabled in the assistant panel. + /// This setting has no effect if globally disabled. + pub enabled_in_text_threads: bool, +} + +impl EditPredictionSettings { + /// Returns whether edit predictions are enabled for the given path. + pub fn enabled_for_file(&self, file: &Arc, cx: &App) -> bool { + !self.disabled_globs.iter().any(|glob| { + if glob.is_absolute { + file.as_local() + .is_some_and(|local| glob.matcher.is_match(local.abs_path(cx))) + } else { + glob.matcher.is_match(file.path().as_std_path()) + } + }) + } +} + +#[derive(Clone, Debug)] +pub struct DisabledGlob { + matcher: GlobMatcher, + is_absolute: bool, +} + +#[derive(Clone, Debug, Default)] +pub struct CopilotSettings { + /// HTTP/HTTPS proxy to use for Copilot. + pub proxy: Option, + /// Disable certificate verification for proxy (not recommended). + pub proxy_no_verify: Option, + /// Enterprise URI for Copilot. + pub enterprise_uri: Option, +} + +#[derive(Clone, Debug, Default)] +pub struct CodestralSettings { + /// Model to use for completions. + pub model: Option, + /// Maximum tokens to generate. + pub max_tokens: Option, +} + impl AllLanguageSettings { /// Returns the [`LanguageSettings`] for the language with the specified name. pub fn language<'a>( @@ -1282,186 +507,156 @@ fn merge_with_editorconfig(settings: &mut LanguageSettings, cfg: &EditorconfigPr ); } -/// The kind of an inlay hint. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum InlayHintKind { - /// An inlay hint for a type. - Type, - /// An inlay hint for a parameter. - Parameter, -} - -impl InlayHintKind { - /// Returns the [`InlayHintKind`] from the given name. - /// - /// Returns `None` if `name` does not match any of the expected - /// string representations. - pub fn from_name(name: &str) -> Option { - match name { - "type" => Some(InlayHintKind::Type), - "parameter" => Some(InlayHintKind::Parameter), - _ => None, - } - } - - /// Returns the name of this [`InlayHintKind`]. - pub fn name(&self) -> &'static str { - match self { - InlayHintKind::Type => "type", - InlayHintKind::Parameter => "parameter", - } - } -} - impl settings::Settings for AllLanguageSettings { - type FileContent = AllLanguageSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - let default_value = sources.default; + fn from_settings(content: &settings::SettingsContent) -> Self { + let all_languages = &content.project.all_languages; + + fn load_from_content(settings: LanguageSettingsContent) -> LanguageSettings { + let inlay_hints = settings.inlay_hints.unwrap(); + let completions = settings.completions.unwrap(); + let prettier = settings.prettier.unwrap(); + let indent_guides = settings.indent_guides.unwrap(); + let tasks = settings.tasks.unwrap(); + let whitespace_map = settings.whitespace_map.unwrap(); + + LanguageSettings { + tab_size: settings.tab_size.unwrap(), + hard_tabs: settings.hard_tabs.unwrap(), + soft_wrap: settings.soft_wrap.unwrap(), + preferred_line_length: settings.preferred_line_length.unwrap(), + show_wrap_guides: settings.show_wrap_guides.unwrap(), + wrap_guides: settings.wrap_guides.unwrap(), + indent_guides: IndentGuideSettings { + enabled: indent_guides.enabled.unwrap(), + line_width: indent_guides.line_width.unwrap(), + active_line_width: indent_guides.active_line_width.unwrap(), + coloring: indent_guides.coloring.unwrap(), + background_coloring: indent_guides.background_coloring.unwrap(), + }, + format_on_save: settings.format_on_save.unwrap(), + remove_trailing_whitespace_on_save: settings + .remove_trailing_whitespace_on_save + .unwrap(), + ensure_final_newline_on_save: settings.ensure_final_newline_on_save.unwrap(), + formatter: settings.formatter.unwrap(), + prettier: PrettierSettings { + allowed: prettier.allowed.unwrap(), + parser: prettier.parser.filter(|parser| !parser.is_empty()), + plugins: prettier.plugins.unwrap_or_default(), + options: prettier.options.unwrap_or_default(), + }, + jsx_tag_auto_close: settings.jsx_tag_auto_close.unwrap().enabled.unwrap(), + enable_language_server: settings.enable_language_server.unwrap(), + language_servers: settings.language_servers.unwrap(), + allow_rewrap: settings.allow_rewrap.unwrap(), + show_edit_predictions: settings.show_edit_predictions.unwrap(), + edit_predictions_disabled_in: settings.edit_predictions_disabled_in.unwrap(), + show_whitespaces: settings.show_whitespaces.unwrap(), + whitespace_map: WhitespaceMap { + space: SharedString::new(whitespace_map.space.unwrap().to_string()), + tab: SharedString::new(whitespace_map.tab.unwrap().to_string()), + }, + extend_comment_on_newline: settings.extend_comment_on_newline.unwrap(), + inlay_hints: InlayHintSettings { + enabled: inlay_hints.enabled.unwrap(), + show_value_hints: inlay_hints.show_value_hints.unwrap(), + show_type_hints: inlay_hints.show_type_hints.unwrap(), + show_parameter_hints: inlay_hints.show_parameter_hints.unwrap(), + show_other_hints: inlay_hints.show_other_hints.unwrap(), + show_background: inlay_hints.show_background.unwrap(), + edit_debounce_ms: inlay_hints.edit_debounce_ms.unwrap(), + scroll_debounce_ms: inlay_hints.scroll_debounce_ms.unwrap(), + toggle_on_modifiers_press: inlay_hints.toggle_on_modifiers_press, + }, + use_autoclose: settings.use_autoclose.unwrap(), + use_auto_surround: settings.use_auto_surround.unwrap(), + use_on_type_format: settings.use_on_type_format.unwrap(), + auto_indent: settings.auto_indent.unwrap(), + auto_indent_on_paste: settings.auto_indent_on_paste.unwrap(), + always_treat_brackets_as_autoclosed: settings + .always_treat_brackets_as_autoclosed + .unwrap(), + linked_edits: settings.linked_edits.unwrap(), + tasks: LanguageTaskSettings { + variables: tasks.variables.unwrap_or_default(), + enabled: tasks.enabled.unwrap(), + prefer_lsp: tasks.prefer_lsp.unwrap(), + }, + show_completions_on_input: settings.show_completions_on_input.unwrap(), + show_completion_documentation: settings.show_completion_documentation.unwrap(), + completions: CompletionSettings { + words: completions.words.unwrap(), + words_min_length: completions.words_min_length.unwrap() as usize, + lsp: completions.lsp.unwrap(), + lsp_fetch_timeout_ms: completions.lsp_fetch_timeout_ms.unwrap(), + lsp_insert_mode: completions.lsp_insert_mode.unwrap(), + }, + debuggers: settings.debuggers.unwrap(), + } + } - // A default is provided for all settings. - let mut defaults: LanguageSettings = - serde_json::from_value(serde_json::to_value(&default_value.defaults)?)?; + let default_language_settings = load_from_content(all_languages.defaults.clone()); let mut languages = HashMap::default(); - for (language_name, settings) in &default_value.languages.0 { - let mut language_settings = defaults.clone(); - merge_settings(&mut language_settings, settings); - languages.insert(language_name.clone(), language_settings); + for (language_name, settings) in &all_languages.languages.0 { + let mut language_settings = all_languages.defaults.clone(); + settings::merge_from::MergeFrom::merge_from(&mut language_settings, settings); + languages.insert( + LanguageName(language_name.clone()), + load_from_content(language_settings), + ); } - let mut edit_prediction_provider = default_value + let edit_prediction_provider = all_languages .features .as_ref() .and_then(|f| f.edit_prediction_provider); - let mut edit_predictions_mode = default_value - .edit_predictions - .as_ref() - .map(|edit_predictions| edit_predictions.mode) - .ok_or_else(Self::missing_default)?; - let mut completion_globs: HashSet<&String> = default_value - .edit_predictions - .as_ref() - .and_then(|c| c.disabled_globs.as_ref()) - .map(|globs| globs.iter().collect()) - .ok_or_else(Self::missing_default)?; - - let mut copilot_settings = default_value - .edit_predictions - .as_ref() - .map(|settings| CopilotSettings { - proxy: settings.copilot.proxy.clone(), - proxy_no_verify: settings.copilot.proxy_no_verify, - enterprise_uri: settings.copilot.enterprise_uri.clone(), - }) - .unwrap_or_default(); + let edit_predictions = all_languages.edit_predictions.clone().unwrap(); + let edit_predictions_mode = edit_predictions.mode.unwrap(); - let mut enabled_in_text_threads = default_value - .edit_predictions + let disabled_globs: HashSet<&String> = edit_predictions + .disabled_globs .as_ref() - .map(|settings| settings.enabled_in_text_threads) - .unwrap_or(true); - - let mut file_types: FxHashMap, GlobSet> = FxHashMap::default(); - - for (language, patterns) in &default_value.file_types { - let mut builder = GlobSetBuilder::new(); - - for pattern in patterns { - builder.add(Glob::new(pattern)?); - } - - file_types.insert(language.clone(), builder.build()?); - } - - for user_settings in sources.customizations() { - if let Some(provider) = user_settings - .features - .as_ref() - .and_then(|f| f.edit_prediction_provider) - { - edit_prediction_provider = Some(provider); - } - - if let Some(edit_predictions) = user_settings.edit_predictions.as_ref() { - edit_predictions_mode = edit_predictions.mode; - enabled_in_text_threads = edit_predictions.enabled_in_text_threads; + .unwrap() + .iter() + .collect(); - if let Some(disabled_globs) = edit_predictions.disabled_globs.as_ref() { - completion_globs.extend(disabled_globs.iter()); - } - } + let copilot = edit_predictions.copilot.unwrap(); + let copilot_settings = CopilotSettings { + proxy: copilot.proxy, + proxy_no_verify: copilot.proxy_no_verify, + enterprise_uri: copilot.enterprise_uri, + }; - if let Some(proxy) = user_settings - .edit_predictions - .as_ref() - .and_then(|settings| settings.copilot.proxy.clone()) - { - copilot_settings.proxy = Some(proxy); - } + let codestral = edit_predictions.codestral.unwrap(); + let codestral_settings = CodestralSettings { + model: codestral.model, + max_tokens: codestral.max_tokens, + }; - if let Some(proxy_no_verify) = user_settings - .edit_predictions - .as_ref() - .and_then(|settings| settings.copilot.proxy_no_verify) - { - copilot_settings.proxy_no_verify = Some(proxy_no_verify); - } + let enabled_in_text_threads = edit_predictions.enabled_in_text_threads.unwrap(); - if let Some(enterprise_uri) = user_settings - .edit_predictions - .as_ref() - .and_then(|settings| settings.copilot.enterprise_uri.clone()) - { - copilot_settings.enterprise_uri = Some(enterprise_uri); - } + let mut file_types: FxHashMap, GlobSet> = FxHashMap::default(); - // A user's global settings override the default global settings and - // all default language-specific settings. - merge_settings(&mut defaults, &user_settings.defaults); - for language_settings in languages.values_mut() { - merge_settings(language_settings, &user_settings.defaults); - } + for (language, patterns) in &all_languages.file_types { + let mut builder = GlobSetBuilder::new(); - // A user's language-specific settings override default language-specific settings. - for (language_name, user_language_settings) in &user_settings.languages.0 { - merge_settings( - languages - .entry(language_name.clone()) - .or_insert_with(|| defaults.clone()), - user_language_settings, - ); + for pattern in &patterns.0 { + builder.add(Glob::new(pattern).unwrap()); } - for (language, patterns) in &user_settings.file_types { - let mut builder = GlobSetBuilder::new(); - - let default_value = default_value.file_types.get(&language.clone()); - - // Merge the default value with the user's value. - if let Some(patterns) = default_value { - for pattern in patterns { - builder.add(Glob::new(pattern)?); - } - } - - for pattern in patterns { - builder.add(Glob::new(pattern)?); - } - - file_types.insert(language.clone(), builder.build()?); - } + file_types.insert(language.clone(), builder.build().unwrap()); } - Ok(Self { + Self { edit_predictions: EditPredictionSettings { provider: if let Some(provider) = edit_prediction_provider { provider } else { EditPredictionProvider::None }, - disabled_globs: completion_globs + disabled_globs: disabled_globs .iter() .filter_map(|g| { let expanded_g = shellexpand::tilde(g).into_owned(); @@ -1473,16 +668,17 @@ impl settings::Settings for AllLanguageSettings { .collect(), mode: edit_predictions_mode, copilot: copilot_settings, + codestral: codestral_settings, enabled_in_text_threads, }, - defaults, + defaults: default_language_settings, languages, file_types, - }) + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { - let d = &mut current.defaults; + fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut SettingsContent) { + let d = &mut current.project.all_languages.defaults; if let Some(size) = vscode .read_value("editor.tabSize") .and_then(|v| v.as_u64()) @@ -1511,14 +707,7 @@ impl settings::Settings for AllLanguageSettings { d.wrap_guides = arr; } if let Some(b) = vscode.read_bool("editor.guides.indentation") { - if let Some(guide_settings) = d.indent_guides.as_mut() { - guide_settings.enabled = b; - } else { - d.indent_guides = Some(IndentGuideSettings { - enabled: b, - ..Default::default() - }); - } + d.indent_guides.get_or_insert_default().enabled = Some(b); } if let Some(b) = vscode.read_bool("editor.guides.formatOnSave") { @@ -1568,34 +757,28 @@ impl settings::Settings for AllLanguageSettings { } else { WordsCompletionMode::Disabled }; - if let Some(completion_settings) = d.completions.as_mut() { - completion_settings.words = mode; - } else { - d.completions = Some(CompletionSettings { - words: mode, - words_min_length: 3, - lsp: true, - lsp_fetch_timeout_ms: 0, - lsp_insert_mode: LspInsertMode::ReplaceSuffix, - }); - } + d.completions.get_or_insert_default().words = Some(mode); } // TODO: pull ^ out into helper and reuse for per-language settings // vscodes file association map is inverted from ours, so we flip the mapping before merging - let mut associations: HashMap, Vec> = HashMap::default(); + let mut associations: HashMap, ExtendingVec> = HashMap::default(); if let Some(map) = vscode .read_value("files.associations") .and_then(|v| v.as_object()) { for (k, v) in map { let Some(v) = v.as_str() else { continue }; - associations.entry(v.into()).or_default().push(k.clone()); + associations.entry(v.into()).or_default().0.push(k.clone()); } } // TODO: do we want to merge imported globs per filetype? for now we'll just replace - current.file_types.extend(associations); + current + .project + .all_languages + .file_types + .extend(associations); // cursor global ignore list applies to cursor-tab, so transfer it to edit_predictions.disabled_globs if let Some(disabled_globs) = vscode @@ -1603,6 +786,8 @@ impl settings::Settings for AllLanguageSettings { .and_then(|v| v.as_array()) { current + .project + .all_languages .edit_predictions .get_or_insert_default() .disabled_globs @@ -1617,167 +802,17 @@ impl settings::Settings for AllLanguageSettings { } } -fn merge_settings(settings: &mut LanguageSettings, src: &LanguageSettingsContent) { - fn merge(target: &mut T, value: Option) { - if let Some(value) = value { - *target = value; - } - } - - merge(&mut settings.tab_size, src.tab_size); - settings.tab_size = settings - .tab_size - .clamp(NonZeroU32::new(1).unwrap(), NonZeroU32::new(16).unwrap()); - - merge(&mut settings.hard_tabs, src.hard_tabs); - merge(&mut settings.soft_wrap, src.soft_wrap); - merge(&mut settings.use_autoclose, src.use_autoclose); - merge(&mut settings.use_auto_surround, src.use_auto_surround); - merge(&mut settings.use_on_type_format, src.use_on_type_format); - merge(&mut settings.auto_indent, src.auto_indent); - merge(&mut settings.auto_indent_on_paste, src.auto_indent_on_paste); - merge( - &mut settings.always_treat_brackets_as_autoclosed, - src.always_treat_brackets_as_autoclosed, - ); - merge(&mut settings.show_wrap_guides, src.show_wrap_guides); - merge(&mut settings.wrap_guides, src.wrap_guides.clone()); - merge(&mut settings.indent_guides, src.indent_guides); - merge( - &mut settings.code_actions_on_format, - src.code_actions_on_format.clone(), - ); - merge(&mut settings.linked_edits, src.linked_edits); - merge(&mut settings.tasks, src.tasks.clone()); - - merge( - &mut settings.preferred_line_length, - src.preferred_line_length, - ); - merge(&mut settings.formatter, src.formatter.clone()); - merge(&mut settings.prettier, src.prettier.clone()); - merge( - &mut settings.jsx_tag_auto_close, - src.jsx_tag_auto_close.clone(), - ); - merge(&mut settings.format_on_save, src.format_on_save.clone()); - merge( - &mut settings.remove_trailing_whitespace_on_save, - src.remove_trailing_whitespace_on_save, - ); - merge( - &mut settings.ensure_final_newline_on_save, - src.ensure_final_newline_on_save, - ); - merge( - &mut settings.enable_language_server, - src.enable_language_server, - ); - merge(&mut settings.language_servers, src.language_servers.clone()); - merge(&mut settings.allow_rewrap, src.allow_rewrap); - merge( - &mut settings.show_edit_predictions, - src.show_edit_predictions, - ); - merge( - &mut settings.edit_predictions_disabled_in, - src.edit_predictions_disabled_in.clone(), - ); - merge(&mut settings.show_whitespaces, src.show_whitespaces); - merge(&mut settings.whitespace_map, src.whitespace_map.clone()); - merge( - &mut settings.extend_comment_on_newline, - src.extend_comment_on_newline, - ); - merge(&mut settings.inlay_hints, src.inlay_hints); - merge( - &mut settings.show_completions_on_input, - src.show_completions_on_input, - ); - merge( - &mut settings.show_completion_documentation, - src.show_completion_documentation, - ); - merge(&mut settings.completions, src.completions); -} - -/// Allows to enable/disable formatting with Prettier -/// and configure default Prettier, used when no project-level Prettier installation is found. -/// Prettier formatting is disabled by default. -#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, SettingsUi)] -pub struct PrettierSettings { - /// Enables or disables formatting with Prettier for a given language. - #[serde(default)] - pub allowed: bool, - - /// Forces Prettier integration to use a specific parser name when formatting files with the language. - #[serde(default)] - pub parser: Option, - - /// Forces Prettier integration to use specific plugins when formatting files with the language. - /// The default Prettier will be installed with these plugins. - #[serde(default)] - #[settings_ui(skip)] - pub plugins: HashSet, - - /// Default Prettier options, in the format as in package.json section for Prettier. - /// If project installs Prettier via its package.json, these options will be ignored. - #[serde(flatten)] - #[settings_ui(skip)] - pub options: HashMap, -} - -#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, SettingsUi)] +#[derive(Default, Debug, Clone, PartialEq, Eq)] pub struct JsxTagAutoCloseSettings { /// Enables or disables auto-closing of JSX tags. - #[serde(default)] pub enabled: bool, } #[cfg(test)] mod tests { - use gpui::TestAppContext; - use super::*; - - #[test] - fn test_formatter_deserialization() { - let raw_auto = "{\"formatter\": \"auto\"}"; - let settings: LanguageSettingsContent = serde_json::from_str(raw_auto).unwrap(); - assert_eq!(settings.formatter, Some(SelectedFormatter::Auto)); - let raw = "{\"formatter\": \"language_server\"}"; - let settings: LanguageSettingsContent = serde_json::from_str(raw).unwrap(); - assert_eq!( - settings.formatter, - Some(SelectedFormatter::List(FormatterList::Single( - Formatter::LanguageServer { name: None } - ))) - ); - let raw = "{\"formatter\": [{\"language_server\": {\"name\": null}}]}"; - let settings: LanguageSettingsContent = serde_json::from_str(raw).unwrap(); - assert_eq!( - settings.formatter, - Some(SelectedFormatter::List(FormatterList::Vec(vec![ - Formatter::LanguageServer { name: None } - ]))) - ); - let raw = "{\"formatter\": [{\"language_server\": {\"name\": null}}, \"prettier\"]}"; - let settings: LanguageSettingsContent = serde_json::from_str(raw).unwrap(); - assert_eq!( - settings.formatter, - Some(SelectedFormatter::List(FormatterList::Vec(vec![ - Formatter::LanguageServer { name: None }, - Formatter::Prettier - ]))) - ); - } - - #[test] - fn test_formatter_deserialization_invalid() { - let raw_auto = "{\"formatter\": {}}"; - let result: Result = serde_json::from_str(raw_auto); - assert!(result.is_err()); - } + use gpui::TestAppContext; + use util::rel_path::rel_path; #[gpui::test] fn test_edit_predictions_enabled_for_file(cx: &mut TestAppContext) { @@ -1819,11 +854,11 @@ mod tests { const WORKTREE_NAME: &str = "project"; let make_test_file = |segments: &[&str]| -> Arc { - let mut path_buf = PathBuf::new(); - path_buf.extend(segments); + let path = segments.join("/"); + let path = rel_path(&path); Arc::new(TestFile { - path: path_buf.as_path().into(), + path: path.into(), root_name: WORKTREE_NAME.to_string(), local_root: Some(PathBuf::from(if cfg!(windows) { "C:\\absolute\\" @@ -1876,7 +911,7 @@ mod tests { assert!(!settings.enabled_for_file(&test_file, &cx)); let test_file_root: Arc = Arc::new(TestFile { - path: PathBuf::from("file.rs").as_path().into(), + path: rel_path("file.rs").into(), root_name: WORKTREE_NAME.to_string(), local_root: Some(PathBuf::from("/absolute/")), }); @@ -1908,8 +943,12 @@ mod tests { // Test tilde expansion let home = shellexpand::tilde("~").into_owned(); - let home_file = make_test_file(&[&home, "test.rs"]); - let settings = build_settings(&["~/test.rs"]); + let home_file = Arc::new(TestFile { + path: rel_path("test.rs").into(), + root_name: "the-dir".to_string(), + local_root: Some(PathBuf::from(home)), + }) as Arc; + let settings = build_settings(&["~/the-dir/test.rs"]); assert!(!settings.enabled_for_file(&home_file, &cx)); } diff --git a/crates/language/src/manifest.rs b/crates/language/src/manifest.rs index 3ca0ddf71da20f69d5d6440189d4a656bfbe7c9d..82ed164a032cb18d2d011f59938a0cd1410ba60f 100644 --- a/crates/language/src/manifest.rs +++ b/crates/language/src/manifest.rs @@ -1,7 +1,8 @@ -use std::{borrow::Borrow, path::Path, sync::Arc}; +use std::{borrow::Borrow, sync::Arc}; use gpui::SharedString; use settings::WorktreeId; +use util::rel_path::RelPath; #[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct ManifestName(SharedString); @@ -42,17 +43,17 @@ impl AsRef for ManifestName { /// For example, given a path like `foo/bar/baz`, a depth of 2 would explore `foo/bar/baz` and `foo/bar`, but not `foo`. pub struct ManifestQuery { /// Path to the file, relative to worktree root. - pub path: Arc, + pub path: Arc, pub depth: usize, pub delegate: Arc, } pub trait ManifestProvider { fn name(&self) -> ManifestName; - fn search(&self, query: ManifestQuery) -> Option>; + fn search(&self, query: ManifestQuery) -> Option>; } pub trait ManifestDelegate: Send + Sync { fn worktree_id(&self) -> WorktreeId; - fn exists(&self, path: &Path, is_dir: Option) -> bool; + fn exists(&self, path: &RelPath, is_dir: Option) -> bool; } diff --git a/crates/language/src/syntax_map.rs b/crates/language/src/syntax_map.rs index 38aad007fe16c655a3802bd70c9b709cbe83ea68..528b25d47193ebdbbf0dbe12cd18c66e31ad37d0 100644 --- a/crates/language/src/syntax_map.rs +++ b/crates/language/src/syntax_map.rs @@ -1775,13 +1775,13 @@ impl Default for SyntaxLayerSummary { } impl sum_tree::Summary for SyntaxLayerSummary { - type Context = BufferSnapshot; + type Context<'a> = &'a BufferSnapshot; fn zero(_cx: &BufferSnapshot) -> Self { Default::default() } - fn add_summary(&mut self, other: &Self, buffer: &Self::Context) { + fn add_summary(&mut self, other: &Self, buffer: Self::Context<'_>) { if other.max_depth > self.max_depth { self.max_depth = other.max_depth; self.range = other.range.clone(); diff --git a/crates/language/src/syntax_map/syntax_map_tests.rs b/crates/language/src/syntax_map/syntax_map_tests.rs index 622731b7814ce16bfcc026b6723e80d5ba4dda7a..6b19d651e241ad71229c6c7fc429883a44367304 100644 --- a/crates/language/src/syntax_map/syntax_map_tests.rs +++ b/crates/language/src/syntax_map/syntax_map_tests.rs @@ -1409,12 +1409,15 @@ fn assert_capture_ranges( ) { let mut actual_ranges = Vec::>::new(); let captures = syntax_map.captures(0..buffer.len(), buffer, |grammar| { - grammar.highlights_query.as_ref() + grammar + .highlights_config + .as_ref() + .map(|config| &config.query) }); let queries = captures .grammars() .iter() - .map(|grammar| grammar.highlights_query.as_ref().unwrap()) + .map(|grammar| &grammar.highlights_config.as_ref().unwrap().query) .collect::>(); for capture in captures { let name = &queries[capture.grammar_index].capture_names()[capture.index as usize]; diff --git a/crates/language/src/text_diff.rs b/crates/language/src/text_diff.rs index 11d8a070d213852f0a98078f2ed8c76c9cced47b..5a74362d7d3cb2404cc67ed32595a06efd291ca4 100644 --- a/crates/language/src/text_diff.rs +++ b/crates/language/src/text_diff.rs @@ -1,4 +1,4 @@ -use crate::{CharClassifier, CharKind, LanguageScope}; +use crate::{CharClassifier, CharKind, CharScopeContext, LanguageScope}; use anyhow::{Context, anyhow}; use imara_diff::{ Algorithm, UnifiedDiffBuilder, diff, @@ -181,7 +181,8 @@ fn diff_internal( } fn tokenize(text: &str, language_scope: Option) -> impl Iterator { - let classifier = CharClassifier::new(language_scope).for_completion(true); + let classifier = + CharClassifier::new(language_scope).scope_context(Some(CharScopeContext::Completion)); let mut chars = text.char_indices(); let mut prev = None; let mut start_ix = 0; diff --git a/crates/language/src/toolchain.rs b/crates/language/src/toolchain.rs index 2cc86881fbd515317d4d6f5949e82eb3da63a1bb..d3466307f368e7008eedbc8881aa78ab854bc08b 100644 --- a/crates/language/src/toolchain.rs +++ b/crates/language/src/toolchain.rs @@ -4,10 +4,7 @@ //! which is a set of tools used to interact with the projects written in said language. //! For example, a Python project can have an associated virtual environment; a Rust project can have a toolchain override. -use std::{ - path::{Path, PathBuf}, - sync::Arc, -}; +use std::{path::PathBuf, sync::Arc}; use async_trait::async_trait; use collections::HashMap; @@ -15,6 +12,7 @@ use fs::Fs; use gpui::{AsyncApp, SharedString}; use settings::WorktreeId; use task::ShellKind; +use util::rel_path::RelPath; use crate::{LanguageName, ManifestName}; @@ -23,6 +21,7 @@ use crate::{LanguageName, ManifestName}; pub struct Toolchain { /// User-facing label pub name: SharedString, + /// Absolute path pub path: SharedString, pub language_name: LanguageName, /// Full toolchain data (including language-specific details) @@ -37,7 +36,7 @@ pub struct Toolchain { /// - Only in the subproject they're currently in. #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] pub enum ToolchainScope { - Subproject(WorktreeId, Arc), + Subproject(WorktreeId, Arc), Project, /// Available in all projects on this box. It wouldn't make sense to show suggestions across machines. Global, @@ -97,7 +96,7 @@ pub trait ToolchainLister: Send + Sync + 'static { async fn list( &self, worktree_root: PathBuf, - subroot_relative_path: Arc, + subroot_relative_path: Arc, project_env: Option>, ) -> ToolchainList; @@ -134,7 +133,7 @@ pub trait LanguageToolchainStore: Send + Sync + 'static { async fn active_toolchain( self: Arc, worktree_id: WorktreeId, - relative_path: Arc, + relative_path: Arc, language_name: LanguageName, cx: &mut AsyncApp, ) -> Option; @@ -144,7 +143,7 @@ pub trait LocalLanguageToolchainStore: Send + Sync + 'static { fn active_toolchain( self: Arc, worktree_id: WorktreeId, - relative_path: &Arc, + relative_path: &Arc, language_name: LanguageName, cx: &mut AsyncApp, ) -> Option; @@ -155,7 +154,7 @@ impl LanguageToolchainStore for T { async fn active_toolchain( self: Arc, worktree_id: WorktreeId, - relative_path: Arc, + relative_path: Arc, language_name: LanguageName, cx: &mut AsyncApp, ) -> Option { diff --git a/crates/language_extension/src/extension_lsp_adapter.rs b/crates/language_extension/src/extension_lsp_adapter.rs index dccd33ffb6b90381d7d86c38e80ec95effd4daf7..407b18314f025b7d3b3f43b0735fd0265f6eb9c4 100644 --- a/crates/language_extension/src/extension_lsp_adapter.rs +++ b/crates/language_extension/src/extension_lsp_adapter.rs @@ -19,7 +19,7 @@ use lsp::{ }; use serde::Serialize; use serde_json::Value; -use util::{ResultExt, fs::make_file_executable, maybe}; +use util::{ResultExt, fs::make_file_executable, maybe, rel_path::RelPath}; use crate::{LanguageServerRegistryProxy, LspAccess}; @@ -33,10 +33,10 @@ impl WorktreeDelegate for WorktreeDelegateAdapter { } fn root_path(&self) -> String { - self.0.worktree_root_path().to_string_lossy().to_string() + self.0.worktree_root_path().to_string_lossy().into_owned() } - async fn read_text_file(&self, path: PathBuf) -> Result { + async fn read_text_file(&self, path: &RelPath) -> Result { self.0.read_text_file(path).await } @@ -44,7 +44,7 @@ impl WorktreeDelegate for WorktreeDelegateAdapter { self.0 .which(binary_name.as_ref()) .await - .map(|path| path.to_string_lossy().to_string()) + .map(|path| path.to_string_lossy().into_owned()) } async fn shell_env(&self) -> Vec<(String, String)> { diff --git a/crates/language_model/Cargo.toml b/crates/language_model/Cargo.toml index d4513f617b0d9f79e960c6cec6ca1a5dd806cea6..a85283cf121bc10a82e1022071d6a136dd5716f5 100644 --- a/crates/language_model/Cargo.toml +++ b/crates/language_model/Cargo.toml @@ -35,6 +35,7 @@ proto.workspace = true schemars.workspace = true serde.workspace = true serde_json.workspace = true +settings.workspace = true smol.workspace = true telemetry_events.workspace = true thiserror.workspace = true diff --git a/crates/language_model/src/language_model.rs b/crates/language_model/src/language_model.rs index fac302104fd9a4da82f5a383d5cd86b64fde4731..38f2b0959072599900cb8a13c16f4e2f8e9c55db 100644 --- a/crates/language_model/src/language_model.rs +++ b/crates/language_model/src/language_model.rs @@ -21,6 +21,7 @@ use open_router::OpenRouterError; use parking_lot::Mutex; use schemars::JsonSchema; use serde::{Deserialize, Serialize, de::DeserializeOwned}; +pub use settings::LanguageModelCacheConfiguration; use std::ops::{Add, Sub}; use std::str::FromStr; use std::sync::Arc; @@ -49,6 +50,9 @@ pub const OPEN_AI_PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId pub const OPEN_AI_PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("OpenAI"); +pub const X_AI_PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId::new("x_ai"); +pub const X_AI_PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("xAI"); + pub const ZED_CLOUD_PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId::new("zed.dev"); pub const ZED_CLOUD_PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("Zed"); @@ -62,14 +66,6 @@ pub fn init_settings(cx: &mut App) { registry::init(cx); } -/// Configuration for caching language model messages. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct LanguageModelCacheConfiguration { - pub max_cache_anchors: usize, - pub should_speculate: bool, - pub min_total_token: u64, -} - /// A completion event from a language model. #[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub enum LanguageModelCompletionEvent { @@ -681,6 +677,8 @@ pub trait LanguageModelTool: 'static + DeserializeOwned + JsonSchema { /// An error that occurred when trying to authenticate the language model provider. #[derive(Debug, Error)] pub enum AuthenticateError { + #[error("connection refused")] + ConnectionRefused, #[error("credentials not found")] CredentialsNotFound, #[error(transparent)] diff --git a/crates/language_model/src/registry.rs b/crates/language_model/src/registry.rs index bab258bca1728ac45f5ef5c0397149b93f0d6031..6ed8bf07c4e976c88fecebd929843335333b1fa6 100644 --- a/crates/language_model/src/registry.rs +++ b/crates/language_model/src/registry.rs @@ -118,14 +118,14 @@ impl LanguageModelRegistry { } #[cfg(any(test, feature = "test-support"))] - pub fn test(cx: &mut App) -> crate::fake_provider::FakeLanguageModelProvider { - let fake_provider = crate::fake_provider::FakeLanguageModelProvider::default(); + pub fn test(cx: &mut App) -> Arc { + let fake_provider = Arc::new(crate::fake_provider::FakeLanguageModelProvider::default()); let registry = cx.new(|cx| { let mut registry = Self::default(); registry.register_provider(fake_provider.clone(), cx); let model = fake_provider.provided_models(cx)[0].clone(); let configured_model = ConfiguredModel { - provider: Arc::new(fake_provider.clone()), + provider: fake_provider.clone(), model, }; registry.set_default_model(Some(configured_model), cx); @@ -137,7 +137,7 @@ impl LanguageModelRegistry { pub fn register_provider( &mut self, - provider: T, + provider: Arc, cx: &mut Context, ) { let id = provider.id(); @@ -152,7 +152,7 @@ impl LanguageModelRegistry { subscription.detach(); } - self.providers.insert(id.clone(), Arc::new(provider)); + self.providers.insert(id.clone(), provider); cx.emit(Event::AddedProvider(id)); } @@ -395,7 +395,7 @@ mod tests { fn test_register_providers(cx: &mut App) { let registry = cx.new(|_| LanguageModelRegistry::default()); - let provider = FakeLanguageModelProvider::default(); + let provider = Arc::new(FakeLanguageModelProvider::default()); registry.update(cx, |registry, cx| { registry.register_provider(provider.clone(), cx); }); diff --git a/crates/language_model/src/request.rs b/crates/language_model/src/request.rs index 1182e0f7a8f1952a62832970ca63f3684eea5b17..2902e9ae5aaa45ea4607317bee12a3f91abbbe55 100644 --- a/crates/language_model/src/request.rs +++ b/crates/language_model/src/request.rs @@ -99,6 +99,10 @@ impl LanguageModelImage { .and_then(image::DynamicImage::from_decoder), ImageFormat::Gif => image::codecs::gif::GifDecoder::new(image_bytes) .and_then(image::DynamicImage::from_decoder), + ImageFormat::Bmp => image::codecs::bmp::BmpDecoder::new(image_bytes) + .and_then(image::DynamicImage::from_decoder), + ImageFormat::Tiff => image::codecs::tiff::TiffDecoder::new(image_bytes) + .and_then(image::DynamicImage::from_decoder), _ => return None, } .log_err()?; @@ -119,8 +123,8 @@ impl LanguageModelImage { image_size, ); let resized_image = dynamic_image.resize( - new_bounds.size.width.0 as u32, - new_bounds.size.height.0 as u32, + new_bounds.size.width.into(), + new_bounds.size.height.into(), image::imageops::FilterType::Triangle, ); diff --git a/crates/language_models/Cargo.toml b/crates/language_models/Cargo.toml index b5bfb870f643452bd5be248c9910d99f16a8101e..28cfe69d96d15f26c567e7e61e5ebb5f329371f3 100644 --- a/crates/language_models/Cargo.toml +++ b/crates/language_models/Cargo.toml @@ -28,7 +28,7 @@ convert_case.workspace = true copilot.workspace = true credentials_provider.workspace = true deepseek = { workspace = true, features = ["schemars"] } -editor.workspace = true +fs.workspace = true futures.workspace = true google_ai = { workspace = true, features = ["schemars"] } gpui.workspace = true @@ -51,7 +51,6 @@ serde_json.workspace = true settings.workspace = true smol.workspace = true strum.workspace = true -theme.workspace = true thiserror.workspace = true tiktoken-rs.workspace = true tokio = { workspace = true, features = ["rt", "rt-multi-thread"] } @@ -61,6 +60,7 @@ util.workspace = true vercel = { workspace = true, features = ["schemars"] } workspace-hack.workspace = true x_ai = { workspace = true, features = ["schemars"] } +zed_env_vars.workspace = true [dev-dependencies] editor = { workspace = true, features = ["test-support"] } diff --git a/crates/language_models/src/api_key.rs b/crates/language_models/src/api_key.rs new file mode 100644 index 0000000000000000000000000000000000000000..122234b6ced6d0bf1b7a0d684683c841824ccd2d --- /dev/null +++ b/crates/language_models/src/api_key.rs @@ -0,0 +1,295 @@ +use anyhow::{Result, anyhow}; +use credentials_provider::CredentialsProvider; +use futures::{FutureExt, future}; +use gpui::{AsyncApp, Context, SharedString, Task}; +use language_model::AuthenticateError; +use std::{ + fmt::{Display, Formatter}, + sync::Arc, +}; +use util::ResultExt as _; +use zed_env_vars::EnvVar; + +/// Manages a single API key for a language model provider. API keys either come from environment +/// variables or the system keychain. +/// +/// Keys from the system keychain are associated with a provider URL, and this ensures that they are +/// only used with that URL. +pub struct ApiKeyState { + url: SharedString, + load_status: LoadStatus, + load_task: Option>>, +} + +#[derive(Debug, Clone)] +pub enum LoadStatus { + NotPresent, + Error(String), + Loaded(ApiKey), +} + +#[derive(Debug, Clone)] +pub struct ApiKey { + source: ApiKeySource, + key: Arc, +} + +impl ApiKeyState { + pub fn new(url: SharedString) -> Self { + Self { + url, + load_status: LoadStatus::NotPresent, + load_task: None, + } + } + + pub fn has_key(&self) -> bool { + matches!(self.load_status, LoadStatus::Loaded { .. }) + } + + pub fn is_from_env_var(&self) -> bool { + match &self.load_status { + LoadStatus::Loaded(ApiKey { + source: ApiKeySource::EnvVar { .. }, + .. + }) => true, + _ => false, + } + } + + /// Get the stored API key, verifying that it is associated with the URL. Returns `None` if + /// there is no key or for URL mismatches, and the mismatch case is logged. + /// + /// To avoid URL mismatches, expects that `load_if_needed` or `handle_url_change` has been + /// called with this URL. + pub fn key(&self, url: &str) -> Option> { + let api_key = match &self.load_status { + LoadStatus::Loaded(api_key) => api_key, + _ => return None, + }; + if url == self.url.as_str() { + Some(api_key.key.clone()) + } else if let ApiKeySource::EnvVar(var_name) = &api_key.source { + log::warn!( + "{} is now being used with URL {}, when initially it was used with URL {}", + var_name, + url, + self.url + ); + Some(api_key.key.clone()) + } else { + // bug case because load_if_needed should be called whenever the url may have changed + log::error!( + "bug: Attempted to use API key associated with URL {} instead with URL {}", + self.url, + url + ); + None + } + } + + /// Set or delete the API key in the system keychain. + pub fn store( + &mut self, + url: SharedString, + key: Option, + get_this: impl Fn(&mut Ent) -> &mut Self + 'static, + cx: &Context, + ) -> Task> { + if self.is_from_env_var() { + return Task::ready(Err(anyhow!( + "bug: attempted to store API key in system keychain when API key is from env var", + ))); + } + let credentials_provider = ::global(cx); + cx.spawn(async move |ent, cx| { + if let Some(key) = &key { + credentials_provider + .write_credentials(&url, "Bearer", key.as_bytes(), cx) + .await + .log_err(); + } else { + credentials_provider + .delete_credentials(&url, cx) + .await + .log_err(); + } + ent.update(cx, |ent, cx| { + let this = get_this(ent); + this.url = url; + this.load_status = match &key { + Some(key) => LoadStatus::Loaded(ApiKey { + source: ApiKeySource::SystemKeychain, + key: key.as_str().into(), + }), + None => LoadStatus::NotPresent, + }; + cx.notify(); + }) + }) + } + + /// Reloads the API key if the current API key is associated with a different URL. + /// + /// Note that it is not efficient to use this or `load_if_needed` with multiple URLs + /// interchangeably - URL change should correspond to some user initiated change. + pub fn handle_url_change( + &mut self, + url: SharedString, + env_var: &EnvVar, + get_this: impl Fn(&mut Ent) -> &mut Self + Clone + 'static, + cx: &mut Context, + ) { + if url != self.url { + if !self.is_from_env_var() { + // loading will continue even though this result task is dropped + let _task = self.load_if_needed(url, env_var, get_this, cx); + } + } + } + + /// If needed, loads the API key associated with the given URL from the system keychain. When a + /// non-empty environment variable is provided, it will be used instead. If called when an API + /// key was already loaded for a different URL, that key will be cleared before loading. + /// + /// Dropping the returned Task does not cancel key loading. + pub fn load_if_needed( + &mut self, + url: SharedString, + env_var: &EnvVar, + get_this: impl Fn(&mut Ent) -> &mut Self + Clone + 'static, + cx: &mut Context, + ) -> Task> { + if let LoadStatus::Loaded { .. } = &self.load_status + && self.url == url + { + return Task::ready(Ok(())); + } + + if let Some(key) = &env_var.value + && !key.is_empty() + { + let api_key = ApiKey::from_env(env_var.name.clone(), key); + self.url = url; + self.load_status = LoadStatus::Loaded(api_key); + self.load_task = None; + cx.notify(); + return Task::ready(Ok(())); + } + + let task = if let Some(load_task) = &self.load_task { + load_task.clone() + } else { + let load_task = Self::load(url.clone(), get_this.clone(), cx).shared(); + self.url = url; + self.load_status = LoadStatus::NotPresent; + self.load_task = Some(load_task.clone()); + cx.notify(); + load_task + }; + + cx.spawn(async move |ent, cx| { + task.await; + ent.update(cx, |ent, _cx| { + get_this(ent).load_status.clone().into_authenticate_result() + }) + .ok(); + Ok(()) + }) + } + + fn load( + url: SharedString, + get_this: impl Fn(&mut Ent) -> &mut Self + 'static, + cx: &Context, + ) -> Task<()> { + let credentials_provider = ::global(cx); + cx.spawn({ + async move |ent, cx| { + let load_status = + ApiKey::load_from_system_keychain_impl(&url, credentials_provider.as_ref(), cx) + .await; + ent.update(cx, |ent, cx| { + let this = get_this(ent); + this.url = url; + this.load_status = load_status; + this.load_task = None; + cx.notify(); + }) + .ok(); + } + }) + } +} + +impl ApiKey { + pub fn key(&self) -> &str { + &self.key + } + + pub fn from_env(env_var_name: SharedString, key: &str) -> Self { + Self { + source: ApiKeySource::EnvVar(env_var_name), + key: key.into(), + } + } + + pub async fn load_from_system_keychain( + url: &str, + credentials_provider: &dyn CredentialsProvider, + cx: &AsyncApp, + ) -> Result { + Self::load_from_system_keychain_impl(url, credentials_provider, cx) + .await + .into_authenticate_result() + } + + async fn load_from_system_keychain_impl( + url: &str, + credentials_provider: &dyn CredentialsProvider, + cx: &AsyncApp, + ) -> LoadStatus { + if url.is_empty() { + return LoadStatus::NotPresent; + } + let read_result = credentials_provider.read_credentials(&url, cx).await; + let api_key = match read_result { + Ok(Some((_, api_key))) => api_key, + Ok(None) => return LoadStatus::NotPresent, + Err(err) => return LoadStatus::Error(err.to_string()), + }; + let key = match str::from_utf8(&api_key) { + Ok(key) => key, + Err(_) => return LoadStatus::Error(format!("API key for URL {url} is not utf8")), + }; + LoadStatus::Loaded(Self { + source: ApiKeySource::SystemKeychain, + key: key.into(), + }) + } +} + +impl LoadStatus { + fn into_authenticate_result(self) -> Result { + match self { + LoadStatus::Loaded(api_key) => Ok(api_key), + LoadStatus::NotPresent => Err(AuthenticateError::CredentialsNotFound), + LoadStatus::Error(err) => Err(AuthenticateError::Other(anyhow!(err))), + } + } +} + +#[derive(Debug, Clone)] +enum ApiKeySource { + EnvVar(SharedString), + SystemKeychain, +} + +impl Display for ApiKeySource { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + ApiKeySource::EnvVar(var) => write!(f, "environment variable {}", var), + ApiKeySource::SystemKeychain => write!(f, "system keychain"), + } + } +} diff --git a/crates/language_models/src/language_models.rs b/crates/language_models/src/language_models.rs index 738b72b0c9a6dbb7c9606cc72707b27e66abf09c..1b7243780ad30d737118046c8fc71fe9e4186fa6 100644 --- a/crates/language_models/src/language_models.rs +++ b/crates/language_models/src/language_models.rs @@ -7,6 +7,7 @@ use gpui::{App, Context, Entity}; use language_model::{LanguageModelProviderId, LanguageModelRegistry}; use provider::deepseek::DeepSeekLanguageModelProvider; +mod api_key; pub mod provider; mod settings; pub mod ui; @@ -17,7 +18,7 @@ use crate::provider::cloud::CloudLanguageModelProvider; use crate::provider::copilot_chat::CopilotChatLanguageModelProvider; use crate::provider::google::GoogleLanguageModelProvider; use crate::provider::lmstudio::LmStudioLanguageModelProvider; -use crate::provider::mistral::MistralLanguageModelProvider; +pub use crate::provider::mistral::MistralLanguageModelProvider; use crate::provider::ollama::OllamaLanguageModelProvider; use crate::provider::open_ai::OpenAiLanguageModelProvider; use crate::provider::open_ai_compatible::OpenAiCompatibleLanguageModelProvider; @@ -86,11 +87,11 @@ fn register_openai_compatible_providers( for provider_id in new { if !old.contains(provider_id) { registry.register_provider( - OpenAiCompatibleLanguageModelProvider::new( + Arc::new(OpenAiCompatibleLanguageModelProvider::new( provider_id.clone(), client.http_client(), cx, - ), + )), cx, ); } @@ -104,50 +105,62 @@ fn register_language_model_providers( cx: &mut Context, ) { registry.register_provider( - CloudLanguageModelProvider::new(user_store, client.clone(), cx), + Arc::new(CloudLanguageModelProvider::new( + user_store, + client.clone(), + cx, + )), + cx, + ); + registry.register_provider( + Arc::new(AnthropicLanguageModelProvider::new( + client.http_client(), + cx, + )), cx, ); - registry.register_provider( - AnthropicLanguageModelProvider::new(client.http_client(), cx), + Arc::new(OpenAiLanguageModelProvider::new(client.http_client(), cx)), cx, ); registry.register_provider( - OpenAiLanguageModelProvider::new(client.http_client(), cx), + Arc::new(OllamaLanguageModelProvider::new(client.http_client(), cx)), cx, ); registry.register_provider( - OllamaLanguageModelProvider::new(client.http_client(), cx), + Arc::new(LmStudioLanguageModelProvider::new(client.http_client(), cx)), cx, ); registry.register_provider( - LmStudioLanguageModelProvider::new(client.http_client(), cx), + Arc::new(DeepSeekLanguageModelProvider::new(client.http_client(), cx)), cx, ); registry.register_provider( - DeepSeekLanguageModelProvider::new(client.http_client(), cx), + Arc::new(GoogleLanguageModelProvider::new(client.http_client(), cx)), cx, ); registry.register_provider( - GoogleLanguageModelProvider::new(client.http_client(), cx), + MistralLanguageModelProvider::global(client.http_client(), cx), cx, ); registry.register_provider( - MistralLanguageModelProvider::new(client.http_client(), cx), + Arc::new(BedrockLanguageModelProvider::new(client.http_client(), cx)), cx, ); registry.register_provider( - BedrockLanguageModelProvider::new(client.http_client(), cx), + Arc::new(OpenRouterLanguageModelProvider::new( + client.http_client(), + cx, + )), cx, ); registry.register_provider( - OpenRouterLanguageModelProvider::new(client.http_client(), cx), + Arc::new(VercelLanguageModelProvider::new(client.http_client(), cx)), cx, ); registry.register_provider( - VercelLanguageModelProvider::new(client.http_client(), cx), + Arc::new(XAiLanguageModelProvider::new(client.http_client(), cx)), cx, ); - registry.register_provider(XAiLanguageModelProvider::new(client.http_client(), cx), cx); - registry.register_provider(CopilotChatLanguageModelProvider::new(cx), cx); + registry.register_provider(Arc::new(CopilotChatLanguageModelProvider::new(cx)), cx); } diff --git a/crates/language_models/src/provider/anthropic.rs b/crates/language_models/src/provider/anthropic.rs index ca7763e2c5cda3c07c5cb51389cb3173a55865e2..2897b836b12d7bcaabfe3841a9f0c77ba6ab497e 100644 --- a/crates/language_models/src/provider/anthropic.rs +++ b/crates/language_models/src/provider/anthropic.rs @@ -1,18 +1,11 @@ -use crate::AllLanguageModelSettings; -use crate::ui::InstructionListItem; use anthropic::{ - AnthropicError, AnthropicModelMode, ContentDelta, Event, ResponseContent, ToolResultContent, - ToolResultPart, Usage, + ANTHROPIC_API_URL, AnthropicError, AnthropicModelMode, ContentDelta, Event, ResponseContent, + ToolResultContent, ToolResultPart, Usage, }; -use anyhow::{Context as _, Result, anyhow}; +use anyhow::{Result, anyhow}; use collections::{BTreeMap, HashMap}; -use credentials_provider::CredentialsProvider; -use editor::{Editor, EditorElement, EditorStyle}; -use futures::Stream; -use futures::{FutureExt, StreamExt, future::BoxFuture, stream::BoxStream}; -use gpui::{ - AnyView, App, AsyncApp, Context, Entity, FontStyle, Subscription, Task, TextStyle, WhiteSpace, -}; +use futures::{FutureExt, Stream, StreamExt, future, future::BoxFuture, stream::BoxStream}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, Task}; use http_client::HttpClient; use language_model::{ AuthenticateError, ConfigurationViewTargetAgent, LanguageModel, @@ -22,16 +15,20 @@ use language_model::{ LanguageModelToolResultContent, MessageContent, RateLimiter, Role, }; use language_model::{LanguageModelCompletionEvent, LanguageModelToolUse, StopReason}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; use settings::{Settings, SettingsStore}; use std::pin::Pin; use std::str::FromStr; -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use strum::IntoEnumIterator; -use theme::ThemeSettings; use ui::{Icon, IconName, List, Tooltip, prelude::*}; -use util::ResultExt; +use ui_input::SingleLineInput; +use util::{ResultExt, truncate_and_trailoff}; +use zed_env_vars::{EnvVar, env_var}; + +use crate::api_key::ApiKeyState; +use crate::ui::InstructionListItem; + +pub use settings::AnthropicAvailableModel as AvailableModel; const PROVIDER_ID: LanguageModelProviderId = language_model::ANTHROPIC_PROVIDER_ID; const PROVIDER_NAME: LanguageModelProviderName = language_model::ANTHROPIC_PROVIDER_NAME; @@ -43,145 +40,57 @@ pub struct AnthropicSettings { pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - /// The model's name in the Anthropic API. e.g. claude-3-5-sonnet-latest, claude-3-opus-20240229, etc - pub name: String, - /// The model's name in Zed's UI, such as in the model selector dropdown menu in the assistant panel. - pub display_name: Option, - /// The model's context window size. - pub max_tokens: u64, - /// A model `name` to substitute when calling tools, in case the primary model doesn't support tool calling. - pub tool_override: Option, - /// Configuration of Anthropic's caching API. - pub cache_configuration: Option, - pub max_output_tokens: Option, - pub default_temperature: Option, - #[serde(default)] - pub extra_beta_headers: Vec, - /// The model's mode (e.g. thinking) - pub mode: Option, -} - -#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema)] -#[serde(tag = "type", rename_all = "lowercase")] -pub enum ModelMode { - #[default] - Default, - Thinking { - /// The maximum number of tokens to use for reasoning. Must be lower than the model's `max_output_tokens`. - budget_tokens: Option, - }, -} - -impl From for AnthropicModelMode { - fn from(value: ModelMode) -> Self { - match value { - ModelMode::Default => AnthropicModelMode::Default, - ModelMode::Thinking { budget_tokens } => AnthropicModelMode::Thinking { budget_tokens }, - } - } -} - -impl From for ModelMode { - fn from(value: AnthropicModelMode) -> Self { - match value { - AnthropicModelMode::Default => ModelMode::Default, - AnthropicModelMode::Thinking { budget_tokens } => ModelMode::Thinking { budget_tokens }, - } - } -} - pub struct AnthropicLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } -const ANTHROPIC_API_KEY_VAR: &str = "ANTHROPIC_API_KEY"; +const API_KEY_ENV_VAR_NAME: &str = "ANTHROPIC_API_KEY"; +static API_KEY_ENV_VAR: LazyLock = env_var!(API_KEY_ENV_VAR_NAME); pub struct State { - api_key: Option, - api_key_from_env: bool, - _subscription: Subscription, + api_key_state: ApiKeyState, } impl State { - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .anthropic - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .ok(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) - } - - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .anthropic - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await - .ok(); - - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - cx.notify(); - }) - }) - } - fn is_authenticated(&self) -> bool { - self.api_key.is_some() + self.api_key_state.has_key() } - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - let key = AnthropicLanguageModelProvider::api_key(cx); - - cx.spawn(async move |this, cx| { - let key = key.await?; - - this.update(cx, |this, cx| { - this.api_key = Some(key.key); - this.api_key_from_env = key.from_env; - cx.notify(); - })?; - - Ok(()) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = AnthropicLanguageModelProvider::api_url(cx); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } -} -pub struct ApiKey { - pub key: String, - pub from_env: bool, + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = AnthropicLanguageModelProvider::api_url(cx); + self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ) + } } impl AnthropicLanguageModelProvider { pub fn new(http_client: Arc, cx: &mut App) -> Self { - let state = cx.new(|cx| State { - api_key: None, - api_key_from_env: false, - _subscription: cx.observe_global::(|_, cx| { + let state = cx.new(|cx| { + cx.observe_global::(|this: &mut State, cx| { + let api_url = Self::api_url(cx); + this.api_key_state.handle_url_change( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); cx.notify(); - }), + }) + .detach(); + State { + api_key_state: ApiKeyState::new(Self::api_url(cx)), + } }); Self { http_client, state } @@ -197,30 +106,16 @@ impl AnthropicLanguageModelProvider { }) } - pub fn api_key(cx: &mut App) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .anthropic - .api_url - .clone(); - - if let Ok(key) = std::env::var(ANTHROPIC_API_KEY_VAR) { - Task::ready(Ok(ApiKey { - key, - from_env: true, - })) + fn settings(cx: &App) -> &AnthropicSettings { + &crate::AllLanguageModelSettings::get_global(cx).anthropic + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + ANTHROPIC_API_URL.into() } else { - cx.spawn(async move |cx| { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - - Ok(ApiKey { - key: String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - from_env: false, - }) - }) + SharedString::new(api_url.as_str()) } } } @@ -228,7 +123,7 @@ impl AnthropicLanguageModelProvider { impl LanguageModelProviderState for AnthropicLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -256,8 +151,8 @@ impl LanguageModelProvider for AnthropicLanguageModelProvider { fn recommended_models(&self, _cx: &App) -> Vec> { [ - anthropic::Model::ClaudeSonnet4, - anthropic::Model::ClaudeSonnet4Thinking, + anthropic::Model::ClaudeSonnet4_5, + anthropic::Model::ClaudeSonnet4_5Thinking, ] .into_iter() .map(|model| self.create_language_model(model)) @@ -275,11 +170,7 @@ impl LanguageModelProvider for AnthropicLanguageModelProvider { } // Override with available models from settings - for model in AllLanguageModelSettings::get_global(cx) - .anthropic - .available_models - .iter() - { + for model in &AnthropicLanguageModelProvider::settings(cx).available_models { models.insert( model.name.clone(), anthropic::Model::Custom { @@ -297,7 +188,7 @@ impl LanguageModelProvider for AnthropicLanguageModelProvider { max_output_tokens: model.max_output_tokens, default_temperature: model.default_temperature, extra_beta_headers: model.extra_beta_headers.clone(), - mode: model.mode.clone().unwrap_or_default().into(), + mode: model.mode.unwrap_or_default().into(), }, ); } @@ -327,14 +218,15 @@ impl LanguageModelProvider for AnthropicLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } pub struct AnthropicModel { id: LanguageModelId, model: anthropic::Model, - state: gpui::Entity, + state: Entity, http_client: Arc, request_limiter: RateLimiter, } @@ -417,11 +309,11 @@ impl AnthropicModel { > { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, cx| { - let settings = &AllLanguageModelSettings::get_global(cx).anthropic; - (state.api_key.clone(), settings.api_url.clone()) + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = AnthropicLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { - return futures::future::ready(Err(anyhow!("App state dropped").into())).boxed(); + return future::ready(Err(anyhow!("App state dropped").into())).boxed(); }; let beta_headers = self.model.beta_headers(); @@ -483,7 +375,10 @@ impl LanguageModel for AnthropicModel { } fn api_key(&self, cx: &App) -> Option { - self.state.read(cx).api_key.clone() + self.state.read_with(cx, |state, cx| { + let api_url = AnthropicLanguageModelProvider::api_url(cx); + state.api_key_state.key(&api_url).map(|key| key.to_string()) + }) } fn max_token_count(&self) -> u64 { @@ -928,8 +823,8 @@ fn convert_usage(usage: &Usage) -> language_model::TokenUsage { } struct ConfigurationView { - api_key_editor: Entity, - state: gpui::Entity, + api_key_editor: Entity, + state: Entity, load_credentials_task: Option>, target_agent: ConfigurationViewTargetAgent, } @@ -938,7 +833,7 @@ impl ConfigurationView { const PLACEHOLDER_TEXT: &'static str = "sk-ant-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; fn new( - state: gpui::Entity, + state: Entity, target_agent: ConfigurationViewTargetAgent, window: &mut Window, cx: &mut Context, @@ -967,11 +862,7 @@ impl ConfigurationView { })); Self { - api_key_editor: cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text(Self::PLACEHOLDER_TEXT, window, cx); - editor - }), + api_key_editor: cx.new(|cx| SingleLineInput::new(window, cx, Self::PLACEHOLDER_TEXT)), state, load_credentials_task, target_agent, @@ -984,15 +875,17 @@ impl ConfigurationView { return; } + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { @@ -1001,36 +894,11 @@ impl ConfigurationView { let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { - state.update(cx, |state, cx| state.reset_api_key(cx))?.await + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await }) .detach_and_log_err(cx); - - cx.notify(); - } - - fn render_api_key_editor(&self, cx: &mut Context) -> impl IntoElement { - let settings = ThemeSettings::get_global(cx); - let text_style = TextStyle { - color: cx.theme().colors().text, - font_family: settings.ui_font.family.clone(), - font_features: settings.ui_font.features.clone(), - font_fallbacks: settings.ui_font.fallbacks.clone(), - font_size: rems(0.875).into(), - font_weight: settings.ui_font.weight, - font_style: FontStyle::Normal, - line_height: relative(1.3), - white_space: WhiteSpace::Normal, - ..Default::default() - }; - EditorElement::new( - &self.api_key_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) } fn should_render_editor(&self, cx: &mut Context) -> bool { @@ -1040,7 +908,7 @@ impl ConfigurationView { impl Render for ConfigurationView { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; + let env_var_set = self.state.read(cx).api_key_state.is_from_env_var(); if self.load_credentials_task.is_some() { div().child(Label::new("Loading credentials...")).into_any() @@ -1065,21 +933,10 @@ impl Render for ConfigurationView { InstructionListItem::text_only("Paste your API key below and hit enter to start using the agent") ) ) - .child( - h_flex() - .w_full() - .my_2() - .px_2() - .py_1() - .bg(cx.theme().colors().editor_background) - .border_1() - .border_color(cx.theme().colors().border) - .rounded_sm() - .child(self.render_api_key_editor(cx)), - ) + .child(self.api_key_editor.clone()) .child( Label::new( - format!("You can also assign the {ANTHROPIC_API_KEY_VAR} environment variable and restart Zed."), + format!("You can also assign the {API_KEY_ENV_VAR_NAME} environment variable and restart Zed."), ) .size(LabelSize::Small) .color(Color::Muted), @@ -1099,9 +956,14 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {ANTHROPIC_API_KEY_VAR} environment variable.") + format!("API key set in {API_KEY_ENV_VAR_NAME} environment variable") } else { - "API key configured.".to_string() + let api_url = AnthropicLanguageModelProvider::api_url(cx); + if api_url == ANTHROPIC_API_URL { + "API key configured".to_string() + } else { + format!("API key configured for {}", truncate_and_trailoff(&api_url, 32)) + } })), ) .child( @@ -1112,7 +974,7 @@ impl Render for ConfigurationView { .icon_position(IconPosition::Start) .disabled(env_var_set) .when(env_var_set, |this| { - this.tooltip(Tooltip::text(format!("To reset your API key, unset the {ANTHROPIC_API_KEY_VAR} environment variable."))) + this.tooltip(Tooltip::text(format!("To reset your API key, unset the {API_KEY_ENV_VAR_NAME} environment variable."))) }) .on_click(cx.listener(|this, _, window, cx| this.reset_api_key(window, cx))), ) diff --git a/crates/language_models/src/provider/bedrock.rs b/crates/language_models/src/provider/bedrock.rs index 49a976d5b18d2c7a2ca3162c632f53706b385cb0..47dd565f6af64d5ddb1d19cd6ed95ceeffd57cc9 100644 --- a/crates/language_models/src/provider/bedrock.rs +++ b/crates/language_models/src/provider/bedrock.rs @@ -23,12 +23,8 @@ use bedrock::{ }; use collections::{BTreeMap, HashMap}; use credentials_provider::CredentialsProvider; -use editor::{Editor, EditorElement, EditorStyle}; use futures::{FutureExt, Stream, StreamExt, future::BoxFuture, stream::BoxStream}; -use gpui::{ - AnyView, App, AsyncApp, Context, Entity, FontStyle, FontWeight, Subscription, Task, TextStyle, - WhiteSpace, -}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, FontWeight, Subscription, Task}; use gpui_tokio::Tokio; use http_client::HttpClient; use language_model::{ @@ -42,11 +38,11 @@ use language_model::{ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_json::Value; -use settings::{Settings, SettingsStore}; +use settings::{BedrockAvailableModel as AvailableModel, Settings, SettingsStore}; use smol::lock::OnceCell; use strum::{EnumIter, IntoEnumIterator, IntoStaticStr}; -use theme::ThemeSettings; use ui::{Icon, IconName, List, Tooltip, prelude::*}; +use ui_input::SingleLineInput; use util::ResultExt; use crate::AllLanguageModelSettings; @@ -83,15 +79,14 @@ pub enum BedrockAuthMethod { Automatic, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub cache_configuration: Option, - pub max_output_tokens: Option, - pub default_temperature: Option, - pub mode: Option, +impl From for BedrockAuthMethod { + fn from(value: settings::BedrockAuthMethodContent) -> Self { + match value { + settings::BedrockAuthMethodContent::SingleSignOn => BedrockAuthMethod::SingleSignOn, + settings::BedrockAuthMethodContent::Automatic => BedrockAuthMethod::Automatic, + settings::BedrockAuthMethodContent::NamedProfile => BedrockAuthMethod::NamedProfile, + } + } } #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema)] @@ -244,7 +239,7 @@ impl State { pub struct BedrockLanguageModelProvider { http_client: AwsHttpClient, handle: tokio::runtime::Handle, - state: gpui::Entity, + state: Entity, } impl BedrockLanguageModelProvider { @@ -367,7 +362,7 @@ impl LanguageModelProvider for BedrockLanguageModelProvider { impl LanguageModelProviderState for BedrockLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -378,7 +373,7 @@ struct BedrockModel { http_client: AwsHttpClient, handle: tokio::runtime::Handle, client: OnceCell, - state: gpui::Entity, + state: Entity, request_limiter: RateLimiter, } @@ -1011,11 +1006,11 @@ pub fn map_to_language_model_completion_events( } struct ConfigurationView { - access_key_id_editor: Entity, - secret_access_key_editor: Entity, - session_token_editor: Entity, - region_editor: Entity, - state: gpui::Entity, + access_key_id_editor: Entity, + secret_access_key_editor: Entity, + session_token_editor: Entity, + region_editor: Entity, + state: Entity, load_credentials_task: Option>, } @@ -1026,7 +1021,7 @@ impl ConfigurationView { const PLACEHOLDER_SESSION_TOKEN_TEXT: &'static str = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; const PLACEHOLDER_REGION: &'static str = "us-east-1"; - fn new(state: gpui::Entity, window: &mut Window, cx: &mut Context) -> Self { + fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { cx.observe(&state, |_, _, cx| { cx.notify(); }) @@ -1052,24 +1047,19 @@ impl ConfigurationView { Self { access_key_id_editor: cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text(Self::PLACEHOLDER_ACCESS_KEY_ID_TEXT, window, cx); - editor + SingleLineInput::new(window, cx, Self::PLACEHOLDER_ACCESS_KEY_ID_TEXT) + .label("Access Key ID") }), secret_access_key_editor: cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text(Self::PLACEHOLDER_SECRET_ACCESS_KEY_TEXT, window, cx); - editor + SingleLineInput::new(window, cx, Self::PLACEHOLDER_SECRET_ACCESS_KEY_TEXT) + .label("Secret Access Key") }), session_token_editor: cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text(Self::PLACEHOLDER_SESSION_TOKEN_TEXT, window, cx); - editor + SingleLineInput::new(window, cx, Self::PLACEHOLDER_SESSION_TOKEN_TEXT) + .label("Session Token (Optional)") }), region_editor: cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text(Self::PLACEHOLDER_REGION, window, cx); - editor + SingleLineInput::new(window, cx, Self::PLACEHOLDER_REGION).label("Region") }), state, load_credentials_task, @@ -1149,41 +1139,6 @@ impl ConfigurationView { .detach_and_log_err(cx); } - fn make_text_style(&self, cx: &Context) -> TextStyle { - let settings = ThemeSettings::get_global(cx); - TextStyle { - color: cx.theme().colors().text, - font_family: settings.ui_font.family.clone(), - font_features: settings.ui_font.features.clone(), - font_fallbacks: settings.ui_font.fallbacks.clone(), - font_size: rems(0.875).into(), - font_weight: settings.ui_font.weight, - font_style: FontStyle::Normal, - line_height: relative(1.3), - background_color: None, - underline: None, - strikethrough: None, - white_space: WhiteSpace::Normal, - text_overflow: None, - text_align: Default::default(), - line_clamp: None, - } - } - - fn make_input_styles(&self, cx: &Context) -> Div { - let bg_color = cx.theme().colors().editor_background; - let border_color = cx.theme().colors().border; - - h_flex() - .w_full() - .px_2() - .py_1() - .bg(bg_color) - .border_1() - .border_color(border_color) - .rounded_sm() - } - fn should_render_editor(&self, cx: &Context) -> bool { self.state.read(cx).is_authenticated() } @@ -1266,8 +1221,8 @@ impl Render for ConfigurationView { ) ) ) - .child(self.render_static_credentials_ui(cx)) - .child(self.render_common_fields(cx)) + .child(self.render_static_credentials_ui()) + .child(self.region_editor.clone()) .child( Label::new( format!("You can also assign the {ZED_BEDROCK_ACCESS_KEY_ID_VAR}, {ZED_BEDROCK_SECRET_ACCESS_KEY_VAR} AND {ZED_BEDROCK_REGION_VAR} environment variables and restart Zed."), @@ -1288,63 +1243,7 @@ impl Render for ConfigurationView { } impl ConfigurationView { - fn render_access_key_id_editor(&self, cx: &mut Context) -> impl IntoElement { - let text_style = self.make_text_style(cx); - - EditorElement::new( - &self.access_key_id_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) - } - - fn render_secret_key_editor(&self, cx: &mut Context) -> impl IntoElement { - let text_style = self.make_text_style(cx); - - EditorElement::new( - &self.secret_access_key_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) - } - - fn render_session_token_editor(&self, cx: &mut Context) -> impl IntoElement { - let text_style = self.make_text_style(cx); - - EditorElement::new( - &self.session_token_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) - } - - fn render_region_editor(&self, cx: &mut Context) -> impl IntoElement { - let text_style = self.make_text_style(cx); - - EditorElement::new( - &self.region_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) - } - - fn render_static_credentials_ui(&self, cx: &mut Context) -> AnyElement { + fn render_static_credentials_ui(&self) -> AnyElement { v_flex() .my_2() .gap_1p5() @@ -1377,41 +1276,10 @@ impl ConfigurationView { "Enter these credentials below", )), ) - .child( - v_flex() - .gap_0p5() - .child(Label::new("Access Key ID").size(LabelSize::Small)) - .child( - self.make_input_styles(cx) - .child(self.render_access_key_id_editor(cx)), - ), - ) - .child( - v_flex() - .gap_0p5() - .child(Label::new("Secret Access Key").size(LabelSize::Small)) - .child(self.make_input_styles(cx).child(self.render_secret_key_editor(cx))), - ) - .child( - v_flex() - .gap_0p5() - .child(Label::new("Session Token (Optional)").size(LabelSize::Small)) - .child( - self.make_input_styles(cx) - .child(self.render_session_token_editor(cx)), - ), - ) - .into_any_element() - } - - fn render_common_fields(&self, cx: &mut Context) -> AnyElement { - v_flex() - .gap_0p5() - .child(Label::new("Region").size(LabelSize::Small)) - .child( - self.make_input_styles(cx) - .child(self.render_region_editor(cx)), - ) + .child(self.access_key_id_editor.clone()) + .child(self.secret_access_key_editor.clone()) + .child(self.session_token_editor.clone()) + .child(self.region_editor.clone()) .into_any_element() } } diff --git a/crates/language_models/src/provider/cloud.rs b/crates/language_models/src/provider/cloud.rs index 421e34e658fb604e21fdfc4af52b3c4c7874fd70..1c21e566d68df3191932a860b6ed06ea603083a6 100644 --- a/crates/language_models/src/provider/cloud.rs +++ b/crates/language_models/src/provider/cloud.rs @@ -4,12 +4,12 @@ use anyhow::{Context as _, Result, anyhow}; use chrono::{DateTime, Utc}; use client::{Client, ModelRequestUsage, UserStore, zed_urls}; use cloud_llm_client::{ - CLIENT_SUPPORTS_STATUS_MESSAGES_HEADER_NAME, CURRENT_PLAN_HEADER_NAME, CompletionBody, - CompletionEvent, CompletionRequestStatus, CountTokensBody, CountTokensResponse, - EXPIRED_LLM_TOKEN_HEADER_NAME, ListModelsResponse, MODEL_REQUESTS_RESOURCE_HEADER_VALUE, Plan, - PlanV1, PlanV2, SERVER_SUPPORTS_STATUS_MESSAGES_HEADER_NAME, - SUBSCRIPTION_LIMIT_RESOURCE_HEADER_NAME, TOOL_USE_LIMIT_REACHED_HEADER_NAME, - ZED_VERSION_HEADER_NAME, + CLIENT_SUPPORTS_STATUS_MESSAGES_HEADER_NAME, CLIENT_SUPPORTS_X_AI_HEADER_NAME, + CURRENT_PLAN_HEADER_NAME, CompletionBody, CompletionEvent, CompletionRequestStatus, + CountTokensBody, CountTokensResponse, EXPIRED_LLM_TOKEN_HEADER_NAME, ListModelsResponse, + MODEL_REQUESTS_RESOURCE_HEADER_VALUE, Plan, PlanV1, PlanV2, + SERVER_SUPPORTS_STATUS_MESSAGES_HEADER_NAME, SUBSCRIPTION_LIMIT_RESOURCE_HEADER_NAME, + TOOL_USE_LIMIT_REACHED_HEADER_NAME, ZED_VERSION_HEADER_NAME, }; use futures::{ AsyncBufReadExt, FutureExt, Stream, StreamExt, future::BoxFuture, stream::BoxStream, @@ -19,7 +19,7 @@ use gpui::{ AnyElement, AnyView, App, AsyncApp, Context, Entity, SemanticVersion, Subscription, Task, }; use http_client::http::{HeaderMap, HeaderValue}; -use http_client::{AsyncBody, HttpClient, Method, Response, StatusCode}; +use http_client::{AsyncBody, HttpClient, HttpRequestExt, Method, Response, StatusCode}; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCacheConfiguration, LanguageModelCompletionError, LanguageModelCompletionEvent, LanguageModelId, LanguageModelName, @@ -32,6 +32,8 @@ use release_channel::AppVersion; use schemars::JsonSchema; use serde::{Deserialize, Serialize, de::DeserializeOwned}; use settings::SettingsStore; +pub use settings::ZedDotDevAvailableModel as AvailableModel; +pub use settings::ZedDotDevAvailableProvider as AvailableProvider; use smol::io::{AsyncReadExt, BufReader}; use std::pin::Pin; use std::str::FromStr as _; @@ -44,6 +46,7 @@ use util::{ResultExt as _, maybe}; use crate::provider::anthropic::{AnthropicEventMapper, count_anthropic_tokens, into_anthropic}; use crate::provider::google::{GoogleEventMapper, into_google}; use crate::provider::open_ai::{OpenAiEventMapper, count_open_ai_tokens, into_open_ai}; +use crate::provider::x_ai::count_xai_tokens; const PROVIDER_ID: LanguageModelProviderId = language_model::ZED_CLOUD_PROVIDER_ID; const PROVIDER_NAME: LanguageModelProviderName = language_model::ZED_CLOUD_PROVIDER_NAME; @@ -52,42 +55,6 @@ const PROVIDER_NAME: LanguageModelProviderName = language_model::ZED_CLOUD_PROVI pub struct ZedDotDevSettings { pub available_models: Vec, } - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "lowercase")] -pub enum AvailableProvider { - Anthropic, - OpenAi, - Google, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - /// The provider of the language model. - pub provider: AvailableProvider, - /// The model's name in the provider's API. e.g. claude-3-5-sonnet-20240620 - pub name: String, - /// The name displayed in the UI, such as in the assistant panel model dropdown menu. - pub display_name: Option, - /// The size of the context window, indicating the maximum number of tokens the model can process. - pub max_tokens: usize, - /// The maximum number of output tokens allowed by the model. - pub max_output_tokens: Option, - /// The maximum number of completion tokens allowed by the model (o1-* only) - pub max_completion_tokens: Option, - /// Override this model with a different Anthropic model for tool calls. - pub tool_override: Option, - /// Indicates whether this custom model supports caching. - pub cache_configuration: Option, - /// The default temperature to use for this model. - pub default_temperature: Option, - /// Any extra beta headers to provide when using the model. - #[serde(default)] - pub extra_beta_headers: Vec, - /// The model's mode (e.g. thinking) - pub mode: Option, -} - #[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] #[serde(tag = "type", rename_all = "lowercase")] pub enum ModelMode { @@ -110,7 +77,7 @@ impl From for AnthropicModelMode { pub struct CloudLanguageModelProvider { client: Arc, - state: gpui::Entity, + state: Entity, _maintain_client_status: Task<()>, } @@ -215,11 +182,21 @@ impl State { self.default_model = models .iter() - .find(|model| model.id == response.default_model) + .find(|model| { + response + .default_model + .as_ref() + .is_some_and(|default_model_id| &model.id == default_model_id) + }) .cloned(); self.default_fast_model = models .iter() - .find(|model| model.id == response.default_fast_model) + .find(|model| { + response + .default_fast_model + .as_ref() + .is_some_and(|default_fast_model_id| &model.id == default_fast_model_id) + }) .cloned(); self.recommended_models = response .recommended_models @@ -240,6 +217,7 @@ impl State { let request = http_client::Request::builder() .method(Method::GET) + .header(CLIENT_SUPPORTS_X_AI_HEADER_NAME, "true") .uri(http_client.build_zed_llm_url("/models", &[])?.as_ref()) .header("Authorization", format!("Bearer {token}")) .body(AsyncBody::empty())?; @@ -311,7 +289,7 @@ impl CloudLanguageModelProvider { impl LanguageModelProviderState for CloudLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -415,20 +393,17 @@ impl CloudLanguageModel { let mut refreshed_token = false; loop { - let request_builder = http_client::Request::builder() + let request = http_client::Request::builder() .method(Method::POST) - .uri(http_client.build_zed_llm_url("/completions", &[])?.as_ref()); - let request_builder = if let Some(app_version) = app_version { - request_builder.header(ZED_VERSION_HEADER_NAME, app_version.to_string()) - } else { - request_builder - }; - - let request = request_builder + .uri(http_client.build_zed_llm_url("/completions", &[])?.as_ref()) + .when_some(app_version, |builder, app_version| { + builder.header(ZED_VERSION_HEADER_NAME, app_version.to_string()) + }) .header("Content-Type", "application/json") .header("Authorization", format!("Bearer {token}")) .header(CLIENT_SUPPORTS_STATUS_MESSAGES_HEADER_NAME, "true") .body(serde_json::to_string(&body)?.into())?; + let mut response = http_client.send(request).await?; let status = response.status(); if status.is_success() { @@ -541,29 +516,36 @@ where impl From for LanguageModelCompletionError { fn from(error: ApiError) -> Self { - if let Ok(cloud_error) = serde_json::from_str::(&error.body) - && cloud_error.code.starts_with("upstream_http_") - { - let status = if let Some(status) = cloud_error.upstream_status { - status - } else if cloud_error.code.ends_with("_error") { - error.status - } else { - // If there's a status code in the code string (e.g. "upstream_http_429") - // then use that; otherwise, see if the JSON contains a status code. - cloud_error - .code - .strip_prefix("upstream_http_") - .and_then(|code_str| code_str.parse::().ok()) - .and_then(|code| StatusCode::from_u16(code).ok()) - .unwrap_or(error.status) - }; - - return LanguageModelCompletionError::UpstreamProviderError { - message: cloud_error.message, - status, - retry_after: cloud_error.retry_after.map(Duration::from_secs_f64), - }; + if let Ok(cloud_error) = serde_json::from_str::(&error.body) { + if cloud_error.code.starts_with("upstream_http_") { + let status = if let Some(status) = cloud_error.upstream_status { + status + } else if cloud_error.code.ends_with("_error") { + error.status + } else { + // If there's a status code in the code string (e.g. "upstream_http_429") + // then use that; otherwise, see if the JSON contains a status code. + cloud_error + .code + .strip_prefix("upstream_http_") + .and_then(|code_str| code_str.parse::().ok()) + .and_then(|code| StatusCode::from_u16(code).ok()) + .unwrap_or(error.status) + }; + + return LanguageModelCompletionError::UpstreamProviderError { + message: cloud_error.message, + status, + retry_after: cloud_error.retry_after.map(Duration::from_secs_f64), + }; + } + + return LanguageModelCompletionError::from_http_status( + PROVIDER_NAME, + error.status, + cloud_error.message, + None, + ); } let retry_after = None; @@ -599,6 +581,7 @@ impl LanguageModel for CloudLanguageModel { Anthropic => language_model::ANTHROPIC_PROVIDER_ID, OpenAi => language_model::OPEN_AI_PROVIDER_ID, Google => language_model::GOOGLE_PROVIDER_ID, + XAi => language_model::X_AI_PROVIDER_ID, } } @@ -608,6 +591,7 @@ impl LanguageModel for CloudLanguageModel { Anthropic => language_model::ANTHROPIC_PROVIDER_NAME, OpenAi => language_model::OPEN_AI_PROVIDER_NAME, Google => language_model::GOOGLE_PROVIDER_NAME, + XAi => language_model::X_AI_PROVIDER_NAME, } } @@ -638,7 +622,8 @@ impl LanguageModel for CloudLanguageModel { fn tool_input_format(&self) -> LanguageModelToolSchemaFormat { match self.model.provider { cloud_llm_client::LanguageModelProvider::Anthropic - | cloud_llm_client::LanguageModelProvider::OpenAi => { + | cloud_llm_client::LanguageModelProvider::OpenAi + | cloud_llm_client::LanguageModelProvider::XAi => { LanguageModelToolSchemaFormat::JsonSchema } cloud_llm_client::LanguageModelProvider::Google => { @@ -668,6 +653,7 @@ impl LanguageModel for CloudLanguageModel { }) } cloud_llm_client::LanguageModelProvider::OpenAi + | cloud_llm_client::LanguageModelProvider::XAi | cloud_llm_client::LanguageModelProvider::Google => None, } } @@ -688,6 +674,13 @@ impl LanguageModel for CloudLanguageModel { }; count_open_ai_tokens(request, model, cx) } + cloud_llm_client::LanguageModelProvider::XAi => { + let model = match x_ai::Model::from_id(&self.model.id.0) { + Ok(model) => model, + Err(err) => return async move { Err(anyhow!(err)) }.boxed(), + }; + count_xai_tokens(request, model, cx) + } cloud_llm_client::LanguageModelProvider::Google => { let client = self.client.clone(); let llm_api_token = self.llm_api_token.clone(); @@ -865,6 +858,56 @@ impl LanguageModel for CloudLanguageModel { }); async move { Ok(future.await?.boxed()) }.boxed() } + cloud_llm_client::LanguageModelProvider::XAi => { + let client = self.client.clone(); + let model = match x_ai::Model::from_id(&self.model.id.0) { + Ok(model) => model, + Err(err) => return async move { Err(anyhow!(err).into()) }.boxed(), + }; + let request = into_open_ai( + request, + model.id(), + model.supports_parallel_tool_calls(), + model.supports_prompt_cache_key(), + None, + None, + ); + let llm_api_token = self.llm_api_token.clone(); + let future = self.request_limiter.stream(async move { + let PerformLlmCompletionResponse { + response, + usage, + includes_status_messages, + tool_use_limit_reached, + } = Self::perform_llm_completion( + client.clone(), + llm_api_token, + app_version, + CompletionBody { + thread_id, + prompt_id, + intent, + mode, + provider: cloud_llm_client::LanguageModelProvider::XAi, + model: request.model.clone(), + provider_request: serde_json::to_value(&request) + .map_err(|e| anyhow!(e))?, + }, + ) + .await?; + + let mut mapper = OpenAiEventMapper::new(); + Ok(map_cloud_completion_events( + Box::pin( + response_lines(response, includes_status_messages) + .chain(usage_updated_event(usage)) + .chain(tool_use_limit_reached_event(tool_use_limit_reached)), + ), + move |event| mapper.map_event(event), + )) + }); + async move { Ok(future.await?.boxed()) }.boxed() + } cloud_llm_client::LanguageModelProvider::Google => { let client = self.client.clone(); let request = @@ -994,8 +1037,6 @@ struct ZedAiConfiguration { impl RenderOnce for ZedAiConfiguration { fn render(self, _window: &mut Window, _cx: &mut App) -> impl IntoElement { - let young_account_banner = YoungAccountBanner; - let is_pro = self.plan.is_some_and(|plan| { matches!(plan, Plan::V1(PlanV1::ZedPro) | Plan::V2(PlanV2::ZedPro)) }); @@ -1006,9 +1047,16 @@ impl RenderOnce for ZedAiConfiguration { (Some(Plan::V1(PlanV1::ZedProTrial) | Plan::V2(PlanV2::ZedProTrial)), Some(_)) => { "You have access to Zed's hosted models through your Pro trial." } - (Some(Plan::V1(PlanV1::ZedFree) | Plan::V2(PlanV2::ZedFree)), Some(_)) => { + (Some(Plan::V1(PlanV1::ZedFree)), Some(_)) => { "You have basic access to Zed's hosted models through the Free plan." } + (Some(Plan::V2(PlanV2::ZedFree)), Some(_)) => { + if self.eligible_for_trial { + "Subscribe for access to Zed's hosted models. Start with a 14 day free trial." + } else { + "Subscribe for access to Zed's hosted models." + } + } _ => { if self.eligible_for_trial { "Subscribe for access to Zed's hosted models. Start with a 14 day free trial." @@ -1058,7 +1106,7 @@ impl RenderOnce for ZedAiConfiguration { v_flex().gap_2().w_full().map(|this| { if self.account_too_young { - this.child(young_account_banner).child( + this.child(YoungAccountBanner).child( Button::new("upgrade", "Upgrade to Pro") .style(ui::ButtonStyle::Tinted(ui::TintColor::Accent)) .full_width() diff --git a/crates/language_models/src/provider/copilot_chat.rs b/crates/language_models/src/provider/copilot_chat.rs index b7ece55fed70beae543b9bd55e7635fa6a3fc04d..64a2c65f0d2bcc4240e980922930e24240ce3249 100644 --- a/crates/language_models/src/provider/copilot_chat.rs +++ b/crates/language_models/src/provider/copilot_chat.rs @@ -89,7 +89,7 @@ impl CopilotChatLanguageModelProvider { impl LanguageModelProviderState for CopilotChatLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } diff --git a/crates/language_models/src/provider/deepseek.rs b/crates/language_models/src/provider/deepseek.rs index 82bf067cd475fe031630767da9e4302afa4d78ec..ec420bfd83b427701ffa6eb13a9eb6035604f0b1 100644 --- a/crates/language_models/src/provider/deepseek.rs +++ b/crates/language_models/src/provider/deepseek.rs @@ -1,13 +1,10 @@ -use anyhow::{Context as _, Result, anyhow}; +use anyhow::{Result, anyhow}; use collections::{BTreeMap, HashMap}; -use credentials_provider::CredentialsProvider; -use editor::{Editor, EditorElement, EditorStyle}; +use deepseek::DEEPSEEK_API_URL; + use futures::Stream; -use futures::{FutureExt, StreamExt, future::BoxFuture, stream::BoxStream}; -use gpui::{ - AnyView, AppContext as _, AsyncApp, Entity, FontStyle, Subscription, Task, TextStyle, - WhiteSpace, -}; +use futures::{FutureExt, StreamExt, future, future::BoxFuture, stream::BoxStream}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -16,21 +13,24 @@ use language_model::{ LanguageModelToolChoice, LanguageModelToolResultContent, LanguageModelToolUse, MessageContent, RateLimiter, Role, StopReason, TokenUsage, }; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +pub use settings::DeepseekAvailableModel as AvailableModel; use settings::{Settings, SettingsStore}; use std::pin::Pin; use std::str::FromStr; -use std::sync::Arc; -use theme::ThemeSettings; +use std::sync::{Arc, LazyLock}; + use ui::{Icon, IconName, List, prelude::*}; -use util::ResultExt; +use ui_input::SingleLineInput; +use util::{ResultExt, truncate_and_trailoff}; +use zed_env_vars::{EnvVar, env_var}; -use crate::{AllLanguageModelSettings, ui::InstructionListItem}; +use crate::{api_key::ApiKeyState, ui::InstructionListItem}; const PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId::new("deepseek"); const PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("DeepSeek"); -const DEEPSEEK_API_KEY_VAR: &str = "DEEPSEEK_API_KEY"; + +const API_KEY_ENV_VAR_NAME: &str = "DEEPSEEK_API_KEY"; +static API_KEY_ENV_VAR: LazyLock = env_var!(API_KEY_ENV_VAR_NAME); #[derive(Default)] struct RawToolCall { @@ -44,110 +44,54 @@ pub struct DeepSeekSettings { pub api_url: String, pub available_models: Vec, } - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub max_output_tokens: Option, -} - pub struct DeepSeekLanguageModelProvider { http_client: Arc, state: Entity, } pub struct State { - api_key: Option, - api_key_from_env: bool, - _subscription: Subscription, + api_key_state: ApiKeyState, } impl State { fn is_authenticated(&self) -> bool { - self.api_key.is_some() - } - - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .deepseek - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) + self.api_key_state.has_key() } - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .deepseek - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await?; - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - cx.notify(); - }) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = DeepSeekLanguageModelProvider::api_url(cx); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .deepseek - .api_url - .clone(); - cx.spawn(async move |this, cx| { - let (api_key, from_env) = if let Ok(api_key) = std::env::var(DEEPSEEK_API_KEY_VAR) { - (api_key, true) - } else { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - ( - String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - false, - ) - }; - - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.api_key_from_env = from_env; - cx.notify(); - })?; - - Ok(()) - }) + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = DeepSeekLanguageModelProvider::api_url(cx); + self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ) } } impl DeepSeekLanguageModelProvider { pub fn new(http_client: Arc, cx: &mut App) -> Self { - let state = cx.new(|cx| State { - api_key: None, - api_key_from_env: false, - _subscription: cx.observe_global::(|_this: &mut State, cx| { + let state = cx.new(|cx| { + cx.observe_global::(|this: &mut State, cx| { + let api_url = Self::api_url(cx); + this.api_key_state.handle_url_change( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); cx.notify(); - }), + }) + .detach(); + State { + api_key_state: ApiKeyState::new(Self::api_url(cx)), + } }); Self { http_client, state } @@ -160,7 +104,20 @@ impl DeepSeekLanguageModelProvider { state: self.state.clone(), http_client: self.http_client.clone(), request_limiter: RateLimiter::new(4), - }) as Arc + }) + } + + fn settings(cx: &App) -> &DeepSeekSettings { + &crate::AllLanguageModelSettings::get_global(cx).deepseek + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + DEEPSEEK_API_URL.into() + } else { + SharedString::new(api_url.as_str()) + } } } @@ -199,11 +156,7 @@ impl LanguageModelProvider for DeepSeekLanguageModelProvider { models.insert("deepseek-chat", deepseek::Model::Chat); models.insert("deepseek-reasoner", deepseek::Model::Reasoner); - for available_model in AllLanguageModelSettings::get_global(cx) - .deepseek - .available_models - .iter() - { + for available_model in &Self::settings(cx).available_models { models.insert( &available_model.name, deepseek::Model::Custom { @@ -240,7 +193,8 @@ impl LanguageModelProvider for DeepSeekLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } @@ -259,15 +213,20 @@ impl DeepSeekLanguageModel { cx: &AsyncApp, ) -> BoxFuture<'static, Result>>> { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, cx| { - let settings = &AllLanguageModelSettings::get_global(cx).deepseek; - (state.api_key.clone(), settings.api_url.clone()) + + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = DeepSeekLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { - return futures::future::ready(Err(anyhow!("App state dropped"))).boxed(); + return future::ready(Err(anyhow!("App state dropped"))).boxed(); }; let future = self.request_limiter.stream(async move { - let api_key = api_key.context("Missing DeepSeek API Key")?; + let Some(api_key) = api_key else { + return Err(LanguageModelCompletionError::NoApiKey { + provider: PROVIDER_NAME, + }); + }; let request = deepseek::stream_completion(http_client.as_ref(), &api_url, &api_key, request); let response = request.await?; @@ -566,18 +525,15 @@ impl DeepSeekEventMapper { } struct ConfigurationView { - api_key_editor: Entity, + api_key_editor: Entity, state: Entity, load_credentials_task: Option>, } impl ConfigurationView { fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { - let api_key_editor = cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text("sk-00000000000000000000000000000000", window, cx); - editor - }); + let api_key_editor = + cx.new(|cx| SingleLineInput::new(window, cx, "sk-00000000000000000000000000000000")); cx.observe(&state, |_, _, cx| { cx.notify(); @@ -610,7 +566,7 @@ impl ConfigurationView { } fn save_api_key(&mut self, _: &menu::Confirm, _window: &mut Window, cx: &mut Context) { - let api_key = self.api_key_editor.read(cx).text(cx); + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); if api_key.is_empty() { return; } @@ -618,12 +574,10 @@ impl ConfigurationView { let state = self.state.clone(); cx.spawn(async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { @@ -631,38 +585,12 @@ impl ConfigurationView { .update(cx, |editor, cx| editor.set_text("", window, cx)); let state = self.state.clone(); - cx.spawn(async move |_, cx| state.update(cx, |state, cx| state.reset_api_key(cx))?.await) - .detach_and_log_err(cx); - - cx.notify(); - } - - fn render_api_key_editor(&self, cx: &mut Context) -> impl IntoElement { - let settings = ThemeSettings::get_global(cx); - let text_style = TextStyle { - color: cx.theme().colors().text, - font_family: settings.ui_font.family.clone(), - font_features: settings.ui_font.features.clone(), - font_fallbacks: settings.ui_font.fallbacks.clone(), - font_size: rems(0.875).into(), - font_weight: settings.ui_font.weight, - font_style: FontStyle::Normal, - line_height: relative(1.3), - background_color: None, - underline: None, - strikethrough: None, - white_space: WhiteSpace::Normal, - ..Default::default() - }; - EditorElement::new( - &self.api_key_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) + cx.spawn(async move |_, cx| { + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await + }) + .detach_and_log_err(cx); } fn should_render_editor(&self, cx: &mut Context) -> bool { @@ -672,7 +600,7 @@ impl ConfigurationView { impl Render for ConfigurationView { fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; + let env_var_set = self.state.read(cx).api_key_state.is_from_env_var(); if self.load_credentials_task.is_some() { div().child(Label::new("Loading credentials...")).into_any() @@ -692,22 +620,10 @@ impl Render for ConfigurationView { "Paste your API key below and hit enter to start using the assistant", )), ) - .child( - h_flex() - .w_full() - .my_2() - .px_2() - .py_1() - .bg(cx.theme().colors().editor_background) - .border_1() - .border_color(cx.theme().colors().border) - .rounded_sm() - .child(self.render_api_key_editor(cx)), - ) + .child(self.api_key_editor.clone()) .child( Label::new(format!( - "Or set the {} environment variable.", - DEEPSEEK_API_KEY_VAR + "Or set the {API_KEY_ENV_VAR_NAME} environment variable." )) .size(LabelSize::Small) .color(Color::Muted), @@ -727,9 +643,17 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {}", DEEPSEEK_API_KEY_VAR) + format!("API key set in {API_KEY_ENV_VAR_NAME} environment variable") } else { - "API key configured".to_string() + let api_url = DeepSeekLanguageModelProvider::api_url(cx); + if api_url == DEEPSEEK_API_URL { + "API key configured".to_string() + } else { + format!( + "API key configured for {}", + truncate_and_trailoff(&api_url, 32) + ) + } })), ) .child( diff --git a/crates/language_models/src/provider/google.rs b/crates/language_models/src/provider/google.rs index 939cf0ca60d92d713b90a5d62e8ec7f6dac7ec46..f6ac364611c0e121115a4bd692893ed8bfa89ab3 100644 --- a/crates/language_models/src/provider/google.rs +++ b/crates/language_models/src/provider/google.rs @@ -1,15 +1,12 @@ use anyhow::{Context as _, Result, anyhow}; use collections::BTreeMap; use credentials_provider::CredentialsProvider; -use editor::{Editor, EditorElement, EditorStyle}; -use futures::{FutureExt, Stream, StreamExt, future::BoxFuture}; +use futures::{FutureExt, Stream, StreamExt, future, future::BoxFuture}; use google_ai::{ FunctionDeclaration, GenerateContentResponse, GoogleModelMode, Part, SystemInstruction, ThinkingConfig, UsageMetadata, }; -use gpui::{ - AnyView, App, AsyncApp, Context, Entity, FontStyle, Subscription, Task, TextStyle, WhiteSpace, -}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window}; use http_client::HttpClient; use language_model::{ AuthenticateError, ConfigurationViewTargetAgent, LanguageModelCompletionError, @@ -23,22 +20,23 @@ use language_model::{ }; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +pub use settings::GoogleAvailableModel as AvailableModel; use settings::{Settings, SettingsStore}; use std::pin::Pin; use std::sync::{ - Arc, + Arc, LazyLock, atomic::{self, AtomicU64}, }; use strum::IntoEnumIterator; -use theme::ThemeSettings; use ui::{Icon, IconName, List, Tooltip, prelude::*}; -use util::ResultExt; +use ui_input::SingleLineInput; +use util::{ResultExt, truncate_and_trailoff}; +use zed_env_vars::EnvVar; -use crate::AllLanguageModelSettings; +use crate::api_key::ApiKey; +use crate::api_key::ApiKeyState; use crate::ui::InstructionListItem; -use super::anthropic::ApiKey; - const PROVIDER_ID: LanguageModelProviderId = language_model::GOOGLE_PROVIDER_ID; const PROVIDER_NAME: LanguageModelProviderName = language_model::GOOGLE_PROVIDER_NAME; @@ -59,133 +57,62 @@ pub enum ModelMode { }, } -impl From for GoogleModelMode { - fn from(value: ModelMode) -> Self { - match value { - ModelMode::Default => GoogleModelMode::Default, - ModelMode::Thinking { budget_tokens } => GoogleModelMode::Thinking { budget_tokens }, - } - } -} - -impl From for ModelMode { - fn from(value: GoogleModelMode) -> Self { - match value { - GoogleModelMode::Default => ModelMode::Default, - GoogleModelMode::Thinking { budget_tokens } => ModelMode::Thinking { budget_tokens }, - } - } -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - name: String, - display_name: Option, - max_tokens: u64, - mode: Option, -} - pub struct GoogleLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { - api_key: Option, - api_key_from_env: bool, - _subscription: Subscription, + api_key_state: ApiKeyState, } -const GEMINI_API_KEY_VAR: &str = "GEMINI_API_KEY"; -const GOOGLE_AI_API_KEY_VAR: &str = "GOOGLE_AI_API_KEY"; +const GEMINI_API_KEY_VAR_NAME: &str = "GEMINI_API_KEY"; +const GOOGLE_AI_API_KEY_VAR_NAME: &str = "GOOGLE_AI_API_KEY"; + +static API_KEY_ENV_VAR: LazyLock = LazyLock::new(|| { + // Try GEMINI_API_KEY first as primary, fallback to GOOGLE_AI_API_KEY + EnvVar::new(GEMINI_API_KEY_VAR_NAME.into()).or(EnvVar::new(GOOGLE_AI_API_KEY_VAR_NAME.into())) +}); impl State { fn is_authenticated(&self) -> bool { - self.api_key.is_some() + self.api_key_state.has_key() } - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .google - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = GoogleLanguageModelProvider::api_url(cx); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .google - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await?; - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - cx.notify(); - }) - }) - } - - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .google - .api_url - .clone(); - - cx.spawn(async move |this, cx| { - let (api_key, from_env) = if let Ok(api_key) = std::env::var(GOOGLE_AI_API_KEY_VAR) { - (api_key, true) - } else if let Ok(api_key) = std::env::var(GEMINI_API_KEY_VAR) { - (api_key, true) - } else { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - ( - String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - false, - ) - }; - - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.api_key_from_env = from_env; - cx.notify(); - })?; - - Ok(()) - }) + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = GoogleLanguageModelProvider::api_url(cx); + self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ) } } impl GoogleLanguageModelProvider { pub fn new(http_client: Arc, cx: &mut App) -> Self { - let state = cx.new(|cx| State { - api_key: None, - api_key_from_env: false, - _subscription: cx.observe_global::(|_, cx| { + let state = cx.new(|cx| { + cx.observe_global::(|this: &mut State, cx| { + let api_url = Self::api_url(cx); + this.api_key_state.handle_url_change( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); cx.notify(); - }), + }) + .detach(); + State { + api_key_state: ApiKeyState::new(Self::api_url(cx)), + } }); Self { http_client, state } @@ -201,30 +128,32 @@ impl GoogleLanguageModelProvider { }) } - pub fn api_key(cx: &mut App) -> Task> { + pub fn api_key_for_gemini_cli(cx: &mut App) -> Task> { + if let Some(key) = API_KEY_ENV_VAR.value.clone() { + return Task::ready(Ok(key)); + } let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .google - .api_url - .clone(); - - if let Ok(key) = std::env::var(GEMINI_API_KEY_VAR) { - Task::ready(Ok(ApiKey { - key, - from_env: true, - })) - } else { - cx.spawn(async move |cx| { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) + let api_url = Self::api_url(cx).to_string(); + cx.spawn(async move |cx| { + Ok( + ApiKey::load_from_system_keychain(&api_url, credentials_provider.as_ref(), cx) .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; + .key() + .to_string(), + ) + }) + } - Ok(ApiKey { - key: String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - from_env: false, - }) - }) + fn settings(cx: &App) -> &GoogleSettings { + &crate::AllLanguageModelSettings::get_global(cx).google + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + google_ai::API_URL.into() + } else { + SharedString::new(api_url.as_str()) } } } @@ -232,7 +161,7 @@ impl GoogleLanguageModelProvider { impl LanguageModelProviderState for GoogleLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -269,17 +198,14 @@ impl LanguageModelProvider for GoogleLanguageModelProvider { } // Override with available models from settings - for model in &AllLanguageModelSettings::get_global(cx) - .google - .available_models - { + for model in &GoogleLanguageModelProvider::settings(cx).available_models { models.insert( model.name.clone(), google_ai::Model::Custom { name: model.name.clone(), display_name: model.display_name.clone(), max_tokens: model.max_tokens, - mode: model.mode.unwrap_or_default().into(), + mode: model.mode.unwrap_or_default(), }, ); } @@ -317,14 +243,15 @@ impl LanguageModelProvider for GoogleLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } pub struct GoogleLanguageModel { id: LanguageModelId, model: google_ai::Model, - state: gpui::Entity, + state: Entity, http_client: Arc, request_limiter: RateLimiter, } @@ -340,11 +267,11 @@ impl GoogleLanguageModel { > { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, cx| { - let settings = &AllLanguageModelSettings::get_global(cx).google; - (state.api_key.clone(), settings.api_url.clone()) + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = GoogleLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { - return futures::future::ready(Err(anyhow!("App state dropped"))).boxed(); + return future::ready(Err(anyhow!("App state dropped"))).boxed(); }; async move { @@ -418,13 +345,16 @@ impl LanguageModel for GoogleLanguageModel { let model_id = self.model.request_id().to_string(); let request = into_google(request, model_id, self.model.mode()); let http_client = self.http_client.clone(); - let api_key = self.state.read(cx).api_key.clone(); - - let settings = &AllLanguageModelSettings::get_global(cx).google; - let api_url = settings.api_url.clone(); + let api_url = GoogleLanguageModelProvider::api_url(cx); + let api_key = self.state.read(cx).api_key_state.key(&api_url); async move { - let api_key = api_key.context("Missing Google API key")?; + let Some(api_key) = api_key else { + return Err(LanguageModelCompletionError::NoApiKey { + provider: PROVIDER_NAME, + } + .into()); + }; let response = google_ai::count_tokens( http_client.as_ref(), &api_url, @@ -678,6 +608,24 @@ impl GoogleEventMapper { convert_usage(&self.usage), ))) } + + if let Some(prompt_feedback) = event.prompt_feedback + && let Some(block_reason) = prompt_feedback.block_reason.as_deref() + { + self.stop_reason = match block_reason { + "SAFETY" | "OTHER" | "BLOCKLIST" | "PROHIBITED_CONTENT" | "IMAGE_SAFETY" => { + StopReason::Refusal + } + _ => { + log::error!("Unexpected Google block_reason: {block_reason}"); + StopReason::Refusal + } + }; + events.push(Ok(LanguageModelCompletionEvent::Stop(self.stop_reason))); + + return events; + } + if let Some(candidates) = event.candidates { for candidate in candidates { if let Some(finish_reason) = candidate.finish_reason.as_deref() { @@ -803,15 +751,15 @@ fn convert_usage(usage: &UsageMetadata) -> language_model::TokenUsage { } struct ConfigurationView { - api_key_editor: Entity, - state: gpui::Entity, + api_key_editor: Entity, + state: Entity, target_agent: language_model::ConfigurationViewTargetAgent, load_credentials_task: Option>, } impl ConfigurationView { fn new( - state: gpui::Entity, + state: Entity, target_agent: language_model::ConfigurationViewTargetAgent, window: &mut Window, cx: &mut Context, @@ -840,11 +788,7 @@ impl ConfigurationView { })); Self { - api_key_editor: cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text("AIzaSy...", window, cx); - editor - }), + api_key_editor: cx.new(|cx| SingleLineInput::new(window, cx, "AIzaSy...")), target_agent, state, load_credentials_task, @@ -852,20 +796,22 @@ impl ConfigurationView { } fn save_api_key(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { - let api_key = self.api_key_editor.read(cx).text(cx); + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); if api_key.is_empty() { return; } + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { @@ -874,36 +820,11 @@ impl ConfigurationView { let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { - state.update(cx, |state, cx| state.reset_api_key(cx))?.await + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await }) .detach_and_log_err(cx); - - cx.notify(); - } - - fn render_api_key_editor(&self, cx: &mut Context) -> impl IntoElement { - let settings = ThemeSettings::get_global(cx); - let text_style = TextStyle { - color: cx.theme().colors().text, - font_family: settings.ui_font.family.clone(), - font_features: settings.ui_font.features.clone(), - font_fallbacks: settings.ui_font.fallbacks.clone(), - font_size: rems(0.875).into(), - font_weight: settings.ui_font.weight, - font_style: FontStyle::Normal, - line_height: relative(1.3), - white_space: WhiteSpace::Normal, - ..Default::default() - }; - EditorElement::new( - &self.api_key_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) } fn should_render_editor(&self, cx: &mut Context) -> bool { @@ -913,7 +834,7 @@ impl ConfigurationView { impl Render for ConfigurationView { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; + let env_var_set = self.state.read(cx).api_key_state.is_from_env_var(); if self.load_credentials_task.is_some() { div().child(Label::new("Loading credentials...")).into_any() @@ -936,21 +857,10 @@ impl Render for ConfigurationView { "Paste your API key below and hit enter to start using the assistant", )), ) - .child( - h_flex() - .w_full() - .my_2() - .px_2() - .py_1() - .bg(cx.theme().colors().editor_background) - .border_1() - .border_color(cx.theme().colors().border) - .rounded_sm() - .child(self.render_api_key_editor(cx)), - ) + .child(self.api_key_editor.clone()) .child( Label::new( - format!("You can also assign the {GEMINI_API_KEY_VAR} environment variable and restart Zed."), + format!("You can also assign the {GEMINI_API_KEY_VAR_NAME} environment variable and restart Zed."), ) .size(LabelSize::Small).color(Color::Muted), ) @@ -969,9 +879,14 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {GEMINI_API_KEY_VAR} environment variable.") + format!("API key set in {} environment variable", API_KEY_ENV_VAR.name) } else { - "API key configured.".to_string() + let api_url = GoogleLanguageModelProvider::api_url(cx); + if api_url == google_ai::API_URL { + "API key configured".to_string() + } else { + format!("API key configured for {}", truncate_and_trailoff(&api_url, 32)) + } })), ) .child( @@ -982,7 +897,7 @@ impl Render for ConfigurationView { .icon_position(IconPosition::Start) .disabled(env_var_set) .when(env_var_set, |this| { - this.tooltip(Tooltip::text(format!("To reset your API key, make sure {GEMINI_API_KEY_VAR} and {GOOGLE_AI_API_KEY_VAR} environment variables are unset."))) + this.tooltip(Tooltip::text(format!("To reset your API key, make sure {GEMINI_API_KEY_VAR_NAME} and {GOOGLE_AI_API_KEY_VAR_NAME} environment variables are unset."))) }) .on_click(cx.listener(|this, _, window, cx| this.reset_api_key(window, cx))), ) diff --git a/crates/language_models/src/provider/lmstudio.rs b/crates/language_models/src/provider/lmstudio.rs index 80b28a396b958ab20de3faa0a0f6919c57011e5c..c0b3509c0e2c9636ca48cdb0de0cc6ed32a2b792 100644 --- a/crates/language_models/src/provider/lmstudio.rs +++ b/crates/language_models/src/provider/lmstudio.rs @@ -2,7 +2,7 @@ use anyhow::{Result, anyhow}; use collections::HashMap; use futures::Stream; use futures::{FutureExt, StreamExt, future::BoxFuture, stream::BoxStream}; -use gpui::{AnyView, App, AsyncApp, Context, Subscription, Task}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, Subscription, Task}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -15,8 +15,7 @@ use language_model::{ LanguageModelRequest, RateLimiter, Role, }; use lmstudio::{ModelType, get_models}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +pub use settings::LmStudioAvailableModel as AvailableModel; use settings::{Settings, SettingsStore}; use std::pin::Pin; use std::str::FromStr; @@ -40,18 +39,9 @@ pub struct LmStudioSettings { pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub supports_tool_calls: bool, - pub supports_images: bool, -} - pub struct LmStudioLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { @@ -111,7 +101,30 @@ impl State { } let fetch_models_task = self.fetch_models(cx); - cx.spawn(async move |_this, _cx| Ok(fetch_models_task.await?)) + cx.spawn(async move |_this, _cx| { + match fetch_models_task.await { + Ok(()) => Ok(()), + Err(err) => { + // If any cause in the error chain is an std::io::Error with + // ErrorKind::ConnectionRefused, treat this as "credentials not found" + // (i.e. LM Studio not running). + let mut connection_refused = false; + for cause in err.chain() { + if let Some(io_err) = cause.downcast_ref::() { + if io_err.kind() == std::io::ErrorKind::ConnectionRefused { + connection_refused = true; + break; + } + } + } + if connection_refused { + Err(AuthenticateError::ConnectionRefused) + } else { + Err(AuthenticateError::Other(err)) + } + } + } + }) } } @@ -149,7 +162,7 @@ impl LmStudioLanguageModelProvider { impl LanguageModelProviderState for LmStudioLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -622,12 +635,12 @@ fn add_message_content_part( } struct ConfigurationView { - state: gpui::Entity, + state: Entity, loading_models_task: Option>, } impl ConfigurationView { - pub fn new(state: gpui::Entity, cx: &mut Context) -> Self { + pub fn new(state: Entity, cx: &mut Context) -> Self { let loading_models_task = Some(cx.spawn({ let state = state.clone(); async move |this, cx| { diff --git a/crates/language_models/src/provider/mistral.rs b/crates/language_models/src/provider/mistral.rs index c9824bf89ea7a919f4517f492a5091a2cda7b43b..ad7bf600d56354ee12e72c9ebc2bfe09f0094da7 100644 --- a/crates/language_models/src/provider/mistral.rs +++ b/crates/language_models/src/provider/mistral.rs @@ -1,11 +1,8 @@ -use anyhow::{Context as _, Result, anyhow}; +use anyhow::{Result, anyhow}; use collections::BTreeMap; -use credentials_provider::CredentialsProvider; -use editor::{Editor, EditorElement, EditorStyle}; -use futures::{FutureExt, Stream, StreamExt, future::BoxFuture, stream::BoxStream}; -use gpui::{ - AnyView, App, AsyncApp, Context, Entity, FontStyle, Subscription, Task, TextStyle, WhiteSpace, -}; +use fs::Fs; +use futures::{FutureExt, Stream, StreamExt, future, future::BoxFuture, stream::BoxStream}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, Global, SharedString, Task, Window}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -14,141 +11,137 @@ use language_model::{ LanguageModelToolChoice, LanguageModelToolResultContent, LanguageModelToolUse, MessageContent, RateLimiter, Role, StopReason, TokenUsage, }; -use mistral::StreamResponse; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore}; +use mistral::{CODESTRAL_API_URL, MISTRAL_API_URL, StreamResponse}; +pub use settings::MistralAvailableModel as AvailableModel; +use settings::{EditPredictionProvider, Settings, SettingsStore, update_settings_file}; use std::collections::HashMap; use std::pin::Pin; use std::str::FromStr; -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use strum::IntoEnumIterator; -use theme::ThemeSettings; use ui::{Icon, IconName, List, Tooltip, prelude::*}; -use util::ResultExt; +use ui_input::SingleLineInput; +use util::{ResultExt, truncate_and_trailoff}; +use zed_env_vars::{EnvVar, env_var}; -use crate::{AllLanguageModelSettings, ui::InstructionListItem}; +use crate::{api_key::ApiKeyState, ui::InstructionListItem}; const PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId::new("mistral"); const PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("Mistral"); +const API_KEY_ENV_VAR_NAME: &str = "MISTRAL_API_KEY"; +static API_KEY_ENV_VAR: LazyLock = env_var!(API_KEY_ENV_VAR_NAME); + +const CODESTRAL_API_KEY_ENV_VAR_NAME: &str = "CODESTRAL_API_KEY"; +static CODESTRAL_API_KEY_ENV_VAR: LazyLock = env_var!(CODESTRAL_API_KEY_ENV_VAR_NAME); + #[derive(Default, Clone, Debug, PartialEq)] pub struct MistralSettings { pub api_url: String, pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub max_output_tokens: Option, - pub max_completion_tokens: Option, - pub supports_tools: Option, - pub supports_images: Option, - pub supports_thinking: Option, -} - pub struct MistralLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { - api_key: Option, - api_key_from_env: bool, - _subscription: Subscription, + api_key_state: ApiKeyState, + codestral_api_key_state: ApiKeyState, } -const MISTRAL_API_KEY_VAR: &str = "MISTRAL_API_KEY"; - impl State { fn is_authenticated(&self) -> bool { - self.api_key.is_some() - } - - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .mistral - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) + self.api_key_state.has_key() } - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .mistral - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await?; - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - cx.notify(); - }) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = MistralLanguageModelProvider::api_url(cx); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } + fn set_codestral_api_key( + &mut self, + api_key: Option, + cx: &mut Context, + ) -> Task> { + self.codestral_api_key_state.store( + CODESTRAL_API_URL.into(), + api_key, + |this| &mut this.codestral_api_key_state, + cx, + ) + } - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .mistral - .api_url - .clone(); - cx.spawn(async move |this, cx| { - let (api_key, from_env) = if let Ok(api_key) = std::env::var(MISTRAL_API_KEY_VAR) { - (api_key, true) - } else { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - ( - String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - false, - ) - }; - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.api_key_from_env = from_env; - cx.notify(); - })?; + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = MistralLanguageModelProvider::api_url(cx); + self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ) + } - Ok(()) - }) + fn authenticate_codestral( + &mut self, + cx: &mut Context, + ) -> Task> { + self.codestral_api_key_state.load_if_needed( + CODESTRAL_API_URL.into(), + &CODESTRAL_API_KEY_ENV_VAR, + |this| &mut this.codestral_api_key_state, + cx, + ) } } +struct GlobalMistralLanguageModelProvider(Arc); + +impl Global for GlobalMistralLanguageModelProvider {} + impl MistralLanguageModelProvider { - pub fn new(http_client: Arc, cx: &mut App) -> Self { - let state = cx.new(|cx| State { - api_key: None, - api_key_from_env: false, - _subscription: cx.observe_global::(|_this: &mut State, cx| { + pub fn try_global(cx: &App) -> Option<&Arc> { + cx.try_global::() + .map(|this| &this.0) + } + + pub fn global(http_client: Arc, cx: &mut App) -> Arc { + if let Some(this) = cx.try_global::() { + return this.0.clone(); + } + let state = cx.new(|cx| { + cx.observe_global::(|this: &mut State, cx| { + let api_url = Self::api_url(cx); + this.api_key_state.handle_url_change( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); cx.notify(); - }), + }) + .detach(); + State { + api_key_state: ApiKeyState::new(Self::api_url(cx)), + codestral_api_key_state: ApiKeyState::new(CODESTRAL_API_URL.into()), + } }); - Self { http_client, state } + let this = Arc::new(Self { http_client, state }); + cx.set_global(GlobalMistralLanguageModelProvider(this)); + cx.global::().0.clone() + } + + pub fn load_codestral_api_key(&self, cx: &mut App) -> Task> { + self.state + .update(cx, |state, cx| state.authenticate_codestral(cx)) + } + + pub fn codestral_api_key(&self, url: &str, cx: &App) -> Option> { + self.state.read(cx).codestral_api_key_state.key(url) } fn create_language_model(&self, model: mistral::Model) -> Arc { @@ -160,12 +153,25 @@ impl MistralLanguageModelProvider { request_limiter: RateLimiter::new(4), }) } + + fn settings(cx: &App) -> &MistralSettings { + &crate::AllLanguageModelSettings::get_global(cx).mistral + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + mistral::MISTRAL_API_URL.into() + } else { + SharedString::new(api_url.as_str()) + } + } } impl LanguageModelProviderState for MistralLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -202,10 +208,7 @@ impl LanguageModelProvider for MistralLanguageModelProvider { } // Override with available models from settings - for model in &AllLanguageModelSettings::get_global(cx) - .mistral - .available_models - { + for model in &Self::settings(cx).available_models { models.insert( model.name.clone(), mistral::Model::Custom { @@ -254,14 +257,15 @@ impl LanguageModelProvider for MistralLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } pub struct MistralLanguageModel { id: LanguageModelId, model: mistral::Model, - state: gpui::Entity, + state: Entity, http_client: Arc, request_limiter: RateLimiter, } @@ -276,15 +280,20 @@ impl MistralLanguageModel { Result>>, > { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, cx| { - let settings = &AllLanguageModelSettings::get_global(cx).mistral; - (state.api_key.clone(), settings.api_url.clone()) + + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = MistralLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { - return futures::future::ready(Err(anyhow!("App state dropped"))).boxed(); + return future::ready(Err(anyhow!("App state dropped"))).boxed(); }; let future = self.request_limiter.stream(async move { - let api_key = api_key.context("Missing Mistral API Key")?; + let Some(api_key) = api_key else { + return Err(LanguageModelCompletionError::NoApiKey { + provider: PROVIDER_NAME, + }); + }; let request = mistral::stream_completion(http_client.as_ref(), &api_url, &api_key, request); let response = request.await?; @@ -735,18 +744,18 @@ struct RawToolCall { } struct ConfigurationView { - api_key_editor: Entity, - state: gpui::Entity, + api_key_editor: Entity, + codestral_api_key_editor: Entity, + state: Entity, load_credentials_task: Option>, } impl ConfigurationView { - fn new(state: gpui::Entity, window: &mut Window, cx: &mut Context) -> Self { - let api_key_editor = cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text("0aBCDEFGhIjKLmNOpqrSTUVwxyzabCDE1f2", window, cx); - editor - }); + fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { + let api_key_editor = + cx.new(|cx| SingleLineInput::new(window, cx, "0aBCDEFGhIjKLmNOpqrSTUVwxyzabCDE1f2")); + let codestral_api_key_editor = + cx.new(|cx| SingleLineInput::new(window, cx, "0aBCDEFGhIjKLmNOpqrSTUVwxyzabCDE1f2")); cx.observe(&state, |_, _, cx| { cx.notify(); @@ -763,6 +772,12 @@ impl ConfigurationView { // We don't log an error, because "not signed in" is also an error. let _ = task.await; } + if let Some(task) = state + .update(cx, |state, cx| state.authenticate_codestral(cx)) + .log_err() + { + let _ = task.await; + } this.update(cx, |this, cx| { this.load_credentials_task = None; @@ -774,26 +789,29 @@ impl ConfigurationView { Self { api_key_editor, + codestral_api_key_editor, state, load_credentials_task, } } fn save_api_key(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { - let api_key = self.api_key_editor.read(cx).text(cx); + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); if api_key.is_empty() { return; } + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { @@ -802,90 +820,99 @@ impl ConfigurationView { let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { - state.update(cx, |state, cx| state.reset_api_key(cx))?.await + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await }) .detach_and_log_err(cx); + } - cx.notify(); - } - - fn render_api_key_editor(&self, cx: &mut Context) -> impl IntoElement { - let settings = ThemeSettings::get_global(cx); - let text_style = TextStyle { - color: cx.theme().colors().text, - font_family: settings.ui_font.family.clone(), - font_features: settings.ui_font.features.clone(), - font_fallbacks: settings.ui_font.fallbacks.clone(), - font_size: rems(0.875).into(), - font_weight: settings.ui_font.weight, - font_style: FontStyle::Normal, - line_height: relative(1.3), - white_space: WhiteSpace::Normal, - ..Default::default() - }; - EditorElement::new( - &self.api_key_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) + fn save_codestral_api_key( + &mut self, + _: &menu::Confirm, + window: &mut Window, + cx: &mut Context, + ) { + let api_key = self + .codestral_api_key_editor + .read(cx) + .text(cx) + .trim() + .to_string(); + if api_key.is_empty() { + return; + } + + // url changes can cause the editor to be displayed again + self.codestral_api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + + let state = self.state.clone(); + cx.spawn_in(window, async move |_, cx| { + state + .update(cx, |state, cx| { + state.set_codestral_api_key(Some(api_key), cx) + })? + .await?; + cx.update(|_window, cx| { + set_edit_prediction_provider(EditPredictionProvider::Codestral, cx) + }) + }) + .detach_and_log_err(cx); } - fn should_render_editor(&self, cx: &mut Context) -> bool { - !self.state.read(cx).is_authenticated() + fn reset_codestral_api_key(&mut self, window: &mut Window, cx: &mut Context) { + self.codestral_api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + + let state = self.state.clone(); + cx.spawn_in(window, async move |_, cx| { + state + .update(cx, |state, cx| state.set_codestral_api_key(None, cx))? + .await?; + cx.update(|_window, cx| set_edit_prediction_provider(EditPredictionProvider::Zed, cx)) + }) + .detach_and_log_err(cx); } -} -impl Render for ConfigurationView { - fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; + fn should_render_api_key_editor(&self, cx: &mut Context) -> bool { + !self.state.read(cx).is_authenticated() + } - if self.load_credentials_task.is_some() { - div().child(Label::new("Loading credentials...")).into_any() - } else if self.should_render_editor(cx) { + fn render_codestral_api_key_editor(&mut self, cx: &mut Context) -> AnyElement { + let key_state = &self.state.read(cx).codestral_api_key_state; + let should_show_editor = !key_state.has_key(); + let env_var_set = key_state.is_from_env_var(); + if should_show_editor { v_flex() + .id("codestral") .size_full() - .on_action(cx.listener(Self::save_api_key)) - .child(Label::new("To use Zed's agent with Mistral, you need to add an API key. Follow these steps:")) + .mt_2() + .on_action(cx.listener(Self::save_codestral_api_key)) + .child(Label::new( + "To use Codestral as an edit prediction provider, \ + you need to add a Codestral-specific API key. Follow these steps:", + )) .child( List::new() .child(InstructionListItem::new( "Create one by visiting", - Some("Mistral's console"), - Some("https://console.mistral.ai/api-keys"), + Some("the Codestral section of Mistral's console"), + Some("https://console.mistral.ai/codestral"), )) - .child(InstructionListItem::text_only( - "Ensure your Mistral account has credits", - )) - .child(InstructionListItem::text_only( - "Paste your API key below and hit enter to start using the assistant", - )), - ) - .child( - h_flex() - .w_full() - .my_2() - .px_2() - .py_1() - .bg(cx.theme().colors().editor_background) - .border_1() - .border_color(cx.theme().colors().border) - .rounded_sm() - .child(self.render_api_key_editor(cx)), + .child(InstructionListItem::text_only("Paste your API key below and hit enter")), ) + .child(self.codestral_api_key_editor.clone()) .child( Label::new( - format!("You can also assign the {MISTRAL_API_KEY_VAR} environment variable and restart Zed."), + format!("You can also assign the {CODESTRAL_API_KEY_ENV_VAR_NAME} environment variable and restart Zed."), ) .size(LabelSize::Small).color(Color::Muted), - ) - .into_any() + ).into_any() } else { h_flex() - .mt_1() + .id("codestral") + .mt_2() .p_1() .justify_between() .rounded_md() @@ -897,9 +924,9 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {MISTRAL_API_KEY_VAR} environment variable.") + format!("API key set in {CODESTRAL_API_KEY_ENV_VAR_NAME} environment variable") } else { - "API key configured.".to_string() + "Codestral API key configured".to_string() })), ) .child( @@ -910,15 +937,121 @@ impl Render for ConfigurationView { .icon_position(IconPosition::Start) .disabled(env_var_set) .when(env_var_set, |this| { - this.tooltip(Tooltip::text(format!("To reset your API key, unset the {MISTRAL_API_KEY_VAR} environment variable."))) + this.tooltip(Tooltip::text(format!( + "To reset your API key, \ + unset the {CODESTRAL_API_KEY_ENV_VAR_NAME} environment variable." + ))) }) - .on_click(cx.listener(|this, _, window, cx| this.reset_api_key(window, cx))), + .on_click( + cx.listener(|this, _, window, cx| this.reset_codestral_api_key(window, cx)), + ), + ).into_any() + } + } +} + +impl Render for ConfigurationView { + fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { + let env_var_set = self.state.read(cx).api_key_state.is_from_env_var(); + + if self.load_credentials_task.is_some() { + div().child(Label::new("Loading credentials...")).into_any() + } else if self.should_render_api_key_editor(cx) { + v_flex() + .size_full() + .on_action(cx.listener(Self::save_api_key)) + .child(Label::new("To use Zed's agent with Mistral, you need to add an API key. Follow these steps:")) + .child( + List::new() + .child(InstructionListItem::new( + "Create one by visiting", + Some("Mistral's console"), + Some("https://console.mistral.ai/api-keys"), + )) + .child(InstructionListItem::text_only( + "Ensure your Mistral account has credits", + )) + .child(InstructionListItem::text_only( + "Paste your API key below and hit enter to start using the assistant", + )), + ) + .child(self.api_key_editor.clone()) + .child( + Label::new( + format!("You can also assign the {API_KEY_ENV_VAR_NAME} environment variable and restart Zed."), + ) + .size(LabelSize::Small).color(Color::Muted), + ) + .child(self.render_codestral_api_key_editor(cx)) + .into_any() + } else { + v_flex() + .size_full() + .child( + h_flex() + .mt_1() + .p_1() + .justify_between() + .rounded_md() + .border_1() + .border_color(cx.theme().colors().border) + .bg(cx.theme().colors().background) + .child( + h_flex() + .gap_1() + .child(Icon::new(IconName::Check).color(Color::Success)) + .child(Label::new(if env_var_set { + format!( + "API key set in {API_KEY_ENV_VAR_NAME} environment variable" + ) + } else { + let api_url = MistralLanguageModelProvider::api_url(cx); + if api_url == MISTRAL_API_URL { + "API key configured".to_string() + } else { + format!( + "API key configured for {}", + truncate_and_trailoff(&api_url, 32) + ) + } + })), + ) + .child( + Button::new("reset-key", "Reset Key") + .label_size(LabelSize::Small) + .icon(Some(IconName::Trash)) + .icon_size(IconSize::Small) + .icon_position(IconPosition::Start) + .disabled(env_var_set) + .when(env_var_set, |this| { + this.tooltip(Tooltip::text(format!( + "To reset your API key, \ + unset the {API_KEY_ENV_VAR_NAME} environment variable." + ))) + }) + .on_click(cx.listener(|this, _, window, cx| { + this.reset_api_key(window, cx) + })), + ), ) + .child(self.render_codestral_api_key_editor(cx)) .into_any() } } } +fn set_edit_prediction_provider(provider: EditPredictionProvider, cx: &mut App) { + let fs = ::global(cx); + update_settings_file(fs, cx, move |settings, _| { + settings + .project + .all_languages + .features + .get_or_insert_default() + .edit_prediction_provider = Some(provider); + }); +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/language_models/src/provider/ollama.rs b/crates/language_models/src/provider/ollama.rs index a80cacfc4a02521af74b32c34cc3360e9665a7d9..a25ecbe01aa659817b41cac54d76871b4742ea66 100644 --- a/crates/language_models/src/provider/ollama.rs +++ b/crates/language_models/src/provider/ollama.rs @@ -1,7 +1,8 @@ use anyhow::{Result, anyhow}; +use fs::Fs; use futures::{FutureExt, StreamExt, future::BoxFuture, stream::BoxStream}; use futures::{Stream, TryFutureExt, stream}; -use gpui::{AnyView, App, AsyncApp, Context, Subscription, Task}; +use gpui::{AnyView, App, AsyncApp, Context, CursorStyle, Entity, Task}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -10,20 +11,23 @@ use language_model::{ LanguageModelRequestTool, LanguageModelToolChoice, LanguageModelToolUse, LanguageModelToolUseId, MessageContent, RateLimiter, Role, StopReason, TokenUsage, }; +use menu; use ollama::{ - ChatMessage, ChatOptions, ChatRequest, ChatResponseDelta, KeepAlive, OllamaFunctionCall, + ChatMessage, ChatOptions, ChatRequest, ChatResponseDelta, OLLAMA_API_URL, OllamaFunctionCall, OllamaFunctionTool, OllamaToolCall, get_models, show_model, stream_chat_completion, }; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore}; +pub use settings::OllamaAvailableModel as AvailableModel; +use settings::{Settings, SettingsStore, update_settings_file}; use std::pin::Pin; +use std::sync::LazyLock; use std::sync::atomic::{AtomicU64, Ordering}; use std::{collections::HashMap, sync::Arc}; -use ui::{ButtonLike, Indicator, List, prelude::*}; -use util::ResultExt; +use ui::{ButtonLike, ElevationIndex, List, Tooltip, prelude::*}; +use ui_input::SingleLineInput; +use zed_env_vars::{EnvVar, env_var}; use crate::AllLanguageModelSettings; +use crate::api_key::ApiKeyState; use crate::ui::InstructionListItem; const OLLAMA_DOWNLOAD_URL: &str = "https://ollama.com/download"; @@ -33,55 +37,75 @@ const OLLAMA_SITE: &str = "https://ollama.com/"; const PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId::new("ollama"); const PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("Ollama"); +const API_KEY_ENV_VAR_NAME: &str = "OLLAMA_API_KEY"; +static API_KEY_ENV_VAR: LazyLock = env_var!(API_KEY_ENV_VAR_NAME); + #[derive(Default, Debug, Clone, PartialEq)] pub struct OllamaSettings { pub api_url: String, pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - /// The model name in the Ollama API (e.g. "llama3.2:latest") - pub name: String, - /// The model's name in Zed's UI, such as in the model selector dropdown menu in the assistant panel. - pub display_name: Option, - /// The Context Length parameter to the model (aka num_ctx or n_ctx) - pub max_tokens: u64, - /// The number of seconds to keep the connection open after the last request - pub keep_alive: Option, - /// Whether the model supports tools - pub supports_tools: Option, - /// Whether the model supports vision - pub supports_images: Option, - /// Whether to enable think mode - pub supports_thinking: Option, -} - pub struct OllamaLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { + api_key_state: ApiKeyState, http_client: Arc, - available_models: Vec, + fetched_models: Vec, fetch_model_task: Option>>, - _subscription: Subscription, } impl State { fn is_authenticated(&self) -> bool { - !self.available_models.is_empty() + !self.fetched_models.is_empty() + } + + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = OllamaLanguageModelProvider::api_url(cx); + let task = self + .api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx); + + self.fetched_models.clear(); + cx.spawn(async move |this, cx| { + let result = task.await; + this.update(cx, |this, cx| this.restart_fetch_models_task(cx)) + .ok(); + result + }) + } + + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = OllamaLanguageModelProvider::api_url(cx); + let task = self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); + + // Always try to fetch models - if no API key is needed (local Ollama), it will work + // If API key is needed and provided, it will work + // If API key is needed and not provided, it will fail gracefully + cx.spawn(async move |this, cx| { + let result = task.await; + this.update(cx, |this, cx| this.restart_fetch_models_task(cx)) + .ok(); + result + }) } fn fetch_models(&mut self, cx: &mut Context) -> Task> { - let settings = &AllLanguageModelSettings::get_global(cx).ollama; let http_client = Arc::clone(&self.http_client); - let api_url = settings.api_url.clone(); + let api_url = OllamaLanguageModelProvider::api_url(cx); + let api_key = self.api_key_state.key(&api_url); // As a proxy for the server being "authenticated", we'll check if its up by fetching the models cx.spawn(async move |this, cx| { - let models = get_models(http_client.as_ref(), &api_url, None).await?; + let models = get_models(http_client.as_ref(), &api_url, api_key.as_deref()).await?; let tasks = models .into_iter() @@ -92,16 +116,19 @@ impl State { .map(|model| { let http_client = Arc::clone(&http_client); let api_url = api_url.clone(); + let api_key = api_key.clone(); async move { let name = model.name.as_str(); - let capabilities = show_model(http_client.as_ref(), &api_url, name).await?; + let model = + show_model(http_client.as_ref(), &api_url, api_key.as_deref(), name) + .await?; let ollama_model = ollama::Model::new( name, None, - None, - Some(capabilities.supports_tools()), - Some(capabilities.supports_vision()), - Some(capabilities.supports_thinking()), + model.context_length, + Some(model.supports_tools()), + Some(model.supports_vision()), + Some(model.supports_thinking()), ); Ok(ollama_model) } @@ -119,7 +146,7 @@ impl State { ollama_models.sort_by(|a, b| a.name.cmp(&b.name)); this.update(cx, |this, cx| { - this.available_models = ollama_models; + this.fetched_models = ollama_models; cx.notify(); }) }) @@ -129,15 +156,6 @@ impl State { let task = self.fetch_models(cx); self.fetch_model_task.replace(task); } - - fn authenticate(&mut self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - let fetch_models_task = self.fetch_models(cx); - cx.spawn(async move |_this, _cx| Ok(fetch_models_task.await?)) - } } impl OllamaLanguageModelProvider { @@ -145,36 +163,53 @@ impl OllamaLanguageModelProvider { let this = Self { http_client: http_client.clone(), state: cx.new(|cx| { - let subscription = cx.observe_global::({ - let mut settings = AllLanguageModelSettings::get_global(cx).ollama.clone(); + cx.observe_global::({ + let mut last_settings = OllamaLanguageModelProvider::settings(cx).clone(); move |this: &mut State, cx| { - let new_settings = &AllLanguageModelSettings::get_global(cx).ollama; - if &settings != new_settings { - settings = new_settings.clone(); - this.restart_fetch_models_task(cx); + let current_settings = OllamaLanguageModelProvider::settings(cx); + let settings_changed = current_settings != &last_settings; + if settings_changed { + let url_changed = last_settings.api_url != current_settings.api_url; + last_settings = current_settings.clone(); + if url_changed { + this.fetched_models.clear(); + this.authenticate(cx).detach(); + } cx.notify(); } } - }); + }) + .detach(); State { http_client, - available_models: Default::default(), + fetched_models: Default::default(), fetch_model_task: None, - _subscription: subscription, + api_key_state: ApiKeyState::new(Self::api_url(cx)), } }), }; - this.state - .update(cx, |state, cx| state.restart_fetch_models_task(cx)); this } + + fn settings(cx: &App) -> &OllamaSettings { + &AllLanguageModelSettings::get_global(cx).ollama + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + OLLAMA_API_URL.into() + } else { + SharedString::new(api_url.as_str()) + } + } } impl LanguageModelProviderState for OllamaLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -208,28 +243,37 @@ impl LanguageModelProvider for OllamaLanguageModelProvider { let mut models: HashMap = HashMap::new(); // Add models from the Ollama API - for model in self.state.read(cx).available_models.iter() { + for model in self.state.read(cx).fetched_models.iter() { models.insert(model.name.clone(), model.clone()); } // Override with available models from settings - for model in AllLanguageModelSettings::get_global(cx) - .ollama - .available_models - .iter() - { - models.insert( - model.name.clone(), - ollama::Model { - name: model.name.clone(), - display_name: model.display_name.clone(), - max_tokens: model.max_tokens, - keep_alive: model.keep_alive.clone(), - supports_tools: model.supports_tools, - supports_vision: model.supports_images, - supports_thinking: model.supports_thinking, - }, - ); + for setting_model in &OllamaLanguageModelProvider::settings(cx).available_models { + let setting_base = setting_model.name.split(':').next().unwrap(); + if let Some(model) = models + .values_mut() + .find(|m| m.name.split(':').next().unwrap() == setting_base) + { + model.max_tokens = setting_model.max_tokens; + model.display_name = setting_model.display_name.clone(); + model.keep_alive = setting_model.keep_alive.clone(); + model.supports_tools = setting_model.supports_tools; + model.supports_vision = setting_model.supports_images; + model.supports_thinking = setting_model.supports_thinking; + } else { + models.insert( + setting_model.name.clone(), + ollama::Model { + name: setting_model.name.clone(), + display_name: setting_model.display_name.clone(), + max_tokens: setting_model.max_tokens, + keep_alive: setting_model.keep_alive.clone(), + supports_tools: setting_model.supports_tools, + supports_vision: setting_model.supports_images, + supports_thinking: setting_model.supports_thinking, + }, + ); + } } let mut models = models @@ -240,6 +284,7 @@ impl LanguageModelProvider for OllamaLanguageModelProvider { model, http_client: self.http_client.clone(), request_limiter: RateLimiter::new(4), + state: self.state.clone(), }) as Arc }) .collect::>(); @@ -267,7 +312,8 @@ impl LanguageModelProvider for OllamaLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.fetch_models(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } @@ -276,6 +322,7 @@ pub struct OllamaLanguageModel { model: ollama::Model, http_client: Arc, request_limiter: RateLimiter, + state: Entity, } impl OllamaLanguageModel { @@ -454,15 +501,17 @@ impl LanguageModel for OllamaLanguageModel { let request = self.to_ollama_request(request); let http_client = self.http_client.clone(); - let Ok(api_url) = cx.update(|cx| { - let settings = &AllLanguageModelSettings::get_global(cx).ollama; - settings.api_url.clone() + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = OllamaLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { return futures::future::ready(Err(anyhow!("App state dropped").into())).boxed(); }; let future = self.request_limiter.stream(async move { - let stream = stream_chat_completion(http_client.as_ref(), &api_url, request).await?; + let stream = + stream_chat_completion(http_client.as_ref(), &api_url, api_key.as_deref(), request) + .await?; let stream = map_to_language_model_completion_events(stream); Ok(stream) }); @@ -574,138 +623,307 @@ fn map_to_language_model_completion_events( } struct ConfigurationView { - state: gpui::Entity, - loading_models_task: Option>, + api_key_editor: Entity, + api_url_editor: Entity, + state: Entity, } impl ConfigurationView { - pub fn new(state: gpui::Entity, window: &mut Window, cx: &mut Context) -> Self { - let loading_models_task = Some(cx.spawn_in(window, { - let state = state.clone(); - async move |this, cx| { - if let Some(task) = state - .update(cx, |state, cx| state.authenticate(cx)) - .log_err() - { - task.await.log_err(); - } - this.update(cx, |this, cx| { - this.loading_models_task = None; - cx.notify(); - }) - .log_err(); - } - })); + pub fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { + let api_key_editor = + cx.new(|cx| SingleLineInput::new(window, cx, "63e02e...").label("API key")); + + let api_url_editor = cx.new(|cx| { + let input = SingleLineInput::new(window, cx, OLLAMA_API_URL).label("API URL"); + input.set_text(OllamaLanguageModelProvider::api_url(cx), window, cx); + input + }); + + cx.observe(&state, |_, _, cx| { + cx.notify(); + }) + .detach(); Self { + api_key_editor, + api_url_editor, state, - loading_models_task, } } fn retry_connection(&self, cx: &mut App) { self.state - .update(cx, |state, cx| state.fetch_models(cx)) - .detach_and_log_err(cx); + .update(cx, |state, cx| state.restart_fetch_models_task(cx)); } -} -impl Render for ConfigurationView { - fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let is_authenticated = self.state.read(cx).is_authenticated(); + fn save_api_key(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); + if api_key.is_empty() { + return; + } - let ollama_intro = - "Get up & running with Llama 3.3, Mistral, Gemma 2, and other LLMs with Ollama."; + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |input, cx| input.set_text("", window, cx)); - if self.loading_models_task.is_some() { - div().child(Label::new("Loading models...")).into_any() - } else { + let state = self.state.clone(); + cx.spawn_in(window, async move |_, cx| { + state + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? + .await + }) + .detach_and_log_err(cx); + } + + fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { + self.api_key_editor + .update(cx, |input, cx| input.set_text("", window, cx)); + + let state = self.state.clone(); + cx.spawn_in(window, async move |_, cx| { + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await + }) + .detach_and_log_err(cx); + + cx.notify(); + } + + fn save_api_url(&mut self, cx: &mut Context) { + let api_url = self.api_url_editor.read(cx).text(cx).trim().to_string(); + let current_url = OllamaLanguageModelProvider::api_url(cx); + if !api_url.is_empty() && &api_url != ¤t_url { + let fs = ::global(cx); + update_settings_file(fs, cx, move |settings, _| { + settings + .language_models + .get_or_insert_default() + .ollama + .get_or_insert_default() + .api_url = Some(api_url); + }); + } + } + + fn reset_api_url(&mut self, window: &mut Window, cx: &mut Context) { + self.api_url_editor + .update(cx, |input, cx| input.set_text("", window, cx)); + let fs = ::global(cx); + update_settings_file(fs, cx, |settings, _cx| { + if let Some(settings) = settings + .language_models + .as_mut() + .and_then(|models| models.ollama.as_mut()) + { + settings.api_url = Some(OLLAMA_API_URL.into()); + } + }); + cx.notify(); + } + + fn render_instructions() -> Div { + v_flex() + .gap_2() + .child(Label::new( + "Run LLMs locally on your machine with Ollama, or connect to an Ollama server. \ + Can provide access to Llama, Mistral, Gemma, and hundreds of other models.", + )) + .child(Label::new("To use local Ollama:")) + .child( + List::new() + .child(InstructionListItem::new( + "Download and install Ollama from", + Some("ollama.com"), + Some("https://ollama.com/download"), + )) + .child(InstructionListItem::text_only( + "Start Ollama and download a model: `ollama run gpt-oss:20b`", + )) + .child(InstructionListItem::text_only( + "Click 'Connect' below to start using Ollama in Zed", + )), + ) + .child(Label::new( + "Alternatively, you can connect to an Ollama server by specifying its \ + URL and API key (may not be required):", + )) + } + + fn render_api_key_editor(&self, cx: &Context) -> Div { + let state = self.state.read(cx); + let env_var_set = state.api_key_state.is_from_env_var(); + + if !state.api_key_state.has_key() { v_flex() - .gap_2() + .on_action(cx.listener(Self::save_api_key)) + .child(self.api_key_editor.clone()) + .child( + Label::new( + format!("You can also assign the {API_KEY_ENV_VAR_NAME} environment variable and restart Zed.") + ) + .size(LabelSize::Small) + .color(Color::Muted), + ) + } else { + h_flex() + .p_3() + .justify_between() + .rounded_md() + .border_1() + .border_color(cx.theme().colors().border) + .bg(cx.theme().colors().elevated_surface_background) + .child( + h_flex() + .gap_2() + .child(Icon::new(IconName::Check).color(Color::Success)) + .child( + Label::new( + if env_var_set { + format!("API key set in {API_KEY_ENV_VAR_NAME} environment variable.") + } else { + "API key configured".to_string() + } + ) + ) + ) .child( - v_flex().gap_1().child(Label::new(ollama_intro)).child( - List::new() - .child(InstructionListItem::text_only("Ollama must be running with at least one model installed to use it in the assistant.")) - .child(InstructionListItem::text_only( - "Once installed, try `ollama run llama3.2`", - )), - ), + Button::new("reset-api-key", "Reset API Key") + .label_size(LabelSize::Small) + .icon(IconName::Undo) + .icon_size(IconSize::Small) + .icon_position(IconPosition::Start) + .layer(ElevationIndex::ModalSurface) + .when(env_var_set, |this| { + this.tooltip(Tooltip::text(format!("To reset your API key, unset the {API_KEY_ENV_VAR_NAME} environment variable."))) + }) + .on_click(cx.listener(|this, _, window, cx| this.reset_api_key(window, cx))), ) + } + } + + fn render_api_url_editor(&self, cx: &Context) -> Div { + let api_url = OllamaLanguageModelProvider::api_url(cx); + let custom_api_url_set = api_url != OLLAMA_API_URL; + + if custom_api_url_set { + h_flex() + .p_3() + .justify_between() + .rounded_md() + .border_1() + .border_color(cx.theme().colors().border) + .bg(cx.theme().colors().elevated_surface_background) .child( h_flex() - .w_full() - .justify_between() .gap_2() - .child( - h_flex() - .w_full() - .gap_2() - .map(|this| { - if is_authenticated { - this.child( - Button::new("ollama-site", "Ollama") - .style(ButtonStyle::Subtle) - .icon(IconName::ArrowUpRight) - .icon_size(IconSize::Small) - .icon_color(Color::Muted) - .on_click(move |_, _, cx| cx.open_url(OLLAMA_SITE)) - .into_any_element(), - ) - } else { - this.child( - Button::new( - "download_ollama_button", - "Download Ollama", - ) + .child(Icon::new(IconName::Check).color(Color::Success)) + .child(v_flex().gap_1().child(Label::new(api_url))), + ) + .child( + Button::new("reset-api-url", "Reset API URL") + .label_size(LabelSize::Small) + .icon(IconName::Undo) + .icon_size(IconSize::Small) + .icon_position(IconPosition::Start) + .layer(ElevationIndex::ModalSurface) + .on_click( + cx.listener(|this, _, window, cx| this.reset_api_url(window, cx)), + ), + ) + } else { + v_flex() + .on_action(cx.listener(|this, _: &menu::Confirm, _window, cx| { + this.save_api_url(cx); + cx.notify(); + })) + .gap_2() + .child(self.api_url_editor.clone()) + } + } +} + +impl Render for ConfigurationView { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + let is_authenticated = self.state.read(cx).is_authenticated(); + + v_flex() + .gap_2() + .child(Self::render_instructions()) + .child(self.render_api_url_editor(cx)) + .child(self.render_api_key_editor(cx)) + .child( + h_flex() + .w_full() + .justify_between() + .gap_2() + .child( + h_flex() + .w_full() + .gap_2() + .map(|this| { + if is_authenticated { + this.child( + Button::new("ollama-site", "Ollama") + .style(ButtonStyle::Subtle) + .icon(IconName::ArrowUpRight) + .icon_size(IconSize::XSmall) + .icon_color(Color::Muted) + .on_click(move |_, _, cx| cx.open_url(OLLAMA_SITE)) + .into_any_element(), + ) + } else { + this.child( + Button::new("download_ollama_button", "Download Ollama") .style(ButtonStyle::Subtle) .icon(IconName::ArrowUpRight) - .icon_size(IconSize::Small) + .icon_size(IconSize::XSmall) .icon_color(Color::Muted) .on_click(move |_, _, cx| { cx.open_url(OLLAMA_DOWNLOAD_URL) }) .into_any_element(), - ) - } - }) - .child( - Button::new("view-models", "View All Models") - .style(ButtonStyle::Subtle) - .icon(IconName::ArrowUpRight) - .icon_size(IconSize::Small) - .icon_color(Color::Muted) - .on_click(move |_, _, cx| cx.open_url(OLLAMA_LIBRARY_URL)), - ), - ) - .map(|this| { - if is_authenticated { - this.child( - ButtonLike::new("connected") - .disabled(true) - .cursor_style(gpui::CursorStyle::Arrow) - .child( - h_flex() - .gap_2() - .child(Indicator::dot().color(Color::Success)) - .child(Label::new("Connected")) - .into_any_element(), - ), - ) - } else { - this.child( - Button::new("retry_ollama_models", "Connect") - .icon_position(IconPosition::Start) - .icon_size(IconSize::XSmall) - .icon(IconName::PlayFilled) - .on_click(cx.listener(move |this, _, _, cx| { + ) + } + }) + .child( + Button::new("view-models", "View All Models") + .style(ButtonStyle::Subtle) + .icon(IconName::ArrowUpRight) + .icon_size(IconSize::XSmall) + .icon_color(Color::Muted) + .on_click(move |_, _, cx| cx.open_url(OLLAMA_LIBRARY_URL)), + ), + ) + .map(|this| { + if is_authenticated { + this.child( + ButtonLike::new("connected") + .disabled(true) + .cursor_style(CursorStyle::Arrow) + .child( + h_flex() + .gap_2() + .child(Icon::new(IconName::Check).color(Color::Success)) + .child(Label::new("Connected")) + .into_any_element(), + ), + ) + } else { + this.child( + Button::new("retry_ollama_models", "Connect") + .icon_position(IconPosition::Start) + .icon_size(IconSize::XSmall) + .icon(IconName::PlayOutlined) + .on_click( + cx.listener(move |this, _, _, cx| { this.retry_connection(cx) - })), - ) - } - }) - ) - .into_any() - } + }), + ), + ) + } + }), + ) } } diff --git a/crates/language_models/src/provider/open_ai.rs b/crates/language_models/src/provider/open_ai.rs index fca1cf977cb5e3b32dc6f2335fb0d9188979bc9f..3eaaa8b58598328e6e843b1f86b8f4e5cbd04c1e 100644 --- a/crates/language_models/src/provider/open_ai.rs +++ b/crates/language_models/src/provider/open_ai.rs @@ -1,10 +1,8 @@ -use anyhow::{Context as _, Result, anyhow}; +use anyhow::{Result, anyhow}; use collections::{BTreeMap, HashMap}; -use credentials_provider::CredentialsProvider; - use futures::Stream; -use futures::{FutureExt, StreamExt, future::BoxFuture}; -use gpui::{AnyView, App, AsyncApp, Context, Entity, Subscription, Task, Window}; +use futures::{FutureExt, StreamExt, future, future::BoxFuture}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -14,172 +12,81 @@ use language_model::{ RateLimiter, Role, StopReason, TokenUsage, }; use menu; -use open_ai::{ImageUrl, Model, ReasoningEffort, ResponseStreamEvent, stream_completion}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore}; +use open_ai::{ + ImageUrl, Model, OPEN_AI_API_URL, ReasoningEffort, ResponseStreamEvent, stream_completion, +}; +use settings::{OpenAiAvailableModel as AvailableModel, Settings, SettingsStore}; use std::pin::Pin; use std::str::FromStr as _; -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use strum::IntoEnumIterator; - use ui::{ElevationIndex, List, Tooltip, prelude::*}; use ui_input::SingleLineInput; -use util::ResultExt; +use util::{ResultExt, truncate_and_trailoff}; +use zed_env_vars::{EnvVar, env_var}; -use crate::{AllLanguageModelSettings, ui::InstructionListItem}; +use crate::{api_key::ApiKeyState, ui::InstructionListItem}; const PROVIDER_ID: LanguageModelProviderId = language_model::OPEN_AI_PROVIDER_ID; const PROVIDER_NAME: LanguageModelProviderName = language_model::OPEN_AI_PROVIDER_NAME; +const API_KEY_ENV_VAR_NAME: &str = "OPENAI_API_KEY"; +static API_KEY_ENV_VAR: LazyLock = env_var!(API_KEY_ENV_VAR_NAME); + #[derive(Default, Clone, Debug, PartialEq)] pub struct OpenAiSettings { pub api_url: String, pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub max_output_tokens: Option, - pub max_completion_tokens: Option, - pub reasoning_effort: Option, -} - pub struct OpenAiLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { - api_key: Option, - api_key_from_env: bool, - last_api_url: String, - _subscription: Subscription, + api_key_state: ApiKeyState, } -const OPENAI_API_KEY_VAR: &str = "OPENAI_API_KEY"; - impl State { fn is_authenticated(&self) -> bool { - self.api_key.is_some() - } - - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .openai - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) - } - - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .openai - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - cx.notify(); - }) - }) + self.api_key_state.has_key() } - fn get_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .openai - .api_url - .clone(); - cx.spawn(async move |this, cx| { - let (api_key, from_env) = if let Ok(api_key) = std::env::var(OPENAI_API_KEY_VAR) { - (api_key, true) - } else { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - ( - String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - false, - ) - }; - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.api_key_from_env = from_env; - cx.notify(); - })?; - - Ok(()) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = OpenAiLanguageModelProvider::api_url(cx); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - self.get_api_key(cx) + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = OpenAiLanguageModelProvider::api_url(cx); + self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ) } } impl OpenAiLanguageModelProvider { pub fn new(http_client: Arc, cx: &mut App) -> Self { - let initial_api_url = AllLanguageModelSettings::get_global(cx) - .openai - .api_url - .clone(); - - let state = cx.new(|cx| State { - api_key: None, - api_key_from_env: false, - last_api_url: initial_api_url.clone(), - _subscription: cx.observe_global::(|this: &mut State, cx| { - let current_api_url = AllLanguageModelSettings::get_global(cx) - .openai - .api_url - .clone(); - - if this.last_api_url != current_api_url { - this.last_api_url = current_api_url; - if !this.api_key_from_env { - this.api_key = None; - let spawn_task = cx.spawn(async move |handle, cx| { - if let Ok(task) = handle.update(cx, |this, cx| this.get_api_key(cx)) { - if let Err(_) = task.await { - handle - .update(cx, |this, _| { - this.api_key = None; - this.api_key_from_env = false; - }) - .ok(); - } - } - }); - spawn_task.detach(); - } - } + let state = cx.new(|cx| { + cx.observe_global::(|this: &mut State, cx| { + let api_url = Self::api_url(cx); + this.api_key_state.handle_url_change( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); cx.notify(); - }), + }) + .detach(); + State { + api_key_state: ApiKeyState::new(Self::api_url(cx)), + } }); Self { http_client, state } @@ -194,12 +101,25 @@ impl OpenAiLanguageModelProvider { request_limiter: RateLimiter::new(4), }) } + + fn settings(cx: &App) -> &OpenAiSettings { + &crate::AllLanguageModelSettings::get_global(cx).openai + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + open_ai::OPEN_AI_API_URL.into() + } else { + SharedString::new(api_url.as_str()) + } + } } impl LanguageModelProviderState for OpenAiLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -236,10 +156,7 @@ impl LanguageModelProvider for OpenAiLanguageModelProvider { } // Override with available models from settings - for model in &AllLanguageModelSettings::get_global(cx) - .openai - .available_models - { + for model in &OpenAiLanguageModelProvider::settings(cx).available_models { models.insert( model.name.clone(), open_ai::Model::Custom { @@ -278,14 +195,15 @@ impl LanguageModelProvider for OpenAiLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } pub struct OpenAiLanguageModel { id: LanguageModelId, model: open_ai::Model, - state: gpui::Entity, + state: Entity, http_client: Arc, request_limiter: RateLimiter, } @@ -298,11 +216,12 @@ impl OpenAiLanguageModel { ) -> BoxFuture<'static, Result>>> { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, cx| { - let settings = &AllLanguageModelSettings::get_global(cx).openai; - (state.api_key.clone(), settings.api_url.clone()) + + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = OpenAiLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { - return futures::future::ready(Err(anyhow!("App state dropped"))).boxed(); + return future::ready(Err(anyhow!("App state dropped"))).boxed(); }; let future = self.request_limiter.stream(async move { @@ -757,12 +676,12 @@ pub fn count_open_ai_tokens( struct ConfigurationView { api_key_editor: Entity, - state: gpui::Entity, + state: Entity, load_credentials_task: Option>, } impl ConfigurationView { - fn new(state: gpui::Entity, window: &mut Window, cx: &mut Context) -> Self { + fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { let api_key_editor = cx.new(|cx| { SingleLineInput::new( window, @@ -802,45 +721,35 @@ impl ConfigurationView { } fn save_api_key(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { - let api_key = self - .api_key_editor - .read(cx) - .editor() - .read(cx) - .text(cx) - .trim() - .to_string(); - - // Don't proceed if no API key is provided and we're not authenticated - if api_key.is_empty() && !self.state.read(cx).is_authenticated() { + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); + if api_key.is_empty() { return; } + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { - self.api_key_editor.update(cx, |input, cx| { - input.editor.update(cx, |editor, cx| { - editor.set_text("", window, cx); - }); - }); + self.api_key_editor + .update(cx, |input, cx| input.set_text("", window, cx)); let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { - state.update(cx, |state, cx| state.reset_api_key(cx))?.await + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await }) .detach_and_log_err(cx); - - cx.notify(); } fn should_render_editor(&self, cx: &mut Context) -> bool { @@ -850,7 +759,7 @@ impl ConfigurationView { impl Render for ConfigurationView { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; + let env_var_set = self.state.read(cx).api_key_state.is_from_env_var(); let api_key_section = if self.should_render_editor(cx) { v_flex() @@ -872,10 +781,11 @@ impl Render for ConfigurationView { ) .child(self.api_key_editor.clone()) .child( - Label::new( - format!("You can also assign the {OPENAI_API_KEY_VAR} environment variable and restart Zed."), - ) - .size(LabelSize::Small).color(Color::Muted), + Label::new(format!( + "You can also assign the {API_KEY_ENV_VAR_NAME} environment variable and restart Zed." + )) + .size(LabelSize::Small) + .color(Color::Muted), ) .child( Label::new( @@ -898,9 +808,14 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {OPENAI_API_KEY_VAR} environment variable.") + format!("API key set in {API_KEY_ENV_VAR_NAME} environment variable") } else { - "API key configured.".to_string() + let api_url = OpenAiLanguageModelProvider::api_url(cx); + if api_url == OPEN_AI_API_URL { + "API key configured".to_string() + } else { + format!("API key configured for {}", truncate_and_trailoff(&api_url, 32)) + } })), ) .child( @@ -911,7 +826,7 @@ impl Render for ConfigurationView { .icon_position(IconPosition::Start) .layer(ElevationIndex::ModalSurface) .when(env_var_set, |this| { - this.tooltip(Tooltip::text(format!("To reset your API key, unset the {OPENAI_API_KEY_VAR} environment variable."))) + this.tooltip(Tooltip::text(format!("To reset your API key, unset the {API_KEY_ENV_VAR_NAME} environment variable."))) }) .on_click(cx.listener(|this, _, window, cx| this.reset_api_key(window, cx))), ) diff --git a/crates/language_models/src/provider/open_ai_compatible.rs b/crates/language_models/src/provider/open_ai_compatible.rs index 4ebb11a07b66ec7054ca65437ec887a415fa3f5c..cca49c982ce6e93614c4574a84ffaa4bd1d8f0c6 100644 --- a/crates/language_models/src/provider/open_ai_compatible.rs +++ b/crates/language_models/src/provider/open_ai_compatible.rs @@ -1,9 +1,7 @@ -use anyhow::{Context as _, Result, anyhow}; -use credentials_provider::CredentialsProvider; - +use anyhow::{Result, anyhow}; use convert_case::{Case, Casing}; -use futures::{FutureExt, StreamExt, future::BoxFuture}; -use gpui::{AnyView, App, AsyncApp, Context, Entity, Subscription, Task, Window}; +use futures::{FutureExt, StreamExt, future, future::BoxFuture}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -13,17 +11,17 @@ use language_model::{ }; use menu; use open_ai::{ResponseStreamEvent, stream_completion}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; use settings::{Settings, SettingsStore}; use std::sync::Arc; - use ui::{ElevationIndex, Tooltip, prelude::*}; use ui_input::SingleLineInput; -use util::ResultExt; +use util::{ResultExt, truncate_and_trailoff}; +use zed_env_vars::EnvVar; -use crate::AllLanguageModelSettings; +use crate::api_key::ApiKeyState; use crate::provider::open_ai::{OpenAiEventMapper, into_open_ai}; +pub use settings::OpenAiCompatibleAvailableModel as AvailableModel; +pub use settings::OpenAiCompatibleModelCapabilities as ModelCapabilities; #[derive(Default, Clone, Debug, PartialEq)] pub struct OpenAiCompatibleSettings { @@ -31,163 +29,76 @@ pub struct OpenAiCompatibleSettings { pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub max_output_tokens: Option, - pub max_completion_tokens: Option, - #[serde(default)] - pub capabilities: ModelCapabilities, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct ModelCapabilities { - pub tools: bool, - pub images: bool, - pub parallel_tool_calls: bool, - pub prompt_cache_key: bool, -} - -impl Default for ModelCapabilities { - fn default() -> Self { - Self { - tools: true, - images: false, - parallel_tool_calls: false, - prompt_cache_key: false, - } - } -} - pub struct OpenAiCompatibleLanguageModelProvider { id: LanguageModelProviderId, name: LanguageModelProviderName, http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { id: Arc, - env_var_name: Arc, - api_key: Option, - api_key_from_env: bool, + api_key_env_var: EnvVar, + api_key_state: ApiKeyState, settings: OpenAiCompatibleSettings, - _subscription: Subscription, } impl State { fn is_authenticated(&self) -> bool { - self.api_key.is_some() - } - - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = self.settings.api_url.clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) - } - - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = self.settings.api_url.clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - cx.notify(); - }) - }) + self.api_key_state.has_key() } - fn get_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let env_var_name = self.env_var_name.clone(); - let api_url = self.settings.api_url.clone(); - cx.spawn(async move |this, cx| { - let (api_key, from_env) = if let Ok(api_key) = std::env::var(env_var_name.as_ref()) { - (api_key, true) - } else { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - ( - String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - false, - ) - }; - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.api_key_from_env = from_env; - cx.notify(); - })?; - - Ok(()) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = SharedString::new(self.settings.api_url.as_str()); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - self.get_api_key(cx) + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = SharedString::new(self.settings.api_url.clone()); + self.api_key_state.load_if_needed( + api_url, + &self.api_key_env_var, + |this| &mut this.api_key_state, + cx, + ) } } impl OpenAiCompatibleLanguageModelProvider { pub fn new(id: Arc, http_client: Arc, cx: &mut App) -> Self { fn resolve_settings<'a>(id: &'a str, cx: &'a App) -> Option<&'a OpenAiCompatibleSettings> { - AllLanguageModelSettings::get_global(cx) + crate::AllLanguageModelSettings::get_global(cx) .openai_compatible .get(id) } - let state = cx.new(|cx| State { - id: id.clone(), - env_var_name: format!("{}_API_KEY", id).to_case(Case::Constant).into(), - settings: resolve_settings(&id, cx).cloned().unwrap_or_default(), - api_key: None, - api_key_from_env: false, - _subscription: cx.observe_global::(|this: &mut State, cx| { + let api_key_env_var_name = format!("{}_API_KEY", id).to_case(Case::UpperSnake).into(); + let state = cx.new(|cx| { + cx.observe_global::(|this: &mut State, cx| { let Some(settings) = resolve_settings(&this.id, cx).cloned() else { return; }; if &this.settings != &settings { - if settings.api_url != this.settings.api_url && !this.api_key_from_env { - let spawn_task = cx.spawn(async move |handle, cx| { - if let Ok(task) = handle.update(cx, |this, cx| this.get_api_key(cx)) { - if let Err(_) = task.await { - handle - .update(cx, |this, _| { - this.api_key = None; - this.api_key_from_env = false; - }) - .ok(); - } - } - }); - spawn_task.detach(); - } - + let api_url = SharedString::new(settings.api_url.as_str()); + this.api_key_state.handle_url_change( + api_url, + &this.api_key_env_var, + |this| &mut this.api_key_state, + cx, + ); this.settings = settings; cx.notify(); } - }), + }) + .detach(); + let settings = resolve_settings(&id, cx).cloned().unwrap_or_default(); + State { + id: id.clone(), + api_key_env_var: EnvVar::new(api_key_env_var_name), + api_key_state: ApiKeyState::new(SharedString::new(settings.api_url.as_str())), + settings, + } }); Self { @@ -214,7 +125,7 @@ impl OpenAiCompatibleLanguageModelProvider { impl LanguageModelProviderState for OpenAiCompatibleLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -274,7 +185,8 @@ impl LanguageModelProvider for OpenAiCompatibleLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } @@ -283,7 +195,7 @@ pub struct OpenAiCompatibleLanguageModel { provider_id: LanguageModelProviderId, provider_name: LanguageModelProviderName, model: AvailableModel, - state: gpui::Entity, + state: Entity, http_client: Arc, request_limiter: RateLimiter, } @@ -296,10 +208,15 @@ impl OpenAiCompatibleLanguageModel { ) -> BoxFuture<'static, Result>>> { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, _| { - (state.api_key.clone(), state.settings.api_url.clone()) + + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, _cx| { + let api_url = &state.settings.api_url; + ( + state.api_key_state.key(api_url), + state.settings.api_url.clone(), + ) }) else { - return futures::future::ready(Err(anyhow!("App state dropped"))).boxed(); + return future::ready(Err(anyhow!("App state dropped"))).boxed(); }; let provider = self.provider_name.clone(); @@ -424,12 +341,12 @@ impl LanguageModel for OpenAiCompatibleLanguageModel { struct ConfigurationView { api_key_editor: Entity, - state: gpui::Entity, + state: Entity, load_credentials_task: Option>, } impl ConfigurationView { - fn new(state: gpui::Entity, window: &mut Window, cx: &mut Context) -> Self { + fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { let api_key_editor = cx.new(|cx| { SingleLineInput::new( window, @@ -469,56 +386,47 @@ impl ConfigurationView { } fn save_api_key(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { - let api_key = self - .api_key_editor - .read(cx) - .editor() - .read(cx) - .text(cx) - .trim() - .to_string(); - - // Don't proceed if no API key is provided and we're not authenticated - if api_key.is_empty() && !self.state.read(cx).is_authenticated() { + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); + if api_key.is_empty() { return; } + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |input, cx| input.set_text("", window, cx)); + let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { - self.api_key_editor.update(cx, |input, cx| { - input.editor.update(cx, |editor, cx| { - editor.set_text("", window, cx); - }); - }); + self.api_key_editor + .update(cx, |input, cx| input.set_text("", window, cx)); let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { - state.update(cx, |state, cx| state.reset_api_key(cx))?.await + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await }) .detach_and_log_err(cx); - - cx.notify(); } - fn should_render_editor(&self, cx: &mut Context) -> bool { + fn should_render_editor(&self, cx: &Context) -> bool { !self.state.read(cx).is_authenticated() } } impl Render for ConfigurationView { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; - let env_var_name = self.state.read(cx).env_var_name.clone(); + let state = self.state.read(cx); + let env_var_set = state.api_key_state.is_from_env_var(); + let env_var_name = &state.api_key_env_var.name; let api_key_section = if self.should_render_editor(cx) { v_flex() @@ -550,9 +458,9 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {env_var_name} environment variable.") + format!("API key set in {env_var_name} environment variable") } else { - "API key configured.".to_string() + format!("API key configured for {}", truncate_and_trailoff(&state.settings.api_url, 32)) })), ) .child( diff --git a/crates/language_models/src/provider/open_router.rs b/crates/language_models/src/provider/open_router.rs index 0ebf379b393791558cba6ff36ab31d278162386e..5bfc97c41f60351288ccf08c3a86b4b0947ee997 100644 --- a/crates/language_models/src/provider/open_router.rs +++ b/crates/language_models/src/provider/open_router.rs @@ -1,11 +1,7 @@ -use anyhow::{Context as _, Result, anyhow}; +use anyhow::{Result, anyhow}; use collections::HashMap; -use credentials_provider::CredentialsProvider; -use editor::{Editor, EditorElement, EditorStyle}; -use futures::{FutureExt, Stream, StreamExt, future::BoxFuture}; -use gpui::{ - AnyView, App, AsyncApp, Context, Entity, FontStyle, Subscription, Task, TextStyle, WhiteSpace, -}; +use futures::{FutureExt, Stream, StreamExt, future, future::BoxFuture}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -15,168 +11,68 @@ use language_model::{ LanguageModelToolUse, MessageContent, RateLimiter, Role, StopReason, TokenUsage, }; use open_router::{ - Model, ModelMode as OpenRouterModelMode, Provider, ResponseStreamEvent, list_models, - stream_completion, + Model, ModelMode as OpenRouterModelMode, OPEN_ROUTER_API_URL, ResponseStreamEvent, list_models, }; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore}; +use settings::{OpenRouterAvailableModel as AvailableModel, Settings, SettingsStore}; use std::pin::Pin; use std::str::FromStr as _; -use std::sync::Arc; -use theme::ThemeSettings; +use std::sync::{Arc, LazyLock}; use ui::{Icon, IconName, List, Tooltip, prelude::*}; -use util::ResultExt; +use ui_input::SingleLineInput; +use util::{ResultExt, truncate_and_trailoff}; +use zed_env_vars::{EnvVar, env_var}; -use crate::{AllLanguageModelSettings, ui::InstructionListItem}; +use crate::{api_key::ApiKeyState, ui::InstructionListItem}; const PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId::new("openrouter"); const PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("OpenRouter"); +const API_KEY_ENV_VAR_NAME: &str = "OPENROUTER_API_KEY"; +static API_KEY_ENV_VAR: LazyLock = env_var!(API_KEY_ENV_VAR_NAME); + #[derive(Default, Clone, Debug, PartialEq)] pub struct OpenRouterSettings { pub api_url: String, pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub max_output_tokens: Option, - pub max_completion_tokens: Option, - pub supports_tools: Option, - pub supports_images: Option, - pub mode: Option, - pub provider: Option, -} - -#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema)] -#[serde(tag = "type", rename_all = "lowercase")] -pub enum ModelMode { - #[default] - Default, - Thinking { - budget_tokens: Option, - }, -} - -impl From for OpenRouterModelMode { - fn from(value: ModelMode) -> Self { - match value { - ModelMode::Default => OpenRouterModelMode::Default, - ModelMode::Thinking { budget_tokens } => { - OpenRouterModelMode::Thinking { budget_tokens } - } - } - } -} - -impl From for ModelMode { - fn from(value: OpenRouterModelMode) -> Self { - match value { - OpenRouterModelMode::Default => ModelMode::Default, - OpenRouterModelMode::Thinking { budget_tokens } => { - ModelMode::Thinking { budget_tokens } - } - } - } -} - pub struct OpenRouterLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { - api_key: Option, - api_key_from_env: bool, + api_key_state: ApiKeyState, http_client: Arc, available_models: Vec, fetch_models_task: Option>>, - settings: OpenRouterSettings, - _subscription: Subscription, } -const OPENROUTER_API_KEY_VAR: &str = "OPENROUTER_API_KEY"; - impl State { fn is_authenticated(&self) -> bool { - self.api_key.is_some() + self.api_key_state.has_key() } - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .open_router - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = OpenRouterLanguageModelProvider::api_url(cx); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .open_router - .api_url - .clone(); - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.restart_fetch_models_task(cx); - cx.notify(); - }) - }) - } - - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - let credentials_provider = ::global(cx); - let api_url = AllLanguageModelSettings::get_global(cx) - .open_router - .api_url - .clone(); + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = OpenRouterLanguageModelProvider::api_url(cx); + let task = self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); cx.spawn(async move |this, cx| { - let (api_key, from_env) = if let Ok(api_key) = std::env::var(OPENROUTER_API_KEY_VAR) { - (api_key, true) - } else { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - ( - String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - false, - ) - }; - - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.api_key_from_env = from_env; - this.restart_fetch_models_task(cx); - cx.notify(); - })?; - - Ok(()) + let result = task.await; + this.update(cx, |this, cx| this.restart_fetch_models_task(cx)) + .ok(); + result }) } @@ -184,10 +80,9 @@ impl State { &mut self, cx: &mut Context, ) -> Task> { - let settings = &AllLanguageModelSettings::get_global(cx).open_router; let http_client = self.http_client.clone(); - let api_url = settings.api_url.clone(); - let Some(api_key) = self.api_key.clone() else { + let api_url = OpenRouterLanguageModelProvider::api_url(cx); + let Some(api_key) = self.api_key_state.key(&api_url) else { return Task::ready(Err(LanguageModelCompletionError::NoApiKey { provider: PROVIDER_NAME, })); @@ -216,33 +111,52 @@ impl State { if self.is_authenticated() { let task = self.fetch_models(cx); self.fetch_models_task.replace(task); + } else { + self.available_models = Vec::new(); } } } impl OpenRouterLanguageModelProvider { pub fn new(http_client: Arc, cx: &mut App) -> Self { - let state = cx.new(|cx| State { - api_key: None, - api_key_from_env: false, - http_client: http_client.clone(), - available_models: Vec::new(), - fetch_models_task: None, - settings: OpenRouterSettings::default(), - _subscription: cx.observe_global::(|this: &mut State, cx| { - let current_settings = &AllLanguageModelSettings::get_global(cx).open_router; - let settings_changed = current_settings != &this.settings; - if settings_changed { - this.settings = current_settings.clone(); - this.restart_fetch_models_task(cx); + let state = cx.new(|cx| { + cx.observe_global::({ + let mut last_settings = OpenRouterLanguageModelProvider::settings(cx).clone(); + move |this: &mut State, cx| { + let current_settings = OpenRouterLanguageModelProvider::settings(cx); + let settings_changed = current_settings != &last_settings; + if settings_changed { + last_settings = current_settings.clone(); + this.authenticate(cx).detach(); + cx.notify(); + } } - cx.notify(); - }), + }) + .detach(); + State { + api_key_state: ApiKeyState::new(Self::api_url(cx)), + http_client: http_client.clone(), + available_models: Vec::new(), + fetch_models_task: None, + } }); Self { http_client, state } } + fn settings(cx: &App) -> &OpenRouterSettings { + &crate::AllLanguageModelSettings::get_global(cx).open_router + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + OPEN_ROUTER_API_URL.into() + } else { + SharedString::new(api_url.as_str()) + } + } + fn create_language_model(&self, model: open_router::Model) -> Arc { Arc::new(OpenRouterLanguageModel { id: LanguageModelId::from(model.id().to_string()), @@ -257,7 +171,7 @@ impl OpenRouterLanguageModelProvider { impl LanguageModelProviderState for OpenRouterLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -287,17 +201,14 @@ impl LanguageModelProvider for OpenRouterLanguageModelProvider { let mut models_from_api = self.state.read(cx).available_models.clone(); let mut settings_models = Vec::new(); - for model in &AllLanguageModelSettings::get_global(cx) - .open_router - .available_models - { + for model in &Self::settings(cx).available_models { settings_models.push(open_router::Model { name: model.name.clone(), display_name: model.display_name.clone(), max_tokens: model.max_tokens, supports_tools: model.supports_tools, supports_images: model.supports_images, - mode: model.mode.clone().unwrap_or_default().into(), + mode: model.mode.unwrap_or_default(), provider: model.provider.clone(), }); } @@ -338,14 +249,15 @@ impl LanguageModelProvider for OpenRouterLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } pub struct OpenRouterLanguageModel { id: LanguageModelId, model: open_router::Model, - state: gpui::Entity, + state: Entity, http_client: Arc, request_limiter: RateLimiter, } @@ -366,14 +278,11 @@ impl OpenRouterLanguageModel { >, > { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, cx| { - let settings = &AllLanguageModelSettings::get_global(cx).open_router; - (state.api_key.clone(), settings.api_url.clone()) + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = OpenRouterLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { - return futures::future::ready(Err(LanguageModelCompletionError::Other(anyhow!( - "App state dropped" - )))) - .boxed(); + return future::ready(Err(anyhow!("App state dropped").into())).boxed(); }; async move { @@ -382,7 +291,8 @@ impl OpenRouterLanguageModel { provider: PROVIDER_NAME, }); }; - let request = stream_completion(http_client.as_ref(), &api_url, &api_key, request); + let request = + open_router::stream_completion(http_client.as_ref(), &api_url, &api_key, request); request.await.map_err(Into::into) } .boxed() @@ -782,21 +692,19 @@ pub fn count_open_router_tokens( } struct ConfigurationView { - api_key_editor: Entity, - state: gpui::Entity, + api_key_editor: Entity, + state: Entity, load_credentials_task: Option>, } impl ConfigurationView { - fn new(state: gpui::Entity, window: &mut Window, cx: &mut Context) -> Self { + fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { let api_key_editor = cx.new(|cx| { - let mut editor = Editor::single_line(window, cx); - editor.set_placeholder_text( - "sk_or_000000000000000000000000000000000000000000000000", + SingleLineInput::new( window, cx, - ); - editor + "sk_or_000000000000000000000000000000000000000000000000", + ) }); cx.observe(&state, |_, _, cx| { @@ -830,20 +738,22 @@ impl ConfigurationView { } fn save_api_key(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { - let api_key = self.api_key_editor.read(cx).text(cx); + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); if api_key.is_empty() { return; } + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { @@ -852,36 +762,11 @@ impl ConfigurationView { let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { - state.update(cx, |state, cx| state.reset_api_key(cx))?.await + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await }) .detach_and_log_err(cx); - - cx.notify(); - } - - fn render_api_key_editor(&self, cx: &mut Context) -> impl IntoElement { - let settings = ThemeSettings::get_global(cx); - let text_style = TextStyle { - color: cx.theme().colors().text, - font_family: settings.ui_font.family.clone(), - font_features: settings.ui_font.features.clone(), - font_fallbacks: settings.ui_font.fallbacks.clone(), - font_size: rems(0.875).into(), - font_weight: settings.ui_font.weight, - font_style: FontStyle::Normal, - line_height: relative(1.3), - white_space: WhiteSpace::Normal, - ..Default::default() - }; - EditorElement::new( - &self.api_key_editor, - EditorStyle { - background: cx.theme().colors().editor_background, - local_player: cx.theme().players().local(), - text: text_style, - ..Default::default() - }, - ) } fn should_render_editor(&self, cx: &mut Context) -> bool { @@ -891,7 +776,7 @@ impl ConfigurationView { impl Render for ConfigurationView { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; + let env_var_set = self.state.read(cx).api_key_state.is_from_env_var(); if self.load_credentials_task.is_some() { div().child(Label::new("Loading credentials...")).into_any() @@ -914,21 +799,10 @@ impl Render for ConfigurationView { "Paste your API key below and hit enter to start using the assistant", )), ) - .child( - h_flex() - .w_full() - .my_2() - .px_2() - .py_1() - .bg(cx.theme().colors().editor_background) - .border_1() - .border_color(cx.theme().colors().border) - .rounded_sm() - .child(self.render_api_key_editor(cx)), - ) + .child(self.api_key_editor.clone()) .child( Label::new( - format!("You can also assign the {OPENROUTER_API_KEY_VAR} environment variable and restart Zed."), + format!("You can also assign the {API_KEY_ENV_VAR_NAME} environment variable and restart Zed."), ) .size(LabelSize::Small).color(Color::Muted), ) @@ -947,9 +821,14 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {OPENROUTER_API_KEY_VAR} environment variable.") + format!("API key set in {API_KEY_ENV_VAR_NAME} environment variable") } else { - "API key configured.".to_string() + let api_url = OpenRouterLanguageModelProvider::api_url(cx); + if api_url == OPEN_ROUTER_API_URL { + "API key configured".to_string() + } else { + format!("API key configured for {}", truncate_and_trailoff(&api_url, 32)) + } })), ) .child( @@ -960,7 +839,7 @@ impl Render for ConfigurationView { .icon_position(IconPosition::Start) .disabled(env_var_set) .when(env_var_set, |this| { - this.tooltip(Tooltip::text(format!("To reset your API key, unset the {OPENROUTER_API_KEY_VAR} environment variable."))) + this.tooltip(Tooltip::text(format!("To reset your API key, unset the {API_KEY_ENV_VAR_NAME} environment variable."))) }) .on_click(cx.listener(|this, _, window, cx| this.reset_api_key(window, cx))), ) diff --git a/crates/language_models/src/provider/vercel.rs b/crates/language_models/src/provider/vercel.rs index 84f3175d1e5493fd55cafd2ea9c4a0604d2a97b4..ad12e5a628779eddf333bdd4f91bddbea016c402 100644 --- a/crates/language_models/src/provider/vercel.rs +++ b/crates/language_models/src/provider/vercel.rs @@ -1,8 +1,7 @@ -use anyhow::{Context as _, Result, anyhow}; +use anyhow::{Result, anyhow}; use collections::BTreeMap; -use credentials_provider::CredentialsProvider; -use futures::{FutureExt, StreamExt, future::BoxFuture}; -use gpui::{AnyView, App, AsyncApp, Context, Entity, Subscription, Task, Window}; +use futures::{FutureExt, StreamExt, future, future::BoxFuture}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -10,142 +9,79 @@ use language_model::{ LanguageModelProviderName, LanguageModelProviderState, LanguageModelRequest, LanguageModelToolChoice, RateLimiter, Role, }; -use menu; use open_ai::ResponseStreamEvent; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +pub use settings::VercelAvailableModel as AvailableModel; use settings::{Settings, SettingsStore}; -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use strum::IntoEnumIterator; -use vercel::Model; - use ui::{ElevationIndex, List, Tooltip, prelude::*}; use ui_input::SingleLineInput; -use util::ResultExt; +use util::{ResultExt, truncate_and_trailoff}; +use vercel::{Model, VERCEL_API_URL}; +use zed_env_vars::{EnvVar, env_var}; -use crate::{AllLanguageModelSettings, ui::InstructionListItem}; +use crate::{api_key::ApiKeyState, ui::InstructionListItem}; const PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId::new("vercel"); const PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("Vercel"); -#[derive(Default, Clone, Debug, PartialEq)] +const API_KEY_ENV_VAR_NAME: &str = "VERCEL_API_KEY"; +static API_KEY_ENV_VAR: LazyLock = env_var!(API_KEY_ENV_VAR_NAME); + +#[derive(Clone, Debug, PartialEq)] pub struct VercelSettings { pub api_url: String, pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub max_output_tokens: Option, - pub max_completion_tokens: Option, -} - pub struct VercelLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { - api_key: Option, - api_key_from_env: bool, - _subscription: Subscription, + api_key_state: ApiKeyState, } -const VERCEL_API_KEY_VAR: &str = "VERCEL_API_KEY"; - impl State { fn is_authenticated(&self) -> bool { - self.api_key.is_some() + self.api_key_state.has_key() } - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let settings = &AllLanguageModelSettings::get_global(cx).vercel; - let api_url = if settings.api_url.is_empty() { - vercel::VERCEL_API_URL.to_string() - } else { - settings.api_url.clone() - }; - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = VercelLanguageModelProvider::api_url(cx); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let settings = &AllLanguageModelSettings::get_global(cx).vercel; - let api_url = if settings.api_url.is_empty() { - vercel::VERCEL_API_URL.to_string() - } else { - settings.api_url.clone() - }; - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - cx.notify(); - }) - }) - } - - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - let credentials_provider = ::global(cx); - let settings = &AllLanguageModelSettings::get_global(cx).vercel; - let api_url = if settings.api_url.is_empty() { - vercel::VERCEL_API_URL.to_string() - } else { - settings.api_url.clone() - }; - cx.spawn(async move |this, cx| { - let (api_key, from_env) = if let Ok(api_key) = std::env::var(VERCEL_API_KEY_VAR) { - (api_key, true) - } else { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - ( - String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - false, - ) - }; - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.api_key_from_env = from_env; - cx.notify(); - })?; - - Ok(()) - }) + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = VercelLanguageModelProvider::api_url(cx); + self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ) } } impl VercelLanguageModelProvider { pub fn new(http_client: Arc, cx: &mut App) -> Self { - let state = cx.new(|cx| State { - api_key: None, - api_key_from_env: false, - _subscription: cx.observe_global::(|_this: &mut State, cx| { + let state = cx.new(|cx| { + cx.observe_global::(|this: &mut State, cx| { + let api_url = Self::api_url(cx); + this.api_key_state.handle_url_change( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); cx.notify(); - }), + }) + .detach(); + State { + api_key_state: ApiKeyState::new(Self::api_url(cx)), + } }); Self { http_client, state } @@ -160,12 +96,25 @@ impl VercelLanguageModelProvider { request_limiter: RateLimiter::new(4), }) } + + fn settings(cx: &App) -> &VercelSettings { + &crate::AllLanguageModelSettings::get_global(cx).vercel + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + VERCEL_API_URL.into() + } else { + SharedString::new(api_url.as_str()) + } + } } impl LanguageModelProviderState for VercelLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } @@ -200,10 +149,7 @@ impl LanguageModelProvider for VercelLanguageModelProvider { } } - for model in &AllLanguageModelSettings::get_global(cx) - .vercel - .available_models - { + for model in &Self::settings(cx).available_models { models.insert( model.name.clone(), vercel::Model::Custom { @@ -241,14 +187,15 @@ impl LanguageModelProvider for VercelLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } pub struct VercelLanguageModel { id: LanguageModelId, model: vercel::Model, - state: gpui::Entity, + state: Entity, http_client: Arc, request_limiter: RateLimiter, } @@ -261,16 +208,12 @@ impl VercelLanguageModel { ) -> BoxFuture<'static, Result>>> { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, cx| { - let settings = &AllLanguageModelSettings::get_global(cx).vercel; - let api_url = if settings.api_url.is_empty() { - vercel::VERCEL_API_URL.to_string() - } else { - settings.api_url.clone() - }; - (state.api_key.clone(), api_url) + + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = VercelLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { - return futures::future::ready(Err(anyhow!("App state dropped"))).boxed(); + return future::ready(Err(anyhow!("App state dropped"))).boxed(); }; let future = self.request_limiter.stream(async move { @@ -420,12 +363,12 @@ pub fn count_vercel_tokens( struct ConfigurationView { api_key_editor: Entity, - state: gpui::Entity, + state: Entity, load_credentials_task: Option>, } impl ConfigurationView { - fn new(state: gpui::Entity, window: &mut Window, cx: &mut Context) -> Self { + fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { let api_key_editor = cx.new(|cx| { SingleLineInput::new( window, @@ -466,45 +409,35 @@ impl ConfigurationView { } fn save_api_key(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { - let api_key = self - .api_key_editor - .read(cx) - .editor() - .read(cx) - .text(cx) - .trim() - .to_string(); - - // Don't proceed if no API key is provided and we're not authenticated - if api_key.is_empty() && !self.state.read(cx).is_authenticated() { + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); + if api_key.is_empty() { return; } + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { - self.api_key_editor.update(cx, |input, cx| { - input.editor.update(cx, |editor, cx| { - editor.set_text("", window, cx); - }); - }); + self.api_key_editor + .update(cx, |input, cx| input.set_text("", window, cx)); let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { - state.update(cx, |state, cx| state.reset_api_key(cx))?.await + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await }) .detach_and_log_err(cx); - - cx.notify(); } fn should_render_editor(&self, cx: &mut Context) -> bool { @@ -514,7 +447,7 @@ impl ConfigurationView { impl Render for ConfigurationView { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; + let env_var_set = self.state.read(cx).api_key_state.is_from_env_var(); let api_key_section = if self.should_render_editor(cx) { v_flex() @@ -534,7 +467,7 @@ impl Render for ConfigurationView { .child(self.api_key_editor.clone()) .child( Label::new(format!( - "You can also assign the {VERCEL_API_KEY_VAR} environment variable and restart Zed." + "You can also assign the {API_KEY_ENV_VAR_NAME} environment variable and restart Zed." )) .size(LabelSize::Small) .color(Color::Muted), @@ -559,9 +492,14 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {VERCEL_API_KEY_VAR} environment variable.") + format!("API key set in {API_KEY_ENV_VAR_NAME} environment variable") } else { - "API key configured.".to_string() + let api_url = VercelLanguageModelProvider::api_url(cx); + if api_url == VERCEL_API_URL { + "API key configured".to_string() + } else { + format!("API key configured for {}", truncate_and_trailoff(&api_url, 32)) + } })), ) .child( @@ -572,7 +510,7 @@ impl Render for ConfigurationView { .icon_position(IconPosition::Start) .layer(ElevationIndex::ModalSurface) .when(env_var_set, |this| { - this.tooltip(Tooltip::text(format!("To reset your API key, unset the {VERCEL_API_KEY_VAR} environment variable."))) + this.tooltip(Tooltip::text(format!("To reset your API key, unset the {API_KEY_ENV_VAR_NAME} environment variable."))) }) .on_click(cx.listener(|this, _, window, cx| this.reset_api_key(window, cx))), ) diff --git a/crates/language_models/src/provider/x_ai.rs b/crates/language_models/src/provider/x_ai.rs index bb17f22c7f3fdbb0296b1e0bb290fbce9a979ddf..243a2e3e0217f10d580a278d25e7168f4f62fe21 100644 --- a/crates/language_models/src/provider/x_ai.rs +++ b/crates/language_models/src/provider/x_ai.rs @@ -1,8 +1,7 @@ -use anyhow::{Context as _, Result, anyhow}; +use anyhow::{Result, anyhow}; use collections::BTreeMap; -use credentials_provider::CredentialsProvider; -use futures::{FutureExt, StreamExt, future::BoxFuture}; -use gpui::{AnyView, App, AsyncApp, Context, Entity, Subscription, Task, Window}; +use futures::{FutureExt, StreamExt, future, future::BoxFuture}; +use gpui::{AnyView, App, AsyncApp, Context, Entity, Task, Window}; use http_client::HttpClient; use language_model::{ AuthenticateError, LanguageModel, LanguageModelCompletionError, LanguageModelCompletionEvent, @@ -10,23 +9,24 @@ use language_model::{ LanguageModelProviderName, LanguageModelProviderState, LanguageModelRequest, LanguageModelToolChoice, LanguageModelToolSchemaFormat, RateLimiter, Role, }; -use menu; use open_ai::ResponseStreamEvent; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +pub use settings::XaiAvailableModel as AvailableModel; use settings::{Settings, SettingsStore}; -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use strum::IntoEnumIterator; -use x_ai::Model; - use ui::{ElevationIndex, List, Tooltip, prelude::*}; use ui_input::SingleLineInput; -use util::ResultExt; +use util::{ResultExt, truncate_and_trailoff}; +use x_ai::{Model, XAI_API_URL}; +use zed_env_vars::{EnvVar, env_var}; + +use crate::{api_key::ApiKeyState, ui::InstructionListItem}; -use crate::{AllLanguageModelSettings, ui::InstructionListItem}; +const PROVIDER_ID: LanguageModelProviderId = LanguageModelProviderId::new("x_ai"); +const PROVIDER_NAME: LanguageModelProviderName = LanguageModelProviderName::new("xAI"); -const PROVIDER_ID: &str = "x_ai"; -const PROVIDER_NAME: &str = "xAI"; +const API_KEY_ENV_VAR_NAME: &str = "XAI_API_KEY"; +static API_KEY_ENV_VAR: LazyLock = env_var!(API_KEY_ENV_VAR_NAME); #[derive(Default, Clone, Debug, PartialEq)] pub struct XAiSettings { @@ -34,118 +34,54 @@ pub struct XAiSettings { pub available_models: Vec, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] -pub struct AvailableModel { - pub name: String, - pub display_name: Option, - pub max_tokens: u64, - pub max_output_tokens: Option, - pub max_completion_tokens: Option, -} - pub struct XAiLanguageModelProvider { http_client: Arc, - state: gpui::Entity, + state: Entity, } pub struct State { - api_key: Option, - api_key_from_env: bool, - _subscription: Subscription, + api_key_state: ApiKeyState, } -const XAI_API_KEY_VAR: &str = "XAI_API_KEY"; - impl State { fn is_authenticated(&self) -> bool { - self.api_key.is_some() + self.api_key_state.has_key() } - fn reset_api_key(&self, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let settings = &AllLanguageModelSettings::get_global(cx).x_ai; - let api_url = if settings.api_url.is_empty() { - x_ai::XAI_API_URL.to_string() - } else { - settings.api_url.clone() - }; - cx.spawn(async move |this, cx| { - credentials_provider - .delete_credentials(&api_url, cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = None; - this.api_key_from_env = false; - cx.notify(); - }) - }) + fn set_api_key(&mut self, api_key: Option, cx: &mut Context) -> Task> { + let api_url = XAiLanguageModelProvider::api_url(cx); + self.api_key_state + .store(api_url, api_key, |this| &mut this.api_key_state, cx) } - fn set_api_key(&mut self, api_key: String, cx: &mut Context) -> Task> { - let credentials_provider = ::global(cx); - let settings = &AllLanguageModelSettings::get_global(cx).x_ai; - let api_url = if settings.api_url.is_empty() { - x_ai::XAI_API_URL.to_string() - } else { - settings.api_url.clone() - }; - cx.spawn(async move |this, cx| { - credentials_provider - .write_credentials(&api_url, "Bearer", api_key.as_bytes(), cx) - .await - .log_err(); - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - cx.notify(); - }) - }) - } - - fn authenticate(&self, cx: &mut Context) -> Task> { - if self.is_authenticated() { - return Task::ready(Ok(())); - } - - let credentials_provider = ::global(cx); - let settings = &AllLanguageModelSettings::get_global(cx).x_ai; - let api_url = if settings.api_url.is_empty() { - x_ai::XAI_API_URL.to_string() - } else { - settings.api_url.clone() - }; - cx.spawn(async move |this, cx| { - let (api_key, from_env) = if let Ok(api_key) = std::env::var(XAI_API_KEY_VAR) { - (api_key, true) - } else { - let (_, api_key) = credentials_provider - .read_credentials(&api_url, cx) - .await? - .ok_or(AuthenticateError::CredentialsNotFound)?; - ( - String::from_utf8(api_key).context("invalid {PROVIDER_NAME} API key")?, - false, - ) - }; - this.update(cx, |this, cx| { - this.api_key = Some(api_key); - this.api_key_from_env = from_env; - cx.notify(); - })?; - - Ok(()) - }) + fn authenticate(&mut self, cx: &mut Context) -> Task> { + let api_url = XAiLanguageModelProvider::api_url(cx); + self.api_key_state.load_if_needed( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ) } } impl XAiLanguageModelProvider { pub fn new(http_client: Arc, cx: &mut App) -> Self { - let state = cx.new(|cx| State { - api_key: None, - api_key_from_env: false, - _subscription: cx.observe_global::(|_this: &mut State, cx| { + let state = cx.new(|cx| { + cx.observe_global::(|this: &mut State, cx| { + let api_url = Self::api_url(cx); + this.api_key_state.handle_url_change( + api_url, + &API_KEY_ENV_VAR, + |this| &mut this.api_key_state, + cx, + ); cx.notify(); - }), + }) + .detach(); + State { + api_key_state: ApiKeyState::new(Self::api_url(cx)), + } }); Self { http_client, state } @@ -160,23 +96,36 @@ impl XAiLanguageModelProvider { request_limiter: RateLimiter::new(4), }) } + + fn settings(cx: &App) -> &XAiSettings { + &crate::AllLanguageModelSettings::get_global(cx).x_ai + } + + fn api_url(cx: &App) -> SharedString { + let api_url = &Self::settings(cx).api_url; + if api_url.is_empty() { + XAI_API_URL.into() + } else { + SharedString::new(api_url.as_str()) + } + } } impl LanguageModelProviderState for XAiLanguageModelProvider { type ObservableEntity = State; - fn observable_entity(&self) -> Option> { + fn observable_entity(&self) -> Option> { Some(self.state.clone()) } } impl LanguageModelProvider for XAiLanguageModelProvider { fn id(&self) -> LanguageModelProviderId { - LanguageModelProviderId(PROVIDER_ID.into()) + PROVIDER_ID } fn name(&self) -> LanguageModelProviderName { - LanguageModelProviderName(PROVIDER_NAME.into()) + PROVIDER_NAME } fn icon(&self) -> IconName { @@ -200,10 +149,7 @@ impl LanguageModelProvider for XAiLanguageModelProvider { } } - for model in &AllLanguageModelSettings::get_global(cx) - .x_ai - .available_models - { + for model in &Self::settings(cx).available_models { models.insert( model.name.clone(), x_ai::Model::Custom { @@ -212,6 +158,9 @@ impl LanguageModelProvider for XAiLanguageModelProvider { max_tokens: model.max_tokens, max_output_tokens: model.max_output_tokens, max_completion_tokens: model.max_completion_tokens, + supports_images: model.supports_images, + supports_tools: model.supports_tools, + parallel_tool_calls: model.parallel_tool_calls, }, ); } @@ -241,14 +190,15 @@ impl LanguageModelProvider for XAiLanguageModelProvider { } fn reset_credentials(&self, cx: &mut App) -> Task> { - self.state.update(cx, |state, cx| state.reset_api_key(cx)) + self.state + .update(cx, |state, cx| state.set_api_key(None, cx)) } } pub struct XAiLanguageModel { id: LanguageModelId, model: x_ai::Model, - state: gpui::Entity, + state: Entity, http_client: Arc, request_limiter: RateLimiter, } @@ -261,20 +211,20 @@ impl XAiLanguageModel { ) -> BoxFuture<'static, Result>>> { let http_client = self.http_client.clone(); - let Ok((api_key, api_url)) = cx.read_entity(&self.state, |state, cx| { - let settings = &AllLanguageModelSettings::get_global(cx).x_ai; - let api_url = if settings.api_url.is_empty() { - x_ai::XAI_API_URL.to_string() - } else { - settings.api_url.clone() - }; - (state.api_key.clone(), api_url) + + let Ok((api_key, api_url)) = self.state.read_with(cx, |state, cx| { + let api_url = XAiLanguageModelProvider::api_url(cx); + (state.api_key_state.key(&api_url), api_url) }) else { - return futures::future::ready(Err(anyhow!("App state dropped"))).boxed(); + return future::ready(Err(anyhow!("App state dropped"))).boxed(); }; let future = self.request_limiter.stream(async move { - let api_key = api_key.context("Missing xAI API Key")?; + let Some(api_key) = api_key else { + return Err(LanguageModelCompletionError::NoApiKey { + provider: PROVIDER_NAME, + }); + }; let request = open_ai::stream_completion(http_client.as_ref(), &api_url, &api_key, request); let response = request.await?; @@ -295,11 +245,11 @@ impl LanguageModel for XAiLanguageModel { } fn provider_id(&self) -> LanguageModelProviderId { - LanguageModelProviderId(PROVIDER_ID.into()) + PROVIDER_ID } fn provider_name(&self) -> LanguageModelProviderName { - LanguageModelProviderName(PROVIDER_NAME.into()) + PROVIDER_NAME } fn supports_tools(&self) -> bool { @@ -410,12 +360,12 @@ pub fn count_xai_tokens( struct ConfigurationView { api_key_editor: Entity, - state: gpui::Entity, + state: Entity, load_credentials_task: Option>, } impl ConfigurationView { - fn new(state: gpui::Entity, window: &mut Window, cx: &mut Context) -> Self { + fn new(state: Entity, window: &mut Window, cx: &mut Context) -> Self { let api_key_editor = cx.new(|cx| { SingleLineInput::new( window, @@ -456,45 +406,35 @@ impl ConfigurationView { } fn save_api_key(&mut self, _: &menu::Confirm, window: &mut Window, cx: &mut Context) { - let api_key = self - .api_key_editor - .read(cx) - .editor() - .read(cx) - .text(cx) - .trim() - .to_string(); - - // Don't proceed if no API key is provided and we're not authenticated - if api_key.is_empty() && !self.state.read(cx).is_authenticated() { + let api_key = self.api_key_editor.read(cx).text(cx).trim().to_string(); + if api_key.is_empty() { return; } + // url changes can cause the editor to be displayed again + self.api_key_editor + .update(cx, |editor, cx| editor.set_text("", window, cx)); + let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { state - .update(cx, |state, cx| state.set_api_key(api_key, cx))? + .update(cx, |state, cx| state.set_api_key(Some(api_key), cx))? .await }) .detach_and_log_err(cx); - - cx.notify(); } fn reset_api_key(&mut self, window: &mut Window, cx: &mut Context) { - self.api_key_editor.update(cx, |input, cx| { - input.editor.update(cx, |editor, cx| { - editor.set_text("", window, cx); - }); - }); + self.api_key_editor + .update(cx, |input, cx| input.set_text("", window, cx)); let state = self.state.clone(); cx.spawn_in(window, async move |_, cx| { - state.update(cx, |state, cx| state.reset_api_key(cx))?.await + state + .update(cx, |state, cx| state.set_api_key(None, cx))? + .await }) .detach_and_log_err(cx); - - cx.notify(); } fn should_render_editor(&self, cx: &mut Context) -> bool { @@ -504,7 +444,7 @@ impl ConfigurationView { impl Render for ConfigurationView { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - let env_var_set = self.state.read(cx).api_key_from_env; + let env_var_set = self.state.read(cx).api_key_state.is_from_env_var(); let api_key_section = if self.should_render_editor(cx) { v_flex() @@ -524,7 +464,7 @@ impl Render for ConfigurationView { .child(self.api_key_editor.clone()) .child( Label::new(format!( - "You can also assign the {XAI_API_KEY_VAR} environment variable and restart Zed." + "You can also assign the {API_KEY_ENV_VAR_NAME} environment variable and restart Zed." )) .size(LabelSize::Small) .color(Color::Muted), @@ -549,9 +489,14 @@ impl Render for ConfigurationView { .gap_1() .child(Icon::new(IconName::Check).color(Color::Success)) .child(Label::new(if env_var_set { - format!("API key set in {XAI_API_KEY_VAR} environment variable.") + format!("API key set in {API_KEY_ENV_VAR_NAME} environment variable") } else { - "API key configured.".to_string() + let api_url = XAiLanguageModelProvider::api_url(cx); + if api_url == XAI_API_URL { + "API key configured".to_string() + } else { + format!("API key configured for {}", truncate_and_trailoff(&api_url, 32)) + } })), ) .child( @@ -562,7 +507,7 @@ impl Render for ConfigurationView { .icon_position(IconPosition::Start) .layer(ElevationIndex::ModalSurface) .when(env_var_set, |this| { - this.tooltip(Tooltip::text(format!("To reset your API key, unset the {XAI_API_KEY_VAR} environment variable."))) + this.tooltip(Tooltip::text(format!("To reset your API key, unset the {API_KEY_ENV_VAR_NAME} environment variable."))) }) .on_click(cx.listener(|this, _, window, cx| this.reset_api_key(window, cx))), ) diff --git a/crates/language_models/src/settings.rs b/crates/language_models/src/settings.rs index cfe66c91a36d4da562cba84363f79bd1d5b4e1ce..ce29be38431055ddce992552607259066ab9f3cb 100644 --- a/crates/language_models/src/settings.rs +++ b/crates/language_models/src/settings.rs @@ -1,27 +1,15 @@ use std::sync::Arc; -use anyhow::Result; use collections::HashMap; use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::Settings; use crate::provider::{ - self, - anthropic::AnthropicSettings, - bedrock::AmazonBedrockSettings, - cloud::{self, ZedDotDevSettings}, - deepseek::DeepSeekSettings, - google::GoogleSettings, - lmstudio::LmStudioSettings, - mistral::MistralSettings, - ollama::OllamaSettings, - open_ai::OpenAiSettings, - open_ai_compatible::OpenAiCompatibleSettings, - open_router::OpenRouterSettings, - vercel::VercelSettings, - x_ai::XAiSettings, + anthropic::AnthropicSettings, bedrock::AmazonBedrockSettings, cloud::ZedDotDevSettings, + deepseek::DeepSeekSettings, google::GoogleSettings, lmstudio::LmStudioSettings, + mistral::MistralSettings, ollama::OllamaSettings, open_ai::OpenAiSettings, + open_ai_compatible::OpenAiCompatibleSettings, open_router::OpenRouterSettings, + vercel::VercelSettings, x_ai::XAiSettings, }; /// Initializes the language model settings. @@ -29,7 +17,6 @@ pub fn init_settings(cx: &mut App) { AllLanguageModelSettings::register(cx); } -#[derive(Default)] pub struct AllLanguageModelSettings { pub anthropic: AnthropicSettings, pub bedrock: AmazonBedrockSettings, @@ -46,281 +33,88 @@ pub struct AllLanguageModelSettings { pub zed_dot_dev: ZedDotDevSettings, } -#[derive( - Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, SettingsUi, SettingsKey, -)] -#[settings_key(key = "language_models")] -pub struct AllLanguageModelSettingsContent { - pub anthropic: Option, - pub bedrock: Option, - pub deepseek: Option, - pub google: Option, - pub lmstudio: Option, - pub mistral: Option, - pub ollama: Option, - pub open_router: Option, - pub openai: Option, - pub openai_compatible: Option, OpenAiCompatibleSettingsContent>>, - pub vercel: Option, - pub x_ai: Option, - #[serde(rename = "zed.dev")] - pub zed_dot_dev: Option, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct AnthropicSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct AmazonBedrockSettingsContent { - available_models: Option>, - endpoint_url: Option, - region: Option, - profile: Option, - authentication_method: Option, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct OllamaSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct LmStudioSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct DeepseekSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct MistralSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct OpenAiSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct OpenAiCompatibleSettingsContent { - pub api_url: String, - pub available_models: Vec, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct VercelSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct GoogleSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct XAiSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct ZedDotDevSettingsContent { - available_models: Option>, -} - -#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct OpenRouterSettingsContent { - pub api_url: Option, - pub available_models: Option>, -} - impl settings::Settings for AllLanguageModelSettings { const PRESERVED_KEYS: Option<&'static [&'static str]> = Some(&["version"]); - type FileContent = AllLanguageModelSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - fn merge(target: &mut T, value: Option) { - if let Some(value) = value { - *target = value; - } - } - - let mut settings = AllLanguageModelSettings::default(); - - for value in sources.defaults_and_customizations() { - // Anthropic - let anthropic = value.anthropic.clone(); - merge( - &mut settings.anthropic.api_url, - anthropic.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.anthropic.available_models, - anthropic.as_ref().and_then(|s| s.available_models.clone()), - ); - - // Bedrock - let bedrock = value.bedrock.clone(); - merge( - &mut settings.bedrock.profile_name, - bedrock.as_ref().map(|s| s.profile.clone()), - ); - merge( - &mut settings.bedrock.authentication_method, - bedrock.as_ref().map(|s| s.authentication_method.clone()), - ); - merge( - &mut settings.bedrock.region, - bedrock.as_ref().map(|s| s.region.clone()), - ); - merge( - &mut settings.bedrock.endpoint, - bedrock.as_ref().map(|s| s.endpoint_url.clone()), - ); - - // Ollama - let ollama = value.ollama.clone(); - - merge( - &mut settings.ollama.api_url, - value.ollama.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.ollama.available_models, - ollama.as_ref().and_then(|s| s.available_models.clone()), - ); - - // LM Studio - let lmstudio = value.lmstudio.clone(); - - merge( - &mut settings.lmstudio.api_url, - value.lmstudio.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.lmstudio.available_models, - lmstudio.as_ref().and_then(|s| s.available_models.clone()), - ); - - // DeepSeek - let deepseek = value.deepseek.clone(); - - merge( - &mut settings.deepseek.api_url, - value.deepseek.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.deepseek.available_models, - deepseek.as_ref().and_then(|s| s.available_models.clone()), - ); - - // OpenAI - let openai = value.openai.clone(); - merge( - &mut settings.openai.api_url, - openai.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.openai.available_models, - openai.as_ref().and_then(|s| s.available_models.clone()), - ); - - // OpenAI Compatible - if let Some(openai_compatible) = value.openai_compatible.clone() { - for (id, openai_compatible_settings) in openai_compatible { - settings.openai_compatible.insert( - id, + fn from_settings(content: &settings::SettingsContent) -> Self { + let language_models = content.language_models.clone().unwrap(); + let anthropic = language_models.anthropic.unwrap(); + let bedrock = language_models.bedrock.unwrap(); + let deepseek = language_models.deepseek.unwrap(); + let google = language_models.google.unwrap(); + let lmstudio = language_models.lmstudio.unwrap(); + let mistral = language_models.mistral.unwrap(); + let ollama = language_models.ollama.unwrap(); + let open_router = language_models.open_router.unwrap(); + let openai = language_models.openai.unwrap(); + let openai_compatible = language_models.openai_compatible.unwrap(); + let vercel = language_models.vercel.unwrap(); + let x_ai = language_models.x_ai.unwrap(); + let zed_dot_dev = language_models.zed_dot_dev.unwrap(); + Self { + anthropic: AnthropicSettings { + api_url: anthropic.api_url.unwrap(), + available_models: anthropic.available_models.unwrap_or_default(), + }, + bedrock: AmazonBedrockSettings { + available_models: bedrock.available_models.unwrap_or_default(), + region: bedrock.region, + endpoint: bedrock.endpoint_url, // todo(should be api_url) + profile_name: bedrock.profile, + role_arn: None, // todo(was never a setting for this...) + authentication_method: bedrock.authentication_method.map(Into::into), + }, + deepseek: DeepSeekSettings { + api_url: deepseek.api_url.unwrap(), + available_models: deepseek.available_models.unwrap_or_default(), + }, + google: GoogleSettings { + api_url: google.api_url.unwrap(), + available_models: google.available_models.unwrap_or_default(), + }, + lmstudio: LmStudioSettings { + api_url: lmstudio.api_url.unwrap(), + available_models: lmstudio.available_models.unwrap_or_default(), + }, + mistral: MistralSettings { + api_url: mistral.api_url.unwrap(), + available_models: mistral.available_models.unwrap_or_default(), + }, + ollama: OllamaSettings { + api_url: ollama.api_url.unwrap(), + available_models: ollama.available_models.unwrap_or_default(), + }, + open_router: OpenRouterSettings { + api_url: open_router.api_url.unwrap(), + available_models: open_router.available_models.unwrap_or_default(), + }, + openai: OpenAiSettings { + api_url: openai.api_url.unwrap(), + available_models: openai.available_models.unwrap_or_default(), + }, + openai_compatible: openai_compatible + .into_iter() + .map(|(key, value)| { + ( + key, OpenAiCompatibleSettings { - api_url: openai_compatible_settings.api_url, - available_models: openai_compatible_settings.available_models, + api_url: value.api_url, + available_models: value.available_models, }, - ); - } - } - - // Vercel - let vercel = value.vercel.clone(); - merge( - &mut settings.vercel.api_url, - vercel.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.vercel.available_models, - vercel.as_ref().and_then(|s| s.available_models.clone()), - ); - - // XAI - let x_ai = value.x_ai.clone(); - merge( - &mut settings.x_ai.api_url, - x_ai.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.x_ai.available_models, - x_ai.as_ref().and_then(|s| s.available_models.clone()), - ); - - // ZedDotDev - merge( - &mut settings.zed_dot_dev.available_models, - value - .zed_dot_dev - .as_ref() - .and_then(|s| s.available_models.clone()), - ); - merge( - &mut settings.google.api_url, - value.google.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.google.available_models, - value - .google - .as_ref() - .and_then(|s| s.available_models.clone()), - ); - - // Mistral - let mistral = value.mistral.clone(); - merge( - &mut settings.mistral.api_url, - mistral.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.mistral.available_models, - mistral.as_ref().and_then(|s| s.available_models.clone()), - ); - - // OpenRouter - let open_router = value.open_router.clone(); - merge( - &mut settings.open_router.api_url, - open_router.as_ref().and_then(|s| s.api_url.clone()), - ); - merge( - &mut settings.open_router.available_models, - open_router - .as_ref() - .and_then(|s| s.available_models.clone()), - ); + ) + }) + .collect(), + vercel: VercelSettings { + api_url: vercel.api_url.unwrap(), + available_models: vercel.available_models.unwrap_or_default(), + }, + x_ai: XAiSettings { + api_url: x_ai.api_url.unwrap(), + available_models: x_ai.available_models.unwrap_or_default(), + }, + zed_dot_dev: ZedDotDevSettings { + available_models: zed_dot_dev.available_models.unwrap_or_default(), + }, } - - Ok(settings) } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } diff --git a/crates/language_onboarding/src/python.rs b/crates/language_onboarding/src/python.rs index 6b83b841e0488d67014cc090b6c741035e544e04..e715cb7c806f417980a93a62210c72ca8529fcb5 100644 --- a/crates/language_onboarding/src/python.rs +++ b/crates/language_onboarding/src/python.rs @@ -30,6 +30,10 @@ impl BasedPyrightBanner { _subscriptions: [subscription], } } + + fn onboarding_banner_enabled(&self) -> bool { + !self.dismissed && self.have_basedpyright + } } impl EventEmitter for BasedPyrightBanner {} @@ -38,7 +42,7 @@ impl Render for BasedPyrightBanner { fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { div() .id("basedpyright-banner") - .when(!self.dismissed && self.have_basedpyright, |el| { + .when(self.onboarding_banner_enabled(), |el| { el.child( Banner::new() .child( @@ -81,6 +85,9 @@ impl ToolbarItemView for BasedPyrightBanner { _window: &mut ui::Window, cx: &mut Context, ) -> ToolbarItemLocation { + if !self.onboarding_banner_enabled() { + return ToolbarItemLocation::Hidden; + } if let Some(item) = active_pane_item && let Some(editor) = item.act_as::(cx) && let Some(path) = editor.update(cx, |editor, cx| editor.target_file_abs_path(cx)) diff --git a/crates/language_selector/src/active_buffer_language.rs b/crates/language_selector/src/active_buffer_language.rs index 56924c4cd2d54c64436a5ccaa7dabfe4c53ff0ec..38d010e33bc89012b0dc1a35d1638a6a443f9075 100644 --- a/crates/language_selector/src/active_buffer_language.rs +++ b/crates/language_selector/src/active_buffer_language.rs @@ -1,11 +1,11 @@ -use editor::{Editor, EditorSettings}; +use editor::Editor; use gpui::{ Context, Entity, IntoElement, ParentElement, Render, Subscription, WeakEntity, Window, div, }; use language::LanguageName; use settings::Settings as _; use ui::{Button, ButtonCommon, Clickable, FluentBuilder, LabelSize, Tooltip}; -use workspace::{StatusItemView, Workspace, item::ItemHandle}; +use workspace::{StatusBarSettings, StatusItemView, Workspace, item::ItemHandle}; use crate::{LanguageSelector, Toggle}; @@ -40,10 +40,7 @@ impl ActiveBufferLanguage { impl Render for ActiveBufferLanguage { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { - if !EditorSettings::get_global(cx) - .status_bar - .active_language_button - { + if !StatusBarSettings::get_global(cx).active_language_button { return div(); } diff --git a/crates/language_tools/src/key_context_view.rs b/crates/language_tools/src/key_context_view.rs index 4140713544ed2b22413f909ac45989de8df4e706..1d3cd451f19ce6bc28540f10b2a91a7a6319214a 100644 --- a/crates/language_tools/src/key_context_view.rs +++ b/crates/language_tools/src/key_context_view.rs @@ -207,7 +207,7 @@ impl Render for KeyContextView { .on_click(|_, _, cx| cx.open_url("https://zed.dev/docs/key-bindings")), ) .child( - Button::new("view_default_keymap", "View default keymap") + Button::new("view_default_keymap", "View Default Keymap") .style(ButtonStyle::Filled) .key_binding(ui::KeyBinding::for_action( &zed_actions::OpenDefaultKeymap, @@ -219,11 +219,11 @@ impl Render for KeyContextView { }), ) .child( - Button::new("edit_your_keymap", "Edit your keymap") + Button::new("edit_your_keymap", "Edit Keymap File") .style(ButtonStyle::Filled) - .key_binding(ui::KeyBinding::for_action(&zed_actions::OpenKeymap, window, cx)) + .key_binding(ui::KeyBinding::for_action(&zed_actions::OpenKeymapFile, window, cx)) .on_click(|_, window, cx| { - window.dispatch_action(zed_actions::OpenKeymap.boxed_clone(), cx); + window.dispatch_action(zed_actions::OpenKeymapFile.boxed_clone(), cx); }), ), ) diff --git a/crates/language_tools/src/lsp_button.rs b/crates/language_tools/src/lsp_button.rs index b750ad1621a4711ccbf827d6054ce50d168d6b29..614eaa4f05a0c4cac2572b9d014a04a8de5c4554 100644 --- a/crates/language_tools/src/lsp_button.rs +++ b/crates/language_tools/src/lsp_button.rs @@ -21,6 +21,7 @@ use ui::{ DocumentationSide, Indicator, PopoverMenu, PopoverMenuHandle, Tooltip, Window, prelude::*, }; +use util::{ResultExt, rel_path::RelPath}; use workspace::{StatusItemView, Workspace}; use crate::lsp_log_view; @@ -148,6 +149,7 @@ impl LanguageServerState { return; }; let project = workspace.read(cx).project().clone(); + let path_style = project.read(cx).path_style(cx); let buffer_store = project.read(cx).buffer_store().clone(); let buffers = state .read(cx) @@ -159,6 +161,9 @@ impl LanguageServerState { servers.worktree.as_ref()?.upgrade()?.read(cx); let relative_path = abs_path.strip_prefix(&worktree.abs_path()).ok()?; + let relative_path = + RelPath::new(relative_path, path_style) + .log_err()?; let entry = worktree.entry_for_path(&relative_path)?; let project_path = project.read(cx).path_for_entry(entry.id, cx)?; @@ -767,7 +772,7 @@ impl LspButton { }); servers_with_health_checks.insert(&health.name); let worktree_name = - worktree.map(|worktree| SharedString::new(worktree.read(cx).root_name())); + worktree.map(|worktree| SharedString::new(worktree.read(cx).root_name_str())); let binary_status = state.language_servers.binary_statuses.get(&health.name); let server_data = ServerData::WithHealthCheck { @@ -826,7 +831,7 @@ impl LspButton { { Some((worktree, server_id)) => { let worktree_name = - SharedString::new(worktree.read(cx).root_name()); + SharedString::new(worktree.read(cx).root_name_str()); servers_per_worktree .entry(worktree_name.clone()) .or_default() diff --git a/crates/language_tools/src/lsp_log_view.rs b/crates/language_tools/src/lsp_log_view.rs index fb63ab9a99147328c4987bd80b698ef4a477f013..1c24bfdcf44c09a1729065835debd4ef5fbb2252 100644 --- a/crates/language_tools/src/lsp_log_view.rs +++ b/crates/language_tools/src/lsp_log_view.rs @@ -376,7 +376,7 @@ impl LspLogView { let worktree_root_name = state .worktree_id .and_then(|id| self.project.read(cx).worktree_for_id(id, cx)) - .map(|worktree| worktree.read(cx).root_name().to_string()) + .map(|worktree| worktree.read(cx).root_name_str().to_string()) .unwrap_or_else(|| "Unknown worktree".to_string()); LogMenuItem { @@ -606,7 +606,7 @@ impl LspLogView { }); server - .notify::(&SetTraceParams { value: level }) + .notify::(SetTraceParams { value: level }) .ok(); } } diff --git a/crates/language_tools/src/lsp_log_view_tests.rs b/crates/language_tools/src/lsp_log_view_tests.rs index d572c4375ed09997dc57d6c58e6c90f3e55775b6..c521c03a2fe5fd457445ec0a42cebfd3db0010ba 100644 --- a/crates/language_tools/src/lsp_log_view_tests.rs +++ b/crates/language_tools/src/lsp_log_view_tests.rs @@ -73,7 +73,7 @@ async fn test_lsp_log_view(cx: &mut TestAppContext) { let log_view = window.root(cx).unwrap(); let mut cx = VisualTestContext::from_window(*window, cx); - language_server.notify::(&lsp::LogMessageParams { + language_server.notify::(lsp::LogMessageParams { message: "hello from the server".into(), typ: lsp::MessageType::INFO, }); @@ -91,7 +91,7 @@ async fn test_lsp_log_view(cx: &mut TestAppContext) { .next() .unwrap() .read(cx) - .root_name() + .root_name_str() .to_string(), rpc_trace_enabled: false, selected_entry: LogKind::Logs, diff --git a/crates/language_tools/src/syntax_tree_view.rs b/crates/language_tools/src/syntax_tree_view.rs index 5700d8d487e990937597295fb5bab761a46f2ba3..eea8c8a43b9b0dad854cc2a24878123ffeed6837 100644 --- a/crates/language_tools/src/syntax_tree_view.rs +++ b/crates/language_tools/src/syntax_tree_view.rs @@ -12,7 +12,8 @@ use theme::ActiveTheme; use tree_sitter::{Node, TreeCursor}; use ui::{ ButtonCommon, ButtonLike, Clickable, Color, ContextMenu, FluentBuilder as _, IconButton, - IconName, Label, LabelCommon, LabelSize, PopoverMenu, StyledExt, Tooltip, h_flex, v_flex, + IconName, Label, LabelCommon, LabelSize, PopoverMenu, StyledExt, Tooltip, WithScrollbar, + h_flex, v_flex, }; use workspace::{ Event as WorkspaceEvent, SplitDirection, ToolbarItemEvent, ToolbarItemLocation, @@ -254,7 +255,7 @@ impl SyntaxTreeView { let selection_range = editor.selections.last::(cx).range(); let multi_buffer = editor.buffer().read(cx); let (buffer, range, excerpt_id) = snapshot - .buffer_snapshot + .buffer_snapshot() .range_to_buffer_ranges(selection_range) .pop()?; let buffer = multi_buffer.buffer(buffer.remote_id()).unwrap(); @@ -487,7 +488,7 @@ impl SyntaxTreeView { } impl Render for SyntaxTreeView { - fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { div() .flex_1() .bg(cx.theme().colors().editor_background) @@ -512,6 +513,8 @@ impl Render for SyntaxTreeView { .text_bg(cx.theme().colors().background) .into_any_element(), ) + .vertical_scrollbar_for(self.list_scroll_handle.clone(), window, cx) + .into_any_element() } else { let inner_content = v_flex() .items_center() @@ -540,6 +543,7 @@ impl Render for SyntaxTreeView { .size_full() .justify_center() .child(inner_content) + .into_any_element() } }) } diff --git a/crates/languages/Cargo.toml b/crates/languages/Cargo.toml index 44b0cb58653adff27e31c6edd7fb4208e0bb4bbf..650a785b4686b8afcd5cfe351d7b31ce76e87970 100644 --- a/crates/languages/Cargo.toml +++ b/crates/languages/Cargo.toml @@ -41,37 +41,35 @@ async-tar.workspace = true async-trait.workspace = true chrono.workspace = true collections.workspace = true -dap.workspace = true futures.workspace = true gpui.workspace = true http_client.workspace = true +json_schema_store.workspace = true +itertools.workspace = true language.workspace = true log.workspace = true lsp.workspace = true node_runtime.workspace = true parking_lot.workspace = true -paths.workspace = true pet-conda.workspace = true pet-core.workspace = true pet-fs.workspace = true pet-poetry.workspace = true pet-reporter.workspace = true +pet-virtualenv.workspace = true pet.workspace = true project.workspace = true regex.workspace = true rope.workspace = true rust-embed.workspace = true -schemars.workspace = true -sha2.workspace = true serde.workspace = true serde_json.workspace = true serde_json_lenient.workspace = true settings.workspace = true smol.workspace = true -snippet_provider.workspace = true url.workspace = true task.workspace = true -tempfile.workspace = true +theme.workspace = true toml.workspace = true tree-sitter = { workspace = true, optional = true } tree-sitter-bash = { workspace = true, optional = true } @@ -93,7 +91,6 @@ tree-sitter-typescript = { workspace = true, optional = true } tree-sitter-yaml = { workspace = true, optional = true } util.workspace = true workspace-hack.workspace = true -shlex.workspace = true [dev-dependencies] pretty_assertions.workspace = true diff --git a/crates/languages/src/bash.rs b/crates/languages/src/bash.rs index 0c6ab8cc14eca2ba87fa0b876946bee0b21d479b..8fabd4cf43aa4a79fa868854064942252deb4117 100644 --- a/crates/languages/src/bash.rs +++ b/crates/languages/src/bash.rs @@ -19,7 +19,7 @@ pub(super) fn bash_task_context() -> ContextProviderWithTasks { #[cfg(test)] mod tests { use gpui::{AppContext as _, BorrowAppContext, Context, TestAppContext}; - use language::{AutoindentMode, Buffer, language_settings::AllLanguageSettings}; + use language::{AutoindentMode, Buffer}; use settings::SettingsStore; use std::num::NonZeroU32; use unindent::Unindent; @@ -34,8 +34,8 @@ mod tests { cx.set_global(test_settings); language::init(cx); cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |s| { - s.defaults.tab_size = NonZeroU32::new(2) + store.update_user_settings(cx, |s| { + s.project.all_languages.defaults.tab_size = NonZeroU32::new(2) }); }); }); diff --git a/crates/languages/src/c.rs b/crates/languages/src/c.rs index 1e3a1f805885e850884c2e5f5ec18ca71801301f..f30120a635655af6c11889d3af110e6c2dca81fc 100644 --- a/crates/languages/src/c.rs +++ b/crates/languages/src/c.rs @@ -3,6 +3,7 @@ use async_trait::async_trait; use futures::StreamExt; use gpui::{App, AsyncApp}; use http_client::github::{AssetKind, GitHubLspBinaryVersion, latest_github_release}; +use http_client::github_download::{GithubBinaryMetadata, download_server_binary}; pub use language::*; use lsp::{InitializeParams, LanguageServerBinary, LanguageServerName}; use project::lsp_store::clangd_ext; @@ -11,8 +12,6 @@ use smol::fs; use std::{env::consts, path::PathBuf, sync::Arc}; use util::{ResultExt, fs::remove_matching, maybe, merge_json_value_into}; -use crate::github_download::{GithubBinaryMetadata, download_server_binary}; - pub struct CLspAdapter; impl CLspAdapter { @@ -119,7 +118,7 @@ impl LspInstaller for CLspAdapter { } } download_server_binary( - delegate, + &*delegate.http_client(), &url, expected_digest.as_deref(), &container_dir, @@ -394,7 +393,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option(|store, cx| { - store.update_user_settings::(cx, |s| { - s.defaults.tab_size = NonZeroU32::new(2); + store.update_user_settings(cx, |s| { + s.project.all_languages.defaults.tab_size = NonZeroU32::new(2); }); }); }); diff --git a/crates/languages/src/c/config.toml b/crates/languages/src/c/config.toml index 74290fd9e2b31db93bb62187ab707110c818fc44..76a27ccc81911bcf25c7da3efef191214eab7b00 100644 --- a/crates/languages/src/c/config.toml +++ b/crates/languages/src/c/config.toml @@ -17,3 +17,4 @@ brackets = [ ] debuggers = ["CodeLLDB", "GDB"] documentation_comment = { start = "/*", prefix = "* ", end = "*/", tab_size = 1 } +import_path_strip_regex = "^<|>$" diff --git a/crates/languages/src/c/imports.scm b/crates/languages/src/c/imports.scm new file mode 100644 index 0000000000000000000000000000000000000000..c3c2c9e68c4503d323d039f9c042d9501b5e4126 --- /dev/null +++ b/crates/languages/src/c/imports.scm @@ -0,0 +1,7 @@ +(preproc_include + path: [ + ( + (system_lib_string) @source @wildcard + (#strip! @source "[<>]")) + (string_literal (string_content) @source @wildcard) + ]) @import diff --git a/crates/languages/src/cpp/config.toml b/crates/languages/src/cpp/config.toml index 7e24415f9d44c75cfe18065bbe264f0da0f561de..4d3c0a0a38664f4dd584a0ce3f3544662b19bbae 100644 --- a/crates/languages/src/cpp/config.toml +++ b/crates/languages/src/cpp/config.toml @@ -17,3 +17,4 @@ brackets = [ ] debuggers = ["CodeLLDB", "GDB"] documentation_comment = { start = "/*", prefix = "* ", end = "*/", tab_size = 1 } +import_path_strip_regex = "^<|>$" diff --git a/crates/languages/src/cpp/imports.scm b/crates/languages/src/cpp/imports.scm new file mode 100644 index 0000000000000000000000000000000000000000..a4ef817a80dbcd44336bdd8cd681587662aad435 --- /dev/null +++ b/crates/languages/src/cpp/imports.scm @@ -0,0 +1,5 @@ +(preproc_include + path: [ + ((system_lib_string) @source @wildcard) + (string_literal (string_content) @source @wildcard) + ]) @import diff --git a/crates/languages/src/go.rs b/crates/languages/src/go.rs index 60c6d98d21f9b3273f3afdaeb2cbe544af15efe9..13a4cec85ff8554cd14cb835a4320662f79a41d4 100644 --- a/crates/languages/src/go.rs +++ b/crates/languages/src/go.rs @@ -479,6 +479,8 @@ const GO_SUBTEST_NAME_TASK_VARIABLE: VariableName = VariableName::Custom(Cow::Borrowed("GO_SUBTEST_NAME")); const GO_TABLE_TEST_CASE_NAME_TASK_VARIABLE: VariableName = VariableName::Custom(Cow::Borrowed("GO_TABLE_TEST_CASE_NAME")); +const GO_SUITE_NAME_TASK_VARIABLE: VariableName = + VariableName::Custom(Cow::Borrowed("GO_SUITE_NAME")); impl ContextProvider for GoContextProvider { fn build_context( @@ -526,7 +528,7 @@ impl ContextProvider for GoContextProvider { let module_dir = buffer_dir .ancestors() .find(|dir| dir.join("go.mod").is_file()) - .map(|dir| dir.to_string_lossy().to_string()) + .map(|dir| dir.to_string_lossy().into_owned()) .unwrap_or_else(|| ".".to_string()); (GO_MODULE_ROOT_TASK_VARIABLE.clone(), module_dir) @@ -537,19 +539,26 @@ impl ContextProvider for GoContextProvider { let go_subtest_variable = extract_subtest_name(_subtest_name.unwrap_or("")) .map(|subtest_name| (GO_SUBTEST_NAME_TASK_VARIABLE.clone(), subtest_name)); - let table_test_case_name = variables.get(&VariableName::Custom(Cow::Borrowed( + let _table_test_case_name = variables.get(&VariableName::Custom(Cow::Borrowed( "_table_test_case_name", ))); - let go_table_test_case_variable = table_test_case_name + let go_table_test_case_variable = _table_test_case_name .and_then(extract_subtest_name) .map(|case_name| (GO_TABLE_TEST_CASE_NAME_TASK_VARIABLE.clone(), case_name)); + let _suite_name = variables.get(&VariableName::Custom(Cow::Borrowed("_suite_name"))); + + let go_suite_variable = _suite_name + .and_then(extract_subtest_name) + .map(|suite_name| (GO_SUITE_NAME_TASK_VARIABLE.clone(), suite_name)); + Task::ready(Ok(TaskVariables::from_iter( [ go_package_variable, go_subtest_variable, go_table_test_case_variable, + go_suite_variable, go_module_root_variable, ] .into_iter() @@ -566,6 +575,28 @@ impl ContextProvider for GoContextProvider { let module_cwd = Some(GO_MODULE_ROOT_TASK_VARIABLE.template_value()); Task::ready(Some(TaskTemplates(vec![ + TaskTemplate { + label: format!( + "go test {} -v -run Test{}/{}", + GO_PACKAGE_TASK_VARIABLE.template_value(), + GO_SUITE_NAME_TASK_VARIABLE.template_value(), + VariableName::Symbol.template_value(), + ), + command: "go".into(), + args: vec![ + "test".into(), + "-v".into(), + "-run".into(), + format!( + "\\^Test{}\\$/\\^{}\\$", + GO_SUITE_NAME_TASK_VARIABLE.template_value(), + VariableName::Symbol.template_value(), + ), + ], + cwd: package_cwd.clone(), + tags: vec!["go-testify-suite".to_owned()], + ..TaskTemplate::default() + }, TaskTemplate { label: format!( "go test {} -v -run {}/{}", @@ -604,6 +635,22 @@ impl ContextProvider for GoContextProvider { cwd: package_cwd.clone(), ..TaskTemplate::default() }, + TaskTemplate { + label: format!( + "go test {} -run {}", + GO_PACKAGE_TASK_VARIABLE.template_value(), + VariableName::Symbol.template_value(), + ), + command: "go".into(), + args: vec![ + "test".into(), + "-run".into(), + format!("\\^{}\\$", VariableName::Symbol.template_value(),), + ], + tags: vec!["go-example".to_owned()], + cwd: package_cwd.clone(), + ..TaskTemplate::default() + }, TaskTemplate { label: format!("go test {}", GO_PACKAGE_TASK_VARIABLE.template_value()), command: "go".into(), @@ -819,6 +866,59 @@ mod tests { ); } + #[gpui::test] + fn test_testify_suite_detection(cx: &mut TestAppContext) { + let language = language("go", tree_sitter_go::LANGUAGE.into()); + + let testify_suite = r#" + package main + + import ( + "testing" + + "github.com/stretchr/testify/suite" + ) + + type ExampleSuite struct { + suite.Suite + } + + func TestExampleSuite(t *testing.T) { + suite.Run(t, new(ExampleSuite)) + } + + func (s *ExampleSuite) TestSomething_Success() { + // test code + } + "#; + + let buffer = cx + .new(|cx| crate::Buffer::local(testify_suite, cx).with_language(language.clone(), cx)); + cx.executor().run_until_parked(); + + let runnables: Vec<_> = buffer.update(cx, |buffer, _| { + let snapshot = buffer.snapshot(); + snapshot.runnable_ranges(0..testify_suite.len()).collect() + }); + + let tag_strings: Vec = runnables + .iter() + .flat_map(|r| &r.runnable.tags) + .map(|tag| tag.0.to_string()) + .collect(); + + assert!( + tag_strings.contains(&"go-test".to_string()), + "Should find go-test tag, found: {:?}", + tag_strings + ); + assert!( + tag_strings.contains(&"go-testify-suite".to_string()), + "Should find go-testify-suite tag, found: {:?}", + tag_strings + ); + } + #[gpui::test] fn test_go_runnable_detection(cx: &mut TestAppContext) { let language = language("go", tree_sitter_go::LANGUAGE.into()); @@ -908,6 +1008,43 @@ mod tests { ); } + #[gpui::test] + fn test_go_example_test_detection(cx: &mut TestAppContext) { + let language = language("go", tree_sitter_go::LANGUAGE.into()); + + let example_test = r#" + package main + + import "fmt" + + func Example() { + fmt.Println("Hello, world!") + // Output: Hello, world! + } + "#; + + let buffer = + cx.new(|cx| crate::Buffer::local(example_test, cx).with_language(language.clone(), cx)); + cx.executor().run_until_parked(); + + let runnables: Vec<_> = buffer.update(cx, |buffer, _| { + let snapshot = buffer.snapshot(); + snapshot.runnable_ranges(0..example_test.len()).collect() + }); + + let tag_strings: Vec = runnables + .iter() + .flat_map(|r| &r.runnable.tags) + .map(|tag| tag.0.to_string()) + .collect(); + + assert!( + tag_strings.contains(&"go-example".to_string()), + "Should find go-example tag, found: {:?}", + tag_strings + ); + } + #[gpui::test] fn test_go_table_test_slice_detection(cx: &mut TestAppContext) { let language = language("go", tree_sitter_go::LANGUAGE.into()); @@ -932,6 +1069,10 @@ mod tests { name: "test case 2", anotherStr: "bar", }, + { + name: "test case 3", + anotherStr: "baz", + }, } notATableTest := []struct{ @@ -980,21 +1121,22 @@ mod tests { ); let go_test_count = tag_strings.iter().filter(|&tag| tag == "go-test").count(); - let go_table_test_count = tag_strings - .iter() - .filter(|&tag| tag == "go-table-test-case") - .count(); + // This is currently broken; see #39148 + // let go_table_test_count = tag_strings + // .iter() + // .filter(|&tag| tag == "go-table-test-case") + // .count(); assert!( go_test_count == 1, "Should find exactly 1 go-test, found: {}", go_test_count ); - assert!( - go_table_test_count == 2, - "Should find exactly 2 go-table-test-case, found: {}", - go_table_test_count - ); + // assert!( + // go_table_test_count == 3, + // "Should find exactly 3 go-table-test-case, found: {}", + // go_table_test_count + // ); } #[gpui::test] diff --git a/crates/languages/src/go/imports.scm b/crates/languages/src/go/imports.scm new file mode 100644 index 0000000000000000000000000000000000000000..7f0ff2d46e6a271d4258d23f46cc942830e2c6f9 --- /dev/null +++ b/crates/languages/src/go/imports.scm @@ -0,0 +1,14 @@ +(import_spec + name: [ + (dot) + (package_identifier) + ] + path: (interpreted_string_literal + (interpreted_string_literal_content) @namespace) +) @wildcard @import + +(import_spec + !name + path: (interpreted_string_literal + (interpreted_string_literal_content) @namespace) +) @wildcard @import diff --git a/crates/languages/src/go/injections.scm b/crates/languages/src/go/injections.scm index 2be0844d97b7f9f16e8832b5b8aebbb0d0043e5d..7bb68d760e1a556ef93a9477dc578c88d9350dcb 100644 --- a/crates/languages/src/go/injections.scm +++ b/crates/languages/src/go/injections.scm @@ -10,4 +10,365 @@ (raw_string_literal) (interpreted_string_literal) ] @injection.content - (#set! injection.language "regex"))) + (#set! injection.language "regex") + )) + +; INJECT SQL +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*sql\\s*\\*\\/") ; /* sql */ or /*sql*/ + (#set! injection.language "sql") +) + +; INJECT JSON +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*json\\s*\\*\\/") ; /* json */ or /*json*/ + (#set! injection.language "json") +) + +; INJECT YAML +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*yaml\\s*\\*\\/") ; /* yaml */ or /*yaml*/ + (#set! injection.language "yaml") +) + +; INJECT XML +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*xml\\s*\\*\\/") ; /* xml */ or /*xml*/ + (#set! injection.language "xml") +) + +; INJECT HTML +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*html\\s*\\*\\/") ; /* html */ or /*html*/ + (#set! injection.language "html") +) + +; INJECT JS +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*js\\s*\\*\\/") ; /* js */ or /*js*/ + (#set! injection.language "javascript") +) + +; INJECT CSS +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*css\\s*\\*\\/") ; /* css */ or /*css*/ + (#set! injection.language "css") +) + +; INJECT LUA +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*lua\\s*\\*\\/") ; /* lua */ or /*lua*/ + (#set! injection.language "lua") +) + +; INJECT BASH +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*bash\\s*\\*\\/") ; /* bash */ or /*bash*/ + (#set! injection.language "bash") +) + +; INJECT CSV +( + [ + ; var, const or short declaration of raw or interpreted string literal + ((comment) @comment + . + (expression_list + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a literal element (to struct field eg.) + ((comment) @comment + . + (literal_element + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content + )) + + ; when passing as a function parameter + ((comment) @comment + . + [ + (interpreted_string_literal) + (raw_string_literal) + ] @injection.content) + ] + + (#match? @comment "^\\/\\*\\s*csv\\s*\\*\\/") ; /* csv */ or /*csv*/ + (#set! injection.language "csv") +) diff --git a/crates/languages/src/go/runnables.scm b/crates/languages/src/go/runnables.scm index f56262f799c3d73c8eaadd03665565f75add27ba..d3002a06cce9f3a12456eca438ddc6cdbb0233a5 100644 --- a/crates/languages/src/go/runnables.scm +++ b/crates/languages/src/go/runnables.scm @@ -1,22 +1,28 @@ ; Functions names start with `Test` ( - [ + ( (function_declaration name: (_) @run (#match? @run "^Test.*")) + ) @_ + (#set! tag go-test) +) + +; Suite test methods (testify/suite) +( (method_declaration receiver: (parameter_list (parameter_declaration - name: (identifier) @_receiver_name - type: [ - (pointer_type (type_identifier) @_receiver_type) - (type_identifier) @_receiver_type - ] + type: [ + (pointer_type (type_identifier) @_suite_name) + (type_identifier) @_suite_name + ] ) ) - name: (field_identifier) @run @_method_name - (#match? @_method_name "^Test.*")) - ] @_ - (#set! tag go-test) + name: (field_identifier) @run @_subtest_name + (#match? @_subtest_name "^Test.*") + (#match? @_suite_name ".*Suite") + ) @_ + (#set! tag go-testify-suite) ) ; `go:generate` comments @@ -65,6 +71,15 @@ (#set! tag go-subtest) ) +; Functions names start with `Example` +( + ( + (function_declaration name: (_) @run @_name + (#match? @_name "^Example.*")) + ) @_ + (#set! tag go-example) +) + ; Functions names start with `Benchmark` ( ( @@ -141,9 +156,9 @@ [ ( (identifier) - (identifier) @_loop_var + (identifier) @_loop_var_inner ) - (identifier) @_loop_var + (identifier) @_loop_var_outer ] ) right: (identifier) @_range_var @@ -153,7 +168,7 @@ (expression_statement (call_expression function: (selector_expression - operand: (identifier) @_t_var + operand: (identifier) field: (field_identifier) @_run_method (#eq? @_run_method "Run") ) @@ -162,12 +177,12 @@ [ (selector_expression operand: (identifier) @_tc_var - (#eq? @_tc_var @_loop_var) + (#eq? @_tc_var @_loop_var_inner) field: (field_identifier) @_field_check (#eq? @_field_check @_field_name) ) (identifier) @_arg_var - (#eq? @_arg_var @_loop_var) + (#eq? @_arg_var @_loop_var_outer) ] . (func_literal diff --git a/crates/languages/src/javascript/config.toml b/crates/languages/src/javascript/config.toml index 128eac0e4dda2b5b437c494e862970c23a8df3a1..265f362ce4b655371471649c03c5a4a201da320c 100644 --- a/crates/languages/src/javascript/config.toml +++ b/crates/languages/src/javascript/config.toml @@ -23,6 +23,7 @@ tab_size = 2 scope_opt_in_language_servers = ["tailwindcss-language-server", "emmet-language-server"] prettier_parser_name = "babel" debuggers = ["JavaScript"] +import_path_strip_regex = "(?:/index)?\\.[jt]s$" [jsx_tag_auto_close] open_tag_node_name = "jsx_opening_element" @@ -30,6 +31,9 @@ close_tag_node_name = "jsx_closing_element" jsx_element_node_name = "jsx_element" tag_name_node_name = "identifier" +[overrides.default] +linked_edit_characters = ["."] + [overrides.element] line_comments = { remove = true } block_comment = { start = "{/* ", prefix = "", end = "*/}", tab_size = 0 } diff --git a/crates/languages/src/javascript/imports.scm b/crates/languages/src/javascript/imports.scm new file mode 100644 index 0000000000000000000000000000000000000000..e26b97aeef9cb62395e7030f3173208d79187bd6 --- /dev/null +++ b/crates/languages/src/javascript/imports.scm @@ -0,0 +1,14 @@ +(import_statement + import_clause: (import_clause + [ + (identifier) @name + (named_imports + (import_specifier + name: (_) @name + alias: (_)? @alias)) + ]) + source: (string (string_fragment) @source)) @import + +(import_statement + !import_clause + source: (string (string_fragment) @source @wildcard)) @import diff --git a/crates/languages/src/json.rs b/crates/languages/src/json.rs index df4a0d114611a2bab7a49417bb0a0bac79eaf734..45fa2dd75cce051439980b40996dda9865246a99 100644 --- a/crates/languages/src/json.rs +++ b/crates/languages/src/json.rs @@ -3,23 +3,20 @@ use async_compression::futures::bufread::GzipDecoder; use async_tar::Archive; use async_trait::async_trait; use collections::HashMap; -use dap::DapRegistry; use futures::StreamExt; use gpui::{App, AsyncApp, Task}; use http_client::github::{GitHubLspBinaryVersion, latest_github_release}; use language::{ - ContextProvider, LanguageName, LanguageRegistry, LocalFile as _, LspAdapter, - LspAdapterDelegate, LspInstaller, Toolchain, + ContextProvider, LanguageName, LocalFile as _, LspAdapter, LspAdapterDelegate, LspInstaller, + Toolchain, }; use lsp::{LanguageServerBinary, LanguageServerName}; use node_runtime::{NodeRuntime, VersionStrategy}; use project::lsp_store::language_server_settings; use serde_json::{Value, json}; -use settings::{KeymapFile, SettingsJsonSchemaParams, SettingsStore}; use smol::{ fs::{self}, io::BufReader, - lock::RwLock, }; use std::{ env::consts, @@ -28,18 +25,17 @@ use std::{ str::FromStr, sync::Arc, }; -use task::{AdapterSchemas, TaskTemplate, TaskTemplates, VariableName}; -use util::{ResultExt, archive::extract_zip, fs::remove_matching, maybe, merge_json_value_into}; +use task::{TaskTemplate, TaskTemplates, VariableName}; +use util::{ + ResultExt, archive::extract_zip, fs::remove_matching, maybe, merge_json_value_into, + rel_path::RelPath, +}; use crate::PackageJsonData; const SERVER_PATH: &str = "node_modules/vscode-langservers-extracted/bin/vscode-json-language-server"; -// Origin: https://github.com/SchemaStore/schemastore -const TSCONFIG_SCHEMA: &str = include_str!("json/schemas/tsconfig.json"); -const PACKAGE_JSON_SCHEMA: &str = include_str!("json/schemas/package.json"); - pub(crate) struct JsonTaskProvider; impl ContextProvider for JsonTaskProvider { @@ -51,8 +47,8 @@ impl ContextProvider for JsonTaskProvider { let Some(file) = project::File::from_dyn(file.as_ref()).cloned() else { return Task::ready(None); }; - let is_package_json = file.path.ends_with("package.json"); - let is_composer_json = file.path.ends_with("composer.json"); + let is_package_json = file.path.ends_with(RelPath::unix("package.json").unwrap()); + let is_composer_json = file.path.ends_with(RelPath::unix("composer.json").unwrap()); if !is_package_json && !is_composer_json { return Task::ready(None); } @@ -134,164 +130,16 @@ fn server_binary_arguments(server_path: &Path) -> Vec { pub struct JsonLspAdapter { node: NodeRuntime, - languages: Arc, - workspace_config: RwLock>, } impl JsonLspAdapter { const PACKAGE_NAME: &str = "vscode-langservers-extracted"; - pub fn new(node: NodeRuntime, languages: Arc) -> Self { - Self { - node, - languages, - workspace_config: Default::default(), - } - } - - fn get_workspace_config( - language_names: Vec, - adapter_schemas: AdapterSchemas, - cx: &mut App, - ) -> Value { - let keymap_schema = KeymapFile::generate_json_schema_for_registered_actions(cx); - let font_names = &cx.text_system().all_font_names(); - let settings_schema = cx.global::().json_schema( - &SettingsJsonSchemaParams { - language_names: &language_names, - font_names, - }, - cx, - ); - - let tasks_schema = task::TaskTemplates::generate_json_schema(); - let debug_schema = task::DebugTaskFile::generate_json_schema(&adapter_schemas); - let snippets_schema = snippet_provider::format::VsSnippetsFile::generate_json_schema(); - let tsconfig_schema = serde_json::Value::from_str(TSCONFIG_SCHEMA).unwrap(); - let package_json_schema = serde_json::Value::from_str(PACKAGE_JSON_SCHEMA).unwrap(); - - #[allow(unused_mut)] - let mut schemas = serde_json::json!([ - { - "fileMatch": ["tsconfig.json"], - "schema":tsconfig_schema - }, - { - "fileMatch": ["package.json"], - "schema":package_json_schema - }, - { - "fileMatch": [ - schema_file_match(paths::settings_file()), - paths::local_settings_file_relative_path() - ], - "schema": settings_schema, - }, - { - "fileMatch": [schema_file_match(paths::keymap_file())], - "schema": keymap_schema, - }, - { - "fileMatch": [ - schema_file_match(paths::tasks_file()), - paths::local_tasks_file_relative_path() - ], - "schema": tasks_schema, - }, - { - "fileMatch": [ - schema_file_match( - paths::snippets_dir() - .join("*.json") - .as_path() - ) - ], - "schema": snippets_schema, - }, - { - "fileMatch": [ - schema_file_match(paths::debug_scenarios_file()), - paths::local_debug_file_relative_path() - ], - "schema": debug_schema, - }, - ]); - - #[cfg(debug_assertions)] - { - schemas.as_array_mut().unwrap().push(serde_json::json!( - { - "fileMatch": [ - "zed-inspector-style.json" - ], - "schema": generate_inspector_style_schema(), - } - )) - } - - schemas - .as_array_mut() - .unwrap() - .extend(cx.all_action_names().iter().map(|&name| { - project::lsp_store::json_language_server_ext::url_schema_for_action(name) - })); - - // This can be viewed via `dev: open language server logs` -> `json-language-server` -> - // `Server Info` - serde_json::json!({ - "json": { - "format": { - "enable": true, - }, - "validate": - { - "enable": true, - }, - "schemas": schemas - } - }) - } - - async fn get_or_init_workspace_config(&self, cx: &mut AsyncApp) -> Result { - { - let reader = self.workspace_config.read().await; - if let Some(config) = reader.as_ref() { - return Ok(config.clone()); - } - } - let mut writer = self.workspace_config.write().await; - - let adapter_schemas = cx - .read_global::(|dap_registry, _| dap_registry.to_owned())? - .adapters_schema() - .await; - - let config = cx.update(|cx| { - Self::get_workspace_config( - self.languages - .language_names() - .into_iter() - .map(|name| name.to_string()) - .collect(), - adapter_schemas, - cx, - ) - })?; - writer.replace(config.clone()); - Ok(config) + pub fn new(node: NodeRuntime) -> Self { + Self { node } } } -#[cfg(debug_assertions)] -fn generate_inspector_style_schema() -> serde_json_lenient::Value { - let schema = schemars::generate::SchemaSettings::draft2019_09() - .with_transform(util::schemars::DefaultDenyUnknownFields) - .into_generator() - .root_schema_for::(); - - serde_json_lenient::to_value(schema).unwrap() -} - impl LspInstaller for JsonLspAdapter { type BinaryVersion = String; @@ -405,8 +253,23 @@ impl LspAdapter for JsonLspAdapter { _: Option, cx: &mut AsyncApp, ) -> Result { - let mut config = self.get_or_init_workspace_config(cx).await?; - + let mut config = cx.update(|cx| { + let schemas = json_schema_store::all_schema_file_associations(cx); + + // This can be viewed via `dev: open language server logs` -> `json-language-server` -> + // `Server Info` + serde_json::json!({ + "json": { + "format": { + "enable": true, + }, + "validate": { + "enable": true, + }, + "schemas": schemas + } + }) + })?; let project_options = cx.update(|cx| { language_server_settings(delegate.as_ref(), &self.name(), cx) .and_then(|s| s.settings.clone()) @@ -431,10 +294,6 @@ impl LspAdapter for JsonLspAdapter { fn is_primary_zed_json_schema_adapter(&self) -> bool { true } - - async fn clear_zed_json_schema_cache(&self) { - self.workspace_config.write().await.take(); - } } async fn get_cached_server_binary( @@ -467,15 +326,6 @@ async fn get_cached_server_binary( .log_err() } -#[inline] -fn schema_file_match(path: &Path) -> String { - path.strip_prefix(path.parent().unwrap().parent().unwrap()) - .unwrap() - .display() - .to_string() - .replace('\\', "/") -} - pub struct NodeVersionAdapter; impl NodeVersionAdapter { diff --git a/crates/languages/src/lib.rs b/crates/languages/src/lib.rs index f71234a7d5c5219b679acdd12610da4fe6e857ad..76e1ae5edd2593907bd374d398946a1f6083a82e 100644 --- a/crates/languages/src/lib.rs +++ b/crates/languages/src/lib.rs @@ -20,7 +20,6 @@ use crate::{ mod bash; mod c; mod css; -mod github_download; mod go; mod json; mod package_json; @@ -88,13 +87,13 @@ pub fn init(languages: Arc, fs: Arc, node: NodeRuntime let go_context_provider = Arc::new(go::GoContextProvider); let go_lsp_adapter = Arc::new(go::GoLspAdapter); let json_context_provider = Arc::new(JsonTaskProvider); - let json_lsp_adapter = Arc::new(json::JsonLspAdapter::new(node.clone(), languages.clone())); + let json_lsp_adapter = Arc::new(json::JsonLspAdapter::new(node.clone())); let node_version_lsp_adapter = Arc::new(json::NodeVersionAdapter); let py_lsp_adapter = Arc::new(python::PyLspAdapter::new()); let ty_lsp_adapter = Arc::new(python::TyLspAdapter::new(fs.clone())); let python_context_provider = Arc::new(python::PythonContextProvider); let python_lsp_adapter = Arc::new(python::PyrightLspAdapter::new(node.clone())); - let basedpyright_lsp_adapter = Arc::new(BasedPyrightLspAdapter::new()); + let basedpyright_lsp_adapter = Arc::new(BasedPyrightLspAdapter::new(node.clone())); let ruff_lsp_adapter = Arc::new(RuffLspAdapter::new(fs.clone())); let python_toolchain_provider = Arc::new(python::PythonToolchainProvider); let rust_context_provider = Arc::new(rust::RustContextProvider); @@ -286,6 +285,7 @@ pub fn init(languages: Arc, fs: Arc, node: NodeRuntime "HEEX", "HTML", "JavaScript", + "TypeScript", "PHP", "Svelte", "TSX", @@ -311,7 +311,12 @@ pub fn init(languages: Arc, fs: Arc, node: NodeRuntime cx.update(|cx| { SettingsStore::update_global(cx, |settings, cx| { settings - .set_extension_settings(language_settings.clone(), cx) + .set_extension_settings( + settings::ExtensionsSettingsContent { + all_languages: language_settings.clone(), + }, + cx, + ) .log_err(); }); })?; diff --git a/crates/languages/src/python.rs b/crates/languages/src/python.rs index 34dfe4a4287c80a91efd285dc020657f7e0a0fe8..2ac4a5b9f543576944e1ce30b52593afaef8d34a 100644 --- a/crates/languages/src/python.rs +++ b/crates/languages/src/python.rs @@ -16,6 +16,7 @@ use node_runtime::{NodeRuntime, VersionStrategy}; use pet_core::Configuration; use pet_core::os_environment::Environment; use pet_core::python_environment::{PythonEnvironment, PythonEnvironmentKind}; +use pet_virtualenv::is_virtualenv_dir; use project::Fs; use project::lsp_store::language_server_settings; use serde_json::{Value, json}; @@ -23,12 +24,13 @@ use smol::lock::OnceCell; use std::cmp::Ordering; use std::env::consts; use util::fs::{make_file_executable, remove_matching}; +use util::rel_path::RelPath; +use http_client::github_download::{GithubBinaryMetadata, download_server_binary}; use parking_lot::Mutex; use std::str::FromStr; use std::{ borrow::Cow, - ffi::OsString, fmt::Write, path::{Path, PathBuf}, sync::Arc, @@ -36,8 +38,6 @@ use std::{ use task::{ShellKind, TaskTemplate, TaskTemplates, VariableName}; use util::{ResultExt, maybe}; -use crate::github_download::{GithubBinaryMetadata, download_server_binary}; - pub(crate) struct PyprojectTomlManifestProvider; impl ManifestProvider for PyprojectTomlManifestProvider { @@ -52,9 +52,9 @@ impl ManifestProvider for PyprojectTomlManifestProvider { depth, delegate, }: ManifestQuery, - ) -> Option> { + ) -> Option> { for path in path.ancestors().take(depth) { - let p = path.join("pyproject.toml"); + let p = path.join(RelPath::unix("pyproject.toml").unwrap()); if delegate.exists(&p, Some(false)) { return Some(path.into()); } @@ -64,9 +64,6 @@ impl ManifestProvider for PyprojectTomlManifestProvider { } } -const SERVER_PATH: &str = "node_modules/pyright/langserver.index.js"; -const NODE_MODULE_RELATIVE_SERVER_PATH: &str = "pyright/langserver.index.js"; - enum TestRunner { UNITTEST, PYTEST, @@ -84,10 +81,6 @@ impl FromStr for TestRunner { } } -fn server_binary_arguments(server_path: &Path) -> Vec { - vec![server_path.into(), "--stdio".into()] -} - /// Pyright assigns each completion item a `sortText` of the form `XX.YYYY.name`. /// Where `XX` is the sorting category, `YYYY` is based on most recent usage, /// and `name` is the symbol name itself. @@ -107,19 +100,19 @@ pub struct TyLspAdapter { #[cfg(target_os = "macos")] impl TyLspAdapter { - const GITHUB_ASSET_KIND: AssetKind = AssetKind::Gz; + const GITHUB_ASSET_KIND: AssetKind = AssetKind::TarGz; const ARCH_SERVER_NAME: &str = "apple-darwin"; } #[cfg(target_os = "linux")] impl TyLspAdapter { - const GITHUB_ASSET_KIND: AssetKind = AssetKind::Gz; + const GITHUB_ASSET_KIND: AssetKind = AssetKind::TarGz; const ARCH_SERVER_NAME: &str = "unknown-linux-gnu"; } #[cfg(target_os = "freebsd")] impl TyLspAdapter { - const GITHUB_ASSET_KIND: AssetKind = AssetKind::Gz; + const GITHUB_ASSET_KIND: AssetKind = AssetKind::TarGz; const ARCH_SERVER_NAME: &str = "unknown-freebsd"; } @@ -160,11 +153,16 @@ impl LspAdapter for TyLspAdapter { async fn workspace_configuration( self: Arc, - _: &Arc, + delegate: &Arc, toolchain: Option, - _cx: &mut AsyncApp, + cx: &mut AsyncApp, ) -> Result { - let mut ret = json!({}); + let mut ret = cx + .update(|cx| { + language_server_settings(delegate.as_ref(), &self.name(), cx) + .and_then(|s| s.settings.clone()) + })? + .unwrap_or_else(|| json!({})); if let Some(toolchain) = toolchain.and_then(|toolchain| { serde_json::from_value::(toolchain.as_json).ok() }) { @@ -177,10 +175,9 @@ impl LspAdapter for TyLspAdapter { "sysPrefix": sys_prefix } }); - ret.as_object_mut()?.insert( - "pythonExtension".into(), - json!({ "activeEnvironment": environment }), - ); + ret.as_object_mut()? + .entry("pythonExtension") + .or_insert_with(|| json!({ "activeEnvironment": environment })); Some(()) }); } @@ -223,15 +220,20 @@ impl LspInstaller for TyLspAdapter { digest: expected_digest, } = latest_version; let destination_path = container_dir.join(format!("ty-{name}")); + + async_fs::create_dir_all(&destination_path).await?; + let server_path = match Self::GITHUB_ASSET_KIND { - AssetKind::TarGz | AssetKind::Gz => destination_path.clone(), // Tar and gzip extract in place. - AssetKind::Zip => destination_path.clone().join("ty.exe"), // zip contains a .exe + AssetKind::TarGz | AssetKind::Gz => destination_path + .join(Self::build_asset_name()?.0) + .join("ty"), + AssetKind::Zip => destination_path.clone().join("ty.exe"), }; let binary = LanguageServerBinary { path: server_path.clone(), env: None, - arguments: Default::default(), + arguments: vec!["server".into()], }; let metadata_path = destination_path.with_extension("metadata"); @@ -269,7 +271,7 @@ impl LspInstaller for TyLspAdapter { } download_server_binary( - delegate, + &*delegate.http_client(), &url, expected_digest.as_deref(), &destination_path, @@ -290,7 +292,7 @@ impl LspInstaller for TyLspAdapter { Ok(LanguageServerBinary { path: server_path, env: None, - arguments: Default::default(), + arguments: vec!["server".into()], }) } @@ -312,14 +314,16 @@ impl LspInstaller for TyLspAdapter { let path = last.context("no cached binary")?; let path = match TyLspAdapter::GITHUB_ASSET_KIND { - AssetKind::TarGz | AssetKind::Gz => path, // Tar and gzip extract in place. - AssetKind::Zip => path.join("ty.exe"), // zip contains a .exe + AssetKind::TarGz | AssetKind::Gz => { + path.join(Self::build_asset_name()?.0).join("ty") + } + AssetKind::Zip => path.join("ty.exe"), }; anyhow::Ok(LanguageServerBinary { path, env: None, - arguments: Default::default(), + arguments: vec!["server".into()], }) }) .await @@ -333,10 +337,29 @@ pub struct PyrightLspAdapter { impl PyrightLspAdapter { const SERVER_NAME: LanguageServerName = LanguageServerName::new_static("pyright"); + const SERVER_PATH: &str = "node_modules/pyright/langserver.index.js"; + const NODE_MODULE_RELATIVE_SERVER_PATH: &str = "pyright/langserver.index.js"; pub fn new(node: NodeRuntime) -> Self { PyrightLspAdapter { node } } + + async fn get_cached_server_binary( + container_dir: PathBuf, + node: &NodeRuntime, + ) -> Option { + let server_path = container_dir.join(Self::SERVER_PATH); + if server_path.exists() { + Some(LanguageServerBinary { + path: node.binary_path().await.log_err()?, + env: None, + arguments: vec![server_path.into(), "--stdio".into()], + }) + } else { + log::error!("missing executable in directory {:?}", server_path); + None + } + } } #[async_trait(?Send)] @@ -443,7 +466,6 @@ impl LspAdapter for PyrightLspAdapter { async fn workspace_configuration( self: Arc, - adapter: &Arc, toolchain: Option, cx: &mut AsyncApp, @@ -460,7 +482,7 @@ impl LspAdapter for PyrightLspAdapter { pet_core::python_environment::PythonEnvironment, >(toolchain.as_json.clone()) { - if user_settings.is_null() { + if !user_settings.is_object() { user_settings = Value::Object(serde_json::Map::default()); } let object = user_settings.as_object_mut().unwrap(); @@ -491,9 +513,13 @@ impl LspAdapter for PyrightLspAdapter { // Get or create the python section let python = object .entry("python") - .or_insert(Value::Object(serde_json::Map::default())) - .as_object_mut() - .unwrap(); + .and_modify(|v| { + if !v.is_object() { + *v = Value::Object(serde_json::Map::default()); + } + }) + .or_insert(Value::Object(serde_json::Map::default())); + let python = python.as_object_mut().unwrap(); // Set both pythonPath and defaultInterpreterPath for compatibility python.insert( @@ -545,13 +571,13 @@ impl LspInstaller for PyrightLspAdapter { .await .log_err()??; - let path = node_modules_path.join(NODE_MODULE_RELATIVE_SERVER_PATH); + let path = node_modules_path.join(Self::NODE_MODULE_RELATIVE_SERVER_PATH); let env = delegate.shell_env().await; Some(LanguageServerBinary { path: node, env: Some(env), - arguments: server_binary_arguments(&path), + arguments: vec![path.into(), "--stdio".into()], }) } } @@ -562,7 +588,7 @@ impl LspInstaller for PyrightLspAdapter { container_dir: PathBuf, delegate: &dyn LspAdapterDelegate, ) -> Result { - let server_path = container_dir.join(SERVER_PATH); + let server_path = container_dir.join(Self::SERVER_PATH); self.node .npm_install_packages( @@ -575,7 +601,7 @@ impl LspInstaller for PyrightLspAdapter { Ok(LanguageServerBinary { path: self.node.binary_path().await?, env: Some(env), - arguments: server_binary_arguments(&server_path), + arguments: vec![server_path.into(), "--stdio".into()], }) } @@ -585,7 +611,7 @@ impl LspInstaller for PyrightLspAdapter { container_dir: &PathBuf, delegate: &dyn LspAdapterDelegate, ) -> Option { - let server_path = container_dir.join(SERVER_PATH); + let server_path = container_dir.join(Self::SERVER_PATH); let should_install_language_server = self .node @@ -604,7 +630,7 @@ impl LspInstaller for PyrightLspAdapter { Some(LanguageServerBinary { path: self.node.binary_path().await.ok()?, env: Some(env), - arguments: server_binary_arguments(&server_path), + arguments: vec![server_path.into(), "--stdio".into()], }) } } @@ -614,29 +640,12 @@ impl LspInstaller for PyrightLspAdapter { container_dir: PathBuf, delegate: &dyn LspAdapterDelegate, ) -> Option { - let mut binary = get_cached_server_binary(container_dir, &self.node).await?; + let mut binary = Self::get_cached_server_binary(container_dir, &self.node).await?; binary.env = Some(delegate.shell_env().await); Some(binary) } } -async fn get_cached_server_binary( - container_dir: PathBuf, - node: &NodeRuntime, -) -> Option { - let server_path = container_dir.join(SERVER_PATH); - if server_path.exists() { - Some(LanguageServerBinary { - path: node.binary_path().await.log_err()?, - env: None, - arguments: server_binary_arguments(&server_path), - }) - } else { - log::error!("missing executable in directory {:?}", server_path); - None - } -} - pub(crate) struct PythonContextProvider; const PYTHON_TEST_TARGET_TASK_VARIABLE: VariableName = @@ -673,7 +682,7 @@ impl ContextProvider for PythonContextProvider { .as_ref() .and_then(|f| f.path().parent()) .map(Arc::from) - .unwrap_or_else(|| Arc::from("".as_ref())); + .unwrap_or_else(|| RelPath::empty().into()); toolchains .active_toolchain(worktree_id, file_path, "Python".into(), cx) @@ -900,6 +909,21 @@ fn python_module_name_from_relative_path(relative_path: &str) -> String { .to_string() } +fn is_python_env_global(k: &PythonEnvironmentKind) -> bool { + matches!( + k, + PythonEnvironmentKind::Homebrew + | PythonEnvironmentKind::Pyenv + | PythonEnvironmentKind::GlobalPaths + | PythonEnvironmentKind::MacPythonOrg + | PythonEnvironmentKind::MacCommandLineTools + | PythonEnvironmentKind::LinuxGlobal + | PythonEnvironmentKind::MacXCode + | PythonEnvironmentKind::WindowsStore + | PythonEnvironmentKind::WindowsRegistry + ) +} + fn python_env_kind_display(k: &PythonEnvironmentKind) -> &'static str { match k { PythonEnvironmentKind::Conda => "Conda", @@ -966,12 +990,42 @@ async fn get_worktree_venv_declaration(worktree_root: &Path) -> Option { Some(venv_name.trim().to_string()) } +fn get_venv_parent_dir(env: &PythonEnvironment) -> Option { + // If global, we aren't a virtual environment + if let Some(kind) = env.kind + && is_python_env_global(&kind) + { + return None; + } + + // Check to be sure we are a virtual environment using pet's most generic + // virtual environment type, VirtualEnv + let venv = env + .executable + .as_ref() + .and_then(|p| p.parent()) + .and_then(|p| p.parent()) + .filter(|p| is_virtualenv_dir(p))?; + + venv.parent().map(|parent| parent.to_path_buf()) +} + +fn wr_distance(wr: &PathBuf, venv: Option<&PathBuf>) -> usize { + if let Some(venv) = venv + && let Ok(p) = venv.strip_prefix(wr) + { + p.components().count() + } else { + usize::MAX + } +} + #[async_trait] impl ToolchainLister for PythonToolchainProvider { async fn list( &self, worktree_root: PathBuf, - subroot_relative_path: Arc, + subroot_relative_path: Arc, project_env: Option>, ) -> ToolchainList { let env = project_env.unwrap_or_default(); @@ -983,13 +1037,12 @@ impl ToolchainLister for PythonToolchainProvider { ); let mut config = Configuration::default(); - debug_assert!(subroot_relative_path.is_relative()); // `.ancestors()` will yield at least one path, so in case of empty `subroot_relative_path`, we'll just use // worktree root as the workspace directory. config.workspace_directories = Some( subroot_relative_path .ancestors() - .map(|ancestor| worktree_root.join(ancestor)) + .map(|ancestor| worktree_root.join(ancestor.as_std_path())) .collect(), ); for locator in locators.iter() { @@ -1025,11 +1078,10 @@ impl ToolchainLister for PythonToolchainProvider { }); // Compare project paths against worktree root - let proj_ordering = || match (&lhs.project, &rhs.project) { - (Some(l), Some(r)) => (r == &wr).cmp(&(l == &wr)), - (Some(l), None) if l == &wr => Ordering::Less, - (None, Some(r)) if r == &wr => Ordering::Greater, - _ => Ordering::Equal, + let proj_ordering = || { + let lhs_project = lhs.project.clone().or_else(|| get_venv_parent_dir(lhs)); + let rhs_project = rhs.project.clone().or_else(|| get_venv_parent_dir(rhs)); + wr_distance(&wr, lhs_project.as_ref()).cmp(&wr_distance(&wr, rhs_project.as_ref())) }; // Compare environment priorities @@ -1128,26 +1180,20 @@ impl ToolchainLister for PythonToolchainProvider { } Some(PythonEnvironmentKind::Venv | PythonEnvironmentKind::VirtualEnv) => { if let Some(prefix) = &toolchain.prefix { - let activate_keyword = match shell { - ShellKind::Cmd => ".", - ShellKind::Nushell => "overlay use", - ShellKind::Powershell => ".", - ShellKind::Fish => "source", - ShellKind::Csh => "source", - ShellKind::Posix => "source", - }; + let activate_keyword = shell.activate_keyword(); let activate_script_name = match shell { - ShellKind::Posix => "activate", + ShellKind::Posix | ShellKind::Rc => "activate", ShellKind::Csh => "activate.csh", + ShellKind::Tcsh => "activate.csh", ShellKind::Fish => "activate.fish", ShellKind::Nushell => "activate.nu", - ShellKind::Powershell => "activate.ps1", + ShellKind::PowerShell => "activate.ps1", ShellKind::Cmd => "activate.bat", + ShellKind::Xonsh => "activate.xsh", }; let path = prefix.join(BINARY_DIR).join(activate_script_name); - if let Ok(quoted) = - shlex::try_quote(&path.to_string_lossy()).map(Cow::into_owned) + if let Some(quoted) = shell.try_quote(&path.to_string_lossy()) && fs.is_file(&path).await { activation_script.push(format!("{activate_keyword} {quoted}")); @@ -1165,9 +1211,12 @@ impl ToolchainLister for PythonToolchainProvider { ShellKind::Fish => Some(format!("\"{pyenv}\" shell - fish {version}")), ShellKind::Posix => Some(format!("\"{pyenv}\" shell - sh {version}")), ShellKind::Nushell => Some(format!("\"{pyenv}\" shell - nu {version}")), - ShellKind::Powershell => None, + ShellKind::PowerShell => None, ShellKind::Csh => None, + ShellKind::Tcsh => None, ShellKind::Cmd => None, + ShellKind::Rc => None, + ShellKind::Xonsh => None, }) } _ => {} @@ -1425,7 +1474,7 @@ impl LspAdapter for PyLspAdapter { // If user did not explicitly modify their python venv, use one from picker. if let Some(toolchain) = toolchain { - if user_settings.is_null() { + if !user_settings.is_object() { user_settings = Value::Object(serde_json::Map::default()); } let object = user_settings.as_object_mut().unwrap(); @@ -1511,22 +1560,11 @@ impl LspInstaller for PyLspAdapter { ) -> Result { let venv = self.base_venv(delegate).await.map_err(|e| anyhow!(e))?; let pip_path = venv.join(BINARY_DIR).join("pip3"); - ensure!( - util::command::new_smol_command(pip_path.as_path()) - .arg("install") - .arg("python-lsp-server") - .arg("-U") - .output() - .await? - .status - .success(), - "python-lsp-server installation failed" - ); ensure!( util::command::new_smol_command(pip_path.as_path()) .arg("install") .arg("python-lsp-server[all]") - .arg("-U") + .arg("--upgrade") .output() .await? .status @@ -1537,7 +1575,7 @@ impl LspInstaller for PyLspAdapter { util::command::new_smol_command(pip_path) .arg("install") .arg("pylsp-mypy") - .arg("-U") + .arg("--upgrade") .output() .await? .status @@ -1545,6 +1583,10 @@ impl LspInstaller for PyLspAdapter { "pylsp-mypy installation failed" ); let pylsp = venv.join(BINARY_DIR).join("pylsp"); + ensure!( + delegate.which(pylsp.as_os_str()).await.is_some(), + "pylsp installation was incomplete" + ); Ok(LanguageServerBinary { path: pylsp, env: None, @@ -1559,6 +1601,7 @@ impl LspInstaller for PyLspAdapter { ) -> Option { let venv = self.base_venv(delegate).await.ok()?; let pylsp = venv.join(BINARY_DIR).join("pylsp"); + delegate.which(pylsp.as_os_str()).await?; Some(LanguageServerBinary { path: pylsp, env: None, @@ -1568,62 +1611,34 @@ impl LspInstaller for PyLspAdapter { } pub(crate) struct BasedPyrightLspAdapter { - python_venv_base: OnceCell, String>>, + node: NodeRuntime, } impl BasedPyrightLspAdapter { const SERVER_NAME: LanguageServerName = LanguageServerName::new_static("basedpyright"); const BINARY_NAME: &'static str = "basedpyright-langserver"; + const SERVER_PATH: &str = "node_modules/basedpyright/langserver.index.js"; + const NODE_MODULE_RELATIVE_SERVER_PATH: &str = "basedpyright/langserver.index.js"; - pub(crate) fn new() -> Self { - Self { - python_venv_base: OnceCell::new(), - } + pub(crate) fn new(node: NodeRuntime) -> Self { + BasedPyrightLspAdapter { node } } - async fn ensure_venv(delegate: &dyn LspAdapterDelegate) -> Result> { - let python_path = Self::find_base_python(delegate) - .await - .context("Could not find Python installation for basedpyright")?; - let work_dir = delegate - .language_server_download_dir(&Self::SERVER_NAME) - .await - .context("Could not get working directory for basedpyright")?; - let mut path = PathBuf::from(work_dir.as_ref()); - path.push("basedpyright-venv"); - if !path.exists() { - util::command::new_smol_command(python_path) - .arg("-m") - .arg("venv") - .arg("basedpyright-venv") - .current_dir(work_dir) - .spawn()? - .output() - .await?; - } - - Ok(path.into()) - } - - // Find "baseline", user python version from which we'll create our own venv. - async fn find_base_python(delegate: &dyn LspAdapterDelegate) -> Option { - for path in ["python3", "python"] { - if let Some(path) = delegate.which(path.as_ref()).await { - return Some(path); - } - } - None - } - - async fn base_venv(&self, delegate: &dyn LspAdapterDelegate) -> Result, String> { - self.python_venv_base - .get_or_init(move || async move { - Self::ensure_venv(delegate) - .await - .map_err(|e| format!("{e}")) + async fn get_cached_server_binary( + container_dir: PathBuf, + node: &NodeRuntime, + ) -> Option { + let server_path = container_dir.join(Self::SERVER_PATH); + if server_path.exists() { + Some(LanguageServerBinary { + path: node.binary_path().await.log_err()?, + env: None, + arguments: vec![server_path.into(), "--stdio".into()], }) - .await - .clone() + } else { + log::error!("missing executable in directory {:?}", server_path); + None + } } } @@ -1747,7 +1762,7 @@ impl LspAdapter for BasedPyrightLspAdapter { pet_core::python_environment::PythonEnvironment, >(toolchain.as_json.clone()) { - if user_settings.is_null() { + if !user_settings.is_object() { user_settings = Value::Object(serde_json::Map::default()); } let object = user_settings.as_object_mut().unwrap(); @@ -1813,81 +1828,112 @@ impl LspAdapter for BasedPyrightLspAdapter { } impl LspInstaller for BasedPyrightLspAdapter { - type BinaryVersion = (); + type BinaryVersion = String; async fn fetch_latest_server_version( &self, _: &dyn LspAdapterDelegate, _: bool, _: &mut AsyncApp, - ) -> Result<()> { - Ok(()) + ) -> Result { + self.node + .npm_package_latest_version(Self::SERVER_NAME.as_ref()) + .await } async fn check_if_user_installed( &self, delegate: &dyn LspAdapterDelegate, - toolchain: Option, + _: Option, _: &AsyncApp, ) -> Option { - if let Some(bin) = delegate.which(Self::BINARY_NAME.as_ref()).await { + if let Some(path) = delegate.which(Self::BINARY_NAME.as_ref()).await { let env = delegate.shell_env().await; Some(LanguageServerBinary { - path: bin, + path, env: Some(env), arguments: vec!["--stdio".into()], }) } else { - let path = Path::new(toolchain?.path.as_ref()) - .parent()? - .join(Self::BINARY_NAME); - path.exists().then(|| LanguageServerBinary { - path, - arguments: vec!["--stdio".into()], - env: None, + // TODO shouldn't this be self.node.binary_path()? + let node = delegate.which("node".as_ref()).await?; + let (node_modules_path, _) = delegate + .npm_package_installed_version(Self::SERVER_NAME.as_ref()) + .await + .log_err()??; + + let path = node_modules_path.join(Self::NODE_MODULE_RELATIVE_SERVER_PATH); + + let env = delegate.shell_env().await; + Some(LanguageServerBinary { + path: node, + env: Some(env), + arguments: vec![path.into(), "--stdio".into()], }) } } async fn fetch_server_binary( &self, - _latest_version: (), - _container_dir: PathBuf, + latest_version: Self::BinaryVersion, + container_dir: PathBuf, delegate: &dyn LspAdapterDelegate, ) -> Result { - let venv = self.base_venv(delegate).await.map_err(|e| anyhow!(e))?; - let pip_path = venv.join(BINARY_DIR).join("pip3"); - ensure!( - util::command::new_smol_command(pip_path.as_path()) - .arg("install") - .arg("basedpyright") - .arg("-U") - .output() - .await? - .status - .success(), - "basedpyright installation failed" - ); - let pylsp = venv.join(BINARY_DIR).join(Self::BINARY_NAME); + let server_path = container_dir.join(Self::SERVER_PATH); + + self.node + .npm_install_packages( + &container_dir, + &[(Self::SERVER_NAME.as_ref(), latest_version.as_str())], + ) + .await?; + + let env = delegate.shell_env().await; Ok(LanguageServerBinary { - path: pylsp, - env: None, - arguments: vec!["--stdio".into()], + path: self.node.binary_path().await?, + env: Some(env), + arguments: vec![server_path.into(), "--stdio".into()], }) } + async fn check_if_version_installed( + &self, + version: &Self::BinaryVersion, + container_dir: &PathBuf, + delegate: &dyn LspAdapterDelegate, + ) -> Option { + let server_path = container_dir.join(Self::SERVER_PATH); + + let should_install_language_server = self + .node + .should_install_npm_package( + Self::SERVER_NAME.as_ref(), + &server_path, + container_dir, + VersionStrategy::Latest(version), + ) + .await; + + if should_install_language_server { + None + } else { + let env = delegate.shell_env().await; + Some(LanguageServerBinary { + path: self.node.binary_path().await.ok()?, + env: Some(env), + arguments: vec![server_path.into(), "--stdio".into()], + }) + } + } + async fn cached_server_binary( &self, - _container_dir: PathBuf, + container_dir: PathBuf, delegate: &dyn LspAdapterDelegate, ) -> Option { - let venv = self.base_venv(delegate).await.ok()?; - let pylsp = venv.join(BINARY_DIR).join(Self::BINARY_NAME); - Some(LanguageServerBinary { - path: pylsp, - env: None, - arguments: vec!["--stdio".into()], - }) + let mut binary = Self::get_cached_server_binary(container_dir, &self.node).await?; + binary.env = Some(delegate.shell_env().await); + Some(binary) } } @@ -2062,7 +2108,7 @@ impl LspInstaller for RuffLspAdapter { } download_server_binary( - delegate, + &*delegate.http_client(), &url, expected_digest.as_deref(), &destination_path, @@ -2125,7 +2171,7 @@ impl LspInstaller for RuffLspAdapter { #[cfg(test)] mod tests { use gpui::{AppContext as _, BorrowAppContext, Context, TestAppContext}; - use language::{AutoindentMode, Buffer, language_settings::AllLanguageSettings}; + use language::{AutoindentMode, Buffer}; use settings::SettingsStore; use std::num::NonZeroU32; @@ -2138,8 +2184,8 @@ mod tests { cx.set_global(test_settings); language::init(cx); cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |s| { - s.defaults.tab_size = NonZeroU32::new(2); + store.update_user_settings(cx, |s| { + s.project.all_languages.defaults.tab_size = NonZeroU32::new(2); }); }); }); diff --git a/crates/languages/src/python/config.toml b/crates/languages/src/python/config.toml index 3e8b9b550af33fd9594dd14eda12fb81e220d7b9..c58a54fc1cae78cfb3722e74008fe42c7a883851 100644 --- a/crates/languages/src/python/config.toml +++ b/crates/languages/src/python/config.toml @@ -35,3 +35,4 @@ decrease_indent_patterns = [ { pattern = "^\\s*except\\b.*:\\s*(#.*)?", valid_after = ["try", "except"] }, { pattern = "^\\s*finally\\b.*:\\s*(#.*)?", valid_after = ["try", "except", "else"] }, ] +import_path_strip_regex = "/__init__\\.py$" diff --git a/crates/languages/src/python/highlights.scm b/crates/languages/src/python/highlights.scm index 77db9b2f4c17519e966b68c44fede2aa9bc4c29f..f15b3a0e2b03d9c913627b319aff9bca6bb8708e 100644 --- a/crates/languages/src/python/highlights.scm +++ b/crates/languages/src/python/highlights.scm @@ -257,7 +257,6 @@ "elif" "else" "except" - "except*" "exec" "finally" "for" diff --git a/crates/languages/src/python/imports.scm b/crates/languages/src/python/imports.scm new file mode 100644 index 0000000000000000000000000000000000000000..7a1e2b225b9e310098f316c29fe6b1a27634bf12 --- /dev/null +++ b/crates/languages/src/python/imports.scm @@ -0,0 +1,32 @@ +(import_statement + name: [ + (dotted_name + ((identifier) @namespace ".")* + (identifier) @namespace .) + (aliased_import + name: (dotted_name + ((identifier) @namespace ".")* + (identifier) @namespace .)) + ]) @wildcard @import + +(import_from_statement + module_name: [ + (dotted_name + ((identifier) @namespace ".")* + (identifier) @namespace .) + (relative_import + (dotted_name + ((identifier) @namespace ".")* + (identifier) @namespace .)?) + ] + (wildcard_import)? @wildcard + name: [ + (dotted_name + ((identifier) @namespace ".")* + (identifier) @name .) + (aliased_import + name: (dotted_name + ((identifier) @namespace ".")* + (identifier) @name .) + alias: (identifier) @alias) + ]?) @import diff --git a/crates/languages/src/rust.rs b/crates/languages/src/rust.rs index e35d870610669f0e09cb28e15841d1105d129cca..b315e945a73d1792dcf2b6aeebfe29c0db6cdf7f 100644 --- a/crates/languages/src/rust.rs +++ b/crates/languages/src/rust.rs @@ -5,6 +5,7 @@ use futures::StreamExt; use gpui::{App, AppContext, AsyncApp, SharedString, Task}; use http_client::github::AssetKind; use http_client::github::{GitHubLspBinaryVersion, latest_github_release}; +use http_client::github_download::{GithubBinaryMetadata, download_server_binary}; pub use language::*; use lsp::{InitializeParams, LanguageServerBinary}; use project::lsp_store::rust_analyzer_ext::CARGO_DIAGNOSTICS_SOURCE_NAME; @@ -23,9 +24,9 @@ use std::{ use task::{TaskTemplate, TaskTemplates, TaskVariables, VariableName}; use util::fs::{make_file_executable, remove_matching}; use util::merge_json_value_into; +use util::rel_path::RelPath; use util::{ResultExt, maybe}; -use crate::github_download::{GithubBinaryMetadata, download_server_binary}; use crate::language_settings::language_settings; pub struct RustLspAdapter; @@ -88,10 +89,10 @@ impl ManifestProvider for CargoManifestProvider { depth, delegate, }: ManifestQuery, - ) -> Option> { + ) -> Option> { let mut outermost_cargo_toml = None; for path in path.ancestors().take(depth) { - let p = path.join("Cargo.toml"); + let p = path.join(RelPath::unix("Cargo.toml").unwrap()); if delegate.exists(&p, Some(false)) { outermost_cargo_toml = Some(Arc::from(path)); } @@ -483,7 +484,7 @@ impl LspInstaller for RustLspAdapter { } download_server_binary( - delegate, + &*delegate.http_client(), &url, expected_digest.as_deref(), &destination_path, @@ -1028,7 +1029,7 @@ fn test_fragment(variables: &TaskVariables, path: &Path, stem: &str) -> String { // filter out just that module. Some("--lib".to_owned()) } else if stem == "mod" { - maybe!({ Some(path.parent()?.file_name()?.to_string_lossy().to_string()) }) + maybe!({ Some(path.parent()?.file_name()?.to_string_lossy().into_owned()) }) } else if stem == "main" { if let (Some(bin_name), Some(bin_kind)) = ( variables.get(&RUST_BIN_NAME_TASK_VARIABLE), @@ -1051,7 +1052,6 @@ mod tests { use super::*; use crate::language; use gpui::{BorrowAppContext, Hsla, TestAppContext}; - use language::language_settings::AllLanguageSettings; use lsp::CompletionItemLabelDetails; use settings::SettingsStore; use theme::SyntaxTheme; @@ -1381,8 +1381,8 @@ mod tests { cx.set_global(test_settings); language::init(cx); cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |s| { - s.defaults.tab_size = NonZeroU32::new(2); + store.update_user_settings(cx, |s| { + s.project.all_languages.defaults.tab_size = NonZeroU32::new(2); }); }); }); diff --git a/crates/languages/src/rust/config.toml b/crates/languages/src/rust/config.toml index fe8b4ffdcba4f8b7949b6fe9187d16c8504d6688..826a219e9868a3f76a063efe8c91cec0be14c2da 100644 --- a/crates/languages/src/rust/config.toml +++ b/crates/languages/src/rust/config.toml @@ -17,3 +17,5 @@ brackets = [ collapsed_placeholder = " /* ... */ " debuggers = ["CodeLLDB", "GDB"] documentation_comment = { start = "/*", prefix = "* ", end = "*/", tab_size = 1 } +ignored_import_segments = ["crate", "super"] +import_path_strip_regex = "/(lib|mod)\\.rs$" diff --git a/crates/languages/src/rust/imports.scm b/crates/languages/src/rust/imports.scm new file mode 100644 index 0000000000000000000000000000000000000000..3ce6a4f073506dd4d27320a7fd5bb547927f9c1a --- /dev/null +++ b/crates/languages/src/rust/imports.scm @@ -0,0 +1,27 @@ +(use_declaration) @import + +(scoped_use_list + path: (_) @namespace + list: (_) @list) + +(scoped_identifier + path: (_) @namespace + name: (identifier) @name) + +(use_list (identifier) @name) + +(use_declaration (identifier) @name) + +(use_as_clause + path: (scoped_identifier + path: (_) @namespace + name: (_) @name) + alias: (_) @alias) + +(use_as_clause + path: (identifier) @name + alias: (_) @alias) + +(use_wildcard + (_)? @namespace + "*" @wildcard) diff --git a/crates/languages/src/rust/injections.scm b/crates/languages/src/rust/injections.scm index 1d346ac36bbfc0c015b73798202984714d954e58..e5921501bc613e8adae652e41b4b621b932281d1 100644 --- a/crates/languages/src/rust/injections.scm +++ b/crates/languages/src/rust/injections.scm @@ -1,3 +1,6 @@ +((line_comment) @injection.content + (#set! injection.language "comment")) + (macro_invocation macro: (identifier) @_macro_name (#not-any-of? @_macro_name "view" "html") diff --git a/crates/languages/src/tailwind.rs b/crates/languages/src/tailwind.rs index db539edabb6c10253f2fd0d688eafa46082d427a..e1b50a5ccaabb7770d13abc79fbac1da5fa4cbbe 100644 --- a/crates/languages/src/tailwind.rs +++ b/crates/languages/src/tailwind.rs @@ -146,6 +146,7 @@ impl LspAdapter for TailwindLspAdapter { "html": "html", "css": "css", "javascript": "javascript", + "typescript": "typescript", "typescriptreact": "typescriptreact", }, }))) @@ -178,6 +179,7 @@ impl LspAdapter for TailwindLspAdapter { (LanguageName::new("HTML"), "html".to_string()), (LanguageName::new("CSS"), "css".to_string()), (LanguageName::new("JavaScript"), "javascript".to_string()), + (LanguageName::new("TypeScript"), "typescript".to_string()), (LanguageName::new("TSX"), "typescriptreact".to_string()), (LanguageName::new("Svelte"), "svelte".to_string()), (LanguageName::new("Elixir"), "phoenix-heex".to_string()), diff --git a/crates/languages/src/tsx/config.toml b/crates/languages/src/tsx/config.toml index b5ef5bd56df2097bc920f02b87d07e4118d7b0d1..d0a4eb6532db621d741df2fbc99125e1c037ccdf 100644 --- a/crates/languages/src/tsx/config.toml +++ b/crates/languages/src/tsx/config.toml @@ -29,6 +29,9 @@ jsx_element_node_name = "jsx_element" tag_name_node_name = "identifier" tag_name_node_name_alternates = ["member_expression"] +[overrides.default] +linked_edit_characters = ["."] + [overrides.element] line_comments = { remove = true } block_comment = { start = "{/*", prefix = "", end = "*/}", tab_size = 0 } diff --git a/crates/languages/src/tsx/imports.scm b/crates/languages/src/tsx/imports.scm new file mode 100644 index 0000000000000000000000000000000000000000..e26b97aeef9cb62395e7030f3173208d79187bd6 --- /dev/null +++ b/crates/languages/src/tsx/imports.scm @@ -0,0 +1,14 @@ +(import_statement + import_clause: (import_clause + [ + (identifier) @name + (named_imports + (import_specifier + name: (_) @name + alias: (_)? @alias)) + ]) + source: (string (string_fragment) @source)) @import + +(import_statement + !import_clause + source: (string (string_fragment) @source @wildcard)) @import diff --git a/crates/languages/src/typescript.rs b/crates/languages/src/typescript.rs index bc939f0b727f5ca60a851be99aaf0f3e61ee3a93..68fb11bf3526e6e4301d118e6be33dfcc3b3ee2c 100644 --- a/crates/languages/src/typescript.rs +++ b/crates/languages/src/typescript.rs @@ -5,6 +5,8 @@ use collections::HashMap; use futures::future::join_all; use gpui::{App, AppContext, AsyncApp, Task}; use http_client::github::{AssetKind, GitHubLspBinaryVersion, build_asset_url}; +use http_client::github_download::download_server_binary; +use itertools::Itertools as _; use language::{ ContextLocation, ContextProvider, File, LanguageName, LanguageToolchainStore, LspAdapter, LspAdapterDelegate, LspInstaller, Toolchain, @@ -18,13 +20,13 @@ use std::{ borrow::Cow, ffi::OsString, path::{Path, PathBuf}, - sync::Arc, + sync::{Arc, LazyLock}, }; use task::{TaskTemplate, TaskTemplates, VariableName}; -use util::merge_json_value_into; use util::{ResultExt, fs::remove_matching, maybe}; +use util::{merge_json_value_into, rel_path::RelPath}; -use crate::{PackageJson, PackageJsonData, github_download::download_server_binary}; +use crate::{PackageJson, PackageJsonData}; pub(crate) struct TypeScriptContextProvider { fs: Arc, @@ -263,12 +265,12 @@ impl TypeScriptContextProvider { &self, fs: Arc, worktree_root: &Path, - file_relative_path: &Path, + file_relative_path: &RelPath, cx: &App, ) -> Task> { let new_json_data = file_relative_path .ancestors() - .map(|path| worktree_root.join(path)) + .map(|path| worktree_root.join(path.as_std_path())) .map(|parent_path| { self.package_json_data(&parent_path, self.last_package_json.clone(), fs.clone(), cx) }) @@ -511,9 +513,9 @@ fn eslint_server_binary_arguments(server_path: &Path) -> Vec { } fn replace_test_name_parameters(test_name: &str) -> String { - let pattern = regex::Regex::new(r"(%|\$)[0-9a-zA-Z]+").unwrap(); - - regex::escape(&pattern.replace_all(test_name, "(.+?)")) + static PATTERN: LazyLock = + LazyLock::new(|| regex::Regex::new(r"(\$([A-Za-z0-9_\.]+|[\#])|%[psdifjo#\$%])").unwrap()); + PATTERN.split(test_name).map(regex::escape).join("(.+?)") } pub struct TypeScriptLspAdapter { @@ -532,7 +534,7 @@ impl TypeScriptLspAdapter { } async fn tsdk_path(&self, adapter: &Arc) -> Option<&'static str> { let is_yarn = adapter - .read_text_file(PathBuf::from(".yarn/sdks/typescript/lib/typescript.js")) + .read_text_file(RelPath::unix(".yarn/sdks/typescript/lib/typescript.js").unwrap()) .await .is_ok(); @@ -852,7 +854,7 @@ impl LspInstaller for EsLintLspAdapter { remove_matching(&container_dir, |_| true).await; download_server_binary( - delegate, + &*delegate.http_client(), &version.url, None, &destination_path, @@ -1013,9 +1015,11 @@ mod tests { use serde_json::json; use task::TaskTemplates; use unindent::Unindent; - use util::path; + use util::{path, rel_path::rel_path}; - use crate::typescript::{PackageJsonData, TypeScriptContextProvider}; + use crate::typescript::{ + PackageJsonData, TypeScriptContextProvider, replace_test_name_parameters, + }; #[gpui::test] async fn test_outline(cx: &mut TestAppContext) { @@ -1161,7 +1165,7 @@ mod tests { provider.combined_package_json_data( fs.clone(), path!("/root").as_ref(), - "sub/file1.js".as_ref(), + rel_path("sub/file1.js"), cx, ) }) @@ -1227,4 +1231,37 @@ mod tests { ] ); } + #[test] + fn test_escaping_name() { + let cases = [ + ("plain test name", "plain test name"), + ("test name with $param_name", "test name with (.+?)"), + ("test name with $nested.param.name", "test name with (.+?)"), + ("test name with $#", "test name with (.+?)"), + ("test name with $##", "test name with (.+?)\\#"), + ("test name with %p", "test name with (.+?)"), + ("test name with %s", "test name with (.+?)"), + ("test name with %d", "test name with (.+?)"), + ("test name with %i", "test name with (.+?)"), + ("test name with %f", "test name with (.+?)"), + ("test name with %j", "test name with (.+?)"), + ("test name with %o", "test name with (.+?)"), + ("test name with %#", "test name with (.+?)"), + ("test name with %$", "test name with (.+?)"), + ("test name with %%", "test name with (.+?)"), + ("test name with %q", "test name with %q"), + ( + "test name with regex chars .*+?^${}()|[]\\", + "test name with regex chars \\.\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\", + ), + ( + "test name with multiple $params and %pretty and %b and (.+?)", + "test name with multiple (.+?) and (.+?)retty and %b and \\(\\.\\+\\?\\)", + ), + ]; + + for (input, expected) in cases { + assert_eq!(replace_test_name_parameters(input), expected); + } + } } diff --git a/crates/languages/src/typescript/config.toml b/crates/languages/src/typescript/config.toml index 2344f6209da7756049438669ee55d5376fdb47f8..67656e6a538da6c8860e9ab1b08fd6e6ee9cabbd 100644 --- a/crates/languages/src/typescript/config.toml +++ b/crates/languages/src/typescript/config.toml @@ -21,9 +21,12 @@ word_characters = ["#", "$"] prettier_parser_name = "typescript" tab_size = 2 debuggers = ["JavaScript"] +scope_opt_in_language_servers = ["tailwindcss-language-server"] +import_path_strip_regex = "(?:/index)?\\.[jt]s$" [overrides.string] -completion_query_characters = ["."] +completion_query_characters = ["-", "."] +opt_into_language_servers = ["tailwindcss-language-server"] prefer_label_for_snippet = true [overrides.function_name_before_type_arguments] diff --git a/crates/languages/src/typescript/imports.scm b/crates/languages/src/typescript/imports.scm new file mode 100644 index 0000000000000000000000000000000000000000..68ca25b2c15b7e312edbc3eeb9b2f0e493ca2d6f --- /dev/null +++ b/crates/languages/src/typescript/imports.scm @@ -0,0 +1,20 @@ +(import_statement + import_clause: (import_clause + [ + (identifier) @name + (named_imports + (import_specifier + name: (_) @name + alias: (_)? @alias)) + (namespace_import) @wildcard + ]) + source: (string (string_fragment) @source)) @import + +(import_statement + !source + import_clause: (import_require_clause + source: (string (string_fragment) @source))) @wildcard @import + +(import_statement + !import_clause + source: (string (string_fragment) @source)) @wildcard @import diff --git a/crates/languages/src/vtsls.rs b/crates/languages/src/vtsls.rs index 763a0d5a5ed961d916e3deea44963b0aa9340cb9..9124a64227f91aa256063f012c960e92afbd8b9e 100644 --- a/crates/languages/src/vtsls.rs +++ b/crates/languages/src/vtsls.rs @@ -12,7 +12,7 @@ use std::{ path::{Path, PathBuf}, sync::Arc, }; -use util::{ResultExt, maybe, merge_json_value_into}; +use util::{ResultExt, maybe, merge_json_value_into, rel_path::RelPath}; fn typescript_server_binary_arguments(server_path: &Path) -> Vec { vec![server_path.into(), "--stdio".into()] @@ -36,7 +36,7 @@ impl VtslsLspAdapter { async fn tsdk_path(&self, adapter: &Arc) -> Option<&'static str> { let is_yarn = adapter - .read_text_file(PathBuf::from(".yarn/sdks/typescript/lib/typescript.js")) + .read_text_file(RelPath::unix(".yarn/sdks/typescript/lib/typescript.js").unwrap()) .await .is_ok(); diff --git a/crates/languages/src/yaml.rs b/crates/languages/src/yaml.rs index c629756324cbded19485e7ba9d420db3fd4bd093..45faa142369e6c08817deebfbf8774f228bf70d5 100644 --- a/crates/languages/src/yaml.rs +++ b/crates/languages/src/yaml.rs @@ -16,7 +16,7 @@ use std::{ path::{Path, PathBuf}, sync::Arc, }; -use util::{ResultExt, maybe, merge_json_value_into}; +use util::{ResultExt, maybe, merge_json_value_into, rel_path::RelPath}; const SERVER_PATH: &str = "node_modules/yaml-language-server/bin/yaml-language-server"; @@ -141,7 +141,7 @@ impl LspAdapter for YamlLspAdapter { ) -> Result { let location = SettingsLocation { worktree_id: delegate.worktree_id(), - path: delegate.worktree_root_path(), + path: RelPath::empty(), }; let tab_size = cx.update(|cx| { diff --git a/crates/livekit_client/Cargo.toml b/crates/livekit_client/Cargo.toml index 80e4960c0df31f6a3d8115bd4bd66c0de09b76f0..2400092c1c154b8d6a4ee24f43c0556a26dc532e 100644 --- a/crates/livekit_client/Cargo.toml +++ b/crates/livekit_client/Cargo.toml @@ -41,6 +41,7 @@ serde_urlencoded.workspace = true settings.workspace = true smallvec.workspace = true tokio-tungstenite.workspace = true +ui.workspace = true util.workspace = true workspace-hack.workspace = true diff --git a/crates/livekit_client/src/livekit_client.rs b/crates/livekit_client/src/livekit_client.rs index 45e929cb2ec0bebf054497632d614af1975f6397..30a13bd910d52d82a394804e25371f41685437bf 100644 --- a/crates/livekit_client/src/livekit_client.rs +++ b/crates/livekit_client/src/livekit_client.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use anyhow::{Context as _, Result}; +use anyhow::{Context as _, Result, anyhow}; use audio::AudioSettings; use collections::HashMap; use futures::{SinkExt, channel::mpsc}; @@ -12,7 +12,10 @@ use settings::Settings; mod playback; -use crate::{LocalTrack, Participant, RemoteTrack, RoomEvent, TrackPublication}; +use crate::{ + LocalTrack, Participant, RemoteTrack, RoomEvent, TrackPublication, + livekit_client::playback::Speaker, +}; pub use playback::AudioStream; pub(crate) use playback::{RemoteVideoFrame, play_remote_video_track}; @@ -132,11 +135,20 @@ impl Room { track: &RemoteAudioTrack, cx: &mut App, ) -> Result { + let speaker: Speaker = + serde_urlencoded::from_str(&track.0.name()).unwrap_or_else(|_| Speaker { + name: track.0.name(), + is_staff: false, + sends_legacy_audio: true, + }); + if AudioSettings::get_global(cx).rodio_audio { info!("Using experimental.rodio_audio audio pipeline for output"); - playback::play_remote_audio_track(&track.0, cx) - } else { + playback::play_remote_audio_track(&track.0, speaker, cx) + } else if speaker.sends_legacy_audio { Ok(self.playback.play_remote_audio_track(&track.0)) + } else { + Err(anyhow!("Client version too old to play audio in call")) } } } diff --git a/crates/livekit_client/src/livekit_client/playback.rs b/crates/livekit_client/src/livekit_client/playback.rs index 7c866113103a883e7e7a2d9d3f5651d833d7e637..cdd766453c58ad57460f7ac27aa72930c7015bce 100644 --- a/crates/livekit_client/src/livekit_client/playback.rs +++ b/crates/livekit_client/src/livekit_client/playback.rs @@ -1,6 +1,6 @@ use anyhow::{Context as _, Result}; -use audio::{AudioSettings, CHANNEL_COUNT, SAMPLE_RATE}; +use audio::{AudioSettings, CHANNEL_COUNT, LEGACY_CHANNEL_COUNT, LEGACY_SAMPLE_RATE, SAMPLE_RATE}; use cpal::traits::{DeviceTrait, StreamTrait as _}; use futures::channel::mpsc::UnboundedSender; use futures::{Stream, StreamExt as _}; @@ -43,12 +43,15 @@ pub(crate) struct AudioStack { pub(crate) fn play_remote_audio_track( track: &livekit::track::RemoteAudioTrack, + speaker: Speaker, cx: &mut gpui::App, ) -> Result { + info!("speaker: {speaker:?}"); + let stream = + source::LiveKitStream::new(cx.background_executor(), track, speaker.sends_legacy_audio); + let stop_handle = Arc::new(AtomicBool::new(false)); let stop_handle_clone = stop_handle.clone(); - let stream = source::LiveKitStream::new(cx.background_executor(), track); - let stream = stream .stoppable() .periodic_access(Duration::from_millis(50), move |s| { @@ -57,10 +60,8 @@ pub(crate) fn play_remote_audio_track( } }); - let speaker: Speaker = serde_urlencoded::from_str(&track.name()).unwrap_or_else(|_| Speaker { - name: track.name(), - is_staff: false, - }); + info!("sample_rate: {:?}", stream.sample_rate()); + info!("channel_count: {:?}", stream.channels()); audio::Audio::play_voip_stream(stream, speaker.name, speaker.is_staff, cx) .context("Could not play audio")?; @@ -96,8 +97,8 @@ impl AudioStack { let next_ssrc = self.next_ssrc.fetch_add(1, Ordering::Relaxed); let source = AudioMixerSource { ssrc: next_ssrc, - sample_rate: SAMPLE_RATE.get(), - num_channels: CHANNEL_COUNT.get() as u32, + sample_rate: LEGACY_SAMPLE_RATE.get(), + num_channels: LEGACY_CHANNEL_COUNT.get() as u32, buffer: Arc::default(), }; self.mixer.lock().add_source(source.clone()); @@ -137,9 +138,14 @@ impl AudioStack { let apm = self.apm.clone(); let mixer = self.mixer.clone(); async move { - Self::play_output(apm, mixer, SAMPLE_RATE.get(), CHANNEL_COUNT.get().into()) - .await - .log_err(); + Self::play_output( + apm, + mixer, + LEGACY_SAMPLE_RATE.get(), + LEGACY_CHANNEL_COUNT.get().into(), + ) + .await + .log_err(); } })); *self._output_task.borrow_mut() = Arc::downgrade(&task); @@ -152,19 +158,36 @@ impl AudioStack { is_staff: bool, cx: &AsyncApp, ) -> Result<(crate::LocalAudioTrack, AudioStream)> { - let source = NativeAudioSource::new( - // n.b. this struct's options are always ignored, noise cancellation is provided by apm. - AudioSourceOptions::default(), - SAMPLE_RATE.get(), - CHANNEL_COUNT.get().into(), - 10, - ); + let legacy_audio_compatible = + AudioSettings::try_read_global(cx, |setting| setting.legacy_audio_compatible) + .unwrap_or(true); + + let source = if legacy_audio_compatible { + NativeAudioSource::new( + // n.b. this struct's options are always ignored, noise cancellation is provided by apm. + AudioSourceOptions::default(), + LEGACY_SAMPLE_RATE.get(), + LEGACY_CHANNEL_COUNT.get().into(), + 10, + ) + } else { + NativeAudioSource::new( + // n.b. this struct's options are always ignored, noise cancellation is provided by apm. + AudioSourceOptions::default(), + SAMPLE_RATE.get(), + CHANNEL_COUNT.get().into(), + 10, + ) + }; - let track_name = serde_urlencoded::to_string(Speaker { + let speaker = Speaker { name: user_name, is_staff, - }) - .context("Could not encode user information in track name")?; + sends_legacy_audio: legacy_audio_compatible, + }; + log::info!("Microphone speaker: {speaker:?}"); + let track_name = serde_urlencoded::to_string(speaker) + .context("Could not encode user information in track name")?; let track = track::LocalAudioTrack::create_audio_track( &track_name, @@ -186,19 +209,32 @@ impl AudioStack { let capture_task = if rodio_pipeline { info!("Using experimental.rodio_audio audio pipeline"); let voip_parts = audio::VoipParts::new(cx)?; - // Audio needs to run real-time and should never be paused. That is why we are using a - // normal std::thread and not a background task - thread::spawn(move || { - // microphone is non send on mac - let microphone = audio::Audio::open_microphone(voip_parts)?; - send_to_livekit(frame_tx, microphone); - Ok::<(), anyhow::Error>(()) - }); + // Audio needs to run real-time and should never be paused. That is + // why we are using a normal std::thread and not a background task + thread::Builder::new() + .name("MicrophoneToLivekit".to_string()) + .spawn(move || { + // microphone is non send on mac + let microphone = match audio::Audio::open_microphone(voip_parts) { + Ok(m) => m, + Err(e) => { + log::error!("Could not open microphone: {e}"); + return; + } + }; + send_to_livekit(frame_tx, microphone); + }) + .expect("should be able to spawn threads"); Task::ready(Ok(())) } else { self.executor.spawn(async move { - Self::capture_input(apm, frame_tx, SAMPLE_RATE.get(), CHANNEL_COUNT.get().into()) - .await + Self::capture_input( + apm, + frame_tx, + LEGACY_SAMPLE_RATE.get(), + LEGACY_CHANNEL_COUNT.get().into(), + ) + .await }) }; @@ -229,57 +265,60 @@ impl AudioStack { let mut resampler = audio_resampler::AudioResampler::default(); let mut buf = Vec::new(); - thread::spawn(move || { - let output_stream = output_device.build_output_stream( - &output_config.config(), - { - move |mut data, _info| { - while data.len() > 0 { - if data.len() <= buf.len() { - let rest = buf.split_off(data.len()); - data.copy_from_slice(&buf); - buf = rest; - return; - } - if buf.len() > 0 { - let (prefix, suffix) = data.split_at_mut(buf.len()); - prefix.copy_from_slice(&buf); - data = suffix; - } + thread::Builder::new() + .name("AudioPlayback".to_owned()) + .spawn(move || { + let output_stream = output_device.build_output_stream( + &output_config.config(), + { + move |mut data, _info| { + while data.len() > 0 { + if data.len() <= buf.len() { + let rest = buf.split_off(data.len()); + data.copy_from_slice(&buf); + buf = rest; + return; + } + if buf.len() > 0 { + let (prefix, suffix) = data.split_at_mut(buf.len()); + prefix.copy_from_slice(&buf); + data = suffix; + } - let mut mixer = mixer.lock(); - let mixed = mixer.mix(output_config.channels() as usize); - let sampled = resampler.remix_and_resample( - mixed, - sample_rate / 100, - num_channels, - sample_rate, - output_config.channels() as u32, - output_config.sample_rate().0, - ); - buf = sampled.to_vec(); - apm.lock() - .process_reverse_stream( - &mut buf, - output_config.sample_rate().0 as i32, - output_config.channels() as i32, - ) - .ok(); + let mut mixer = mixer.lock(); + let mixed = mixer.mix(output_config.channels() as usize); + let sampled = resampler.remix_and_resample( + mixed, + sample_rate / 100, + num_channels, + sample_rate, + output_config.channels() as u32, + output_config.sample_rate().0, + ); + buf = sampled.to_vec(); + apm.lock() + .process_reverse_stream( + &mut buf, + output_config.sample_rate().0 as i32, + output_config.channels() as i32, + ) + .ok(); + } } - } - }, - |error| log::error!("error playing audio track: {:?}", error), - Some(Duration::from_millis(100)), - ); + }, + |error| log::error!("error playing audio track: {:?}", error), + Some(Duration::from_millis(100)), + ); - let Some(output_stream) = output_stream.log_err() else { - return; - }; + let Some(output_stream) = output_stream.log_err() else { + return; + }; - output_stream.play().log_err(); - // Block forever to keep the output stream alive - end_on_drop_rx.recv().ok(); - }); + output_stream.play().log_err(); + // Block forever to keep the output stream alive + end_on_drop_rx.recv().ok(); + }) + .unwrap(); device_change_listener.next().await; drop(end_on_drop_tx) @@ -300,77 +339,81 @@ impl AudioStack { let frame_tx = frame_tx.clone(); let mut resampler = audio_resampler::AudioResampler::default(); - thread::spawn(move || { - maybe!({ - if let Some(name) = device.name().ok() { - log::info!("Using microphone: {}", name) - } else { - log::info!("Using microphone: "); - } - - let ten_ms_buffer_size = - (config.channels() as u32 * config.sample_rate().0 / 100) as usize; - let mut buf: Vec = Vec::with_capacity(ten_ms_buffer_size); - - let stream = device - .build_input_stream_raw( - &config.config(), - config.sample_format(), - move |data, _: &_| { - let data = - crate::get_sample_data(config.sample_format(), data).log_err(); - let Some(data) = data else { - return; - }; - let mut data = data.as_slice(); + thread::Builder::new() + .name("AudioCapture".to_owned()) + .spawn(move || { + maybe!({ + if let Some(name) = device.name().ok() { + log::info!("Using microphone: {}", name) + } else { + log::info!("Using microphone: "); + } - while data.len() > 0 { - let remainder = (buf.capacity() - buf.len()).min(data.len()); - buf.extend_from_slice(&data[..remainder]); - data = &data[remainder..]; - - if buf.capacity() == buf.len() { - let mut sampled = resampler - .remix_and_resample( - buf.as_slice(), - config.sample_rate().0 / 100, - config.channels() as u32, - config.sample_rate().0, - num_channels, - sample_rate, - ) - .to_owned(); - apm.lock() - .process_stream( - &mut sampled, - sample_rate as i32, - num_channels as i32, - ) - .log_err(); - buf.clear(); - frame_tx - .unbounded_send(AudioFrame { - data: Cow::Owned(sampled), - sample_rate, - num_channels, - samples_per_channel: sample_rate / 100, - }) - .ok(); + let ten_ms_buffer_size = + (config.channels() as u32 * config.sample_rate().0 / 100) as usize; + let mut buf: Vec = Vec::with_capacity(ten_ms_buffer_size); + + let stream = device + .build_input_stream_raw( + &config.config(), + config.sample_format(), + move |data, _: &_| { + let data = crate::get_sample_data(config.sample_format(), data) + .log_err(); + let Some(data) = data else { + return; + }; + let mut data = data.as_slice(); + + while data.len() > 0 { + let remainder = + (buf.capacity() - buf.len()).min(data.len()); + buf.extend_from_slice(&data[..remainder]); + data = &data[remainder..]; + + if buf.capacity() == buf.len() { + let mut sampled = resampler + .remix_and_resample( + buf.as_slice(), + config.sample_rate().0 / 100, + config.channels() as u32, + config.sample_rate().0, + num_channels, + sample_rate, + ) + .to_owned(); + apm.lock() + .process_stream( + &mut sampled, + sample_rate as i32, + num_channels as i32, + ) + .log_err(); + buf.clear(); + frame_tx + .unbounded_send(AudioFrame { + data: Cow::Owned(sampled), + sample_rate, + num_channels, + samples_per_channel: sample_rate / 100, + }) + .ok(); + } } - } - }, - |err| log::error!("error capturing audio track: {:?}", err), - Some(Duration::from_millis(100)), - ) - .context("failed to build input stream")?; - - stream.play()?; - // Keep the thread alive and holding onto the `stream` - end_on_drop_rx.recv().ok(); - anyhow::Ok(Some(())) + }, + |err| log::error!("error capturing audio track: {:?}", err), + Some(Duration::from_millis(100)), + ) + .context("failed to build input stream")?; + + stream.play()?; + // Keep the thread alive and holding onto the `stream` + end_on_drop_rx.recv().ok(); + anyhow::Ok(Some(())) + }) + .log_err(); }) - .log_err(); - }); + .unwrap(); device_change_listener.next().await; drop(end_on_drop_tx) @@ -378,26 +421,31 @@ impl AudioStack { } } -#[derive(Serialize, Deserialize)] -struct Speaker { - name: String, - is_staff: bool, +#[derive(Serialize, Deserialize, Debug)] +pub struct Speaker { + pub name: String, + pub is_staff: bool, + pub sends_legacy_audio: bool, } fn send_to_livekit(frame_tx: UnboundedSender>, mut microphone: impl Source) { use cpal::Sample; + let sample_rate = microphone.sample_rate().get(); + let num_channels = microphone.channels().get() as u32; + let buffer_size = sample_rate / 100 * num_channels; + loop { let sampled: Vec<_> = microphone .by_ref() - .take(audio::BUFFER_SIZE) + .take(buffer_size as usize) .map(|s| s.to_sample()) .collect(); if frame_tx .unbounded_send(AudioFrame { - sample_rate: SAMPLE_RATE.get(), - num_channels: CHANNEL_COUNT.get() as u32, - samples_per_channel: sampled.len() as u32 / CHANNEL_COUNT.get() as u32, + sample_rate, + num_channels, + samples_per_channel: sampled.len() as u32 / num_channels, data: Cow::Owned(sampled), }) .is_err() diff --git a/crates/livekit_client/src/livekit_client/playback/source.rs b/crates/livekit_client/src/livekit_client/playback/source.rs index f605b3d517cd816491f0eceadce5ac778ef75d21..cde4b19fda2e053346ad535e7c75b2abda60431a 100644 --- a/crates/livekit_client/src/livekit_client/playback/source.rs +++ b/crates/livekit_client/src/livekit_client/playback/source.rs @@ -3,17 +3,19 @@ use std::num::NonZero; use futures::StreamExt; use libwebrtc::{audio_stream::native::NativeAudioStream, prelude::AudioFrame}; use livekit::track::RemoteAudioTrack; -use rodio::{Source, buffer::SamplesBuffer, conversions::SampleTypeConverter, nz}; +use rodio::{ + ChannelCount, SampleRate, Source, buffer::SamplesBuffer, conversions::SampleTypeConverter, +}; -use audio::{CHANNEL_COUNT, SAMPLE_RATE}; +use audio::{CHANNEL_COUNT, LEGACY_CHANNEL_COUNT, LEGACY_SAMPLE_RATE, SAMPLE_RATE}; fn frame_to_samplesbuffer(frame: AudioFrame) -> SamplesBuffer { let samples = frame.data.iter().copied(); let samples = SampleTypeConverter::<_, _>::new(samples); let samples: Vec = samples.collect(); SamplesBuffer::new( - nz!(2), // frame always has two channels - NonZero::new(frame.sample_rate).expect("audio frame sample rate is nonzero"), + NonZero::new(frame.num_channels as u16).expect("zero channels is nonsense"), + NonZero::new(frame.sample_rate).expect("samplerate zero is nonsense"), samples, ) } @@ -22,14 +24,26 @@ pub struct LiveKitStream { // shared_buffer: SharedBuffer, inner: rodio::queue::SourcesQueueOutput, _receiver_task: gpui::Task<()>, + channel_count: ChannelCount, + sample_rate: SampleRate, } impl LiveKitStream { - pub fn new(executor: &gpui::BackgroundExecutor, track: &RemoteAudioTrack) -> Self { + pub fn new( + executor: &gpui::BackgroundExecutor, + track: &RemoteAudioTrack, + legacy: bool, + ) -> Self { + let (channel_count, sample_rate) = if legacy { + (LEGACY_CHANNEL_COUNT, LEGACY_SAMPLE_RATE) + } else { + (CHANNEL_COUNT, SAMPLE_RATE) + }; + let mut stream = NativeAudioStream::new( track.rtc_track(), - SAMPLE_RATE.get() as i32, - CHANNEL_COUNT.get().into(), + sample_rate.get() as i32, + channel_count.get().into(), ); let (queue_input, queue_output) = rodio::queue::queue(true); // spawn rtc stream @@ -45,6 +59,8 @@ impl LiveKitStream { LiveKitStream { _receiver_task: receiver_task, inner: queue_output, + sample_rate, + channel_count, } } } @@ -63,17 +79,11 @@ impl Source for LiveKitStream { } fn channels(&self) -> rodio::ChannelCount { - // This must be hardcoded because the playback source assumes constant - // sample rate and channel count. The queue upon which this is build - // will however report different counts and rates. Even though we put in - // only items with our (constant) CHANNEL_COUNT & SAMPLE_RATE this will - // play silence on one channel and at 44100 which is not what our - // constants are. - CHANNEL_COUNT + self.channel_count } fn sample_rate(&self) -> rodio::SampleRate { - SAMPLE_RATE // see comment on channels + self.sample_rate } fn total_duration(&self) -> Option { diff --git a/crates/livekit_client/src/remote_video_track_view.rs b/crates/livekit_client/src/remote_video_track_view.rs index 9073b8729a1d72ef59fe6ed77fd727cdf6acae00..189806f2138e401e62ad46336e95d8468e3b3732 100644 --- a/crates/livekit_client/src/remote_video_track_view.rs +++ b/crates/livekit_client/src/remote_video_track_view.rs @@ -97,8 +97,10 @@ impl Render for RemoteVideoTrackView { self.previous_rendered_frame = Some(current_rendered_frame) } self.current_rendered_frame = Some(latest_frame.clone()); - return gpui::img(latest_frame.clone()) + use gpui::ParentElement; + return ui::h_flex() .size_full() + .child(gpui::img(latest_frame.clone()).size_full()) .into_any_element(); } diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index fda188be8bec8b8c8a48b888243290b31c10f149..84e5a95ed80e75bf7d338b589f5b1c1c6495a616 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -80,11 +80,14 @@ pub struct LanguageServerBinaryOptions { pub pre_release: bool, } +struct NotificationSerializer(Box String + Send + Sync>); + /// A running language server process. pub struct LanguageServer { server_id: LanguageServerId, next_id: AtomicI32, outbound_tx: channel::Sender, + notification_tx: channel::Sender, name: LanguageServerName, process_name: Arc, binary: LanguageServerBinary, @@ -336,21 +339,18 @@ impl LanguageServer { &binary.arguments ); - let mut server = util::command::new_smol_command(&binary.path) + let mut command = util::command::new_smol_command(&binary.path); + command .current_dir(working_dir) .args(&binary.arguments) .envs(binary.env.clone().unwrap_or_default()) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) - .kill_on_drop(true) + .kill_on_drop(true); + let mut server = command .spawn() - .with_context(|| { - format!( - "failed to spawn command. path: {:?}, working directory: {:?}, args: {:?}", - binary.path, working_dir, &binary.arguments - ) - })?; + .with_context(|| format!("failed to spawn command {command:?}",))?; let stdin = server.stdin.take().unwrap(); let stdout = server.stdout.take().unwrap(); @@ -480,9 +480,24 @@ impl LanguageServer { } .into(); + let (notification_tx, notification_rx) = channel::unbounded::(); + cx.background_spawn({ + let outbound_tx = outbound_tx.clone(); + async move { + while let Ok(serializer) = notification_rx.recv().await { + let serialized = (serializer.0)(); + let Ok(_) = outbound_tx.send(serialized).await else { + return; + }; + } + outbound_tx.close(); + } + }) + .detach(); Self { server_id, notification_handlers, + notification_tx, response_handlers, io_handlers, name: server_name, @@ -909,7 +924,7 @@ impl LanguageServer { self.capabilities = RwLock::new(response.capabilities); self.configuration = configuration; - self.notify::(&InitializedParams {})?; + self.notify::(InitializedParams {})?; Ok(Arc::new(self)) }) } @@ -921,11 +936,13 @@ impl LanguageServer { let next_id = AtomicI32::new(self.next_id.load(SeqCst)); let outbound_tx = self.outbound_tx.clone(); let executor = self.executor.clone(); + let notification_serializers = self.notification_tx.clone(); let mut output_done = self.output_done_rx.lock().take().unwrap(); let shutdown_request = Self::request_internal::( &next_id, &response_handlers, &outbound_tx, + ¬ification_serializers, &executor, (), ); @@ -959,8 +976,8 @@ impl LanguageServer { } response_handlers.lock().take(); - Self::notify_internal::(&outbound_tx, &()).ok(); - outbound_tx.close(); + Self::notify_internal::(¬ification_serializers, ()).ok(); + notification_serializers.close(); output_done.recv().await; server.lock().take().map(|mut child| child.kill()); drop(tasks); @@ -1182,6 +1199,7 @@ impl LanguageServer { &self.next_id, &self.response_handlers, &self.outbound_tx, + &self.notification_tx, &self.executor, params, ) @@ -1203,6 +1221,7 @@ impl LanguageServer { &self.next_id, &self.response_handlers, &self.outbound_tx, + &self.notification_tx, &self.executor, timer, params, @@ -1213,6 +1232,7 @@ impl LanguageServer { next_id: &AtomicI32, response_handlers: &Mutex>>, outbound_tx: &channel::Sender, + notification_serializers: &channel::Sender, executor: &BackgroundExecutor, timer: U, params: T::Params, @@ -1264,7 +1284,7 @@ impl LanguageServer { .try_send(message) .context("failed to write to language server's stdin"); - let outbound_tx = outbound_tx.downgrade(); + let notification_serializers = notification_serializers.downgrade(); let started = Instant::now(); LspRequest::new(id, async move { if let Err(e) = handle_response { @@ -1275,10 +1295,10 @@ impl LanguageServer { } let cancel_on_drop = util::defer(move || { - if let Some(outbound_tx) = outbound_tx.upgrade() { + if let Some(notification_serializers) = notification_serializers.upgrade() { Self::notify_internal::( - &outbound_tx, - &CancelParams { + ¬ification_serializers, + CancelParams { id: NumberOrString::Number(id), }, ) @@ -1313,6 +1333,7 @@ impl LanguageServer { next_id: &AtomicI32, response_handlers: &Mutex>>, outbound_tx: &channel::Sender, + notification_serializers: &channel::Sender, executor: &BackgroundExecutor, params: T::Params, ) -> impl LspRequestFuture + use @@ -1324,6 +1345,7 @@ impl LanguageServer { next_id, response_handlers, outbound_tx, + notification_serializers, executor, Self::default_request_timer(executor.clone()), params, @@ -1339,21 +1361,25 @@ impl LanguageServer { /// Sends a RPC notification to the language server. /// /// [LSP Specification](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#notificationMessage) - pub fn notify(&self, params: &T::Params) -> Result<()> { - Self::notify_internal::(&self.outbound_tx, params) + pub fn notify(&self, params: T::Params) -> Result<()> { + let outbound = self.notification_tx.clone(); + Self::notify_internal::(&outbound, params) } fn notify_internal( - outbound_tx: &channel::Sender, - params: &T::Params, + outbound_tx: &channel::Sender, + params: T::Params, ) -> Result<()> { - let message = serde_json::to_string(&Notification { - jsonrpc: JSON_RPC_VERSION, - method: T::METHOD, - params, - }) - .unwrap(); - outbound_tx.try_send(message)?; + let serializer = NotificationSerializer(Box::new(move || { + serde_json::to_string(&Notification { + jsonrpc: JSON_RPC_VERSION, + method: T::METHOD, + params, + }) + .unwrap() + })); + + outbound_tx.send_blocking(serializer)?; Ok(()) } @@ -1388,7 +1414,7 @@ impl LanguageServer { removed: vec![], }, }; - self.notify::(¶ms).ok(); + self.notify::(params).ok(); } } @@ -1422,7 +1448,7 @@ impl LanguageServer { }], }, }; - self.notify::(¶ms).ok(); + self.notify::(params).ok(); } } pub fn set_workspace_folders(&self, folders: BTreeSet) { @@ -1454,7 +1480,7 @@ impl LanguageServer { let params = DidChangeWorkspaceFoldersParams { event: WorkspaceFoldersChangeEvent { added, removed }, }; - self.notify::(¶ms).ok(); + self.notify::(params).ok(); } } @@ -1472,14 +1498,14 @@ impl LanguageServer { version: i32, initial_text: String, ) { - self.notify::(&DidOpenTextDocumentParams { + self.notify::(DidOpenTextDocumentParams { text_document: TextDocumentItem::new(uri, language_id, version, initial_text), }) .ok(); } pub fn unregister_buffer(&self, uri: Uri) { - self.notify::(&DidCloseTextDocumentParams { + self.notify::(DidCloseTextDocumentParams { text_document: TextDocumentIdentifier::new(uri), }) .ok(); @@ -1695,7 +1721,7 @@ impl LanguageServer { #[cfg(any(test, feature = "test-support"))] impl FakeLanguageServer { /// See [`LanguageServer::notify`]. - pub fn notify(&self, params: &T::Params) { + pub fn notify(&self, params: T::Params) { self.server.notify::(params).ok(); } @@ -1804,7 +1830,7 @@ impl FakeLanguageServer { .await .into_response() .unwrap(); - self.notify::(&ProgressParams { + self.notify::(ProgressParams { token: NumberOrString::String(token), value: ProgressParamsValue::WorkDone(WorkDoneProgress::Begin(progress)), }); @@ -1812,7 +1838,7 @@ impl FakeLanguageServer { /// Simulate that the server has completed work and notifies about that with the specified token. pub fn end_progress(&self, token: impl Into) { - self.notify::(&ProgressParams { + self.notify::(ProgressParams { token: NumberOrString::String(token.into()), value: ProgressParamsValue::WorkDone(WorkDoneProgress::End(Default::default())), }); @@ -1871,7 +1897,7 @@ mod tests { .await .unwrap(); server - .notify::(&DidOpenTextDocumentParams { + .notify::(DidOpenTextDocumentParams { text_document: TextDocumentItem::new( Uri::from_str("file://a/b").unwrap(), "rust".to_string(), @@ -1889,11 +1915,11 @@ mod tests { "file://a/b" ); - fake.notify::(&ShowMessageParams { + fake.notify::(ShowMessageParams { typ: MessageType::ERROR, message: "ok".to_string(), }); - fake.notify::(&PublishDiagnosticsParams { + fake.notify::(PublishDiagnosticsParams { uri: Uri::from_str("file://b/c").unwrap(), version: Some(5), diagnostics: vec![], @@ -1907,6 +1933,7 @@ mod tests { fake.set_request_handler::(|_, _| async move { Ok(()) }); drop(server); + cx.run_until_parked(); fake.receive_notification::().await; } diff --git a/crates/markdown/Cargo.toml b/crates/markdown/Cargo.toml index 9dfb3fdcd6c38f65357d93e5701cb0b72a6814a7..650338ef4f05485535313e408db64f0b7fe1188d 100644 --- a/crates/markdown/Cargo.toml +++ b/crates/markdown/Cargo.toml @@ -20,6 +20,7 @@ test-support = [ [dependencies] base64.workspace = true +collections.workspace = true futures.workspace = true gpui.workspace = true language.workspace = true diff --git a/crates/markdown/examples/markdown.rs b/crates/markdown/examples/markdown.rs index c019bad1d081e59077bedb05cb36673a48f294bc..b4cb2a2503dcb6e097c34e4c8aad718f89e30272 100644 --- a/crates/markdown/examples/markdown.rs +++ b/crates/markdown/examples/markdown.rs @@ -1,6 +1,6 @@ use assets::Assets; use gpui::{Application, Entity, KeyBinding, StyleRefinement, WindowOptions, prelude::*, rgb}; -use language::{LanguageRegistry, language_settings::AllLanguageSettings}; +use language::LanguageRegistry; use markdown::{Markdown, MarkdownElement, MarkdownStyle}; use node_runtime::NodeRuntime; use settings::SettingsStore; @@ -39,9 +39,6 @@ pub fn main() { let store = SettingsStore::test(cx); cx.set_global(store); language::init(cx); - SettingsStore::update(cx, |store, cx| { - store.update_user_settings::(cx, |_| {}); - }); cx.bind_keys([KeyBinding::new("cmd-c", markdown::Copy, None)]); let node_runtime = NodeRuntime::unavailable(); diff --git a/crates/markdown/examples/markdown_as_child.rs b/crates/markdown/examples/markdown_as_child.rs index 6c0960c88b3021b6012b769aef8ffb22050b1abd..3e731506f545dd2166336241cb82742435784fea 100644 --- a/crates/markdown/examples/markdown_as_child.rs +++ b/crates/markdown/examples/markdown_as_child.rs @@ -1,6 +1,6 @@ use assets::Assets; use gpui::{Application, Entity, KeyBinding, Length, StyleRefinement, WindowOptions, rgb}; -use language::{LanguageRegistry, language_settings::AllLanguageSettings}; +use language::LanguageRegistry; use markdown::{Markdown, MarkdownElement, MarkdownStyle}; use node_runtime::NodeRuntime; use settings::SettingsStore; @@ -23,9 +23,6 @@ pub fn main() { let store = SettingsStore::test(cx); cx.set_global(store); language::init(cx); - SettingsStore::update(cx, |store, cx| { - store.update_user_settings::(cx, |_| {}); - }); cx.bind_keys([KeyBinding::new("cmd-c", markdown::Copy, None)]); let node_runtime = NodeRuntime::unavailable(); @@ -100,7 +97,7 @@ impl Render for HelloWorld { div() .flex() .bg(rgb(0x2e7d32)) - .size(Length::Definite(Pixels(700.0).into())) + .size(Length::Definite(px(700.0).into())) .justify_center() .items_center() .shadow_lg() diff --git a/crates/markdown/src/markdown.rs b/crates/markdown/src/markdown.rs index 4e1d3ac51e148439e57a4a1c305dabc31cbc2046..c34ed69288e39c26d105877d76ee76c01c864c72 100644 --- a/crates/markdown/src/markdown.rs +++ b/crates/markdown/src/markdown.rs @@ -9,8 +9,6 @@ use log::Level; pub use path_range::{LineCol, PathWithRange}; use std::borrow::Cow; -use std::collections::HashMap; -use std::collections::HashSet; use std::iter; use std::mem; use std::ops::Range; @@ -19,6 +17,7 @@ use std::rc::Rc; use std::sync::Arc; use std::time::Duration; +use collections::{HashMap, HashSet}; use gpui::{ AnyElement, App, BorderStyle, Bounds, ClipboardItem, CursorStyle, DispatchPhase, Edges, Entity, FocusHandle, Focusable, FontStyle, FontWeight, GlobalElementId, Hitbox, Hsla, Image, @@ -176,7 +175,7 @@ impl Markdown { options: Options { parse_links_only: false, }, - copied_code_blocks: HashSet::new(), + copied_code_blocks: HashSet::default(), }; this.parse(cx); this @@ -199,7 +198,7 @@ impl Markdown { options: Options { parse_links_only: true, }, - copied_code_blocks: HashSet::new(), + copied_code_blocks: HashSet::default(), }; this.parse(cx); this @@ -335,7 +334,10 @@ impl Markdown { } for path in paths { - if let Ok(language) = registry.language_for_file_path(&path).await { + if let Ok(language) = registry + .load_language_for_file_path(Path::new(path.as_ref())) + .await + { languages_by_path.insert(path, language); } } @@ -435,7 +437,7 @@ pub struct ParsedMarkdown { pub source: SharedString, pub events: Arc<[(Range, MarkdownEvent)]>, pub languages_by_name: TreeMap>, - pub languages_by_path: TreeMap, Arc>, + pub languages_by_path: TreeMap, Arc>, } impl ParsedMarkdown { @@ -1079,7 +1081,7 @@ impl Element for MarkdownElement { { builder.modify_current_div(|el| { let content_range = parser::extract_code_block_content_range( - parsed_markdown.source()[range.clone()].trim(), + &parsed_markdown.source()[range.clone()], ); let content_range = content_range.start + range.start ..content_range.end + range.start; @@ -1110,7 +1112,7 @@ impl Element for MarkdownElement { { builder.modify_current_div(|el| { let content_range = parser::extract_code_block_content_range( - parsed_markdown.source()[range.clone()].trim(), + &parsed_markdown.source()[range.clone()], ); let content_range = content_range.start + range.start ..content_range.end + range.start; diff --git a/crates/markdown/src/parser.rs b/crates/markdown/src/parser.rs index 3720e5b1ef5f61f0a209ac5617119de61ed05517..62b210f9e33a90a44790c521591ba6f94e8baaef 100644 --- a/crates/markdown/src/parser.rs +++ b/crates/markdown/src/parser.rs @@ -4,7 +4,9 @@ pub use pulldown_cmark::TagEnd as MarkdownTagEnd; use pulldown_cmark::{ Alignment, CowStr, HeadingLevel, LinkType, MetadataBlockKind, Options, Parser, }; -use std::{collections::HashSet, ops::Range, path::Path, sync::Arc}; +use std::{ops::Range, sync::Arc}; + +use collections::HashSet; use crate::path_range::PathWithRange; @@ -23,11 +25,11 @@ pub fn parse_markdown( ) -> ( Vec<(Range, MarkdownEvent)>, HashSet, - HashSet>, + HashSet>, ) { let mut events = Vec::new(); - let mut language_names = HashSet::new(); - let mut language_paths = HashSet::new(); + let mut language_names = HashSet::default(); + let mut language_paths = HashSet::default(); let mut within_link = false; let mut within_metadata = false; let mut parser = Parser::new_ext(text, PARSE_OPTIONS) @@ -67,7 +69,7 @@ pub fn parse_markdown( MarkdownTag::CodeBlock { kind: CodeBlockKind::Indented, metadata: CodeBlockMetadata { - content_range: range.start + 1..range.end + 1, + content_range: range.clone(), line_count: 1, }, } @@ -579,8 +581,8 @@ mod tests { (30..37, Text), (30..37, End(MarkdownTagEnd::Paragraph)) ], - HashSet::new(), - HashSet::new() + HashSet::default(), + HashSet::default() ) ) } @@ -613,8 +615,8 @@ mod tests { (46..51, Text), (0..51, End(MarkdownTagEnd::Paragraph)) ], - HashSet::new(), - HashSet::new() + HashSet::default(), + HashSet::default() ) ); } @@ -670,8 +672,8 @@ mod tests { (43..53, SubstitutedText("–––––".into())), (0..53, End(MarkdownTagEnd::Paragraph)) ], - HashSet::new(), - HashSet::new() + HashSet::default(), + HashSet::default() ) ) } @@ -695,10 +697,35 @@ mod tests { (8..34, Text), (0..37, End(MarkdownTagEnd::CodeBlock)), ], - HashSet::from(["rust".into()]), - HashSet::new() + { + let mut h = HashSet::default(); + h.insert("rust".into()); + h + }, + HashSet::default() ) - ) + ); + assert_eq!( + parse_markdown(" fn main() {}"), + ( + vec![ + ( + 4..16, + Start(CodeBlock { + kind: CodeBlockKind::Indented, + metadata: CodeBlockMetadata { + content_range: 4..16, + line_count: 1 + } + }) + ), + (4..16, Text), + (4..16, End(MarkdownTagEnd::CodeBlock)) + ], + HashSet::default(), + HashSet::default() + ) + ); } #[test] diff --git a/crates/markdown/src/path_range.rs b/crates/markdown/src/path_range.rs index 19cfda0d9dfb30c550852f64edcad29e3d1e1de9..f98325c9b5aa45420d4e1990d55888675d160d5f 100644 --- a/crates/markdown/src/path_range.rs +++ b/crates/markdown/src/path_range.rs @@ -1,8 +1,8 @@ -use std::{ops::Range, path::Path, sync::Arc}; +use std::{ops::Range, sync::Arc}; #[derive(Debug, Clone, PartialEq)] pub struct PathWithRange { - pub path: Arc, + pub path: Arc, pub range: Option>, } @@ -78,12 +78,12 @@ impl PathWithRange { }; Self { - path: Path::new(path).into(), + path: path.into(), range, } } None => Self { - path: Path::new(str).into(), + path: str.into(), range: None, }, } @@ -123,7 +123,7 @@ mod tests { #[test] fn test_pathrange_parsing() { let path_range = PathWithRange::new("file.rs#L10-L20"); - assert_eq!(path_range.path.as_ref(), Path::new("file.rs")); + assert_eq!(path_range.path.as_ref(), "file.rs"); assert!(path_range.range.is_some()); if let Some(range) = path_range.range { assert_eq!(range.start.line, 10); @@ -133,7 +133,7 @@ mod tests { } let single_line = PathWithRange::new("file.rs#L15"); - assert_eq!(single_line.path.as_ref(), Path::new("file.rs")); + assert_eq!(single_line.path.as_ref(), "file.rs"); assert!(single_line.range.is_some()); if let Some(range) = single_line.range { assert_eq!(range.start.line, 15); @@ -141,11 +141,11 @@ mod tests { } let no_range = PathWithRange::new("file.rs"); - assert_eq!(no_range.path.as_ref(), Path::new("file.rs")); + assert_eq!(no_range.path.as_ref(), "file.rs"); assert!(no_range.range.is_none()); let lowercase = PathWithRange::new("file.rs#l5-l10"); - assert_eq!(lowercase.path.as_ref(), Path::new("file.rs")); + assert_eq!(lowercase.path.as_ref(), "file.rs"); assert!(lowercase.range.is_some()); if let Some(range) = lowercase.range { assert_eq!(range.start.line, 5); @@ -153,7 +153,7 @@ mod tests { } let complex = PathWithRange::new("src/path/to/file.rs#L100"); - assert_eq!(complex.path.as_ref(), Path::new("src/path/to/file.rs")); + assert_eq!(complex.path.as_ref(), "src/path/to/file.rs"); assert!(complex.range.is_some()); } @@ -161,7 +161,7 @@ mod tests { fn test_pathrange_from_str() { let with_range = PathWithRange::new("file.rs#L10-L20"); assert!(with_range.range.is_some()); - assert_eq!(with_range.path.as_ref(), Path::new("file.rs")); + assert_eq!(with_range.path.as_ref(), "file.rs"); let without_range = PathWithRange::new("file.rs"); assert!(without_range.range.is_none()); @@ -173,18 +173,18 @@ mod tests { #[test] fn test_pathrange_leading_text_trimming() { let with_language = PathWithRange::new("```rust file.rs#L10"); - assert_eq!(with_language.path.as_ref(), Path::new("file.rs")); + assert_eq!(with_language.path.as_ref(), "file.rs"); assert!(with_language.range.is_some()); if let Some(range) = with_language.range { assert_eq!(range.start.line, 10); } let with_spaces = PathWithRange::new("``` file.rs#L10-L20"); - assert_eq!(with_spaces.path.as_ref(), Path::new("file.rs")); + assert_eq!(with_spaces.path.as_ref(), "file.rs"); assert!(with_spaces.range.is_some()); let with_words = PathWithRange::new("```rust code example file.rs#L15:10"); - assert_eq!(with_words.path.as_ref(), Path::new("file.rs")); + assert_eq!(with_words.path.as_ref(), "file.rs"); assert!(with_words.range.is_some()); if let Some(range) = with_words.range { assert_eq!(range.start.line, 15); @@ -192,18 +192,18 @@ mod tests { } let with_whitespace = PathWithRange::new(" file.rs#L5"); - assert_eq!(with_whitespace.path.as_ref(), Path::new("file.rs")); + assert_eq!(with_whitespace.path.as_ref(), "file.rs"); assert!(with_whitespace.range.is_some()); let no_leading = PathWithRange::new("file.rs#L10"); - assert_eq!(no_leading.path.as_ref(), Path::new("file.rs")); + assert_eq!(no_leading.path.as_ref(), "file.rs"); assert!(no_leading.range.is_some()); } #[test] fn test_pathrange_with_line_and_column() { let line_and_col = PathWithRange::new("file.rs#L10:5"); - assert_eq!(line_and_col.path.as_ref(), Path::new("file.rs")); + assert_eq!(line_and_col.path.as_ref(), "file.rs"); assert!(line_and_col.range.is_some()); if let Some(range) = line_and_col.range { assert_eq!(range.start.line, 10); @@ -213,7 +213,7 @@ mod tests { } let full_range = PathWithRange::new("file.rs#L10:5-L20:15"); - assert_eq!(full_range.path.as_ref(), Path::new("file.rs")); + assert_eq!(full_range.path.as_ref(), "file.rs"); assert!(full_range.range.is_some()); if let Some(range) = full_range.range { assert_eq!(range.start.line, 10); @@ -223,7 +223,7 @@ mod tests { } let mixed_range1 = PathWithRange::new("file.rs#L10:5-L20"); - assert_eq!(mixed_range1.path.as_ref(), Path::new("file.rs")); + assert_eq!(mixed_range1.path.as_ref(), "file.rs"); assert!(mixed_range1.range.is_some()); if let Some(range) = mixed_range1.range { assert_eq!(range.start.line, 10); @@ -233,7 +233,7 @@ mod tests { } let mixed_range2 = PathWithRange::new("file.rs#L10-L20:15"); - assert_eq!(mixed_range2.path.as_ref(), Path::new("file.rs")); + assert_eq!(mixed_range2.path.as_ref(), "file.rs"); assert!(mixed_range2.range.is_some()); if let Some(range) = mixed_range2.range { assert_eq!(range.start.line, 10); diff --git a/crates/markdown_preview/src/markdown_elements.rs b/crates/markdown_preview/src/markdown_elements.rs index 560e468439efce22aa72d91054d68d491e125b23..827c11f0453817b00431a1f32db8c645aced4e86 100644 --- a/crates/markdown_preview/src/markdown_elements.rs +++ b/crates/markdown_preview/src/markdown_elements.rs @@ -1,5 +1,5 @@ use gpui::{ - DefiniteLength, FontStyle, FontWeight, HighlightStyle, SharedString, StrikethroughStyle, + DefiniteLength, FontStyle, FontWeight, HighlightStyle, Hsla, SharedString, StrikethroughStyle, UnderlineStyle, px, }; use language::HighlightId; @@ -155,7 +155,7 @@ pub struct ParsedMarkdownText { /// Where the text is located in the source Markdown document. pub source_range: Range, /// The text content stripped of any formatting symbols. - pub contents: String, + pub contents: SharedString, /// The list of highlights contained in the Markdown document. pub highlights: Vec<(Range, MarkdownHighlight)>, /// The regions of the various ranges in the Markdown document. @@ -175,7 +175,11 @@ pub enum MarkdownHighlight { impl MarkdownHighlight { /// Converts this [`MarkdownHighlight`] to a [`HighlightStyle`]. - pub fn to_highlight_style(&self, theme: &theme::SyntaxTheme) -> Option { + pub fn to_highlight_style( + &self, + theme: &theme::SyntaxTheme, + link_color: Hsla, + ) -> Option { match self { MarkdownHighlight::Style(style) => { let mut highlight = HighlightStyle::default(); @@ -202,6 +206,15 @@ impl MarkdownHighlight { highlight.font_weight = Some(style.weight); } + if style.link { + highlight.underline = Some(UnderlineStyle { + thickness: px(1.), + color: Some(link_color), + ..Default::default() + }); + highlight.color = Some(link_color); + } + Some(highlight) } @@ -221,6 +234,8 @@ pub struct MarkdownHighlightStyle { pub strikethrough: bool, /// The weight of the text. pub weight: FontWeight, + /// Whether the text should be stylized as link. + pub link: bool, } /// A parsed region in a Markdown document. diff --git a/crates/markdown_preview/src/markdown_minifier.rs b/crates/markdown_preview/src/markdown_minifier.rs new file mode 100644 index 0000000000000000000000000000000000000000..a7d5ad0be0d9e65617bb45c66eb9748123d43067 --- /dev/null +++ b/crates/markdown_preview/src/markdown_minifier.rs @@ -0,0 +1,829 @@ +use html5ever::{ + Attribute, ParseOpts, QualName, parse_document, + tendril::{Tendril, TendrilSink, fmt::UTF8}, +}; +use markup5ever_rcdom::{Node, NodeData, RcDom}; +use std::{cell::RefCell, io, rc::Rc, str}; + +#[derive(Default)] +pub(crate) struct MinifierOptions { + pub omit_doctype: bool, + pub preserve_comments: bool, + pub collapse_whitespace: bool, +} + +pub(crate) struct Minifier<'a, W: io::Write> { + w: &'a mut W, + options: MinifierOptions, + preceding_whitespace: bool, +} + +impl<'a, W> Minifier<'a, W> +where + W: io::Write, +{ + /// Creates a new `Minifier` instance. + #[inline] + pub fn new(w: &'a mut W, options: MinifierOptions) -> Self { + Self { + w, + options, + preceding_whitespace: false, + } + } + + /// Minifies the given reader input. + /// + /// # Errors + /// + /// Will return `Err` if unable to write to the output writer. + #[inline] + pub fn minify(&mut self, mut r: &mut R) -> io::Result<()> { + let dom = parse_document(RcDom::default(), ParseOpts::default()) + .from_utf8() + .read_from(&mut r)?; + + if !self.options.omit_doctype { + self.w.write_all(b"")?; + } + + self.minify_node(&None, &dom.document) + } + + fn minify_node<'b>(&mut self, ctx: &'b Option, node: &'b Node) -> io::Result<()> { + match &node.data { + NodeData::Text { contents } => { + // Check if whitespace collapsing disabled + let contents = contents.borrow(); + let contents = contents.as_ref(); + + if !self.options.collapse_whitespace { + return self.w.write_all(contents.as_bytes()); + } + + // Check if parent is whitespace preserving element or contains code ( ", + "", + true, + false, + ), + ( + " ", + "", + true, + false, + ), + ("

A", "

A", true, false), + ("

A", "

A", true, false), + // Retain whitespace, whitespace before

+ ( + "

A ", + "

A ", + false, + false, + ), + // Retain whitespace, touching

+ ("

A", "

A", false, false), + // Comments ignored + ("

A", "

A", false, false), + // Comments preserved + ( + "

A", + "

A", + false, + true, + ), + // Retain end tag if touching inline element + ( + "

Some text

", + "

Some text

", + false, + false, + ), + ] { + let mut w = Vec::new(); + let mut minifier = Minifier::new( + &mut w, + MinifierOptions { + omit_doctype: true, + preserve_comments, + collapse_whitespace, + }, + ); + minifier.minify(&mut input.as_bytes()).unwrap(); + + let s = str::from_utf8(&w).unwrap(); + + assert_eq!(expected, s); + } + } +} diff --git a/crates/markdown_preview/src/markdown_parser.rs b/crates/markdown_preview/src/markdown_parser.rs index 1b116c50d9820dc4fea9d6b2e5816543d75e7d52..b7eb73c60a049ca7adb03160d124904bab4cee89 100644 --- a/crates/markdown_preview/src/markdown_parser.rs +++ b/crates/markdown_preview/src/markdown_parser.rs @@ -1,4 +1,7 @@ -use crate::markdown_elements::*; +use crate::{ + markdown_elements::*, + markdown_minifier::{Minifier, MinifierOptions}, +}; use async_recursion::async_recursion; use collections::FxHashMap; use gpui::{DefiniteLength, FontWeight, px, relative}; @@ -28,6 +31,24 @@ pub async fn parse_markdown( } } +fn cleanup_html(source: &str) -> Vec { + let mut writer = std::io::Cursor::new(Vec::new()); + let mut reader = std::io::Cursor::new(source); + let mut minify = Minifier::new( + &mut writer, + MinifierOptions { + omit_doctype: true, + collapse_whitespace: true, + ..Default::default() + }, + ); + if let Ok(()) = minify.minify(&mut reader) { + writer.into_inner() + } else { + source.bytes().collect() + } +} + struct MarkdownParser<'a> { tokens: Vec<(Event<'a>, Range)>, /// The current index in the tokens array @@ -261,7 +282,7 @@ impl<'a> MarkdownParser<'a> { code: false, link: Some(link), }); - style.underline = true; + style.link = true; prev_len } else { // Manually scan for links @@ -329,7 +350,7 @@ impl<'a> MarkdownParser<'a> { highlights.push(( prev_len..text.len(), MarkdownHighlight::Style(MarkdownHighlightStyle { - underline: true, + link: true, ..Default::default() }), )); @@ -353,7 +374,7 @@ impl<'a> MarkdownParser<'a> { if !text.is_empty() { let parsed_regions = MarkdownParagraphChunk::Text(ParsedMarkdownText { source_range: source_range.clone(), - contents: text.clone(), + contents: text.into(), highlights: highlights.clone(), region_ranges: region_ranges.clone(), regions: regions.clone(), @@ -408,7 +429,7 @@ impl<'a> MarkdownParser<'a> { if !text.is_empty() { markdown_text_like.push(MarkdownParagraphChunk::Text(ParsedMarkdownText { source_range, - contents: text, + contents: text.into(), highlights, regions, region_ranges, @@ -764,6 +785,10 @@ impl<'a> MarkdownParser<'a> { return elements; }; + let mut html_source_range_start = None; + let mut html_source_range_end = None; + let mut html_buffer = String::new(); + while !self.eof() { let Some((current, source_range)) = self.current() else { break; @@ -771,19 +796,10 @@ impl<'a> MarkdownParser<'a> { let source_range = source_range.clone(); match current { Event::Html(html) => { - let mut cursor = std::io::Cursor::new(html.as_bytes()); - let Some(dom) = parse_document(RcDom::default(), ParseOpts::default()) - .from_utf8() - .read_from(&mut cursor) - .ok() - else { - self.cursor += 1; - continue; - }; - + html_source_range_start.get_or_insert(source_range.start); + html_source_range_end = Some(source_range.end); + html_buffer.push_str(html); self.cursor += 1; - - self.parse_html_node(source_range, &dom.document, &mut elements); } Event::End(TagEnd::CodeBlock) => { self.cursor += 1; @@ -795,6 +811,17 @@ impl<'a> MarkdownParser<'a> { } } + let bytes = cleanup_html(&html_buffer); + + let mut cursor = std::io::Cursor::new(bytes); + if let Ok(dom) = parse_document(RcDom::default(), ParseOpts::default()) + .from_utf8() + .read_from(&mut cursor) + && let Some((start, end)) = html_source_range_start.zip(html_source_range_end) + { + self.parse_html_node(start..end, &dom.document, &mut elements); + } + elements } @@ -808,15 +835,14 @@ impl<'a> MarkdownParser<'a> { markup5ever_rcdom::NodeData::Document => { self.consume_children(source_range, node, elements); } - markup5ever_rcdom::NodeData::Doctype { .. } => {} markup5ever_rcdom::NodeData::Text { contents } => { elements.push(ParsedMarkdownElement::Paragraph(vec![ MarkdownParagraphChunk::Text(ParsedMarkdownText { source_range, - contents: contents.borrow().to_string(), - highlights: Vec::default(), - region_ranges: Vec::default(), regions: Vec::default(), + region_ranges: Vec::default(), + highlights: Vec::default(), + contents: contents.borrow().to_string().into(), }), ])); } @@ -826,11 +852,93 @@ impl<'a> MarkdownParser<'a> { if let Some(image) = self.extract_image(source_range, attrs) { elements.push(ParsedMarkdownElement::Image(image)); } + } else if local_name!("p") == name.local { + let mut paragraph = MarkdownParagraph::new(); + self.parse_paragraph(source_range, node, &mut paragraph); + + if !paragraph.is_empty() { + elements.push(ParsedMarkdownElement::Paragraph(paragraph)); + } + } else if matches!( + name.local, + local_name!("h1") + | local_name!("h2") + | local_name!("h3") + | local_name!("h4") + | local_name!("h5") + | local_name!("h6") + ) { + let mut paragraph = MarkdownParagraph::new(); + self.consume_paragraph(source_range.clone(), node, &mut paragraph); + + if !paragraph.is_empty() { + elements.push(ParsedMarkdownElement::Heading(ParsedMarkdownHeading { + source_range, + level: match name.local { + local_name!("h1") => HeadingLevel::H1, + local_name!("h2") => HeadingLevel::H2, + local_name!("h3") => HeadingLevel::H3, + local_name!("h4") => HeadingLevel::H4, + local_name!("h5") => HeadingLevel::H5, + local_name!("h6") => HeadingLevel::H6, + _ => unreachable!(), + }, + contents: paragraph, + })); + } + } else if local_name!("blockquote") == name.local { + if let Some(blockquote) = self.extract_html_blockquote(node, source_range) { + elements.push(ParsedMarkdownElement::BlockQuote(blockquote)); + } + } else if local_name!("table") == name.local { + if let Some(table) = self.extract_html_table(node, source_range) { + elements.push(ParsedMarkdownElement::Table(table)); + } } else { self.consume_children(source_range, node, elements); } } - markup5ever_rcdom::NodeData::ProcessingInstruction { .. } => {} + _ => {} + } + } + + fn parse_paragraph( + &self, + source_range: Range, + node: &Rc, + paragraph: &mut MarkdownParagraph, + ) { + match &node.data { + markup5ever_rcdom::NodeData::Text { contents } => { + paragraph.push(MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range, + regions: Vec::default(), + region_ranges: Vec::default(), + highlights: Vec::default(), + contents: contents.borrow().to_string().into(), + })); + } + markup5ever_rcdom::NodeData::Element { name, attrs, .. } => { + if local_name!("img") == name.local { + if let Some(image) = self.extract_image(source_range, attrs) { + paragraph.push(MarkdownParagraphChunk::Image(image)); + } + } else { + self.consume_paragraph(source_range, node, paragraph); + } + } + _ => {} + } + } + + fn consume_paragraph( + &self, + source_range: Range, + node: &Rc, + paragraph: &mut MarkdownParagraph, + ) { + for node in node.children.borrow().iter() { + self.parse_paragraph(source_range.clone(), node, paragraph); } } @@ -895,14 +1003,14 @@ impl<'a> MarkdownParser<'a> { if let Some(width) = Self::attr_value(attrs, local_name!("width")) .or_else(|| styles.get("width").cloned()) - .and_then(|width| Self::parse_length(&width)) + .and_then(|width| Self::parse_html_element_dimension(&width)) { image.set_width(width); } if let Some(height) = Self::attr_value(attrs, local_name!("height")) .or_else(|| styles.get("height").cloned()) - .and_then(|height| Self::parse_length(&height)) + .and_then(|height| Self::parse_html_element_dimension(&height)) { image.set_height(height); } @@ -910,8 +1018,7 @@ impl<'a> MarkdownParser<'a> { Some(image) } - /// Parses the width/height attribute value of an html element (e.g. img element) - fn parse_length(value: &str) -> Option { + fn parse_html_element_dimension(value: &str) -> Option { if value.ends_with("%") { value .trim_end_matches("%") @@ -926,6 +1033,73 @@ impl<'a> MarkdownParser<'a> { .map(|value| px(value).into()) } } + + fn extract_html_blockquote( + &self, + node: &Rc, + source_range: Range, + ) -> Option { + let mut children = Vec::new(); + self.consume_children(source_range.clone(), node, &mut children); + + if children.is_empty() { + None + } else { + Some(ParsedMarkdownBlockQuote { + children, + source_range, + }) + } + } + + fn extract_html_table( + &self, + node: &Rc, + source_range: Range, + ) -> Option { + let mut header_columns = Vec::new(); + let mut body_rows = Vec::new(); + + // node should be a thead or tbody element + for node in node.children.borrow().iter() { + match &node.data { + markup5ever_rcdom::NodeData::Element { name, .. } => { + if local_name!("thead") == name.local { + // node should be a tr element + for node in node.children.borrow().iter() { + let mut paragraph = MarkdownParagraph::new(); + self.consume_paragraph(source_range.clone(), node, &mut paragraph); + + for paragraph in paragraph.into_iter() { + header_columns.push(vec![paragraph]); + } + } + } else if local_name!("tbody") == name.local { + // node should be a tr element + for node in node.children.borrow().iter() { + let mut row = MarkdownParagraph::new(); + self.consume_paragraph(source_range.clone(), node, &mut row); + body_rows.push(ParsedMarkdownTableRow::with_children( + row.into_iter().map(|column| vec![column]).collect(), + )); + } + } + } + _ => {} + } + } + + if !header_columns.is_empty() || !body_rows.is_empty() { + Some(ParsedMarkdownTable { + source_range, + body: body_rows, + column_alignments: Vec::default(), + header: ParsedMarkdownTableRow::with_children(header_columns), + }) + } else { + None + } + } } #[cfg(test)] @@ -1010,7 +1184,7 @@ mod tests { ParsedMarkdownElement::Paragraph(vec![MarkdownParagraphChunk::Text( ParsedMarkdownText { source_range: 0..35, - contents: "Some bostrikethroughld text".to_string(), + contents: "Some bostrikethroughld text".into(), highlights: Vec::new(), region_ranges: Vec::new(), regions: Vec::new(), @@ -1184,7 +1358,7 @@ mod tests { }), MarkdownParagraphChunk::Text(ParsedMarkdownText { source_range: 0..81, - contents: " Lorem Ipsum ".to_string(), + contents: " Lorem Ipsum ".into(), highlights: Vec::new(), region_ranges: Vec::new(), regions: Vec::new(), @@ -1203,90 +1377,362 @@ mod tests { } #[test] - fn test_parse_length() { + fn test_parse_html_element_dimension() { // Test percentage values assert_eq!( - MarkdownParser::parse_length("50%"), + MarkdownParser::parse_html_element_dimension("50%"), Some(DefiniteLength::Fraction(0.5)) ); assert_eq!( - MarkdownParser::parse_length("100%"), + MarkdownParser::parse_html_element_dimension("100%"), Some(DefiniteLength::Fraction(1.0)) ); assert_eq!( - MarkdownParser::parse_length("25%"), + MarkdownParser::parse_html_element_dimension("25%"), Some(DefiniteLength::Fraction(0.25)) ); assert_eq!( - MarkdownParser::parse_length("0%"), + MarkdownParser::parse_html_element_dimension("0%"), Some(DefiniteLength::Fraction(0.0)) ); // Test pixel values assert_eq!( - MarkdownParser::parse_length("100px"), + MarkdownParser::parse_html_element_dimension("100px"), Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(100.0)))) ); assert_eq!( - MarkdownParser::parse_length("50px"), + MarkdownParser::parse_html_element_dimension("50px"), Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(50.0)))) ); assert_eq!( - MarkdownParser::parse_length("0px"), + MarkdownParser::parse_html_element_dimension("0px"), Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(0.0)))) ); // Test values without units (should be treated as pixels) assert_eq!( - MarkdownParser::parse_length("100"), + MarkdownParser::parse_html_element_dimension("100"), Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(100.0)))) ); assert_eq!( - MarkdownParser::parse_length("42"), + MarkdownParser::parse_html_element_dimension("42"), Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(42.0)))) ); // Test invalid values - assert_eq!(MarkdownParser::parse_length("invalid"), None); - assert_eq!(MarkdownParser::parse_length("px"), None); - assert_eq!(MarkdownParser::parse_length("%"), None); - assert_eq!(MarkdownParser::parse_length(""), None); - assert_eq!(MarkdownParser::parse_length("abc%"), None); - assert_eq!(MarkdownParser::parse_length("abcpx"), None); + assert_eq!( + MarkdownParser::parse_html_element_dimension("invalid"), + None + ); + assert_eq!(MarkdownParser::parse_html_element_dimension("px"), None); + assert_eq!(MarkdownParser::parse_html_element_dimension("%"), None); + assert_eq!(MarkdownParser::parse_html_element_dimension(""), None); + assert_eq!(MarkdownParser::parse_html_element_dimension("abc%"), None); + assert_eq!(MarkdownParser::parse_html_element_dimension("abcpx"), None); // Test decimal values assert_eq!( - MarkdownParser::parse_length("50.5%"), + MarkdownParser::parse_html_element_dimension("50.5%"), Some(DefiniteLength::Fraction(0.505)) ); assert_eq!( - MarkdownParser::parse_length("100.25px"), + MarkdownParser::parse_html_element_dimension("100.25px"), Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(100.25)))) ); assert_eq!( - MarkdownParser::parse_length("42.0"), + MarkdownParser::parse_html_element_dimension("42.0"), Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(42.0)))) ); } + #[gpui::test] + async fn test_inline_html_image_tag() { + let parsed = + parse("

Some text some more text

") + .await; + + assert_eq!( + ParsedMarkdown { + children: vec![ParsedMarkdownElement::Paragraph(vec![ + MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range: 0..71, + contents: "Some text".into(), + highlights: Default::default(), + region_ranges: Default::default(), + regions: Default::default() + }), + MarkdownParagraphChunk::Image(Image { + source_range: 0..71, + link: Link::Web { + url: "http://example.com/foo.png".to_string(), + }, + alt_text: None, + height: None, + width: None, + }), + MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range: 0..71, + contents: " some more text".into(), + highlights: Default::default(), + region_ranges: Default::default(), + regions: Default::default() + }), + ])] + }, + parsed + ); + } + + #[gpui::test] + async fn test_html_block_quote() { + let parsed = parse( + "
+

some description

+
", + ) + .await; + + assert_eq!( + ParsedMarkdown { + children: vec![block_quote( + vec![ParsedMarkdownElement::Paragraph(text( + "some description", + 0..76 + ))], + 0..76, + )] + }, + parsed + ); + } + + #[gpui::test] + async fn test_html_nested_block_quote() { + let parsed = parse( + "
+

some description

+
+

second description

+
+
", + ) + .await; + + assert_eq!( + ParsedMarkdown { + children: vec![block_quote( + vec![ + ParsedMarkdownElement::Paragraph(text("some description", 0..173)), + block_quote( + vec![ParsedMarkdownElement::Paragraph(text( + "second description", + 0..173 + ))], + 0..173, + ) + ], + 0..173, + )] + }, + parsed + ); + } + + #[gpui::test] + async fn test_html_table() { + let parsed = parse( + " + + + + + + + + + + + + + + + + +
IdName
1Chris
2Dennis
", + ) + .await; + + assert_eq!( + ParsedMarkdown { + children: vec![ParsedMarkdownElement::Table(table( + 0..366, + row(vec![text("Id", 0..366), text("Name ", 0..366)]), + vec![ + row(vec![text("1", 0..366), text("Chris", 0..366)]), + row(vec![text("2", 0..366), text("Dennis", 0..366)]), + ], + ))], + }, + parsed + ); + } + + #[gpui::test] + async fn test_html_table_without_headings() { + let parsed = parse( + " + + + + + + + + + + +
1Chris
2Dennis
", + ) + .await; + + assert_eq!( + ParsedMarkdown { + children: vec![ParsedMarkdownElement::Table(table( + 0..240, + row(vec![]), + vec![ + row(vec![text("1", 0..240), text("Chris", 0..240)]), + row(vec![text("2", 0..240), text("Dennis", 0..240)]), + ], + ))], + }, + parsed + ); + } + + #[gpui::test] + async fn test_html_table_without_body() { + let parsed = parse( + " + + + + + + +
IdName
", + ) + .await; + + assert_eq!( + ParsedMarkdown { + children: vec![ParsedMarkdownElement::Table(table( + 0..150, + row(vec![text("Id", 0..150), text("Name", 0..150)]), + vec![], + ))], + }, + parsed + ); + } + + #[gpui::test] + async fn test_html_heading_tags() { + let parsed = parse("

Heading

Heading

Heading

Heading

Heading
Heading
").await; + + assert_eq!( + ParsedMarkdown { + children: vec![ + ParsedMarkdownElement::Heading(ParsedMarkdownHeading { + level: HeadingLevel::H1, + source_range: 0..96, + contents: vec![MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range: 0..96, + contents: "Heading".into(), + highlights: Vec::default(), + region_ranges: Vec::default(), + regions: Vec::default() + })], + }), + ParsedMarkdownElement::Heading(ParsedMarkdownHeading { + level: HeadingLevel::H2, + source_range: 0..96, + contents: vec![MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range: 0..96, + contents: "Heading".into(), + highlights: Vec::default(), + region_ranges: Vec::default(), + regions: Vec::default() + })], + }), + ParsedMarkdownElement::Heading(ParsedMarkdownHeading { + level: HeadingLevel::H3, + source_range: 0..96, + contents: vec![MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range: 0..96, + contents: "Heading".into(), + highlights: Vec::default(), + region_ranges: Vec::default(), + regions: Vec::default() + })], + }), + ParsedMarkdownElement::Heading(ParsedMarkdownHeading { + level: HeadingLevel::H4, + source_range: 0..96, + contents: vec![MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range: 0..96, + contents: "Heading".into(), + highlights: Vec::default(), + region_ranges: Vec::default(), + regions: Vec::default() + })], + }), + ParsedMarkdownElement::Heading(ParsedMarkdownHeading { + level: HeadingLevel::H5, + source_range: 0..96, + contents: vec![MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range: 0..96, + contents: "Heading".into(), + highlights: Vec::default(), + region_ranges: Vec::default(), + regions: Vec::default() + })], + }), + ParsedMarkdownElement::Heading(ParsedMarkdownHeading { + level: HeadingLevel::H6, + source_range: 0..96, + contents: vec![MarkdownParagraphChunk::Text(ParsedMarkdownText { + source_range: 0..96, + contents: "Heading".into(), + highlights: Vec::default(), + region_ranges: Vec::default(), + regions: Vec::default() + })], + }), + ], + }, + parsed + ); + } + #[gpui::test] async fn test_html_image_tag() { let parsed = parse("").await; - let ParsedMarkdownElement::Image(image) = &parsed.children[0] else { - panic!("Expected a image element"); - }; assert_eq!( - image.clone(), - Image { - source_range: 0..40, - link: Link::Web { - url: "http://example.com/foo.png".to_string(), - }, - alt_text: None, - height: None, - width: None, + ParsedMarkdown { + children: vec![ParsedMarkdownElement::Image(Image { + source_range: 0..40, + link: Link::Web { + url: "http://example.com/foo.png".to_string(), + }, + alt_text: None, + height: None, + width: None, + })] }, + parsed ); } @@ -1294,20 +1740,19 @@ mod tests { async fn test_html_image_tag_with_alt_text() { let parsed = parse("\"Foo\"").await; - let ParsedMarkdownElement::Image(image) = &parsed.children[0] else { - panic!("Expected a image element"); - }; assert_eq!( - image.clone(), - Image { - source_range: 0..50, - link: Link::Web { - url: "http://example.com/foo.png".to_string(), - }, - alt_text: Some("Foo".into()), - height: None, - width: None, + ParsedMarkdown { + children: vec![ParsedMarkdownElement::Image(Image { + source_range: 0..50, + link: Link::Web { + url: "http://example.com/foo.png".to_string(), + }, + alt_text: Some("Foo".into()), + height: None, + width: None, + })] }, + parsed ); } @@ -1316,20 +1761,19 @@ mod tests { let parsed = parse("").await; - let ParsedMarkdownElement::Image(image) = &parsed.children[0] else { - panic!("Expected a image element"); - }; assert_eq!( - image.clone(), - Image { - source_range: 0..65, - link: Link::Web { - url: "http://example.com/foo.png".to_string(), - }, - alt_text: None, - height: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(100.)))), - width: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(200.)))), + ParsedMarkdown { + children: vec![ParsedMarkdownElement::Image(Image { + source_range: 0..65, + link: Link::Web { + url: "http://example.com/foo.png".to_string(), + }, + alt_text: None, + height: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(100.)))), + width: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(200.)))), + })] }, + parsed ); } @@ -1340,20 +1784,19 @@ mod tests { ) .await; - let ParsedMarkdownElement::Image(image) = &parsed.children[0] else { - panic!("Expected a image element"); - }; assert_eq!( - image.clone(), - Image { - source_range: 0..75, - link: Link::Web { - url: "http://example.com/foo.png".to_string(), - }, - alt_text: None, - height: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(100.)))), - width: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(200.)))), + ParsedMarkdown { + children: vec![ParsedMarkdownElement::Image(Image { + source_range: 0..75, + link: Link::Web { + url: "http://example.com/foo.png".to_string(), + }, + alt_text: None, + height: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(100.)))), + width: Some(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(200.)))), + })] }, + parsed ); } @@ -1804,7 +2247,7 @@ fn main() { region_ranges: Vec::new(), regions: Vec::new(), source_range, - contents: contents.to_string(), + contents: contents.to_string().into(), })] } diff --git a/crates/markdown_preview/src/markdown_preview.rs b/crates/markdown_preview/src/markdown_preview.rs index 91c0005097d778d4b60f7a8a721ed898f0059ed1..77bad89a629cbb1f660e1cd16158d4dbca03361e 100644 --- a/crates/markdown_preview/src/markdown_preview.rs +++ b/crates/markdown_preview/src/markdown_preview.rs @@ -2,6 +2,7 @@ use gpui::{App, actions}; use workspace::Workspace; pub mod markdown_elements; +mod markdown_minifier; pub mod markdown_parser; pub mod markdown_preview_view; pub mod markdown_renderer; diff --git a/crates/markdown_preview/src/markdown_preview_view.rs b/crates/markdown_preview/src/markdown_preview_view.rs index 1121d64655f6c7e02f0b0d621605c9ba1aae7cde..d20ed40b7928186e2caf564be5ff66b0bd04f0d1 100644 --- a/crates/markdown_preview/src/markdown_preview_view.rs +++ b/crates/markdown_preview/src/markdown_preview_view.rs @@ -13,7 +13,7 @@ use gpui::{ use language::LanguageRegistry; use settings::Settings; use theme::ThemeSettings; -use ui::prelude::*; +use ui::{WithScrollbar, prelude::*}; use workspace::item::{Item, ItemHandle}; use workspace::{Pane, Workspace}; @@ -481,7 +481,7 @@ impl Item for MarkdownPreviewView { } impl Render for MarkdownPreviewView { - fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { let buffer_size = ThemeSettings::get_global(cx).buffer_font_size(cx); let buffer_line_height = ThemeSettings::get_global(cx).buffer_line_height; @@ -598,5 +598,6 @@ impl Render for MarkdownPreviewView { .size_full(), ) })) + .vertical_scrollbar_for(self.list_state.clone(), window, cx) } } diff --git a/crates/markdown_preview/src/markdown_renderer.rs b/crates/markdown_preview/src/markdown_renderer.rs index 5835797d9ecd1fa8cf97b18a9e518ab93ab4599c..a873771e001f594149acc83ea46ce45608a9ed87 100644 --- a/crates/markdown_preview/src/markdown_renderer.rs +++ b/crates/markdown_preview/src/markdown_renderer.rs @@ -51,7 +51,9 @@ pub struct RenderContext { buffer_text_style: TextStyle, text_style: TextStyle, border_color: Hsla, + element_background_color: Hsla, text_color: Hsla, + link_color: Hsla, window_rem_size: Pixels, text_muted_color: Hsla, code_block_background_color: Hsla, @@ -84,7 +86,9 @@ impl RenderContext { text_style: window.text_style(), syntax_theme: theme.syntax().clone(), border_color: theme.colors().border, + element_background_color: theme.colors().element_background, text_color: theme.colors().text, + link_color: theme.colors().text_accent, window_rem_size: window.rem_size(), text_muted_color: theme.colors().text_muted, code_block_background_color: theme.colors().surface_background, @@ -471,6 +475,10 @@ fn render_markdown_table(parsed: &ParsedMarkdownTable, cx: &mut RenderContext) - for (index, cell) in row.children.iter().enumerate() { let length = paragraph_len(cell); + if index >= max_lengths.len() { + max_lengths.resize(index + 1, length); + } + if length > max_lengths[index] { max_lengths[index] = length; } @@ -519,7 +527,8 @@ fn render_markdown_table_row( is_header: bool, cx: &mut RenderContext, ) -> AnyElement { - let mut items = vec![]; + let mut items = Vec::with_capacity(parsed.children.len()); + let count = parsed.children.len(); for (index, cell) in parsed.children.iter().enumerate() { let alignment = alignments @@ -542,18 +551,29 @@ fn render_markdown_table_row( .children(contents) .px_2() .py_1() - .border_color(cx.border_color); + .border_color(cx.border_color) + .border_l_1(); + + if count == index + 1 { + cell = cell.border_r_1(); + } if is_header { - cell = cell.border_2() - } else { - cell = cell.border_1() + cell = cell.bg(cx.element_background_color) } items.push(cell); } - h_flex().children(items).into_any_element() + let mut row = h_flex().border_color(cx.border_color); + + if is_header { + row = row.border_y_1(); + } else { + row = row.border_b_1(); + } + + row.children(items).into_any_element() } fn render_markdown_block_quote( @@ -636,12 +656,13 @@ fn render_markdown_paragraph(parsed: &MarkdownParagraph, cx: &mut RenderContext) } fn render_markdown_text(parsed_new: &MarkdownParagraph, cx: &mut RenderContext) -> Vec { - let mut any_element = vec![]; + let mut any_element = Vec::with_capacity(parsed_new.len()); // these values are cloned in-order satisfy borrow checker let syntax_theme = cx.syntax_theme.clone(); let workspace_clone = cx.workspace.clone(); let code_span_bg_color = cx.code_span_background_color; let text_style = cx.text_style.clone(); + let link_color = cx.link_color; for parsed_region in parsed_new { match parsed_region { @@ -651,7 +672,7 @@ fn render_markdown_text(parsed_new: &MarkdownParagraph, cx: &mut RenderContext) let highlights = gpui::combine_highlights( parsed.highlights.iter().filter_map(|(range, highlight)| { highlight - .to_highlight_style(&syntax_theme) + .to_highlight_style(&syntax_theme, link_color) .map(|style| (range.clone(), style)) }), parsed.regions.iter().zip(&parsed.region_ranges).filter_map( @@ -825,8 +846,8 @@ impl InteractiveMarkdownElementTooltip { } impl Render for InteractiveMarkdownElementTooltip { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - tooltip_container(window, cx, |el, _, _| { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + tooltip_container(cx, |el, _| { let secondary_modifier = Keystroke { modifiers: Modifiers::secondary_key(), ..Default::default() diff --git a/crates/media/Cargo.toml b/crates/media/Cargo.toml index 0dd5b8e0a4dabccdffbd3b3fe304f72dae77a25e..be72aa0b08b215c49937e0ca6a992d1470bec4df 100644 --- a/crates/media/Cargo.toml +++ b/crates/media/Cargo.toml @@ -1,9 +1,10 @@ [package] -name = "media" +name = "zed-media" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "Bindings to macos media handling APIs for Zed" [lints] workspace = true diff --git a/crates/media/build.rs b/crates/media/build.rs index 75639e30b43b909619f32bdb92b5f75de13cff1f..090002e9e925951383166282dcbabbec79838546 100644 --- a/crates/media/build.rs +++ b/crates/media/build.rs @@ -1,3 +1,4 @@ +#![allow(clippy::disallowed_methods, reason = "build scripts are exempt")] #[cfg(target_os = "macos")] fn main() { use std::{env, path::PathBuf, process::Command}; diff --git a/crates/migrator/Cargo.toml b/crates/migrator/Cargo.toml index aeb50e582e2cec34821ba9094514cd32c21204d8..e60233a06d379060537e104279d95b3f20383f0d 100644 --- a/crates/migrator/Cargo.toml +++ b/crates/migrator/Cargo.toml @@ -21,6 +21,10 @@ streaming-iterator.workspace = true tree-sitter-json.workspace = true tree-sitter.workspace = true workspace-hack.workspace = true +serde_json_lenient.workspace = true +serde_json.workspace = true +settings.workspace = true [dev-dependencies] pretty_assertions.workspace = true +unindent.workspace = true diff --git a/crates/migrator/src/migrations.rs b/crates/migrator/src/migrations.rs index 9db597e9643866ba2fcbad00ea77d4de0c244fd1..1b8ede68b1eb8686325c896723d1fdc762d02b73 100644 --- a/crates/migrator/src/migrations.rs +++ b/crates/migrator/src/migrations.rs @@ -99,3 +99,27 @@ pub(crate) mod m_2025_07_08 { pub(crate) use settings::SETTINGS_PATTERNS; } + +pub(crate) mod m_2025_10_01 { + mod settings; + + pub(crate) use settings::SETTINGS_PATTERNS; +} + +pub(crate) mod m_2025_10_02 { + mod settings; + + pub(crate) use settings::remove_formatters_on_save; +} + +pub(crate) mod m_2025_10_03 { + mod settings; + + pub(crate) use settings::SETTINGS_PATTERNS; +} + +pub(crate) mod m_2025_10_10 { + mod settings; + + pub(crate) use settings::remove_code_actions_on_format; +} diff --git a/crates/migrator/src/migrations/m_2025_01_29/keymap.rs b/crates/migrator/src/migrations/m_2025_01_29/keymap.rs index eed2c46e0816452af6813ae699eab6cec1d65eec..222ad9716b71757245015b99e808d92d146151a8 100644 --- a/crates/migrator/src/migrations/m_2025_01_29/keymap.rs +++ b/crates/migrator/src/migrations/m_2025_01_29/keymap.rs @@ -156,6 +156,16 @@ static TRANSFORM_ARRAY: LazyLock> = LazyLock::new(|| (("vim::ResizePane", "Narrow"), "vim::ResizePaneLeft"), (("vim::ResizePane", "Shorten"), "vim::ResizePaneDown"), (("vim::ResizePane", "Lengthen"), "vim::ResizePaneUp"), + // fold at level + (("editor::FoldAtLevel", "1"), "editor::FoldAtLevel1"), + (("editor::FoldAtLevel", "2"), "editor::FoldAtLevel2"), + (("editor::FoldAtLevel", "3"), "editor::FoldAtLevel3"), + (("editor::FoldAtLevel", "4"), "editor::FoldAtLevel4"), + (("editor::FoldAtLevel", "5"), "editor::FoldAtLevel5"), + (("editor::FoldAtLevel", "6"), "editor::FoldAtLevel6"), + (("editor::FoldAtLevel", "7"), "editor::FoldAtLevel7"), + (("editor::FoldAtLevel", "8"), "editor::FoldAtLevel8"), + (("editor::FoldAtLevel", "9"), "editor::FoldAtLevel9"), ]) }); diff --git a/crates/migrator/src/migrations/m_2025_10_01/settings.rs b/crates/migrator/src/migrations/m_2025_10_01/settings.rs new file mode 100644 index 0000000000000000000000000000000000000000..4f1e7a642f2fff3702886f9f37929976b8ad4d76 --- /dev/null +++ b/crates/migrator/src/migrations/m_2025_10_01/settings.rs @@ -0,0 +1,109 @@ +use std::ops::Range; +use tree_sitter::{Query, QueryMatch}; + +use crate::MigrationPatterns; + +pub const SETTINGS_PATTERNS: MigrationPatterns = + &[(FORMATTER_PATTERN, migrate_code_action_formatters)]; + +const FORMATTER_PATTERN: &str = r#" + (object + (pair + key: (string (string_content) @formatter) (#any-of? @formatter "formatter" "format_on_save") + value: [ + (array + (object + (pair + key: (string (string_content) @code-actions-key) (#eq? @code-actions-key "code_actions") + value: (object + ((pair) @code-action ","?)* + ) + ) + ) @code-actions-obj + ) @formatter-array + (object + (pair + key: (string (string_content) @code-actions-key) (#eq? @code-actions-key "code_actions") + value: (object + ((pair) @code-action ","?)* + ) + ) + ) @code-actions-obj + ] + ) + ) +"#; + +pub fn migrate_code_action_formatters( + contents: &str, + mat: &QueryMatch, + query: &Query, +) -> Option<(Range, String)> { + let code_actions_obj_ix = query.capture_index_for_name("code-actions-obj")?; + let code_actions_obj_node = mat.nodes_for_capture_index(code_actions_obj_ix).next()?; + + let mut code_actions = vec![]; + + let code_actions_ix = query.capture_index_for_name("code-action")?; + for code_action_node in mat.nodes_for_capture_index(code_actions_ix) { + let Some(enabled) = code_action_node + .child_by_field_name("value") + .map(|n| n.kind() != "false") + else { + continue; + }; + if !enabled { + continue; + } + let Some(name) = code_action_node + .child_by_field_name("key") + .and_then(|n| n.child(1)) + .map(|n| &contents[n.byte_range()]) + else { + continue; + }; + code_actions.push(name); + } + + let indent = query + .capture_index_for_name("formatter") + .and_then(|ix| mat.nodes_for_capture_index(ix).next()) + .map(|node| node.start_position().column + 1) + .unwrap_or(2); + + let mut code_actions_str = code_actions + .into_iter() + .map(|code_action| format!(r#"{{ "code_action": "{}" }}"#, code_action)) + .collect::>() + .join(&format!(",\n{}", " ".repeat(indent))); + let is_array = query + .capture_index_for_name("formatter-array") + .map(|ix| mat.nodes_for_capture_index(ix).count() > 0) + .unwrap_or(false); + if !is_array { + code_actions_str.insert_str(0, &" ".repeat(indent)); + code_actions_str.insert_str(0, "[\n"); + code_actions_str.push('\n'); + code_actions_str.push_str(&" ".repeat(indent.saturating_sub(2))); + code_actions_str.push_str("]"); + } + let mut replace_range = code_actions_obj_node.byte_range(); + if is_array && code_actions_str.is_empty() { + let mut cursor = code_actions_obj_node.parent().unwrap().walk(); + cursor.goto_first_child(); + while cursor.node().id() != code_actions_obj_node.id() && cursor.goto_next_sibling() {} + while cursor.goto_next_sibling() + && (cursor.node().is_extra() + || cursor.node().is_missing() + || cursor.node().kind() == "comment") + {} + if cursor.node().kind() == "," { + // found comma, delete up to next node + while cursor.goto_next_sibling() + && (cursor.node().is_extra() || cursor.node().is_missing()) + {} + replace_range.end = cursor.node().range().start_byte; + } + } + Some((replace_range, code_actions_str)) +} diff --git a/crates/migrator/src/migrations/m_2025_10_02/settings.rs b/crates/migrator/src/migrations/m_2025_10_02/settings.rs new file mode 100644 index 0000000000000000000000000000000000000000..2434ae4d0e100ce58e4cfdd2eee1039188c1d7bc --- /dev/null +++ b/crates/migrator/src/migrations/m_2025_10_02/settings.rs @@ -0,0 +1,50 @@ +use anyhow::Result; +use serde_json::Value; + +pub fn remove_formatters_on_save(value: &mut Value) -> Result<()> { + remove_formatters_on_save_inner(value, &[])?; + let languages = value + .as_object_mut() + .and_then(|obj| obj.get_mut("languages")) + .and_then(|languages| languages.as_object_mut()); + if let Some(languages) = languages { + for (language_name, language) in languages.iter_mut() { + let path = vec!["languages", language_name]; + remove_formatters_on_save_inner(language, &path)?; + } + } + Ok(()) +} + +fn remove_formatters_on_save_inner(value: &mut Value, path: &[&str]) -> Result<()> { + let Some(obj) = value.as_object_mut() else { + return Ok(()); + }; + let Some(format_on_save) = obj.get("format_on_save").cloned() else { + return Ok(()); + }; + let is_format_on_save_set_to_formatter = format_on_save + .as_str() + .map_or(true, |s| s != "on" && s != "off"); + if !is_format_on_save_set_to_formatter { + return Ok(()); + } + + fn fmt_path(path: &[&str], key: &str) -> String { + let mut path = path.to_vec(); + path.push(key); + path.join(".") + } + + anyhow::ensure!( + obj.get("formatter").is_none(), + r#"Setting formatters in both "format_on_save" and "formatter" is deprecated. Please migrate the formatters from {} into {}"#, + fmt_path(path, "format_on_save"), + fmt_path(path, "formatter") + ); + + obj.insert("format_on_save".to_string(), serde_json::json!("on")); + obj.insert("formatter".to_string(), format_on_save); + + Ok(()) +} diff --git a/crates/migrator/src/migrations/m_2025_10_03/settings.rs b/crates/migrator/src/migrations/m_2025_10_03/settings.rs new file mode 100644 index 0000000000000000000000000000000000000000..47d15e8ddfa1bfd2c73c8e408579c901294903ee --- /dev/null +++ b/crates/migrator/src/migrations/m_2025_10_03/settings.rs @@ -0,0 +1,30 @@ +use std::ops::Range; +use tree_sitter::{Query, QueryMatch}; + +use crate::MigrationPatterns; +use crate::patterns::SETTINGS_ROOT_KEY_VALUE_PATTERN; + +pub const SETTINGS_PATTERNS: MigrationPatterns = + &[(SETTINGS_ROOT_KEY_VALUE_PATTERN, rename_agent_font_size)]; + +/// Renames the setting `agent_font_size` to `agent_ui_font_size` +fn rename_agent_font_size( + contents: &str, + mat: &QueryMatch, + query: &Query, +) -> Option<(Range, String)> { + let setting_capture_ix = query.capture_index_for_name("name")?; + + let setting_name_range = mat + .nodes_for_capture_index(setting_capture_ix) + .next()? + .byte_range(); + + let setting_name = contents.get(setting_name_range.clone())?; + + if setting_name != "agent_font_size" { + return None; + } + + Some((setting_name_range, "agent_ui_font_size".to_string())) +} diff --git a/crates/migrator/src/migrations/m_2025_10_10/settings.rs b/crates/migrator/src/migrations/m_2025_10_10/settings.rs new file mode 100644 index 0000000000000000000000000000000000000000..1d07be71a139b60e4b362d26c68b25922f04a233 --- /dev/null +++ b/crates/migrator/src/migrations/m_2025_10_10/settings.rs @@ -0,0 +1,70 @@ +use anyhow::Result; +use serde_json::Value; + +pub fn remove_code_actions_on_format(value: &mut Value) -> Result<()> { + remove_code_actions_on_format_inner(value, &[])?; + let languages = value + .as_object_mut() + .and_then(|obj| obj.get_mut("languages")) + .and_then(|languages| languages.as_object_mut()); + if let Some(languages) = languages { + for (language_name, language) in languages.iter_mut() { + let path = vec!["languages", language_name]; + remove_code_actions_on_format_inner(language, &path)?; + } + } + Ok(()) +} + +fn remove_code_actions_on_format_inner(value: &mut Value, path: &[&str]) -> Result<()> { + let Some(obj) = value.as_object_mut() else { + return Ok(()); + }; + let Some(code_actions_on_format) = obj.get("code_actions_on_format").cloned() else { + return Ok(()); + }; + + fn fmt_path(path: &[&str], key: &str) -> String { + let mut path = path.to_vec(); + path.push(key); + path.join(".") + } + + anyhow::ensure!( + code_actions_on_format.is_object(), + r#"The `code_actions_on_format` setting is deprecated, but it is in an invalid state and cannot be migrated at {}. Please ensure the code_actions_on_format setting is a Map"#, + fmt_path(path, "code_actions_on_format"), + ); + + let code_actions_map = code_actions_on_format.as_object().unwrap(); + let mut code_actions = vec![]; + for (code_action, code_action_enabled) in code_actions_map { + if code_action_enabled.as_bool().map_or(false, |b| !b) { + continue; + } + code_actions.push(code_action.clone()); + } + + let mut formatter_array = vec![]; + if let Some(formatter) = obj.get("formatter") { + if let Some(array) = formatter.as_array() { + formatter_array = array.clone(); + } else { + formatter_array.insert(0, formatter.clone()); + } + }; + let found_code_actions = !code_actions.is_empty(); + formatter_array.splice( + 0..0, + code_actions + .into_iter() + .map(|code_action| serde_json::json!({"code_action": code_action})), + ); + + obj.remove("code_actions_on_format"); + if found_code_actions { + obj.insert("formatter".to_string(), Value::Array(formatter_array)); + } + + Ok(()) +} diff --git a/crates/migrator/src/migrator.rs b/crates/migrator/src/migrator.rs index 2180a049d03daf5fcd2a60e1f1f7ddd0013c7d1f..aea11f98c460cc6c72120138ca1068be9ea60923 100644 --- a/crates/migrator/src/migrator.rs +++ b/crates/migrator/src/migrator.rs @@ -65,14 +65,49 @@ fn migrate(text: &str, patterns: MigrationPatterns, query: &Query) -> Result Result> { +/// Runs the provided migrations on the given text. +/// Will automatically return `Ok(None)` if there's no content to migrate. +fn run_migrations(text: &str, migrations: &[MigrationType]) -> Result> { + if text.is_empty() { + return Ok(None); + } + let mut current_text = text.to_string(); let mut result: Option = None; - for (patterns, query) in migrations.iter() { - if let Some(migrated_text) = migrate(¤t_text, patterns, query)? { + for migration in migrations.iter() { + let migrated_text = match migration { + MigrationType::TreeSitter(patterns, query) => migrate(¤t_text, patterns, query)?, + MigrationType::Json(callback) => { + if current_text.trim().is_empty() { + return Ok(None); + } + let old_content: serde_json_lenient::Value = + settings::parse_json_with_comments(¤t_text)?; + let old_value = serde_json::to_value(&old_content).unwrap(); + let mut new_value = old_value.clone(); + callback(&mut new_value)?; + if new_value != old_value { + let mut current = current_text.clone(); + let mut edits = vec![]; + settings::update_value_in_json_text( + &mut current, + &mut vec![], + 2, + &old_value, + &new_value, + &mut edits, + ); + let mut migrated_text = current_text.clone(); + for (range, replacement) in edits.into_iter() { + migrated_text.replace_range(range, &replacement); + } + Some(migrated_text) + } else { + None + } + } + }; + if let Some(migrated_text) = migrated_text { current_text = migrated_text.clone(); result = Some(migrated_text); } @@ -81,24 +116,24 @@ fn run_migrations( } pub fn migrate_keymap(text: &str) -> Result> { - let migrations: &[(MigrationPatterns, &Query)] = &[ - ( + let migrations: &[MigrationType] = &[ + MigrationType::TreeSitter( migrations::m_2025_01_29::KEYMAP_PATTERNS, &KEYMAP_QUERY_2025_01_29, ), - ( + MigrationType::TreeSitter( migrations::m_2025_01_30::KEYMAP_PATTERNS, &KEYMAP_QUERY_2025_01_30, ), - ( + MigrationType::TreeSitter( migrations::m_2025_03_03::KEYMAP_PATTERNS, &KEYMAP_QUERY_2025_03_03, ), - ( + MigrationType::TreeSitter( migrations::m_2025_03_06::KEYMAP_PATTERNS, &KEYMAP_QUERY_2025_03_06, ), - ( + MigrationType::TreeSitter( migrations::m_2025_04_15::KEYMAP_PATTERNS, &KEYMAP_QUERY_2025_04_15, ), @@ -106,64 +141,79 @@ pub fn migrate_keymap(text: &str) -> Result> { run_migrations(text, migrations) } +enum MigrationType<'a> { + TreeSitter(MigrationPatterns, &'a Query), + Json(fn(&mut serde_json::Value) -> Result<()>), +} + pub fn migrate_settings(text: &str) -> Result> { - let migrations: &[(MigrationPatterns, &Query)] = &[ - ( + let migrations: &[MigrationType] = &[ + MigrationType::TreeSitter( migrations::m_2025_01_02::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_01_02, ), - ( + MigrationType::TreeSitter( migrations::m_2025_01_29::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_01_29, ), - ( + MigrationType::TreeSitter( migrations::m_2025_01_30::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_01_30, ), - ( + MigrationType::TreeSitter( migrations::m_2025_03_29::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_03_29, ), - ( + MigrationType::TreeSitter( migrations::m_2025_04_15::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_04_15, ), - ( + MigrationType::TreeSitter( migrations::m_2025_04_21::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_04_21, ), - ( + MigrationType::TreeSitter( migrations::m_2025_04_23::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_04_23, ), - ( + MigrationType::TreeSitter( migrations::m_2025_05_05::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_05_05, ), - ( + MigrationType::TreeSitter( migrations::m_2025_05_08::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_05_08, ), - ( + MigrationType::TreeSitter( migrations::m_2025_05_29::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_05_29, ), - ( + MigrationType::TreeSitter( migrations::m_2025_06_16::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_06_16, ), - ( + MigrationType::TreeSitter( migrations::m_2025_06_25::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_06_25, ), - ( + MigrationType::TreeSitter( migrations::m_2025_06_27::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_06_27, ), - ( + MigrationType::TreeSitter( migrations::m_2025_07_08::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_07_08, ), + MigrationType::TreeSitter( + migrations::m_2025_10_01::SETTINGS_PATTERNS, + &SETTINGS_QUERY_2025_10_01, + ), + MigrationType::Json(migrations::m_2025_10_02::remove_formatters_on_save), + MigrationType::TreeSitter( + migrations::m_2025_10_03::SETTINGS_PATTERNS, + &SETTINGS_QUERY_2025_10_03, + ), + MigrationType::Json(migrations::m_2025_10_10::remove_code_actions_on_format), ]; run_migrations(text, migrations) } @@ -278,6 +328,14 @@ define_query!( SETTINGS_QUERY_2025_07_08, migrations::m_2025_07_08::SETTINGS_PATTERNS ); +define_query!( + SETTINGS_QUERY_2025_10_01, + migrations::m_2025_10_01::SETTINGS_PATTERNS +); +define_query!( + SETTINGS_QUERY_2025_10_03, + migrations::m_2025_10_03::SETTINGS_PATTERNS +); // custom query static EDIT_PREDICTION_SETTINGS_MIGRATION_QUERY: LazyLock = LazyLock::new(|| { @@ -291,6 +349,18 @@ static EDIT_PREDICTION_SETTINGS_MIGRATION_QUERY: LazyLock = LazyLock::new #[cfg(test)] mod tests { use super::*; + use unindent::Unindent as _; + + fn assert_migrated_correctly(migrated: Option, expected: Option<&str>) { + match (&migrated, &expected) { + (Some(migrated), Some(expected)) => { + pretty_assertions::assert_str_eq!(migrated, expected); + } + _ => { + pretty_assertions::assert_eq!(migrated.as_deref(), expected); + } + } + } fn assert_migrate_keymap(input: &str, output: Option<&str>) { let migrated = migrate_keymap(input).unwrap(); @@ -299,16 +369,21 @@ mod tests { fn assert_migrate_settings(input: &str, output: Option<&str>) { let migrated = migrate_settings(input).unwrap(); - pretty_assertions::assert_eq!(migrated.as_deref(), output); + assert_migrated_correctly(migrated, output); } fn assert_migrate_settings_with_migrations( - migrations: &[(MigrationPatterns, &Query)], + migrations: &[MigrationType], input: &str, output: Option<&str>, ) { let migrated = run_migrations(input, migrations).unwrap(); - pretty_assertions::assert_eq!(migrated.as_deref(), output); + assert_migrated_correctly(migrated, output); + } + + #[test] + fn test_empty_content() { + assert_migrate_settings("", None) } #[test] @@ -899,7 +974,7 @@ mod tests { #[test] fn test_mcp_settings_migration() { assert_migrate_settings_with_migrations( - &[( + &[MigrationType::TreeSitter( migrations::m_2025_06_16::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_06_16, )], @@ -1088,7 +1163,7 @@ mod tests { } }"#; assert_migrate_settings_with_migrations( - &[( + &[MigrationType::TreeSitter( migrations::m_2025_06_16::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_06_16, )], @@ -1263,4 +1338,878 @@ mod tests { ), ); } + + #[test] + fn test_flatten_code_action_formatters_basic_array() { + assert_migrate_settings( + &r#"{ + "formatter": [ + { + "code_actions": { + "included-1": true, + "included-2": true, + "excluded": false, + } + } + ] + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { "code_action": "included-1" }, + { "code_action": "included-2" } + ] + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_flatten_code_action_formatters_basic_object() { + assert_migrate_settings( + &r#"{ + "formatter": { + "code_actions": { + "included-1": true, + "excluded": false, + "included-2": true + } + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { "code_action": "included-1" }, + { "code_action": "included-2" } + ] + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_flatten_code_action_formatters_array_with_multiple_action_blocks() { + assert_migrate_settings( + r#"{ + "formatter": [ + { + "code_actions": { + "included-1": true, + "included-2": true, + "excluded": false, + } + }, + { + "language_server": "ruff" + }, + { + "code_actions": { + "excluded": false, + "excluded-2": false, + } + } + // some comment + , + { + "code_actions": { + "excluded": false, + "included-3": true, + "included-4": true, + } + }, + ] + }"#, + Some( + r#"{ + "formatter": [ + { "code_action": "included-1" }, + { "code_action": "included-2" }, + { + "language_server": "ruff" + }, + { "code_action": "included-3" }, + { "code_action": "included-4" }, + ] + }"#, + ), + ); + } + + #[test] + fn test_flatten_code_action_formatters_array_with_multiple_action_blocks_in_languages() { + assert_migrate_settings( + &r#"{ + "languages": { + "Rust": { + "formatter": [ + { + "code_actions": { + "included-1": true, + "included-2": true, + "excluded": false, + } + }, + { + "language_server": "ruff" + }, + { + "code_actions": { + "excluded": false, + "excluded-2": false, + } + } + // some comment + , + { + "code_actions": { + "excluded": false, + "included-3": true, + "included-4": true, + } + }, + ] + } + } + }"# + .unindent(), + Some( + &r#"{ + "languages": { + "Rust": { + "formatter": [ + { "code_action": "included-1" }, + { "code_action": "included-2" }, + { + "language_server": "ruff" + }, + { "code_action": "included-3" }, + { "code_action": "included-4" }, + ] + } + } + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_flatten_code_action_formatters_array_with_multiple_action_blocks_in_defaults_and_multiple_languages() + { + assert_migrate_settings( + &r#"{ + "formatter": { + "code_actions": { + "default-1": true, + "default-2": true, + "default-3": true, + "default-4": true, + } + }, + "languages": { + "Rust": { + "formatter": [ + { + "code_actions": { + "included-1": true, + "included-2": true, + "excluded": false, + } + }, + { + "language_server": "ruff" + }, + { + "code_actions": { + "excluded": false, + "excluded-2": false, + } + } + // some comment + , + { + "code_actions": { + "excluded": false, + "included-3": true, + "included-4": true, + } + }, + ] + }, + "Python": { + "formatter": [ + { + "language_server": "ruff" + }, + { + "code_actions": { + "excluded": false, + "excluded-2": false, + } + } + // some comment + , + { + "code_actions": { + "excluded": false, + "included-3": true, + "included-4": true, + } + }, + ] + } + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { "code_action": "default-1" }, + { "code_action": "default-2" }, + { "code_action": "default-3" }, + { "code_action": "default-4" } + ], + "languages": { + "Rust": { + "formatter": [ + { "code_action": "included-1" }, + { "code_action": "included-2" }, + { + "language_server": "ruff" + }, + { "code_action": "included-3" }, + { "code_action": "included-4" }, + ] + }, + "Python": { + "formatter": [ + { + "language_server": "ruff" + }, + { "code_action": "included-3" }, + { "code_action": "included-4" }, + ] + } + } + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_flatten_code_action_formatters_array_with_format_on_save_and_multiple_languages() { + assert_migrate_settings_with_migrations( + &[MigrationType::TreeSitter( + migrations::m_2025_10_01::SETTINGS_PATTERNS, + &SETTINGS_QUERY_2025_10_01, + )], + &r#"{ + "formatter": { + "code_actions": { + "default-1": true, + "default-2": true, + "default-3": true, + "default-4": true, + } + }, + "format_on_save": [ + { + "code_actions": { + "included-1": true, + "included-2": true, + "excluded": false, + } + }, + { + "language_server": "ruff" + }, + { + "code_actions": { + "excluded": false, + "excluded-2": false, + } + } + // some comment + , + { + "code_actions": { + "excluded": false, + "included-3": true, + "included-4": true, + } + }, + ], + "languages": { + "Rust": { + "format_on_save": "prettier", + "formatter": [ + { + "code_actions": { + "included-1": true, + "included-2": true, + "excluded": false, + } + }, + { + "language_server": "ruff" + }, + { + "code_actions": { + "excluded": false, + "excluded-2": false, + } + } + // some comment + , + { + "code_actions": { + "excluded": false, + "included-3": true, + "included-4": true, + } + }, + ] + }, + "Python": { + "format_on_save": { + "code_actions": { + "on-save-1": true, + "on-save-2": true, + } + }, + "formatter": [ + { + "language_server": "ruff" + }, + { + "code_actions": { + "excluded": false, + "excluded-2": false, + } + } + // some comment + , + { + "code_actions": { + "excluded": false, + "included-3": true, + "included-4": true, + } + }, + ] + } + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { "code_action": "default-1" }, + { "code_action": "default-2" }, + { "code_action": "default-3" }, + { "code_action": "default-4" } + ], + "format_on_save": [ + { "code_action": "included-1" }, + { "code_action": "included-2" }, + { + "language_server": "ruff" + }, + { "code_action": "included-3" }, + { "code_action": "included-4" }, + ], + "languages": { + "Rust": { + "format_on_save": "prettier", + "formatter": [ + { "code_action": "included-1" }, + { "code_action": "included-2" }, + { + "language_server": "ruff" + }, + { "code_action": "included-3" }, + { "code_action": "included-4" }, + ] + }, + "Python": { + "format_on_save": [ + { "code_action": "on-save-1" }, + { "code_action": "on-save-2" } + ], + "formatter": [ + { + "language_server": "ruff" + }, + { "code_action": "included-3" }, + { "code_action": "included-4" }, + ] + } + } + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_format_on_save_formatter_migration_basic() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_02::remove_formatters_on_save, + )], + &r#"{ + "format_on_save": "prettier" + }"# + .unindent(), + Some( + &r#"{ + "formatter": "prettier", + "format_on_save": "on" + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_format_on_save_formatter_migration_array() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_02::remove_formatters_on_save, + )], + &r#"{ + "format_on_save": ["prettier", {"language_server": "eslint"}] + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + "prettier", + { + "language_server": "eslint" + } + ], + "format_on_save": "on" + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_format_on_save_on_off_unchanged() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_02::remove_formatters_on_save, + )], + &r#"{ + "format_on_save": "on" + }"# + .unindent(), + None, + ); + + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_02::remove_formatters_on_save, + )], + &r#"{ + "format_on_save": "off" + }"# + .unindent(), + None, + ); + } + + #[test] + fn test_format_on_save_formatter_migration_in_languages() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_02::remove_formatters_on_save, + )], + &r#"{ + "languages": { + "Rust": { + "format_on_save": "rust-analyzer" + }, + "Python": { + "format_on_save": ["ruff", "black"] + } + } + }"# + .unindent(), + Some( + &r#"{ + "languages": { + "Rust": { + "formatter": "rust-analyzer", + "format_on_save": "on" + }, + "Python": { + "formatter": [ + "ruff", + "black" + ], + "format_on_save": "on" + } + } + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_format_on_save_formatter_migration_mixed_global_and_languages() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_02::remove_formatters_on_save, + )], + &r#"{ + "format_on_save": "prettier", + "languages": { + "Rust": { + "format_on_save": "rust-analyzer" + }, + "Python": { + "format_on_save": "on" + } + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": "prettier", + "format_on_save": "on", + "languages": { + "Rust": { + "formatter": "rust-analyzer", + "format_on_save": "on" + }, + "Python": { + "format_on_save": "on" + } + } + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_format_on_save_no_migration_when_no_format_on_save() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_02::remove_formatters_on_save, + )], + &r#"{ + "formatter": ["prettier"] + }"# + .unindent(), + None, + ); + } + + #[test] + fn test_code_actions_on_format_migration_basic() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "code_actions_on_format": { + "source.organizeImports": true, + "source.fixAll": true + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { + "code_action": "source.organizeImports" + }, + { + "code_action": "source.fixAll" + } + ] + } + "# + .unindent(), + ), + ); + } + + #[test] + fn test_code_actions_on_format_migration_filters_false_values() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "code_actions_on_format": { + "a": true, + "b": false, + "c": true + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { + "code_action": "a" + }, + { + "code_action": "c" + } + ] + } + "# + .unindent(), + ), + ); + } + + #[test] + fn test_code_actions_on_format_migration_with_existing_formatter_object() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "formatter": "prettier", + "code_actions_on_format": { + "source.organizeImports": true + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { + "code_action": "source.organizeImports" + }, + "prettier" + ] + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_code_actions_on_format_migration_with_existing_formatter_array() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "formatter": ["prettier", {"language_server": "eslint"}], + "code_actions_on_format": { + "source.organizeImports": true, + "source.fixAll": true + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { + "code_action": "source.organizeImports" + }, + { + "code_action": "source.fixAll" + }, + "prettier", + { + "language_server": "eslint" + } + ] + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_code_actions_on_format_migration_in_languages() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "languages": { + "JavaScript": { + "code_actions_on_format": { + "source.fixAll.eslint": true + } + }, + "Go": { + "code_actions_on_format": { + "source.organizeImports": true + } + } + } + }"# + .unindent(), + Some( + &r#"{ + "languages": { + "JavaScript": { + "formatter": [ + { + "code_action": "source.fixAll.eslint" + } + ] + }, + "Go": { + "formatter": [ + { + "code_action": "source.organizeImports" + } + ] + } + } + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_code_actions_on_format_migration_in_languages_with_existing_formatter() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "languages": { + "JavaScript": { + "formatter": "prettier", + "code_actions_on_format": { + "source.fixAll.eslint": true, + "source.organizeImports": false + } + } + } + }"# + .unindent(), + Some( + &r#"{ + "languages": { + "JavaScript": { + "formatter": [ + { + "code_action": "source.fixAll.eslint" + }, + "prettier" + ] + } + } + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_code_actions_on_format_migration_mixed_global_and_languages() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "formatter": "prettier", + "code_actions_on_format": { + "source.fixAll": true + }, + "languages": { + "Rust": { + "formatter": "rust-analyzer", + "code_actions_on_format": { + "source.organizeImports": true + } + }, + "Python": { + "code_actions_on_format": { + "source.organizeImports": true, + "source.fixAll": false + } + } + } + }"# + .unindent(), + Some( + &r#"{ + "formatter": [ + { + "code_action": "source.fixAll" + }, + "prettier" + ], + "languages": { + "Rust": { + "formatter": [ + { + "code_action": "source.organizeImports" + }, + "rust-analyzer" + ] + }, + "Python": { + "formatter": [ + { + "code_action": "source.organizeImports" + } + ] + } + } + }"# + .unindent(), + ), + ); + } + + #[test] + fn test_code_actions_on_format_no_migration_when_not_present() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "formatter": ["prettier"] + }"# + .unindent(), + None, + ); + } + + #[test] + fn test_code_actions_on_format_migration_all_false_values() { + assert_migrate_settings_with_migrations( + &[MigrationType::Json( + migrations::m_2025_10_10::remove_code_actions_on_format, + )], + &r#"{ + "code_actions_on_format": { + "a": false, + "b": false + }, + "formatter": "prettier" + }"# + .unindent(), + Some( + &r#"{ + "formatter": "prettier" + }"# + .unindent(), + ), + ); + } } diff --git a/crates/mistral/src/mistral.rs b/crates/mistral/src/mistral.rs index d6f62cfaa07bc211881817e6178a8673a9a670a6..eca4743d0442b9ca169ac966f78af0112565fcbc 100644 --- a/crates/mistral/src/mistral.rs +++ b/crates/mistral/src/mistral.rs @@ -7,6 +7,7 @@ use std::convert::TryFrom; use strum::EnumIter; pub const MISTRAL_API_URL: &str = "https://api.mistral.ai/v1"; +pub const CODESTRAL_API_URL: &str = "https://codestral.mistral.ai"; #[derive(Clone, Copy, Serialize, Deserialize, Debug, Eq, PartialEq)] #[serde(rename_all = "lowercase")] @@ -267,24 +268,6 @@ pub struct FunctionDefinition { pub parameters: Option, } -#[derive(Debug, Serialize, Deserialize)] -pub struct CompletionRequest { - pub model: String, - pub prompt: String, - pub max_tokens: u32, - pub temperature: f32, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub prediction: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub rewrite_speculation: Option, -} - -#[derive(Clone, Deserialize, Serialize, Debug)] -#[serde(tag = "type", rename_all = "snake_case")] -pub enum Prediction { - Content { content: String }, -} - #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum ToolChoice { @@ -397,21 +380,6 @@ pub struct FunctionContent { pub arguments: String, } -#[derive(Serialize, Deserialize, Debug)] -pub struct CompletionChoice { - pub text: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct Response { - pub id: String, - pub object: String, - pub created: u64, - pub model: String, - pub choices: Vec, - pub usage: Usage, -} - #[derive(Serialize, Deserialize, Debug)] pub struct Usage { pub prompt_tokens: u64, @@ -419,13 +387,6 @@ pub struct Usage { pub total_tokens: u64, } -#[derive(Serialize, Deserialize, Debug)] -pub struct Choice { - pub index: u32, - pub message: RequestMessage, - pub finish_reason: Option, -} - #[derive(Serialize, Deserialize, Debug)] pub struct StreamResponse { pub id: String, diff --git a/crates/multi_buffer/src/anchor.rs b/crates/multi_buffer/src/anchor.rs index 6bed0a4028c5c4b0816355a397046560fb6b8618..a2498cb02fb836c6a70af9407d2a4e520c9d3d3b 100644 --- a/crates/multi_buffer/src/anchor.rs +++ b/crates/multi_buffer/src/anchor.rs @@ -16,6 +16,13 @@ pub struct Anchor { } impl Anchor { + pub fn with_diff_base_anchor(self, diff_base_anchor: text::Anchor) -> Self { + Self { + diff_base_anchor: Some(diff_base_anchor), + ..self + } + } + pub fn in_buffer( excerpt_id: ExcerptId, buffer_id: BufferId, diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 5637f9af1a8ec8d3a064b29c4f8a18a6aff074a4..be01c4b6a1f9f67703f99bcd0b9b331574a6b360 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -17,11 +17,11 @@ use gpui::{App, AppContext as _, Context, Entity, EntityId, EventEmitter, Task}; use itertools::Itertools; use language::{ AutoindentMode, Buffer, BufferChunks, BufferRow, BufferSnapshot, Capability, CharClassifier, - CharKind, Chunk, CursorShape, DiagnosticEntry, DiskState, File, IndentSize, Language, - LanguageScope, OffsetRangeExt, OffsetUtf16, Outline, OutlineItem, Point, PointUtf16, Selection, - TextDimension, TextObject, ToOffset as _, ToPoint as _, TransactionId, TreeSitterOptions, - Unclipped, - language_settings::{IndentGuideSettings, LanguageSettings, language_settings}, + CharKind, CharScopeContext, Chunk, CursorShape, DiagnosticEntryRef, DiskState, File, + IndentGuideSettings, IndentSize, Language, LanguageScope, OffsetRangeExt, OffsetUtf16, Outline, + OutlineItem, Point, PointUtf16, Selection, TextDimension, TextObject, ToOffset as _, + ToPoint as _, TransactionId, TreeSitterOptions, Unclipped, + language_settings::{LanguageSettings, language_settings}, }; use rope::DimensionPair; @@ -37,7 +37,6 @@ use std::{ iter::{self, FromIterator}, mem, ops::{Range, RangeBounds, Sub}, - path::{Path, PathBuf}, rc::Rc, str, sync::Arc, @@ -50,12 +49,12 @@ use text::{ subscription::{Subscription, Topic}, }; use theme::SyntaxTheme; -use util::post_inc; +use util::{post_inc, rel_path::RelPath}; const NEWLINES: &[u8] = &[b'\n'; u8::MAX as usize]; #[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)] -pub struct ExcerptId(usize); +pub struct ExcerptId(u32); /// One or more [`Buffers`](Buffer) being edited in a single view. /// @@ -80,12 +79,6 @@ pub struct MultiBuffer { buffer_changed_since_sync: Rc>, } -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum MultiOrSingleBufferOffsetRange { - Single(Range), - Multi(Range), -} - #[derive(Clone, Debug, PartialEq, Eq)] pub enum Event { ExcerptsAdded { @@ -168,24 +161,34 @@ impl MultiBufferDiffHunk { #[derive(PartialEq, Eq, Ord, PartialOrd, Clone, Hash, Debug)] pub struct PathKey { - namespace: u32, - path: Arc, + // Used by the derived PartialOrd & Ord + sort_prefix: Option, + path: Arc, } impl PathKey { - pub fn namespaced(namespace: u32, path: Arc) -> Self { - Self { namespace, path } + pub fn with_sort_prefix(sort_prefix: u64, path: Arc) -> Self { + Self { + sort_prefix: Some(sort_prefix), + path, + } } pub fn for_buffer(buffer: &Entity, cx: &App) -> Self { if let Some(file) = buffer.read(cx).file() { - Self::namespaced(1, Arc::from(file.full_path(cx))) + Self::with_sort_prefix(file.worktree_id(cx).to_proto(), file.path().clone()) } else { - Self::namespaced(0, Arc::from(PathBuf::from(buffer.entity_id().to_string()))) + Self { + sort_prefix: None, + path: RelPath::unix(&buffer.entity_id().to_string()) + .unwrap() + .into_arc(), + } } } - pub fn path(&self) -> &Arc { + #[cfg(any(test, feature = "test-support"))] + pub fn path(&self) -> &Arc { &self.path } } @@ -412,7 +415,7 @@ struct Excerpt { #[derive(Clone)] pub struct MultiBufferExcerpt<'a> { excerpt: &'a Excerpt, - diff_transforms: sum_tree::Cursor<'a, DiffTransform, DiffTransforms>, + diff_transforms: sum_tree::Cursor<'a, 'static, DiffTransform, DiffTransforms>, offset: usize, excerpt_offset: ExcerptDimension, buffer_offset: usize, @@ -468,8 +471,8 @@ pub struct MultiBufferRows<'a> { } pub struct MultiBufferChunks<'a> { - excerpts: Cursor<'a, Excerpt, ExcerptOffset>, - diff_transforms: Cursor<'a, DiffTransform, Dimensions>, + excerpts: Cursor<'a, 'static, Excerpt, ExcerptOffset>, + diff_transforms: Cursor<'a, 'static, DiffTransform, Dimensions>, diffs: &'a TreeMap, diff_base_chunks: Option<(BufferId, BufferChunks<'a>)>, buffer_chunk: Option>, @@ -507,7 +510,7 @@ struct DiffTransforms { } impl<'a, D: TextDimension> Dimension<'a, DiffTransformSummary> for DiffTransforms { - fn zero(cx: &::Context) -> Self { + fn zero(cx: ::Context<'_>) -> Self { Self { output_dimension: OutputDimension::zero(cx), excerpt_dimension: as Dimension<'a, DiffTransformSummary>>::zero( @@ -519,7 +522,7 @@ impl<'a, D: TextDimension> Dimension<'a, DiffTransformSummary> for DiffTransform fn add_summary( &mut self, summary: &'a DiffTransformSummary, - cx: &::Context, + cx: ::Context<'_>, ) { self.output_dimension.add_summary(summary, cx); self.excerpt_dimension.add_summary(summary, cx); @@ -528,8 +531,8 @@ impl<'a, D: TextDimension> Dimension<'a, DiffTransformSummary> for DiffTransform #[derive(Clone)] struct MultiBufferCursor<'a, D: TextDimension> { - excerpts: Cursor<'a, Excerpt, ExcerptDimension>, - diff_transforms: Cursor<'a, DiffTransform, DiffTransforms>, + excerpts: Cursor<'a, 'static, Excerpt, ExcerptDimension>, + diff_transforms: Cursor<'a, 'static, DiffTransform, DiffTransforms>, diffs: &'a TreeMap, cached_region: Option>, } @@ -1196,7 +1199,7 @@ impl MultiBuffer { let mut ranges = Vec::new(); let snapshot = self.read(cx); let buffers = self.buffers.borrow(); - let mut cursor = snapshot.excerpts.cursor::(&()); + let mut cursor = snapshot.excerpts.cursor::(()); for (buffer_id, buffer_transaction) in &transaction.buffer_transactions { let Some(buffer_state) = buffers.get(buffer_id) else { @@ -1311,17 +1314,15 @@ impl MultiBuffer { let mut selections_by_buffer: HashMap>> = Default::default(); let snapshot = self.read(cx); - let mut cursor = snapshot.excerpts.cursor::>(&()); + let mut cursor = snapshot.excerpts.cursor::>(()); for selection in selections { let start_locator = snapshot.excerpt_locator_for_id(selection.start.excerpt_id); let end_locator = snapshot.excerpt_locator_for_id(selection.end.excerpt_id); cursor.seek(&Some(start_locator), Bias::Left); - while let Some(excerpt) = cursor.item() { - if excerpt.locator > *end_locator { - break; - } - + while let Some(excerpt) = cursor.item() + && excerpt.locator <= *end_locator + { let mut start = excerpt.range.context.start; let mut end = excerpt.range.context.end; if excerpt.id == selection.start.excerpt_id { @@ -1762,7 +1763,7 @@ impl MultiBuffer { let mut next_excerpt_id = move || ExcerptId(post_inc(&mut next_excerpt_id)); - let mut excerpts_cursor = snapshot.excerpts.cursor::>(&()); + let mut excerpts_cursor = snapshot.excerpts.cursor::>(()); excerpts_cursor.next(); loop { @@ -1963,7 +1964,7 @@ impl MultiBuffer { let mut prev_locator = snapshot.excerpt_locator_for_id(prev_excerpt_id).clone(); let mut new_excerpt_ids = mem::take(&mut snapshot.excerpt_ids); - let mut cursor = snapshot.excerpts.cursor::>(&()); + let mut cursor = snapshot.excerpts.cursor::>(()); let mut new_excerpts = cursor.slice(&prev_locator, Bias::Right); prev_locator = cursor.start().unwrap_or(Locator::min_ref()).clone(); @@ -1972,7 +1973,7 @@ impl MultiBuffer { |excerpt| { excerpt.has_trailing_newline = true; }, - &(), + (), ); let next_locator = if let Some(excerpt) = cursor.item() { @@ -2002,20 +2003,20 @@ impl MultiBuffer { range, ranges.peek().is_some() || cursor.item().is_some(), ); - new_excerpts.push(excerpt, &()); + new_excerpts.push(excerpt, ()); prev_locator = locator.clone(); if let Some(last_mapping_entry) = new_excerpt_ids.last() { assert!(id > last_mapping_entry.id, "excerpt ids must be increasing"); } - new_excerpt_ids.push(ExcerptIdMapping { id, locator }, &()); + new_excerpt_ids.push(ExcerptIdMapping { id, locator }, ()); } let edit_end = ExcerptOffset::new(new_excerpts.summary().text.len); let suffix = cursor.suffix(); let changed_trailing_excerpt = suffix.is_empty(); - new_excerpts.append(suffix, &()); + new_excerpts.append(suffix, ()); drop(cursor); snapshot.excerpts = new_excerpts; snapshot.excerpt_ids = new_excerpt_ids; @@ -2091,7 +2092,7 @@ impl MultiBuffer { let mut excerpts = Vec::new(); let snapshot = self.read(cx); let buffers = self.buffers.borrow(); - let mut cursor = snapshot.excerpts.cursor::>(&()); + let mut cursor = snapshot.excerpts.cursor::>(()); if let Some(locators) = buffers.get(&buffer_id).map(|state| &state.excerpts) { for locator in locators { cursor.seek_forward(&Some(locator), Bias::Left); @@ -2111,10 +2112,10 @@ impl MultiBuffer { let buffers = self.buffers.borrow(); let mut excerpts = snapshot .excerpts - .cursor::, ExcerptDimension>>(&()); + .cursor::, ExcerptDimension>>(()); let mut diff_transforms = snapshot .diff_transforms - .cursor::, OutputDimension>>(&()); + .cursor::, OutputDimension>>(()); diff_transforms.next(); let locators = buffers .get(&buffer_id) @@ -2280,7 +2281,7 @@ impl MultiBuffer { let mut new_excerpts = SumTree::default(); let mut cursor = snapshot .excerpts - .cursor::, ExcerptOffset>>(&()); + .cursor::, ExcerptOffset>>(()); let mut edits = Vec::new(); let mut excerpt_ids = ids.iter().copied().peekable(); let mut removed_buffer_ids = Vec::new(); @@ -2289,7 +2290,7 @@ impl MultiBuffer { self.paths_by_excerpt.remove(&excerpt_id); // Seek to the next excerpt to remove, preserving any preceding excerpts. let locator = snapshot.excerpt_locator_for_id(excerpt_id); - new_excerpts.append(cursor.slice(&Some(locator), Bias::Left), &()); + new_excerpts.append(cursor.slice(&Some(locator), Bias::Left), ()); if let Some(mut excerpt) = cursor.item() { if excerpt.id != excerpt_id { @@ -2331,7 +2332,7 @@ impl MultiBuffer { // the previous excerpt. if cursor.item().is_none() && old_start.value > 0 { old_start.value -= 1; - new_excerpts.update_last(|e| e.has_trailing_newline = false, &()); + new_excerpts.update_last(|e| e.has_trailing_newline = false, ()); } // Push an edit for the removal of this run of excerpts. @@ -2345,7 +2346,7 @@ impl MultiBuffer { } let suffix = cursor.suffix(); let changed_trailing_excerpt = suffix.is_empty(); - new_excerpts.append(suffix, &()); + new_excerpts.append(suffix, ()); drop(cursor); snapshot.excerpts = new_excerpts; for buffer_id in &removed_buffer_ids { @@ -2487,7 +2488,7 @@ impl MultiBuffer { for locator in &buffer_state.excerpts { let mut cursor = snapshot .excerpts - .cursor::, ExcerptOffset>>(&()); + .cursor::, ExcerptOffset>>(()); cursor.seek_forward(&Some(locator), Bias::Left); if let Some(excerpt) = cursor.item() && excerpt.locator == *locator @@ -2603,7 +2604,7 @@ impl MultiBuffer { let buffer = buffer.read(cx); if let Some(file) = buffer.file() { - return file.file_name(cx).to_string_lossy(); + return file.file_name(cx).into(); } if let Some(title) = self.buffer_content_title(buffer) { @@ -2721,7 +2722,7 @@ impl MultiBuffer { pub fn single_hunk_is_expanded(&self, range: Range, cx: &App) -> bool { let snapshot = self.read(cx); - let mut cursor = snapshot.diff_transforms.cursor::(&()); + let mut cursor = snapshot.diff_transforms.cursor::(()); let offset_range = range.to_offset(&snapshot); cursor.seek(&offset_range.start, Bias::Left); while let Some(item) = cursor.item() { @@ -2738,7 +2739,7 @@ impl MultiBuffer { pub fn has_expanded_diff_hunks_in_ranges(&self, ranges: &[Range], cx: &App) -> bool { let snapshot = self.read(cx); - let mut cursor = snapshot.diff_transforms.cursor::(&()); + let mut cursor = snapshot.diff_transforms.cursor::(()); for range in ranges { let range = range.to_point(&snapshot); let start = snapshot.point_to_offset(Point::new(range.start.row, 0)); @@ -2844,11 +2845,11 @@ impl MultiBuffer { let mut new_excerpts = SumTree::default(); let mut cursor = snapshot .excerpts - .cursor::, ExcerptOffset>>(&()); + .cursor::, ExcerptOffset>>(()); let mut edits = Vec::>::new(); let prefix = cursor.slice(&Some(locator), Bias::Left); - new_excerpts.append(prefix, &()); + new_excerpts.append(prefix, ()); let mut excerpt = cursor.item().unwrap().clone(); let old_text_len = ExcerptOffset::new(excerpt.text_summary.len); @@ -2880,11 +2881,11 @@ impl MultiBuffer { edits.push(edit); } - new_excerpts.push(excerpt, &()); + new_excerpts.push(excerpt, ()); cursor.next(); - new_excerpts.append(cursor.suffix(), &()); + new_excerpts.append(cursor.suffix(), ()); drop(cursor); snapshot.excerpts = new_excerpts; @@ -2920,12 +2921,12 @@ impl MultiBuffer { let mut new_excerpts = SumTree::default(); let mut cursor = snapshot .excerpts - .cursor::, ExcerptOffset>>(&()); + .cursor::, ExcerptOffset>>(()); let mut edits = Vec::>::new(); for locator in &locators { let prefix = cursor.slice(&Some(locator), Bias::Left); - new_excerpts.append(prefix, &()); + new_excerpts.append(prefix, ()); let mut excerpt = cursor.item().unwrap().clone(); let old_text_len = ExcerptOffset::new(excerpt.text_summary.len); @@ -2984,12 +2985,12 @@ impl MultiBuffer { edits.push(edit); } - new_excerpts.push(excerpt, &()); + new_excerpts.push(excerpt, ()); cursor.next(); } - new_excerpts.append(cursor.suffix(), &()); + new_excerpts.append(cursor.suffix(), ()); drop(cursor); snapshot.excerpts = new_excerpts; @@ -3066,10 +3067,10 @@ impl MultiBuffer { let mut new_excerpts = SumTree::default(); let mut cursor = snapshot .excerpts - .cursor::, ExcerptOffset>>(&()); + .cursor::, ExcerptOffset>>(()); for (locator, buffer, buffer_edited) in excerpts_to_edit { - new_excerpts.append(cursor.slice(&Some(locator), Bias::Left), &()); + new_excerpts.append(cursor.slice(&Some(locator), Bias::Left), ()); let old_excerpt = cursor.item().unwrap(); let buffer = buffer.read(cx); let buffer_id = buffer.remote_id(); @@ -3110,10 +3111,10 @@ impl MultiBuffer { new_excerpt.buffer = buffer.snapshot(); } - new_excerpts.push(new_excerpt, &()); + new_excerpts.push(new_excerpt, ()); cursor.next(); } - new_excerpts.append(cursor.suffix(), &()); + new_excerpts.append(cursor.suffix(), ()); drop(cursor); snapshot.excerpts = new_excerpts; @@ -3131,10 +3132,10 @@ impl MultiBuffer { return; } - let mut excerpts = snapshot.excerpts.cursor::(&()); + let mut excerpts = snapshot.excerpts.cursor::(()); let mut old_diff_transforms = snapshot .diff_transforms - .cursor::>(&()); + .cursor::>(()); let mut new_diff_transforms = SumTree::default(); let mut old_expanded_hunks = HashSet::default(); let mut output_edits = Vec::new(); @@ -3241,7 +3242,7 @@ impl MultiBuffer { summary: Default::default(), inserted_hunk_info: None, }, - &(), + (), ); } @@ -3399,7 +3400,7 @@ impl MultiBuffer { hunk_info, has_trailing_newline, }, - &(), + (), ); } @@ -3436,13 +3437,13 @@ impl MultiBuffer { *summary, ) { - let mut cursor = subtree.cursor::<()>(&()); + let mut cursor = subtree.cursor::<()>(()); cursor.next(); cursor.next(); - new_transforms.append(cursor.suffix(), &()); + new_transforms.append(cursor.suffix(), ()); return; } - new_transforms.append(subtree, &()); + new_transforms.append(subtree, ()); } fn push_diff_transform( @@ -3462,7 +3463,7 @@ impl MultiBuffer { { return; } - new_transforms.push(transform, &()); + new_transforms.push(transform, ()); } fn push_buffer_content_transform( @@ -3496,7 +3497,7 @@ impl MultiBuffer { summary: summary_to_add, inserted_hunk_info, }, - &(), + (), ) } } @@ -3521,7 +3522,7 @@ impl MultiBuffer { did_extend = true; } }, - &(), + (), ); did_extend } @@ -4033,7 +4034,7 @@ impl MultiBufferSnapshot { cursor.seek(&query_range.start); if let Some(region) = cursor.region().filter(|region| !region.is_main_buffer) - && region.range.start > D::zero(&()) + && region.range.start > D::zero(()) { cursor.prev() } @@ -4204,11 +4205,15 @@ impl MultiBufferSnapshot { self.diffs.values().any(|diff| !diff.is_empty()) } - pub fn is_inside_word(&self, position: T, for_completion: bool) -> bool { + pub fn is_inside_word( + &self, + position: T, + scope_context: Option, + ) -> bool { let position = position.to_offset(self); let classifier = self .char_classifier_at(position) - .for_completion(for_completion); + .scope_context(scope_context); let next_char_kind = self.chars_at(position).next().map(|c| classifier.kind(c)); let prev_char_kind = self .reversed_chars_at(position) @@ -4220,16 +4225,14 @@ impl MultiBufferSnapshot { pub fn surrounding_word( &self, start: T, - for_completion: bool, + scope_context: Option, ) -> (Range, Option) { let mut start = start.to_offset(self); let mut end = start; let mut next_chars = self.chars_at(start).peekable(); let mut prev_chars = self.reversed_chars_at(start).peekable(); - let classifier = self - .char_classifier_at(start) - .for_completion(for_completion); + let classifier = self.char_classifier_at(start).scope_context(scope_context); let word_kind = cmp::max( prev_chars.peek().copied().map(|c| classifier.kind(c)), @@ -4258,12 +4261,10 @@ impl MultiBufferSnapshot { pub fn char_kind_before( &self, start: T, - for_completion: bool, + scope_context: Option, ) -> Option { let start = start.to_offset(self); - let classifier = self - .char_classifier_at(start) - .for_completion(for_completion); + let classifier = self.char_classifier_at(start).scope_context(scope_context); self.reversed_chars_at(start) .next() .map(|ch| classifier.kind(ch)) @@ -4368,8 +4369,8 @@ impl MultiBufferSnapshot { let mut chunks = MultiBufferChunks { excerpt_offset_range: ExcerptOffset::new(0)..ExcerptOffset::new(0), range: 0..0, - excerpts: self.excerpts.cursor(&()), - diff_transforms: self.diff_transforms.cursor(&()), + excerpts: self.excerpts.cursor(()), + diff_transforms: self.diff_transforms.cursor(()), diffs: &self.diffs, diff_base_chunks: None, excerpt_chunks: None, @@ -4706,7 +4707,7 @@ impl MultiBufferSnapshot { let range = range.start.to_offset(self)..range.end.to_offset(self); let mut cursor = self .diff_transforms - .cursor::>(&()); + .cursor::>(()); cursor.seek(&range.start, Bias::Right); let Some(first_transform) = cursor.item() else { @@ -4800,9 +4801,8 @@ impl MultiBufferSnapshot { where D: TextDimension, { - // let mut range = range.start..range.end; - let mut summary = D::zero(&()); - let mut cursor = self.excerpts.cursor::(&()); + let mut summary = D::zero(()); + let mut cursor = self.excerpts.cursor::(()); cursor.seek(&range.start, Bias::Right); if let Some(excerpt) = cursor.item() { let mut end_before_newline = cursor.end(); @@ -4920,17 +4920,17 @@ impl MultiBufferSnapshot { fn excerpt_offset_for_anchor(&self, anchor: &Anchor) -> ExcerptOffset { let mut cursor = self .excerpts - .cursor::, ExcerptOffset>>(&()); + .cursor::, ExcerptOffset>>(()); let locator = self.excerpt_locator_for_id(anchor.excerpt_id); cursor.seek(&Some(locator), Bias::Left); - if cursor.item().is_none() { - cursor.next(); + if cursor.item().is_none() && anchor.excerpt_id == ExcerptId::max() { + cursor.prev(); } let mut position = cursor.start().1; if let Some(excerpt) = cursor.item() - && excerpt.id == anchor.excerpt_id + && (excerpt.id == anchor.excerpt_id || anchor.excerpt_id == ExcerptId::max()) { let excerpt_buffer_start = excerpt .buffer @@ -4960,33 +4960,29 @@ impl MultiBufferSnapshot { I: 'a + IntoIterator, { let mut anchors = anchors.into_iter().peekable(); - let mut cursor = self.excerpts.cursor::(&()); + let mut cursor = self.excerpts.cursor::(()); let mut diff_transforms_cursor = self .diff_transforms - .cursor::, OutputDimension>>(&()); + .cursor::, OutputDimension>>(()); diff_transforms_cursor.next(); let mut summaries = Vec::new(); while let Some(anchor) = anchors.peek() { let excerpt_id = self.latest_excerpt_id(anchor.excerpt_id); - let excerpt_anchors = iter::from_fn(|| { - let anchor = anchors.peek()?; - if self.latest_excerpt_id(anchor.excerpt_id) == excerpt_id { - Some(anchors.next().unwrap()) - } else { - None - } + + let excerpt_anchors = anchors.peeking_take_while(|anchor| { + self.latest_excerpt_id(anchor.excerpt_id) == excerpt_id }); let locator = self.excerpt_locator_for_id(excerpt_id); cursor.seek_forward(locator, Bias::Left); - if cursor.item().is_none() { - cursor.next(); + if cursor.item().is_none() && excerpt_id == ExcerptId::max() { + cursor.prev(); } let excerpt_start_position = D::from_text_summary(&cursor.start().text); if let Some(excerpt) = cursor.item() { - if excerpt.id != excerpt_id { + if excerpt.id != excerpt_id && excerpt_id != ExcerptId::max() { let position = self.resolve_summary_for_anchor( &Anchor::min(), excerpt_start_position, @@ -5081,7 +5077,7 @@ impl MultiBufferSnapshot { I: 'a + IntoIterator, { let mut anchors = anchors.into_iter().enumerate().peekable(); - let mut cursor = self.excerpts.cursor::>(&()); + let mut cursor = self.excerpts.cursor::>(()); cursor.next(); let mut result = Vec::new(); @@ -5093,20 +5089,14 @@ impl MultiBufferSnapshot { let old_locator = self.excerpt_locator_for_id(old_excerpt_id); cursor.seek_forward(&Some(old_locator), Bias::Left); - if cursor.item().is_none() { - cursor.next(); - } - let next_excerpt = cursor.item(); let prev_excerpt = cursor.prev_item(); // Process all of the anchors for this excerpt. - while let Some((_, anchor)) = anchors.peek() { - if anchor.excerpt_id != old_excerpt_id { - break; - } - let (anchor_ix, anchor) = anchors.next().unwrap(); - let mut anchor = *anchor; + while let Some((anchor_ix, &anchor)) = + anchors.next_if(|(_, anchor)| anchor.excerpt_id == old_excerpt_id) + { + let mut anchor = anchor; // Leave min and max anchors unchanged if invalid or // if the old excerpt still exists at this location @@ -5142,12 +5132,7 @@ impl MultiBufferSnapshot { { text_anchor = excerpt.range.context.end; } - Anchor { - buffer_id: Some(excerpt.buffer_id), - excerpt_id: excerpt.id, - text_anchor, - diff_base_anchor: None, - } + Anchor::in_buffer(excerpt.id, excerpt.buffer_id, text_anchor) } else if let Some(excerpt) = prev_excerpt { let mut text_anchor = excerpt .range @@ -5160,12 +5145,7 @@ impl MultiBufferSnapshot { { text_anchor = excerpt.range.context.start; } - Anchor { - buffer_id: Some(excerpt.buffer_id), - excerpt_id: excerpt.id, - text_anchor, - diff_base_anchor: None, - } + Anchor::in_buffer(excerpt.id, excerpt.buffer_id, text_anchor) } else if anchor.text_anchor.bias == Bias::Left { Anchor::min() } else { @@ -5195,7 +5175,7 @@ impl MultiBufferSnapshot { // offset in the excerpts, and whether the position is within a deleted hunk. let mut diff_transforms = self .diff_transforms - .cursor::>(&()); + .cursor::>(()); diff_transforms.seek(&offset, Bias::Right); if offset == diff_transforms.start().0 @@ -5232,7 +5212,7 @@ impl MultiBufferSnapshot { let mut excerpts = self .excerpts - .cursor::>>(&()); + .cursor::>>(()); excerpts.seek(&excerpt_offset, Bias::Right); if excerpts.item().is_none() && excerpt_offset == excerpts.start().0 && bias == Bias::Left { excerpts.prev(); @@ -5247,23 +5227,15 @@ impl MultiBufferSnapshot { let buffer_start = excerpt.range.context.start.to_offset(&excerpt.buffer); let text_anchor = excerpt.clip_anchor(excerpt.buffer.anchor_at(buffer_start + overshoot, bias)); - Anchor { - buffer_id: Some(excerpt.buffer_id), - excerpt_id: excerpt.id, - text_anchor, - diff_base_anchor, + let anchor = Anchor::in_buffer(excerpt.id, excerpt.buffer_id, text_anchor); + match diff_base_anchor { + Some(diff_base_anchor) => anchor.with_diff_base_anchor(diff_base_anchor), + None => anchor, } + } else if excerpt_offset.is_zero() && bias == Bias::Left { + Anchor::min() } else { - let mut anchor = if excerpt_offset.is_zero() && bias == Bias::Left { - Anchor::min() - } else { - Anchor::max() - }; - // TODO this is a hack, remove it - if let Some((excerpt_id, _, _)) = self.as_singleton() { - anchor.excerpt_id = *excerpt_id; - } - anchor + Anchor::max() } } @@ -5275,22 +5247,12 @@ impl MultiBufferSnapshot { text_anchor: text::Anchor, ) -> Option { let excerpt_id = self.latest_excerpt_id(excerpt_id); - let locator = self.excerpt_locator_for_id(excerpt_id); - let mut cursor = self.excerpts.cursor::>(&()); - cursor.seek(locator, Bias::Left); - if let Some(excerpt) = cursor.item() - && excerpt.id == excerpt_id - { - let text_anchor = excerpt.clip_anchor(text_anchor); - drop(cursor); - return Some(Anchor { - buffer_id: Some(excerpt.buffer_id), - excerpt_id, - text_anchor, - diff_base_anchor: None, - }); - } - None + let excerpt = self.excerpt(excerpt_id)?; + Some(Anchor::in_buffer( + excerpt_id, + excerpt.buffer_id, + text_anchor, + )) } pub fn context_range_for_excerpt(&self, excerpt_id: ExcerptId) -> Option> { @@ -5316,8 +5278,8 @@ impl MultiBufferSnapshot { } fn cursor(&self) -> MultiBufferCursor<'_, D> { - let excerpts = self.excerpts.cursor(&()); - let diff_transforms = self.diff_transforms.cursor(&()); + let excerpts = self.excerpts.cursor(()); + let diff_transforms = self.diff_transforms.cursor(()); MultiBufferCursor { excerpts, diff_transforms, @@ -5326,15 +5288,15 @@ impl MultiBufferSnapshot { } } - pub fn excerpt_before(&self, id: ExcerptId) -> Option> { - let start_locator = self.excerpt_locator_for_id(id); + pub fn excerpt_before(&self, excerpt_id: ExcerptId) -> Option> { + let start_locator = self.excerpt_locator_for_id(excerpt_id); let mut excerpts = self .excerpts - .cursor::, ExcerptDimension>>(&()); + .cursor::, ExcerptDimension>>(()); excerpts.seek(&Some(start_locator), Bias::Left); excerpts.prev(); - let mut diff_transforms = self.diff_transforms.cursor::>(&()); + let mut diff_transforms = self.diff_transforms.cursor::>(()); diff_transforms.seek(&excerpts.start().1, Bias::Left); if diff_transforms.end().excerpt_dimension < excerpts.start().1 { diff_transforms.next(); @@ -5913,7 +5875,7 @@ impl MultiBufferSnapshot { end_row: last_row, depth: next_depth, tab_size, - settings: settings.indent_guides, + settings: settings.indent_guides.clone(), }); } } @@ -6013,7 +5975,7 @@ impl MultiBufferSnapshot { &self, buffer_id: BufferId, group_id: usize, - ) -> impl Iterator> + '_ { + ) -> impl Iterator> + '_ { self.lift_buffer_metadata(Point::zero()..self.max_point(), move |buffer, range| { if buffer.remote_id() != buffer_id { return None; @@ -6022,16 +5984,16 @@ impl MultiBufferSnapshot { buffer .diagnostics_in_range(range, false) .filter(move |diagnostic| diagnostic.diagnostic.group_id == group_id) - .map(move |DiagnosticEntry { diagnostic, range }| (range, diagnostic)), + .map(move |DiagnosticEntryRef { diagnostic, range }| (range, diagnostic)), ) }) - .map(|(range, diagnostic, _)| DiagnosticEntry { diagnostic, range }) + .map(|(range, diagnostic, _)| DiagnosticEntryRef { diagnostic, range }) } pub fn diagnostics_in_range<'a, T>( &'a self, range: Range, - ) -> impl Iterator> + 'a + ) -> impl Iterator> + 'a where T: 'a + text::ToOffset @@ -6048,13 +6010,13 @@ impl MultiBufferSnapshot { .map(|entry| (entry.range, entry.diagnostic)), ) }) - .map(|(range, diagnostic, _)| DiagnosticEntry { diagnostic, range }) + .map(|(range, diagnostic, _)| DiagnosticEntryRef { diagnostic, range }) } pub fn diagnostics_with_buffer_ids_in_range<'a, T>( &'a self, range: Range, - ) -> impl Iterator)> + 'a + ) -> impl Iterator)> + 'a where T: 'a + text::ToOffset @@ -6071,25 +6033,23 @@ impl MultiBufferSnapshot { .map(|entry| (entry.range, entry.diagnostic)), ) }) - .map(|(range, diagnostic, b)| (b.buffer_id, DiagnosticEntry { diagnostic, range })) + .map(|(range, diagnostic, b)| (b.buffer_id, DiagnosticEntryRef { diagnostic, range })) } pub fn syntax_ancestor( &self, range: Range, - ) -> Option<(tree_sitter::Node<'_>, MultiOrSingleBufferOffsetRange)> { + ) -> Option<(tree_sitter::Node<'_>, Range)> { let range = range.start.to_offset(self)..range.end.to_offset(self); let mut excerpt = self.excerpt_containing(range.clone())?; let node = excerpt .buffer() .syntax_ancestor(excerpt.map_range_to_buffer(range))?; let node_range = node.byte_range(); - let range = if excerpt.contains_buffer_range(node_range.clone()) { - MultiOrSingleBufferOffsetRange::Multi(excerpt.map_range_from_buffer(node_range)) - } else { - MultiOrSingleBufferOffsetRange::Single(node_range) + if !excerpt.contains_buffer_range(node_range.clone()) { + return None; }; - Some((node, range)) + Some((node, excerpt.map_range_from_buffer(node_range))) } pub fn syntax_next_sibling( @@ -6155,8 +6115,9 @@ impl MultiBufferSnapshot { let anchor = self.anchor_before(offset); let excerpt_id = anchor.excerpt_id; let excerpt = self.excerpt(excerpt_id)?; + let buffer_id = excerpt.buffer_id; Some(( - excerpt.buffer_id, + buffer_id, excerpt .buffer .symbols_containing(anchor.text_anchor, theme) @@ -6164,22 +6125,15 @@ impl MultiBufferSnapshot { .flat_map(|item| { Some(OutlineItem { depth: item.depth, - range: self.anchor_in_excerpt(excerpt_id, item.range.start)? - ..self.anchor_in_excerpt(excerpt_id, item.range.end)?, + range: Anchor::range_in_buffer(excerpt_id, buffer_id, item.range), text: item.text, highlight_ranges: item.highlight_ranges, name_ranges: item.name_ranges, - body_range: item.body_range.and_then(|body_range| { - Some( - self.anchor_in_excerpt(excerpt_id, body_range.start)? - ..self.anchor_in_excerpt(excerpt_id, body_range.end)?, - ) + body_range: item.body_range.map(|body_range| { + Anchor::range_in_buffer(excerpt_id, buffer_id, body_range) }), - annotation_range: item.annotation_range.and_then(|body_range| { - Some( - self.anchor_in_excerpt(excerpt_id, body_range.start)? - ..self.anchor_in_excerpt(excerpt_id, body_range.end)?, - ) + annotation_range: item.annotation_range.map(|body_range| { + Anchor::range_in_buffer(excerpt_id, buffer_id, body_range) }), }) }) @@ -6193,7 +6147,7 @@ impl MultiBufferSnapshot { } else if id == ExcerptId::max() { Locator::max_ref() } else { - let mut cursor = self.excerpt_ids.cursor::(&()); + let mut cursor = self.excerpt_ids.cursor::(()); cursor.seek(&id, Bias::Left); if let Some(entry) = cursor.item() && entry.id == id @@ -6228,7 +6182,7 @@ impl MultiBufferSnapshot { } } - let mut cursor = self.excerpt_ids.cursor::(&()); + let mut cursor = self.excerpt_ids.cursor::(()); for id in sorted_ids { if cursor.seek_forward(&id, Bias::Left) { locators.push(cursor.item().unwrap().locator.clone()); @@ -6252,14 +6206,21 @@ impl MultiBufferSnapshot { pub fn range_for_excerpt(&self, excerpt_id: ExcerptId) -> Option> { let mut cursor = self .excerpts - .cursor::, ExcerptDimension>>(&()); + .cursor::, ExcerptDimension>>(()); let locator = self.excerpt_locator_for_id(excerpt_id); - if cursor.seek(&Some(locator), Bias::Left) { + let mut sought_exact = cursor.seek(&Some(locator), Bias::Left); + if cursor.item().is_none() && excerpt_id == ExcerptId::max() { + sought_exact = true; + cursor.prev(); + } else if excerpt_id == ExcerptId::min() { + sought_exact = true; + } + if sought_exact { let start = cursor.start().1.clone(); let end = cursor.end().1; let mut diff_transforms = self .diff_transforms - .cursor::, OutputDimension>>(&()); + .cursor::, OutputDimension>>(()); diff_transforms.seek(&start, Bias::Left); let overshoot = start.0 - diff_transforms.start().0.0; let start = diff_transforms.start().1.0 + overshoot; @@ -6272,25 +6233,17 @@ impl MultiBufferSnapshot { } } - pub fn buffer_range_for_excerpt(&self, excerpt_id: ExcerptId) -> Option> { - let mut cursor = self.excerpts.cursor::>(&()); - let locator = self.excerpt_locator_for_id(excerpt_id); - if cursor.seek(&Some(locator), Bias::Left) - && let Some(excerpt) = cursor.item() - { - return Some(excerpt.range.context.clone()); - } - None - } - fn excerpt(&self, excerpt_id: ExcerptId) -> Option<&Excerpt> { - let mut cursor = self.excerpts.cursor::>(&()); + let mut cursor = self.excerpts.cursor::>(()); let locator = self.excerpt_locator_for_id(excerpt_id); cursor.seek(&Some(locator), Bias::Left); if let Some(excerpt) = cursor.item() && excerpt.id == excerpt_id { return Some(excerpt); + } else if cursor.item().is_none() && excerpt_id == ExcerptId::max() { + cursor.prev(); + return cursor.item(); } None } @@ -6339,7 +6292,7 @@ impl MultiBufferSnapshot { range: &'a Range, include_local: bool, ) -> impl 'a + Iterator)> { - let mut cursor = self.excerpts.cursor::(&()); + let mut cursor = self.excerpts.cursor::(()); let start_locator = self.excerpt_locator_for_id(range.start.excerpt_id); let end_locator = self.excerpt_locator_for_id(range.end.excerpt_id); cursor.seek(start_locator, Bias::Left); @@ -6359,18 +6312,10 @@ impl MultiBufferSnapshot { .selections_in_range(query_range, include_local) .flat_map(move |(replica_id, line_mode, cursor_shape, selections)| { selections.map(move |selection| { - let mut start = Anchor { - buffer_id: Some(excerpt.buffer_id), - excerpt_id: excerpt.id, - text_anchor: selection.start, - diff_base_anchor: None, - }; - let mut end = Anchor { - buffer_id: Some(excerpt.buffer_id), - excerpt_id: excerpt.id, - text_anchor: selection.end, - diff_base_anchor: None, - }; + let mut start = + Anchor::in_buffer(excerpt.id, excerpt.buffer_id, selection.start); + let mut end = + Anchor::in_buffer(excerpt.id, excerpt.buffer_id, selection.end); if range.start.cmp(&start, self).is_gt() { start = range.start; } @@ -6402,6 +6347,56 @@ impl MultiBufferSnapshot { pub fn diff_for_buffer_id(&self, buffer_id: BufferId) -> Option<&BufferDiffSnapshot> { self.diffs.get(&buffer_id) } + + /// Visually annotates a position or range with the `Debug` representation of a value. The + /// callsite of this function is used as a key - previous annotations will be removed. + #[cfg(debug_assertions)] + #[track_caller] + pub fn debug(&self, ranges: &R, value: V) + where + R: debug::ToMultiBufferDebugRanges, + V: std::fmt::Debug, + { + self.debug_with_key(std::panic::Location::caller(), ranges, value); + } + + /// Visually annotates a position or range with the `Debug` representation of a value. Previous + /// debug annotations with the same key will be removed. The key is also used to determine the + /// annotation's color. + #[cfg(debug_assertions)] + #[track_caller] + pub fn debug_with_key(&self, key: &K, ranges: &R, value: V) + where + K: std::hash::Hash + 'static, + R: debug::ToMultiBufferDebugRanges, + V: std::fmt::Debug, + { + let text_ranges = ranges + .to_multi_buffer_debug_ranges(self) + .into_iter() + .flat_map(|range| { + self.range_to_buffer_ranges(range).into_iter().map( + |(buffer, range, _excerpt_id)| { + buffer.anchor_after(range.start)..buffer.anchor_before(range.end) + }, + ) + }) + .collect(); + text::debug::GlobalDebugRanges::with_locked(|debug_ranges| { + debug_ranges.insert(key, text_ranges, format!("{value:?}").into()) + }); + } + + // used by line_mode selections and tries to match vim behavior + pub fn expand_to_line(&self, range: Range) -> Range { + let new_start = MultiBufferPoint::new(range.start.row, 0); + let new_end = if range.end.column > 0 { + MultiBufferPoint::new(range.end.row, self.line_len(MultiBufferRow(range.end.row))) + } else { + range.end + }; + new_start..new_end + } } #[cfg(any(test, feature = "test-support"))] @@ -6414,8 +6409,8 @@ impl MultiBufferSnapshot { #[cfg(any(test, feature = "test-support"))] fn check_invariants(&self) { - let excerpts = self.excerpts.items(&()); - let excerpt_ids = self.excerpt_ids.items(&()); + let excerpts = self.excerpts.items(()); + let excerpt_ids = self.excerpt_ids.items(()); for (ix, excerpt) in excerpts.iter().enumerate() { if ix == 0 { @@ -6442,7 +6437,7 @@ impl MultiBufferSnapshot { "incorrect input summary. expected {:?}, got {:?}. transforms: {:+?}", self.excerpts.summary().text.len, self.diff_transforms.summary().input, - self.diff_transforms.items(&()), + self.diff_transforms.items(()), ); } @@ -6461,7 +6456,7 @@ impl MultiBufferSnapshot { { panic!( "multiple adjacent buffer content transforms with is_inserted_hunk = {inserted_hunk_info:?}. transforms: {:+?}", - self.diff_transforms.items(&()) + self.diff_transforms.items(()) ); } if summary.len == 0 && !self.is_empty() { @@ -7048,21 +7043,19 @@ impl<'a> MultiBufferExcerpt<'a> { } pub fn start_anchor(&self) -> Anchor { - Anchor { - buffer_id: Some(self.excerpt.buffer_id), - excerpt_id: self.excerpt.id, - text_anchor: self.excerpt.range.context.start, - diff_base_anchor: None, - } + Anchor::in_buffer( + self.excerpt.id, + self.excerpt.buffer_id, + self.excerpt.range.context.start, + ) } pub fn end_anchor(&self) -> Anchor { - Anchor { - buffer_id: Some(self.excerpt.buffer_id), - excerpt_id: self.excerpt.id, - text_anchor: self.excerpt.range.context.end, - diff_base_anchor: None, - } + Anchor::in_buffer( + self.excerpt.id, + self.excerpt.buffer_id, + self.excerpt.range.context.end, + ) } pub fn buffer(&self) -> &'a BufferSnapshot { @@ -7169,7 +7162,7 @@ impl ExcerptId { } pub fn max() -> Self { - Self(usize::MAX) + Self(u32::MAX) } pub fn to_proto(self) -> u64 { @@ -7189,7 +7182,7 @@ impl ExcerptId { impl From for usize { fn from(val: ExcerptId) -> Self { - val.0 + val.0 as usize } } @@ -7209,7 +7202,7 @@ impl fmt::Debug for Excerpt { impl sum_tree::Item for Excerpt { type Summary = ExcerptSummary; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { let mut text = self.text_summary; if self.has_trailing_newline { text += TextSummary::from("\n"); @@ -7226,7 +7219,7 @@ impl sum_tree::Item for Excerpt { impl sum_tree::Item for ExcerptIdMapping { type Summary = ExcerptId; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { self.id } } @@ -7253,7 +7246,7 @@ impl DiffTransform { impl sum_tree::Item for DiffTransform { type Summary = DiffTransformSummary; - fn summary(&self, _: &::Context) -> Self::Summary { + fn summary(&self, _: ::Context<'_>) -> Self::Summary { match self { DiffTransform::BufferContent { summary, .. } => DiffTransformSummary { input: *summary, @@ -7273,83 +7266,77 @@ impl DiffTransformSummary { } } -impl sum_tree::Summary for DiffTransformSummary { - type Context = (); - - fn zero(_: &Self::Context) -> Self { +impl sum_tree::ContextLessSummary for DiffTransformSummary { + fn zero() -> Self { DiffTransformSummary { input: TextSummary::default(), output: TextSummary::default(), } } - fn add_summary(&mut self, summary: &Self, _: &Self::Context) { - self.input += &summary.input; - self.output += &summary.output; + fn add_summary(&mut self, other: &Self) { + self.input += other.input; + self.output += other.output; } } -impl sum_tree::Summary for ExcerptId { - type Context = (); - - fn zero(_cx: &()) -> Self { - Default::default() +impl sum_tree::ContextLessSummary for ExcerptId { + fn zero() -> Self { + Self(0) } - fn add_summary(&mut self, other: &Self, _: &()) { - *self = *other; + fn add_summary(&mut self, summary: &Self) { + *self = cmp::max(*self, *summary); } } -impl sum_tree::Summary for ExcerptSummary { - type Context = (); - - fn zero(_cx: &()) -> Self { - Default::default() +impl sum_tree::ContextLessSummary for ExcerptSummary { + fn zero() -> Self { + Self::default() } - fn add_summary(&mut self, summary: &Self, _: &()) { + fn add_summary(&mut self, summary: &Self) { debug_assert!(summary.excerpt_locator > self.excerpt_locator); self.excerpt_locator = summary.excerpt_locator.clone(); - Summary::add_summary(&mut self.text, &summary.text, &()); + Summary::add_summary(&mut self.text, &summary.text, ()); self.widest_line_number = cmp::max(self.widest_line_number, summary.widest_line_number); } } impl<'a> sum_tree::Dimension<'a, ExcerptSummary> for ExcerptOffset { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ExcerptSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ExcerptSummary, _: ()) { self.value += summary.text.len; } } impl sum_tree::SeekTarget<'_, ExcerptSummary, ExcerptSummary> for ExcerptOffset { - fn cmp(&self, cursor_location: &ExcerptSummary, _: &()) -> cmp::Ordering { + fn cmp(&self, cursor_location: &ExcerptSummary, _: ()) -> cmp::Ordering { Ord::cmp(&self.value, &cursor_location.text.len) } } impl<'a> sum_tree::SeekTarget<'a, ExcerptSummary, Option<&'a Locator>> for Locator { - fn cmp(&self, cursor_location: &Option<&'a Locator>, _: &()) -> cmp::Ordering { + fn cmp(&self, cursor_location: &Option<&'a Locator>, _: ()) -> cmp::Ordering { Ord::cmp(&Some(self), cursor_location) } } impl sum_tree::SeekTarget<'_, ExcerptSummary, ExcerptSummary> for Locator { - fn cmp(&self, cursor_location: &ExcerptSummary, _: &()) -> cmp::Ordering { + fn cmp(&self, cursor_location: &ExcerptSummary, _: ()) -> cmp::Ordering { Ord::cmp(self, &cursor_location.excerpt_locator) } } impl<'a> sum_tree::Dimension<'a, ExcerptSummary> for ExcerptPoint { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ExcerptSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ExcerptSummary, _: ()) { self.value += summary.text.lines; } } @@ -7357,31 +7344,31 @@ impl<'a> sum_tree::Dimension<'a, ExcerptSummary> for ExcerptPoint { impl<'a, D: TextDimension + Default> sum_tree::Dimension<'a, ExcerptSummary> for ExcerptDimension { - fn zero(_: &()) -> Self { + fn zero(_: ()) -> Self { ExcerptDimension(D::default()) } - fn add_summary(&mut self, summary: &'a ExcerptSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ExcerptSummary, _: ()) { self.0.add_assign(&D::from_text_summary(&summary.text)) } } impl<'a> sum_tree::Dimension<'a, ExcerptSummary> for Option<&'a Locator> { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ExcerptSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ExcerptSummary, _: ()) { *self = Some(&summary.excerpt_locator); } } impl<'a> sum_tree::Dimension<'a, ExcerptSummary> for Option { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ExcerptSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ExcerptSummary, _: ()) { *self = Some(summary.excerpt_id); } } @@ -7393,21 +7380,21 @@ struct ExcerptDimension(T); struct OutputDimension(T); impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for ExcerptOffset { - fn zero(_: &()) -> Self { + fn zero(_: ()) -> Self { ExcerptOffset::new(0) } - fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: &()) { + fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: ()) { self.value += summary.input.len; } } impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for ExcerptPoint { - fn zero(_: &()) -> Self { + fn zero(_: ()) -> Self { ExcerptPoint::new(0, 0) } - fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: &()) { + fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: ()) { self.value += summary.input.lines; } } @@ -7415,7 +7402,7 @@ impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for ExcerptPoint { impl sum_tree::SeekTarget<'_, DiffTransformSummary, DiffTransformSummary> for ExcerptDimension { - fn cmp(&self, cursor_location: &DiffTransformSummary, _: &()) -> cmp::Ordering { + fn cmp(&self, cursor_location: &DiffTransformSummary, _: ()) -> cmp::Ordering { Ord::cmp(&self.0, &D::from_text_summary(&cursor_location.input)) } } @@ -7423,17 +7410,17 @@ impl sum_tree::SeekTarget<'_, DiffTransformSummary, Diff impl sum_tree::SeekTarget<'_, DiffTransformSummary, DiffTransforms> for ExcerptDimension { - fn cmp(&self, cursor_location: &DiffTransforms, _: &()) -> cmp::Ordering { + fn cmp(&self, cursor_location: &DiffTransforms, _: ()) -> cmp::Ordering { Ord::cmp(&self.0, &cursor_location.excerpt_dimension.0) } } impl<'a, D: TextDimension> sum_tree::Dimension<'a, DiffTransformSummary> for ExcerptDimension { - fn zero(_: &()) -> Self { + fn zero(_: ()) -> Self { ExcerptDimension(D::default()) } - fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: &()) { + fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: ()) { self.0.add_assign(&D::from_text_summary(&summary.input)) } } @@ -7441,47 +7428,47 @@ impl<'a, D: TextDimension> sum_tree::Dimension<'a, DiffTransformSummary> for Exc impl sum_tree::SeekTarget<'_, DiffTransformSummary, DiffTransforms> for OutputDimension { - fn cmp(&self, cursor_location: &DiffTransforms, _: &()) -> cmp::Ordering { + fn cmp(&self, cursor_location: &DiffTransforms, _: ()) -> cmp::Ordering { Ord::cmp(&self.0, &cursor_location.output_dimension.0) } } impl<'a, D: TextDimension> sum_tree::Dimension<'a, DiffTransformSummary> for OutputDimension { - fn zero(_: &()) -> Self { + fn zero(_: ()) -> Self { OutputDimension(D::default()) } - fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: &()) { + fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: ()) { self.0.add_assign(&D::from_text_summary(&summary.output)) } } impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for TextSummary { - fn zero(_: &()) -> Self { + fn zero(_: ()) -> Self { TextSummary::default() } - fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: &()) { + fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: ()) { *self += summary.output } } impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for usize { - fn zero(_: &()) -> Self { + fn zero(_: ()) -> Self { 0 } - fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: &()) { + fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: ()) { *self += summary.output.len } } impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for Point { - fn zero(_: &()) -> Self { + fn zero(_: ()) -> Self { Point::new(0, 0) } - fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: &()) { + fn add_summary(&mut self, summary: &'a DiffTransformSummary, _: ()) { *self += summary.output.lines } } @@ -7983,3 +7970,75 @@ impl From for EntityId { EntityId::from(id.0 as u64) } } + +#[cfg(debug_assertions)] +pub mod debug { + use super::*; + + pub trait ToMultiBufferDebugRanges { + fn to_multi_buffer_debug_ranges(&self, snapshot: &MultiBufferSnapshot) + -> Vec>; + } + + impl ToMultiBufferDebugRanges for T { + fn to_multi_buffer_debug_ranges( + &self, + snapshot: &MultiBufferSnapshot, + ) -> Vec> { + [self.to_offset(snapshot)].to_multi_buffer_debug_ranges(snapshot) + } + } + + impl ToMultiBufferDebugRanges for Range { + fn to_multi_buffer_debug_ranges( + &self, + snapshot: &MultiBufferSnapshot, + ) -> Vec> { + [self.start.to_offset(snapshot)..self.end.to_offset(snapshot)] + .to_multi_buffer_debug_ranges(snapshot) + } + } + + impl ToMultiBufferDebugRanges for Vec { + fn to_multi_buffer_debug_ranges( + &self, + snapshot: &MultiBufferSnapshot, + ) -> Vec> { + self.as_slice().to_multi_buffer_debug_ranges(snapshot) + } + } + + impl ToMultiBufferDebugRanges for Vec> { + fn to_multi_buffer_debug_ranges( + &self, + snapshot: &MultiBufferSnapshot, + ) -> Vec> { + self.as_slice().to_multi_buffer_debug_ranges(snapshot) + } + } + + impl ToMultiBufferDebugRanges for [T] { + fn to_multi_buffer_debug_ranges( + &self, + snapshot: &MultiBufferSnapshot, + ) -> Vec> { + self.iter() + .map(|item| { + let offset = item.to_offset(snapshot); + offset..offset + }) + .collect() + } + } + + impl ToMultiBufferDebugRanges for [Range] { + fn to_multi_buffer_debug_ranges( + &self, + snapshot: &MultiBufferSnapshot, + ) -> Vec> { + self.iter() + .map(|range| range.start.to_offset(snapshot)..range.end.to_offset(snapshot)) + .collect() + } + } +} diff --git a/crates/multi_buffer/src/multi_buffer_tests.rs b/crates/multi_buffer/src/multi_buffer_tests.rs index 1be82500786b36fc014c2acf4fb49d4e8abc4d6b..bad99d5412cd009ecaeabe9c6ad7686f07d30862 100644 --- a/crates/multi_buffer/src/multi_buffer_tests.rs +++ b/crates/multi_buffer/src/multi_buffer_tests.rs @@ -8,6 +8,7 @@ use rand::prelude::*; use settings::SettingsStore; use std::env; use util::RandomCharIter; +use util::rel_path::rel_path; use util::test::sample_text; #[ctor::ctor] @@ -1524,7 +1525,7 @@ fn test_set_excerpts_for_buffer_ordering(cx: &mut TestAppContext) { cx, ) }); - let path1: PathKey = PathKey::namespaced(0, Path::new("/").into()); + let path1: PathKey = PathKey::with_sort_prefix(0, rel_path("root").into_arc()); let multibuffer = cx.new(|_| MultiBuffer::new(Capability::ReadWrite)); multibuffer.update(cx, |multibuffer, cx| { @@ -1619,7 +1620,7 @@ fn test_set_excerpts_for_buffer(cx: &mut TestAppContext) { cx, ) }); - let path1: PathKey = PathKey::namespaced(0, Path::new("/").into()); + let path1: PathKey = PathKey::with_sort_prefix(0, rel_path("root").into_arc()); let buf2 = cx.new(|cx| { Buffer::local( indoc! { @@ -1638,7 +1639,7 @@ fn test_set_excerpts_for_buffer(cx: &mut TestAppContext) { cx, ) }); - let path2 = PathKey::namespaced(1, Path::new("/").into()); + let path2 = PathKey::with_sort_prefix(1, rel_path("root").into_arc()); let multibuffer = cx.new(|_| MultiBuffer::new(Capability::ReadWrite)); multibuffer.update(cx, |multibuffer, cx| { @@ -1815,7 +1816,7 @@ fn test_set_excerpts_for_buffer_rename(cx: &mut TestAppContext) { cx, ) }); - let path: PathKey = PathKey::namespaced(0, Path::new("/").into()); + let path: PathKey = PathKey::with_sort_prefix(0, rel_path("root").into_arc()); let buf2 = cx.new(|cx| { Buffer::local( indoc! { diff --git a/crates/node_runtime/src/node_runtime.rs b/crates/node_runtime/src/node_runtime.rs index 9d41eb1562943683aae3e785b1daac8bc3bfeb1a..3b2ba83ec339c13c3f00cc58d0fcbdffe2efd915 100644 --- a/crates/node_runtime/src/node_runtime.rs +++ b/crates/node_runtime/src/node_runtime.rs @@ -613,7 +613,7 @@ pub struct SystemNodeRuntime { } impl SystemNodeRuntime { - const MIN_VERSION: semver::Version = Version::new(20, 0, 0); + const MIN_VERSION: semver::Version = Version::new(22, 0, 0); async fn new(node: PathBuf, npm: PathBuf) -> Result { let output = util::command::new_smol_command(&node) .arg("--version") diff --git a/crates/notifications/src/notification_store.rs b/crates/notifications/src/notification_store.rs index 7db17da9ff92bce492cc8414be8db28c219d61e7..0964a648b0bead5d46fe7d63113d6bc966673116 100644 --- a/crates/notifications/src/notification_store.rs +++ b/crates/notifications/src/notification_store.rs @@ -123,12 +123,12 @@ impl NotificationStore { return None; } let ix = count - 1 - ix; - let mut cursor = self.notifications.cursor::(&()); + let mut cursor = self.notifications.cursor::(()); cursor.seek(&Count(ix), Bias::Right); cursor.item() } pub fn notification_for_id(&self, id: u64) -> Option<&NotificationEntry> { - let mut cursor = self.notifications.cursor::(&()); + let mut cursor = self.notifications.cursor::(()); cursor.seek(&NotificationId(id), Bias::Left); if let Some(item) = cursor.item() && item.id == id @@ -297,12 +297,12 @@ impl NotificationStore { ) { let mut cursor = self .notifications - .cursor::>(&()); + .cursor::>(()); let mut new_notifications = SumTree::default(); let mut old_range = 0..0; for (i, (id, new_notification)) in notifications.into_iter().enumerate() { - new_notifications.append(cursor.slice(&NotificationId(id), Bias::Left), &()); + new_notifications.append(cursor.slice(&NotificationId(id), Bias::Left), ()); if i == 0 { old_range.start = cursor.start().1.0; @@ -334,13 +334,13 @@ impl NotificationStore { } if let Some(notification) = new_notification { - new_notifications.push(notification, &()); + new_notifications.push(notification, ()); } } old_range.end = cursor.start().1.0; let new_count = new_notifications.summary().count - old_range.start; - new_notifications.append(cursor.suffix(), &()); + new_notifications.append(cursor.suffix(), ()); drop(cursor); self.notifications = new_notifications; @@ -381,7 +381,7 @@ impl EventEmitter for NotificationStore {} impl sum_tree::Item for NotificationEntry { type Summary = NotificationSummary; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { NotificationSummary { max_id: self.id, count: 1, @@ -390,14 +390,12 @@ impl sum_tree::Item for NotificationEntry { } } -impl sum_tree::Summary for NotificationSummary { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl sum_tree::ContextLessSummary for NotificationSummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &()) { + fn add_summary(&mut self, summary: &Self) { self.max_id = self.max_id.max(summary.max_id); self.count += summary.count; self.unread_count += summary.unread_count; @@ -405,22 +403,22 @@ impl sum_tree::Summary for NotificationSummary { } impl sum_tree::Dimension<'_, NotificationSummary> for NotificationId { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &NotificationSummary, _: &()) { + fn add_summary(&mut self, summary: &NotificationSummary, _: ()) { debug_assert!(summary.max_id > self.0); self.0 = summary.max_id; } } impl sum_tree::Dimension<'_, NotificationSummary> for Count { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &NotificationSummary, _: &()) { + fn add_summary(&mut self, summary: &NotificationSummary, _: ()) { self.0 += summary.count; } } diff --git a/crates/ollama/Cargo.toml b/crates/ollama/Cargo.toml index 2765f234009c99ba4c9feb6e4a9fac804da7e5a1..0cf1a5505d8035808b8c3f2a0407557535b15008 100644 --- a/crates/ollama/Cargo.toml +++ b/crates/ollama/Cargo.toml @@ -22,4 +22,5 @@ http_client.workspace = true schemars = { workspace = true, optional = true } serde.workspace = true serde_json.workspace = true +settings.workspace = true workspace-hack.workspace = true diff --git a/crates/ollama/src/ollama.rs b/crates/ollama/src/ollama.rs index c61108d8bd59375256b7eb8b511527e8a0a119c2..0ed3b6da17d952cc874485337ec380ef3ca990a8 100644 --- a/crates/ollama/src/ollama.rs +++ b/crates/ollama/src/ollama.rs @@ -1,35 +1,12 @@ use anyhow::{Context as _, Result}; use futures::{AsyncBufReadExt, AsyncReadExt, StreamExt, io::BufReader, stream::BoxStream}; -use http_client::{AsyncBody, HttpClient, Method, Request as HttpRequest, http}; +use http_client::{AsyncBody, HttpClient, HttpRequestExt, Method, Request as HttpRequest}; use serde::{Deserialize, Serialize}; use serde_json::Value; -use std::time::Duration; +pub use settings::KeepAlive; pub const OLLAMA_API_URL: &str = "http://localhost:11434"; -#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -#[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq)] -#[serde(untagged)] -pub enum KeepAlive { - /// Keep model alive for N seconds - Seconds(isize), - /// Keep model alive for a fixed duration. Accepts durations like "5m", "10m", "1h", "1d", etc. - Duration(String), -} - -impl KeepAlive { - /// Keep model alive until a new model is loaded or until Ollama shuts down - fn indefinite() -> Self { - Self::Seconds(-1) - } -} - -impl Default for KeepAlive { - fn default() -> Self { - Self::indefinite() - } -} - #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub struct Model { @@ -59,6 +36,7 @@ fn get_max_tokens(name: &str) -> u64 { "cogito" | "command-r" | "deepseek-coder-v2" | "deepseek-r1" | "deepseek-v3" | "devstral" | "gemma3" | "gpt-oss" | "granite3.3" | "llama3.1" | "llama3.2" | "llama3.3" | "mistral-nemo" | "phi3" | "phi3.5" | "phi4" | "qwen3" | "yi-coder" => 128000, + "qwen3-coder" => 256000, _ => DEFAULT_TOKENS, } .clamp(1, MAXIMUM_TOKENS) @@ -159,14 +137,6 @@ pub struct ChatRequest { pub think: Option, } -impl ChatRequest { - pub fn with_tools(mut self, tools: Vec) -> Self { - self.stream = false; - self.tools = tools; - self - } -} - // https://github.com/ollama/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values #[derive(Serialize, Default, Debug)] pub struct ChatOptions { @@ -179,14 +149,10 @@ pub struct ChatOptions { #[derive(Deserialize, Debug)] pub struct ChatResponseDelta { - #[allow(unused)] pub model: String, - #[allow(unused)] pub created_at: String, pub message: ChatMessage, - #[allow(unused)] pub done_reason: Option, - #[allow(unused)] pub done: bool, pub prompt_eval_count: Option, pub eval_count: Option, @@ -223,10 +189,74 @@ pub struct ModelDetails { pub quantization_level: String, } -#[derive(Deserialize, Debug)] +#[derive(Debug)] pub struct ModelShow { - #[serde(default)] pub capabilities: Vec, + pub context_length: Option, + pub architecture: Option, +} + +impl<'de> Deserialize<'de> for ModelShow { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + use serde::de::{self, MapAccess, Visitor}; + use std::fmt; + + struct ModelShowVisitor; + + impl<'de> Visitor<'de> for ModelShowVisitor { + type Value = ModelShow; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a ModelShow object") + } + + fn visit_map
(self, mut map: A) -> Result + where + A: MapAccess<'de>, + { + let mut capabilities: Vec = Vec::new(); + let mut architecture: Option = None; + let mut context_length: Option = None; + + while let Some(key) = map.next_key::()? { + match key.as_str() { + "capabilities" => { + capabilities = map.next_value()?; + } + "model_info" => { + let model_info: Value = map.next_value()?; + if let Value::Object(obj) = model_info { + architecture = obj + .get("general.architecture") + .and_then(|v| v.as_str()) + .map(String::from); + + if let Some(arch) = &architecture { + context_length = obj + .get(&format!("{}.context_length", arch)) + .and_then(|v| v.as_u64()); + } + } + } + _ => { + let _: de::IgnoredAny = map.next_value()?; + } + } + } + + Ok(ModelShow { + capabilities, + context_length, + architecture, + }) + } + } + + deserializer.deserialize_map(ModelShowVisitor) + } } impl ModelShow { @@ -244,50 +274,22 @@ impl ModelShow { } } -pub async fn complete( - client: &dyn HttpClient, - api_url: &str, - request: ChatRequest, -) -> Result { - let uri = format!("{api_url}/api/chat"); - let request_builder = HttpRequest::builder() - .method(Method::POST) - .uri(uri) - .header("Content-Type", "application/json"); - - let serialized_request = serde_json::to_string(&request)?; - let request = request_builder.body(AsyncBody::from(serialized_request))?; - - let mut response = client.send(request).await?; - - let mut body = Vec::new(); - response.body_mut().read_to_end(&mut body).await?; - - if response.status().is_success() { - let response_message: ChatResponseDelta = serde_json::from_slice(&body)?; - Ok(response_message) - } else { - let body_str = std::str::from_utf8(&body)?; - anyhow::bail!( - "Failed to connect to API: {} {}", - response.status(), - body_str - ); - } -} - pub async fn stream_chat_completion( client: &dyn HttpClient, api_url: &str, + api_key: Option<&str>, request: ChatRequest, ) -> Result>> { let uri = format!("{api_url}/api/chat"); - let request_builder = http::Request::builder() + let request = HttpRequest::builder() .method(Method::POST) .uri(uri) - .header("Content-Type", "application/json"); + .header("Content-Type", "application/json") + .when_some(api_key, |builder, api_key| { + builder.header("Authorization", format!("Bearer {api_key}")) + }) + .body(AsyncBody::from(serde_json::to_string(&request)?))?; - let request = request_builder.body(AsyncBody::from(serde_json::to_string(&request)?))?; let mut response = client.send(request).await?; if response.status().is_success() { let reader = BufReader::new(response.into_body()); @@ -313,15 +315,17 @@ pub async fn stream_chat_completion( pub async fn get_models( client: &dyn HttpClient, api_url: &str, - _: Option, + api_key: Option<&str>, ) -> Result> { let uri = format!("{api_url}/api/tags"); - let request_builder = HttpRequest::builder() + let request = HttpRequest::builder() .method(Method::GET) .uri(uri) - .header("Accept", "application/json"); - - let request = request_builder.body(AsyncBody::default())?; + .header("Accept", "application/json") + .when_some(api_key, |builder, api_key| { + builder.header("Authorization", format!("Bearer {api_key}")) + }) + .body(AsyncBody::default())?; let mut response = client.send(request).await?; @@ -340,12 +344,20 @@ pub async fn get_models( } /// Fetch details of a model, used to determine model capabilities -pub async fn show_model(client: &dyn HttpClient, api_url: &str, model: &str) -> Result { +pub async fn show_model( + client: &dyn HttpClient, + api_url: &str, + api_key: Option<&str>, + model: &str, +) -> Result { let uri = format!("{api_url}/api/show"); let request = HttpRequest::builder() .method(Method::POST) .uri(uri) .header("Content-Type", "application/json") + .when_some(api_key, |builder, api_key| { + builder.header("Authorization", format!("Bearer {api_key}")) + }) .body(AsyncBody::from( serde_json::json!({ "model": model }).to_string(), ))?; @@ -522,6 +534,9 @@ mod tests { assert!(result.supports_tools()); assert!(result.capabilities.contains(&"tools".to_string())); assert!(result.capabilities.contains(&"completion".to_string())); + + assert_eq!(result.architecture, Some("llama".to_string())); + assert_eq!(result.context_length, Some(131072)); } #[test] diff --git a/crates/onboarding/Cargo.toml b/crates/onboarding/Cargo.toml index 4157be31723fe66eb8f12ddf581c292e8320be78..2e9797f717b446177efa08713489aed49892c8c8 100644 --- a/crates/onboarding/Cargo.toml +++ b/crates/onboarding/Cargo.toml @@ -15,20 +15,15 @@ path = "src/onboarding.rs" default = [] [dependencies] -ai_onboarding.workspace = true anyhow.workspace = true client.workspace = true component.workspace = true db.workspace = true documented.workspace = true -editor.workspace = true fs.workspace = true fuzzy.workspace = true git.workspace = true gpui.workspace = true -itertools.workspace = true -language.workspace = true -language_model.workspace = true menu.workspace = true notifications.workspace = true picker.workspace = true @@ -39,9 +34,13 @@ settings.workspace = true telemetry.workspace = true theme.workspace = true ui.workspace = true +ui_input.workspace = true util.workspace = true vim_mode_setting.workspace = true workspace-hack.workspace = true workspace.workspace = true zed_actions.workspace = true zlog.workspace = true + +[dev-dependencies] +db = {workspace = true, features = ["test-support"]} diff --git a/crates/onboarding/src/ai_setup_page.rs b/crates/onboarding/src/ai_setup_page.rs deleted file mode 100644 index 3631ad00dfb8662d5d4142a4cbd11186c1b1b137..0000000000000000000000000000000000000000 --- a/crates/onboarding/src/ai_setup_page.rs +++ /dev/null @@ -1,427 +0,0 @@ -use std::sync::Arc; - -use ai_onboarding::AiUpsellCard; -use client::{Client, UserStore, zed_urls}; -use fs::Fs; -use gpui::{ - Action, AnyView, App, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, WeakEntity, - Window, prelude::*, -}; -use itertools; -use language_model::{LanguageModelProvider, LanguageModelProviderId, LanguageModelRegistry}; -use project::DisableAiSettings; -use settings::{Settings, update_settings_file}; -use ui::{ - Badge, ButtonLike, Divider, KeyBinding, Modal, ModalFooter, ModalHeader, Section, SwitchField, - ToggleState, prelude::*, tooltip_container, -}; -use util::ResultExt; -use workspace::{ModalView, Workspace}; -use zed_actions::agent::OpenSettings; - -const FEATURED_PROVIDERS: [&str; 4] = ["anthropic", "google", "openai", "ollama"]; - -fn render_llm_provider_section( - tab_index: &mut isize, - workspace: WeakEntity, - disabled: bool, - window: &mut Window, - cx: &mut App, -) -> impl IntoElement { - v_flex() - .gap_4() - .child( - v_flex() - .child(Label::new("Or use other LLM providers").size(LabelSize::Large)) - .child( - Label::new("Bring your API keys to use the available providers with Zed's UI for free.") - .color(Color::Muted), - ), - ) - .child(render_llm_provider_card(tab_index, workspace, disabled, window, cx)) -} - -fn render_privacy_card(tab_index: &mut isize, disabled: bool, cx: &mut App) -> impl IntoElement { - let (title, description) = if disabled { - ( - "AI is disabled across Zed", - "Re-enable it any time in Settings.", - ) - } else { - ( - "Privacy is the default for Zed", - "Any use or storage of your data is with your explicit, single-use, opt-in consent.", - ) - }; - - v_flex() - .relative() - .pt_2() - .pb_2p5() - .pl_3() - .pr_2() - .border_1() - .border_dashed() - .border_color(cx.theme().colors().border.opacity(0.5)) - .bg(cx.theme().colors().surface_background.opacity(0.3)) - .rounded_lg() - .overflow_hidden() - .child( - h_flex() - .gap_2() - .justify_between() - .child(Label::new(title)) - .child( - h_flex() - .gap_1() - .child( - Badge::new("Privacy") - .icon(IconName::ShieldCheck) - .tooltip(move |_, cx| cx.new(|_| AiPrivacyTooltip::new()).into()), - ) - .child( - Button::new("learn_more", "Learn More") - .style(ButtonStyle::Outlined) - .label_size(LabelSize::Small) - .icon(IconName::ArrowUpRight) - .icon_size(IconSize::XSmall) - .icon_color(Color::Muted) - .on_click(|_, _, cx| { - cx.open_url(&zed_urls::ai_privacy_and_security(cx)) - }) - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }), - ), - ), - ) - .child( - Label::new(description) - .size(LabelSize::Small) - .color(Color::Muted), - ) -} - -fn render_llm_provider_card( - tab_index: &mut isize, - workspace: WeakEntity, - disabled: bool, - _: &mut Window, - cx: &mut App, -) -> impl IntoElement { - let registry = LanguageModelRegistry::read_global(cx); - - v_flex() - .border_1() - .border_color(cx.theme().colors().border) - .bg(cx.theme().colors().surface_background.opacity(0.5)) - .rounded_lg() - .overflow_hidden() - .children(itertools::intersperse_with( - FEATURED_PROVIDERS - .into_iter() - .flat_map(|provider_name| { - registry.provider(&LanguageModelProviderId::new(provider_name)) - }) - .enumerate() - .map(|(index, provider)| { - let group_name = SharedString::new(format!("onboarding-hover-group-{}", index)); - let is_authenticated = provider.is_authenticated(cx); - - ButtonLike::new(("onboarding-ai-setup-buttons", index)) - .size(ButtonSize::Large) - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }) - .child( - h_flex() - .group(&group_name) - .px_0p5() - .w_full() - .gap_2() - .justify_between() - .child( - h_flex() - .gap_1() - .child( - Icon::new(provider.icon()) - .color(Color::Muted) - .size(IconSize::XSmall), - ) - .child(Label::new(provider.name().0)), - ) - .child( - h_flex() - .gap_1() - .when(!is_authenticated, |el| { - el.visible_on_hover(group_name.clone()) - .child( - Icon::new(IconName::Settings) - .color(Color::Muted) - .size(IconSize::XSmall), - ) - .child( - Label::new("Configure") - .color(Color::Muted) - .size(LabelSize::Small), - ) - }) - .when(is_authenticated && !disabled, |el| { - el.child( - Icon::new(IconName::Check) - .color(Color::Success) - .size(IconSize::XSmall), - ) - .child( - Label::new("Configured") - .color(Color::Muted) - .size(LabelSize::Small), - ) - }), - ), - ) - .on_click({ - let workspace = workspace.clone(); - move |_, window, cx| { - workspace - .update(cx, |workspace, cx| { - workspace.toggle_modal(window, cx, |window, cx| { - telemetry::event!( - "Welcome AI Modal Opened", - provider = provider.name().0, - ); - - let modal = AiConfigurationModal::new( - provider.clone(), - window, - cx, - ); - window.focus(&modal.focus_handle(cx)); - modal - }); - }) - .log_err(); - } - }) - .into_any_element() - }), - || Divider::horizontal().into_any_element(), - )) - .child(Divider::horizontal()) - .child( - Button::new("agent_settings", "Add Many Others") - .size(ButtonSize::Large) - .icon(IconName::Plus) - .icon_position(IconPosition::Start) - .icon_color(Color::Muted) - .icon_size(IconSize::XSmall) - .on_click(|_event, window, cx| { - window.dispatch_action(OpenSettings.boxed_clone(), cx) - }) - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }), - ) -} - -pub(crate) fn render_ai_setup_page( - workspace: WeakEntity, - user_store: Entity, - client: Arc, - window: &mut Window, - cx: &mut App, -) -> impl IntoElement { - let mut tab_index = 0; - let is_ai_disabled = DisableAiSettings::get_global(cx).disable_ai; - - v_flex() - .gap_2() - .child( - SwitchField::new( - "enable_ai", - "Enable AI features", - None, - if is_ai_disabled { - ToggleState::Unselected - } else { - ToggleState::Selected - }, - |&toggle_state, _, cx| { - let enabled = match toggle_state { - ToggleState::Indeterminate => { - return; - } - ToggleState::Unselected => true, - ToggleState::Selected => false, - }; - - telemetry::event!( - "Welcome AI Enabled", - toggle = if enabled { "on" } else { "off" }, - ); - - let fs = ::global(cx); - update_settings_file::(fs, cx, move |ai_settings, _| { - ai_settings.disable_ai = Some(enabled); - }); - }, - ) - .tab_index({ - tab_index += 1; - tab_index - 1 - }), - ) - .child(render_privacy_card(&mut tab_index, is_ai_disabled, cx)) - .child( - v_flex() - .mt_2() - .gap_6() - .child( - AiUpsellCard::new(client, &user_store, user_store.read(cx).plan(), cx) - .tab_index(Some({ - tab_index += 1; - tab_index - 1 - })), - ) - .child(render_llm_provider_section( - &mut tab_index, - workspace, - is_ai_disabled, - window, - cx, - )) - .when(is_ai_disabled, |this| { - this.child( - div() - .id("backdrop") - .size_full() - .absolute() - .inset_0() - .bg(cx.theme().colors().editor_background) - .opacity(0.8) - .block_mouse_except_scroll(), - ) - }), - ) -} - -struct AiConfigurationModal { - focus_handle: FocusHandle, - selected_provider: Arc, - configuration_view: AnyView, -} - -impl AiConfigurationModal { - fn new( - selected_provider: Arc, - window: &mut Window, - cx: &mut Context, - ) -> Self { - let focus_handle = cx.focus_handle(); - let configuration_view = selected_provider.configuration_view( - language_model::ConfigurationViewTargetAgent::ZedAgent, - window, - cx, - ); - - Self { - focus_handle, - configuration_view, - selected_provider, - } - } - - fn cancel(&mut self, _: &menu::Cancel, cx: &mut Context) { - cx.emit(DismissEvent); - } -} - -impl ModalView for AiConfigurationModal {} - -impl EventEmitter for AiConfigurationModal {} - -impl Focusable for AiConfigurationModal { - fn focus_handle(&self, _cx: &App) -> FocusHandle { - self.focus_handle.clone() - } -} - -impl Render for AiConfigurationModal { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - v_flex() - .key_context("OnboardingAiConfigurationModal") - .w(rems(34.)) - .elevation_3(cx) - .track_focus(&self.focus_handle) - .on_action( - cx.listener(|this, _: &menu::Cancel, _window, cx| this.cancel(&menu::Cancel, cx)), - ) - .child( - Modal::new("onboarding-ai-setup-modal", None) - .header( - ModalHeader::new() - .icon( - Icon::new(self.selected_provider.icon()) - .color(Color::Muted) - .size(IconSize::Small), - ) - .headline(self.selected_provider.name().0), - ) - .section(Section::new().child(self.configuration_view.clone())) - .footer( - ModalFooter::new().end_slot( - Button::new("ai-onb-modal-Done", "Done") - .key_binding( - KeyBinding::for_action_in( - &menu::Cancel, - &self.focus_handle.clone(), - window, - cx, - ) - .map(|kb| kb.size(rems_from_px(12.))), - ) - .on_click(cx.listener(|this, _event, _window, cx| { - this.cancel(&menu::Cancel, cx) - })), - ), - ), - ) - } -} - -pub struct AiPrivacyTooltip {} - -impl AiPrivacyTooltip { - pub fn new() -> Self { - Self {} - } -} - -impl Render for AiPrivacyTooltip { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - const DESCRIPTION: &str = "We believe in opt-in data sharing as the default for building AI products, rather than opt-out. We'll only use or store your data if you affirmatively send it to us. "; - - tooltip_container(window, cx, move |this, _, _| { - this.child( - h_flex() - .gap_1() - .child( - Icon::new(IconName::ShieldCheck) - .size(IconSize::Small) - .color(Color::Muted), - ) - .child(Label::new("Privacy First")), - ) - .child( - div().max_w_64().child( - Label::new(DESCRIPTION) - .size(LabelSize::Small) - .color(Color::Muted), - ), - ) - }) - } -} diff --git a/crates/onboarding/src/base_keymap_picker.rs b/crates/onboarding/src/base_keymap_picker.rs index 950ed1d3133549a566808bd7cee002437708a2ad..63a2894a93504bd658dbf8199534efddf4746f1d 100644 --- a/crates/onboarding/src/base_keymap_picker.rs +++ b/crates/onboarding/src/base_keymap_picker.rs @@ -186,8 +186,8 @@ impl PickerDelegate for BaseKeymapSelectorDelegate { value = base_keymap.to_string() ); - update_settings_file::(self.fs.clone(), cx, move |setting, _| { - setting.base_keymap = Some(base_keymap) + update_settings_file(self.fs.clone(), cx, move |setting, _| { + setting.base_keymap = Some(base_keymap.into()) }); } diff --git a/crates/onboarding/src/basics_page.rs b/crates/onboarding/src/basics_page.rs index aef9dcca86ce49a70f1a508c0a43614737a653c7..eaf9c41a53dc6c4b0d8ef9a93a9ed8423ddf2db6 100644 --- a/crates/onboarding/src/basics_page.rs +++ b/crates/onboarding/src/basics_page.rs @@ -2,19 +2,23 @@ use std::sync::Arc; use client::TelemetrySettings; use fs::Fs; -use gpui::{App, IntoElement}; +use gpui::{Action, App, IntoElement}; use settings::{BaseKeymap, Settings, update_settings_file}; use theme::{ Appearance, SystemAppearance, ThemeMode, ThemeName, ThemeRegistry, ThemeSelection, ThemeSettings, }; use ui::{ - ParentElement as _, StatefulInteractiveElement, SwitchField, ToggleButtonGroup, - ToggleButtonSimple, ToggleButtonWithIcon, prelude::*, rems_from_px, + Divider, ParentElement as _, StatefulInteractiveElement, SwitchField, TintColor, + ToggleButtonGroup, ToggleButtonGroupSize, ToggleButtonSimple, ToggleButtonWithIcon, prelude::*, + rems_from_px, }; use vim_mode_setting::VimModeSetting; -use crate::theme_preview::{ThemePreviewStyle, ThemePreviewTile}; +use crate::{ + ImportCursorSettings, ImportVsCodeSettings, SettingsImportState, + theme_preview::{ThemePreviewStyle, ThemePreviewTile}, +}; const LIGHT_THEMES: [&str; 3] = ["One Light", "Ayu Light", "Gruvbox Light"]; const DARK_THEMES: [&str; 3] = ["One Dark", "Ayu Dark", "Gruvbox Dark"]; @@ -34,16 +38,8 @@ fn get_theme_family_themes(theme_name: &str) -> Option<(&'static str, &'static s } fn render_theme_section(tab_index: &mut isize, cx: &mut App) -> impl IntoElement { - let theme_selection = ThemeSettings::get_global(cx).theme_selection.clone(); + let theme_selection = ThemeSettings::get_global(cx).theme.clone(); let system_appearance = theme::SystemAppearance::global(cx); - let theme_selection = theme_selection.unwrap_or_else(|| ThemeSelection::Dynamic { - mode: match *system_appearance { - Appearance::Light => ThemeMode::Light, - Appearance::Dark => ThemeMode::Dark, - }, - light: ThemeName("One Light".into()), - dark: ThemeName("One Dark".into()), - }); let theme_mode = theme_selection .mode() @@ -78,6 +74,7 @@ fn render_theme_section(tab_index: &mut isize, cx: &mut App) -> impl IntoElement ) }), ) + .size(ToggleButtonGroupSize::Medium) .tab_index(tab_index) .selected_index(theme_mode as usize) .style(ui::ToggleButtonGroupStyle::Outlined) @@ -111,7 +108,7 @@ fn render_theme_section(tab_index: &mut isize, cx: &mut App) -> impl IntoElement ThemeMode::Dark => Appearance::Dark, ThemeMode::System => *system_appearance, }; - let current_theme_name = SharedString::new(theme_selection.theme(appearance)); + let current_theme_name: SharedString = theme_selection.name(appearance).0.into(); let theme_names = match appearance { Appearance::Light => LIGHT_THEMES, @@ -194,27 +191,27 @@ fn render_theme_section(tab_index: &mut isize, cx: &mut App) -> impl IntoElement fn write_mode_change(mode: ThemeMode, cx: &mut App) { let fs = ::global(cx); - update_settings_file::(fs, cx, move |settings, _cx| { - settings.set_mode(mode); + update_settings_file(fs, cx, move |settings, _cx| { + theme::set_mode(settings, mode); }); } fn write_theme_change(theme: impl Into>, theme_mode: ThemeMode, cx: &mut App) { let fs = ::global(cx); let theme = theme.into(); - update_settings_file::(fs, cx, move |settings, cx| { + update_settings_file(fs, cx, move |settings, cx| { if theme_mode == ThemeMode::System { let (light_theme, dark_theme) = get_theme_family_themes(&theme).unwrap_or((theme.as_ref(), theme.as_ref())); - settings.theme = Some(ThemeSelection::Dynamic { + settings.theme.theme = Some(settings::ThemeSelection::Dynamic { mode: ThemeMode::System, light: ThemeName(light_theme.into()), dark: ThemeName(dark_theme.into()), }); } else { let appearance = *SystemAppearance::global(cx); - settings.set_theme(theme, appearance); + theme::set_theme(settings, theme, appearance); } }); } @@ -224,89 +221,88 @@ fn render_telemetry_section(tab_index: &mut isize, cx: &App) -> impl IntoElement let fs = ::global(cx); v_flex() - .pt_6() .gap_4() - .border_t_1() - .border_color(cx.theme().colors().border_variant.opacity(0.5)) - .child(Label::new("Telemetry").size(LabelSize::Large)) - .child(SwitchField::new( - "onboarding-telemetry-metrics", - "Help Improve Zed", - Some("Anonymous usage data helps us build the right features and improve your experience.".into()), - if TelemetrySettings::get_global(cx).metrics { - ui::ToggleState::Selected - } else { - ui::ToggleState::Unselected - }, - { - let fs = fs.clone(); - move |selection, _, cx| { - let enabled = match selection { - ToggleState::Selected => true, - ToggleState::Unselected => false, - ToggleState::Indeterminate => { return; }, - }; - - update_settings_file::( - fs.clone(), - cx, - move |setting, _| setting.metrics = Some(enabled), - ); - - // This telemetry event shouldn't fire when it's off. If it does we'll be alerted - // and can fix it in a timely manner to respect a user's choice. - telemetry::event!("Welcome Page Telemetry Metrics Toggled", - options = if enabled { - "on" - } else { - "off" + .child( + SwitchField::new( + "onboarding-telemetry-metrics", + None::<&str>, + Some("Help improve Zed by sending anonymous usage data".into()), + if TelemetrySettings::get_global(cx).metrics { + ui::ToggleState::Selected + } else { + ui::ToggleState::Unselected + }, + { + let fs = fs.clone(); + move |selection, _, cx| { + let enabled = match selection { + ToggleState::Selected => true, + ToggleState::Unselected => false, + ToggleState::Indeterminate => { + return; + } + }; + + update_settings_file(fs.clone(), cx, move |setting, _| { + setting.telemetry.get_or_insert_default().metrics = Some(enabled); + }); + + // This telemetry event shouldn't fire when it's off. If it does we'll be alerted + // and can fix it in a timely manner to respect a user's choice. + telemetry::event!( + "Welcome Page Telemetry Metrics Toggled", + options = if enabled { "on" } else { "off" } + ); } - ); - - }}, - ).tab_index({ - *tab_index += 1; - *tab_index - })) - .child(SwitchField::new( - "onboarding-telemetry-crash-reports", - "Help Fix Zed", - Some("Send crash reports so we can fix critical issues fast.".into()), - if TelemetrySettings::get_global(cx).diagnostics { - ui::ToggleState::Selected - } else { - ui::ToggleState::Unselected - }, - { - let fs = fs.clone(); - move |selection, _, cx| { - let enabled = match selection { - ToggleState::Selected => true, - ToggleState::Unselected => false, - ToggleState::Indeterminate => { return; }, - }; - - update_settings_file::( - fs.clone(), - cx, - move |setting, _| setting.diagnostics = Some(enabled), - ); - - // This telemetry event shouldn't fire when it's off. If it does we'll be alerted - // and can fix it in a timely manner to respect a user's choice. - telemetry::event!("Welcome Page Telemetry Diagnostics Toggled", - options = if enabled { - "on" - } else { - "off" - } - ); - } - } - ).tab_index({ - *tab_index += 1; - *tab_index - })) + }, + ) + .tab_index({ + *tab_index += 1; + *tab_index + }), + ) + .child( + SwitchField::new( + "onboarding-telemetry-crash-reports", + None::<&str>, + Some( + "Help fix Zed by sending crash reports so we can fix critical issues fast" + .into(), + ), + if TelemetrySettings::get_global(cx).diagnostics { + ui::ToggleState::Selected + } else { + ui::ToggleState::Unselected + }, + { + let fs = fs.clone(); + move |selection, _, cx| { + let enabled = match selection { + ToggleState::Selected => true, + ToggleState::Unselected => false, + ToggleState::Indeterminate => { + return; + } + }; + + update_settings_file(fs.clone(), cx, move |setting, _| { + setting.telemetry.get_or_insert_default().diagnostics = Some(enabled); + }); + + // This telemetry event shouldn't fire when it's off. If it does we'll be alerted + // and can fix it in a timely manner to respect a user's choice. + telemetry::event!( + "Welcome Page Telemetry Diagnostics Toggled", + options = if enabled { "on" } else { "off" } + ); + } + }, + ) + .tab_index({ + *tab_index += 1; + *tab_index + }), + ) } fn render_base_keymap_section(tab_index: &mut isize, cx: &mut App) -> impl IntoElement { @@ -327,7 +323,7 @@ fn render_base_keymap_section(tab_index: &mut isize, cx: &mut App) -> impl IntoE ToggleButtonWithIcon::new("VS Code", IconName::EditorVsCode, |_, _, cx| { write_keymap_base(BaseKeymap::VSCode, cx); }), - ToggleButtonWithIcon::new("Jetbrains", IconName::EditorJetBrains, |_, _, cx| { + ToggleButtonWithIcon::new("JetBrains", IconName::EditorJetBrains, |_, _, cx| { write_keymap_base(BaseKeymap::JetBrains, cx); }), ToggleButtonWithIcon::new("Sublime Text", IconName::EditorSublime, |_, _, cx| { @@ -358,8 +354,8 @@ fn render_base_keymap_section(tab_index: &mut isize, cx: &mut App) -> impl IntoE fn write_keymap_base(keymap_base: BaseKeymap, cx: &App) { let fs = ::global(cx); - update_settings_file::(fs, cx, move |setting, _| { - setting.base_keymap = Some(keymap_base); + update_settings_file(fs, cx, move |setting, _| { + setting.base_keymap = Some(keymap_base.into()); }); telemetry::event!("Welcome Keymap Changed", keymap = keymap_base); @@ -374,8 +370,8 @@ fn render_vim_mode_switch(tab_index: &mut isize, cx: &mut App) -> impl IntoEleme }; SwitchField::new( "onboarding-vim-mode", - "Vim Mode", - Some("Coming from Neovim? Use our first-class implementation of Vim Mode.".into()), + Some("Vim Mode"), + Some("Coming from Neovim? Use our first-class implementation of Vim Mode".into()), toggle_state, { let fs = ::global(cx); @@ -387,7 +383,7 @@ fn render_vim_mode_switch(tab_index: &mut isize, cx: &mut App) -> impl IntoEleme return; } }; - update_settings_file::(fs.clone(), cx, move |setting, _| { + update_settings_file(fs.clone(), cx, move |setting, _| { setting.vim_mode = Some(vim_mode); }); @@ -404,12 +400,78 @@ fn render_vim_mode_switch(tab_index: &mut isize, cx: &mut App) -> impl IntoEleme }) } +fn render_setting_import_button( + tab_index: isize, + label: SharedString, + action: &dyn Action, + imported: bool, +) -> impl IntoElement + 'static { + let action = action.boxed_clone(); + + Button::new(label.clone(), label.clone()) + .style(ButtonStyle::OutlinedGhost) + .size(ButtonSize::Medium) + .label_size(LabelSize::Small) + .selected_style(ButtonStyle::Tinted(TintColor::Accent)) + .toggle_state(imported) + .tab_index(tab_index) + .when(imported, |this| { + this.icon(IconName::Check) + .icon_size(IconSize::Small) + .color(Color::Success) + }) + .on_click(move |_, window, cx| { + telemetry::event!("Welcome Import Settings", import_source = label,); + window.dispatch_action(action.boxed_clone(), cx); + }) +} + +fn render_import_settings_section(tab_index: &mut isize, cx: &mut App) -> impl IntoElement { + let import_state = SettingsImportState::global(cx); + let imports: [(SharedString, &dyn Action, bool); 2] = [ + ( + "VS Code".into(), + &ImportVsCodeSettings { skip_prompt: false }, + import_state.vscode, + ), + ( + "Cursor".into(), + &ImportCursorSettings { skip_prompt: false }, + import_state.cursor, + ), + ]; + + let [vscode, cursor] = imports.map(|(label, action, imported)| { + *tab_index += 1; + render_setting_import_button(*tab_index - 1, label, action, imported) + }); + + h_flex() + .gap_2() + .flex_wrap() + .justify_between() + .child( + v_flex() + .gap_0p5() + .max_w_5_6() + .child(Label::new("Import Settings")) + .child( + Label::new("Automatically pull your settings from other editors") + .color(Color::Muted), + ), + ) + .child(h_flex().gap_1().child(vscode).child(cursor)) +} + pub(crate) fn render_basics_page(cx: &mut App) -> impl IntoElement { let mut tab_index = 0; v_flex() + .id("basics-page") .gap_6() .child(render_theme_section(&mut tab_index, cx)) .child(render_base_keymap_section(&mut tab_index, cx)) + .child(render_import_settings_section(&mut tab_index, cx)) .child(render_vim_mode_switch(&mut tab_index, cx)) + .child(Divider::horizontal().color(ui::DividerColor::BorderVariant)) .child(render_telemetry_section(&mut tab_index, cx)) } diff --git a/crates/onboarding/src/editing_page.rs b/crates/onboarding/src/editing_page.rs deleted file mode 100644 index 297016abd4a1499feb6f637d028056ca0b412d31..0000000000000000000000000000000000000000 --- a/crates/onboarding/src/editing_page.rs +++ /dev/null @@ -1,765 +0,0 @@ -use std::sync::Arc; - -use editor::{EditorSettings, ShowMinimap}; -use fs::Fs; -use fuzzy::{StringMatch, StringMatchCandidate}; -use gpui::{ - Action, AnyElement, App, Context, FontFeatures, IntoElement, Pixels, SharedString, Task, Window, -}; -use language::language_settings::{AllLanguageSettings, FormatOnSave}; -use picker::{Picker, PickerDelegate}; -use project::project_settings::ProjectSettings; -use settings::{Settings as _, update_settings_file}; -use theme::{FontFamilyCache, FontFamilyName, ThemeSettings}; -use ui::{ - ButtonLike, ListItem, ListItemSpacing, NumericStepper, PopoverMenu, SwitchField, - ToggleButtonGroup, ToggleButtonGroupStyle, ToggleButtonSimple, ToggleState, Tooltip, - prelude::*, -}; - -use crate::{ImportCursorSettings, ImportVsCodeSettings, SettingsImportState}; - -fn read_show_mini_map(cx: &App) -> ShowMinimap { - editor::EditorSettings::get_global(cx).minimap.show -} - -fn write_show_mini_map(show: ShowMinimap, cx: &mut App) { - let fs = ::global(cx); - - // This is used to speed up the UI - // the UI reads the current values to get what toggle state to show on buttons - // there's a slight delay if we just call update_settings_file so we manually set - // the value here then call update_settings file to get around the delay - let mut curr_settings = EditorSettings::get_global(cx).clone(); - curr_settings.minimap.show = show; - EditorSettings::override_global(curr_settings, cx); - - update_settings_file::(fs, cx, move |editor_settings, _| { - telemetry::event!( - "Welcome Minimap Clicked", - from = editor_settings.minimap.unwrap_or_default(), - to = show - ); - editor_settings.minimap.get_or_insert_default().show = Some(show); - }); -} - -fn read_inlay_hints(cx: &App) -> bool { - AllLanguageSettings::get_global(cx) - .defaults - .inlay_hints - .enabled -} - -fn write_inlay_hints(enabled: bool, cx: &mut App) { - let fs = ::global(cx); - - let mut curr_settings = AllLanguageSettings::get_global(cx).clone(); - curr_settings.defaults.inlay_hints.enabled = enabled; - AllLanguageSettings::override_global(curr_settings, cx); - - update_settings_file::(fs, cx, move |all_language_settings, cx| { - all_language_settings - .defaults - .inlay_hints - .get_or_insert_with(|| { - AllLanguageSettings::get_global(cx) - .clone() - .defaults - .inlay_hints - }) - .enabled = enabled; - }); -} - -fn read_git_blame(cx: &App) -> bool { - ProjectSettings::get_global(cx).git.inline_blame_enabled() -} - -fn write_git_blame(enabled: bool, cx: &mut App) { - let fs = ::global(cx); - - let mut curr_settings = ProjectSettings::get_global(cx).clone(); - curr_settings - .git - .inline_blame - .get_or_insert_default() - .enabled = enabled; - ProjectSettings::override_global(curr_settings, cx); - - update_settings_file::(fs, cx, move |project_settings, _| { - project_settings - .git - .inline_blame - .get_or_insert_default() - .enabled = enabled; - }); -} - -fn write_ui_font_family(font: SharedString, cx: &mut App) { - let fs = ::global(cx); - - update_settings_file::(fs, cx, move |theme_settings, _| { - telemetry::event!( - "Welcome Font Changed", - type = "ui font", - old = theme_settings.ui_font_family, - new = font - ); - theme_settings.ui_font_family = Some(FontFamilyName(font.into())); - }); -} - -fn write_ui_font_size(size: Pixels, cx: &mut App) { - let fs = ::global(cx); - - update_settings_file::(fs, cx, move |theme_settings, _| { - theme_settings.ui_font_size = Some(size.into()); - }); -} - -fn write_buffer_font_size(size: Pixels, cx: &mut App) { - let fs = ::global(cx); - - update_settings_file::(fs, cx, move |theme_settings, _| { - theme_settings.buffer_font_size = Some(size.into()); - }); -} - -fn write_buffer_font_family(font_family: SharedString, cx: &mut App) { - let fs = ::global(cx); - - update_settings_file::(fs, cx, move |theme_settings, _| { - telemetry::event!( - "Welcome Font Changed", - type = "editor font", - old = theme_settings.buffer_font_family, - new = font_family - ); - - theme_settings.buffer_font_family = Some(FontFamilyName(font_family.into())); - }); -} - -fn read_font_ligatures(cx: &App) -> bool { - ThemeSettings::get_global(cx) - .buffer_font - .features - .is_calt_enabled() - .unwrap_or(true) -} - -fn write_font_ligatures(enabled: bool, cx: &mut App) { - let fs = ::global(cx); - let bit = if enabled { 1 } else { 0 }; - - update_settings_file::(fs, cx, move |theme_settings, _| { - let mut features = theme_settings - .buffer_font_features - .as_mut() - .map(|features| features.tag_value_list().to_vec()) - .unwrap_or_default(); - - if let Some(calt_index) = features.iter().position(|(tag, _)| tag == "calt") { - features[calt_index].1 = bit; - } else { - features.push(("calt".into(), bit)); - } - - theme_settings.buffer_font_features = Some(FontFeatures(Arc::new(features))); - }); -} - -fn read_format_on_save(cx: &App) -> bool { - match AllLanguageSettings::get_global(cx).defaults.format_on_save { - FormatOnSave::On | FormatOnSave::List(_) => true, - FormatOnSave::Off => false, - } -} - -fn write_format_on_save(format_on_save: bool, cx: &mut App) { - let fs = ::global(cx); - - update_settings_file::(fs, cx, move |language_settings, _| { - language_settings.defaults.format_on_save = Some(match format_on_save { - true => FormatOnSave::On, - false => FormatOnSave::Off, - }); - }); -} - -fn render_setting_import_button( - tab_index: isize, - label: SharedString, - icon_name: IconName, - action: &dyn Action, - imported: bool, -) -> impl IntoElement { - let action = action.boxed_clone(); - h_flex().w_full().child( - ButtonLike::new(label.clone()) - .full_width() - .style(ButtonStyle::Outlined) - .size(ButtonSize::Large) - .tab_index(tab_index) - .child( - h_flex() - .w_full() - .justify_between() - .child( - h_flex() - .gap_1p5() - .px_1() - .child( - Icon::new(icon_name) - .color(Color::Muted) - .size(IconSize::XSmall), - ) - .child(Label::new(label.clone())), - ) - .when(imported, |this| { - this.child( - h_flex() - .gap_1p5() - .child( - Icon::new(IconName::Check) - .color(Color::Success) - .size(IconSize::XSmall), - ) - .child(Label::new("Imported").size(LabelSize::Small)), - ) - }), - ) - .on_click(move |_, window, cx| { - telemetry::event!("Welcome Import Settings", import_source = label,); - window.dispatch_action(action.boxed_clone(), cx); - }), - ) -} - -fn render_import_settings_section(tab_index: &mut isize, cx: &App) -> impl IntoElement { - let import_state = SettingsImportState::global(cx); - let imports: [(SharedString, IconName, &dyn Action, bool); 2] = [ - ( - "VS Code".into(), - IconName::EditorVsCode, - &ImportVsCodeSettings { skip_prompt: false }, - import_state.vscode, - ), - ( - "Cursor".into(), - IconName::EditorCursor, - &ImportCursorSettings { skip_prompt: false }, - import_state.cursor, - ), - ]; - - let [vscode, cursor] = imports.map(|(label, icon_name, action, imported)| { - *tab_index += 1; - render_setting_import_button(*tab_index - 1, label, icon_name, action, imported) - }); - - v_flex() - .gap_4() - .child( - v_flex() - .child(Label::new("Import Settings").size(LabelSize::Large)) - .child( - Label::new("Automatically pull your settings from other editors.") - .color(Color::Muted), - ), - ) - .child(h_flex().w_full().gap_4().child(vscode).child(cursor)) -} - -fn render_font_customization_section( - tab_index: &mut isize, - window: &mut Window, - cx: &mut App, -) -> impl IntoElement { - let theme_settings = ThemeSettings::get_global(cx); - let ui_font_size = theme_settings.ui_font_size(cx); - let ui_font_family = theme_settings.ui_font.family.clone(); - let buffer_font_family = theme_settings.buffer_font.family.clone(); - let buffer_font_size = theme_settings.buffer_font_size(cx); - - let ui_font_picker = - cx.new(|cx| font_picker(ui_font_family.clone(), write_ui_font_family, window, cx)); - - let buffer_font_picker = cx.new(|cx| { - font_picker( - buffer_font_family.clone(), - write_buffer_font_family, - window, - cx, - ) - }); - - let ui_font_handle = ui::PopoverMenuHandle::default(); - let buffer_font_handle = ui::PopoverMenuHandle::default(); - - h_flex() - .w_full() - .gap_4() - .child( - v_flex() - .w_full() - .gap_1() - .child(Label::new("UI Font")) - .child( - h_flex() - .w_full() - .justify_between() - .gap_2() - .child( - PopoverMenu::new("ui-font-picker") - .menu({ - let ui_font_picker = ui_font_picker; - move |_window, _cx| Some(ui_font_picker.clone()) - }) - .trigger( - ButtonLike::new("ui-font-family-button") - .style(ButtonStyle::Outlined) - .size(ButtonSize::Medium) - .full_width() - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }) - .child( - h_flex() - .w_full() - .justify_between() - .child(Label::new(ui_font_family)) - .child( - Icon::new(IconName::ChevronUpDown) - .color(Color::Muted) - .size(IconSize::XSmall), - ), - ), - ) - .full_width(true) - .anchor(gpui::Corner::TopLeft) - .offset(gpui::Point { - x: px(0.0), - y: px(4.0), - }) - .with_handle(ui_font_handle), - ) - .child( - NumericStepper::new( - "ui-font-size", - ui_font_size.to_string(), - move |_, _, cx| { - write_ui_font_size(ui_font_size - px(1.), cx); - }, - move |_, _, cx| { - write_ui_font_size(ui_font_size + px(1.), cx); - }, - ) - .style(ui::NumericStepperStyle::Outlined) - .tab_index({ - *tab_index += 2; - *tab_index - 2 - }), - ), - ), - ) - .child( - v_flex() - .w_full() - .gap_1() - .child(Label::new("Editor Font")) - .child( - h_flex() - .w_full() - .justify_between() - .gap_2() - .child( - PopoverMenu::new("buffer-font-picker") - .menu({ - let buffer_font_picker = buffer_font_picker; - move |_window, _cx| Some(buffer_font_picker.clone()) - }) - .trigger( - ButtonLike::new("buffer-font-family-button") - .style(ButtonStyle::Outlined) - .size(ButtonSize::Medium) - .full_width() - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }) - .child( - h_flex() - .w_full() - .justify_between() - .child(Label::new(buffer_font_family)) - .child( - Icon::new(IconName::ChevronUpDown) - .color(Color::Muted) - .size(IconSize::XSmall), - ), - ), - ) - .full_width(true) - .anchor(gpui::Corner::TopLeft) - .offset(gpui::Point { - x: px(0.0), - y: px(4.0), - }) - .with_handle(buffer_font_handle), - ) - .child( - NumericStepper::new( - "buffer-font-size", - buffer_font_size.to_string(), - move |_, _, cx| { - write_buffer_font_size(buffer_font_size - px(1.), cx); - }, - move |_, _, cx| { - write_buffer_font_size(buffer_font_size + px(1.), cx); - }, - ) - .style(ui::NumericStepperStyle::Outlined) - .tab_index({ - *tab_index += 2; - *tab_index - 2 - }), - ), - ), - ) -} - -type FontPicker = Picker; - -pub struct FontPickerDelegate { - fonts: Vec, - filtered_fonts: Vec, - selected_index: usize, - current_font: SharedString, - on_font_changed: Arc, -} - -impl FontPickerDelegate { - fn new( - current_font: SharedString, - on_font_changed: impl Fn(SharedString, &mut App) + 'static, - cx: &mut Context, - ) -> Self { - let font_family_cache = FontFamilyCache::global(cx); - - let fonts = font_family_cache - .try_list_font_families() - .unwrap_or_else(|| vec![current_font.clone()]); - let selected_index = fonts - .iter() - .position(|font| *font == current_font) - .unwrap_or(0); - - let filtered_fonts = fonts - .iter() - .enumerate() - .map(|(index, font)| StringMatch { - candidate_id: index, - string: font.to_string(), - positions: Vec::new(), - score: 0.0, - }) - .collect(); - - Self { - fonts, - filtered_fonts, - selected_index, - current_font, - on_font_changed: Arc::new(on_font_changed), - } - } -} - -impl PickerDelegate for FontPickerDelegate { - type ListItem = AnyElement; - - fn match_count(&self) -> usize { - self.filtered_fonts.len() - } - - fn selected_index(&self) -> usize { - self.selected_index - } - - fn set_selected_index(&mut self, ix: usize, _: &mut Window, cx: &mut Context) { - self.selected_index = ix.min(self.filtered_fonts.len().saturating_sub(1)); - cx.notify(); - } - - fn placeholder_text(&self, _window: &mut Window, _cx: &mut App) -> Arc { - "Search fonts…".into() - } - - fn update_matches( - &mut self, - query: String, - _window: &mut Window, - cx: &mut Context, - ) -> Task<()> { - let fonts = self.fonts.clone(); - let current_font = self.current_font.clone(); - - let matches: Vec = if query.is_empty() { - fonts - .iter() - .enumerate() - .map(|(index, font)| StringMatch { - candidate_id: index, - string: font.to_string(), - positions: Vec::new(), - score: 0.0, - }) - .collect() - } else { - let _candidates: Vec = fonts - .iter() - .enumerate() - .map(|(id, font)| StringMatchCandidate::new(id, font.as_ref())) - .collect(); - - fonts - .iter() - .enumerate() - .filter(|(_, font)| font.to_lowercase().contains(&query.to_lowercase())) - .map(|(index, font)| StringMatch { - candidate_id: index, - string: font.to_string(), - positions: Vec::new(), - score: 0.0, - }) - .collect() - }; - - let selected_index = if query.is_empty() { - fonts - .iter() - .position(|font| *font == current_font) - .unwrap_or(0) - } else { - matches - .iter() - .position(|m| fonts[m.candidate_id] == current_font) - .unwrap_or(0) - }; - - self.filtered_fonts = matches; - self.selected_index = selected_index; - cx.notify(); - - Task::ready(()) - } - - fn confirm(&mut self, _secondary: bool, _window: &mut Window, cx: &mut Context) { - if let Some(font_match) = self.filtered_fonts.get(self.selected_index) { - let font = font_match.string.clone(); - (self.on_font_changed)(font.into(), cx); - } - } - - fn dismissed(&mut self, _window: &mut Window, _cx: &mut Context) {} - - fn render_match( - &self, - ix: usize, - selected: bool, - _window: &mut Window, - _cx: &mut Context, - ) -> Option { - let font_match = self.filtered_fonts.get(ix)?; - - Some( - ListItem::new(ix) - .inset(true) - .spacing(ListItemSpacing::Sparse) - .toggle_state(selected) - .child(Label::new(font_match.string.clone())) - .into_any_element(), - ) - } -} - -fn font_picker( - current_font: SharedString, - on_font_changed: impl Fn(SharedString, &mut App) + 'static, - window: &mut Window, - cx: &mut Context, -) -> FontPicker { - let delegate = FontPickerDelegate::new(current_font, on_font_changed, cx); - - Picker::uniform_list(delegate, window, cx) - .show_scrollbar(true) - .width(rems_from_px(210.)) - .max_height(Some(rems(20.).into())) -} - -fn render_popular_settings_section( - tab_index: &mut isize, - window: &mut Window, - cx: &mut App, -) -> impl IntoElement { - const LIGATURE_TOOLTIP: &str = - "Font ligatures combine two characters into one. For example, turning != into ≠."; - - v_flex() - .pt_6() - .gap_4() - .border_t_1() - .border_color(cx.theme().colors().border_variant.opacity(0.5)) - .child(Label::new("Popular Settings").size(LabelSize::Large)) - .child(render_font_customization_section(tab_index, window, cx)) - .child( - SwitchField::new( - "onboarding-font-ligatures", - "Font Ligatures", - Some("Combine text characters into their associated symbols.".into()), - if read_font_ligatures(cx) { - ui::ToggleState::Selected - } else { - ui::ToggleState::Unselected - }, - |toggle_state, _, cx| { - let enabled = toggle_state == &ToggleState::Selected; - telemetry::event!( - "Welcome Font Ligature", - options = if enabled { "on" } else { "off" }, - ); - - write_font_ligatures(enabled, cx); - }, - ) - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }) - .tooltip(Tooltip::text(LIGATURE_TOOLTIP)), - ) - .child( - SwitchField::new( - "onboarding-format-on-save", - "Format on Save", - Some("Format code automatically when saving.".into()), - if read_format_on_save(cx) { - ui::ToggleState::Selected - } else { - ui::ToggleState::Unselected - }, - |toggle_state, _, cx| { - let enabled = toggle_state == &ToggleState::Selected; - telemetry::event!( - "Welcome Format On Save Changed", - options = if enabled { "on" } else { "off" }, - ); - - write_format_on_save(enabled, cx); - }, - ) - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }), - ) - .child( - SwitchField::new( - "onboarding-enable-inlay-hints", - "Inlay Hints", - Some("See parameter names for function and method calls inline.".into()), - if read_inlay_hints(cx) { - ui::ToggleState::Selected - } else { - ui::ToggleState::Unselected - }, - |toggle_state, _, cx| { - let enabled = toggle_state == &ToggleState::Selected; - telemetry::event!( - "Welcome Inlay Hints Changed", - options = if enabled { "on" } else { "off" }, - ); - - write_inlay_hints(enabled, cx); - }, - ) - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }), - ) - .child( - SwitchField::new( - "onboarding-git-blame-switch", - "Inline Git Blame", - Some("See who committed each line on a given file.".into()), - if read_git_blame(cx) { - ui::ToggleState::Selected - } else { - ui::ToggleState::Unselected - }, - |toggle_state, _, cx| { - let enabled = toggle_state == &ToggleState::Selected; - telemetry::event!( - "Welcome Git Blame Changed", - options = if enabled { "on" } else { "off" }, - ); - - write_git_blame(enabled, cx); - }, - ) - .tab_index({ - *tab_index += 1; - *tab_index - 1 - }), - ) - .child( - h_flex() - .items_start() - .justify_between() - .child( - v_flex().child(Label::new("Minimap")).child( - Label::new("See a high-level overview of your source code.") - .color(Color::Muted), - ), - ) - .child( - ToggleButtonGroup::single_row( - "onboarding-show-mini-map", - [ - ToggleButtonSimple::new("Auto", |_, _, cx| { - write_show_mini_map(ShowMinimap::Auto, cx); - }) - .tooltip(Tooltip::text( - "Show the minimap if the editor's scrollbar is visible.", - )), - ToggleButtonSimple::new("Always", |_, _, cx| { - write_show_mini_map(ShowMinimap::Always, cx); - }), - ToggleButtonSimple::new("Never", |_, _, cx| { - write_show_mini_map(ShowMinimap::Never, cx); - }), - ], - ) - .selected_index(match read_show_mini_map(cx) { - ShowMinimap::Auto => 0, - ShowMinimap::Always => 1, - ShowMinimap::Never => 2, - }) - .tab_index(tab_index) - .style(ToggleButtonGroupStyle::Outlined) - .width(ui::rems_from_px(3. * 64.)), - ), - ) -} - -pub(crate) fn render_editing_page(window: &mut Window, cx: &mut App) -> impl IntoElement { - let mut tab_index = 0; - v_flex() - .gap_6() - .child(render_import_settings_section(&mut tab_index, cx)) - .child(render_popular_settings_section(&mut tab_index, window, cx)) -} diff --git a/crates/onboarding/src/multibuffer_hint.rs b/crates/onboarding/src/multibuffer_hint.rs index 20752449c76e80e8af91eaaf39b9a01362ba4ce1..2201c9689faf744e6744f5c4b30886c075ceaa69 100644 --- a/crates/onboarding/src/multibuffer_hint.rs +++ b/crates/onboarding/src/multibuffer_hint.rs @@ -79,7 +79,7 @@ impl MultibufferHint { return ToolbarItemLocation::Hidden; }; - if active_pane_item.is_singleton(cx) + if active_pane_item.buffer_kind(cx) == ItemBufferKind::Singleton || active_pane_item.breadcrumbs(cx.theme(), cx).is_none() || !active_pane_item.can_save(cx) { diff --git a/crates/onboarding/src/onboarding.rs b/crates/onboarding/src/onboarding.rs index 9dcf27c7cbebf6621bbeb558619944c768e63fb6..9273f0d7d87851b5118d7835244074502fc128c7 100644 --- a/crates/onboarding/src/onboarding.rs +++ b/crates/onboarding/src/onboarding.rs @@ -5,8 +5,8 @@ use db::kvp::KEY_VALUE_STORE; use fs::Fs; use gpui::{ Action, AnyElement, App, AppContext, AsyncWindowContext, Context, Entity, EventEmitter, - FocusHandle, Focusable, Global, IntoElement, KeyContext, Render, SharedString, Subscription, - Task, WeakEntity, Window, actions, + FocusHandle, Focusable, Global, IntoElement, KeyContext, Render, ScrollHandle, SharedString, + Subscription, Task, WeakEntity, Window, actions, }; use notifications::status_toast::{StatusToast, ToastIcon}; use schemars::JsonSchema; @@ -14,9 +14,10 @@ use serde::Deserialize; use settings::{SettingsStore, VsCodeSettingsSource}; use std::sync::Arc; use ui::{ - Avatar, ButtonLike, FluentBuilder, Headline, KeyBinding, ParentElement as _, - StatefulInteractiveElement, Vector, VectorName, prelude::*, rems_from_px, + Divider, KeyBinding, ParentElement as _, StatefulInteractiveElement, Vector, VectorName, + WithScrollbar as _, prelude::*, rems_from_px, }; +pub use ui_input::font_picker; use workspace::{ AppState, Workspace, WorkspaceId, dock::DockPosition, @@ -25,10 +26,8 @@ use workspace::{ open_new, register_serializable_item, with_active_or_new_workspace, }; -mod ai_setup_page; mod base_keymap_picker; mod basics_page; -mod editing_page; pub mod multibuffer_hint; mod theme_preview; mod welcome; @@ -65,12 +64,6 @@ actions!( actions!( onboarding, [ - /// Activates the Basics page. - ActivateBasicsPage, - /// Activates the Editing page. - ActivateEditingPage, - /// Activates the AI Setup page. - ActivateAISetupPage, /// Finish the onboarding process. Finish, /// Sign in while in the onboarding flow. @@ -215,28 +208,11 @@ pub fn show_onboarding_view(app_state: Arc, cx: &mut App) -> Task &'static str { - match self { - SelectedPage::Basics => "Basics", - SelectedPage::Editing => "Editing", - SelectedPage::AiSetup => "AI Setup", - } - } -} - struct Onboarding { workspace: WeakEntity, focus_handle: FocusHandle, - selected_page: SelectedPage, user_store: Entity, + scroll_handle: ScrollHandle, _settings_subscription: Subscription, } @@ -256,7 +232,7 @@ impl Onboarding { Self { workspace: workspace.weak_handle(), focus_handle: cx.focus_handle(), - selected_page: SelectedPage::Basics, + scroll_handle: ScrollHandle::new(), user_store: workspace.user_store().clone(), _settings_subscription: cx .observe_global::(move |_, cx| cx.notify()), @@ -264,241 +240,8 @@ impl Onboarding { }) } - fn set_page( - &mut self, - page: SelectedPage, - clicked: Option<&'static str>, - cx: &mut Context, - ) { - if let Some(click) = clicked { - telemetry::event!( - "Welcome Tab Clicked", - from = self.selected_page.name(), - to = page.name(), - clicked = click, - ); - } - - self.selected_page = page; - cx.notify(); - cx.emit(ItemEvent::UpdateTab); - } - - fn render_nav_buttons( - &mut self, - window: &mut Window, - cx: &mut Context, - ) -> [impl IntoElement; 3] { - let pages = [ - SelectedPage::Basics, - SelectedPage::Editing, - SelectedPage::AiSetup, - ]; - - let text = ["Basics", "Editing", "AI Setup"]; - - let actions: [&dyn Action; 3] = [ - &ActivateBasicsPage, - &ActivateEditingPage, - &ActivateAISetupPage, - ]; - - let mut binding = actions.map(|action| { - KeyBinding::for_action_in(action, &self.focus_handle, window, cx) - .map(|kb| kb.size(rems_from_px(12.))) - }); - - pages.map(|page| { - let i = page as usize; - let selected = self.selected_page == page; - h_flex() - .id(text[i]) - .relative() - .w_full() - .gap_2() - .px_2() - .py_0p5() - .justify_between() - .rounded_sm() - .when(selected, |this| { - this.child( - div() - .h_4() - .w_px() - .bg(cx.theme().colors().text_accent) - .absolute() - .left_0(), - ) - }) - .hover(|style| style.bg(cx.theme().colors().element_hover)) - .child(Label::new(text[i]).map(|this| { - if selected { - this.color(Color::Default) - } else { - this.color(Color::Muted) - } - })) - .child(binding[i].take().map_or( - gpui::Empty.into_any_element(), - IntoElement::into_any_element, - )) - .on_click(cx.listener(move |this, click_event, _, cx| { - let click = match click_event { - gpui::ClickEvent::Mouse(_) => "mouse", - gpui::ClickEvent::Keyboard(_) => "keyboard", - }; - - this.set_page(page, Some(click), cx); - })) - }) - } - - fn render_nav(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - let ai_setup_page = matches!(self.selected_page, SelectedPage::AiSetup); - - v_flex() - .h_full() - .w(rems_from_px(220.)) - .flex_shrink_0() - .gap_4() - .justify_between() - .child( - v_flex() - .gap_6() - .child( - h_flex() - .px_2() - .gap_4() - .child(Vector::square(VectorName::ZedLogo, rems(2.5))) - .child( - v_flex() - .child( - Headline::new("Welcome to Zed").size(HeadlineSize::Small), - ) - .child( - Label::new("The editor for what's next") - .color(Color::Muted) - .size(LabelSize::Small) - .italic(), - ), - ), - ) - .child( - v_flex() - .gap_4() - .child( - v_flex() - .py_4() - .border_y_1() - .border_color(cx.theme().colors().border_variant.opacity(0.5)) - .gap_1() - .children(self.render_nav_buttons(window, cx)), - ) - .map(|this| { - let keybinding = KeyBinding::for_action_in( - &Finish, - &self.focus_handle, - window, - cx, - ) - .map(|kb| kb.size(rems_from_px(12.))); - - if ai_setup_page { - this.child( - ButtonLike::new("start_building") - .style(ButtonStyle::Outlined) - .size(ButtonSize::Medium) - .child( - h_flex() - .ml_1() - .w_full() - .justify_between() - .child(Label::new("Start Building")) - .children(keybinding), - ) - .on_click(|_, window, cx| { - window.dispatch_action(Finish.boxed_clone(), cx); - }), - ) - } else { - this.child( - ButtonLike::new("skip_all") - .size(ButtonSize::Medium) - .child( - h_flex() - .ml_1() - .w_full() - .justify_between() - .child( - Label::new("Skip All").color(Color::Muted), - ) - .children(keybinding), - ) - .on_click(|_, window, cx| { - window.dispatch_action(Finish.boxed_clone(), cx); - }), - ) - } - }), - ), - ) - .child( - if let Some(user) = self.user_store.read(cx).current_user() { - v_flex() - .gap_1() - .child( - h_flex() - .ml_2() - .gap_2() - .max_w_full() - .w_full() - .child(Avatar::new(user.avatar_uri.clone())) - .child(Label::new(user.github_login.clone()).truncate()), - ) - .child( - ButtonLike::new("open_account") - .size(ButtonSize::Medium) - .child( - h_flex() - .ml_1() - .w_full() - .justify_between() - .child(Label::new("Open Account")) - .children( - KeyBinding::for_action_in( - &OpenAccount, - &self.focus_handle, - window, - cx, - ) - .map(|kb| kb.size(rems_from_px(12.))), - ), - ) - .on_click(|_, window, cx| { - window.dispatch_action(OpenAccount.boxed_clone(), cx); - }), - ) - .into_any_element() - } else { - Button::new("sign_in", "Sign In") - .full_width() - .style(ButtonStyle::Outlined) - .size(ButtonSize::Medium) - .key_binding( - KeyBinding::for_action_in(&SignIn, &self.focus_handle, window, cx) - .map(|kb| kb.size(rems_from_px(12.))), - ) - .on_click(|_, window, cx| { - telemetry::event!("Welcome Sign In Clicked"); - window.dispatch_action(SignIn.boxed_clone(), cx); - }) - .into_any_element() - }, - ) - } - fn on_finish(_: &Finish, _: &mut Window, cx: &mut App) { - telemetry::event!("Welcome Skip Clicked"); + telemetry::event!("Finish Setup"); go_to_welcome_page(cx); } @@ -519,29 +262,14 @@ impl Onboarding { cx.open_url(&zed_urls::account_url(cx)) } - fn render_page(&mut self, window: &mut Window, cx: &mut Context) -> AnyElement { - let client = Client::global(cx); - - match self.selected_page { - SelectedPage::Basics => crate::basics_page::render_basics_page(cx).into_any_element(), - SelectedPage::Editing => { - crate::editing_page::render_editing_page(window, cx).into_any_element() - } - SelectedPage::AiSetup => crate::ai_setup_page::render_ai_setup_page( - self.workspace.clone(), - self.user_store.clone(), - client, - window, - cx, - ) - .into_any_element(), - } + fn render_page(&mut self, cx: &mut Context) -> AnyElement { + crate::basics_page::render_basics_page(cx).into_any_element() } } impl Render for Onboarding { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - h_flex() + div() .image_cache(gpui::retain_all("onboarding-page")) .key_context({ let mut ctx = KeyContext::new_with_defaults(); @@ -555,15 +283,6 @@ impl Render for Onboarding { .on_action(Self::on_finish) .on_action(Self::handle_sign_in) .on_action(Self::handle_open_account) - .on_action(cx.listener(|this, _: &ActivateBasicsPage, _, cx| { - this.set_page(SelectedPage::Basics, Some("action"), cx); - })) - .on_action(cx.listener(|this, _: &ActivateEditingPage, _, cx| { - this.set_page(SelectedPage::Editing, Some("action"), cx); - })) - .on_action(cx.listener(|this, _: &ActivateAISetupPage, _, cx| { - this.set_page(SelectedPage::AiSetup, Some("action"), cx); - })) .on_action(cx.listener(|_, _: &menu::SelectNext, window, cx| { window.focus_next(); cx.notify(); @@ -573,28 +292,67 @@ impl Render for Onboarding { cx.notify(); })) .child( - h_flex() - .max_w(rems_from_px(1100.)) - .max_h(rems_from_px(850.)) + div() + .max_w(Rems(48.0)) .size_full() - .m_auto() - .py_20() - .px_12() - .items_start() - .gap_12() - .child(self.render_nav(window, cx)) + .mx_auto() .child( v_flex() .id("page-content") + .m_auto() + .p_12() .size_full() .max_w_full() .min_w_0() - .pl_12() - .border_l_1() - .border_color(cx.theme().colors().border_variant.opacity(0.5)) + .gap_6() .overflow_y_scroll() - .child(self.render_page(window, cx)), - ), + .child( + h_flex() + .w_full() + .gap_4() + .justify_between() + .child( + h_flex() + .gap_4() + .child(Vector::square(VectorName::ZedLogo, rems(2.5))) + .child( + v_flex() + .child( + Headline::new("Welcome to Zed") + .size(HeadlineSize::Small), + ) + .child( + Label::new("The editor for what's next") + .color(Color::Muted) + .size(LabelSize::Small) + .italic(), + ), + ), + ) + .child({ + Button::new("finish_setup", "Finish Setup") + .style(ButtonStyle::Filled) + .size(ButtonSize::Medium) + .width(Rems(12.0)) + .key_binding( + KeyBinding::for_action_in( + &Finish, + &self.focus_handle, + window, + cx, + ) + .map(|kb| kb.size(rems_from_px(12.))), + ) + .on_click(|_, window, cx| { + window.dispatch_action(Finish.boxed_clone(), cx); + }) + }), + ) + .child(Divider::horizontal().color(ui::DividerColor::BorderVariant)) + .child(self.render_page(cx)) + .track_scroll(&self.scroll_handle), + ) + .vertical_scrollbar_for(self.scroll_handle.clone(), window, cx), ) } } @@ -631,7 +389,7 @@ impl Item for Onboarding { Some(cx.new(|cx| Onboarding { workspace: self.workspace.clone(), user_store: self.user_store.clone(), - selected_page: self.selected_page, + scroll_handle: ScrollHandle::new(), focus_handle: cx.focus_handle(), _settings_subscription: cx.observe_global::(move |_, cx| cx.notify()), })) @@ -816,25 +574,10 @@ impl workspace::SerializableItem for Onboarding { cx: &mut App, ) -> gpui::Task>> { window.spawn(cx, async move |cx| { - if let Some(page_number) = + if let Some(_) = persistence::ONBOARDING_PAGES.get_onboarding_page(item_id, workspace_id)? { - let page = match page_number { - 0 => Some(SelectedPage::Basics), - 1 => Some(SelectedPage::Editing), - 2 => Some(SelectedPage::AiSetup), - _ => None, - }; - workspace.update(cx, |workspace, cx| { - let onboarding_page = Onboarding::new(workspace, cx); - if let Some(page) = page { - zlog::info!("Onboarding page {page:?} loaded"); - onboarding_page.update(cx, |onboarding_page, cx| { - onboarding_page.set_page(page, None, cx); - }) - } - onboarding_page - }) + workspace.update(cx, |workspace, cx| Onboarding::new(workspace, cx)) } else { Err(anyhow::anyhow!("No onboarding page to deserialize")) } @@ -850,10 +593,10 @@ impl workspace::SerializableItem for Onboarding { cx: &mut ui::Context, ) -> Option>> { let workspace_id = workspace.database_id()?; - let page_number = self.selected_page as u16; + Some(cx.background_spawn(async move { persistence::ONBOARDING_PAGES - .save_onboarding_page(item_id, workspace_id, page_number) + .save_onboarding_page(item_id, workspace_id) .await })) } @@ -876,17 +619,32 @@ mod persistence { impl Domain for OnboardingPagesDb { const NAME: &str = stringify!(OnboardingPagesDb); - const MIGRATIONS: &[&str] = &[sql!( - CREATE TABLE onboarding_pages ( - workspace_id INTEGER, - item_id INTEGER UNIQUE, - page_number INTEGER, - - PRIMARY KEY(workspace_id, item_id), - FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id) - ON DELETE CASCADE - ) STRICT; - )]; + const MIGRATIONS: &[&str] = &[ + sql!( + CREATE TABLE onboarding_pages ( + workspace_id INTEGER, + item_id INTEGER UNIQUE, + page_number INTEGER, + + PRIMARY KEY(workspace_id, item_id), + FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id) + ON DELETE CASCADE + ) STRICT; + ), + sql!( + CREATE TABLE onboarding_pages_2 ( + workspace_id INTEGER, + item_id INTEGER UNIQUE, + + PRIMARY KEY(workspace_id, item_id), + FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id) + ON DELETE CASCADE + ) STRICT; + INSERT INTO onboarding_pages_2 SELECT workspace_id, item_id FROM onboarding_pages; + DROP TABLE onboarding_pages; + ALTER TABLE onboarding_pages_2 RENAME TO onboarding_pages; + ), + ]; } db::static_connection!(ONBOARDING_PAGES, OnboardingPagesDb, [WorkspaceDb]); @@ -895,11 +653,10 @@ mod persistence { query! { pub async fn save_onboarding_page( item_id: workspace::ItemId, - workspace_id: workspace::WorkspaceId, - page_number: u16 + workspace_id: workspace::WorkspaceId ) -> Result<()> { - INSERT OR REPLACE INTO onboarding_pages(item_id, workspace_id, page_number) - VALUES (?, ?, ?) + INSERT OR REPLACE INTO onboarding_pages(item_id, workspace_id) + VALUES (?, ?) } } @@ -907,8 +664,8 @@ mod persistence { pub fn get_onboarding_page( item_id: workspace::ItemId, workspace_id: workspace::WorkspaceId - ) -> Result> { - SELECT page_number + ) -> Result> { + SELECT item_id FROM onboarding_pages WHERE item_id = ? AND workspace_id = ? } diff --git a/crates/onboarding/src/welcome.rs b/crates/onboarding/src/welcome.rs index 8ff55d812b007d1b210781ec747b30cd1f505f35..50f0d83698adbd1b8bff0d7e73a5f342d8fe11cd 100644 --- a/crates/onboarding/src/welcome.rs +++ b/crates/onboarding/src/welcome.rs @@ -5,7 +5,7 @@ use gpui::{ use menu::{SelectNext, SelectPrevious}; use ui::{ButtonLike, Divider, DividerColor, KeyBinding, Vector, VectorName, prelude::*}; use workspace::{ - NewFile, Open, WorkspaceId, + NewFile, Open, item::{Item, ItemEvent}, with_active_or_new_workspace, }; @@ -151,6 +151,7 @@ impl SectionEntry { } pub struct WelcomePage { + first_paint: bool, focus_handle: FocusHandle, } @@ -168,6 +169,10 @@ impl WelcomePage { impl Render for WelcomePage { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + if self.first_paint { + window.request_animation_frame(); + self.first_paint = false; + } let (first_section, second_section) = CONTENT; let first_section_entries = first_section.entries.len(); let last_index = first_section_entries + second_section.entries.len(); @@ -311,7 +316,10 @@ impl WelcomePage { cx.on_focus(&focus_handle, window, |_, _, cx| cx.notify()) .detach(); - WelcomePage { focus_handle } + WelcomePage { + first_paint: true, + focus_handle, + } }) } } @@ -339,15 +347,6 @@ impl Item for WelcomePage { false } - fn clone_on_split( - &self, - _workspace_id: Option, - _: &mut Window, - _: &mut Context, - ) -> Option> { - None - } - fn to_item_events(event: &Self::Event, mut f: impl FnMut(workspace::item::ItemEvent)) { f(*event) } diff --git a/crates/open_ai/Cargo.toml b/crates/open_ai/Cargo.toml index bae00f0a8e888390cc8be4909e752567b94d1a27..776e308c490bf464c641800399ffaf8a1f301702 100644 --- a/crates/open_ai/Cargo.toml +++ b/crates/open_ai/Cargo.toml @@ -23,5 +23,6 @@ schemars = { workspace = true, optional = true } log.workspace = true serde.workspace = true serde_json.workspace = true +settings.workspace = true strum.workspace = true workspace-hack.workspace = true diff --git a/crates/open_ai/src/open_ai.rs b/crates/open_ai/src/open_ai.rs index fda0544be1748f3bf958cd159bc55edccdbb5c14..1cada03a60c54668d2675c2e076345a9507fcb43 100644 --- a/crates/open_ai/src/open_ai.rs +++ b/crates/open_ai/src/open_ai.rs @@ -3,6 +3,7 @@ use futures::{AsyncBufReadExt, AsyncReadExt, StreamExt, io::BufReader, stream::B use http_client::{AsyncBody, HttpClient, Method, Request as HttpRequest}; use serde::{Deserialize, Serialize}; use serde_json::Value; +pub use settings::OpenAiReasoningEffort as ReasoningEffort; use std::{convert::TryFrom, future::Future}; use strum::EnumIter; @@ -278,16 +279,6 @@ pub enum ToolChoice { Other(ToolDefinition), } -#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] -#[serde(rename_all = "lowercase")] -pub enum ReasoningEffort { - Minimal, - Low, - Medium, - High, -} - #[derive(Clone, Deserialize, Serialize, Debug)] #[serde(tag = "type", rename_all = "snake_case")] pub enum ToolDefinition { diff --git a/crates/open_router/Cargo.toml b/crates/open_router/Cargo.toml index 54348ea5a598d5c92a30ddd60ea68d3fa7b6046f..f9728673bd891488b90c062acf7cb507bb9e329f 100644 --- a/crates/open_router/Cargo.toml +++ b/crates/open_router/Cargo.toml @@ -22,7 +22,7 @@ http_client.workspace = true schemars = { workspace = true, optional = true } serde.workspace = true serde_json.workspace = true -thiserror.workspace = true +settings.workspace = true strum.workspace = true -util.workspace = true +thiserror.workspace = true workspace-hack.workspace = true diff --git a/crates/open_router/src/open_router.rs b/crates/open_router/src/open_router.rs index 2e5f33b161b5947eceb64c9b2c2c4ae81116b813..0081c877756dab46433481ac58f2180877e7667f 100644 --- a/crates/open_router/src/open_router.rs +++ b/crates/open_router/src/open_router.rs @@ -3,10 +3,13 @@ use futures::{AsyncBufReadExt, AsyncReadExt, StreamExt, io::BufReader, stream::B use http_client::{AsyncBody, HttpClient, Method, Request as HttpRequest, http}; use serde::{Deserialize, Serialize}; use serde_json::Value; +pub use settings::DataCollection; +pub use settings::ModelMode; +pub use settings::OpenRouterAvailableModel as AvailableModel; +pub use settings::OpenRouterProvider as Provider; use std::{convert::TryFrom, io, time::Duration}; use strum::EnumString; use thiserror::Error; -use util::serde::default_true; pub const OPEN_ROUTER_API_URL: &str = "https://openrouter.ai/api/v1"; @@ -65,41 +68,6 @@ impl From for String { } } -#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum DataCollection { - Allow, - Disallow, -} - -impl Default for DataCollection { - fn default() -> Self { - Self::Allow - } -} - -#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Provider { - #[serde(skip_serializing_if = "Option::is_none")] - order: Option>, - #[serde(default = "default_true")] - allow_fallbacks: bool, - #[serde(default)] - require_parameters: bool, - #[serde(default)] - data_collection: DataCollection, - #[serde(skip_serializing_if = "Option::is_none")] - only: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - ignore: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - quantizations: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - sort: Option, -} - #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub struct Model { @@ -113,16 +81,6 @@ pub struct Model { pub provider: Option, } -#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] -#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] -pub enum ModelMode { - #[default] - Default, - Thinking { - budget_tokens: Option, - }, -} - impl Model { pub fn default_fast() -> Self { Self::new( diff --git a/crates/outline/src/outline.rs b/crates/outline/src/outline.rs index 1f85d08cee850f18a30cca9b56061854f7cbc7b1..ac74d6284f4fe2fe62bcad7be447b142255056b4 100644 --- a/crates/outline/src/outline.rs +++ b/crates/outline/src/outline.rs @@ -4,6 +4,7 @@ use std::{ sync::Arc, }; +use editor::scroll::ScrollOffset; use editor::{Anchor, AnchorRangeExt, Editor, scroll::Autoscroll}; use editor::{RowHighlightOptions, SelectionEffects}; use fuzzy::StringMatch; @@ -19,7 +20,7 @@ use settings::Settings; use theme::{ActiveTheme, ThemeSettings}; use ui::{ListItem, ListItemSpacing, prelude::*}; use util::ResultExt; -use workspace::{DismissDecision, ModalView}; +use workspace::{DismissDecision, ModalView, Workspace}; pub fn init(cx: &mut App) { cx.observe_new(OutlineView::register).detach(); @@ -47,7 +48,8 @@ pub fn toggle( .snapshot(cx) .outline(Some(cx.theme().syntax())); - if let Some((workspace, outline)) = editor.read(cx).workspace().zip(outline) { + let workspace = window.root::().flatten(); + if let Some((workspace, outline)) = workspace.zip(outline) { workspace.update(cx, |workspace, cx| { workspace.toggle_modal(window, cx, |window, cx| { OutlineView::new(outline, editor, window, cx) @@ -130,7 +132,7 @@ struct OutlineViewDelegate { active_editor: Entity, outline: Outline, selected_match_index: usize, - prev_scroll_position: Option>, + prev_scroll_position: Option>, matches: Vec, last_query: String, } @@ -389,7 +391,7 @@ mod tests { use language::{Language, LanguageConfig, LanguageMatcher}; use project::{FakeFs, Project}; use serde_json::json; - use util::path; + use util::{path, rel_path::rel_path}; use workspace::{AppState, Workspace}; #[gpui::test] @@ -430,7 +432,7 @@ mod tests { .unwrap(); let editor = workspace .update_in(cx, |workspace, window, cx| { - workspace.open_path((worktree_id, "a.rs"), None, true, window, cx) + workspace.open_path((worktree_id, rel_path("a.rs")), None, true, window, cx) }) .await .unwrap() diff --git a/crates/outline_panel/Cargo.toml b/crates/outline_panel/Cargo.toml index 6950929304fb37e1f0d140adc2b461188cbeaaf1..b851ae672df0ba4a99b25e19c8c2ebaf49676346 100644 --- a/crates/outline_panel/Cargo.toml +++ b/crates/outline_panel/Cargo.toml @@ -26,7 +26,6 @@ log.workspace = true menu.workspace = true outline.workspace = true project.workspace = true -schemars.workspace = true search.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/outline_panel/src/outline_panel.rs b/crates/outline_panel/src/outline_panel.rs index 8759e0ae0a314e5ed69e9bf45a0e7811840e7e15..de80cc0ef3530078c39194910b98f40d4b1d5ec3 100644 --- a/crates/outline_panel/src/outline_panel.rs +++ b/crates/outline_panel/src/outline_panel.rs @@ -29,7 +29,7 @@ use std::{ collections::BTreeMap, hash::Hash, ops::Range, - path::{MAIN_SEPARATOR_STR, Path, PathBuf}, + path::{Path, PathBuf}, sync::{ Arc, OnceLock, atomic::{self, AtomicBool}, @@ -38,7 +38,7 @@ use std::{ u32, }; -use outline_panel_settings::{OutlinePanelDockPosition, OutlinePanelSettings, ShowIndentGuides}; +use outline_panel_settings::{DockSide, OutlinePanelSettings, ShowIndentGuides}; use project::{File, Fs, GitEntry, GitTraversal, Project, ProjectItem}; use search::{BufferSearchBar, ProjectSearchView}; use serde::{Deserialize, Serialize}; @@ -51,7 +51,7 @@ use ui::{ Label, LabelCommon, ListItem, ScrollAxes, Scrollbars, StyledExt, StyledTypography, Toggleable, Tooltip, WithScrollbar, h_flex, v_flex, }; -use util::{RangeExt, ResultExt, TryFutureExt, debug_panic}; +use util::{RangeExt, ResultExt, TryFutureExt, debug_panic, rel_path::RelPath}; use workspace::{ OpenInTerminal, WeakItemHandle, Workspace, dock::{DockPosition, Panel, PanelEvent}, @@ -107,7 +107,7 @@ pub struct OutlinePanel { pending_serialization: Task>, fs_entries_depth: HashMap<(WorktreeId, ProjectEntryId), usize>, fs_entries: Vec, - fs_children_count: HashMap, FsChildren>>, + fs_children_count: HashMap, FsChildren>>, collapsed_entries: HashSet, unfolded_dirs: HashMap>, selected_entry: SelectedEntry, @@ -1157,7 +1157,7 @@ impl OutlinePanel { && multi_buffer_snapshot.as_singleton().is_none() && !active_editor.read(cx).is_buffer_folded(buffer_id, cx) { - offset.y = -(active_editor.read(cx).file_header_size() as f32); + offset.y = -(active_editor.read(cx).file_header_size() as f64); } active_editor.update(cx, |editor, cx| { @@ -1893,7 +1893,7 @@ impl OutlinePanel { if let Some(clipboard_text) = self .selected_entry() .and_then(|entry| self.abs_path(entry, cx)) - .map(|p| p.to_string_lossy().to_string()) + .map(|p| p.to_string_lossy().into_owned()) { cx.write_to_clipboard(ClipboardItem::new_string(clipboard_text)); } @@ -1905,6 +1905,7 @@ impl OutlinePanel { _: &mut Window, cx: &mut Context, ) { + let path_style = self.project.read(cx).path_style(cx); if let Some(clipboard_text) = self .selected_entry() .and_then(|entry| match entry { @@ -1914,7 +1915,7 @@ impl OutlinePanel { } PanelEntry::Search(_) | PanelEntry::Outline(..) => None, }) - .map(|p| p.to_string_lossy().to_string()) + .map(|p| p.display(path_style).to_string()) { cx.write_to_clipboard(ClipboardItem::new_string(clipboard_text)); } @@ -2272,7 +2273,7 @@ impl OutlinePanel { let color = entry_git_aware_label_color(entry.git_summary, entry.is_ignored, is_active); let icon = if settings.file_icons { - FileIcons::get_icon(&entry.path, cx) + FileIcons::get_icon(entry.path.as_std_path(), cx) .map(|icon_path| Icon::from_path(icon_path).color(color).into_any_element()) } else { None @@ -2303,7 +2304,7 @@ impl OutlinePanel { is_active, ); let icon = if settings.folder_icons { - FileIcons::get_folder_icon(is_expanded, &directory.entry.path, cx) + FileIcons::get_folder_icon(is_expanded, directory.entry.path.as_std_path(), cx) } else { FileIcons::get_chevron_icon(is_expanded, cx) } @@ -2329,13 +2330,13 @@ impl OutlinePanel { Some(file) => { let path = file.path(); let icon = if settings.file_icons { - FileIcons::get_icon(path.as_ref(), cx) + FileIcons::get_icon(path.as_std_path(), cx) } else { None } .map(Icon::from_path) .map(|icon| icon.color(color).into_any_element()); - (icon, file_name(path.as_ref())) + (icon, file_name(path.as_std_path())) } None => (None, "Untitled".to_string()), }, @@ -2615,19 +2616,17 @@ impl OutlinePanel { if root_entry.id == entry.id { file_name(worktree.abs_path().as_ref()) } else { - let path = worktree.absolutize(entry.path.as_ref()).ok(); - let path = path.as_deref().unwrap_or_else(|| entry.path.as_ref()); - file_name(path) + let path = worktree.absolutize(entry.path.as_ref()); + file_name(&path) } } None => { - let path = worktree.absolutize(entry.path.as_ref()).ok(); - let path = path.as_deref().unwrap_or_else(|| entry.path.as_ref()); - file_name(path) + let path = worktree.absolutize(entry.path.as_ref()); + file_name(&path) } } } - None => file_name(entry.path.as_ref()), + None => file_name(entry.path.as_std_path()), } } @@ -2669,7 +2668,7 @@ impl OutlinePanel { |mut buffer_excerpts, (excerpt_id, buffer_snapshot, excerpt_range)| { let buffer_id = buffer_snapshot.remote_id(); let file = File::from_dyn(buffer_snapshot.file()); - let entry_id = file.and_then(|file| file.project_entry_id(cx)); + let entry_id = file.and_then(|file| file.project_entry_id()); let worktree = file.map(|file| file.worktree.read(cx).snapshot()); let is_new = new_entries.contains(&excerpt_id) || !outline_panel.excerpts.contains_key(&buffer_id); @@ -2842,7 +2841,7 @@ impl OutlinePanel { } let mut new_children_count = - HashMap::, FsChildren>>::default(); + HashMap::, FsChildren>>::default(); let worktree_entries = new_worktree_entries .into_iter() @@ -3518,17 +3517,17 @@ impl OutlinePanel { .buffer_snapshot_for_id(*buffer_id, cx) .and_then(|buffer_snapshot| { let file = File::from_dyn(buffer_snapshot.file())?; - file.worktree.read(cx).absolutize(&file.path).ok() + Some(file.worktree.read(cx).absolutize(&file.path)) }), PanelEntry::Fs(FsEntry::Directory(FsEntryDirectory { worktree_id, entry, .. - })) => self - .project - .read(cx) - .worktree_for_id(*worktree_id, cx)? - .read(cx) - .absolutize(&entry.path) - .ok(), + })) => Some( + self.project + .read(cx) + .worktree_for_id(*worktree_id, cx)? + .read(cx) + .absolutize(&entry.path), + ), PanelEntry::FoldedDirs(FoldedDirsEntry { worktree_id, entries: dirs, @@ -3537,13 +3536,13 @@ impl OutlinePanel { self.project .read(cx) .worktree_for_id(*worktree_id, cx) - .and_then(|worktree| worktree.read(cx).absolutize(&entry.path).ok()) + .map(|worktree| worktree.read(cx).absolutize(&entry.path)) }), PanelEntry::Search(_) | PanelEntry::Outline(..) => None, } } - fn relative_path(&self, entry: &FsEntry, cx: &App) -> Option> { + fn relative_path(&self, entry: &FsEntry, cx: &App) -> Option> { match entry { FsEntry::ExternalFile(FsEntryExternalFile { buffer_id, .. }) => { let buffer_snapshot = self.buffer_snapshot_for_id(*buffer_id, cx)?; @@ -3627,7 +3626,7 @@ impl OutlinePanel { #[derive(Debug)] struct ParentStats { - path: Arc, + path: Arc, folded: bool, expanded: bool, depth: usize, @@ -4023,8 +4022,9 @@ impl OutlinePanel { let id = state.entries.len(); match &entry { PanelEntry::Fs(fs_entry) => { - if let Some(file_name) = - self.relative_path(fs_entry, cx).as_deref().map(file_name) + if let Some(file_name) = self + .relative_path(fs_entry, cx) + .and_then(|path| Some(path.file_name()?.to_string())) { state .match_candidates @@ -4077,7 +4077,7 @@ impl OutlinePanel { .iter() .map(|entry| self.entry_name(&worktree_id, entry, cx)) .collect::(); - dir_names_segment.to_string_lossy().to_string() + dir_names_segment.to_string_lossy().into_owned() } fn query(&self, cx: &App) -> Option { @@ -4477,21 +4477,19 @@ impl OutlinePanel { let item_text_chars = match entry { PanelEntry::Fs(FsEntry::ExternalFile(external)) => self .buffer_snapshot_for_id(external.buffer_id, cx) - .and_then(|snapshot| { - Some(snapshot.file()?.path().file_name()?.to_string_lossy().len()) - }) + .and_then(|snapshot| Some(snapshot.file()?.path().file_name()?.len())) .unwrap_or_default(), PanelEntry::Fs(FsEntry::Directory(directory)) => directory .entry .path .file_name() - .map(|name| name.to_string_lossy().len()) + .map(|name| name.len()) .unwrap_or_default(), PanelEntry::Fs(FsEntry::File(file)) => file .entry .path .file_name() - .map(|name| name.to_string_lossy().len()) + .map(|name| name.len()) .unwrap_or_default(), PanelEntry::FoldedDirs(folded_dirs) => { folded_dirs @@ -4500,11 +4498,11 @@ impl OutlinePanel { .map(|dir| { dir.path .file_name() - .map(|name| name.to_string_lossy().len()) + .map(|name| name.len()) .unwrap_or_default() }) .sum::() - + folded_dirs.entries.len().saturating_sub(1) * MAIN_SEPARATOR_STR.len() + + folded_dirs.entries.len().saturating_sub(1) * "/".len() } PanelEntry::Outline(OutlineEntry::Excerpt(excerpt)) => self .excerpt_label(excerpt.buffer_id, &excerpt.range, cx) @@ -4692,7 +4690,10 @@ impl OutlinePanel { .custom_scrollbars( Scrollbars::for_settings::() .tracked_scroll_handle(self.scroll_handle.clone()) - .with_track_along(ScrollAxes::Horizontal) + .with_track_along( + ScrollAxes::Horizontal, + cx.theme().colors().panel_background, + ) .tracked_entity(cx.entity_id()), window, cx, @@ -4795,7 +4796,7 @@ fn workspace_active_editor( } fn back_to_common_visited_parent( - visited_dirs: &mut Vec<(ProjectEntryId, Arc)>, + visited_dirs: &mut Vec<(ProjectEntryId, Arc)>, worktree_id: &WorktreeId, new_entry: &Entry, ) -> Option<(WorktreeId, ProjectEntryId)> { @@ -4835,8 +4836,8 @@ impl Panel for OutlinePanel { fn position(&self, _: &Window, cx: &App) -> DockPosition { match OutlinePanelSettings::get_global(cx).dock { - OutlinePanelDockPosition::Left => DockPosition::Left, - OutlinePanelDockPosition::Right => DockPosition::Right, + DockSide::Left => DockPosition::Left, + DockSide::Right => DockPosition::Right, } } @@ -4845,17 +4846,13 @@ impl Panel for OutlinePanel { } fn set_position(&mut self, position: DockPosition, _: &mut Window, cx: &mut Context) { - settings::update_settings_file::( - self.fs.clone(), - cx, - move |settings, _| { - let dock = match position { - DockPosition::Left | DockPosition::Bottom => OutlinePanelDockPosition::Left, - DockPosition::Right => OutlinePanelDockPosition::Right, - }; - settings.dock = Some(dock); - }, - ); + settings::update_settings_file(self.fs.clone(), cx, move |settings, _| { + let dock = match position { + DockPosition::Left | DockPosition::Bottom => DockSide::Left, + DockPosition::Right => DockSide::Right, + }; + settings.outline_panel.get_or_insert_default().dock = Some(dock); + }); } fn size(&self, _: &Window, cx: &App) -> Pixels { @@ -5281,16 +5278,15 @@ mod tests { }); }); - let all_matches = format!( - r#"{root}/ + let all_matches = r#"rust-analyzer/ crates/ ide/src/ inlay_hints/ fn_lifetime_fn.rs - search: match config.param_names_for_lifetime_elision_hints {{ - search: allocated_lifetimes.push(if config.param_names_for_lifetime_elision_hints {{ - search: Some(it) if config.param_names_for_lifetime_elision_hints => {{ - search: InlayHintsConfig {{ param_names_for_lifetime_elision_hints: true, ..TEST_CONFIG }}, + search: match config.param_names_for_lifetime_elision_hints { + search: allocated_lifetimes.push(if config.param_names_for_lifetime_elision_hints { + search: Some(it) if config.param_names_for_lifetime_elision_hints => { + search: InlayHintsConfig { param_names_for_lifetime_elision_hints: true, ..TEST_CONFIG }, inlay_hints.rs search: pub param_names_for_lifetime_elision_hints: bool, search: param_names_for_lifetime_elision_hints: self @@ -5302,7 +5298,7 @@ mod tests { search: param_names_for_lifetime_elision_hints: true, config.rs search: param_names_for_lifetime_elision_hints: self"# - ); + .to_string(); let select_first_in_all_matches = |line_to_select: &str| { assert!(all_matches.contains(line_to_select)); @@ -5360,7 +5356,7 @@ mod tests { cx, ), format!( - r#"{root}/ + r#"rust-analyzer/ crates/ ide/src/ inlay_hints/ @@ -5430,7 +5426,7 @@ mod tests { cx, ), format!( - r#"{root}/ + r#"rust-analyzer/ crates/ ide/src/{SELECTED_MARKER} rust-analyzer/src/ @@ -5513,16 +5509,15 @@ mod tests { ); }); }); - let all_matches = format!( - r#"{root}/ + let all_matches = r#"rust-analyzer/ crates/ ide/src/ inlay_hints/ fn_lifetime_fn.rs - search: match config.param_names_for_lifetime_elision_hints {{ - search: allocated_lifetimes.push(if config.param_names_for_lifetime_elision_hints {{ - search: Some(it) if config.param_names_for_lifetime_elision_hints => {{ - search: InlayHintsConfig {{ param_names_for_lifetime_elision_hints: true, ..TEST_CONFIG }}, + search: match config.param_names_for_lifetime_elision_hints { + search: allocated_lifetimes.push(if config.param_names_for_lifetime_elision_hints { + search: Some(it) if config.param_names_for_lifetime_elision_hints => { + search: InlayHintsConfig { param_names_for_lifetime_elision_hints: true, ..TEST_CONFIG }, inlay_hints.rs search: pub param_names_for_lifetime_elision_hints: bool, search: param_names_for_lifetime_elision_hints: self @@ -5534,7 +5529,7 @@ mod tests { search: param_names_for_lifetime_elision_hints: true, config.rs search: param_names_for_lifetime_elision_hints: self"# - ); + .to_string(); cx.executor() .advance_clock(UPDATE_DEBOUNCE + Duration::from_millis(100)); @@ -5653,16 +5648,15 @@ mod tests { ); }); }); - let all_matches = format!( - r#"{root}/ + let all_matches = r#"rust-analyzer/ crates/ ide/src/ inlay_hints/ fn_lifetime_fn.rs - search: match config.param_names_for_lifetime_elision_hints {{ - search: allocated_lifetimes.push(if config.param_names_for_lifetime_elision_hints {{ - search: Some(it) if config.param_names_for_lifetime_elision_hints => {{ - search: InlayHintsConfig {{ param_names_for_lifetime_elision_hints: true, ..TEST_CONFIG }}, + search: match config.param_names_for_lifetime_elision_hints { + search: allocated_lifetimes.push(if config.param_names_for_lifetime_elision_hints { + search: Some(it) if config.param_names_for_lifetime_elision_hints => { + search: InlayHintsConfig { param_names_for_lifetime_elision_hints: true, ..TEST_CONFIG }, inlay_hints.rs search: pub param_names_for_lifetime_elision_hints: bool, search: param_names_for_lifetime_elision_hints: self @@ -5674,7 +5668,7 @@ mod tests { search: param_names_for_lifetime_elision_hints: true, config.rs search: param_names_for_lifetime_elision_hints: self"# - ); + .to_string(); let select_first_in_all_matches = |line_to_select: &str| { assert!(all_matches.contains(line_to_select)); all_matches.replacen( @@ -5904,15 +5898,13 @@ mod tests { cx, ), format!( - r#"{}/ + r#"one/ a.txt search: aaa aaa <==== selected search: aaa aaa -{}/ +two/ b.txt search: a aaa"#, - path!("/root/one"), - path!("/root/two"), ), ); }); @@ -5934,13 +5926,11 @@ mod tests { cx, ), format!( - r#"{}/ + r#"one/ a.txt <==== selected -{}/ +two/ b.txt search: a aaa"#, - path!("/root/one"), - path!("/root/two"), ), ); }); @@ -5962,11 +5952,9 @@ mod tests { cx, ), format!( - r#"{}/ + r#"one/ a.txt -{}/ <==== selected"#, - path!("/root/one"), - path!("/root/two"), +two/ <==== selected"#, ), ); }); @@ -5987,13 +5975,11 @@ mod tests { cx, ), format!( - r#"{}/ + r#"one/ a.txt -{}/ <==== selected +two/ <==== selected b.txt search: a aaa"#, - path!("/root/one"), - path!("/root/two"), ) ); }); @@ -6455,7 +6441,7 @@ outline: struct OutlineEntryExcerpt cx, ), format!( - r#"{root}/ + r#"frontend-project/ public/lottie/ syntax-tree.json search: {{ "something": "static" }} <==== selected @@ -6494,7 +6480,7 @@ outline: struct OutlineEntryExcerpt cx, ), format!( - r#"{root}/ + r#"frontend-project/ public/lottie/ syntax-tree.json search: {{ "something": "static" }} @@ -6524,7 +6510,7 @@ outline: struct OutlineEntryExcerpt cx, ), format!( - r#"{root}/ + r#"frontend-project/ public/lottie/ syntax-tree.json search: {{ "something": "static" }} @@ -6558,7 +6544,7 @@ outline: struct OutlineEntryExcerpt cx, ), format!( - r#"{root}/ + r#"frontend-project/ public/lottie/ syntax-tree.json search: {{ "something": "static" }} @@ -6591,7 +6577,7 @@ outline: struct OutlineEntryExcerpt cx, ), format!( - r#"{root}/ + r#"frontend-project/ public/lottie/ syntax-tree.json search: {{ "something": "static" }} @@ -6649,6 +6635,7 @@ outline: struct OutlineEntryExcerpt selected_entry: Option<&PanelEntry>, cx: &mut App, ) -> String { + let project = project.read(cx); let mut display_string = String::new(); for entry in cached_entries { if !display_string.is_empty() { @@ -6663,44 +6650,39 @@ outline: struct OutlineEntryExcerpt panic!("Did not cover external files with tests") } FsEntry::Directory(directory) => { - match project - .read(cx) + let path = if let Some(worktree) = project .worktree_for_id(directory.worktree_id, cx) - .and_then(|worktree| { - if worktree.read(cx).root_entry() == Some(&directory.entry.entry) { - Some(worktree.read(cx).abs_path()) - } else { - None - } + .filter(|worktree| { + worktree.read(cx).root_entry() == Some(&directory.entry.entry) }) { - Some(root_path) => format!( - "{}/{}", - root_path.display(), - directory.entry.path.display(), - ), - None => format!( - "{}/", - directory - .entry - .path - .file_name() - .unwrap_or_default() - .to_string_lossy() - ), - } + worktree + .read(cx) + .root_name() + .join(&directory.entry.path) + .as_unix_str() + .to_string() + } else { + directory + .entry + .path + .file_name() + .unwrap_or_default() + .to_string() + }; + format!("{path}/") } FsEntry::File(file) => file .entry .path .file_name() - .map(|name| name.to_string_lossy().to_string()) + .map(|name| name.to_string()) .unwrap_or_default(), }, PanelEntry::FoldedDirs(folded_dirs) => folded_dirs .entries .iter() .filter_map(|dir| dir.path.file_name()) - .map(|name| name.to_string_lossy().to_string() + "/") + .map(|name| name.to_string() + "/") .collect(), PanelEntry::Outline(outline_entry) => match outline_entry { OutlineEntry::Excerpt(_) => continue, diff --git a/crates/outline_panel/src/outline_panel_settings.rs b/crates/outline_panel/src/outline_panel_settings.rs index db34a318188fc10b100b88f959b1c7a77b1161cb..58598bdb4f9089e2c6284976869b82be600825ae 100644 --- a/crates/outline_panel/src/outline_panel_settings.rs +++ b/crates/outline_panel/src/outline_panel_settings.rs @@ -1,29 +1,13 @@ use editor::EditorSettings; use gpui::{App, Pixels}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +pub use settings::{DockSide, Settings, ShowIndentGuides}; use ui::scrollbars::{ScrollbarVisibility, ShowScrollbar}; -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, Copy, PartialEq)] -#[serde(rename_all = "snake_case")] -pub enum OutlinePanelDockPosition { - Left, - Right, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum ShowIndentGuides { - Always, - Never, -} - -#[derive(Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct OutlinePanelSettings { pub button: bool, pub default_width: Pixels, - pub dock: OutlinePanelDockPosition, + pub dock: DockSide, pub file_icons: bool, pub folder_icons: bool, pub git_status: bool, @@ -35,7 +19,7 @@ pub struct OutlinePanelSettings { pub expand_outlines_with_depth: usize, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct ScrollbarSettings { /// When to show the scrollbar in the project panel. /// @@ -43,80 +27,11 @@ pub struct ScrollbarSettings { pub show: Option, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -pub struct ScrollbarSettingsContent { - /// When to show the scrollbar in the project panel. - /// - /// Default: inherits editor scrollbar settings - pub show: Option>, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct IndentGuidesSettings { pub show: ShowIndentGuides, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -pub struct IndentGuidesSettingsContent { - /// When to show the scrollbar in the outline panel. - pub show: Option, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[settings_key(key = "outline_panel")] -pub struct OutlinePanelSettingsContent { - /// Whether to show the outline panel button in the status bar. - /// - /// Default: true - pub button: Option, - /// Customize default width (in pixels) taken by outline panel - /// - /// Default: 240 - pub default_width: Option, - /// The position of outline panel - /// - /// Default: left - pub dock: Option, - /// Whether to show file icons in the outline panel. - /// - /// Default: true - pub file_icons: Option, - /// Whether to show folder icons or chevrons for directories in the outline panel. - /// - /// Default: true - pub folder_icons: Option, - /// Whether to show the git status in the outline panel. - /// - /// Default: true - pub git_status: Option, - /// Amount of indentation (in pixels) for nested items. - /// - /// Default: 20 - pub indent_size: Option, - /// Whether to reveal it in the outline panel automatically, - /// when a corresponding project entry becomes active. - /// Gitignored entries are never auto revealed. - /// - /// Default: true - pub auto_reveal_entries: Option, - /// Whether to fold directories automatically - /// when directory has only one directory inside. - /// - /// Default: true - pub auto_fold_dirs: Option, - /// Settings related to indent guides in the outline panel. - pub indent_guides: Option, - /// Scrollbar-related settings - pub scrollbar: Option, - /// Default depth to expand outline items in the current file. - /// The default depth to which outline entries are expanded on reveal. - /// - Set to 0 to collapse all items that have children - /// - Set to 1 or higher to collapse items at that depth or deeper - /// - /// Default: 100 - pub expand_outlines_with_depth: Option, -} - impl ScrollbarVisibility for OutlinePanelSettings { fn visibility(&self, cx: &App) -> ShowScrollbar { self.scrollbar @@ -126,21 +41,41 @@ impl ScrollbarVisibility for OutlinePanelSettings { } impl Settings for OutlinePanelSettings { - type FileContent = OutlinePanelSettingsContent; - - fn load( - sources: SettingsSources, - _: &mut gpui::App, - ) -> anyhow::Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let panel = content.outline_panel.as_ref().unwrap(); + Self { + button: panel.button.unwrap(), + default_width: panel.default_width.map(gpui::px).unwrap(), + dock: panel.dock.unwrap(), + file_icons: panel.file_icons.unwrap(), + folder_icons: panel.folder_icons.unwrap(), + git_status: panel.git_status.unwrap(), + indent_size: panel.indent_size.unwrap(), + indent_guides: IndentGuidesSettings { + show: panel.indent_guides.unwrap().show.unwrap(), + }, + auto_reveal_entries: panel.auto_reveal_entries.unwrap(), + auto_fold_dirs: panel.auto_fold_dirs.unwrap(), + scrollbar: ScrollbarSettings { + show: panel.scrollbar.unwrap().show.map(Into::into), + }, + expand_outlines_with_depth: panel.expand_outlines_with_depth.unwrap(), + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { + fn import_from_vscode( + vscode: &settings::VsCodeSettings, + current: &mut settings::SettingsContent, + ) { if let Some(b) = vscode.read_bool("outline.icons") { - current.file_icons = Some(b); - current.folder_icons = Some(b); + let outline_panel = current.outline_panel.get_or_insert_default(); + outline_panel.file_icons = Some(b); + outline_panel.folder_icons = Some(b); } - vscode.bool_setting("git.decorations.enabled", &mut current.git_status); + if let Some(b) = vscode.read_bool("git.decorations.enabled") { + let outline_panel = current.outline_panel.get_or_insert_default(); + outline_panel.git_status = Some(b); + } } } diff --git a/crates/paths/src/paths.rs b/crates/paths/src/paths.rs index af1b97c1cb9367ab73562ae4ebd044a2b79d1604..bbb6ddb976312b7baca5a11ace863b4a3be8d2bc 100644 --- a/crates/paths/src/paths.rs +++ b/crates/paths/src/paths.rs @@ -2,9 +2,10 @@ use std::env; use std::path::{Path, PathBuf}; -use std::sync::OnceLock; +use std::sync::{LazyLock, OnceLock}; pub use util::paths::home_dir; +use util::rel_path::RelPath; /// A default editorconfig file name to use when resolving project settings. pub const EDITORCONFIG_NAME: &str = ".editorconfig"; @@ -29,13 +30,17 @@ static CURRENT_DATA_DIR: OnceLock = OnceLock::new(); static CONFIG_DIR: OnceLock = OnceLock::new(); /// Returns the relative path to the zed_server directory on the ssh host. -pub fn remote_server_dir_relative() -> &'static Path { - Path::new(".zed_server") +pub fn remote_server_dir_relative() -> &'static RelPath { + static CACHED: LazyLock<&'static RelPath> = + LazyLock::new(|| RelPath::unix(".zed_server").unwrap()); + *CACHED } /// Returns the relative path to the zed_wsl_server directory on the wsl host. -pub fn remote_wsl_server_dir_relative() -> &'static Path { - Path::new(".zed_wsl_server") +pub fn remote_wsl_server_dir_relative() -> &'static RelPath { + static CACHED: LazyLock<&'static RelPath> = + LazyLock::new(|| RelPath::unix(".zed_wsl_server").unwrap()); + *CACHED } /// Sets a custom directory for all user data, overriding the default data directory. @@ -64,7 +69,7 @@ pub fn set_custom_data_dir(dir: &str) -> &'static PathBuf { } CUSTOM_DATA_DIR.get_or_init(|| { let mut path = PathBuf::from(dir); - if path.is_relative() { + if path.is_relative() && path.exists() { let abs_path = path .canonicalize() .expect("failed to canonicalize custom data directory's path to an absolute path"); @@ -398,28 +403,34 @@ pub fn remote_servers_dir() -> &'static PathBuf { } /// Returns the relative path to a `.zed` folder within a project. -pub fn local_settings_folder_relative_path() -> &'static Path { - Path::new(".zed") +pub fn local_settings_folder_name() -> &'static str { + ".zed" } /// Returns the relative path to a `.vscode` folder within a project. -pub fn local_vscode_folder_relative_path() -> &'static Path { - Path::new(".vscode") +pub fn local_vscode_folder_name() -> &'static str { + ".vscode" } /// Returns the relative path to a `settings.json` file within a project. -pub fn local_settings_file_relative_path() -> &'static Path { - Path::new(".zed/settings.json") +pub fn local_settings_file_relative_path() -> &'static RelPath { + static CACHED: LazyLock<&'static RelPath> = + LazyLock::new(|| RelPath::unix(".zed/settings.json").unwrap()); + *CACHED } /// Returns the relative path to a `tasks.json` file within a project. -pub fn local_tasks_file_relative_path() -> &'static Path { - Path::new(".zed/tasks.json") +pub fn local_tasks_file_relative_path() -> &'static RelPath { + static CACHED: LazyLock<&'static RelPath> = + LazyLock::new(|| RelPath::unix(".zed/tasks.json").unwrap()); + *CACHED } /// Returns the relative path to a `.vscode/tasks.json` file within a project. -pub fn local_vscode_tasks_file_relative_path() -> &'static Path { - Path::new(".vscode/tasks.json") +pub fn local_vscode_tasks_file_relative_path() -> &'static RelPath { + static CACHED: LazyLock<&'static RelPath> = + LazyLock::new(|| RelPath::unix(".vscode/tasks.json").unwrap()); + *CACHED } pub fn debug_task_file_name() -> &'static str { @@ -432,13 +443,17 @@ pub fn task_file_name() -> &'static str { /// Returns the relative path to a `debug.json` file within a project. /// .zed/debug.json -pub fn local_debug_file_relative_path() -> &'static Path { - Path::new(".zed/debug.json") +pub fn local_debug_file_relative_path() -> &'static RelPath { + static CACHED: LazyLock<&'static RelPath> = + LazyLock::new(|| RelPath::unix(".zed/debug.json").unwrap()); + *CACHED } /// Returns the relative path to a `.vscode/launch.json` file within a project. -pub fn local_vscode_launch_file_relative_path() -> &'static Path { - Path::new(".vscode/launch.json") +pub fn local_vscode_launch_file_relative_path() -> &'static RelPath { + static CACHED: LazyLock<&'static RelPath> = + LazyLock::new(|| RelPath::unix(".vscode/launch.json").unwrap()); + *CACHED } pub fn user_ssh_config_file() -> PathBuf { diff --git a/crates/picker/Cargo.toml b/crates/picker/Cargo.toml index d785cb5b3a96502165b10e2bf0def0d8bf66cd67..23c867b6f30aa64d5916e8939d836dda27ebf6c9 100644 --- a/crates/picker/Cargo.toml +++ b/crates/picker/Cargo.toml @@ -22,6 +22,7 @@ gpui.workspace = true menu.workspace = true schemars.workspace = true serde.workspace = true +theme.workspace = true ui.workspace = true workspace.workspace = true workspace-hack.workspace = true diff --git a/crates/picker/src/highlighted_match_with_paths.rs b/crates/picker/src/highlighted_match_with_paths.rs index 255e0150e8d6d9684b4f5b1315d4975f037ace48..6e91b997da2dab2ac61befd2f596e6f3a4207c85 100644 --- a/crates/picker/src/highlighted_match_with_paths.rs +++ b/crates/picker/src/highlighted_match_with_paths.rs @@ -10,36 +10,36 @@ pub struct HighlightedMatchWithPaths { pub struct HighlightedMatch { pub text: String, pub highlight_positions: Vec, - pub char_count: usize, pub color: Color, } impl HighlightedMatch { pub fn join(components: impl Iterator, separator: &str) -> Self { - let mut char_count = 0; - let separator_char_count = separator.chars().count(); + // Track a running byte offset and insert separators between parts. + let mut first = true; + let mut byte_offset = 0; let mut text = String::new(); let mut highlight_positions = Vec::new(); for component in components { - if char_count != 0 { + if !first { text.push_str(separator); - char_count += separator_char_count; + byte_offset += separator.len(); } + first = false; highlight_positions.extend( component .highlight_positions .iter() - .map(|position| position + char_count), + .map(|position| position + byte_offset), ); text.push_str(&component.text); - char_count += component.text.chars().count(); + byte_offset += component.text.len(); } Self { text, highlight_positions, - char_count, color: Color::Default, } } @@ -73,3 +73,36 @@ impl RenderOnce for HighlightedMatchWithPaths { }) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn join_offsets_positions_by_bytes_not_chars() { + // "αβγ" is 3 Unicode scalar values, 6 bytes in UTF-8. + let left_text = "αβγ".to_string(); + let right_text = "label".to_string(); + let left = HighlightedMatch { + text: left_text, + highlight_positions: vec![], + color: Color::Default, + }; + let right = HighlightedMatch { + text: right_text, + highlight_positions: vec![0, 1], + color: Color::Default, + }; + let joined = HighlightedMatch::join([left, right].into_iter(), ""); + + assert!( + joined + .highlight_positions + .iter() + .all(|&p| joined.text.is_char_boundary(p)), + "join produced non-boundary positions {:?} for text {:?}", + joined.highlight_positions, + joined.text + ); + } +} diff --git a/crates/picker/src/picker.rs b/crates/picker/src/picker.rs index 8816fb5424ff25788cec9cb602d2960ab753c135..247fcbdd875ffc2e52d90d9b1309f874c508e588 100644 --- a/crates/picker/src/picker.rs +++ b/crates/picker/src/picker.rs @@ -18,11 +18,12 @@ use head::Head; use schemars::JsonSchema; use serde::Deserialize; use std::{ops::Range, sync::Arc, time::Duration}; +use theme::ThemeSettings; use ui::{ - Color, Divider, Label, ListItem, ListItemSpacing, ScrollAxes, Scrollbars, WithScrollbar, - prelude::*, v_flex, + Color, Divider, DocumentationAside, DocumentationEdge, DocumentationSide, Label, ListItem, + ListItemSpacing, ScrollAxes, Scrollbars, WithScrollbar, prelude::*, utils::WithRemSize, v_flex, }; -use workspace::ModalView; +use workspace::{ModalView, item::Settings}; enum ElementContainer { List(ListState), @@ -222,6 +223,14 @@ pub trait PickerDelegate: Sized + 'static { ) -> Option { None } + + fn documentation_aside( + &self, + _window: &mut Window, + _cx: &mut Context>, + ) -> Option { + None + } } impl Focusable for Picker { @@ -781,8 +790,15 @@ impl ModalView for Picker {} impl Render for Picker { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + let ui_font_size = ThemeSettings::get_global(cx).ui_font_size(cx); + let window_size = window.viewport_size(); + let rem_size = window.rem_size(); + let is_wide_window = window_size.width / rem_size > rems_from_px(800.).0; + + let aside = self.delegate.documentation_aside(window, cx); + let editor_position = self.delegate.editor_position(); - v_flex() + let menu = v_flex() .key_context("Picker") .size_full() .when_some(self.width, |el, width| el.w(width)) @@ -865,6 +881,47 @@ impl Render for Picker { } } Head::Empty(empty_head) => Some(div().child(empty_head.clone())), - }) + }); + + let Some(aside) = aside else { + return menu; + }; + + let render_aside = |aside: DocumentationAside, cx: &mut Context| { + WithRemSize::new(ui_font_size) + .occlude() + .elevation_2(cx) + .w_full() + .p_2() + .overflow_hidden() + .when(is_wide_window, |this| this.max_w_96()) + .when(!is_wide_window, |this| this.max_w_48()) + .child((aside.render)(cx)) + }; + + if is_wide_window { + div().relative().child(menu).child( + h_flex() + .absolute() + .when(aside.side == DocumentationSide::Left, |this| { + this.right_full().mr_1() + }) + .when(aside.side == DocumentationSide::Right, |this| { + this.left_full().ml_1() + }) + .when(aside.edge == DocumentationEdge::Top, |this| this.top_0()) + .when(aside.edge == DocumentationEdge::Bottom, |this| { + this.bottom_0() + }) + .child(render_aside(aside, cx)), + ) + } else { + v_flex() + .w_full() + .gap_1() + .justify_end() + .child(render_aside(aside, cx)) + .child(menu) + } } } diff --git a/crates/prettier/src/prettier.rs b/crates/prettier/src/prettier.rs index 32e39d466f1a236da72b746fb4bf2a24b7300385..b9c40e814c4caf760123cf460e2eed7298f9e951 100644 --- a/crates/prettier/src/prettier.rs +++ b/crates/prettier/src/prettier.rs @@ -12,7 +12,7 @@ use std::{ path::{Path, PathBuf}, sync::Arc, }; -use util::paths::PathMatcher; +use util::paths::{PathMatcher, PathStyle}; #[derive(Debug, Clone)] pub enum Prettier { @@ -119,7 +119,7 @@ impl Prettier { None } }).any(|workspace_definition| { - workspace_definition == subproject_path.to_string_lossy() || PathMatcher::new(&[workspace_definition]).ok().is_some_and(|path_matcher| path_matcher.is_match(subproject_path)) + workspace_definition == subproject_path.to_string_lossy() || PathMatcher::new(&[workspace_definition], PathStyle::local()).ok().is_some_and(|path_matcher| path_matcher.is_match(subproject_path)) }) { anyhow::ensure!(has_prettier_in_node_modules(fs, &path_to_check).await?, "Path {path_to_check:?} is the workspace root for project in {closest_package_json_path:?}, but it has no prettier installed"); log::info!("Found prettier path {path_to_check:?} in the workspace root for project in {closest_package_json_path:?}"); @@ -215,11 +215,14 @@ impl Prettier { }) .any(|workspace_definition| { workspace_definition == subproject_path.to_string_lossy() - || PathMatcher::new(&[workspace_definition]) - .ok() - .is_some_and(|path_matcher| { - path_matcher.is_match(subproject_path) - }) + || PathMatcher::new( + &[workspace_definition], + PathStyle::local(), + ) + .ok() + .is_some_and( + |path_matcher| path_matcher.is_match(subproject_path), + ) }) { let workspace_ignore = path_to_check.join(".prettierignore"); diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index 3d46a44770ec2504991899e98c1504116611c20b..39dc0621732bfd42b3a24735ad803915fbf2885c 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -58,7 +58,6 @@ lsp.workspace = true markdown.workspace = true node_runtime.workspace = true parking_lot.workspace = true -pathdiff.workspace = true paths.workspace = true postage.workspace = true prettier.workspace = true @@ -89,6 +88,7 @@ util.workspace = true watch.workspace = true which.workspace = true worktree.workspace = true +zeroize.workspace = true zlog.workspace = true workspace-hack.workspace = true diff --git a/crates/project/src/agent_server_store.rs b/crates/project/src/agent_server_store.rs index bdb2297624e4a404cb3c918f07eab15004944f97..73a65f98d5a1bae0fb24c1710ecece0175bfa34f 100644 --- a/crates/project/src/agent_server_store.rs +++ b/crates/project/src/agent_server_store.rs @@ -12,17 +12,15 @@ use collections::HashMap; use fs::{Fs, RemoveOptions, RenameOptions}; use futures::StreamExt as _; use gpui::{ - App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, SharedString, Subscription, Task, + AppContext as _, AsyncApp, Context, Entity, EventEmitter, SharedString, Subscription, Task, }; +use http_client::{HttpClient, github::AssetKind}; use node_runtime::NodeRuntime; use remote::RemoteClient; -use rpc::{ - AnyProtoClient, TypedEnvelope, - proto::{self, ToProto}, -}; +use rpc::{AnyProtoClient, TypedEnvelope, proto}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{SettingsKey, SettingsSources, SettingsStore, SettingsUi}; +use settings::SettingsStore; use util::{ResultExt as _, debug_panic}; use crate::ProjectEnvironment; @@ -114,6 +112,7 @@ enum AgentServerStoreState { project_environment: Entity, downstream_client: Option<(u64, AnyProtoClient)>, settings: Option, + http_client: Arc, _subscriptions: [Subscription; 1], }, Remote { @@ -145,10 +144,6 @@ impl AgentServerStore { fn agent_servers_settings_changed(&mut self, cx: &mut Context) { let AgentServerStoreState::Local { - node_runtime, - fs, - project_environment, - downstream_client, settings: old_settings, .. } = &mut self.state @@ -167,6 +162,30 @@ impl AgentServerStore { return; } + self.reregister_agents(cx); + } + + fn reregister_agents(&mut self, cx: &mut Context) { + let AgentServerStoreState::Local { + node_runtime, + fs, + project_environment, + downstream_client, + settings: old_settings, + http_client, + .. + } = &mut self.state + else { + debug_panic!("Non-local projects should never attempt to reregister. This is a bug!"); + + return; + }; + + let new_settings = cx + .global::() + .get::(None) + .clone(); + self.external_agents.clear(); self.external_agents.insert( GEMINI_NAME.into(), @@ -185,6 +204,19 @@ impl AgentServerStore { .unwrap_or(true), }), ); + self.external_agents.insert( + CODEX_NAME.into(), + Box::new(LocalCodex { + fs: fs.clone(), + project_environment: project_environment.clone(), + custom_command: new_settings + .codex + .clone() + .and_then(|settings| settings.custom_command()), + http_client: http_client.clone(), + is_remote: downstream_client.is_some(), + }), + ); self.external_agents.insert( CLAUDE_CODE_NAME.into(), Box::new(LocalClaudeCode { @@ -229,58 +261,59 @@ impl AgentServerStore { node_runtime: NodeRuntime, fs: Arc, project_environment: Entity, + http_client: Arc, cx: &mut Context, ) -> Self { let subscription = cx.observe_global::(|this, cx| { this.agent_servers_settings_changed(cx); }); - let this = Self { + let mut this = Self { state: AgentServerStoreState::Local { node_runtime, fs, project_environment, + http_client, downstream_client: None, settings: None, _subscriptions: [subscription], }, external_agents: Default::default(), }; - cx.spawn(async move |this, cx| { - cx.background_executor().timer(Duration::from_secs(1)).await; - this.update(cx, |this, cx| { - this.agent_servers_settings_changed(cx); - }) - .ok(); - }) - .detach(); + this.agent_servers_settings_changed(cx); this } - pub(crate) fn remote( - project_id: u64, - upstream_client: Entity, - _cx: &mut Context, - ) -> Self { + pub(crate) fn remote(project_id: u64, upstream_client: Entity) -> Self { // Set up the builtin agents here so they're immediately available in // remote projects--we know that the HeadlessProject on the other end // will have them. let external_agents = [ ( - GEMINI_NAME.into(), + CLAUDE_CODE_NAME.into(), Box::new(RemoteExternalAgentServer { project_id, upstream_client: upstream_client.clone(), - name: GEMINI_NAME.into(), + name: CLAUDE_CODE_NAME.into(), status_tx: None, new_version_available_tx: None, }) as Box, ), ( - CLAUDE_CODE_NAME.into(), + CODEX_NAME.into(), Box::new(RemoteExternalAgentServer { project_id, upstream_client: upstream_client.clone(), - name: CLAUDE_CODE_NAME.into(), + name: CODEX_NAME.into(), + status_tx: None, + new_version_available_tx: None, + }) as Box, + ), + ( + GEMINI_NAME.into(), + Box::new(RemoteExternalAgentServer { + project_id, + upstream_client: upstream_client.clone(), + name: GEMINI_NAME.into(), status_tx: None, new_version_available_tx: None, }) as Box, @@ -305,22 +338,29 @@ impl AgentServerStore { } } - pub fn shared(&mut self, project_id: u64, client: AnyProtoClient) { + pub fn shared(&mut self, project_id: u64, client: AnyProtoClient, cx: &mut Context) { match &mut self.state { AgentServerStoreState::Local { downstream_client, .. } => { - client - .send(proto::ExternalAgentsUpdated { - project_id, - names: self - .external_agents + *downstream_client = Some((project_id, client.clone())); + // Send the current list of external agents downstream, but only after a delay, + // to avoid having the message arrive before the downstream project's agent server store + // sets up its handlers. + cx.spawn(async move |this, cx| { + cx.background_executor().timer(Duration::from_secs(1)).await; + let names = this.update(cx, |this, _| { + this.external_agents .keys() .map(|name| name.to_string()) - .collect(), - }) - .log_err(); - *downstream_client = Some((project_id, client)); + .collect() + })?; + client + .send(proto::ExternalAgentsUpdated { project_id, names }) + .log_err(); + anyhow::Ok(()) + }) + .detach(); } AgentServerStoreState::Remote { .. } => { debug_panic!( @@ -418,7 +458,7 @@ impl AgentServerStore { })?? .await?; Ok(proto::AgentServerCommand { - path: command.path.to_string_lossy().to_string(), + path: command.path.to_string_lossy().into_owned(), args: command.args, env: command .env @@ -612,7 +652,7 @@ fn get_or_npm_install_builtin_agent( if let Ok(latest_version) = latest_version && &latest_version != &file_name.to_string_lossy() { - download_latest_version( + let download_result = download_latest_version( fs, dir.clone(), node_runtime, @@ -620,7 +660,9 @@ fn get_or_npm_install_builtin_agent( ) .await .log_err(); - if let Some(mut new_version_available) = new_version_available { + if let Some(mut new_version_available) = new_version_available + && download_result.is_some() + { new_version_available.send(Some(latest_version)).ok(); } } @@ -653,7 +695,7 @@ fn get_or_npm_install_builtin_agent( anyhow::Ok(AgentServerCommand { path: node_path, - args: vec![agent_server_path.to_string_lossy().to_string()], + args: vec![agent_server_path.to_string_lossy().into_owned()], env: None, }) }) @@ -705,7 +747,7 @@ async fn download_latest_version( &dir.join(&version), RenameOptions { ignore_if_exists: true, - overwrite: false, + overwrite: true, }, ) .await?; @@ -721,11 +763,6 @@ struct RemoteExternalAgentServer { new_version_available_tx: Option>>, } -// new method: status_updated -// does nothing in the all-local case -// for RemoteExternalAgentServer, sends on the stored tx -// etc. - impl ExternalAgentServer for RemoteExternalAgentServer { fn get_command( &mut self, @@ -850,7 +887,7 @@ impl ExternalAgentServer for LocalGemini { // Gemini CLI doesn't seem to have a dedicated invocation for logging in--we just run it normally without any arguments. let login = task::SpawnInTerminal { - command: Some(command.path.clone().to_proto()), + command: Some(command.path.to_string_lossy().into_owned()), args: command.args.clone(), env: command.env.clone().unwrap_or_default(), label: "gemini /auth".into(), @@ -859,7 +896,11 @@ impl ExternalAgentServer for LocalGemini { command.env.get_or_insert_default().extend(extra_env); command.args.push("--experimental-acp".into()); - Ok((command, root_dir.to_proto(), Some(login))) + Ok(( + command, + root_dir.to_string_lossy().into_owned(), + Some(login), + )) }) } @@ -911,7 +952,7 @@ impl ExternalAgentServer for LocalClaudeCode { "claude-code-acp".into(), "@zed-industries/claude-code-acp".into(), "node_modules/@zed-industries/claude-code-acp/dist/index.js".into(), - Some("0.2.5".parse().unwrap()), + Some("0.5.2".parse().unwrap()), status_tx, new_version_available_tx, fs, @@ -927,10 +968,10 @@ impl ExternalAgentServer for LocalClaudeCode { path.strip_suffix("/@zed-industries/claude-code-acp/dist/index.js") }) .map(|path_prefix| task::SpawnInTerminal { - command: Some(command.path.clone().to_proto()), + command: Some(command.path.to_string_lossy().into_owned()), args: vec![ Path::new(path_prefix) - .join("@anthropic-ai/claude-code/cli.js") + .join("@anthropic-ai/claude-agent-sdk/cli.js") .to_string_lossy() .to_string(), "/login".into(), @@ -943,7 +984,119 @@ impl ExternalAgentServer for LocalClaudeCode { }; command.env.get_or_insert_default().extend(extra_env); - Ok((command, root_dir.to_proto(), login)) + Ok((command, root_dir.to_string_lossy().into_owned(), login)) + }) + } + + fn as_any_mut(&mut self) -> &mut dyn Any { + self + } +} + +struct LocalCodex { + fs: Arc, + project_environment: Entity, + http_client: Arc, + custom_command: Option, + is_remote: bool, +} + +impl ExternalAgentServer for LocalCodex { + fn get_command( + &mut self, + root_dir: Option<&str>, + extra_env: HashMap, + _status_tx: Option>, + _new_version_available_tx: Option>>, + cx: &mut AsyncApp, + ) -> Task)>> { + let fs = self.fs.clone(); + let project_environment = self.project_environment.downgrade(); + let http = self.http_client.clone(); + let custom_command = self.custom_command.clone(); + let root_dir: Arc = root_dir + .map(|root_dir| Path::new(root_dir)) + .unwrap_or(paths::home_dir()) + .into(); + let is_remote = self.is_remote; + + cx.spawn(async move |cx| { + let mut env = project_environment + .update(cx, |project_environment, cx| { + project_environment.get_directory_environment(root_dir.clone(), cx) + })? + .await + .unwrap_or_default(); + if is_remote { + env.insert("NO_BROWSER".to_owned(), "1".to_owned()); + } + + let mut command = if let Some(mut custom_command) = custom_command { + env.extend(custom_command.env.unwrap_or_default()); + custom_command.env = Some(env); + custom_command + } else { + let dir = paths::data_dir().join("external_agents").join(CODEX_NAME); + fs.create_dir(&dir).await?; + + // Find or install the latest Codex release (no update checks for now). + let release = ::http_client::github::latest_github_release( + CODEX_ACP_REPO, + true, + false, + http.clone(), + ) + .await + .context("fetching Codex latest release")?; + + let version_dir = dir.join(&release.tag_name); + if !fs.is_dir(&version_dir).await { + let tag = release.tag_name.clone(); + let version_number = tag.trim_start_matches('v'); + let asset_name = asset_name(version_number) + .context("codex acp is not supported for this architecture")?; + let asset = release + .assets + .into_iter() + .find(|asset| asset.name == asset_name) + .with_context(|| format!("no asset found matching `{asset_name:?}`"))?; + ::http_client::github_download::download_server_binary( + &*http, + &asset.browser_download_url, + asset.digest.as_deref(), + &version_dir, + if cfg!(target_os = "windows") && cfg!(target_arch = "x86_64") { + AssetKind::Zip + } else { + AssetKind::TarGz + }, + ) + .await?; + } + + let bin_name = if cfg!(windows) { + "codex-acp.exe" + } else { + "codex-acp" + }; + let bin_path = version_dir.join(bin_name); + anyhow::ensure!( + fs.is_file(&bin_path).await, + "Missing Codex binary at {} after installation", + bin_path.to_string_lossy() + ); + + let mut cmd = AgentServerCommand { + path: bin_path, + args: Vec::new(), + env: None, + }; + cmd.env = Some(env); + cmd + }; + + command.env.get_or_insert_default().extend(extra_env); + Ok((command, root_dir.to_string_lossy().into_owned(), None)) }) } @@ -952,6 +1105,41 @@ impl ExternalAgentServer for LocalClaudeCode { } } +pub const CODEX_ACP_REPO: &str = "zed-industries/codex-acp"; + +/// Assemble Codex release URL for the current OS/arch and the given version number. +/// Returns None if the current target is unsupported. +/// Example output: +/// https://github.com/zed-industries/codex-acp/releases/download/v{version}/codex-acp-{version}-{arch}-{platform}.{ext} +fn asset_name(version: &str) -> Option { + let arch = if cfg!(target_arch = "x86_64") { + "x86_64" + } else if cfg!(target_arch = "aarch64") { + "aarch64" + } else { + return None; + }; + + let platform = if cfg!(target_os = "macos") { + "apple-darwin" + } else if cfg!(target_os = "windows") { + "pc-windows-msvc" + } else if cfg!(target_os = "linux") { + "unknown-linux-gnu" + } else { + return None; + }; + + // Only Windows x86_64 uses .zip in release assets + let ext = if cfg!(target_os = "windows") && cfg!(target_arch = "x86_64") { + "zip" + } else { + "tar.gz" + }; + + Some(format!("codex-acp-{version}-{arch}-{platform}.{ext}")) +} + struct LocalCustomAgent { project_environment: Entity, command: AgentServerCommand, @@ -982,7 +1170,7 @@ impl ExternalAgentServer for LocalCustomAgent { env.extend(command.env.unwrap_or_default()); env.extend(extra_env); command.env = Some(env); - Ok((command, root_dir.to_proto(), None)) + Ok((command, root_dir.to_string_lossy().into_owned(), None)) }) } @@ -991,50 +1179,59 @@ impl ExternalAgentServer for LocalCustomAgent { } } +#[cfg(test)] +mod tests { + #[test] + fn assembles_codex_release_url_for_current_target() { + let version_number = "0.1.0"; + + // This test fails the build if we are building a version of Zed + // which does not have a known build of codex-acp, to prevent us + // from accidentally doing a release on a new target without + // realizing that codex-acp support will not work on that target! + // + // Additionally, it verifies that our logic for assembling URLs + // correctly resolves to a known-good URL on each of our targets. + let allowed = [ + "codex-acp-0.1.0-aarch64-apple-darwin.tar.gz", + "codex-acp-0.1.0-aarch64-pc-windows-msvc.tar.gz", + "codex-acp-0.1.0-aarch64-unknown-linux-gnu.tar.gz", + "codex-acp-0.1.0-x86_64-apple-darwin.tar.gz", + "codex-acp-0.1.0-x86_64-pc-windows-msvc.zip", + "codex-acp-0.1.0-x86_64-unknown-linux-gnu.tar.gz", + ]; + + if let Some(url) = super::asset_name(version_number) { + assert!( + allowed.contains(&url.as_str()), + "Assembled asset name {} not in allowed list", + url + ); + } else { + panic!( + "This target does not have a known codex-acp release! We should fix this by building a release of codex-acp for this target, as otherwise codex-acp will not be usable with this Zed build." + ); + } + } +} + pub const GEMINI_NAME: &'static str = "gemini"; pub const CLAUDE_CODE_NAME: &'static str = "claude"; +pub const CODEX_NAME: &'static str = "codex"; -#[derive( - Default, Deserialize, Serialize, Clone, JsonSchema, Debug, SettingsUi, SettingsKey, PartialEq, -)] -#[settings_key(key = "agent_servers")] +#[derive(Default, Clone, JsonSchema, Debug, PartialEq)] pub struct AllAgentServersSettings { pub gemini: Option, pub claude: Option, - - /// Custom agent servers configured by the user - #[serde(flatten)] + pub codex: Option, pub custom: HashMap, } - -#[derive(Default, Deserialize, Serialize, Clone, JsonSchema, Debug, PartialEq)] +#[derive(Default, Clone, JsonSchema, Debug, PartialEq)] pub struct BuiltinAgentServerSettings { - /// Absolute path to a binary to be used when launching this agent. - /// - /// This can be used to run a specific binary without automatic downloads or searching `$PATH`. - #[serde(rename = "command")] pub path: Option, - /// If a binary is specified in `command`, it will be passed these arguments. pub args: Option>, - /// If a binary is specified in `command`, it will be passed these environment variables. pub env: Option>, - /// Whether to skip searching `$PATH` for an agent server binary when - /// launching this agent. - /// - /// This has no effect if a `command` is specified. Otherwise, when this is - /// `false`, Zed will search `$PATH` for an agent server binary and, if one - /// is found, use it for threads with this agent. If no agent binary is - /// found on `$PATH`, Zed will automatically install and use its own binary. - /// When this is `true`, Zed will not search `$PATH`, and will always use - /// its own binary. - /// - /// Default: true pub ignore_system_version: Option, - /// The default mode to use for this agent. - /// - /// Note: Not only all agents support modes. - /// - /// Default: None pub default_mode: Option, } @@ -1048,6 +1245,18 @@ impl BuiltinAgentServerSettings { } } +impl From for BuiltinAgentServerSettings { + fn from(value: settings::BuiltinAgentServerSettings) -> Self { + BuiltinAgentServerSettings { + path: value.path, + args: value.args, + env: value.env, + ignore_system_version: value.ignore_system_version, + default_mode: value.default_mode, + } + } +} + impl From for BuiltinAgentServerSettings { fn from(value: AgentServerCommand) -> Self { BuiltinAgentServerSettings { @@ -1059,9 +1268,8 @@ impl From for BuiltinAgentServerSettings { } } -#[derive(Deserialize, Serialize, Clone, JsonSchema, Debug, PartialEq)] +#[derive(Clone, JsonSchema, Debug, PartialEq)] pub struct CustomAgentServerSettings { - #[serde(flatten)] pub command: AgentServerCommand, /// The default mode to use for this agent. /// @@ -1071,36 +1279,31 @@ pub struct CustomAgentServerSettings { pub default_mode: Option, } -impl settings::Settings for AllAgentServersSettings { - type FileContent = Self; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - let mut settings = AllAgentServersSettings::default(); - - for AllAgentServersSettings { - gemini, - claude, - custom, - } in sources.defaults_and_customizations() - { - if gemini.is_some() { - settings.gemini = gemini.clone(); - } - if claude.is_some() { - settings.claude = claude.clone(); - } - - // Merge custom agents - for (name, config) in custom { - // Skip built-in agent names to avoid conflicts - if name != GEMINI_NAME && name != CLAUDE_CODE_NAME { - settings.custom.insert(name.clone(), config.clone()); - } - } +impl From for CustomAgentServerSettings { + fn from(value: settings::CustomAgentServerSettings) -> Self { + CustomAgentServerSettings { + command: AgentServerCommand { + path: value.path, + args: value.args, + env: value.env, + }, + default_mode: value.default_mode, } - - Ok(settings) } +} - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} +impl settings::Settings for AllAgentServersSettings { + fn from_settings(content: &settings::SettingsContent) -> Self { + let agent_settings = content.agent_servers.clone().unwrap(); + Self { + gemini: agent_settings.gemini.map(Into::into), + claude: agent_settings.claude.map(Into::into), + codex: agent_settings.codex.map(Into::into), + custom: agent_settings + .custom + .into_iter() + .map(|(k, v)| (k, v.into())) + .collect(), + } + } } diff --git a/crates/project/src/buffer_store.rs b/crates/project/src/buffer_store.rs index 07f8e0c95cf8551803d5f5828703dbec090fcedb..8a4d4f7918c12abd94cf7bf8fc97c939db7ce033 100644 --- a/crates/project/src/buffer_store.rs +++ b/crates/project/src/buffer_store.rs @@ -21,12 +21,12 @@ use language::{ }; use rpc::{ AnyProtoClient, ErrorCode, ErrorExt as _, TypedEnvelope, - proto::{self, ToProto}, + proto::{self}, }; use smol::channel::Receiver; -use std::{io, path::Path, pin::pin, sync::Arc, time::Instant}; +use std::{io, pin::pin, sync::Arc, time::Instant}; use text::BufferId; -use util::{ResultExt as _, TryFutureExt, debug_panic, maybe}; +use util::{ResultExt as _, TryFutureExt, debug_panic, maybe, rel_path::RelPath}; use worktree::{File, PathChange, ProjectEntryId, Worktree, WorktreeId}; /// A set of open buffers. @@ -292,7 +292,7 @@ impl RemoteBufferStore { fn open_buffer( &self, - path: Arc, + path: Arc, worktree: Entity, cx: &mut Context, ) -> Task>> { @@ -370,7 +370,7 @@ impl LocalBufferStore { &self, buffer_handle: Entity, worktree: Entity, - path: Arc, + path: Arc, mut has_changed_file: bool, cx: &mut Context, ) -> Task> { @@ -389,7 +389,7 @@ impl LocalBufferStore { } let save = worktree.update(cx, |worktree, cx| { - worktree.write_file(path.as_ref(), text, line_ending, cx) + worktree.write_file(path, text, line_ending, cx) }); cx.spawn(async move |this, cx| { @@ -443,7 +443,7 @@ impl LocalBufferStore { fn local_worktree_entries_changed( this: &mut BufferStore, worktree_handle: &Entity, - changes: &[(Arc, ProjectEntryId, PathChange)], + changes: &[(Arc, ProjectEntryId, PathChange)], cx: &mut Context, ) { let snapshot = worktree_handle.read(cx).snapshot(); @@ -462,7 +462,7 @@ impl LocalBufferStore { fn local_worktree_entry_changed( this: &mut BufferStore, entry_id: ProjectEntryId, - path: &Arc, + path: &Arc, worktree: &Entity, snapshot: &worktree::Snapshot, cx: &mut Context, @@ -615,7 +615,7 @@ impl LocalBufferStore { fn open_buffer( &self, - path: Arc, + path: Arc, worktree: Entity, cx: &mut Context, ) -> Task>> { @@ -1402,8 +1402,9 @@ impl BufferStore { .await?; let buffer_id = buffer.read_with(&cx, |buffer, _| buffer.remote_id())?; - if let Some(new_path) = envelope.payload.new_path { - let new_path = ProjectPath::from_proto(new_path); + if let Some(new_path) = envelope.payload.new_path + && let Some(new_path) = ProjectPath::from_proto(new_path) + { this.update(&mut cx, |this, cx| { this.save_buffer_as(buffer.clone(), new_path, cx) })? diff --git a/crates/project/src/context_server_store.rs b/crates/project/src/context_server_store.rs index 20188df5c4ae38b2ae305daee5b3eecc25319951..e358ddfbf51a362d95b8b75a9b4831ca4089875d 100644 --- a/crates/project/src/context_server_store.rs +++ b/crates/project/src/context_server_store.rs @@ -1,7 +1,7 @@ pub mod extension; pub mod registry; -use std::{path::Path, sync::Arc}; +use std::sync::Arc; use anyhow::{Context as _, Result}; use collections::{HashMap, HashSet}; @@ -10,7 +10,7 @@ use futures::{FutureExt as _, future::join_all}; use gpui::{App, AsyncApp, Context, Entity, EventEmitter, Subscription, Task, WeakEntity, actions}; use registry::ContextServerDescriptorRegistry; use settings::{Settings as _, SettingsStore}; -use util::ResultExt as _; +use util::{ResultExt as _, rel_path::RelPath}; use crate::{ Project, @@ -282,8 +282,18 @@ impl ContextServerStore { self.servers.get(id).map(|state| state.configuration()) } - pub fn all_server_ids(&self) -> Vec { - self.servers.keys().cloned().collect() + pub fn server_ids(&self, cx: &App) -> HashSet { + self.servers + .keys() + .cloned() + .chain( + self.registry + .read(cx) + .context_server_descriptors() + .into_iter() + .map(|(id, _)| ContextServerId(id)), + ) + .collect() } pub fn running_servers(&self) -> Vec> { @@ -462,22 +472,23 @@ impl ContextServerStore { configuration: Arc, cx: &mut Context, ) -> Arc { - let root_path = self - .project - .read_with(cx, |project, cx| project.active_project_directory(cx)) - .ok() - .flatten() - .or_else(|| { - self.worktree_store.read_with(cx, |store, cx| { - store.visible_worktrees(cx).fold(None, |acc, item| { - if acc.is_none() { - item.read(cx).root_dir() - } else { - acc + let project = self.project.upgrade(); + let mut root_path = None; + if let Some(project) = project { + let project = project.read(cx); + if project.is_local() { + if let Some(path) = project.active_project_directory(cx) { + root_path = Some(path); + } else { + for worktree in self.worktree_store.read(cx).visible_worktrees(cx) { + if let Some(path) = worktree.read(cx).root_dir() { + root_path = Some(path); + break; } - }) - }) - }); + } + } + } + }; if let Some(factory) = self.context_server_factory.as_ref() { factory(id, configuration) @@ -500,7 +511,7 @@ impl ContextServerStore { .next() .map(|worktree| settings::SettingsLocation { worktree_id: worktree.read(cx).id(), - path: Path::new(""), + path: RelPath::empty(), }); &ProjectSettings::get(location, cx).context_servers } @@ -915,7 +926,7 @@ mod tests { set_context_server_configuration( vec![( server_1_id.0.clone(), - ContextServerSettings::Extension { + settings::ContextServerSettingsContent::Extension { enabled: true, settings: json!({ "somevalue": false @@ -934,7 +945,7 @@ mod tests { set_context_server_configuration( vec![( server_1_id.0.clone(), - ContextServerSettings::Extension { + settings::ContextServerSettingsContent::Extension { enabled: true, settings: json!({ "somevalue": false @@ -961,7 +972,7 @@ mod tests { vec![ ( server_1_id.0.clone(), - ContextServerSettings::Extension { + settings::ContextServerSettingsContent::Extension { enabled: true, settings: json!({ "somevalue": false @@ -970,7 +981,7 @@ mod tests { ), ( server_2_id.0.clone(), - ContextServerSettings::Custom { + settings::ContextServerSettingsContent::Custom { enabled: true, command: ContextServerCommand { path: "somebinary".into(), @@ -1002,7 +1013,7 @@ mod tests { vec![ ( server_1_id.0.clone(), - ContextServerSettings::Extension { + settings::ContextServerSettingsContent::Extension { enabled: true, settings: json!({ "somevalue": false @@ -1011,7 +1022,7 @@ mod tests { ), ( server_2_id.0.clone(), - ContextServerSettings::Custom { + settings::ContextServerSettingsContent::Custom { enabled: true, command: ContextServerCommand { path: "somebinary".into(), @@ -1038,7 +1049,7 @@ mod tests { set_context_server_configuration( vec![( server_1_id.0.clone(), - ContextServerSettings::Extension { + settings::ContextServerSettingsContent::Extension { enabled: true, settings: json!({ "somevalue": false @@ -1061,7 +1072,7 @@ mod tests { set_context_server_configuration( vec![( server_1_id.0.clone(), - ContextServerSettings::Extension { + settings::ContextServerSettingsContent::Extension { enabled: true, settings: json!({ "somevalue": false @@ -1147,7 +1158,7 @@ mod tests { set_context_server_configuration( vec![( server_1_id.0.clone(), - ContextServerSettings::Custom { + settings::ContextServerSettingsContent::Custom { enabled: false, command: ContextServerCommand { path: "somebinary".into(), @@ -1176,7 +1187,7 @@ mod tests { set_context_server_configuration( vec![( server_1_id.0.clone(), - ContextServerSettings::Custom { + settings::ContextServerSettingsContent::Custom { enabled: true, command: ContextServerCommand { path: "somebinary".into(), @@ -1194,18 +1205,17 @@ mod tests { } fn set_context_server_configuration( - context_servers: Vec<(Arc, ContextServerSettings)>, + context_servers: Vec<(Arc, settings::ContextServerSettingsContent)>, cx: &mut TestAppContext, ) { cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - let mut settings = ProjectSettings::default(); - for (id, config) in context_servers { - settings.context_servers.insert(id, config); - } - store - .set_user_settings(&serde_json::to_string(&settings).unwrap(), cx) - .unwrap(); + store.update_user_settings(cx, |content| { + content.project.context_servers.clear(); + for (id, config) in context_servers { + content.project.context_servers.insert(id, config); + } + }); }) }); } diff --git a/crates/project/src/debugger/breakpoint_store.rs b/crates/project/src/debugger/breakpoint_store.rs index c47e5d35d5948eb0c176bbc6d14281faa3f60451..b7f5360d189489415032be6e5271b3880a421e57 100644 --- a/crates/project/src/debugger/breakpoint_store.rs +++ b/crates/project/src/debugger/breakpoint_store.rs @@ -164,6 +164,7 @@ pub struct BreakpointStore { impl BreakpointStore { pub fn init(client: &AnyProtoClient) { + log::error!("breakpoint store init"); client.add_entity_request_handler(Self::handle_toggle_breakpoint); client.add_entity_message_handler(Self::handle_breakpoints_for_file); } @@ -387,7 +388,7 @@ impl BreakpointStore { pub fn abs_path_from_buffer(buffer: &Entity, cx: &App) -> Option> { worktree::File::from_dyn(buffer.read(cx).file()) - .and_then(|file| file.worktree.read(cx).absolutize(&file.path).ok()) + .map(|file| file.worktree.read(cx).absolutize(&file.path)) .map(Arc::::from) } @@ -794,7 +795,7 @@ impl BreakpointStore { .update(cx, |this, cx| { let path = ProjectPath { worktree_id: worktree.read(cx).id(), - path: relative_path.into(), + path: relative_path, }; this.open_buffer(path, cx) })? diff --git a/crates/project/src/debugger/dap_store.rs b/crates/project/src/debugger/dap_store.rs index 6c1449b728d3ee5b8c8b019d5e527e9adfb3bf25..c6fc1ddf73ec7e619bf9c13a60db6fe024fa20f1 100644 --- a/crates/project/src/debugger/dap_store.rs +++ b/crates/project/src/debugger/dap_store.rs @@ -5,8 +5,10 @@ use super::{ session::{self, Session, SessionStateEvent}, }; use crate::{ - InlayHint, InlayHintLabel, ProjectEnvironment, ResolveState, debugger::session::SessionQuirks, - project_settings::ProjectSettings, worktree_store::WorktreeStore, + InlayHint, InlayHintLabel, ProjectEnvironment, ResolveState, + debugger::session::SessionQuirks, + project_settings::{DapBinary, ProjectSettings}, + worktree_store::WorktreeStore, }; use anyhow::{Context as _, Result, anyhow}; use async_trait::async_trait; @@ -20,16 +22,17 @@ use dap::{ inline_value::VariableLookupKind, messages::Message, }; -use fs::Fs; +use fs::{Fs, RemoveOptions}; use futures::{ - StreamExt, + StreamExt, TryStreamExt as _, channel::mpsc::{self, UnboundedSender}, future::{Shared, join_all}, }; use gpui::{App, AppContext, AsyncApp, Context, Entity, EventEmitter, SharedString, Task}; use http_client::HttpClient; -use language::{Buffer, LanguageToolchainStore, language_settings::InlayHintKind}; +use language::{Buffer, LanguageToolchainStore}; use node_runtime::NodeRuntime; +use settings::InlayHintKind; use remote::RemoteClient; use rpc::{ @@ -47,7 +50,7 @@ use std::{ sync::{Arc, Once}, }; use task::{DebugScenario, SpawnInTerminal, TaskContext, TaskTemplate}; -use util::ResultExt as _; +use util::{ResultExt as _, rel_path::RelPath}; use worktree::Worktree; #[derive(Debug)] @@ -75,12 +78,15 @@ pub struct LocalDapStore { http_client: Arc, environment: Entity, toolchain_store: Arc, + is_headless: bool, } pub struct RemoteDapStore { remote_client: Entity, upstream_client: AnyProtoClient, upstream_project_id: u64, + node_runtime: NodeRuntime, + http_client: Arc, } pub struct DapStore { @@ -131,17 +137,19 @@ impl DapStore { toolchain_store: Arc, worktree_store: Entity, breakpoint_store: Entity, + is_headless: bool, cx: &mut Context, ) -> Self { let mode = DapStoreMode::Local(LocalDapStore { - fs, + fs: fs.clone(), environment, http_client, node_runtime, toolchain_store, + is_headless, }); - Self::new(mode, breakpoint_store, worktree_store, cx) + Self::new(mode, breakpoint_store, worktree_store, fs, cx) } pub fn new_remote( @@ -149,15 +157,20 @@ impl DapStore { remote_client: Entity, breakpoint_store: Entity, worktree_store: Entity, + node_runtime: NodeRuntime, + http_client: Arc, + fs: Arc, cx: &mut Context, ) -> Self { let mode = DapStoreMode::Remote(RemoteDapStore { upstream_client: remote_client.read(cx).proto_client(), remote_client, upstream_project_id: project_id, + node_runtime, + http_client, }); - Self::new(mode, breakpoint_store, worktree_store, cx) + Self::new(mode, breakpoint_store, worktree_store, fs, cx) } pub fn new_collab( @@ -165,17 +178,55 @@ impl DapStore { _upstream_client: AnyProtoClient, breakpoint_store: Entity, worktree_store: Entity, + fs: Arc, cx: &mut Context, ) -> Self { - Self::new(DapStoreMode::Collab, breakpoint_store, worktree_store, cx) + Self::new( + DapStoreMode::Collab, + breakpoint_store, + worktree_store, + fs, + cx, + ) } fn new( mode: DapStoreMode, breakpoint_store: Entity, worktree_store: Entity, - _cx: &mut Context, + fs: Arc, + cx: &mut Context, ) -> Self { + cx.background_spawn(async move { + let dir = paths::debug_adapters_dir().join("js-debug-companion"); + + let mut children = fs.read_dir(&dir).await?.try_collect::>().await?; + children.sort_by_key(|child| semver::Version::parse(child.file_name()?.to_str()?).ok()); + + if let Some(child) = children.last() + && let Some(name) = child.file_name() + && let Some(name) = name.to_str() + && semver::Version::parse(name).is_ok() + { + children.pop(); + } + + for child in children { + fs.remove_dir( + &child, + RemoveOptions { + recursive: true, + ignore_if_not_exists: true, + }, + ) + .await + .ok(); + } + + anyhow::Ok(()) + }) + .detach(); + Self { mode, next_session_id: 0, @@ -203,13 +254,15 @@ impl DapStore { let settings_location = SettingsLocation { worktree_id: worktree.read(cx).id(), - path: Path::new(""), + path: RelPath::empty(), }; let dap_settings = ProjectSettings::get(Some(settings_location), cx) .dap .get(&adapter.name()); - let user_installed_path = - dap_settings.and_then(|s| s.binary.as_ref().map(PathBuf::from)); + let user_installed_path = dap_settings.and_then(|s| match &s.binary { + DapBinary::Default => None, + DapBinary::Custom(binary) => Some(PathBuf::from(binary)), + }); let user_args = dap_settings.map(|s| s.args.clone()); let delegate = self.delegate(worktree, console, cx); @@ -396,6 +449,15 @@ impl DapStore { }); } + let (remote_client, node_runtime, http_client) = match &self.mode { + DapStoreMode::Local(_) => (None, None, None), + DapStoreMode::Remote(remote_dap_store) => ( + Some(remote_dap_store.remote_client.clone()), + Some(remote_dap_store.node_runtime.clone()), + Some(remote_dap_store.http_client.clone()), + ), + DapStoreMode::Collab => (None, None, None), + }; let session = Session::new( self.breakpoint_store.clone(), session_id, @@ -404,6 +466,9 @@ impl DapStore { adapter, task_context, quirks, + remote_client, + node_runtime, + http_client, cx, ); @@ -533,6 +598,7 @@ impl DapStore { local_store.environment.update(cx, |env, cx| { env.get_worktree_environment(worktree.clone(), cx) }), + local_store.is_headless, )) } @@ -865,6 +931,7 @@ pub struct DapAdapterDelegate { http_client: Arc, toolchain_store: Arc, load_shell_env_task: Shared>>>, + is_headless: bool, } impl DapAdapterDelegate { @@ -876,6 +943,7 @@ impl DapAdapterDelegate { http_client: Arc, toolchain_store: Arc, load_shell_env_task: Shared>>>, + is_headless: bool, ) -> Self { Self { fs, @@ -885,6 +953,7 @@ impl DapAdapterDelegate { node_runtime, toolchain_store, load_shell_env_task, + is_headless, } } } @@ -938,16 +1007,18 @@ impl dap::adapters::DapDelegate for DapAdapterDelegate { fn toolchain_store(&self) -> Arc { self.toolchain_store.clone() } - async fn read_text_file(&self, path: PathBuf) -> Result { + + async fn read_text_file(&self, path: &RelPath) -> Result { let entry = self .worktree - .entry_for_path(&path) + .entry_for_path(path) .with_context(|| format!("no worktree entry for path {path:?}"))?; - let abs_path = self - .worktree - .absolutize(&entry.path) - .with_context(|| format!("cannot absolutize path {path:?}"))?; + let abs_path = self.worktree.absolutize(&entry.path); self.fs.load(&abs_path).await } + + fn is_headless(&self) -> bool { + self.is_headless + } } diff --git a/crates/project/src/debugger/locators/cargo.rs b/crates/project/src/debugger/locators/cargo.rs index b2f9580f9ced893448f86bfb2f7aab4a0de8a52e..a9bb206301562130976864ab949938968271f1e0 100644 --- a/crates/project/src/debugger/locators/cargo.rs +++ b/crates/project/src/debugger/locators/cargo.rs @@ -117,7 +117,7 @@ impl DapLocator for CargoLocator { .cwd .clone() .context("Couldn't get cwd from debug config which is needed for locators")?; - let builder = ShellBuilder::new(None, &build_config.shell).non_interactive(); + let builder = ShellBuilder::new(&build_config.shell).non_interactive(); let (program, args) = builder.build( Some("cargo".into()), &build_config diff --git a/crates/project/src/debugger/locators/python.rs b/crates/project/src/debugger/locators/python.rs index 06f7ab2e796c8139f2f8723b95f7f4503250a0c3..c3754548d0676e76f08368828d554600ab700fc0 100644 --- a/crates/project/src/debugger/locators/python.rs +++ b/crates/project/src/debugger/locators/python.rs @@ -25,7 +25,7 @@ impl DapLocator for PythonLocator { if adapter.0.as_ref() != "Debugpy" { return None; } - let valid_program = build_config.command.starts_with("\"$ZED_") + let valid_program = build_config.command.starts_with("$ZED_") || Path::new(&build_config.command) .file_name() .is_some_and(|name| name.to_str().is_some_and(|path| path.starts_with("python"))); @@ -94,3 +94,53 @@ impl DapLocator for PythonLocator { bail!("Python locator should not require DapLocator::run to be ran"); } } + +#[cfg(test)] +mod test { + use serde_json::json; + + use super::*; + + #[gpui::test] + async fn test_python_locator() { + let adapter = DebugAdapterName("Debugpy".into()); + let build_task = TaskTemplate { + label: "run module '$ZED_FILE'".into(), + command: "$ZED_CUSTOM_PYTHON_ACTIVE_ZED_TOOLCHAIN".into(), + args: vec!["-m".into(), "$ZED_CUSTOM_PYTHON_MODULE_NAME".into()], + env: Default::default(), + cwd: Some("$ZED_WORKTREE_ROOT".into()), + use_new_terminal: false, + allow_concurrent_runs: false, + reveal: task::RevealStrategy::Always, + reveal_target: task::RevealTarget::Dock, + hide: task::HideStrategy::Never, + tags: vec!["python-module-main-method".into()], + shell: task::Shell::System, + show_summary: false, + show_command: false, + }; + + let expected_scenario = DebugScenario { + adapter: "Debugpy".into(), + label: "run module 'main.py'".into(), + build: None, + config: json!({ + "request": "launch", + "python": "$ZED_CUSTOM_PYTHON_ACTIVE_ZED_TOOLCHAIN", + "args": [], + "cwd": "$ZED_WORKTREE_ROOT", + "module": "$ZED_CUSTOM_PYTHON_MODULE_NAME", + }), + tcp_connection: None, + }; + + assert_eq!( + PythonLocator + .create_scenario(&build_task, "run module 'main.py'", &adapter) + .await + .expect("Failed to create a scenario"), + expected_scenario + ); + } +} diff --git a/crates/project/src/debugger/session.rs b/crates/project/src/debugger/session.rs index 81cb3ade2e18b6430c4b644495529c4567344da5..19c088e6e8767bd56bf19759fbddd9947c4ef0ba 100644 --- a/crates/project/src/debugger/session.rs +++ b/crates/project/src/debugger/session.rs @@ -31,21 +31,28 @@ use dap::{ RunInTerminalRequestArguments, StackFramePresentationHint, StartDebuggingRequestArguments, StartDebuggingRequestArgumentsRequest, VariablePresentationHint, WriteMemoryArguments, }; -use futures::SinkExt; use futures::channel::mpsc::UnboundedSender; use futures::channel::{mpsc, oneshot}; +use futures::io::BufReader; +use futures::{AsyncBufReadExt as _, SinkExt, StreamExt, TryStreamExt}; use futures::{FutureExt, future::Shared}; use gpui::{ App, AppContext, AsyncApp, BackgroundExecutor, Context, Entity, EventEmitter, SharedString, Task, WeakEntity, }; +use http_client::HttpClient; +use node_runtime::NodeRuntime; +use remote::RemoteClient; use rpc::ErrorExt; +use serde::{Deserialize, Serialize}; use serde_json::Value; -use smol::stream::StreamExt; +use smol::net::TcpListener; use std::any::TypeId; use std::collections::BTreeMap; use std::ops::RangeInclusive; +use std::path::PathBuf; +use std::process::Stdio; use std::u64; use std::{ any::Any, @@ -56,6 +63,7 @@ use std::{ }; use task::TaskContext; use text::{PointUtf16, ToPointUtf16}; +use util::command::new_smol_command; use util::{ResultExt, debug_panic, maybe}; use worktree::Worktree; @@ -170,8 +178,8 @@ fn client_source(abs_path: &Path) -> dap::Source { dap::Source { name: abs_path .file_name() - .map(|filename| filename.to_string_lossy().to_string()), - path: Some(abs_path.to_string_lossy().to_string()), + .map(|filename| filename.to_string_lossy().into_owned()), + path: Some(abs_path.to_string_lossy().into_owned()), source_reference: None, presentation_hint: None, origin: None, @@ -696,6 +704,10 @@ pub struct Session { task_context: TaskContext, memory: memory::Memory, quirks: SessionQuirks, + remote_client: Option>, + node_runtime: Option, + http_client: Option>, + companion_port: Option, } trait CacheableCommand: Any + Send + Sync { @@ -812,6 +824,9 @@ impl Session { adapter: DebugAdapterName, task_context: TaskContext, quirks: SessionQuirks, + remote_client: Option>, + node_runtime: Option, + http_client: Option>, cx: &mut App, ) -> Entity { cx.new::(|cx| { @@ -867,6 +882,10 @@ impl Session { task_context, memory: memory::Memory::new(), quirks, + remote_client, + node_runtime, + http_client, + companion_port: None, } }) } @@ -1557,7 +1576,21 @@ impl Session { Events::ProgressStart(_) => {} Events::ProgressUpdate(_) => {} Events::Invalidated(_) => {} - Events::Other(_) => {} + Events::Other(event) => { + if event.event == "launchBrowserInCompanion" { + let Some(request) = serde_json::from_value(event.body).ok() else { + log::error!("failed to deserialize launchBrowserInCompanion event"); + return; + }; + self.launch_browser_for_remote_server(request, cx); + } else if event.event == "killCompanionBrowser" { + let Some(request) = serde_json::from_value(event.body).ok() else { + log::error!("failed to deserialize killCompanionBrowser event"); + return; + }; + self.kill_browser(request, cx); + } + } } } @@ -2716,4 +2749,304 @@ impl Session { pub fn quirks(&self) -> SessionQuirks { self.quirks } + + fn launch_browser_for_remote_server( + &mut self, + mut request: LaunchBrowserInCompanionParams, + cx: &mut Context, + ) { + let Some(remote_client) = self.remote_client.clone() else { + log::error!("can't launch browser in companion for non-remote project"); + return; + }; + let Some(http_client) = self.http_client.clone() else { + return; + }; + let Some(node_runtime) = self.node_runtime.clone() else { + return; + }; + + let mut console_output = self.console_output(cx); + let task = cx.spawn(async move |this, cx| { + let (dap_port, _child) = + if remote_client.read_with(cx, |client, _| client.shares_network_interface())? { + (request.server_port, None) + } else { + let port = { + let listener = TcpListener::bind("127.0.0.1:0") + .await + .context("getting port for DAP")?; + listener.local_addr()?.port() + }; + let child = remote_client.update(cx, |client, _| { + let command = client.build_forward_port_command( + port, + "localhost".into(), + request.server_port, + )?; + let child = new_smol_command(command.program) + .args(command.args) + .envs(command.env) + .spawn() + .context("spawning port forwarding process")?; + anyhow::Ok(child) + })??; + (port, Some(child)) + }; + + let mut companion_process = None; + let companion_port = + if let Some(companion_port) = this.read_with(cx, |this, _| this.companion_port)? { + companion_port + } else { + let task = cx.spawn(async move |cx| spawn_companion(node_runtime, cx).await); + match task.await { + Ok((port, child)) => { + companion_process = Some(child); + port + } + Err(e) => { + console_output + .send(format!("Failed to launch browser companion process: {e}")) + .await + .ok(); + return Err(e); + } + } + }; + this.update(cx, |this, cx| { + this.companion_port = Some(companion_port); + let Some(mut child) = companion_process else { + return; + }; + if let Some(stderr) = child.stderr.take() { + let mut console_output = console_output.clone(); + this.background_tasks.push(cx.spawn(async move |_, _| { + let mut stderr = BufReader::new(stderr); + let mut line = String::new(); + while let Ok(n) = stderr.read_line(&mut line).await + && n > 0 + { + console_output + .send(format!("companion stderr: {line}")) + .await + .ok(); + line.clear(); + } + })); + } + this.background_tasks.push(cx.spawn({ + let mut console_output = console_output.clone(); + async move |_, _| match child.status().await { + Ok(status) => { + if status.success() { + console_output + .send("Companion process exited normally".into()) + .await + .ok(); + } else { + console_output + .send(format!( + "Companion process exited abnormally with {status:?}" + )) + .await + .ok(); + } + } + Err(e) => { + console_output + .send(format!("Failed to join companion process: {e}")) + .await + .ok(); + } + } + })) + })?; + + request + .other + .insert("proxyUri".into(), format!("127.0.0.1:{dap_port}").into()); + // TODO pass wslInfo as needed + + let response = http_client + .post_json( + &format!("http://127.0.0.1:{companion_port}/launch-and-attach"), + serde_json::to_string(&request) + .context("serializing request")? + .into(), + ) + .await; + match response { + Ok(response) => { + if !response.status().is_success() { + console_output + .send("Launch request to companion failed".into()) + .await + .ok(); + return Err(anyhow!("launch request failed")); + } + } + Err(e) => { + console_output + .send("Failed to read response from companion".into()) + .await + .ok(); + return Err(e); + } + } + + anyhow::Ok(()) + }); + self.background_tasks.push(cx.spawn(async move |_, _| { + task.await.log_err(); + })); + } + + fn kill_browser(&self, request: KillCompanionBrowserParams, cx: &mut App) { + let Some(companion_port) = self.companion_port else { + log::error!("received killCompanionBrowser but js-debug-companion is not running"); + return; + }; + let Some(http_client) = self.http_client.clone() else { + return; + }; + + cx.spawn(async move |_| { + http_client + .post_json( + &format!("http://127.0.0.1:{companion_port}/kill"), + serde_json::to_string(&request) + .context("serializing request")? + .into(), + ) + .await?; + anyhow::Ok(()) + }) + .detach_and_log_err(cx) + } +} + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct LaunchBrowserInCompanionParams { + server_port: u16, + #[serde(flatten)] + other: HashMap, +} + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct KillCompanionBrowserParams { + launch_id: u64, +} + +async fn spawn_companion( + node_runtime: NodeRuntime, + cx: &mut AsyncApp, +) -> Result<(u16, smol::process::Child)> { + let binary_path = node_runtime + .binary_path() + .await + .context("getting node path")?; + let path = cx + .spawn(async move |cx| get_or_install_companion(node_runtime, cx).await) + .await?; + log::info!("will launch js-debug-companion version {path:?}"); + + let port = { + let listener = TcpListener::bind("127.0.0.1:0") + .await + .context("getting port for companion")?; + listener.local_addr()?.port() + }; + + let dir = paths::data_dir() + .join("js_debug_companion_state") + .to_string_lossy() + .to_string(); + + let child = new_smol_command(binary_path) + .arg(path) + .args([ + format!("--listen=127.0.0.1:{port}"), + format!("--state={dir}"), + ]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("spawning companion child process")?; + + Ok((port, child)) +} + +async fn get_or_install_companion(node: NodeRuntime, cx: &mut AsyncApp) -> Result { + const PACKAGE_NAME: &str = "@zed-industries/js-debug-companion-cli"; + + async fn install_latest_version(dir: PathBuf, node: NodeRuntime) -> Result { + let temp_dir = tempfile::tempdir().context("creating temporary directory")?; + node.npm_install_packages(temp_dir.path(), &[(PACKAGE_NAME, "latest")]) + .await + .context("installing latest companion package")?; + let version = node + .npm_package_installed_version(temp_dir.path(), PACKAGE_NAME) + .await + .context("getting installed companion version")? + .context("companion was not installed")?; + smol::fs::rename(temp_dir.path(), dir.join(&version)) + .await + .context("moving companion package into place")?; + Ok(dir.join(version)) + } + + let dir = paths::debug_adapters_dir().join("js-debug-companion"); + let (latest_installed_version, latest_version) = cx + .background_spawn({ + let dir = dir.clone(); + let node = node.clone(); + async move { + smol::fs::create_dir_all(&dir) + .await + .context("creating companion installation directory")?; + + let mut children = smol::fs::read_dir(&dir) + .await + .context("reading companion installation directory")? + .try_collect::>() + .await + .context("reading companion installation directory entries")?; + children + .sort_by_key(|child| semver::Version::parse(child.file_name().to_str()?).ok()); + + let latest_installed_version = children.last().and_then(|child| { + let version = child.file_name().into_string().ok()?; + Some((child.path(), version)) + }); + let latest_version = node + .npm_package_latest_version(PACKAGE_NAME) + .await + .log_err(); + anyhow::Ok((latest_installed_version, latest_version)) + } + }) + .await?; + + let path = if let Some((installed_path, installed_version)) = latest_installed_version { + if let Some(latest_version) = latest_version + && latest_version != installed_version + { + cx.background_spawn(install_latest_version(dir.clone(), node.clone())) + .detach(); + } + Ok(installed_path) + } else { + cx.background_spawn(install_latest_version(dir.clone(), node.clone())) + .await + }; + + Ok(path? + .join("node_modules") + .join(PACKAGE_NAME) + .join("out") + .join("cli.js")) } diff --git a/crates/project/src/direnv.rs b/crates/project/src/direnv.rs index 9ba0ad10e3173a1930186db28f7efb5d9a8267f7..75c381dda96eb4f014310f9233c7557177f6eec9 100644 --- a/crates/project/src/direnv.rs +++ b/crates/project/src/direnv.rs @@ -1,7 +1,6 @@ use crate::environment::EnvironmentErrorMessage; use std::process::ExitStatus; -#[cfg(not(any(target_os = "windows", test, feature = "test-support")))] use {collections::HashMap, std::path::Path, util::ResultExt}; #[derive(Clone)] @@ -28,7 +27,6 @@ impl From for Option { } } -#[cfg(not(any(target_os = "windows", test, feature = "test-support")))] pub async fn load_direnv_environment( env: &HashMap, dir: &Path, @@ -65,7 +63,7 @@ pub async fn load_direnv_environment( let output = String::from_utf8_lossy(&direnv_output.stdout); if output.is_empty() { // direnv outputs nothing when it has no changes to apply to environment variables - return Ok(HashMap::new()); + return Ok(HashMap::default()); } match serde_json::from_str(&output) { diff --git a/crates/project/src/environment.rs b/crates/project/src/environment.rs index d109e307a89181f0a416d6d01a3fa74684a138a7..fc86702901e1e4ad90acbe0504eaf2913d3c8326 100644 --- a/crates/project/src/environment.rs +++ b/crates/project/src/environment.rs @@ -1,6 +1,7 @@ use futures::{FutureExt, future::Shared}; use language::Buffer; use std::{path::Path, sync::Arc}; +use task::Shell; use util::ResultExt; use worktree::Worktree; @@ -16,6 +17,8 @@ use crate::{ pub struct ProjectEnvironment { cli_environment: Option>, environments: HashMap, Shared>>>>, + shell_based_environments: + HashMap<(Shell, Arc), Shared>>>>, environment_error_messages: HashMap, EnvironmentErrorMessage>, } @@ -30,6 +33,7 @@ impl ProjectEnvironment { Self { cli_environment, environments: Default::default(), + shell_based_environments: Default::default(), environment_error_messages: Default::default(), } } @@ -134,7 +138,22 @@ impl ProjectEnvironment { self.environments .entry(abs_path.clone()) - .or_insert_with(|| get_directory_env_impl(abs_path.clone(), cx).shared()) + .or_insert_with(|| { + get_directory_env_impl(&Shell::System, abs_path.clone(), cx).shared() + }) + .clone() + } + + /// Returns the project environment, if possible, with the given shell. + pub fn get_directory_environment_for_shell( + &mut self, + shell: &Shell, + abs_path: Arc, + cx: &mut Context, + ) -> Shared>>> { + self.shell_based_environments + .entry((shell.clone(), abs_path.clone())) + .or_insert_with(|| get_directory_env_impl(shell, abs_path.clone(), cx).shared()) .clone() } } @@ -176,6 +195,7 @@ impl EnvironmentErrorMessage { } async fn load_directory_shell_environment( + shell: &Shell, abs_path: &Path, load_direnv: &DirenvSettings, ) -> ( @@ -198,7 +218,7 @@ async fn load_directory_shell_environment( ); }; - load_shell_environment(dir, load_direnv).await + load_shell_environment(shell, dir, load_direnv).await } Err(err) => ( None, @@ -211,34 +231,8 @@ async fn load_directory_shell_environment( } } -#[cfg(any(test, feature = "test-support"))] -async fn load_shell_environment( - _dir: &Path, - _load_direnv: &DirenvSettings, -) -> ( - Option>, - Option, -) { - let fake_env = [("ZED_FAKE_TEST_ENV".into(), "true".into())] - .into_iter() - .collect(); - (Some(fake_env), None) -} - -#[cfg(all(target_os = "windows", not(any(test, feature = "test-support"))))] -async fn load_shell_environment( - _dir: &Path, - _load_direnv: &DirenvSettings, -) -> ( - Option>, - Option, -) { - // TODO the current code works with Unix $SHELL only, implement environment loading on windows - (None, None) -} - -#[cfg(not(any(target_os = "windows", test, feature = "test-support")))] async fn load_shell_environment( + shell: &Shell, dir: &Path, load_direnv: &DirenvSettings, ) -> ( @@ -248,55 +242,86 @@ async fn load_shell_environment( use crate::direnv::load_direnv_environment; use util::shell_env; - let dir_ = dir.to_owned(); - let mut envs = match smol::unblock(move || shell_env::capture(&dir_)).await { - Ok(envs) => envs, - Err(err) => { - util::log_err(&err); - return ( - None, - Some(EnvironmentErrorMessage::from_str( - "Failed to load environment variables. See log for details", - )), - ); - } - }; - - // If the user selects `Direct` for direnv, it would set an environment - // variable that later uses to know that it should not run the hook. - // We would include in `.envs` call so it is okay to run the hook - // even if direnv direct mode is enabled. - let (direnv_environment, direnv_error) = match load_direnv { - DirenvSettings::ShellHook => (None, None), - DirenvSettings::Direct => match load_direnv_environment(&envs, dir).await { - Ok(env) => (Some(env), None), - Err(err) => (None, err.into()), - }, - }; - if let Some(direnv_environment) = direnv_environment { - for (key, value) in direnv_environment { - if let Some(value) = value { - envs.insert(key, value); - } else { - envs.remove(&key); + if cfg!(any(test, feature = "test-support")) { + let fake_env = [("ZED_FAKE_TEST_ENV".into(), "true".into())] + .into_iter() + .collect(); + (Some(fake_env), None) + } else if cfg!(target_os = "windows",) { + let (shell, args) = shell.program_and_args(); + let envs = match shell_env::capture(shell, args, dir).await { + Ok(envs) => envs, + Err(err) => { + util::log_err(&err); + return ( + None, + Some(EnvironmentErrorMessage(format!( + "Failed to load environment variables: {}", + err + ))), + ); + } + }; + + // Note: direnv is not available on Windows, so we skip direnv processing + // and just return the shell environment + (Some(envs), None) + } else { + let dir_ = dir.to_owned(); + let (shell, args) = shell.program_and_args(); + let mut envs = match shell_env::capture(shell, args, &dir_).await { + Ok(envs) => envs, + Err(err) => { + util::log_err(&err); + return ( + None, + Some(EnvironmentErrorMessage::from_str( + "Failed to load environment variables. See log for details", + )), + ); + } + }; + + // If the user selects `Direct` for direnv, it would set an environment + // variable that later uses to know that it should not run the hook. + // We would include in `.envs` call so it is okay to run the hook + // even if direnv direct mode is enabled. + let (direnv_environment, direnv_error) = match load_direnv { + DirenvSettings::ShellHook => (None, None), + DirenvSettings::Direct => match load_direnv_environment(&envs, dir).await { + Ok(env) => (Some(env), None), + Err(err) => (None, err.into()), + }, + }; + if let Some(direnv_environment) = direnv_environment { + for (key, value) in direnv_environment { + if let Some(value) = value { + envs.insert(key, value); + } else { + envs.remove(&key); + } } } - } - (Some(envs), direnv_error) + (Some(envs), direnv_error) + } } fn get_directory_env_impl( + shell: &Shell, abs_path: Arc, cx: &Context, ) -> Task>> { let load_direnv = ProjectSettings::get_global(cx).load_direnv.clone(); + let shell = shell.clone(); cx.spawn(async move |this, cx| { let (mut shell_env, error_message) = cx .background_spawn({ let abs_path = abs_path.clone(); - async move { load_directory_shell_environment(&abs_path, &load_direnv).await } + async move { + load_directory_shell_environment(&shell, &abs_path, &load_direnv).await + } }) .await; diff --git a/crates/project/src/git_store.rs b/crates/project/src/git_store.rs index 4b9ee462529e980c782c555157e0f1ff34029fb7..40ed16183bf3d4d7182f4a13df97af4704720ef9 100644 --- a/crates/project/src/git_store.rs +++ b/crates/project/src/git_store.rs @@ -7,7 +7,7 @@ use crate::{ worktree_store::{WorktreeStore, WorktreeStoreEvent}, }; use anyhow::{Context as _, Result, anyhow, bail}; -use askpass::AskPassDelegate; +use askpass::{AskPassDelegate, EncryptedPassword, IKnowWhatIAmDoingAndIHaveReadTheDocs}; use buffer_diff::{BufferDiff, BufferDiffEvent}; use client::ProjectId; use collections::HashMap; @@ -20,7 +20,7 @@ use futures::{ stream::FuturesOrdered, }; use git::{ - BuildPermalinkParams, GitHostingProviderRegistry, Oid, WORK_DIRECTORY_REPO_PATH, + BuildPermalinkParams, GitHostingProviderRegistry, Oid, blame::Blame, parse_git_remote_url, repository::{ @@ -45,7 +45,7 @@ use parking_lot::Mutex; use postage::stream::Stream as _; use rpc::{ AnyProtoClient, TypedEnvelope, - proto::{self, FromProto, ToProto, git_reset, split_repository_update}, + proto::{self, git_reset, split_repository_update}, }; use serde::Deserialize; use std::{ @@ -63,11 +63,17 @@ use std::{ }; use sum_tree::{Edit, SumTree, TreeSet}; use text::{Bias, BufferId}; -use util::{ResultExt, debug_panic, paths::SanitizedPath, post_inc}; +use util::{ + ResultExt, debug_panic, + paths::{PathStyle, SanitizedPath}, + post_inc, + rel_path::RelPath, +}; use worktree::{ File, PathChange, PathKey, PathProgress, PathSummary, PathTarget, ProjectEntryId, UpdatedGitRepositoriesSet, UpdatedGitRepository, Worktree, }; +use zeroize::Zeroize; pub struct GitStore { state: GitStoreState, @@ -188,7 +194,7 @@ impl StatusEntry { }; proto::StatusEntry { - repo_path: self.repo_path.as_ref().to_proto(), + repo_path: self.repo_path.to_proto(), simple_status, status: Some(status_to_proto(self.status)), } @@ -199,7 +205,7 @@ impl TryFrom for StatusEntry { type Error = anyhow::Error; fn try_from(value: proto::StatusEntry) -> Result { - let repo_path = RepoPath(Arc::::from_proto(value.repo_path)); + let repo_path = RepoPath::from_proto(&value.repo_path).context("invalid repo path")?; let status = status_from_proto(value.simple_status, value.status)?; Ok(Self { repo_path, status }) } @@ -208,7 +214,7 @@ impl TryFrom for StatusEntry { impl sum_tree::Item for StatusEntry { type Summary = PathSummary; - fn summary(&self, _: &::Context) -> Self::Summary { + fn summary(&self, _: ::Context<'_>) -> Self::Summary { PathSummary { max_path: self.repo_path.0.clone(), item_summary: self.status.summary(), @@ -239,6 +245,7 @@ pub struct RepositorySnapshot { pub id: RepositoryId, pub statuses_by_path: SumTree, pub work_directory_abs_path: Arc, + pub path_style: PathStyle, pub branch: Option, pub head_commit: Option, pub scan_id: u64, @@ -291,10 +298,11 @@ pub enum RepositoryState { }, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum RepositoryEvent { Updated { full_scan: bool, new_instance: bool }, MergeHeadsChanged, + PathsChanged, } #[derive(Clone, Debug)] @@ -398,6 +406,7 @@ impl GitStore { client.add_entity_request_handler(Self::handle_get_default_branch); client.add_entity_request_handler(Self::handle_change_branch); client.add_entity_request_handler(Self::handle_create_branch); + client.add_entity_request_handler(Self::handle_rename_branch); client.add_entity_request_handler(Self::handle_git_init); client.add_entity_request_handler(Self::handle_push); client.add_entity_request_handler(Self::handle_pull); @@ -431,6 +440,15 @@ impl GitStore { pub fn is_local(&self) -> bool { matches!(self.state, GitStoreState::Local { .. }) } + pub fn set_active_repo_for_path(&mut self, project_path: &ProjectPath, cx: &mut Context) { + if let Some((repo, _)) = self.repository_and_path_for_project_path(project_path, cx) { + let id = repo.read(cx).id; + if self.active_repo_id != Some(id) { + self.active_repo_id = Some(id); + cx.emit(GitStoreEvent::ActiveRepositoryChanged(Some(id))); + } + } + } pub fn shared(&mut self, project_id: u64, client: AnyProtoClient, cx: &mut Context) { match &mut self.state { @@ -945,16 +963,12 @@ impl GitStore { { return Task::ready(Err(anyhow!("no permalink available"))); } - let Some(file_path) = file.worktree.read(cx).absolutize(&file.path).ok() else { - return Task::ready(Err(anyhow!("no permalink available"))); - }; + let file_path = file.worktree.read(cx).absolutize(&file.path); return cx.spawn(async move |cx| { let provider_registry = cx.update(GitHostingProviderRegistry::default_global)?; get_permalink_in_rust_registry_src(provider_registry, file_path, selection) .context("no permalink available") }); - - // TODO remote case }; let buffer_id = buffer.read(cx).remote_id(); @@ -983,17 +997,9 @@ impl GitStore { parse_git_remote_url(provider_registry, &origin_url) .context("parsing Git remote URL")?; - let path = repo_path.to_str().with_context(|| { - format!("converting repo path {repo_path:?} to string") - })?; - Ok(provider.build_permalink( remote, - BuildPermalinkParams { - sha: &sha, - path, - selection: Some(selection), - }, + BuildPermalinkParams::new(&sha, &repo_path, Some(selection)), )) } RepositoryState::Remote { project_id, client } => { @@ -1107,7 +1113,6 @@ impl GitStore { _ => {} } } - fn on_repository_event( &mut self, repo: Entity, @@ -1311,7 +1316,7 @@ impl GitStore { }); if let Some((repo, path)) = self.repository_and_path_for_buffer_id(buffer_id, cx) { let recv = repo.update(cx, |repo, cx| { - log::debug!("hunks changed for {}", path.display()); + log::debug!("hunks changed for {}", path.as_unix_str()); repo.spawn_set_index_text_job( path, new_index_text.as_ref().map(|rope| rope.to_string()), @@ -1403,7 +1408,7 @@ impl GitStore { GitStoreState::Local { fs, .. } => { let fs = fs.clone(); cx.background_executor() - .spawn(async move { fs.git_init(&path, fallback_branch_name) }) + .spawn(async move { fs.git_init(&path, fallback_branch_name).await }) } GitStoreState::Remote { upstream_client, @@ -1416,7 +1421,7 @@ impl GitStore { client .request(proto::GitInit { project_id: project_id, - abs_path: path.to_string_lossy().to_string(), + abs_path: path.to_string_lossy().into_owned(), fallback_branch_name, }) .await?; @@ -1451,7 +1456,7 @@ impl GitStore { } let request = upstream_client.request(proto::GitClone { project_id: *upstream_project_id, - abs_path: path.to_string_lossy().to_string(), + abs_path: path.to_string_lossy().into_owned(), remote_repo: repo, }); @@ -1473,6 +1478,7 @@ impl GitStore { mut cx: AsyncApp, ) -> Result<()> { this.update(&mut cx, |this, cx| { + let path_style = this.worktree_store.read(cx).path_style(); let mut update = envelope.payload; let id = RepositoryId::from_proto(update.id); @@ -1486,6 +1492,7 @@ impl GitStore { Repository::remote( id, Path::new(&update.abs_path).into(), + path_style, ProjectId(update.project_id), client, git_store, @@ -1679,9 +1686,8 @@ impl GitStore { .payload .paths .into_iter() - .map(PathBuf::from) - .map(RepoPath::new) - .collect(); + .map(|path| RepoPath::new(&path)) + .collect::>>()?; repository_handle .update(&mut cx, |repository_handle, cx| { @@ -1703,9 +1709,8 @@ impl GitStore { .payload .paths .into_iter() - .map(PathBuf::from) - .map(RepoPath::new) - .collect(); + .map(|path| RepoPath::new(&path)) + .collect::>>()?; repository_handle .update(&mut cx, |repository_handle, cx| { @@ -1728,9 +1733,8 @@ impl GitStore { .payload .paths .into_iter() - .map(PathBuf::from) - .map(RepoPath::new) - .collect(); + .map(|path| RepoPath::new(&path)) + .collect::>>()?; repository_handle .update(&mut cx, |repository_handle, cx| { @@ -1802,7 +1806,7 @@ impl GitStore { ) -> Result { let repository_id = RepositoryId::from_proto(envelope.payload.repository_id); let repository_handle = Self::repository_for_request(&this, repository_id, &mut cx)?; - let repo_path = RepoPath::from_str(&envelope.payload.path); + let repo_path = RepoPath::from_proto(&envelope.payload.path)?; repository_handle .update(&mut cx, |repository_handle, cx| { @@ -1944,6 +1948,25 @@ impl GitStore { Ok(proto::Ack {}) } + async fn handle_rename_branch( + this: Entity, + envelope: TypedEnvelope, + mut cx: AsyncApp, + ) -> Result { + let repository_id = RepositoryId::from_proto(envelope.payload.repository_id); + let repository_handle = Self::repository_for_request(&this, repository_id, &mut cx)?; + let branch = envelope.payload.branch; + let new_name = envelope.payload.new_name; + + repository_handle + .update(&mut cx, |repository_handle, _| { + repository_handle.rename_branch(branch, new_name) + })? + .await??; + + Ok(proto::Ack {}) + } + async fn handle_show( this: Entity, envelope: TypedEnvelope, @@ -1984,7 +2007,7 @@ impl GitStore { .files .into_iter() .map(|file| proto::CommitFile { - path: file.path.to_string(), + path: file.path.to_proto(), old_text: file.old_text, new_text: file.new_text, }) @@ -2024,8 +2047,8 @@ impl GitStore { .payload .paths .iter() - .map(|s| RepoPath::from_str(s)) - .collect(); + .map(|s| RepoPath::from_proto(s)) + .collect::>>()?; repository_handle .update(&mut cx, |repository_handle, cx| { @@ -2080,13 +2103,19 @@ impl GitStore { anyhow::bail!("no askpass found"); }; - let response = askpass.ask_password(envelope.payload.prompt).await?; + let response = askpass + .ask_password(envelope.payload.prompt) + .await + .ok_or_else(|| anyhow::anyhow!("askpass cancelled"))?; delegates .lock() .insert(envelope.payload.askpass_id, askpass); - Ok(proto::AskPassResponse { response }) + // In fact, we don't quite know what we're doing here, as we're sending askpass password unencrypted, but.. + Ok(proto::AskPassResponse { + response: response.decrypt(IKnowWhatIAmDoingAndIHaveReadTheDocs)?, + }) } async fn handle_check_for_pushed_commits( @@ -2311,9 +2340,10 @@ impl GitStore { fn process_updated_entries( &self, worktree: &Entity, - updated_entries: &[(Arc, ProjectEntryId, PathChange)], + updated_entries: &[(Arc, ProjectEntryId, PathChange)], cx: &mut App, ) -> Task, Vec>> { + let path_style = worktree.read(cx).path_style(); let mut repo_paths = self .repositories .values() @@ -2328,7 +2358,7 @@ impl GitStore { let entries = entries .into_iter() - .filter_map(|path| worktree.absolutize(&path).ok()) + .map(|path| worktree.absolutize(&path)) .collect::>(); let executor = cx.background_executor().clone(); @@ -2348,8 +2378,9 @@ impl GitStore { let mut paths = Vec::new(); // All paths prefixed by a given repo will constitute a continuous range. while let Some(path) = entries.get(ix) - && let Some(repo_path) = - RepositorySnapshot::abs_path_to_repo_path_inner(&repo_path, path) + && let Some(repo_path) = RepositorySnapshot::abs_path_to_repo_path_inner( + &repo_path, path, path_style, + ) { paths.push((repo_path, ix)); ix += 1; @@ -2720,7 +2751,10 @@ fn make_remote_delegate( prompt, }); cx.spawn(async move |_, _| { - tx.send(response.await?.response).ok(); + let mut response = response.await?.response; + tx.send(EncryptedPassword::try_from(response.as_ref())?) + .ok(); + response.zeroize(); anyhow::Ok(()) }) .detach_and_log_err(cx); @@ -2740,7 +2774,7 @@ impl RepositoryId { } impl RepositorySnapshot { - fn empty(id: RepositoryId, work_directory_abs_path: Arc) -> Self { + fn empty(id: RepositoryId, work_directory_abs_path: Arc, path_style: PathStyle) -> Self { Self { id, statuses_by_path: Default::default(), @@ -2752,6 +2786,7 @@ impl RepositorySnapshot { remote_origin_url: None, remote_upstream_url: None, stash_entries: Default::default(), + path_style, } } @@ -2774,7 +2809,7 @@ impl RepositorySnapshot { merge_message: self.merge.message.as_ref().map(|msg| msg.to_string()), project_id, id: self.id.to_proto(), - abs_path: self.work_directory_abs_path.to_proto(), + abs_path: self.work_directory_abs_path.to_string_lossy().into_owned(), entry_ids: vec![self.id.to_proto()], scan_id: self.scan_id, is_last_update: true, @@ -2812,13 +2847,13 @@ impl RepositorySnapshot { current_new_entry = new_statuses.next(); } Ordering::Greater => { - removed_statuses.push(old_entry.repo_path.as_ref().to_proto()); + removed_statuses.push(old_entry.repo_path.to_proto()); current_old_entry = old_statuses.next(); } } } (None, Some(old_entry)) => { - removed_statuses.push(old_entry.repo_path.as_ref().to_proto()); + removed_statuses.push(old_entry.repo_path.to_proto()); current_old_entry = old_statuses.next(); } (Some(new_entry), None) => { @@ -2838,12 +2873,12 @@ impl RepositorySnapshot { .merge .conflicted_paths .iter() - .map(|path| path.as_ref().to_proto()) + .map(|path| path.to_proto()) .collect(), merge_message: self.merge.message.as_ref().map(|msg| msg.to_string()), project_id, id: self.id.to_proto(), - abs_path: self.work_directory_abs_path.to_proto(), + abs_path: self.work_directory_abs_path.to_string_lossy().into_owned(), entry_ids: vec![], scan_id: self.scan_id, is_last_update: true, @@ -2866,23 +2901,24 @@ impl RepositorySnapshot { pub fn status_for_path(&self, path: &RepoPath) -> Option { self.statuses_by_path - .get(&PathKey(path.0.clone()), &()) + .get(&PathKey(path.0.clone()), ()) .cloned() } pub fn abs_path_to_repo_path(&self, abs_path: &Path) -> Option { - Self::abs_path_to_repo_path_inner(&self.work_directory_abs_path, abs_path) + Self::abs_path_to_repo_path_inner(&self.work_directory_abs_path, abs_path, self.path_style) } #[inline] fn abs_path_to_repo_path_inner( work_directory_abs_path: &Path, abs_path: &Path, + path_style: PathStyle, ) -> Option { abs_path .strip_prefix(&work_directory_abs_path) - .map(RepoPath::from) .ok() + .and_then(|path| RepoPath::from_std_path(path, path_style).ok()) } pub fn had_conflict_on_last_merge_head_change(&self, repo_path: &RepoPath) -> bool { @@ -3008,7 +3044,8 @@ impl Repository { git_store: WeakEntity, cx: &mut Context, ) -> Self { - let snapshot = RepositorySnapshot::empty(id, work_directory_abs_path.clone()); + let snapshot = + RepositorySnapshot::empty(id, work_directory_abs_path.clone(), PathStyle::local()); Repository { this: cx.weak_entity(), git_store, @@ -3034,12 +3071,13 @@ impl Repository { fn remote( id: RepositoryId, work_directory_abs_path: Arc, + path_style: PathStyle, project_id: ProjectId, client: AnyProtoClient, git_store: WeakEntity, cx: &mut Context, ) -> Self { - let snapshot = RepositorySnapshot::empty(id, work_directory_abs_path); + let snapshot = RepositorySnapshot::empty(id, work_directory_abs_path, path_style); Self { this: cx.weak_entity(), snapshot, @@ -3083,12 +3121,11 @@ impl Repository { let buffer_store = git_store.buffer_store.read(cx); let buffer = buffer_store.get(*buffer_id)?; let file = File::from_dyn(buffer.read(cx).file())?; - let abs_path = - file.worktree.read(cx).absolutize(&file.path).ok()?; + let abs_path = file.worktree.read(cx).absolutize(&file.path); let repo_path = this.abs_path_to_repo_path(&abs_path)?; log::debug!( "start reload diff bases for repo path {}", - repo_path.0.display() + repo_path.as_unix_str() ); diff_state.update(cx, |diff_state, _| { let has_unstaged_diff = diff_state @@ -3311,12 +3348,15 @@ impl Repository { pub fn repo_path_to_project_path(&self, path: &RepoPath, cx: &App) -> Option { let git_store = self.git_store.upgrade()?; let worktree_store = git_store.read(cx).worktree_store.read(cx); - let abs_path = self.snapshot.work_directory_abs_path.join(&path.0); + let abs_path = self + .snapshot + .work_directory_abs_path + .join(path.as_std_path()); let abs_path = SanitizedPath::new(&abs_path); let (worktree, relative_path) = worktree_store.find_worktree(abs_path, cx)?; Some(ProjectPath { worktree_id: worktree.read(cx).id(), - path: relative_path.into(), + path: relative_path, }) } @@ -3440,10 +3480,7 @@ impl Repository { project_id: project_id.0, repository_id: id.to_proto(), commit, - paths: paths - .into_iter() - .map(|p| p.to_string_lossy().to_string()) - .collect(), + paths: paths.into_iter().map(|p| p.to_proto()).collect(), }) .await?; @@ -3533,12 +3570,14 @@ impl Repository { files: response .files .into_iter() - .map(|file| CommitFile { - path: Path::new(&file.path).into(), - old_text: file.old_text, - new_text: file.new_text, + .map(|file| { + Ok(CommitFile { + path: RepoPath::from_proto(&file.path)?, + old_text: file.old_text, + new_text: file.new_text, + }) }) - .collect(), + .collect::>>()?, }) } } @@ -3598,7 +3637,7 @@ impl Repository { repository_id: id.to_proto(), paths: entries .into_iter() - .map(|repo_path| repo_path.as_ref().to_proto()) + .map(|repo_path| repo_path.to_proto()) .collect(), }) .await @@ -3664,7 +3703,7 @@ impl Repository { repository_id: id.to_proto(), paths: entries .into_iter() - .map(|repo_path| repo_path.as_ref().to_proto()) + .map(|repo_path| repo_path.to_proto()) .collect(), }) .await @@ -3728,7 +3767,7 @@ impl Repository { repository_id: id.to_proto(), paths: entries .into_iter() - .map(|repo_path| repo_path.as_ref().to_proto()) + .map(|repo_path| repo_path.to_proto()) .collect(), }) .await @@ -4130,7 +4169,10 @@ impl Repository { Some(GitJobKey::WriteIndex(path.clone())), None, move |git_repo, mut cx| async move { - log::debug!("start updating index text for buffer {}", path.display()); + log::debug!( + "start updating index text for buffer {}", + path.as_unix_str() + ); match git_repo { RepositoryState::Local { backend, @@ -4146,13 +4188,16 @@ impl Repository { .request(proto::SetIndexText { project_id: project_id.0, repository_id: id.to_proto(), - path: path.as_ref().to_proto(), + path: path.to_proto(), text: content, }) .await?; } } - log::debug!("finish updating index text for buffer {}", path.display()); + log::debug!( + "finish updating index text for buffer {}", + path.as_unix_str() + ); if let Some(hunk_staging_operation_count) = hunk_staging_operation_count { let project_path = this @@ -4331,6 +4376,36 @@ impl Repository { ) } + pub fn rename_branch( + &mut self, + branch: String, + new_name: String, + ) -> oneshot::Receiver> { + let id = self.id; + self.send_job( + Some(format!("git branch -m {branch} {new_name}").into()), + move |repo, _cx| async move { + match repo { + RepositoryState::Local { backend, .. } => { + backend.rename_branch(branch, new_name).await + } + RepositoryState::Remote { project_id, client } => { + client + .request(proto::GitRenameBranch { + project_id: project_id.0, + repository_id: id.to_proto(), + branch, + new_name, + }) + .await?; + + Ok(()) + } + } + }, + ) + } + pub fn check_for_pushed_commits(&mut self) -> oneshot::Receiver>> { let id = self.id; self.send_job(None, move |repo, _cx| async move { @@ -4385,7 +4460,7 @@ impl Repository { update .current_merge_conflicts .into_iter() - .map(|path| RepoPath(Path::new(&path).into())), + .filter_map(|path| RepoPath::from_proto(&path).log_err()), ); self.snapshot.branch = update.branch_summary.as_ref().map(proto_to_branch); self.snapshot.head_commit = update @@ -4406,7 +4481,11 @@ impl Repository { let edits = update .removed_statuses .into_iter() - .map(|path| sum_tree::Edit::Remove(PathKey(FromProto::from_proto(path)))) + .filter_map(|path| { + Some(sum_tree::Edit::Remove(PathKey( + RelPath::from_proto(&path).log_err()?, + ))) + }) .chain( update .updated_statuses @@ -4416,7 +4495,7 @@ impl Repository { }), ) .collect::>(); - self.snapshot.statuses_by_path.edit(edits, &()); + self.snapshot.statuses_by_path.edit(edits, ()); if update.is_last_update { self.snapshot.scan_id = update.scan_id; } @@ -4527,9 +4606,12 @@ impl Repository { log::error!("failed to get working directory environment for repository {work_directory_abs_path:?}"); HashMap::default() }); + let search_paths = environment.get("PATH").map(|val| val.to_owned()); let backend = cx .background_spawn(async move { - fs.open_repo(&dot_git_abs_path) + let system_git_binary_path = search_paths.and_then(|search_paths| which::which_in("git", Some(search_paths), &work_directory_abs_path).ok()) + .or_else(|| which::which("git").ok()); + fs.open_repo(&dot_git_abs_path, system_git_binary_path.as_deref()) .with_context(|| format!("opening repository at {dot_git_abs_path:?}")) }) .await?; @@ -4717,7 +4799,7 @@ impl Repository { .background_spawn(async move { let mut changed_path_statuses = Vec::new(); let prev_statuses = prev_snapshot.statuses_by_path.clone(); - let mut cursor = prev_statuses.cursor::(&()); + let mut cursor = prev_statuses.cursor::(()); for (repo_path, status) in &*statuses.entries { changed_paths.remove(repo_path); @@ -4732,7 +4814,7 @@ impl Repository { status: *status, })); } - let mut cursor = prev_statuses.cursor::(&()); + let mut cursor = prev_statuses.cursor::(()); for path in changed_paths.into_iter() { if cursor.seek_forward(&PathTarget::Path(&path), Bias::Left) { changed_path_statuses.push(Edit::Remove(PathKey(path.0))); @@ -4749,21 +4831,25 @@ impl Repository { if !changed_path_statuses.is_empty() { this.snapshot .statuses_by_path - .edit(changed_path_statuses, &()); + .edit(changed_path_statuses, ()); this.snapshot.scan_id += 1; } - if needs_update && let Some(updates_tx) = updates_tx { + if needs_update { + cx.emit(RepositoryEvent::Updated { + full_scan: false, + new_instance: false, + }); + } + + if let Some(updates_tx) = updates_tx { updates_tx .unbounded_send(DownstreamUpdate::UpdateRepository( this.snapshot.clone(), )) .ok(); } - cx.emit(RepositoryEvent::Updated { - full_scan: false, - new_instance: false, - }); + cx.emit(RepositoryEvent::PathsChanged); }) }, ); @@ -4819,11 +4905,15 @@ fn get_permalink_in_rust_registry_src( let path = PathBuf::from(cargo_vcs_info.path_in_vcs).join(path.strip_prefix(dir).unwrap()); let permalink = provider.build_permalink( remote, - BuildPermalinkParams { - sha: &cargo_vcs_info.git.sha1, - path: &path.to_string_lossy(), - selection: Some(selection), - }, + BuildPermalinkParams::new( + &cargo_vcs_info.git.sha1, + &RepoPath( + RelPath::new(&path, PathStyle::local()) + .context("invalid path")? + .into_arc(), + ), + Some(selection), + ), ); Ok(permalink) } @@ -5006,9 +5096,7 @@ async fn compute_snapshot( let mut events = Vec::new(); let branches = backend.branches().await?; let branch = branches.into_iter().find(|branch| branch.is_head); - let statuses = backend - .status(std::slice::from_ref(&WORK_DIRECTORY_REPO_PATH)) - .await?; + let statuses = backend.status(&[RelPath::empty().into()]).await?; let stash_entries = backend.stash_entries().await?; let statuses_by_path = SumTree::from_iter( statuses @@ -5018,7 +5106,7 @@ async fn compute_snapshot( repo_path: repo_path.clone(), status: *status, }), - &(), + (), ); let (merge_details, merge_heads_changed) = MergeDetails::load(&backend, &statuses_by_path, &prev_snapshot).await?; @@ -5054,6 +5142,7 @@ async fn compute_snapshot( id, statuses_by_path, work_directory_abs_path, + path_style: prev_snapshot.path_style, scan_id: prev_snapshot.scan_id + 1, branch, head_commit, diff --git a/crates/project/src/git_store/conflict_set.rs b/crates/project/src/git_store/conflict_set.rs index 313a1e90adc2fde8a62dbe6aa60b4d3a366af22c..13a082b35024b11870fb14fb3419c76841566193 100644 --- a/crates/project/src/git_store/conflict_set.rs +++ b/crates/project/src/git_store/conflict_set.rs @@ -255,20 +255,23 @@ impl EventEmitter for ConflictSet {} #[cfg(test)] mod tests { - use std::{path::Path, sync::mpsc}; + use std::sync::mpsc; - use crate::{Project, project_settings::ProjectSettings}; + use crate::Project; use super::*; use fs::FakeFs; - use git::status::{UnmergedStatus, UnmergedStatusCode}; + use git::{ + repository::repo_path, + status::{UnmergedStatus, UnmergedStatusCode}, + }; use gpui::{BackgroundExecutor, TestAppContext}; use language::language_settings::AllLanguageSettings; use serde_json::json; use settings::Settings as _; use text::{Buffer, BufferId, Point, ToOffset as _}; use unindent::Unindent as _; - use util::path; + use util::{path, rel_path::rel_path}; use worktree::WorktreeSettings; #[test] @@ -344,8 +347,8 @@ mod tests { assert_eq!(conflicts_in_range.len(), 1); // Test with a range that doesn't include any conflicts - let range = buffer.anchor_after(first_conflict_end.to_offset(&buffer) + 1) - ..buffer.anchor_before(second_conflict_start.to_offset(&buffer) - 1); + let range = buffer.anchor_after(first_conflict_end.to_next_offset(&buffer)) + ..buffer.anchor_before(second_conflict_start.to_previous_offset(&buffer)); let conflicts_in_range = conflict_snapshot.conflicts_in_range(range, &snapshot); assert_eq!(conflicts_in_range.len(), 0); } @@ -484,7 +487,7 @@ mod tests { cx.update(|cx| { settings::init(cx); WorktreeSettings::register(cx); - ProjectSettings::register(cx); + Project::init_settings(cx); AllLanguageSettings::register(cx); }); let initial_text = " @@ -543,7 +546,7 @@ mod tests { fs.with_git_state(path!("/project/.git").as_ref(), true, |state| { state.unmerged_paths.insert( - "a.txt".into(), + repo_path("a.txt"), UnmergedStatus { first_head: UnmergedStatusCode::Updated, second_head: UnmergedStatusCode::Updated, @@ -585,7 +588,7 @@ mod tests { cx.update(|cx| { settings::init(cx); WorktreeSettings::register(cx); - ProjectSettings::register(cx); + Project::init_settings(cx); AllLanguageSettings::register(cx); }); @@ -621,7 +624,7 @@ mod tests { cx.run_until_parked(); fs.with_git_state(path!("/project/.git").as_ref(), true, |state| { state.unmerged_paths.insert( - "a.txt".into(), + rel_path("a.txt").into(), UnmergedStatus { first_head: UnmergedStatusCode::Updated, second_head: UnmergedStatusCode::Updated, @@ -647,7 +650,7 @@ mod tests { // Simulate the conflict being removed by e.g. staging the file. fs.with_git_state(path!("/project/.git").as_ref(), true, |state| { - state.unmerged_paths.remove(Path::new("a.txt")) + state.unmerged_paths.remove(&repo_path("a.txt")) }) .unwrap(); @@ -660,7 +663,7 @@ mod tests { // Simulate the conflict being re-added. fs.with_git_state(path!("/project/.git").as_ref(), true, |state| { state.unmerged_paths.insert( - "a.txt".into(), + repo_path("a.txt"), UnmergedStatus { first_head: UnmergedStatusCode::Updated, second_head: UnmergedStatusCode::Updated, diff --git a/crates/project/src/git_store/git_traversal.rs b/crates/project/src/git_store/git_traversal.rs index eee492e482daf746c60836cab172f84b2834b468..ca4a22b14d3682790282744b4834980d669b8d93 100644 --- a/crates/project/src/git_store/git_traversal.rs +++ b/crates/project/src/git_store/git_traversal.rs @@ -3,6 +3,7 @@ use git::{repository::RepoPath, status::GitSummary}; use std::{collections::BTreeMap, ops::Deref, path::Path}; use sum_tree::Cursor; use text::Bias; +use util::rel_path::RelPath; use worktree::{Entry, PathProgress, PathTarget, Traversal}; use super::{RepositoryId, RepositorySnapshot, StatusEntry}; @@ -12,7 +13,10 @@ pub struct GitTraversal<'a> { traversal: Traversal<'a>, current_entry_summary: Option, repo_root_to_snapshot: BTreeMap<&'a Path, &'a RepositorySnapshot>, - repo_location: Option<(RepositoryId, Cursor<'a, StatusEntry, PathProgress<'a>>)>, + repo_location: Option<( + RepositoryId, + Cursor<'a, 'static, StatusEntry, PathProgress<'a>>, + )>, } impl<'a> GitTraversal<'a> { @@ -67,10 +71,7 @@ impl<'a> GitTraversal<'a> { return; }; - let Ok(abs_path) = self.traversal.snapshot().absolutize(&entry.path) else { - self.repo_location = None; - return; - }; + let abs_path = self.traversal.snapshot().absolutize(&entry.path); let Some((repo, repo_path)) = self.repo_root_for_path(&abs_path) else { self.repo_location = None; @@ -85,7 +86,7 @@ impl<'a> GitTraversal<'a> { .map(|(prev_repo_id, _)| *prev_repo_id) != Some(repo.id) { - self.repo_location = Some((repo.id, repo.statuses_by_path.cursor::(&()))); + self.repo_location = Some((repo.id, repo.statuses_by_path.cursor::(()))); } let Some((_, statuses)) = &mut self.repo_location else { @@ -94,13 +95,13 @@ impl<'a> GitTraversal<'a> { if entry.is_dir() { let mut statuses = statuses.clone(); - statuses.seek_forward(&PathTarget::Path(repo_path.as_ref()), Bias::Left); - let summary = statuses.summary(&PathTarget::Successor(repo_path.as_ref()), Bias::Left); + statuses.seek_forward(&PathTarget::Path(&repo_path), Bias::Left); + let summary = statuses.summary(&PathTarget::Successor(&repo_path), Bias::Left); self.current_entry_summary = Some(summary); } else if entry.is_file() { // For a file entry, park the cursor on the corresponding status - if statuses.seek_forward(&PathTarget::Path(repo_path.as_ref()), Bias::Left) { + if statuses.seek_forward(&PathTarget::Path(&repo_path), Bias::Left) { // TODO: Investigate statuses.item() being None here. self.current_entry_summary = statuses.item().map(|item| item.status.into()); } else { @@ -156,7 +157,7 @@ impl<'a> Iterator for GitTraversal<'a> { } pub struct ChildEntriesGitIter<'a> { - parent_path: &'a Path, + parent_path: &'a RelPath, traversal: GitTraversal<'a>, } @@ -164,7 +165,7 @@ impl<'a> ChildEntriesGitIter<'a> { pub fn new( repo_snapshots: &'a HashMap, worktree_snapshot: &'a worktree::Snapshot, - parent_path: &'a Path, + parent_path: &'a RelPath, ) -> Self { let mut traversal = GitTraversal::new( repo_snapshots, @@ -262,7 +263,7 @@ mod tests { use gpui::TestAppContext; use serde_json::json; use settings::SettingsStore; - use util::path; + use util::{path, rel_path::rel_path}; const CONFLICT: FileStatus = FileStatus::Unmerged(UnmergedStatus { first_head: UnmergedStatusCode::Updated, @@ -309,17 +310,14 @@ mod tests { fs.set_status_for_repo( Path::new(path!("/root/x/.git")), &[ - (Path::new("x2.txt"), StatusCode::Modified.index()), - (Path::new("z.txt"), StatusCode::Added.index()), + ("x2.txt", StatusCode::Modified.index()), + ("z.txt", StatusCode::Added.index()), ], ); - fs.set_status_for_repo( - Path::new(path!("/root/x/y/.git")), - &[(Path::new("y1.txt"), CONFLICT)], - ); + fs.set_status_for_repo(Path::new(path!("/root/x/y/.git")), &[("y1.txt", CONFLICT)]); fs.set_status_for_repo( Path::new(path!("/root/z/.git")), - &[(Path::new("z2.txt"), StatusCode::Added.index())], + &[("z2.txt", StatusCode::Added.index())], ); let project = Project::test(fs, [path!("/root").as_ref()], cx).await; @@ -334,7 +332,7 @@ mod tests { let traversal = GitTraversal::new( &repo_snapshots, - worktree_snapshot.traverse_from_path(true, false, true, Path::new("x")), + worktree_snapshot.traverse_from_path(true, false, true, RelPath::unix("x").unwrap()), ); let entries = traversal .map(|entry| (entry.path.clone(), entry.git_summary)) @@ -342,13 +340,13 @@ mod tests { pretty_assertions::assert_eq!( entries, [ - (Path::new("x/x1.txt").into(), GitSummary::UNCHANGED), - (Path::new("x/x2.txt").into(), MODIFIED), - (Path::new("x/y/y1.txt").into(), GitSummary::CONFLICT), - (Path::new("x/y/y2.txt").into(), GitSummary::UNCHANGED), - (Path::new("x/z.txt").into(), ADDED), - (Path::new("z/z1.txt").into(), GitSummary::UNCHANGED), - (Path::new("z/z2.txt").into(), ADDED), + (rel_path("x/x1.txt").into(), GitSummary::UNCHANGED), + (rel_path("x/x2.txt").into(), MODIFIED), + (rel_path("x/y/y1.txt").into(), GitSummary::CONFLICT), + (rel_path("x/y/y2.txt").into(), GitSummary::UNCHANGED), + (rel_path("x/z.txt").into(), ADDED), + (rel_path("z/z1.txt").into(), GitSummary::UNCHANGED), + (rel_path("z/z2.txt").into(), ADDED), ] ) } @@ -383,18 +381,15 @@ mod tests { fs.set_status_for_repo( Path::new(path!("/root/x/.git")), &[ - (Path::new("x2.txt"), StatusCode::Modified.index()), - (Path::new("z.txt"), StatusCode::Added.index()), + ("x2.txt", StatusCode::Modified.index()), + ("z.txt", StatusCode::Added.index()), ], ); - fs.set_status_for_repo( - Path::new(path!("/root/x/y/.git")), - &[(Path::new("y1.txt"), CONFLICT)], - ); + fs.set_status_for_repo(Path::new(path!("/root/x/y/.git")), &[("y1.txt", CONFLICT)]); fs.set_status_for_repo( Path::new(path!("/root/z/.git")), - &[(Path::new("z2.txt"), StatusCode::Added.index())], + &[("z2.txt", StatusCode::Added.index())], ); let project = Project::test(fs, [path!("/root").as_ref()], cx).await; @@ -412,18 +407,18 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new("x/y"), GitSummary::CONFLICT), - (Path::new("x/y/y1.txt"), GitSummary::CONFLICT), - (Path::new("x/y/y2.txt"), GitSummary::UNCHANGED), + ("x/y", GitSummary::CONFLICT), + ("x/y/y1.txt", GitSummary::CONFLICT), + ("x/y/y2.txt", GitSummary::UNCHANGED), ], ); check_git_statuses( &repo_snapshots, &worktree_snapshot, &[ - (Path::new("z"), ADDED), - (Path::new("z/z1.txt"), GitSummary::UNCHANGED), - (Path::new("z/z2.txt"), ADDED), + ("z", ADDED), + ("z/z1.txt", GitSummary::UNCHANGED), + ("z/z2.txt", ADDED), ], ); @@ -432,9 +427,9 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new("x"), MODIFIED + ADDED), - (Path::new("x/y"), GitSummary::CONFLICT), - (Path::new("x/y/y1.txt"), GitSummary::CONFLICT), + ("x", MODIFIED + ADDED), + ("x/y", GitSummary::CONFLICT), + ("x/y/y1.txt", GitSummary::CONFLICT), ], ); @@ -443,13 +438,13 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new("x"), MODIFIED + ADDED), - (Path::new("x/x1.txt"), GitSummary::UNCHANGED), - (Path::new("x/x2.txt"), MODIFIED), - (Path::new("x/y"), GitSummary::CONFLICT), - (Path::new("x/y/y1.txt"), GitSummary::CONFLICT), - (Path::new("x/y/y2.txt"), GitSummary::UNCHANGED), - (Path::new("x/z.txt"), ADDED), + ("x", MODIFIED + ADDED), + ("x/x1.txt", GitSummary::UNCHANGED), + ("x/x2.txt", MODIFIED), + ("x/y", GitSummary::CONFLICT), + ("x/y/y1.txt", GitSummary::CONFLICT), + ("x/y/y2.txt", GitSummary::UNCHANGED), + ("x/z.txt", ADDED), ], ); @@ -458,9 +453,9 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new(""), GitSummary::UNCHANGED), - (Path::new("x"), MODIFIED + ADDED), - (Path::new("x/x1.txt"), GitSummary::UNCHANGED), + ("", GitSummary::UNCHANGED), + ("x", MODIFIED + ADDED), + ("x/x1.txt", GitSummary::UNCHANGED), ], ); @@ -469,17 +464,17 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new(""), GitSummary::UNCHANGED), - (Path::new("x"), MODIFIED + ADDED), - (Path::new("x/x1.txt"), GitSummary::UNCHANGED), - (Path::new("x/x2.txt"), MODIFIED), - (Path::new("x/y"), GitSummary::CONFLICT), - (Path::new("x/y/y1.txt"), GitSummary::CONFLICT), - (Path::new("x/y/y2.txt"), GitSummary::UNCHANGED), - (Path::new("x/z.txt"), ADDED), - (Path::new("z"), ADDED), - (Path::new("z/z1.txt"), GitSummary::UNCHANGED), - (Path::new("z/z2.txt"), ADDED), + ("", GitSummary::UNCHANGED), + ("x", MODIFIED + ADDED), + ("x/x1.txt", GitSummary::UNCHANGED), + ("x/x2.txt", MODIFIED), + ("x/y", GitSummary::CONFLICT), + ("x/y/y1.txt", GitSummary::CONFLICT), + ("x/y/y2.txt", GitSummary::UNCHANGED), + ("x/z.txt", ADDED), + ("z", ADDED), + ("z/z1.txt", GitSummary::UNCHANGED), + ("z/z2.txt", ADDED), ], ); } @@ -517,9 +512,9 @@ mod tests { fs.set_status_for_repo( Path::new(path!("/root/.git")), &[ - (Path::new("a/b/c1.txt"), StatusCode::Added.index()), - (Path::new("a/d/e2.txt"), StatusCode::Modified.index()), - (Path::new("g/h2.txt"), CONFLICT), + ("a/b/c1.txt", StatusCode::Added.index()), + ("a/d/e2.txt", StatusCode::Modified.index()), + ("g/h2.txt", CONFLICT), ], ); @@ -537,9 +532,9 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new(""), GitSummary::CONFLICT + MODIFIED + ADDED), - (Path::new("g"), GitSummary::CONFLICT), - (Path::new("g/h2.txt"), GitSummary::CONFLICT), + ("", GitSummary::CONFLICT + MODIFIED + ADDED), + ("g", GitSummary::CONFLICT), + ("g/h2.txt", GitSummary::CONFLICT), ], ); @@ -547,17 +542,17 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new(""), GitSummary::CONFLICT + ADDED + MODIFIED), - (Path::new("a"), ADDED + MODIFIED), - (Path::new("a/b"), ADDED), - (Path::new("a/b/c1.txt"), ADDED), - (Path::new("a/b/c2.txt"), GitSummary::UNCHANGED), - (Path::new("a/d"), MODIFIED), - (Path::new("a/d/e2.txt"), MODIFIED), - (Path::new("f"), GitSummary::UNCHANGED), - (Path::new("f/no-status.txt"), GitSummary::UNCHANGED), - (Path::new("g"), GitSummary::CONFLICT), - (Path::new("g/h2.txt"), GitSummary::CONFLICT), + ("", GitSummary::CONFLICT + ADDED + MODIFIED), + ("a", ADDED + MODIFIED), + ("a/b", ADDED), + ("a/b/c1.txt", ADDED), + ("a/b/c2.txt", GitSummary::UNCHANGED), + ("a/d", MODIFIED), + ("a/d/e2.txt", MODIFIED), + ("f", GitSummary::UNCHANGED), + ("f/no-status.txt", GitSummary::UNCHANGED), + ("g", GitSummary::CONFLICT), + ("g/h2.txt", GitSummary::CONFLICT), ], ); @@ -565,15 +560,15 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new("a/b"), ADDED), - (Path::new("a/b/c1.txt"), ADDED), - (Path::new("a/b/c2.txt"), GitSummary::UNCHANGED), - (Path::new("a/d"), MODIFIED), - (Path::new("a/d/e1.txt"), GitSummary::UNCHANGED), - (Path::new("a/d/e2.txt"), MODIFIED), - (Path::new("f"), GitSummary::UNCHANGED), - (Path::new("f/no-status.txt"), GitSummary::UNCHANGED), - (Path::new("g"), GitSummary::CONFLICT), + ("a/b", ADDED), + ("a/b/c1.txt", ADDED), + ("a/b/c2.txt", GitSummary::UNCHANGED), + ("a/d", MODIFIED), + ("a/d/e1.txt", GitSummary::UNCHANGED), + ("a/d/e2.txt", MODIFIED), + ("f", GitSummary::UNCHANGED), + ("f/no-status.txt", GitSummary::UNCHANGED), + ("g", GitSummary::CONFLICT), ], ); @@ -581,11 +576,11 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new("a/b/c1.txt"), ADDED), - (Path::new("a/b/c2.txt"), GitSummary::UNCHANGED), - (Path::new("a/d/e1.txt"), GitSummary::UNCHANGED), - (Path::new("a/d/e2.txt"), MODIFIED), - (Path::new("f/no-status.txt"), GitSummary::UNCHANGED), + ("a/b/c1.txt", ADDED), + ("a/b/c2.txt", GitSummary::UNCHANGED), + ("a/d/e1.txt", GitSummary::UNCHANGED), + ("a/d/e2.txt", MODIFIED), + ("f/no-status.txt", GitSummary::UNCHANGED), ], ); } @@ -618,18 +613,18 @@ mod tests { fs.set_status_for_repo( Path::new(path!("/root/x/.git")), - &[(Path::new("x1.txt"), StatusCode::Added.index())], + &[("x1.txt", StatusCode::Added.index())], ); fs.set_status_for_repo( Path::new(path!("/root/y/.git")), &[ - (Path::new("y1.txt"), CONFLICT), - (Path::new("y2.txt"), StatusCode::Modified.index()), + ("y1.txt", CONFLICT), + ("y2.txt", StatusCode::Modified.index()), ], ); fs.set_status_for_repo( Path::new(path!("/root/z/.git")), - &[(Path::new("z2.txt"), StatusCode::Modified.index())], + &[("z2.txt", StatusCode::Modified.index())], ); let project = Project::test(fs, [path!("/root").as_ref()], cx).await; @@ -645,47 +640,44 @@ mod tests { check_git_statuses( &repo_snapshots, &worktree_snapshot, - &[(Path::new("x"), ADDED), (Path::new("x/x1.txt"), ADDED)], + &[("x", ADDED), ("x/x1.txt", ADDED)], ); check_git_statuses( &repo_snapshots, &worktree_snapshot, &[ - (Path::new("y"), GitSummary::CONFLICT + MODIFIED), - (Path::new("y/y1.txt"), GitSummary::CONFLICT), - (Path::new("y/y2.txt"), MODIFIED), + ("y", GitSummary::CONFLICT + MODIFIED), + ("y/y1.txt", GitSummary::CONFLICT), + ("y/y2.txt", MODIFIED), ], ); check_git_statuses( &repo_snapshots, &worktree_snapshot, - &[ - (Path::new("z"), MODIFIED), - (Path::new("z/z2.txt"), MODIFIED), - ], + &[("z", MODIFIED), ("z/z2.txt", MODIFIED)], ); check_git_statuses( &repo_snapshots, &worktree_snapshot, - &[(Path::new("x"), ADDED), (Path::new("x/x1.txt"), ADDED)], + &[("x", ADDED), ("x/x1.txt", ADDED)], ); check_git_statuses( &repo_snapshots, &worktree_snapshot, &[ - (Path::new("x"), ADDED), - (Path::new("x/x1.txt"), ADDED), - (Path::new("x/x2.txt"), GitSummary::UNCHANGED), - (Path::new("y"), GitSummary::CONFLICT + MODIFIED), - (Path::new("y/y1.txt"), GitSummary::CONFLICT), - (Path::new("y/y2.txt"), MODIFIED), - (Path::new("z"), MODIFIED), - (Path::new("z/z1.txt"), GitSummary::UNCHANGED), - (Path::new("z/z2.txt"), MODIFIED), + ("x", ADDED), + ("x/x1.txt", ADDED), + ("x/x2.txt", GitSummary::UNCHANGED), + ("y", GitSummary::CONFLICT + MODIFIED), + ("y/y1.txt", GitSummary::CONFLICT), + ("y/y2.txt", MODIFIED), + ("z", MODIFIED), + ("z/z1.txt", GitSummary::UNCHANGED), + ("z/z2.txt", MODIFIED), ], ); } @@ -719,7 +711,7 @@ mod tests { .await; fs.set_head_and_index_for_repo( path!("/root/.git").as_ref(), - &[("a.txt".into(), "".into()), ("b/c.txt".into(), "".into())], + &[("a.txt", "".into()), ("b/c.txt", "".into())], ); cx.run_until_parked(); @@ -754,10 +746,7 @@ mod tests { // detected. fs.set_head_for_repo( path!("/root/.git").as_ref(), - &[ - ("a.txt".into(), "".into()), - ("b/c.txt".into(), "something-else".into()), - ], + &[("a.txt", "".into()), ("b/c.txt", "something-else".into())], "deadbeef", ); cx.executor().run_until_parked(); @@ -774,9 +763,9 @@ mod tests { &repo_snapshots, &worktree_snapshot, &[ - (Path::new(""), MODIFIED), - (Path::new("a.txt"), GitSummary::UNCHANGED), - (Path::new("b/c.txt"), MODIFIED), + ("", MODIFIED), + ("a.txt", GitSummary::UNCHANGED), + ("b/c.txt", MODIFIED), ], ); } @@ -785,17 +774,17 @@ mod tests { fn check_git_statuses( repo_snapshots: &HashMap, worktree_snapshot: &worktree::Snapshot, - expected_statuses: &[(&Path, GitSummary)], + expected_statuses: &[(&str, GitSummary)], ) { let mut traversal = GitTraversal::new( repo_snapshots, - worktree_snapshot.traverse_from_path(true, true, false, "".as_ref()), + worktree_snapshot.traverse_from_path(true, true, false, RelPath::empty()), ); let found_statuses = expected_statuses .iter() .map(|&(path, _)| { let git_entry = traversal - .find(|git_entry| &*git_entry.path == path) + .find(|git_entry| git_entry.path.as_ref() == rel_path(path)) .unwrap_or_else(|| panic!("Traversal has no entry for {path:?}")); (path, git_entry.git_summary) }) diff --git a/crates/project/src/image_store.rs b/crates/project/src/image_store.rs index e499d4e026f724f12e023738f12afb2735f9ce2d..71394ead2eb27067706023d4870c78c557c3747b 100644 --- a/crates/project/src/image_store.rs +++ b/crates/project/src/image_store.rs @@ -13,10 +13,9 @@ use image::{ExtendedColorType, GenericImageView, ImageReader}; use language::{DiskState, File}; use rpc::{AnyProtoClient, ErrorExt as _}; use std::num::NonZeroU64; -use std::path::Path; +use std::path::PathBuf; use std::sync::Arc; -use std::{ffi::OsStr, path::PathBuf}; -use util::ResultExt; +use util::{ResultExt, rel_path::RelPath}; use worktree::{LoadedBinaryFile, PathChange, Worktree}; #[derive(Clone, Copy, Debug, Hash, PartialEq, PartialOrd, Ord, Eq)] @@ -207,8 +206,7 @@ pub fn is_image_file(project: &Entity, path: &ProjectPath, cx: &App) -> .abs_path(); path.path .extension() - .or_else(|| worktree_abs_path.extension()) - .and_then(OsStr::to_str) + .or_else(|| worktree_abs_path.extension()?.to_str()) .map(str::to_lowercase) }); @@ -255,7 +253,7 @@ impl ProjectItem for ImageItem { trait ImageStoreImpl { fn open_image( &self, - path: Arc, + path: Arc, worktree: Entity, cx: &mut Context, ) -> Task>>; @@ -458,7 +456,7 @@ impl ImageStore { impl ImageStoreImpl for Entity { fn open_image( &self, - path: Arc, + path: Arc, worktree: Entity, cx: &mut Context, ) -> Task>> { @@ -539,7 +537,7 @@ impl LocalImageStore { fn local_worktree_entries_changed( &mut self, worktree_handle: &Entity, - changes: &[(Arc, ProjectEntryId, PathChange)], + changes: &[(Arc, ProjectEntryId, PathChange)], cx: &mut Context, ) { let snapshot = worktree_handle.read(cx).snapshot(); @@ -551,7 +549,7 @@ impl LocalImageStore { fn local_worktree_entry_changed( &mut self, entry_id: ProjectEntryId, - path: &Arc, + path: &Arc, worktree: &Entity, snapshot: &worktree::Snapshot, cx: &mut Context, @@ -698,7 +696,7 @@ fn create_gpui_image(content: Vec) -> anyhow::Result> { impl ImageStoreImpl for Entity { fn open_image( &self, - _path: Arc, + _path: Arc, _worktree: Entity, _cx: &mut Context, ) -> Task>> { @@ -729,7 +727,7 @@ mod tests { use gpui::TestAppContext; use serde_json::json; use settings::SettingsStore; - use std::path::PathBuf; + use util::rel_path::rel_path; pub fn init_test(cx: &mut TestAppContext) { zlog::init_test(); @@ -768,7 +766,7 @@ mod tests { let project_path = ProjectPath { worktree_id, - path: PathBuf::from("image_1.png").into(), + path: rel_path("image_1.png").into(), }; let (task1, task2) = project.update(cx, |project, cx| { diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index a960e1183dd46537ef3aee829cd9753b28001480..5ec6e502bd85a25b6755c6994feff7a3062c919c 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -16,8 +16,8 @@ use collections::{HashMap, HashSet}; use futures::future; use gpui::{App, AsyncApp, Entity, Task}; use language::{ - Anchor, Bias, Buffer, BufferSnapshot, CachedLspAdapter, CharKind, OffsetRangeExt, PointUtf16, - ToOffset, ToPointUtf16, Transaction, Unclipped, + Anchor, Bias, Buffer, BufferSnapshot, CachedLspAdapter, CharKind, CharScopeContext, + OffsetRangeExt, PointUtf16, ToOffset, ToPointUtf16, Transaction, Unclipped, language_settings::{InlayHintKind, LanguageSettings, language_settings}, point_from_lsp, point_to_lsp, proto::{deserialize_anchor, deserialize_version, serialize_anchor, serialize_version}, @@ -350,7 +350,7 @@ impl LspCommand for PrepareRename { } Some(lsp::PrepareRenameResponse::DefaultBehavior { .. }) => { let snapshot = buffer.snapshot(); - let (range, _) = snapshot.surrounding_word(self.position, false); + let (range, _) = snapshot.surrounding_word(self.position, None); let range = snapshot.anchor_after(range.start)..snapshot.anchor_before(range.end); Ok(PrepareRenameResponse::Success(range)) } @@ -2293,7 +2293,10 @@ impl LspCommand for GetCompletions { range_for_token .get_or_insert_with(|| { let offset = self.position.to_offset(&snapshot); - let (range, kind) = snapshot.surrounding_word(offset, true); + let (range, kind) = snapshot.surrounding_word( + offset, + Some(CharScopeContext::Completion), + ); let range = if kind == Some(CharKind::Word) { range } else { diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 2040b10bb39ceff6d9d6d06a5dbfb0f68f41a459..4f21255681ce27aa9bbdfe3a393d1b0666bd4733 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -33,7 +33,6 @@ use crate::{ }, prettier_store::{self, PrettierStore, PrettierStoreEvent}, project_settings::{LspSettings, ProjectSettings}, - relativize_path, resolve_path, toolchain_store::{LocalToolchainStore, ToolchainStoreEvent}, worktree_store::{WorktreeStore, WorktreeStoreEvent}, yarn::YarnPathStore, @@ -88,7 +87,7 @@ use postage::{mpsc, sink::Sink, stream::Stream, watch}; use rand::prelude::*; use rpc::{ AnyProtoClient, - proto::{FromProto, LspRequestId, LspRequestMessage as _, ToProto}, + proto::{LspRequestId, LspRequestMessage as _}, }; use serde::Serialize; use settings::{Settings, SettingsLocation, SettingsStore}; @@ -116,8 +115,9 @@ use text::{Anchor, BufferId, LineEnding, OffsetRangeExt, ToPoint as _}; use util::{ ConnectionResult, ResultExt as _, debug_panic, defer, maybe, merge_json_value_into, - paths::{PathExt, SanitizedPath}, + paths::{PathStyle, SanitizedPath}, post_inc, + rel_path::RelPath, }; pub use fs::*; @@ -158,7 +158,7 @@ impl FormatTrigger { #[derive(Clone)] struct UnifiedLanguageServer { id: LanguageServerId, - project_roots: HashSet>, + project_roots: HashSet>, } #[derive(Clone, Hash, PartialEq, Eq)] @@ -209,7 +209,7 @@ pub struct LocalLspStore { diagnostics: HashMap< WorktreeId, HashMap< - Arc, + Arc, Vec<( LanguageServerId, Vec>>, @@ -406,15 +406,14 @@ impl LocalLspStore { adapter.clone(), ); - let did_change_configuration_params = - Arc::new(lsp::DidChangeConfigurationParams { - settings: workspace_config, - }); + let did_change_configuration_params = lsp::DidChangeConfigurationParams { + settings: workspace_config, + }; let language_server = cx .update(|cx| { language_server.initialize( initialization_params, - did_change_configuration_params.clone(), + Arc::new(did_change_configuration_params.clone()), cx, ) })? @@ -430,11 +429,9 @@ impl LocalLspStore { } })?; - language_server - .notify::( - &did_change_configuration_params, - ) - .ok(); + language_server.notify::( + did_change_configuration_params, + )?; anyhow::Ok(language_server) } @@ -1086,7 +1083,7 @@ impl LocalLspStore { if let Some((file, language)) = File::from_dyn(buffer.file()).zip(buffer.language()) { let worktree_id = file.worktree_id(cx); - let path: Arc = file + let path: Arc = file .path() .parent() .map(Arc::from) @@ -1338,29 +1335,8 @@ impl LocalLspStore { })?; } - // Formatter for `code_actions_on_format` that runs before - // the rest of the formatters - let mut code_actions_on_format_formatter = None; - let should_run_code_actions_on_format = !matches!( - (trigger, &settings.format_on_save), - (FormatTrigger::Save, &FormatOnSave::Off) - ); - if should_run_code_actions_on_format { - let have_code_actions_to_run_on_format = settings - .code_actions_on_format - .values() - .any(|enabled| *enabled); - if have_code_actions_to_run_on_format { - zlog::trace!(logger => "going to run code actions on format"); - code_actions_on_format_formatter = Some(Formatter::CodeActions( - settings.code_actions_on_format.clone(), - )); - } - } - let formatters = match (trigger, &settings.format_on_save) { (FormatTrigger::Save, FormatOnSave::Off) => &[], - (FormatTrigger::Save, FormatOnSave::List(formatters)) => formatters.as_ref(), (FormatTrigger::Manual, _) | (FormatTrigger::Save, FormatOnSave::On) => { match &settings.formatter { SelectedFormatter::Auto => { @@ -1377,8 +1353,6 @@ impl LocalLspStore { } }; - let formatters = code_actions_on_format_formatter.iter().chain(formatters); - for formatter in formatters { match formatter { Formatter::Prettier => { @@ -1512,7 +1486,7 @@ impl LocalLspStore { }, )?; } - Formatter::CodeActions(code_actions) => { + Formatter::CodeAction(code_action_name) => { let logger = zlog::scoped!(logger => "code-actions"); zlog::trace!(logger => "formatting"); let _timer = zlog::time!(logger => "Formatting buffer using code actions"); @@ -1521,17 +1495,9 @@ impl LocalLspStore { zlog::warn!(logger => "Cannot format buffer that is not backed by a file on disk using code actions. Skipping"); continue; }; - let code_action_kinds = code_actions - .iter() - .filter_map(|(action_kind, enabled)| { - enabled.then_some(action_kind.clone().into()) - }) - .collect::>(); - if code_action_kinds.is_empty() { - zlog::trace!(logger => "No code action kinds enabled, skipping"); - continue; - } - zlog::trace!(logger => "Attempting to resolve code actions {:?}", &code_action_kinds); + + let code_action_kind: CodeActionKind = code_action_name.clone().into(); + zlog::trace!(logger => "Attempting to resolve code actions {:?}", &code_action_kind); let mut actions_and_servers = Vec::new(); @@ -1539,23 +1505,25 @@ impl LocalLspStore { let actions_result = Self::get_server_code_actions_from_action_kinds( &lsp_store, language_server.server_id(), - code_action_kinds.clone(), + vec![code_action_kind.clone()], &buffer.handle, cx, ) .await - .with_context( - || format!("Failed to resolve code actions with kinds {:?} for language server {}", - code_action_kinds.iter().map(|kind| kind.as_str()).join(", "), - language_server.name()) - ); + .with_context(|| { + format!( + "Failed to resolve code action {:?} with language server {}", + code_action_kind, + language_server.name() + ) + }); let Ok(actions) = actions_result else { // note: it may be better to set result to the error and break formatters here // but for now we try to execute the actions that we can resolve and skip the rest zlog::error!( logger => - "Failed to resolve code actions with kinds {:?} with language server {}", - code_action_kinds.iter().map(|kind| kind.as_str()).join(", "), + "Failed to resolve code action {:?} with language server {}", + code_action_kind, language_server.name() ); continue; @@ -1600,7 +1568,7 @@ impl LocalLspStore { if let Some(edit) = action.lsp_action.edit().cloned() { // NOTE: code below duplicated from `Self::deserialize_workspace_edit` - // but filters out and logs warnings for code actions that cause unreasonably + // but filters out and logs warnings for code actions that require unreasonably // difficult handling on our part, such as: // - applying edits that call commands // which can result in arbitrary workspace edits being sent from the server that @@ -1740,7 +1708,12 @@ impl LocalLspStore { formatting_transaction_id, cx, |buffer, cx| { + zlog::info!( + "Applying edits {edits:?}. Content: {:?}", + buffer.text() + ); buffer.edit(edits, None, cx); + zlog::info!("Applied edits. New Content: {:?}", buffer.text()); }, )?; } @@ -1842,17 +1815,19 @@ impl LocalLspStore { } if !project_transaction_command.0.is_empty() { - let extra_buffers = project_transaction_command - .0 - .keys() - .filter_map(|buffer_handle| { - buffer_handle - .read_with(cx, |b, cx| b.project_path(cx)) - .ok() - .flatten() - }) - .map(|p| p.path.to_sanitized_string()) - .join(", "); + let mut extra_buffers = String::new(); + for buffer in project_transaction_command.0.keys() { + buffer + .read_with(cx, |b, cx| { + if let Some(path) = b.project_path(cx) { + if !extra_buffers.is_empty() { + extra_buffers.push_str(", "); + } + extra_buffers.push_str(path.path.as_unix_str()); + } + }) + .ok(); + } zlog::warn!( logger => "Unexpected edits to buffers other than the buffer actively being formatted due to command {}. Impacted buffers: [{}].", @@ -2347,7 +2322,7 @@ impl LocalLspStore { let Some(language) = buffer.language().cloned() else { return; }; - let path: Arc = file + let path: Arc = file .path() .parent() .map(Arc::from) @@ -2403,8 +2378,7 @@ impl LocalLspStore { let path = &disposition.path; { - let uri = - Uri::from_file_path(worktree.read(cx).abs_path().join(&path.path)); + let uri = Uri::from_file_path(worktree.read(cx).absolutize(&path.path)); let server_id = self.get_or_insert_language_server( &worktree, @@ -2484,7 +2458,7 @@ impl LocalLspStore { name: None, message: proto::update_language_server::Variant::RegisteredForBuffer( proto::RegisteredForBuffer { - buffer_abs_path: abs_path.to_string_lossy().to_string(), + buffer_abs_path: abs_path.to_string_lossy().into_owned(), buffer_id: buffer_id.to_proto(), }, ), @@ -3172,7 +3146,7 @@ impl LocalLspStore { if let Some((tree, glob)) = worktree.as_local_mut().zip(Glob::new(&pattern).log_err()) { - tree.add_path_prefix_to_scan(literal_prefix.into()); + tree.add_path_prefix_to_scan(literal_prefix); worktree_globs .entry(tree.id()) .or_insert_with(GlobSetBuilder::new) @@ -3187,7 +3161,7 @@ impl LocalLspStore { let pattern = watcher_path .as_path() .strip_prefix(&path) - .map(|p| p.to_string_lossy().to_string()) + .map(|p| p.to_string_lossy().into_owned()) .unwrap_or_else(|e| { debug_panic!( "Failed to strip prefix for string pattern: {}, with prefix: {}, with error: {}", @@ -3195,7 +3169,7 @@ impl LocalLspStore { path.display(), e ); - watcher_path.as_path().to_string_lossy().to_string() + watcher_path.as_path().to_string_lossy().into_owned() }); (path, pattern) } @@ -3211,7 +3185,7 @@ impl LocalLspStore { let path = glob_literal_prefix(Path::new(&rp.pattern)); let pattern = Path::new(&rp.pattern) .strip_prefix(&path) - .map(|p| p.to_string_lossy().to_string()) + .map(|p| p.to_string_lossy().into_owned()) .unwrap_or_else(|e| { debug_panic!( "Failed to strip prefix for relative pattern: {}, with prefix: {}, with error: {}", @@ -3268,10 +3242,11 @@ impl LocalLspStore { worktrees: &[Entity], watcher: &FileSystemWatcher, cx: &App, - ) -> Option<(Entity, PathBuf, String)> { + ) -> Option<(Entity, Arc, String)> { worktrees.iter().find_map(|worktree| { let tree = worktree.read(cx); let worktree_root_path = tree.abs_path(); + let path_style = tree.path_style(); match &watcher.glob_pattern { lsp::GlobPattern::String(s) => { let watcher_path = SanitizedPath::new(s); @@ -3282,8 +3257,8 @@ impl LocalLspStore { let literal_prefix = glob_literal_prefix(relative); Some(( worktree.clone(), - literal_prefix, - relative.to_string_lossy().to_string(), + RelPath::new(&literal_prefix, path_style).ok()?.into_arc(), + relative.to_string_lossy().into_owned(), )) } lsp::GlobPattern::Relative(rp) => { @@ -3296,7 +3271,11 @@ impl LocalLspStore { let relative = base_uri.strip_prefix(&worktree_root_path).ok()?; let mut literal_prefix = relative.to_owned(); literal_prefix.push(glob_literal_prefix(Path::new(&rp.pattern))); - Some((worktree.clone(), literal_prefix, rp.pattern.clone())) + Some(( + worktree.clone(), + RelPath::new(&literal_prefix, path_style).ok()?.into_arc(), + rp.pattern.clone(), + )) } } }) @@ -3483,7 +3462,7 @@ pub struct LspStore { _maintain_workspace_config: (Task>, watch::Sender<()>), _maintain_buffer_languages: Task<()>, diagnostic_summaries: - HashMap, HashMap>>, + HashMap, HashMap>>, pub lsp_server_capabilities: HashMap, lsp_document_colors: HashMap, lsp_code_lens: HashMap, @@ -3569,11 +3548,28 @@ struct CoreSymbol { pub language_server_name: LanguageServerName, pub source_worktree_id: WorktreeId, pub source_language_server_id: LanguageServerId, - pub path: ProjectPath, + pub path: SymbolLocation, pub name: String, pub kind: lsp::SymbolKind, pub range: Range>, - pub signature: [u8; 32], +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum SymbolLocation { + InProject(ProjectPath), + OutsideProject { + abs_path: Arc, + signature: [u8; 32], + }, +} + +impl SymbolLocation { + fn file_name(&self) -> Option<&str> { + match self { + Self::InProject(path) => path.path.file_name(), + Self::OutsideProject { abs_path, .. } => abs_path.file_name()?.to_str(), + } + } } impl LspStore { @@ -3684,15 +3680,6 @@ impl LspStore { .detach(); cx.subscribe(&toolchain_store, Self::on_toolchain_store_event) .detach(); - if let Some(extension_events) = extension::ExtensionEvents::try_global(cx).as_ref() { - cx.subscribe( - extension_events, - Self::reload_zed_json_schemas_on_extensions_changed, - ) - .detach(); - } else { - log::debug!("No extension events global found. Skipping JSON schema auto-reload setup"); - } cx.observe_global::(Self::on_settings_changed) .detach(); subscribe_to_binary_statuses(&languages, cx).detach(); @@ -3968,100 +3955,6 @@ impl LspStore { Ok(()) } - pub fn reload_zed_json_schemas_on_extensions_changed( - &mut self, - _: Entity, - evt: &extension::Event, - cx: &mut Context, - ) { - match evt { - extension::Event::ExtensionInstalled(_) - | extension::Event::ExtensionUninstalled(_) - | extension::Event::ConfigureExtensionRequested(_) => return, - extension::Event::ExtensionsInstalledChanged => {} - } - if self.as_local().is_none() { - return; - } - cx.spawn(async move |this, cx| { - let weak_ref = this.clone(); - - let servers = this - .update(cx, |this, cx| { - let local = this.as_local()?; - - let mut servers = Vec::new(); - for (seed, state) in &local.language_server_ids { - - let Some(states) = local.language_servers.get(&state.id) else { - continue; - }; - let (json_adapter, json_server) = match states { - LanguageServerState::Running { - adapter, server, .. - } if adapter.adapter.is_primary_zed_json_schema_adapter() => { - (adapter.adapter.clone(), server.clone()) - } - _ => continue, - }; - - let Some(worktree) = this - .worktree_store - .read(cx) - .worktree_for_id(seed.worktree_id, cx) - else { - continue; - }; - let json_delegate: Arc = - LocalLspAdapterDelegate::new( - local.languages.clone(), - &local.environment, - weak_ref.clone(), - &worktree, - local.http_client.clone(), - local.fs.clone(), - cx, - ); - - servers.push((json_adapter, json_server, json_delegate)); - - } - Some(servers) - }) - .ok() - .flatten(); - - let Some(servers) = servers else { - return; - }; - - for (adapter, server, delegate) in servers { - adapter.clear_zed_json_schema_cache().await; - - let Some(json_workspace_config) = LocalLspStore::workspace_configuration_for_adapter( - adapter, - &delegate, - None, - cx, - ) - .await - .context("generate new workspace configuration for JSON language server while trying to refresh JSON Schemas") - .ok() - else { - continue; - }; - server - .notify::( - &lsp::DidChangeConfigurationParams { - settings: json_workspace_config, - }, - ) - .ok(); - } - }) - .detach(); - } - pub(crate) fn register_buffer_with_language_servers( &mut self, buffer: &Entity, @@ -4353,7 +4246,7 @@ impl LspStore { let mut summaries = diangostic_summaries.iter().flat_map(|(path, summaries)| { summaries .iter() - .map(|(server_id, summary)| summary.to_proto(*server_id, path)) + .map(|(server_id, summary)| summary.to_proto(*server_id, path.as_ref())) }); if let Some(summary) = summaries.next() { client @@ -4655,7 +4548,6 @@ impl LspStore { .unwrap_or_else(|| file.path().clone()); let worktree_path = ProjectPath { worktree_id, path }; let abs_path = file.abs_path(cx); - let worktree_root = worktree.read(cx).abs_path(); let nodes = rebase .walk( worktree_path, @@ -4668,7 +4560,7 @@ impl LspStore { for node in nodes { let server_id = node.server_id_or_init(|disposition| { let path = &disposition.path; - let uri = Uri::from_file_path(worktree_root.join(&path.path)); + let uri = Uri::from_file_path(worktree.read(cx).absolutize(&path.path)); let key = LanguageServerSeed { worktree_id, name: disposition.server_name.clone(), @@ -4703,7 +4595,9 @@ impl LspStore { message: proto::update_language_server::Variant::RegisteredForBuffer( proto::RegisteredForBuffer { - buffer_abs_path: abs_path.to_string_lossy().to_string(), + buffer_abs_path: abs_path + .to_string_lossy() + .into_owned(), buffer_id: buffer_id.to_proto(), }, ), @@ -5816,7 +5710,8 @@ impl LspStore { buffer.read(cx).file(), cx, ) - .completions; + .completions + .clone(); if !completion_settings.lsp { return Task::ready(Ok(Vec::new())); } @@ -6964,7 +6859,6 @@ impl LspStore { server_id: LanguageServerId, lsp_adapter: Arc, worktree: WeakEntity, - worktree_abs_path: Arc, lsp_symbols: Vec<(String, SymbolKind, lsp::Location)>, } @@ -7003,7 +6897,6 @@ impl LspStore { if !supports_workspace_symbol_request { continue; } - let worktree_abs_path = worktree.abs_path().clone(); let worktree_handle = worktree_handle.clone(); let server_id = server.server_id(); requests.push( @@ -7043,7 +6936,6 @@ impl LspStore { server_id, lsp_adapter, worktree: worktree_handle.downgrade(), - worktree_abs_path, lsp_symbols, } }), @@ -7068,33 +6960,29 @@ impl LspStore { let source_worktree = result.worktree.upgrade()?; let source_worktree_id = source_worktree.read(cx).id(); - let path; - let worktree; - if let Some((tree, rel_path)) = + let path = if let Some((tree, rel_path)) = this.worktree_store.read(cx).find_worktree(&abs_path, cx) { - worktree = tree; - path = rel_path; + let worktree_id = tree.read(cx).id(); + SymbolLocation::InProject(ProjectPath { + worktree_id, + path: rel_path, + }) } else { - worktree = source_worktree; - path = relativize_path(&result.worktree_abs_path, &abs_path); - } - - let worktree_id = worktree.read(cx).id(); - let project_path = ProjectPath { - worktree_id, - path: path.into(), + SymbolLocation::OutsideProject { + signature: this.symbol_signature(&abs_path), + abs_path: abs_path.into(), + } }; - let signature = this.symbol_signature(&project_path); + Some(CoreSymbol { source_language_server_id: result.server_id, language_server_name: result.lsp_adapter.name.clone(), source_worktree_id, - path: project_path, + path, kind: symbol_kind, name: symbol_name, range: range_from_lsp(symbol_location.range), - signature, }) }) .collect() @@ -7284,7 +7172,7 @@ impl LspStore { language_server .notify::( - &lsp::DidChangeTextDocumentParams { + lsp::DidChangeTextDocumentParams { text_document: lsp::VersionedTextDocumentIdentifier::new( uri.clone(), next_version, @@ -7321,7 +7209,7 @@ impl LspStore { }; server .notify::( - &lsp::DidSaveTextDocumentParams { + lsp::DidSaveTextDocumentParams { text_document: text_document.clone(), text, }, @@ -7392,7 +7280,7 @@ impl LspStore { .ok()?; server .notify::( - &lsp::DidChangeConfigurationParams { settings }, + lsp::DidChangeConfigurationParams { settings }, ) .ok()?; Some(()) @@ -7637,7 +7525,7 @@ impl LspStore { let worktree_id = worktree.read(cx).id(); let project_path = ProjectPath { worktree_id, - path: relative_path.into(), + path: relative_path, }; if let Some(buffer_handle) = self.buffer_store.read(cx).get_by_path(&project_path) { @@ -7734,7 +7622,7 @@ impl LspStore { &mut self, worktree_id: WorktreeId, server_id: LanguageServerId, - path_in_worktree: Arc, + path_in_worktree: Arc, diagnostics: Vec>>, _: &mut Context, ) -> Result>> { @@ -7826,18 +7714,21 @@ impl LspStore { ))); }; - let worktree_abs_path = if let Some(worktree_abs_path) = self - .worktree_store - .read(cx) - .worktree_for_id(symbol.path.worktree_id, cx) - .map(|worktree| worktree.read(cx).abs_path()) - { - worktree_abs_path - } else { - return Task::ready(Err(anyhow!("worktree not found for symbol"))); + let symbol_abs_path = match &symbol.path { + SymbolLocation::InProject(project_path) => self + .worktree_store + .read(cx) + .absolutize(&project_path, cx) + .context("no such worktree"), + SymbolLocation::OutsideProject { + abs_path, + signature: _, + } => Ok(abs_path.to_path_buf()), + }; + let symbol_abs_path = match symbol_abs_path { + Ok(abs_path) => abs_path, + Err(err) => return Task::ready(Err(err)), }; - - let symbol_abs_path = resolve_path(&worktree_abs_path, &symbol.path.path); let symbol_uri = if let Ok(uri) = lsp::Uri::from_file_path(symbol_abs_path) { uri } else { @@ -7890,8 +7781,7 @@ impl LspStore { worktree_store.find_worktree(&worktree_root_target, cx) }) })? { - let relative_path = - known_relative_path.unwrap_or_else(|| Arc::::from(result.1)); + let relative_path = known_relative_path.unwrap_or_else(|| result.1.clone()); (result.0, relative_path) } else { let worktree = lsp_store @@ -7918,7 +7808,8 @@ impl LspStore { let relative_path = if let Some(known_path) = known_relative_path { known_path } else { - abs_path.strip_prefix(worktree_root)?.into() + RelPath::new(abs_path.strip_prefix(worktree_root)?, PathStyle::local())? + .into_arc() }; (worktree, relative_path) }; @@ -8325,39 +8216,56 @@ impl LspStore { mut cx: AsyncApp, ) -> Result { let entry_id = ProjectEntryId::from_proto(envelope.payload.entry_id); - let (worktree_id, worktree, old_path, is_dir) = this + let new_worktree_id = WorktreeId::from_proto(envelope.payload.new_worktree_id); + let new_path = + RelPath::from_proto(&envelope.payload.new_path).context("invalid relative path")?; + + let (worktree_store, old_worktree, new_worktree, old_entry) = this .update(&mut cx, |this, cx| { - this.worktree_store + let (worktree, entry) = this + .worktree_store .read(cx) - .worktree_and_entry_for_id(entry_id, cx) - .map(|(worktree, entry)| { - ( - worktree.read(cx).id(), - worktree, - entry.path.clone(), - entry.is_dir(), - ) - }) + .worktree_and_entry_for_id(entry_id, cx)?; + let new_worktree = this + .worktree_store + .read(cx) + .worktree_for_id(new_worktree_id, cx)?; + Some(( + this.worktree_store.clone(), + worktree, + new_worktree, + entry.clone(), + )) })? .context("worktree not found")?; - let (old_abs_path, new_abs_path) = { - let root_path = worktree.read_with(&cx, |this, _| this.abs_path())?; - let new_path = PathBuf::from_proto(envelope.payload.new_path.clone()); - (root_path.join(&old_path), root_path.join(&new_path)) - }; + let (old_abs_path, old_worktree_id) = old_worktree.read_with(&cx, |worktree, _| { + (worktree.absolutize(&old_entry.path), worktree.id()) + })?; + let new_abs_path = + new_worktree.read_with(&cx, |worktree, _| worktree.absolutize(&new_path))?; let _transaction = Self::will_rename_entry( this.downgrade(), - worktree_id, + old_worktree_id, &old_abs_path, &new_abs_path, - is_dir, + old_entry.is_dir(), + cx.clone(), + ) + .await; + let response = WorktreeStore::handle_rename_project_entry( + worktree_store, + envelope.payload, cx.clone(), ) .await; - let response = Worktree::handle_rename_entry(worktree, envelope.payload, cx.clone()).await; this.read_with(&cx, |this, _| { - this.did_rename_entry(worktree_id, &old_abs_path, &new_abs_path, is_dir); + this.did_rename_entry( + old_worktree_id, + &old_abs_path, + &new_abs_path, + old_entry.is_dir(), + ); }) .ok(); response @@ -8380,7 +8288,7 @@ impl LspStore { { let project_path = ProjectPath { worktree_id, - path: Arc::::from_proto(message_summary.path), + path: RelPath::from_proto(&message_summary.path).context("invalid path")?, }; let path = project_path.path.clone(); let server_id = LanguageServerId(message_summary.language_server_id as usize); @@ -8594,15 +8502,16 @@ impl LspStore { cx: AsyncApp, ) -> Result { let server_id = LanguageServerId(envelope.payload.language_server_id as usize); - lsp_store.read_with(&cx, |lsp_store, _| { + let task = lsp_store.read_with(&cx, |lsp_store, _| { if let Some(server) = lsp_store.language_server_for_id(server_id) { - server - .notify::(&()) - .context("handling lsp ext cancel flycheck") + Some(server.notify::(())) } else { - anyhow::Ok(()) + None } - })??; + })?; + if let Some(task) = task { + task.context("handling lsp ext cancel flycheck")?; + } Ok(proto::Ack {}) } @@ -8636,14 +8545,11 @@ impl LspStore { } else { None }; - server - .notify::( - &lsp_store::lsp_ext_command::RunFlycheckParams { text_document }, - ) - .context("handling lsp ext run flycheck") - } else { - anyhow::Ok(()) + server.notify::( + lsp_store::lsp_ext_command::RunFlycheckParams { text_document }, + )?; } + anyhow::Ok(()) })??; Ok(proto::Ack {}) @@ -8655,15 +8561,15 @@ impl LspStore { cx: AsyncApp, ) -> Result { let server_id = LanguageServerId(envelope.payload.language_server_id as usize); - lsp_store.read_with(&cx, |lsp_store, _| { - if let Some(server) = lsp_store.language_server_for_id(server_id) { - server - .notify::(&()) - .context("handling lsp ext clear flycheck") - } else { - anyhow::Ok(()) - } - })??; + lsp_store + .read_with(&cx, |lsp_store, _| { + if let Some(server) = lsp_store.language_server_for_id(server_id) { + Some(server.notify::(())) + } else { + None + } + }) + .context("handling lsp ext clear flycheck")?; Ok(proto::Ack {}) } @@ -8802,7 +8708,7 @@ impl LspStore { if filter.should_send_did_rename(&old_uri, is_dir) { language_server - .notify::(&RenameFilesParams { + .notify::(RenameFilesParams { files: vec![FileRename { old_uri: old_uri.clone(), new_uri: new_uri.clone(), @@ -8916,7 +8822,7 @@ impl LspStore { if !changes.is_empty() { server .notify::( - &lsp::DidChangeWatchedFilesParams { changes }, + lsp::DidChangeWatchedFilesParams { changes }, ) .ok(); } @@ -9435,10 +9341,16 @@ impl LspStore { let peer_id = envelope.original_sender_id().unwrap_or_default(); let symbol = envelope.payload.symbol.context("invalid symbol")?; let symbol = Self::deserialize_symbol(symbol)?; - let symbol = this.read_with(&cx, |this, _| { - let signature = this.symbol_signature(&symbol.path); - anyhow::ensure!(signature == symbol.signature, "invalid symbol signature"); - Ok(symbol) + this.read_with(&cx, |this, _| { + if let SymbolLocation::OutsideProject { + abs_path, + signature, + } = &symbol.path + { + let new_signature = this.symbol_signature(&abs_path); + anyhow::ensure!(&new_signature == signature, "invalid symbol signature"); + } + Ok(()) })??; let buffer = this .update(&mut cx, |this, cx| { @@ -9451,7 +9363,6 @@ impl LspStore { name: symbol.name, kind: symbol.kind, range: symbol.range, - signature: symbol.signature, label: CodeLabel { text: Default::default(), runs: Default::default(), @@ -9483,10 +9394,9 @@ impl LspStore { })? } - fn symbol_signature(&self, project_path: &ProjectPath) -> [u8; 32] { + fn symbol_signature(&self, abs_path: &Path) -> [u8; 32] { let mut hasher = Sha256::new(); - hasher.update(project_path.worktree_id.to_proto().to_be_bytes()); - hasher.update(project_path.path.to_string_lossy().as_bytes()); + hasher.update(abs_path.to_string_lossy().as_bytes()); hasher.update(self.nonce.to_be_bytes()); hasher.finalize().as_slice().try_into().unwrap() } @@ -10232,7 +10142,7 @@ impl LspStore { let project_path = ProjectPath { worktree_id: worktree.read(cx).id(), - path: relative_path.into(), + path: relative_path, }; Some( @@ -10540,7 +10450,10 @@ impl LspStore { for (worktree_id, servers) in &local.lsp_tree.instances { if *worktree_id != key.worktree_id { for server_map in servers.roots.values() { - if server_map.contains_key(&key.name) { + if server_map + .values() + .any(|(node, _)| node.id() == Some(server_id)) + { worktrees_using_server.push(*worktree_id); } } @@ -10550,6 +10463,7 @@ impl LspStore { let mut buffer_paths_registered = Vec::new(); self.buffer_store.clone().update(cx, |buffer_store, cx| { + let mut lsp_adapters = HashMap::default(); for buffer_handle in buffer_store.buffers() { let buffer = buffer_handle.read(cx); let file = match File::from_dyn(buffer.file()) { @@ -10562,9 +10476,9 @@ impl LspStore { }; if !worktrees_using_server.contains(&file.worktree.read(cx).id()) - || !self - .languages - .lsp_adapters(&language.name()) + || !lsp_adapters + .entry(language.name()) + .or_insert_with(|| self.languages.lsp_adapters(&language.name())) .iter() .any(|a| a.name == key.name) { @@ -10641,7 +10555,7 @@ impl LspStore { name: Some(adapter.name()), message: proto::update_language_server::Variant::RegisteredForBuffer( proto::RegisteredForBuffer { - buffer_abs_path: abs_path.to_string_lossy().to_string(), + buffer_abs_path: abs_path.to_string_lossy().into_owned(), buffer_id: buffer_id.to_proto(), }, ), @@ -10718,7 +10632,7 @@ impl LspStore { if progress.is_cancellable { server .notify::( - &WorkDoneProgressCancelParams { + WorkDoneProgressCancelParams { token: lsp::NumberOrString::String(token.clone()), }, ) @@ -10794,7 +10708,7 @@ impl LspStore { pub(super) fn update_local_worktree_language_servers( &mut self, worktree_handle: &Entity, - changes: &[(Arc, ProjectEntryId, PathChange)], + changes: &[(Arc, ProjectEntryId, PathChange)], cx: &mut Context, ) { if changes.is_empty() { @@ -10816,7 +10730,7 @@ impl LspStore { language_server_ids.sort(); language_server_ids.dedup(); - let abs_path = worktree_handle.read(cx).abs_path(); + // let abs_path = worktree_handle.read(cx).abs_path(); for server_id in &language_server_ids { if let Some(LanguageServerState::Running { server, .. }) = local.language_servers.get(server_id) @@ -10829,7 +10743,7 @@ impl LspStore { changes: changes .iter() .filter_map(|(path, _, change)| { - if !watched_paths.is_match(path) { + if !watched_paths.is_match(path.as_std_path()) { return None; } let typ = match change { @@ -10839,22 +10753,23 @@ impl LspStore { PathChange::Updated => lsp::FileChangeType::CHANGED, PathChange::AddedOrUpdated => lsp::FileChangeType::CHANGED, }; - Some(lsp::FileEvent { - uri: lsp::Uri::from_file_path(abs_path.join(path)).unwrap(), - typ, - }) + let uri = lsp::Uri::from_file_path( + worktree_handle.read(cx).absolutize(&path), + ) + .ok()?; + Some(lsp::FileEvent { uri, typ }) }) .collect(), }; if !params.changes.is_empty() { server - .notify::(¶ms) + .notify::(params) .ok(); } } } for (path, _, _) in changes { - if let Some(file_name) = path.file_name().and_then(|file_name| file_name.to_str()) + if let Some(file_name) = path.file_name() && local.watched_manifest_filenames.contains(file_name) { self.request_workspace_config_refresh(); @@ -10874,12 +10789,10 @@ impl LspStore { } fn serialize_symbol(symbol: &Symbol) -> proto::Symbol { - proto::Symbol { + let mut result = proto::Symbol { language_server_name: symbol.language_server_name.0.to_string(), source_worktree_id: symbol.source_worktree_id.to_proto(), language_server_id: symbol.source_language_server_id.to_proto(), - worktree_id: symbol.path.worktree_id.to_proto(), - path: symbol.path.path.as_ref().to_proto(), name: symbol.name.clone(), kind: unsafe { mem::transmute::(symbol.kind) }, start: Some(proto::PointUtf16 { @@ -10890,17 +10803,45 @@ impl LspStore { row: symbol.range.end.0.row, column: symbol.range.end.0.column, }), - signature: symbol.signature.to_vec(), + worktree_id: Default::default(), + path: Default::default(), + signature: Default::default(), + }; + match &symbol.path { + SymbolLocation::InProject(path) => { + result.worktree_id = path.worktree_id.to_proto(); + result.path = path.path.to_proto(); + } + SymbolLocation::OutsideProject { + abs_path, + signature, + } => { + result.path = abs_path.to_string_lossy().into_owned(); + result.signature = signature.to_vec(); + } } + result } fn deserialize_symbol(serialized_symbol: proto::Symbol) -> Result { let source_worktree_id = WorktreeId::from_proto(serialized_symbol.source_worktree_id); let worktree_id = WorktreeId::from_proto(serialized_symbol.worktree_id); let kind = unsafe { mem::transmute::(serialized_symbol.kind) }; - let path = ProjectPath { - worktree_id, - path: Arc::::from_proto(serialized_symbol.path), + + let path = if serialized_symbol.signature.is_empty() { + SymbolLocation::InProject(ProjectPath { + worktree_id, + path: RelPath::from_proto(&serialized_symbol.path) + .context("invalid symbol path")?, + }) + } else { + SymbolLocation::OutsideProject { + abs_path: Path::new(&serialized_symbol.path).into(), + signature: serialized_symbol + .signature + .try_into() + .map_err(|_| anyhow!("invalid signature"))?, + } }; let start = serialized_symbol.start.context("invalid start")?; @@ -10916,10 +10857,6 @@ impl LspStore { range: Unclipped(PointUtf16::new(start.row, start.column)) ..Unclipped(PointUtf16::new(end.row, end.column)), kind, - signature: serialized_symbol - .signature - .try_into() - .map_err(|_| anyhow!("invalid signature"))?, }) } @@ -12479,7 +12416,7 @@ impl DiagnosticSummary { pub fn to_proto( self, language_server_id: LanguageServerId, - path: &Path, + path: &RelPath, ) -> proto::DiagnosticSummary { proto::DiagnosticSummary { path: path.to_proto(), @@ -12652,7 +12589,7 @@ pub fn language_server_settings<'a>( language_server_settings_for( SettingsLocation { worktree_id: delegate.worktree_id(), - path: delegate.worktree_root_path(), + path: RelPath::empty(), }, language, cx, @@ -12784,7 +12721,10 @@ impl LspAdapterDelegate for LocalLspAdapterDelegate { #[cfg(not(target_os = "windows"))] async fn which(&self, command: &OsStr) -> Option { - let worktree_abs_path = self.worktree.abs_path(); + let mut worktree_abs_path = self.worktree_root_path().to_path_buf(); + if self.fs.is_file(&worktree_abs_path).await { + worktree_abs_path.pop(); + } let shell_path = self.shell_env().await.get("PATH").cloned(); which::which_in(command, shell_path.as_ref(), worktree_abs_path).ok() } @@ -12798,7 +12738,10 @@ impl LspAdapterDelegate for LocalLspAdapterDelegate { } async fn try_exec(&self, command: LanguageServerBinary) -> Result<()> { - let working_dir = self.worktree_root_path(); + let mut working_dir = self.worktree_root_path().to_path_buf(); + if self.fs.is_file(&working_dir).await { + working_dir.pop(); + } let output = util::command::new_smol_command(&command.path) .args(command.arguments) .envs(command.env.clone().unwrap_or_default()) @@ -12842,16 +12785,12 @@ impl LspAdapterDelegate for LocalLspAdapterDelegate { Some(dir) } - async fn read_text_file(&self, path: PathBuf) -> Result { + async fn read_text_file(&self, path: &RelPath) -> Result { let entry = self .worktree - .entry_for_path(&path) + .entry_for_path(path) .with_context(|| format!("no worktree entry for path {path:?}"))?; - let abs_path = self - .worktree - .absolutize(&entry.path) - .with_context(|| format!("cannot absolutize path {path:?}"))?; - + let abs_path = self.worktree.absolutize(&entry.path); self.fs.load(&abs_path).await } } @@ -12865,14 +12804,17 @@ async fn populate_labels_for_symbols( #[allow(clippy::mutable_key_type)] let mut symbols_by_language = HashMap::>, Vec>::default(); - let mut unknown_paths = BTreeSet::new(); + let mut unknown_paths = BTreeSet::>::new(); for symbol in symbols { + let Some(file_name) = symbol.path.file_name() else { + continue; + }; let language = language_registry - .language_for_file_path(&symbol.path.path) + .load_language_for_file_path(Path::new(file_name)) .await .ok() .or_else(|| { - unknown_paths.insert(symbol.path.path.clone()); + unknown_paths.insert(file_name.into()); None }); symbols_by_language @@ -12882,10 +12824,7 @@ async fn populate_labels_for_symbols( } for unknown_path in unknown_paths { - log::info!( - "no language found for symbol path {}", - unknown_path.display() - ); + log::info!("no language found for symbol in file {unknown_path:?}"); } let mut label_params = Vec::new(); @@ -12928,7 +12867,6 @@ async fn populate_labels_for_symbols( name, kind: symbol.kind, range: symbol.range, - signature: symbol.signature, }); } } diff --git a/crates/project/src/lsp_store/json_language_server_ext.rs b/crates/project/src/lsp_store/json_language_server_ext.rs index 3eb93386a99bf40dffc5f6de75d56248936b38e3..78df7132734e9bf71bac8df176f92e15eec21361 100644 --- a/crates/project/src/lsp_store/json_language_server_ext.rs +++ b/crates/project/src/lsp_store/json_language_server_ext.rs @@ -1,9 +1,11 @@ -use anyhow::Context as _; -use collections::HashMap; -use gpui::WeakEntity; +use anyhow::{Context, Result}; +use gpui::{App, AsyncApp, Entity, Global, WeakEntity}; use lsp::LanguageServer; use crate::LspStore; + +const LOGGER: zlog::Logger = zlog::scoped!("json-schema"); + /// https://github.com/Microsoft/vscode/blob/main/extensions/json-language-features/server/README.md#schema-content-request /// /// Represents a "JSON language server-specific, non-standardized, extension to the LSP" with which the vscode-json-language-server @@ -20,82 +22,77 @@ impl lsp::request::Request for SchemaContentRequest { const METHOD: &'static str = "vscode/content"; } -pub fn register_requests(_lsp_store: WeakEntity, language_server: &LanguageServer) { - language_server - .on_request::(|params, cx| { - // PERF: Use a cache (`OnceLock`?) to avoid recomputing the action schemas - let mut generator = settings::KeymapFile::action_schema_generator(); - let all_schemas = cx.update(|cx| HashMap::from_iter(cx.action_schemas(&mut generator))); - async move { - let all_schemas = all_schemas?; - let Some(uri) = params.get(0) else { - anyhow::bail!("No URI"); - }; - let normalized_action_name = uri - .strip_prefix("zed://schemas/action/") - .context("Invalid URI")?; - let action_name = denormalize_action_name(normalized_action_name); - let schema = root_schema_from_action_schema( - all_schemas - .get(action_name.as_str()) - .and_then(Option::as_ref), - &mut generator, - ) - .to_value(); +type SchemaRequestHandler = fn(Entity, String, &mut AsyncApp) -> Result; +pub struct SchemaHandlingImpl(SchemaRequestHandler); - serde_json::to_string(&schema).context("Failed to serialize schema") - } - }) - .detach(); -} +impl Global for SchemaHandlingImpl {} -pub fn normalize_action_name(action_name: &str) -> String { - action_name.replace("::", "__") +pub fn register_schema_handler(handler: SchemaRequestHandler, cx: &mut App) { + debug_assert!( + !cx.has_global::(), + "SchemaHandlingImpl already registered" + ); + cx.set_global(SchemaHandlingImpl(handler)); } -pub fn denormalize_action_name(action_name: &str) -> String { - action_name.replace("__", "::") -} +struct SchemaContentsChanged {} -pub fn normalized_action_file_name(action_name: &str) -> String { - normalized_action_name_to_file_name(normalize_action_name(action_name)) +impl lsp::notification::Notification for SchemaContentsChanged { + const METHOD: &'static str = "json/schemaContent"; + type Params = String; } -pub fn normalized_action_name_to_file_name(mut normalized_action_name: String) -> String { - normalized_action_name.push_str(".json"); - normalized_action_name -} +pub fn notify_schema_changed(lsp_store: Entity, uri: String, cx: &App) { + zlog::trace!(LOGGER => "Notifying schema changed for URI: {:?}", uri); + let servers = lsp_store.read_with(cx, |lsp_store, _| { + let mut servers = Vec::new(); + let Some(local) = lsp_store.as_local() else { + return servers; + }; -pub fn url_schema_for_action(action_name: &str) -> serde_json::Value { - let normalized_name = normalize_action_name(action_name); - let file_name = normalized_action_name_to_file_name(normalized_name.clone()); - serde_json::json!({ - "fileMatch": [file_name], - "url": format!("zed://schemas/action/{}", normalized_name) - }) -} + for states in local.language_servers.values() { + let json_server = match states { + super::LanguageServerState::Running { + adapter, server, .. + } if adapter.adapter.is_primary_zed_json_schema_adapter() => server.clone(), + _ => continue, + }; -fn root_schema_from_action_schema( - action_schema: Option<&schemars::Schema>, - generator: &mut schemars::SchemaGenerator, -) -> schemars::Schema { - let Some(action_schema) = action_schema else { - return schemars::json_schema!(false); - }; - let meta_schema = generator - .settings() - .meta_schema - .as_ref() - .expect("meta_schema should be present in schemars settings") - .to_string(); - let defs = generator.definitions(); - let mut schema = schemars::json_schema!({ - "$schema": meta_schema, - "allowTrailingCommas": true, - "$defs": defs, + servers.push(json_server); + } + servers }); - schema - .ensure_object() - .extend(std::mem::take(action_schema.clone().ensure_object())); - schema + for server in servers { + zlog::trace!(LOGGER => "Notifying server {:?} of schema change for URI: {:?}", server.server_id(), &uri); + // TODO: handle errors + server.notify::(uri.clone()).ok(); + } +} + +pub fn register_requests(lsp_store: WeakEntity, language_server: &LanguageServer) { + language_server + .on_request::(move |params, cx| { + let handler = cx.try_read_global::(|handler, _| { + handler.0 + }); + let mut cx = cx.clone(); + let uri = params.clone().pop(); + let lsp_store = lsp_store.clone(); + let resolution = async move { + let lsp_store = lsp_store.upgrade().context("LSP store has been dropped")?; + let uri = uri.context("No URI")?; + let handle_schema_request = handler.context("No schema handler registered")?; + handle_schema_request(lsp_store, uri, &mut cx) + }; + async move { + zlog::trace!(LOGGER => "Handling schema request for {:?}", ¶ms); + let result = resolution.await; + match &result { + Ok(content) => {zlog::trace!(LOGGER => "Schema request resolved with {}B schema", content.len());}, + Err(err) => {zlog::warn!(LOGGER => "Schema request failed: {}", err);}, + } + result + } + }) + .detach(); } diff --git a/crates/project/src/lsp_store/lsp_ext_command.rs b/crates/project/src/lsp_store/lsp_ext_command.rs index 0263946b25ed58969a3a7a98a9f537ce81d86ab1..c79e3df178290fa614e08a8abd85a527a696b003 100644 --- a/crates/project/src/lsp_store/lsp_ext_command.rs +++ b/crates/project/src/lsp_store/lsp_ext_command.rs @@ -691,7 +691,7 @@ impl LspCommand for GetLspRunnables { task_template.command = shell.program; task_template.args = shell.args; task_template.env = shell.environment; - task_template.cwd = Some(shell.cwd.to_string_lossy().to_string()); + task_template.cwd = Some(shell.cwd.to_string_lossy().into_owned()); } } diff --git a/crates/project/src/lsp_store/rust_analyzer_ext.rs b/crates/project/src/lsp_store/rust_analyzer_ext.rs index 54f63220b1ef8bab1db22a0808fd2ccb9277b73c..4d5f134e5f1682d53df3a0ab3f55a4b3676518f8 100644 --- a/crates/project/src/lsp_store/rust_analyzer_ext.rs +++ b/crates/project/src/lsp_store/rust_analyzer_ext.rs @@ -119,11 +119,12 @@ pub fn cancel_flycheck( lsp_store .read_with(cx, |lsp_store, _| { if let Some(server) = lsp_store.language_server_for_id(rust_analyzer_server) { - server.notify::(&())?; + server.notify::(()) + } else { + Ok(()) } - anyhow::Ok(()) - })? - .context("lsp ext cancel flycheck")?; + }) + .context("lsp ext cancel flycheck")??; }; anyhow::Ok(()) }) @@ -173,14 +174,15 @@ pub fn run_flycheck( .read_with(cx, |lsp_store, _| { if let Some(server) = lsp_store.language_server_for_id(rust_analyzer_server) { server.notify::( - &lsp_store::lsp_ext_command::RunFlycheckParams { + lsp_store::lsp_ext_command::RunFlycheckParams { text_document: None, }, - )?; + ) + } else { + Ok(()) } - anyhow::Ok(()) - })? - .context("lsp ext run flycheck")?; + }) + .context("lsp ext run flycheck")??; }; anyhow::Ok(()) }) @@ -224,11 +226,12 @@ pub fn clear_flycheck( lsp_store .read_with(cx, |lsp_store, _| { if let Some(server) = lsp_store.language_server_for_id(rust_analyzer_server) { - server.notify::(&())?; + server.notify::(()) + } else { + Ok(()) } - anyhow::Ok(()) - })? - .context("lsp ext clear flycheck")?; + }) + .context("lsp ext clear flycheck")??; }; anyhow::Ok(()) }) diff --git a/crates/project/src/manifest_tree.rs b/crates/project/src/manifest_tree.rs index 5a3c7bd40fb11ee5bebe340ddc57ec71a112270b..ffa4872ca78e2295e18c515a03e81e4d7b63c07b 100644 --- a/crates/project/src/manifest_tree.rs +++ b/crates/project/src/manifest_tree.rs @@ -7,7 +7,7 @@ mod manifest_store; mod path_trie; mod server_tree; -use std::{borrow::Borrow, collections::hash_map::Entry, ops::ControlFlow, path::Path, sync::Arc}; +use std::{borrow::Borrow, collections::hash_map::Entry, ops::ControlFlow, sync::Arc}; use collections::HashMap; use gpui::{App, AppContext as _, Context, Entity, Subscription}; @@ -15,6 +15,7 @@ use language::{ManifestDelegate, ManifestName, ManifestQuery}; pub use manifest_store::ManifestProvidersStore; use path_trie::{LabelPresence, RootPathTrie, TriePath}; use settings::{SettingsStore, WorktreeId}; +use util::rel_path::RelPath; use worktree::{Event as WorktreeEvent, Snapshot, Worktree}; use crate::{ @@ -184,7 +185,7 @@ impl ManifestTree { .and_then(|manifest_name| self.root_for_path(project_path, manifest_name, delegate, cx)) .unwrap_or_else(|| ProjectPath { worktree_id, - path: Arc::from(Path::new("")), + path: RelPath::empty().into(), }) } @@ -211,7 +212,7 @@ impl ManifestQueryDelegate { } impl ManifestDelegate for ManifestQueryDelegate { - fn exists(&self, path: &Path, is_dir: Option) -> bool { + fn exists(&self, path: &RelPath, is_dir: Option) -> bool { self.worktree.entry_for_path(path).is_some_and(|entry| { is_dir.is_none_or(|is_required_to_be_dir| is_required_to_be_dir == entry.is_dir()) }) diff --git a/crates/project/src/manifest_tree/path_trie.rs b/crates/project/src/manifest_tree/path_trie.rs index 9cebfda25c69fa35b06cefe9ec744b5e6152a820..9710bb46d022382819d1edf7e84b85b5f325cdb7 100644 --- a/crates/project/src/manifest_tree/path_trie.rs +++ b/crates/project/src/manifest_tree/path_trie.rs @@ -1,11 +1,11 @@ use std::{ collections::{BTreeMap, btree_map::Entry}, - ffi::OsStr, ops::ControlFlow, - path::{Path, PathBuf}, sync::Arc, }; +use util::rel_path::RelPath; + /// [RootPathTrie] is a workhorse of [super::ManifestTree]. It is responsible for determining the closest known entry for a given path. /// It also determines how much of a given path is unexplored, thus letting callers fill in that gap if needed. /// Conceptually, it allows one to annotate Worktree entries with arbitrary extra metadata and run closest-ancestor searches. @@ -14,9 +14,9 @@ use std::{ /// For example, if there's a project root at path `python/project` and we query for a path `python/project/subdir/another_subdir/file.py`, there is /// a known root at `python/project` and the unexplored part is `subdir/another_subdir` - we need to run a scan on these 2 directories. pub(super) struct RootPathTrie".into()), + (".gitignore", "*.txt\n".into()), + ("a.xml", "".into()), ], ); @@ -8400,9 +8515,9 @@ async fn test_update_gitignore(cx: &mut gpui::TestAppContext) { fs.set_index_for_repo( Path::new(path!("/root/.git")), &[ - (".gitignore".into(), "*.txt\n".into()), - ("a.xml".into(), "".into()), - ("b.txt".into(), "Some text".into()), + (".gitignore", "*.txt\n".into()), + ("a.xml", "".into()), + ("b.txt", "Some text".into()), ], ); @@ -8424,6 +8539,7 @@ async fn test_update_gitignore(cx: &mut gpui::TestAppContext) { // a directory which some program has already open. // This is a limitation of the Windows. // See: https://stackoverflow.com/questions/41365318/access-is-denied-when-renaming-folder +// See: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_rename_information #[gpui::test] #[cfg_attr(target_os = "windows", ignore)] async fn test_rename_work_directory(cx: &mut gpui::TestAppContext) { @@ -8465,13 +8581,13 @@ async fn test_rename_work_directory(cx: &mut gpui::TestAppContext) { ); assert_eq!( repository - .status_for_path(&"a".into()) + .status_for_path(&repo_path("a")) .map(|entry| entry.status), Some(StatusCode::Modified.worktree()), ); assert_eq!( repository - .status_for_path(&"b".into()) + .status_for_path(&repo_path("b")) .map(|entry| entry.status), Some(FileStatus::Untracked), ); @@ -8490,11 +8606,11 @@ async fn test_rename_work_directory(cx: &mut gpui::TestAppContext) { root_path.join("projects/project2").as_path() ); assert_eq!( - repository.status_for_path(&"a".into()).unwrap().status, + repository.status_for_path(&repo_path("a")).unwrap().status, StatusCode::Modified.worktree(), ); assert_eq!( - repository.status_for_path(&"b".into()).unwrap().status, + repository.status_for_path(&repo_path("b")).unwrap().status, FileStatus::Untracked, ); }); @@ -8503,7 +8619,8 @@ async fn test_rename_work_directory(cx: &mut gpui::TestAppContext) { // NOTE: This test always fails on Windows, because on Windows, unlike on Unix, // you can't rename a directory which some program has already open. This is a // limitation of the Windows. See: -// https://stackoverflow.com/questions/41365318/access-is-denied-when-renaming-folder +// See: https://stackoverflow.com/questions/41365318/access-is-denied-when-renaming-folder +// See: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_rename_information #[gpui::test] #[cfg_attr(target_os = "windows", ignore)] async fn test_file_status(cx: &mut gpui::TestAppContext) { @@ -8567,11 +8684,17 @@ async fn test_file_status(cx: &mut gpui::TestAppContext) { ); assert_eq!( - repository.status_for_path(&B_TXT.into()).unwrap().status, + repository + .status_for_path(&repo_path(B_TXT)) + .unwrap() + .status, FileStatus::Untracked, ); assert_eq!( - repository.status_for_path(&F_TXT.into()).unwrap().status, + repository + .status_for_path(&repo_path(F_TXT)) + .unwrap() + .status, FileStatus::Untracked, ); }); @@ -8587,7 +8710,10 @@ async fn test_file_status(cx: &mut gpui::TestAppContext) { // The worktree detects that the file's git status has changed. repository.read_with(cx, |repository, _| { assert_eq!( - repository.status_for_path(&A_TXT.into()).unwrap().status, + repository + .status_for_path(&repo_path(A_TXT)) + .unwrap() + .status, StatusCode::Modified.worktree(), ); }); @@ -8605,11 +8731,14 @@ async fn test_file_status(cx: &mut gpui::TestAppContext) { // The worktree detects that the files' git status have changed. repository.read_with(cx, |repository, _cx| { assert_eq!( - repository.status_for_path(&F_TXT.into()).unwrap().status, + repository + .status_for_path(&repo_path(F_TXT)) + .unwrap() + .status, FileStatus::Untracked, ); - assert_eq!(repository.status_for_path(&B_TXT.into()), None); - assert_eq!(repository.status_for_path(&A_TXT.into()), None); + assert_eq!(repository.status_for_path(&repo_path(B_TXT)), None); + assert_eq!(repository.status_for_path(&repo_path(A_TXT)), None); }); // Modify files in the working copy and perform git operations on other files. @@ -8626,13 +8755,19 @@ async fn test_file_status(cx: &mut gpui::TestAppContext) { // Check that more complex repo changes are tracked repository.read_with(cx, |repository, _cx| { - assert_eq!(repository.status_for_path(&A_TXT.into()), None); + assert_eq!(repository.status_for_path(&repo_path(A_TXT)), None); assert_eq!( - repository.status_for_path(&B_TXT.into()).unwrap().status, + repository + .status_for_path(&repo_path(B_TXT)) + .unwrap() + .status, FileStatus::Untracked, ); assert_eq!( - repository.status_for_path(&E_TXT.into()).unwrap().status, + repository + .status_for_path(&repo_path(E_TXT)) + .unwrap() + .status, StatusCode::Modified.worktree(), ); }); @@ -8670,7 +8805,11 @@ async fn test_file_status(cx: &mut gpui::TestAppContext) { repository.read_with(cx, |repository, _cx| { assert_eq!( repository - .status_for_path(&Path::new(renamed_dir_name).join(RENAMED_FILE).into()) + .status_for_path( + &rel_path(renamed_dir_name) + .join(rel_path(RENAMED_FILE)) + .into() + ) .unwrap() .status, FileStatus::Untracked, @@ -8694,7 +8833,11 @@ async fn test_file_status(cx: &mut gpui::TestAppContext) { repository.read_with(cx, |repository, _cx| { assert_eq!( repository - .status_for_path(&Path::new(renamed_dir_name).join(RENAMED_FILE).into()) + .status_for_path( + &rel_path(renamed_dir_name) + .join(rel_path(RENAMED_FILE)) + .into() + ) .unwrap() .status, FileStatus::Untracked, @@ -8702,6 +8845,310 @@ async fn test_file_status(cx: &mut gpui::TestAppContext) { }); } +#[gpui::test] +#[cfg_attr(target_os = "windows", ignore)] +async fn test_ignored_dirs_events(cx: &mut gpui::TestAppContext) { + init_test(cx); + cx.executor().allow_parking(); + + const IGNORE_RULE: &str = "**/target"; + + let root = TempTree::new(json!({ + "project": { + "src": { + "main.rs": "fn main() {}" + }, + "target": { + "debug": { + "important_text.txt": "important text", + }, + }, + ".gitignore": IGNORE_RULE + }, + + })); + let root_path = root.path(); + + // Set up git repository before creating the worktree. + let work_dir = root.path().join("project"); + let repo = git_init(work_dir.as_path()); + repo.add_ignore_rule(IGNORE_RULE).unwrap(); + git_add("src/main.rs", &repo); + git_add(".gitignore", &repo); + git_commit("Initial commit", &repo); + + let project = Project::test(Arc::new(RealFs::new(None, cx.executor())), [root_path], cx).await; + let repository_updates = Arc::new(Mutex::new(Vec::new())); + let project_events = Arc::new(Mutex::new(Vec::new())); + project.update(cx, |project, cx| { + let repo_events = repository_updates.clone(); + cx.subscribe(project.git_store(), move |_, _, e, _| { + if let GitStoreEvent::RepositoryUpdated(_, e, _) = e { + repo_events.lock().push(e.clone()); + } + }) + .detach(); + let project_events = project_events.clone(); + cx.subscribe_self(move |_, e, _| { + if let Event::WorktreeUpdatedEntries(_, updates) = e { + project_events.lock().extend( + updates + .iter() + .map(|(path, _, change)| (path.as_unix_str().to_string(), *change)) + .filter(|(path, _)| path != "fs-event-sentinel"), + ); + } + }) + .detach(); + }); + + let tree = project.read_with(cx, |project, cx| project.worktrees(cx).next().unwrap()); + tree.flush_fs_events(cx).await; + tree.update(cx, |tree, cx| { + tree.load_file(rel_path("project/target/debug/important_text.txt"), cx) + }) + .await + .unwrap(); + tree.update(cx, |tree, _| { + assert_eq!( + tree.entries(true, 0) + .map(|entry| (entry.path.as_ref(), entry.is_ignored)) + .collect::>(), + vec![ + (rel_path(""), false), + (rel_path("project/"), false), + (rel_path("project/.gitignore"), false), + (rel_path("project/src"), false), + (rel_path("project/src/main.rs"), false), + (rel_path("project/target"), true), + (rel_path("project/target/debug"), true), + (rel_path("project/target/debug/important_text.txt"), true), + ] + ); + }); + + assert_eq!( + repository_updates.lock().drain(..).collect::>(), + vec![ + RepositoryEvent::Updated { + full_scan: true, + new_instance: false, + }, + RepositoryEvent::MergeHeadsChanged, + ], + "Initial worktree scan should produce a repo update event" + ); + assert_eq!( + project_events.lock().drain(..).collect::>(), + vec![ + ("project/target".to_string(), PathChange::Loaded), + ("project/target/debug".to_string(), PathChange::Loaded), + ( + "project/target/debug/important_text.txt".to_string(), + PathChange::Loaded + ), + ], + "Initial project changes should show that all not-ignored and all opened files are loaded" + ); + + let deps_dir = work_dir.join("target").join("debug").join("deps"); + std::fs::create_dir_all(&deps_dir).unwrap(); + tree.flush_fs_events(cx).await; + project + .update(cx, |project, cx| project.git_scans_complete(cx)) + .await; + cx.executor().run_until_parked(); + std::fs::write(deps_dir.join("aa.tmp"), "something tmp").unwrap(); + tree.flush_fs_events(cx).await; + project + .update(cx, |project, cx| project.git_scans_complete(cx)) + .await; + cx.executor().run_until_parked(); + std::fs::remove_dir_all(&deps_dir).unwrap(); + tree.flush_fs_events(cx).await; + project + .update(cx, |project, cx| project.git_scans_complete(cx)) + .await; + cx.executor().run_until_parked(); + + tree.update(cx, |tree, _| { + assert_eq!( + tree.entries(true, 0) + .map(|entry| (entry.path.as_ref(), entry.is_ignored)) + .collect::>(), + vec![ + (rel_path(""), false), + (rel_path("project/"), false), + (rel_path("project/.gitignore"), false), + (rel_path("project/src"), false), + (rel_path("project/src/main.rs"), false), + (rel_path("project/target"), true), + (rel_path("project/target/debug"), true), + (rel_path("project/target/debug/important_text.txt"), true), + ], + "No stray temp files should be left after the flycheck changes" + ); + }); + + assert_eq!( + repository_updates + .lock() + .iter() + .filter(|update| !matches!(update, RepositoryEvent::PathsChanged)) + .cloned() + .collect::>(), + Vec::new(), + "No further RepositoryUpdated events should happen, as only ignored dirs' contents was changed", + ); + assert_eq!( + project_events.lock().as_slice(), + vec![ + ("project/target/debug/deps".to_string(), PathChange::Added), + ("project/target/debug/deps".to_string(), PathChange::Removed), + ], + "Due to `debug` directory being tracket, it should get updates for entries inside it. + No updates for more nested directories should happen as those are ignored", + ); +} + +#[gpui::test] +async fn test_odd_events_for_ignored_dirs( + executor: BackgroundExecutor, + cx: &mut gpui::TestAppContext, +) { + init_test(cx); + let fs = FakeFs::new(executor); + fs.insert_tree( + path!("/root"), + json!({ + ".git": {}, + ".gitignore": "**/target/", + "src": { + "main.rs": "fn main() {}", + }, + "target": { + "debug": { + "foo.txt": "foo", + "deps": {} + } + } + }), + ) + .await; + fs.set_head_and_index_for_repo( + path!("/root/.git").as_ref(), + &[ + (".gitignore", "**/target/".into()), + ("src/main.rs", "fn main() {}".into()), + ], + ); + + let project = Project::test(fs.clone(), [path!("/root").as_ref()], cx).await; + let repository_updates = Arc::new(Mutex::new(Vec::new())); + let project_events = Arc::new(Mutex::new(Vec::new())); + project.update(cx, |project, cx| { + let repository_updates = repository_updates.clone(); + cx.subscribe(project.git_store(), move |_, _, e, _| { + if let GitStoreEvent::RepositoryUpdated(_, e, _) = e { + repository_updates.lock().push(e.clone()); + } + }) + .detach(); + let project_events = project_events.clone(); + cx.subscribe_self(move |_, e, _| { + if let Event::WorktreeUpdatedEntries(_, updates) = e { + project_events.lock().extend( + updates + .iter() + .map(|(path, _, change)| (path.as_unix_str().to_string(), *change)) + .filter(|(path, _)| path != "fs-event-sentinel"), + ); + } + }) + .detach(); + }); + + let tree = project.read_with(cx, |project, cx| project.worktrees(cx).next().unwrap()); + tree.update(cx, |tree, cx| { + tree.load_file(rel_path("target/debug/foo.txt"), cx) + }) + .await + .unwrap(); + tree.flush_fs_events(cx).await; + project + .update(cx, |project, cx| project.git_scans_complete(cx)) + .await; + cx.run_until_parked(); + tree.update(cx, |tree, _| { + assert_eq!( + tree.entries(true, 0) + .map(|entry| (entry.path.as_ref(), entry.is_ignored)) + .collect::>(), + vec![ + (rel_path(""), false), + (rel_path(".gitignore"), false), + (rel_path("src"), false), + (rel_path("src/main.rs"), false), + (rel_path("target"), true), + (rel_path("target/debug"), true), + (rel_path("target/debug/deps"), true), + (rel_path("target/debug/foo.txt"), true), + ] + ); + }); + + assert_eq!( + repository_updates + .lock() + .drain(..) + .filter(|update| !matches!(update, RepositoryEvent::PathsChanged)) + .collect::>(), + vec![ + RepositoryEvent::Updated { + full_scan: true, + new_instance: false, + }, + RepositoryEvent::MergeHeadsChanged, + ], + "Initial worktree scan should produce a repo update event" + ); + assert_eq!( + project_events.lock().drain(..).collect::>(), + vec![ + ("target".to_string(), PathChange::Loaded), + ("target/debug".to_string(), PathChange::Loaded), + ("target/debug/deps".to_string(), PathChange::Loaded), + ("target/debug/foo.txt".to_string(), PathChange::Loaded), + ], + "All non-ignored entries and all opened firs should be getting a project event", + ); + + // Emulate a flycheck spawn: it emits a `INODE_META_MOD`-flagged FS event on target/debug/deps, then creates and removes temp files inside. + // This may happen multiple times during a single flycheck, but once is enough for testing. + fs.emit_fs_event("/root/target/debug/deps", None); + tree.flush_fs_events(cx).await; + project + .update(cx, |project, cx| project.git_scans_complete(cx)) + .await; + cx.executor().run_until_parked(); + + assert_eq!( + repository_updates + .lock() + .iter() + .filter(|update| !matches!(update, RepositoryEvent::PathsChanged)) + .cloned() + .collect::>(), + Vec::new(), + "No further RepositoryUpdated events should happen, as only ignored dirs received FS events", + ); + assert_eq!( + project_events.lock().as_slice(), + Vec::new(), + "No further project events should happen, as only ignored dirs received FS events", + ); +} + #[gpui::test] async fn test_repos_in_invisible_worktrees( executor: BackgroundExecutor, @@ -8769,8 +9216,8 @@ async fn test_rescan_with_gitignore(cx: &mut gpui::TestAppContext) { init_test(cx); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = Some(Vec::new()); + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(Vec::new()); }); }); }); @@ -8796,8 +9243,8 @@ async fn test_rescan_with_gitignore(cx: &mut gpui::TestAppContext) { fs.set_head_and_index_for_repo( path!("/root/tree/.git").as_ref(), &[ - (".gitignore".into(), "ignored-dir\n".into()), - ("tracked-dir/tracked-file1".into(), "".into()), + (".gitignore", "ignored-dir\n".into()), + ("tracked-dir/tracked-file1", "".into()), ], ); @@ -8817,7 +9264,7 @@ async fn test_rescan_with_gitignore(cx: &mut gpui::TestAppContext) { tree.read_with(cx, |tree, _| { tree.as_local() .unwrap() - .manually_refresh_entries_for_paths(vec![Path::new("ignored-dir").into()]) + .manually_refresh_entries_for_paths(vec![rel_path("ignored-dir").into()]) }) .recv() .await; @@ -8855,9 +9302,9 @@ async fn test_rescan_with_gitignore(cx: &mut gpui::TestAppContext) { fs.set_index_for_repo( path!("/root/tree/.git").as_ref(), &[ - (".gitignore".into(), "ignored-dir\n".into()), - ("tracked-dir/tracked-file1".into(), "".into()), - ("tracked-dir/tracked-file2".into(), "".into()), + (".gitignore", "ignored-dir\n".into()), + ("tracked-dir/tracked-file1", "".into()), + ("tracked-dir/tracked-file2", "".into()), ], ); fs.create_file( @@ -8896,7 +9343,12 @@ async fn test_rescan_with_gitignore(cx: &mut gpui::TestAppContext) { None, true, ); - assert!(tree.read(cx).entry_for_path(".git").unwrap().is_ignored); + assert!( + tree.read(cx) + .entry_for_path(&rel_path(".git")) + .unwrap() + .is_ignored + ); }); } @@ -8974,10 +9426,10 @@ async fn test_git_worktrees_and_submodules(cx: &mut gpui::TestAppContext) { |state| { state .head_contents - .insert("src/b.txt".into(), "b".to_owned()); + .insert(repo_path("src/b.txt"), "b".to_owned()); state .index_contents - .insert("src/b.txt".into(), "b".to_owned()); + .insert(repo_path("src/b.txt"), "b".to_owned()); }, ) .unwrap(); @@ -9005,7 +9457,9 @@ async fn test_git_worktrees_and_submodules(cx: &mut gpui::TestAppContext) { barrier.await.unwrap(); worktree_repo.update(cx, |repo, _| { pretty_assertions::assert_eq!( - repo.status_for_path(&"src/b.txt".into()).unwrap().status, + repo.status_for_path(&repo_path("src/b.txt")) + .unwrap() + .status, StatusCode::Modified.worktree(), ); }); @@ -9015,8 +9469,12 @@ async fn test_git_worktrees_and_submodules(cx: &mut gpui::TestAppContext) { path!("/project/subdir/some-submodule/.git").as_ref(), true, |state| { - state.head_contents.insert("c.txt".into(), "c".to_owned()); - state.index_contents.insert("c.txt".into(), "c".to_owned()); + state + .head_contents + .insert(repo_path("c.txt"), "c".to_owned()); + state + .index_contents + .insert(repo_path("c.txt"), "c".to_owned()); }, ) .unwrap(); @@ -9044,7 +9502,7 @@ async fn test_git_worktrees_and_submodules(cx: &mut gpui::TestAppContext) { barrier.await.unwrap(); submodule_repo.update(cx, |repo, _| { pretty_assertions::assert_eq!( - repo.status_for_path(&"c.txt".into()).unwrap().status, + repo.status_for_path(&repo_path("c.txt")).unwrap().status, StatusCode::Modified.worktree(), ); }); @@ -9193,17 +9651,14 @@ fn python_lang(fs: Arc) -> Arc { async fn list( &self, worktree_root: PathBuf, - subroot_relative_path: Arc, + subroot_relative_path: Arc, _: Option>, ) -> ToolchainList { // This lister will always return a path .venv directories within ancestors - let ancestors = subroot_relative_path - .ancestors() - .map(ToOwned::to_owned) - .collect::>(); + let ancestors = subroot_relative_path.ancestors().collect::>(); let mut toolchains = vec![]; for ancestor in ancestors { - let venv_path = worktree_root.join(ancestor).join(".venv"); + let venv_path = worktree_root.join(ancestor.as_std_path()).join(".venv"); if self.0.is_dir(&venv_path).await { toolchains.push(Toolchain { name: SharedString::new("Python Venv"), @@ -9315,10 +9770,10 @@ fn assert_entry_git_state( ) { assert_eq!(tree.abs_path(), repository.work_directory_abs_path); let entry = tree - .entry_for_path(path) + .entry_for_path(&rel_path(path)) .unwrap_or_else(|| panic!("entry {path} not found")); let status = repository - .status_for_path(&path.into()) + .status_for_path(&repo_path(path)) .map(|entry| entry.status); let expected = index_status.map(|index_status| { TrackedStatus { @@ -9500,17 +9955,17 @@ async fn test_find_project_path_abs( let abs_path = project1_abs_path.join("file1.txt"); let found_path = project.find_project_path(abs_path, cx).unwrap(); assert_eq!(found_path.worktree_id, project1_id); - assert_eq!(found_path.path.as_ref(), Path::new("file1.txt")); + assert_eq!(&*found_path.path, rel_path("file1.txt")); let abs_path = project1_abs_path.join("subdir").join("file2.txt"); let found_path = project.find_project_path(abs_path, cx).unwrap(); assert_eq!(found_path.worktree_id, project1_id); - assert_eq!(found_path.path.as_ref(), Path::new("subdir/file2.txt")); + assert_eq!(&*found_path.path, rel_path("subdir/file2.txt")); let abs_path = project2_abs_path.join("file3.txt"); let found_path = project.find_project_path(abs_path, cx).unwrap(); assert_eq!(found_path.worktree_id, project2_id); - assert_eq!(found_path.path.as_ref(), Path::new("file3.txt")); + assert_eq!(&*found_path.path, rel_path("file3.txt")); let abs_path = project1_abs_path.join("nonexistent.txt"); let found_path = project.find_project_path(abs_path, cx); diff --git a/crates/project/src/search.rs b/crates/project/src/search.rs index f2c6091e0cb00b8da1a752e3d25afe3389e8c818..9460540729aab4ab75022594fddeeb01df7919e5 100644 --- a/crates/project/src/search.rs +++ b/crates/project/src/search.rs @@ -13,7 +13,7 @@ use std::{ sync::{Arc, LazyLock}, }; use text::Anchor; -use util::paths::PathMatcher; +use util::paths::{PathMatcher, PathStyle}; #[derive(Debug)] pub enum SearchResult { @@ -64,7 +64,6 @@ pub enum SearchQuery { include_ignored: bool, inner: SearchInputs, }, - Regex { regex: Regex, replacement: Option, @@ -239,7 +238,7 @@ impl SearchQuery { is_case_sensitive.map(|c| (c, new_query)) } - pub fn from_proto(message: proto::SearchQuery) -> Result { + pub fn from_proto(message: proto::SearchQuery, path_style: PathStyle) -> Result { let files_to_include = if message.files_to_include.is_empty() { message .files_to_include_legacy @@ -271,8 +270,8 @@ impl SearchQuery { message.case_sensitive, message.include_ignored, false, - PathMatcher::new(files_to_include)?, - PathMatcher::new(files_to_exclude)?, + PathMatcher::new(files_to_include, path_style)?, + PathMatcher::new(files_to_exclude, path_style)?, message.match_full_paths, None, // search opened only don't need search remote ) @@ -282,8 +281,8 @@ impl SearchQuery { message.whole_word, message.case_sensitive, message.include_ignored, - PathMatcher::new(files_to_include)?, - PathMatcher::new(files_to_exclude)?, + PathMatcher::new(files_to_include, path_style)?, + PathMatcher::new(files_to_exclude, path_style)?, false, None, // search opened only don't need search remote ) @@ -611,9 +610,10 @@ mod tests { "dir/[a-z].txt", "../dir/filé", ] { - let path_matcher = PathMatcher::new(&[valid_path.to_owned()]).unwrap_or_else(|e| { - panic!("Valid path {valid_path} should be accepted, but got: {e}") - }); + let path_matcher = PathMatcher::new(&[valid_path.to_owned()], PathStyle::local()) + .unwrap_or_else(|e| { + panic!("Valid path {valid_path} should be accepted, but got: {e}") + }); assert!( path_matcher.is_match(valid_path), "Path matcher for valid path {valid_path} should match itself" @@ -624,7 +624,7 @@ mod tests { #[test] fn path_matcher_creation_for_globs() { for invalid_glob in ["dir/[].txt", "dir/[a-z.txt", "dir/{file"] { - match PathMatcher::new(&[invalid_glob.to_owned()]) { + match PathMatcher::new(&[invalid_glob.to_owned()], PathStyle::local()) { Ok(_) => panic!("Invalid glob {invalid_glob} should not be accepted"), Err(_expected) => {} } @@ -637,7 +637,7 @@ mod tests { "dir/[a-z].txt", "{dir,file}", ] { - match PathMatcher::new(&[valid_glob.to_owned()]) { + match PathMatcher::new(&[valid_glob.to_owned()], PathStyle::local()) { Ok(_expected) => {} Err(e) => panic!("Valid glob should be accepted, but got: {e}"), } diff --git a/crates/project/src/task_inventory.rs b/crates/project/src/task_inventory.rs index 818a5c58cff7a57705a6498581e62f010ff6dcf9..4f4939491f19ebe6d32b82f780c4a9988a66c1d4 100644 --- a/crates/project/src/task_inventory.rs +++ b/crates/project/src/task_inventory.rs @@ -4,7 +4,7 @@ use std::{ borrow::Cow, cmp::{self, Reverse}, collections::hash_map, - path::{Path, PathBuf}, + path::PathBuf, sync::Arc, }; @@ -25,7 +25,7 @@ use task::{ VariableName, }; use text::{BufferId, Point, ToPoint}; -use util::{NumericPrefixWithSuffix, ResultExt as _, paths::PathExt as _, post_inc}; +use util::{NumericPrefixWithSuffix, ResultExt as _, post_inc, rel_path::RelPath}; use worktree::WorktreeId; use crate::{task_store::TaskSettingsLocation, worktree_store::WorktreeStore}; @@ -76,7 +76,7 @@ impl InventoryContents for DebugScenario { #[derive(Debug)] struct InventoryFor { global: HashMap>, - worktree: HashMap, Vec>>, + worktree: HashMap, Vec>>, } impl InventoryFor { @@ -95,7 +95,7 @@ impl InventoryFor { ( TaskSourceKind::Worktree { id: worktree, - directory_in_worktree: directory.to_path_buf(), + directory_in_worktree: directory.clone(), id_base: Cow::Owned(format!( "local worktree {} from directory {directory:?}", T::LABEL @@ -138,7 +138,7 @@ pub enum TaskSourceKind { /// Tasks from the worktree's .zed/task.json Worktree { id: WorktreeId, - directory_in_worktree: PathBuf, + directory_in_worktree: Arc, id_base: Cow<'static, str>, }, /// ~/.config/zed/task.json - like global files with task definitions, applicable to any path @@ -228,7 +228,7 @@ impl TaskSourceKind { id_base, directory_in_worktree, } => { - format!("{id_base}_{id}_{}", directory_in_worktree.display()) + format!("{id_base}_{id}_{}", directory_in_worktree.as_unix_str()) } Self::Language { name } => format!("language_{name}"), Self::Lsp { @@ -258,7 +258,7 @@ impl Inventory { ) { self.last_scheduled_scenarios .retain(|(s, _)| s.label != scenario.label); - self.last_scheduled_scenarios.push_back(( + self.last_scheduled_scenarios.push_front(( scenario, DebugScenarioContext { task_context, @@ -388,6 +388,7 @@ impl Inventory { .into_iter() .flat_map(|worktree| self.worktree_templates_from_settings(worktree)) .collect::>(); + let task_source_kind = language.as_ref().map(|language| TaskSourceKind::Language { name: language.name().into(), }); @@ -652,7 +653,7 @@ impl Inventory { path: match location { TaskSettingsLocation::Global(path) => path.to_owned(), TaskSettingsLocation::Worktree(settings_location) => { - settings_location.path.join(task_file_name()) + settings_location.path.as_std_path().join(task_file_name()) } }, message: format!("Failed to parse tasks file content as a JSON array: {e}"), @@ -700,7 +701,8 @@ impl Inventory { .. } = kind { - *id != location.worktree_id || directory_in_worktree != location.path + *id != location.worktree_id + || directory_in_worktree.as_ref() != location.path } else { true } @@ -728,9 +730,10 @@ impl Inventory { return Err(InvalidSettingsError::Debug { path: match location { TaskSettingsLocation::Global(path) => path.to_owned(), - TaskSettingsLocation::Worktree(settings_location) => { - settings_location.path.join(debug_task_file_name()) - } + TaskSettingsLocation::Worktree(settings_location) => settings_location + .path + .as_std_path() + .join(debug_task_file_name()), }, message: format!("Failed to parse tasks file content as a JSON array: {e}"), }); @@ -968,6 +971,7 @@ impl BasicContextProvider { Self { worktree_store } } } + impl ContextProvider for BasicContextProvider { fn build_context( &self, @@ -990,10 +994,7 @@ impl ContextProvider for BasicContextProvider { symbol.text[range].to_string() }); - let current_file = buffer - .file() - .and_then(|file| file.as_local()) - .map(|file| file.abs_path(cx).to_sanitized_string()); + let current_file = buffer.file().and_then(|file| file.as_local()); let Point { row, column } = location.range.start.to_point(&buffer_snapshot); let row = row + 1; let column = column + 1; @@ -1012,44 +1013,43 @@ impl ContextProvider for BasicContextProvider { if !selected_text.trim().is_empty() { task_variables.insert(VariableName::SelectedText, selected_text); } - let worktree_root_dir = - buffer - .file() - .map(|file| file.worktree_id(cx)) - .and_then(|worktree_id| { - self.worktree_store - .read(cx) - .worktree_for_id(worktree_id, cx) - .and_then(|worktree| worktree.read(cx).root_dir()) - }); - if let Some(worktree_path) = worktree_root_dir { + let worktree = buffer + .file() + .map(|file| file.worktree_id(cx)) + .and_then(|worktree_id| { + self.worktree_store + .read(cx) + .worktree_for_id(worktree_id, cx) + }); + + if let Some(worktree) = worktree { + let worktree = worktree.read(cx); + let path_style = worktree.path_style(); task_variables.insert( VariableName::WorktreeRoot, - worktree_path.to_sanitized_string(), + worktree.abs_path().to_string_lossy().into_owned(), ); - if let Some(full_path) = current_file.as_ref() { - let relative_path = pathdiff::diff_paths(full_path, worktree_path); - if let Some(relative_file) = relative_path { + if let Some(current_file) = current_file.as_ref() { + let relative_path = current_file.path(); + task_variables.insert( + VariableName::RelativeFile, + relative_path.display(path_style).to_string(), + ); + if let Some(relative_dir) = relative_path.parent() { task_variables.insert( - VariableName::RelativeFile, - relative_file.to_sanitized_string(), + VariableName::RelativeDir, + if relative_dir.is_empty() { + String::from(".") + } else { + relative_dir.display(path_style).to_string() + }, ); - if let Some(relative_dir) = relative_file.parent() { - task_variables.insert( - VariableName::RelativeDir, - if relative_dir.as_os_str().is_empty() { - String::from(".") - } else { - relative_dir.to_sanitized_string() - }, - ); - } } } } - if let Some(path_as_string) = current_file { - let path = Path::new(&path_as_string); + if let Some(current_file) = current_file { + let path = current_file.abs_path(cx); if let Some(filename) = path.file_name().and_then(|f| f.to_str()) { task_variables.insert(VariableName::Filename, String::from(filename)); } @@ -1062,7 +1062,7 @@ impl ContextProvider for BasicContextProvider { task_variables.insert(VariableName::Dirname, dirname.into()); } - task_variables.insert(VariableName::File, path_as_string); + task_variables.insert(VariableName::File, path.to_string_lossy().into_owned()); } Task::ready(Ok(task_variables)) @@ -1095,6 +1095,8 @@ mod tests { use pretty_assertions::assert_eq; use serde_json::json; use settings::SettingsLocation; + use std::path::Path; + use util::rel_path::rel_path; use crate::task_store::TaskStore; @@ -1180,7 +1182,7 @@ mod tests { let worktree_id = WorktreeId::from_usize(0); let local_worktree_location = SettingsLocation { worktree_id, - path: Path::new("foo"), + path: rel_path("foo"), }; inventory.update(cx, |inventory, _| { inventory @@ -1426,7 +1428,7 @@ mod tests { ( TaskSourceKind::Worktree { id: worktree_1, - directory_in_worktree: PathBuf::from(".zed"), + directory_in_worktree: rel_path(".zed").into(), id_base: "local worktree tasks from directory \".zed\"".into(), }, common_name.to_string(), @@ -1434,7 +1436,7 @@ mod tests { ( TaskSourceKind::Worktree { id: worktree_1, - directory_in_worktree: PathBuf::from(".zed"), + directory_in_worktree: rel_path(".zed").into(), id_base: "local worktree tasks from directory \".zed\"".into(), }, "worktree_1".to_string(), @@ -1444,7 +1446,7 @@ mod tests { ( TaskSourceKind::Worktree { id: worktree_2, - directory_in_worktree: PathBuf::from(".zed"), + directory_in_worktree: rel_path(".zed").into(), id_base: "local worktree tasks from directory \".zed\"".into(), }, common_name.to_string(), @@ -1452,7 +1454,7 @@ mod tests { ( TaskSourceKind::Worktree { id: worktree_2, - directory_in_worktree: PathBuf::from(".zed"), + directory_in_worktree: rel_path(".zed").into(), id_base: "local worktree tasks from directory \".zed\"".into(), }, "worktree_2".to_string(), @@ -1474,7 +1476,7 @@ mod tests { .update_file_based_tasks( TaskSettingsLocation::Worktree(SettingsLocation { worktree_id: worktree_1, - path: Path::new(".zed"), + path: rel_path(".zed"), }), Some(&mock_tasks_from_names( worktree_1_tasks.iter().map(|(_, name)| name.as_str()), @@ -1485,7 +1487,7 @@ mod tests { .update_file_based_tasks( TaskSettingsLocation::Worktree(SettingsLocation { worktree_id: worktree_2, - path: Path::new(".zed"), + path: rel_path(".zed"), }), Some(&mock_tasks_from_names( worktree_2_tasks.iter().map(|(_, name)| name.as_str()), diff --git a/crates/project/src/task_store.rs b/crates/project/src/task_store.rs index 6a62209b54e999ab7c3fca11fe6344bd3b5955fa..0de5e239798c6a95078d79c2a25775c914a13611 100644 --- a/crates/project/src/task_store.rs +++ b/crates/project/src/task_store.rs @@ -149,7 +149,7 @@ impl TaskStore { project_env: task_context.project_env.into_iter().collect(), cwd: task_context .cwd - .map(|cwd| cwd.to_string_lossy().to_string()), + .map(|cwd| cwd.to_string_lossy().into_owned()), task_variables: task_context .task_variables .into_iter() @@ -438,7 +438,7 @@ fn worktree_root( if !root_entry.is_dir() { return None; } - worktree.absolutize(&root_entry.path).ok() + Some(worktree.absolutize(&root_entry.path)) }) } diff --git a/crates/project/src/terminals.rs b/crates/project/src/terminals.rs index 04f98d6dba6794116be9a6dcf4d2cbb32cfb85b2..dc4224a7ff6b867ecdc959b2e4be1030cfc24aba 100644 --- a/crates/project/src/terminals.rs +++ b/crates/project/src/terminals.rs @@ -16,7 +16,7 @@ use task::{Shell, ShellBuilder, ShellKind, SpawnInTerminal}; use terminal::{ TaskState, TaskStatus, Terminal, TerminalBuilder, terminal_settings::TerminalSettings, }; -use util::{get_default_system_shell, get_system_shell, maybe}; +use util::{get_default_system_shell, maybe, rel_path::RelPath}; use crate::{Project, ProjectPath}; @@ -68,7 +68,7 @@ impl Project { { settings_location = Some(SettingsLocation { worktree_id: worktree.read(cx).id(), - path, + path: RelPath::empty(), }); } let settings = TerminalSettings::get(settings_location, cx).clone(); @@ -88,15 +88,8 @@ impl Project { let local_path = if is_via_remote { None } else { path.clone() }; let task_state = Some(TaskState { - id: spawn_task.id, - full_label: spawn_task.full_label, - label: spawn_task.label, - command_label: spawn_task.command_label, - hide: spawn_task.hide, + spawned_task: spawn_task.clone(), status: TaskStatus::Running, - show_summary: spawn_task.show_summary, - show_command: spawn_task.show_command, - show_rerun: spawn_task.show_rerun, completion_rx, }); let remote_client = self.remote_client.clone(); @@ -105,15 +98,7 @@ impl Project { .read(cx) .shell() .unwrap_or_else(get_default_system_shell), - None => match &settings.shell { - Shell::Program(program) => program.clone(), - Shell::WithArguments { - program, - args: _, - title_override: _, - } => program.clone(), - Shell::System => get_system_shell(), - }, + None => settings.shell.program(), }; let project_path_contexts = self @@ -125,7 +110,7 @@ impl Project { .map(|wt| wt.read(cx).id()) .map(|worktree_id| ProjectPath { worktree_id, - path: Arc::from(Path::new("")), + path: Arc::from(RelPath::empty()), }), ); let toolchains = project_path_contexts @@ -160,7 +145,7 @@ impl Project { project.update(cx, move |this, cx| { let format_to_run = || { if let Some(command) = &spawn_task.command { - let mut command: Option> = shlex::try_quote(command).ok(); + let mut command: Option> = shell_kind.try_quote(command); if let Some(command) = &mut command && command.starts_with('"') && let Some(prefix) = shell_kind.command_prefix() @@ -171,7 +156,8 @@ impl Project { let args = spawn_task .args .iter() - .filter_map(|arg| shlex::try_quote(arg).ok()); + .filter_map(|arg| shell_kind.try_quote(&arg)); + command.into_iter().chain(args).join(" ") } else { // todo: this breaks for remotes to windows @@ -179,7 +165,7 @@ impl Project { } }; - let shell = { + let (shell, env) = { env.extend(spawn_task.env); match remote_client { Some(remote_client) => match activation_script.clone() { @@ -189,8 +175,14 @@ impl Project { let args = vec!["-c".to_owned(), format!("{activation_script}; {to_run}")]; create_remote_shell( - Some((&shell, &args)), - &mut env, + Some(( + &remote_client + .read(cx) + .shell() + .unwrap_or_else(get_default_system_shell), + &args, + )), + env, path, remote_client, cx, @@ -201,7 +193,7 @@ impl Project { .command .as_ref() .map(|command| (command, &spawn_task.args)), - &mut env, + env, path, remote_client, cx, @@ -209,24 +201,30 @@ impl Project { }, None => match activation_script.clone() { activation_script if !activation_script.is_empty() => { - let activation_script = activation_script.join("; "); + let separator = shell_kind.sequential_commands_separator(); + let activation_script = + activation_script.join(&format!("{separator} ")); let to_run = format_to_run(); - // todo(lw): Alacritty uses `CreateProcessW` on windows with the entire command and arg sequence merged into a single string, - // without quoting the arguments - #[cfg(windows)] - let arg = - quote_arg(&format!("{activation_script}; {to_run}"), true); - #[cfg(not(windows))] - let arg = format!("{activation_script}; {to_run}"); - - Shell::WithArguments { - program: shell, - args: vec!["-c".to_owned(), arg], - title_override: None, + let mut arg = format!("{activation_script}{separator} {to_run}"); + if shell_kind == ShellKind::Cmd { + // We need to put the entire command in quotes since otherwise CMD tries to execute them + // as separate commands rather than chaining one after another. + arg = format!("\"{arg}\""); } + + let args = shell_kind.args_for_shell(false, arg); + + ( + Shell::WithArguments { + program: shell, + args, + title_override: None, + }, + env, + ) } - _ => { + _ => ( if let Some(program) = spawn_task.command { Shell::WithArguments { program, @@ -235,8 +233,9 @@ impl Project { } } else { Shell::System - } - } + }, + env, + ), }, } }; @@ -245,7 +244,7 @@ impl Project { task_state, shell, env, - settings.cursor_shape.unwrap_or_default(), + settings.cursor_shape, settings.alternate_scroll, settings.max_scroll_history_lines, is_via_remote, @@ -295,7 +294,7 @@ impl Project { { settings_location = Some(SettingsLocation { worktree_id: worktree.read(cx).id(), - path, + path: RelPath::empty(), }); } let settings = TerminalSettings::get(settings_location, cx).clone(); @@ -322,7 +321,7 @@ impl Project { .map(|wt| wt.read(cx).id()) .map(|worktree_id| ProjectPath { worktree_id, - path: Arc::from(Path::new("")), + path: RelPath::empty().into(), }), ); let toolchains = project_path_contexts @@ -330,21 +329,13 @@ impl Project { .map(|p| self.active_toolchain(p, LanguageName::new("Python"), cx)) .collect::>(); let remote_client = self.remote_client.clone(); - let shell = match &remote_client { + let shell_kind = ShellKind::new(&match &remote_client { Some(remote_client) => remote_client .read(cx) .shell() .unwrap_or_else(get_default_system_shell), - None => match &settings.shell { - Shell::Program(program) => program.clone(), - Shell::WithArguments { - program, - args: _, - title_override: _, - } => program.clone(), - Shell::System => get_system_shell(), - }, - }; + None => settings.shell.program(), + }); let lang_registry = self.languages.clone(); let fs = self.fs.clone(); @@ -361,7 +352,7 @@ impl Project { let lister = language?.toolchain_lister(); return Some( lister? - .activation_script(&toolchain, ShellKind::new(&shell), fs.as_ref()) + .activation_script(&toolchain, shell_kind, fs.as_ref()) .await, ); } @@ -370,12 +361,12 @@ impl Project { .await .unwrap_or_default(); project.update(cx, move |this, cx| { - let shell = { + let (shell, env) = { match remote_client { Some(remote_client) => { - create_remote_shell(None, &mut env, path, remote_client, cx)? + create_remote_shell(None, env, path, remote_client, cx)? } - None => settings.shell, + None => (settings.shell, env), } }; TerminalBuilder::new( @@ -383,7 +374,7 @@ impl Project { None, shell, env, - settings.cursor_shape.unwrap_or_default(), + settings.cursor_shape, settings.alternate_scroll, settings.max_scroll_history_lines, is_via_remote, @@ -423,31 +414,40 @@ impl Project { &mut self, terminal: &Entity, cx: &mut Context<'_, Project>, - cwd: impl FnOnce() -> Option, + cwd: Option, ) -> Result> { - terminal.read(cx).clone_builder(cx, cwd).map(|builder| { - let terminal_handle = cx.new(|cx| builder.subscribe(cx)); - - self.terminals - .local_handles - .push(terminal_handle.downgrade()); - - let id = terminal_handle.entity_id(); - cx.observe_release(&terminal_handle, move |project, _terminal, cx| { - let handles = &mut project.terminals.local_handles; - - if let Some(index) = handles - .iter() - .position(|terminal| terminal.entity_id() == id) - { - handles.remove(index); - cx.notify(); - } - }) - .detach(); + let local_path = if self.is_via_remote_server() { + None + } else { + cwd + }; - terminal_handle - }) + terminal + .read(cx) + .clone_builder(cx, local_path) + .map(|builder| { + let terminal_handle = cx.new(|cx| builder.subscribe(cx)); + + self.terminals + .local_handles + .push(terminal_handle.downgrade()); + + let id = terminal_handle.entity_id(); + cx.observe_release(&terminal_handle, move |project, _terminal, cx| { + let handles = &mut project.terminals.local_handles; + + if let Some(index) = handles + .iter() + .position(|terminal| terminal.entity_id() == id) + { + handles.remove(index); + cx.notify(); + } + }) + .detach(); + + terminal_handle + }) } pub fn terminal_settings<'a>( @@ -461,20 +461,22 @@ impl Project { { settings_location = Some(SettingsLocation { worktree_id: worktree.read(cx).id(), - path, + path: RelPath::empty(), }); } TerminalSettings::get(settings_location, cx) } - pub fn exec_in_shell(&self, command: String, cx: &App) -> Result { + pub fn exec_in_shell(&self, command: String, cx: &App) -> Result { let path = self.first_project_directory(cx); let remote_client = self.remote_client.as_ref(); let settings = self.terminal_settings(&path, cx).clone(); - let remote_shell = remote_client + let shell = remote_client .as_ref() - .and_then(|remote_client| remote_client.read(cx).shell()); - let builder = ShellBuilder::new(remote_shell.as_deref(), &settings.shell).non_interactive(); + .and_then(|remote_client| remote_client.read(cx).shell()) + .map(Shell::Program) + .unwrap_or_else(|| settings.shell.clone()); + let builder = ShellBuilder::new(&shell).non_interactive(); let (command, args) = builder.build(Some(command), &Vec::new()); let mut env = self @@ -505,6 +507,10 @@ impl Project { Ok(command) } } + .map(|mut process| { + util::set_pre_exec_to_start_new_session(&mut process); + smol::process::Command::from(process) + }) } pub fn local_terminal_handles(&self) -> &Vec> { @@ -512,44 +518,13 @@ impl Project { } } -/// We're not using shlex for windows as it is overly eager with escaping some of the special characters (^) we need for nu. Hence, we took -/// that quote impl straight from Rust stdlib (Command API). -#[cfg(windows)] -fn quote_arg(argument: &str, quote: bool) -> String { - let mut arg = String::new(); - if quote { - arg.push('"'); - } - - let mut backslashes: usize = 0; - for x in argument.chars() { - if x == '\\' { - backslashes += 1; - } else { - if x == '"' { - // Add n+1 backslashes to total 2n+1 before internal '"'. - arg.extend((0..=backslashes).map(|_| '\\')); - } - backslashes = 0; - } - arg.push(x); - } - - if quote { - // Add n backslashes to total 2n before ending '"'. - arg.extend((0..backslashes).map(|_| '\\')); - arg.push('"'); - } - arg -} - fn create_remote_shell( spawn_command: Option<(&String, &Vec)>, - env: &mut HashMap, + mut env: HashMap, working_directory: Option>, remote_client: Entity, cx: &mut App, -) -> Result { +) -> Result<(Shell, HashMap)> { // Alacritty sets its terminfo to `alacritty`, this requiring hosts to have it installed // to properly display colors. // We do not have the luxury of assuming the host has it installed, @@ -565,18 +540,20 @@ fn create_remote_shell( let command = remote_client.read(cx).build_command( program, args.as_slice(), - env, + &env, working_directory.map(|path| path.display().to_string()), None, )?; - *env = command.env; log::debug!("Connecting to a remote server: {:?}", command.program); let host = remote_client.read(cx).connection_options().display_name(); - Ok(Shell::WithArguments { - program: command.program, - args: command.args, - title_override: Some(format!("{} — Terminal", host).into()), - }) + Ok(( + Shell::WithArguments { + program: command.program, + args: command.args, + title_override: Some(format!("{} — Terminal", host).into()), + }, + command.env, + )) } diff --git a/crates/project/src/toolchain_store.rs b/crates/project/src/toolchain_store.rs index e76b98f697768c987f527eaf444c159334b12c96..2b967ef2304af197e5a95cdeb661d746dbc7e6f1 100644 --- a/crates/project/src/toolchain_store.rs +++ b/crates/project/src/toolchain_store.rs @@ -1,8 +1,4 @@ -use std::{ - path::{Path, PathBuf}, - str::FromStr, - sync::Arc, -}; +use std::{path::PathBuf, str::FromStr, sync::Arc}; use anyhow::{Context as _, Result, bail}; @@ -18,12 +14,12 @@ use language::{ use rpc::{ AnyProtoClient, TypedEnvelope, proto::{ - self, FromProto, ResolveToolchainResponse, ToProto, + self, ResolveToolchainResponse, resolve_toolchain_response::Response as ResolveResponsePayload, }, }; use settings::WorktreeId; -use util::ResultExt as _; +use util::{ResultExt as _, rel_path::RelPath}; use crate::{ ProjectEnvironment, ProjectPath, @@ -46,7 +42,7 @@ pub struct Toolchains { /// Auto-detected toolchains. pub toolchains: ToolchainList, /// Path of the project root at which we ran the automatic toolchain detection. - pub root_path: Arc, + pub root_path: Arc, pub user_toolchains: BTreeMap>, } impl EventEmitter for ToolchainStore {} @@ -241,15 +237,15 @@ impl ToolchainStore { name: toolchain.name.into(), // todo(windows) // Do we need to convert path to native string? - path: PathBuf::from(toolchain.path).to_proto().into(), + path: toolchain.path.into(), as_json: serde_json::Value::from_str(&toolchain.raw_json)?, language_name, }; let worktree_id = WorktreeId::from_proto(envelope.payload.worktree_id); - let path: Arc = if let Some(path) = envelope.payload.path { - Arc::from(path.as_ref()) + let path = if let Some(path) = envelope.payload.path { + RelPath::from_proto(&path)? } else { - Arc::from("".as_ref()) + RelPath::empty().into() }; Ok(this.activate_toolchain(ProjectPath { worktree_id, path }, toolchain, cx)) })?? @@ -261,6 +257,7 @@ impl ToolchainStore { envelope: TypedEnvelope, mut cx: AsyncApp, ) -> Result { + let path = RelPath::unix(envelope.payload.path.as_deref().unwrap_or(""))?; let toolchain = this .update(&mut cx, |this, cx| { let language_name = LanguageName::from_proto(envelope.payload.language_name); @@ -268,7 +265,7 @@ impl ToolchainStore { this.active_toolchain( ProjectPath { worktree_id, - path: Arc::from(envelope.payload.path.as_deref().unwrap_or("").as_ref()), + path: Arc::from(path), }, language_name, cx, @@ -281,7 +278,7 @@ impl ToolchainStore { let path = PathBuf::from(toolchain.path.to_string()); proto::Toolchain { name: toolchain.name.into(), - path: path.to_proto(), + path: path.to_string_lossy().into_owned(), raw_json: toolchain.as_json.to_string(), } }), @@ -297,9 +294,13 @@ impl ToolchainStore { .update(&mut cx, |this, cx| { let language_name = LanguageName::from_proto(envelope.payload.language_name); let worktree_id = WorktreeId::from_proto(envelope.payload.worktree_id); - let path = Arc::from(envelope.payload.path.as_deref().unwrap_or("").as_ref()); - this.list_toolchains(ProjectPath { worktree_id, path }, language_name, cx) - })? + let path = RelPath::from_proto(envelope.payload.path.as_deref().unwrap_or(""))?; + anyhow::Ok(this.list_toolchains( + ProjectPath { worktree_id, path }, + language_name, + cx, + )) + })?? .await; let has_values = toolchains.is_some(); let groups = if let Some(Toolchains { toolchains, .. }) = &toolchains { @@ -329,21 +330,21 @@ impl ToolchainStore { let path = PathBuf::from(toolchain.path.to_string()); proto::Toolchain { name: toolchain.name.to_string(), - path: path.to_proto(), + path: path.to_string_lossy().into_owned(), raw_json: toolchain.as_json.to_string(), } }) .collect::>(); (toolchains, relative_path) } else { - (vec![], Arc::from(Path::new(""))) + (vec![], Arc::from(RelPath::empty())) }; Ok(proto::ListToolchainsResponse { has_values, toolchains, groups, - relative_worktree_path: Some(relative_path.to_string_lossy().into_owned()), + relative_worktree_path: Some(relative_path.to_proto()), }) } @@ -393,7 +394,7 @@ pub struct LocalToolchainStore { languages: Arc, worktree_store: Entity, project_environment: Entity, - active_toolchains: BTreeMap<(WorktreeId, LanguageName), BTreeMap, Toolchain>>, + active_toolchains: BTreeMap<(WorktreeId, LanguageName), BTreeMap, Toolchain>>, manifest_tree: Entity, } @@ -402,7 +403,7 @@ impl language::LocalLanguageToolchainStore for LocalStore { fn active_toolchain( self: Arc, worktree_id: WorktreeId, - path: &Arc, + path: &Arc, language_name: LanguageName, cx: &mut AsyncApp, ) -> Option { @@ -419,7 +420,7 @@ impl language::LanguageToolchainStore for RemoteStore { async fn active_toolchain( self: Arc, worktree_id: WorktreeId, - path: Arc, + path: Arc, language_name: LanguageName, cx: &mut AsyncApp, ) -> Option { @@ -437,7 +438,7 @@ impl language::LocalLanguageToolchainStore for EmptyToolchainStore { fn active_toolchain( self: Arc, _: WorktreeId, - _: &Arc, + _: &Arc, _: LanguageName, _: &mut AsyncApp, ) -> Option { @@ -479,7 +480,7 @@ impl LocalToolchainStore { path: ProjectPath, language_name: LanguageName, cx: &mut Context, - ) -> Task)>> { + ) -> Task)>> { let registry = self.languages.clone(); let manifest_tree = self.manifest_tree.downgrade(); @@ -511,13 +512,12 @@ impl LocalToolchainStore { }) .ok()? .unwrap_or_else(|| ProjectPath { - path: Arc::from(Path::new("")), + path: Arc::from(RelPath::empty()), worktree_id, }); let abs_path = worktree - .update(cx, |this, _| this.absolutize(&relative_path.path).ok()) - .ok() - .flatten()?; + .update(cx, |this, _| this.absolutize(&relative_path.path)) + .ok()?; let project_env = environment .update(cx, |environment, cx| { @@ -540,7 +540,7 @@ impl LocalToolchainStore { pub(crate) fn active_toolchain( &self, worktree_id: WorktreeId, - relative_path: &Arc, + relative_path: &Arc, language_name: LanguageName, ) -> Option { let ancestors = relative_path.ancestors(); @@ -609,10 +609,10 @@ impl RemoteToolchainStore { language_name: toolchain.language_name.into(), toolchain: Some(proto::Toolchain { name: toolchain.name.into(), - path: path.to_proto(), + path: path.to_string_lossy().into_owned(), raw_json: toolchain.as_json.to_string(), }), - path: Some(project_path.path.to_string_lossy().into_owned()), + path: Some(project_path.path.to_proto()), }) .await .log_err()?; @@ -633,7 +633,7 @@ impl RemoteToolchainStore { path: ProjectPath, language_name: LanguageName, cx: &App, - ) -> Task)>> { + ) -> Task)>> { let project_id = self.project_id; let client = self.client.clone(); cx.background_spawn(async move { @@ -642,7 +642,7 @@ impl RemoteToolchainStore { project_id, worktree_id: path.worktree_id.to_proto(), language_name: language_name.clone().into(), - path: Some(path.path.to_string_lossy().into_owned()), + path: Some(path.path.to_proto()), }) .await .log_err()?; @@ -656,12 +656,7 @@ impl RemoteToolchainStore { Some(Toolchain { language_name: language_name.clone(), name: toolchain.name.into(), - // todo(windows) - // Do we need to convert path to native string? - path: PathBuf::from_proto(toolchain.path) - .to_string_lossy() - .to_string() - .into(), + path: toolchain.path.into(), as_json: serde_json::Value::from_str(&toolchain.raw_json).ok()?, }) }) @@ -673,12 +668,13 @@ impl RemoteToolchainStore { Some((usize::try_from(group.start_index).ok()?, group.name.into())) }) .collect(); - let relative_path = Arc::from(Path::new( + let relative_path = RelPath::from_proto( response .relative_worktree_path .as_deref() .unwrap_or_default(), - )); + ) + .log_err()?; Some(( ToolchainList { toolchains, @@ -703,7 +699,7 @@ impl RemoteToolchainStore { project_id, worktree_id: path.worktree_id.to_proto(), language_name: language_name.clone().into(), - path: Some(path.path.to_string_lossy().into_owned()), + path: Some(path.path.to_proto()), }) .await .log_err()?; @@ -712,12 +708,7 @@ impl RemoteToolchainStore { Some(Toolchain { language_name: language_name.clone(), name: toolchain.name.into(), - // todo(windows) - // Do we need to convert path to native string? - path: PathBuf::from_proto(toolchain.path) - .to_string_lossy() - .to_string() - .into(), + path: toolchain.path.into(), as_json: serde_json::Value::from_str(&toolchain.raw_json).ok()?, }) }) @@ -746,20 +737,13 @@ impl RemoteToolchainStore { .context("Failed to resolve toolchain via RPC")?; use proto::resolve_toolchain_response::Response; match response { - Response::Toolchain(toolchain) => { - Ok(Toolchain { - language_name: language_name.clone(), - name: toolchain.name.into(), - // todo(windows) - // Do we need to convert path to native string? - path: PathBuf::from_proto(toolchain.path) - .to_string_lossy() - .to_string() - .into(), - as_json: serde_json::Value::from_str(&toolchain.raw_json) - .context("Deserializing ResolveToolchain LSP response")?, - }) - } + Response::Toolchain(toolchain) => Ok(Toolchain { + language_name: language_name.clone(), + name: toolchain.name.into(), + path: toolchain.path.into(), + as_json: serde_json::Value::from_str(&toolchain.raw_json) + .context("Deserializing ResolveToolchain LSP response")?, + }), Response::Error(error) => { anyhow::bail!("{error}"); } diff --git a/crates/project/src/worktree_store.rs b/crates/project/src/worktree_store.rs index b37e1ef8026b643444b3ca0ba67cdb953a959a36..8e18a8085dd311d8e5c34da783dc720570553bc5 100644 --- a/crates/project/src/worktree_store.rs +++ b/crates/project/src/worktree_store.rs @@ -7,7 +7,7 @@ use std::{ use anyhow::{Context as _, Result, anyhow}; use collections::{HashMap, HashSet}; -use fs::Fs; +use fs::{Fs, copy_recursive}; use futures::{ FutureExt, SinkExt, future::{BoxFuture, Shared}, @@ -18,7 +18,7 @@ use gpui::{ use postage::oneshot; use rpc::{ AnyProtoClient, ErrorExt, TypedEnvelope, - proto::{self, FromProto, REMOTE_SERVER_PROJECT_ID, ToProto}, + proto::{self, REMOTE_SERVER_PROJECT_ID}, }; use smol::{ channel::{Receiver, Sender}, @@ -28,16 +28,17 @@ use text::ReplicaId; use util::{ ResultExt, paths::{PathStyle, RemotePathBuf, SanitizedPath}, + rel_path::RelPath, }; use worktree::{ - Entry, ProjectEntryId, UpdatedEntriesSet, UpdatedGitRepositoriesSet, Worktree, WorktreeId, - WorktreeSettings, + CreatedEntry, Entry, ProjectEntryId, UpdatedEntriesSet, UpdatedGitRepositoriesSet, Worktree, + WorktreeId, WorktreeSettings, }; use crate::{ProjectPath, search::SearchQuery}; struct MatchingEntry { - worktree_path: Arc, + worktree_root: Arc, path: ProjectPath, respond: oneshot::Sender, } @@ -155,11 +156,14 @@ impl WorktreeStore { &self, abs_path: impl AsRef, cx: &App, - ) -> Option<(Entity, PathBuf)> { - let abs_path = SanitizedPath::new(&abs_path); + ) -> Option<(Entity, Arc)> { + let abs_path = SanitizedPath::new(abs_path.as_ref()); for tree in self.worktrees() { - if let Ok(relative_path) = abs_path.as_path().strip_prefix(tree.read(cx).abs_path()) { - return Some((tree.clone(), relative_path.into())); + let path_style = tree.read(cx).path_style(); + if let Ok(relative_path) = abs_path.as_ref().strip_prefix(tree.read(cx).abs_path()) + && let Ok(relative_path) = RelPath::new(relative_path, path_style) + { + return Some((tree.clone(), relative_path.into_arc())); } } None @@ -167,7 +171,14 @@ impl WorktreeStore { pub fn absolutize(&self, project_path: &ProjectPath, cx: &App) -> Option { let worktree = self.worktree_for_id(project_path.worktree_id, cx)?; - worktree.read(cx).absolutize(&project_path.path).ok() + Some(worktree.read(cx).absolutize(&project_path.path)) + } + + pub fn path_style(&self) -> PathStyle { + match &self.state { + WorktreeStoreState::Local { .. } => PathStyle::local(), + WorktreeStoreState::Remote { path_style, .. } => *path_style, + } } pub fn find_or_create_worktree( @@ -175,13 +186,13 @@ impl WorktreeStore { abs_path: impl AsRef, visible: bool, cx: &mut Context, - ) -> Task, PathBuf)>> { + ) -> Task, Arc)>> { let abs_path = abs_path.as_ref(); if let Some((tree, relative_path)) = self.find_worktree(abs_path, cx) { Task::ready(Ok((tree, relative_path))) } else { let worktree = self.create_worktree(abs_path, visible, cx); - cx.background_spawn(async move { Ok((worktree.await?, PathBuf::new())) }) + cx.background_spawn(async move { Ok((worktree.await?, RelPath::empty().into())) }) } } @@ -209,6 +220,240 @@ impl WorktreeStore { .entry_for_path(&path.path) } + pub fn copy_entry( + &mut self, + entry_id: ProjectEntryId, + new_project_path: ProjectPath, + cx: &mut Context, + ) -> Task>> { + let Some(old_worktree) = self.worktree_for_entry(entry_id, cx) else { + return Task::ready(Err(anyhow!("no such worktree"))); + }; + let Some(old_entry) = old_worktree.read(cx).entry_for_id(entry_id) else { + return Task::ready(Err(anyhow!("no such entry"))); + }; + let Some(new_worktree) = self.worktree_for_id(new_project_path.worktree_id, cx) else { + return Task::ready(Err(anyhow!("no such worktree"))); + }; + + match &self.state { + WorktreeStoreState::Local { fs } => { + let old_abs_path = old_worktree.read(cx).absolutize(&old_entry.path); + let new_abs_path = new_worktree.read(cx).absolutize(&new_project_path.path); + let fs = fs.clone(); + let copy = cx.background_spawn(async move { + copy_recursive( + fs.as_ref(), + &old_abs_path, + &new_abs_path, + Default::default(), + ) + .await + }); + + cx.spawn(async move |_, cx| { + copy.await?; + new_worktree + .update(cx, |this, cx| { + this.as_local_mut().unwrap().refresh_entry( + new_project_path.path, + None, + cx, + ) + })? + .await + }) + } + WorktreeStoreState::Remote { + upstream_client, + upstream_project_id, + .. + } => { + let response = upstream_client.request(proto::CopyProjectEntry { + project_id: *upstream_project_id, + entry_id: entry_id.to_proto(), + new_path: new_project_path.path.to_proto(), + new_worktree_id: new_project_path.worktree_id.to_proto(), + }); + cx.spawn(async move |_, cx| { + let response = response.await?; + match response.entry { + Some(entry) => new_worktree + .update(cx, |worktree, cx| { + worktree.as_remote_mut().unwrap().insert_entry( + entry, + response.worktree_scan_id as usize, + cx, + ) + })? + .await + .map(Some), + None => Ok(None), + } + }) + } + } + } + + pub fn rename_entry( + &mut self, + entry_id: ProjectEntryId, + new_project_path: ProjectPath, + cx: &mut Context, + ) -> Task> { + let Some(old_worktree) = self.worktree_for_entry(entry_id, cx) else { + return Task::ready(Err(anyhow!("no such worktree"))); + }; + let Some(old_entry) = old_worktree.read(cx).entry_for_id(entry_id).cloned() else { + return Task::ready(Err(anyhow!("no such entry"))); + }; + let Some(new_worktree) = self.worktree_for_id(new_project_path.worktree_id, cx) else { + return Task::ready(Err(anyhow!("no such worktree"))); + }; + + match &self.state { + WorktreeStoreState::Local { fs } => { + let abs_old_path = old_worktree.read(cx).absolutize(&old_entry.path); + let new_worktree_ref = new_worktree.read(cx); + let is_root_entry = new_worktree_ref + .root_entry() + .is_some_and(|e| e.id == entry_id); + let abs_new_path = if is_root_entry { + let abs_path = new_worktree_ref.abs_path(); + let Some(root_parent_path) = abs_path.parent() else { + return Task::ready(Err(anyhow!("no parent for path {:?}", abs_path))); + }; + root_parent_path.join(new_project_path.path.as_std_path()) + } else { + new_worktree_ref.absolutize(&new_project_path.path) + }; + + let fs = fs.clone(); + let case_sensitive = new_worktree + .read(cx) + .as_local() + .unwrap() + .fs_is_case_sensitive(); + + let do_rename = + async move |fs: &dyn Fs, old_path: &Path, new_path: &Path, overwrite| { + fs.rename( + &old_path, + &new_path, + fs::RenameOptions { + overwrite, + ..fs::RenameOptions::default() + }, + ) + .await + .with_context(|| format!("renaming {old_path:?} into {new_path:?}")) + }; + + let rename = cx.background_spawn({ + let abs_new_path = abs_new_path.clone(); + async move { + // If we're on a case-insensitive FS and we're doing a case-only rename (i.e. `foobar` to `FOOBAR`) + // we want to overwrite, because otherwise we run into a file-already-exists error. + let overwrite = !case_sensitive + && abs_old_path != abs_new_path + && abs_old_path.to_str().map(|p| p.to_lowercase()) + == abs_new_path.to_str().map(|p| p.to_lowercase()); + + // The directory we're renaming into might not exist yet + if let Err(e) = + do_rename(fs.as_ref(), &abs_old_path, &abs_new_path, overwrite).await + { + if let Some(err) = e.downcast_ref::() + && err.kind() == std::io::ErrorKind::NotFound + { + if let Some(parent) = abs_new_path.parent() { + fs.create_dir(parent).await.with_context(|| { + format!("creating parent directory {parent:?}") + })?; + return do_rename( + fs.as_ref(), + &abs_old_path, + &abs_new_path, + overwrite, + ) + .await; + } + } + return Err(e); + } + Ok(()) + } + }); + + cx.spawn(async move |_, cx| { + rename.await?; + Ok(new_worktree + .update(cx, |this, cx| { + let local = this.as_local_mut().unwrap(); + if is_root_entry { + // We eagerly update `abs_path` and refresh this worktree. + // Otherwise, the FS watcher would do it on the `RootUpdated` event, + // but with a noticeable delay, so we handle it proactively. + local.update_abs_path_and_refresh( + SanitizedPath::new_arc(&abs_new_path), + cx, + ); + Task::ready(Ok(this.root_entry().cloned())) + } else { + // First refresh the parent directory (in case it was newly created) + if let Some(parent) = new_project_path.path.parent() { + let _ = local.refresh_entries_for_paths(vec![parent.into()]); + } + // Then refresh the new path + local.refresh_entry( + new_project_path.path.clone(), + Some(old_entry.path), + cx, + ) + } + })? + .await? + .map(CreatedEntry::Included) + .unwrap_or_else(|| CreatedEntry::Excluded { + abs_path: abs_new_path, + })) + }) + } + WorktreeStoreState::Remote { + upstream_client, + upstream_project_id, + .. + } => { + let response = upstream_client.request(proto::RenameProjectEntry { + project_id: *upstream_project_id, + entry_id: entry_id.to_proto(), + new_path: new_project_path.path.to_proto(), + new_worktree_id: new_project_path.worktree_id.to_proto(), + }); + cx.spawn(async move |_, cx| { + let response = response.await?; + match response.entry { + Some(entry) => new_worktree + .update(cx, |worktree, cx| { + worktree.as_remote_mut().unwrap().insert_entry( + entry, + response.worktree_scan_id as usize, + cx, + ) + })? + .await + .map(CreatedEntry::Included), + None => { + let abs_path = new_worktree.read_with(cx, |worktree, _| { + worktree.absolutize(&new_project_path.path) + })?; + Ok(CreatedEntry::Excluded { abs_path }) + } + } + }) + } + } + } pub fn create_worktree( &mut self, abs_path: impl AsRef, @@ -226,7 +471,7 @@ impl WorktreeStore { if upstream_client.is_via_collab() { Task::ready(Err(Arc::new(anyhow!("cannot create worktrees via collab")))) } else { - let abs_path = RemotePathBuf::new(abs_path.to_path_buf(), *path_style); + let abs_path = RemotePathBuf::new(abs_path.to_string(), *path_style); self.create_remote_worktree(upstream_client.clone(), abs_path, visible, cx) } } @@ -273,7 +518,7 @@ impl WorktreeStore { cx.spawn(async move |this, cx| { let this = this.upgrade().context("Dropped worktree store")?; - let path = RemotePathBuf::new(abs_path.into(), path_style); + let path = RemotePathBuf::new(abs_path, path_style); let response = client .request(proto::AddWorktree { project_id: REMOTE_SERVER_PROJECT_ID, @@ -288,11 +533,11 @@ impl WorktreeStore { return Ok(existing_worktree); } - let root_path_buf = PathBuf::from_proto(response.canonicalized_path.clone()); + let root_path_buf = PathBuf::from(response.canonicalized_path.clone()); let root_name = root_path_buf .file_name() - .map(|n| n.to_string_lossy().to_string()) - .unwrap_or(root_path_buf.to_string_lossy().to_string()); + .map(|n| n.to_string_lossy().into_owned()) + .unwrap_or(root_path_buf.to_string_lossy().into_owned()); let worktree = cx.update(|cx| { Worktree::remote( @@ -305,6 +550,7 @@ impl WorktreeStore { abs_path: response.canonicalized_path, }, client, + path_style, cx, ) })?; @@ -477,7 +723,14 @@ impl WorktreeStore { self.worktrees.push(handle); } else { self.add( - &Worktree::remote(project_id, replica_id, worktree, client.clone(), cx), + &Worktree::remote( + project_id, + replica_id, + worktree, + client.clone(), + self.path_style(), + cx, + ), cx, ); } @@ -605,9 +858,9 @@ impl WorktreeStore { let worktree = worktree.read(cx); proto::WorktreeMetadata { id: worktree.id().to_proto(), - root_name: worktree.root_name().into(), + root_name: worktree.root_name_str().to_owned(), visible: worktree.is_visible(), - abs_path: worktree.abs_path().to_proto(), + abs_path: worktree.abs_path().to_string_lossy().into_owned(), } }) .collect() @@ -740,13 +993,13 @@ impl WorktreeStore { fn scan_ignored_dir<'a>( fs: &'a Arc, snapshot: &'a worktree::Snapshot, - path: &'a Path, + path: &'a RelPath, query: &'a SearchQuery, filter_tx: &'a Sender, output_tx: &'a Sender>, ) -> BoxFuture<'a, Result<()>> { async move { - let abs_path = snapshot.abs_path().join(path); + let abs_path = snapshot.absolutize(path); let Some(mut files) = fs .read_dir(&abs_path) .await @@ -771,21 +1024,21 @@ impl WorktreeStore { if metadata.is_symlink || metadata.is_fifo { continue; } - results.push(( - file.strip_prefix(snapshot.abs_path())?.to_path_buf(), - !metadata.is_dir, - )) + let relative_path = file.strip_prefix(snapshot.abs_path())?; + let relative_path = RelPath::new(&relative_path, snapshot.path_style()) + .context("getting relative path")?; + results.push((relative_path.into_arc(), !metadata.is_dir)) } results.sort_by(|(a_path, _), (b_path, _)| a_path.cmp(b_path)); for (path, is_file) in results { if is_file { if query.filters_path() { let matched_path = if query.match_full_paths() { - let mut full_path = PathBuf::from(snapshot.root_name()); - full_path.push(&path); + let mut full_path = snapshot.root_name().as_std_path().to_owned(); + full_path.push(path.as_std_path()); query.match_path(&full_path) } else { - query.match_path(&path) + query.match_path(&path.as_std_path()) }; if !matched_path { continue; @@ -796,10 +1049,10 @@ impl WorktreeStore { filter_tx .send(MatchingEntry { respond: tx, - worktree_path: snapshot.abs_path().clone(), + worktree_root: snapshot.abs_path().clone(), path: ProjectPath { worktree_id: snapshot.id(), - path: Arc::from(path), + path: path.into_arc(), }, }) .await?; @@ -844,11 +1097,11 @@ impl WorktreeStore { if query.filters_path() { let matched_path = if query.match_full_paths() { - let mut full_path = PathBuf::from(snapshot.root_name()); - full_path.push(&entry.path); + let mut full_path = snapshot.root_name().as_std_path().to_owned(); + full_path.push(entry.path.as_std_path()); query.match_path(&full_path) } else { - query.match_path(&entry.path) + query.match_path(entry.path.as_std_path()) }; if !matched_path { continue; @@ -867,7 +1120,7 @@ impl WorktreeStore { filter_tx .send(MatchingEntry { respond: tx, - worktree_path: snapshot.abs_path().clone(), + worktree_root: snapshot.abs_path().clone(), path: ProjectPath { worktree_id: snapshot.id(), path: entry.path.clone(), @@ -889,7 +1142,7 @@ impl WorktreeStore { ) -> Result<()> { let mut input = pin!(input); while let Some(mut entry) = input.next().await { - let abs_path = entry.worktree_path.join(&entry.path.path); + let abs_path = entry.worktree_root.join(entry.path.path.as_std_path()); let Some(file) = fs.open_sync(&abs_path).await.log_err() else { continue; }; @@ -935,11 +1188,26 @@ impl WorktreeStore { mut cx: AsyncApp, ) -> Result { let entry_id = ProjectEntryId::from_proto(envelope.payload.entry_id); - let worktree = this.update(&mut cx, |this, cx| { - this.worktree_for_entry(entry_id, cx) - .context("worktree not found") + let new_worktree_id = WorktreeId::from_proto(envelope.payload.new_worktree_id); + let new_project_path = ( + new_worktree_id, + RelPath::from_proto(&envelope.payload.new_path)?, + ); + let (scan_id, entry) = this.update(&mut cx, |this, cx| { + let new_worktree = this + .worktree_for_id(new_worktree_id, cx) + .context("no such worktree")?; + let scan_id = new_worktree.read(cx).scan_id(); + anyhow::Ok(( + scan_id, + this.copy_entry(entry_id, new_project_path.into(), cx), + )) })??; - Worktree::handle_copy_entry(worktree, envelope.payload, cx).await + let entry = entry.await?; + Ok(proto::ProjectEntryResponse { + entry: entry.as_ref().map(|entry| entry.into()), + worktree_scan_id: scan_id as u64, + }) } pub async fn handle_delete_project_entry( @@ -955,6 +1223,35 @@ impl WorktreeStore { Worktree::handle_delete_entry(worktree, envelope.payload, cx).await } + pub async fn handle_rename_project_entry( + this: Entity, + request: proto::RenameProjectEntry, + mut cx: AsyncApp, + ) -> Result { + let entry_id = ProjectEntryId::from_proto(request.entry_id); + let new_worktree_id = WorktreeId::from_proto(request.new_worktree_id); + let rel_path = RelPath::from_proto(&request.new_path) + .with_context(|| format!("received invalid relative path {:?}", &request.new_path))?; + + let (scan_id, task) = this.update(&mut cx, |this, cx| { + let worktree = this + .worktree_for_entry(entry_id, cx) + .context("no such worktree")?; + let scan_id = worktree.read(cx).scan_id(); + anyhow::Ok(( + scan_id, + this.rename_entry(entry_id, (new_worktree_id, rel_path).into(), cx), + )) + })??; + Ok(proto::ProjectEntryResponse { + entry: match &task.await? { + CreatedEntry::Included(entry) => Some(entry.into()), + CreatedEntry::Excluded { .. } => None, + }, + worktree_scan_id: scan_id as u64, + }) + } + pub async fn handle_expand_project_entry( this: Entity, envelope: TypedEnvelope, diff --git a/crates/project/src/yarn.rs b/crates/project/src/yarn.rs index b8174bbed00143ef12cc51e42f4676918b163a21..b270fe2df3585a125a8930722f2eb208c8983ce9 100644 --- a/crates/project/src/yarn.rs +++ b/crates/project/src/yarn.rs @@ -15,7 +15,7 @@ use anyhow::Result; use collections::HashMap; use fs::Fs; use gpui::{App, AppContext as _, Context, Entity, Task}; -use util::{ResultExt, archive::extract_zip}; +use util::{ResultExt, archive::extract_zip, paths::PathStyle, rel_path::RelPath}; pub(crate) struct YarnPathStore { temp_dirs: HashMap, tempfile::TempDir>, @@ -63,12 +63,13 @@ impl YarnPathStore { fs, }) } + pub(crate) fn process_path( &mut self, path: &Path, protocol: &str, cx: &Context, - ) -> Task, Arc)>> { + ) -> Task, Arc)>> { let mut is_zip = protocol.eq("zip"); let path: &Path = if let Some(non_zip_part) = path @@ -112,8 +113,9 @@ impl YarnPathStore { new_path }; // Rebase zip-path onto new temp path. - let as_relative = path.strip_prefix(zip_file).ok()?.into(); - Some((zip_root.into(), as_relative)) + let as_relative = + RelPath::new(path.strip_prefix(zip_file).ok()?, PathStyle::local()).ok()?; + Some((zip_root.into(), as_relative.into_arc())) }) } else { Task::ready(None) diff --git a/crates/project_panel/Cargo.toml b/crates/project_panel/Cargo.toml index 6ad3c4c2cd1d6f45180ba752d3ef357aa0c6c2ac..1597b60704daab06ef881b60dea8801c5d704af6 100644 --- a/crates/project_panel/Cargo.toml +++ b/crates/project_panel/Cargo.toml @@ -8,6 +8,10 @@ license = "GPL-3.0-or-later" [lints] workspace = true +[[bench]] +name = "sorting" +harness = false + [lib] path = "src/project_panel.rs" doctest = false @@ -20,7 +24,6 @@ db.workspace = true editor.workspace = true file_icons.workspace = true git_ui.workspace = true -indexmap.workspace = true git.workspace = true gpui.workspace = true menu.workspace = true @@ -29,11 +32,11 @@ project.workspace = true schemars.workspace = true search.workspace = true serde.workspace = true -serde_derive.workspace = true serde_json.workspace = true settings.workspace = true smallvec.workspace = true theme.workspace = true +rayon.workspace = true ui.workspace = true util.workspace = true client.workspace = true @@ -46,6 +49,7 @@ workspace-hack.workspace = true [dev-dependencies] client = { workspace = true, features = ["test-support"] } +criterion.workspace = true editor = { workspace = true, features = ["test-support"] } gpui = { workspace = true, features = ["test-support"] } language = { workspace = true, features = ["test-support"] } diff --git a/crates/project_panel/benches/linux_repo_snapshot.txt b/crates/project_panel/benches/linux_repo_snapshot.txt new file mode 100644 index 0000000000000000000000000000000000000000..98a525af8dfbb055bbe4737bc094ac67cb1cb5c9 --- /dev/null +++ b/crates/project_panel/benches/linux_repo_snapshot.txt @@ -0,0 +1,96349 @@ +d: +d:.git +d:.git/hooks +d:.git/info +d:.git/logs +d:.git/logs/refs +d:.git/logs/refs/heads +d:.git/logs/refs/remotes +d:.git/logs/refs/remotes/origin +d:.git/objects +d:.git/objects/info +d:.git/objects/pack +d:.git/refs +d:.git/refs/heads +d:.git/refs/remotes +d:.git/refs/remotes/origin +d:.git/refs/tags +d:Documentation +d:Documentation/ABI +d:Documentation/ABI/obsolete +d:Documentation/ABI/removed +d:Documentation/ABI/stable +d:Documentation/ABI/testing +d:Documentation/PCI +d:Documentation/PCI/controller +d:Documentation/PCI/endpoint +d:Documentation/PCI/endpoint/function +d:Documentation/PCI/endpoint/function/binding +d:Documentation/RCU +d:Documentation/RCU/Design +d:Documentation/RCU/Design/Data-Structures +d:Documentation/RCU/Design/Expedited-Grace-Periods +d:Documentation/RCU/Design/Memory-Ordering +d:Documentation/RCU/Design/Requirements +d:Documentation/accel +d:Documentation/accel/amdxdna +d:Documentation/accel/qaic +d:Documentation/accounting +d:Documentation/admin-guide +d:Documentation/admin-guide/LSM +d:Documentation/admin-guide/RAS +d:Documentation/admin-guide/acpi +d:Documentation/admin-guide/aoe +d:Documentation/admin-guide/auxdisplay +d:Documentation/admin-guide/blockdev +d:Documentation/admin-guide/blockdev/drbd +d:Documentation/admin-guide/cgroup-v1 +d:Documentation/admin-guide/cifs +d:Documentation/admin-guide/device-mapper +d:Documentation/admin-guide/gpio +d:Documentation/admin-guide/hw-vuln +d:Documentation/admin-guide/kdump +d:Documentation/admin-guide/laptops +d:Documentation/admin-guide/media +d:Documentation/admin-guide/mm +d:Documentation/admin-guide/mm/damon +d:Documentation/admin-guide/namespaces +d:Documentation/admin-guide/nfs +d:Documentation/admin-guide/perf +d:Documentation/admin-guide/pm +d:Documentation/admin-guide/sysctl +d:Documentation/admin-guide/thermal +d:Documentation/arch +d:Documentation/arch/arc +d:Documentation/arch/arm +d:Documentation/arch/arm/google +d:Documentation/arch/arm/keystone +d:Documentation/arch/arm/nwfpe +d:Documentation/arch/arm/omap +d:Documentation/arch/arm/pxa +d:Documentation/arch/arm/sa1100 +d:Documentation/arch/arm/samsung +d:Documentation/arch/arm/spear +d:Documentation/arch/arm/sti +d:Documentation/arch/arm/stm32 +d:Documentation/arch/arm/sunxi +d:Documentation/arch/arm/vfp +d:Documentation/arch/arm64 +d:Documentation/arch/loongarch +d:Documentation/arch/m68k +d:Documentation/arch/mips +d:Documentation/arch/nios2 +d:Documentation/arch/openrisc +d:Documentation/arch/parisc +d:Documentation/arch/powerpc +d:Documentation/arch/riscv +d:Documentation/arch/s390 +d:Documentation/arch/sh +d:Documentation/arch/sparc +d:Documentation/arch/sparc/oradax +d:Documentation/arch/x86 +d:Documentation/arch/x86/i386 +d:Documentation/arch/x86/x86_64 +d:Documentation/arch/xtensa +d:Documentation/block +d:Documentation/bpf +d:Documentation/bpf/libbpf +d:Documentation/bpf/standardization +d:Documentation/cdrom +d:Documentation/core-api +d:Documentation/core-api/irq +d:Documentation/core-api/kho +d:Documentation/core-api/kho/bindings +d:Documentation/core-api/kho/bindings/memblock +d:Documentation/core-api/wrappers +d:Documentation/cpu-freq +d:Documentation/crypto +d:Documentation/crypto/device_drivers +d:Documentation/dev-tools +d:Documentation/dev-tools/kunit +d:Documentation/dev-tools/kunit/api +d:Documentation/devicetree +d:Documentation/devicetree/bindings +d:Documentation/devicetree/bindings/access-controllers +d:Documentation/devicetree/bindings/arc +d:Documentation/devicetree/bindings/arm +d:Documentation/devicetree/bindings/arm/altera +d:Documentation/devicetree/bindings/arm/amlogic +d:Documentation/devicetree/bindings/arm/apple +d:Documentation/devicetree/bindings/arm/aspeed +d:Documentation/devicetree/bindings/arm/bcm +d:Documentation/devicetree/bindings/arm/calxeda +d:Documentation/devicetree/bindings/arm/cirrus +d:Documentation/devicetree/bindings/arm/cpu-enable-method +d:Documentation/devicetree/bindings/arm/firmware +d:Documentation/devicetree/bindings/arm/freescale +d:Documentation/devicetree/bindings/arm/hisilicon +d:Documentation/devicetree/bindings/arm/hisilicon/controller +d:Documentation/devicetree/bindings/arm/keystone +d:Documentation/devicetree/bindings/arm/marvell +d:Documentation/devicetree/bindings/arm/mediatek +d:Documentation/devicetree/bindings/arm/mrvl +d:Documentation/devicetree/bindings/arm/mstar +d:Documentation/devicetree/bindings/arm/nuvoton +d:Documentation/devicetree/bindings/arm/nxp +d:Documentation/devicetree/bindings/arm/omap +d:Documentation/devicetree/bindings/arm/rockchip +d:Documentation/devicetree/bindings/arm/samsung +d:Documentation/devicetree/bindings/arm/socionext +d:Documentation/devicetree/bindings/arm/sprd +d:Documentation/devicetree/bindings/arm/stm32 +d:Documentation/devicetree/bindings/arm/sunxi +d:Documentation/devicetree/bindings/arm/tegra +d:Documentation/devicetree/bindings/arm/ti +d:Documentation/devicetree/bindings/arm/ux500 +d:Documentation/devicetree/bindings/arm/vt8500 +d:Documentation/devicetree/bindings/ata +d:Documentation/devicetree/bindings/auxdisplay +d:Documentation/devicetree/bindings/board +d:Documentation/devicetree/bindings/bus +d:Documentation/devicetree/bindings/cache +d:Documentation/devicetree/bindings/chrome +d:Documentation/devicetree/bindings/clock +d:Documentation/devicetree/bindings/clock/sifive +d:Documentation/devicetree/bindings/clock/st +d:Documentation/devicetree/bindings/clock/ti +d:Documentation/devicetree/bindings/clock/ti/davinci +d:Documentation/devicetree/bindings/connector +d:Documentation/devicetree/bindings/counter +d:Documentation/devicetree/bindings/cpu +d:Documentation/devicetree/bindings/cpufreq +d:Documentation/devicetree/bindings/crypto +d:Documentation/devicetree/bindings/csky +d:Documentation/devicetree/bindings/devfreq +d:Documentation/devicetree/bindings/devfreq/event +d:Documentation/devicetree/bindings/display +d:Documentation/devicetree/bindings/display/armada +d:Documentation/devicetree/bindings/display/atmel +d:Documentation/devicetree/bindings/display/bridge +d:Documentation/devicetree/bindings/display/connector +d:Documentation/devicetree/bindings/display/hisilicon +d:Documentation/devicetree/bindings/display/imx +d:Documentation/devicetree/bindings/display/mediatek +d:Documentation/devicetree/bindings/display/msm +d:Documentation/devicetree/bindings/display/panel +d:Documentation/devicetree/bindings/display/rockchip +d:Documentation/devicetree/bindings/display/samsung +d:Documentation/devicetree/bindings/display/sprd +d:Documentation/devicetree/bindings/display/tegra +d:Documentation/devicetree/bindings/display/ti +d:Documentation/devicetree/bindings/display/tilcdc +d:Documentation/devicetree/bindings/display/xlnx +d:Documentation/devicetree/bindings/dma +d:Documentation/devicetree/bindings/dma/stm32 +d:Documentation/devicetree/bindings/dma/ti +d:Documentation/devicetree/bindings/dma/xilinx +d:Documentation/devicetree/bindings/dpll +d:Documentation/devicetree/bindings/dsp +d:Documentation/devicetree/bindings/dvfs +d:Documentation/devicetree/bindings/edac +d:Documentation/devicetree/bindings/eeprom +d:Documentation/devicetree/bindings/extcon +d:Documentation/devicetree/bindings/firmware +d:Documentation/devicetree/bindings/firmware/xilinx +d:Documentation/devicetree/bindings/fpga +d:Documentation/devicetree/bindings/fsi +d:Documentation/devicetree/bindings/fuse +d:Documentation/devicetree/bindings/gnss +d:Documentation/devicetree/bindings/goldfish +d:Documentation/devicetree/bindings/gpio +d:Documentation/devicetree/bindings/gpu +d:Documentation/devicetree/bindings/gpu/host1x +d:Documentation/devicetree/bindings/hsi +d:Documentation/devicetree/bindings/hwinfo +d:Documentation/devicetree/bindings/hwlock +d:Documentation/devicetree/bindings/hwmon +d:Documentation/devicetree/bindings/hwmon/pmbus +d:Documentation/devicetree/bindings/i2c +d:Documentation/devicetree/bindings/i3c +d:Documentation/devicetree/bindings/iio +d:Documentation/devicetree/bindings/iio/accel +d:Documentation/devicetree/bindings/iio/adc +d:Documentation/devicetree/bindings/iio/addac +d:Documentation/devicetree/bindings/iio/afe +d:Documentation/devicetree/bindings/iio/amplifiers +d:Documentation/devicetree/bindings/iio/cdc +d:Documentation/devicetree/bindings/iio/chemical +d:Documentation/devicetree/bindings/iio/dac +d:Documentation/devicetree/bindings/iio/filter +d:Documentation/devicetree/bindings/iio/frequency +d:Documentation/devicetree/bindings/iio/gyroscope +d:Documentation/devicetree/bindings/iio/health +d:Documentation/devicetree/bindings/iio/humidity +d:Documentation/devicetree/bindings/iio/impedance-analyzer +d:Documentation/devicetree/bindings/iio/imu +d:Documentation/devicetree/bindings/iio/light +d:Documentation/devicetree/bindings/iio/magnetometer +d:Documentation/devicetree/bindings/iio/multiplexer +d:Documentation/devicetree/bindings/iio/potentiometer +d:Documentation/devicetree/bindings/iio/potentiostat +d:Documentation/devicetree/bindings/iio/pressure +d:Documentation/devicetree/bindings/iio/proximity +d:Documentation/devicetree/bindings/iio/resolver +d:Documentation/devicetree/bindings/iio/temperature +d:Documentation/devicetree/bindings/infiniband +d:Documentation/devicetree/bindings/input +d:Documentation/devicetree/bindings/input/touchscreen +d:Documentation/devicetree/bindings/interconnect +d:Documentation/devicetree/bindings/interrupt-controller +d:Documentation/devicetree/bindings/iommu +d:Documentation/devicetree/bindings/ipmi +d:Documentation/devicetree/bindings/leds +d:Documentation/devicetree/bindings/leds/backlight +d:Documentation/devicetree/bindings/leds/irled +d:Documentation/devicetree/bindings/loongarch +d:Documentation/devicetree/bindings/mailbox +d:Documentation/devicetree/bindings/media +d:Documentation/devicetree/bindings/media/cec +d:Documentation/devicetree/bindings/media/i2c +d:Documentation/devicetree/bindings/media/spi +d:Documentation/devicetree/bindings/media/xilinx +d:Documentation/devicetree/bindings/memory-controllers +d:Documentation/devicetree/bindings/memory-controllers/ddr +d:Documentation/devicetree/bindings/memory-controllers/fsl +d:Documentation/devicetree/bindings/memory-controllers/ti +d:Documentation/devicetree/bindings/mfd +d:Documentation/devicetree/bindings/mips +d:Documentation/devicetree/bindings/mips/brcm +d:Documentation/devicetree/bindings/mips/cavium +d:Documentation/devicetree/bindings/mips/img +d:Documentation/devicetree/bindings/mips/ingenic +d:Documentation/devicetree/bindings/mips/lantiq +d:Documentation/devicetree/bindings/mips/loongson +d:Documentation/devicetree/bindings/mips/pic32 +d:Documentation/devicetree/bindings/misc +d:Documentation/devicetree/bindings/mmc +d:Documentation/devicetree/bindings/mtd +d:Documentation/devicetree/bindings/mtd/partitions +d:Documentation/devicetree/bindings/mux +d:Documentation/devicetree/bindings/net +d:Documentation/devicetree/bindings/net/bluetooth +d:Documentation/devicetree/bindings/net/can +d:Documentation/devicetree/bindings/net/dsa +d:Documentation/devicetree/bindings/net/ieee802154 +d:Documentation/devicetree/bindings/net/nfc +d:Documentation/devicetree/bindings/net/pcs +d:Documentation/devicetree/bindings/net/pse-pd +d:Documentation/devicetree/bindings/net/wireless +d:Documentation/devicetree/bindings/nios2 +d:Documentation/devicetree/bindings/nvme +d:Documentation/devicetree/bindings/nvmem +d:Documentation/devicetree/bindings/nvmem/layouts +d:Documentation/devicetree/bindings/openrisc +d:Documentation/devicetree/bindings/openrisc/opencores +d:Documentation/devicetree/bindings/opp +d:Documentation/devicetree/bindings/pci +d:Documentation/devicetree/bindings/peci +d:Documentation/devicetree/bindings/perf +d:Documentation/devicetree/bindings/phy +d:Documentation/devicetree/bindings/pinctrl +d:Documentation/devicetree/bindings/platform +d:Documentation/devicetree/bindings/pmem +d:Documentation/devicetree/bindings/power +d:Documentation/devicetree/bindings/power/avs +d:Documentation/devicetree/bindings/power/reset +d:Documentation/devicetree/bindings/power/supply +d:Documentation/devicetree/bindings/powerpc +d:Documentation/devicetree/bindings/powerpc/4xx +d:Documentation/devicetree/bindings/powerpc/fsl +d:Documentation/devicetree/bindings/powerpc/nintendo +d:Documentation/devicetree/bindings/powerpc/opal +d:Documentation/devicetree/bindings/pps +d:Documentation/devicetree/bindings/ptp +d:Documentation/devicetree/bindings/pwm +d:Documentation/devicetree/bindings/regmap +d:Documentation/devicetree/bindings/regulator +d:Documentation/devicetree/bindings/remoteproc +d:Documentation/devicetree/bindings/reserved-memory +d:Documentation/devicetree/bindings/reset +d:Documentation/devicetree/bindings/riscv +d:Documentation/devicetree/bindings/rng +d:Documentation/devicetree/bindings/rtc +d:Documentation/devicetree/bindings/scsi +d:Documentation/devicetree/bindings/serial +d:Documentation/devicetree/bindings/serio +d:Documentation/devicetree/bindings/sifive +d:Documentation/devicetree/bindings/siox +d:Documentation/devicetree/bindings/slimbus +d:Documentation/devicetree/bindings/soc +d:Documentation/devicetree/bindings/soc/altera +d:Documentation/devicetree/bindings/soc/amlogic +d:Documentation/devicetree/bindings/soc/aspeed +d:Documentation/devicetree/bindings/soc/bcm +d:Documentation/devicetree/bindings/soc/cirrus +d:Documentation/devicetree/bindings/soc/dove +d:Documentation/devicetree/bindings/soc/fsl +d:Documentation/devicetree/bindings/soc/fsl/cpm_qe +d:Documentation/devicetree/bindings/soc/fsl/cpm_qe/cpm +d:Documentation/devicetree/bindings/soc/fsl/cpm_qe/qe +d:Documentation/devicetree/bindings/soc/google +d:Documentation/devicetree/bindings/soc/hisilicon +d:Documentation/devicetree/bindings/soc/imx +d:Documentation/devicetree/bindings/soc/intel +d:Documentation/devicetree/bindings/soc/litex +d:Documentation/devicetree/bindings/soc/loongson +d:Documentation/devicetree/bindings/soc/mediatek +d:Documentation/devicetree/bindings/soc/microchip +d:Documentation/devicetree/bindings/soc/mobileye +d:Documentation/devicetree/bindings/soc/nuvoton +d:Documentation/devicetree/bindings/soc/qcom +d:Documentation/devicetree/bindings/soc/renesas +d:Documentation/devicetree/bindings/soc/rockchip +d:Documentation/devicetree/bindings/soc/samsung +d:Documentation/devicetree/bindings/soc/socionext +d:Documentation/devicetree/bindings/soc/sophgo +d:Documentation/devicetree/bindings/soc/spacemit +d:Documentation/devicetree/bindings/soc/sprd +d:Documentation/devicetree/bindings/soc/starfive +d:Documentation/devicetree/bindings/soc/sti +d:Documentation/devicetree/bindings/soc/tegra +d:Documentation/devicetree/bindings/soc/ti +d:Documentation/devicetree/bindings/soc/xilinx +d:Documentation/devicetree/bindings/sound +d:Documentation/devicetree/bindings/soundwire +d:Documentation/devicetree/bindings/spi +d:Documentation/devicetree/bindings/spmi +d:Documentation/devicetree/bindings/sram +d:Documentation/devicetree/bindings/thermal +d:Documentation/devicetree/bindings/timer +d:Documentation/devicetree/bindings/timestamp +d:Documentation/devicetree/bindings/tpm +d:Documentation/devicetree/bindings/trigger-source +d:Documentation/devicetree/bindings/ufs +d:Documentation/devicetree/bindings/usb +d:Documentation/devicetree/bindings/virtio +d:Documentation/devicetree/bindings/w1 +d:Documentation/devicetree/bindings/watchdog +d:Documentation/devicetree/bindings/x86 +d:Documentation/devicetree/bindings/xillybus +d:Documentation/doc-guide +d:Documentation/driver-api +d:Documentation/driver-api/80211 +d:Documentation/driver-api/acpi +d:Documentation/driver-api/backlight +d:Documentation/driver-api/coco +d:Documentation/driver-api/crypto +d:Documentation/driver-api/crypto/iaa +d:Documentation/driver-api/cxl +d:Documentation/driver-api/cxl/allocation +d:Documentation/driver-api/cxl/devices +d:Documentation/driver-api/cxl/linux +d:Documentation/driver-api/cxl/linux/example-configurations +d:Documentation/driver-api/cxl/platform +d:Documentation/driver-api/cxl/platform/acpi +d:Documentation/driver-api/cxl/platform/example-configurations +d:Documentation/driver-api/dmaengine +d:Documentation/driver-api/driver-model +d:Documentation/driver-api/early-userspace +d:Documentation/driver-api/firmware +d:Documentation/driver-api/firmware/efi +d:Documentation/driver-api/fpga +d:Documentation/driver-api/gpio +d:Documentation/driver-api/hte +d:Documentation/driver-api/i3c +d:Documentation/driver-api/iio +d:Documentation/driver-api/md +d:Documentation/driver-api/media +d:Documentation/driver-api/media/drivers +d:Documentation/driver-api/media/drivers/ccs +d:Documentation/driver-api/mei +d:Documentation/driver-api/memory-devices +d:Documentation/driver-api/mmc +d:Documentation/driver-api/mtd +d:Documentation/driver-api/nfc +d:Documentation/driver-api/nvdimm +d:Documentation/driver-api/pci +d:Documentation/driver-api/phy +d:Documentation/driver-api/pldmfw +d:Documentation/driver-api/pm +d:Documentation/driver-api/rapidio +d:Documentation/driver-api/serial +d:Documentation/driver-api/soundwire +d:Documentation/driver-api/surface_aggregator +d:Documentation/driver-api/surface_aggregator/clients +d:Documentation/driver-api/thermal +d:Documentation/driver-api/tty +d:Documentation/driver-api/usb +d:Documentation/driver-api/virtio +d:Documentation/driver-api/xilinx +d:Documentation/edac +d:Documentation/fault-injection +d:Documentation/fb +d:Documentation/features +d:Documentation/features/core +d:Documentation/features/core/cBPF-JIT +d:Documentation/features/core/eBPF-JIT +d:Documentation/features/core/generic-idle-thread +d:Documentation/features/core/jump-labels +d:Documentation/features/core/mseal_sys_mappings +d:Documentation/features/core/thread-info-in-task +d:Documentation/features/core/tracehook +d:Documentation/features/debug +d:Documentation/features/debug/KASAN +d:Documentation/features/debug/debug-vm-pgtable +d:Documentation/features/debug/gcov-profile-all +d:Documentation/features/debug/kcov +d:Documentation/features/debug/kgdb +d:Documentation/features/debug/kmemleak +d:Documentation/features/debug/kprobes +d:Documentation/features/debug/kprobes-on-ftrace +d:Documentation/features/debug/kretprobes +d:Documentation/features/debug/optprobes +d:Documentation/features/debug/stackprotector +d:Documentation/features/debug/uprobes +d:Documentation/features/debug/user-ret-profiler +d:Documentation/features/io +d:Documentation/features/io/dma-contiguous +d:Documentation/features/locking +d:Documentation/features/locking/cmpxchg-local +d:Documentation/features/locking/lockdep +d:Documentation/features/locking/queued-rwlocks +d:Documentation/features/locking/queued-spinlocks +d:Documentation/features/perf +d:Documentation/features/perf/kprobes-event +d:Documentation/features/perf/perf-regs +d:Documentation/features/perf/perf-stackdump +d:Documentation/features/sched +d:Documentation/features/sched/membarrier-sync-core +d:Documentation/features/sched/numa-balancing +d:Documentation/features/scripts +d:Documentation/features/seccomp +d:Documentation/features/seccomp/seccomp-filter +d:Documentation/features/time +d:Documentation/features/time/arch-tick-broadcast +d:Documentation/features/time/clockevents +d:Documentation/features/time/context-tracking +d:Documentation/features/time/irq-time-acct +d:Documentation/features/time/virt-cpuacct +d:Documentation/features/vm +d:Documentation/features/vm/ELF-ASLR +d:Documentation/features/vm/THP +d:Documentation/features/vm/TLB +d:Documentation/features/vm/huge-vmap +d:Documentation/features/vm/ioremap_prot +d:Documentation/features/vm/pte_special +d:Documentation/filesystems +d:Documentation/filesystems/bcachefs +d:Documentation/filesystems/bcachefs/future +d:Documentation/filesystems/caching +d:Documentation/filesystems/ext4 +d:Documentation/filesystems/iomap +d:Documentation/filesystems/nfs +d:Documentation/filesystems/smb +d:Documentation/filesystems/spufs +d:Documentation/filesystems/xfs +d:Documentation/firmware-guide +d:Documentation/firmware-guide/acpi +d:Documentation/firmware-guide/acpi/apei +d:Documentation/firmware-guide/acpi/dsd +d:Documentation/firmware_class +d:Documentation/fpga +d:Documentation/gpu +d:Documentation/gpu/amdgpu +d:Documentation/gpu/amdgpu/display +d:Documentation/gpu/amdgpu/gc +d:Documentation/gpu/bridge +d:Documentation/gpu/dp-mst +d:Documentation/gpu/imagination +d:Documentation/gpu/nova +d:Documentation/gpu/nova/core +d:Documentation/gpu/rfc +d:Documentation/gpu/xe +d:Documentation/hid +d:Documentation/hwmon +d:Documentation/i2c +d:Documentation/i2c/busses +d:Documentation/i2c/muxes +d:Documentation/iio +d:Documentation/images +d:Documentation/infiniband +d:Documentation/input +d:Documentation/input/devices +d:Documentation/input/joydev +d:Documentation/isdn +d:Documentation/kbuild +d:Documentation/kernel-hacking +d:Documentation/leds +d:Documentation/litmus-tests +d:Documentation/litmus-tests/atomic +d:Documentation/litmus-tests/locking +d:Documentation/litmus-tests/rcu +d:Documentation/livepatch +d:Documentation/locking +d:Documentation/maintainer +d:Documentation/mhi +d:Documentation/misc-devices +d:Documentation/mm +d:Documentation/mm/damon +d:Documentation/netlabel +d:Documentation/netlink +d:Documentation/netlink/specs +d:Documentation/networking +d:Documentation/networking/caif +d:Documentation/networking/device_drivers +d:Documentation/networking/device_drivers/atm +d:Documentation/networking/device_drivers/can +d:Documentation/networking/device_drivers/can/ctu +d:Documentation/networking/device_drivers/can/freescale +d:Documentation/networking/device_drivers/cellular +d:Documentation/networking/device_drivers/cellular/qualcomm +d:Documentation/networking/device_drivers/ethernet +d:Documentation/networking/device_drivers/ethernet/3com +d:Documentation/networking/device_drivers/ethernet/altera +d:Documentation/networking/device_drivers/ethernet/amazon +d:Documentation/networking/device_drivers/ethernet/amd +d:Documentation/networking/device_drivers/ethernet/aquantia +d:Documentation/networking/device_drivers/ethernet/chelsio +d:Documentation/networking/device_drivers/ethernet/cirrus +d:Documentation/networking/device_drivers/ethernet/davicom +d:Documentation/networking/device_drivers/ethernet/dec +d:Documentation/networking/device_drivers/ethernet/dlink +d:Documentation/networking/device_drivers/ethernet/freescale +d:Documentation/networking/device_drivers/ethernet/freescale/dpaa2 +d:Documentation/networking/device_drivers/ethernet/google +d:Documentation/networking/device_drivers/ethernet/huawei +d:Documentation/networking/device_drivers/ethernet/intel +d:Documentation/networking/device_drivers/ethernet/marvell +d:Documentation/networking/device_drivers/ethernet/mellanox +d:Documentation/networking/device_drivers/ethernet/mellanox/mlx5 +d:Documentation/networking/device_drivers/ethernet/meta +d:Documentation/networking/device_drivers/ethernet/microsoft +d:Documentation/networking/device_drivers/ethernet/neterion +d:Documentation/networking/device_drivers/ethernet/netronome +d:Documentation/networking/device_drivers/ethernet/pensando +d:Documentation/networking/device_drivers/ethernet/smsc +d:Documentation/networking/device_drivers/ethernet/stmicro +d:Documentation/networking/device_drivers/ethernet/ti +d:Documentation/networking/device_drivers/ethernet/wangxun +d:Documentation/networking/device_drivers/fddi +d:Documentation/networking/device_drivers/hamradio +d:Documentation/networking/device_drivers/wifi +d:Documentation/networking/device_drivers/wifi/intel +d:Documentation/networking/device_drivers/wwan +d:Documentation/networking/devlink +d:Documentation/networking/diagnostic +d:Documentation/networking/dsa +d:Documentation/networking/mac80211_hwsim +d:Documentation/networking/net_cachelines +d:Documentation/networking/netlink_spec +d:Documentation/networking/pse-pd +d:Documentation/nvdimm +d:Documentation/nvme +d:Documentation/pcmcia +d:Documentation/peci +d:Documentation/power +d:Documentation/power/powercap +d:Documentation/power/regulator +d:Documentation/process +d:Documentation/process/debugging +d:Documentation/rust +d:Documentation/scheduler +d:Documentation/scsi +d:Documentation/scsi/scsi_transport_srp +d:Documentation/security +d:Documentation/security/keys +d:Documentation/security/secrets +d:Documentation/security/tpm +d:Documentation/sound +d:Documentation/sound/cards +d:Documentation/sound/codecs +d:Documentation/sound/designs +d:Documentation/sound/hd-audio +d:Documentation/sound/kernel-api +d:Documentation/sound/soc +d:Documentation/sphinx +d:Documentation/sphinx-static +d:Documentation/sphinx/templates +d:Documentation/spi +d:Documentation/staging +d:Documentation/sunrpc +d:Documentation/sunrpc/xdr +d:Documentation/target +d:Documentation/tee +d:Documentation/timers +d:Documentation/tools +d:Documentation/tools/rtla +d:Documentation/tools/rv +d:Documentation/trace +d:Documentation/trace/coresight +d:Documentation/trace/postprocess +d:Documentation/trace/rv +d:Documentation/translations +d:Documentation/translations/it_IT +d:Documentation/translations/it_IT/RCU +d:Documentation/translations/it_IT/admin-guide +d:Documentation/translations/it_IT/arch +d:Documentation/translations/it_IT/arch/riscv +d:Documentation/translations/it_IT/core-api +d:Documentation/translations/it_IT/dev-tools +d:Documentation/translations/it_IT/devicetree +d:Documentation/translations/it_IT/devicetree/bindings +d:Documentation/translations/it_IT/doc-guide +d:Documentation/translations/it_IT/i2c +d:Documentation/translations/it_IT/kernel-hacking +d:Documentation/translations/it_IT/locking +d:Documentation/translations/it_IT/maintainer +d:Documentation/translations/it_IT/process +d:Documentation/translations/it_IT/staging +d:Documentation/translations/ja_JP +d:Documentation/translations/ja_JP/process +d:Documentation/translations/ko_KR +d:Documentation/translations/ko_KR/core-api +d:Documentation/translations/ko_KR/core-api/wrappers +d:Documentation/translations/ko_KR/process +d:Documentation/translations/sp_SP +d:Documentation/translations/sp_SP/process +d:Documentation/translations/sp_SP/scheduler +d:Documentation/translations/sp_SP/wrappers +d:Documentation/translations/zh_CN +d:Documentation/translations/zh_CN/PCI +d:Documentation/translations/zh_CN/accounting +d:Documentation/translations/zh_CN/admin-guide +d:Documentation/translations/zh_CN/admin-guide/mm +d:Documentation/translations/zh_CN/admin-guide/mm/damon +d:Documentation/translations/zh_CN/arch +d:Documentation/translations/zh_CN/arch/arm +d:Documentation/translations/zh_CN/arch/arm64 +d:Documentation/translations/zh_CN/arch/loongarch +d:Documentation/translations/zh_CN/arch/mips +d:Documentation/translations/zh_CN/arch/openrisc +d:Documentation/translations/zh_CN/arch/parisc +d:Documentation/translations/zh_CN/arch/riscv +d:Documentation/translations/zh_CN/core-api +d:Documentation/translations/zh_CN/core-api/irq +d:Documentation/translations/zh_CN/cpu-freq +d:Documentation/translations/zh_CN/dev-tools +d:Documentation/translations/zh_CN/devicetree +d:Documentation/translations/zh_CN/doc-guide +d:Documentation/translations/zh_CN/driver-api +d:Documentation/translations/zh_CN/driver-api/gpio +d:Documentation/translations/zh_CN/driver-api/phy +d:Documentation/translations/zh_CN/filesystems +d:Documentation/translations/zh_CN/iio +d:Documentation/translations/zh_CN/infiniband +d:Documentation/translations/zh_CN/kbuild +d:Documentation/translations/zh_CN/kernel-hacking +d:Documentation/translations/zh_CN/locking +d:Documentation/translations/zh_CN/maintainer +d:Documentation/translations/zh_CN/mm +d:Documentation/translations/zh_CN/mm/damon +d:Documentation/translations/zh_CN/networking +d:Documentation/translations/zh_CN/peci +d:Documentation/translations/zh_CN/power +d:Documentation/translations/zh_CN/process +d:Documentation/translations/zh_CN/rust +d:Documentation/translations/zh_CN/scheduler +d:Documentation/translations/zh_CN/security +d:Documentation/translations/zh_CN/security/keys +d:Documentation/translations/zh_CN/security/secrets +d:Documentation/translations/zh_CN/security/tpm +d:Documentation/translations/zh_CN/sound +d:Documentation/translations/zh_CN/sound/hd-audio +d:Documentation/translations/zh_CN/staging +d:Documentation/translations/zh_CN/userspace-api +d:Documentation/translations/zh_CN/userspace-api/accelerators +d:Documentation/translations/zh_CN/userspace-api/ebpf +d:Documentation/translations/zh_CN/video4linux +d:Documentation/translations/zh_CN/virt +d:Documentation/translations/zh_CN/virt/acrn +d:Documentation/translations/zh_TW +d:Documentation/translations/zh_TW/admin-guide +d:Documentation/translations/zh_TW/admin-guide/mm +d:Documentation/translations/zh_TW/admin-guide/mm/damon +d:Documentation/translations/zh_TW/arch +d:Documentation/translations/zh_TW/arch/arm +d:Documentation/translations/zh_TW/arch/arm64 +d:Documentation/translations/zh_TW/arch/loongarch +d:Documentation/translations/zh_TW/arch/mips +d:Documentation/translations/zh_TW/arch/openrisc +d:Documentation/translations/zh_TW/arch/parisc +d:Documentation/translations/zh_TW/cpu-freq +d:Documentation/translations/zh_TW/dev-tools +d:Documentation/translations/zh_TW/filesystems +d:Documentation/translations/zh_TW/process +d:Documentation/usb +d:Documentation/userspace-api +d:Documentation/userspace-api/accelerators +d:Documentation/userspace-api/ebpf +d:Documentation/userspace-api/fwctl +d:Documentation/userspace-api/gpio +d:Documentation/userspace-api/ioctl +d:Documentation/userspace-api/media +d:Documentation/userspace-api/media/cec +d:Documentation/userspace-api/media/drivers +d:Documentation/userspace-api/media/dvb +d:Documentation/userspace-api/media/mediactl +d:Documentation/userspace-api/media/rc +d:Documentation/userspace-api/media/v4l +d:Documentation/userspace-api/netlink +d:Documentation/virt +d:Documentation/virt/acrn +d:Documentation/virt/coco +d:Documentation/virt/hyperv +d:Documentation/virt/kvm +d:Documentation/virt/kvm/arm +d:Documentation/virt/kvm/devices +d:Documentation/virt/kvm/loongarch +d:Documentation/virt/kvm/s390 +d:Documentation/virt/kvm/x86 +d:Documentation/virt/uml +d:Documentation/w1 +d:Documentation/w1/masters +d:Documentation/w1/slaves +d:Documentation/watchdog +d:Documentation/wmi +d:Documentation/wmi/devices +d:LICENSES +d:LICENSES/deprecated +d:LICENSES/dual +d:LICENSES/exceptions +d:LICENSES/preferred +d:arch +d:arch/alpha +d:arch/alpha/boot +d:arch/alpha/boot/tools +d:arch/alpha/configs +d:arch/alpha/include +d:arch/alpha/include/asm +d:arch/alpha/include/uapi +d:arch/alpha/include/uapi/asm +d:arch/alpha/kernel +d:arch/alpha/kernel/syscalls +d:arch/alpha/lib +d:arch/alpha/math-emu +d:arch/alpha/mm +d:arch/arc +d:arch/arc/boot +d:arch/arc/boot/dts +d:arch/arc/configs +d:arch/arc/include +d:arch/arc/include/asm +d:arch/arc/include/uapi +d:arch/arc/include/uapi/asm +d:arch/arc/kernel +d:arch/arc/lib +d:arch/arc/mm +d:arch/arc/net +d:arch/arc/plat-axs10x +d:arch/arc/plat-hsdk +d:arch/arc/plat-sim +d:arch/arc/plat-tb10x +d:arch/arm +d:arch/arm/boot +d:arch/arm/boot/bootp +d:arch/arm/boot/compressed +d:arch/arm/boot/dts +d:arch/arm/boot/dts/actions +d:arch/arm/boot/dts/airoha +d:arch/arm/boot/dts/allwinner +d:arch/arm/boot/dts/alphascale +d:arch/arm/boot/dts/amazon +d:arch/arm/boot/dts/amlogic +d:arch/arm/boot/dts/arm +d:arch/arm/boot/dts/aspeed +d:arch/arm/boot/dts/axis +d:arch/arm/boot/dts/broadcom +d:arch/arm/boot/dts/calxeda +d:arch/arm/boot/dts/cirrus +d:arch/arm/boot/dts/cnxt +d:arch/arm/boot/dts/gemini +d:arch/arm/boot/dts/hisilicon +d:arch/arm/boot/dts/hpe +d:arch/arm/boot/dts/intel +d:arch/arm/boot/dts/intel/axm +d:arch/arm/boot/dts/intel/ixp +d:arch/arm/boot/dts/intel/pxa +d:arch/arm/boot/dts/intel/socfpga +d:arch/arm/boot/dts/marvell +d:arch/arm/boot/dts/mediatek +d:arch/arm/boot/dts/microchip +d:arch/arm/boot/dts/moxa +d:arch/arm/boot/dts/nspire +d:arch/arm/boot/dts/nuvoton +d:arch/arm/boot/dts/nvidia +d:arch/arm/boot/dts/nxp +d:arch/arm/boot/dts/nxp/imx +d:arch/arm/boot/dts/nxp/lpc +d:arch/arm/boot/dts/nxp/ls +d:arch/arm/boot/dts/nxp/mxs +d:arch/arm/boot/dts/nxp/vf +d:arch/arm/boot/dts/qcom +d:arch/arm/boot/dts/realtek +d:arch/arm/boot/dts/renesas +d:arch/arm/boot/dts/rockchip +d:arch/arm/boot/dts/samsung +d:arch/arm/boot/dts/sigmastar +d:arch/arm/boot/dts/socionext +d:arch/arm/boot/dts/st +d:arch/arm/boot/dts/sunplus +d:arch/arm/boot/dts/synaptics +d:arch/arm/boot/dts/ti +d:arch/arm/boot/dts/ti/davinci +d:arch/arm/boot/dts/ti/keystone +d:arch/arm/boot/dts/ti/omap +d:arch/arm/boot/dts/unisoc +d:arch/arm/boot/dts/vt8500 +d:arch/arm/boot/dts/xen +d:arch/arm/boot/dts/xilinx +d:arch/arm/common +d:arch/arm/configs +d:arch/arm/crypto +d:arch/arm/include +d:arch/arm/include/asm +d:arch/arm/include/asm/hardware +d:arch/arm/include/asm/mach +d:arch/arm/include/asm/vdso +d:arch/arm/include/asm/xen +d:arch/arm/include/debug +d:arch/arm/include/uapi +d:arch/arm/include/uapi/asm +d:arch/arm/kernel +d:arch/arm/lib +d:arch/arm/mach-actions +d:arch/arm/mach-alpine +d:arch/arm/mach-artpec +d:arch/arm/mach-aspeed +d:arch/arm/mach-at91 +d:arch/arm/mach-axxia +d:arch/arm/mach-bcm +d:arch/arm/mach-berlin +d:arch/arm/mach-clps711x +d:arch/arm/mach-davinci +d:arch/arm/mach-digicolor +d:arch/arm/mach-dove +d:arch/arm/mach-ep93xx +d:arch/arm/mach-exynos +d:arch/arm/mach-footbridge +d:arch/arm/mach-footbridge/include +d:arch/arm/mach-footbridge/include/mach +d:arch/arm/mach-gemini +d:arch/arm/mach-highbank +d:arch/arm/mach-hisi +d:arch/arm/mach-hpe +d:arch/arm/mach-imx +d:arch/arm/mach-ixp4xx +d:arch/arm/mach-keystone +d:arch/arm/mach-lpc18xx +d:arch/arm/mach-lpc32xx +d:arch/arm/mach-mediatek +d:arch/arm/mach-meson +d:arch/arm/mach-milbeaut +d:arch/arm/mach-mmp +d:arch/arm/mach-mstar +d:arch/arm/mach-mv78xx0 +d:arch/arm/mach-mvebu +d:arch/arm/mach-mxs +d:arch/arm/mach-nomadik +d:arch/arm/mach-npcm +d:arch/arm/mach-omap1 +d:arch/arm/mach-omap2 +d:arch/arm/mach-orion5x +d:arch/arm/mach-pxa +d:arch/arm/mach-qcom +d:arch/arm/mach-realtek +d:arch/arm/mach-rockchip +d:arch/arm/mach-rpc +d:arch/arm/mach-rpc/include +d:arch/arm/mach-rpc/include/mach +d:arch/arm/mach-s3c +d:arch/arm/mach-s5pv210 +d:arch/arm/mach-sa1100 +d:arch/arm/mach-sa1100/include +d:arch/arm/mach-sa1100/include/mach +d:arch/arm/mach-shmobile +d:arch/arm/mach-socfpga +d:arch/arm/mach-spear +d:arch/arm/mach-sti +d:arch/arm/mach-stm32 +d:arch/arm/mach-sunxi +d:arch/arm/mach-tegra +d:arch/arm/mach-ux500 +d:arch/arm/mach-versatile +d:arch/arm/mach-vt8500 +d:arch/arm/mach-zynq +d:arch/arm/mm +d:arch/arm/net +d:arch/arm/nwfpe +d:arch/arm/plat-orion +d:arch/arm/plat-orion/include +d:arch/arm/plat-orion/include/plat +d:arch/arm/probes +d:arch/arm/probes/kprobes +d:arch/arm/probes/uprobes +d:arch/arm/tools +d:arch/arm/vdso +d:arch/arm/vfp +d:arch/arm/xen +d:arch/arm64 +d:arch/arm64/boot +d:arch/arm64/boot/dts +d:arch/arm64/boot/dts/actions +d:arch/arm64/boot/dts/airoha +d:arch/arm64/boot/dts/allwinner +d:arch/arm64/boot/dts/altera +d:arch/arm64/boot/dts/amazon +d:arch/arm64/boot/dts/amd +d:arch/arm64/boot/dts/amlogic +d:arch/arm64/boot/dts/apm +d:arch/arm64/boot/dts/apple +d:arch/arm64/boot/dts/arm +d:arch/arm64/boot/dts/axiado +d:arch/arm64/boot/dts/bitmain +d:arch/arm64/boot/dts/blaize +d:arch/arm64/boot/dts/broadcom +d:arch/arm64/boot/dts/broadcom/bcmbca +d:arch/arm64/boot/dts/broadcom/northstar2 +d:arch/arm64/boot/dts/broadcom/stingray +d:arch/arm64/boot/dts/cavium +d:arch/arm64/boot/dts/cix +d:arch/arm64/boot/dts/exynos +d:arch/arm64/boot/dts/exynos/google +d:arch/arm64/boot/dts/freescale +d:arch/arm64/boot/dts/hisilicon +d:arch/arm64/boot/dts/intel +d:arch/arm64/boot/dts/lg +d:arch/arm64/boot/dts/marvell +d:arch/arm64/boot/dts/marvell/mmp +d:arch/arm64/boot/dts/mediatek +d:arch/arm64/boot/dts/microchip +d:arch/arm64/boot/dts/nuvoton +d:arch/arm64/boot/dts/nvidia +d:arch/arm64/boot/dts/qcom +d:arch/arm64/boot/dts/realtek +d:arch/arm64/boot/dts/renesas +d:arch/arm64/boot/dts/rockchip +d:arch/arm64/boot/dts/socionext +d:arch/arm64/boot/dts/sophgo +d:arch/arm64/boot/dts/sprd +d:arch/arm64/boot/dts/st +d:arch/arm64/boot/dts/synaptics +d:arch/arm64/boot/dts/tesla +d:arch/arm64/boot/dts/ti +d:arch/arm64/boot/dts/toshiba +d:arch/arm64/boot/dts/xilinx +d:arch/arm64/configs +d:arch/arm64/crypto +d:arch/arm64/hyperv +d:arch/arm64/include +d:arch/arm64/include/asm +d:arch/arm64/include/asm/stacktrace +d:arch/arm64/include/asm/vdso +d:arch/arm64/include/asm/xen +d:arch/arm64/include/uapi +d:arch/arm64/include/uapi/asm +d:arch/arm64/kernel +d:arch/arm64/kernel/pi +d:arch/arm64/kernel/probes +d:arch/arm64/kernel/vdso +d:arch/arm64/kernel/vdso32 +d:arch/arm64/kvm +d:arch/arm64/kvm/hyp +d:arch/arm64/kvm/hyp/include +d:arch/arm64/kvm/hyp/include/hyp +d:arch/arm64/kvm/hyp/include/nvhe +d:arch/arm64/kvm/hyp/nvhe +d:arch/arm64/kvm/hyp/vhe +d:arch/arm64/kvm/vgic +d:arch/arm64/lib +d:arch/arm64/mm +d:arch/arm64/net +d:arch/arm64/tools +d:arch/arm64/xen +d:arch/csky +d:arch/csky/abiv1 +d:arch/csky/abiv1/inc +d:arch/csky/abiv1/inc/abi +d:arch/csky/abiv2 +d:arch/csky/abiv2/inc +d:arch/csky/abiv2/inc/abi +d:arch/csky/boot +d:arch/csky/boot/dts +d:arch/csky/configs +d:arch/csky/include +d:arch/csky/include/asm +d:arch/csky/include/uapi +d:arch/csky/include/uapi/asm +d:arch/csky/kernel +d:arch/csky/kernel/probes +d:arch/csky/kernel/vdso +d:arch/csky/lib +d:arch/csky/mm +d:arch/hexagon +d:arch/hexagon/configs +d:arch/hexagon/include +d:arch/hexagon/include/asm +d:arch/hexagon/include/uapi +d:arch/hexagon/include/uapi/asm +d:arch/hexagon/kernel +d:arch/hexagon/lib +d:arch/hexagon/mm +d:arch/loongarch +d:arch/loongarch/boot +d:arch/loongarch/boot/dts +d:arch/loongarch/configs +d:arch/loongarch/crypto +d:arch/loongarch/include +d:arch/loongarch/include/asm +d:arch/loongarch/include/asm/vdso +d:arch/loongarch/include/uapi +d:arch/loongarch/include/uapi/asm +d:arch/loongarch/kernel +d:arch/loongarch/kvm +d:arch/loongarch/kvm/intc +d:arch/loongarch/lib +d:arch/loongarch/mm +d:arch/loongarch/net +d:arch/loongarch/pci +d:arch/loongarch/power +d:arch/loongarch/vdso +d:arch/m68k +d:arch/m68k/68000 +d:arch/m68k/amiga +d:arch/m68k/apollo +d:arch/m68k/atari +d:arch/m68k/bvme6000 +d:arch/m68k/coldfire +d:arch/m68k/configs +d:arch/m68k/emu +d:arch/m68k/fpsp040 +d:arch/m68k/hp300 +d:arch/m68k/ifpsp060 +d:arch/m68k/ifpsp060/src +d:arch/m68k/include +d:arch/m68k/include/asm +d:arch/m68k/include/uapi +d:arch/m68k/include/uapi/asm +d:arch/m68k/kernel +d:arch/m68k/kernel/syscalls +d:arch/m68k/lib +d:arch/m68k/mac +d:arch/m68k/math-emu +d:arch/m68k/mm +d:arch/m68k/mvme147 +d:arch/m68k/mvme16x +d:arch/m68k/q40 +d:arch/m68k/sun3 +d:arch/m68k/sun3/prom +d:arch/m68k/sun3x +d:arch/m68k/tools +d:arch/m68k/tools/amiga +d:arch/m68k/virt +d:arch/microblaze +d:arch/microblaze/boot +d:arch/microblaze/boot/dts +d:arch/microblaze/configs +d:arch/microblaze/include +d:arch/microblaze/include/asm +d:arch/microblaze/include/uapi +d:arch/microblaze/include/uapi/asm +d:arch/microblaze/kernel +d:arch/microblaze/kernel/cpu +d:arch/microblaze/kernel/syscalls +d:arch/microblaze/lib +d:arch/microblaze/mm +d:arch/microblaze/pci +d:arch/mips +d:arch/mips/alchemy +d:arch/mips/alchemy/common +d:arch/mips/alchemy/devboards +d:arch/mips/ath25 +d:arch/mips/ath79 +d:arch/mips/bcm47xx +d:arch/mips/bcm63xx +d:arch/mips/bcm63xx/boards +d:arch/mips/bmips +d:arch/mips/boot +d:arch/mips/boot/compressed +d:arch/mips/boot/dts +d:arch/mips/boot/dts/brcm +d:arch/mips/boot/dts/cavium-octeon +d:arch/mips/boot/dts/econet +d:arch/mips/boot/dts/img +d:arch/mips/boot/dts/ingenic +d:arch/mips/boot/dts/lantiq +d:arch/mips/boot/dts/loongson +d:arch/mips/boot/dts/mobileye +d:arch/mips/boot/dts/mscc +d:arch/mips/boot/dts/mti +d:arch/mips/boot/dts/ni +d:arch/mips/boot/dts/pic32 +d:arch/mips/boot/dts/qca +d:arch/mips/boot/dts/ralink +d:arch/mips/boot/dts/realtek +d:arch/mips/boot/dts/xilfpga +d:arch/mips/boot/tools +d:arch/mips/cavium-octeon +d:arch/mips/cavium-octeon/crypto +d:arch/mips/cavium-octeon/executive +d:arch/mips/cobalt +d:arch/mips/configs +d:arch/mips/configs/generic +d:arch/mips/crypto +d:arch/mips/dec +d:arch/mips/dec/prom +d:arch/mips/econet +d:arch/mips/fw +d:arch/mips/fw/arc +d:arch/mips/fw/cfe +d:arch/mips/fw/lib +d:arch/mips/fw/sni +d:arch/mips/generic +d:arch/mips/include +d:arch/mips/include/asm +d:arch/mips/include/asm/dec +d:arch/mips/include/asm/fw +d:arch/mips/include/asm/fw/arc +d:arch/mips/include/asm/fw/cfe +d:arch/mips/include/asm/ip32 +d:arch/mips/include/asm/mach-ath25 +d:arch/mips/include/asm/mach-ath79 +d:arch/mips/include/asm/mach-au1x00 +d:arch/mips/include/asm/mach-bcm47xx +d:arch/mips/include/asm/mach-bcm63xx +d:arch/mips/include/asm/mach-bmips +d:arch/mips/include/asm/mach-cavium-octeon +d:arch/mips/include/asm/mach-cobalt +d:arch/mips/include/asm/mach-db1x00 +d:arch/mips/include/asm/mach-dec +d:arch/mips/include/asm/mach-generic +d:arch/mips/include/asm/mach-ingenic +d:arch/mips/include/asm/mach-ip22 +d:arch/mips/include/asm/mach-ip27 +d:arch/mips/include/asm/mach-ip28 +d:arch/mips/include/asm/mach-ip30 +d:arch/mips/include/asm/mach-ip32 +d:arch/mips/include/asm/mach-jazz +d:arch/mips/include/asm/mach-lantiq +d:arch/mips/include/asm/mach-lantiq/falcon +d:arch/mips/include/asm/mach-lantiq/xway +d:arch/mips/include/asm/mach-loongson2ef +d:arch/mips/include/asm/mach-loongson2ef/cs5536 +d:arch/mips/include/asm/mach-loongson32 +d:arch/mips/include/asm/mach-loongson64 +d:arch/mips/include/asm/mach-malta +d:arch/mips/include/asm/mach-n64 +d:arch/mips/include/asm/mach-pic32 +d:arch/mips/include/asm/mach-ralink +d:arch/mips/include/asm/mach-ralink/mt7620 +d:arch/mips/include/asm/mach-ralink/mt7621 +d:arch/mips/include/asm/mach-ralink/rt288x +d:arch/mips/include/asm/mach-ralink/rt305x +d:arch/mips/include/asm/mach-ralink/rt3883 +d:arch/mips/include/asm/mach-rc32434 +d:arch/mips/include/asm/mach-rm +d:arch/mips/include/asm/mach-sibyte +d:arch/mips/include/asm/mach-tx49xx +d:arch/mips/include/asm/mips-boards +d:arch/mips/include/asm/octeon +d:arch/mips/include/asm/pci +d:arch/mips/include/asm/sgi +d:arch/mips/include/asm/sibyte +d:arch/mips/include/asm/sn +d:arch/mips/include/asm/sn/sn0 +d:arch/mips/include/asm/txx9 +d:arch/mips/include/asm/vdso +d:arch/mips/include/asm/xtalk +d:arch/mips/include/uapi +d:arch/mips/include/uapi/asm +d:arch/mips/ingenic +d:arch/mips/jazz +d:arch/mips/kernel +d:arch/mips/kernel/syscalls +d:arch/mips/kvm +d:arch/mips/lantiq +d:arch/mips/lantiq/falcon +d:arch/mips/lantiq/xway +d:arch/mips/lib +d:arch/mips/loongson2ef +d:arch/mips/loongson2ef/common +d:arch/mips/loongson2ef/common/cs5536 +d:arch/mips/loongson2ef/fuloong-2e +d:arch/mips/loongson2ef/lemote-2f +d:arch/mips/loongson32 +d:arch/mips/loongson32/common +d:arch/mips/loongson32/ls1b +d:arch/mips/loongson32/ls1c +d:arch/mips/loongson64 +d:arch/mips/math-emu +d:arch/mips/mm +d:arch/mips/mobileye +d:arch/mips/mti-malta +d:arch/mips/n64 +d:arch/mips/net +d:arch/mips/pci +d:arch/mips/pic32 +d:arch/mips/pic32/common +d:arch/mips/pic32/pic32mzda +d:arch/mips/power +d:arch/mips/ralink +d:arch/mips/rb532 +d:arch/mips/sgi-ip22 +d:arch/mips/sgi-ip27 +d:arch/mips/sgi-ip30 +d:arch/mips/sgi-ip32 +d:arch/mips/sibyte +d:arch/mips/sibyte/bcm1480 +d:arch/mips/sibyte/common +d:arch/mips/sibyte/sb1250 +d:arch/mips/sibyte/swarm +d:arch/mips/sni +d:arch/mips/tools +d:arch/mips/txx9 +d:arch/mips/txx9/generic +d:arch/mips/txx9/rbtx4927 +d:arch/mips/vdso +d:arch/nios2 +d:arch/nios2/boot +d:arch/nios2/boot/compressed +d:arch/nios2/boot/dts +d:arch/nios2/configs +d:arch/nios2/include +d:arch/nios2/include/asm +d:arch/nios2/include/uapi +d:arch/nios2/include/uapi/asm +d:arch/nios2/kernel +d:arch/nios2/lib +d:arch/nios2/mm +d:arch/nios2/platform +d:arch/openrisc +d:arch/openrisc/boot +d:arch/openrisc/boot/dts +d:arch/openrisc/configs +d:arch/openrisc/include +d:arch/openrisc/include/asm +d:arch/openrisc/include/asm/bitops +d:arch/openrisc/include/uapi +d:arch/openrisc/include/uapi/asm +d:arch/openrisc/kernel +d:arch/openrisc/lib +d:arch/openrisc/mm +d:arch/parisc +d:arch/parisc/boot +d:arch/parisc/boot/compressed +d:arch/parisc/configs +d:arch/parisc/include +d:arch/parisc/include/asm +d:arch/parisc/include/uapi +d:arch/parisc/include/uapi/asm +d:arch/parisc/kernel +d:arch/parisc/kernel/syscalls +d:arch/parisc/kernel/vdso32 +d:arch/parisc/kernel/vdso64 +d:arch/parisc/lib +d:arch/parisc/math-emu +d:arch/parisc/mm +d:arch/parisc/net +d:arch/parisc/video +d:arch/powerpc +d:arch/powerpc/boot +d:arch/powerpc/boot/dts +d:arch/powerpc/boot/dts/fsl +d:arch/powerpc/configs +d:arch/powerpc/configs/44x +d:arch/powerpc/configs/52xx +d:arch/powerpc/configs/83xx +d:arch/powerpc/configs/85xx +d:arch/powerpc/crypto +d:arch/powerpc/include +d:arch/powerpc/include/asm +d:arch/powerpc/include/asm/book3s +d:arch/powerpc/include/asm/book3s/32 +d:arch/powerpc/include/asm/book3s/64 +d:arch/powerpc/include/asm/nohash +d:arch/powerpc/include/asm/nohash/32 +d:arch/powerpc/include/asm/nohash/64 +d:arch/powerpc/include/asm/vdso +d:arch/powerpc/include/uapi +d:arch/powerpc/include/uapi/asm +d:arch/powerpc/kernel +d:arch/powerpc/kernel/ptrace +d:arch/powerpc/kernel/syscalls +d:arch/powerpc/kernel/trace +d:arch/powerpc/kernel/vdso +d:arch/powerpc/kexec +d:arch/powerpc/kvm +d:arch/powerpc/lib +d:arch/powerpc/math-emu +d:arch/powerpc/mm +d:arch/powerpc/mm/book3s32 +d:arch/powerpc/mm/book3s64 +d:arch/powerpc/mm/kasan +d:arch/powerpc/mm/nohash +d:arch/powerpc/mm/ptdump +d:arch/powerpc/net +d:arch/powerpc/perf +d:arch/powerpc/perf/req-gen +d:arch/powerpc/platforms +d:arch/powerpc/platforms/44x +d:arch/powerpc/platforms/512x +d:arch/powerpc/platforms/52xx +d:arch/powerpc/platforms/82xx +d:arch/powerpc/platforms/83xx +d:arch/powerpc/platforms/85xx +d:arch/powerpc/platforms/86xx +d:arch/powerpc/platforms/8xx +d:arch/powerpc/platforms/amigaone +d:arch/powerpc/platforms/book3s +d:arch/powerpc/platforms/cell +d:arch/powerpc/platforms/cell/spufs +d:arch/powerpc/platforms/chrp +d:arch/powerpc/platforms/embedded6xx +d:arch/powerpc/platforms/microwatt +d:arch/powerpc/platforms/pasemi +d:arch/powerpc/platforms/powermac +d:arch/powerpc/platforms/powernv +d:arch/powerpc/platforms/ps3 +d:arch/powerpc/platforms/pseries +d:arch/powerpc/purgatory +d:arch/powerpc/sysdev +d:arch/powerpc/sysdev/ge +d:arch/powerpc/sysdev/xics +d:arch/powerpc/sysdev/xive +d:arch/powerpc/tools +d:arch/powerpc/xmon +d:arch/riscv +d:arch/riscv/boot +d:arch/riscv/boot/dts +d:arch/riscv/boot/dts/allwinner +d:arch/riscv/boot/dts/andes +d:arch/riscv/boot/dts/canaan +d:arch/riscv/boot/dts/microchip +d:arch/riscv/boot/dts/renesas +d:arch/riscv/boot/dts/sifive +d:arch/riscv/boot/dts/sophgo +d:arch/riscv/boot/dts/spacemit +d:arch/riscv/boot/dts/starfive +d:arch/riscv/boot/dts/thead +d:arch/riscv/configs +d:arch/riscv/crypto +d:arch/riscv/errata +d:arch/riscv/errata/andes +d:arch/riscv/errata/sifive +d:arch/riscv/errata/thead +d:arch/riscv/include +d:arch/riscv/include/asm +d:arch/riscv/include/asm/vdso +d:arch/riscv/include/asm/vendor_extensions +d:arch/riscv/include/uapi +d:arch/riscv/include/uapi/asm +d:arch/riscv/include/uapi/asm/vendor +d:arch/riscv/kernel +d:arch/riscv/kernel/compat_vdso +d:arch/riscv/kernel/pi +d:arch/riscv/kernel/probes +d:arch/riscv/kernel/tests +d:arch/riscv/kernel/tests/module_test +d:arch/riscv/kernel/vdso +d:arch/riscv/kernel/vendor_extensions +d:arch/riscv/kvm +d:arch/riscv/lib +d:arch/riscv/mm +d:arch/riscv/net +d:arch/riscv/purgatory +d:arch/riscv/tools +d:arch/s390 +d:arch/s390/appldata +d:arch/s390/boot +d:arch/s390/configs +d:arch/s390/crypto +d:arch/s390/hypfs +d:arch/s390/include +d:arch/s390/include/asm +d:arch/s390/include/asm/trace +d:arch/s390/include/asm/vdso +d:arch/s390/include/uapi +d:arch/s390/include/uapi/asm +d:arch/s390/kernel +d:arch/s390/kernel/diag +d:arch/s390/kernel/syscalls +d:arch/s390/kernel/vdso32 +d:arch/s390/kernel/vdso64 +d:arch/s390/kvm +d:arch/s390/lib +d:arch/s390/mm +d:arch/s390/net +d:arch/s390/pci +d:arch/s390/purgatory +d:arch/s390/tools +d:arch/sh +d:arch/sh/boards +d:arch/sh/boards/mach-ap325rxa +d:arch/sh/boards/mach-dreamcast +d:arch/sh/boards/mach-ecovec24 +d:arch/sh/boards/mach-highlander +d:arch/sh/boards/mach-hp6xx +d:arch/sh/boards/mach-kfr2r09 +d:arch/sh/boards/mach-landisk +d:arch/sh/boards/mach-lboxre2 +d:arch/sh/boards/mach-migor +d:arch/sh/boards/mach-r2d +d:arch/sh/boards/mach-rsk +d:arch/sh/boards/mach-sdk7780 +d:arch/sh/boards/mach-sdk7786 +d:arch/sh/boards/mach-se +d:arch/sh/boards/mach-se/7206 +d:arch/sh/boards/mach-se/7343 +d:arch/sh/boards/mach-se/770x +d:arch/sh/boards/mach-se/7721 +d:arch/sh/boards/mach-se/7722 +d:arch/sh/boards/mach-se/7724 +d:arch/sh/boards/mach-se/7751 +d:arch/sh/boards/mach-se/7780 +d:arch/sh/boards/mach-sh03 +d:arch/sh/boards/mach-sh7763rdp +d:arch/sh/boards/mach-x3proto +d:arch/sh/boot +d:arch/sh/boot/compressed +d:arch/sh/boot/dts +d:arch/sh/boot/romimage +d:arch/sh/cchips +d:arch/sh/cchips/hd6446x +d:arch/sh/configs +d:arch/sh/drivers +d:arch/sh/drivers/dma +d:arch/sh/drivers/pci +d:arch/sh/include +d:arch/sh/include/asm +d:arch/sh/include/cpu-common +d:arch/sh/include/cpu-common/cpu +d:arch/sh/include/cpu-sh2 +d:arch/sh/include/cpu-sh2/cpu +d:arch/sh/include/cpu-sh2a +d:arch/sh/include/cpu-sh2a/cpu +d:arch/sh/include/cpu-sh3 +d:arch/sh/include/cpu-sh3/cpu +d:arch/sh/include/cpu-sh4 +d:arch/sh/include/cpu-sh4/cpu +d:arch/sh/include/cpu-sh4a +d:arch/sh/include/cpu-sh4a/cpu +d:arch/sh/include/mach-common +d:arch/sh/include/mach-common/mach +d:arch/sh/include/mach-dreamcast +d:arch/sh/include/mach-dreamcast/mach +d:arch/sh/include/mach-ecovec24 +d:arch/sh/include/mach-ecovec24/mach +d:arch/sh/include/mach-kfr2r09 +d:arch/sh/include/mach-kfr2r09/mach +d:arch/sh/include/mach-landisk +d:arch/sh/include/mach-landisk/mach +d:arch/sh/include/mach-migor +d:arch/sh/include/mach-migor/mach +d:arch/sh/include/mach-sdk7786 +d:arch/sh/include/mach-sdk7786/mach +d:arch/sh/include/mach-se +d:arch/sh/include/mach-se/mach +d:arch/sh/include/mach-sh03 +d:arch/sh/include/mach-sh03/mach +d:arch/sh/include/mach-x3proto +d:arch/sh/include/mach-x3proto/mach +d:arch/sh/include/uapi +d:arch/sh/include/uapi/asm +d:arch/sh/kernel +d:arch/sh/kernel/cpu +d:arch/sh/kernel/cpu/irq +d:arch/sh/kernel/cpu/sh2 +d:arch/sh/kernel/cpu/sh2a +d:arch/sh/kernel/cpu/sh3 +d:arch/sh/kernel/cpu/sh4 +d:arch/sh/kernel/cpu/sh4a +d:arch/sh/kernel/cpu/shmobile +d:arch/sh/kernel/syscalls +d:arch/sh/kernel/vsyscall +d:arch/sh/lib +d:arch/sh/math-emu +d:arch/sh/mm +d:arch/sh/tools +d:arch/sparc +d:arch/sparc/boot +d:arch/sparc/configs +d:arch/sparc/crypto +d:arch/sparc/include +d:arch/sparc/include/asm +d:arch/sparc/include/uapi +d:arch/sparc/include/uapi/asm +d:arch/sparc/kernel +d:arch/sparc/kernel/syscalls +d:arch/sparc/lib +d:arch/sparc/math-emu +d:arch/sparc/mm +d:arch/sparc/net +d:arch/sparc/power +d:arch/sparc/prom +d:arch/sparc/vdso +d:arch/sparc/vdso/vdso32 +d:arch/sparc/video +d:arch/um +d:arch/um/configs +d:arch/um/drivers +d:arch/um/include +d:arch/um/include/asm +d:arch/um/include/asm/fpu +d:arch/um/include/linux +d:arch/um/include/shared +d:arch/um/include/shared/skas +d:arch/um/include/uapi +d:arch/um/include/uapi/asm +d:arch/um/kernel +d:arch/um/kernel/skas +d:arch/um/os-Linux +d:arch/um/os-Linux/skas +d:arch/um/scripts +d:arch/x86 +d:arch/x86/boot +d:arch/x86/boot/compressed +d:arch/x86/boot/startup +d:arch/x86/coco +d:arch/x86/coco/sev +d:arch/x86/coco/tdx +d:arch/x86/configs +d:arch/x86/crypto +d:arch/x86/entry +d:arch/x86/entry/syscalls +d:arch/x86/entry/vdso +d:arch/x86/entry/vdso/vdso32 +d:arch/x86/entry/vsyscall +d:arch/x86/events +d:arch/x86/events/amd +d:arch/x86/events/intel +d:arch/x86/events/zhaoxin +d:arch/x86/hyperv +d:arch/x86/ia32 +d:arch/x86/include +d:arch/x86/include/asm +d:arch/x86/include/asm/amd +d:arch/x86/include/asm/cpuid +d:arch/x86/include/asm/e820 +d:arch/x86/include/asm/fpu +d:arch/x86/include/asm/numachip +d:arch/x86/include/asm/shared +d:arch/x86/include/asm/trace +d:arch/x86/include/asm/uv +d:arch/x86/include/asm/vdso +d:arch/x86/include/asm/xen +d:arch/x86/include/uapi +d:arch/x86/include/uapi/asm +d:arch/x86/kernel +d:arch/x86/kernel/acpi +d:arch/x86/kernel/apic +d:arch/x86/kernel/cpu +d:arch/x86/kernel/cpu/mce +d:arch/x86/kernel/cpu/microcode +d:arch/x86/kernel/cpu/mtrr +d:arch/x86/kernel/cpu/resctrl +d:arch/x86/kernel/cpu/sgx +d:arch/x86/kernel/fpu +d:arch/x86/kernel/kprobes +d:arch/x86/kvm +d:arch/x86/kvm/mmu +d:arch/x86/kvm/svm +d:arch/x86/kvm/vmx +d:arch/x86/lib +d:arch/x86/math-emu +d:arch/x86/mm +d:arch/x86/mm/pat +d:arch/x86/net +d:arch/x86/pci +d:arch/x86/platform +d:arch/x86/platform/atom +d:arch/x86/platform/ce4100 +d:arch/x86/platform/efi +d:arch/x86/platform/geode +d:arch/x86/platform/intel +d:arch/x86/platform/intel-mid +d:arch/x86/platform/intel-quark +d:arch/x86/platform/iris +d:arch/x86/platform/olpc +d:arch/x86/platform/pvh +d:arch/x86/platform/scx200 +d:arch/x86/platform/ts5500 +d:arch/x86/platform/uv +d:arch/x86/power +d:arch/x86/purgatory +d:arch/x86/ras +d:arch/x86/realmode +d:arch/x86/realmode/rm +d:arch/x86/tools +d:arch/x86/um +d:arch/x86/um/asm +d:arch/x86/um/os-Linux +d:arch/x86/um/shared +d:arch/x86/um/shared/sysdep +d:arch/x86/um/vdso +d:arch/x86/video +d:arch/x86/virt +d:arch/x86/virt/svm +d:arch/x86/virt/vmx +d:arch/x86/virt/vmx/tdx +d:arch/x86/xen +d:arch/xtensa +d:arch/xtensa/boot +d:arch/xtensa/boot/boot-elf +d:arch/xtensa/boot/boot-redboot +d:arch/xtensa/boot/dts +d:arch/xtensa/boot/lib +d:arch/xtensa/configs +d:arch/xtensa/include +d:arch/xtensa/include/asm +d:arch/xtensa/include/uapi +d:arch/xtensa/include/uapi/asm +d:arch/xtensa/kernel +d:arch/xtensa/kernel/syscalls +d:arch/xtensa/lib +d:arch/xtensa/mm +d:arch/xtensa/platforms +d:arch/xtensa/platforms/iss +d:arch/xtensa/platforms/iss/include +d:arch/xtensa/platforms/iss/include/platform +d:arch/xtensa/platforms/xt2000 +d:arch/xtensa/platforms/xt2000/include +d:arch/xtensa/platforms/xt2000/include/platform +d:arch/xtensa/platforms/xtfpga +d:arch/xtensa/platforms/xtfpga/include +d:arch/xtensa/platforms/xtfpga/include/platform +d:arch/xtensa/variants +d:arch/xtensa/variants/csp +d:arch/xtensa/variants/csp/include +d:arch/xtensa/variants/csp/include/variant +d:arch/xtensa/variants/dc232b +d:arch/xtensa/variants/dc232b/include +d:arch/xtensa/variants/dc232b/include/variant +d:arch/xtensa/variants/dc233c +d:arch/xtensa/variants/dc233c/include +d:arch/xtensa/variants/dc233c/include/variant +d:arch/xtensa/variants/de212 +d:arch/xtensa/variants/de212/include +d:arch/xtensa/variants/de212/include/variant +d:arch/xtensa/variants/fsf +d:arch/xtensa/variants/fsf/include +d:arch/xtensa/variants/fsf/include/variant +d:arch/xtensa/variants/test_kc705_be +d:arch/xtensa/variants/test_kc705_be/include +d:arch/xtensa/variants/test_kc705_be/include/variant +d:arch/xtensa/variants/test_kc705_hifi +d:arch/xtensa/variants/test_kc705_hifi/include +d:arch/xtensa/variants/test_kc705_hifi/include/variant +d:arch/xtensa/variants/test_mmuhifi_c3 +d:arch/xtensa/variants/test_mmuhifi_c3/include +d:arch/xtensa/variants/test_mmuhifi_c3/include/variant +d:block +d:block/partitions +d:certs +d:crypto +d:crypto/asymmetric_keys +d:crypto/async_tx +d:crypto/krb5 +d:drivers +d:drivers/accel +d:drivers/accel/amdxdna +d:drivers/accel/habanalabs +d:drivers/accel/habanalabs/common +d:drivers/accel/habanalabs/common/mmu +d:drivers/accel/habanalabs/common/pci +d:drivers/accel/habanalabs/gaudi +d:drivers/accel/habanalabs/gaudi2 +d:drivers/accel/habanalabs/goya +d:drivers/accel/habanalabs/include +d:drivers/accel/habanalabs/include/common +d:drivers/accel/habanalabs/include/gaudi +d:drivers/accel/habanalabs/include/gaudi/asic_reg +d:drivers/accel/habanalabs/include/gaudi2 +d:drivers/accel/habanalabs/include/gaudi2/arc +d:drivers/accel/habanalabs/include/gaudi2/asic_reg +d:drivers/accel/habanalabs/include/goya +d:drivers/accel/habanalabs/include/goya/asic_reg +d:drivers/accel/habanalabs/include/hw_ip +d:drivers/accel/habanalabs/include/hw_ip/mmu +d:drivers/accel/habanalabs/include/hw_ip/pci +d:drivers/accel/ivpu +d:drivers/accel/qaic +d:drivers/accessibility +d:drivers/accessibility/braille +d:drivers/accessibility/speakup +d:drivers/acpi +d:drivers/acpi/acpica +d:drivers/acpi/apei +d:drivers/acpi/arm64 +d:drivers/acpi/dptf +d:drivers/acpi/nfit +d:drivers/acpi/numa +d:drivers/acpi/pmic +d:drivers/acpi/riscv +d:drivers/acpi/x86 +d:drivers/amba +d:drivers/android +d:drivers/android/tests +d:drivers/ata +d:drivers/ata/pata_parport +d:drivers/atm +d:drivers/auxdisplay +d:drivers/base +d:drivers/base/firmware_loader +d:drivers/base/firmware_loader/builtin +d:drivers/base/power +d:drivers/base/regmap +d:drivers/base/test +d:drivers/bcma +d:drivers/block +d:drivers/block/aoe +d:drivers/block/drbd +d:drivers/block/mtip32xx +d:drivers/block/null_blk +d:drivers/block/rnbd +d:drivers/block/xen-blkback +d:drivers/block/zram +d:drivers/bluetooth +d:drivers/bus +d:drivers/bus/fsl-mc +d:drivers/bus/mhi +d:drivers/bus/mhi/ep +d:drivers/bus/mhi/host +d:drivers/cache +d:drivers/cdrom +d:drivers/cdx +d:drivers/cdx/controller +d:drivers/char +d:drivers/char/agp +d:drivers/char/hw_random +d:drivers/char/ipmi +d:drivers/char/mwave +d:drivers/char/tpm +d:drivers/char/tpm/eventlog +d:drivers/char/tpm/st33zp24 +d:drivers/char/xilinx_hwicap +d:drivers/char/xillybus +d:drivers/clk +d:drivers/clk/actions +d:drivers/clk/analogbits +d:drivers/clk/at91 +d:drivers/clk/axis +d:drivers/clk/axs10x +d:drivers/clk/baikal-t1 +d:drivers/clk/bcm +d:drivers/clk/berlin +d:drivers/clk/davinci +d:drivers/clk/hisilicon +d:drivers/clk/imgtec +d:drivers/clk/imx +d:drivers/clk/ingenic +d:drivers/clk/keystone +d:drivers/clk/mediatek +d:drivers/clk/meson +d:drivers/clk/microchip +d:drivers/clk/mmp +d:drivers/clk/mstar +d:drivers/clk/mvebu +d:drivers/clk/mxs +d:drivers/clk/nuvoton +d:drivers/clk/nxp +d:drivers/clk/pistachio +d:drivers/clk/pxa +d:drivers/clk/qcom +d:drivers/clk/ralink +d:drivers/clk/renesas +d:drivers/clk/rockchip +d:drivers/clk/samsung +d:drivers/clk/sifive +d:drivers/clk/socfpga +d:drivers/clk/sophgo +d:drivers/clk/spacemit +d:drivers/clk/spear +d:drivers/clk/sprd +d:drivers/clk/st +d:drivers/clk/starfive +d:drivers/clk/stm32 +d:drivers/clk/sunxi +d:drivers/clk/sunxi-ng +d:drivers/clk/tegra +d:drivers/clk/thead +d:drivers/clk/ti +d:drivers/clk/uniphier +d:drivers/clk/ux500 +d:drivers/clk/versatile +d:drivers/clk/visconti +d:drivers/clk/x86 +d:drivers/clk/xilinx +d:drivers/clk/zynq +d:drivers/clk/zynqmp +d:drivers/clocksource +d:drivers/comedi +d:drivers/comedi/drivers +d:drivers/comedi/drivers/ni_routing +d:drivers/comedi/drivers/ni_routing/ni_device_routes +d:drivers/comedi/drivers/ni_routing/ni_route_values +d:drivers/comedi/drivers/ni_routing/tools +d:drivers/comedi/drivers/tests +d:drivers/comedi/kcomedilib +d:drivers/connector +d:drivers/counter +d:drivers/cpufreq +d:drivers/cpuidle +d:drivers/cpuidle/governors +d:drivers/crypto +d:drivers/crypto/allwinner +d:drivers/crypto/allwinner/sun4i-ss +d:drivers/crypto/allwinner/sun8i-ce +d:drivers/crypto/allwinner/sun8i-ss +d:drivers/crypto/amcc +d:drivers/crypto/amlogic +d:drivers/crypto/aspeed +d:drivers/crypto/axis +d:drivers/crypto/bcm +d:drivers/crypto/caam +d:drivers/crypto/cavium +d:drivers/crypto/cavium/cpt +d:drivers/crypto/cavium/nitrox +d:drivers/crypto/ccp +d:drivers/crypto/ccree +d:drivers/crypto/chelsio +d:drivers/crypto/gemini +d:drivers/crypto/hisilicon +d:drivers/crypto/hisilicon/hpre +d:drivers/crypto/hisilicon/sec +d:drivers/crypto/hisilicon/sec2 +d:drivers/crypto/hisilicon/trng +d:drivers/crypto/hisilicon/zip +d:drivers/crypto/inside-secure +d:drivers/crypto/inside-secure/eip93 +d:drivers/crypto/intel +d:drivers/crypto/intel/iaa +d:drivers/crypto/intel/ixp4xx +d:drivers/crypto/intel/keembay +d:drivers/crypto/intel/qat +d:drivers/crypto/intel/qat/qat_420xx +d:drivers/crypto/intel/qat/qat_4xxx +d:drivers/crypto/intel/qat/qat_6xxx +d:drivers/crypto/intel/qat/qat_c3xxx +d:drivers/crypto/intel/qat/qat_c3xxxvf +d:drivers/crypto/intel/qat/qat_c62x +d:drivers/crypto/intel/qat/qat_c62xvf +d:drivers/crypto/intel/qat/qat_common +d:drivers/crypto/intel/qat/qat_dh895xcc +d:drivers/crypto/intel/qat/qat_dh895xccvf +d:drivers/crypto/marvell +d:drivers/crypto/marvell/cesa +d:drivers/crypto/marvell/octeontx +d:drivers/crypto/marvell/octeontx2 +d:drivers/crypto/nx +d:drivers/crypto/qce +d:drivers/crypto/rockchip +d:drivers/crypto/starfive +d:drivers/crypto/stm32 +d:drivers/crypto/tegra +d:drivers/crypto/virtio +d:drivers/crypto/xilinx +d:drivers/cxl +d:drivers/cxl/core +d:drivers/dax +d:drivers/dax/hmem +d:drivers/dca +d:drivers/devfreq +d:drivers/devfreq/event +d:drivers/dio +d:drivers/dma +d:drivers/dma-buf +d:drivers/dma-buf/heaps +d:drivers/dma/amd +d:drivers/dma/amd/ae4dma +d:drivers/dma/amd/ptdma +d:drivers/dma/amd/qdma +d:drivers/dma/bestcomm +d:drivers/dma/dw +d:drivers/dma/dw-axi-dmac +d:drivers/dma/dw-edma +d:drivers/dma/fsl-dpaa2-qdma +d:drivers/dma/hsu +d:drivers/dma/idxd +d:drivers/dma/ioat +d:drivers/dma/lgm +d:drivers/dma/mediatek +d:drivers/dma/ppc4xx +d:drivers/dma/qcom +d:drivers/dma/sf-pdma +d:drivers/dma/sh +d:drivers/dma/stm32 +d:drivers/dma/ti +d:drivers/dma/xilinx +d:drivers/dpll +d:drivers/dpll/zl3073x +d:drivers/edac +d:drivers/eisa +d:drivers/extcon +d:drivers/firewire +d:drivers/firmware +d:drivers/firmware/arm_ffa +d:drivers/firmware/arm_scmi +d:drivers/firmware/arm_scmi/transports +d:drivers/firmware/arm_scmi/vendors +d:drivers/firmware/arm_scmi/vendors/imx +d:drivers/firmware/broadcom +d:drivers/firmware/cirrus +d:drivers/firmware/cirrus/test +d:drivers/firmware/efi +d:drivers/firmware/efi/libstub +d:drivers/firmware/efi/stmm +d:drivers/firmware/efi/test +d:drivers/firmware/google +d:drivers/firmware/imx +d:drivers/firmware/meson +d:drivers/firmware/microchip +d:drivers/firmware/psci +d:drivers/firmware/qcom +d:drivers/firmware/samsung +d:drivers/firmware/smccc +d:drivers/firmware/tegra +d:drivers/firmware/xilinx +d:drivers/fpga +d:drivers/fpga/tests +d:drivers/fsi +d:drivers/fwctl +d:drivers/fwctl/mlx5 +d:drivers/fwctl/pds +d:drivers/gnss +d:drivers/gpio +d:drivers/gpu +d:drivers/gpu/drm +d:drivers/gpu/drm/adp +d:drivers/gpu/drm/amd +d:drivers/gpu/drm/amd/acp +d:drivers/gpu/drm/amd/acp/include +d:drivers/gpu/drm/amd/amdgpu +d:drivers/gpu/drm/amd/amdkfd +d:drivers/gpu/drm/amd/amdxcp +d:drivers/gpu/drm/amd/display +d:drivers/gpu/drm/amd/display/amdgpu_dm +d:drivers/gpu/drm/amd/display/dc +d:drivers/gpu/drm/amd/display/dc/basics +d:drivers/gpu/drm/amd/display/dc/bios +d:drivers/gpu/drm/amd/display/dc/bios/dce110 +d:drivers/gpu/drm/amd/display/dc/bios/dce112 +d:drivers/gpu/drm/amd/display/dc/bios/dce60 +d:drivers/gpu/drm/amd/display/dc/bios/dce80 +d:drivers/gpu/drm/amd/display/dc/clk_mgr +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dce100 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dce110 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dce112 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dce120 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dce60 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn201 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35 +d:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401 +d:drivers/gpu/drm/amd/display/dc/core +d:drivers/gpu/drm/amd/display/dc/dccg +d:drivers/gpu/drm/amd/display/dc/dccg/dcn20 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn201 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn21 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn30 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn301 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn302 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn303 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn31 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn314 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn32 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn35 +d:drivers/gpu/drm/amd/display/dc/dccg/dcn401 +d:drivers/gpu/drm/amd/display/dc/dce +d:drivers/gpu/drm/amd/display/dc/dce110 +d:drivers/gpu/drm/amd/display/dc/dce112 +d:drivers/gpu/drm/amd/display/dc/dce120 +d:drivers/gpu/drm/amd/display/dc/dce60 +d:drivers/gpu/drm/amd/display/dc/dce80 +d:drivers/gpu/drm/amd/display/dc/dcn10 +d:drivers/gpu/drm/amd/display/dc/dcn20 +d:drivers/gpu/drm/amd/display/dc/dcn201 +d:drivers/gpu/drm/amd/display/dc/dcn21 +d:drivers/gpu/drm/amd/display/dc/dcn30 +d:drivers/gpu/drm/amd/display/dc/dcn301 +d:drivers/gpu/drm/amd/display/dc/dcn31 +d:drivers/gpu/drm/amd/display/dc/dio +d:drivers/gpu/drm/amd/display/dc/dio/dcn10 +d:drivers/gpu/drm/amd/display/dc/dio/dcn20 +d:drivers/gpu/drm/amd/display/dc/dio/dcn30 +d:drivers/gpu/drm/amd/display/dc/dio/dcn301 +d:drivers/gpu/drm/amd/display/dc/dio/dcn31 +d:drivers/gpu/drm/amd/display/dc/dio/dcn314 +d:drivers/gpu/drm/amd/display/dc/dio/dcn32 +d:drivers/gpu/drm/amd/display/dc/dio/dcn321 +d:drivers/gpu/drm/amd/display/dc/dio/dcn35 +d:drivers/gpu/drm/amd/display/dc/dio/dcn401 +d:drivers/gpu/drm/amd/display/dc/dml +d:drivers/gpu/drm/amd/display/dc/dml/calcs +d:drivers/gpu/drm/amd/display/dc/dml/dcn10 +d:drivers/gpu/drm/amd/display/dc/dml/dcn20 +d:drivers/gpu/drm/amd/display/dc/dml/dcn21 +d:drivers/gpu/drm/amd/display/dc/dml/dcn30 +d:drivers/gpu/drm/amd/display/dc/dml/dcn301 +d:drivers/gpu/drm/amd/display/dc/dml/dcn302 +d:drivers/gpu/drm/amd/display/dc/dml/dcn303 +d:drivers/gpu/drm/amd/display/dc/dml/dcn31 +d:drivers/gpu/drm/amd/display/dc/dml/dcn314 +d:drivers/gpu/drm/amd/display/dc/dml/dcn32 +d:drivers/gpu/drm/amd/display/dc/dml/dcn321 +d:drivers/gpu/drm/amd/display/dc/dml/dcn35 +d:drivers/gpu/drm/amd/display/dc/dml/dcn351 +d:drivers/gpu/drm/amd/display/dc/dml/dsc +d:drivers/gpu/drm/amd/display/dc/dml2 +d:drivers/gpu/drm/amd/display/dc/dml2/dml21 +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/bounding_boxes +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/src +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_dpmm +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_mcg +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_standalone_libraries +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top +d:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/inc +d:drivers/gpu/drm/amd/display/dc/dpp +d:drivers/gpu/drm/amd/display/dc/dpp/dcn10 +d:drivers/gpu/drm/amd/display/dc/dpp/dcn20 +d:drivers/gpu/drm/amd/display/dc/dpp/dcn201 +d:drivers/gpu/drm/amd/display/dc/dpp/dcn30 +d:drivers/gpu/drm/amd/display/dc/dpp/dcn32 +d:drivers/gpu/drm/amd/display/dc/dpp/dcn35 +d:drivers/gpu/drm/amd/display/dc/dpp/dcn401 +d:drivers/gpu/drm/amd/display/dc/dsc +d:drivers/gpu/drm/amd/display/dc/dsc/dcn20 +d:drivers/gpu/drm/amd/display/dc/dsc/dcn35 +d:drivers/gpu/drm/amd/display/dc/dsc/dcn401 +d:drivers/gpu/drm/amd/display/dc/dwb +d:drivers/gpu/drm/amd/display/dc/dwb/dcn30 +d:drivers/gpu/drm/amd/display/dc/dwb/dcn35 +d:drivers/gpu/drm/amd/display/dc/gpio +d:drivers/gpu/drm/amd/display/dc/gpio/dce110 +d:drivers/gpu/drm/amd/display/dc/gpio/dce120 +d:drivers/gpu/drm/amd/display/dc/gpio/dce60 +d:drivers/gpu/drm/amd/display/dc/gpio/dce80 +d:drivers/gpu/drm/amd/display/dc/gpio/dcn10 +d:drivers/gpu/drm/amd/display/dc/gpio/dcn20 +d:drivers/gpu/drm/amd/display/dc/gpio/dcn21 +d:drivers/gpu/drm/amd/display/dc/gpio/dcn30 +d:drivers/gpu/drm/amd/display/dc/gpio/dcn315 +d:drivers/gpu/drm/amd/display/dc/gpio/dcn32 +d:drivers/gpu/drm/amd/display/dc/gpio/dcn401 +d:drivers/gpu/drm/amd/display/dc/hdcp +d:drivers/gpu/drm/amd/display/dc/hpo +d:drivers/gpu/drm/amd/display/dc/hpo/dcn31 +d:drivers/gpu/drm/amd/display/dc/hpo/dcn32 +d:drivers/gpu/drm/amd/display/dc/hubbub +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn10 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn20 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn201 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn21 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn30 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn301 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn31 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn32 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn35 +d:drivers/gpu/drm/amd/display/dc/hubbub/dcn401 +d:drivers/gpu/drm/amd/display/dc/hubp +d:drivers/gpu/drm/amd/display/dc/hubp/dcn10 +d:drivers/gpu/drm/amd/display/dc/hubp/dcn20 +d:drivers/gpu/drm/amd/display/dc/hubp/dcn201 +d:drivers/gpu/drm/amd/display/dc/hubp/dcn21 +d:drivers/gpu/drm/amd/display/dc/hubp/dcn30 +d:drivers/gpu/drm/amd/display/dc/hubp/dcn31 +d:drivers/gpu/drm/amd/display/dc/hubp/dcn32 +d:drivers/gpu/drm/amd/display/dc/hubp/dcn35 +d:drivers/gpu/drm/amd/display/dc/hubp/dcn401 +d:drivers/gpu/drm/amd/display/dc/hwss +d:drivers/gpu/drm/amd/display/dc/hwss/dce +d:drivers/gpu/drm/amd/display/dc/hwss/dce100 +d:drivers/gpu/drm/amd/display/dc/hwss/dce110 +d:drivers/gpu/drm/amd/display/dc/hwss/dce112 +d:drivers/gpu/drm/amd/display/dc/hwss/dce120 +d:drivers/gpu/drm/amd/display/dc/hwss/dce60 +d:drivers/gpu/drm/amd/display/dc/hwss/dce80 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn10 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn20 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn201 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn21 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn30 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn301 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn302 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn303 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn31 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn314 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn32 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn35 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn351 +d:drivers/gpu/drm/amd/display/dc/hwss/dcn401 +d:drivers/gpu/drm/amd/display/dc/inc +d:drivers/gpu/drm/amd/display/dc/inc/hw +d:drivers/gpu/drm/amd/display/dc/irq +d:drivers/gpu/drm/amd/display/dc/irq/dce110 +d:drivers/gpu/drm/amd/display/dc/irq/dce120 +d:drivers/gpu/drm/amd/display/dc/irq/dce60 +d:drivers/gpu/drm/amd/display/dc/irq/dce80 +d:drivers/gpu/drm/amd/display/dc/irq/dcn10 +d:drivers/gpu/drm/amd/display/dc/irq/dcn20 +d:drivers/gpu/drm/amd/display/dc/irq/dcn201 +d:drivers/gpu/drm/amd/display/dc/irq/dcn21 +d:drivers/gpu/drm/amd/display/dc/irq/dcn30 +d:drivers/gpu/drm/amd/display/dc/irq/dcn302 +d:drivers/gpu/drm/amd/display/dc/irq/dcn303 +d:drivers/gpu/drm/amd/display/dc/irq/dcn31 +d:drivers/gpu/drm/amd/display/dc/irq/dcn314 +d:drivers/gpu/drm/amd/display/dc/irq/dcn315 +d:drivers/gpu/drm/amd/display/dc/irq/dcn32 +d:drivers/gpu/drm/amd/display/dc/irq/dcn35 +d:drivers/gpu/drm/amd/display/dc/irq/dcn351 +d:drivers/gpu/drm/amd/display/dc/irq/dcn36 +d:drivers/gpu/drm/amd/display/dc/irq/dcn401 +d:drivers/gpu/drm/amd/display/dc/link +d:drivers/gpu/drm/amd/display/dc/link/accessories +d:drivers/gpu/drm/amd/display/dc/link/hwss +d:drivers/gpu/drm/amd/display/dc/link/protocols +d:drivers/gpu/drm/amd/display/dc/mmhubbub +d:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn20 +d:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32 +d:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35 +d:drivers/gpu/drm/amd/display/dc/mpc +d:drivers/gpu/drm/amd/display/dc/mpc/dcn10 +d:drivers/gpu/drm/amd/display/dc/mpc/dcn20 +d:drivers/gpu/drm/amd/display/dc/mpc/dcn30 +d:drivers/gpu/drm/amd/display/dc/mpc/dcn32 +d:drivers/gpu/drm/amd/display/dc/mpc/dcn401 +d:drivers/gpu/drm/amd/display/dc/opp +d:drivers/gpu/drm/amd/display/dc/opp/dcn10 +d:drivers/gpu/drm/amd/display/dc/opp/dcn20 +d:drivers/gpu/drm/amd/display/dc/opp/dcn35 +d:drivers/gpu/drm/amd/display/dc/optc +d:drivers/gpu/drm/amd/display/dc/optc/dcn10 +d:drivers/gpu/drm/amd/display/dc/optc/dcn20 +d:drivers/gpu/drm/amd/display/dc/optc/dcn201 +d:drivers/gpu/drm/amd/display/dc/optc/dcn30 +d:drivers/gpu/drm/amd/display/dc/optc/dcn301 +d:drivers/gpu/drm/amd/display/dc/optc/dcn31 +d:drivers/gpu/drm/amd/display/dc/optc/dcn314 +d:drivers/gpu/drm/amd/display/dc/optc/dcn32 +d:drivers/gpu/drm/amd/display/dc/optc/dcn35 +d:drivers/gpu/drm/amd/display/dc/optc/dcn401 +d:drivers/gpu/drm/amd/display/dc/pg +d:drivers/gpu/drm/amd/display/dc/pg/dcn35 +d:drivers/gpu/drm/amd/display/dc/resource +d:drivers/gpu/drm/amd/display/dc/resource/dce100 +d:drivers/gpu/drm/amd/display/dc/resource/dce110 +d:drivers/gpu/drm/amd/display/dc/resource/dce112 +d:drivers/gpu/drm/amd/display/dc/resource/dce120 +d:drivers/gpu/drm/amd/display/dc/resource/dce60 +d:drivers/gpu/drm/amd/display/dc/resource/dce80 +d:drivers/gpu/drm/amd/display/dc/resource/dcn10 +d:drivers/gpu/drm/amd/display/dc/resource/dcn20 +d:drivers/gpu/drm/amd/display/dc/resource/dcn201 +d:drivers/gpu/drm/amd/display/dc/resource/dcn21 +d:drivers/gpu/drm/amd/display/dc/resource/dcn30 +d:drivers/gpu/drm/amd/display/dc/resource/dcn301 +d:drivers/gpu/drm/amd/display/dc/resource/dcn302 +d:drivers/gpu/drm/amd/display/dc/resource/dcn303 +d:drivers/gpu/drm/amd/display/dc/resource/dcn31 +d:drivers/gpu/drm/amd/display/dc/resource/dcn314 +d:drivers/gpu/drm/amd/display/dc/resource/dcn315 +d:drivers/gpu/drm/amd/display/dc/resource/dcn316 +d:drivers/gpu/drm/amd/display/dc/resource/dcn32 +d:drivers/gpu/drm/amd/display/dc/resource/dcn321 +d:drivers/gpu/drm/amd/display/dc/resource/dcn35 +d:drivers/gpu/drm/amd/display/dc/resource/dcn351 +d:drivers/gpu/drm/amd/display/dc/resource/dcn36 +d:drivers/gpu/drm/amd/display/dc/resource/dcn401 +d:drivers/gpu/drm/amd/display/dc/sspl +d:drivers/gpu/drm/amd/display/dc/virtual +d:drivers/gpu/drm/amd/display/dmub +d:drivers/gpu/drm/amd/display/dmub/inc +d:drivers/gpu/drm/amd/display/dmub/src +d:drivers/gpu/drm/amd/display/include +d:drivers/gpu/drm/amd/display/modules +d:drivers/gpu/drm/amd/display/modules/color +d:drivers/gpu/drm/amd/display/modules/freesync +d:drivers/gpu/drm/amd/display/modules/hdcp +d:drivers/gpu/drm/amd/display/modules/inc +d:drivers/gpu/drm/amd/display/modules/info_packet +d:drivers/gpu/drm/amd/display/modules/power +d:drivers/gpu/drm/amd/display/modules/vmid +d:drivers/gpu/drm/amd/include +d:drivers/gpu/drm/amd/include/asic_reg +d:drivers/gpu/drm/amd/include/asic_reg/athub +d:drivers/gpu/drm/amd/include/asic_reg/bif +d:drivers/gpu/drm/amd/include/asic_reg/clk +d:drivers/gpu/drm/amd/include/asic_reg/dce +d:drivers/gpu/drm/amd/include/asic_reg/dcn +d:drivers/gpu/drm/amd/include/asic_reg/df +d:drivers/gpu/drm/amd/include/asic_reg/dpcs +d:drivers/gpu/drm/amd/include/asic_reg/gc +d:drivers/gpu/drm/amd/include/asic_reg/gca +d:drivers/gpu/drm/amd/include/asic_reg/gmc +d:drivers/gpu/drm/amd/include/asic_reg/hdp +d:drivers/gpu/drm/amd/include/asic_reg/lsdma +d:drivers/gpu/drm/amd/include/asic_reg/mmhub +d:drivers/gpu/drm/amd/include/asic_reg/mp +d:drivers/gpu/drm/amd/include/asic_reg/nbif +d:drivers/gpu/drm/amd/include/asic_reg/nbio +d:drivers/gpu/drm/amd/include/asic_reg/oss +d:drivers/gpu/drm/amd/include/asic_reg/pcie +d:drivers/gpu/drm/amd/include/asic_reg/pwr +d:drivers/gpu/drm/amd/include/asic_reg/rsmu +d:drivers/gpu/drm/amd/include/asic_reg/sdma +d:drivers/gpu/drm/amd/include/asic_reg/sdma0 +d:drivers/gpu/drm/amd/include/asic_reg/sdma1 +d:drivers/gpu/drm/amd/include/asic_reg/sdma2 +d:drivers/gpu/drm/amd/include/asic_reg/sdma3 +d:drivers/gpu/drm/amd/include/asic_reg/sdma4 +d:drivers/gpu/drm/amd/include/asic_reg/sdma5 +d:drivers/gpu/drm/amd/include/asic_reg/sdma6 +d:drivers/gpu/drm/amd/include/asic_reg/sdma7 +d:drivers/gpu/drm/amd/include/asic_reg/smu +d:drivers/gpu/drm/amd/include/asic_reg/smuio +d:drivers/gpu/drm/amd/include/asic_reg/thm +d:drivers/gpu/drm/amd/include/asic_reg/umc +d:drivers/gpu/drm/amd/include/asic_reg/uvd +d:drivers/gpu/drm/amd/include/asic_reg/vce +d:drivers/gpu/drm/amd/include/asic_reg/vcn +d:drivers/gpu/drm/amd/include/asic_reg/vpe +d:drivers/gpu/drm/amd/include/asic_reg/wafl +d:drivers/gpu/drm/amd/include/asic_reg/xgmi +d:drivers/gpu/drm/amd/include/ivsrcid +d:drivers/gpu/drm/amd/include/ivsrcid/dcn +d:drivers/gpu/drm/amd/include/ivsrcid/gfx +d:drivers/gpu/drm/amd/include/ivsrcid/isp +d:drivers/gpu/drm/amd/include/ivsrcid/nbio +d:drivers/gpu/drm/amd/include/ivsrcid/sdma0 +d:drivers/gpu/drm/amd/include/ivsrcid/sdma1 +d:drivers/gpu/drm/amd/include/ivsrcid/sdma2 +d:drivers/gpu/drm/amd/include/ivsrcid/sdma3 +d:drivers/gpu/drm/amd/include/ivsrcid/smuio +d:drivers/gpu/drm/amd/include/ivsrcid/thm +d:drivers/gpu/drm/amd/include/ivsrcid/uvd +d:drivers/gpu/drm/amd/include/ivsrcid/vce +d:drivers/gpu/drm/amd/include/ivsrcid/vcn +d:drivers/gpu/drm/amd/include/ivsrcid/vmc +d:drivers/gpu/drm/amd/include/ivsrcid/vpe +d:drivers/gpu/drm/amd/pm +d:drivers/gpu/drm/amd/pm/inc +d:drivers/gpu/drm/amd/pm/legacy-dpm +d:drivers/gpu/drm/amd/pm/powerplay +d:drivers/gpu/drm/amd/pm/powerplay/hwmgr +d:drivers/gpu/drm/amd/pm/powerplay/inc +d:drivers/gpu/drm/amd/pm/powerplay/inc/vega12 +d:drivers/gpu/drm/amd/pm/powerplay/smumgr +d:drivers/gpu/drm/amd/pm/swsmu +d:drivers/gpu/drm/amd/pm/swsmu/inc +d:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if +d:drivers/gpu/drm/amd/pm/swsmu/smu11 +d:drivers/gpu/drm/amd/pm/swsmu/smu12 +d:drivers/gpu/drm/amd/pm/swsmu/smu13 +d:drivers/gpu/drm/amd/pm/swsmu/smu14 +d:drivers/gpu/drm/arm +d:drivers/gpu/drm/arm/display +d:drivers/gpu/drm/arm/display/include +d:drivers/gpu/drm/arm/display/komeda +d:drivers/gpu/drm/arm/display/komeda/d71 +d:drivers/gpu/drm/armada +d:drivers/gpu/drm/aspeed +d:drivers/gpu/drm/ast +d:drivers/gpu/drm/atmel-hlcdc +d:drivers/gpu/drm/bridge +d:drivers/gpu/drm/bridge/adv7511 +d:drivers/gpu/drm/bridge/analogix +d:drivers/gpu/drm/bridge/cadence +d:drivers/gpu/drm/bridge/imx +d:drivers/gpu/drm/bridge/synopsys +d:drivers/gpu/drm/ci +d:drivers/gpu/drm/ci/xfails +d:drivers/gpu/drm/clients +d:drivers/gpu/drm/display +d:drivers/gpu/drm/etnaviv +d:drivers/gpu/drm/exynos +d:drivers/gpu/drm/fsl-dcu +d:drivers/gpu/drm/gma500 +d:drivers/gpu/drm/gud +d:drivers/gpu/drm/hisilicon +d:drivers/gpu/drm/hisilicon/hibmc +d:drivers/gpu/drm/hisilicon/hibmc/dp +d:drivers/gpu/drm/hisilicon/kirin +d:drivers/gpu/drm/hyperv +d:drivers/gpu/drm/i915 +d:drivers/gpu/drm/i915/display +d:drivers/gpu/drm/i915/gem +d:drivers/gpu/drm/i915/gem/selftests +d:drivers/gpu/drm/i915/gt +d:drivers/gpu/drm/i915/gt/selftests +d:drivers/gpu/drm/i915/gt/shaders +d:drivers/gpu/drm/i915/gt/shaders/clear_kernel +d:drivers/gpu/drm/i915/gt/uc +d:drivers/gpu/drm/i915/gt/uc/abi +d:drivers/gpu/drm/i915/gvt +d:drivers/gpu/drm/i915/pxp +d:drivers/gpu/drm/i915/selftests +d:drivers/gpu/drm/i915/soc +d:drivers/gpu/drm/imagination +d:drivers/gpu/drm/imx +d:drivers/gpu/drm/imx/dc +d:drivers/gpu/drm/imx/dcss +d:drivers/gpu/drm/imx/ipuv3 +d:drivers/gpu/drm/imx/lcdc +d:drivers/gpu/drm/ingenic +d:drivers/gpu/drm/kmb +d:drivers/gpu/drm/lib +d:drivers/gpu/drm/lima +d:drivers/gpu/drm/logicvc +d:drivers/gpu/drm/loongson +d:drivers/gpu/drm/mcde +d:drivers/gpu/drm/mediatek +d:drivers/gpu/drm/meson +d:drivers/gpu/drm/mgag200 +d:drivers/gpu/drm/msm +d:drivers/gpu/drm/msm/adreno +d:drivers/gpu/drm/msm/disp +d:drivers/gpu/drm/msm/disp/dpu1 +d:drivers/gpu/drm/msm/disp/dpu1/catalog +d:drivers/gpu/drm/msm/disp/mdp4 +d:drivers/gpu/drm/msm/disp/mdp5 +d:drivers/gpu/drm/msm/dp +d:drivers/gpu/drm/msm/dsi +d:drivers/gpu/drm/msm/dsi/phy +d:drivers/gpu/drm/msm/hdmi +d:drivers/gpu/drm/msm/registers +d:drivers/gpu/drm/msm/registers/adreno +d:drivers/gpu/drm/msm/registers/display +d:drivers/gpu/drm/mxsfb +d:drivers/gpu/drm/nouveau +d:drivers/gpu/drm/nouveau/dispnv04 +d:drivers/gpu/drm/nouveau/dispnv04/i2c +d:drivers/gpu/drm/nouveau/dispnv50 +d:drivers/gpu/drm/nouveau/include +d:drivers/gpu/drm/nouveau/include/dispnv04 +d:drivers/gpu/drm/nouveau/include/dispnv04/i2c +d:drivers/gpu/drm/nouveau/include/nvfw +d:drivers/gpu/drm/nouveau/include/nvhw +d:drivers/gpu/drm/nouveau/include/nvhw/class +d:drivers/gpu/drm/nouveau/include/nvhw/ref +d:drivers/gpu/drm/nouveau/include/nvhw/ref/gb100 +d:drivers/gpu/drm/nouveau/include/nvhw/ref/gb10b +d:drivers/gpu/drm/nouveau/include/nvhw/ref/gb202 +d:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100 +d:drivers/gpu/drm/nouveau/include/nvif +d:drivers/gpu/drm/nouveau/include/nvkm +d:drivers/gpu/drm/nouveau/include/nvkm/core +d:drivers/gpu/drm/nouveau/include/nvkm/engine +d:drivers/gpu/drm/nouveau/include/nvkm/subdev +d:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios +d:drivers/gpu/drm/nouveau/include/nvrm +d:drivers/gpu/drm/nouveau/nvif +d:drivers/gpu/drm/nouveau/nvkm +d:drivers/gpu/drm/nouveau/nvkm/core +d:drivers/gpu/drm/nouveau/nvkm/engine +d:drivers/gpu/drm/nouveau/nvkm/engine/bsp +d:drivers/gpu/drm/nouveau/nvkm/engine/ce +d:drivers/gpu/drm/nouveau/nvkm/engine/ce/fuc +d:drivers/gpu/drm/nouveau/nvkm/engine/cipher +d:drivers/gpu/drm/nouveau/nvkm/engine/device +d:drivers/gpu/drm/nouveau/nvkm/engine/disp +d:drivers/gpu/drm/nouveau/nvkm/engine/dma +d:drivers/gpu/drm/nouveau/nvkm/engine/fifo +d:drivers/gpu/drm/nouveau/nvkm/engine/gr +d:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc +d:drivers/gpu/drm/nouveau/nvkm/engine/mpeg +d:drivers/gpu/drm/nouveau/nvkm/engine/msenc +d:drivers/gpu/drm/nouveau/nvkm/engine/mspdec +d:drivers/gpu/drm/nouveau/nvkm/engine/msppp +d:drivers/gpu/drm/nouveau/nvkm/engine/msvld +d:drivers/gpu/drm/nouveau/nvkm/engine/nvdec +d:drivers/gpu/drm/nouveau/nvkm/engine/nvenc +d:drivers/gpu/drm/nouveau/nvkm/engine/sec +d:drivers/gpu/drm/nouveau/nvkm/engine/sec/fuc +d:drivers/gpu/drm/nouveau/nvkm/engine/sec2 +d:drivers/gpu/drm/nouveau/nvkm/engine/sw +d:drivers/gpu/drm/nouveau/nvkm/engine/vic +d:drivers/gpu/drm/nouveau/nvkm/engine/vp +d:drivers/gpu/drm/nouveau/nvkm/falcon +d:drivers/gpu/drm/nouveau/nvkm/nvfw +d:drivers/gpu/drm/nouveau/nvkm/subdev +d:drivers/gpu/drm/nouveau/nvkm/subdev/acr +d:drivers/gpu/drm/nouveau/nvkm/subdev/bar +d:drivers/gpu/drm/nouveau/nvkm/subdev/bios +d:drivers/gpu/drm/nouveau/nvkm/subdev/bus +d:drivers/gpu/drm/nouveau/nvkm/subdev/clk +d:drivers/gpu/drm/nouveau/nvkm/subdev/devinit +d:drivers/gpu/drm/nouveau/nvkm/subdev/fault +d:drivers/gpu/drm/nouveau/nvkm/subdev/fb +d:drivers/gpu/drm/nouveau/nvkm/subdev/fsp +d:drivers/gpu/drm/nouveau/nvkm/subdev/fuse +d:drivers/gpu/drm/nouveau/nvkm/subdev/gpio +d:drivers/gpu/drm/nouveau/nvkm/subdev/gsp +d:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm +d:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535 +d:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm +d:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570 +d:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm +d:drivers/gpu/drm/nouveau/nvkm/subdev/i2c +d:drivers/gpu/drm/nouveau/nvkm/subdev/iccsense +d:drivers/gpu/drm/nouveau/nvkm/subdev/instmem +d:drivers/gpu/drm/nouveau/nvkm/subdev/ltc +d:drivers/gpu/drm/nouveau/nvkm/subdev/mc +d:drivers/gpu/drm/nouveau/nvkm/subdev/mmu +d:drivers/gpu/drm/nouveau/nvkm/subdev/mxm +d:drivers/gpu/drm/nouveau/nvkm/subdev/pci +d:drivers/gpu/drm/nouveau/nvkm/subdev/pmu +d:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc +d:drivers/gpu/drm/nouveau/nvkm/subdev/privring +d:drivers/gpu/drm/nouveau/nvkm/subdev/therm +d:drivers/gpu/drm/nouveau/nvkm/subdev/timer +d:drivers/gpu/drm/nouveau/nvkm/subdev/top +d:drivers/gpu/drm/nouveau/nvkm/subdev/vfn +d:drivers/gpu/drm/nouveau/nvkm/subdev/volt +d:drivers/gpu/drm/nova +d:drivers/gpu/drm/omapdrm +d:drivers/gpu/drm/omapdrm/dss +d:drivers/gpu/drm/panel +d:drivers/gpu/drm/panfrost +d:drivers/gpu/drm/panthor +d:drivers/gpu/drm/pl111 +d:drivers/gpu/drm/qxl +d:drivers/gpu/drm/radeon +d:drivers/gpu/drm/radeon/reg_srcs +d:drivers/gpu/drm/renesas +d:drivers/gpu/drm/renesas/rcar-du +d:drivers/gpu/drm/renesas/rz-du +d:drivers/gpu/drm/renesas/shmobile +d:drivers/gpu/drm/rockchip +d:drivers/gpu/drm/scheduler +d:drivers/gpu/drm/scheduler/tests +d:drivers/gpu/drm/sitronix +d:drivers/gpu/drm/solomon +d:drivers/gpu/drm/sprd +d:drivers/gpu/drm/sti +d:drivers/gpu/drm/stm +d:drivers/gpu/drm/sun4i +d:drivers/gpu/drm/sysfb +d:drivers/gpu/drm/tegra +d:drivers/gpu/drm/tests +d:drivers/gpu/drm/tidss +d:drivers/gpu/drm/tilcdc +d:drivers/gpu/drm/tiny +d:drivers/gpu/drm/ttm +d:drivers/gpu/drm/ttm/tests +d:drivers/gpu/drm/tve200 +d:drivers/gpu/drm/udl +d:drivers/gpu/drm/v3d +d:drivers/gpu/drm/vboxvideo +d:drivers/gpu/drm/vc4 +d:drivers/gpu/drm/vc4/tests +d:drivers/gpu/drm/vgem +d:drivers/gpu/drm/virtio +d:drivers/gpu/drm/vkms +d:drivers/gpu/drm/vkms/tests +d:drivers/gpu/drm/vmwgfx +d:drivers/gpu/drm/vmwgfx/device_include +d:drivers/gpu/drm/xe +d:drivers/gpu/drm/xe/abi +d:drivers/gpu/drm/xe/compat-i915-headers +d:drivers/gpu/drm/xe/compat-i915-headers/gem +d:drivers/gpu/drm/xe/compat-i915-headers/gt +d:drivers/gpu/drm/xe/compat-i915-headers/pxp +d:drivers/gpu/drm/xe/compat-i915-headers/soc +d:drivers/gpu/drm/xe/display +d:drivers/gpu/drm/xe/display/ext +d:drivers/gpu/drm/xe/instructions +d:drivers/gpu/drm/xe/regs +d:drivers/gpu/drm/xe/tests +d:drivers/gpu/drm/xen +d:drivers/gpu/drm/xlnx +d:drivers/gpu/host1x +d:drivers/gpu/host1x/hw +d:drivers/gpu/ipu-v3 +d:drivers/gpu/nova-core +d:drivers/gpu/nova-core/falcon +d:drivers/gpu/nova-core/falcon/hal +d:drivers/gpu/nova-core/fb +d:drivers/gpu/nova-core/fb/hal +d:drivers/gpu/nova-core/firmware +d:drivers/gpu/nova-core/regs +d:drivers/gpu/trace +d:drivers/gpu/vga +d:drivers/greybus +d:drivers/hid +d:drivers/hid/amd-sfh-hid +d:drivers/hid/amd-sfh-hid/hid_descriptor +d:drivers/hid/amd-sfh-hid/sfh1_1 +d:drivers/hid/bpf +d:drivers/hid/bpf/progs +d:drivers/hid/i2c-hid +d:drivers/hid/intel-ish-hid +d:drivers/hid/intel-ish-hid/ipc +d:drivers/hid/intel-ish-hid/ishtp +d:drivers/hid/intel-thc-hid +d:drivers/hid/intel-thc-hid/intel-quicki2c +d:drivers/hid/intel-thc-hid/intel-quickspi +d:drivers/hid/intel-thc-hid/intel-thc +d:drivers/hid/surface-hid +d:drivers/hid/usbhid +d:drivers/hsi +d:drivers/hsi/clients +d:drivers/hsi/controllers +d:drivers/hte +d:drivers/hv +d:drivers/hwmon +d:drivers/hwmon/occ +d:drivers/hwmon/peci +d:drivers/hwmon/pmbus +d:drivers/hwspinlock +d:drivers/hwtracing +d:drivers/hwtracing/coresight +d:drivers/hwtracing/intel_th +d:drivers/hwtracing/ptt +d:drivers/hwtracing/stm +d:drivers/i2c +d:drivers/i2c/algos +d:drivers/i2c/busses +d:drivers/i2c/muxes +d:drivers/i3c +d:drivers/i3c/master +d:drivers/i3c/master/mipi-i3c-hci +d:drivers/idle +d:drivers/iio +d:drivers/iio/accel +d:drivers/iio/adc +d:drivers/iio/addac +d:drivers/iio/afe +d:drivers/iio/amplifiers +d:drivers/iio/buffer +d:drivers/iio/cdc +d:drivers/iio/chemical +d:drivers/iio/common +d:drivers/iio/common/cros_ec_sensors +d:drivers/iio/common/hid-sensors +d:drivers/iio/common/inv_sensors +d:drivers/iio/common/ms_sensors +d:drivers/iio/common/scmi_sensors +d:drivers/iio/common/ssp_sensors +d:drivers/iio/common/st_sensors +d:drivers/iio/dac +d:drivers/iio/dummy +d:drivers/iio/filter +d:drivers/iio/frequency +d:drivers/iio/gyro +d:drivers/iio/health +d:drivers/iio/humidity +d:drivers/iio/imu +d:drivers/iio/imu/bmi160 +d:drivers/iio/imu/bmi270 +d:drivers/iio/imu/bmi323 +d:drivers/iio/imu/bno055 +d:drivers/iio/imu/inv_icm42600 +d:drivers/iio/imu/inv_mpu6050 +d:drivers/iio/imu/st_lsm6dsx +d:drivers/iio/imu/st_lsm9ds0 +d:drivers/iio/light +d:drivers/iio/magnetometer +d:drivers/iio/multiplexer +d:drivers/iio/orientation +d:drivers/iio/position +d:drivers/iio/potentiometer +d:drivers/iio/potentiostat +d:drivers/iio/pressure +d:drivers/iio/proximity +d:drivers/iio/resolver +d:drivers/iio/temperature +d:drivers/iio/test +d:drivers/iio/trigger +d:drivers/infiniband +d:drivers/infiniband/core +d:drivers/infiniband/hw +d:drivers/infiniband/hw/bnxt_re +d:drivers/infiniband/hw/cxgb4 +d:drivers/infiniband/hw/efa +d:drivers/infiniband/hw/erdma +d:drivers/infiniband/hw/hfi1 +d:drivers/infiniband/hw/hns +d:drivers/infiniband/hw/irdma +d:drivers/infiniband/hw/mana +d:drivers/infiniband/hw/mlx4 +d:drivers/infiniband/hw/mlx5 +d:drivers/infiniband/hw/mthca +d:drivers/infiniband/hw/ocrdma +d:drivers/infiniband/hw/qedr +d:drivers/infiniband/hw/usnic +d:drivers/infiniband/hw/vmw_pvrdma +d:drivers/infiniband/sw +d:drivers/infiniband/sw/rdmavt +d:drivers/infiniband/sw/rxe +d:drivers/infiniband/sw/siw +d:drivers/infiniband/ulp +d:drivers/infiniband/ulp/ipoib +d:drivers/infiniband/ulp/iser +d:drivers/infiniband/ulp/isert +d:drivers/infiniband/ulp/opa_vnic +d:drivers/infiniband/ulp/rtrs +d:drivers/infiniband/ulp/srp +d:drivers/infiniband/ulp/srpt +d:drivers/input +d:drivers/input/gameport +d:drivers/input/joystick +d:drivers/input/joystick/iforce +d:drivers/input/keyboard +d:drivers/input/misc +d:drivers/input/mouse +d:drivers/input/rmi4 +d:drivers/input/serio +d:drivers/input/tablet +d:drivers/input/tests +d:drivers/input/touchscreen +d:drivers/interconnect +d:drivers/interconnect/imx +d:drivers/interconnect/mediatek +d:drivers/interconnect/qcom +d:drivers/interconnect/samsung +d:drivers/iommu +d:drivers/iommu/amd +d:drivers/iommu/arm +d:drivers/iommu/arm/arm-smmu +d:drivers/iommu/arm/arm-smmu-v3 +d:drivers/iommu/intel +d:drivers/iommu/iommufd +d:drivers/iommu/riscv +d:drivers/ipack +d:drivers/ipack/carriers +d:drivers/ipack/devices +d:drivers/irqchip +d:drivers/isdn +d:drivers/isdn/capi +d:drivers/isdn/hardware +d:drivers/isdn/hardware/mISDN +d:drivers/isdn/mISDN +d:drivers/leds +d:drivers/leds/blink +d:drivers/leds/flash +d:drivers/leds/rgb +d:drivers/leds/simatic +d:drivers/leds/trigger +d:drivers/macintosh +d:drivers/macintosh/ams +d:drivers/mailbox +d:drivers/mcb +d:drivers/md +d:drivers/md/bcache +d:drivers/md/dm-vdo +d:drivers/md/dm-vdo/indexer +d:drivers/md/persistent-data +d:drivers/media +d:drivers/media/cec +d:drivers/media/cec/core +d:drivers/media/cec/i2c +d:drivers/media/cec/platform +d:drivers/media/cec/platform/cec-gpio +d:drivers/media/cec/platform/cros-ec +d:drivers/media/cec/platform/meson +d:drivers/media/cec/platform/s5p +d:drivers/media/cec/platform/seco +d:drivers/media/cec/platform/sti +d:drivers/media/cec/platform/stm32 +d:drivers/media/cec/platform/tegra +d:drivers/media/cec/usb +d:drivers/media/cec/usb/extron-da-hd-4k-plus +d:drivers/media/cec/usb/pulse8 +d:drivers/media/cec/usb/rainshadow +d:drivers/media/common +d:drivers/media/common/b2c2 +d:drivers/media/common/saa7146 +d:drivers/media/common/siano +d:drivers/media/common/v4l2-tpg +d:drivers/media/common/videobuf2 +d:drivers/media/dvb-core +d:drivers/media/dvb-frontends +d:drivers/media/dvb-frontends/cxd2880 +d:drivers/media/dvb-frontends/drx39xyj +d:drivers/media/firewire +d:drivers/media/i2c +d:drivers/media/i2c/adv748x +d:drivers/media/i2c/ccs +d:drivers/media/i2c/cx25840 +d:drivers/media/i2c/et8ek8 +d:drivers/media/i2c/s5c73m3 +d:drivers/media/mc +d:drivers/media/mmc +d:drivers/media/mmc/siano +d:drivers/media/pci +d:drivers/media/pci/b2c2 +d:drivers/media/pci/bt8xx +d:drivers/media/pci/cobalt +d:drivers/media/pci/cx18 +d:drivers/media/pci/cx23885 +d:drivers/media/pci/cx25821 +d:drivers/media/pci/cx88 +d:drivers/media/pci/ddbridge +d:drivers/media/pci/dm1105 +d:drivers/media/pci/dt3155 +d:drivers/media/pci/intel +d:drivers/media/pci/intel/ipu3 +d:drivers/media/pci/intel/ipu6 +d:drivers/media/pci/intel/ivsc +d:drivers/media/pci/ivtv +d:drivers/media/pci/mantis +d:drivers/media/pci/mgb4 +d:drivers/media/pci/netup_unidvb +d:drivers/media/pci/ngene +d:drivers/media/pci/pluto2 +d:drivers/media/pci/pt1 +d:drivers/media/pci/pt3 +d:drivers/media/pci/saa7134 +d:drivers/media/pci/saa7146 +d:drivers/media/pci/saa7164 +d:drivers/media/pci/smipcie +d:drivers/media/pci/solo6x10 +d:drivers/media/pci/ttpci +d:drivers/media/pci/tw5864 +d:drivers/media/pci/tw68 +d:drivers/media/pci/tw686x +d:drivers/media/pci/zoran +d:drivers/media/platform +d:drivers/media/platform/allegro-dvt +d:drivers/media/platform/amlogic +d:drivers/media/platform/amlogic/c3 +d:drivers/media/platform/amlogic/c3/isp +d:drivers/media/platform/amlogic/c3/mipi-adapter +d:drivers/media/platform/amlogic/c3/mipi-csi2 +d:drivers/media/platform/amlogic/meson-ge2d +d:drivers/media/platform/amphion +d:drivers/media/platform/aspeed +d:drivers/media/platform/atmel +d:drivers/media/platform/broadcom +d:drivers/media/platform/cadence +d:drivers/media/platform/chips-media +d:drivers/media/platform/chips-media/coda +d:drivers/media/platform/chips-media/wave5 +d:drivers/media/platform/imagination +d:drivers/media/platform/intel +d:drivers/media/platform/marvell +d:drivers/media/platform/mediatek +d:drivers/media/platform/mediatek/jpeg +d:drivers/media/platform/mediatek/mdp +d:drivers/media/platform/mediatek/mdp3 +d:drivers/media/platform/mediatek/vcodec +d:drivers/media/platform/mediatek/vcodec/common +d:drivers/media/platform/mediatek/vcodec/decoder +d:drivers/media/platform/mediatek/vcodec/decoder/vdec +d:drivers/media/platform/mediatek/vcodec/encoder +d:drivers/media/platform/mediatek/vcodec/encoder/venc +d:drivers/media/platform/mediatek/vpu +d:drivers/media/platform/microchip +d:drivers/media/platform/nuvoton +d:drivers/media/platform/nvidia +d:drivers/media/platform/nvidia/tegra-vde +d:drivers/media/platform/nxp +d:drivers/media/platform/nxp/dw100 +d:drivers/media/platform/nxp/imx-jpeg +d:drivers/media/platform/nxp/imx8-isi +d:drivers/media/platform/qcom +d:drivers/media/platform/qcom/camss +d:drivers/media/platform/qcom/iris +d:drivers/media/platform/qcom/venus +d:drivers/media/platform/raspberrypi +d:drivers/media/platform/raspberrypi/pisp_be +d:drivers/media/platform/raspberrypi/rp1-cfe +d:drivers/media/platform/renesas +d:drivers/media/platform/renesas/rcar-isp +d:drivers/media/platform/renesas/rcar-vin +d:drivers/media/platform/renesas/rzg2l-cru +d:drivers/media/platform/renesas/vsp1 +d:drivers/media/platform/rockchip +d:drivers/media/platform/rockchip/rga +d:drivers/media/platform/rockchip/rkisp1 +d:drivers/media/platform/rockchip/rkvdec +d:drivers/media/platform/samsung +d:drivers/media/platform/samsung/exynos-gsc +d:drivers/media/platform/samsung/exynos4-is +d:drivers/media/platform/samsung/s3c-camif +d:drivers/media/platform/samsung/s5p-g2d +d:drivers/media/platform/samsung/s5p-jpeg +d:drivers/media/platform/samsung/s5p-mfc +d:drivers/media/platform/st +d:drivers/media/platform/st/sti +d:drivers/media/platform/st/sti/bdisp +d:drivers/media/platform/st/sti/c8sectpfe +d:drivers/media/platform/st/sti/delta +d:drivers/media/platform/st/sti/hva +d:drivers/media/platform/st/stm32 +d:drivers/media/platform/st/stm32/dma2d +d:drivers/media/platform/st/stm32/stm32-dcmipp +d:drivers/media/platform/sunxi +d:drivers/media/platform/sunxi/sun4i-csi +d:drivers/media/platform/sunxi/sun6i-csi +d:drivers/media/platform/sunxi/sun6i-mipi-csi2 +d:drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2 +d:drivers/media/platform/sunxi/sun8i-di +d:drivers/media/platform/sunxi/sun8i-rotate +d:drivers/media/platform/synopsys +d:drivers/media/platform/synopsys/hdmirx +d:drivers/media/platform/ti +d:drivers/media/platform/ti/am437x +d:drivers/media/platform/ti/cal +d:drivers/media/platform/ti/davinci +d:drivers/media/platform/ti/j721e-csi2rx +d:drivers/media/platform/ti/omap +d:drivers/media/platform/ti/omap3isp +d:drivers/media/platform/ti/vpe +d:drivers/media/platform/verisilicon +d:drivers/media/platform/via +d:drivers/media/platform/xilinx +d:drivers/media/radio +d:drivers/media/radio/si470x +d:drivers/media/radio/si4713 +d:drivers/media/rc +d:drivers/media/rc/img-ir +d:drivers/media/rc/keymaps +d:drivers/media/spi +d:drivers/media/test-drivers +d:drivers/media/test-drivers/vicodec +d:drivers/media/test-drivers/vidtv +d:drivers/media/test-drivers/vimc +d:drivers/media/test-drivers/visl +d:drivers/media/test-drivers/vivid +d:drivers/media/tuners +d:drivers/media/usb +d:drivers/media/usb/airspy +d:drivers/media/usb/as102 +d:drivers/media/usb/au0828 +d:drivers/media/usb/b2c2 +d:drivers/media/usb/cx231xx +d:drivers/media/usb/dvb-usb +d:drivers/media/usb/dvb-usb-v2 +d:drivers/media/usb/em28xx +d:drivers/media/usb/go7007 +d:drivers/media/usb/gspca +d:drivers/media/usb/gspca/gl860 +d:drivers/media/usb/gspca/m5602 +d:drivers/media/usb/gspca/stv06xx +d:drivers/media/usb/hackrf +d:drivers/media/usb/hdpvr +d:drivers/media/usb/msi2500 +d:drivers/media/usb/pvrusb2 +d:drivers/media/usb/pwc +d:drivers/media/usb/s2255 +d:drivers/media/usb/siano +d:drivers/media/usb/stk1160 +d:drivers/media/usb/ttusb-budget +d:drivers/media/usb/ttusb-dec +d:drivers/media/usb/usbtv +d:drivers/media/usb/uvc +d:drivers/media/v4l2-core +d:drivers/memory +d:drivers/memory/samsung +d:drivers/memory/tegra +d:drivers/memstick +d:drivers/memstick/core +d:drivers/memstick/host +d:drivers/message +d:drivers/message/fusion +d:drivers/message/fusion/lsi +d:drivers/mfd +d:drivers/misc +d:drivers/misc/altera-stapl +d:drivers/misc/amd-sbi +d:drivers/misc/bcm-vk +d:drivers/misc/c2port +d:drivers/misc/cardreader +d:drivers/misc/cb710 +d:drivers/misc/eeprom +d:drivers/misc/genwqe +d:drivers/misc/ibmasm +d:drivers/misc/keba +d:drivers/misc/lis3lv02d +d:drivers/misc/lkdtm +d:drivers/misc/mchp_pci1xxxx +d:drivers/misc/mei +d:drivers/misc/mei/gsc_proxy +d:drivers/misc/mei/hdcp +d:drivers/misc/mei/pxp +d:drivers/misc/ocxl +d:drivers/misc/pvpanic +d:drivers/misc/rp1 +d:drivers/misc/sgi-gru +d:drivers/misc/sgi-xp +d:drivers/misc/uacce +d:drivers/misc/vmw_vmci +d:drivers/mmc +d:drivers/mmc/core +d:drivers/mmc/host +d:drivers/most +d:drivers/mtd +d:drivers/mtd/chips +d:drivers/mtd/devices +d:drivers/mtd/hyperbus +d:drivers/mtd/lpddr +d:drivers/mtd/maps +d:drivers/mtd/nand +d:drivers/mtd/nand/onenand +d:drivers/mtd/nand/raw +d:drivers/mtd/nand/raw/atmel +d:drivers/mtd/nand/raw/bcm47xxnflash +d:drivers/mtd/nand/raw/brcmnand +d:drivers/mtd/nand/raw/gpmi-nand +d:drivers/mtd/nand/raw/ingenic +d:drivers/mtd/nand/spi +d:drivers/mtd/parsers +d:drivers/mtd/spi-nor +d:drivers/mtd/spi-nor/controllers +d:drivers/mtd/tests +d:drivers/mtd/ubi +d:drivers/mux +d:drivers/net +d:drivers/net/arcnet +d:drivers/net/bonding +d:drivers/net/caif +d:drivers/net/can +d:drivers/net/can/c_can +d:drivers/net/can/cc770 +d:drivers/net/can/ctucanfd +d:drivers/net/can/dev +d:drivers/net/can/esd +d:drivers/net/can/flexcan +d:drivers/net/can/ifi_canfd +d:drivers/net/can/kvaser_pciefd +d:drivers/net/can/m_can +d:drivers/net/can/mscan +d:drivers/net/can/peak_canfd +d:drivers/net/can/rcar +d:drivers/net/can/rockchip +d:drivers/net/can/sja1000 +d:drivers/net/can/slcan +d:drivers/net/can/softing +d:drivers/net/can/spi +d:drivers/net/can/spi/mcp251xfd +d:drivers/net/can/usb +d:drivers/net/can/usb/etas_es58x +d:drivers/net/can/usb/kvaser_usb +d:drivers/net/can/usb/peak_usb +d:drivers/net/dsa +d:drivers/net/dsa/b53 +d:drivers/net/dsa/hirschmann +d:drivers/net/dsa/microchip +d:drivers/net/dsa/mv88e6xxx +d:drivers/net/dsa/ocelot +d:drivers/net/dsa/qca +d:drivers/net/dsa/realtek +d:drivers/net/dsa/sja1105 +d:drivers/net/dsa/xrs700x +d:drivers/net/ethernet +d:drivers/net/ethernet/3com +d:drivers/net/ethernet/8390 +d:drivers/net/ethernet/actions +d:drivers/net/ethernet/adaptec +d:drivers/net/ethernet/adi +d:drivers/net/ethernet/aeroflex +d:drivers/net/ethernet/agere +d:drivers/net/ethernet/airoha +d:drivers/net/ethernet/alacritech +d:drivers/net/ethernet/allwinner +d:drivers/net/ethernet/alteon +d:drivers/net/ethernet/altera +d:drivers/net/ethernet/amazon +d:drivers/net/ethernet/amazon/ena +d:drivers/net/ethernet/amd +d:drivers/net/ethernet/amd/pds_core +d:drivers/net/ethernet/amd/xgbe +d:drivers/net/ethernet/apm +d:drivers/net/ethernet/apm/xgene +d:drivers/net/ethernet/apm/xgene-v2 +d:drivers/net/ethernet/apple +d:drivers/net/ethernet/aquantia +d:drivers/net/ethernet/aquantia/atlantic +d:drivers/net/ethernet/aquantia/atlantic/hw_atl +d:drivers/net/ethernet/aquantia/atlantic/hw_atl2 +d:drivers/net/ethernet/aquantia/atlantic/macsec +d:drivers/net/ethernet/arc +d:drivers/net/ethernet/asix +d:drivers/net/ethernet/atheros +d:drivers/net/ethernet/atheros/alx +d:drivers/net/ethernet/atheros/atl1c +d:drivers/net/ethernet/atheros/atl1e +d:drivers/net/ethernet/atheros/atlx +d:drivers/net/ethernet/broadcom +d:drivers/net/ethernet/broadcom/asp2 +d:drivers/net/ethernet/broadcom/bnge +d:drivers/net/ethernet/broadcom/bnx2x +d:drivers/net/ethernet/broadcom/bnxt +d:drivers/net/ethernet/broadcom/genet +d:drivers/net/ethernet/brocade +d:drivers/net/ethernet/brocade/bna +d:drivers/net/ethernet/cadence +d:drivers/net/ethernet/calxeda +d:drivers/net/ethernet/cavium +d:drivers/net/ethernet/cavium/common +d:drivers/net/ethernet/cavium/liquidio +d:drivers/net/ethernet/cavium/octeon +d:drivers/net/ethernet/cavium/thunder +d:drivers/net/ethernet/chelsio +d:drivers/net/ethernet/chelsio/cxgb +d:drivers/net/ethernet/chelsio/cxgb3 +d:drivers/net/ethernet/chelsio/cxgb4 +d:drivers/net/ethernet/chelsio/cxgb4vf +d:drivers/net/ethernet/chelsio/inline_crypto +d:drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec +d:drivers/net/ethernet/chelsio/inline_crypto/ch_ktls +d:drivers/net/ethernet/chelsio/inline_crypto/chtls +d:drivers/net/ethernet/chelsio/libcxgb +d:drivers/net/ethernet/cirrus +d:drivers/net/ethernet/cisco +d:drivers/net/ethernet/cisco/enic +d:drivers/net/ethernet/cortina +d:drivers/net/ethernet/davicom +d:drivers/net/ethernet/dec +d:drivers/net/ethernet/dec/tulip +d:drivers/net/ethernet/dlink +d:drivers/net/ethernet/emulex +d:drivers/net/ethernet/emulex/benet +d:drivers/net/ethernet/engleder +d:drivers/net/ethernet/ezchip +d:drivers/net/ethernet/faraday +d:drivers/net/ethernet/freescale +d:drivers/net/ethernet/freescale/dpaa +d:drivers/net/ethernet/freescale/dpaa2 +d:drivers/net/ethernet/freescale/enetc +d:drivers/net/ethernet/freescale/fman +d:drivers/net/ethernet/freescale/fs_enet +d:drivers/net/ethernet/fujitsu +d:drivers/net/ethernet/fungible +d:drivers/net/ethernet/fungible/funcore +d:drivers/net/ethernet/fungible/funeth +d:drivers/net/ethernet/google +d:drivers/net/ethernet/google/gve +d:drivers/net/ethernet/hisilicon +d:drivers/net/ethernet/hisilicon/hibmcge +d:drivers/net/ethernet/hisilicon/hns +d:drivers/net/ethernet/hisilicon/hns3 +d:drivers/net/ethernet/hisilicon/hns3/hns3_common +d:drivers/net/ethernet/hisilicon/hns3/hns3pf +d:drivers/net/ethernet/hisilicon/hns3/hns3vf +d:drivers/net/ethernet/huawei +d:drivers/net/ethernet/huawei/hinic +d:drivers/net/ethernet/huawei/hinic3 +d:drivers/net/ethernet/i825xx +d:drivers/net/ethernet/ibm +d:drivers/net/ethernet/ibm/ehea +d:drivers/net/ethernet/ibm/emac +d:drivers/net/ethernet/intel +d:drivers/net/ethernet/intel/e1000 +d:drivers/net/ethernet/intel/e1000e +d:drivers/net/ethernet/intel/fm10k +d:drivers/net/ethernet/intel/i40e +d:drivers/net/ethernet/intel/iavf +d:drivers/net/ethernet/intel/ice +d:drivers/net/ethernet/intel/ice/devlink +d:drivers/net/ethernet/intel/idpf +d:drivers/net/ethernet/intel/igb +d:drivers/net/ethernet/intel/igbvf +d:drivers/net/ethernet/intel/igc +d:drivers/net/ethernet/intel/ixgbe +d:drivers/net/ethernet/intel/ixgbe/devlink +d:drivers/net/ethernet/intel/ixgbevf +d:drivers/net/ethernet/intel/libeth +d:drivers/net/ethernet/intel/libie +d:drivers/net/ethernet/litex +d:drivers/net/ethernet/marvell +d:drivers/net/ethernet/marvell/mvpp2 +d:drivers/net/ethernet/marvell/octeon_ep +d:drivers/net/ethernet/marvell/octeon_ep_vf +d:drivers/net/ethernet/marvell/octeontx2 +d:drivers/net/ethernet/marvell/octeontx2/af +d:drivers/net/ethernet/marvell/octeontx2/af/cn20k +d:drivers/net/ethernet/marvell/octeontx2/nic +d:drivers/net/ethernet/marvell/prestera +d:drivers/net/ethernet/mediatek +d:drivers/net/ethernet/mellanox +d:drivers/net/ethernet/mellanox/mlx4 +d:drivers/net/ethernet/mellanox/mlx5 +d:drivers/net/ethernet/mellanox/mlx5/core +d:drivers/net/ethernet/mellanox/mlx5/core/diag +d:drivers/net/ethernet/mellanox/mlx5/core/en +d:drivers/net/ethernet/mellanox/mlx5/core/en/rep +d:drivers/net/ethernet/mellanox/mlx5/core/en/tc +d:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act +d:drivers/net/ethernet/mellanox/mlx5/core/en/xsk +d:drivers/net/ethernet/mellanox/mlx5/core/en_accel +d:drivers/net/ethernet/mellanox/mlx5/core/esw +d:drivers/net/ethernet/mellanox/mlx5/core/esw/acl +d:drivers/net/ethernet/mellanox/mlx5/core/esw/diag +d:drivers/net/ethernet/mellanox/mlx5/core/fpga +d:drivers/net/ethernet/mellanox/mlx5/core/ipoib +d:drivers/net/ethernet/mellanox/mlx5/core/lag +d:drivers/net/ethernet/mellanox/mlx5/core/lib +d:drivers/net/ethernet/mellanox/mlx5/core/sf +d:drivers/net/ethernet/mellanox/mlx5/core/sf/dev +d:drivers/net/ethernet/mellanox/mlx5/core/sf/dev/diag +d:drivers/net/ethernet/mellanox/mlx5/core/sf/diag +d:drivers/net/ethernet/mellanox/mlx5/core/steering +d:drivers/net/ethernet/mellanox/mlx5/core/steering/hws +d:drivers/net/ethernet/mellanox/mlx5/core/steering/sws +d:drivers/net/ethernet/mellanox/mlxbf_gige +d:drivers/net/ethernet/mellanox/mlxfw +d:drivers/net/ethernet/mellanox/mlxsw +d:drivers/net/ethernet/meta +d:drivers/net/ethernet/meta/fbnic +d:drivers/net/ethernet/micrel +d:drivers/net/ethernet/microchip +d:drivers/net/ethernet/microchip/fdma +d:drivers/net/ethernet/microchip/lan865x +d:drivers/net/ethernet/microchip/lan966x +d:drivers/net/ethernet/microchip/sparx5 +d:drivers/net/ethernet/microchip/sparx5/lan969x +d:drivers/net/ethernet/microchip/vcap +d:drivers/net/ethernet/microsoft +d:drivers/net/ethernet/microsoft/mana +d:drivers/net/ethernet/moxa +d:drivers/net/ethernet/mscc +d:drivers/net/ethernet/myricom +d:drivers/net/ethernet/myricom/myri10ge +d:drivers/net/ethernet/natsemi +d:drivers/net/ethernet/neterion +d:drivers/net/ethernet/netronome +d:drivers/net/ethernet/netronome/nfp +d:drivers/net/ethernet/netronome/nfp/abm +d:drivers/net/ethernet/netronome/nfp/bpf +d:drivers/net/ethernet/netronome/nfp/crypto +d:drivers/net/ethernet/netronome/nfp/flower +d:drivers/net/ethernet/netronome/nfp/nfd3 +d:drivers/net/ethernet/netronome/nfp/nfdk +d:drivers/net/ethernet/netronome/nfp/nfpcore +d:drivers/net/ethernet/netronome/nfp/nfpcore/nfp6000 +d:drivers/net/ethernet/netronome/nfp/nic +d:drivers/net/ethernet/ni +d:drivers/net/ethernet/nvidia +d:drivers/net/ethernet/nxp +d:drivers/net/ethernet/oki-semi +d:drivers/net/ethernet/oki-semi/pch_gbe +d:drivers/net/ethernet/packetengines +d:drivers/net/ethernet/pasemi +d:drivers/net/ethernet/pensando +d:drivers/net/ethernet/pensando/ionic +d:drivers/net/ethernet/qlogic +d:drivers/net/ethernet/qlogic/netxen +d:drivers/net/ethernet/qlogic/qed +d:drivers/net/ethernet/qlogic/qede +d:drivers/net/ethernet/qlogic/qlcnic +d:drivers/net/ethernet/qualcomm +d:drivers/net/ethernet/qualcomm/emac +d:drivers/net/ethernet/qualcomm/rmnet +d:drivers/net/ethernet/rdc +d:drivers/net/ethernet/realtek +d:drivers/net/ethernet/realtek/rtase +d:drivers/net/ethernet/renesas +d:drivers/net/ethernet/rocker +d:drivers/net/ethernet/samsung +d:drivers/net/ethernet/samsung/sxgbe +d:drivers/net/ethernet/seeq +d:drivers/net/ethernet/sfc +d:drivers/net/ethernet/sfc/falcon +d:drivers/net/ethernet/sfc/siena +d:drivers/net/ethernet/sgi +d:drivers/net/ethernet/silan +d:drivers/net/ethernet/sis +d:drivers/net/ethernet/smsc +d:drivers/net/ethernet/socionext +d:drivers/net/ethernet/stmicro +d:drivers/net/ethernet/stmicro/stmmac +d:drivers/net/ethernet/sun +d:drivers/net/ethernet/sunplus +d:drivers/net/ethernet/synopsys +d:drivers/net/ethernet/tehuti +d:drivers/net/ethernet/ti +d:drivers/net/ethernet/ti/icssg +d:drivers/net/ethernet/toshiba +d:drivers/net/ethernet/tundra +d:drivers/net/ethernet/vertexcom +d:drivers/net/ethernet/via +d:drivers/net/ethernet/wangxun +d:drivers/net/ethernet/wangxun/libwx +d:drivers/net/ethernet/wangxun/ngbe +d:drivers/net/ethernet/wangxun/ngbevf +d:drivers/net/ethernet/wangxun/txgbe +d:drivers/net/ethernet/wangxun/txgbevf +d:drivers/net/ethernet/wiznet +d:drivers/net/ethernet/xilinx +d:drivers/net/ethernet/xircom +d:drivers/net/ethernet/xscale +d:drivers/net/fddi +d:drivers/net/fddi/skfp +d:drivers/net/fddi/skfp/h +d:drivers/net/fjes +d:drivers/net/hamradio +d:drivers/net/hippi +d:drivers/net/hyperv +d:drivers/net/ieee802154 +d:drivers/net/ipa +d:drivers/net/ipa/data +d:drivers/net/ipa/reg +d:drivers/net/ipvlan +d:drivers/net/mctp +d:drivers/net/mdio +d:drivers/net/netdevsim +d:drivers/net/ovpn +d:drivers/net/pcs +d:drivers/net/phy +d:drivers/net/phy/aquantia +d:drivers/net/phy/mediatek +d:drivers/net/phy/mscc +d:drivers/net/phy/qcom +d:drivers/net/phy/realtek +d:drivers/net/plip +d:drivers/net/ppp +d:drivers/net/pse-pd +d:drivers/net/slip +d:drivers/net/team +d:drivers/net/thunderbolt +d:drivers/net/usb +d:drivers/net/vmxnet3 +d:drivers/net/vxlan +d:drivers/net/wan +d:drivers/net/wan/framer +d:drivers/net/wan/framer/pef2256 +d:drivers/net/wireguard +d:drivers/net/wireguard/selftest +d:drivers/net/wireless +d:drivers/net/wireless/admtek +d:drivers/net/wireless/ath +d:drivers/net/wireless/ath/ar5523 +d:drivers/net/wireless/ath/ath10k +d:drivers/net/wireless/ath/ath11k +d:drivers/net/wireless/ath/ath12k +d:drivers/net/wireless/ath/ath5k +d:drivers/net/wireless/ath/ath6kl +d:drivers/net/wireless/ath/ath9k +d:drivers/net/wireless/ath/carl9170 +d:drivers/net/wireless/ath/wcn36xx +d:drivers/net/wireless/ath/wil6210 +d:drivers/net/wireless/atmel +d:drivers/net/wireless/broadcom +d:drivers/net/wireless/broadcom/b43 +d:drivers/net/wireless/broadcom/b43legacy +d:drivers/net/wireless/broadcom/brcm80211 +d:drivers/net/wireless/broadcom/brcm80211/brcmfmac +d:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca +d:drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw +d:drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc +d:drivers/net/wireless/broadcom/brcm80211/brcmsmac +d:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy +d:drivers/net/wireless/broadcom/brcm80211/brcmutil +d:drivers/net/wireless/broadcom/brcm80211/include +d:drivers/net/wireless/intel +d:drivers/net/wireless/intel/ipw2x00 +d:drivers/net/wireless/intel/iwlegacy +d:drivers/net/wireless/intel/iwlwifi +d:drivers/net/wireless/intel/iwlwifi/cfg +d:drivers/net/wireless/intel/iwlwifi/dvm +d:drivers/net/wireless/intel/iwlwifi/fw +d:drivers/net/wireless/intel/iwlwifi/fw/api +d:drivers/net/wireless/intel/iwlwifi/mei +d:drivers/net/wireless/intel/iwlwifi/mld +d:drivers/net/wireless/intel/iwlwifi/mld/tests +d:drivers/net/wireless/intel/iwlwifi/mvm +d:drivers/net/wireless/intel/iwlwifi/mvm/tests +d:drivers/net/wireless/intel/iwlwifi/pcie +d:drivers/net/wireless/intel/iwlwifi/pcie/gen1_2 +d:drivers/net/wireless/intel/iwlwifi/tests +d:drivers/net/wireless/intersil +d:drivers/net/wireless/intersil/p54 +d:drivers/net/wireless/marvell +d:drivers/net/wireless/marvell/libertas +d:drivers/net/wireless/marvell/libertas_tf +d:drivers/net/wireless/marvell/mwifiex +d:drivers/net/wireless/mediatek +d:drivers/net/wireless/mediatek/mt76 +d:drivers/net/wireless/mediatek/mt76/mt7603 +d:drivers/net/wireless/mediatek/mt76/mt7615 +d:drivers/net/wireless/mediatek/mt76/mt76x0 +d:drivers/net/wireless/mediatek/mt76/mt76x2 +d:drivers/net/wireless/mediatek/mt76/mt7915 +d:drivers/net/wireless/mediatek/mt76/mt7921 +d:drivers/net/wireless/mediatek/mt76/mt7925 +d:drivers/net/wireless/mediatek/mt76/mt7996 +d:drivers/net/wireless/mediatek/mt7601u +d:drivers/net/wireless/microchip +d:drivers/net/wireless/microchip/wilc1000 +d:drivers/net/wireless/purelifi +d:drivers/net/wireless/purelifi/plfxlc +d:drivers/net/wireless/quantenna +d:drivers/net/wireless/quantenna/qtnfmac +d:drivers/net/wireless/quantenna/qtnfmac/pcie +d:drivers/net/wireless/ralink +d:drivers/net/wireless/ralink/rt2x00 +d:drivers/net/wireless/realtek +d:drivers/net/wireless/realtek/rtl818x +d:drivers/net/wireless/realtek/rtl818x/rtl8180 +d:drivers/net/wireless/realtek/rtl818x/rtl8187 +d:drivers/net/wireless/realtek/rtl8xxxu +d:drivers/net/wireless/realtek/rtlwifi +d:drivers/net/wireless/realtek/rtlwifi/btcoexist +d:drivers/net/wireless/realtek/rtlwifi/rtl8188ee +d:drivers/net/wireless/realtek/rtlwifi/rtl8192c +d:drivers/net/wireless/realtek/rtlwifi/rtl8192ce +d:drivers/net/wireless/realtek/rtlwifi/rtl8192cu +d:drivers/net/wireless/realtek/rtlwifi/rtl8192d +d:drivers/net/wireless/realtek/rtlwifi/rtl8192de +d:drivers/net/wireless/realtek/rtlwifi/rtl8192du +d:drivers/net/wireless/realtek/rtlwifi/rtl8192ee +d:drivers/net/wireless/realtek/rtlwifi/rtl8192se +d:drivers/net/wireless/realtek/rtlwifi/rtl8723ae +d:drivers/net/wireless/realtek/rtlwifi/rtl8723be +d:drivers/net/wireless/realtek/rtlwifi/rtl8723com +d:drivers/net/wireless/realtek/rtlwifi/rtl8821ae +d:drivers/net/wireless/realtek/rtw88 +d:drivers/net/wireless/realtek/rtw89 +d:drivers/net/wireless/rsi +d:drivers/net/wireless/silabs +d:drivers/net/wireless/silabs/wfx +d:drivers/net/wireless/st +d:drivers/net/wireless/st/cw1200 +d:drivers/net/wireless/ti +d:drivers/net/wireless/ti/wl1251 +d:drivers/net/wireless/ti/wl12xx +d:drivers/net/wireless/ti/wl18xx +d:drivers/net/wireless/ti/wlcore +d:drivers/net/wireless/virtual +d:drivers/net/wireless/zydas +d:drivers/net/wireless/zydas/zd1211rw +d:drivers/net/wwan +d:drivers/net/wwan/iosm +d:drivers/net/wwan/t7xx +d:drivers/net/xen-netback +d:drivers/nfc +d:drivers/nfc/fdp +d:drivers/nfc/microread +d:drivers/nfc/nfcmrvl +d:drivers/nfc/nxp-nci +d:drivers/nfc/pn533 +d:drivers/nfc/pn544 +d:drivers/nfc/s3fwrn5 +d:drivers/nfc/st-nci +d:drivers/nfc/st21nfca +d:drivers/nfc/st95hf +d:drivers/ntb +d:drivers/ntb/hw +d:drivers/ntb/hw/amd +d:drivers/ntb/hw/epf +d:drivers/ntb/hw/idt +d:drivers/ntb/hw/intel +d:drivers/ntb/hw/mscc +d:drivers/ntb/test +d:drivers/nubus +d:drivers/nvdimm +d:drivers/nvme +d:drivers/nvme/common +d:drivers/nvme/host +d:drivers/nvme/target +d:drivers/nvmem +d:drivers/nvmem/layouts +d:drivers/of +d:drivers/of/unittest-data +d:drivers/opp +d:drivers/parisc +d:drivers/parport +d:drivers/pci +d:drivers/pci/controller +d:drivers/pci/controller/cadence +d:drivers/pci/controller/dwc +d:drivers/pci/controller/mobiveil +d:drivers/pci/controller/plda +d:drivers/pci/endpoint +d:drivers/pci/endpoint/functions +d:drivers/pci/hotplug +d:drivers/pci/msi +d:drivers/pci/pcie +d:drivers/pci/pwrctrl +d:drivers/pci/switch +d:drivers/pcmcia +d:drivers/peci +d:drivers/peci/controller +d:drivers/perf +d:drivers/perf/amlogic +d:drivers/perf/arm_cspmu +d:drivers/perf/hisilicon +d:drivers/phy +d:drivers/phy/allwinner +d:drivers/phy/amlogic +d:drivers/phy/broadcom +d:drivers/phy/cadence +d:drivers/phy/freescale +d:drivers/phy/hisilicon +d:drivers/phy/ingenic +d:drivers/phy/intel +d:drivers/phy/lantiq +d:drivers/phy/marvell +d:drivers/phy/mediatek +d:drivers/phy/microchip +d:drivers/phy/motorola +d:drivers/phy/mscc +d:drivers/phy/nuvoton +d:drivers/phy/qualcomm +d:drivers/phy/ralink +d:drivers/phy/realtek +d:drivers/phy/renesas +d:drivers/phy/rockchip +d:drivers/phy/samsung +d:drivers/phy/socionext +d:drivers/phy/st +d:drivers/phy/starfive +d:drivers/phy/sunplus +d:drivers/phy/tegra +d:drivers/phy/ti +d:drivers/phy/xilinx +d:drivers/pinctrl +d:drivers/pinctrl/actions +d:drivers/pinctrl/aspeed +d:drivers/pinctrl/bcm +d:drivers/pinctrl/berlin +d:drivers/pinctrl/cirrus +d:drivers/pinctrl/freescale +d:drivers/pinctrl/intel +d:drivers/pinctrl/mediatek +d:drivers/pinctrl/meson +d:drivers/pinctrl/mvebu +d:drivers/pinctrl/nomadik +d:drivers/pinctrl/nuvoton +d:drivers/pinctrl/nxp +d:drivers/pinctrl/pxa +d:drivers/pinctrl/qcom +d:drivers/pinctrl/realtek +d:drivers/pinctrl/renesas +d:drivers/pinctrl/samsung +d:drivers/pinctrl/sophgo +d:drivers/pinctrl/spacemit +d:drivers/pinctrl/spear +d:drivers/pinctrl/sprd +d:drivers/pinctrl/starfive +d:drivers/pinctrl/stm32 +d:drivers/pinctrl/sunplus +d:drivers/pinctrl/sunxi +d:drivers/pinctrl/tegra +d:drivers/pinctrl/ti +d:drivers/pinctrl/uniphier +d:drivers/pinctrl/visconti +d:drivers/pinctrl/vt8500 +d:drivers/platform +d:drivers/platform/arm64 +d:drivers/platform/chrome +d:drivers/platform/chrome/wilco_ec +d:drivers/platform/cznic +d:drivers/platform/goldfish +d:drivers/platform/loongarch +d:drivers/platform/mellanox +d:drivers/platform/mips +d:drivers/platform/olpc +d:drivers/platform/surface +d:drivers/platform/surface/aggregator +d:drivers/platform/x86 +d:drivers/platform/x86/amd +d:drivers/platform/x86/amd/hfi +d:drivers/platform/x86/amd/hsmp +d:drivers/platform/x86/amd/pmc +d:drivers/platform/x86/amd/pmf +d:drivers/platform/x86/dell +d:drivers/platform/x86/dell/dell-wmi-sysman +d:drivers/platform/x86/hp +d:drivers/platform/x86/hp/hp-bioscfg +d:drivers/platform/x86/intel +d:drivers/platform/x86/intel/atomisp2 +d:drivers/platform/x86/intel/ifs +d:drivers/platform/x86/intel/int1092 +d:drivers/platform/x86/intel/int3472 +d:drivers/platform/x86/intel/pmc +d:drivers/platform/x86/intel/pmt +d:drivers/platform/x86/intel/speed_select_if +d:drivers/platform/x86/intel/telemetry +d:drivers/platform/x86/intel/uncore-frequency +d:drivers/platform/x86/intel/wmi +d:drivers/platform/x86/lenovo +d:drivers/platform/x86/siemens +d:drivers/platform/x86/tuxedo +d:drivers/platform/x86/tuxedo/nb04 +d:drivers/platform/x86/x86-android-tablets +d:drivers/pmdomain +d:drivers/pmdomain/actions +d:drivers/pmdomain/amlogic +d:drivers/pmdomain/apple +d:drivers/pmdomain/arm +d:drivers/pmdomain/bcm +d:drivers/pmdomain/imx +d:drivers/pmdomain/mediatek +d:drivers/pmdomain/qcom +d:drivers/pmdomain/renesas +d:drivers/pmdomain/rockchip +d:drivers/pmdomain/samsung +d:drivers/pmdomain/st +d:drivers/pmdomain/starfive +d:drivers/pmdomain/sunxi +d:drivers/pmdomain/tegra +d:drivers/pmdomain/thead +d:drivers/pmdomain/ti +d:drivers/pmdomain/xilinx +d:drivers/pnp +d:drivers/pnp/isapnp +d:drivers/pnp/pnpacpi +d:drivers/pnp/pnpbios +d:drivers/power +d:drivers/power/reset +d:drivers/power/sequencing +d:drivers/power/supply +d:drivers/powercap +d:drivers/pps +d:drivers/pps/clients +d:drivers/pps/generators +d:drivers/ps3 +d:drivers/ptp +d:drivers/pwm +d:drivers/rapidio +d:drivers/rapidio/devices +d:drivers/rapidio/switches +d:drivers/ras +d:drivers/ras/amd +d:drivers/ras/amd/atl +d:drivers/regulator +d:drivers/remoteproc +d:drivers/reset +d:drivers/reset/amlogic +d:drivers/reset/hisilicon +d:drivers/reset/starfive +d:drivers/reset/sti +d:drivers/reset/tegra +d:drivers/rpmsg +d:drivers/rtc +d:drivers/s390 +d:drivers/s390/block +d:drivers/s390/char +d:drivers/s390/cio +d:drivers/s390/crypto +d:drivers/s390/net +d:drivers/s390/scsi +d:drivers/s390/virtio +d:drivers/sbus +d:drivers/sbus/char +d:drivers/scsi +d:drivers/scsi/aacraid +d:drivers/scsi/aic7xxx +d:drivers/scsi/aic7xxx/aicasm +d:drivers/scsi/aic94xx +d:drivers/scsi/arcmsr +d:drivers/scsi/arm +d:drivers/scsi/be2iscsi +d:drivers/scsi/bfa +d:drivers/scsi/bnx2fc +d:drivers/scsi/bnx2i +d:drivers/scsi/csiostor +d:drivers/scsi/cxgbi +d:drivers/scsi/cxgbi/cxgb3i +d:drivers/scsi/cxgbi/cxgb4i +d:drivers/scsi/device_handler +d:drivers/scsi/elx +d:drivers/scsi/elx/efct +d:drivers/scsi/elx/include +d:drivers/scsi/elx/libefc +d:drivers/scsi/elx/libefc_sli +d:drivers/scsi/esas2r +d:drivers/scsi/fcoe +d:drivers/scsi/fnic +d:drivers/scsi/hisi_sas +d:drivers/scsi/ibmvscsi +d:drivers/scsi/ibmvscsi_tgt +d:drivers/scsi/isci +d:drivers/scsi/libfc +d:drivers/scsi/libsas +d:drivers/scsi/lpfc +d:drivers/scsi/megaraid +d:drivers/scsi/mpi3mr +d:drivers/scsi/mpi3mr/mpi +d:drivers/scsi/mpt3sas +d:drivers/scsi/mpt3sas/mpi +d:drivers/scsi/mvsas +d:drivers/scsi/pcmcia +d:drivers/scsi/pm8001 +d:drivers/scsi/qedf +d:drivers/scsi/qedi +d:drivers/scsi/qla2xxx +d:drivers/scsi/qla4xxx +d:drivers/scsi/smartpqi +d:drivers/scsi/snic +d:drivers/scsi/sym53c8xx_2 +d:drivers/sh +d:drivers/sh/clk +d:drivers/sh/intc +d:drivers/sh/maple +d:drivers/siox +d:drivers/slimbus +d:drivers/soc +d:drivers/soc/amlogic +d:drivers/soc/apple +d:drivers/soc/aspeed +d:drivers/soc/atmel +d:drivers/soc/bcm +d:drivers/soc/bcm/brcmstb +d:drivers/soc/bcm/brcmstb/pm +d:drivers/soc/canaan +d:drivers/soc/cirrus +d:drivers/soc/dove +d:drivers/soc/fsl +d:drivers/soc/fsl/dpio +d:drivers/soc/fsl/qbman +d:drivers/soc/fsl/qe +d:drivers/soc/fujitsu +d:drivers/soc/gemini +d:drivers/soc/hisilicon +d:drivers/soc/imx +d:drivers/soc/ixp4xx +d:drivers/soc/lantiq +d:drivers/soc/litex +d:drivers/soc/loongson +d:drivers/soc/mediatek +d:drivers/soc/microchip +d:drivers/soc/nuvoton +d:drivers/soc/pxa +d:drivers/soc/qcom +d:drivers/soc/renesas +d:drivers/soc/rockchip +d:drivers/soc/samsung +d:drivers/soc/sophgo +d:drivers/soc/sunxi +d:drivers/soc/tegra +d:drivers/soc/tegra/cbb +d:drivers/soc/tegra/fuse +d:drivers/soc/ti +d:drivers/soc/ux500 +d:drivers/soc/versatile +d:drivers/soc/vt8500 +d:drivers/soc/xilinx +d:drivers/soundwire +d:drivers/spi +d:drivers/spmi +d:drivers/ssb +d:drivers/staging +d:drivers/staging/axis-fifo +d:drivers/staging/fbtft +d:drivers/staging/gpib +d:drivers/staging/gpib/agilent_82350b +d:drivers/staging/gpib/agilent_82357a +d:drivers/staging/gpib/cb7210 +d:drivers/staging/gpib/cec +d:drivers/staging/gpib/common +d:drivers/staging/gpib/eastwood +d:drivers/staging/gpib/fmh_gpib +d:drivers/staging/gpib/gpio +d:drivers/staging/gpib/hp_82335 +d:drivers/staging/gpib/hp_82341 +d:drivers/staging/gpib/include +d:drivers/staging/gpib/ines +d:drivers/staging/gpib/lpvo_usb_gpib +d:drivers/staging/gpib/nec7210 +d:drivers/staging/gpib/ni_usb +d:drivers/staging/gpib/pc2 +d:drivers/staging/gpib/tms9914 +d:drivers/staging/gpib/tnt4882 +d:drivers/staging/gpib/uapi +d:drivers/staging/greybus +d:drivers/staging/greybus/Documentation +d:drivers/staging/greybus/Documentation/firmware +d:drivers/staging/iio +d:drivers/staging/iio/Documentation +d:drivers/staging/iio/accel +d:drivers/staging/iio/adc +d:drivers/staging/iio/addac +d:drivers/staging/iio/frequency +d:drivers/staging/iio/impedance-analyzer +d:drivers/staging/media +d:drivers/staging/media/atomisp +d:drivers/staging/media/atomisp/i2c +d:drivers/staging/media/atomisp/include +d:drivers/staging/media/atomisp/include/hmm +d:drivers/staging/media/atomisp/include/linux +d:drivers/staging/media/atomisp/include/mmu +d:drivers/staging/media/atomisp/pci +d:drivers/staging/media/atomisp/pci/base +d:drivers/staging/media/atomisp/pci/base/circbuf +d:drivers/staging/media/atomisp/pci/base/circbuf/interface +d:drivers/staging/media/atomisp/pci/base/circbuf/src +d:drivers/staging/media/atomisp/pci/base/refcount +d:drivers/staging/media/atomisp/pci/base/refcount/interface +d:drivers/staging/media/atomisp/pci/base/refcount/src +d:drivers/staging/media/atomisp/pci/camera +d:drivers/staging/media/atomisp/pci/camera/pipe +d:drivers/staging/media/atomisp/pci/camera/pipe/interface +d:drivers/staging/media/atomisp/pci/camera/pipe/src +d:drivers/staging/media/atomisp/pci/camera/util +d:drivers/staging/media/atomisp/pci/camera/util/interface +d:drivers/staging/media/atomisp/pci/camera/util/src +d:drivers/staging/media/atomisp/pci/css_2401_system +d:drivers/staging/media/atomisp/pci/css_2401_system/host +d:drivers/staging/media/atomisp/pci/css_2401_system/hrt +d:drivers/staging/media/atomisp/pci/hive_isp_css_common +d:drivers/staging/media/atomisp/pci/hive_isp_css_common/host +d:drivers/staging/media/atomisp/pci/hive_isp_css_include +d:drivers/staging/media/atomisp/pci/hive_isp_css_include/device_access +d:drivers/staging/media/atomisp/pci/hive_isp_css_include/host +d:drivers/staging/media/atomisp/pci/hive_isp_css_shared +d:drivers/staging/media/atomisp/pci/hive_isp_css_shared/host +d:drivers/staging/media/atomisp/pci/hmm +d:drivers/staging/media/atomisp/pci/isp +d:drivers/staging/media/atomisp/pci/isp/kernels +d:drivers/staging/media/atomisp/pci/isp/kernels/aa +d:drivers/staging/media/atomisp/pci/isp/kernels/aa/aa_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/anr +d:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/bh +d:drivers/staging/media/atomisp/pci/isp/kernels/bh/bh_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/bnlm +d:drivers/staging/media/atomisp/pci/isp/kernels/bnr +d:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr2_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/cnr +d:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/conversion +d:drivers/staging/media/atomisp/pci/isp/kernels/conversion/conversion_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/copy_output +d:drivers/staging/media/atomisp/pci/isp/kernels/copy_output/copy_output_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/crop +d:drivers/staging/media/atomisp/pci/isp/kernels/crop/crop_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/csc +d:drivers/staging/media/atomisp/pci/isp/kernels/csc/csc_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/ctc +d:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc1_5 +d:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc2 +d:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/de +d:drivers/staging/media/atomisp/pci/isp/kernels/de/de_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/de/de_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/dp +d:drivers/staging/media/atomisp/pci/isp/kernels/dp/dp_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/dpc2 +d:drivers/staging/media/atomisp/pci/isp/kernels/dvs +d:drivers/staging/media/atomisp/pci/isp/kernels/dvs/dvs_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/eed1_8 +d:drivers/staging/media/atomisp/pci/isp/kernels/fc +d:drivers/staging/media/atomisp/pci/isp/kernels/fc/fc_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/fixedbds +d:drivers/staging/media/atomisp/pci/isp/kernels/fixedbds/fixedbds_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/fpn +d:drivers/staging/media/atomisp/pci/isp/kernels/fpn/fpn_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/gc +d:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/hdr +d:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls +d:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls +d:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/common +d:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls +d:drivers/staging/media/atomisp/pci/isp/kernels/iterator +d:drivers/staging/media/atomisp/pci/isp/kernels/iterator/iterator_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/macc +d:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc1_5 +d:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/norm +d:drivers/staging/media/atomisp/pci/isp/kernels/norm/norm_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/ob +d:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob2 +d:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/output +d:drivers/staging/media/atomisp/pci/isp/kernels/output/output_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/qplane +d:drivers/staging/media/atomisp/pci/isp/kernels/qplane/qplane_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/raw +d:drivers/staging/media/atomisp/pci/isp/kernels/raw/raw_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/raw_aa_binning +d:drivers/staging/media/atomisp/pci/isp/kernels/raw_aa_binning/raw_aa_binning_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/ref +d:drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/s3a +d:drivers/staging/media/atomisp/pci/isp/kernels/s3a/s3a_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/sc +d:drivers/staging/media/atomisp/pci/isp/kernels/sc/sc_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/sdis +d:drivers/staging/media/atomisp/pci/isp/kernels/sdis/common +d:drivers/staging/media/atomisp/pci/isp/kernels/sdis/sdis_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/sdis/sdis_2 +d:drivers/staging/media/atomisp/pci/isp/kernels/tdf +d:drivers/staging/media/atomisp/pci/isp/kernels/tdf/tdf_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/tnr +d:drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr3 +d:drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/uds +d:drivers/staging/media/atomisp/pci/isp/kernels/uds/uds_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/vf +d:drivers/staging/media/atomisp/pci/isp/kernels/vf/vf_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/wb +d:drivers/staging/media/atomisp/pci/isp/kernels/wb/wb_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/xnr +d:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_3.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/ynr +d:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_1.0 +d:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_2 +d:drivers/staging/media/atomisp/pci/isp/modes +d:drivers/staging/media/atomisp/pci/isp/modes/interface +d:drivers/staging/media/atomisp/pci/mmu +d:drivers/staging/media/atomisp/pci/runtime +d:drivers/staging/media/atomisp/pci/runtime/binary +d:drivers/staging/media/atomisp/pci/runtime/binary/interface +d:drivers/staging/media/atomisp/pci/runtime/binary/src +d:drivers/staging/media/atomisp/pci/runtime/bufq +d:drivers/staging/media/atomisp/pci/runtime/bufq/interface +d:drivers/staging/media/atomisp/pci/runtime/bufq/src +d:drivers/staging/media/atomisp/pci/runtime/debug +d:drivers/staging/media/atomisp/pci/runtime/debug/interface +d:drivers/staging/media/atomisp/pci/runtime/debug/src +d:drivers/staging/media/atomisp/pci/runtime/event +d:drivers/staging/media/atomisp/pci/runtime/event/interface +d:drivers/staging/media/atomisp/pci/runtime/event/src +d:drivers/staging/media/atomisp/pci/runtime/eventq +d:drivers/staging/media/atomisp/pci/runtime/eventq/interface +d:drivers/staging/media/atomisp/pci/runtime/eventq/src +d:drivers/staging/media/atomisp/pci/runtime/frame +d:drivers/staging/media/atomisp/pci/runtime/frame/interface +d:drivers/staging/media/atomisp/pci/runtime/frame/src +d:drivers/staging/media/atomisp/pci/runtime/ifmtr +d:drivers/staging/media/atomisp/pci/runtime/ifmtr/interface +d:drivers/staging/media/atomisp/pci/runtime/ifmtr/src +d:drivers/staging/media/atomisp/pci/runtime/inputfifo +d:drivers/staging/media/atomisp/pci/runtime/inputfifo/interface +d:drivers/staging/media/atomisp/pci/runtime/inputfifo/src +d:drivers/staging/media/atomisp/pci/runtime/isp_param +d:drivers/staging/media/atomisp/pci/runtime/isp_param/interface +d:drivers/staging/media/atomisp/pci/runtime/isp_param/src +d:drivers/staging/media/atomisp/pci/runtime/isys +d:drivers/staging/media/atomisp/pci/runtime/isys/interface +d:drivers/staging/media/atomisp/pci/runtime/isys/src +d:drivers/staging/media/atomisp/pci/runtime/pipeline +d:drivers/staging/media/atomisp/pci/runtime/pipeline/interface +d:drivers/staging/media/atomisp/pci/runtime/pipeline/src +d:drivers/staging/media/atomisp/pci/runtime/queue +d:drivers/staging/media/atomisp/pci/runtime/queue/interface +d:drivers/staging/media/atomisp/pci/runtime/queue/src +d:drivers/staging/media/atomisp/pci/runtime/rmgr +d:drivers/staging/media/atomisp/pci/runtime/rmgr/interface +d:drivers/staging/media/atomisp/pci/runtime/rmgr/src +d:drivers/staging/media/atomisp/pci/runtime/spctrl +d:drivers/staging/media/atomisp/pci/runtime/spctrl/interface +d:drivers/staging/media/atomisp/pci/runtime/spctrl/src +d:drivers/staging/media/atomisp/pci/runtime/tagger +d:drivers/staging/media/atomisp/pci/runtime/tagger/interface +d:drivers/staging/media/atomisp/pci/runtime/timer +d:drivers/staging/media/atomisp/pci/runtime/timer/src +d:drivers/staging/media/av7110 +d:drivers/staging/media/deprecated +d:drivers/staging/media/deprecated/atmel +d:drivers/staging/media/imx +d:drivers/staging/media/ipu3 +d:drivers/staging/media/ipu3/include +d:drivers/staging/media/ipu3/include/uapi +d:drivers/staging/media/ipu7 +d:drivers/staging/media/ipu7/abi +d:drivers/staging/media/max96712 +d:drivers/staging/media/meson +d:drivers/staging/media/meson/vdec +d:drivers/staging/media/starfive +d:drivers/staging/media/starfive/camss +d:drivers/staging/media/sunxi +d:drivers/staging/media/sunxi/cedrus +d:drivers/staging/media/sunxi/sun6i-isp +d:drivers/staging/media/sunxi/sun6i-isp/uapi +d:drivers/staging/media/tegra-video +d:drivers/staging/most +d:drivers/staging/most/Documentation +d:drivers/staging/most/Documentation/ABI +d:drivers/staging/most/dim2 +d:drivers/staging/most/i2c +d:drivers/staging/most/net +d:drivers/staging/most/video +d:drivers/staging/nvec +d:drivers/staging/octeon +d:drivers/staging/rtl8723bs +d:drivers/staging/rtl8723bs/core +d:drivers/staging/rtl8723bs/hal +d:drivers/staging/rtl8723bs/include +d:drivers/staging/rtl8723bs/os_dep +d:drivers/staging/sm750fb +d:drivers/staging/vc04_services +d:drivers/staging/vc04_services/bcm2835-audio +d:drivers/staging/vc04_services/bcm2835-camera +d:drivers/staging/vc04_services/include +d:drivers/staging/vc04_services/include/linux +d:drivers/staging/vc04_services/include/linux/raspberrypi +d:drivers/staging/vc04_services/interface +d:drivers/staging/vc04_services/interface/vchiq_arm +d:drivers/staging/vc04_services/vchiq-mmal +d:drivers/staging/vme_user +d:drivers/target +d:drivers/target/iscsi +d:drivers/target/iscsi/cxgbit +d:drivers/target/loopback +d:drivers/target/sbp +d:drivers/target/tcm_fc +d:drivers/target/tcm_remote +d:drivers/tc +d:drivers/tee +d:drivers/tee/amdtee +d:drivers/tee/optee +d:drivers/tee/tstee +d:drivers/thermal +d:drivers/thermal/broadcom +d:drivers/thermal/intel +d:drivers/thermal/intel/int340x_thermal +d:drivers/thermal/mediatek +d:drivers/thermal/qcom +d:drivers/thermal/renesas +d:drivers/thermal/samsung +d:drivers/thermal/st +d:drivers/thermal/tegra +d:drivers/thermal/testing +d:drivers/thermal/ti-soc-thermal +d:drivers/thunderbolt +d:drivers/tty +d:drivers/tty/hvc +d:drivers/tty/ipwireless +d:drivers/tty/serdev +d:drivers/tty/serial +d:drivers/tty/serial/8250 +d:drivers/tty/serial/jsm +d:drivers/tty/vt +d:drivers/ufs +d:drivers/ufs/core +d:drivers/ufs/host +d:drivers/uio +d:drivers/usb +d:drivers/usb/atm +d:drivers/usb/c67x00 +d:drivers/usb/cdns3 +d:drivers/usb/chipidea +d:drivers/usb/class +d:drivers/usb/common +d:drivers/usb/core +d:drivers/usb/dwc2 +d:drivers/usb/dwc3 +d:drivers/usb/early +d:drivers/usb/fotg210 +d:drivers/usb/gadget +d:drivers/usb/gadget/function +d:drivers/usb/gadget/legacy +d:drivers/usb/gadget/udc +d:drivers/usb/gadget/udc/aspeed-vhub +d:drivers/usb/gadget/udc/bdc +d:drivers/usb/gadget/udc/cdns2 +d:drivers/usb/host +d:drivers/usb/image +d:drivers/usb/isp1760 +d:drivers/usb/misc +d:drivers/usb/misc/sisusbvga +d:drivers/usb/mon +d:drivers/usb/mtu3 +d:drivers/usb/musb +d:drivers/usb/phy +d:drivers/usb/renesas_usbhs +d:drivers/usb/roles +d:drivers/usb/serial +d:drivers/usb/storage +d:drivers/usb/typec +d:drivers/usb/typec/altmodes +d:drivers/usb/typec/mux +d:drivers/usb/typec/tcpm +d:drivers/usb/typec/tcpm/qcom +d:drivers/usb/typec/tipd +d:drivers/usb/typec/ucsi +d:drivers/usb/usbip +d:drivers/vdpa +d:drivers/vdpa/alibaba +d:drivers/vdpa/ifcvf +d:drivers/vdpa/mlx5 +d:drivers/vdpa/mlx5/core +d:drivers/vdpa/mlx5/net +d:drivers/vdpa/octeon_ep +d:drivers/vdpa/pds +d:drivers/vdpa/solidrun +d:drivers/vdpa/vdpa_sim +d:drivers/vdpa/vdpa_user +d:drivers/vdpa/virtio_pci +d:drivers/vfio +d:drivers/vfio/cdx +d:drivers/vfio/fsl-mc +d:drivers/vfio/mdev +d:drivers/vfio/pci +d:drivers/vfio/pci/hisilicon +d:drivers/vfio/pci/mlx5 +d:drivers/vfio/pci/nvgrace-gpu +d:drivers/vfio/pci/pds +d:drivers/vfio/pci/qat +d:drivers/vfio/pci/virtio +d:drivers/vfio/platform +d:drivers/vfio/platform/reset +d:drivers/vhost +d:drivers/video +d:drivers/video/backlight +d:drivers/video/console +d:drivers/video/fbdev +d:drivers/video/fbdev/aty +d:drivers/video/fbdev/core +d:drivers/video/fbdev/geode +d:drivers/video/fbdev/i810 +d:drivers/video/fbdev/kyro +d:drivers/video/fbdev/matrox +d:drivers/video/fbdev/mb862xx +d:drivers/video/fbdev/mmp +d:drivers/video/fbdev/mmp/fb +d:drivers/video/fbdev/mmp/hw +d:drivers/video/fbdev/mmp/panel +d:drivers/video/fbdev/nvidia +d:drivers/video/fbdev/omap +d:drivers/video/fbdev/omap2 +d:drivers/video/fbdev/omap2/omapfb +d:drivers/video/fbdev/omap2/omapfb/displays +d:drivers/video/fbdev/omap2/omapfb/dss +d:drivers/video/fbdev/riva +d:drivers/video/fbdev/savage +d:drivers/video/fbdev/sis +d:drivers/video/fbdev/via +d:drivers/video/logo +d:drivers/virt +d:drivers/virt/acrn +d:drivers/virt/coco +d:drivers/virt/coco/arm-cca-guest +d:drivers/virt/coco/efi_secret +d:drivers/virt/coco/guest +d:drivers/virt/coco/pkvm-guest +d:drivers/virt/coco/sev-guest +d:drivers/virt/coco/tdx-guest +d:drivers/virt/nitro_enclaves +d:drivers/virt/vboxguest +d:drivers/virtio +d:drivers/w1 +d:drivers/w1/masters +d:drivers/w1/slaves +d:drivers/watchdog +d:drivers/xen +d:drivers/xen/events +d:drivers/xen/xen-pciback +d:drivers/xen/xenbus +d:drivers/xen/xenfs +d:drivers/zorro +d:fs +d:fs/9p +d:fs/adfs +d:fs/affs +d:fs/afs +d:fs/autofs +d:fs/bcachefs +d:fs/befs +d:fs/bfs +d:fs/btrfs +d:fs/btrfs/tests +d:fs/cachefiles +d:fs/ceph +d:fs/coda +d:fs/configfs +d:fs/cramfs +d:fs/crypto +d:fs/debugfs +d:fs/devpts +d:fs/dlm +d:fs/ecryptfs +d:fs/efivarfs +d:fs/efs +d:fs/erofs +d:fs/exfat +d:fs/exportfs +d:fs/ext2 +d:fs/ext4 +d:fs/f2fs +d:fs/fat +d:fs/freevxfs +d:fs/fuse +d:fs/gfs2 +d:fs/hfs +d:fs/hfsplus +d:fs/hostfs +d:fs/hpfs +d:fs/hugetlbfs +d:fs/iomap +d:fs/isofs +d:fs/jbd2 +d:fs/jffs2 +d:fs/jfs +d:fs/kernfs +d:fs/lockd +d:fs/minix +d:fs/netfs +d:fs/nfs +d:fs/nfs/blocklayout +d:fs/nfs/filelayout +d:fs/nfs/flexfilelayout +d:fs/nfs_common +d:fs/nfsd +d:fs/nilfs2 +d:fs/nls +d:fs/notify +d:fs/notify/dnotify +d:fs/notify/fanotify +d:fs/notify/inotify +d:fs/ntfs3 +d:fs/ntfs3/lib +d:fs/ocfs2 +d:fs/ocfs2/cluster +d:fs/ocfs2/dlm +d:fs/ocfs2/dlmfs +d:fs/omfs +d:fs/openpromfs +d:fs/orangefs +d:fs/overlayfs +d:fs/proc +d:fs/pstore +d:fs/qnx4 +d:fs/qnx6 +d:fs/quota +d:fs/ramfs +d:fs/resctrl +d:fs/romfs +d:fs/smb +d:fs/smb/client +d:fs/smb/client/compress +d:fs/smb/common +d:fs/smb/common/smbdirect +d:fs/smb/server +d:fs/smb/server/mgmt +d:fs/squashfs +d:fs/sysfs +d:fs/tests +d:fs/tracefs +d:fs/ubifs +d:fs/udf +d:fs/ufs +d:fs/unicode +d:fs/unicode/tests +d:fs/vboxsf +d:fs/verity +d:fs/xfs +d:fs/xfs/libxfs +d:fs/xfs/scrub +d:fs/zonefs +d:include +d:include/acpi +d:include/acpi/platform +d:include/asm-generic +d:include/asm-generic/bitops +d:include/asm-generic/vdso +d:include/clocksource +d:include/crypto +d:include/crypto/internal +d:include/cxl +d:include/drm +d:include/drm/amd +d:include/drm/bridge +d:include/drm/clients +d:include/drm/display +d:include/drm/intel +d:include/drm/ttm +d:include/dt-bindings +d:include/dt-bindings/arm +d:include/dt-bindings/ata +d:include/dt-bindings/bus +d:include/dt-bindings/clock +d:include/dt-bindings/display +d:include/dt-bindings/dma +d:include/dt-bindings/firmware +d:include/dt-bindings/firmware/imx +d:include/dt-bindings/gce +d:include/dt-bindings/gpio +d:include/dt-bindings/i2c +d:include/dt-bindings/i3c +d:include/dt-bindings/iio +d:include/dt-bindings/iio/adc +d:include/dt-bindings/iio/addac +d:include/dt-bindings/iio/temperature +d:include/dt-bindings/input +d:include/dt-bindings/interconnect +d:include/dt-bindings/interrupt-controller +d:include/dt-bindings/leds +d:include/dt-bindings/mailbox +d:include/dt-bindings/media +d:include/dt-bindings/memory +d:include/dt-bindings/mfd +d:include/dt-bindings/mips +d:include/dt-bindings/mux +d:include/dt-bindings/net +d:include/dt-bindings/nvmem +d:include/dt-bindings/phy +d:include/dt-bindings/pinctrl +d:include/dt-bindings/pmu +d:include/dt-bindings/power +d:include/dt-bindings/pwm +d:include/dt-bindings/regulator +d:include/dt-bindings/reset +d:include/dt-bindings/soc +d:include/dt-bindings/sound +d:include/dt-bindings/spmi +d:include/dt-bindings/thermal +d:include/dt-bindings/usb +d:include/dt-bindings/watchdog +d:include/hyperv +d:include/keys +d:include/kunit +d:include/kvm +d:include/linux +d:include/linux/amba +d:include/linux/atomic +d:include/linux/avf +d:include/linux/bcma +d:include/linux/bnxt +d:include/linux/bus +d:include/linux/byteorder +d:include/linux/can +d:include/linux/can/dev +d:include/linux/can/platform +d:include/linux/cdx +d:include/linux/ceph +d:include/linux/clk +d:include/linux/comedi +d:include/linux/crush +d:include/linux/decompress +d:include/linux/device +d:include/linux/dma +d:include/linux/dsa +d:include/linux/extcon +d:include/linux/firmware +d:include/linux/firmware/broadcom +d:include/linux/firmware/cirrus +d:include/linux/firmware/imx +d:include/linux/firmware/imx/svc +d:include/linux/firmware/intel +d:include/linux/firmware/mediatek +d:include/linux/firmware/meson +d:include/linux/firmware/qcom +d:include/linux/firmware/samsung +d:include/linux/firmware/thead +d:include/linux/fpga +d:include/linux/framer +d:include/linux/fsl +d:include/linux/fsl/bestcomm +d:include/linux/gpio +d:include/linux/greybus +d:include/linux/habanalabs +d:include/linux/hsi +d:include/linux/i3c +d:include/linux/iio +d:include/linux/iio/accel +d:include/linux/iio/adc +d:include/linux/iio/afe +d:include/linux/iio/common +d:include/linux/iio/dac +d:include/linux/iio/frequency +d:include/linux/iio/gyro +d:include/linux/iio/imu +d:include/linux/iio/timer +d:include/linux/input +d:include/linux/io_uring +d:include/linux/irqchip +d:include/linux/isdn +d:include/linux/lockd +d:include/linux/lsm +d:include/linux/mailbox +d:include/linux/mdio +d:include/linux/memory +d:include/linux/mfd +d:include/linux/mfd/abx500 +d:include/linux/mfd/arizona +d:include/linux/mfd/atc260x +d:include/linux/mfd/da9052 +d:include/linux/mfd/da9055 +d:include/linux/mfd/da9062 +d:include/linux/mfd/da9063 +d:include/linux/mfd/da9150 +d:include/linux/mfd/madera +d:include/linux/mfd/mt6323 +d:include/linux/mfd/mt6328 +d:include/linux/mfd/mt6331 +d:include/linux/mfd/mt6332 +d:include/linux/mfd/mt6357 +d:include/linux/mfd/mt6358 +d:include/linux/mfd/mt6359 +d:include/linux/mfd/mt6359p +d:include/linux/mfd/mt6397 +d:include/linux/mfd/samsung +d:include/linux/mfd/syscon +d:include/linux/mfd/wcd934x +d:include/linux/mfd/wm831x +d:include/linux/mfd/wm8350 +d:include/linux/mfd/wm8994 +d:include/linux/misc +d:include/linux/mlx4 +d:include/linux/mlx5 +d:include/linux/mmc +d:include/linux/mtd +d:include/linux/mux +d:include/linux/net +d:include/linux/net/intel +d:include/linux/net/intel/libie +d:include/linux/netfilter +d:include/linux/netfilter/ipset +d:include/linux/netfilter_arp +d:include/linux/netfilter_bridge +d:include/linux/netfilter_ipv4 +d:include/linux/netfilter_ipv6 +d:include/linux/pcs +d:include/linux/pds +d:include/linux/perf +d:include/linux/phy +d:include/linux/phy/tegra +d:include/linux/pinctrl +d:include/linux/platform_data +d:include/linux/platform_data/gpio +d:include/linux/platform_data/media +d:include/linux/platform_data/txx9 +d:include/linux/platform_data/x86 +d:include/linux/power +d:include/linux/pse-pd +d:include/linux/pwrseq +d:include/linux/qat +d:include/linux/qed +d:include/linux/raid +d:include/linux/regulator +d:include/linux/remoteproc +d:include/linux/reset +d:include/linux/rpmsg +d:include/linux/rtc +d:include/linux/sched +d:include/linux/soc +d:include/linux/soc/actions +d:include/linux/soc/amd +d:include/linux/soc/amlogic +d:include/linux/soc/andes +d:include/linux/soc/apple +d:include/linux/soc/brcmstb +d:include/linux/soc/cirrus +d:include/linux/soc/dove +d:include/linux/soc/ixp4xx +d:include/linux/soc/marvell +d:include/linux/soc/marvell/octeontx2 +d:include/linux/soc/mediatek +d:include/linux/soc/mmp +d:include/linux/soc/nxp +d:include/linux/soc/pxa +d:include/linux/soc/qcom +d:include/linux/soc/renesas +d:include/linux/soc/samsung +d:include/linux/soc/sunxi +d:include/linux/soc/ti +d:include/linux/soundwire +d:include/linux/spi +d:include/linux/spi/offload +d:include/linux/ssb +d:include/linux/sunrpc +d:include/linux/sunrpc/xdrgen +d:include/linux/surface_aggregator +d:include/linux/ulpi +d:include/linux/unaligned +d:include/linux/usb +d:include/math-emu +d:include/media +d:include/media/davinci +d:include/media/drv-intf +d:include/media/i2c +d:include/media/tpg +d:include/memory +d:include/misc +d:include/net +d:include/net/9p +d:include/net/bluetooth +d:include/net/caif +d:include/net/iucv +d:include/net/libeth +d:include/net/mana +d:include/net/netfilter +d:include/net/netfilter/ipv4 +d:include/net/netfilter/ipv6 +d:include/net/netns +d:include/net/nfc +d:include/net/page_pool +d:include/net/phonet +d:include/net/sctp +d:include/net/tc_act +d:include/pcmcia +d:include/ras +d:include/rdma +d:include/rv +d:include/scsi +d:include/scsi/fc +d:include/soc +d:include/soc/amlogic +d:include/soc/arc +d:include/soc/at91 +d:include/soc/bcm2835 +d:include/soc/canaan +d:include/soc/fsl +d:include/soc/fsl/qe +d:include/soc/imx +d:include/soc/mediatek +d:include/soc/microchip +d:include/soc/mscc +d:include/soc/nuvoton +d:include/soc/qcom +d:include/soc/rockchip +d:include/soc/sa1100 +d:include/soc/sifive +d:include/soc/spacemit +d:include/soc/starfive +d:include/soc/tegra +d:include/sound +d:include/sound/ac97 +d:include/sound/sof +d:include/sound/sof/ipc4 +d:include/target +d:include/target/iscsi +d:include/trace +d:include/trace/events +d:include/trace/misc +d:include/trace/stages +d:include/uapi +d:include/uapi/asm-generic +d:include/uapi/cxl +d:include/uapi/drm +d:include/uapi/fwctl +d:include/uapi/linux +d:include/uapi/linux/android +d:include/uapi/linux/byteorder +d:include/uapi/linux/caif +d:include/uapi/linux/can +d:include/uapi/linux/cifs +d:include/uapi/linux/counter +d:include/uapi/linux/dvb +d:include/uapi/linux/genwqe +d:include/uapi/linux/hdlc +d:include/uapi/linux/hsi +d:include/uapi/linux/iio +d:include/uapi/linux/io_uring +d:include/uapi/linux/isdn +d:include/uapi/linux/media +d:include/uapi/linux/media/amlogic +d:include/uapi/linux/media/raspberrypi +d:include/uapi/linux/misc +d:include/uapi/linux/mmc +d:include/uapi/linux/netfilter +d:include/uapi/linux/netfilter/ipset +d:include/uapi/linux/netfilter_arp +d:include/uapi/linux/netfilter_bridge +d:include/uapi/linux/netfilter_ipv4 +d:include/uapi/linux/netfilter_ipv6 +d:include/uapi/linux/nfsd +d:include/uapi/linux/raid +d:include/uapi/linux/sched +d:include/uapi/linux/spi +d:include/uapi/linux/sunrpc +d:include/uapi/linux/surface_aggregator +d:include/uapi/linux/tc_act +d:include/uapi/linux/tc_ematch +d:include/uapi/linux/usb +d:include/uapi/misc +d:include/uapi/misc/uacce +d:include/uapi/mtd +d:include/uapi/rdma +d:include/uapi/rdma/hfi +d:include/uapi/regulator +d:include/uapi/scsi +d:include/uapi/scsi/fc +d:include/uapi/sound +d:include/uapi/sound/intel +d:include/uapi/sound/intel/avs +d:include/uapi/sound/sof +d:include/uapi/video +d:include/uapi/xen +d:include/ufs +d:include/vdso +d:include/video +d:include/xen +d:include/xen/arm +d:include/xen/interface +d:include/xen/interface/hvm +d:include/xen/interface/io +d:init +d:io_uring +d:ipc +d:kernel +d:kernel/bpf +d:kernel/bpf/preload +d:kernel/bpf/preload/iterators +d:kernel/cgroup +d:kernel/configs +d:kernel/debug +d:kernel/debug/kdb +d:kernel/dma +d:kernel/entry +d:kernel/events +d:kernel/futex +d:kernel/gcov +d:kernel/irq +d:kernel/kcsan +d:kernel/livepatch +d:kernel/locking +d:kernel/module +d:kernel/power +d:kernel/printk +d:kernel/rcu +d:kernel/sched +d:kernel/time +d:kernel/trace +d:kernel/trace/rv +d:kernel/trace/rv/monitors +d:kernel/trace/rv/monitors/nrp +d:kernel/trace/rv/monitors/opid +d:kernel/trace/rv/monitors/pagefault +d:kernel/trace/rv/monitors/rtapp +d:kernel/trace/rv/monitors/sched +d:kernel/trace/rv/monitors/sco +d:kernel/trace/rv/monitors/scpd +d:kernel/trace/rv/monitors/sleep +d:kernel/trace/rv/monitors/snep +d:kernel/trace/rv/monitors/snroc +d:kernel/trace/rv/monitors/sssw +d:kernel/trace/rv/monitors/sts +d:kernel/trace/rv/monitors/wip +d:kernel/trace/rv/monitors/wwnr +d:lib +d:lib/842 +d:lib/crc +d:lib/crc/arm +d:lib/crc/arm64 +d:lib/crc/loongarch +d:lib/crc/mips +d:lib/crc/powerpc +d:lib/crc/riscv +d:lib/crc/s390 +d:lib/crc/sparc +d:lib/crc/tests +d:lib/crc/x86 +d:lib/crypto +d:lib/crypto/arm +d:lib/crypto/arm64 +d:lib/crypto/mips +d:lib/crypto/mpi +d:lib/crypto/powerpc +d:lib/crypto/riscv +d:lib/crypto/s390 +d:lib/crypto/sparc +d:lib/crypto/tests +d:lib/crypto/x86 +d:lib/dim +d:lib/fonts +d:lib/kunit +d:lib/lz4 +d:lib/lzo +d:lib/math +d:lib/math/tests +d:lib/pldmfw +d:lib/raid6 +d:lib/raid6/test +d:lib/reed_solomon +d:lib/test_fortify +d:lib/tests +d:lib/tests/module +d:lib/vdso +d:lib/xz +d:lib/zlib_deflate +d:lib/zlib_dfltcc +d:lib/zlib_inflate +d:lib/zstd +d:lib/zstd/common +d:lib/zstd/compress +d:lib/zstd/decompress +d:mm +d:mm/damon +d:mm/damon/tests +d:mm/kasan +d:mm/kfence +d:mm/kmsan +d:net +d:net/6lowpan +d:net/802 +d:net/8021q +d:net/9p +d:net/appletalk +d:net/atm +d:net/ax25 +d:net/batman-adv +d:net/bluetooth +d:net/bluetooth/bnep +d:net/bluetooth/cmtp +d:net/bluetooth/hidp +d:net/bluetooth/rfcomm +d:net/bpf +d:net/bridge +d:net/bridge/netfilter +d:net/caif +d:net/can +d:net/can/j1939 +d:net/ceph +d:net/ceph/crush +d:net/core +d:net/dcb +d:net/devlink +d:net/dns_resolver +d:net/dsa +d:net/ethernet +d:net/ethtool +d:net/handshake +d:net/hsr +d:net/ieee802154 +d:net/ieee802154/6lowpan +d:net/ife +d:net/ipv4 +d:net/ipv4/netfilter +d:net/ipv6 +d:net/ipv6/ila +d:net/ipv6/netfilter +d:net/iucv +d:net/kcm +d:net/key +d:net/l2tp +d:net/l3mdev +d:net/lapb +d:net/llc +d:net/mac80211 +d:net/mac80211/tests +d:net/mac802154 +d:net/mctp +d:net/mctp/test +d:net/mpls +d:net/mptcp +d:net/ncsi +d:net/netfilter +d:net/netfilter/ipset +d:net/netfilter/ipvs +d:net/netlabel +d:net/netlink +d:net/netrom +d:net/nfc +d:net/nfc/hci +d:net/nfc/nci +d:net/nsh +d:net/openvswitch +d:net/packet +d:net/phonet +d:net/psample +d:net/qrtr +d:net/rds +d:net/rfkill +d:net/rose +d:net/rxrpc +d:net/sched +d:net/sctp +d:net/shaper +d:net/smc +d:net/strparser +d:net/sunrpc +d:net/sunrpc/auth_gss +d:net/sunrpc/xprtrdma +d:net/switchdev +d:net/tipc +d:net/tls +d:net/unix +d:net/vmw_vsock +d:net/wireless +d:net/wireless/certs +d:net/wireless/tests +d:net/x25 +d:net/xdp +d:net/xfrm +d:rust +d:rust/bindings +d:rust/helpers +d:rust/kernel +d:rust/kernel/alloc +d:rust/kernel/alloc/kvec +d:rust/kernel/block +d:rust/kernel/block/mq +d:rust/kernel/device +d:rust/kernel/drm +d:rust/kernel/drm/gem +d:rust/kernel/fs +d:rust/kernel/io +d:rust/kernel/list +d:rust/kernel/mm +d:rust/kernel/net +d:rust/kernel/net/phy +d:rust/kernel/sync +d:rust/kernel/sync/arc +d:rust/kernel/sync/lock +d:rust/kernel/time +d:rust/kernel/time/hrtimer +d:rust/macros +d:rust/pin-init +d:rust/pin-init/examples +d:rust/pin-init/internal +d:rust/pin-init/internal/src +d:rust/pin-init/src +d:rust/uapi +d:samples +d:samples/acrn +d:samples/auxdisplay +d:samples/binderfs +d:samples/bpf +d:samples/bpf/gnu +d:samples/cgroup +d:samples/check-exec +d:samples/configfs +d:samples/connector +d:samples/coresight +d:samples/damon +d:samples/fanotify +d:samples/fprobe +d:samples/ftrace +d:samples/hid +d:samples/hidraw +d:samples/hung_task +d:samples/hw_breakpoint +d:samples/kdb +d:samples/kfifo +d:samples/kmemleak +d:samples/kobject +d:samples/kprobes +d:samples/landlock +d:samples/livepatch +d:samples/mei +d:samples/nitro_enclaves +d:samples/pfsm +d:samples/pidfd +d:samples/pktgen +d:samples/qmi +d:samples/rpmsg +d:samples/rust +d:samples/rust/hostprogs +d:samples/seccomp +d:samples/timers +d:samples/trace_events +d:samples/trace_printk +d:samples/tsm-mr +d:samples/uhid +d:samples/user_events +d:samples/v4l +d:samples/vfio-mdev +d:samples/vfs +d:samples/watch_queue +d:samples/watchdog +d:scripts +d:scripts/atomic +d:scripts/atomic/fallbacks +d:scripts/atomic/kerneldoc +d:scripts/bash-completion +d:scripts/basic +d:scripts/clang-tools +d:scripts/coccinelle +d:scripts/coccinelle/api +d:scripts/coccinelle/api/alloc +d:scripts/coccinelle/free +d:scripts/coccinelle/iterators +d:scripts/coccinelle/locks +d:scripts/coccinelle/misc +d:scripts/coccinelle/null +d:scripts/coccinelle/tests +d:scripts/crypto +d:scripts/dtc +d:scripts/dtc/include-prefixes +d:scripts/dtc/libfdt +d:scripts/dummy-tools +d:scripts/dummy-tools/dummy-plugin-dir +d:scripts/dummy-tools/dummy-plugin-dir/include +d:scripts/gcc-plugins +d:scripts/gdb +d:scripts/gdb/linux +d:scripts/gendwarfksyms +d:scripts/gendwarfksyms/examples +d:scripts/genksyms +d:scripts/include +d:scripts/ipe +d:scripts/ipe/polgen +d:scripts/kconfig +d:scripts/kconfig/lxdialog +d:scripts/kconfig/tests +d:scripts/kconfig/tests/auto_submenu +d:scripts/kconfig/tests/choice +d:scripts/kconfig/tests/choice_randomize +d:scripts/kconfig/tests/choice_randomize2 +d:scripts/kconfig/tests/err_recursive_dep +d:scripts/kconfig/tests/err_recursive_inc +d:scripts/kconfig/tests/new_choice_with_dep +d:scripts/kconfig/tests/no_write_if_dep_unmet +d:scripts/kconfig/tests/preprocess +d:scripts/kconfig/tests/preprocess/builtin_func +d:scripts/kconfig/tests/preprocess/circular_expansion +d:scripts/kconfig/tests/preprocess/escape +d:scripts/kconfig/tests/preprocess/variable +d:scripts/ksymoops +d:scripts/lib +d:scripts/lib/abi +d:scripts/lib/kdoc +d:scripts/mod +d:scripts/package +d:scripts/package/debian +d:scripts/selinux +d:scripts/selinux/mdp +d:scripts/tracing +d:security +d:security/apparmor +d:security/apparmor/include +d:security/bpf +d:security/integrity +d:security/integrity/evm +d:security/integrity/ima +d:security/integrity/platform_certs +d:security/ipe +d:security/keys +d:security/keys/encrypted-keys +d:security/keys/trusted-keys +d:security/landlock +d:security/landlock/errata +d:security/loadpin +d:security/lockdown +d:security/safesetid +d:security/selinux +d:security/selinux/include +d:security/selinux/ss +d:security/smack +d:security/tomoyo +d:security/tomoyo/policy +d:security/yama +d:sound +d:sound/ac97 +d:sound/aoa +d:sound/aoa/codecs +d:sound/aoa/core +d:sound/aoa/fabrics +d:sound/aoa/soundbus +d:sound/aoa/soundbus/i2sbus +d:sound/arm +d:sound/atmel +d:sound/core +d:sound/core/oss +d:sound/core/seq +d:sound/core/seq/oss +d:sound/drivers +d:sound/drivers/mpu401 +d:sound/drivers/opl3 +d:sound/drivers/opl4 +d:sound/drivers/pcsp +d:sound/drivers/vx +d:sound/firewire +d:sound/firewire/bebob +d:sound/firewire/dice +d:sound/firewire/digi00x +d:sound/firewire/fireface +d:sound/firewire/fireworks +d:sound/firewire/motu +d:sound/firewire/oxfw +d:sound/firewire/tascam +d:sound/hda +d:sound/hda/codecs +d:sound/hda/codecs/cirrus +d:sound/hda/codecs/hdmi +d:sound/hda/codecs/helpers +d:sound/hda/codecs/realtek +d:sound/hda/codecs/side-codecs +d:sound/hda/common +d:sound/hda/controllers +d:sound/hda/core +d:sound/hda/core/ext +d:sound/i2c +d:sound/i2c/other +d:sound/isa +d:sound/isa/ad1816a +d:sound/isa/ad1848 +d:sound/isa/cs423x +d:sound/isa/es1688 +d:sound/isa/galaxy +d:sound/isa/gus +d:sound/isa/msnd +d:sound/isa/opti9xx +d:sound/isa/sb +d:sound/isa/wavefront +d:sound/isa/wss +d:sound/mips +d:sound/oss +d:sound/oss/dmasound +d:sound/parisc +d:sound/pci +d:sound/pci/ac97 +d:sound/pci/ali5451 +d:sound/pci/asihpi +d:sound/pci/au88x0 +d:sound/pci/aw2 +d:sound/pci/ca0106 +d:sound/pci/cs46xx +d:sound/pci/cs5535audio +d:sound/pci/ctxfi +d:sound/pci/echoaudio +d:sound/pci/emu10k1 +d:sound/pci/ice1712 +d:sound/pci/korg1212 +d:sound/pci/lola +d:sound/pci/lx6464es +d:sound/pci/mixart +d:sound/pci/nm256 +d:sound/pci/oxygen +d:sound/pci/pcxhr +d:sound/pci/riptide +d:sound/pci/rme9652 +d:sound/pci/trident +d:sound/pci/vx222 +d:sound/pci/ymfpci +d:sound/pcmcia +d:sound/pcmcia/pdaudiocf +d:sound/pcmcia/vx +d:sound/ppc +d:sound/sh +d:sound/soc +d:sound/soc/adi +d:sound/soc/amd +d:sound/soc/amd/acp +d:sound/soc/amd/acp/acp3x-es83xx +d:sound/soc/amd/include +d:sound/soc/amd/ps +d:sound/soc/amd/raven +d:sound/soc/amd/renoir +d:sound/soc/amd/rpl +d:sound/soc/amd/vangogh +d:sound/soc/amd/yc +d:sound/soc/apple +d:sound/soc/atmel +d:sound/soc/au1x +d:sound/soc/bcm +d:sound/soc/cirrus +d:sound/soc/codecs +d:sound/soc/codecs/aw88395 +d:sound/soc/dwc +d:sound/soc/fsl +d:sound/soc/generic +d:sound/soc/google +d:sound/soc/hisilicon +d:sound/soc/img +d:sound/soc/intel +d:sound/soc/intel/atom +d:sound/soc/intel/atom/sst +d:sound/soc/intel/avs +d:sound/soc/intel/avs/boards +d:sound/soc/intel/boards +d:sound/soc/intel/catpt +d:sound/soc/intel/common +d:sound/soc/intel/keembay +d:sound/soc/jz4740 +d:sound/soc/kirkwood +d:sound/soc/loongson +d:sound/soc/mediatek +d:sound/soc/mediatek/common +d:sound/soc/mediatek/mt2701 +d:sound/soc/mediatek/mt6797 +d:sound/soc/mediatek/mt7986 +d:sound/soc/mediatek/mt8173 +d:sound/soc/mediatek/mt8183 +d:sound/soc/mediatek/mt8186 +d:sound/soc/mediatek/mt8188 +d:sound/soc/mediatek/mt8192 +d:sound/soc/mediatek/mt8195 +d:sound/soc/mediatek/mt8365 +d:sound/soc/meson +d:sound/soc/mxs +d:sound/soc/pxa +d:sound/soc/qcom +d:sound/soc/qcom/qdsp6 +d:sound/soc/renesas +d:sound/soc/renesas/rcar +d:sound/soc/rockchip +d:sound/soc/samsung +d:sound/soc/sdca +d:sound/soc/sdw_utils +d:sound/soc/sof +d:sound/soc/sof/amd +d:sound/soc/sof/imx +d:sound/soc/sof/intel +d:sound/soc/sof/mediatek +d:sound/soc/sof/mediatek/mt8186 +d:sound/soc/sof/mediatek/mt8195 +d:sound/soc/sof/xtensa +d:sound/soc/spear +d:sound/soc/sprd +d:sound/soc/starfive +d:sound/soc/sti +d:sound/soc/stm +d:sound/soc/sunxi +d:sound/soc/tegra +d:sound/soc/ti +d:sound/soc/uniphier +d:sound/soc/ux500 +d:sound/soc/xilinx +d:sound/soc/xtensa +d:sound/sparc +d:sound/spi +d:sound/synth +d:sound/synth/emux +d:sound/usb +d:sound/usb/6fire +d:sound/usb/bcd2000 +d:sound/usb/caiaq +d:sound/usb/hiface +d:sound/usb/line6 +d:sound/usb/misc +d:sound/usb/qcom +d:sound/usb/usx2y +d:sound/virtio +d:sound/x86 +d:sound/xen +d:tools +d:tools/accounting +d:tools/arch +d:tools/arch/alpha +d:tools/arch/alpha/include +d:tools/arch/alpha/include/asm +d:tools/arch/alpha/include/uapi +d:tools/arch/alpha/include/uapi/asm +d:tools/arch/arc +d:tools/arch/arc/include +d:tools/arch/arc/include/uapi +d:tools/arch/arc/include/uapi/asm +d:tools/arch/arm +d:tools/arch/arm/include +d:tools/arch/arm/include/asm +d:tools/arch/arm/include/uapi +d:tools/arch/arm/include/uapi/asm +d:tools/arch/arm64 +d:tools/arch/arm64/include +d:tools/arch/arm64/include/asm +d:tools/arch/arm64/include/uapi +d:tools/arch/arm64/include/uapi/asm +d:tools/arch/arm64/tools +d:tools/arch/csky +d:tools/arch/csky/include +d:tools/arch/csky/include/uapi +d:tools/arch/csky/include/uapi/asm +d:tools/arch/hexagon +d:tools/arch/hexagon/include +d:tools/arch/hexagon/include/uapi +d:tools/arch/hexagon/include/uapi/asm +d:tools/arch/loongarch +d:tools/arch/loongarch/include +d:tools/arch/loongarch/include/asm +d:tools/arch/loongarch/include/uapi +d:tools/arch/loongarch/include/uapi/asm +d:tools/arch/microblaze +d:tools/arch/microblaze/include +d:tools/arch/microblaze/include/uapi +d:tools/arch/microblaze/include/uapi/asm +d:tools/arch/mips +d:tools/arch/mips/include +d:tools/arch/mips/include/asm +d:tools/arch/mips/include/uapi +d:tools/arch/mips/include/uapi/asm +d:tools/arch/parisc +d:tools/arch/parisc/include +d:tools/arch/parisc/include/uapi +d:tools/arch/parisc/include/uapi/asm +d:tools/arch/powerpc +d:tools/arch/powerpc/include +d:tools/arch/powerpc/include/asm +d:tools/arch/powerpc/include/uapi +d:tools/arch/powerpc/include/uapi/asm +d:tools/arch/riscv +d:tools/arch/riscv/include +d:tools/arch/riscv/include/asm +d:tools/arch/riscv/include/asm/vdso +d:tools/arch/riscv/include/uapi +d:tools/arch/riscv/include/uapi/asm +d:tools/arch/s390 +d:tools/arch/s390/include +d:tools/arch/s390/include/asm +d:tools/arch/s390/include/uapi +d:tools/arch/s390/include/uapi/asm +d:tools/arch/sh +d:tools/arch/sh/include +d:tools/arch/sh/include/asm +d:tools/arch/sh/include/uapi +d:tools/arch/sh/include/uapi/asm +d:tools/arch/sparc +d:tools/arch/sparc/include +d:tools/arch/sparc/include/asm +d:tools/arch/sparc/include/uapi +d:tools/arch/sparc/include/uapi/asm +d:tools/arch/x86 +d:tools/arch/x86/dell-uart-backlight-emulator +d:tools/arch/x86/include +d:tools/arch/x86/include/asm +d:tools/arch/x86/include/asm/amd +d:tools/arch/x86/include/uapi +d:tools/arch/x86/include/uapi/asm +d:tools/arch/x86/intel_sdsi +d:tools/arch/x86/kcpuid +d:tools/arch/x86/lib +d:tools/arch/x86/tools +d:tools/arch/xtensa +d:tools/arch/xtensa/include +d:tools/arch/xtensa/include/asm +d:tools/arch/xtensa/include/uapi +d:tools/arch/xtensa/include/uapi/asm +d:tools/bootconfig +d:tools/bootconfig/include +d:tools/bootconfig/include/linux +d:tools/bootconfig/samples +d:tools/bootconfig/scripts +d:tools/bpf +d:tools/bpf/bpftool +d:tools/bpf/bpftool/Documentation +d:tools/bpf/bpftool/bash-completion +d:tools/bpf/bpftool/skeleton +d:tools/bpf/resolve_btfids +d:tools/bpf/runqslower +d:tools/build +d:tools/build/Documentation +d:tools/build/feature +d:tools/build/tests +d:tools/build/tests/ex +d:tools/build/tests/ex/arch +d:tools/build/tests/ex/empty +d:tools/build/tests/ex/empty2 +d:tools/certs +d:tools/cgroup +d:tools/counter +d:tools/crypto +d:tools/crypto/ccp +d:tools/crypto/tcrypt +d:tools/debugging +d:tools/firewire +d:tools/firmware +d:tools/gpio +d:tools/hv +d:tools/iio +d:tools/include +d:tools/include/asm +d:tools/include/asm-generic +d:tools/include/asm-generic/bitops +d:tools/include/generated +d:tools/include/generated/asm +d:tools/include/io_uring +d:tools/include/linux +d:tools/include/linux/sched +d:tools/include/linux/unaligned +d:tools/include/nolibc +d:tools/include/nolibc/sys +d:tools/include/perf +d:tools/include/tools +d:tools/include/trace +d:tools/include/trace/events +d:tools/include/uapi +d:tools/include/uapi/asm +d:tools/include/uapi/asm-generic +d:tools/include/uapi/drm +d:tools/include/uapi/linux +d:tools/include/uapi/linux/tc_act +d:tools/include/vdso +d:tools/kvm +d:tools/kvm/kvm_stat +d:tools/laptop +d:tools/laptop/dslm +d:tools/laptop/freefall +d:tools/leds +d:tools/lib +d:tools/lib/api +d:tools/lib/api/fd +d:tools/lib/api/fs +d:tools/lib/bpf +d:tools/lib/perf +d:tools/lib/perf/Documentation +d:tools/lib/perf/Documentation/examples +d:tools/lib/perf/include +d:tools/lib/perf/include/internal +d:tools/lib/perf/include/perf +d:tools/lib/perf/tests +d:tools/lib/subcmd +d:tools/lib/symbol +d:tools/lib/thermal +d:tools/lib/thermal/include +d:tools/memory-model +d:tools/memory-model/Documentation +d:tools/memory-model/litmus-tests +d:tools/memory-model/scripts +d:tools/mm +d:tools/net +d:tools/net/sunrpc +d:tools/net/sunrpc/xdrgen +d:tools/net/sunrpc/xdrgen/generators +d:tools/net/sunrpc/xdrgen/grammars +d:tools/net/sunrpc/xdrgen/subcmds +d:tools/net/sunrpc/xdrgen/templates +d:tools/net/sunrpc/xdrgen/templates/C +d:tools/net/sunrpc/xdrgen/templates/C/constants +d:tools/net/sunrpc/xdrgen/templates/C/enum +d:tools/net/sunrpc/xdrgen/templates/C/enum/declaration +d:tools/net/sunrpc/xdrgen/templates/C/enum/decoder +d:tools/net/sunrpc/xdrgen/templates/C/enum/definition +d:tools/net/sunrpc/xdrgen/templates/C/enum/encoder +d:tools/net/sunrpc/xdrgen/templates/C/enum/maxsize +d:tools/net/sunrpc/xdrgen/templates/C/header_bottom +d:tools/net/sunrpc/xdrgen/templates/C/header_bottom/declaration +d:tools/net/sunrpc/xdrgen/templates/C/header_bottom/definition +d:tools/net/sunrpc/xdrgen/templates/C/header_top +d:tools/net/sunrpc/xdrgen/templates/C/header_top/declaration +d:tools/net/sunrpc/xdrgen/templates/C/header_top/definition +d:tools/net/sunrpc/xdrgen/templates/C/pointer +d:tools/net/sunrpc/xdrgen/templates/C/pointer/declaration +d:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder +d:tools/net/sunrpc/xdrgen/templates/C/pointer/definition +d:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder +d:tools/net/sunrpc/xdrgen/templates/C/pointer/maxsize +d:tools/net/sunrpc/xdrgen/templates/C/program +d:tools/net/sunrpc/xdrgen/templates/C/program/declaration +d:tools/net/sunrpc/xdrgen/templates/C/program/decoder +d:tools/net/sunrpc/xdrgen/templates/C/program/definition +d:tools/net/sunrpc/xdrgen/templates/C/program/encoder +d:tools/net/sunrpc/xdrgen/templates/C/source_top +d:tools/net/sunrpc/xdrgen/templates/C/struct +d:tools/net/sunrpc/xdrgen/templates/C/struct/declaration +d:tools/net/sunrpc/xdrgen/templates/C/struct/decoder +d:tools/net/sunrpc/xdrgen/templates/C/struct/definition +d:tools/net/sunrpc/xdrgen/templates/C/struct/encoder +d:tools/net/sunrpc/xdrgen/templates/C/struct/maxsize +d:tools/net/sunrpc/xdrgen/templates/C/typedef +d:tools/net/sunrpc/xdrgen/templates/C/typedef/declaration +d:tools/net/sunrpc/xdrgen/templates/C/typedef/decoder +d:tools/net/sunrpc/xdrgen/templates/C/typedef/definition +d:tools/net/sunrpc/xdrgen/templates/C/typedef/encoder +d:tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize +d:tools/net/sunrpc/xdrgen/templates/C/union +d:tools/net/sunrpc/xdrgen/templates/C/union/decoder +d:tools/net/sunrpc/xdrgen/templates/C/union/definition +d:tools/net/sunrpc/xdrgen/templates/C/union/encoder +d:tools/net/sunrpc/xdrgen/templates/C/union/maxsize +d:tools/net/sunrpc/xdrgen/tests +d:tools/net/ynl +d:tools/net/ynl/generated +d:tools/net/ynl/lib +d:tools/net/ynl/pyynl +d:tools/net/ynl/pyynl/lib +d:tools/net/ynl/samples +d:tools/objtool +d:tools/objtool/Documentation +d:tools/objtool/arch +d:tools/objtool/arch/loongarch +d:tools/objtool/arch/loongarch/include +d:tools/objtool/arch/loongarch/include/arch +d:tools/objtool/arch/powerpc +d:tools/objtool/arch/powerpc/include +d:tools/objtool/arch/powerpc/include/arch +d:tools/objtool/arch/x86 +d:tools/objtool/arch/x86/include +d:tools/objtool/arch/x86/include/arch +d:tools/objtool/include +d:tools/objtool/include/objtool +d:tools/pcmcia +d:tools/perf +d:tools/perf/Documentation +d:tools/perf/arch +d:tools/perf/arch/alpha +d:tools/perf/arch/alpha/entry +d:tools/perf/arch/alpha/entry/syscalls +d:tools/perf/arch/arc +d:tools/perf/arch/arc/annotate +d:tools/perf/arch/arm +d:tools/perf/arch/arm/annotate +d:tools/perf/arch/arm/entry +d:tools/perf/arch/arm/entry/syscalls +d:tools/perf/arch/arm/include +d:tools/perf/arch/arm/tests +d:tools/perf/arch/arm/util +d:tools/perf/arch/arm64 +d:tools/perf/arch/arm64/annotate +d:tools/perf/arch/arm64/entry +d:tools/perf/arch/arm64/entry/syscalls +d:tools/perf/arch/arm64/include +d:tools/perf/arch/arm64/tests +d:tools/perf/arch/arm64/util +d:tools/perf/arch/csky +d:tools/perf/arch/csky/annotate +d:tools/perf/arch/csky/include +d:tools/perf/arch/csky/util +d:tools/perf/arch/loongarch +d:tools/perf/arch/loongarch/annotate +d:tools/perf/arch/loongarch/include +d:tools/perf/arch/loongarch/util +d:tools/perf/arch/mips +d:tools/perf/arch/mips/annotate +d:tools/perf/arch/mips/entry +d:tools/perf/arch/mips/entry/syscalls +d:tools/perf/arch/mips/include +d:tools/perf/arch/mips/util +d:tools/perf/arch/parisc +d:tools/perf/arch/parisc/entry +d:tools/perf/arch/parisc/entry/syscalls +d:tools/perf/arch/powerpc +d:tools/perf/arch/powerpc/annotate +d:tools/perf/arch/powerpc/entry +d:tools/perf/arch/powerpc/entry/syscalls +d:tools/perf/arch/powerpc/include +d:tools/perf/arch/powerpc/tests +d:tools/perf/arch/powerpc/util +d:tools/perf/arch/riscv +d:tools/perf/arch/riscv/include +d:tools/perf/arch/riscv/util +d:tools/perf/arch/riscv64 +d:tools/perf/arch/riscv64/annotate +d:tools/perf/arch/s390 +d:tools/perf/arch/s390/annotate +d:tools/perf/arch/s390/entry +d:tools/perf/arch/s390/entry/syscalls +d:tools/perf/arch/s390/include +d:tools/perf/arch/s390/util +d:tools/perf/arch/sh +d:tools/perf/arch/sh/entry +d:tools/perf/arch/sh/entry/syscalls +d:tools/perf/arch/sh/include +d:tools/perf/arch/sparc +d:tools/perf/arch/sparc/annotate +d:tools/perf/arch/sparc/entry +d:tools/perf/arch/sparc/entry/syscalls +d:tools/perf/arch/sparc/include +d:tools/perf/arch/x86 +d:tools/perf/arch/x86/annotate +d:tools/perf/arch/x86/entry +d:tools/perf/arch/x86/entry/syscalls +d:tools/perf/arch/x86/include +d:tools/perf/arch/x86/tests +d:tools/perf/arch/x86/util +d:tools/perf/arch/xtensa +d:tools/perf/arch/xtensa/entry +d:tools/perf/arch/xtensa/entry/syscalls +d:tools/perf/arch/xtensa/include +d:tools/perf/bench +d:tools/perf/check-header_ignore_hunks +d:tools/perf/check-header_ignore_hunks/lib +d:tools/perf/dlfilters +d:tools/perf/include +d:tools/perf/include/perf +d:tools/perf/jvmti +d:tools/perf/pmu-events +d:tools/perf/pmu-events/arch +d:tools/perf/pmu-events/arch/arm64 +d:tools/perf/pmu-events/arch/arm64/ampere +d:tools/perf/pmu-events/arch/arm64/ampere/ampereone +d:tools/perf/pmu-events/arch/arm64/ampere/ampereonex +d:tools/perf/pmu-events/arch/arm64/ampere/emag +d:tools/perf/pmu-events/arch/arm64/arm +d:tools/perf/pmu-events/arch/arm64/arm/cmn +d:tools/perf/pmu-events/arch/arm64/arm/cmn/sys +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a34 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a35 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a510 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a53 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a55 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a57-a72 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a710 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a73 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a75 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a76 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a77 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-a78 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-x1 +d:tools/perf/pmu-events/arch/arm64/arm/cortex-x2 +d:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1 +d:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2 +d:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3 +d:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1 +d:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3 +d:tools/perf/pmu-events/arch/arm64/cavium +d:tools/perf/pmu-events/arch/arm64/cavium/thunderx2 +d:tools/perf/pmu-events/arch/arm64/freescale +d:tools/perf/pmu-events/arch/arm64/freescale/imx8mm +d:tools/perf/pmu-events/arch/arm64/freescale/imx8mm/sys +d:tools/perf/pmu-events/arch/arm64/freescale/imx8mn +d:tools/perf/pmu-events/arch/arm64/freescale/imx8mn/sys +d:tools/perf/pmu-events/arch/arm64/freescale/imx8mp +d:tools/perf/pmu-events/arch/arm64/freescale/imx8mp/sys +d:tools/perf/pmu-events/arch/arm64/freescale/imx8mq +d:tools/perf/pmu-events/arch/arm64/freescale/imx8mq/sys +d:tools/perf/pmu-events/arch/arm64/freescale/imx91 +d:tools/perf/pmu-events/arch/arm64/freescale/imx91/sys +d:tools/perf/pmu-events/arch/arm64/freescale/imx93 +d:tools/perf/pmu-events/arch/arm64/freescale/imx93/sys +d:tools/perf/pmu-events/arch/arm64/freescale/imx95 +d:tools/perf/pmu-events/arch/arm64/freescale/imx95/sys +d:tools/perf/pmu-events/arch/arm64/fujitsu +d:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx +d:tools/perf/pmu-events/arch/arm64/fujitsu/monaka +d:tools/perf/pmu-events/arch/arm64/hisilicon +d:tools/perf/pmu-events/arch/arm64/hisilicon/hip08 +d:tools/perf/pmu-events/arch/arm64/hisilicon/hip09 +d:tools/perf/pmu-events/arch/arm64/hisilicon/hip09/sys +d:tools/perf/pmu-events/arch/arm64/thead +d:tools/perf/pmu-events/arch/arm64/thead/yitian710 +d:tools/perf/pmu-events/arch/arm64/thead/yitian710/sys +d:tools/perf/pmu-events/arch/common +d:tools/perf/pmu-events/arch/common/common +d:tools/perf/pmu-events/arch/nds32 +d:tools/perf/pmu-events/arch/nds32/n13 +d:tools/perf/pmu-events/arch/powerpc +d:tools/perf/pmu-events/arch/powerpc/compat +d:tools/perf/pmu-events/arch/powerpc/power10 +d:tools/perf/pmu-events/arch/powerpc/power8 +d:tools/perf/pmu-events/arch/powerpc/power9 +d:tools/perf/pmu-events/arch/riscv +d:tools/perf/pmu-events/arch/riscv/andes +d:tools/perf/pmu-events/arch/riscv/andes/ax45 +d:tools/perf/pmu-events/arch/riscv/sifive +d:tools/perf/pmu-events/arch/riscv/sifive/bullet +d:tools/perf/pmu-events/arch/riscv/sifive/bullet-07 +d:tools/perf/pmu-events/arch/riscv/sifive/bullet-0d +d:tools/perf/pmu-events/arch/riscv/sifive/p550 +d:tools/perf/pmu-events/arch/riscv/sifive/p650 +d:tools/perf/pmu-events/arch/riscv/starfive +d:tools/perf/pmu-events/arch/riscv/starfive/dubhe-80 +d:tools/perf/pmu-events/arch/riscv/thead +d:tools/perf/pmu-events/arch/riscv/thead/c900-legacy +d:tools/perf/pmu-events/arch/s390 +d:tools/perf/pmu-events/arch/s390/cf_z10 +d:tools/perf/pmu-events/arch/s390/cf_z13 +d:tools/perf/pmu-events/arch/s390/cf_z14 +d:tools/perf/pmu-events/arch/s390/cf_z15 +d:tools/perf/pmu-events/arch/s390/cf_z16 +d:tools/perf/pmu-events/arch/s390/cf_z196 +d:tools/perf/pmu-events/arch/s390/cf_zec12 +d:tools/perf/pmu-events/arch/test +d:tools/perf/pmu-events/arch/test/test_soc +d:tools/perf/pmu-events/arch/test/test_soc/cpu +d:tools/perf/pmu-events/arch/test/test_soc/sys +d:tools/perf/pmu-events/arch/x86 +d:tools/perf/pmu-events/arch/x86/alderlake +d:tools/perf/pmu-events/arch/x86/alderlaken +d:tools/perf/pmu-events/arch/x86/amdzen1 +d:tools/perf/pmu-events/arch/x86/amdzen2 +d:tools/perf/pmu-events/arch/x86/amdzen3 +d:tools/perf/pmu-events/arch/x86/amdzen4 +d:tools/perf/pmu-events/arch/x86/amdzen5 +d:tools/perf/pmu-events/arch/x86/arrowlake +d:tools/perf/pmu-events/arch/x86/bonnell +d:tools/perf/pmu-events/arch/x86/broadwell +d:tools/perf/pmu-events/arch/x86/broadwellde +d:tools/perf/pmu-events/arch/x86/broadwellx +d:tools/perf/pmu-events/arch/x86/cascadelakex +d:tools/perf/pmu-events/arch/x86/clearwaterforest +d:tools/perf/pmu-events/arch/x86/elkhartlake +d:tools/perf/pmu-events/arch/x86/emeraldrapids +d:tools/perf/pmu-events/arch/x86/goldmont +d:tools/perf/pmu-events/arch/x86/goldmontplus +d:tools/perf/pmu-events/arch/x86/grandridge +d:tools/perf/pmu-events/arch/x86/graniterapids +d:tools/perf/pmu-events/arch/x86/haswell +d:tools/perf/pmu-events/arch/x86/haswellx +d:tools/perf/pmu-events/arch/x86/icelake +d:tools/perf/pmu-events/arch/x86/icelakex +d:tools/perf/pmu-events/arch/x86/ivybridge +d:tools/perf/pmu-events/arch/x86/ivytown +d:tools/perf/pmu-events/arch/x86/jaketown +d:tools/perf/pmu-events/arch/x86/knightslanding +d:tools/perf/pmu-events/arch/x86/lunarlake +d:tools/perf/pmu-events/arch/x86/meteorlake +d:tools/perf/pmu-events/arch/x86/nehalemep +d:tools/perf/pmu-events/arch/x86/nehalemex +d:tools/perf/pmu-events/arch/x86/rocketlake +d:tools/perf/pmu-events/arch/x86/sandybridge +d:tools/perf/pmu-events/arch/x86/sapphirerapids +d:tools/perf/pmu-events/arch/x86/sierraforest +d:tools/perf/pmu-events/arch/x86/silvermont +d:tools/perf/pmu-events/arch/x86/skylake +d:tools/perf/pmu-events/arch/x86/skylakex +d:tools/perf/pmu-events/arch/x86/snowridgex +d:tools/perf/pmu-events/arch/x86/tigerlake +d:tools/perf/pmu-events/arch/x86/westmereep-dp +d:tools/perf/pmu-events/arch/x86/westmereep-sp +d:tools/perf/pmu-events/arch/x86/westmereex +d:tools/perf/python +d:tools/perf/scripts +d:tools/perf/scripts/perl +d:tools/perf/scripts/perl/Perf-Trace-Util +d:tools/perf/scripts/perl/Perf-Trace-Util/lib +d:tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf +d:tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace +d:tools/perf/scripts/perl/bin +d:tools/perf/scripts/python +d:tools/perf/scripts/python/Perf-Trace-Util +d:tools/perf/scripts/python/Perf-Trace-Util/lib +d:tools/perf/scripts/python/Perf-Trace-Util/lib/Perf +d:tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace +d:tools/perf/scripts/python/bin +d:tools/perf/tests +d:tools/perf/tests/config-fragments +d:tools/perf/tests/shell +d:tools/perf/tests/shell/attr +d:tools/perf/tests/shell/base_probe +d:tools/perf/tests/shell/base_report +d:tools/perf/tests/shell/common +d:tools/perf/tests/shell/coresight +d:tools/perf/tests/shell/coresight/asm_pure_loop +d:tools/perf/tests/shell/coresight/memcpy_thread +d:tools/perf/tests/shell/coresight/thread_loop +d:tools/perf/tests/shell/coresight/unroll_loop_thread +d:tools/perf/tests/shell/lib +d:tools/perf/tests/workloads +d:tools/perf/trace +d:tools/perf/trace/beauty +d:tools/perf/trace/beauty/arch +d:tools/perf/trace/beauty/arch/x86 +d:tools/perf/trace/beauty/arch/x86/include +d:tools/perf/trace/beauty/arch/x86/include/asm +d:tools/perf/trace/beauty/arch/x86/include/uapi +d:tools/perf/trace/beauty/arch/x86/include/uapi/asm +d:tools/perf/trace/beauty/include +d:tools/perf/trace/beauty/include/linux +d:tools/perf/trace/beauty/include/uapi +d:tools/perf/trace/beauty/include/uapi/linux +d:tools/perf/trace/beauty/include/uapi/sound +d:tools/perf/trace/beauty/tracepoints +d:tools/perf/trace/strace +d:tools/perf/trace/strace/groups +d:tools/perf/ui +d:tools/perf/ui/browsers +d:tools/perf/ui/gtk +d:tools/perf/ui/stdio +d:tools/perf/ui/tui +d:tools/perf/util +d:tools/perf/util/arm-spe-decoder +d:tools/perf/util/bpf_skel +d:tools/perf/util/bpf_skel/vmlinux +d:tools/perf/util/cs-etm-decoder +d:tools/perf/util/hisi-ptt-decoder +d:tools/perf/util/include +d:tools/perf/util/include/asm +d:tools/perf/util/include/linux +d:tools/perf/util/intel-pt-decoder +d:tools/perf/util/libunwind +d:tools/perf/util/perf-regs-arch +d:tools/perf/util/scripting-engines +d:tools/power +d:tools/power/acpi +d:tools/power/acpi/common +d:tools/power/acpi/man +d:tools/power/acpi/os_specific +d:tools/power/acpi/os_specific/service_layers +d:tools/power/acpi/tools +d:tools/power/acpi/tools/acpidbg +d:tools/power/acpi/tools/acpidump +d:tools/power/acpi/tools/ec +d:tools/power/acpi/tools/pfrut +d:tools/power/cpupower +d:tools/power/cpupower/bench +d:tools/power/cpupower/bindings +d:tools/power/cpupower/bindings/python +d:tools/power/cpupower/debug +d:tools/power/cpupower/debug/i386 +d:tools/power/cpupower/debug/kernel +d:tools/power/cpupower/debug/x86_64 +d:tools/power/cpupower/lib +d:tools/power/cpupower/man +d:tools/power/cpupower/po +d:tools/power/cpupower/utils +d:tools/power/cpupower/utils/helpers +d:tools/power/cpupower/utils/idle_monitor +d:tools/power/pm-graph +d:tools/power/pm-graph/config +d:tools/power/x86 +d:tools/power/x86/amd_pstate_tracer +d:tools/power/x86/intel-speed-select +d:tools/power/x86/intel_pstate_tracer +d:tools/power/x86/turbostat +d:tools/power/x86/x86_energy_perf_policy +d:tools/rcu +d:tools/sched +d:tools/sched_ext +d:tools/sched_ext/include +d:tools/sched_ext/include/bpf-compat +d:tools/sched_ext/include/bpf-compat/gnu +d:tools/sched_ext/include/scx +d:tools/scripts +d:tools/sound +d:tools/spi +d:tools/testing +d:tools/testing/crypto +d:tools/testing/crypto/chacha20-s390 +d:tools/testing/cxl +d:tools/testing/cxl/test +d:tools/testing/fault-injection +d:tools/testing/ktest +d:tools/testing/ktest/examples +d:tools/testing/ktest/examples/bootconfigs +d:tools/testing/ktest/examples/include +d:tools/testing/kunit +d:tools/testing/kunit/configs +d:tools/testing/kunit/qemu_configs +d:tools/testing/kunit/test_data +d:tools/testing/memblock +d:tools/testing/memblock/asm +d:tools/testing/memblock/lib +d:tools/testing/memblock/linux +d:tools/testing/memblock/scripts +d:tools/testing/memblock/tests +d:tools/testing/nvdimm +d:tools/testing/nvdimm/test +d:tools/testing/radix-tree +d:tools/testing/rbtree +d:tools/testing/scatterlist +d:tools/testing/scatterlist/linux +d:tools/testing/selftests +d:tools/testing/selftests/acct +d:tools/testing/selftests/alsa +d:tools/testing/selftests/alsa/conf.d +d:tools/testing/selftests/amd-pstate +d:tools/testing/selftests/arm64 +d:tools/testing/selftests/arm64/abi +d:tools/testing/selftests/arm64/bti +d:tools/testing/selftests/arm64/fp +d:tools/testing/selftests/arm64/gcs +d:tools/testing/selftests/arm64/mte +d:tools/testing/selftests/arm64/pauth +d:tools/testing/selftests/arm64/signal +d:tools/testing/selftests/arm64/signal/testcases +d:tools/testing/selftests/arm64/tags +d:tools/testing/selftests/bpf +d:tools/testing/selftests/bpf/benchs +d:tools/testing/selftests/bpf/gnu +d:tools/testing/selftests/bpf/map_tests +d:tools/testing/selftests/bpf/prog_tests +d:tools/testing/selftests/bpf/progs +d:tools/testing/selftests/bpf/test_kmods +d:tools/testing/selftests/bpf/verifier +d:tools/testing/selftests/breakpoints +d:tools/testing/selftests/cachestat +d:tools/testing/selftests/capabilities +d:tools/testing/selftests/cgroup +d:tools/testing/selftests/cgroup/lib +d:tools/testing/selftests/cgroup/lib/include +d:tools/testing/selftests/clone3 +d:tools/testing/selftests/connector +d:tools/testing/selftests/core +d:tools/testing/selftests/coredump +d:tools/testing/selftests/cpu-hotplug +d:tools/testing/selftests/cpufreq +d:tools/testing/selftests/damon +d:tools/testing/selftests/devices +d:tools/testing/selftests/devices/error_logs +d:tools/testing/selftests/devices/probe +d:tools/testing/selftests/devices/probe/boards +d:tools/testing/selftests/dma +d:tools/testing/selftests/dmabuf-heaps +d:tools/testing/selftests/drivers +d:tools/testing/selftests/drivers/dma-buf +d:tools/testing/selftests/drivers/gpu +d:tools/testing/selftests/drivers/net +d:tools/testing/selftests/drivers/net/bonding +d:tools/testing/selftests/drivers/net/dsa +d:tools/testing/selftests/drivers/net/hw +d:tools/testing/selftests/drivers/net/hw/lib +d:tools/testing/selftests/drivers/net/hw/lib/py +d:tools/testing/selftests/drivers/net/lib +d:tools/testing/selftests/drivers/net/lib/py +d:tools/testing/selftests/drivers/net/lib/sh +d:tools/testing/selftests/drivers/net/microchip +d:tools/testing/selftests/drivers/net/mlxsw +d:tools/testing/selftests/drivers/net/mlxsw/spectrum +d:tools/testing/selftests/drivers/net/mlxsw/spectrum-2 +d:tools/testing/selftests/drivers/net/netdevsim +d:tools/testing/selftests/drivers/net/ocelot +d:tools/testing/selftests/drivers/net/team +d:tools/testing/selftests/drivers/net/virtio_net +d:tools/testing/selftests/drivers/ntsync +d:tools/testing/selftests/drivers/platform +d:tools/testing/selftests/drivers/platform/x86 +d:tools/testing/selftests/drivers/platform/x86/intel +d:tools/testing/selftests/drivers/platform/x86/intel/ifs +d:tools/testing/selftests/drivers/s390x +d:tools/testing/selftests/drivers/s390x/uvdevice +d:tools/testing/selftests/drivers/sdsi +d:tools/testing/selftests/drivers/usb +d:tools/testing/selftests/drivers/usb/usbip +d:tools/testing/selftests/dt +d:tools/testing/selftests/efivarfs +d:tools/testing/selftests/exec +d:tools/testing/selftests/fchmodat2 +d:tools/testing/selftests/filelock +d:tools/testing/selftests/filesystems +d:tools/testing/selftests/filesystems/binderfs +d:tools/testing/selftests/filesystems/epoll +d:tools/testing/selftests/filesystems/eventfd +d:tools/testing/selftests/filesystems/fat +d:tools/testing/selftests/filesystems/mount-notify +d:tools/testing/selftests/filesystems/nsfs +d:tools/testing/selftests/filesystems/overlayfs +d:tools/testing/selftests/filesystems/statmount +d:tools/testing/selftests/firmware +d:tools/testing/selftests/fpu +d:tools/testing/selftests/ftrace +d:tools/testing/selftests/ftrace/samples +d:tools/testing/selftests/ftrace/test.d +d:tools/testing/selftests/ftrace/test.d/00basic +d:tools/testing/selftests/ftrace/test.d/direct +d:tools/testing/selftests/ftrace/test.d/dynevent +d:tools/testing/selftests/ftrace/test.d/event +d:tools/testing/selftests/ftrace/test.d/filter +d:tools/testing/selftests/ftrace/test.d/ftrace +d:tools/testing/selftests/ftrace/test.d/instances +d:tools/testing/selftests/ftrace/test.d/kprobe +d:tools/testing/selftests/ftrace/test.d/preemptirq +d:tools/testing/selftests/ftrace/test.d/selftest +d:tools/testing/selftests/ftrace/test.d/tracer +d:tools/testing/selftests/ftrace/test.d/trigger +d:tools/testing/selftests/ftrace/test.d/trigger/inter-event +d:tools/testing/selftests/futex +d:tools/testing/selftests/futex/functional +d:tools/testing/selftests/futex/include +d:tools/testing/selftests/gpio +d:tools/testing/selftests/hid +d:tools/testing/selftests/hid/progs +d:tools/testing/selftests/hid/tests +d:tools/testing/selftests/ia64 +d:tools/testing/selftests/intel_pstate +d:tools/testing/selftests/iommu +d:tools/testing/selftests/ipc +d:tools/testing/selftests/ir +d:tools/testing/selftests/kcmp +d:tools/testing/selftests/kexec +d:tools/testing/selftests/kmod +d:tools/testing/selftests/kselftest +d:tools/testing/selftests/kselftest_harness +d:tools/testing/selftests/kvm +d:tools/testing/selftests/kvm/arm64 +d:tools/testing/selftests/kvm/include +d:tools/testing/selftests/kvm/include/arm64 +d:tools/testing/selftests/kvm/include/loongarch +d:tools/testing/selftests/kvm/include/riscv +d:tools/testing/selftests/kvm/include/s390 +d:tools/testing/selftests/kvm/include/x86 +d:tools/testing/selftests/kvm/lib +d:tools/testing/selftests/kvm/lib/arm64 +d:tools/testing/selftests/kvm/lib/loongarch +d:tools/testing/selftests/kvm/lib/riscv +d:tools/testing/selftests/kvm/lib/s390 +d:tools/testing/selftests/kvm/lib/x86 +d:tools/testing/selftests/kvm/riscv +d:tools/testing/selftests/kvm/s390 +d:tools/testing/selftests/kvm/x86 +d:tools/testing/selftests/landlock +d:tools/testing/selftests/lib +d:tools/testing/selftests/livepatch +d:tools/testing/selftests/livepatch/test_modules +d:tools/testing/selftests/lkdtm +d:tools/testing/selftests/locking +d:tools/testing/selftests/lsm +d:tools/testing/selftests/media_tests +d:tools/testing/selftests/membarrier +d:tools/testing/selftests/memfd +d:tools/testing/selftests/memory-hotplug +d:tools/testing/selftests/mincore +d:tools/testing/selftests/mm +d:tools/testing/selftests/mm/page_frag +d:tools/testing/selftests/module +d:tools/testing/selftests/mount +d:tools/testing/selftests/mount_setattr +d:tools/testing/selftests/move_mount_set_group +d:tools/testing/selftests/mqueue +d:tools/testing/selftests/mseal_system_mappings +d:tools/testing/selftests/nci +d:tools/testing/selftests/net +d:tools/testing/selftests/net/af_unix +d:tools/testing/selftests/net/bench +d:tools/testing/selftests/net/bench/page_pool +d:tools/testing/selftests/net/can +d:tools/testing/selftests/net/forwarding +d:tools/testing/selftests/net/hsr +d:tools/testing/selftests/net/lib +d:tools/testing/selftests/net/lib/py +d:tools/testing/selftests/net/lib/sh +d:tools/testing/selftests/net/mptcp +d:tools/testing/selftests/net/netfilter +d:tools/testing/selftests/net/netfilter/packetdrill +d:tools/testing/selftests/net/openvswitch +d:tools/testing/selftests/net/ovpn +d:tools/testing/selftests/net/packetdrill +d:tools/testing/selftests/net/rds +d:tools/testing/selftests/net/tcp_ao +d:tools/testing/selftests/net/tcp_ao/lib +d:tools/testing/selftests/nolibc +d:tools/testing/selftests/ntb +d:tools/testing/selftests/openat2 +d:tools/testing/selftests/pci_endpoint +d:tools/testing/selftests/pcie_bwctrl +d:tools/testing/selftests/perf_events +d:tools/testing/selftests/pid_namespace +d:tools/testing/selftests/pidfd +d:tools/testing/selftests/power_supply +d:tools/testing/selftests/powerpc +d:tools/testing/selftests/powerpc/alignment +d:tools/testing/selftests/powerpc/benchmarks +d:tools/testing/selftests/powerpc/cache_shape +d:tools/testing/selftests/powerpc/copyloops +d:tools/testing/selftests/powerpc/copyloops/asm +d:tools/testing/selftests/powerpc/copyloops/linux +d:tools/testing/selftests/powerpc/dexcr +d:tools/testing/selftests/powerpc/dscr +d:tools/testing/selftests/powerpc/eeh +d:tools/testing/selftests/powerpc/include +d:tools/testing/selftests/powerpc/lib +d:tools/testing/selftests/powerpc/math +d:tools/testing/selftests/powerpc/mce +d:tools/testing/selftests/powerpc/mm +d:tools/testing/selftests/powerpc/nx-gzip +d:tools/testing/selftests/powerpc/nx-gzip/include +d:tools/testing/selftests/powerpc/papr_attributes +d:tools/testing/selftests/powerpc/papr_sysparm +d:tools/testing/selftests/powerpc/papr_vpd +d:tools/testing/selftests/powerpc/pmu +d:tools/testing/selftests/powerpc/pmu/ebb +d:tools/testing/selftests/powerpc/pmu/event_code_tests +d:tools/testing/selftests/powerpc/pmu/sampling_tests +d:tools/testing/selftests/powerpc/primitives +d:tools/testing/selftests/powerpc/primitives/asm +d:tools/testing/selftests/powerpc/primitives/linux +d:tools/testing/selftests/powerpc/ptrace +d:tools/testing/selftests/powerpc/scripts +d:tools/testing/selftests/powerpc/security +d:tools/testing/selftests/powerpc/signal +d:tools/testing/selftests/powerpc/stringloops +d:tools/testing/selftests/powerpc/stringloops/asm +d:tools/testing/selftests/powerpc/stringloops/linux +d:tools/testing/selftests/powerpc/switch_endian +d:tools/testing/selftests/powerpc/syscalls +d:tools/testing/selftests/powerpc/tm +d:tools/testing/selftests/powerpc/vphn +d:tools/testing/selftests/powerpc/vphn/asm +d:tools/testing/selftests/prctl +d:tools/testing/selftests/proc +d:tools/testing/selftests/pstore +d:tools/testing/selftests/ptp +d:tools/testing/selftests/ptrace +d:tools/testing/selftests/rcutorture +d:tools/testing/selftests/rcutorture/bin +d:tools/testing/selftests/rcutorture/configs +d:tools/testing/selftests/rcutorture/configs/lock +d:tools/testing/selftests/rcutorture/configs/rcu +d:tools/testing/selftests/rcutorture/configs/rcuscale +d:tools/testing/selftests/rcutorture/configs/refscale +d:tools/testing/selftests/rcutorture/configs/scf +d:tools/testing/selftests/rcutorture/doc +d:tools/testing/selftests/resctrl +d:tools/testing/selftests/ring-buffer +d:tools/testing/selftests/riscv +d:tools/testing/selftests/riscv/abi +d:tools/testing/selftests/riscv/hwprobe +d:tools/testing/selftests/riscv/mm +d:tools/testing/selftests/riscv/sigreturn +d:tools/testing/selftests/riscv/vector +d:tools/testing/selftests/rlimits +d:tools/testing/selftests/rseq +d:tools/testing/selftests/rtc +d:tools/testing/selftests/rust +d:tools/testing/selftests/safesetid +d:tools/testing/selftests/sched +d:tools/testing/selftests/sched_ext +d:tools/testing/selftests/seccomp +d:tools/testing/selftests/sgx +d:tools/testing/selftests/signal +d:tools/testing/selftests/size +d:tools/testing/selftests/sparc64 +d:tools/testing/selftests/sparc64/drivers +d:tools/testing/selftests/splice +d:tools/testing/selftests/static_keys +d:tools/testing/selftests/sync +d:tools/testing/selftests/syscall_user_dispatch +d:tools/testing/selftests/sysctl +d:tools/testing/selftests/tc-testing +d:tools/testing/selftests/tc-testing/creating-plugins +d:tools/testing/selftests/tc-testing/creating-testcases +d:tools/testing/selftests/tc-testing/plugin-lib +d:tools/testing/selftests/tc-testing/plugins +d:tools/testing/selftests/tc-testing/scripts +d:tools/testing/selftests/tc-testing/tc-tests +d:tools/testing/selftests/tc-testing/tc-tests/actions +d:tools/testing/selftests/tc-testing/tc-tests/filters +d:tools/testing/selftests/tc-testing/tc-tests/infra +d:tools/testing/selftests/tc-testing/tc-tests/qdiscs +d:tools/testing/selftests/tdx +d:tools/testing/selftests/thermal +d:tools/testing/selftests/thermal/intel +d:tools/testing/selftests/thermal/intel/power_floor +d:tools/testing/selftests/thermal/intel/workload_hint +d:tools/testing/selftests/timens +d:tools/testing/selftests/timers +d:tools/testing/selftests/tmpfs +d:tools/testing/selftests/tpm2 +d:tools/testing/selftests/tty +d:tools/testing/selftests/turbostat +d:tools/testing/selftests/ublk +d:tools/testing/selftests/ublk/trace +d:tools/testing/selftests/uevent +d:tools/testing/selftests/user_events +d:tools/testing/selftests/vDSO +d:tools/testing/selftests/vsock +d:tools/testing/selftests/watchdog +d:tools/testing/selftests/wireguard +d:tools/testing/selftests/wireguard/qemu +d:tools/testing/selftests/wireguard/qemu/arch +d:tools/testing/selftests/x86 +d:tools/testing/selftests/x86/bugs +d:tools/testing/selftests/zram +d:tools/testing/shared +d:tools/testing/shared/linux +d:tools/testing/shared/trace +d:tools/testing/shared/trace/events +d:tools/testing/vma +d:tools/testing/vma/linux +d:tools/testing/vsock +d:tools/thermal +d:tools/thermal/lib +d:tools/thermal/thermal-engine +d:tools/thermal/thermometer +d:tools/thermal/tmon +d:tools/time +d:tools/tracing +d:tools/tracing/latency +d:tools/tracing/rtla +d:tools/tracing/rtla/sample +d:tools/tracing/rtla/src +d:tools/tracing/rtla/tests +d:tools/usb +d:tools/usb/ffs-aio-example +d:tools/usb/ffs-aio-example/multibuff +d:tools/usb/ffs-aio-example/multibuff/device_app +d:tools/usb/ffs-aio-example/multibuff/host_app +d:tools/usb/ffs-aio-example/simple +d:tools/usb/ffs-aio-example/simple/device_app +d:tools/usb/ffs-aio-example/simple/host_app +d:tools/usb/usbip +d:tools/usb/usbip/doc +d:tools/usb/usbip/libsrc +d:tools/usb/usbip/src +d:tools/usb/usbip/vudc +d:tools/verification +d:tools/verification/models +d:tools/verification/models/rtapp +d:tools/verification/models/sched +d:tools/verification/rv +d:tools/verification/rv/include +d:tools/verification/rv/src +d:tools/verification/rvgen +d:tools/verification/rvgen/rvgen +d:tools/verification/rvgen/rvgen/templates +d:tools/verification/rvgen/rvgen/templates/container +d:tools/verification/rvgen/rvgen/templates/dot2k +d:tools/verification/rvgen/rvgen/templates/ltl2k +d:tools/virtio +d:tools/virtio/asm +d:tools/virtio/crypto +d:tools/virtio/generated +d:tools/virtio/linux +d:tools/virtio/ringtest +d:tools/virtio/uapi +d:tools/virtio/uapi/linux +d:tools/virtio/vhost_test +d:tools/virtio/virtio-trace +d:tools/virtio/xen +d:tools/wmi +d:tools/workqueue +d:tools/writeback +d:usr +d:usr/dummy-include +d:usr/include +d:virt +d:virt/kvm +d:virt/lib +f:.clang-format +f:.clippy.toml +f:.cocciconfig +f:.editorconfig +f:.get_maintainer.ignore +f:.git/HEAD +f:.git/config +f:.git/description +f:.git/hooks/applypatch-msg.sample +f:.git/hooks/commit-msg.sample +f:.git/hooks/fsmonitor-watchman.sample +f:.git/hooks/post-update.sample +f:.git/hooks/pre-applypatch.sample +f:.git/hooks/pre-commit.sample +f:.git/hooks/pre-merge-commit.sample +f:.git/hooks/pre-push.sample +f:.git/hooks/pre-rebase.sample +f:.git/hooks/pre-receive.sample +f:.git/hooks/prepare-commit-msg.sample +f:.git/hooks/push-to-checkout.sample +f:.git/hooks/sendemail-validate.sample +f:.git/hooks/update.sample +f:.git/index +f:.git/info/exclude +f:.git/logs/HEAD +f:.git/logs/refs/heads/master +f:.git/logs/refs/remotes/origin/HEAD +f:.git/objects/pack/pack-9486f8e061e64de743019326996d98b7eb6d597d.idx +f:.git/objects/pack/pack-9486f8e061e64de743019326996d98b7eb6d597d.pack +f:.git/objects/pack/pack-9486f8e061e64de743019326996d98b7eb6d597d.rev +f:.git/packed-refs +f:.git/refs/heads/master +f:.git/refs/remotes/origin/HEAD +f:.gitattributes +f:.gitignore +f:.mailmap +f:.pylintrc +f:.rustfmt.toml +f:COPYING +f:CREDITS +f:Documentation/.gitignore +f:Documentation/ABI/README +f:Documentation/ABI/obsolete/o2cb +f:Documentation/ABI/obsolete/procfs-i8k +f:Documentation/ABI/obsolete/sysfs-bus-iio +f:Documentation/ABI/obsolete/sysfs-bus-usb +f:Documentation/ABI/obsolete/sysfs-class-typec +f:Documentation/ABI/obsolete/sysfs-cpuidle +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-arvo +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-isku +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-koneplus +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-konepure +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-kovaplus +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-lua +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-pyra +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-ryos +f:Documentation/ABI/obsolete/sysfs-driver-hid-roccat-savu +f:Documentation/ABI/obsolete/sysfs-driver-intel_pmc_bxt +f:Documentation/ABI/obsolete/sysfs-driver-samsung-laptop +f:Documentation/ABI/obsolete/sysfs-firmware-acpi +f:Documentation/ABI/obsolete/sysfs-gpio +f:Documentation/ABI/obsolete/sysfs-kernel-fadump_enabled +f:Documentation/ABI/obsolete/sysfs-kernel-fadump_registered +f:Documentation/ABI/obsolete/sysfs-kernel-fadump_release_mem +f:Documentation/ABI/obsolete/sysfs-platform-ideapad-laptop +f:Documentation/ABI/obsolete/sysfs-selinux-user +f:Documentation/ABI/removed/devfs +f:Documentation/ABI/removed/dv1394 +f:Documentation/ABI/removed/ip_queue +f:Documentation/ABI/removed/net_dma +f:Documentation/ABI/removed/o2cb +f:Documentation/ABI/removed/raw1394 +f:Documentation/ABI/removed/sysfs-bus-nfit +f:Documentation/ABI/removed/sysfs-class-cxl +f:Documentation/ABI/removed/sysfs-class-rfkill +f:Documentation/ABI/removed/sysfs-firmware-efi-vars +f:Documentation/ABI/removed/sysfs-kernel-fadump_release_opalcore +f:Documentation/ABI/removed/sysfs-kernel-uids +f:Documentation/ABI/removed/sysfs-mce +f:Documentation/ABI/removed/sysfs-selinux-checkreqprot +f:Documentation/ABI/removed/sysfs-selinux-disable +f:Documentation/ABI/removed/video1394 +f:Documentation/ABI/stable/firewire-cdev +f:Documentation/ABI/stable/o2cb +f:Documentation/ABI/stable/procfs-audit_loginuid +f:Documentation/ABI/stable/syscalls +f:Documentation/ABI/stable/sysfs-acpi-pmprofile +f:Documentation/ABI/stable/sysfs-block +f:Documentation/ABI/stable/sysfs-bus-firewire +f:Documentation/ABI/stable/sysfs-bus-fsl-mc +f:Documentation/ABI/stable/sysfs-bus-mhi +f:Documentation/ABI/stable/sysfs-bus-nvmem +f:Documentation/ABI/stable/sysfs-bus-usb +f:Documentation/ABI/stable/sysfs-bus-vmbus +f:Documentation/ABI/stable/sysfs-bus-w1 +f:Documentation/ABI/stable/sysfs-bus-xen-backend +f:Documentation/ABI/stable/sysfs-class-backlight +f:Documentation/ABI/stable/sysfs-class-bluetooth +f:Documentation/ABI/stable/sysfs-class-infiniband +f:Documentation/ABI/stable/sysfs-class-rfkill +f:Documentation/ABI/stable/sysfs-class-tpm +f:Documentation/ABI/stable/sysfs-class-ubi +f:Documentation/ABI/stable/sysfs-class-udc +f:Documentation/ABI/stable/sysfs-devices +f:Documentation/ABI/stable/sysfs-devices-node +f:Documentation/ABI/stable/sysfs-devices-system-cpu +f:Documentation/ABI/stable/sysfs-devices-system-xen_memory +f:Documentation/ABI/stable/sysfs-driver-aspeed-vuart +f:Documentation/ABI/stable/sysfs-driver-dma-idxd +f:Documentation/ABI/stable/sysfs-driver-dma-ioatdma +f:Documentation/ABI/stable/sysfs-driver-firmware-zynqmp +f:Documentation/ABI/stable/sysfs-driver-ib_srp +f:Documentation/ABI/stable/sysfs-driver-misc-cp500 +f:Documentation/ABI/stable/sysfs-driver-mlxreg-io +f:Documentation/ABI/stable/sysfs-driver-qla2xxx +f:Documentation/ABI/stable/sysfs-driver-speakup +f:Documentation/ABI/stable/sysfs-driver-usb-usbtmc +f:Documentation/ABI/stable/sysfs-driver-w1_ds2438 +f:Documentation/ABI/stable/sysfs-driver-w1_ds28e04 +f:Documentation/ABI/stable/sysfs-driver-w1_ds28ea00 +f:Documentation/ABI/stable/sysfs-firmware-opal-dump +f:Documentation/ABI/stable/sysfs-firmware-opal-elog +f:Documentation/ABI/stable/sysfs-fs-orangefs +f:Documentation/ABI/stable/sysfs-hypervisor-xen +f:Documentation/ABI/stable/sysfs-kernel-notes +f:Documentation/ABI/stable/sysfs-kernel-time-aux-clocks +f:Documentation/ABI/stable/sysfs-module +f:Documentation/ABI/stable/sysfs-platform-wmi-bmof +f:Documentation/ABI/stable/sysfs-transport-srp +f:Documentation/ABI/stable/thermal-notification +f:Documentation/ABI/stable/vdso +f:Documentation/ABI/testing/configfs-acpi +f:Documentation/ABI/testing/configfs-iio +f:Documentation/ABI/testing/configfs-most +f:Documentation/ABI/testing/configfs-rdma_cm +f:Documentation/ABI/testing/configfs-spear-pcie-gadget +f:Documentation/ABI/testing/configfs-stp-policy +f:Documentation/ABI/testing/configfs-stp-policy-p_sys-t +f:Documentation/ABI/testing/configfs-tsm-report +f:Documentation/ABI/testing/configfs-usb-gadget +f:Documentation/ABI/testing/configfs-usb-gadget-acm +f:Documentation/ABI/testing/configfs-usb-gadget-ecm +f:Documentation/ABI/testing/configfs-usb-gadget-eem +f:Documentation/ABI/testing/configfs-usb-gadget-ffs +f:Documentation/ABI/testing/configfs-usb-gadget-hid +f:Documentation/ABI/testing/configfs-usb-gadget-loopback +f:Documentation/ABI/testing/configfs-usb-gadget-mass-storage +f:Documentation/ABI/testing/configfs-usb-gadget-midi +f:Documentation/ABI/testing/configfs-usb-gadget-midi2 +f:Documentation/ABI/testing/configfs-usb-gadget-ncm +f:Documentation/ABI/testing/configfs-usb-gadget-obex +f:Documentation/ABI/testing/configfs-usb-gadget-phonet +f:Documentation/ABI/testing/configfs-usb-gadget-printer +f:Documentation/ABI/testing/configfs-usb-gadget-rndis +f:Documentation/ABI/testing/configfs-usb-gadget-serial +f:Documentation/ABI/testing/configfs-usb-gadget-sourcesink +f:Documentation/ABI/testing/configfs-usb-gadget-subset +f:Documentation/ABI/testing/configfs-usb-gadget-tcm +f:Documentation/ABI/testing/configfs-usb-gadget-uac1 +f:Documentation/ABI/testing/configfs-usb-gadget-uac1_legacy +f:Documentation/ABI/testing/configfs-usb-gadget-uac2 +f:Documentation/ABI/testing/configfs-usb-gadget-uvc +f:Documentation/ABI/testing/debugfs-alienware-wmi +f:Documentation/ABI/testing/debugfs-amd-iommu +f:Documentation/ABI/testing/debugfs-cec-error-inj +f:Documentation/ABI/testing/debugfs-cros-ec +f:Documentation/ABI/testing/debugfs-cxl +f:Documentation/ABI/testing/debugfs-dell-wmi-ddv +f:Documentation/ABI/testing/debugfs-driver-dcc +f:Documentation/ABI/testing/debugfs-driver-genwqe +f:Documentation/ABI/testing/debugfs-driver-habanalabs +f:Documentation/ABI/testing/debugfs-driver-qat +f:Documentation/ABI/testing/debugfs-driver-qat_telemetry +f:Documentation/ABI/testing/debugfs-dwc-pcie +f:Documentation/ABI/testing/debugfs-ec +f:Documentation/ABI/testing/debugfs-hisi-hpre +f:Documentation/ABI/testing/debugfs-hisi-migration +f:Documentation/ABI/testing/debugfs-hisi-sec +f:Documentation/ABI/testing/debugfs-hisi-zip +f:Documentation/ABI/testing/debugfs-hyperv +f:Documentation/ABI/testing/debugfs-ideapad +f:Documentation/ABI/testing/debugfs-iio-ad9467 +f:Documentation/ABI/testing/debugfs-iio-backend +f:Documentation/ABI/testing/debugfs-intel-iommu +f:Documentation/ABI/testing/debugfs-moxtet +f:Documentation/ABI/testing/debugfs-msi-wmi-platform +f:Documentation/ABI/testing/debugfs-olpc +f:Documentation/ABI/testing/debugfs-pcie-ptm +f:Documentation/ABI/testing/debugfs-pfo-nx-crypto +f:Documentation/ABI/testing/debugfs-scmi +f:Documentation/ABI/testing/debugfs-scmi-raw +f:Documentation/ABI/testing/debugfs-tpmi +f:Documentation/ABI/testing/debugfs-vfio +f:Documentation/ABI/testing/debugfs-wilco-ec +f:Documentation/ABI/testing/dell-smbios-wmi +f:Documentation/ABI/testing/dev-kmsg +f:Documentation/ABI/testing/devlink-resource-mlxsw +f:Documentation/ABI/testing/evm +f:Documentation/ABI/testing/gpio-cdev +f:Documentation/ABI/testing/ima_policy +f:Documentation/ABI/testing/ppc-memtrace +f:Documentation/ABI/testing/procfs-attr-current +f:Documentation/ABI/testing/procfs-attr-exec +f:Documentation/ABI/testing/procfs-attr-prev +f:Documentation/ABI/testing/procfs-diskstats +f:Documentation/ABI/testing/procfs-smaps_rollup +f:Documentation/ABI/testing/pstore +f:Documentation/ABI/testing/rtc-cdev +f:Documentation/ABI/testing/securityfs-secrets-coco +f:Documentation/ABI/testing/sysfs-amd-pmc +f:Documentation/ABI/testing/sysfs-amd-pmf +f:Documentation/ABI/testing/sysfs-ata +f:Documentation/ABI/testing/sysfs-block-aoe +f:Documentation/ABI/testing/sysfs-block-bcache +f:Documentation/ABI/testing/sysfs-block-device +f:Documentation/ABI/testing/sysfs-block-dm +f:Documentation/ABI/testing/sysfs-block-loop +f:Documentation/ABI/testing/sysfs-block-rnbd +f:Documentation/ABI/testing/sysfs-block-rssd +f:Documentation/ABI/testing/sysfs-block-zram +f:Documentation/ABI/testing/sysfs-bus-acpi +f:Documentation/ABI/testing/sysfs-bus-amba +f:Documentation/ABI/testing/sysfs-bus-auxiliary +f:Documentation/ABI/testing/sysfs-bus-bcma +f:Documentation/ABI/testing/sysfs-bus-cdx +f:Documentation/ABI/testing/sysfs-bus-coreboot +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-cti +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-dummy-source +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-etb10 +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-etm3x +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-etm4x +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-funnel +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-stm +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-tmc +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-tpdm +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-trbe +f:Documentation/ABI/testing/sysfs-bus-coresight-devices-ultra_smb +f:Documentation/ABI/testing/sysfs-bus-counter +f:Documentation/ABI/testing/sysfs-bus-css +f:Documentation/ABI/testing/sysfs-bus-cxl +f:Documentation/ABI/testing/sysfs-bus-dax +f:Documentation/ABI/testing/sysfs-bus-dfl +f:Documentation/ABI/testing/sysfs-bus-dfl-devices-emif +f:Documentation/ABI/testing/sysfs-bus-dfl-devices-n3000-nios +f:Documentation/ABI/testing/sysfs-bus-event_source-devices +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-caps +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-dfl_fme +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-dsa +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-events +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-format +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-hisi_ptt +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_gpci +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-iommu +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-uncore +f:Documentation/ABI/testing/sysfs-bus-event_source-devices-vpa-pmu +f:Documentation/ABI/testing/sysfs-bus-fcoe +f:Documentation/ABI/testing/sysfs-bus-fsi +f:Documentation/ABI/testing/sysfs-bus-fsi-devices-sbefifo +f:Documentation/ABI/testing/sysfs-bus-fsl-mc +f:Documentation/ABI/testing/sysfs-bus-hsi +f:Documentation/ABI/testing/sysfs-bus-i2c-devices-bq32k +f:Documentation/ABI/testing/sysfs-bus-i2c-devices-fsa9480 +f:Documentation/ABI/testing/sysfs-bus-i2c-devices-hm6352 +f:Documentation/ABI/testing/sysfs-bus-i2c-devices-lm3533 +f:Documentation/ABI/testing/sysfs-bus-i2c-devices-pca954x +f:Documentation/ABI/testing/sysfs-bus-i2c-devices-turris-omnia-mcu +f:Documentation/ABI/testing/sysfs-bus-i3c +f:Documentation/ABI/testing/sysfs-bus-iio +f:Documentation/ABI/testing/sysfs-bus-iio-accel-adxl372 +f:Documentation/ABI/testing/sysfs-bus-iio-accel-bmc150 +f:Documentation/ABI/testing/sysfs-bus-iio-ad9739a +f:Documentation/ABI/testing/sysfs-bus-iio-adc-ad-sigma-delta +f:Documentation/ABI/testing/sysfs-bus-iio-adc-ad4130 +f:Documentation/ABI/testing/sysfs-bus-iio-adc-ad7192 +f:Documentation/ABI/testing/sysfs-bus-iio-adc-ad7280a +f:Documentation/ABI/testing/sysfs-bus-iio-adc-envelope-detector +f:Documentation/ABI/testing/sysfs-bus-iio-adc-hi8435 +f:Documentation/ABI/testing/sysfs-bus-iio-adc-max11410 +f:Documentation/ABI/testing/sysfs-bus-iio-adc-mcp3564 +f:Documentation/ABI/testing/sysfs-bus-iio-adc-mt6360 +f:Documentation/ABI/testing/sysfs-bus-iio-adc-pac1934 +f:Documentation/ABI/testing/sysfs-bus-iio-adc-stm32 +f:Documentation/ABI/testing/sysfs-bus-iio-bno055 +f:Documentation/ABI/testing/sysfs-bus-iio-cdc-ad7746 +f:Documentation/ABI/testing/sysfs-bus-iio-chemical-sgp40 +f:Documentation/ABI/testing/sysfs-bus-iio-chemical-sunrise-co2 +f:Documentation/ABI/testing/sysfs-bus-iio-chemical-vz89x +f:Documentation/ABI/testing/sysfs-bus-iio-cros-ec +f:Documentation/ABI/testing/sysfs-bus-iio-dac +f:Documentation/ABI/testing/sysfs-bus-iio-dac-ad5766 +f:Documentation/ABI/testing/sysfs-bus-iio-dac-dpot-dac +f:Documentation/ABI/testing/sysfs-bus-iio-dac-ltc2688 +f:Documentation/ABI/testing/sysfs-bus-iio-dfsdm-adc-stm32 +f:Documentation/ABI/testing/sysfs-bus-iio-distance-srf08 +f:Documentation/ABI/testing/sysfs-bus-iio-dma-buffer +f:Documentation/ABI/testing/sysfs-bus-iio-filter-admv8818 +f:Documentation/ABI/testing/sysfs-bus-iio-frequency-ad9523 +f:Documentation/ABI/testing/sysfs-bus-iio-frequency-adf4350 +f:Documentation/ABI/testing/sysfs-bus-iio-frequency-adf4371 +f:Documentation/ABI/testing/sysfs-bus-iio-frequency-admv1013 +f:Documentation/ABI/testing/sysfs-bus-iio-frequency-admv1014 +f:Documentation/ABI/testing/sysfs-bus-iio-gyro-bmg160 +f:Documentation/ABI/testing/sysfs-bus-iio-health-afe440x +f:Documentation/ABI/testing/sysfs-bus-iio-humidity +f:Documentation/ABI/testing/sysfs-bus-iio-impedance-analyzer-ad5933 +f:Documentation/ABI/testing/sysfs-bus-iio-ina2xx-adc +f:Documentation/ABI/testing/sysfs-bus-iio-inv_icm42600 +f:Documentation/ABI/testing/sysfs-bus-iio-isl29501 +f:Documentation/ABI/testing/sysfs-bus-iio-light-isl29018 +f:Documentation/ABI/testing/sysfs-bus-iio-light-lm3533-als +f:Documentation/ABI/testing/sysfs-bus-iio-light-si1133 +f:Documentation/ABI/testing/sysfs-bus-iio-light-tsl2583 +f:Documentation/ABI/testing/sysfs-bus-iio-light-tsl2772 +f:Documentation/ABI/testing/sysfs-bus-iio-magnetometer-hmc5843 +f:Documentation/ABI/testing/sysfs-bus-iio-meas-spec +f:Documentation/ABI/testing/sysfs-bus-iio-mpu6050 +f:Documentation/ABI/testing/sysfs-bus-iio-potentiometer-mcp4531 +f:Documentation/ABI/testing/sysfs-bus-iio-proximity +f:Documentation/ABI/testing/sysfs-bus-iio-proximity-as3935 +f:Documentation/ABI/testing/sysfs-bus-iio-resolver-ad2s1210 +f:Documentation/ABI/testing/sysfs-bus-iio-sps30 +f:Documentation/ABI/testing/sysfs-bus-iio-sx9310 +f:Documentation/ABI/testing/sysfs-bus-iio-sx9324 +f:Documentation/ABI/testing/sysfs-bus-iio-thermocouple +f:Documentation/ABI/testing/sysfs-bus-iio-timer-stm32 +f:Documentation/ABI/testing/sysfs-bus-iio-trigger-sysfs +f:Documentation/ABI/testing/sysfs-bus-iio-vf610 +f:Documentation/ABI/testing/sysfs-bus-intel_th-devices-gth +f:Documentation/ABI/testing/sysfs-bus-intel_th-devices-msc +f:Documentation/ABI/testing/sysfs-bus-intel_th-devices-pti +f:Documentation/ABI/testing/sysfs-bus-intel_th-output-devices +f:Documentation/ABI/testing/sysfs-bus-mcb +f:Documentation/ABI/testing/sysfs-bus-mdio +f:Documentation/ABI/testing/sysfs-bus-media +f:Documentation/ABI/testing/sysfs-bus-mei +f:Documentation/ABI/testing/sysfs-bus-mmc +f:Documentation/ABI/testing/sysfs-bus-most +f:Documentation/ABI/testing/sysfs-bus-moxtet-devices +f:Documentation/ABI/testing/sysfs-bus-nfit +f:Documentation/ABI/testing/sysfs-bus-nvdimm +f:Documentation/ABI/testing/sysfs-bus-optee-devices +f:Documentation/ABI/testing/sysfs-bus-papr-pmem +f:Documentation/ABI/testing/sysfs-bus-pci +f:Documentation/ABI/testing/sysfs-bus-pci-devices-aer +f:Documentation/ABI/testing/sysfs-bus-pci-devices-avs +f:Documentation/ABI/testing/sysfs-bus-pci-devices-catpt +f:Documentation/ABI/testing/sysfs-bus-pci-devices-cciss +f:Documentation/ABI/testing/sysfs-bus-pci-devices-pvpanic +f:Documentation/ABI/testing/sysfs-bus-pci-drivers-ehci_hcd +f:Documentation/ABI/testing/sysfs-bus-pci-drivers-janz-cmodio +f:Documentation/ABI/testing/sysfs-bus-pci-drivers-xhci_hcd +f:Documentation/ABI/testing/sysfs-bus-peci +f:Documentation/ABI/testing/sysfs-bus-platform +f:Documentation/ABI/testing/sysfs-bus-platform-devices-ampere-smpro +f:Documentation/ABI/testing/sysfs-bus-platform-devices-occ-hwmon +f:Documentation/ABI/testing/sysfs-bus-platform-drivers-amd_x3d_vcache +f:Documentation/ABI/testing/sysfs-bus-platform-onboard-usb-dev +f:Documentation/ABI/testing/sysfs-bus-rapidio +f:Documentation/ABI/testing/sysfs-bus-rbd +f:Documentation/ABI/testing/sysfs-bus-rpmsg +f:Documentation/ABI/testing/sysfs-bus-siox +f:Documentation/ABI/testing/sysfs-bus-soundwire-master +f:Documentation/ABI/testing/sysfs-bus-soundwire-slave +f:Documentation/ABI/testing/sysfs-bus-spi-devices-spi-nor +f:Documentation/ABI/testing/sysfs-bus-surface_aggregator-tabletsw +f:Documentation/ABI/testing/sysfs-bus-thunderbolt +f:Documentation/ABI/testing/sysfs-bus-typec +f:Documentation/ABI/testing/sysfs-bus-usb +f:Documentation/ABI/testing/sysfs-bus-usb-devices-usbsevseg +f:Documentation/ABI/testing/sysfs-bus-usb-lvstest +f:Documentation/ABI/testing/sysfs-bus-vdpa +f:Documentation/ABI/testing/sysfs-bus-vfio-mdev +f:Documentation/ABI/testing/sysfs-bus-vmbus +f:Documentation/ABI/testing/sysfs-bus-wmi +f:Documentation/ABI/testing/sysfs-c2port +f:Documentation/ABI/testing/sysfs-cfq-target-latency +f:Documentation/ABI/testing/sysfs-class +f:Documentation/ABI/testing/sysfs-class-backlight +f:Documentation/ABI/testing/sysfs-class-backlight-driver-lm3533 +f:Documentation/ABI/testing/sysfs-class-backlight-lm3639 +f:Documentation/ABI/testing/sysfs-class-bdi +f:Documentation/ABI/testing/sysfs-class-bsr +f:Documentation/ABI/testing/sysfs-class-chromeos +f:Documentation/ABI/testing/sysfs-class-chromeos-driver-cros-ec-lightbar +f:Documentation/ABI/testing/sysfs-class-chromeos-driver-cros-ec-vbc +f:Documentation/ABI/testing/sysfs-class-devfreq +f:Documentation/ABI/testing/sysfs-class-devfreq-event +f:Documentation/ABI/testing/sysfs-class-devlink +f:Documentation/ABI/testing/sysfs-class-extcon +f:Documentation/ABI/testing/sysfs-class-fc +f:Documentation/ABI/testing/sysfs-class-fc_host +f:Documentation/ABI/testing/sysfs-class-fc_remote_ports +f:Documentation/ABI/testing/sysfs-class-firmware +f:Documentation/ABI/testing/sysfs-class-firmware-attributes +f:Documentation/ABI/testing/sysfs-class-fpga-bridge +f:Documentation/ABI/testing/sysfs-class-fpga-manager +f:Documentation/ABI/testing/sysfs-class-fpga-region +f:Documentation/ABI/testing/sysfs-class-gnss +f:Documentation/ABI/testing/sysfs-class-hwmon +f:Documentation/ABI/testing/sysfs-class-intel_pmt +f:Documentation/ABI/testing/sysfs-class-intel_pmt-features +f:Documentation/ABI/testing/sysfs-class-iommu +f:Documentation/ABI/testing/sysfs-class-iommu-amd-iommu +f:Documentation/ABI/testing/sysfs-class-iommu-intel-iommu +f:Documentation/ABI/testing/sysfs-class-lcd +f:Documentation/ABI/testing/sysfs-class-led +f:Documentation/ABI/testing/sysfs-class-led-driver-aw200xx +f:Documentation/ABI/testing/sysfs-class-led-driver-lm3533 +f:Documentation/ABI/testing/sysfs-class-led-driver-turris-omnia +f:Documentation/ABI/testing/sysfs-class-led-flash +f:Documentation/ABI/testing/sysfs-class-led-multicolor +f:Documentation/ABI/testing/sysfs-class-led-trigger-netdev +f:Documentation/ABI/testing/sysfs-class-led-trigger-oneshot +f:Documentation/ABI/testing/sysfs-class-led-trigger-pattern +f:Documentation/ABI/testing/sysfs-class-led-trigger-tty +f:Documentation/ABI/testing/sysfs-class-led-trigger-usbport +f:Documentation/ABI/testing/sysfs-class-leds-gt683r +f:Documentation/ABI/testing/sysfs-class-mei +f:Documentation/ABI/testing/sysfs-class-mic +f:Documentation/ABI/testing/sysfs-class-mtd +f:Documentation/ABI/testing/sysfs-class-mux +f:Documentation/ABI/testing/sysfs-class-net +f:Documentation/ABI/testing/sysfs-class-net-cdc_ncm +f:Documentation/ABI/testing/sysfs-class-net-dsa +f:Documentation/ABI/testing/sysfs-class-net-grcan +f:Documentation/ABI/testing/sysfs-class-net-janz-ican3 +f:Documentation/ABI/testing/sysfs-class-net-peak_usb +f:Documentation/ABI/testing/sysfs-class-net-phydev +f:Documentation/ABI/testing/sysfs-class-net-qmi +f:Documentation/ABI/testing/sysfs-class-net-queues +f:Documentation/ABI/testing/sysfs-class-net-statistics +f:Documentation/ABI/testing/sysfs-class-ocxl +f:Documentation/ABI/testing/sysfs-class-platform-profile +f:Documentation/ABI/testing/sysfs-class-power +f:Documentation/ABI/testing/sysfs-class-power-gaokun +f:Documentation/ABI/testing/sysfs-class-power-ltc4162l +f:Documentation/ABI/testing/sysfs-class-power-max1720x +f:Documentation/ABI/testing/sysfs-class-power-mp2629 +f:Documentation/ABI/testing/sysfs-class-power-rt9467 +f:Documentation/ABI/testing/sysfs-class-power-rt9471 +f:Documentation/ABI/testing/sysfs-class-power-surface +f:Documentation/ABI/testing/sysfs-class-power-twl4030 +f:Documentation/ABI/testing/sysfs-class-power-wilco +f:Documentation/ABI/testing/sysfs-class-powercap +f:Documentation/ABI/testing/sysfs-class-pwm +f:Documentation/ABI/testing/sysfs-class-rapidio +f:Documentation/ABI/testing/sysfs-class-rc +f:Documentation/ABI/testing/sysfs-class-rc-nuvoton +f:Documentation/ABI/testing/sysfs-class-regulator +f:Documentation/ABI/testing/sysfs-class-remoteproc +f:Documentation/ABI/testing/sysfs-class-rnbd-client +f:Documentation/ABI/testing/sysfs-class-rnbd-server +f:Documentation/ABI/testing/sysfs-class-rtc +f:Documentation/ABI/testing/sysfs-class-rtc-rtc0-device-rtc_calibration +f:Documentation/ABI/testing/sysfs-class-rtrs-client +f:Documentation/ABI/testing/sysfs-class-rtrs-server +f:Documentation/ABI/testing/sysfs-class-scsi_host +f:Documentation/ABI/testing/sysfs-class-scsi_tape +f:Documentation/ABI/testing/sysfs-class-spi-eeprom +f:Documentation/ABI/testing/sysfs-class-stm +f:Documentation/ABI/testing/sysfs-class-stm_source +f:Documentation/ABI/testing/sysfs-class-switchtec +f:Documentation/ABI/testing/sysfs-class-tee +f:Documentation/ABI/testing/sysfs-class-thermal +f:Documentation/ABI/testing/sysfs-class-typec +f:Documentation/ABI/testing/sysfs-class-usb_power_delivery +f:Documentation/ABI/testing/sysfs-class-usb_role +f:Documentation/ABI/testing/sysfs-class-vduse +f:Documentation/ABI/testing/sysfs-class-wakeup +f:Documentation/ABI/testing/sysfs-class-watchdog +f:Documentation/ABI/testing/sysfs-class-zram +f:Documentation/ABI/testing/sysfs-dev +f:Documentation/ABI/testing/sysfs-devices +f:Documentation/ABI/testing/sysfs-devices-consumer +f:Documentation/ABI/testing/sysfs-devices-coredump +f:Documentation/ABI/testing/sysfs-devices-edac +f:Documentation/ABI/testing/sysfs-devices-firmware_node +f:Documentation/ABI/testing/sysfs-devices-lpss_ltr +f:Documentation/ABI/testing/sysfs-devices-mapping +f:Documentation/ABI/testing/sysfs-devices-memory +f:Documentation/ABI/testing/sysfs-devices-mmc +f:Documentation/ABI/testing/sysfs-devices-online +f:Documentation/ABI/testing/sysfs-devices-physical_location +f:Documentation/ABI/testing/sysfs-devices-platform-ACPI-TAD +f:Documentation/ABI/testing/sysfs-devices-platform-_UDC_-gadget +f:Documentation/ABI/testing/sysfs-devices-platform-docg3 +f:Documentation/ABI/testing/sysfs-devices-platform-dock +f:Documentation/ABI/testing/sysfs-devices-platform-ipmi +f:Documentation/ABI/testing/sysfs-devices-platform-kunpeng_hccs +f:Documentation/ABI/testing/sysfs-devices-platform-sh_mobile_lcdc_fb +f:Documentation/ABI/testing/sysfs-devices-platform-soc-ipa +f:Documentation/ABI/testing/sysfs-devices-platform-stratix10-rsu +f:Documentation/ABI/testing/sysfs-devices-platform-trackpoint +f:Documentation/ABI/testing/sysfs-devices-power +f:Documentation/ABI/testing/sysfs-devices-power_resources_D0 +f:Documentation/ABI/testing/sysfs-devices-power_resources_D1 +f:Documentation/ABI/testing/sysfs-devices-power_resources_D2 +f:Documentation/ABI/testing/sysfs-devices-power_resources_D3hot +f:Documentation/ABI/testing/sysfs-devices-power_resources_wakeup +f:Documentation/ABI/testing/sysfs-devices-power_state +f:Documentation/ABI/testing/sysfs-devices-real_power_state +f:Documentation/ABI/testing/sysfs-devices-removable +f:Documentation/ABI/testing/sysfs-devices-resource_in_use +f:Documentation/ABI/testing/sysfs-devices-soc +f:Documentation/ABI/testing/sysfs-devices-software_node +f:Documentation/ABI/testing/sysfs-devices-state_synced +f:Documentation/ABI/testing/sysfs-devices-sun +f:Documentation/ABI/testing/sysfs-devices-supplier +f:Documentation/ABI/testing/sysfs-devices-system-cpu +f:Documentation/ABI/testing/sysfs-devices-system-ibm-rtl +f:Documentation/ABI/testing/sysfs-devices-system-xen_cpu +f:Documentation/ABI/testing/sysfs-devices-vfio-dev +f:Documentation/ABI/testing/sysfs-devices-virtual-misc-tdx_guest +f:Documentation/ABI/testing/sysfs-devices-waiting_for_supplier +f:Documentation/ABI/testing/sysfs-devices-xenbus +f:Documentation/ABI/testing/sysfs-driver-altera-cvp +f:Documentation/ABI/testing/sysfs-driver-amd-sfh +f:Documentation/ABI/testing/sysfs-driver-aspeed-uart-routing +f:Documentation/ABI/testing/sysfs-driver-bd9571mwv-regulator +f:Documentation/ABI/testing/sysfs-driver-ccp +f:Documentation/ABI/testing/sysfs-driver-chromeos-acpi +f:Documentation/ABI/testing/sysfs-driver-eud +f:Documentation/ABI/testing/sysfs-driver-fsi-master-gpio +f:Documentation/ABI/testing/sysfs-driver-ge-achc +f:Documentation/ABI/testing/sysfs-driver-genwqe +f:Documentation/ABI/testing/sysfs-driver-habanalabs +f:Documentation/ABI/testing/sysfs-driver-hid +f:Documentation/ABI/testing/sysfs-driver-hid-appletb-kbd +f:Documentation/ABI/testing/sysfs-driver-hid-corsair +f:Documentation/ABI/testing/sysfs-driver-hid-corsair-void +f:Documentation/ABI/testing/sysfs-driver-hid-lenovo +f:Documentation/ABI/testing/sysfs-driver-hid-logitech-hidpp +f:Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff +f:Documentation/ABI/testing/sysfs-driver-hid-multitouch +f:Documentation/ABI/testing/sysfs-driver-hid-ntrig +f:Documentation/ABI/testing/sysfs-driver-hid-picolcd +f:Documentation/ABI/testing/sysfs-driver-hid-prodikeys +f:Documentation/ABI/testing/sysfs-driver-hid-roccat-kone +f:Documentation/ABI/testing/sysfs-driver-hid-srws1 +f:Documentation/ABI/testing/sysfs-driver-hid-wiimote +f:Documentation/ABI/testing/sysfs-driver-input-axp-pek +f:Documentation/ABI/testing/sysfs-driver-input-cros-ec-keyb +f:Documentation/ABI/testing/sysfs-driver-input-exc3000 +f:Documentation/ABI/testing/sysfs-driver-intc_sar +f:Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon +f:Documentation/ABI/testing/sysfs-driver-intel-m10-bmc +f:Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update +f:Documentation/ABI/testing/sysfs-driver-intel-rapid-start +f:Documentation/ABI/testing/sysfs-driver-intel-xe-hwmon +f:Documentation/ABI/testing/sysfs-driver-intel_sdsi +f:Documentation/ABI/testing/sysfs-driver-jz4780-efuse +f:Documentation/ABI/testing/sysfs-driver-panfrost-profiling +f:Documentation/ABI/testing/sysfs-driver-panthor-profiling +f:Documentation/ABI/testing/sysfs-driver-pciback +f:Documentation/ABI/testing/sysfs-driver-ppi +f:Documentation/ABI/testing/sysfs-driver-qaic +f:Documentation/ABI/testing/sysfs-driver-qat +f:Documentation/ABI/testing/sysfs-driver-qat_ras +f:Documentation/ABI/testing/sysfs-driver-qat_rl +f:Documentation/ABI/testing/sysfs-driver-samsung-laptop +f:Documentation/ABI/testing/sysfs-driver-spi-intel +f:Documentation/ABI/testing/sysfs-driver-st +f:Documentation/ABI/testing/sysfs-driver-tegra-fuse +f:Documentation/ABI/testing/sysfs-driver-toshiba_acpi +f:Documentation/ABI/testing/sysfs-driver-toshiba_haps +f:Documentation/ABI/testing/sysfs-driver-typec-displayport +f:Documentation/ABI/testing/sysfs-driver-uacce +f:Documentation/ABI/testing/sysfs-driver-ucsi-ccg +f:Documentation/ABI/testing/sysfs-driver-ufs +f:Documentation/ABI/testing/sysfs-driver-w1_ds28e17 +f:Documentation/ABI/testing/sysfs-driver-w1_therm +f:Documentation/ABI/testing/sysfs-driver-wacom +f:Documentation/ABI/testing/sysfs-driver-xdata +f:Documentation/ABI/testing/sysfs-driver-xen-blkback +f:Documentation/ABI/testing/sysfs-driver-xen-blkfront +f:Documentation/ABI/testing/sysfs-driver-xilinx-tmr-manager +f:Documentation/ABI/testing/sysfs-driver-zynqmp-fpga +f:Documentation/ABI/testing/sysfs-edac-ecs +f:Documentation/ABI/testing/sysfs-edac-memory-repair +f:Documentation/ABI/testing/sysfs-edac-scrub +f:Documentation/ABI/testing/sysfs-firmware-acpi +f:Documentation/ABI/testing/sysfs-firmware-dmi-entries +f:Documentation/ABI/testing/sysfs-firmware-dmi-tables +f:Documentation/ABI/testing/sysfs-firmware-efi +f:Documentation/ABI/testing/sysfs-firmware-efi-esrt +f:Documentation/ABI/testing/sysfs-firmware-efi-runtime-map +f:Documentation/ABI/testing/sysfs-firmware-gsmi +f:Documentation/ABI/testing/sysfs-firmware-initrd +f:Documentation/ABI/testing/sysfs-firmware-lefi-boardinfo +f:Documentation/ABI/testing/sysfs-firmware-log +f:Documentation/ABI/testing/sysfs-firmware-memmap +f:Documentation/ABI/testing/sysfs-firmware-ofw +f:Documentation/ABI/testing/sysfs-firmware-opal-powercap +f:Documentation/ABI/testing/sysfs-firmware-opal-psr +f:Documentation/ABI/testing/sysfs-firmware-opal-sensor-groups +f:Documentation/ABI/testing/sysfs-firmware-papr-energy-scale-info +f:Documentation/ABI/testing/sysfs-firmware-qemu_fw_cfg +f:Documentation/ABI/testing/sysfs-firmware-sgi_uv +f:Documentation/ABI/testing/sysfs-firmware-turris-mox-rwtm +f:Documentation/ABI/testing/sysfs-fs-erofs +f:Documentation/ABI/testing/sysfs-fs-ext4 +f:Documentation/ABI/testing/sysfs-fs-f2fs +f:Documentation/ABI/testing/sysfs-fs-nilfs2 +f:Documentation/ABI/testing/sysfs-fs-ubifs +f:Documentation/ABI/testing/sysfs-fs-virtiofs +f:Documentation/ABI/testing/sysfs-fs-xfs +f:Documentation/ABI/testing/sysfs-hypervisor-xen +f:Documentation/ABI/testing/sysfs-ibft +f:Documentation/ABI/testing/sysfs-kernel-address_bits +f:Documentation/ABI/testing/sysfs-kernel-boot_params +f:Documentation/ABI/testing/sysfs-kernel-btf +f:Documentation/ABI/testing/sysfs-kernel-cpu_byteorder +f:Documentation/ABI/testing/sysfs-kernel-dmabuf-buffers +f:Documentation/ABI/testing/sysfs-kernel-fadump +f:Documentation/ABI/testing/sysfs-kernel-fscaps +f:Documentation/ABI/testing/sysfs-kernel-hardlockup_count +f:Documentation/ABI/testing/sysfs-kernel-iommu_groups +f:Documentation/ABI/testing/sysfs-kernel-irq +f:Documentation/ABI/testing/sysfs-kernel-livepatch +f:Documentation/ABI/testing/sysfs-kernel-mm +f:Documentation/ABI/testing/sysfs-kernel-mm-cma +f:Documentation/ABI/testing/sysfs-kernel-mm-damon +f:Documentation/ABI/testing/sysfs-kernel-mm-hugepages +f:Documentation/ABI/testing/sysfs-kernel-mm-ksm +f:Documentation/ABI/testing/sysfs-kernel-mm-memory-tiers +f:Documentation/ABI/testing/sysfs-kernel-mm-mempolicy +f:Documentation/ABI/testing/sysfs-kernel-mm-mempolicy-weighted-interleave +f:Documentation/ABI/testing/sysfs-kernel-mm-numa +f:Documentation/ABI/testing/sysfs-kernel-mm-swap +f:Documentation/ABI/testing/sysfs-kernel-mm-transparent-hugepage +f:Documentation/ABI/testing/sysfs-kernel-oops_count +f:Documentation/ABI/testing/sysfs-kernel-rcu_stall_count +f:Documentation/ABI/testing/sysfs-kernel-reboot +f:Documentation/ABI/testing/sysfs-kernel-slab +f:Documentation/ABI/testing/sysfs-kernel-softlockup_count +f:Documentation/ABI/testing/sysfs-kernel-vmcoreinfo +f:Documentation/ABI/testing/sysfs-kernel-warn_count +f:Documentation/ABI/testing/sysfs-mce +f:Documentation/ABI/testing/sysfs-memory-page-offline +f:Documentation/ABI/testing/sysfs-module +f:Documentation/ABI/testing/sysfs-nvmem-cells +f:Documentation/ABI/testing/sysfs-ocfs2 +f:Documentation/ABI/testing/sysfs-platform-alienware-wmi +f:Documentation/ABI/testing/sysfs-platform-asus-laptop +f:Documentation/ABI/testing/sysfs-platform-asus-wmi +f:Documentation/ABI/testing/sysfs-platform-at91 +f:Documentation/ABI/testing/sysfs-platform-brcmstb-gisb-arb +f:Documentation/ABI/testing/sysfs-platform-brcmstb-memc +f:Documentation/ABI/testing/sysfs-platform-chipidea-usb-otg +f:Documentation/ABI/testing/sysfs-platform-chipidea-usb2 +f:Documentation/ABI/testing/sysfs-platform-dell-laptop +f:Documentation/ABI/testing/sysfs-platform-dell-privacy-wmi +f:Documentation/ABI/testing/sysfs-platform-dell-smbios +f:Documentation/ABI/testing/sysfs-platform-dell-wmi-ddv +f:Documentation/ABI/testing/sysfs-platform-dfl-fme +f:Documentation/ABI/testing/sysfs-platform-dfl-port +f:Documentation/ABI/testing/sysfs-platform-dptf +f:Documentation/ABI/testing/sysfs-platform-eeepc-laptop +f:Documentation/ABI/testing/sysfs-platform-hidma +f:Documentation/ABI/testing/sysfs-platform-hidma-mgmt +f:Documentation/ABI/testing/sysfs-platform-i2c-demux-pinctrl +f:Documentation/ABI/testing/sysfs-platform-ideapad-laptop +f:Documentation/ABI/testing/sysfs-platform-intel-ifs +f:Documentation/ABI/testing/sysfs-platform-intel-pmc +f:Documentation/ABI/testing/sysfs-platform-intel-wmi-sbl-fw-update +f:Documentation/ABI/testing/sysfs-platform-intel-wmi-thunderbolt +f:Documentation/ABI/testing/sysfs-platform-kim +f:Documentation/ABI/testing/sysfs-platform-lg-laptop +f:Documentation/ABI/testing/sysfs-platform-mellanox-bootctl +f:Documentation/ABI/testing/sysfs-platform-mellanox-pmc +f:Documentation/ABI/testing/sysfs-platform-msi-laptop +f:Documentation/ABI/testing/sysfs-platform-oxp +f:Documentation/ABI/testing/sysfs-platform-phy-rcar-gen3-usb2 +f:Documentation/ABI/testing/sysfs-platform-power-on-reason +f:Documentation/ABI/testing/sysfs-platform-renesas_usb3 +f:Documentation/ABI/testing/sysfs-platform-silicom +f:Documentation/ABI/testing/sysfs-platform-sst-atom +f:Documentation/ABI/testing/sysfs-platform-tahvo-usb +f:Documentation/ABI/testing/sysfs-platform-ts5500 +f:Documentation/ABI/testing/sysfs-platform-twl4030-usb +f:Documentation/ABI/testing/sysfs-platform-usbip-vudc +f:Documentation/ABI/testing/sysfs-platform-wilco-ec +f:Documentation/ABI/testing/sysfs-platform_profile +f:Documentation/ABI/testing/sysfs-power +f:Documentation/ABI/testing/sysfs-pps +f:Documentation/ABI/testing/sysfs-pps-gen +f:Documentation/ABI/testing/sysfs-pps-gen-tio +f:Documentation/ABI/testing/sysfs-profiling +f:Documentation/ABI/testing/sysfs-ptp +f:Documentation/ABI/testing/sysfs-secvar +f:Documentation/ABI/testing/sysfs-timecard +f:Documentation/ABI/testing/sysfs-tty +f:Documentation/ABI/testing/sysfs-uevent +f:Documentation/ABI/testing/usb-charger-uevent +f:Documentation/ABI/testing/usb-uevent +f:Documentation/CodingStyle +f:Documentation/Kconfig +f:Documentation/Makefile +f:Documentation/PCI/acpi-info.rst +f:Documentation/PCI/boot-interrupts.rst +f:Documentation/PCI/controller/index.rst +f:Documentation/PCI/controller/rcar-pcie-firmware.rst +f:Documentation/PCI/endpoint/function/binding/pci-ntb.rst +f:Documentation/PCI/endpoint/function/binding/pci-test.rst +f:Documentation/PCI/endpoint/index.rst +f:Documentation/PCI/endpoint/pci-endpoint-cfs.rst +f:Documentation/PCI/endpoint/pci-endpoint.rst +f:Documentation/PCI/endpoint/pci-ntb-function.rst +f:Documentation/PCI/endpoint/pci-ntb-howto.rst +f:Documentation/PCI/endpoint/pci-nvme-function.rst +f:Documentation/PCI/endpoint/pci-test-function.rst +f:Documentation/PCI/endpoint/pci-test-howto.rst +f:Documentation/PCI/endpoint/pci-vntb-function.rst +f:Documentation/PCI/endpoint/pci-vntb-howto.rst +f:Documentation/PCI/index.rst +f:Documentation/PCI/msi-howto.rst +f:Documentation/PCI/pci-error-recovery.rst +f:Documentation/PCI/pci-iov-howto.rst +f:Documentation/PCI/pci.rst +f:Documentation/PCI/pcieaer-howto.rst +f:Documentation/PCI/pciebus-howto.rst +f:Documentation/PCI/sysfs-pci.rst +f:Documentation/PCI/tph.rst +f:Documentation/RCU/Design/Data-Structures/BigTreeClassicRCU.svg +f:Documentation/RCU/Design/Data-Structures/BigTreePreemptRCUBHdyntickCB.svg +f:Documentation/RCU/Design/Data-Structures/Data-Structures.rst +f:Documentation/RCU/Design/Data-Structures/HugeTreeClassicRCU.svg +f:Documentation/RCU/Design/Data-Structures/TreeLevel.svg +f:Documentation/RCU/Design/Data-Structures/TreeMapping.svg +f:Documentation/RCU/Design/Data-Structures/TreeMappingLevel.svg +f:Documentation/RCU/Design/Data-Structures/blkd_task.svg +f:Documentation/RCU/Design/Data-Structures/nxtlist.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/ExpRCUFlow.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/ExpSchedFlow.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.rst +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel0.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel1.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel2.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel3.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel4.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel5.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel6.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel7.svg +f:Documentation/RCU/Design/Expedited-Grace-Periods/Funnel8.svg +f:Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-callback-invocation.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-callback-registry.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-dyntick.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-cleanup.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-fqs.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-init-1.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-init-2.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-init-3.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-hotplug.svg +f:Documentation/RCU/Design/Memory-Ordering/TreeRCU-qs.svg +f:Documentation/RCU/Design/Memory-Ordering/rcu_node-lock.svg +f:Documentation/RCU/Design/Requirements/GPpartitionReaders1.svg +f:Documentation/RCU/Design/Requirements/ReadersPartitionGP1.svg +f:Documentation/RCU/Design/Requirements/Requirements.rst +f:Documentation/RCU/NMI-RCU.rst +f:Documentation/RCU/RTFP.txt +f:Documentation/RCU/UP.rst +f:Documentation/RCU/checklist.rst +f:Documentation/RCU/index.rst +f:Documentation/RCU/listRCU.rst +f:Documentation/RCU/lockdep-splat.rst +f:Documentation/RCU/lockdep.rst +f:Documentation/RCU/rcu.rst +f:Documentation/RCU/rcu_dereference.rst +f:Documentation/RCU/rcubarrier.rst +f:Documentation/RCU/rculist_nulls.rst +f:Documentation/RCU/rcuref.rst +f:Documentation/RCU/stallwarn.rst +f:Documentation/RCU/torture.rst +f:Documentation/RCU/whatisRCU.rst +f:Documentation/SubmittingPatches +f:Documentation/accel/amdxdna/amdnpu.rst +f:Documentation/accel/amdxdna/index.rst +f:Documentation/accel/index.rst +f:Documentation/accel/introduction.rst +f:Documentation/accel/qaic/aic080.rst +f:Documentation/accel/qaic/aic100.rst +f:Documentation/accel/qaic/index.rst +f:Documentation/accel/qaic/qaic.rst +f:Documentation/accounting/cgroupstats.rst +f:Documentation/accounting/delay-accounting.rst +f:Documentation/accounting/index.rst +f:Documentation/accounting/psi.rst +f:Documentation/accounting/taskstats-struct.rst +f:Documentation/accounting/taskstats.rst +f:Documentation/admin-guide/LSM/LoadPin.rst +f:Documentation/admin-guide/LSM/SELinux.rst +f:Documentation/admin-guide/LSM/SafeSetID.rst +f:Documentation/admin-guide/LSM/Smack.rst +f:Documentation/admin-guide/LSM/Yama.rst +f:Documentation/admin-guide/LSM/apparmor.rst +f:Documentation/admin-guide/LSM/index.rst +f:Documentation/admin-guide/LSM/ipe.rst +f:Documentation/admin-guide/LSM/landlock.rst +f:Documentation/admin-guide/LSM/tomoyo.rst +f:Documentation/admin-guide/RAS/address-translation.rst +f:Documentation/admin-guide/RAS/error-decoding.rst +f:Documentation/admin-guide/RAS/index.rst +f:Documentation/admin-guide/RAS/main.rst +f:Documentation/admin-guide/README.rst +f:Documentation/admin-guide/abi-obsolete-files.rst +f:Documentation/admin-guide/abi-obsolete.rst +f:Documentation/admin-guide/abi-removed-files.rst +f:Documentation/admin-guide/abi-removed.rst +f:Documentation/admin-guide/abi-stable-files.rst +f:Documentation/admin-guide/abi-stable.rst +f:Documentation/admin-guide/abi-testing-files.rst +f:Documentation/admin-guide/abi-testing.rst +f:Documentation/admin-guide/abi.rst +f:Documentation/admin-guide/acpi/cppc_sysfs.rst +f:Documentation/admin-guide/acpi/fan_performance_states.rst +f:Documentation/admin-guide/acpi/index.rst +f:Documentation/admin-guide/acpi/initrd_table_override.rst +f:Documentation/admin-guide/acpi/ssdt-overlays.rst +f:Documentation/admin-guide/aoe/aoe.rst +f:Documentation/admin-guide/aoe/autoload.sh +f:Documentation/admin-guide/aoe/examples.rst +f:Documentation/admin-guide/aoe/index.rst +f:Documentation/admin-guide/aoe/status.sh +f:Documentation/admin-guide/aoe/todo.rst +f:Documentation/admin-guide/aoe/udev-install.sh +f:Documentation/admin-guide/aoe/udev.txt +f:Documentation/admin-guide/auxdisplay/cfag12864b.rst +f:Documentation/admin-guide/auxdisplay/index.rst +f:Documentation/admin-guide/auxdisplay/ks0108.rst +f:Documentation/admin-guide/bcache.rst +f:Documentation/admin-guide/binderfs.rst +f:Documentation/admin-guide/binfmt-misc.rst +f:Documentation/admin-guide/blockdev/drbd/DRBD-8.3-data-packets.svg +f:Documentation/admin-guide/blockdev/drbd/DRBD-data-packets.svg +f:Documentation/admin-guide/blockdev/drbd/conn-states-8.dot +f:Documentation/admin-guide/blockdev/drbd/data-structure-v9.rst +f:Documentation/admin-guide/blockdev/drbd/disk-states-8.dot +f:Documentation/admin-guide/blockdev/drbd/drbd-connection-state-overview.dot +f:Documentation/admin-guide/blockdev/drbd/figures.rst +f:Documentation/admin-guide/blockdev/drbd/index.rst +f:Documentation/admin-guide/blockdev/drbd/peer-states-8.dot +f:Documentation/admin-guide/blockdev/floppy.rst +f:Documentation/admin-guide/blockdev/index.rst +f:Documentation/admin-guide/blockdev/nbd.rst +f:Documentation/admin-guide/blockdev/paride.rst +f:Documentation/admin-guide/blockdev/ramdisk.rst +f:Documentation/admin-guide/blockdev/zoned_loop.rst +f:Documentation/admin-guide/blockdev/zram.rst +f:Documentation/admin-guide/bootconfig.rst +f:Documentation/admin-guide/braille-console.rst +f:Documentation/admin-guide/btmrvl.rst +f:Documentation/admin-guide/bug-bisect.rst +f:Documentation/admin-guide/bug-hunting.rst +f:Documentation/admin-guide/cgroup-v1/blkio-controller.rst +f:Documentation/admin-guide/cgroup-v1/cgroups.rst +f:Documentation/admin-guide/cgroup-v1/cpuacct.rst +f:Documentation/admin-guide/cgroup-v1/cpusets.rst +f:Documentation/admin-guide/cgroup-v1/devices.rst +f:Documentation/admin-guide/cgroup-v1/freezer-subsystem.rst +f:Documentation/admin-guide/cgroup-v1/hugetlb.rst +f:Documentation/admin-guide/cgroup-v1/index.rst +f:Documentation/admin-guide/cgroup-v1/memcg_test.rst +f:Documentation/admin-guide/cgroup-v1/memory.rst +f:Documentation/admin-guide/cgroup-v1/misc.rst +f:Documentation/admin-guide/cgroup-v1/net_cls.rst +f:Documentation/admin-guide/cgroup-v1/net_prio.rst +f:Documentation/admin-guide/cgroup-v1/pids.rst +f:Documentation/admin-guide/cgroup-v1/rdma.rst +f:Documentation/admin-guide/cgroup-v2.rst +f:Documentation/admin-guide/cifs/authors.rst +f:Documentation/admin-guide/cifs/changes.rst +f:Documentation/admin-guide/cifs/index.rst +f:Documentation/admin-guide/cifs/introduction.rst +f:Documentation/admin-guide/cifs/todo.rst +f:Documentation/admin-guide/cifs/usage.rst +f:Documentation/admin-guide/cifs/winucase_convert.pl +f:Documentation/admin-guide/clearing-warn-once.rst +f:Documentation/admin-guide/cpu-load.rst +f:Documentation/admin-guide/cputopology.rst +f:Documentation/admin-guide/dell_rbu.rst +f:Documentation/admin-guide/device-mapper/cache-policies.rst +f:Documentation/admin-guide/device-mapper/cache.rst +f:Documentation/admin-guide/device-mapper/delay.rst +f:Documentation/admin-guide/device-mapper/dm-clone.rst +f:Documentation/admin-guide/device-mapper/dm-crypt.rst +f:Documentation/admin-guide/device-mapper/dm-dust.rst +f:Documentation/admin-guide/device-mapper/dm-ebs.rst +f:Documentation/admin-guide/device-mapper/dm-flakey.rst +f:Documentation/admin-guide/device-mapper/dm-ima.rst +f:Documentation/admin-guide/device-mapper/dm-init.rst +f:Documentation/admin-guide/device-mapper/dm-integrity.rst +f:Documentation/admin-guide/device-mapper/dm-io.rst +f:Documentation/admin-guide/device-mapper/dm-log.rst +f:Documentation/admin-guide/device-mapper/dm-queue-length.rst +f:Documentation/admin-guide/device-mapper/dm-raid.rst +f:Documentation/admin-guide/device-mapper/dm-service-time.rst +f:Documentation/admin-guide/device-mapper/dm-uevent.rst +f:Documentation/admin-guide/device-mapper/dm-zoned.rst +f:Documentation/admin-guide/device-mapper/era.rst +f:Documentation/admin-guide/device-mapper/index.rst +f:Documentation/admin-guide/device-mapper/kcopyd.rst +f:Documentation/admin-guide/device-mapper/linear.rst +f:Documentation/admin-guide/device-mapper/log-writes.rst +f:Documentation/admin-guide/device-mapper/persistent-data.rst +f:Documentation/admin-guide/device-mapper/snapshot.rst +f:Documentation/admin-guide/device-mapper/statistics.rst +f:Documentation/admin-guide/device-mapper/striped.rst +f:Documentation/admin-guide/device-mapper/switch.rst +f:Documentation/admin-guide/device-mapper/thin-provisioning.rst +f:Documentation/admin-guide/device-mapper/unstriped.rst +f:Documentation/admin-guide/device-mapper/vdo-design.rst +f:Documentation/admin-guide/device-mapper/vdo.rst +f:Documentation/admin-guide/device-mapper/verity.rst +f:Documentation/admin-guide/device-mapper/writecache.rst +f:Documentation/admin-guide/device-mapper/zero.rst +f:Documentation/admin-guide/devices.rst +f:Documentation/admin-guide/devices.txt +f:Documentation/admin-guide/dynamic-debug-howto.rst +f:Documentation/admin-guide/edid.rst +f:Documentation/admin-guide/efi-stub.rst +f:Documentation/admin-guide/ext4.rst +f:Documentation/admin-guide/features.rst +f:Documentation/admin-guide/filesystem-monitoring.rst +f:Documentation/admin-guide/gpio/gpio-aggregator.rst +f:Documentation/admin-guide/gpio/gpio-mockup.rst +f:Documentation/admin-guide/gpio/gpio-sim.rst +f:Documentation/admin-guide/gpio/gpio-virtuser.rst +f:Documentation/admin-guide/gpio/index.rst +f:Documentation/admin-guide/gpio/obsolete.rst +f:Documentation/admin-guide/hw-vuln/attack_vector_controls.rst +f:Documentation/admin-guide/hw-vuln/core-scheduling.rst +f:Documentation/admin-guide/hw-vuln/cross-thread-rsb.rst +f:Documentation/admin-guide/hw-vuln/gather_data_sampling.rst +f:Documentation/admin-guide/hw-vuln/index.rst +f:Documentation/admin-guide/hw-vuln/indirect-target-selection.rst +f:Documentation/admin-guide/hw-vuln/l1d_flush.rst +f:Documentation/admin-guide/hw-vuln/l1tf.rst +f:Documentation/admin-guide/hw-vuln/mds.rst +f:Documentation/admin-guide/hw-vuln/multihit.rst +f:Documentation/admin-guide/hw-vuln/old_microcode.rst +f:Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst +f:Documentation/admin-guide/hw-vuln/reg-file-data-sampling.rst +f:Documentation/admin-guide/hw-vuln/rsb.rst +f:Documentation/admin-guide/hw-vuln/special-register-buffer-data-sampling.rst +f:Documentation/admin-guide/hw-vuln/spectre.rst +f:Documentation/admin-guide/hw-vuln/srso.rst +f:Documentation/admin-guide/hw-vuln/tsx_async_abort.rst +f:Documentation/admin-guide/hw_random.rst +f:Documentation/admin-guide/index.rst +f:Documentation/admin-guide/init.rst +f:Documentation/admin-guide/initrd.rst +f:Documentation/admin-guide/iostats.rst +f:Documentation/admin-guide/java.rst +f:Documentation/admin-guide/jfs.rst +f:Documentation/admin-guide/kdump/gdbmacros.txt +f:Documentation/admin-guide/kdump/index.rst +f:Documentation/admin-guide/kdump/kdump.rst +f:Documentation/admin-guide/kdump/vmcoreinfo.rst +f:Documentation/admin-guide/kernel-parameters.rst +f:Documentation/admin-guide/kernel-parameters.txt +f:Documentation/admin-guide/kernel-per-CPU-kthreads.rst +f:Documentation/admin-guide/laptops/alienware-wmi.rst +f:Documentation/admin-guide/laptops/asus-laptop.rst +f:Documentation/admin-guide/laptops/disk-shock-protection.rst +f:Documentation/admin-guide/laptops/index.rst +f:Documentation/admin-guide/laptops/laptop-mode.rst +f:Documentation/admin-guide/laptops/lg-laptop.rst +f:Documentation/admin-guide/laptops/samsung-galaxybook.rst +f:Documentation/admin-guide/laptops/sony-laptop.rst +f:Documentation/admin-guide/laptops/sonypi.rst +f:Documentation/admin-guide/laptops/thinkpad-acpi.rst +f:Documentation/admin-guide/laptops/toshiba_haps.rst +f:Documentation/admin-guide/lcd-panel-cgram.rst +f:Documentation/admin-guide/ldm.rst +f:Documentation/admin-guide/lockup-watchdogs.rst +f:Documentation/admin-guide/md.rst +f:Documentation/admin-guide/media/au0828-cardlist.rst +f:Documentation/admin-guide/media/avermedia.rst +f:Documentation/admin-guide/media/bt8xx.rst +f:Documentation/admin-guide/media/bttv-cardlist.rst +f:Documentation/admin-guide/media/bttv.rst +f:Documentation/admin-guide/media/building.rst +f:Documentation/admin-guide/media/c3-isp.dot +f:Documentation/admin-guide/media/c3-isp.rst +f:Documentation/admin-guide/media/cafe_ccic.rst +f:Documentation/admin-guide/media/cardlist.rst +f:Documentation/admin-guide/media/cec.rst +f:Documentation/admin-guide/media/ci.rst +f:Documentation/admin-guide/media/cx18-cardlist.rst +f:Documentation/admin-guide/media/cx231xx-cardlist.rst +f:Documentation/admin-guide/media/cx23885-cardlist.rst +f:Documentation/admin-guide/media/cx88-cardlist.rst +f:Documentation/admin-guide/media/cx88.rst +f:Documentation/admin-guide/media/dvb-drivers.rst +f:Documentation/admin-guide/media/dvb-usb-a800-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-af9005-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-af9015-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-af9035-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-anysee-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-au6610-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-az6007-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-az6027-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-ce6230-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-cinergyT2-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-cxusb-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-dib0700-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-dibusb-mb-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-dibusb-mc-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-digitv-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-dtt200u-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-dtv5100-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-dvbsky-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-dw2102-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-ec168-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-gl861-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-gp8psk-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-lmedm04-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-m920x-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-mxl111sf-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-nova-t-usb2-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-opera1-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-pctv452e-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-rtl28xxu-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-technisat-usb2-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-ttusb2-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-umt-010-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-vp702x-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-vp7045-cardlist.rst +f:Documentation/admin-guide/media/dvb-usb-zd1301-cardlist.rst +f:Documentation/admin-guide/media/dvb.rst +f:Documentation/admin-guide/media/dvb_intro.rst +f:Documentation/admin-guide/media/dvb_references.rst +f:Documentation/admin-guide/media/em28xx-cardlist.rst +f:Documentation/admin-guide/media/faq.rst +f:Documentation/admin-guide/media/fimc.rst +f:Documentation/admin-guide/media/frontend-cardlist.rst +f:Documentation/admin-guide/media/gspca-cardlist.rst +f:Documentation/admin-guide/media/i2c-cardlist.rst +f:Documentation/admin-guide/media/imx.rst +f:Documentation/admin-guide/media/imx6q-sabreauto.dot +f:Documentation/admin-guide/media/imx6q-sabresd.dot +f:Documentation/admin-guide/media/imx7.rst +f:Documentation/admin-guide/media/index.rst +f:Documentation/admin-guide/media/intro.rst +f:Documentation/admin-guide/media/ipu3.rst +f:Documentation/admin-guide/media/ipu3_rcb.svg +f:Documentation/admin-guide/media/ipu6-isys.rst +f:Documentation/admin-guide/media/ipu6_isys_graph.svg +f:Documentation/admin-guide/media/ivtv-cardlist.rst +f:Documentation/admin-guide/media/ivtv.rst +f:Documentation/admin-guide/media/lmedm04.rst +f:Documentation/admin-guide/media/mgb4.rst +f:Documentation/admin-guide/media/misc-cardlist.rst +f:Documentation/admin-guide/media/omap3isp.rst +f:Documentation/admin-guide/media/opera-firmware.rst +f:Documentation/admin-guide/media/other-usb-cardlist.rst +f:Documentation/admin-guide/media/pci-cardlist.rst +f:Documentation/admin-guide/media/philips.rst +f:Documentation/admin-guide/media/platform-cardlist.rst +f:Documentation/admin-guide/media/qcom_camss.rst +f:Documentation/admin-guide/media/qcom_camss_8x96_graph.dot +f:Documentation/admin-guide/media/qcom_camss_graph.dot +f:Documentation/admin-guide/media/radio-cardlist.rst +f:Documentation/admin-guide/media/raspberrypi-pisp-be.dot +f:Documentation/admin-guide/media/raspberrypi-pisp-be.rst +f:Documentation/admin-guide/media/raspberrypi-rp1-cfe.dot +f:Documentation/admin-guide/media/raspberrypi-rp1-cfe.rst +f:Documentation/admin-guide/media/rcar-fdp1.rst +f:Documentation/admin-guide/media/remote-controller.rst +f:Documentation/admin-guide/media/rkisp1.dot +f:Documentation/admin-guide/media/rkisp1.rst +f:Documentation/admin-guide/media/saa7134-cardlist.rst +f:Documentation/admin-guide/media/saa7134.rst +f:Documentation/admin-guide/media/saa7164-cardlist.rst +f:Documentation/admin-guide/media/si470x.rst +f:Documentation/admin-guide/media/si4713.rst +f:Documentation/admin-guide/media/si476x.rst +f:Documentation/admin-guide/media/siano-cardlist.rst +f:Documentation/admin-guide/media/starfive_camss.rst +f:Documentation/admin-guide/media/starfive_camss_graph.dot +f:Documentation/admin-guide/media/technisat.rst +f:Documentation/admin-guide/media/ttusb-dec.rst +f:Documentation/admin-guide/media/tuner-cardlist.rst +f:Documentation/admin-guide/media/usb-cardlist.rst +f:Documentation/admin-guide/media/v4l-drivers.rst +f:Documentation/admin-guide/media/vimc.dot +f:Documentation/admin-guide/media/vimc.rst +f:Documentation/admin-guide/media/visl.rst +f:Documentation/admin-guide/media/vivid.rst +f:Documentation/admin-guide/media/zoran-cardlist.rst +f:Documentation/admin-guide/mm/cma_debugfs.rst +f:Documentation/admin-guide/mm/concepts.rst +f:Documentation/admin-guide/mm/damon/index.rst +f:Documentation/admin-guide/mm/damon/lru_sort.rst +f:Documentation/admin-guide/mm/damon/reclaim.rst +f:Documentation/admin-guide/mm/damon/start.rst +f:Documentation/admin-guide/mm/damon/stat.rst +f:Documentation/admin-guide/mm/damon/usage.rst +f:Documentation/admin-guide/mm/hugetlbpage.rst +f:Documentation/admin-guide/mm/idle_page_tracking.rst +f:Documentation/admin-guide/mm/index.rst +f:Documentation/admin-guide/mm/kho.rst +f:Documentation/admin-guide/mm/ksm.rst +f:Documentation/admin-guide/mm/memory-hotplug.rst +f:Documentation/admin-guide/mm/multigen_lru.rst +f:Documentation/admin-guide/mm/nommu-mmap.rst +f:Documentation/admin-guide/mm/numa_memory_policy.rst +f:Documentation/admin-guide/mm/numaperf.rst +f:Documentation/admin-guide/mm/pagemap.rst +f:Documentation/admin-guide/mm/shrinker_debugfs.rst +f:Documentation/admin-guide/mm/slab.rst +f:Documentation/admin-guide/mm/soft-dirty.rst +f:Documentation/admin-guide/mm/swap_numa.rst +f:Documentation/admin-guide/mm/transhuge.rst +f:Documentation/admin-guide/mm/userfaultfd.rst +f:Documentation/admin-guide/mm/zswap.rst +f:Documentation/admin-guide/module-signing.rst +f:Documentation/admin-guide/mono.rst +f:Documentation/admin-guide/namespaces/compatibility-list.rst +f:Documentation/admin-guide/namespaces/index.rst +f:Documentation/admin-guide/namespaces/resource-control.rst +f:Documentation/admin-guide/nfs/index.rst +f:Documentation/admin-guide/nfs/nfs-client.rst +f:Documentation/admin-guide/nfs/nfs-idmapper.rst +f:Documentation/admin-guide/nfs/nfs-rdma.rst +f:Documentation/admin-guide/nfs/nfsd-admin-interfaces.rst +f:Documentation/admin-guide/nfs/nfsroot.rst +f:Documentation/admin-guide/nfs/pnfs-block-server.rst +f:Documentation/admin-guide/nfs/pnfs-scsi-server.rst +f:Documentation/admin-guide/numastat.rst +f:Documentation/admin-guide/nvme-multipath.rst +f:Documentation/admin-guide/parport.rst +f:Documentation/admin-guide/perf-security.rst +f:Documentation/admin-guide/perf/alibaba_pmu.rst +f:Documentation/admin-guide/perf/ampere_cspmu.rst +f:Documentation/admin-guide/perf/arm-ccn.rst +f:Documentation/admin-guide/perf/arm-cmn.rst +f:Documentation/admin-guide/perf/arm-ni.rst +f:Documentation/admin-guide/perf/arm_dsu_pmu.rst +f:Documentation/admin-guide/perf/cxl.rst +f:Documentation/admin-guide/perf/dwc_pcie_pmu.rst +f:Documentation/admin-guide/perf/hisi-pcie-pmu.rst +f:Documentation/admin-guide/perf/hisi-pmu.rst +f:Documentation/admin-guide/perf/hns3-pmu.rst +f:Documentation/admin-guide/perf/imx-ddr.rst +f:Documentation/admin-guide/perf/index.rst +f:Documentation/admin-guide/perf/meson-ddr-pmu.rst +f:Documentation/admin-guide/perf/mrvl-odyssey-ddr-pmu.rst +f:Documentation/admin-guide/perf/mrvl-odyssey-tad-pmu.rst +f:Documentation/admin-guide/perf/mrvl-pem-pmu.rst +f:Documentation/admin-guide/perf/nvidia-pmu.rst +f:Documentation/admin-guide/perf/qcom_l2_pmu.rst +f:Documentation/admin-guide/perf/qcom_l3_pmu.rst +f:Documentation/admin-guide/perf/starfive_starlink_pmu.rst +f:Documentation/admin-guide/perf/thunderx2-pmu.rst +f:Documentation/admin-guide/perf/xgene-pmu.rst +f:Documentation/admin-guide/pm/amd-pstate.rst +f:Documentation/admin-guide/pm/cpufreq.rst +f:Documentation/admin-guide/pm/cpufreq_drivers.rst +f:Documentation/admin-guide/pm/cpuidle.rst +f:Documentation/admin-guide/pm/index.rst +f:Documentation/admin-guide/pm/intel-speed-select.rst +f:Documentation/admin-guide/pm/intel_epb.rst +f:Documentation/admin-guide/pm/intel_idle.rst +f:Documentation/admin-guide/pm/intel_pstate.rst +f:Documentation/admin-guide/pm/intel_uncore_frequency_scaling.rst +f:Documentation/admin-guide/pm/sleep-states.rst +f:Documentation/admin-guide/pm/strategies.rst +f:Documentation/admin-guide/pm/suspend-flows.rst +f:Documentation/admin-guide/pm/system-wide.rst +f:Documentation/admin-guide/pm/working-state.rst +f:Documentation/admin-guide/pnp.rst +f:Documentation/admin-guide/pstore-blk.rst +f:Documentation/admin-guide/quickly-build-trimmed-linux.rst +f:Documentation/admin-guide/ramoops.rst +f:Documentation/admin-guide/rapidio.rst +f:Documentation/admin-guide/reporting-issues.rst +f:Documentation/admin-guide/reporting-regressions.rst +f:Documentation/admin-guide/rtc.rst +f:Documentation/admin-guide/serial-console.rst +f:Documentation/admin-guide/spkguide.txt +f:Documentation/admin-guide/svga.rst +f:Documentation/admin-guide/syscall-user-dispatch.rst +f:Documentation/admin-guide/sysctl/abi.rst +f:Documentation/admin-guide/sysctl/fs.rst +f:Documentation/admin-guide/sysctl/index.rst +f:Documentation/admin-guide/sysctl/kernel.rst +f:Documentation/admin-guide/sysctl/net.rst +f:Documentation/admin-guide/sysctl/sunrpc.rst +f:Documentation/admin-guide/sysctl/user.rst +f:Documentation/admin-guide/sysctl/vm.rst +f:Documentation/admin-guide/sysfs-rules.rst +f:Documentation/admin-guide/sysrq.rst +f:Documentation/admin-guide/tainted-kernels.rst +f:Documentation/admin-guide/thermal/index.rst +f:Documentation/admin-guide/thermal/intel_powerclamp.rst +f:Documentation/admin-guide/thunderbolt.rst +f:Documentation/admin-guide/ufs.rst +f:Documentation/admin-guide/unicode.rst +f:Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst +f:Documentation/admin-guide/vga-softcursor.rst +f:Documentation/admin-guide/video-output.rst +f:Documentation/admin-guide/workload-tracing.rst +f:Documentation/admin-guide/xfs.rst +f:Documentation/arch/arc/arc.rst +f:Documentation/arch/arc/features.rst +f:Documentation/arch/arc/index.rst +f:Documentation/arch/arm/arm.rst +f:Documentation/arch/arm/booting.rst +f:Documentation/arch/arm/cluster-pm-race-avoidance.rst +f:Documentation/arch/arm/features.rst +f:Documentation/arch/arm/firmware.rst +f:Documentation/arch/arm/google/chromebook-boot-flow.rst +f:Documentation/arch/arm/index.rst +f:Documentation/arch/arm/interrupts.rst +f:Documentation/arch/arm/ixp4xx.rst +f:Documentation/arch/arm/kernel_mode_neon.rst +f:Documentation/arch/arm/kernel_user_helpers.rst +f:Documentation/arch/arm/keystone/knav-qmss.rst +f:Documentation/arch/arm/keystone/overview.rst +f:Documentation/arch/arm/marvell.rst +f:Documentation/arch/arm/mem_alignment.rst +f:Documentation/arch/arm/memory.rst +f:Documentation/arch/arm/microchip.rst +f:Documentation/arch/arm/netwinder.rst +f:Documentation/arch/arm/nwfpe/index.rst +f:Documentation/arch/arm/nwfpe/netwinder-fpe.rst +f:Documentation/arch/arm/nwfpe/notes.rst +f:Documentation/arch/arm/nwfpe/nwfpe.rst +f:Documentation/arch/arm/nwfpe/todo.rst +f:Documentation/arch/arm/omap/dss.rst +f:Documentation/arch/arm/omap/index.rst +f:Documentation/arch/arm/omap/omap.rst +f:Documentation/arch/arm/omap/omap_pm.rst +f:Documentation/arch/arm/porting.rst +f:Documentation/arch/arm/pxa/mfp.rst +f:Documentation/arch/arm/sa1100/assabet.rst +f:Documentation/arch/arm/sa1100/cerf.rst +f:Documentation/arch/arm/sa1100/index.rst +f:Documentation/arch/arm/sa1100/lart.rst +f:Documentation/arch/arm/sa1100/serial_uart.rst +f:Documentation/arch/arm/samsung/bootloader-interface.rst +f:Documentation/arch/arm/samsung/clksrc-change-registers.awk +f:Documentation/arch/arm/samsung/gpio.rst +f:Documentation/arch/arm/samsung/index.rst +f:Documentation/arch/arm/samsung/overview.rst +f:Documentation/arch/arm/setup.rst +f:Documentation/arch/arm/spear/overview.rst +f:Documentation/arch/arm/sti/overview.rst +f:Documentation/arch/arm/sti/stih407-overview.rst +f:Documentation/arch/arm/sti/stih418-overview.rst +f:Documentation/arch/arm/stm32/overview.rst +f:Documentation/arch/arm/stm32/stm32-dma-mdma-chaining.rst +f:Documentation/arch/arm/stm32/stm32f429-overview.rst +f:Documentation/arch/arm/stm32/stm32f746-overview.rst +f:Documentation/arch/arm/stm32/stm32f769-overview.rst +f:Documentation/arch/arm/stm32/stm32h743-overview.rst +f:Documentation/arch/arm/stm32/stm32h750-overview.rst +f:Documentation/arch/arm/stm32/stm32mp13-overview.rst +f:Documentation/arch/arm/stm32/stm32mp151-overview.rst +f:Documentation/arch/arm/stm32/stm32mp157-overview.rst +f:Documentation/arch/arm/sunxi.rst +f:Documentation/arch/arm/sunxi/clocks.rst +f:Documentation/arch/arm/swp_emulation.rst +f:Documentation/arch/arm/tcm.rst +f:Documentation/arch/arm/uefi.rst +f:Documentation/arch/arm/vfp/release-notes.rst +f:Documentation/arch/arm/vlocks.rst +f:Documentation/arch/arm64/acpi_object_usage.rst +f:Documentation/arch/arm64/amu.rst +f:Documentation/arch/arm64/arm-acpi.rst +f:Documentation/arch/arm64/arm-cca.rst +f:Documentation/arch/arm64/asymmetric-32bit.rst +f:Documentation/arch/arm64/booting.rst +f:Documentation/arch/arm64/cpu-feature-registers.rst +f:Documentation/arch/arm64/cpu-hotplug.rst +f:Documentation/arch/arm64/elf_hwcaps.rst +f:Documentation/arch/arm64/features.rst +f:Documentation/arch/arm64/gcs.rst +f:Documentation/arch/arm64/hugetlbpage.rst +f:Documentation/arch/arm64/index.rst +f:Documentation/arch/arm64/kasan-offsets.sh +f:Documentation/arch/arm64/kdump.rst +f:Documentation/arch/arm64/legacy_instructions.rst +f:Documentation/arch/arm64/memory-tagging-extension.rst +f:Documentation/arch/arm64/memory.rst +f:Documentation/arch/arm64/mops.rst +f:Documentation/arch/arm64/perf.rst +f:Documentation/arch/arm64/pointer-authentication.rst +f:Documentation/arch/arm64/ptdump.rst +f:Documentation/arch/arm64/silicon-errata.rst +f:Documentation/arch/arm64/sme.rst +f:Documentation/arch/arm64/sve.rst +f:Documentation/arch/arm64/tagged-address-abi.rst +f:Documentation/arch/arm64/tagged-pointers.rst +f:Documentation/arch/index.rst +f:Documentation/arch/loongarch/booting.rst +f:Documentation/arch/loongarch/features.rst +f:Documentation/arch/loongarch/index.rst +f:Documentation/arch/loongarch/introduction.rst +f:Documentation/arch/loongarch/irq-chip-model.rst +f:Documentation/arch/m68k/buddha-driver.rst +f:Documentation/arch/m68k/features.rst +f:Documentation/arch/m68k/index.rst +f:Documentation/arch/m68k/kernel-options.rst +f:Documentation/arch/mips/booting.rst +f:Documentation/arch/mips/features.rst +f:Documentation/arch/mips/index.rst +f:Documentation/arch/mips/ingenic-tcu.rst +f:Documentation/arch/nios2/features.rst +f:Documentation/arch/nios2/index.rst +f:Documentation/arch/nios2/nios2.rst +f:Documentation/arch/openrisc/features.rst +f:Documentation/arch/openrisc/index.rst +f:Documentation/arch/openrisc/openrisc_port.rst +f:Documentation/arch/openrisc/todo.rst +f:Documentation/arch/parisc/debugging.rst +f:Documentation/arch/parisc/features.rst +f:Documentation/arch/parisc/index.rst +f:Documentation/arch/parisc/registers.rst +f:Documentation/arch/powerpc/associativity.rst +f:Documentation/arch/powerpc/booting.rst +f:Documentation/arch/powerpc/bootwrapper.rst +f:Documentation/arch/powerpc/cpu_families.rst +f:Documentation/arch/powerpc/cpu_features.rst +f:Documentation/arch/powerpc/dawr-power9.rst +f:Documentation/arch/powerpc/dexcr.rst +f:Documentation/arch/powerpc/dscr.rst +f:Documentation/arch/powerpc/eeh-pci-error-recovery.rst +f:Documentation/arch/powerpc/elf_hwcaps.rst +f:Documentation/arch/powerpc/elfnote.rst +f:Documentation/arch/powerpc/features.rst +f:Documentation/arch/powerpc/firmware-assisted-dump.rst +f:Documentation/arch/powerpc/htm.rst +f:Documentation/arch/powerpc/hvcs.rst +f:Documentation/arch/powerpc/imc.rst +f:Documentation/arch/powerpc/index.rst +f:Documentation/arch/powerpc/isa-versions.rst +f:Documentation/arch/powerpc/kasan.txt +f:Documentation/arch/powerpc/kaslr-booke32.rst +f:Documentation/arch/powerpc/kvm-nested.rst +f:Documentation/arch/powerpc/mpc52xx.rst +f:Documentation/arch/powerpc/papr_hcalls.rst +f:Documentation/arch/powerpc/pci_iov_resource_on_powernv.rst +f:Documentation/arch/powerpc/pmu-ebb.rst +f:Documentation/arch/powerpc/ptrace.rst +f:Documentation/arch/powerpc/qe_firmware.rst +f:Documentation/arch/powerpc/syscall64-abi.rst +f:Documentation/arch/powerpc/transactional_memory.rst +f:Documentation/arch/powerpc/ultravisor.rst +f:Documentation/arch/powerpc/vas-api.rst +f:Documentation/arch/powerpc/vcpudispatch_stats.rst +f:Documentation/arch/powerpc/vmemmap_dedup.rst +f:Documentation/arch/riscv/acpi.rst +f:Documentation/arch/riscv/boot-image-header.rst +f:Documentation/arch/riscv/boot.rst +f:Documentation/arch/riscv/cmodx.rst +f:Documentation/arch/riscv/features.rst +f:Documentation/arch/riscv/hwprobe.rst +f:Documentation/arch/riscv/index.rst +f:Documentation/arch/riscv/patch-acceptance.rst +f:Documentation/arch/riscv/uabi.rst +f:Documentation/arch/riscv/vector.rst +f:Documentation/arch/riscv/vm-layout.rst +f:Documentation/arch/s390/3270.ChangeLog +f:Documentation/arch/s390/3270.rst +f:Documentation/arch/s390/cds.rst +f:Documentation/arch/s390/common_io.rst +f:Documentation/arch/s390/config3270.sh +f:Documentation/arch/s390/driver-model.rst +f:Documentation/arch/s390/features.rst +f:Documentation/arch/s390/index.rst +f:Documentation/arch/s390/mm.rst +f:Documentation/arch/s390/monreader.rst +f:Documentation/arch/s390/pci.rst +f:Documentation/arch/s390/qeth.rst +f:Documentation/arch/s390/s390dbf.rst +f:Documentation/arch/s390/text_files.rst +f:Documentation/arch/s390/vfio-ap-locking.rst +f:Documentation/arch/s390/vfio-ap.rst +f:Documentation/arch/s390/vfio-ccw.rst +f:Documentation/arch/s390/zfcpdump.rst +f:Documentation/arch/sh/booting.rst +f:Documentation/arch/sh/features.rst +f:Documentation/arch/sh/index.rst +f:Documentation/arch/sh/new-machine.rst +f:Documentation/arch/sh/register-banks.rst +f:Documentation/arch/sparc/adi.rst +f:Documentation/arch/sparc/console.rst +f:Documentation/arch/sparc/features.rst +f:Documentation/arch/sparc/index.rst +f:Documentation/arch/sparc/oradax/dax-hv-api.txt +f:Documentation/arch/sparc/oradax/oracle-dax.rst +f:Documentation/arch/x86/amd-debugging.rst +f:Documentation/arch/x86/amd-hfi.rst +f:Documentation/arch/x86/amd-memory-encryption.rst +f:Documentation/arch/x86/amd_hsmp.rst +f:Documentation/arch/x86/boot.rst +f:Documentation/arch/x86/booting-dt.rst +f:Documentation/arch/x86/buslock.rst +f:Documentation/arch/x86/cpuinfo.rst +f:Documentation/arch/x86/earlyprintk.rst +f:Documentation/arch/x86/elf_auxvec.rst +f:Documentation/arch/x86/entry_64.rst +f:Documentation/arch/x86/exception-tables.rst +f:Documentation/arch/x86/features.rst +f:Documentation/arch/x86/i386/IO-APIC.rst +f:Documentation/arch/x86/i386/index.rst +f:Documentation/arch/x86/ifs.rst +f:Documentation/arch/x86/index.rst +f:Documentation/arch/x86/intel-hfi.rst +f:Documentation/arch/x86/intel_txt.rst +f:Documentation/arch/x86/iommu.rst +f:Documentation/arch/x86/kernel-stacks.rst +f:Documentation/arch/x86/mds.rst +f:Documentation/arch/x86/microcode.rst +f:Documentation/arch/x86/mtrr.rst +f:Documentation/arch/x86/orc-unwinder.rst +f:Documentation/arch/x86/pat.rst +f:Documentation/arch/x86/pti.rst +f:Documentation/arch/x86/resume.svg +f:Documentation/arch/x86/sgx.rst +f:Documentation/arch/x86/shstk.rst +f:Documentation/arch/x86/suspend.svg +f:Documentation/arch/x86/sva.rst +f:Documentation/arch/x86/tdx.rst +f:Documentation/arch/x86/tlb.rst +f:Documentation/arch/x86/topology.rst +f:Documentation/arch/x86/tsx_async_abort.rst +f:Documentation/arch/x86/usb-legacy-support.rst +f:Documentation/arch/x86/x86_64/5level-paging.rst +f:Documentation/arch/x86/x86_64/cpu-hotplug-spec.rst +f:Documentation/arch/x86/x86_64/fake-numa-for-cpusets.rst +f:Documentation/arch/x86/x86_64/fred.rst +f:Documentation/arch/x86/x86_64/fsgs.rst +f:Documentation/arch/x86/x86_64/index.rst +f:Documentation/arch/x86/x86_64/machinecheck.rst +f:Documentation/arch/x86/x86_64/mm.rst +f:Documentation/arch/x86/x86_64/uefi.rst +f:Documentation/arch/x86/xstate.rst +f:Documentation/arch/x86/zero-page.rst +f:Documentation/arch/xtensa/atomctl.rst +f:Documentation/arch/xtensa/booting.rst +f:Documentation/arch/xtensa/features.rst +f:Documentation/arch/xtensa/index.rst +f:Documentation/arch/xtensa/mmu.rst +f:Documentation/atomic_bitops.txt +f:Documentation/atomic_t.txt +f:Documentation/block/bfq-iosched.rst +f:Documentation/block/biovecs.rst +f:Documentation/block/blk-mq.rst +f:Documentation/block/cmdline-partition.rst +f:Documentation/block/data-integrity.rst +f:Documentation/block/deadline-iosched.rst +f:Documentation/block/index.rst +f:Documentation/block/inline-encryption.rst +f:Documentation/block/ioprio.rst +f:Documentation/block/kyber-iosched.rst +f:Documentation/block/null_blk.rst +f:Documentation/block/pr.rst +f:Documentation/block/stat.rst +f:Documentation/block/switching-sched.rst +f:Documentation/block/ublk.rst +f:Documentation/block/writeback_cache_control.rst +f:Documentation/bpf/bpf_design_QA.rst +f:Documentation/bpf/bpf_devel_QA.rst +f:Documentation/bpf/bpf_iterators.rst +f:Documentation/bpf/bpf_licensing.rst +f:Documentation/bpf/bpf_prog_run.rst +f:Documentation/bpf/btf.rst +f:Documentation/bpf/clang-notes.rst +f:Documentation/bpf/classic_vs_extended.rst +f:Documentation/bpf/cpumasks.rst +f:Documentation/bpf/drgn.rst +f:Documentation/bpf/faq.rst +f:Documentation/bpf/fs_kfuncs.rst +f:Documentation/bpf/graph_ds_impl.rst +f:Documentation/bpf/helpers.rst +f:Documentation/bpf/index.rst +f:Documentation/bpf/kfuncs.rst +f:Documentation/bpf/libbpf/index.rst +f:Documentation/bpf/libbpf/libbpf_build.rst +f:Documentation/bpf/libbpf/libbpf_naming_convention.rst +f:Documentation/bpf/libbpf/libbpf_overview.rst +f:Documentation/bpf/libbpf/program_types.rst +f:Documentation/bpf/linux-notes.rst +f:Documentation/bpf/llvm_reloc.rst +f:Documentation/bpf/map_array.rst +f:Documentation/bpf/map_bloom_filter.rst +f:Documentation/bpf/map_cgroup_storage.rst +f:Documentation/bpf/map_cgrp_storage.rst +f:Documentation/bpf/map_cpumap.rst +f:Documentation/bpf/map_devmap.rst +f:Documentation/bpf/map_hash.rst +f:Documentation/bpf/map_lpm_trie.rst +f:Documentation/bpf/map_lru_hash_update.dot +f:Documentation/bpf/map_of_maps.rst +f:Documentation/bpf/map_queue_stack.rst +f:Documentation/bpf/map_sk_storage.rst +f:Documentation/bpf/map_sockmap.rst +f:Documentation/bpf/map_xskmap.rst +f:Documentation/bpf/maps.rst +f:Documentation/bpf/other.rst +f:Documentation/bpf/prog_cgroup_sockopt.rst +f:Documentation/bpf/prog_cgroup_sysctl.rst +f:Documentation/bpf/prog_flow_dissector.rst +f:Documentation/bpf/prog_lsm.rst +f:Documentation/bpf/prog_sk_lookup.rst +f:Documentation/bpf/programs.rst +f:Documentation/bpf/redirect.rst +f:Documentation/bpf/ringbuf.rst +f:Documentation/bpf/s390.rst +f:Documentation/bpf/standardization/abi.rst +f:Documentation/bpf/standardization/index.rst +f:Documentation/bpf/standardization/instruction-set.rst +f:Documentation/bpf/syscall_api.rst +f:Documentation/bpf/test_debug.rst +f:Documentation/bpf/verifier.rst +f:Documentation/cdrom/cdrom-standard.rst +f:Documentation/cdrom/index.rst +f:Documentation/conf.py +f:Documentation/core-api/asm-annotations.rst +f:Documentation/core-api/assoc_array.rst +f:Documentation/core-api/boot-time-mm.rst +f:Documentation/core-api/cachetlb.rst +f:Documentation/core-api/cgroup.rst +f:Documentation/core-api/circular-buffers.rst +f:Documentation/core-api/cleanup.rst +f:Documentation/core-api/cpu_hotplug.rst +f:Documentation/core-api/debug-objects.rst +f:Documentation/core-api/debugging-via-ohci1394.rst +f:Documentation/core-api/dma-api-howto.rst +f:Documentation/core-api/dma-api.rst +f:Documentation/core-api/dma-attributes.rst +f:Documentation/core-api/dma-isa-lpc.rst +f:Documentation/core-api/entry.rst +f:Documentation/core-api/errseq.rst +f:Documentation/core-api/floating-point.rst +f:Documentation/core-api/folio_queue.rst +f:Documentation/core-api/genalloc.rst +f:Documentation/core-api/generic-radix-tree.rst +f:Documentation/core-api/genericirq.rst +f:Documentation/core-api/gfp_mask-from-fs-io.rst +f:Documentation/core-api/idr.rst +f:Documentation/core-api/index.rst +f:Documentation/core-api/irq/concepts.rst +f:Documentation/core-api/irq/index.rst +f:Documentation/core-api/irq/irq-affinity.rst +f:Documentation/core-api/irq/irq-domain.rst +f:Documentation/core-api/irq/irqflags-tracing.rst +f:Documentation/core-api/kernel-api.rst +f:Documentation/core-api/kho/bindings/kho.yaml +f:Documentation/core-api/kho/bindings/memblock/memblock.yaml +f:Documentation/core-api/kho/bindings/memblock/reserve-mem.yaml +f:Documentation/core-api/kho/bindings/sub-fdt.yaml +f:Documentation/core-api/kho/concepts.rst +f:Documentation/core-api/kho/fdt.rst +f:Documentation/core-api/kho/index.rst +f:Documentation/core-api/kobject.rst +f:Documentation/core-api/kref.rst +f:Documentation/core-api/librs.rst +f:Documentation/core-api/list.rst +f:Documentation/core-api/local_ops.rst +f:Documentation/core-api/maple_tree.rst +f:Documentation/core-api/memory-allocation.rst +f:Documentation/core-api/memory-hotplug.rst +f:Documentation/core-api/min_heap.rst +f:Documentation/core-api/mm-api.rst +f:Documentation/core-api/netlink.rst +f:Documentation/core-api/packing.rst +f:Documentation/core-api/padata.rst +f:Documentation/core-api/parser.rst +f:Documentation/core-api/pin_user_pages.rst +f:Documentation/core-api/printk-basics.rst +f:Documentation/core-api/printk-formats.rst +f:Documentation/core-api/printk-index.rst +f:Documentation/core-api/protection-keys.rst +f:Documentation/core-api/rbtree.rst +f:Documentation/core-api/refcount-vs-atomic.rst +f:Documentation/core-api/swiotlb.rst +f:Documentation/core-api/symbol-namespaces.rst +f:Documentation/core-api/this_cpu_ops.rst +f:Documentation/core-api/timekeeping.rst +f:Documentation/core-api/tracepoint.rst +f:Documentation/core-api/unaligned-memory-access.rst +f:Documentation/core-api/union_find.rst +f:Documentation/core-api/watch_queue.rst +f:Documentation/core-api/workqueue.rst +f:Documentation/core-api/wrappers/atomic_bitops.rst +f:Documentation/core-api/wrappers/atomic_t.rst +f:Documentation/core-api/wrappers/memory-barriers.rst +f:Documentation/core-api/xarray.rst +f:Documentation/cpu-freq/core.rst +f:Documentation/cpu-freq/cpu-drivers.rst +f:Documentation/cpu-freq/cpufreq-stats.rst +f:Documentation/cpu-freq/index.rst +f:Documentation/crypto/api-aead.rst +f:Documentation/crypto/api-akcipher.rst +f:Documentation/crypto/api-digest.rst +f:Documentation/crypto/api-intro.rst +f:Documentation/crypto/api-kpp.rst +f:Documentation/crypto/api-rng.rst +f:Documentation/crypto/api-samples.rst +f:Documentation/crypto/api-sig.rst +f:Documentation/crypto/api-skcipher.rst +f:Documentation/crypto/api.rst +f:Documentation/crypto/architecture.rst +f:Documentation/crypto/asymmetric-keys.rst +f:Documentation/crypto/async-tx-api.rst +f:Documentation/crypto/crypto_engine.rst +f:Documentation/crypto/descore-readme.rst +f:Documentation/crypto/devel-algos.rst +f:Documentation/crypto/device_drivers/index.rst +f:Documentation/crypto/device_drivers/octeontx2.rst +f:Documentation/crypto/index.rst +f:Documentation/crypto/intro.rst +f:Documentation/crypto/krb5.rst +f:Documentation/crypto/userspace-if.rst +f:Documentation/dev-tools/autofdo.rst +f:Documentation/dev-tools/checkpatch.rst +f:Documentation/dev-tools/checkuapi.rst +f:Documentation/dev-tools/clang-format.rst +f:Documentation/dev-tools/coccinelle.rst +f:Documentation/dev-tools/gcov.rst +f:Documentation/dev-tools/gpio-sloppy-logic-analyzer.rst +f:Documentation/dev-tools/index.rst +f:Documentation/dev-tools/kasan.rst +f:Documentation/dev-tools/kcov.rst +f:Documentation/dev-tools/kcsan.rst +f:Documentation/dev-tools/kfence.rst +f:Documentation/dev-tools/kmemleak.rst +f:Documentation/dev-tools/kmsan.rst +f:Documentation/dev-tools/kselftest.rst +f:Documentation/dev-tools/ktap.rst +f:Documentation/dev-tools/kunit/api/clk.rst +f:Documentation/dev-tools/kunit/api/functionredirection.rst +f:Documentation/dev-tools/kunit/api/index.rst +f:Documentation/dev-tools/kunit/api/of.rst +f:Documentation/dev-tools/kunit/api/platformdevice.rst +f:Documentation/dev-tools/kunit/api/resource.rst +f:Documentation/dev-tools/kunit/api/test.rst +f:Documentation/dev-tools/kunit/architecture.rst +f:Documentation/dev-tools/kunit/faq.rst +f:Documentation/dev-tools/kunit/index.rst +f:Documentation/dev-tools/kunit/kunit_suitememorydiagram.svg +f:Documentation/dev-tools/kunit/run_manual.rst +f:Documentation/dev-tools/kunit/run_wrapper.rst +f:Documentation/dev-tools/kunit/running_tips.rst +f:Documentation/dev-tools/kunit/start.rst +f:Documentation/dev-tools/kunit/style.rst +f:Documentation/dev-tools/kunit/usage.rst +f:Documentation/dev-tools/propeller.rst +f:Documentation/dev-tools/sparse.rst +f:Documentation/dev-tools/testing-devices.rst +f:Documentation/dev-tools/testing-overview.rst +f:Documentation/dev-tools/ubsan.rst +f:Documentation/devicetree/bindings/.gitignore +f:Documentation/devicetree/bindings/.yamllint +f:Documentation/devicetree/bindings/ABI.rst +f:Documentation/devicetree/bindings/Makefile +f:Documentation/devicetree/bindings/access-controllers/access-controllers.yaml +f:Documentation/devicetree/bindings/arc/axs101.txt +f:Documentation/devicetree/bindings/arc/axs103.txt +f:Documentation/devicetree/bindings/arc/eznps.txt +f:Documentation/devicetree/bindings/arc/hsdk.txt +f:Documentation/devicetree/bindings/arc/pct.txt +f:Documentation/devicetree/bindings/arc/snps,archs-pct.yaml +f:Documentation/devicetree/bindings/arm/actions.yaml +f:Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.yaml +f:Documentation/devicetree/bindings/arm/airoha.yaml +f:Documentation/devicetree/bindings/arm/altera.yaml +f:Documentation/devicetree/bindings/arm/altera/socfpga-clk-manager.yaml +f:Documentation/devicetree/bindings/arm/altera/socfpga-sdram-edac.txt +f:Documentation/devicetree/bindings/arm/amazon,al.yaml +f:Documentation/devicetree/bindings/arm/amd,pensando.yaml +f:Documentation/devicetree/bindings/arm/amlogic.yaml +f:Documentation/devicetree/bindings/arm/amlogic/amlogic,meson-gx-ao-secure.yaml +f:Documentation/devicetree/bindings/arm/amlogic/amlogic,meson-mx-secbus2.yaml +f:Documentation/devicetree/bindings/arm/apple.yaml +f:Documentation/devicetree/bindings/arm/apple/apple,pmgr.yaml +f:Documentation/devicetree/bindings/arm/arm,cci-400.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-catu.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-cpu-debug.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-cti.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-dummy-sink.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-dummy-source.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-dynamic-funnel.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-dynamic-replicator.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-etb10.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-etm.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-static-funnel.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-static-replicator.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-stm.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-tmc.yaml +f:Documentation/devicetree/bindings/arm/arm,coresight-tpiu.yaml +f:Documentation/devicetree/bindings/arm/arm,corstone1000.yaml +f:Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml +f:Documentation/devicetree/bindings/arm/arm,integrator.yaml +f:Documentation/devicetree/bindings/arm/arm,juno-fpga-apb-regs.yaml +f:Documentation/devicetree/bindings/arm/arm,morello.yaml +f:Documentation/devicetree/bindings/arm/arm,realview.yaml +f:Documentation/devicetree/bindings/arm/arm,scu.yaml +f:Documentation/devicetree/bindings/arm/arm,trace-buffer-extension.yaml +f:Documentation/devicetree/bindings/arm/arm,versatile-sysreg.yaml +f:Documentation/devicetree/bindings/arm/arm,versatile.yaml +f:Documentation/devicetree/bindings/arm/arm,vexpress-juno.yaml +f:Documentation/devicetree/bindings/arm/aspeed/aspeed,sbc.yaml +f:Documentation/devicetree/bindings/arm/aspeed/aspeed.yaml +f:Documentation/devicetree/bindings/arm/atmel,sama5d2-secumod.yaml +f:Documentation/devicetree/bindings/arm/atmel-at91.yaml +f:Documentation/devicetree/bindings/arm/atmel-sysregs.txt +f:Documentation/devicetree/bindings/arm/axiado.yaml +f:Documentation/devicetree/bindings/arm/axis.txt +f:Documentation/devicetree/bindings/arm/axxia.yaml +f:Documentation/devicetree/bindings/arm/bcm/bcm2835.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,bcm11351.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,bcm21664.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,bcm23550.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,bcm4708.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,bcm53573.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,bcm63138.txt +f:Documentation/devicetree/bindings/arm/bcm/brcm,bcmbca.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,brcmstb.txt +f:Documentation/devicetree/bindings/arm/bcm/brcm,cygnus.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,hr2.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,ns2.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,nsp.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,stingray.yaml +f:Documentation/devicetree/bindings/arm/bcm/brcm,vulcan-soc.yaml +f:Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml +f:Documentation/devicetree/bindings/arm/bitmain.yaml +f:Documentation/devicetree/bindings/arm/blaize.yaml +f:Documentation/devicetree/bindings/arm/calxeda.yaml +f:Documentation/devicetree/bindings/arm/calxeda/hb-sregs.yaml +f:Documentation/devicetree/bindings/arm/calxeda/l2ecc.yaml +f:Documentation/devicetree/bindings/arm/cavium-thunder.txt +f:Documentation/devicetree/bindings/arm/cavium-thunder2.txt +f:Documentation/devicetree/bindings/arm/cci-control-port.yaml +f:Documentation/devicetree/bindings/arm/cirrus/cirrus,ep9301.yaml +f:Documentation/devicetree/bindings/arm/cix.yaml +f:Documentation/devicetree/bindings/arm/cpu-enable-method/al,alpine-smp +f:Documentation/devicetree/bindings/arm/cpu-enable-method/marvell,berlin-smp +f:Documentation/devicetree/bindings/arm/cpu-enable-method/nuvoton,npcm750-smp +f:Documentation/devicetree/bindings/arm/cpus.yaml +f:Documentation/devicetree/bindings/arm/digicolor.yaml +f:Documentation/devicetree/bindings/arm/firmware/linaro,optee-tz.yaml +f:Documentation/devicetree/bindings/arm/firmware/sdei.txt +f:Documentation/devicetree/bindings/arm/firmware/tlm,trusted-foundations.yaml +f:Documentation/devicetree/bindings/arm/freescale/fsl,imx51-m4if.yaml +f:Documentation/devicetree/bindings/arm/freescale/fsl,imx7ulp-pm.yaml +f:Documentation/devicetree/bindings/arm/freescale/fsl,imx7ulp-sim.yaml +f:Documentation/devicetree/bindings/arm/fsl.yaml +f:Documentation/devicetree/bindings/arm/gemini.yaml +f:Documentation/devicetree/bindings/arm/google.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/controller/cpuctrl.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/controller/hi3798cv200-perictrl.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/controller/hi6220-domain-ctrl.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/controller/hip04-bootwrapper.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/controller/hip04-fabric.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/controller/pctrl.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/controller/sysctrl.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/hisilicon.yaml +f:Documentation/devicetree/bindings/arm/hisilicon/low-pin-count.yaml +f:Documentation/devicetree/bindings/arm/hpe,gxp.yaml +f:Documentation/devicetree/bindings/arm/intel,keembay.yaml +f:Documentation/devicetree/bindings/arm/intel,socfpga.yaml +f:Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml +f:Documentation/devicetree/bindings/arm/keystone/keystone.txt +f:Documentation/devicetree/bindings/arm/keystone/ti,k3-sci-common.yaml +f:Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml +f:Documentation/devicetree/bindings/arm/linux,dummy-virt.yaml +f:Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt +f:Documentation/devicetree/bindings/arm/marvell/98dx3236.txt +f:Documentation/devicetree/bindings/arm/marvell/ap80x-system-controller.txt +f:Documentation/devicetree/bindings/arm/marvell/armada-370-xp-pmsu.txt +f:Documentation/devicetree/bindings/arm/marvell/armada-370-xp.txt +f:Documentation/devicetree/bindings/arm/marvell/armada-375.txt +f:Documentation/devicetree/bindings/arm/marvell/armada-37xx.yaml +f:Documentation/devicetree/bindings/arm/marvell/armada-380-mpcore-soc-ctrl.txt +f:Documentation/devicetree/bindings/arm/marvell/armada-38x.yaml +f:Documentation/devicetree/bindings/arm/marvell/armada-39x.txt +f:Documentation/devicetree/bindings/arm/marvell/armada-7k-8k.yaml +f:Documentation/devicetree/bindings/arm/marvell/armada-cpu-reset.txt +f:Documentation/devicetree/bindings/arm/marvell/coherency-fabric.txt +f:Documentation/devicetree/bindings/arm/marvell/cp110-system-controller.txt +f:Documentation/devicetree/bindings/arm/marvell/kirkwood.txt +f:Documentation/devicetree/bindings/arm/marvell/marvell,ac5.yaml +f:Documentation/devicetree/bindings/arm/marvell/marvell,dove.txt +f:Documentation/devicetree/bindings/arm/marvell/marvell,kirkwood.txt +f:Documentation/devicetree/bindings/arm/marvell/marvell,orion5x.txt +f:Documentation/devicetree/bindings/arm/marvell/mvebu-cpu-config.txt +f:Documentation/devicetree/bindings/arm/marvell/mvebu-system-controller.txt +f:Documentation/devicetree/bindings/arm/mediatek.yaml +f:Documentation/devicetree/bindings/arm/mediatek/mediatek,audsys.yaml +f:Documentation/devicetree/bindings/arm/mediatek/mediatek,g3dsys.txt +f:Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml +f:Documentation/devicetree/bindings/arm/mediatek/mediatek,mt7622-pcie-mirror.yaml +f:Documentation/devicetree/bindings/arm/mediatek/mediatek,mt7622-wed.yaml +f:Documentation/devicetree/bindings/arm/mediatek/mediatek,mt7986-wed-pcie.yaml +f:Documentation/devicetree/bindings/arm/microchip,sparx5.yaml +f:Documentation/devicetree/bindings/arm/moxart.yaml +f:Documentation/devicetree/bindings/arm/mrvl/mrvl.yaml +f:Documentation/devicetree/bindings/arm/mstar/mstar,l3bridge.yaml +f:Documentation/devicetree/bindings/arm/mstar/mstar,smpctrl.yaml +f:Documentation/devicetree/bindings/arm/mstar/mstar.yaml +f:Documentation/devicetree/bindings/arm/nuvoton/nuvoton,ma35d1.yaml +f:Documentation/devicetree/bindings/arm/nuvoton/nuvoton,npcm.yaml +f:Documentation/devicetree/bindings/arm/nvidia,tegra194-ccplex.yaml +f:Documentation/devicetree/bindings/arm/nxp/lpc32xx.yaml +f:Documentation/devicetree/bindings/arm/omap/counter.txt +f:Documentation/devicetree/bindings/arm/omap/crossbar.txt +f:Documentation/devicetree/bindings/arm/omap/ctrl.txt +f:Documentation/devicetree/bindings/arm/omap/dmm.txt +f:Documentation/devicetree/bindings/arm/omap/dsp.txt +f:Documentation/devicetree/bindings/arm/omap/iva.txt +f:Documentation/devicetree/bindings/arm/omap/l3-noc.txt +f:Documentation/devicetree/bindings/arm/omap/l4.txt +f:Documentation/devicetree/bindings/arm/omap/mpu.txt +f:Documentation/devicetree/bindings/arm/omap/omap.txt +f:Documentation/devicetree/bindings/arm/omap/prcm.txt +f:Documentation/devicetree/bindings/arm/omap/prm-inst.txt +f:Documentation/devicetree/bindings/arm/pmu.yaml +f:Documentation/devicetree/bindings/arm/primecell.yaml +f:Documentation/devicetree/bindings/arm/psci.yaml +f:Documentation/devicetree/bindings/arm/qcom,coresight-ctcu.yaml +f:Documentation/devicetree/bindings/arm/qcom,coresight-remote-etm.yaml +f:Documentation/devicetree/bindings/arm/qcom,coresight-tpda.yaml +f:Documentation/devicetree/bindings/arm/qcom,coresight-tpdm.yaml +f:Documentation/devicetree/bindings/arm/qcom-soc.yaml +f:Documentation/devicetree/bindings/arm/qcom.yaml +f:Documentation/devicetree/bindings/arm/rda.yaml +f:Documentation/devicetree/bindings/arm/realtek.yaml +f:Documentation/devicetree/bindings/arm/rockchip.yaml +f:Documentation/devicetree/bindings/arm/rockchip/pmu.yaml +f:Documentation/devicetree/bindings/arm/samsung/samsung-boards.yaml +f:Documentation/devicetree/bindings/arm/samsung/samsung-secure-firmware.yaml +f:Documentation/devicetree/bindings/arm/samsung/samsung-soc.yaml +f:Documentation/devicetree/bindings/arm/secure.txt +f:Documentation/devicetree/bindings/arm/socionext/milbeaut.yaml +f:Documentation/devicetree/bindings/arm/socionext/synquacer.yaml +f:Documentation/devicetree/bindings/arm/socionext/uniphier.yaml +f:Documentation/devicetree/bindings/arm/sp810.yaml +f:Documentation/devicetree/bindings/arm/spear.yaml +f:Documentation/devicetree/bindings/arm/sprd/sprd.yaml +f:Documentation/devicetree/bindings/arm/ste-nomadik.txt +f:Documentation/devicetree/bindings/arm/sti.yaml +f:Documentation/devicetree/bindings/arm/stm32/st,mlahb.yaml +f:Documentation/devicetree/bindings/arm/stm32/st,stm32-syscon.yaml +f:Documentation/devicetree/bindings/arm/stm32/stm32.yaml +f:Documentation/devicetree/bindings/arm/sunplus,sp7021.yaml +f:Documentation/devicetree/bindings/arm/sunxi.yaml +f:Documentation/devicetree/bindings/arm/sunxi/allwinner,sun4i-a10-mbus.yaml +f:Documentation/devicetree/bindings/arm/sunxi/allwinner,sun6i-a31-cpuconfig.yaml +f:Documentation/devicetree/bindings/arm/sunxi/allwinner,sun9i-a80-prcm.yaml +f:Documentation/devicetree/bindings/arm/syna.txt +f:Documentation/devicetree/bindings/arm/tegra.yaml +f:Documentation/devicetree/bindings/arm/tegra/nvidia,tegra-ccplex-cluster.yaml +f:Documentation/devicetree/bindings/arm/tegra/nvidia,tegra186-pmc.yaml +f:Documentation/devicetree/bindings/arm/tegra/nvidia,tegra194-axi2apb.yaml +f:Documentation/devicetree/bindings/arm/tegra/nvidia,tegra194-cbb.yaml +f:Documentation/devicetree/bindings/arm/tegra/nvidia,tegra234-cbb.yaml +f:Documentation/devicetree/bindings/arm/tesla.yaml +f:Documentation/devicetree/bindings/arm/ti/k3.yaml +f:Documentation/devicetree/bindings/arm/ti/nspire.yaml +f:Documentation/devicetree/bindings/arm/ti/omap.yaml +f:Documentation/devicetree/bindings/arm/ti/ti,davinci.yaml +f:Documentation/devicetree/bindings/arm/toshiba.yaml +f:Documentation/devicetree/bindings/arm/ux500.yaml +f:Documentation/devicetree/bindings/arm/ux500/boards.txt +f:Documentation/devicetree/bindings/arm/ux500/power_domain.txt +f:Documentation/devicetree/bindings/arm/vexpress-config.yaml +f:Documentation/devicetree/bindings/arm/vexpress-scc.txt +f:Documentation/devicetree/bindings/arm/vexpress-sysreg.yaml +f:Documentation/devicetree/bindings/arm/vt8500.yaml +f:Documentation/devicetree/bindings/arm/vt8500/via,vt8500-pmc.txt +f:Documentation/devicetree/bindings/arm/xen.txt +f:Documentation/devicetree/bindings/ata/ahci-common.yaml +f:Documentation/devicetree/bindings/ata/ahci-platform.yaml +f:Documentation/devicetree/bindings/ata/allwinner,sun4i-a10-ahci.yaml +f:Documentation/devicetree/bindings/ata/allwinner,sun8i-r40-ahci.yaml +f:Documentation/devicetree/bindings/ata/apm,xgene-ahci.yaml +f:Documentation/devicetree/bindings/ata/arasan,cf-spear1340.yaml +f:Documentation/devicetree/bindings/ata/ata-generic.yaml +f:Documentation/devicetree/bindings/ata/baikal,bt1-ahci.yaml +f:Documentation/devicetree/bindings/ata/brcm,sata-brcm.yaml +f:Documentation/devicetree/bindings/ata/cavium,ebt3000-compact-flash.yaml +f:Documentation/devicetree/bindings/ata/ceva,ahci-1v84.yaml +f:Documentation/devicetree/bindings/ata/cirrus,ep9312-pata.yaml +f:Documentation/devicetree/bindings/ata/cortina,gemini-sata-bridge.yaml +f:Documentation/devicetree/bindings/ata/faraday,ftide010.yaml +f:Documentation/devicetree/bindings/ata/fsl,ahci.yaml +f:Documentation/devicetree/bindings/ata/fsl,imx-pata.yaml +f:Documentation/devicetree/bindings/ata/fsl,pq-sata.yaml +f:Documentation/devicetree/bindings/ata/imx-sata.yaml +f:Documentation/devicetree/bindings/ata/intel,ixp4xx-compact-flash.yaml +f:Documentation/devicetree/bindings/ata/marvell,orion-sata.yaml +f:Documentation/devicetree/bindings/ata/mediatek,mtk-ahci.yaml +f:Documentation/devicetree/bindings/ata/nvidia,tegra-ahci.yaml +f:Documentation/devicetree/bindings/ata/pata-common.yaml +f:Documentation/devicetree/bindings/ata/renesas,rcar-sata.yaml +f:Documentation/devicetree/bindings/ata/rockchip,dwc-ahci.yaml +f:Documentation/devicetree/bindings/ata/sata-common.yaml +f:Documentation/devicetree/bindings/ata/sata_highbank.yaml +f:Documentation/devicetree/bindings/ata/snps,dwc-ahci-common.yaml +f:Documentation/devicetree/bindings/ata/snps,dwc-ahci.yaml +f:Documentation/devicetree/bindings/ata/st,ahci.yaml +f:Documentation/devicetree/bindings/ata/ti,da850-ahci.yaml +f:Documentation/devicetree/bindings/ata/ti,dm816-ahci.yaml +f:Documentation/devicetree/bindings/auxdisplay/arm,versatile-lcd.yaml +f:Documentation/devicetree/bindings/auxdisplay/gpio-7-segment.yaml +f:Documentation/devicetree/bindings/auxdisplay/hit,hd44780.yaml +f:Documentation/devicetree/bindings/auxdisplay/holtek,ht16k33.yaml +f:Documentation/devicetree/bindings/auxdisplay/img,ascii-lcd.yaml +f:Documentation/devicetree/bindings/auxdisplay/maxim,max6959.yaml +f:Documentation/devicetree/bindings/auxdisplay/modtronix,lcd2s.yaml +f:Documentation/devicetree/bindings/board/fsl,bcsr.yaml +f:Documentation/devicetree/bindings/board/fsl,fpga-qixis-i2c.yaml +f:Documentation/devicetree/bindings/board/fsl,fpga-qixis.yaml +f:Documentation/devicetree/bindings/bus/allwinner,sun50i-a64-de2.yaml +f:Documentation/devicetree/bindings/bus/allwinner,sun8i-a23-rsb.yaml +f:Documentation/devicetree/bindings/bus/arm,integrator-ap-lm.yaml +f:Documentation/devicetree/bindings/bus/aspeed,ast2600-ahbc.yaml +f:Documentation/devicetree/bindings/bus/baikal,bt1-apb.yaml +f:Documentation/devicetree/bindings/bus/baikal,bt1-axi.yaml +f:Documentation/devicetree/bindings/bus/brcm,bus-axi.txt +f:Documentation/devicetree/bindings/bus/brcm,gisb-arb.yaml +f:Documentation/devicetree/bindings/bus/fsl,imx8mp-aipstz.yaml +f:Documentation/devicetree/bindings/bus/fsl,imx8qxp-pixel-link-msi-bus.yaml +f:Documentation/devicetree/bindings/bus/fsl,spba-bus.yaml +f:Documentation/devicetree/bindings/bus/microsoft,vmbus.yaml +f:Documentation/devicetree/bindings/bus/moxtet.txt +f:Documentation/devicetree/bindings/bus/mti,mips-cdmm.yaml +f:Documentation/devicetree/bindings/bus/mvebu-mbus.txt +f:Documentation/devicetree/bindings/bus/nvidia,tegra20-gmi.txt +f:Documentation/devicetree/bindings/bus/nvidia,tegra210-aconnect.yaml +f:Documentation/devicetree/bindings/bus/omap-ocp2scp.txt +f:Documentation/devicetree/bindings/bus/palmbus.yaml +f:Documentation/devicetree/bindings/bus/qcom,ssbi.yaml +f:Documentation/devicetree/bindings/bus/qcom,ssc-block-bus.yaml +f:Documentation/devicetree/bindings/bus/renesas,bsc.yaml +f:Documentation/devicetree/bindings/bus/simple-pm-bus.yaml +f:Documentation/devicetree/bindings/bus/socionext,uniphier-system-bus.yaml +f:Documentation/devicetree/bindings/bus/st,stm32-etzpc.yaml +f:Documentation/devicetree/bindings/bus/st,stm32mp25-rifsc.yaml +f:Documentation/devicetree/bindings/bus/ti,da850-mstpri.txt +f:Documentation/devicetree/bindings/bus/ti-sysc.yaml +f:Documentation/devicetree/bindings/bus/ts-nbus.txt +f:Documentation/devicetree/bindings/bus/xlnx,versal-net-cdx.yaml +f:Documentation/devicetree/bindings/cache/andestech,ax45mp-cache.yaml +f:Documentation/devicetree/bindings/cache/baikal,bt1-l2-ctl.yaml +f:Documentation/devicetree/bindings/cache/freescale-l2cache.txt +f:Documentation/devicetree/bindings/cache/l2c2x0.yaml +f:Documentation/devicetree/bindings/cache/marvell,kirkwood-cache.yaml +f:Documentation/devicetree/bindings/cache/marvell,tauros2-cache.yaml +f:Documentation/devicetree/bindings/cache/qcom,llcc.yaml +f:Documentation/devicetree/bindings/cache/sifive,ccache0.yaml +f:Documentation/devicetree/bindings/cache/socionext,uniphier-system-cache.yaml +f:Documentation/devicetree/bindings/cache/starfive,jh8100-starlink-cache.yaml +f:Documentation/devicetree/bindings/chrome/google,cros-ec-typec.yaml +f:Documentation/devicetree/bindings/clock/actions,owl-cmu.yaml +f:Documentation/devicetree/bindings/clock/adi,axi-clkgen.yaml +f:Documentation/devicetree/bindings/clock/airoha,en7523-scu.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-ahb-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-apb0-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-apb1-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-axi-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-ccu.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-cpu-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-display-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-gates-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-mbus-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-mmc-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-mod0-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-mod1-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-osc-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-pll1-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-pll3-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-pll5-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-pll6-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-tcon-ch0-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-usb-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun4i-a10-ve-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun55i-a523-ccu.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun5i-a13-ahb-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun6i-a31-pll6-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun7i-a20-gmac-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun7i-a20-out-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun8i-a83t-de2-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun8i-h3-bus-gates-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-ahb-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-apb0-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-cpus-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-de-clks.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-gt-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-mmc-config-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-pll4-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-usb-clks.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-usb-mod-clk.yaml +f:Documentation/devicetree/bindings/clock/allwinner,sun9i-a80-usb-phy-clk.yaml +f:Documentation/devicetree/bindings/clock/alphascale,asm9260-clock-controller.yaml +f:Documentation/devicetree/bindings/clock/amlogic,a1-peripherals-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,a1-pll-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,c3-peripherals-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,c3-pll-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,gxbb-aoclkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,gxbb-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,meson8-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,meson8-ddr-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,s4-peripherals-clkc.yaml +f:Documentation/devicetree/bindings/clock/amlogic,s4-pll-clkc.yaml +f:Documentation/devicetree/bindings/clock/apm,xgene-device-clock.yaml +f:Documentation/devicetree/bindings/clock/apm,xgene-socpll-clock.yaml +f:Documentation/devicetree/bindings/clock/apple,nco.yaml +f:Documentation/devicetree/bindings/clock/arm,syscon-icst.yaml +f:Documentation/devicetree/bindings/clock/armada3700-xtal-clock.txt +f:Documentation/devicetree/bindings/clock/atmel,at91rm9200-pmc.yaml +f:Documentation/devicetree/bindings/clock/atmel,at91sam9x5-sckc.yaml +f:Documentation/devicetree/bindings/clock/axis,artpec6-clkctrl.yaml +f:Documentation/devicetree/bindings/clock/axs10x-i2s-pll-clock.txt +f:Documentation/devicetree/bindings/clock/baikal,bt1-ccu-div.yaml +f:Documentation/devicetree/bindings/clock/baikal,bt1-ccu-pll.yaml +f:Documentation/devicetree/bindings/clock/bitmain,bm1880-clk.yaml +f:Documentation/devicetree/bindings/clock/brcm,bcm2711-dvp.yaml +f:Documentation/devicetree/bindings/clock/brcm,bcm2835-aux-clock.yaml +f:Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.yaml +f:Documentation/devicetree/bindings/clock/brcm,bcm53573-ilp.yaml +f:Documentation/devicetree/bindings/clock/brcm,bcm63268-timer-clocks.yaml +f:Documentation/devicetree/bindings/clock/brcm,bcm63xx-clocks.yaml +f:Documentation/devicetree/bindings/clock/brcm,iproc-clocks.yaml +f:Documentation/devicetree/bindings/clock/brcm,kona-ccu.yaml +f:Documentation/devicetree/bindings/clock/calxeda.yaml +f:Documentation/devicetree/bindings/clock/canaan,k210-clk.yaml +f:Documentation/devicetree/bindings/clock/cirrus,cs2000-cp.yaml +f:Documentation/devicetree/bindings/clock/cirrus,ep7209-clk.yaml +f:Documentation/devicetree/bindings/clock/cirrus,lochnagar.yaml +f:Documentation/devicetree/bindings/clock/clk-palmas-clk32kg-clocks.txt +f:Documentation/devicetree/bindings/clock/clock-bindings.txt +f:Documentation/devicetree/bindings/clock/fixed-clock.yaml +f:Documentation/devicetree/bindings/clock/fixed-factor-clock.yaml +f:Documentation/devicetree/bindings/clock/fixed-mmio-clock.yaml +f:Documentation/devicetree/bindings/clock/fsl,flexspi-clock.yaml +f:Documentation/devicetree/bindings/clock/fsl,imx8-acm.yaml +f:Documentation/devicetree/bindings/clock/fsl,imx8m-anatop.yaml +f:Documentation/devicetree/bindings/clock/fsl,imx93-anatop.yaml +f:Documentation/devicetree/bindings/clock/fsl,plldig.yaml +f:Documentation/devicetree/bindings/clock/fsl,qoriq-clock-legacy.yaml +f:Documentation/devicetree/bindings/clock/fsl,qoriq-clock.yaml +f:Documentation/devicetree/bindings/clock/fsl,sai-clock.yaml +f:Documentation/devicetree/bindings/clock/fsl,scu-clk.yaml +f:Documentation/devicetree/bindings/clock/fsl,vf610-ccm.yaml +f:Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt +f:Documentation/devicetree/bindings/clock/gated-fixed-clock.yaml +f:Documentation/devicetree/bindings/clock/google,gs101-clock.yaml +f:Documentation/devicetree/bindings/clock/gpio-gate-clock.yaml +f:Documentation/devicetree/bindings/clock/gpio-mux-clock.yaml +f:Documentation/devicetree/bindings/clock/hi3660-clock.txt +f:Documentation/devicetree/bindings/clock/hi3670-clock.txt +f:Documentation/devicetree/bindings/clock/hi6220-clock.txt +f:Documentation/devicetree/bindings/clock/hisi-crg.txt +f:Documentation/devicetree/bindings/clock/hisilicon,hi3559av100-clock.yaml +f:Documentation/devicetree/bindings/clock/idt,versaclock5.yaml +f:Documentation/devicetree/bindings/clock/img,boston-clock.txt +f:Documentation/devicetree/bindings/clock/img,pistachio-clk.yaml +f:Documentation/devicetree/bindings/clock/imx1-clock.yaml +f:Documentation/devicetree/bindings/clock/imx21-clock.yaml +f:Documentation/devicetree/bindings/clock/imx23-clock.yaml +f:Documentation/devicetree/bindings/clock/imx25-clock.yaml +f:Documentation/devicetree/bindings/clock/imx27-clock.yaml +f:Documentation/devicetree/bindings/clock/imx28-clock.yaml +f:Documentation/devicetree/bindings/clock/imx31-clock.yaml +f:Documentation/devicetree/bindings/clock/imx35-clock.yaml +f:Documentation/devicetree/bindings/clock/imx5-clock.yaml +f:Documentation/devicetree/bindings/clock/imx6q-clock.yaml +f:Documentation/devicetree/bindings/clock/imx6sl-clock.yaml +f:Documentation/devicetree/bindings/clock/imx6sll-clock.yaml +f:Documentation/devicetree/bindings/clock/imx6sx-clock.yaml +f:Documentation/devicetree/bindings/clock/imx6ul-clock.yaml +f:Documentation/devicetree/bindings/clock/imx7d-clock.yaml +f:Documentation/devicetree/bindings/clock/imx7ulp-pcc-clock.yaml +f:Documentation/devicetree/bindings/clock/imx7ulp-scg-clock.yaml +f:Documentation/devicetree/bindings/clock/imx8m-clock.yaml +f:Documentation/devicetree/bindings/clock/imx8mp-audiomix.yaml +f:Documentation/devicetree/bindings/clock/imx8qxp-lpcg.yaml +f:Documentation/devicetree/bindings/clock/imx8ulp-cgc-clock.yaml +f:Documentation/devicetree/bindings/clock/imx8ulp-pcc-clock.yaml +f:Documentation/devicetree/bindings/clock/imx93-clock.yaml +f:Documentation/devicetree/bindings/clock/imxrt1050-clock.yaml +f:Documentation/devicetree/bindings/clock/ingenic,cgu.yaml +f:Documentation/devicetree/bindings/clock/intel,agilex.yaml +f:Documentation/devicetree/bindings/clock/intel,agilex5-clkmgr.yaml +f:Documentation/devicetree/bindings/clock/intel,cgu-lgm.yaml +f:Documentation/devicetree/bindings/clock/intel,easic-n5x.yaml +f:Documentation/devicetree/bindings/clock/intel,stratix10.yaml +f:Documentation/devicetree/bindings/clock/keystone-gate.txt +f:Documentation/devicetree/bindings/clock/keystone-pll.txt +f:Documentation/devicetree/bindings/clock/loongson,ls1x-clk.yaml +f:Documentation/devicetree/bindings/clock/loongson,ls2k-clk.yaml +f:Documentation/devicetree/bindings/clock/lsi,axm5516-clks.yaml +f:Documentation/devicetree/bindings/clock/lsi,nspire-cx-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,armada-370-corediv-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,armada-3700-periph-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,armada-3700-tbg-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,armada-3700-uart-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,armada-xp-cpu-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,berlin2-clk.yaml +f:Documentation/devicetree/bindings/clock/marvell,dove-divider-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,mmp2-audio-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,mmp2-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,mvebu-core-clock.yaml +f:Documentation/devicetree/bindings/clock/marvell,pxa168.txt +f:Documentation/devicetree/bindings/clock/marvell,pxa1908.yaml +f:Documentation/devicetree/bindings/clock/marvell,pxa1928.txt +f:Documentation/devicetree/bindings/clock/marvell,pxa910.txt +f:Documentation/devicetree/bindings/clock/marvell-armada-370-gating-clock.yaml +f:Documentation/devicetree/bindings/clock/maxim,max9485.yaml +f:Documentation/devicetree/bindings/clock/mediatek,apmixedsys.yaml +f:Documentation/devicetree/bindings/clock/mediatek,ethsys.yaml +f:Documentation/devicetree/bindings/clock/mediatek,infracfg.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt2701-hifsys.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt6795-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt7621-sysc.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt7622-pciesys.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt7622-ssusbsys.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt7988-ethwarp.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt7988-xfi-pll.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8186-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8186-fhctl.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8186-sys-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8188-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8188-sys-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8192-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8192-sys-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8195-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8195-sys-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8365-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mt8365-sys-clock.yaml +f:Documentation/devicetree/bindings/clock/mediatek,mtmips-sysc.yaml +f:Documentation/devicetree/bindings/clock/mediatek,pericfg.yaml +f:Documentation/devicetree/bindings/clock/mediatek,syscon.yaml +f:Documentation/devicetree/bindings/clock/mediatek,topckgen.yaml +f:Documentation/devicetree/bindings/clock/microchip,lan966x-gck.yaml +f:Documentation/devicetree/bindings/clock/microchip,mpfs-ccc.yaml +f:Documentation/devicetree/bindings/clock/microchip,mpfs-clkcfg.yaml +f:Documentation/devicetree/bindings/clock/microchip,pic32mzda-clk.yaml +f:Documentation/devicetree/bindings/clock/microchip,sparx5-dpll.yaml +f:Documentation/devicetree/bindings/clock/milbeaut-clock.yaml +f:Documentation/devicetree/bindings/clock/moxa,moxart-clock.yaml +f:Documentation/devicetree/bindings/clock/mstar,msc313-cpupll.yaml +f:Documentation/devicetree/bindings/clock/mstar,msc313-mpll.yaml +f:Documentation/devicetree/bindings/clock/nuvoton,ma35d1-clk.yaml +f:Documentation/devicetree/bindings/clock/nuvoton,npcm750-clk.yaml +f:Documentation/devicetree/bindings/clock/nuvoton,npcm845-clk.yaml +f:Documentation/devicetree/bindings/clock/nvidia,tegra124-car.yaml +f:Documentation/devicetree/bindings/clock/nvidia,tegra124-dfll.txt +f:Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml +f:Documentation/devicetree/bindings/clock/nxp,imx95-blk-ctl.yaml +f:Documentation/devicetree/bindings/clock/nxp,imx95-display-master-csr.yaml +f:Documentation/devicetree/bindings/clock/nxp,lpc1850-ccu.yaml +f:Documentation/devicetree/bindings/clock/nxp,lpc1850-cgu.yaml +f:Documentation/devicetree/bindings/clock/nxp,lpc3220-clk.yaml +f:Documentation/devicetree/bindings/clock/nxp,lpc3220-usb-clk.yaml +f:Documentation/devicetree/bindings/clock/pwm-clock.yaml +f:Documentation/devicetree/bindings/clock/pxa-clock.txt +f:Documentation/devicetree/bindings/clock/qca,ath79-pll.yaml +f:Documentation/devicetree/bindings/clock/qcom,a53pll.yaml +f:Documentation/devicetree/bindings/clock/qcom,a7pll.yaml +f:Documentation/devicetree/bindings/clock/qcom,aoncc-sm8250.yaml +f:Documentation/devicetree/bindings/clock/qcom,audiocc-sm8250.yaml +f:Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml +f:Documentation/devicetree/bindings/clock/qcom,dispcc-sc8280xp.yaml +f:Documentation/devicetree/bindings/clock/qcom,dispcc-sm6125.yaml +f:Documentation/devicetree/bindings/clock/qcom,dispcc-sm6350.yaml +f:Documentation/devicetree/bindings/clock/qcom,dispcc-sm8x50.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-apq8064.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-apq8084.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-ipq4019.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-ipq6018.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-ipq8064.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-ipq8074.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-mdm9607.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-mdm9615.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8660.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8909.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8916.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8953.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8974.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8976.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8994.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8996.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-msm8998.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-qcm2290.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-qcs404.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sc7180.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sc7280.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sc8180x.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sc8280xp.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sdm660.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sdm845.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sdx55.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sdx65.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sm6115.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sm6125.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sm6350.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sm8150.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sm8250.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sm8350.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc-sm8450.yaml +f:Documentation/devicetree/bindings/clock/qcom,gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,gpucc-sdm660.yaml +f:Documentation/devicetree/bindings/clock/qcom,gpucc.yaml +f:Documentation/devicetree/bindings/clock/qcom,hfpll.yaml +f:Documentation/devicetree/bindings/clock/qcom,ipq5018-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,ipq5332-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,ipq9574-cmn-pll.yaml +f:Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,ipq9574-nsscc.yaml +f:Documentation/devicetree/bindings/clock/qcom,kpss-acc-v1.yaml +f:Documentation/devicetree/bindings/clock/qcom,kpss-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,krait-cc.yaml +f:Documentation/devicetree/bindings/clock/qcom,lcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,milos-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,milos-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,milos-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,milos-videocc.yaml +f:Documentation/devicetree/bindings/clock/qcom,mmcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,msm8996-apcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,msm8996-cbf.yaml +f:Documentation/devicetree/bindings/clock/qcom,msm8998-gpucc.yaml +f:Documentation/devicetree/bindings/clock/qcom,q6sstopcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qca8k-nsscc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qcm2290-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qcm2290-gpucc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qcs404-turingcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qcs615-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qcs615-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qcs615-gpucc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qcs615-videocc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qcs8300-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qdu1000-ecpricc.yaml +f:Documentation/devicetree/bindings/clock/qcom,qdu1000-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,rpmcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sa8775p-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sa8775p-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sa8775p-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sa8775p-videocc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sar2130p-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc7180-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc7180-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc7180-lpasscorecc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc7280-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc7280-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscorecc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc8180x-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sc8280xp-lpasscc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sdm845-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sdm845-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sdm845-lpasscc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sdx75-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm4450-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm4450-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm4450-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm6115-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm6115-gpucc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm6115-lpasscc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm6125-gpucc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm6350-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm6375-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm6375-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm6375-gpucc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm7150-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm7150-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm7150-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm7150-videocc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8150-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8350-videocc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8450-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8450-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8450-gpucc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8450-videocc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8550-dispcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8550-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8550-tcsr.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8650-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,sm8750-gcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,spmi-clkdiv.yaml +f:Documentation/devicetree/bindings/clock/qcom,videocc.yaml +f:Documentation/devicetree/bindings/clock/qcom,x1e80100-camcc.yaml +f:Documentation/devicetree/bindings/clock/qcom,x1e80100-gcc.yaml +f:Documentation/devicetree/bindings/clock/raspberrypi,rp1-clocks.yaml +f:Documentation/devicetree/bindings/clock/renesas,5p35023.yaml +f:Documentation/devicetree/bindings/clock/renesas,9series.yaml +f:Documentation/devicetree/bindings/clock/renesas,cpg-clocks.yaml +f:Documentation/devicetree/bindings/clock/renesas,cpg-div6-clock.yaml +f:Documentation/devicetree/bindings/clock/renesas,cpg-mssr.yaml +f:Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.yaml +f:Documentation/devicetree/bindings/clock/renesas,emev2-smu.yaml +f:Documentation/devicetree/bindings/clock/renesas,r9a06g032-sysctrl.yaml +f:Documentation/devicetree/bindings/clock/renesas,r9a08g045-vbattb.yaml +f:Documentation/devicetree/bindings/clock/renesas,rcar-usb2-clock-sel.yaml +f:Documentation/devicetree/bindings/clock/renesas,rzg2l-cpg.yaml +f:Documentation/devicetree/bindings/clock/renesas,rzv2h-cpg.yaml +f:Documentation/devicetree/bindings/clock/renesas,versaclock7.yaml +f:Documentation/devicetree/bindings/clock/rockchip,px30-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3036-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3128-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3188-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3228-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3288-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3308-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3328-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3368-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3528-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3562-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3568-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3576-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rk3588-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rv1108-cru.yaml +f:Documentation/devicetree/bindings/clock/rockchip,rv1126-cru.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos-audss-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos-ext-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos2200-cmu.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos4412-isp-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos5260-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos5410-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos5433-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos7-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos7870-cmu.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos7885-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos850-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos8895-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynos990-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynosautov9-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,exynosautov920-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,s2mps11.yaml +f:Documentation/devicetree/bindings/clock/samsung,s3c6400-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,s5pv210-audss-clock.yaml +f:Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.yaml +f:Documentation/devicetree/bindings/clock/sifive/fu540-prci.yaml +f:Documentation/devicetree/bindings/clock/sifive/fu740-prci.yaml +f:Documentation/devicetree/bindings/clock/silabs,si514.txt +f:Documentation/devicetree/bindings/clock/silabs,si5341.txt +f:Documentation/devicetree/bindings/clock/silabs,si5351.yaml +f:Documentation/devicetree/bindings/clock/silabs,si544.txt +f:Documentation/devicetree/bindings/clock/silabs,si570.txt +f:Documentation/devicetree/bindings/clock/skyworks,si521xx.yaml +f:Documentation/devicetree/bindings/clock/snps,hsdk-pll-clock.txt +f:Documentation/devicetree/bindings/clock/snps,pll-clock.txt +f:Documentation/devicetree/bindings/clock/socionext,uniphier-clock.yaml +f:Documentation/devicetree/bindings/clock/sophgo,cv1800-clk.yaml +f:Documentation/devicetree/bindings/clock/sophgo,sg2042-clkgen.yaml +f:Documentation/devicetree/bindings/clock/sophgo,sg2042-pll.yaml +f:Documentation/devicetree/bindings/clock/sophgo,sg2042-rpgate.yaml +f:Documentation/devicetree/bindings/clock/sophgo,sg2044-clk.yaml +f:Documentation/devicetree/bindings/clock/spacemit,k1-pll.yaml +f:Documentation/devicetree/bindings/clock/sprd,sc9860-clk.yaml +f:Documentation/devicetree/bindings/clock/sprd,sc9863a-clk.yaml +f:Documentation/devicetree/bindings/clock/sprd,ums512-clk.yaml +f:Documentation/devicetree/bindings/clock/st,nomadik.txt +f:Documentation/devicetree/bindings/clock/st,stm32-rcc.yaml +f:Documentation/devicetree/bindings/clock/st,stm32mp1-rcc.yaml +f:Documentation/devicetree/bindings/clock/st,stm32mp25-rcc.yaml +f:Documentation/devicetree/bindings/clock/st/st,clkgen-mux.txt +f:Documentation/devicetree/bindings/clock/st/st,clkgen-pll.txt +f:Documentation/devicetree/bindings/clock/st/st,clkgen.txt +f:Documentation/devicetree/bindings/clock/st/st,flexgen.txt +f:Documentation/devicetree/bindings/clock/st/st,quadfs.txt +f:Documentation/devicetree/bindings/clock/starfive,jh7100-audclk.yaml +f:Documentation/devicetree/bindings/clock/starfive,jh7100-clkgen.yaml +f:Documentation/devicetree/bindings/clock/starfive,jh7110-aoncrg.yaml +f:Documentation/devicetree/bindings/clock/starfive,jh7110-ispcrg.yaml +f:Documentation/devicetree/bindings/clock/starfive,jh7110-pll.yaml +f:Documentation/devicetree/bindings/clock/starfive,jh7110-stgcrg.yaml +f:Documentation/devicetree/bindings/clock/starfive,jh7110-syscrg.yaml +f:Documentation/devicetree/bindings/clock/starfive,jh7110-voutcrg.yaml +f:Documentation/devicetree/bindings/clock/stericsson,u8500-clks.yaml +f:Documentation/devicetree/bindings/clock/sunplus,sp7021-clkc.yaml +f:Documentation/devicetree/bindings/clock/tesla,fsd-clock.yaml +f:Documentation/devicetree/bindings/clock/thead,th1520-clk-ap.yaml +f:Documentation/devicetree/bindings/clock/ti,am62-audio-refclk.yaml +f:Documentation/devicetree/bindings/clock/ti,am654-ehrpwm-tbclk.yaml +f:Documentation/devicetree/bindings/clock/ti,cdce706.txt +f:Documentation/devicetree/bindings/clock/ti,cdce925.yaml +f:Documentation/devicetree/bindings/clock/ti,clkctrl.yaml +f:Documentation/devicetree/bindings/clock/ti,lmk04832.yaml +f:Documentation/devicetree/bindings/clock/ti,sci-clk.yaml +f:Documentation/devicetree/bindings/clock/ti/adpll.txt +f:Documentation/devicetree/bindings/clock/ti/apll.txt +f:Documentation/devicetree/bindings/clock/ti/clockdomain.txt +f:Documentation/devicetree/bindings/clock/ti/davinci/da8xx-cfgchip.txt +f:Documentation/devicetree/bindings/clock/ti/davinci/pll.txt +f:Documentation/devicetree/bindings/clock/ti/davinci/psc.txt +f:Documentation/devicetree/bindings/clock/ti/dpll.txt +f:Documentation/devicetree/bindings/clock/ti/dra7-atl.txt +f:Documentation/devicetree/bindings/clock/ti/fapll.txt +f:Documentation/devicetree/bindings/clock/ti/ti,autoidle.yaml +f:Documentation/devicetree/bindings/clock/ti/ti,clksel.yaml +f:Documentation/devicetree/bindings/clock/ti/ti,composite-clock.yaml +f:Documentation/devicetree/bindings/clock/ti/ti,divider-clock.yaml +f:Documentation/devicetree/bindings/clock/ti/ti,fixed-factor-clock.yaml +f:Documentation/devicetree/bindings/clock/ti/ti,gate-clock.yaml +f:Documentation/devicetree/bindings/clock/ti/ti,interface-clock.yaml +f:Documentation/devicetree/bindings/clock/ti/ti,mux-clock.yaml +f:Documentation/devicetree/bindings/clock/toshiba,tmpv770x-pipllct.yaml +f:Documentation/devicetree/bindings/clock/toshiba,tmpv770x-pismu.yaml +f:Documentation/devicetree/bindings/clock/vt8500.txt +f:Documentation/devicetree/bindings/clock/xlnx,clocking-wizard.yaml +f:Documentation/devicetree/bindings/clock/xlnx,vcu.yaml +f:Documentation/devicetree/bindings/clock/xlnx,versal-clk.yaml +f:Documentation/devicetree/bindings/clock/zynq-7000.txt +f:Documentation/devicetree/bindings/common-properties.txt +f:Documentation/devicetree/bindings/connector/gocontroll,moduline-module-slot.yaml +f:Documentation/devicetree/bindings/connector/usb-connector.yaml +f:Documentation/devicetree/bindings/counter/fsl,ftm-quaddec.yaml +f:Documentation/devicetree/bindings/counter/interrupt-counter.yaml +f:Documentation/devicetree/bindings/counter/ti,am62-ecap-capture.yaml +f:Documentation/devicetree/bindings/counter/ti-eqep.yaml +f:Documentation/devicetree/bindings/cpu/cpu-capacity.txt +f:Documentation/devicetree/bindings/cpu/idle-states.yaml +f:Documentation/devicetree/bindings/cpufreq/airoha,en7581-cpufreq.yaml +f:Documentation/devicetree/bindings/cpufreq/apple,cluster-cpufreq.yaml +f:Documentation/devicetree/bindings/cpufreq/brcm,stb-avs-cpu-freq.txt +f:Documentation/devicetree/bindings/cpufreq/cpufreq-dt.txt +f:Documentation/devicetree/bindings/cpufreq/cpufreq-mediatek-hw.yaml +f:Documentation/devicetree/bindings/cpufreq/cpufreq-qcom-hw.yaml +f:Documentation/devicetree/bindings/cpufreq/cpufreq-spear.txt +f:Documentation/devicetree/bindings/cpufreq/cpufreq-st.txt +f:Documentation/devicetree/bindings/cpufreq/imx-cpufreq-dt.txt +f:Documentation/devicetree/bindings/cpufreq/nvidia,tegra124-cpufreq.txt +f:Documentation/devicetree/bindings/cpufreq/nvidia,tegra20-cpufreq.txt +f:Documentation/devicetree/bindings/cpufreq/qcom-cpufreq-nvmem.yaml +f:Documentation/devicetree/bindings/cpufreq/qemu,virtual-cpufreq.yaml +f:Documentation/devicetree/bindings/crypto/allwinner,sun4i-a10-crypto.yaml +f:Documentation/devicetree/bindings/crypto/allwinner,sun8i-ce.yaml +f:Documentation/devicetree/bindings/crypto/allwinner,sun8i-ss.yaml +f:Documentation/devicetree/bindings/crypto/amd,ccp-seattle-v1a.yaml +f:Documentation/devicetree/bindings/crypto/amlogic,gxl-crypto.yaml +f:Documentation/devicetree/bindings/crypto/arm,cryptocell.yaml +f:Documentation/devicetree/bindings/crypto/aspeed,ast2500-hace.yaml +f:Documentation/devicetree/bindings/crypto/aspeed,ast2600-acry.yaml +f:Documentation/devicetree/bindings/crypto/atmel,at91sam9g46-aes.yaml +f:Documentation/devicetree/bindings/crypto/atmel,at91sam9g46-sha.yaml +f:Documentation/devicetree/bindings/crypto/atmel,at91sam9g46-tdes.yaml +f:Documentation/devicetree/bindings/crypto/axis,artpec6-crypto.yaml +f:Documentation/devicetree/bindings/crypto/brcm,spum-crypto.yaml +f:Documentation/devicetree/bindings/crypto/cortina,sl3516-crypto.yaml +f:Documentation/devicetree/bindings/crypto/fsl,sec-v4.0-mon.yaml +f:Documentation/devicetree/bindings/crypto/fsl,sec-v4.0.yaml +f:Documentation/devicetree/bindings/crypto/fsl,sec2.0.yaml +f:Documentation/devicetree/bindings/crypto/fsl-dcp.yaml +f:Documentation/devicetree/bindings/crypto/fsl-imx-sahara.yaml +f:Documentation/devicetree/bindings/crypto/fsl-imx-scc.yaml +f:Documentation/devicetree/bindings/crypto/hisilicon,hip06-sec.yaml +f:Documentation/devicetree/bindings/crypto/img,hash-accelerator.yaml +f:Documentation/devicetree/bindings/crypto/inside-secure,safexcel-eip93.yaml +f:Documentation/devicetree/bindings/crypto/inside-secure,safexcel.yaml +f:Documentation/devicetree/bindings/crypto/intel,ixp4xx-crypto.yaml +f:Documentation/devicetree/bindings/crypto/intel,keembay-ocs-aes.yaml +f:Documentation/devicetree/bindings/crypto/intel,keembay-ocs-ecc.yaml +f:Documentation/devicetree/bindings/crypto/intel,keembay-ocs-hcu.yaml +f:Documentation/devicetree/bindings/crypto/marvell,orion-crypto.yaml +f:Documentation/devicetree/bindings/crypto/nvidia,tegra234-se-aes.yaml +f:Documentation/devicetree/bindings/crypto/nvidia,tegra234-se-hash.yaml +f:Documentation/devicetree/bindings/crypto/qcom,inline-crypto-engine.yaml +f:Documentation/devicetree/bindings/crypto/qcom,prng.yaml +f:Documentation/devicetree/bindings/crypto/qcom-qce.yaml +f:Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml +f:Documentation/devicetree/bindings/crypto/samsung-slimsss.yaml +f:Documentation/devicetree/bindings/crypto/samsung-sss.yaml +f:Documentation/devicetree/bindings/crypto/st,stm32-crc.yaml +f:Documentation/devicetree/bindings/crypto/st,stm32-cryp.yaml +f:Documentation/devicetree/bindings/crypto/st,stm32-hash.yaml +f:Documentation/devicetree/bindings/crypto/starfive,jh7110-crypto.yaml +f:Documentation/devicetree/bindings/crypto/ti,omap-sham.yaml +f:Documentation/devicetree/bindings/crypto/ti,omap2-aes.yaml +f:Documentation/devicetree/bindings/crypto/ti,omap4-des.yaml +f:Documentation/devicetree/bindings/crypto/ti,sa2ul.yaml +f:Documentation/devicetree/bindings/crypto/xlnx,zynqmp-aes.yaml +f:Documentation/devicetree/bindings/csky/cpus.txt +f:Documentation/devicetree/bindings/csky/pmu.txt +f:Documentation/devicetree/bindings/devfreq/event/rockchip,dfi.yaml +f:Documentation/devicetree/bindings/devfreq/event/samsung,exynos-nocp.yaml +f:Documentation/devicetree/bindings/devfreq/event/samsung,exynos-ppmu.yaml +f:Documentation/devicetree/bindings/devfreq/nvidia,tegra30-actmon.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun4i-a10-display-backend.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun4i-a10-display-engine.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun4i-a10-display-frontend.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun4i-a10-hdmi.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun4i-a10-tcon.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun4i-a10-tv-encoder.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun6i-a31-drc.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun6i-a31-mipi-dsi.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun8i-a83t-de2-mixer.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun8i-a83t-dw-hdmi.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun8i-a83t-hdmi-phy.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun8i-r40-tcon-top.yaml +f:Documentation/devicetree/bindings/display/allwinner,sun9i-a80-deu.yaml +f:Documentation/devicetree/bindings/display/amlogic,meson-dw-hdmi.yaml +f:Documentation/devicetree/bindings/display/amlogic,meson-g12a-dw-mipi-dsi.yaml +f:Documentation/devicetree/bindings/display/amlogic,meson-vpu.yaml +f:Documentation/devicetree/bindings/display/apple,h7-display-pipe-mipi.yaml +f:Documentation/devicetree/bindings/display/apple,h7-display-pipe.yaml +f:Documentation/devicetree/bindings/display/arm,hdlcd.yaml +f:Documentation/devicetree/bindings/display/arm,komeda.yaml +f:Documentation/devicetree/bindings/display/arm,malidp.yaml +f:Documentation/devicetree/bindings/display/arm,pl11x.yaml +f:Documentation/devicetree/bindings/display/armada/marvell,dove-lcd.txt +f:Documentation/devicetree/bindings/display/atmel,lcdc-display.yaml +f:Documentation/devicetree/bindings/display/atmel,lcdc.yaml +f:Documentation/devicetree/bindings/display/atmel/atmel,hlcdc-display-controller.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-dpi.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-dsi0.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-hdmi.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-hvs.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-pixelvalve0.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-txp.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-v3d.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml +f:Documentation/devicetree/bindings/display/brcm,bcm2835-vec.yaml +f:Documentation/devicetree/bindings/display/bridge/adi,adv7511.yaml +f:Documentation/devicetree/bindings/display/bridge/adi,adv7533.yaml +f:Documentation/devicetree/bindings/display/bridge/analogix,anx7625.yaml +f:Documentation/devicetree/bindings/display/bridge/analogix,anx7814.yaml +f:Documentation/devicetree/bindings/display/bridge/analogix,dp.yaml +f:Documentation/devicetree/bindings/display/bridge/anx6345.yaml +f:Documentation/devicetree/bindings/display/bridge/cdns,dsi.yaml +f:Documentation/devicetree/bindings/display/bridge/cdns,mhdp8546.yaml +f:Documentation/devicetree/bindings/display/bridge/chipone,icn6211.yaml +f:Documentation/devicetree/bindings/display/bridge/chrontel,ch7033.yaml +f:Documentation/devicetree/bindings/display/bridge/fsl,imx8mp-hdmi-tx.yaml +f:Documentation/devicetree/bindings/display/bridge/fsl,imx8qxp-ldb.yaml +f:Documentation/devicetree/bindings/display/bridge/fsl,imx8qxp-pixel-combiner.yaml +f:Documentation/devicetree/bindings/display/bridge/fsl,imx8qxp-pixel-link.yaml +f:Documentation/devicetree/bindings/display/bridge/fsl,imx8qxp-pxl2dpi.yaml +f:Documentation/devicetree/bindings/display/bridge/fsl,imx93-mipi-dsi.yaml +f:Documentation/devicetree/bindings/display/bridge/fsl,ldb.yaml +f:Documentation/devicetree/bindings/display/bridge/google,cros-ec-anx7688.yaml +f:Documentation/devicetree/bindings/display/bridge/ingenic,jz4780-hdmi.yaml +f:Documentation/devicetree/bindings/display/bridge/intel,keembay-dsi.yaml +f:Documentation/devicetree/bindings/display/bridge/ite,it6263.yaml +f:Documentation/devicetree/bindings/display/bridge/ite,it6505.yaml +f:Documentation/devicetree/bindings/display/bridge/ite,it66121.yaml +f:Documentation/devicetree/bindings/display/bridge/lontium,lt8912b.yaml +f:Documentation/devicetree/bindings/display/bridge/lontium,lt9211.yaml +f:Documentation/devicetree/bindings/display/bridge/lontium,lt9611.yaml +f:Documentation/devicetree/bindings/display/bridge/lvds-codec.yaml +f:Documentation/devicetree/bindings/display/bridge/megachips-stdpxxxx-ge-b850v3-fw.txt +f:Documentation/devicetree/bindings/display/bridge/microchip,sam9x75-lvds.yaml +f:Documentation/devicetree/bindings/display/bridge/nwl-dsi.yaml +f:Documentation/devicetree/bindings/display/bridge/nxp,ptn3460.yaml +f:Documentation/devicetree/bindings/display/bridge/nxp,tda998x.yaml +f:Documentation/devicetree/bindings/display/bridge/parade,ps8622.yaml +f:Documentation/devicetree/bindings/display/bridge/ps8640.yaml +f:Documentation/devicetree/bindings/display/bridge/renesas,dsi-csi2-tx.yaml +f:Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml +f:Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.yaml +f:Documentation/devicetree/bindings/display/bridge/renesas,lvds.yaml +f:Documentation/devicetree/bindings/display/bridge/samsung,mipi-dsim.yaml +f:Documentation/devicetree/bindings/display/bridge/sil,sii8620.yaml +f:Documentation/devicetree/bindings/display/bridge/sil,sii9022.yaml +f:Documentation/devicetree/bindings/display/bridge/sil,sii9234.yaml +f:Documentation/devicetree/bindings/display/bridge/simple-bridge.yaml +f:Documentation/devicetree/bindings/display/bridge/snps,dw-mipi-dsi.yaml +f:Documentation/devicetree/bindings/display/bridge/synopsys,dw-hdmi.yaml +f:Documentation/devicetree/bindings/display/bridge/thine,thc63lvd1024.yaml +f:Documentation/devicetree/bindings/display/bridge/ti,dlpc3433.yaml +f:Documentation/devicetree/bindings/display/bridge/ti,sn65dsi83.yaml +f:Documentation/devicetree/bindings/display/bridge/ti,sn65dsi86.yaml +f:Documentation/devicetree/bindings/display/bridge/ti,tdp158.yaml +f:Documentation/devicetree/bindings/display/bridge/ti,tfp410.yaml +f:Documentation/devicetree/bindings/display/bridge/toshiba,tc358762.yaml +f:Documentation/devicetree/bindings/display/bridge/toshiba,tc358764.yaml +f:Documentation/devicetree/bindings/display/bridge/toshiba,tc358767.yaml +f:Documentation/devicetree/bindings/display/bridge/toshiba,tc358768.yaml +f:Documentation/devicetree/bindings/display/bridge/toshiba,tc358775.yaml +f:Documentation/devicetree/bindings/display/cirrus,clps711x-fb.txt +f:Documentation/devicetree/bindings/display/connector/analog-tv-connector.yaml +f:Documentation/devicetree/bindings/display/connector/dp-connector.yaml +f:Documentation/devicetree/bindings/display/connector/dvi-connector.yaml +f:Documentation/devicetree/bindings/display/connector/hdmi-connector.yaml +f:Documentation/devicetree/bindings/display/connector/vga-connector.yaml +f:Documentation/devicetree/bindings/display/dp-aux-bus.yaml +f:Documentation/devicetree/bindings/display/dsi-controller.yaml +f:Documentation/devicetree/bindings/display/elgin,jg10309-01.yaml +f:Documentation/devicetree/bindings/display/faraday,tve200.yaml +f:Documentation/devicetree/bindings/display/fsl,lcdif.yaml +f:Documentation/devicetree/bindings/display/fsl,ls1021a-dcu.yaml +f:Documentation/devicetree/bindings/display/fsl,vf610-tcon.yaml +f:Documentation/devicetree/bindings/display/google,goldfish-fb.txt +f:Documentation/devicetree/bindings/display/himax,hx8357.yaml +f:Documentation/devicetree/bindings/display/hisilicon/dw-dsi.txt +f:Documentation/devicetree/bindings/display/hisilicon/hisi-ade.txt +f:Documentation/devicetree/bindings/display/ilitek,ili9225.txt +f:Documentation/devicetree/bindings/display/ilitek,ili9486.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx-display-subsystem.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx-lcdc.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx-parallel-display.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx6-hdmi.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx6q-ipu.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx6q-ldb.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx6qp-pre.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx6qp-prg.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8mp-hdmi-pvi.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-axi-performance-counter.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-blit-engine.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-blitblend.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-clut.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-command-sequencer.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-constframe.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-display-engine.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-dither.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-extdst.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-fetchunit.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-filter.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-framegen.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-gammacor.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-layerblend.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-matrix.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-pixel-engine.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-rop.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-safety.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-scaling-engine.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-signature.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-store.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc-tcon.yaml +f:Documentation/devicetree/bindings/display/imx/fsl,imx8qxp-dc.yaml +f:Documentation/devicetree/bindings/display/imx/nxp,imx8mq-dcss.yaml +f:Documentation/devicetree/bindings/display/ingenic,ipu.yaml +f:Documentation/devicetree/bindings/display/ingenic,lcd.yaml +f:Documentation/devicetree/bindings/display/intel,keembay-display.yaml +f:Documentation/devicetree/bindings/display/intel,keembay-msscam.yaml +f:Documentation/devicetree/bindings/display/lvds-data-mapping.yaml +f:Documentation/devicetree/bindings/display/lvds-dual-ports.yaml +f:Documentation/devicetree/bindings/display/lvds.yaml +f:Documentation/devicetree/bindings/display/marvell,pxa2xx-lcdc.txt +f:Documentation/devicetree/bindings/display/marvell,pxa300-gcu.txt +f:Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,cec.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,dp.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,hdmi-ddc.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,hdmi.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,mt8195-hdmi-ddc.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,mt8195-hdmi.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,padding.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml +f:Documentation/devicetree/bindings/display/mediatek/mediatek,wdma.yaml +f:Documentation/devicetree/bindings/display/mipi-dsi-bus.txt +f:Documentation/devicetree/bindings/display/msm/dp-controller.yaml +f:Documentation/devicetree/bindings/display/msm/dpu-common.yaml +f:Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml +f:Documentation/devicetree/bindings/display/msm/dsi-phy-10nm.yaml +f:Documentation/devicetree/bindings/display/msm/dsi-phy-14nm.yaml +f:Documentation/devicetree/bindings/display/msm/dsi-phy-20nm.yaml +f:Documentation/devicetree/bindings/display/msm/dsi-phy-28nm.yaml +f:Documentation/devicetree/bindings/display/msm/dsi-phy-7nm.yaml +f:Documentation/devicetree/bindings/display/msm/dsi-phy-common.yaml +f:Documentation/devicetree/bindings/display/msm/gmu.yaml +f:Documentation/devicetree/bindings/display/msm/gpu.yaml +f:Documentation/devicetree/bindings/display/msm/hdmi.yaml +f:Documentation/devicetree/bindings/display/msm/mdp4.yaml +f:Documentation/devicetree/bindings/display/msm/mdss-common.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,mdp5.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,msm8998-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,msm8998-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,qcm2290-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,qcm2290-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sa8775p-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sar2130p-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sc7180-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sc7180-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sc7280-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sc7280-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sc8280xp-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sdm670-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sdm845-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sdm845-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm6115-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm6115-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm6125-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm6150-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm6150-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm6350-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm6375-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm7150-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm7150-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8150-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8150-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8250-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8350-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8450-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8550-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8650-dpu.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8650-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,sm8750-mdss.yaml +f:Documentation/devicetree/bindings/display/msm/qcom,x1e80100-mdss.yaml +f:Documentation/devicetree/bindings/display/multi-inno,mi0283qt.txt +f:Documentation/devicetree/bindings/display/panel/abt,y030xx067a.yaml +f:Documentation/devicetree/bindings/display/panel/advantech,idk-1110wr.yaml +f:Documentation/devicetree/bindings/display/panel/advantech,idk-2121wr.yaml +f:Documentation/devicetree/bindings/display/panel/anbernic,rg35xx-plus-panel.yaml +f:Documentation/devicetree/bindings/display/panel/apple,summit.yaml +f:Documentation/devicetree/bindings/display/panel/arm,rtsm-display.yaml +f:Documentation/devicetree/bindings/display/panel/arm,versatile-tft-panel.yaml +f:Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.yaml +f:Documentation/devicetree/bindings/display/panel/asus,z00t-tm5p5-nt35596.yaml +f:Documentation/devicetree/bindings/display/panel/auo,a030jtn01.yaml +f:Documentation/devicetree/bindings/display/panel/bananapi,s070wv20-ct16.yaml +f:Documentation/devicetree/bindings/display/panel/boe,bf060y8m-aj0.yaml +f:Documentation/devicetree/bindings/display/panel/boe,himax8279d.yaml +f:Documentation/devicetree/bindings/display/panel/boe,td4320.yaml +f:Documentation/devicetree/bindings/display/panel/boe,th101mb31ig002-28a.yaml +f:Documentation/devicetree/bindings/display/panel/boe,tv101wum-ll2.yaml +f:Documentation/devicetree/bindings/display/panel/boe,tv101wum-nl6.yaml +f:Documentation/devicetree/bindings/display/panel/display-timing.txt +f:Documentation/devicetree/bindings/display/panel/display-timings.yaml +f:Documentation/devicetree/bindings/display/panel/dlc,dlc0700yzg-1.yaml +f:Documentation/devicetree/bindings/display/panel/ebbg,ft8719.yaml +f:Documentation/devicetree/bindings/display/panel/elida,kd35t133.yaml +f:Documentation/devicetree/bindings/display/panel/fascontek,fs035vg158.yaml +f:Documentation/devicetree/bindings/display/panel/feixin,k101-im2ba02.yaml +f:Documentation/devicetree/bindings/display/panel/feiyang,fy07024di26a30d.yaml +f:Documentation/devicetree/bindings/display/panel/focaltech,gpt3.yaml +f:Documentation/devicetree/bindings/display/panel/himax,hx8279.yaml +f:Documentation/devicetree/bindings/display/panel/himax,hx83102.yaml +f:Documentation/devicetree/bindings/display/panel/himax,hx83112a.yaml +f:Documentation/devicetree/bindings/display/panel/himax,hx83112b.yaml +f:Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml +f:Documentation/devicetree/bindings/display/panel/ilitek,ili9163.yaml +f:Documentation/devicetree/bindings/display/panel/ilitek,ili9322.yaml +f:Documentation/devicetree/bindings/display/panel/ilitek,ili9341.yaml +f:Documentation/devicetree/bindings/display/panel/ilitek,ili9805.yaml +f:Documentation/devicetree/bindings/display/panel/ilitek,ili9806e.yaml +f:Documentation/devicetree/bindings/display/panel/ilitek,ili9881c.yaml +f:Documentation/devicetree/bindings/display/panel/innolux,ee101ia-01d.yaml +f:Documentation/devicetree/bindings/display/panel/innolux,ej030na.yaml +f:Documentation/devicetree/bindings/display/panel/innolux,p097pfg.yaml +f:Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml +f:Documentation/devicetree/bindings/display/panel/jdi,lpm102a188a.yaml +f:Documentation/devicetree/bindings/display/panel/jdi,lt070me05000.yaml +f:Documentation/devicetree/bindings/display/panel/kingdisplay,kd035g6-54nt.yaml +f:Documentation/devicetree/bindings/display/panel/leadtek,ltk035c5444t.yaml +f:Documentation/devicetree/bindings/display/panel/leadtek,ltk050h3146w.yaml +f:Documentation/devicetree/bindings/display/panel/leadtek,ltk500hd1829.yaml +f:Documentation/devicetree/bindings/display/panel/lg,lg4573.yaml +f:Documentation/devicetree/bindings/display/panel/lg,sw43408.yaml +f:Documentation/devicetree/bindings/display/panel/lgphilips,lb035q02.yaml +f:Documentation/devicetree/bindings/display/panel/logicpd,type28.yaml +f:Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml +f:Documentation/devicetree/bindings/display/panel/mitsubishi,aa104xd12.yaml +f:Documentation/devicetree/bindings/display/panel/mitsubishi,aa121td01.yaml +f:Documentation/devicetree/bindings/display/panel/nec,nl8048hl11.yaml +f:Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml +f:Documentation/devicetree/bindings/display/panel/novatek,nt35510.yaml +f:Documentation/devicetree/bindings/display/panel/novatek,nt35950.yaml +f:Documentation/devicetree/bindings/display/panel/novatek,nt36523.yaml +f:Documentation/devicetree/bindings/display/panel/novatek,nt36672a.yaml +f:Documentation/devicetree/bindings/display/panel/novatek,nt36672e.yaml +f:Documentation/devicetree/bindings/display/panel/novatek,nt37801.yaml +f:Documentation/devicetree/bindings/display/panel/olimex,lcd-olinuxino.yaml +f:Documentation/devicetree/bindings/display/panel/orisetech,otm8009a.yaml +f:Documentation/devicetree/bindings/display/panel/panel-common-dual.yaml +f:Documentation/devicetree/bindings/display/panel/panel-common.yaml +f:Documentation/devicetree/bindings/display/panel/panel-dpi.yaml +f:Documentation/devicetree/bindings/display/panel/panel-dsi-cm.yaml +f:Documentation/devicetree/bindings/display/panel/panel-edp-legacy.yaml +f:Documentation/devicetree/bindings/display/panel/panel-edp.yaml +f:Documentation/devicetree/bindings/display/panel/panel-lvds.yaml +f:Documentation/devicetree/bindings/display/panel/panel-mipi-dbi-spi.yaml +f:Documentation/devicetree/bindings/display/panel/panel-simple-dsi.yaml +f:Documentation/devicetree/bindings/display/panel/panel-simple-lvds-dual-ports.yaml +f:Documentation/devicetree/bindings/display/panel/panel-simple.yaml +f:Documentation/devicetree/bindings/display/panel/panel-timing.yaml +f:Documentation/devicetree/bindings/display/panel/pda,91-00156-a0.yaml +f:Documentation/devicetree/bindings/display/panel/powertip,hx8238a.yaml +f:Documentation/devicetree/bindings/display/panel/powertip,st7272.yaml +f:Documentation/devicetree/bindings/display/panel/raspberrypi,7inch-touchscreen.yaml +f:Documentation/devicetree/bindings/display/panel/raydium,rm67191.yaml +f:Documentation/devicetree/bindings/display/panel/raydium,rm67200.yaml +f:Documentation/devicetree/bindings/display/panel/raydium,rm68200.yaml +f:Documentation/devicetree/bindings/display/panel/raydium,rm692e5.yaml +f:Documentation/devicetree/bindings/display/panel/raydium,rm69380.yaml +f:Documentation/devicetree/bindings/display/panel/renesas,r61307.yaml +f:Documentation/devicetree/bindings/display/panel/renesas,r69328.yaml +f:Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml +f:Documentation/devicetree/bindings/display/panel/ronbo,rb070d30.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,amoled-mipi-dsi.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,ams495qa01.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,ams581vf01.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,ams639rq08.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,atna33xc20.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,ld9040.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,lms380kf01.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,lms397kf04.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,s6d16d0.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,s6d27a1.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,s6d7aa0.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,s6e63m0.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams452ef01.yaml +f:Documentation/devicetree/bindings/display/panel/samsung,s6e8aa0.yaml +f:Documentation/devicetree/bindings/display/panel/seiko,43wvf1g.yaml +f:Documentation/devicetree/bindings/display/panel/sgd,gktw70sdae4se.yaml +f:Documentation/devicetree/bindings/display/panel/sharp,lq101r1sx01.yaml +f:Documentation/devicetree/bindings/display/panel/sharp,lq150x1lg11.yaml +f:Documentation/devicetree/bindings/display/panel/sharp,ls037v7dw01.yaml +f:Documentation/devicetree/bindings/display/panel/sharp,ls043t1le01.yaml +f:Documentation/devicetree/bindings/display/panel/sharp,ls060t1sx01.yaml +f:Documentation/devicetree/bindings/display/panel/sitronix,st7701.yaml +f:Documentation/devicetree/bindings/display/panel/sitronix,st7789v.yaml +f:Documentation/devicetree/bindings/display/panel/sony,acx424akp.yaml +f:Documentation/devicetree/bindings/display/panel/sony,acx565akm.yaml +f:Documentation/devicetree/bindings/display/panel/sony,td4353-jdi.yaml +f:Documentation/devicetree/bindings/display/panel/sony,tulip-truly-nt35521.yaml +f:Documentation/devicetree/bindings/display/panel/startek,kd070fhfid015.yaml +f:Documentation/devicetree/bindings/display/panel/startek,startek-kd050c.yaml +f:Documentation/devicetree/bindings/display/panel/synaptics,r63353.yaml +f:Documentation/devicetree/bindings/display/panel/tfc,s9700rtwv43tr-01b.yaml +f:Documentation/devicetree/bindings/display/panel/ti,nspire.yaml +f:Documentation/devicetree/bindings/display/panel/tpo,td.yaml +f:Documentation/devicetree/bindings/display/panel/tpo,tpg110.yaml +f:Documentation/devicetree/bindings/display/panel/truly,nt35597-2K-display.yaml +f:Documentation/devicetree/bindings/display/panel/visionox,g2647fb105.yaml +f:Documentation/devicetree/bindings/display/panel/visionox,r66451.yaml +f:Documentation/devicetree/bindings/display/panel/visionox,rm69299.yaml +f:Documentation/devicetree/bindings/display/panel/visionox,rm692e5.yaml +f:Documentation/devicetree/bindings/display/panel/visionox,vtdr6130.yaml +f:Documentation/devicetree/bindings/display/panel/xinpeng,xpp055c272.yaml +f:Documentation/devicetree/bindings/display/renesas,cmm.yaml +f:Documentation/devicetree/bindings/display/renesas,du.yaml +f:Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml +f:Documentation/devicetree/bindings/display/renesas,shmobile-lcdc.yaml +f:Documentation/devicetree/bindings/display/repaper.txt +f:Documentation/devicetree/bindings/display/rockchip/rockchip,analogix-dp.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip,dw-hdmi.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip,dw-mipi-dsi.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip,inno-hdmi.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip,lvds.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip,rk3066-hdmi.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip,rk3399-cdn-dp.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip,rk3588-dw-hdmi-qp.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip,rk3588-mipi-dsi2.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip-drm.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml +f:Documentation/devicetree/bindings/display/rockchip/rockchip-vop2.yaml +f:Documentation/devicetree/bindings/display/samsung/samsung,exynos-hdmi-ddc.yaml +f:Documentation/devicetree/bindings/display/samsung/samsung,exynos-hdmi.yaml +f:Documentation/devicetree/bindings/display/samsung/samsung,exynos-mixer.yaml +f:Documentation/devicetree/bindings/display/samsung/samsung,exynos5-dp.yaml +f:Documentation/devicetree/bindings/display/samsung/samsung,exynos5433-decon.yaml +f:Documentation/devicetree/bindings/display/samsung/samsung,exynos5433-mic.yaml +f:Documentation/devicetree/bindings/display/samsung/samsung,exynos7-decon.yaml +f:Documentation/devicetree/bindings/display/samsung/samsung,fimd.yaml +f:Documentation/devicetree/bindings/display/sharp,ls010b7dh04.yaml +f:Documentation/devicetree/bindings/display/simple-framebuffer.yaml +f:Documentation/devicetree/bindings/display/sitronix,st7567.yaml +f:Documentation/devicetree/bindings/display/sitronix,st7571.yaml +f:Documentation/devicetree/bindings/display/sitronix,st7586.yaml +f:Documentation/devicetree/bindings/display/sitronix,st7735r.yaml +f:Documentation/devicetree/bindings/display/sm501fb.txt +f:Documentation/devicetree/bindings/display/snps,arcpgu.txt +f:Documentation/devicetree/bindings/display/solomon,ssd-common.yaml +f:Documentation/devicetree/bindings/display/solomon,ssd1307fb.yaml +f:Documentation/devicetree/bindings/display/solomon,ssd132x.yaml +f:Documentation/devicetree/bindings/display/solomon,ssd133x.yaml +f:Documentation/devicetree/bindings/display/sprd/sprd,display-subsystem.yaml +f:Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dpu.yaml +f:Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dsi-host.yaml +f:Documentation/devicetree/bindings/display/ssd1289fb.txt +f:Documentation/devicetree/bindings/display/st,stih4xx.txt +f:Documentation/devicetree/bindings/display/st,stm32-dsi.yaml +f:Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml +f:Documentation/devicetree/bindings/display/st,stm32mp25-lvds.yaml +f:Documentation/devicetree/bindings/display/ste,mcde.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra114-mipi.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra124-dpaux.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra124-sor.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra124-vic.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra186-dc.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra186-display.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra186-dsi-padctl.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-dc.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-dsi.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-epp.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-gr2d.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-gr3d.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-hdmi.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-isp.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-mpe.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-tvo.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-vi.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-vip.yaml +f:Documentation/devicetree/bindings/display/tegra/nvidia,tegra210-csi.yaml +f:Documentation/devicetree/bindings/display/ti/ti,am625-oldi.yaml +f:Documentation/devicetree/bindings/display/ti/ti,am65x-dss.yaml +f:Documentation/devicetree/bindings/display/ti/ti,dra7-dss.txt +f:Documentation/devicetree/bindings/display/ti/ti,j721e-dss.yaml +f:Documentation/devicetree/bindings/display/ti/ti,k2g-dss.yaml +f:Documentation/devicetree/bindings/display/ti/ti,omap-dss.txt +f:Documentation/devicetree/bindings/display/ti/ti,omap2-dss.txt +f:Documentation/devicetree/bindings/display/ti/ti,omap3-dss.txt +f:Documentation/devicetree/bindings/display/ti/ti,omap4-dss.txt +f:Documentation/devicetree/bindings/display/ti/ti,omap5-dss.txt +f:Documentation/devicetree/bindings/display/ti/ti,opa362.txt +f:Documentation/devicetree/bindings/display/ti/ti,tpd12s015.txt +f:Documentation/devicetree/bindings/display/tilcdc/panel.txt +f:Documentation/devicetree/bindings/display/tilcdc/tilcdc.txt +f:Documentation/devicetree/bindings/display/via,vt8500-fb.txt +f:Documentation/devicetree/bindings/display/wm,prizm-ge-rops.txt +f:Documentation/devicetree/bindings/display/wm,wm8505-fb.txt +f:Documentation/devicetree/bindings/display/xlnx/xlnx,zynqmp-dpsub.yaml +f:Documentation/devicetree/bindings/display/xylon,logicvc-display.yaml +f:Documentation/devicetree/bindings/dma/adi,axi-dmac.yaml +f:Documentation/devicetree/bindings/dma/allwinner,sun4i-a10-dma.yaml +f:Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml +f:Documentation/devicetree/bindings/dma/allwinner,sun6i-a31-dma.yaml +f:Documentation/devicetree/bindings/dma/altr,msgdma.yaml +f:Documentation/devicetree/bindings/dma/apm-xgene-dma.txt +f:Documentation/devicetree/bindings/dma/apple,admac.yaml +f:Documentation/devicetree/bindings/dma/arm,dma-350.yaml +f:Documentation/devicetree/bindings/dma/arm,pl330.yaml +f:Documentation/devicetree/bindings/dma/arm-pl08x.yaml +f:Documentation/devicetree/bindings/dma/atmel,at91sam9g45-dma.yaml +f:Documentation/devicetree/bindings/dma/atmel,sama5d4-dma.yaml +f:Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.yaml +f:Documentation/devicetree/bindings/dma/brcm,iproc-sba.txt +f:Documentation/devicetree/bindings/dma/cirrus,ep9301-dma-m2m.yaml +f:Documentation/devicetree/bindings/dma/cirrus,ep9301-dma-m2p.yaml +f:Documentation/devicetree/bindings/dma/dma-common.yaml +f:Documentation/devicetree/bindings/dma/dma-controller.yaml +f:Documentation/devicetree/bindings/dma/dma-router.yaml +f:Documentation/devicetree/bindings/dma/dma.txt +f:Documentation/devicetree/bindings/dma/fsl,edma.yaml +f:Documentation/devicetree/bindings/dma/fsl,elo-dma.yaml +f:Documentation/devicetree/bindings/dma/fsl,elo3-dma.yaml +f:Documentation/devicetree/bindings/dma/fsl,eloplus-dma.yaml +f:Documentation/devicetree/bindings/dma/fsl,imx-dma.yaml +f:Documentation/devicetree/bindings/dma/fsl,imx-sdma.yaml +f:Documentation/devicetree/bindings/dma/fsl,mxs-dma.yaml +f:Documentation/devicetree/bindings/dma/fsl-qdma.yaml +f:Documentation/devicetree/bindings/dma/img-mdc-dma.txt +f:Documentation/devicetree/bindings/dma/ingenic,dma.yaml +f:Documentation/devicetree/bindings/dma/intel,ldma.yaml +f:Documentation/devicetree/bindings/dma/k3dma.txt +f:Documentation/devicetree/bindings/dma/loongson,ls1b-apbdma.yaml +f:Documentation/devicetree/bindings/dma/loongson,ls2x-apbdma.yaml +f:Documentation/devicetree/bindings/dma/marvell,mmp-dma.yaml +f:Documentation/devicetree/bindings/dma/marvell,xor-v2.yaml +f:Documentation/devicetree/bindings/dma/mediatek,mt7622-hsdma.yaml +f:Documentation/devicetree/bindings/dma/mediatek,uart-dma.yaml +f:Documentation/devicetree/bindings/dma/milbeaut-m10v-hdmac.txt +f:Documentation/devicetree/bindings/dma/milbeaut-m10v-xdmac.txt +f:Documentation/devicetree/bindings/dma/moxa,moxart-dma.txt +f:Documentation/devicetree/bindings/dma/mpc512x-dma.txt +f:Documentation/devicetree/bindings/dma/mv-xor.txt +f:Documentation/devicetree/bindings/dma/nvidia,tegra186-gpc-dma.yaml +f:Documentation/devicetree/bindings/dma/nvidia,tegra20-apbdma.yaml +f:Documentation/devicetree/bindings/dma/nvidia,tegra210-adma.yaml +f:Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml +f:Documentation/devicetree/bindings/dma/owl-dma.yaml +f:Documentation/devicetree/bindings/dma/qcom,adm.yaml +f:Documentation/devicetree/bindings/dma/qcom,bam-dma.yaml +f:Documentation/devicetree/bindings/dma/qcom,gpi.yaml +f:Documentation/devicetree/bindings/dma/renesas,nbpfaxi.txt +f:Documentation/devicetree/bindings/dma/renesas,rcar-dmac.yaml +f:Documentation/devicetree/bindings/dma/renesas,rz-dmac.yaml +f:Documentation/devicetree/bindings/dma/renesas,rzn1-dmamux.yaml +f:Documentation/devicetree/bindings/dma/renesas,usb-dmac.yaml +f:Documentation/devicetree/bindings/dma/sifive,fu540-c000-pdma.yaml +f:Documentation/devicetree/bindings/dma/snps,dma-spear1340.yaml +f:Documentation/devicetree/bindings/dma/snps,dw-axi-dmac.yaml +f:Documentation/devicetree/bindings/dma/socionext,uniphier-mio-dmac.yaml +f:Documentation/devicetree/bindings/dma/socionext,uniphier-xdmac.yaml +f:Documentation/devicetree/bindings/dma/sprd,sc9860-dma.yaml +f:Documentation/devicetree/bindings/dma/st_fdma.txt +f:Documentation/devicetree/bindings/dma/stericsson,dma40.yaml +f:Documentation/devicetree/bindings/dma/stm32/st,stm32-dma.yaml +f:Documentation/devicetree/bindings/dma/stm32/st,stm32-dma3.yaml +f:Documentation/devicetree/bindings/dma/stm32/st,stm32-dmamux.yaml +f:Documentation/devicetree/bindings/dma/stm32/st,stm32-mdma.yaml +f:Documentation/devicetree/bindings/dma/ti-dma-crossbar.txt +f:Documentation/devicetree/bindings/dma/ti-edma.txt +f:Documentation/devicetree/bindings/dma/ti/k3-bcdma.yaml +f:Documentation/devicetree/bindings/dma/ti/k3-pktdma.yaml +f:Documentation/devicetree/bindings/dma/ti/k3-udma.yaml +f:Documentation/devicetree/bindings/dma/xilinx/xilinx_dma.txt +f:Documentation/devicetree/bindings/dma/xilinx/xlnx,zynqmp-dma-1.0.yaml +f:Documentation/devicetree/bindings/dma/xilinx/xlnx,zynqmp-dpdma.yaml +f:Documentation/devicetree/bindings/dpll/dpll-device.yaml +f:Documentation/devicetree/bindings/dpll/dpll-pin.yaml +f:Documentation/devicetree/bindings/dpll/microchip,zl30731.yaml +f:Documentation/devicetree/bindings/dsp/fsl,dsp.yaml +f:Documentation/devicetree/bindings/dsp/mediatek,mt8186-dsp.yaml +f:Documentation/devicetree/bindings/dsp/mediatek,mt8195-dsp.yaml +f:Documentation/devicetree/bindings/dts-coding-style.rst +f:Documentation/devicetree/bindings/dvfs/performance-domain.yaml +f:Documentation/devicetree/bindings/edac/altr,socfpga-ecc-manager.yaml +f:Documentation/devicetree/bindings/edac/amazon,al-mc-edac.yaml +f:Documentation/devicetree/bindings/edac/apm-xgene-edac.txt +f:Documentation/devicetree/bindings/edac/aspeed-sdram-edac.txt +f:Documentation/devicetree/bindings/edac/dmc-520.yaml +f:Documentation/devicetree/bindings/eeprom/at24.yaml +f:Documentation/devicetree/bindings/eeprom/at25.yaml +f:Documentation/devicetree/bindings/eeprom/microchip,93lc46b.yaml +f:Documentation/devicetree/bindings/example-schema.yaml +f:Documentation/devicetree/bindings/extcon/extcon-max3355.txt +f:Documentation/devicetree/bindings/extcon/extcon-palmas.txt +f:Documentation/devicetree/bindings/extcon/extcon-ptn5150.yaml +f:Documentation/devicetree/bindings/extcon/extcon-rt8973a.txt +f:Documentation/devicetree/bindings/extcon/extcon-usbc-cros-ec.yaml +f:Documentation/devicetree/bindings/extcon/extcon-usbc-tusb320.yaml +f:Documentation/devicetree/bindings/extcon/fcs,fsa880.yaml +f:Documentation/devicetree/bindings/extcon/linux,extcon-usb-gpio.yaml +f:Documentation/devicetree/bindings/extcon/maxim,max77843.yaml +f:Documentation/devicetree/bindings/extcon/qcom,pm8941-misc.yaml +f:Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml +f:Documentation/devicetree/bindings/extcon/wlf,arizona.yaml +f:Documentation/devicetree/bindings/firmware/amlogic,meson-gxbb-sm.yaml +f:Documentation/devicetree/bindings/firmware/arm,scmi.yaml +f:Documentation/devicetree/bindings/firmware/arm,scpi.yaml +f:Documentation/devicetree/bindings/firmware/brcm,kona-smc.yaml +f:Documentation/devicetree/bindings/firmware/coreboot.txt +f:Documentation/devicetree/bindings/firmware/cznic,turris-mox-rwtm.txt +f:Documentation/devicetree/bindings/firmware/cznic,turris-omnia-mcu.yaml +f:Documentation/devicetree/bindings/firmware/fsl,scu.yaml +f:Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml +f:Documentation/devicetree/bindings/firmware/intel,ixp4xx-network-processing-engine.yaml +f:Documentation/devicetree/bindings/firmware/intel,stratix10-svc.yaml +f:Documentation/devicetree/bindings/firmware/nvidia,tegra186-bpmp.yaml +f:Documentation/devicetree/bindings/firmware/nvidia,tegra210-bpmp.txt +f:Documentation/devicetree/bindings/firmware/nxp,imx95-scmi-pinctrl.yaml +f:Documentation/devicetree/bindings/firmware/nxp,imx95-scmi.yaml +f:Documentation/devicetree/bindings/firmware/qcom,scm.yaml +f:Documentation/devicetree/bindings/firmware/qemu,fw-cfg-mmio.yaml +f:Documentation/devicetree/bindings/firmware/thead,th1520-aon.yaml +f:Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.yaml +f:Documentation/devicetree/bindings/fpga/altera-pr-ip.txt +f:Documentation/devicetree/bindings/fpga/altera-socfpga-a10-fpga-mgr.txt +f:Documentation/devicetree/bindings/fpga/altera-socfpga-fpga-mgr.txt +f:Documentation/devicetree/bindings/fpga/altr,fpga-passive-serial.yaml +f:Documentation/devicetree/bindings/fpga/altr,freeze-bridge-controller.yaml +f:Documentation/devicetree/bindings/fpga/altr,socfpga-fpga2sdram-bridge.yaml +f:Documentation/devicetree/bindings/fpga/altr,socfpga-hps2fpga-bridge.yaml +f:Documentation/devicetree/bindings/fpga/fpga-bridge.yaml +f:Documentation/devicetree/bindings/fpga/fpga-region.yaml +f:Documentation/devicetree/bindings/fpga/intel,stratix10-soc-fpga-mgr.yaml +f:Documentation/devicetree/bindings/fpga/lattice,sysconfig.yaml +f:Documentation/devicetree/bindings/fpga/lattice-ice40-fpga-mgr.txt +f:Documentation/devicetree/bindings/fpga/lattice-machxo2-spi.txt +f:Documentation/devicetree/bindings/fpga/microchip,mpf-spi-fpga-mgr.yaml +f:Documentation/devicetree/bindings/fpga/xilinx-zynq-fpga-mgr.yaml +f:Documentation/devicetree/bindings/fpga/xlnx,fpga-selectmap.yaml +f:Documentation/devicetree/bindings/fpga/xlnx,fpga-slave-serial.yaml +f:Documentation/devicetree/bindings/fpga/xlnx,pr-decoupler.yaml +f:Documentation/devicetree/bindings/fpga/xlnx,versal-fpga.yaml +f:Documentation/devicetree/bindings/fpga/xlnx,zynqmp-pcap-fpga.yaml +f:Documentation/devicetree/bindings/fsi/aspeed,ast2600-fsi-master.yaml +f:Documentation/devicetree/bindings/fsi/fsi-controller.yaml +f:Documentation/devicetree/bindings/fsi/fsi-master-ast-cf.txt +f:Documentation/devicetree/bindings/fsi/fsi-master-gpio.txt +f:Documentation/devicetree/bindings/fsi/fsi.txt +f:Documentation/devicetree/bindings/fsi/ibm,fsi2spi.yaml +f:Documentation/devicetree/bindings/fsi/ibm,i2cr-fsi-master.yaml +f:Documentation/devicetree/bindings/fsi/ibm,p9-fsi-controller.yaml +f:Documentation/devicetree/bindings/fsi/ibm,p9-occ.yaml +f:Documentation/devicetree/bindings/fsi/ibm,p9-sbefifo.yaml +f:Documentation/devicetree/bindings/fsi/ibm,p9-scom.yaml +f:Documentation/devicetree/bindings/fuse/nvidia,tegra20-fuse.yaml +f:Documentation/devicetree/bindings/gnss/brcm,bcm4751.yaml +f:Documentation/devicetree/bindings/gnss/gnss-common.yaml +f:Documentation/devicetree/bindings/gnss/mediatek.yaml +f:Documentation/devicetree/bindings/gnss/sirfstar.yaml +f:Documentation/devicetree/bindings/gnss/u-blox,neo-6m.yaml +f:Documentation/devicetree/bindings/goldfish/audio.txt +f:Documentation/devicetree/bindings/goldfish/battery.txt +f:Documentation/devicetree/bindings/goldfish/events.txt +f:Documentation/devicetree/bindings/goldfish/pipe.txt +f:Documentation/devicetree/bindings/goldfish/tty.txt +f:Documentation/devicetree/bindings/gpio/abilis,tb10x-gpio.yaml +f:Documentation/devicetree/bindings/gpio/adi,ds4520-gpio.yaml +f:Documentation/devicetree/bindings/gpio/airoha,en7523-gpio.yaml +f:Documentation/devicetree/bindings/gpio/altr-pio-1.0.yaml +f:Documentation/devicetree/bindings/gpio/apm,xgene-gpio-sb.yaml +f:Documentation/devicetree/bindings/gpio/apple,smc-gpio.yaml +f:Documentation/devicetree/bindings/gpio/aspeed,ast2400-gpio.yaml +f:Documentation/devicetree/bindings/gpio/aspeed,sgpio.yaml +f:Documentation/devicetree/bindings/gpio/atmel,at91rm9200-gpio.yaml +f:Documentation/devicetree/bindings/gpio/blaize,blzp1600-gpio.yaml +f:Documentation/devicetree/bindings/gpio/brcm,bcm63xx-gpio.yaml +f:Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.yaml +f:Documentation/devicetree/bindings/gpio/brcm,kona-gpio.yaml +f:Documentation/devicetree/bindings/gpio/brcm,xgs-iproc-gpio.yaml +f:Documentation/devicetree/bindings/gpio/cavium,octeon-3860-gpio.yaml +f:Documentation/devicetree/bindings/gpio/cdns,gpio.yaml +f:Documentation/devicetree/bindings/gpio/cirrus,clps711x-mctrl-gpio.yaml +f:Documentation/devicetree/bindings/gpio/delta,tn48m-gpio.yaml +f:Documentation/devicetree/bindings/gpio/exar,xra1403.yaml +f:Documentation/devicetree/bindings/gpio/fairchild,74hc595.yaml +f:Documentation/devicetree/bindings/gpio/faraday,ftgpio010.yaml +f:Documentation/devicetree/bindings/gpio/fsl,imx8qxp-sc-gpio.yaml +f:Documentation/devicetree/bindings/gpio/fsl,qoriq-gpio.yaml +f:Documentation/devicetree/bindings/gpio/fsl-imx-gpio.yaml +f:Documentation/devicetree/bindings/gpio/fujitsu,mb86s70-gpio.yaml +f:Documentation/devicetree/bindings/gpio/gpio-adnp.txt +f:Documentation/devicetree/bindings/gpio/gpio-consumer-common.yaml +f:Documentation/devicetree/bindings/gpio/gpio-davinci.yaml +f:Documentation/devicetree/bindings/gpio/gpio-delay.yaml +f:Documentation/devicetree/bindings/gpio/gpio-ep9301.yaml +f:Documentation/devicetree/bindings/gpio/gpio-exar.txt +f:Documentation/devicetree/bindings/gpio/gpio-grgpio.txt +f:Documentation/devicetree/bindings/gpio/gpio-latch.yaml +f:Documentation/devicetree/bindings/gpio/gpio-mmio.yaml +f:Documentation/devicetree/bindings/gpio/gpio-mvebu.yaml +f:Documentation/devicetree/bindings/gpio/gpio-mxs.yaml +f:Documentation/devicetree/bindings/gpio/gpio-pca95xx.yaml +f:Documentation/devicetree/bindings/gpio/gpio-rda.yaml +f:Documentation/devicetree/bindings/gpio/gpio-stp-xway.yaml +f:Documentation/devicetree/bindings/gpio/gpio-thunderx.txt +f:Documentation/devicetree/bindings/gpio/gpio-vf610.yaml +f:Documentation/devicetree/bindings/gpio/gpio-virtio.yaml +f:Documentation/devicetree/bindings/gpio/gpio-zynq.yaml +f:Documentation/devicetree/bindings/gpio/gpio.txt +f:Documentation/devicetree/bindings/gpio/hisilicon,ascend910-gpio.yaml +f:Documentation/devicetree/bindings/gpio/idt,32434-gpio.yaml +f:Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.yaml +f:Documentation/devicetree/bindings/gpio/kontron,sl28cpld-gpio.yaml +f:Documentation/devicetree/bindings/gpio/lacie,netxbig-gpio-ext.yaml +f:Documentation/devicetree/bindings/gpio/lantiq,gpio-mm-lantiq.yaml +f:Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml +f:Documentation/devicetree/bindings/gpio/lsi,zevio-gpio.yaml +f:Documentation/devicetree/bindings/gpio/maxim,max31910.yaml +f:Documentation/devicetree/bindings/gpio/maxim,max77759-gpio.yaml +f:Documentation/devicetree/bindings/gpio/mediatek,mt7621-gpio.yaml +f:Documentation/devicetree/bindings/gpio/microchip,mpfs-gpio.yaml +f:Documentation/devicetree/bindings/gpio/microchip,pic32mzda-gpio.yaml +f:Documentation/devicetree/bindings/gpio/mrvl-gpio.yaml +f:Documentation/devicetree/bindings/gpio/mstar,msc313-gpio.yaml +f:Documentation/devicetree/bindings/gpio/nuvoton,sgpio.yaml +f:Documentation/devicetree/bindings/gpio/nvidia,tegra186-gpio.yaml +f:Documentation/devicetree/bindings/gpio/nvidia,tegra20-gpio.yaml +f:Documentation/devicetree/bindings/gpio/nxp,lpc1850-gpio.yaml +f:Documentation/devicetree/bindings/gpio/nxp,lpc3220-gpio.yaml +f:Documentation/devicetree/bindings/gpio/nxp,pcf8575.yaml +f:Documentation/devicetree/bindings/gpio/pisosr-gpio.yaml +f:Documentation/devicetree/bindings/gpio/pl061-gpio.yaml +f:Documentation/devicetree/bindings/gpio/qca,ar7100-gpio.yaml +f:Documentation/devicetree/bindings/gpio/qcom,wcd934x-gpio.yaml +f:Documentation/devicetree/bindings/gpio/realtek,otto-gpio.yaml +f:Documentation/devicetree/bindings/gpio/realtek,rtd-gpio.yaml +f:Documentation/devicetree/bindings/gpio/renesas,em-gio.yaml +f:Documentation/devicetree/bindings/gpio/renesas,rcar-gpio.yaml +f:Documentation/devicetree/bindings/gpio/rockchip,gpio-bank.yaml +f:Documentation/devicetree/bindings/gpio/sifive,gpio.yaml +f:Documentation/devicetree/bindings/gpio/snps,dw-apb-gpio.yaml +f:Documentation/devicetree/bindings/gpio/socionext,uniphier-gpio.yaml +f:Documentation/devicetree/bindings/gpio/sodaville.txt +f:Documentation/devicetree/bindings/gpio/spacemit,k1-gpio.yaml +f:Documentation/devicetree/bindings/gpio/sprd,gpio-eic.yaml +f:Documentation/devicetree/bindings/gpio/sprd,gpio.yaml +f:Documentation/devicetree/bindings/gpio/st,nomadik-gpio.yaml +f:Documentation/devicetree/bindings/gpio/st,spear-spics-gpio.yaml +f:Documentation/devicetree/bindings/gpio/st,stmpe-gpio.yaml +f:Documentation/devicetree/bindings/gpio/ti,keystone-dsp-gpio.yaml +f:Documentation/devicetree/bindings/gpio/ti,omap-gpio.yaml +f:Documentation/devicetree/bindings/gpio/ti,twl4030-gpio.yaml +f:Documentation/devicetree/bindings/gpio/toshiba,gpio-visconti.yaml +f:Documentation/devicetree/bindings/gpio/trivial-gpio.yaml +f:Documentation/devicetree/bindings/gpio/x-powers,axp209-gpio.yaml +f:Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml +f:Documentation/devicetree/bindings/gpio/xlnx,zynqmp-gpio-modepin.yaml +f:Documentation/devicetree/bindings/gpio/xylon,logicvc-gpio.yaml +f:Documentation/devicetree/bindings/gpu/apple,agx.yaml +f:Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml +f:Documentation/devicetree/bindings/gpu/arm,mali-midgard.yaml +f:Documentation/devicetree/bindings/gpu/arm,mali-utgard.yaml +f:Documentation/devicetree/bindings/gpu/arm,mali-valhall-csf.yaml +f:Documentation/devicetree/bindings/gpu/aspeed-gfx.txt +f:Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml +f:Documentation/devicetree/bindings/gpu/host1x/nvidia,tegra210-nvdec.yaml +f:Documentation/devicetree/bindings/gpu/host1x/nvidia,tegra210-nvenc.yaml +f:Documentation/devicetree/bindings/gpu/host1x/nvidia,tegra210-nvjpg.yaml +f:Documentation/devicetree/bindings/gpu/host1x/nvidia,tegra234-nvdec.yaml +f:Documentation/devicetree/bindings/gpu/img,powervr-rogue.yaml +f:Documentation/devicetree/bindings/gpu/img,powervr-sgx.yaml +f:Documentation/devicetree/bindings/gpu/nvidia,gk20a.txt +f:Documentation/devicetree/bindings/gpu/samsung-g2d.yaml +f:Documentation/devicetree/bindings/gpu/samsung-rotator.yaml +f:Documentation/devicetree/bindings/gpu/samsung-scaler.yaml +f:Documentation/devicetree/bindings/gpu/vivante,gc.yaml +f:Documentation/devicetree/bindings/graph.txt +f:Documentation/devicetree/bindings/hsi/client-devices.txt +f:Documentation/devicetree/bindings/hsi/nokia-modem.txt +f:Documentation/devicetree/bindings/hsi/omap-ssi.txt +f:Documentation/devicetree/bindings/hwinfo/loongson,ls2k-chipid.yaml +f:Documentation/devicetree/bindings/hwinfo/renesas,prr.yaml +f:Documentation/devicetree/bindings/hwinfo/samsung,exynos-chipid.yaml +f:Documentation/devicetree/bindings/hwinfo/samsung,s5pv210-chipid.yaml +f:Documentation/devicetree/bindings/hwinfo/ti,k3-socinfo.yaml +f:Documentation/devicetree/bindings/hwinfo/via,vt8500-scc-id.yaml +f:Documentation/devicetree/bindings/hwlock/allwinner,sun6i-a31-hwspinlock.yaml +f:Documentation/devicetree/bindings/hwlock/hwlock.txt +f:Documentation/devicetree/bindings/hwlock/qcom-hwspinlock.yaml +f:Documentation/devicetree/bindings/hwlock/sprd,hwspinlock-r3p0.yaml +f:Documentation/devicetree/bindings/hwlock/st,stm32-hwspinlock.yaml +f:Documentation/devicetree/bindings/hwlock/ti,omap-hwspinlock.yaml +f:Documentation/devicetree/bindings/hwmon/adi,ad741x.yaml +f:Documentation/devicetree/bindings/hwmon/adi,adm1177.yaml +f:Documentation/devicetree/bindings/hwmon/adi,adm1266.yaml +f:Documentation/devicetree/bindings/hwmon/adi,adm1275.yaml +f:Documentation/devicetree/bindings/hwmon/adi,axi-fan-control.yaml +f:Documentation/devicetree/bindings/hwmon/adi,ltc2945.yaml +f:Documentation/devicetree/bindings/hwmon/adi,ltc2947.yaml +f:Documentation/devicetree/bindings/hwmon/adi,ltc2991.yaml +f:Documentation/devicetree/bindings/hwmon/adi,ltc2992.yaml +f:Documentation/devicetree/bindings/hwmon/adi,ltc4282.yaml +f:Documentation/devicetree/bindings/hwmon/adi,max31760.yaml +f:Documentation/devicetree/bindings/hwmon/adi,max31827.yaml +f:Documentation/devicetree/bindings/hwmon/adt7475.yaml +f:Documentation/devicetree/bindings/hwmon/amd,sbrmi.yaml +f:Documentation/devicetree/bindings/hwmon/amd,sbtsi.yaml +f:Documentation/devicetree/bindings/hwmon/amphenol,chipcap2.yaml +f:Documentation/devicetree/bindings/hwmon/apm-xgene-hwmon.txt +f:Documentation/devicetree/bindings/hwmon/aspeed,g6-pwm-tach.yaml +f:Documentation/devicetree/bindings/hwmon/aspeed-pwm-tacho.txt +f:Documentation/devicetree/bindings/hwmon/baikal,bt1-pvt.yaml +f:Documentation/devicetree/bindings/hwmon/cirrus,lochnagar.yaml +f:Documentation/devicetree/bindings/hwmon/fan-common.yaml +f:Documentation/devicetree/bindings/hwmon/gmt,g762.yaml +f:Documentation/devicetree/bindings/hwmon/gpio-fan.yaml +f:Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml +f:Documentation/devicetree/bindings/hwmon/hwmon-common.yaml +f:Documentation/devicetree/bindings/hwmon/ibm,occ-hwmon.yaml +f:Documentation/devicetree/bindings/hwmon/ibm,opal-sensor.yaml +f:Documentation/devicetree/bindings/hwmon/iio-hwmon.yaml +f:Documentation/devicetree/bindings/hwmon/jedec,jc42.yaml +f:Documentation/devicetree/bindings/hwmon/kontron,sl28cpld-hwmon.yaml +f:Documentation/devicetree/bindings/hwmon/lltc,ltc2978.yaml +f:Documentation/devicetree/bindings/hwmon/lltc,ltc4151.yaml +f:Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml +f:Documentation/devicetree/bindings/hwmon/lm75.yaml +f:Documentation/devicetree/bindings/hwmon/ltc2990.txt +f:Documentation/devicetree/bindings/hwmon/ltq-cputemp.txt +f:Documentation/devicetree/bindings/hwmon/max31785.txt +f:Documentation/devicetree/bindings/hwmon/max6697.txt +f:Documentation/devicetree/bindings/hwmon/maxim,max20730.yaml +f:Documentation/devicetree/bindings/hwmon/maxim,max31790.yaml +f:Documentation/devicetree/bindings/hwmon/maxim,max6639.yaml +f:Documentation/devicetree/bindings/hwmon/maxim,max6650.yaml +f:Documentation/devicetree/bindings/hwmon/microchip,emc2305.yaml +f:Documentation/devicetree/bindings/hwmon/microchip,lan966x.yaml +f:Documentation/devicetree/bindings/hwmon/microchip,mcp3021.yaml +f:Documentation/devicetree/bindings/hwmon/microchip,sparx5-temp.yaml +f:Documentation/devicetree/bindings/hwmon/moortec,mr75203.yaml +f:Documentation/devicetree/bindings/hwmon/national,lm90.yaml +f:Documentation/devicetree/bindings/hwmon/npcm750-pwm-fan.txt +f:Documentation/devicetree/bindings/hwmon/nsa320-mcu.txt +f:Documentation/devicetree/bindings/hwmon/ntc-thermistor.yaml +f:Documentation/devicetree/bindings/hwmon/nuvoton,nct6775.yaml +f:Documentation/devicetree/bindings/hwmon/nuvoton,nct7363.yaml +f:Documentation/devicetree/bindings/hwmon/nuvoton,nct7802.yaml +f:Documentation/devicetree/bindings/hwmon/nxp,mc34vr500.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/adi,adp1050.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/adi,lt3074.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/infineon,tda38640.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/isil,isl68137.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/mps,mp2975.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/mps,mpq8785.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/ti,lm25066.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/ti,tps25990.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/ti,ucd90320.yaml +f:Documentation/devicetree/bindings/hwmon/pmbus/vicor,pli1209bc.yaml +f:Documentation/devicetree/bindings/hwmon/pwm-fan.yaml +f:Documentation/devicetree/bindings/hwmon/renesas,isl28022.yaml +f:Documentation/devicetree/bindings/hwmon/sensirion,sht15.yaml +f:Documentation/devicetree/bindings/hwmon/sensirion,shtc1.yaml +f:Documentation/devicetree/bindings/hwmon/sophgo,sg2042-hwmon-mcu.yaml +f:Documentation/devicetree/bindings/hwmon/st,stts751.yaml +f:Documentation/devicetree/bindings/hwmon/starfive,jh71x0-temp.yaml +f:Documentation/devicetree/bindings/hwmon/syna,as370.yaml +f:Documentation/devicetree/bindings/hwmon/ti,adc128d818.yaml +f:Documentation/devicetree/bindings/hwmon/ti,ads7828.yaml +f:Documentation/devicetree/bindings/hwmon/ti,amc6821.yaml +f:Documentation/devicetree/bindings/hwmon/ti,ina2xx.yaml +f:Documentation/devicetree/bindings/hwmon/ti,ina3221.yaml +f:Documentation/devicetree/bindings/hwmon/ti,lm87.yaml +f:Documentation/devicetree/bindings/hwmon/ti,tmp102.yaml +f:Documentation/devicetree/bindings/hwmon/ti,tmp108.yaml +f:Documentation/devicetree/bindings/hwmon/ti,tmp401.yaml +f:Documentation/devicetree/bindings/hwmon/ti,tmp421.yaml +f:Documentation/devicetree/bindings/hwmon/ti,tmp464.yaml +f:Documentation/devicetree/bindings/hwmon/ti,tmp513.yaml +f:Documentation/devicetree/bindings/hwmon/ti,tps23861.yaml +f:Documentation/devicetree/bindings/hwmon/vexpress.txt +f:Documentation/devicetree/bindings/hwmon/winbond,w83781d.yaml +f:Documentation/devicetree/bindings/i2c/allwinner,sun6i-a31-p2wi.yaml +f:Documentation/devicetree/bindings/i2c/amlogic,meson6-i2c.yaml +f:Documentation/devicetree/bindings/i2c/apple,i2c.yaml +f:Documentation/devicetree/bindings/i2c/arm,i2c-versatile.yaml +f:Documentation/devicetree/bindings/i2c/aspeed,i2c.yaml +f:Documentation/devicetree/bindings/i2c/atmel,at91sam-i2c.yaml +f:Documentation/devicetree/bindings/i2c/brcm,bcm2835-i2c.yaml +f:Documentation/devicetree/bindings/i2c/brcm,brcmstb-i2c.yaml +f:Documentation/devicetree/bindings/i2c/brcm,iproc-i2c.yaml +f:Documentation/devicetree/bindings/i2c/brcm,kona-i2c.yaml +f:Documentation/devicetree/bindings/i2c/cdns,i2c-r1p10.yaml +f:Documentation/devicetree/bindings/i2c/google,cros-ec-i2c-tunnel.yaml +f:Documentation/devicetree/bindings/i2c/hisilicon,ascend910-i2c.yaml +f:Documentation/devicetree/bindings/i2c/hpe,gxp-i2c.yaml +f:Documentation/devicetree/bindings/i2c/i2c-altera.txt +f:Documentation/devicetree/bindings/i2c/i2c-arb-gpio-challenge.yaml +f:Documentation/devicetree/bindings/i2c/i2c-atr.yaml +f:Documentation/devicetree/bindings/i2c/i2c-axxia.txt +f:Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt +f:Documentation/devicetree/bindings/i2c/i2c-davinci.txt +f:Documentation/devicetree/bindings/i2c/i2c-demux-pinctrl.yaml +f:Documentation/devicetree/bindings/i2c/i2c-digicolor.txt +f:Documentation/devicetree/bindings/i2c/i2c-exynos5.yaml +f:Documentation/devicetree/bindings/i2c/i2c-gate.yaml +f:Documentation/devicetree/bindings/i2c/i2c-gpio.yaml +f:Documentation/devicetree/bindings/i2c/i2c-hix5hd2.txt +f:Documentation/devicetree/bindings/i2c/i2c-img-scb.txt +f:Documentation/devicetree/bindings/i2c/i2c-imx-lpi2c.yaml +f:Documentation/devicetree/bindings/i2c/i2c-imx.yaml +f:Documentation/devicetree/bindings/i2c/i2c-iop3xx.txt +f:Documentation/devicetree/bindings/i2c/i2c-mpc.yaml +f:Documentation/devicetree/bindings/i2c/i2c-mt65xx.yaml +f:Documentation/devicetree/bindings/i2c/i2c-mux-gpio.yaml +f:Documentation/devicetree/bindings/i2c/i2c-mux-gpmux.yaml +f:Documentation/devicetree/bindings/i2c/i2c-mux-ltc4306.txt +f:Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml +f:Documentation/devicetree/bindings/i2c/i2c-mux-pinctrl.yaml +f:Documentation/devicetree/bindings/i2c/i2c-mux-reg.txt +f:Documentation/devicetree/bindings/i2c/i2c-mux.yaml +f:Documentation/devicetree/bindings/i2c/i2c-mxs.yaml +f:Documentation/devicetree/bindings/i2c/i2c-octeon.txt +f:Documentation/devicetree/bindings/i2c/i2c-opal.txt +f:Documentation/devicetree/bindings/i2c/i2c-owl.yaml +f:Documentation/devicetree/bindings/i2c/i2c-pca-platform.txt +f:Documentation/devicetree/bindings/i2c/i2c-pxa-pci-ce4100.txt +f:Documentation/devicetree/bindings/i2c/i2c-pxa.yaml +f:Documentation/devicetree/bindings/i2c/i2c-rk3x.yaml +f:Documentation/devicetree/bindings/i2c/i2c-virtio.yaml +f:Documentation/devicetree/bindings/i2c/i2c-xgene-slimpro.txt +f:Documentation/devicetree/bindings/i2c/ibm,i2c-fsi.yaml +f:Documentation/devicetree/bindings/i2c/ingenic,i2c.yaml +f:Documentation/devicetree/bindings/i2c/loongson,ls2x-i2c.yaml +f:Documentation/devicetree/bindings/i2c/marvell,mv64xxx-i2c.yaml +f:Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml +f:Documentation/devicetree/bindings/i2c/microchip,corei2c.yaml +f:Documentation/devicetree/bindings/i2c/nuvoton,npcm7xx-i2c.yaml +f:Documentation/devicetree/bindings/i2c/nvidia,tegra186-bpmp-i2c.yaml +f:Documentation/devicetree/bindings/i2c/nvidia,tegra20-i2c.yaml +f:Documentation/devicetree/bindings/i2c/nxp,lpc1788-i2c.yaml +f:Documentation/devicetree/bindings/i2c/nxp,pca9541.yaml +f:Documentation/devicetree/bindings/i2c/nxp,pnx-i2c.yaml +f:Documentation/devicetree/bindings/i2c/opencores,i2c-ocores.yaml +f:Documentation/devicetree/bindings/i2c/qcom,i2c-cci.yaml +f:Documentation/devicetree/bindings/i2c/qcom,i2c-geni-qcom.yaml +f:Documentation/devicetree/bindings/i2c/qcom,i2c-qup.yaml +f:Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml +f:Documentation/devicetree/bindings/i2c/renesas,iic-emev2.yaml +f:Documentation/devicetree/bindings/i2c/renesas,rcar-i2c.yaml +f:Documentation/devicetree/bindings/i2c/renesas,riic.yaml +f:Documentation/devicetree/bindings/i2c/renesas,rmobile-iic.yaml +f:Documentation/devicetree/bindings/i2c/renesas,rzv2m.yaml +f:Documentation/devicetree/bindings/i2c/samsung,s3c2410-i2c.yaml +f:Documentation/devicetree/bindings/i2c/snps,designware-i2c.yaml +f:Documentation/devicetree/bindings/i2c/socionext,synquacer-i2c.yaml +f:Documentation/devicetree/bindings/i2c/socionext,uniphier-fi2c.yaml +f:Documentation/devicetree/bindings/i2c/socionext,uniphier-i2c.yaml +f:Documentation/devicetree/bindings/i2c/spacemit,k1-i2c.yaml +f:Documentation/devicetree/bindings/i2c/sprd,sc9860-i2c.yaml +f:Documentation/devicetree/bindings/i2c/st,nomadik-i2c.yaml +f:Documentation/devicetree/bindings/i2c/st,sti-i2c.yaml +f:Documentation/devicetree/bindings/i2c/st,stm32-i2c.yaml +f:Documentation/devicetree/bindings/i2c/ti,omap4-i2c.yaml +f:Documentation/devicetree/bindings/i2c/tsd,mule-i2c-mux.yaml +f:Documentation/devicetree/bindings/i2c/wm,wm8505-i2c.yaml +f:Documentation/devicetree/bindings/i2c/xlnx,xps-iic-2.00.a.yaml +f:Documentation/devicetree/bindings/i3c/aspeed,ast2600-i3c.yaml +f:Documentation/devicetree/bindings/i3c/cdns,i3c-master.yaml +f:Documentation/devicetree/bindings/i3c/i3c.yaml +f:Documentation/devicetree/bindings/i3c/mipi-i3c-hci.yaml +f:Documentation/devicetree/bindings/i3c/silvaco,i3c-master.yaml +f:Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.yaml +f:Documentation/devicetree/bindings/iio/accel/adi,adis16201.yaml +f:Documentation/devicetree/bindings/iio/accel/adi,adis16240.yaml +f:Documentation/devicetree/bindings/iio/accel/adi,adxl313.yaml +f:Documentation/devicetree/bindings/iio/accel/adi,adxl345.yaml +f:Documentation/devicetree/bindings/iio/accel/adi,adxl355.yaml +f:Documentation/devicetree/bindings/iio/accel/adi,adxl367.yaml +f:Documentation/devicetree/bindings/iio/accel/adi,adxl372.yaml +f:Documentation/devicetree/bindings/iio/accel/adi,adxl380.yaml +f:Documentation/devicetree/bindings/iio/accel/bosch,bma220.yaml +f:Documentation/devicetree/bindings/iio/accel/bosch,bma255.yaml +f:Documentation/devicetree/bindings/iio/accel/bosch,bma400.yaml +f:Documentation/devicetree/bindings/iio/accel/bosch,bmi088.yaml +f:Documentation/devicetree/bindings/iio/accel/fsl,mma7455.yaml +f:Documentation/devicetree/bindings/iio/accel/fsl,mma8452.yaml +f:Documentation/devicetree/bindings/iio/accel/kionix,kx022a.yaml +f:Documentation/devicetree/bindings/iio/accel/kionix,kxcjk1013.yaml +f:Documentation/devicetree/bindings/iio/accel/kionix,kxsd9.yaml +f:Documentation/devicetree/bindings/iio/accel/lis302.txt +f:Documentation/devicetree/bindings/iio/accel/memsensing,msa311.yaml +f:Documentation/devicetree/bindings/iio/accel/murata,sca3300.yaml +f:Documentation/devicetree/bindings/iio/accel/nxp,fxls8962af.yaml +f:Documentation/devicetree/bindings/iio/adc/adc.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad4000.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad4030.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad4080.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad4130.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad4170-4.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad4695.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad4851.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7091r5.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7124.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7173.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7191.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7192.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7280a.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7291.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7292.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7298.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7380.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7405.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7476.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7625.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7768-1.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7780.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7923.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7944.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad7949.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad799x.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,ad9467.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,axi-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/adi,max11410.yaml +f:Documentation/devicetree/bindings/iio/adc/allwinner,sun20i-d1-gpadc.yaml +f:Documentation/devicetree/bindings/iio/adc/allwinner,sun8i-a33-ths.yaml +f:Documentation/devicetree/bindings/iio/adc/amlogic,meson-saradc.yaml +f:Documentation/devicetree/bindings/iio/adc/aspeed,ast2400-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/aspeed,ast2600-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/atmel,sama5d2-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/atmel,sama9260-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/avia-hx711.yaml +f:Documentation/devicetree/bindings/iio/adc/brcm,iproc-static-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/cirrus,ep9301-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/cosmic,10001-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/dlg,da9150-gpadc.yaml +f:Documentation/devicetree/bindings/iio/adc/envelope-detector.yaml +f:Documentation/devicetree/bindings/iio/adc/fsl,imx25-gcq.yaml +f:Documentation/devicetree/bindings/iio/adc/fsl,imx7d-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/fsl,vf610-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/gehc,pmc-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/holt,hi8435.yaml +f:Documentation/devicetree/bindings/iio/adc/ingenic,adc.yaml +f:Documentation/devicetree/bindings/iio/adc/lltc,ltc2496.yaml +f:Documentation/devicetree/bindings/iio/adc/lltc,ltc2497.yaml +f:Documentation/devicetree/bindings/iio/adc/marvell,berlin2-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max1027.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max11100.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max1118.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max11205.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max1238.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max1363.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml +f:Documentation/devicetree/bindings/iio/adc/maxim,max9611.yaml +f:Documentation/devicetree/bindings/iio/adc/mediatek,mt2701-auxadc.yaml +f:Documentation/devicetree/bindings/iio/adc/mediatek,mt6359-auxadc.yaml +f:Documentation/devicetree/bindings/iio/adc/mediatek,mt6360-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/microchip,mcp3201.yaml +f:Documentation/devicetree/bindings/iio/adc/microchip,mcp3564.yaml +f:Documentation/devicetree/bindings/iio/adc/microchip,mcp3911.yaml +f:Documentation/devicetree/bindings/iio/adc/microchip,pac1921.yaml +f:Documentation/devicetree/bindings/iio/adc/microchip,pac1934.yaml +f:Documentation/devicetree/bindings/iio/adc/motorola,cpcap-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/nuvoton,nau7802.yaml +f:Documentation/devicetree/bindings/iio/adc/nuvoton,nct7201.yaml +f:Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/nxp,imx8qxp-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/nxp,imx93-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/nxp,lpc1850-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/nxp,lpc3220-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/qcom,pm8018-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/qcom,spmi-iadc.yaml +f:Documentation/devicetree/bindings/iio/adc/qcom,spmi-rradc.yaml +f:Documentation/devicetree/bindings/iio/adc/qcom,spmi-vadc.yaml +f:Documentation/devicetree/bindings/iio/adc/renesas,rcar-gyroadc.yaml +f:Documentation/devicetree/bindings/iio/adc/renesas,rzg2l-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/richtek,rtq6056.yaml +f:Documentation/devicetree/bindings/iio/adc/rockchip-saradc.yaml +f:Documentation/devicetree/bindings/iio/adc/rohm,bd79104.yaml +f:Documentation/devicetree/bindings/iio/adc/rohm,bd79124.yaml +f:Documentation/devicetree/bindings/iio/adc/samsung,exynos-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.yaml +f:Documentation/devicetree/bindings/iio/adc/sophgo,cv1800b-saradc.yaml +f:Documentation/devicetree/bindings/iio/adc/sprd,sc2720-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/st,spear600-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/st,stm32-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/st,stmpe-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,adc081c.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,adc0832.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,adc084s021.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,adc108s102.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,adc12138.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,adc128s052.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,adc161s626.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads1015.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads1100.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads1119.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads124s08.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads1298.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads131e08.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads7138.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads7924.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads7950.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads8344.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,ads8688.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,am3359-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,lmp92064.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,palmas-gpadc.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,tlc4541.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,tsc2046.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,twl4030-madc.yaml +f:Documentation/devicetree/bindings/iio/adc/ti,twl6030-gpadc.yaml +f:Documentation/devicetree/bindings/iio/adc/x-powers,axp209-adc.yaml +f:Documentation/devicetree/bindings/iio/adc/xilinx-xadc.txt +f:Documentation/devicetree/bindings/iio/adc/xlnx,zynqmp-ams.yaml +f:Documentation/devicetree/bindings/iio/addac/adi,ad74115.yaml +f:Documentation/devicetree/bindings/iio/addac/adi,ad74413r.yaml +f:Documentation/devicetree/bindings/iio/afe/current-sense-amplifier.yaml +f:Documentation/devicetree/bindings/iio/afe/current-sense-shunt.yaml +f:Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml +f:Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml +f:Documentation/devicetree/bindings/iio/afe/voltage-divider.yaml +f:Documentation/devicetree/bindings/iio/amplifiers/adi,ada4250.yaml +f:Documentation/devicetree/bindings/iio/amplifiers/adi,hmc425a.yaml +f:Documentation/devicetree/bindings/iio/cdc/adi,ad7150.yaml +f:Documentation/devicetree/bindings/iio/cdc/adi,ad7746.yaml +f:Documentation/devicetree/bindings/iio/chemical/ams,ccs811.yaml +f:Documentation/devicetree/bindings/iio/chemical/aosong,ags02ma.yaml +f:Documentation/devicetree/bindings/iio/chemical/atlas,sensor.yaml +f:Documentation/devicetree/bindings/iio/chemical/bosch,bme680.yaml +f:Documentation/devicetree/bindings/iio/chemical/plantower,pms7003.yaml +f:Documentation/devicetree/bindings/iio/chemical/sciosense,ens160.yaml +f:Documentation/devicetree/bindings/iio/chemical/senseair,sunrise.yaml +f:Documentation/devicetree/bindings/iio/chemical/sensirion,scd30.yaml +f:Documentation/devicetree/bindings/iio/chemical/sensirion,scd4x.yaml +f:Documentation/devicetree/bindings/iio/chemical/sensirion,sps30.yaml +f:Documentation/devicetree/bindings/iio/chemical/winsen,mhz19b.yaml +f:Documentation/devicetree/bindings/iio/common.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad3530r.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad3552r.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5064.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5360.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5380.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5421.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5449.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5504.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5592r.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5624r.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5686.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5696.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5755.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5758.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5761.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5764.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5766.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5770r.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad5791.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad7293.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad7303.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad8460.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad8801.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ad9739a.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,axi-dac.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ltc2664.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ltc2672.yaml +f:Documentation/devicetree/bindings/iio/dac/adi,ltc2688.yaml +f:Documentation/devicetree/bindings/iio/dac/dac.yaml +f:Documentation/devicetree/bindings/iio/dac/dpot-dac.yaml +f:Documentation/devicetree/bindings/iio/dac/fsl,vf610-dac.yaml +f:Documentation/devicetree/bindings/iio/dac/lltc,ltc1660.yaml +f:Documentation/devicetree/bindings/iio/dac/lltc,ltc2632.yaml +f:Documentation/devicetree/bindings/iio/dac/maxim,ds4424.yaml +f:Documentation/devicetree/bindings/iio/dac/maxim,max5522.yaml +f:Documentation/devicetree/bindings/iio/dac/maxim,max5821.yaml +f:Documentation/devicetree/bindings/iio/dac/microchip,mcp4725.yaml +f:Documentation/devicetree/bindings/iio/dac/microchip,mcp4728.yaml +f:Documentation/devicetree/bindings/iio/dac/microchip,mcp4821.yaml +f:Documentation/devicetree/bindings/iio/dac/microchip,mcp4922.yaml +f:Documentation/devicetree/bindings/iio/dac/nxp,lpc1850-dac.yaml +f:Documentation/devicetree/bindings/iio/dac/rohm,bd79703.yaml +f:Documentation/devicetree/bindings/iio/dac/st,stm32-dac.yaml +f:Documentation/devicetree/bindings/iio/dac/ti,dac082s085.yaml +f:Documentation/devicetree/bindings/iio/dac/ti,dac5571.yaml +f:Documentation/devicetree/bindings/iio/dac/ti,dac7311.yaml +f:Documentation/devicetree/bindings/iio/dac/ti,dac7512.yaml +f:Documentation/devicetree/bindings/iio/dac/ti,dac7612.yaml +f:Documentation/devicetree/bindings/iio/filter/adi,admv8818.yaml +f:Documentation/devicetree/bindings/iio/frequency/adf4371.yaml +f:Documentation/devicetree/bindings/iio/frequency/adi,adf4350.yaml +f:Documentation/devicetree/bindings/iio/frequency/adi,adf4377.yaml +f:Documentation/devicetree/bindings/iio/frequency/adi,admfm2000.yaml +f:Documentation/devicetree/bindings/iio/frequency/adi,admv1013.yaml +f:Documentation/devicetree/bindings/iio/frequency/adi,admv1014.yaml +f:Documentation/devicetree/bindings/iio/frequency/adi,admv4420.yaml +f:Documentation/devicetree/bindings/iio/frequency/adi,adrf6780.yaml +f:Documentation/devicetree/bindings/iio/gyroscope/adi,adxrs290.yaml +f:Documentation/devicetree/bindings/iio/gyroscope/bosch,bmg160.yaml +f:Documentation/devicetree/bindings/iio/gyroscope/invensense,itg3200.yaml +f:Documentation/devicetree/bindings/iio/gyroscope/invensense,mpu3050.yaml +f:Documentation/devicetree/bindings/iio/gyroscope/nxp,fxas21002c.yaml +f:Documentation/devicetree/bindings/iio/health/maxim,max30100.yaml +f:Documentation/devicetree/bindings/iio/health/maxim,max30102.yaml +f:Documentation/devicetree/bindings/iio/health/ti,afe4403.yaml +f:Documentation/devicetree/bindings/iio/health/ti,afe4404.yaml +f:Documentation/devicetree/bindings/iio/humidity/dht11.yaml +f:Documentation/devicetree/bindings/iio/humidity/sciosense,ens210.yaml +f:Documentation/devicetree/bindings/iio/humidity/st,hts221.yaml +f:Documentation/devicetree/bindings/iio/humidity/ti,hdc2010.yaml +f:Documentation/devicetree/bindings/iio/humidity/ti,hdc3020.yaml +f:Documentation/devicetree/bindings/iio/impedance-analyzer/adi,ad5933.yaml +f:Documentation/devicetree/bindings/iio/imu/adi,adis16460.yaml +f:Documentation/devicetree/bindings/iio/imu/adi,adis16475.yaml +f:Documentation/devicetree/bindings/iio/imu/adi,adis16480.yaml +f:Documentation/devicetree/bindings/iio/imu/adi,adis16550.yaml +f:Documentation/devicetree/bindings/iio/imu/bosch,bmi160.yaml +f:Documentation/devicetree/bindings/iio/imu/bosch,bmi270.yaml +f:Documentation/devicetree/bindings/iio/imu/bosch,bmi323.yaml +f:Documentation/devicetree/bindings/iio/imu/bosch,bno055.yaml +f:Documentation/devicetree/bindings/iio/imu/bosch,smi240.yaml +f:Documentation/devicetree/bindings/iio/imu/invensense,icm42600.yaml +f:Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml +f:Documentation/devicetree/bindings/iio/imu/nxp,fxos8700.yaml +f:Documentation/devicetree/bindings/iio/imu/st,lsm6dsx.yaml +f:Documentation/devicetree/bindings/iio/light/adux1020.yaml +f:Documentation/devicetree/bindings/iio/light/ams,as73211.yaml +f:Documentation/devicetree/bindings/iio/light/amstaos,tsl2563.yaml +f:Documentation/devicetree/bindings/iio/light/amstaos,tsl2591.yaml +f:Documentation/devicetree/bindings/iio/light/avago,apds9300.yaml +f:Documentation/devicetree/bindings/iio/light/bh1750.yaml +f:Documentation/devicetree/bindings/iio/light/brcm,apds9160.yaml +f:Documentation/devicetree/bindings/iio/light/capella,cm3605.yaml +f:Documentation/devicetree/bindings/iio/light/capella,cm36651.yaml +f:Documentation/devicetree/bindings/iio/light/dynaimage,al3010.yaml +f:Documentation/devicetree/bindings/iio/light/dynaimage,al3320a.yaml +f:Documentation/devicetree/bindings/iio/light/isl29018.yaml +f:Documentation/devicetree/bindings/iio/light/liteon,ltr390.yaml +f:Documentation/devicetree/bindings/iio/light/liteon,ltr501.yaml +f:Documentation/devicetree/bindings/iio/light/liteon,ltrf216a.yaml +f:Documentation/devicetree/bindings/iio/light/maxim,max44009.yaml +f:Documentation/devicetree/bindings/iio/light/noa1305.yaml +f:Documentation/devicetree/bindings/iio/light/rohm,bh1745.yaml +f:Documentation/devicetree/bindings/iio/light/rohm,bu27034anuc.yaml +f:Documentation/devicetree/bindings/iio/light/sharp,gp2ap002.yaml +f:Documentation/devicetree/bindings/iio/light/sharp,gp2ap020a00f.yaml +f:Documentation/devicetree/bindings/iio/light/st,uvis25.yaml +f:Documentation/devicetree/bindings/iio/light/st,vl6180.yaml +f:Documentation/devicetree/bindings/iio/light/stk33xx.yaml +f:Documentation/devicetree/bindings/iio/light/ti,opt3001.yaml +f:Documentation/devicetree/bindings/iio/light/ti,opt4001.yaml +f:Documentation/devicetree/bindings/iio/light/ti,opt4060.yaml +f:Documentation/devicetree/bindings/iio/light/tsl2583.yaml +f:Documentation/devicetree/bindings/iio/light/tsl2772.yaml +f:Documentation/devicetree/bindings/iio/light/upisemi,us5182.yaml +f:Documentation/devicetree/bindings/iio/light/vishay,vcnl4000.yaml +f:Documentation/devicetree/bindings/iio/light/vishay,vcnl4035.yaml +f:Documentation/devicetree/bindings/iio/light/vishay,veml6030.yaml +f:Documentation/devicetree/bindings/iio/light/vishay,veml6075.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/allegromicro,als31300.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8974.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/bosch,bmc150_magn.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/fsl,mag3110.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/honeywell,hmc5843.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/pni,rm3100.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/silabs,si7210.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/ti,tmag5273.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/voltafield,af8133j.yaml +f:Documentation/devicetree/bindings/iio/magnetometer/yamaha,yas530.yaml +f:Documentation/devicetree/bindings/iio/mount-matrix.txt +f:Documentation/devicetree/bindings/iio/multiplexer/io-channel-mux.yaml +f:Documentation/devicetree/bindings/iio/potentiometer/adi,ad5272.yaml +f:Documentation/devicetree/bindings/iio/potentiometer/max5432.yaml +f:Documentation/devicetree/bindings/iio/potentiometer/microchip,mcp41010.yaml +f:Documentation/devicetree/bindings/iio/potentiometer/microchip,mcp4131.yaml +f:Documentation/devicetree/bindings/iio/potentiometer/microchip,mcp4531.yaml +f:Documentation/devicetree/bindings/iio/potentiometer/renesas,x9250.yaml +f:Documentation/devicetree/bindings/iio/potentiostat/ti,lmp91000.yaml +f:Documentation/devicetree/bindings/iio/pressure/asc,dlhl60d.yaml +f:Documentation/devicetree/bindings/iio/pressure/bmp085.yaml +f:Documentation/devicetree/bindings/iio/pressure/honeywell,hsc030pa.yaml +f:Documentation/devicetree/bindings/iio/pressure/honeywell,mprls0025pa.yaml +f:Documentation/devicetree/bindings/iio/pressure/hoperf,hp03.yaml +f:Documentation/devicetree/bindings/iio/pressure/meas,ms5611.yaml +f:Documentation/devicetree/bindings/iio/pressure/murata,zpa2326.yaml +f:Documentation/devicetree/bindings/iio/pressure/rohm,bm1390.yaml +f:Documentation/devicetree/bindings/iio/pressure/sensirion,sdp500.yaml +f:Documentation/devicetree/bindings/iio/proximity/ams,as3935.yaml +f:Documentation/devicetree/bindings/iio/proximity/awinic,aw96103.yaml +f:Documentation/devicetree/bindings/iio/proximity/devantech-srf04.yaml +f:Documentation/devicetree/bindings/iio/proximity/google,cros-ec-mkbp-proximity.yaml +f:Documentation/devicetree/bindings/iio/proximity/maxbotix,mb1232.yaml +f:Documentation/devicetree/bindings/iio/proximity/murata,irsd200.yaml +f:Documentation/devicetree/bindings/iio/proximity/nicera,d3323aa.yaml +f:Documentation/devicetree/bindings/iio/proximity/parallax-ping.yaml +f:Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml +f:Documentation/devicetree/bindings/iio/proximity/semtech,sx9324.yaml +f:Documentation/devicetree/bindings/iio/proximity/semtech,sx9360.yaml +f:Documentation/devicetree/bindings/iio/proximity/semtech,sx9500.yaml +f:Documentation/devicetree/bindings/iio/proximity/st,vl53l0x.yaml +f:Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.yaml +f:Documentation/devicetree/bindings/iio/proximity/vishay,vcnl3020.yaml +f:Documentation/devicetree/bindings/iio/resolver/adi,ad2s1210.yaml +f:Documentation/devicetree/bindings/iio/resolver/adi,ad2s90.yaml +f:Documentation/devicetree/bindings/iio/samsung,sensorhub-rinato.yaml +f:Documentation/devicetree/bindings/iio/st,st-sensors.yaml +f:Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml +f:Documentation/devicetree/bindings/iio/temperature/maxim,max31855k.yaml +f:Documentation/devicetree/bindings/iio/temperature/maxim,max31856.yaml +f:Documentation/devicetree/bindings/iio/temperature/maxim,max31865.yaml +f:Documentation/devicetree/bindings/iio/temperature/melexis,mlx90614.yaml +f:Documentation/devicetree/bindings/iio/temperature/melexis,mlx90632.yaml +f:Documentation/devicetree/bindings/iio/temperature/microchip,mcp9600.yaml +f:Documentation/devicetree/bindings/iio/temperature/ti,tmp006.yaml +f:Documentation/devicetree/bindings/iio/temperature/ti,tmp007.yaml +f:Documentation/devicetree/bindings/iio/temperature/ti,tmp117.yaml +f:Documentation/devicetree/bindings/incomplete-devices.yaml +f:Documentation/devicetree/bindings/index.rst +f:Documentation/devicetree/bindings/infiniband/hisilicon-hns-roce.txt +f:Documentation/devicetree/bindings/input/adafruit,seesaw-gamepad.yaml +f:Documentation/devicetree/bindings/input/adc-joystick.yaml +f:Documentation/devicetree/bindings/input/adc-keys.yaml +f:Documentation/devicetree/bindings/input/adi,adp5588.yaml +f:Documentation/devicetree/bindings/input/allwinner,sun4i-a10-lradc-keys.yaml +f:Documentation/devicetree/bindings/input/ariel-pwrbutton.yaml +f:Documentation/devicetree/bindings/input/atmel,captouch.yaml +f:Documentation/devicetree/bindings/input/atmel,maxtouch.yaml +f:Documentation/devicetree/bindings/input/azoteq,iqs7222.yaml +f:Documentation/devicetree/bindings/input/brcm,bcm-keypad.txt +f:Documentation/devicetree/bindings/input/cirrus,cs40l50.yaml +f:Documentation/devicetree/bindings/input/cirrus,ep9307-keypad.yaml +f:Documentation/devicetree/bindings/input/clps711x-keypad.txt +f:Documentation/devicetree/bindings/input/cpcap-pwrbutton.txt +f:Documentation/devicetree/bindings/input/cypress,cyapa.yaml +f:Documentation/devicetree/bindings/input/cypress,tm2-touchkey.yaml +f:Documentation/devicetree/bindings/input/cypress-sf.yaml +f:Documentation/devicetree/bindings/input/dlg,da7280.yaml +f:Documentation/devicetree/bindings/input/dlg,da9062-onkey.yaml +f:Documentation/devicetree/bindings/input/dlink,dir685-touchkeys.txt +f:Documentation/devicetree/bindings/input/e3x0-button.txt +f:Documentation/devicetree/bindings/input/elan,ekth3000.yaml +f:Documentation/devicetree/bindings/input/elan,ekth6915.yaml +f:Documentation/devicetree/bindings/input/fsl,mpr121-touchkey.yaml +f:Documentation/devicetree/bindings/input/fsl,scu-key.yaml +f:Documentation/devicetree/bindings/input/goodix,gt7375p.yaml +f:Documentation/devicetree/bindings/input/goodix,gt7986u-spifw.yaml +f:Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml +f:Documentation/devicetree/bindings/input/gpio-beeper.yaml +f:Documentation/devicetree/bindings/input/gpio-decoder.txt +f:Documentation/devicetree/bindings/input/gpio-keys.yaml +f:Documentation/devicetree/bindings/input/gpio-matrix-keypad.yaml +f:Documentation/devicetree/bindings/input/gpio-mouse.yaml +f:Documentation/devicetree/bindings/input/gpio-vibrator.yaml +f:Documentation/devicetree/bindings/input/hid-over-i2c.yaml +f:Documentation/devicetree/bindings/input/ibm,op-panel.yaml +f:Documentation/devicetree/bindings/input/ilitek,ili2901.yaml +f:Documentation/devicetree/bindings/input/ilitek,ili9882t.yaml +f:Documentation/devicetree/bindings/input/imx-keypad.yaml +f:Documentation/devicetree/bindings/input/input-reset.txt +f:Documentation/devicetree/bindings/input/input.yaml +f:Documentation/devicetree/bindings/input/iqs269a.yaml +f:Documentation/devicetree/bindings/input/iqs626a.yaml +f:Documentation/devicetree/bindings/input/iqs62x-keys.yaml +f:Documentation/devicetree/bindings/input/lpc32xx-key.txt +f:Documentation/devicetree/bindings/input/matrix-keymap.txt +f:Documentation/devicetree/bindings/input/matrix-keymap.yaml +f:Documentation/devicetree/bindings/input/max77650-onkey.yaml +f:Documentation/devicetree/bindings/input/mediatek,mt6779-keypad.yaml +f:Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml +f:Documentation/devicetree/bindings/input/microchip,cap11xx.yaml +f:Documentation/devicetree/bindings/input/microchip,qt1050.txt +f:Documentation/devicetree/bindings/input/nvidia,tegra20-kbc.txt +f:Documentation/devicetree/bindings/input/omap-keypad.txt +f:Documentation/devicetree/bindings/input/pine64,pinephone-keyboard.yaml +f:Documentation/devicetree/bindings/input/ps2keyb-mouse-apbps2.txt +f:Documentation/devicetree/bindings/input/pwm-beeper.yaml +f:Documentation/devicetree/bindings/input/pwm-vibrator.yaml +f:Documentation/devicetree/bindings/input/pxa27x-keypad.txt +f:Documentation/devicetree/bindings/input/qcom,pm8921-keypad.yaml +f:Documentation/devicetree/bindings/input/qcom,pm8921-pwrkey.yaml +f:Documentation/devicetree/bindings/input/qcom,pm8941-pwrkey.yaml +f:Documentation/devicetree/bindings/input/qcom,pm8xxx-vib.yaml +f:Documentation/devicetree/bindings/input/raydium_i2c_ts.txt +f:Documentation/devicetree/bindings/input/regulator-haptic.yaml +f:Documentation/devicetree/bindings/input/rotary-encoder.yaml +f:Documentation/devicetree/bindings/input/samsung,s3c6410-keypad.yaml +f:Documentation/devicetree/bindings/input/spear-keyboard.txt +f:Documentation/devicetree/bindings/input/sprd,sc27xx-vibrator.yaml +f:Documentation/devicetree/bindings/input/st-keyscan.txt +f:Documentation/devicetree/bindings/input/syna,rmi4.yaml +f:Documentation/devicetree/bindings/input/tca8418_keypad.txt +f:Documentation/devicetree/bindings/input/ti,drv260x.yaml +f:Documentation/devicetree/bindings/input/ti,drv266x.yaml +f:Documentation/devicetree/bindings/input/ti,nspire-keypad.yaml +f:Documentation/devicetree/bindings/input/ti,palmas-pwrbutton.txt +f:Documentation/devicetree/bindings/input/touchscreen/adi,ad7879.yaml +f:Documentation/devicetree/bindings/input/touchscreen/apple,z2-multitouch.yaml +f:Documentation/devicetree/bindings/input/touchscreen/ar1021.txt +f:Documentation/devicetree/bindings/input/touchscreen/auo_pixcir_ts.txt +f:Documentation/devicetree/bindings/input/touchscreen/azoteq,iqs5xx.yaml +f:Documentation/devicetree/bindings/input/touchscreen/azoteq,iqs7211.yaml +f:Documentation/devicetree/bindings/input/touchscreen/brcm,iproc-touchscreen.txt +f:Documentation/devicetree/bindings/input/touchscreen/bu21013.txt +f:Documentation/devicetree/bindings/input/touchscreen/bu21029.txt +f:Documentation/devicetree/bindings/input/touchscreen/chipone,icn8318.yaml +f:Documentation/devicetree/bindings/input/touchscreen/cypress,cy8ctma140.yaml +f:Documentation/devicetree/bindings/input/touchscreen/cypress,cy8ctma340.yaml +f:Documentation/devicetree/bindings/input/touchscreen/cypress,tt21000.yaml +f:Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml +f:Documentation/devicetree/bindings/input/touchscreen/eeti,exc3000.yaml +f:Documentation/devicetree/bindings/input/touchscreen/eeti.txt +f:Documentation/devicetree/bindings/input/touchscreen/egalax-ts.txt +f:Documentation/devicetree/bindings/input/touchscreen/elan,ektf2127.yaml +f:Documentation/devicetree/bindings/input/touchscreen/elan,elants_i2c.yaml +f:Documentation/devicetree/bindings/input/touchscreen/fsl,imx6ul-tsc.yaml +f:Documentation/devicetree/bindings/input/touchscreen/fsl-mx25-tcq.txt +f:Documentation/devicetree/bindings/input/touchscreen/goodix,gt9916.yaml +f:Documentation/devicetree/bindings/input/touchscreen/goodix.yaml +f:Documentation/devicetree/bindings/input/touchscreen/hideep.txt +f:Documentation/devicetree/bindings/input/touchscreen/himax,hx83112b.yaml +f:Documentation/devicetree/bindings/input/touchscreen/hycon,hy46xx.yaml +f:Documentation/devicetree/bindings/input/touchscreen/hynitron,cstxxx.yaml +f:Documentation/devicetree/bindings/input/touchscreen/ilitek_ts_i2c.yaml +f:Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml +f:Documentation/devicetree/bindings/input/touchscreen/lpc32xx-tsc.txt +f:Documentation/devicetree/bindings/input/touchscreen/max11801-ts.txt +f:Documentation/devicetree/bindings/input/touchscreen/melfas,mms114.yaml +f:Documentation/devicetree/bindings/input/touchscreen/melfas_mip4.txt +f:Documentation/devicetree/bindings/input/touchscreen/mstar,msg2638.yaml +f:Documentation/devicetree/bindings/input/touchscreen/neonode,zforce.yaml +f:Documentation/devicetree/bindings/input/touchscreen/novatek,nvt-ts.yaml +f:Documentation/devicetree/bindings/input/touchscreen/pixcir,pixcir_ts.yaml +f:Documentation/devicetree/bindings/input/touchscreen/raspberrypi,firmware-ts.txt +f:Documentation/devicetree/bindings/input/touchscreen/resistive-adc-touch.yaml +f:Documentation/devicetree/bindings/input/touchscreen/samsung,s6sy761.yaml +f:Documentation/devicetree/bindings/input/touchscreen/silead,gsl1680.yaml +f:Documentation/devicetree/bindings/input/touchscreen/sis_i2c.txt +f:Documentation/devicetree/bindings/input/touchscreen/sitronix,st1232.yaml +f:Documentation/devicetree/bindings/input/touchscreen/st,stmfts.yaml +f:Documentation/devicetree/bindings/input/touchscreen/sx8654.txt +f:Documentation/devicetree/bindings/input/touchscreen/ti,ads7843.yaml +f:Documentation/devicetree/bindings/input/touchscreen/ti,am3359-tsc.yaml +f:Documentation/devicetree/bindings/input/touchscreen/ti,tsc2005.yaml +f:Documentation/devicetree/bindings/input/touchscreen/toradex,vf50-touchscreen.yaml +f:Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt +f:Documentation/devicetree/bindings/input/touchscreen/touchscreen.yaml +f:Documentation/devicetree/bindings/input/touchscreen/ts4800-ts.txt +f:Documentation/devicetree/bindings/input/touchscreen/tsc2007.txt +f:Documentation/devicetree/bindings/input/touchscreen/zet6223.txt +f:Documentation/devicetree/bindings/input/touchscreen/zinitix,bt400.yaml +f:Documentation/devicetree/bindings/input/tps65218-pwrbutton.txt +f:Documentation/devicetree/bindings/input/twl4030-keypad.txt +f:Documentation/devicetree/bindings/input/zii,rave-sp-pwrbutton.yaml +f:Documentation/devicetree/bindings/interconnect/fsl,imx8m-noc.yaml +f:Documentation/devicetree/bindings/interconnect/interconnect.txt +f:Documentation/devicetree/bindings/interconnect/mediatek,cci.yaml +f:Documentation/devicetree/bindings/interconnect/mediatek,mt8183-emi.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,bcm-voter.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,milos-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,msm8939.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,msm8953.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,msm8974.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,msm8996.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,osm-l3.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,qcm2290.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,qcs615-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,qcs8300-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,qdu1000-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,rpm-common.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,rpm.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,rpmh-common.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sa8775p-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sar2130p-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sc7280-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sc8280xp-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sdm660.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sdx75-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sm6115.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sm6350-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sm7150-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sm8450-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sm8550-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sm8650-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,sm8750-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/qcom,x1e80100-rpmh.yaml +f:Documentation/devicetree/bindings/interconnect/samsung,exynos-bus.yaml +f:Documentation/devicetree/bindings/interrupt-controller/abilis,tb10x-ictl.yaml +f:Documentation/devicetree/bindings/interrupt-controller/actions,owl-sirq.yaml +f:Documentation/devicetree/bindings/interrupt-controller/al,alpine-msix.yaml +f:Documentation/devicetree/bindings/interrupt-controller/allwinner,sun4i-a10-ic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/allwinner,sun6i-a31-r-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/allwinner,sun7i-a20-sc-nmi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/altr,msi-controller.yaml +f:Documentation/devicetree/bindings/interrupt-controller/amazon,al-fic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/amlogic,meson-gpio-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/andestech,plicsw.yaml +f:Documentation/devicetree/bindings/interrupt-controller/apm,xgene1-msi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/apple,aic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/apple,aic2.yaml +f:Documentation/devicetree/bindings/interrupt-controller/arm,gic-v3.yaml +f:Documentation/devicetree/bindings/interrupt-controller/arm,gic-v5-iwb.yaml +f:Documentation/devicetree/bindings/interrupt-controller/arm,gic-v5.yaml +f:Documentation/devicetree/bindings/interrupt-controller/arm,gic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/arm,nvic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/arm,versatile-fpga-irq.yaml +f:Documentation/devicetree/bindings/interrupt-controller/arm,vic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2400-i2c-ic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2400-vic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2500-scu-ic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/atmel,aic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/brcm,bcm2712-msix.yaml +f:Documentation/devicetree/bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/brcm,bcm2836-l1-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/brcm,bcm6345-l1-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/brcm,bcm7038-l1-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/brcm,bcm7120-l2-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/brcm,l2-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/cdns,xtensa-pic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/chrp,open-pic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/cirrus,ep7209-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/cnxt,cx92755-ic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/csky,apb-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/csky,mpintc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/econet,en751221-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ezchip,nps400-ic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/faraday,ftintc010.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,icoll.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,imx8qxp-dc-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,intmux.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,irqsteer.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,ls-extirq.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,ls-msi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,mpic-msi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,mu-msi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,tzic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/fsl,vf610-mscm-ir.yaml +f:Documentation/devicetree/bindings/interrupt-controller/google,goldfish-pic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/hisilicon,mbigen-v2.txt +f:Documentation/devicetree/bindings/interrupt-controller/idt,32434-pic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/img,pdc-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ingenic,intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/intel,ce4100-ioapic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/intel,ce4100-lapic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml +f:Documentation/devicetree/bindings/interrupt-controller/interrupts.txt +f:Documentation/devicetree/bindings/interrupt-controller/jcore,aic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/kontron,sl28cpld-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/loongson,cpu-interrupt-controller.yaml +f:Documentation/devicetree/bindings/interrupt-controller/loongson,eiointc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/loongson,htpic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/loongson,htvec.yaml +f:Documentation/devicetree/bindings/interrupt-controller/loongson,liointc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/loongson,ls1x-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/loongson,pch-msi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/loongson,pch-pic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/lsi,zevio-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/marvell,ap806-gicp.yaml +f:Documentation/devicetree/bindings/interrupt-controller/marvell,ap806-sei.yaml +f:Documentation/devicetree/bindings/interrupt-controller/marvell,armada-8k-pic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/marvell,cp110-icu.yaml +f:Documentation/devicetree/bindings/interrupt-controller/marvell,mpic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/marvell,odmi-controller.yaml +f:Documentation/devicetree/bindings/interrupt-controller/marvell,orion-bridge-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/mediatek,mt6577-sysirq.yaml +f:Documentation/devicetree/bindings/interrupt-controller/mediatek,mtk-cirq.yaml +f:Documentation/devicetree/bindings/interrupt-controller/microchip,lan966x-oic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/microchip,pic32mzda-evic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/microchip,sama7g5-eic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/mrvl,intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/mscc,ocelot-icpu-intr.yaml +f:Documentation/devicetree/bindings/interrupt-controller/msi-controller.yaml +f:Documentation/devicetree/bindings/interrupt-controller/msi.txt +f:Documentation/devicetree/bindings/interrupt-controller/mstar,mst-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/mti,cpu-interrupt-controller.yaml +f:Documentation/devicetree/bindings/interrupt-controller/mti,gic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/nuvoton,wpcm450-aic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/nvidia,tegra20-ictlr.yaml +f:Documentation/devicetree/bindings/interrupt-controller/nxp,lpc3220-mic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/opencores,or1k-pic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/openrisc,ompic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/qca,ar7100-cpu-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/qca,ar7100-misc-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/qcom,mpm.yaml +f:Documentation/devicetree/bindings/interrupt-controller/qcom,pdc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ralink,rt2880-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/rda,8810pl-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/realtek,rtl-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/renesas,intc-irqpin.yaml +f:Documentation/devicetree/bindings/interrupt-controller/renesas,irqc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/renesas,rza1-irqc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/renesas,rzg2l-irqc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/renesas,rzv2h-icu.yaml +f:Documentation/devicetree/bindings/interrupt-controller/riscv,aplic.yaml +f:Documentation/devicetree/bindings/interrupt-controller/riscv,cpu-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/riscv,imsics.yaml +f:Documentation/devicetree/bindings/interrupt-controller/samsung,exynos4210-combiner.yaml +f:Documentation/devicetree/bindings/interrupt-controller/sifive,plic-1.0.0.yaml +f:Documentation/devicetree/bindings/interrupt-controller/snps,arc700-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/snps,archs-idu-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/snps,archs-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/snps,dw-apb-ictl.yaml +f:Documentation/devicetree/bindings/interrupt-controller/socionext,synquacer-exiu.yaml +f:Documentation/devicetree/bindings/interrupt-controller/socionext,uniphier-aidet.yaml +f:Documentation/devicetree/bindings/interrupt-controller/sophgo,sg2042-msi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/st,spear300-shirq.yaml +f:Documentation/devicetree/bindings/interrupt-controller/st,stih407-irq-syscfg.yaml +f:Documentation/devicetree/bindings/interrupt-controller/st,stm32-exti.yaml +f:Documentation/devicetree/bindings/interrupt-controller/starfive,jh8100-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/sunplus,sp7021-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/technologic,ts4800-irqc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-mswi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-sswi.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ti,cp-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ti,keystone-irq.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ti,omap-intc-irq.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ti,omap4-wugen-mpu.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ti,pruss-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ti,sci-inta.yaml +f:Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.yaml +f:Documentation/devicetree/bindings/interrupt-controller/via,vt8500-intc.yaml +f:Documentation/devicetree/bindings/interrupt-controller/xlnx,intc.yaml +f:Documentation/devicetree/bindings/iommu/allwinner,sun50i-h6-iommu.yaml +f:Documentation/devicetree/bindings/iommu/apple,dart.yaml +f:Documentation/devicetree/bindings/iommu/apple,sart.yaml +f:Documentation/devicetree/bindings/iommu/arm,smmu-v3.yaml +f:Documentation/devicetree/bindings/iommu/arm,smmu.yaml +f:Documentation/devicetree/bindings/iommu/iommu.txt +f:Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml +f:Documentation/devicetree/bindings/iommu/nvidia,tegra30-smmu.txt +f:Documentation/devicetree/bindings/iommu/qcom,apq8064-iommu.yaml +f:Documentation/devicetree/bindings/iommu/qcom,iommu.yaml +f:Documentation/devicetree/bindings/iommu/qcom,tbu.yaml +f:Documentation/devicetree/bindings/iommu/renesas,ipmmu-vmsa.yaml +f:Documentation/devicetree/bindings/iommu/riscv,iommu.yaml +f:Documentation/devicetree/bindings/iommu/rockchip,iommu.yaml +f:Documentation/devicetree/bindings/iommu/samsung,sysmmu.yaml +f:Documentation/devicetree/bindings/iommu/sprd,iommu.yaml +f:Documentation/devicetree/bindings/iommu/ti,omap-iommu.txt +f:Documentation/devicetree/bindings/iommu/xen,grant-dma.yaml +f:Documentation/devicetree/bindings/ipmi/aspeed,ast2400-ibt-bmc.txt +f:Documentation/devicetree/bindings/ipmi/aspeed,ast2400-kcs-bmc.yaml +f:Documentation/devicetree/bindings/ipmi/ipmb-dev.yaml +f:Documentation/devicetree/bindings/ipmi/ipmi-ipmb.yaml +f:Documentation/devicetree/bindings/ipmi/ipmi-smic.yaml +f:Documentation/devicetree/bindings/ipmi/npcm7xx-kcs-bmc.txt +f:Documentation/devicetree/bindings/ipmi/ssif-bmc.yaml +f:Documentation/devicetree/bindings/jailhouse.txt +f:Documentation/devicetree/bindings/leds/allwinner,sun50i-a100-ledc.yaml +f:Documentation/devicetree/bindings/leds/ams,as3645a.txt +f:Documentation/devicetree/bindings/leds/awinic,aw200xx.yaml +f:Documentation/devicetree/bindings/leds/backlight/88pm860x.txt +f:Documentation/devicetree/bindings/leds/backlight/apple,dwi-bl.yaml +f:Documentation/devicetree/bindings/leds/backlight/arcxcnn_bl.txt +f:Documentation/devicetree/bindings/leds/backlight/common.yaml +f:Documentation/devicetree/bindings/leds/backlight/gpio-backlight.yaml +f:Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml +f:Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml +f:Documentation/devicetree/bindings/leds/backlight/kinetic,ktz8866.yaml +f:Documentation/devicetree/bindings/leds/backlight/led-backlight.yaml +f:Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml +f:Documentation/devicetree/bindings/leds/backlight/lp855x-backlight.yaml +f:Documentation/devicetree/bindings/leds/backlight/mediatek,mt6370-backlight.yaml +f:Documentation/devicetree/bindings/leds/backlight/mps,mp3309c.yaml +f:Documentation/devicetree/bindings/leds/backlight/pwm-backlight.yaml +f:Documentation/devicetree/bindings/leds/backlight/qcom-wled.yaml +f:Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml +f:Documentation/devicetree/bindings/leds/backlight/sky81452-backlight.txt +f:Documentation/devicetree/bindings/leds/backlight/ti,lm3509.yaml +f:Documentation/devicetree/bindings/leds/backlight/ti,lp8864.yaml +f:Documentation/devicetree/bindings/leds/backlight/tps65217-backlight.txt +f:Documentation/devicetree/bindings/leds/backlight/zii,rave-sp-backlight.yaml +f:Documentation/devicetree/bindings/leds/common.txt +f:Documentation/devicetree/bindings/leds/common.yaml +f:Documentation/devicetree/bindings/leds/cznic,turris-omnia-leds.yaml +f:Documentation/devicetree/bindings/leds/irled/gpio-ir-tx.yaml +f:Documentation/devicetree/bindings/leds/irled/ir-spi-led.yaml +f:Documentation/devicetree/bindings/leds/irled/pwm-ir-tx.yaml +f:Documentation/devicetree/bindings/leds/issi,is31fl319x.yaml +f:Documentation/devicetree/bindings/leds/kinetic,ktd202x.yaml +f:Documentation/devicetree/bindings/leds/kinetic,ktd2692.yaml +f:Documentation/devicetree/bindings/leds/leds-aw2013.yaml +f:Documentation/devicetree/bindings/leds/leds-bcm63138.yaml +f:Documentation/devicetree/bindings/leds/leds-bcm6328.yaml +f:Documentation/devicetree/bindings/leds/leds-bcm6358.txt +f:Documentation/devicetree/bindings/leds/leds-class-multicolor.yaml +f:Documentation/devicetree/bindings/leds/leds-cpcap.txt +f:Documentation/devicetree/bindings/leds/leds-cr0014114.txt +f:Documentation/devicetree/bindings/leds/leds-el15203000.txt +f:Documentation/devicetree/bindings/leds/leds-gpio.yaml +f:Documentation/devicetree/bindings/leds/leds-group-multicolor.yaml +f:Documentation/devicetree/bindings/leds/leds-is31fl32xx.txt +f:Documentation/devicetree/bindings/leds/leds-lgm.yaml +f:Documentation/devicetree/bindings/leds/leds-lm3532.txt +f:Documentation/devicetree/bindings/leds/leds-lm3601x.txt +f:Documentation/devicetree/bindings/leds/leds-lm36274.txt +f:Documentation/devicetree/bindings/leds/leds-lm3697.txt +f:Documentation/devicetree/bindings/leds/leds-lp50xx.yaml +f:Documentation/devicetree/bindings/leds/leds-lp55xx.yaml +f:Documentation/devicetree/bindings/leds/leds-lt3593.txt +f:Documentation/devicetree/bindings/leds/leds-max77650.yaml +f:Documentation/devicetree/bindings/leds/leds-mt6360.yaml +f:Documentation/devicetree/bindings/leds/leds-netxbig.txt +f:Documentation/devicetree/bindings/leds/leds-ns2.txt +f:Documentation/devicetree/bindings/leds/leds-powernv.txt +f:Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml +f:Documentation/devicetree/bindings/leds/leds-pwm.yaml +f:Documentation/devicetree/bindings/leds/leds-qcom-lpg.yaml +f:Documentation/devicetree/bindings/leds/leds-rt4505.yaml +f:Documentation/devicetree/bindings/leds/leds-sgm3140.yaml +f:Documentation/devicetree/bindings/leds/leds-spi-byte.txt +f:Documentation/devicetree/bindings/leds/leds-trigger-pattern.txt +f:Documentation/devicetree/bindings/leds/maxim,max77693.yaml +f:Documentation/devicetree/bindings/leds/mediatek,mt6370-flashlight.yaml +f:Documentation/devicetree/bindings/leds/mediatek,mt6370-indicator.yaml +f:Documentation/devicetree/bindings/leds/nxp,pca953x.yaml +f:Documentation/devicetree/bindings/leds/nxp,pca955x.yaml +f:Documentation/devicetree/bindings/leds/nxp,pca963x.yaml +f:Documentation/devicetree/bindings/leds/nxp,pca995x.yaml +f:Documentation/devicetree/bindings/leds/onnn,ncp5623.yaml +f:Documentation/devicetree/bindings/leds/panasonic,an30259a.yaml +f:Documentation/devicetree/bindings/leds/qcom,pm8058-led.yaml +f:Documentation/devicetree/bindings/leds/qcom,spmi-flash-led.yaml +f:Documentation/devicetree/bindings/leds/register-bit-led.yaml +f:Documentation/devicetree/bindings/leds/regulator-led.yaml +f:Documentation/devicetree/bindings/leds/richtek,rt8515.yaml +f:Documentation/devicetree/bindings/leds/rohm,bd2606mvv.yaml +f:Documentation/devicetree/bindings/leds/rohm,bd71828-leds.yaml +f:Documentation/devicetree/bindings/leds/silergy,sy7802.yaml +f:Documentation/devicetree/bindings/leds/skyworks,aat1290.yaml +f:Documentation/devicetree/bindings/leds/sprd,sc2731-bltc.yaml +f:Documentation/devicetree/bindings/leds/st,led1202.yaml +f:Documentation/devicetree/bindings/leds/ti,lp8860.yaml +f:Documentation/devicetree/bindings/leds/ti,tca6507.yaml +f:Documentation/devicetree/bindings/leds/ti,tlc59116.yaml +f:Documentation/devicetree/bindings/leds/ti,tps61310.yaml +f:Documentation/devicetree/bindings/leds/ti.lm36922.yaml +f:Documentation/devicetree/bindings/leds/trigger-source.yaml +f:Documentation/devicetree/bindings/loongarch/cpus.yaml +f:Documentation/devicetree/bindings/loongarch/loongson.yaml +f:Documentation/devicetree/bindings/mailbox/allwinner,sun6i-a31-msgbox.yaml +f:Documentation/devicetree/bindings/mailbox/altera-mailbox.txt +f:Documentation/devicetree/bindings/mailbox/amlogic,meson-gxbb-mhu.yaml +f:Documentation/devicetree/bindings/mailbox/apple,mailbox.yaml +f:Documentation/devicetree/bindings/mailbox/arm,mhu.yaml +f:Documentation/devicetree/bindings/mailbox/arm,mhuv2.yaml +f:Documentation/devicetree/bindings/mailbox/arm,mhuv3.yaml +f:Documentation/devicetree/bindings/mailbox/brcm,bcm2835-mbox.yaml +f:Documentation/devicetree/bindings/mailbox/brcm,iproc-flexrm-mbox.txt +f:Documentation/devicetree/bindings/mailbox/brcm,iproc-pdc-mbox.txt +f:Documentation/devicetree/bindings/mailbox/cix,sky1-mbox.yaml +f:Documentation/devicetree/bindings/mailbox/fsl,mu.yaml +f:Documentation/devicetree/bindings/mailbox/google,gs101-mbox.yaml +f:Documentation/devicetree/bindings/mailbox/hisilicon,hi3660-mailbox.txt +f:Documentation/devicetree/bindings/mailbox/hisilicon,hi6220-mailbox.txt +f:Documentation/devicetree/bindings/mailbox/mailbox.txt +f:Documentation/devicetree/bindings/mailbox/marvell,armada-3700-rwtm-mailbox.txt +f:Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml +f:Documentation/devicetree/bindings/mailbox/mediatek,gce-props.yaml +f:Documentation/devicetree/bindings/mailbox/microchip,mpfs-mailbox.yaml +f:Documentation/devicetree/bindings/mailbox/microchip,sbi-ipc.yaml +f:Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml +f:Documentation/devicetree/bindings/mailbox/nvidia,tegra186-hsp.yaml +f:Documentation/devicetree/bindings/mailbox/qcom,apcs-kpss-global.yaml +f:Documentation/devicetree/bindings/mailbox/qcom,cpucp-mbox.yaml +f:Documentation/devicetree/bindings/mailbox/qcom-ipcc.yaml +f:Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt +f:Documentation/devicetree/bindings/mailbox/sophgo,cv1800b-mailbox.yaml +f:Documentation/devicetree/bindings/mailbox/sprd-mailbox.yaml +f:Documentation/devicetree/bindings/mailbox/st,sti-mailbox.yaml +f:Documentation/devicetree/bindings/mailbox/st,stm32-ipcc.yaml +f:Documentation/devicetree/bindings/mailbox/thead,th1520-mbox.yaml +f:Documentation/devicetree/bindings/mailbox/ti,message-manager.txt +f:Documentation/devicetree/bindings/mailbox/ti,omap-mailbox.yaml +f:Documentation/devicetree/bindings/mailbox/ti,secure-proxy.yaml +f:Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt +f:Documentation/devicetree/bindings/mailbox/xlnx,zynqmp-ipi-mailbox.yaml +f:Documentation/devicetree/bindings/media/allegro,al5e.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun4i-a10-csi.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun4i-a10-ir.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun4i-a10-video-engine.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun50i-h6-vpu-g2.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun6i-a31-csi.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun6i-a31-isp.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun6i-a31-mipi-csi2.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun8i-a83t-de2-rotate.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun8i-a83t-mipi-csi2.yaml +f:Documentation/devicetree/bindings/media/allwinner,sun8i-h3-deinterlace.yaml +f:Documentation/devicetree/bindings/media/amlogic,axg-ge2d.yaml +f:Documentation/devicetree/bindings/media/amlogic,c3-isp.yaml +f:Documentation/devicetree/bindings/media/amlogic,c3-mipi-adapter.yaml +f:Documentation/devicetree/bindings/media/amlogic,c3-mipi-csi2.yaml +f:Documentation/devicetree/bindings/media/amlogic,gx-vdec.yaml +f:Documentation/devicetree/bindings/media/amlogic,meson-ir-tx.yaml +f:Documentation/devicetree/bindings/media/amlogic,meson6-ir.yaml +f:Documentation/devicetree/bindings/media/amphion,vpu.yaml +f:Documentation/devicetree/bindings/media/aspeed,video-engine.yaml +f:Documentation/devicetree/bindings/media/atmel,isc.yaml +f:Documentation/devicetree/bindings/media/atmel-isi.txt +f:Documentation/devicetree/bindings/media/brcm,bcm2835-unicam.yaml +f:Documentation/devicetree/bindings/media/cdns,csi2rx.yaml +f:Documentation/devicetree/bindings/media/cdns,csi2tx.txt +f:Documentation/devicetree/bindings/media/cec/amlogic,meson-gx-ao-cec.yaml +f:Documentation/devicetree/bindings/media/cec/cec-common.yaml +f:Documentation/devicetree/bindings/media/cec/cec-gpio.yaml +f:Documentation/devicetree/bindings/media/cec/nvidia,tegra114-cec.yaml +f:Documentation/devicetree/bindings/media/cec/samsung,s5p-cec.yaml +f:Documentation/devicetree/bindings/media/cec/st,stih-cec.yaml +f:Documentation/devicetree/bindings/media/cec/st,stm32-cec.yaml +f:Documentation/devicetree/bindings/media/cnm,wave521c.yaml +f:Documentation/devicetree/bindings/media/coda.yaml +f:Documentation/devicetree/bindings/media/fsl,imx-capture-subsystem.yaml +f:Documentation/devicetree/bindings/media/fsl,imx6-mipi-csi2.yaml +f:Documentation/devicetree/bindings/media/fsl,imx6q-vdoa.yaml +f:Documentation/devicetree/bindings/media/fsl,imx6ull-pxp.yaml +f:Documentation/devicetree/bindings/media/fsl,imx8qm-isi.yaml +f:Documentation/devicetree/bindings/media/fsl,imx8qxp-isi.yaml +f:Documentation/devicetree/bindings/media/gpio-ir-receiver.yaml +f:Documentation/devicetree/bindings/media/hix5hd2-ir.txt +f:Documentation/devicetree/bindings/media/i2c/adi,ad5820.yaml +f:Documentation/devicetree/bindings/media/i2c/adi,adp1653.txt +f:Documentation/devicetree/bindings/media/i2c/adi,adv7180.yaml +f:Documentation/devicetree/bindings/media/i2c/adi,adv7343.txt +f:Documentation/devicetree/bindings/media/i2c/adi,adv748x.yaml +f:Documentation/devicetree/bindings/media/i2c/adi,adv7604.yaml +f:Documentation/devicetree/bindings/media/i2c/alliedvision,alvium-csi2.yaml +f:Documentation/devicetree/bindings/media/i2c/aptina,mt9p031.yaml +f:Documentation/devicetree/bindings/media/i2c/aptina,mt9v032.txt +f:Documentation/devicetree/bindings/media/i2c/aptina,mt9v111.yaml +f:Documentation/devicetree/bindings/media/i2c/asahi-kasei,ak7375.yaml +f:Documentation/devicetree/bindings/media/i2c/chrontel,ch7322.yaml +f:Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.yaml +f:Documentation/devicetree/bindings/media/i2c/dongwoon,dw9768.yaml +f:Documentation/devicetree/bindings/media/i2c/dongwoon,dw9807-vcm.yaml +f:Documentation/devicetree/bindings/media/i2c/galaxycore,gc0308.yaml +f:Documentation/devicetree/bindings/media/i2c/galaxycore,gc05a2.yaml +f:Documentation/devicetree/bindings/media/i2c/galaxycore,gc08a3.yaml +f:Documentation/devicetree/bindings/media/i2c/galaxycore,gc2145.yaml +f:Documentation/devicetree/bindings/media/i2c/hynix,hi846.yaml +f:Documentation/devicetree/bindings/media/i2c/imi,rdacm2x-gmsl.yaml +f:Documentation/devicetree/bindings/media/i2c/isil,isl79987.yaml +f:Documentation/devicetree/bindings/media/i2c/maxim,max2175.txt +f:Documentation/devicetree/bindings/media/i2c/maxim,max9286.yaml +f:Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml +f:Documentation/devicetree/bindings/media/i2c/maxim,max96714.yaml +f:Documentation/devicetree/bindings/media/i2c/maxim,max96717.yaml +f:Documentation/devicetree/bindings/media/i2c/melexis,mlx90640.txt +f:Documentation/devicetree/bindings/media/i2c/micron,mt9m111.txt +f:Documentation/devicetree/bindings/media/i2c/mipi-ccs.yaml +f:Documentation/devicetree/bindings/media/i2c/nxp,tda1997x.txt +f:Documentation/devicetree/bindings/media/i2c/onnn,ar0521.yaml +f:Documentation/devicetree/bindings/media/i2c/onnn,mt9m001.txt +f:Documentation/devicetree/bindings/media/i2c/onnn,mt9m114.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,og01a1b.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov02a10.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov02e10.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov08x40.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov2640.txt +f:Documentation/devicetree/bindings/media/i2c/ovti,ov2659.txt +f:Documentation/devicetree/bindings/media/i2c/ovti,ov2680.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov2685.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov4689.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov5640.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov5642.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov5645.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov5647.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov5648.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov5670.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov5675.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov5693.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov64a40.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov7251.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov7670.txt +f:Documentation/devicetree/bindings/media/i2c/ovti,ov772x.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov7740.txt +f:Documentation/devicetree/bindings/media/i2c/ovti,ov8856.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov8858.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov8865.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov9282.yaml +f:Documentation/devicetree/bindings/media/i2c/ovti,ov9650.txt +f:Documentation/devicetree/bindings/media/i2c/panasonic,amg88xx.txt +f:Documentation/devicetree/bindings/media/i2c/rda,rda5807.yaml +f:Documentation/devicetree/bindings/media/i2c/samsung,s5k5baf.yaml +f:Documentation/devicetree/bindings/media/i2c/samsung,s5k6a3.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx214.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx219.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx258.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx274.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx283.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx290.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx296.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx334.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx335.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx412.yaml +f:Documentation/devicetree/bindings/media/i2c/sony,imx415.yaml +f:Documentation/devicetree/bindings/media/i2c/st,st-mipid02.yaml +f:Documentation/devicetree/bindings/media/i2c/st,st-vgxy61.yaml +f:Documentation/devicetree/bindings/media/i2c/st,vd55g1.yaml +f:Documentation/devicetree/bindings/media/i2c/st,vd56g3.yaml +f:Documentation/devicetree/bindings/media/i2c/techwell,tw9900.yaml +f:Documentation/devicetree/bindings/media/i2c/thine,thp7312.yaml +f:Documentation/devicetree/bindings/media/i2c/ti,ds90ub913.yaml +f:Documentation/devicetree/bindings/media/i2c/ti,ds90ub953.yaml +f:Documentation/devicetree/bindings/media/i2c/ti,ds90ub960.yaml +f:Documentation/devicetree/bindings/media/i2c/ti,ths8200.txt +f:Documentation/devicetree/bindings/media/i2c/ti,tvp514x.txt +f:Documentation/devicetree/bindings/media/i2c/ti,tvp5150.txt +f:Documentation/devicetree/bindings/media/i2c/ti,tvp7002.txt +f:Documentation/devicetree/bindings/media/i2c/toshiba,et8ek8.txt +f:Documentation/devicetree/bindings/media/i2c/toshiba,tc358743.txt +f:Documentation/devicetree/bindings/media/i2c/toshiba,tc358746.yaml +f:Documentation/devicetree/bindings/media/img,e5010-jpeg-enc.yaml +f:Documentation/devicetree/bindings/media/img-ir-rev1.txt +f:Documentation/devicetree/bindings/media/marvell,mmp2-ccic.yaml +f:Documentation/devicetree/bindings/media/mediatek,mdp3-fg.yaml +f:Documentation/devicetree/bindings/media/mediatek,mdp3-hdr.yaml +f:Documentation/devicetree/bindings/media/mediatek,mdp3-rdma.yaml +f:Documentation/devicetree/bindings/media/mediatek,mdp3-rsz.yaml +f:Documentation/devicetree/bindings/media/mediatek,mdp3-stitch.yaml +f:Documentation/devicetree/bindings/media/mediatek,mdp3-tcc.yaml +f:Documentation/devicetree/bindings/media/mediatek,mdp3-tdshp.yaml +f:Documentation/devicetree/bindings/media/mediatek,mdp3-wrot.yaml +f:Documentation/devicetree/bindings/media/mediatek,mt7622-cir.yaml +f:Documentation/devicetree/bindings/media/mediatek,mt8195-jpegdec.yaml +f:Documentation/devicetree/bindings/media/mediatek,mt8195-jpegenc.yaml +f:Documentation/devicetree/bindings/media/mediatek,vcodec-decoder.yaml +f:Documentation/devicetree/bindings/media/mediatek,vcodec-encoder.yaml +f:Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml +f:Documentation/devicetree/bindings/media/mediatek-jpeg-decoder.yaml +f:Documentation/devicetree/bindings/media/mediatek-jpeg-encoder.yaml +f:Documentation/devicetree/bindings/media/mediatek-mdp.txt +f:Documentation/devicetree/bindings/media/mediatek-vpu.txt +f:Documentation/devicetree/bindings/media/microchip,csi2dc.yaml +f:Documentation/devicetree/bindings/media/microchip,sama5d4-vdec.yaml +f:Documentation/devicetree/bindings/media/microchip,xisc.yaml +f:Documentation/devicetree/bindings/media/nuvoton,npcm-ece.yaml +f:Documentation/devicetree/bindings/media/nuvoton,npcm-vcd.yaml +f:Documentation/devicetree/bindings/media/nvidia,tegra-vde.yaml +f:Documentation/devicetree/bindings/media/nxp,dw100.yaml +f:Documentation/devicetree/bindings/media/nxp,imx-mipi-csi2.yaml +f:Documentation/devicetree/bindings/media/nxp,imx7-csi.yaml +f:Documentation/devicetree/bindings/media/nxp,imx8-isi.yaml +f:Documentation/devicetree/bindings/media/nxp,imx8-jpeg.yaml +f:Documentation/devicetree/bindings/media/nxp,imx8mq-mipi-csi2.yaml +f:Documentation/devicetree/bindings/media/nxp,imx8mq-vpu.yaml +f:Documentation/devicetree/bindings/media/pxa-camera.txt +f:Documentation/devicetree/bindings/media/qcom,msm8916-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,msm8916-venus.yaml +f:Documentation/devicetree/bindings/media/qcom,msm8953-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,msm8996-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,msm8996-venus.yaml +f:Documentation/devicetree/bindings/media/qcom,sc7180-venus.yaml +f:Documentation/devicetree/bindings/media/qcom,sc7280-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,sc7280-venus.yaml +f:Documentation/devicetree/bindings/media/qcom,sc8280xp-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,sdm660-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,sdm660-venus.yaml +f:Documentation/devicetree/bindings/media/qcom,sdm670-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,sdm845-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,sdm845-venus-v2.yaml +f:Documentation/devicetree/bindings/media/qcom,sdm845-venus.yaml +f:Documentation/devicetree/bindings/media/qcom,sm8250-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,sm8250-venus.yaml +f:Documentation/devicetree/bindings/media/qcom,sm8550-camss.yaml +f:Documentation/devicetree/bindings/media/qcom,sm8550-iris.yaml +f:Documentation/devicetree/bindings/media/qcom,venus-common.yaml +f:Documentation/devicetree/bindings/media/qcom,x1e80100-camss.yaml +f:Documentation/devicetree/bindings/media/raspberrypi,pispbe.yaml +f:Documentation/devicetree/bindings/media/raspberrypi,rp1-cfe.yaml +f:Documentation/devicetree/bindings/media/rc.txt +f:Documentation/devicetree/bindings/media/rc.yaml +f:Documentation/devicetree/bindings/media/renesas,ceu.yaml +f:Documentation/devicetree/bindings/media/renesas,csi2.yaml +f:Documentation/devicetree/bindings/media/renesas,drif.yaml +f:Documentation/devicetree/bindings/media/renesas,fcp.yaml +f:Documentation/devicetree/bindings/media/renesas,fdp1.yaml +f:Documentation/devicetree/bindings/media/renesas,imr.yaml +f:Documentation/devicetree/bindings/media/renesas,isp.yaml +f:Documentation/devicetree/bindings/media/renesas,jpu.yaml +f:Documentation/devicetree/bindings/media/renesas,rzg2l-cru.yaml +f:Documentation/devicetree/bindings/media/renesas,rzg2l-csi2.yaml +f:Documentation/devicetree/bindings/media/renesas,vin.yaml +f:Documentation/devicetree/bindings/media/renesas,vsp1.yaml +f:Documentation/devicetree/bindings/media/rockchip,rk3568-vepu.yaml +f:Documentation/devicetree/bindings/media/rockchip,vdec.yaml +f:Documentation/devicetree/bindings/media/rockchip-isp1.yaml +f:Documentation/devicetree/bindings/media/rockchip-rga.yaml +f:Documentation/devicetree/bindings/media/rockchip-vpu.yaml +f:Documentation/devicetree/bindings/media/samsung,exynos4210-csis.yaml +f:Documentation/devicetree/bindings/media/samsung,exynos4210-fimc.yaml +f:Documentation/devicetree/bindings/media/samsung,exynos4212-fimc-is.yaml +f:Documentation/devicetree/bindings/media/samsung,exynos4212-fimc-lite.yaml +f:Documentation/devicetree/bindings/media/samsung,exynos5250-gsc.yaml +f:Documentation/devicetree/bindings/media/samsung,fimc.yaml +f:Documentation/devicetree/bindings/media/samsung,s5c73m3.yaml +f:Documentation/devicetree/bindings/media/samsung,s5p-mfc.yaml +f:Documentation/devicetree/bindings/media/samsung,s5pv210-jpeg.yaml +f:Documentation/devicetree/bindings/media/si4713.txt +f:Documentation/devicetree/bindings/media/silabs,si470x.yaml +f:Documentation/devicetree/bindings/media/snps,dw-hdmi-rx.yaml +f:Documentation/devicetree/bindings/media/spi/sony-cxd2880.txt +f:Documentation/devicetree/bindings/media/st,st-delta.txt +f:Documentation/devicetree/bindings/media/st,st-hva.txt +f:Documentation/devicetree/bindings/media/st,stih4xx.txt +f:Documentation/devicetree/bindings/media/st,stm32-dcmi.yaml +f:Documentation/devicetree/bindings/media/st,stm32-dcmipp.yaml +f:Documentation/devicetree/bindings/media/st,stm32-dma2d.yaml +f:Documentation/devicetree/bindings/media/st,stm32mp25-csi.yaml +f:Documentation/devicetree/bindings/media/st,stm32mp25-video-codec.yaml +f:Documentation/devicetree/bindings/media/st-rc.txt +f:Documentation/devicetree/bindings/media/starfive,jh7110-camss.yaml +f:Documentation/devicetree/bindings/media/stih407-c8sectpfe.txt +f:Documentation/devicetree/bindings/media/ti,cal.yaml +f:Documentation/devicetree/bindings/media/ti,da850-vpif.txt +f:Documentation/devicetree/bindings/media/ti,j721e-csi2rx-shim.yaml +f:Documentation/devicetree/bindings/media/ti,omap3isp.txt +f:Documentation/devicetree/bindings/media/ti,vpe.yaml +f:Documentation/devicetree/bindings/media/ti-am437x-vpfe.txt +f:Documentation/devicetree/bindings/media/video-interface-devices.yaml +f:Documentation/devicetree/bindings/media/video-interfaces.txt +f:Documentation/devicetree/bindings/media/video-interfaces.yaml +f:Documentation/devicetree/bindings/media/video-mux.yaml +f:Documentation/devicetree/bindings/media/xilinx/video.txt +f:Documentation/devicetree/bindings/media/xilinx/xlnx,csi2rxss.yaml +f:Documentation/devicetree/bindings/media/xilinx/xlnx,v-tc.txt +f:Documentation/devicetree/bindings/media/xilinx/xlnx,v-tpg.txt +f:Documentation/devicetree/bindings/media/xilinx/xlnx,video.txt +f:Documentation/devicetree/bindings/memory-controllers/arm,pl172.yaml +f:Documentation/devicetree/bindings/memory-controllers/arm,pl35x-smc.yaml +f:Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt +f:Documentation/devicetree/bindings/memory-controllers/brcm,brcmstb-memc-ddr.yaml +f:Documentation/devicetree/bindings/memory-controllers/brcm,dpfe-cpu.yaml +f:Documentation/devicetree/bindings/memory-controllers/calxeda-ddr-ctrlr.yaml +f:Documentation/devicetree/bindings/memory-controllers/canaan,k210-sram.yaml +f:Documentation/devicetree/bindings/memory-controllers/ddr/jedec,lpddr-channel.yaml +f:Documentation/devicetree/bindings/memory-controllers/ddr/jedec,lpddr-props.yaml +f:Documentation/devicetree/bindings/memory-controllers/ddr/jedec,lpddr2-timings.yaml +f:Documentation/devicetree/bindings/memory-controllers/ddr/jedec,lpddr2.yaml +f:Documentation/devicetree/bindings/memory-controllers/ddr/jedec,lpddr3-timings.yaml +f:Documentation/devicetree/bindings/memory-controllers/ddr/jedec,lpddr3.yaml +f:Documentation/devicetree/bindings/memory-controllers/ddr/jedec,lpddr4.yaml +f:Documentation/devicetree/bindings/memory-controllers/ddr/jedec,lpddr5.yaml +f:Documentation/devicetree/bindings/memory-controllers/exynos-srom.yaml +f:Documentation/devicetree/bindings/memory-controllers/fsl/fsl,ddr.yaml +f:Documentation/devicetree/bindings/memory-controllers/fsl/fsl,ifc.yaml +f:Documentation/devicetree/bindings/memory-controllers/fsl/fsl,imx-weim-peripherals.yaml +f:Documentation/devicetree/bindings/memory-controllers/fsl/fsl,imx-weim.yaml +f:Documentation/devicetree/bindings/memory-controllers/fsl/imx8m-ddrc.yaml +f:Documentation/devicetree/bindings/memory-controllers/fsl/mmdc.yaml +f:Documentation/devicetree/bindings/memory-controllers/ingenic,nemc-peripherals.yaml +f:Documentation/devicetree/bindings/memory-controllers/ingenic,nemc.yaml +f:Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion-bus-controller.yaml +f:Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion-peripheral-props.yaml +f:Documentation/devicetree/bindings/memory-controllers/marvell,mvebu-sdram-controller.yaml +f:Documentation/devicetree/bindings/memory-controllers/mc-peripheral-props.yaml +f:Documentation/devicetree/bindings/memory-controllers/mediatek,mt7621-memc.yaml +f:Documentation/devicetree/bindings/memory-controllers/mediatek,smi-common.yaml +f:Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml +f:Documentation/devicetree/bindings/memory-controllers/mvebu-devbus.txt +f:Documentation/devicetree/bindings/memory-controllers/nuvoton,npcm-memory-controller.yaml +f:Documentation/devicetree/bindings/memory-controllers/nvidia,tegra124-emc.yaml +f:Documentation/devicetree/bindings/memory-controllers/nvidia,tegra124-mc.yaml +f:Documentation/devicetree/bindings/memory-controllers/nvidia,tegra186-mc.yaml +f:Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-emc.yaml +f:Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-mc.yaml +f:Documentation/devicetree/bindings/memory-controllers/nvidia,tegra210-emc.yaml +f:Documentation/devicetree/bindings/memory-controllers/nvidia,tegra30-emc.yaml +f:Documentation/devicetree/bindings/memory-controllers/nvidia,tegra30-mc.yaml +f:Documentation/devicetree/bindings/memory-controllers/qca,ath79-ddr-controller.yaml +f:Documentation/devicetree/bindings/memory-controllers/qcom,ebi2-peripheral-props.yaml +f:Documentation/devicetree/bindings/memory-controllers/qcom,ebi2.yaml +f:Documentation/devicetree/bindings/memory-controllers/renesas,dbsc.yaml +f:Documentation/devicetree/bindings/memory-controllers/renesas,rpc-if.yaml +f:Documentation/devicetree/bindings/memory-controllers/renesas,rzg3e-xspi.yaml +f:Documentation/devicetree/bindings/memory-controllers/rockchip,rk3399-dmc.yaml +f:Documentation/devicetree/bindings/memory-controllers/samsung,exynos4210-srom-peripheral-props.yaml +f:Documentation/devicetree/bindings/memory-controllers/samsung,exynos5422-dmc.yaml +f:Documentation/devicetree/bindings/memory-controllers/samsung,s5pv210-dmc.yaml +f:Documentation/devicetree/bindings/memory-controllers/snps,dw-umctl2-ddrc.yaml +f:Documentation/devicetree/bindings/memory-controllers/st,stm32-fmc2-ebi-props.yaml +f:Documentation/devicetree/bindings/memory-controllers/st,stm32-fmc2-ebi.yaml +f:Documentation/devicetree/bindings/memory-controllers/st,stm32mp25-omm.yaml +f:Documentation/devicetree/bindings/memory-controllers/ti,da8xx-ddrctl.yaml +f:Documentation/devicetree/bindings/memory-controllers/ti,gpmc-child.yaml +f:Documentation/devicetree/bindings/memory-controllers/ti,gpmc.yaml +f:Documentation/devicetree/bindings/memory-controllers/ti-aemif.txt +f:Documentation/devicetree/bindings/memory-controllers/ti/emif.txt +f:Documentation/devicetree/bindings/memory-controllers/xlnx,versal-ddrmc-edac.yaml +f:Documentation/devicetree/bindings/memory-controllers/xlnx,zynq-ddrc-a05.yaml +f:Documentation/devicetree/bindings/memory-controllers/xlnx,zynqmp-ocmc-1.0.yaml +f:Documentation/devicetree/bindings/mfd/88pm860x.txt +f:Documentation/devicetree/bindings/mfd/act8945a.txt +f:Documentation/devicetree/bindings/mfd/actions,atc260x.yaml +f:Documentation/devicetree/bindings/mfd/adi,adp5585.yaml +f:Documentation/devicetree/bindings/mfd/adi,max77541.yaml +f:Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml +f:Documentation/devicetree/bindings/mfd/allwinner,sun4i-a10-ts.yaml +f:Documentation/devicetree/bindings/mfd/allwinner,sun6i-a31-prcm.yaml +f:Documentation/devicetree/bindings/mfd/allwinner,sun8i-a23-prcm.yaml +f:Documentation/devicetree/bindings/mfd/altera-a10sr.txt +f:Documentation/devicetree/bindings/mfd/ampere,smpro.yaml +f:Documentation/devicetree/bindings/mfd/ams,as3711.yaml +f:Documentation/devicetree/bindings/mfd/apple,smc.yaml +f:Documentation/devicetree/bindings/mfd/arm,dev-platforms-syscon.yaml +f:Documentation/devicetree/bindings/mfd/as3722.txt +f:Documentation/devicetree/bindings/mfd/aspeed,ast2x00-scu.yaml +f:Documentation/devicetree/bindings/mfd/aspeed-gfx.txt +f:Documentation/devicetree/bindings/mfd/aspeed-lpc.yaml +f:Documentation/devicetree/bindings/mfd/atmel,at91sam9260-gpbr.yaml +f:Documentation/devicetree/bindings/mfd/atmel,at91sam9260-matrix.yaml +f:Documentation/devicetree/bindings/mfd/atmel,hlcdc.yaml +f:Documentation/devicetree/bindings/mfd/atmel,sama5d2-flexcom.yaml +f:Documentation/devicetree/bindings/mfd/atmel-smc.txt +f:Documentation/devicetree/bindings/mfd/bfticu.txt +f:Documentation/devicetree/bindings/mfd/brcm,bcm59056.yaml +f:Documentation/devicetree/bindings/mfd/brcm,bcm6318-gpio-sysctl.yaml +f:Documentation/devicetree/bindings/mfd/brcm,bcm63268-gpio-sysctl.yaml +f:Documentation/devicetree/bindings/mfd/brcm,bcm6328-gpio-sysctl.yaml +f:Documentation/devicetree/bindings/mfd/brcm,bcm6358-gpio-sysctl.yaml +f:Documentation/devicetree/bindings/mfd/brcm,bcm6362-gpio-sysctl.yaml +f:Documentation/devicetree/bindings/mfd/brcm,bcm6368-gpio-sysctl.yaml +f:Documentation/devicetree/bindings/mfd/brcm,cru.yaml +f:Documentation/devicetree/bindings/mfd/brcm,misc.yaml +f:Documentation/devicetree/bindings/mfd/brcm,twd.yaml +f:Documentation/devicetree/bindings/mfd/canaan,k210-sysctl.yaml +f:Documentation/devicetree/bindings/mfd/cirrus,lochnagar.yaml +f:Documentation/devicetree/bindings/mfd/cirrus,madera.yaml +f:Documentation/devicetree/bindings/mfd/da9052-i2c.txt +f:Documentation/devicetree/bindings/mfd/da9055.txt +f:Documentation/devicetree/bindings/mfd/da9150.txt +f:Documentation/devicetree/bindings/mfd/delta,tn48m-cpld.yaml +f:Documentation/devicetree/bindings/mfd/dlg,da9063.yaml +f:Documentation/devicetree/bindings/mfd/ene-kb3930.yaml +f:Documentation/devicetree/bindings/mfd/ene-kb930.yaml +f:Documentation/devicetree/bindings/mfd/fsl,mcu-mpc8349emitx.yaml +f:Documentation/devicetree/bindings/mfd/fsl-imx25-tsadc.txt +f:Documentation/devicetree/bindings/mfd/gateworks-gsc.yaml +f:Documentation/devicetree/bindings/mfd/google,cros-ec.yaml +f:Documentation/devicetree/bindings/mfd/hi6421.txt +f:Documentation/devicetree/bindings/mfd/hisilicon,hi6421-spmi-pmic.yaml +f:Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt +f:Documentation/devicetree/bindings/mfd/iqs62x.yaml +f:Documentation/devicetree/bindings/mfd/khadas,mcu.yaml +f:Documentation/devicetree/bindings/mfd/kontron,sl28cpld.yaml +f:Documentation/devicetree/bindings/mfd/lp3943.txt +f:Documentation/devicetree/bindings/mfd/marvell,88pm886-a1.yaml +f:Documentation/devicetree/bindings/mfd/max77620.txt +f:Documentation/devicetree/bindings/mfd/max77650.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max14577.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max5970.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max77686.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max77693.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max77705.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max77714.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max77759.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max77802.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max77843.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max8925.yaml +f:Documentation/devicetree/bindings/mfd/maxim,max8998.yaml +f:Documentation/devicetree/bindings/mfd/mc13xxx.txt +f:Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml +f:Documentation/devicetree/bindings/mfd/mediatek,mt6360.yaml +f:Documentation/devicetree/bindings/mfd/mediatek,mt6370.yaml +f:Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml +f:Documentation/devicetree/bindings/mfd/mediatek,mt8195-scpsys.yaml +f:Documentation/devicetree/bindings/mfd/mfd.txt +f:Documentation/devicetree/bindings/mfd/motorola-cpcap.txt +f:Documentation/devicetree/bindings/mfd/mps,mp2629.yaml +f:Documentation/devicetree/bindings/mfd/mscc,ocelot.yaml +f:Documentation/devicetree/bindings/mfd/mxs-lradc.yaml +f:Documentation/devicetree/bindings/mfd/netronix,ntxec.yaml +f:Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml +f:Documentation/devicetree/bindings/mfd/nxp,lpc1850-creg.yaml +f:Documentation/devicetree/bindings/mfd/omap-usb-host.txt +f:Documentation/devicetree/bindings/mfd/omap-usb-tll.txt +f:Documentation/devicetree/bindings/mfd/palmas.txt +f:Documentation/devicetree/bindings/mfd/qcom,pm8008.yaml +f:Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml +f:Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml +f:Documentation/devicetree/bindings/mfd/qcom-pm8xxx.yaml +f:Documentation/devicetree/bindings/mfd/qnap,ts433-mcu.yaml +f:Documentation/devicetree/bindings/mfd/qriox.txt +f:Documentation/devicetree/bindings/mfd/retu.txt +f:Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml +f:Documentation/devicetree/bindings/mfd/richtek,rt5033.yaml +f:Documentation/devicetree/bindings/mfd/richtek,rt5120.yaml +f:Documentation/devicetree/bindings/mfd/ricoh,rn5t618.yaml +f:Documentation/devicetree/bindings/mfd/rockchip,rk805.yaml +f:Documentation/devicetree/bindings/mfd/rockchip,rk806.yaml +f:Documentation/devicetree/bindings/mfd/rockchip,rk808.yaml +f:Documentation/devicetree/bindings/mfd/rockchip,rk816.yaml +f:Documentation/devicetree/bindings/mfd/rockchip,rk817.yaml +f:Documentation/devicetree/bindings/mfd/rockchip,rk818.yaml +f:Documentation/devicetree/bindings/mfd/rohm,bd71815-pmic.yaml +f:Documentation/devicetree/bindings/mfd/rohm,bd71828-pmic.yaml +f:Documentation/devicetree/bindings/mfd/rohm,bd71837-pmic.yaml +f:Documentation/devicetree/bindings/mfd/rohm,bd71847-pmic.yaml +f:Documentation/devicetree/bindings/mfd/rohm,bd9571mwv.yaml +f:Documentation/devicetree/bindings/mfd/rohm,bd9576-pmic.yaml +f:Documentation/devicetree/bindings/mfd/rohm,bd96801-pmic.yaml +f:Documentation/devicetree/bindings/mfd/rohm,bd96802-pmic.yaml +f:Documentation/devicetree/bindings/mfd/samsung,exynos5433-lpass.yaml +f:Documentation/devicetree/bindings/mfd/samsung,s2dos05.yaml +f:Documentation/devicetree/bindings/mfd/samsung,s2mpa01.yaml +f:Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml +f:Documentation/devicetree/bindings/mfd/samsung,s5m8767.yaml +f:Documentation/devicetree/bindings/mfd/silergy,sy7636a.yaml +f:Documentation/devicetree/bindings/mfd/sky81452.txt +f:Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml +f:Documentation/devicetree/bindings/mfd/sprd,ums512-glbreg.yaml +f:Documentation/devicetree/bindings/mfd/st,stm32-lptimer.yaml +f:Documentation/devicetree/bindings/mfd/st,stm32-timers.yaml +f:Documentation/devicetree/bindings/mfd/st,stmfx.yaml +f:Documentation/devicetree/bindings/mfd/st,stmpe.yaml +f:Documentation/devicetree/bindings/mfd/st,stpmic1.yaml +f:Documentation/devicetree/bindings/mfd/stericsson,ab8500.yaml +f:Documentation/devicetree/bindings/mfd/stericsson,db8500-prcmu.yaml +f:Documentation/devicetree/bindings/mfd/syscon-common.yaml +f:Documentation/devicetree/bindings/mfd/syscon.yaml +f:Documentation/devicetree/bindings/mfd/tc3589x.txt +f:Documentation/devicetree/bindings/mfd/ti,am3359-tscadc.yaml +f:Documentation/devicetree/bindings/mfd/ti,lp8732.yaml +f:Documentation/devicetree/bindings/mfd/ti,lp87524-q1.yaml +f:Documentation/devicetree/bindings/mfd/ti,lp87561-q1.yaml +f:Documentation/devicetree/bindings/mfd/ti,lp87565-q1.yaml +f:Documentation/devicetree/bindings/mfd/ti,nspire-misc.yaml +f:Documentation/devicetree/bindings/mfd/ti,tps65086.yaml +f:Documentation/devicetree/bindings/mfd/ti,tps65910.yaml +f:Documentation/devicetree/bindings/mfd/ti,tps6594.yaml +f:Documentation/devicetree/bindings/mfd/ti,twl.yaml +f:Documentation/devicetree/bindings/mfd/ti-keystone-devctrl.txt +f:Documentation/devicetree/bindings/mfd/ti-lmu.txt +f:Documentation/devicetree/bindings/mfd/tps6105x.txt +f:Documentation/devicetree/bindings/mfd/tps6507x.txt +f:Documentation/devicetree/bindings/mfd/tps65912.txt +f:Documentation/devicetree/bindings/mfd/twl4030-audio.txt +f:Documentation/devicetree/bindings/mfd/twl4030-power.txt +f:Documentation/devicetree/bindings/mfd/twl6040.txt +f:Documentation/devicetree/bindings/mfd/wlf,arizona.yaml +f:Documentation/devicetree/bindings/mfd/wm831x.txt +f:Documentation/devicetree/bindings/mfd/x-powers,ac100.yaml +f:Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml +f:Documentation/devicetree/bindings/mfd/xylon,logicvc.yaml +f:Documentation/devicetree/bindings/mfd/zii,rave-sp.yaml +f:Documentation/devicetree/bindings/mips/ath79-soc.txt +f:Documentation/devicetree/bindings/mips/brcm/soc.txt +f:Documentation/devicetree/bindings/mips/brcm/soc.yaml +f:Documentation/devicetree/bindings/mips/cavium/bootbus.txt +f:Documentation/devicetree/bindings/mips/cavium/cib.txt +f:Documentation/devicetree/bindings/mips/cavium/ciu.txt +f:Documentation/devicetree/bindings/mips/cavium/ciu2.txt +f:Documentation/devicetree/bindings/mips/cavium/ciu3.txt +f:Documentation/devicetree/bindings/mips/cavium/dma-engine.txt +f:Documentation/devicetree/bindings/mips/cavium/sata-uctl.txt +f:Documentation/devicetree/bindings/mips/cavium/uctl.txt +f:Documentation/devicetree/bindings/mips/cpus.yaml +f:Documentation/devicetree/bindings/mips/econet.yaml +f:Documentation/devicetree/bindings/mips/img/pistachio-marduk.txt +f:Documentation/devicetree/bindings/mips/img/pistachio.txt +f:Documentation/devicetree/bindings/mips/img/xilfpga.txt +f:Documentation/devicetree/bindings/mips/ingenic/devices.yaml +f:Documentation/devicetree/bindings/mips/lantiq/fpi-bus.txt +f:Documentation/devicetree/bindings/mips/lantiq/lantiq,cgu.yaml +f:Documentation/devicetree/bindings/mips/lantiq/lantiq,dma-xway.yaml +f:Documentation/devicetree/bindings/mips/lantiq/lantiq,ebu.yaml +f:Documentation/devicetree/bindings/mips/lantiq/lantiq,pmu.yaml +f:Documentation/devicetree/bindings/mips/lantiq/rcu.txt +f:Documentation/devicetree/bindings/mips/loongson/devices.yaml +f:Documentation/devicetree/bindings/mips/loongson/ls2k-reset.yaml +f:Documentation/devicetree/bindings/mips/loongson/rs780e-acpi.yaml +f:Documentation/devicetree/bindings/mips/mobileye.yaml +f:Documentation/devicetree/bindings/mips/mscc.txt +f:Documentation/devicetree/bindings/mips/mti,mips-cm.yaml +f:Documentation/devicetree/bindings/mips/ni.txt +f:Documentation/devicetree/bindings/mips/pic32/microchip,pic32mzda.txt +f:Documentation/devicetree/bindings/mips/ralink.yaml +f:Documentation/devicetree/bindings/mips/realtek-rtl.yaml +f:Documentation/devicetree/bindings/misc/aspeed,ast2400-cvic.yaml +f:Documentation/devicetree/bindings/misc/aspeed-p2a-ctrl.txt +f:Documentation/devicetree/bindings/misc/fsl,dpaa2-console.yaml +f:Documentation/devicetree/bindings/misc/fsl,qoriq-mc.yaml +f:Documentation/devicetree/bindings/misc/ge-achc.yaml +f:Documentation/devicetree/bindings/misc/idt,89hpesx.yaml +f:Documentation/devicetree/bindings/misc/ifm-csi.txt +f:Documentation/devicetree/bindings/misc/intel,ixp4xx-ahb-queue-manager.yaml +f:Documentation/devicetree/bindings/misc/lwn,bk4-spi.yaml +f:Documentation/devicetree/bindings/misc/nvidia,tegra186-misc.yaml +f:Documentation/devicetree/bindings/misc/nvidia,tegra20-apbmisc.yaml +f:Documentation/devicetree/bindings/misc/olpc,xo1.75-ec.yaml +f:Documentation/devicetree/bindings/misc/pci1de4,1.yaml +f:Documentation/devicetree/bindings/misc/pvpanic-mmio.txt +f:Documentation/devicetree/bindings/misc/qcom,fastrpc.yaml +f:Documentation/devicetree/bindings/misc/qemu,vcpu-stall-detector.yaml +f:Documentation/devicetree/bindings/misc/ti,fpc202.yaml +f:Documentation/devicetree/bindings/misc/ti,j721e-esm.yaml +f:Documentation/devicetree/bindings/misc/xlnx,sd-fec.yaml +f:Documentation/devicetree/bindings/misc/xlnx,tmr-inject.yaml +f:Documentation/devicetree/bindings/misc/xlnx,tmr-manager.yaml +f:Documentation/devicetree/bindings/mmc/allwinner,sun4i-a10-mmc.yaml +f:Documentation/devicetree/bindings/mmc/amlogic,meson-gx-mmc.yaml +f:Documentation/devicetree/bindings/mmc/amlogic,meson-mx-sdhc.yaml +f:Documentation/devicetree/bindings/mmc/amlogic,meson-mx-sdio.yaml +f:Documentation/devicetree/bindings/mmc/arasan,sdhci.yaml +f:Documentation/devicetree/bindings/mmc/arm,pl18x.yaml +f:Documentation/devicetree/bindings/mmc/aspeed,sdhci.yaml +f:Documentation/devicetree/bindings/mmc/atmel,hsmci.yaml +f:Documentation/devicetree/bindings/mmc/atmel,sama5d2-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/bluefield-dw-mshc.txt +f:Documentation/devicetree/bindings/mmc/brcm,bcm2835-sdhost.yaml +f:Documentation/devicetree/bindings/mmc/brcm,iproc-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/brcm,kona-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/brcm,sdhci-brcmstb.yaml +f:Documentation/devicetree/bindings/mmc/cavium-mmc.txt +f:Documentation/devicetree/bindings/mmc/cdns,sdhci.yaml +f:Documentation/devicetree/bindings/mmc/davinci_mmc.txt +f:Documentation/devicetree/bindings/mmc/fsl,esdhc.yaml +f:Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.yaml +f:Documentation/devicetree/bindings/mmc/fsl-imx-mmc.yaml +f:Documentation/devicetree/bindings/mmc/fujitsu,sdhci-fujitsu.yaml +f:Documentation/devicetree/bindings/mmc/hisilicon,hi3798cv200-dw-mshc.yaml +f:Documentation/devicetree/bindings/mmc/ingenic,mmc.yaml +f:Documentation/devicetree/bindings/mmc/k3-dw-mshc.txt +f:Documentation/devicetree/bindings/mmc/litex,mmc.yaml +f:Documentation/devicetree/bindings/mmc/loongson,ls2k0500-mmc.yaml +f:Documentation/devicetree/bindings/mmc/marvell,dove-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/marvell,orion-sdio.yaml +f:Documentation/devicetree/bindings/mmc/marvell,xenon-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/microchip,dw-sparx5-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/microchip,sdhci-pic32.yaml +f:Documentation/devicetree/bindings/mmc/mmc-card.yaml +f:Documentation/devicetree/bindings/mmc/mmc-controller-common.yaml +f:Documentation/devicetree/bindings/mmc/mmc-controller.yaml +f:Documentation/devicetree/bindings/mmc/mmc-pwrseq-emmc.yaml +f:Documentation/devicetree/bindings/mmc/mmc-pwrseq-sd8787.yaml +f:Documentation/devicetree/bindings/mmc/mmc-pwrseq-simple.yaml +f:Documentation/devicetree/bindings/mmc/mmc-slot.yaml +f:Documentation/devicetree/bindings/mmc/mmc-spi-slot.yaml +f:Documentation/devicetree/bindings/mmc/mmc.txt +f:Documentation/devicetree/bindings/mmc/moxa,moxart-mmc.txt +f:Documentation/devicetree/bindings/mmc/mtk-sd.yaml +f:Documentation/devicetree/bindings/mmc/mxs-mmc.yaml +f:Documentation/devicetree/bindings/mmc/npcm,sdhci.yaml +f:Documentation/devicetree/bindings/mmc/nuvoton,ma35d1-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/nvidia,tegra20-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/owl-mmc.yaml +f:Documentation/devicetree/bindings/mmc/pxa-mmc.txt +f:Documentation/devicetree/bindings/mmc/renesas,mmcif.yaml +f:Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml +f:Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.yaml +f:Documentation/devicetree/bindings/mmc/samsung,exynos-dw-mshc.yaml +f:Documentation/devicetree/bindings/mmc/samsung,s3c6410-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/sdhci-am654.yaml +f:Documentation/devicetree/bindings/mmc/sdhci-common.yaml +f:Documentation/devicetree/bindings/mmc/sdhci-milbeaut.txt +f:Documentation/devicetree/bindings/mmc/sdhci-msm.yaml +f:Documentation/devicetree/bindings/mmc/sdhci-omap.txt +f:Documentation/devicetree/bindings/mmc/sdhci-pxa.yaml +f:Documentation/devicetree/bindings/mmc/sdhci-spear.txt +f:Documentation/devicetree/bindings/mmc/sdhci-st.txt +f:Documentation/devicetree/bindings/mmc/snps,dwcmshc-sdhci.yaml +f:Documentation/devicetree/bindings/mmc/socionext,uniphier-sd.yaml +f:Documentation/devicetree/bindings/mmc/spacemit,sdhci.yaml +f:Documentation/devicetree/bindings/mmc/sprd,sdhci-r11.yaml +f:Documentation/devicetree/bindings/mmc/starfive,jh7110-mmc.yaml +f:Documentation/devicetree/bindings/mmc/sunplus,mmc.yaml +f:Documentation/devicetree/bindings/mmc/synopsys-dw-mshc-common.yaml +f:Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.yaml +f:Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt +f:Documentation/devicetree/bindings/mmc/ti-omap.txt +f:Documentation/devicetree/bindings/mmc/usdhi6rol0.txt +f:Documentation/devicetree/bindings/mmc/wm,wm8505-sdhc.yaml +f:Documentation/devicetree/bindings/mtd/allwinner,sun4i-a10-nand.yaml +f:Documentation/devicetree/bindings/mtd/amlogic,meson-nand.yaml +f:Documentation/devicetree/bindings/mtd/arasan,nand-controller.yaml +f:Documentation/devicetree/bindings/mtd/arm,pl353-nand-r2p1.yaml +f:Documentation/devicetree/bindings/mtd/atmel,dataflash.yaml +f:Documentation/devicetree/bindings/mtd/atmel-nand.txt +f:Documentation/devicetree/bindings/mtd/brcm,brcmnand.yaml +f:Documentation/devicetree/bindings/mtd/cdns,hp-nfc.yaml +f:Documentation/devicetree/bindings/mtd/denali,nand.yaml +f:Documentation/devicetree/bindings/mtd/diskonchip.txt +f:Documentation/devicetree/bindings/mtd/flctl-nand.txt +f:Documentation/devicetree/bindings/mtd/fsl,vf610-nfc.yaml +f:Documentation/devicetree/bindings/mtd/fsl-upm-nand.txt +f:Documentation/devicetree/bindings/mtd/fsmc-nand.txt +f:Documentation/devicetree/bindings/mtd/gpio-control-nand.txt +f:Documentation/devicetree/bindings/mtd/gpmi-nand.yaml +f:Documentation/devicetree/bindings/mtd/hisi504-nand.txt +f:Documentation/devicetree/bindings/mtd/hisilicon,fmc-spi-nor.txt +f:Documentation/devicetree/bindings/mtd/ibm,ndfc.txt +f:Documentation/devicetree/bindings/mtd/ingenic,nand.yaml +f:Documentation/devicetree/bindings/mtd/intel,lgm-ebunand.yaml +f:Documentation/devicetree/bindings/mtd/jedec,spi-nor.yaml +f:Documentation/devicetree/bindings/mtd/loongson,ls1b-nand-controller.yaml +f:Documentation/devicetree/bindings/mtd/lpc32xx-mlc.txt +f:Documentation/devicetree/bindings/mtd/lpc32xx-slc.txt +f:Documentation/devicetree/bindings/mtd/marvell,nand-controller.yaml +f:Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml +f:Documentation/devicetree/bindings/mtd/mediatek,nand-ecc-engine.yaml +f:Documentation/devicetree/bindings/mtd/microchip,mchp23k256.txt +f:Documentation/devicetree/bindings/mtd/microchip,mchp48l640.yaml +f:Documentation/devicetree/bindings/mtd/mtd-physmap.yaml +f:Documentation/devicetree/bindings/mtd/mtd.yaml +f:Documentation/devicetree/bindings/mtd/mxc-nand.yaml +f:Documentation/devicetree/bindings/mtd/mxic-nand.txt +f:Documentation/devicetree/bindings/mtd/mxicy,nand-ecc-engine.yaml +f:Documentation/devicetree/bindings/mtd/nand-chip.yaml +f:Documentation/devicetree/bindings/mtd/nand-controller.yaml +f:Documentation/devicetree/bindings/mtd/nand-macronix.txt +f:Documentation/devicetree/bindings/mtd/nuvoton,ma35d1-nand.yaml +f:Documentation/devicetree/bindings/mtd/nvidia-tegra20-nand.txt +f:Documentation/devicetree/bindings/mtd/nxp,lpc1773-spifi.yaml +f:Documentation/devicetree/bindings/mtd/orion-nand.txt +f:Documentation/devicetree/bindings/mtd/partitions/arm,arm-firmware-suite.yaml +f:Documentation/devicetree/bindings/mtd/partitions/binman.yaml +f:Documentation/devicetree/bindings/mtd/partitions/brcm,bcm4908-partitions.yaml +f:Documentation/devicetree/bindings/mtd/partitions/brcm,bcm947xx-cfe-partitions.yaml +f:Documentation/devicetree/bindings/mtd/partitions/brcm,bcm963xx-cfe-nor-partitions.txt +f:Documentation/devicetree/bindings/mtd/partitions/brcm,bcm963xx-imagetag.txt +f:Documentation/devicetree/bindings/mtd/partitions/brcm,trx.txt +f:Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml +f:Documentation/devicetree/bindings/mtd/partitions/linksys,ns-partitions.yaml +f:Documentation/devicetree/bindings/mtd/partitions/linux,ubi.yaml +f:Documentation/devicetree/bindings/mtd/partitions/nvmem-cells.yaml +f:Documentation/devicetree/bindings/mtd/partitions/partition.yaml +f:Documentation/devicetree/bindings/mtd/partitions/partitions.yaml +f:Documentation/devicetree/bindings/mtd/partitions/qcom,smem-part.yaml +f:Documentation/devicetree/bindings/mtd/partitions/redboot-fis.yaml +f:Documentation/devicetree/bindings/mtd/partitions/seama.yaml +f:Documentation/devicetree/bindings/mtd/partitions/tplink,safeloader-partitions.yaml +f:Documentation/devicetree/bindings/mtd/partitions/u-boot.yaml +f:Documentation/devicetree/bindings/mtd/partitions/ubi-volume.yaml +f:Documentation/devicetree/bindings/mtd/qcom,nandc.yaml +f:Documentation/devicetree/bindings/mtd/raw-nand-chip.yaml +f:Documentation/devicetree/bindings/mtd/renesas-nandc.yaml +f:Documentation/devicetree/bindings/mtd/rockchip,nand-controller.yaml +f:Documentation/devicetree/bindings/mtd/samsung,s5pv210-onenand.yaml +f:Documentation/devicetree/bindings/mtd/samsung-s3c2410.txt +f:Documentation/devicetree/bindings/mtd/spear_smi.txt +f:Documentation/devicetree/bindings/mtd/spi-nand.yaml +f:Documentation/devicetree/bindings/mtd/st,stm32-fmc2-nand.yaml +f:Documentation/devicetree/bindings/mtd/st-fsm.txt +f:Documentation/devicetree/bindings/mtd/technologic,nand.yaml +f:Documentation/devicetree/bindings/mtd/ti,am654-hbmc.yaml +f:Documentation/devicetree/bindings/mtd/ti,davinci-nand.yaml +f:Documentation/devicetree/bindings/mtd/ti,elm.yaml +f:Documentation/devicetree/bindings/mtd/ti,gpmc-nand.yaml +f:Documentation/devicetree/bindings/mtd/ti,gpmc-onenand.yaml +f:Documentation/devicetree/bindings/mux/adi,adg792a.txt +f:Documentation/devicetree/bindings/mux/adi,adgs1408.txt +f:Documentation/devicetree/bindings/mux/gpio-mux.yaml +f:Documentation/devicetree/bindings/mux/mux-consumer.yaml +f:Documentation/devicetree/bindings/mux/mux-controller.yaml +f:Documentation/devicetree/bindings/mux/reg-mux.yaml +f:Documentation/devicetree/bindings/net/actions,owl-emac.yaml +f:Documentation/devicetree/bindings/net/adi,adin.yaml +f:Documentation/devicetree/bindings/net/adi,adin1110.yaml +f:Documentation/devicetree/bindings/net/aeonsemi,as21xxx.yaml +f:Documentation/devicetree/bindings/net/airoha,an7583-mdio.yaml +f:Documentation/devicetree/bindings/net/airoha,en7581-eth.yaml +f:Documentation/devicetree/bindings/net/airoha,en7581-npu.yaml +f:Documentation/devicetree/bindings/net/airoha,en8811h.yaml +f:Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml +f:Documentation/devicetree/bindings/net/allwinner,sun4i-a10-mdio.yaml +f:Documentation/devicetree/bindings/net/allwinner,sun7i-a20-gmac.yaml +f:Documentation/devicetree/bindings/net/allwinner,sun8i-a83t-emac.yaml +f:Documentation/devicetree/bindings/net/altr,gmii-to-sgmii-2.0.yaml +f:Documentation/devicetree/bindings/net/altr,socfpga-stmmac.yaml +f:Documentation/devicetree/bindings/net/altr,tse.yaml +f:Documentation/devicetree/bindings/net/amd-xgbe.txt +f:Documentation/devicetree/bindings/net/amlogic,g12a-mdio-mux.yaml +f:Documentation/devicetree/bindings/net/amlogic,gxl-mdio-mux.yaml +f:Documentation/devicetree/bindings/net/amlogic,meson-dwmac.yaml +f:Documentation/devicetree/bindings/net/anarion-gmac.txt +f:Documentation/devicetree/bindings/net/apm-xgene-enet.txt +f:Documentation/devicetree/bindings/net/apm-xgene-mdio.txt +f:Documentation/devicetree/bindings/net/asix,ax88178.yaml +f:Documentation/devicetree/bindings/net/asix,ax88796c.yaml +f:Documentation/devicetree/bindings/net/aspeed,ast2600-mdio.yaml +f:Documentation/devicetree/bindings/net/bluetooth/amlogic,w155s2-bt.yaml +f:Documentation/devicetree/bindings/net/bluetooth/bluetooth-controller.yaml +f:Documentation/devicetree/bindings/net/bluetooth/brcm,bcm4377-bluetooth.yaml +f:Documentation/devicetree/bindings/net/bluetooth/brcm,bluetooth.yaml +f:Documentation/devicetree/bindings/net/bluetooth/marvell,88w8897.yaml +f:Documentation/devicetree/bindings/net/bluetooth/mediatek,bluetooth.txt +f:Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7622-bluetooth.yaml +f:Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.yaml +f:Documentation/devicetree/bindings/net/bluetooth/nokia,h4p-bluetooth.txt +f:Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml +f:Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml +f:Documentation/devicetree/bindings/net/bluetooth/realtek,bluetooth.yaml +f:Documentation/devicetree/bindings/net/bluetooth/ti,bluetooth.yaml +f:Documentation/devicetree/bindings/net/brcm,amac.yaml +f:Documentation/devicetree/bindings/net/brcm,asp-v2.0.yaml +f:Documentation/devicetree/bindings/net/brcm,bcm4908-enet.yaml +f:Documentation/devicetree/bindings/net/brcm,bcm6368-mdio-mux.yaml +f:Documentation/devicetree/bindings/net/brcm,bcm7445-switch-v4.0.txt +f:Documentation/devicetree/bindings/net/brcm,bcmgenet.yaml +f:Documentation/devicetree/bindings/net/brcm,iproc-mdio.yaml +f:Documentation/devicetree/bindings/net/brcm,mdio-mux-iproc.yaml +f:Documentation/devicetree/bindings/net/brcm,systemport.yaml +f:Documentation/devicetree/bindings/net/brcm,unimac-mdio.yaml +f:Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt +f:Documentation/devicetree/bindings/net/btusb.txt +f:Documentation/devicetree/bindings/net/calxeda-xgmac.yaml +f:Documentation/devicetree/bindings/net/can/allwinner,sun4i-a10-can.yaml +f:Documentation/devicetree/bindings/net/can/atmel,at91sam9263-can.yaml +f:Documentation/devicetree/bindings/net/can/bosch,c_can.yaml +f:Documentation/devicetree/bindings/net/can/bosch,m_can.yaml +f:Documentation/devicetree/bindings/net/can/can-controller.yaml +f:Documentation/devicetree/bindings/net/can/can-transceiver.yaml +f:Documentation/devicetree/bindings/net/can/cc770.txt +f:Documentation/devicetree/bindings/net/can/ctu,ctucanfd.yaml +f:Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml +f:Documentation/devicetree/bindings/net/can/grcan.txt +f:Documentation/devicetree/bindings/net/can/holt_hi311x.txt +f:Documentation/devicetree/bindings/net/can/ifi_canfd.txt +f:Documentation/devicetree/bindings/net/can/microchip,mcp2510.yaml +f:Documentation/devicetree/bindings/net/can/microchip,mcp251xfd.yaml +f:Documentation/devicetree/bindings/net/can/microchip,mpfs-can.yaml +f:Documentation/devicetree/bindings/net/can/mpc5xxx-mscan.txt +f:Documentation/devicetree/bindings/net/can/nxp,sja1000.yaml +f:Documentation/devicetree/bindings/net/can/renesas,rcar-can.yaml +f:Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml +f:Documentation/devicetree/bindings/net/can/rockchip,rk3568v2-canfd.yaml +f:Documentation/devicetree/bindings/net/can/st,stm32-bxcan.yaml +f:Documentation/devicetree/bindings/net/can/ti,tcan4x5x.yaml +f:Documentation/devicetree/bindings/net/can/ti_hecc.txt +f:Documentation/devicetree/bindings/net/can/xilinx,can.yaml +f:Documentation/devicetree/bindings/net/cavium-mdio.txt +f:Documentation/devicetree/bindings/net/cavium-mix.txt +f:Documentation/devicetree/bindings/net/cavium-pip.txt +f:Documentation/devicetree/bindings/net/cdns,macb.yaml +f:Documentation/devicetree/bindings/net/cirrus,cs89x0.txt +f:Documentation/devicetree/bindings/net/cirrus,ep9301-eth.yaml +f:Documentation/devicetree/bindings/net/cortina,gemini-ethernet.yaml +f:Documentation/devicetree/bindings/net/cortina.txt +f:Documentation/devicetree/bindings/net/cpsw-phy-sel.txt +f:Documentation/devicetree/bindings/net/cpsw.txt +f:Documentation/devicetree/bindings/net/davicom,dm9000.yaml +f:Documentation/devicetree/bindings/net/davicom,dm9051.yaml +f:Documentation/devicetree/bindings/net/davinci_emac.txt +f:Documentation/devicetree/bindings/net/dsa/arrow,xrs700x.yaml +f:Documentation/devicetree/bindings/net/dsa/brcm,b53.yaml +f:Documentation/devicetree/bindings/net/dsa/brcm,sf2.yaml +f:Documentation/devicetree/bindings/net/dsa/dsa-port.yaml +f:Documentation/devicetree/bindings/net/dsa/dsa.txt +f:Documentation/devicetree/bindings/net/dsa/dsa.yaml +f:Documentation/devicetree/bindings/net/dsa/hirschmann,hellcreek.yaml +f:Documentation/devicetree/bindings/net/dsa/lan9303.txt +f:Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml +f:Documentation/devicetree/bindings/net/dsa/marvell,mv88e6060.yaml +f:Documentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml +f:Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml +f:Documentation/devicetree/bindings/net/dsa/micrel,ks8995.yaml +f:Documentation/devicetree/bindings/net/dsa/microchip,ksz.yaml +f:Documentation/devicetree/bindings/net/dsa/microchip,lan937x.yaml +f:Documentation/devicetree/bindings/net/dsa/mscc,ocelot.yaml +f:Documentation/devicetree/bindings/net/dsa/nxp,sja1105.yaml +f:Documentation/devicetree/bindings/net/dsa/qca,ar9331.yaml +f:Documentation/devicetree/bindings/net/dsa/qca8k.yaml +f:Documentation/devicetree/bindings/net/dsa/realtek.yaml +f:Documentation/devicetree/bindings/net/dsa/renesas,rzn1-a5psw.yaml +f:Documentation/devicetree/bindings/net/dsa/vitesse,vsc73xx.yaml +f:Documentation/devicetree/bindings/net/engleder,tsnep.yaml +f:Documentation/devicetree/bindings/net/ethernet-controller.yaml +f:Documentation/devicetree/bindings/net/ethernet-phy-package.yaml +f:Documentation/devicetree/bindings/net/ethernet-phy.yaml +f:Documentation/devicetree/bindings/net/ethernet-switch-port.yaml +f:Documentation/devicetree/bindings/net/ethernet-switch.yaml +f:Documentation/devicetree/bindings/net/ethernet.txt +f:Documentation/devicetree/bindings/net/ezchip_enet.txt +f:Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml +f:Documentation/devicetree/bindings/net/faraday,ftmac.txt +f:Documentation/devicetree/bindings/net/fixed-link.txt +f:Documentation/devicetree/bindings/net/fsl,cpm-enet.yaml +f:Documentation/devicetree/bindings/net/fsl,cpm-mdio.yaml +f:Documentation/devicetree/bindings/net/fsl,enetc-ierb.yaml +f:Documentation/devicetree/bindings/net/fsl,enetc-mdio.yaml +f:Documentation/devicetree/bindings/net/fsl,enetc.yaml +f:Documentation/devicetree/bindings/net/fsl,fec.yaml +f:Documentation/devicetree/bindings/net/fsl,fman-dtsec.yaml +f:Documentation/devicetree/bindings/net/fsl,fman-mdio.yaml +f:Documentation/devicetree/bindings/net/fsl,fman-muram.yaml +f:Documentation/devicetree/bindings/net/fsl,fman-port.yaml +f:Documentation/devicetree/bindings/net/fsl,fman.yaml +f:Documentation/devicetree/bindings/net/fsl,gianfar-mdio.yaml +f:Documentation/devicetree/bindings/net/fsl,gianfar.yaml +f:Documentation/devicetree/bindings/net/fsl,qoriq-mc-dpmac.yaml +f:Documentation/devicetree/bindings/net/fsl-tsec-phy.txt +f:Documentation/devicetree/bindings/net/hisilicon-femac-mdio.txt +f:Documentation/devicetree/bindings/net/hisilicon-femac.txt +f:Documentation/devicetree/bindings/net/hisilicon-hip04-net.txt +f:Documentation/devicetree/bindings/net/hisilicon-hix5hd2-gmac.txt +f:Documentation/devicetree/bindings/net/hisilicon-hns-dsaf.txt +f:Documentation/devicetree/bindings/net/hisilicon-hns-mdio.txt +f:Documentation/devicetree/bindings/net/hisilicon-hns-nic.txt +f:Documentation/devicetree/bindings/net/ibm,emac.txt +f:Documentation/devicetree/bindings/net/icplus-ip101ag.txt +f:Documentation/devicetree/bindings/net/idt,3243x-emac.yaml +f:Documentation/devicetree/bindings/net/ieee802154/adf7242.txt +f:Documentation/devicetree/bindings/net/ieee802154/atmel,at86rf233.yaml +f:Documentation/devicetree/bindings/net/ieee802154/ca8210.txt +f:Documentation/devicetree/bindings/net/ieee802154/cc2520.txt +f:Documentation/devicetree/bindings/net/ieee802154/mcr20a.txt +f:Documentation/devicetree/bindings/net/ieee802154/mrf24j40.txt +f:Documentation/devicetree/bindings/net/ingenic,mac.yaml +f:Documentation/devicetree/bindings/net/intel,dwmac-plat.yaml +f:Documentation/devicetree/bindings/net/intel,ixp46x-ptp-timer.yaml +f:Documentation/devicetree/bindings/net/intel,ixp4xx-ethernet.yaml +f:Documentation/devicetree/bindings/net/intel,ixp4xx-hss.yaml +f:Documentation/devicetree/bindings/net/ipq806x-dwmac.txt +f:Documentation/devicetree/bindings/net/keystone-netcp.txt +f:Documentation/devicetree/bindings/net/lantiq,etop-xway.yaml +f:Documentation/devicetree/bindings/net/lantiq,pef2256.yaml +f:Documentation/devicetree/bindings/net/lantiq,xrx200-net.yaml +f:Documentation/devicetree/bindings/net/litex,liteeth.yaml +f:Documentation/devicetree/bindings/net/loongson,ls1b-gmac.yaml +f:Documentation/devicetree/bindings/net/loongson,ls1c-emac.yaml +f:Documentation/devicetree/bindings/net/marvell,aquantia.yaml +f:Documentation/devicetree/bindings/net/marvell,armada-370-neta.yaml +f:Documentation/devicetree/bindings/net/marvell,armada-380-neta-bm.yaml +f:Documentation/devicetree/bindings/net/marvell,dfx-server.yaml +f:Documentation/devicetree/bindings/net/marvell,mvusb.yaml +f:Documentation/devicetree/bindings/net/marvell,orion-mdio.yaml +f:Documentation/devicetree/bindings/net/marvell,pp2.yaml +f:Documentation/devicetree/bindings/net/marvell,prestera.yaml +f:Documentation/devicetree/bindings/net/marvell-bt-8xxx.txt +f:Documentation/devicetree/bindings/net/marvell-orion-net.txt +f:Documentation/devicetree/bindings/net/marvell-pxa168.txt +f:Documentation/devicetree/bindings/net/maxim,ds26522.yaml +f:Documentation/devicetree/bindings/net/maxlinear,gpy2xx.yaml +f:Documentation/devicetree/bindings/net/mctp-i2c-controller.yaml +f:Documentation/devicetree/bindings/net/mdio-gpio.yaml +f:Documentation/devicetree/bindings/net/mdio-mux-gpio.yaml +f:Documentation/devicetree/bindings/net/mdio-mux-mmioreg.yaml +f:Documentation/devicetree/bindings/net/mdio-mux-multiplexer.yaml +f:Documentation/devicetree/bindings/net/mdio-mux.yaml +f:Documentation/devicetree/bindings/net/mdio.txt +f:Documentation/devicetree/bindings/net/mdio.yaml +f:Documentation/devicetree/bindings/net/mediatek,net.yaml +f:Documentation/devicetree/bindings/net/mediatek,star-emac.yaml +f:Documentation/devicetree/bindings/net/mediatek-dwmac.yaml +f:Documentation/devicetree/bindings/net/micrel,ks8851.yaml +f:Documentation/devicetree/bindings/net/micrel-ksz90x1.txt +f:Documentation/devicetree/bindings/net/micrel.txt +f:Documentation/devicetree/bindings/net/microchip,enc28j60.txt +f:Documentation/devicetree/bindings/net/microchip,lan78xx.txt +f:Documentation/devicetree/bindings/net/microchip,lan8650.yaml +f:Documentation/devicetree/bindings/net/microchip,lan95xx.yaml +f:Documentation/devicetree/bindings/net/microchip,lan966x-switch.yaml +f:Documentation/devicetree/bindings/net/microchip,sparx5-switch.yaml +f:Documentation/devicetree/bindings/net/motorcomm,yt8xxx.yaml +f:Documentation/devicetree/bindings/net/mscc,miim.yaml +f:Documentation/devicetree/bindings/net/mscc,vsc7514-switch.yaml +f:Documentation/devicetree/bindings/net/mscc-phy-vsc8531.txt +f:Documentation/devicetree/bindings/net/network-class.yaml +f:Documentation/devicetree/bindings/net/nfc/marvell,nci.yaml +f:Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml +f:Documentation/devicetree/bindings/net/nfc/nxp,pn532.yaml +f:Documentation/devicetree/bindings/net/nfc/nxp,pn544.yaml +f:Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml +f:Documentation/devicetree/bindings/net/nfc/st,st-nci.yaml +f:Documentation/devicetree/bindings/net/nfc/st,st21nfca.yaml +f:Documentation/devicetree/bindings/net/nfc/st,st95hf.yaml +f:Documentation/devicetree/bindings/net/nfc/ti,trf7970a.yaml +f:Documentation/devicetree/bindings/net/nixge.txt +f:Documentation/devicetree/bindings/net/nvidia,tegra234-mgbe.yaml +f:Documentation/devicetree/bindings/net/nxp,dwmac-imx.yaml +f:Documentation/devicetree/bindings/net/nxp,lpc-eth.yaml +f:Documentation/devicetree/bindings/net/nxp,lpc1850-dwmac.yaml +f:Documentation/devicetree/bindings/net/nxp,netc-blk-ctrl.yaml +f:Documentation/devicetree/bindings/net/nxp,s32-dwmac.yaml +f:Documentation/devicetree/bindings/net/nxp,tja11xx.yaml +f:Documentation/devicetree/bindings/net/opencores-ethoc.txt +f:Documentation/devicetree/bindings/net/pcs/fsl,lynx-pcs.yaml +f:Documentation/devicetree/bindings/net/pcs/mediatek,sgmiisys.yaml +f:Documentation/devicetree/bindings/net/pcs/renesas,rzn1-miic.yaml +f:Documentation/devicetree/bindings/net/pcs/snps,dw-xpcs.yaml +f:Documentation/devicetree/bindings/net/phy.txt +f:Documentation/devicetree/bindings/net/pse-pd/microchip,pd692x0.yaml +f:Documentation/devicetree/bindings/net/pse-pd/podl-pse-regulator.yaml +f:Documentation/devicetree/bindings/net/pse-pd/pse-controller.yaml +f:Documentation/devicetree/bindings/net/pse-pd/ti,tps23881.yaml +f:Documentation/devicetree/bindings/net/qca,ar71xx.yaml +f:Documentation/devicetree/bindings/net/qca,ar803x.yaml +f:Documentation/devicetree/bindings/net/qca,qca7000.yaml +f:Documentation/devicetree/bindings/net/qca,qca808x.yaml +f:Documentation/devicetree/bindings/net/qcom,bam-dmux.yaml +f:Documentation/devicetree/bindings/net/qcom,ethqos.yaml +f:Documentation/devicetree/bindings/net/qcom,ipa.yaml +f:Documentation/devicetree/bindings/net/qcom,ipq4019-mdio.yaml +f:Documentation/devicetree/bindings/net/qcom,ipq8064-mdio.yaml +f:Documentation/devicetree/bindings/net/qcom,qca807x.yaml +f:Documentation/devicetree/bindings/net/qcom-emac.txt +f:Documentation/devicetree/bindings/net/realtek,rtl82xx.yaml +f:Documentation/devicetree/bindings/net/realtek,rtl9301-mdio.yaml +f:Documentation/devicetree/bindings/net/realtek,rtl9301-switch.yaml +f:Documentation/devicetree/bindings/net/renesas,ether.yaml +f:Documentation/devicetree/bindings/net/renesas,etheravb.yaml +f:Documentation/devicetree/bindings/net/renesas,ethertsn.yaml +f:Documentation/devicetree/bindings/net/renesas,r8a779f0-ether-switch.yaml +f:Documentation/devicetree/bindings/net/renesas,rzn1-gmac.yaml +f:Documentation/devicetree/bindings/net/renesas,rzv2h-gbeth.yaml +f:Documentation/devicetree/bindings/net/rfkill-gpio.yaml +f:Documentation/devicetree/bindings/net/rockchip,emac.yaml +f:Documentation/devicetree/bindings/net/rockchip-dwmac.yaml +f:Documentation/devicetree/bindings/net/samsung-sxgbe.txt +f:Documentation/devicetree/bindings/net/sff,sfp.yaml +f:Documentation/devicetree/bindings/net/smsc,lan9115.yaml +f:Documentation/devicetree/bindings/net/smsc,lan91c111.yaml +f:Documentation/devicetree/bindings/net/smsc-lan87xx.txt +f:Documentation/devicetree/bindings/net/snps,dwc-qos-ethernet.txt +f:Documentation/devicetree/bindings/net/snps,dwmac.yaml +f:Documentation/devicetree/bindings/net/socionext,synquacer-netsec.yaml +f:Documentation/devicetree/bindings/net/socionext,uniphier-ave4.yaml +f:Documentation/devicetree/bindings/net/sophgo,cv1800b-dwmac.yaml +f:Documentation/devicetree/bindings/net/sophgo,sg2044-dwmac.yaml +f:Documentation/devicetree/bindings/net/starfive,jh7110-dwmac.yaml +f:Documentation/devicetree/bindings/net/sti-dwmac.txt +f:Documentation/devicetree/bindings/net/stm32-dwmac.yaml +f:Documentation/devicetree/bindings/net/stmmac.txt +f:Documentation/devicetree/bindings/net/sunplus,sp7021-emac.yaml +f:Documentation/devicetree/bindings/net/tesla,fsd-ethqos.yaml +f:Documentation/devicetree/bindings/net/thead,th1520-gmac.yaml +f:Documentation/devicetree/bindings/net/ti,cc1352p7.yaml +f:Documentation/devicetree/bindings/net/ti,cpsw-switch.yaml +f:Documentation/devicetree/bindings/net/ti,davinci-mdio.yaml +f:Documentation/devicetree/bindings/net/ti,dp83822.yaml +f:Documentation/devicetree/bindings/net/ti,dp83867.yaml +f:Documentation/devicetree/bindings/net/ti,dp83869.yaml +f:Documentation/devicetree/bindings/net/ti,icss-iep.yaml +f:Documentation/devicetree/bindings/net/ti,icssg-prueth.yaml +f:Documentation/devicetree/bindings/net/ti,k3-am654-cpsw-nuss.yaml +f:Documentation/devicetree/bindings/net/ti,k3-am654-cpts.yaml +f:Documentation/devicetree/bindings/net/toshiba,visconti-dwmac.yaml +f:Documentation/devicetree/bindings/net/vertexcom-mse102x.yaml +f:Documentation/devicetree/bindings/net/via,vt8500-rhine.yaml +f:Documentation/devicetree/bindings/net/via-velocity.txt +f:Documentation/devicetree/bindings/net/wireless/brcm,bcm4329-fmac.yaml +f:Documentation/devicetree/bindings/net/wireless/esp,esp8089.yaml +f:Documentation/devicetree/bindings/net/wireless/ieee80211.yaml +f:Documentation/devicetree/bindings/net/wireless/marvell,sd8787.yaml +f:Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml +f:Documentation/devicetree/bindings/net/wireless/microchip,wilc1000.yaml +f:Documentation/devicetree/bindings/net/wireless/qca,ath9k.yaml +f:Documentation/devicetree/bindings/net/wireless/qcom,ath10k.yaml +f:Documentation/devicetree/bindings/net/wireless/qcom,ath11k-pci.yaml +f:Documentation/devicetree/bindings/net/wireless/qcom,ath11k.yaml +f:Documentation/devicetree/bindings/net/wireless/qcom,ath12k-wsi.yaml +f:Documentation/devicetree/bindings/net/wireless/qcom,ath12k.yaml +f:Documentation/devicetree/bindings/net/wireless/qcom,ipq5332-wifi.yaml +f:Documentation/devicetree/bindings/net/wireless/ralink,rt2880.yaml +f:Documentation/devicetree/bindings/net/wireless/realtek,rtl8188e.yaml +f:Documentation/devicetree/bindings/net/wireless/silabs,wfx.yaml +f:Documentation/devicetree/bindings/net/wireless/ti,wl1251.txt +f:Documentation/devicetree/bindings/net/wireless/ti,wlcore.yaml +f:Documentation/devicetree/bindings/net/wireless/wireless-controller.yaml +f:Documentation/devicetree/bindings/net/wiznet,w5x00.txt +f:Documentation/devicetree/bindings/net/xlnx,axi-ethernet.yaml +f:Documentation/devicetree/bindings/net/xlnx,emaclite.yaml +f:Documentation/devicetree/bindings/net/xlnx,gmii-to-rgmii.yaml +f:Documentation/devicetree/bindings/nios2/nios2.txt +f:Documentation/devicetree/bindings/nvme/apple,nvme-ans.yaml +f:Documentation/devicetree/bindings/nvmem/allwinner,sun4i-a10-sid.yaml +f:Documentation/devicetree/bindings/nvmem/amlogic,meson-gxbb-efuse.yaml +f:Documentation/devicetree/bindings/nvmem/amlogic,meson6-efuse.yaml +f:Documentation/devicetree/bindings/nvmem/apple,efuses.yaml +f:Documentation/devicetree/bindings/nvmem/apple,spmi-nvmem.yaml +f:Documentation/devicetree/bindings/nvmem/brcm,nvram.yaml +f:Documentation/devicetree/bindings/nvmem/brcm,ocotp.txt +f:Documentation/devicetree/bindings/nvmem/fsl,layerscape-sfp.yaml +f:Documentation/devicetree/bindings/nvmem/fsl,scu-ocotp.yaml +f:Documentation/devicetree/bindings/nvmem/fsl,t1023-sfp.yaml +f:Documentation/devicetree/bindings/nvmem/fsl,vf610-ocotp.yaml +f:Documentation/devicetree/bindings/nvmem/imx-iim.yaml +f:Documentation/devicetree/bindings/nvmem/imx-ocotp.yaml +f:Documentation/devicetree/bindings/nvmem/ingenic,jz4780-efuse.yaml +f:Documentation/devicetree/bindings/nvmem/layouts/fixed-cell.yaml +f:Documentation/devicetree/bindings/nvmem/layouts/fixed-layout.yaml +f:Documentation/devicetree/bindings/nvmem/layouts/kontron,sl28-vpd.yaml +f:Documentation/devicetree/bindings/nvmem/layouts/nvmem-layout.yaml +f:Documentation/devicetree/bindings/nvmem/layouts/onie,tlv-layout.yaml +f:Documentation/devicetree/bindings/nvmem/layouts/u-boot,env.yaml +f:Documentation/devicetree/bindings/nvmem/lpc1850-otp.txt +f:Documentation/devicetree/bindings/nvmem/maxim,max77759-nvmem.yaml +f:Documentation/devicetree/bindings/nvmem/mediatek,efuse.yaml +f:Documentation/devicetree/bindings/nvmem/microchip,lan9662-otpc.yaml +f:Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml +f:Documentation/devicetree/bindings/nvmem/mxs-ocotp.yaml +f:Documentation/devicetree/bindings/nvmem/nintendo-otp.yaml +f:Documentation/devicetree/bindings/nvmem/nvmem-consumer.yaml +f:Documentation/devicetree/bindings/nvmem/nvmem-deprecated-cells.yaml +f:Documentation/devicetree/bindings/nvmem/nvmem-provider.yaml +f:Documentation/devicetree/bindings/nvmem/nvmem.txt +f:Documentation/devicetree/bindings/nvmem/nvmem.yaml +f:Documentation/devicetree/bindings/nvmem/nxp,lpc1857-eeprom.yaml +f:Documentation/devicetree/bindings/nvmem/qcom,qfprom.yaml +f:Documentation/devicetree/bindings/nvmem/qcom,sec-qfprom.yaml +f:Documentation/devicetree/bindings/nvmem/qcom,spmi-sdam.yaml +f:Documentation/devicetree/bindings/nvmem/renesas,rcar-efuse.yaml +f:Documentation/devicetree/bindings/nvmem/renesas,rcar-otp.yaml +f:Documentation/devicetree/bindings/nvmem/rmem.yaml +f:Documentation/devicetree/bindings/nvmem/rockchip,otp.yaml +f:Documentation/devicetree/bindings/nvmem/rockchip-efuse.yaml +f:Documentation/devicetree/bindings/nvmem/snvs-lpgpr.yaml +f:Documentation/devicetree/bindings/nvmem/socionext,uniphier-efuse.yaml +f:Documentation/devicetree/bindings/nvmem/sprd,sc2731-efuse.yaml +f:Documentation/devicetree/bindings/nvmem/sprd,ums312-efuse.yaml +f:Documentation/devicetree/bindings/nvmem/st,stm32-romem.yaml +f:Documentation/devicetree/bindings/nvmem/sunplus,sp7021-ocotp.yaml +f:Documentation/devicetree/bindings/nvmem/xlnx,zynqmp-nvmem.yaml +f:Documentation/devicetree/bindings/nvmem/zii,rave-sp-eeprom.yaml +f:Documentation/devicetree/bindings/openrisc/opencores/or1ksim.txt +f:Documentation/devicetree/bindings/opp/allwinner,sun50i-h6-operating-points.yaml +f:Documentation/devicetree/bindings/opp/operating-points-v2-ti-cpu.yaml +f:Documentation/devicetree/bindings/opp/opp-v1.yaml +f:Documentation/devicetree/bindings/opp/opp-v2-base.yaml +f:Documentation/devicetree/bindings/opp/opp-v2-kryo-cpu.yaml +f:Documentation/devicetree/bindings/opp/opp-v2-qcom-adreno.yaml +f:Documentation/devicetree/bindings/opp/opp-v2-qcom-level.yaml +f:Documentation/devicetree/bindings/opp/opp-v2.yaml +f:Documentation/devicetree/bindings/opp/ti,omap-opp-supply.yaml +f:Documentation/devicetree/bindings/pci/83xx-512x-pci.txt +f:Documentation/devicetree/bindings/pci/aardvark-pci.txt +f:Documentation/devicetree/bindings/pci/altr,pcie-root-port.yaml +f:Documentation/devicetree/bindings/pci/amd,versal2-mdb-host.yaml +f:Documentation/devicetree/bindings/pci/amlogic,axg-pcie.yaml +f:Documentation/devicetree/bindings/pci/apple,pcie.yaml +f:Documentation/devicetree/bindings/pci/axis,artpec6-pcie.txt +f:Documentation/devicetree/bindings/pci/baikal,bt1-pcie.yaml +f:Documentation/devicetree/bindings/pci/brcm,iproc-pcie.yaml +f:Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml +f:Documentation/devicetree/bindings/pci/cdns,cdns-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/cdns,cdns-pcie-host.yaml +f:Documentation/devicetree/bindings/pci/cdns-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/cdns-pcie-host.yaml +f:Documentation/devicetree/bindings/pci/cdns-pcie.yaml +f:Documentation/devicetree/bindings/pci/faraday,ftpci100.yaml +f:Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-common.yaml +f:Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.yaml +f:Documentation/devicetree/bindings/pci/fsl,layerscape-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/fsl,layerscape-pcie.yaml +f:Documentation/devicetree/bindings/pci/fsl,mpc8xxx-pci.yaml +f:Documentation/devicetree/bindings/pci/hisilicon,kirin-pcie.yaml +f:Documentation/devicetree/bindings/pci/hisilicon-histb-pcie.txt +f:Documentation/devicetree/bindings/pci/host-generic-pci.yaml +f:Documentation/devicetree/bindings/pci/intel,ixp4xx-pci.yaml +f:Documentation/devicetree/bindings/pci/intel,keembay-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/intel,keembay-pcie.yaml +f:Documentation/devicetree/bindings/pci/intel-gw-pcie.yaml +f:Documentation/devicetree/bindings/pci/loongson.yaml +f:Documentation/devicetree/bindings/pci/marvell,armada8k-pcie.yaml +f:Documentation/devicetree/bindings/pci/marvell,kirkwood-pcie.yaml +f:Documentation/devicetree/bindings/pci/mbvl,gpex40-pcie.yaml +f:Documentation/devicetree/bindings/pci/mediatek,mt7621-pcie.yaml +f:Documentation/devicetree/bindings/pci/mediatek-pcie-cfg.yaml +f:Documentation/devicetree/bindings/pci/mediatek-pcie-gen3.yaml +f:Documentation/devicetree/bindings/pci/mediatek-pcie.txt +f:Documentation/devicetree/bindings/pci/microchip,pcie-host.yaml +f:Documentation/devicetree/bindings/pci/nvidia,tegra194-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/nvidia,tegra194-pcie.yaml +f:Documentation/devicetree/bindings/pci/nvidia,tegra20-pcie.txt +f:Documentation/devicetree/bindings/pci/pci-ep-bus.yaml +f:Documentation/devicetree/bindings/pci/pci-ep.yaml +f:Documentation/devicetree/bindings/pci/pcie-al.txt +f:Documentation/devicetree/bindings/pci/plda,xpressrich3-axi-common.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-common.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sa8775p.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sc7280.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sc8180x.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sc8280xp.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sm8150.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sm8250.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sm8350.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sm8450.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-sm8550.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie-x1e80100.yaml +f:Documentation/devicetree/bindings/pci/qcom,pcie.yaml +f:Documentation/devicetree/bindings/pci/ralink,rt3883-pci.txt +f:Documentation/devicetree/bindings/pci/rcar-gen4-pci-ep.yaml +f:Documentation/devicetree/bindings/pci/rcar-gen4-pci-host.yaml +f:Documentation/devicetree/bindings/pci/rcar-pci-ep.yaml +f:Documentation/devicetree/bindings/pci/rcar-pci-host.yaml +f:Documentation/devicetree/bindings/pci/renesas,pci-rcar-gen2.yaml +f:Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie-common.yaml +f:Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie.yaml +f:Documentation/devicetree/bindings/pci/rockchip-dw-pcie-common.yaml +f:Documentation/devicetree/bindings/pci/rockchip-dw-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/rockchip-dw-pcie.yaml +f:Documentation/devicetree/bindings/pci/samsung,exynos-pcie.yaml +f:Documentation/devicetree/bindings/pci/sifive,fu740-pcie.yaml +f:Documentation/devicetree/bindings/pci/snps,dw-pcie-common.yaml +f:Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/snps,dw-pcie.yaml +f:Documentation/devicetree/bindings/pci/socionext,uniphier-pcie-ep.yaml +f:Documentation/devicetree/bindings/pci/socionext,uniphier-pcie.yaml +f:Documentation/devicetree/bindings/pci/spear13xx-pcie.txt +f:Documentation/devicetree/bindings/pci/starfive,jh7110-pcie.yaml +f:Documentation/devicetree/bindings/pci/ti,am65-pci-ep.yaml +f:Documentation/devicetree/bindings/pci/ti,am65-pci-host.yaml +f:Documentation/devicetree/bindings/pci/ti,j721e-pci-ep.yaml +f:Documentation/devicetree/bindings/pci/ti,j721e-pci-host.yaml +f:Documentation/devicetree/bindings/pci/ti-pci.txt +f:Documentation/devicetree/bindings/pci/toshiba,visconti-pcie.yaml +f:Documentation/devicetree/bindings/pci/v3,v360epc-pci.yaml +f:Documentation/devicetree/bindings/pci/versatile.yaml +f:Documentation/devicetree/bindings/pci/xgene-pci.txt +f:Documentation/devicetree/bindings/pci/xilinx-versal-cpm.yaml +f:Documentation/devicetree/bindings/pci/xlnx,axi-pcie-host.yaml +f:Documentation/devicetree/bindings/pci/xlnx,nwl-pcie.yaml +f:Documentation/devicetree/bindings/pci/xlnx,xdma-host.yaml +f:Documentation/devicetree/bindings/peci/nuvoton,npcm-peci.yaml +f:Documentation/devicetree/bindings/peci/peci-aspeed.yaml +f:Documentation/devicetree/bindings/peci/peci-controller.yaml +f:Documentation/devicetree/bindings/perf/amlogic,g12-ddr-pmu.yaml +f:Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt +f:Documentation/devicetree/bindings/perf/arm,ccn.yaml +f:Documentation/devicetree/bindings/perf/arm,cmn.yaml +f:Documentation/devicetree/bindings/perf/arm,coresight-pmu.yaml +f:Documentation/devicetree/bindings/perf/arm,dsu-pmu.yaml +f:Documentation/devicetree/bindings/perf/arm,ni.yaml +f:Documentation/devicetree/bindings/perf/arm,smmu-v3-pmcg.yaml +f:Documentation/devicetree/bindings/perf/fsl-imx-ddr.yaml +f:Documentation/devicetree/bindings/perf/marvell-cn10k-ddr.yaml +f:Documentation/devicetree/bindings/perf/marvell-cn10k-tad.yaml +f:Documentation/devicetree/bindings/perf/riscv,pmu.yaml +f:Documentation/devicetree/bindings/perf/spe-pmu.yaml +f:Documentation/devicetree/bindings/perf/starfive,jh8100-starlink-pmu.yaml +f:Documentation/devicetree/bindings/phy/airoha,en7581-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun4i-a10-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun50i-a64-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun50i-h6-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun50i-h6-usb3-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun5i-a13-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun6i-a31-mipi-dphy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun6i-a31-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun8i-a23-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun8i-a83t-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun8i-h3-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun8i-r40-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun8i-v3s-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,sun9i-a80-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/allwinner,suniv-f1c100s-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/amlogic,axg-mipi-dphy.yaml +f:Documentation/devicetree/bindings/phy/amlogic,g12a-mipi-dphy-analog.yaml +f:Documentation/devicetree/bindings/phy/amlogic,g12a-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/amlogic,g12a-usb3-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/amlogic,meson-axg-mipi-pcie-analog.yaml +f:Documentation/devicetree/bindings/phy/amlogic,meson-axg-pcie.yaml +f:Documentation/devicetree/bindings/phy/amlogic,meson-gxl-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/amlogic,meson8-hdmi-tx-phy.yaml +f:Documentation/devicetree/bindings/phy/amlogic,meson8b-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/apm-xgene-phy.txt +f:Documentation/devicetree/bindings/phy/bcm-ns-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/bcm-ns-usb3-phy.yaml +f:Documentation/devicetree/bindings/phy/berlin-sata-phy.txt +f:Documentation/devicetree/bindings/phy/berlin-usb-phy.txt +f:Documentation/devicetree/bindings/phy/brcm,bcm63xx-usbh-phy.yaml +f:Documentation/devicetree/bindings/phy/brcm,brcmstb-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/brcm,cygnus-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/brcm,kona-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/brcm,ns2-drd-phy.txt +f:Documentation/devicetree/bindings/phy/brcm,ns2-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/brcm,sata-phy.yaml +f:Documentation/devicetree/bindings/phy/brcm,sr-pcie-phy.txt +f:Documentation/devicetree/bindings/phy/brcm,stingray-usb-phy.txt +f:Documentation/devicetree/bindings/phy/calxeda-combophy.yaml +f:Documentation/devicetree/bindings/phy/cdns,dphy-rx.yaml +f:Documentation/devicetree/bindings/phy/cdns,dphy.yaml +f:Documentation/devicetree/bindings/phy/cdns,salvo-phy.yaml +f:Documentation/devicetree/bindings/phy/dm816x-phy.txt +f:Documentation/devicetree/bindings/phy/fsl,imx8-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/fsl,imx8mp-hdmi-phy.yaml +f:Documentation/devicetree/bindings/phy/fsl,imx8mq-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/fsl,imx8qm-hsio.yaml +f:Documentation/devicetree/bindings/phy/fsl,imx8qm-lvds-phy.yaml +f:Documentation/devicetree/bindings/phy/fsl,lynx-28g.yaml +f:Documentation/devicetree/bindings/phy/fsl,mxs-usbphy.yaml +f:Documentation/devicetree/bindings/phy/hisilicon,hi3660-usb3.yaml +f:Documentation/devicetree/bindings/phy/hisilicon,hi3670-usb3.yaml +f:Documentation/devicetree/bindings/phy/hisilicon,hi3798cv200-combphy.yaml +f:Documentation/devicetree/bindings/phy/hisilicon,phy-hi3670-pcie.yaml +f:Documentation/devicetree/bindings/phy/hix5hd2-phy.txt +f:Documentation/devicetree/bindings/phy/ingenic,phy-usb.yaml +f:Documentation/devicetree/bindings/phy/intel,combo-phy.yaml +f:Documentation/devicetree/bindings/phy/intel,keembay-phy-usb.yaml +f:Documentation/devicetree/bindings/phy/intel,lgm-emmc-phy.yaml +f:Documentation/devicetree/bindings/phy/intel,lgm-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/keystone-usb-phy.txt +f:Documentation/devicetree/bindings/phy/lantiq,vrx200-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/marvell,armada-3700-utmi-phy.yaml +f:Documentation/devicetree/bindings/phy/marvell,armada-cp110-utmi-phy.yaml +f:Documentation/devicetree/bindings/phy/marvell,mmp3-hsic-phy.yaml +f:Documentation/devicetree/bindings/phy/marvell,mmp3-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/marvell,pxa1928-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,dsi-phy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,hdmi-phy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,mt7621-pci-phy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,mt7628-usbphy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,mt7988-xfi-tphy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,mt8365-csi-rx.yaml +f:Documentation/devicetree/bindings/phy/mediatek,pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,tphy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,ufs-phy.yaml +f:Documentation/devicetree/bindings/phy/mediatek,xsphy.yaml +f:Documentation/devicetree/bindings/phy/microchip,lan966x-serdes.yaml +f:Documentation/devicetree/bindings/phy/microchip,sparx5-serdes.yaml +f:Documentation/devicetree/bindings/phy/mixel,mipi-dsi-phy.yaml +f:Documentation/devicetree/bindings/phy/mscc,vsc7514-serdes.yaml +f:Documentation/devicetree/bindings/phy/nuvoton,ma35d1-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/nvidia,tegra124-xusb-padctl.yaml +f:Documentation/devicetree/bindings/phy/nvidia,tegra186-xusb-padctl.yaml +f:Documentation/devicetree/bindings/phy/nvidia,tegra194-xusb-padctl.yaml +f:Documentation/devicetree/bindings/phy/nvidia,tegra20-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/nvidia,tegra210-xusb-padctl.yaml +f:Documentation/devicetree/bindings/phy/nxp,ptn3222.yaml +f:Documentation/devicetree/bindings/phy/phy-armada38x-comphy.txt +f:Documentation/devicetree/bindings/phy/phy-ath79-usb.txt +f:Documentation/devicetree/bindings/phy/phy-bindings.txt +f:Documentation/devicetree/bindings/phy/phy-cadence-sierra.yaml +f:Documentation/devicetree/bindings/phy/phy-cadence-torrent.yaml +f:Documentation/devicetree/bindings/phy/phy-cpcap-usb.txt +f:Documentation/devicetree/bindings/phy/phy-da8xx-usb.txt +f:Documentation/devicetree/bindings/phy/phy-hi6220-usb.txt +f:Documentation/devicetree/bindings/phy/phy-hisi-inno-usb2.txt +f:Documentation/devicetree/bindings/phy/phy-lantiq-rcu-usb2.txt +f:Documentation/devicetree/bindings/phy/phy-mapphone-mdm6600.txt +f:Documentation/devicetree/bindings/phy/phy-miphy28lp.txt +f:Documentation/devicetree/bindings/phy/phy-miphy365x.txt +f:Documentation/devicetree/bindings/phy/phy-mvebu-comphy.txt +f:Documentation/devicetree/bindings/phy/phy-mvebu.txt +f:Documentation/devicetree/bindings/phy/phy-pxa-usb.txt +f:Documentation/devicetree/bindings/phy/phy-rockchip-naneng-combphy.yaml +f:Documentation/devicetree/bindings/phy/phy-rockchip-usbdp.yaml +f:Documentation/devicetree/bindings/phy/phy-stm32-usbphyc.yaml +f:Documentation/devicetree/bindings/phy/phy-tegra194-p2u.yaml +f:Documentation/devicetree/bindings/phy/pistachio-usb-phy.txt +f:Documentation/devicetree/bindings/phy/qcom,edp-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,hdmi-phy-other.yaml +f:Documentation/devicetree/bindings/phy/qcom,hdmi-phy-qmp.yaml +f:Documentation/devicetree/bindings/phy/qcom,ipq5332-uniphy-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,ipq5332-usb-hsphy.yaml +f:Documentation/devicetree/bindings/phy/qcom,ipq806x-usb-phy-hs.yaml +f:Documentation/devicetree/bindings/phy/qcom,ipq806x-usb-phy-ss.yaml +f:Documentation/devicetree/bindings/phy/qcom,ipq8074-qmp-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,msm8996-qmp-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,msm8998-qmp-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,msm8998-qmp-usb3-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,pcie2-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,qusb2-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,sa8775p-dwmac-sgmii-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,sata-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-usb3-uni-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-usb43dp-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,snps-eusb2-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,snps-eusb2-repeater.yaml +f:Documentation/devicetree/bindings/phy/qcom,usb-hs-28nm.yaml +f:Documentation/devicetree/bindings/phy/qcom,usb-hs-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,usb-hsic-phy.yaml +f:Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml +f:Documentation/devicetree/bindings/phy/qcom,usb-ss.yaml +f:Documentation/devicetree/bindings/phy/qcom-usb-ipq4019-phy.yaml +f:Documentation/devicetree/bindings/phy/realtek,usb2phy.yaml +f:Documentation/devicetree/bindings/phy/realtek,usb3phy.yaml +f:Documentation/devicetree/bindings/phy/renesas,r8a779f0-ether-serdes.yaml +f:Documentation/devicetree/bindings/phy/renesas,rcar-gen2-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/renesas,rcar-gen3-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/renesas,usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/renesas,usb3-phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,inno-usb2phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,pcie3-phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,px30-dsi-dphy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,rk3228-hdmi-phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,rk3288-dp-phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,rk3399-emmc-phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,rk3399-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,rk3399-typec-phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,rk3588-hdptx-phy.yaml +f:Documentation/devicetree/bindings/phy/rockchip,rk3588-mipi-dcphy.yaml +f:Documentation/devicetree/bindings/phy/rockchip-inno-csi-dphy.yaml +f:Documentation/devicetree/bindings/phy/rockchip-mipi-dphy-rx0.yaml +f:Documentation/devicetree/bindings/phy/rockchip-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,dp-video-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,exynos-hdmi-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,exynos-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,exynos2200-eusb2-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,exynos5250-sata-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,mipi-video-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,ufs-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml +f:Documentation/devicetree/bindings/phy/socionext,uniphier-ahci-phy.yaml +f:Documentation/devicetree/bindings/phy/socionext,uniphier-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/socionext,uniphier-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/socionext,uniphier-usb3hs-phy.yaml +f:Documentation/devicetree/bindings/phy/socionext,uniphier-usb3ss-phy.yaml +f:Documentation/devicetree/bindings/phy/st,stih407-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/st,stm32mp25-combophy.yaml +f:Documentation/devicetree/bindings/phy/st-spear-miphy.txt +f:Documentation/devicetree/bindings/phy/starfive,jh7110-dphy-rx.yaml +f:Documentation/devicetree/bindings/phy/starfive,jh7110-dphy-tx.yaml +f:Documentation/devicetree/bindings/phy/starfive,jh7110-pcie-phy.yaml +f:Documentation/devicetree/bindings/phy/starfive,jh7110-usb-phy.yaml +f:Documentation/devicetree/bindings/phy/sunplus,sp7021-usb2-phy.yaml +f:Documentation/devicetree/bindings/phy/ti,omap-usb2.yaml +f:Documentation/devicetree/bindings/phy/ti,phy-am654-serdes.yaml +f:Documentation/devicetree/bindings/phy/ti,phy-gmii-sel.yaml +f:Documentation/devicetree/bindings/phy/ti,phy-j721e-wiz.yaml +f:Documentation/devicetree/bindings/phy/ti,tcan104x-can.yaml +f:Documentation/devicetree/bindings/phy/ti-phy.txt +f:Documentation/devicetree/bindings/phy/transmit-amplitude.yaml +f:Documentation/devicetree/bindings/phy/xlnx,zynqmp-psgtr.yaml +f:Documentation/devicetree/bindings/pinctrl/abilis,tb10x-iomux.txt +f:Documentation/devicetree/bindings/pinctrl/actions,s500-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/actions,s700-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/actions,s900-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/airoha,en7581-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/allwinner,sun4i-a10-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/allwinner,sun55i-a523-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/amlogic,meson-pinctrl-a1.yaml +f:Documentation/devicetree/bindings/pinctrl/amlogic,meson-pinctrl-common.yaml +f:Documentation/devicetree/bindings/pinctrl/amlogic,meson-pinctrl-g12a-aobus.yaml +f:Documentation/devicetree/bindings/pinctrl/amlogic,meson-pinctrl-g12a-periphs.yaml +f:Documentation/devicetree/bindings/pinctrl/amlogic,meson8-pinctrl-aobus.yaml +f:Documentation/devicetree/bindings/pinctrl/amlogic,meson8-pinctrl-cbus.yaml +f:Documentation/devicetree/bindings/pinctrl/amlogic,pinctrl-a4.yaml +f:Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/aspeed,ast2400-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/aspeed,ast2500-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/aspeed,ast2600-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/atmel,at91-pio4-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/atmel,at91rm9200-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/awinic,aw9523-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/axis,artpec6-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/berlin,pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/bitmain,bm1880-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm11351-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm21664-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm2835-gpio.txt +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm4908-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm6318-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm63268-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm6328-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm6358-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm6362-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,bcm6368-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,cygnus-pinmux.txt +f:Documentation/devicetree/bindings/pinctrl/brcm,iproc-gpio.txt +f:Documentation/devicetree/bindings/pinctrl/brcm,ns-pinmux.yaml +f:Documentation/devicetree/bindings/pinctrl/brcm,ns2-pinmux.txt +f:Documentation/devicetree/bindings/pinctrl/brcm,nsp-gpio.txt +f:Documentation/devicetree/bindings/pinctrl/brcm,nsp-pinmux.txt +f:Documentation/devicetree/bindings/pinctrl/canaan,k210-fpioa.yaml +f:Documentation/devicetree/bindings/pinctrl/canaan,k230-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/cirrus,lochnagar.yaml +f:Documentation/devicetree/bindings/pinctrl/cirrus,madera.yaml +f:Documentation/devicetree/bindings/pinctrl/cnxt,cx92755-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/cortina,gemini-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/cypress,cy8c95x0.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/fsl,imx25-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/fsl,imx27-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/fsl,imx35-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,imx7d-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,imx7ulp-iomuxc1.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,imx8m-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,imx8ulp-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,imx9-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,imxrt1050.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,imxrt1170.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,mxs-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/fsl,scu-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/fsl,vf610-iomuxc.yaml +f:Documentation/devicetree/bindings/pinctrl/img,pistachio-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/ingenic,pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/intel,lgm-io.yaml +f:Documentation/devicetree/bindings/pinctrl/intel,pinctrl-keembay.yaml +f:Documentation/devicetree/bindings/pinctrl/lantiq,pinctrl-falcon.txt +f:Documentation/devicetree/bindings/pinctrl/lantiq,pinctrl-xway.txt +f:Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/marvell,ac5-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/marvell,armada-370-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,armada-375-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,armada-38x-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,armada-39x-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,armada-xp-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,dove-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,kirkwood-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,mvebu-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/marvell,orion-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt65xx-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt6779-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt6795-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt6893-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt7620-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt7621-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt76x8-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt7981-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt7986-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt7988-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt8183-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt8186-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt8188-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt8192-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt8195-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt8196-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/mediatek,mt8365-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/microchip,mcp23s08.yaml +f:Documentation/devicetree/bindings/pinctrl/microchip,pic32-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/microchip,sparx5-sgpio.yaml +f:Documentation/devicetree/bindings/pinctrl/mscc,ocelot-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/nuvoton,ma35d1-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/nuvoton,npcm7xx-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/nuvoton,npcm845-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/nuvoton,wpcm450-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra-pinmux-common.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra114-pinmux.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra124-pinmux.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra124-xusb-padctl.txt +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra194-pinmux.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra20-pinmux.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra210-pinmux.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra234-pinmux-aon.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra234-pinmux-common.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra234-pinmux.yaml +f:Documentation/devicetree/bindings/pinctrl/nvidia,tegra30-pinmux.yaml +f:Documentation/devicetree/bindings/pinctrl/nxp,lpc1850-scu.txt +f:Documentation/devicetree/bindings/pinctrl/nxp,s32g2-siul2-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/pincfg-node.yaml +f:Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt +f:Documentation/devicetree/bindings/pinctrl/pinctrl-max77620.txt +f:Documentation/devicetree/bindings/pinctrl/pinctrl-palmas.txt +f:Documentation/devicetree/bindings/pinctrl/pinctrl-rk805.txt +f:Documentation/devicetree/bindings/pinctrl/pinctrl-single.yaml +f:Documentation/devicetree/bindings/pinctrl/pinctrl-sirf.txt +f:Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt +f:Documentation/devicetree/bindings/pinctrl/pinctrl-vt8500.txt +f:Documentation/devicetree/bindings/pinctrl/pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/pinctrl_spear.txt +f:Documentation/devicetree/bindings/pinctrl/pinmux-node.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,apq8064-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,apq8084-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,ipq4019-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,ipq5018-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,ipq5332-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,ipq5424-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,ipq6018-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,ipq8064-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,ipq8074-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,ipq9574-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,lpass-lpi-common.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,mdm9607-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,mdm9615-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8226-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8660-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8909-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8916-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8917-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8953-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8960-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8974-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8976-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8994-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8996-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,msm8998-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,pmic-gpio.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,pmic-mpp.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,qcm2290-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,qcs404-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,qcs615-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,qcs8300-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,qdu1000-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sa8775p-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sar2130p-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sc7180-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sc7280-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sc7280-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sc8180x-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sc8280xp-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sc8280xp-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sdm630-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sdm670-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sdm845-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sdx55-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sdx65-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sdx75-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm4250-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm4450-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm6115-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm6115-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm6125-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm6350-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm6375-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm7150-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8150-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8250-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8250-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8350-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8350-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8450-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8450-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8550-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8550-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8650-lpass-lpi-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8650-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,sm8750-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,tlmm-common.yaml +f:Documentation/devicetree/bindings/pinctrl/qcom,x1e80100-tlmm.yaml +f:Documentation/devicetree/bindings/pinctrl/ralink,rt2880-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/ralink,rt305x-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/ralink,rt3352-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/ralink,rt3883-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/ralink,rt5350-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/raspberrypi,rp1-gpio.yaml +f:Documentation/devicetree/bindings/pinctrl/realtek,rtd1315e-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/realtek,rtd1319d-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/realtek,rtd1619b-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/renesas,pfc.yaml +f:Documentation/devicetree/bindings/pinctrl/renesas,rza1-ports.yaml +f:Documentation/devicetree/bindings/pinctrl/renesas,rza2-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-poeg.yaml +f:Documentation/devicetree/bindings/pinctrl/renesas,rzn1-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/renesas,rzv2m-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/samsung,pinctrl-gpio-bank.yaml +f:Documentation/devicetree/bindings/pinctrl/samsung,pinctrl-pins-cfg.yaml +f:Documentation/devicetree/bindings/pinctrl/samsung,pinctrl-wakeup-interrupt.yaml +f:Documentation/devicetree/bindings/pinctrl/samsung,pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/semtech,sx1501q.yaml +f:Documentation/devicetree/bindings/pinctrl/socionext,uniphier-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/sophgo,cv1800-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/sophgo,sg2042-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/spacemit,k1-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/sprd,pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/sprd,sc9860-pinctrl.txt +f:Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/starfive,jh7100-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/starfive,jh7110-aon-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/starfive,jh7110-sys-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/ste,abx500.txt +f:Documentation/devicetree/bindings/pinctrl/ste,nomadik.txt +f:Documentation/devicetree/bindings/pinctrl/sunplus,sp7021-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/thead,th1520-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/ti,da850-pupd.txt +f:Documentation/devicetree/bindings/pinctrl/ti,iodelay.txt +f:Documentation/devicetree/bindings/pinctrl/toshiba,visconti-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/xlnx,pinctrl-zynq.yaml +f:Documentation/devicetree/bindings/pinctrl/xlnx,versal-pinctrl.yaml +f:Documentation/devicetree/bindings/pinctrl/xlnx,zynqmp-pinctrl.yaml +f:Documentation/devicetree/bindings/platform/acer,aspire1-ec.yaml +f:Documentation/devicetree/bindings/platform/huawei,gaokun-ec.yaml +f:Documentation/devicetree/bindings/platform/lenovo,yoga-c630-ec.yaml +f:Documentation/devicetree/bindings/platform/microsoft,surface-sam.yaml +f:Documentation/devicetree/bindings/pmem/pmem-region.yaml +f:Documentation/devicetree/bindings/power/actions,owl-sps.txt +f:Documentation/devicetree/bindings/power/allwinner,sun20i-d1-ppu.yaml +f:Documentation/devicetree/bindings/power/allwinner,sun50i-h6-prcm-ppu.yaml +f:Documentation/devicetree/bindings/power/amlogic,meson-ee-pwrc.yaml +f:Documentation/devicetree/bindings/power/amlogic,meson-gx-pwrc.txt +f:Documentation/devicetree/bindings/power/amlogic,meson-sec-pwrc.yaml +f:Documentation/devicetree/bindings/power/apple,pmgr-pwrstate.yaml +f:Documentation/devicetree/bindings/power/avs/qcom,cpr.yaml +f:Documentation/devicetree/bindings/power/brcm,bcm-pmb.yaml +f:Documentation/devicetree/bindings/power/brcm,bcm63xx-power.yaml +f:Documentation/devicetree/bindings/power/domain-idle-state.yaml +f:Documentation/devicetree/bindings/power/fsl,imx-gpc.yaml +f:Documentation/devicetree/bindings/power/fsl,imx-gpcv2.yaml +f:Documentation/devicetree/bindings/power/fsl,scu-pd.yaml +f:Documentation/devicetree/bindings/power/mediatek,power-controller.yaml +f:Documentation/devicetree/bindings/power/mti,mips-cpc.yaml +f:Documentation/devicetree/bindings/power/pd-samsung.yaml +f:Documentation/devicetree/bindings/power/power-controller.txt +f:Documentation/devicetree/bindings/power/power-domain.yaml +f:Documentation/devicetree/bindings/power/power_domain.txt +f:Documentation/devicetree/bindings/power/qcom,kpss-acc-v2.yaml +f:Documentation/devicetree/bindings/power/qcom,rpmpd.yaml +f:Documentation/devicetree/bindings/power/raspberrypi,bcm2835-power.yaml +f:Documentation/devicetree/bindings/power/renesas,apmu.yaml +f:Documentation/devicetree/bindings/power/renesas,rcar-sysc.yaml +f:Documentation/devicetree/bindings/power/renesas,sysc-rmobile.yaml +f:Documentation/devicetree/bindings/power/reset/apple,smc-reboot.yaml +f:Documentation/devicetree/bindings/power/reset/atmel,at91sam9260-shdwc.yaml +f:Documentation/devicetree/bindings/power/reset/atmel,sama5d2-shdwc.yaml +f:Documentation/devicetree/bindings/power/reset/axxia-reset.txt +f:Documentation/devicetree/bindings/power/reset/brcm,bcm21664-resetmgr.yaml +f:Documentation/devicetree/bindings/power/reset/gemini-poweroff.txt +f:Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml +f:Documentation/devicetree/bindings/power/reset/gpio-restart.yaml +f:Documentation/devicetree/bindings/power/reset/keystone-reset.txt +f:Documentation/devicetree/bindings/power/reset/ltc2952-poweroff.txt +f:Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml +f:Documentation/devicetree/bindings/power/reset/ocelot-reset.txt +f:Documentation/devicetree/bindings/power/reset/qcom,pon.yaml +f:Documentation/devicetree/bindings/power/reset/qcom,pshold.yaml +f:Documentation/devicetree/bindings/power/reset/qnap-poweroff.txt +f:Documentation/devicetree/bindings/power/reset/reboot-mode.yaml +f:Documentation/devicetree/bindings/power/reset/regulator-poweroff.yaml +f:Documentation/devicetree/bindings/power/reset/restart-handler.yaml +f:Documentation/devicetree/bindings/power/reset/restart-poweroff.txt +f:Documentation/devicetree/bindings/power/reset/st-reset.txt +f:Documentation/devicetree/bindings/power/reset/syscon-poweroff.yaml +f:Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml +f:Documentation/devicetree/bindings/power/reset/syscon-reboot.yaml +f:Documentation/devicetree/bindings/power/reset/toradex,smarc-ec.yaml +f:Documentation/devicetree/bindings/power/reset/xlnx,zynqmp-power.yaml +f:Documentation/devicetree/bindings/power/rockchip,power-controller.yaml +f:Documentation/devicetree/bindings/power/rockchip-io-domain.yaml +f:Documentation/devicetree/bindings/power/starfive,jh7110-pmu.yaml +f:Documentation/devicetree/bindings/power/supply/active-semi,act8945a-charger.yaml +f:Documentation/devicetree/bindings/power/supply/adc-battery.yaml +f:Documentation/devicetree/bindings/power/supply/battery.yaml +f:Documentation/devicetree/bindings/power/supply/bq2415x.yaml +f:Documentation/devicetree/bindings/power/supply/bq24190.yaml +f:Documentation/devicetree/bindings/power/supply/bq24257.yaml +f:Documentation/devicetree/bindings/power/supply/bq24735.yaml +f:Documentation/devicetree/bindings/power/supply/bq2515x.yaml +f:Documentation/devicetree/bindings/power/supply/bq256xx.yaml +f:Documentation/devicetree/bindings/power/supply/bq25890.yaml +f:Documentation/devicetree/bindings/power/supply/bq25980.yaml +f:Documentation/devicetree/bindings/power/supply/bq27xxx.yaml +f:Documentation/devicetree/bindings/power/supply/charger-manager.yaml +f:Documentation/devicetree/bindings/power/supply/cpcap-battery.yaml +f:Documentation/devicetree/bindings/power/supply/cpcap-charger.yaml +f:Documentation/devicetree/bindings/power/supply/cw2015_battery.yaml +f:Documentation/devicetree/bindings/power/supply/dlg,da9150-charger.yaml +f:Documentation/devicetree/bindings/power/supply/dlg,da9150-fuel-gauge.yaml +f:Documentation/devicetree/bindings/power/supply/gpio-charger.yaml +f:Documentation/devicetree/bindings/power/supply/ingenic,battery.yaml +f:Documentation/devicetree/bindings/power/supply/isp1704.yaml +f:Documentation/devicetree/bindings/power/supply/lego,ev3-battery.yaml +f:Documentation/devicetree/bindings/power/supply/lltc,lt3651-charger.yaml +f:Documentation/devicetree/bindings/power/supply/lltc,ltc294x.yaml +f:Documentation/devicetree/bindings/power/supply/ltc4162-l.yaml +f:Documentation/devicetree/bindings/power/supply/max77650-charger.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,ds2760.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max14577.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max14656.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max17040.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max17042.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max17201.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max77705.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max77976.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max8903.yaml +f:Documentation/devicetree/bindings/power/supply/maxim,max8971.yaml +f:Documentation/devicetree/bindings/power/supply/mediatek,mt6370-charger.yaml +f:Documentation/devicetree/bindings/power/supply/microchip,ucs1002.yaml +f:Documentation/devicetree/bindings/power/supply/mitsumi,mm8013.yaml +f:Documentation/devicetree/bindings/power/supply/mt6360_charger.yaml +f:Documentation/devicetree/bindings/power/supply/nokia,n900-battery.yaml +f:Documentation/devicetree/bindings/power/supply/olpc-battery.yaml +f:Documentation/devicetree/bindings/power/supply/pegatron,chagall-ec.yaml +f:Documentation/devicetree/bindings/power/supply/power-supply.yaml +f:Documentation/devicetree/bindings/power/supply/qcom,pm8916-bms-vm.yaml +f:Documentation/devicetree/bindings/power/supply/qcom,pm8916-lbc.yaml +f:Documentation/devicetree/bindings/power/supply/qcom,pm8941-charger.yaml +f:Documentation/devicetree/bindings/power/supply/qcom,pm8941-coincell.yaml +f:Documentation/devicetree/bindings/power/supply/qcom,pmi8998-charger.yaml +f:Documentation/devicetree/bindings/power/supply/richtek,rt5033-battery.yaml +f:Documentation/devicetree/bindings/power/supply/richtek,rt5033-charger.yaml +f:Documentation/devicetree/bindings/power/supply/richtek,rt9455.yaml +f:Documentation/devicetree/bindings/power/supply/richtek,rt9467.yaml +f:Documentation/devicetree/bindings/power/supply/richtek,rt9471.yaml +f:Documentation/devicetree/bindings/power/supply/rohm,bd99954.yaml +f:Documentation/devicetree/bindings/power/supply/samsung,battery.yaml +f:Documentation/devicetree/bindings/power/supply/sbs,sbs-battery.yaml +f:Documentation/devicetree/bindings/power/supply/sbs,sbs-charger.yaml +f:Documentation/devicetree/bindings/power/supply/sbs,sbs-manager.yaml +f:Documentation/devicetree/bindings/power/supply/sc2731-charger.yaml +f:Documentation/devicetree/bindings/power/supply/sc27xx-fg.yaml +f:Documentation/devicetree/bindings/power/supply/st,stc3117.yaml +f:Documentation/devicetree/bindings/power/supply/stericsson,ab8500-btemp.yaml +f:Documentation/devicetree/bindings/power/supply/stericsson,ab8500-chargalg.yaml +f:Documentation/devicetree/bindings/power/supply/stericsson,ab8500-charger.yaml +f:Documentation/devicetree/bindings/power/supply/stericsson,ab8500-fg.yaml +f:Documentation/devicetree/bindings/power/supply/summit,smb347-charger.yaml +f:Documentation/devicetree/bindings/power/supply/ti,lp8727.yaml +f:Documentation/devicetree/bindings/power/supply/ti,twl6030-charger.yaml +f:Documentation/devicetree/bindings/power/supply/tps65090-charger.yaml +f:Documentation/devicetree/bindings/power/supply/tps65217-charger.yaml +f:Documentation/devicetree/bindings/power/supply/twl4030-charger.yaml +f:Documentation/devicetree/bindings/power/supply/x-powers,axp20x-ac-power-supply.yaml +f:Documentation/devicetree/bindings/power/supply/x-powers,axp20x-battery-power-supply.yaml +f:Documentation/devicetree/bindings/power/supply/x-powers,axp20x-usb-power-supply.yaml +f:Documentation/devicetree/bindings/power/ti-smartreflex.txt +f:Documentation/devicetree/bindings/power/wakeup-source.txt +f:Documentation/devicetree/bindings/powerpc/4xx/akebono.txt +f:Documentation/devicetree/bindings/powerpc/4xx/cpm.txt +f:Documentation/devicetree/bindings/powerpc/4xx/hsta.txt +f:Documentation/devicetree/bindings/powerpc/4xx/ppc440spe-adma.txt +f:Documentation/devicetree/bindings/powerpc/4xx/reboot.txt +f:Documentation/devicetree/bindings/powerpc/fsl/ccf.txt +f:Documentation/devicetree/bindings/powerpc/fsl/cpus.txt +f:Documentation/devicetree/bindings/powerpc/fsl/dcsr.txt +f:Documentation/devicetree/bindings/powerpc/fsl/diu.txt +f:Documentation/devicetree/bindings/powerpc/fsl/ecm.txt +f:Documentation/devicetree/bindings/powerpc/fsl/interlaken-lac.txt +f:Documentation/devicetree/bindings/powerpc/fsl/lbc.txt +f:Documentation/devicetree/bindings/powerpc/fsl/mcm.txt +f:Documentation/devicetree/bindings/powerpc/fsl/mpc5121-psc.txt +f:Documentation/devicetree/bindings/powerpc/fsl/mpc512x_lpbfifo.txt +f:Documentation/devicetree/bindings/powerpc/fsl/mpc5200.txt +f:Documentation/devicetree/bindings/powerpc/fsl/mpic-msgr.txt +f:Documentation/devicetree/bindings/powerpc/fsl/mpic-timer.txt +f:Documentation/devicetree/bindings/powerpc/fsl/mpic.txt +f:Documentation/devicetree/bindings/powerpc/fsl/pamu.txt +f:Documentation/devicetree/bindings/powerpc/fsl/pmc.yaml +f:Documentation/devicetree/bindings/powerpc/fsl/raideng.txt +f:Documentation/devicetree/bindings/powerpc/fsl/scfg.txt +f:Documentation/devicetree/bindings/powerpc/fsl/srio-rmu.txt +f:Documentation/devicetree/bindings/powerpc/fsl/srio.txt +f:Documentation/devicetree/bindings/powerpc/ibm,powerpc-cpu-features.txt +f:Documentation/devicetree/bindings/powerpc/ibm,vas.txt +f:Documentation/devicetree/bindings/powerpc/nintendo/gamecube.txt +f:Documentation/devicetree/bindings/powerpc/nintendo/wii.txt +f:Documentation/devicetree/bindings/powerpc/opal/oppanel-opal.txt +f:Documentation/devicetree/bindings/powerpc/opal/power-mgt.txt +f:Documentation/devicetree/bindings/powerpc/opal/sensor-groups.txt +f:Documentation/devicetree/bindings/powerpc/sleep.yaml +f:Documentation/devicetree/bindings/pps/pps-gpio.yaml +f:Documentation/devicetree/bindings/ptp/brcm,ptp-dte.txt +f:Documentation/devicetree/bindings/ptp/fsl,ptp.yaml +f:Documentation/devicetree/bindings/ptp/ptp-idt82p33.yaml +f:Documentation/devicetree/bindings/ptp/ptp-idtcm.yaml +f:Documentation/devicetree/bindings/ptp/ptp-ines.txt +f:Documentation/devicetree/bindings/ptp/timestamper.txt +f:Documentation/devicetree/bindings/pwm/adi,axi-pwmgen.yaml +f:Documentation/devicetree/bindings/pwm/airoha,en7581-pwm.yaml +f:Documentation/devicetree/bindings/pwm/allwinner,sun4i-a10-pwm.yaml +f:Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml +f:Documentation/devicetree/bindings/pwm/argon40,fan-hat.yaml +f:Documentation/devicetree/bindings/pwm/atmel,at91sam-pwm.yaml +f:Documentation/devicetree/bindings/pwm/atmel,hlcdc-pwm.yaml +f:Documentation/devicetree/bindings/pwm/brcm,bcm7038-pwm.yaml +f:Documentation/devicetree/bindings/pwm/brcm,iproc-pwm.yaml +f:Documentation/devicetree/bindings/pwm/brcm,kona-pwm.yaml +f:Documentation/devicetree/bindings/pwm/cirrus,clps711x-pwm.txt +f:Documentation/devicetree/bindings/pwm/cirrus,ep9301-pwm.yaml +f:Documentation/devicetree/bindings/pwm/clk-pwm.yaml +f:Documentation/devicetree/bindings/pwm/fsl,vf610-ftm-pwm.yaml +f:Documentation/devicetree/bindings/pwm/google,cros-ec-pwm.yaml +f:Documentation/devicetree/bindings/pwm/img-pwm.txt +f:Documentation/devicetree/bindings/pwm/imx-pwm.yaml +f:Documentation/devicetree/bindings/pwm/imx-tpm-pwm.yaml +f:Documentation/devicetree/bindings/pwm/intel,keembay-pwm.yaml +f:Documentation/devicetree/bindings/pwm/intel,lgm-pwm.yaml +f:Documentation/devicetree/bindings/pwm/iqs620a-pwm.yaml +f:Documentation/devicetree/bindings/pwm/kontron,sl28cpld-pwm.yaml +f:Documentation/devicetree/bindings/pwm/loongson,ls7a-pwm.yaml +f:Documentation/devicetree/bindings/pwm/marvell,berlin-pwm.yaml +f:Documentation/devicetree/bindings/pwm/marvell,pxa-pwm.yaml +f:Documentation/devicetree/bindings/pwm/mediatek,mt2712-pwm.yaml +f:Documentation/devicetree/bindings/pwm/mediatek,pwm-disp.yaml +f:Documentation/devicetree/bindings/pwm/microchip,corepwm.yaml +f:Documentation/devicetree/bindings/pwm/mxs-pwm.yaml +f:Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.yaml +f:Documentation/devicetree/bindings/pwm/nxp,lpc1850-sct-pwm.yaml +f:Documentation/devicetree/bindings/pwm/nxp,lpc3220-pwm.yaml +f:Documentation/devicetree/bindings/pwm/nxp,mc33xs2410.yaml +f:Documentation/devicetree/bindings/pwm/nxp,pca9685-pwm.txt +f:Documentation/devicetree/bindings/pwm/opencores,pwm.yaml +f:Documentation/devicetree/bindings/pwm/pwm-amlogic.yaml +f:Documentation/devicetree/bindings/pwm/pwm-bcm2835.yaml +f:Documentation/devicetree/bindings/pwm/pwm-gpio.yaml +f:Documentation/devicetree/bindings/pwm/pwm-hibvt.txt +f:Documentation/devicetree/bindings/pwm/pwm-lp3943.txt +f:Documentation/devicetree/bindings/pwm/pwm-nexus-node.yaml +f:Documentation/devicetree/bindings/pwm/pwm-rockchip.yaml +f:Documentation/devicetree/bindings/pwm/pwm-samsung.yaml +f:Documentation/devicetree/bindings/pwm/pwm-sifive.yaml +f:Documentation/devicetree/bindings/pwm/pwm-st.txt +f:Documentation/devicetree/bindings/pwm/pwm-tiecap.yaml +f:Documentation/devicetree/bindings/pwm/pwm-tiehrpwm.yaml +f:Documentation/devicetree/bindings/pwm/pwm-tipwmss.txt +f:Documentation/devicetree/bindings/pwm/pwm.txt +f:Documentation/devicetree/bindings/pwm/pwm.yaml +f:Documentation/devicetree/bindings/pwm/renesas,pwm-rcar.yaml +f:Documentation/devicetree/bindings/pwm/renesas,rzg2l-gpt.yaml +f:Documentation/devicetree/bindings/pwm/renesas,tpu-pwm.yaml +f:Documentation/devicetree/bindings/pwm/snps,dw-apb-timers-pwm2.yaml +f:Documentation/devicetree/bindings/pwm/sophgo,sg2042-pwm.yaml +f:Documentation/devicetree/bindings/pwm/spear-pwm.txt +f:Documentation/devicetree/bindings/pwm/sprd,ums512-pwm.yaml +f:Documentation/devicetree/bindings/pwm/st,stmpe-pwm.txt +f:Documentation/devicetree/bindings/pwm/sunplus,sp7021-pwm.yaml +f:Documentation/devicetree/bindings/pwm/ti,omap-dmtimer-pwm.yaml +f:Documentation/devicetree/bindings/pwm/ti,twl-pwm.txt +f:Documentation/devicetree/bindings/pwm/ti,twl-pwmled.txt +f:Documentation/devicetree/bindings/pwm/toshiba,pwm-visconti.yaml +f:Documentation/devicetree/bindings/pwm/via,vt8500-pwm.yaml +f:Documentation/devicetree/bindings/regmap/regmap.txt +f:Documentation/devicetree/bindings/regulator/88pg86x.txt +f:Documentation/devicetree/bindings/regulator/88pm800.txt +f:Documentation/devicetree/bindings/regulator/88pm860x.txt +f:Documentation/devicetree/bindings/regulator/active-semi,act8600.yaml +f:Documentation/devicetree/bindings/regulator/active-semi,act8846.yaml +f:Documentation/devicetree/bindings/regulator/active-semi,act8865.yaml +f:Documentation/devicetree/bindings/regulator/active-semi,act8945a.yaml +f:Documentation/devicetree/bindings/regulator/adi,adp5055-regulator.yaml +f:Documentation/devicetree/bindings/regulator/adi,max77503-regulator.yaml +f:Documentation/devicetree/bindings/regulator/adi,max77541-regulator.yaml +f:Documentation/devicetree/bindings/regulator/adi,max77857.yaml +f:Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml +f:Documentation/devicetree/bindings/regulator/anatop-regulator.yaml +f:Documentation/devicetree/bindings/regulator/as3722-regulator.txt +f:Documentation/devicetree/bindings/regulator/awinic,aw37503.yaml +f:Documentation/devicetree/bindings/regulator/brcm,bcm59054.yaml +f:Documentation/devicetree/bindings/regulator/brcm,bcm59056.yaml +f:Documentation/devicetree/bindings/regulator/cpcap-regulator.txt +f:Documentation/devicetree/bindings/regulator/da9211.txt +f:Documentation/devicetree/bindings/regulator/dlg,da9121.yaml +f:Documentation/devicetree/bindings/regulator/dlg,da9210.yaml +f:Documentation/devicetree/bindings/regulator/dlg,slg51000.yaml +f:Documentation/devicetree/bindings/regulator/fcs,fan53555.yaml +f:Documentation/devicetree/bindings/regulator/fixed-regulator.yaml +f:Documentation/devicetree/bindings/regulator/google,cros-ec-regulator.yaml +f:Documentation/devicetree/bindings/regulator/gpio-regulator.yaml +f:Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt +f:Documentation/devicetree/bindings/regulator/infineon,ir38060.yaml +f:Documentation/devicetree/bindings/regulator/isl9305.txt +f:Documentation/devicetree/bindings/regulator/lltc,ltc3676.yaml +f:Documentation/devicetree/bindings/regulator/lm363x-regulator.txt +f:Documentation/devicetree/bindings/regulator/lp872x.txt +f:Documentation/devicetree/bindings/regulator/ltc3589.txt +f:Documentation/devicetree/bindings/regulator/max1586-regulator.txt +f:Documentation/devicetree/bindings/regulator/max77650-regulator.yaml +f:Documentation/devicetree/bindings/regulator/max8660.yaml +f:Documentation/devicetree/bindings/regulator/max8893.yaml +f:Documentation/devicetree/bindings/regulator/max8907.txt +f:Documentation/devicetree/bindings/regulator/max8925-regulator.txt +f:Documentation/devicetree/bindings/regulator/maxim,max14577.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max20086.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max20411.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max77686.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max77693.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max77802.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max77826.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max77843.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max8952.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max8973.yaml +f:Documentation/devicetree/bindings/regulator/maxim,max8997.yaml +f:Documentation/devicetree/bindings/regulator/mediatek,mt6331-regulator.yaml +f:Documentation/devicetree/bindings/regulator/mediatek,mt6332-regulator.yaml +f:Documentation/devicetree/bindings/regulator/mediatek,mt6357-regulator.yaml +f:Documentation/devicetree/bindings/regulator/mediatek,mt6358-regulator.yaml +f:Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml +f:Documentation/devicetree/bindings/regulator/mediatek,mt6873-dvfsrc-regulator.yaml +f:Documentation/devicetree/bindings/regulator/microchip,mcp16502.yaml +f:Documentation/devicetree/bindings/regulator/mp8859.txt +f:Documentation/devicetree/bindings/regulator/mps,mp5416.yaml +f:Documentation/devicetree/bindings/regulator/mps,mp886x.yaml +f:Documentation/devicetree/bindings/regulator/mps,mpq2286.yaml +f:Documentation/devicetree/bindings/regulator/mps,mpq7920.yaml +f:Documentation/devicetree/bindings/regulator/mps,mpq7932.yaml +f:Documentation/devicetree/bindings/regulator/mt6311-regulator.txt +f:Documentation/devicetree/bindings/regulator/mt6315-regulator.yaml +f:Documentation/devicetree/bindings/regulator/mt6323-regulator.txt +f:Documentation/devicetree/bindings/regulator/mt6359-regulator.yaml +f:Documentation/devicetree/bindings/regulator/mt6360-regulator.yaml +f:Documentation/devicetree/bindings/regulator/mt6380-regulator.txt +f:Documentation/devicetree/bindings/regulator/nvidia,tegra-regulators-coupling.txt +f:Documentation/devicetree/bindings/regulator/nxp,pca9450-regulator.yaml +f:Documentation/devicetree/bindings/regulator/nxp,pf8x00-regulator.yaml +f:Documentation/devicetree/bindings/regulator/onnn,fan53880.yaml +f:Documentation/devicetree/bindings/regulator/palmas-pmic.txt +f:Documentation/devicetree/bindings/regulator/pbias-regulator.txt +f:Documentation/devicetree/bindings/regulator/pfuze100.yaml +f:Documentation/devicetree/bindings/regulator/pv88060.txt +f:Documentation/devicetree/bindings/regulator/pv88080.txt +f:Documentation/devicetree/bindings/regulator/pv88090.txt +f:Documentation/devicetree/bindings/regulator/pwm-regulator.yaml +f:Documentation/devicetree/bindings/regulator/qcom,qca6390-pmu.yaml +f:Documentation/devicetree/bindings/regulator/qcom,rpm-regulator.yaml +f:Documentation/devicetree/bindings/regulator/qcom,rpmh-regulator.yaml +f:Documentation/devicetree/bindings/regulator/qcom,sdm845-refgen-regulator.yaml +f:Documentation/devicetree/bindings/regulator/qcom,smd-rpm-regulator.yaml +f:Documentation/devicetree/bindings/regulator/qcom,spmi-regulator.yaml +f:Documentation/devicetree/bindings/regulator/qcom,usb-vbus-regulator.yaml +f:Documentation/devicetree/bindings/regulator/qcom-labibb-regulator.yaml +f:Documentation/devicetree/bindings/regulator/raspberrypi,7inch-touchscreen-panel-regulator.yaml +f:Documentation/devicetree/bindings/regulator/regulator-max77620.txt +f:Documentation/devicetree/bindings/regulator/regulator-output.yaml +f:Documentation/devicetree/bindings/regulator/regulator.txt +f:Documentation/devicetree/bindings/regulator/regulator.yaml +f:Documentation/devicetree/bindings/regulator/renesas,raa215300.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt4801-regulator.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt4803.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt4831-regulator.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt5190a-regulator.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt5739.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt5759-regulator.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt6160-regulator.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt6190.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rt6245-regulator.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rtmv20-regulator.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rtq2134-regulator.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rtq2208.yaml +f:Documentation/devicetree/bindings/regulator/richtek,rtq6752-regulator.yaml +f:Documentation/devicetree/bindings/regulator/rohm,bd71815-regulator.yaml +f:Documentation/devicetree/bindings/regulator/rohm,bd71828-regulator.yaml +f:Documentation/devicetree/bindings/regulator/rohm,bd71837-regulator.yaml +f:Documentation/devicetree/bindings/regulator/rohm,bd71847-regulator.yaml +f:Documentation/devicetree/bindings/regulator/rohm,bd9576-regulator.yaml +f:Documentation/devicetree/bindings/regulator/rohm,bd96801-regulator.yaml +f:Documentation/devicetree/bindings/regulator/rohm,bd96802-regulator.yaml +f:Documentation/devicetree/bindings/regulator/samsung,s2mpa01.yaml +f:Documentation/devicetree/bindings/regulator/samsung,s2mps11.yaml +f:Documentation/devicetree/bindings/regulator/samsung,s2mps13.yaml +f:Documentation/devicetree/bindings/regulator/samsung,s2mps14.yaml +f:Documentation/devicetree/bindings/regulator/samsung,s2mps15.yaml +f:Documentation/devicetree/bindings/regulator/samsung,s2mpu02.yaml +f:Documentation/devicetree/bindings/regulator/samsung,s2mpu05.yaml +f:Documentation/devicetree/bindings/regulator/samsung,s5m8767.yaml +f:Documentation/devicetree/bindings/regulator/silergy,sy8106a.yaml +f:Documentation/devicetree/bindings/regulator/silergy,sy8824x.yaml +f:Documentation/devicetree/bindings/regulator/silergy,sy8827n.yaml +f:Documentation/devicetree/bindings/regulator/siliconmitus,sm5703-regulator.yaml +f:Documentation/devicetree/bindings/regulator/sky81452-regulator.txt +f:Documentation/devicetree/bindings/regulator/socionext,uniphier-regulator.yaml +f:Documentation/devicetree/bindings/regulator/sprd,sc2731-regulator.yaml +f:Documentation/devicetree/bindings/regulator/st,stm32-booster.yaml +f:Documentation/devicetree/bindings/regulator/st,stm32-vrefbuf.yaml +f:Documentation/devicetree/bindings/regulator/st,stm32mp1-pwr-reg.yaml +f:Documentation/devicetree/bindings/regulator/ti,tps62360.yaml +f:Documentation/devicetree/bindings/regulator/ti,tps62864.yaml +f:Documentation/devicetree/bindings/regulator/ti,tps62870.yaml +f:Documentation/devicetree/bindings/regulator/ti,tps65132.yaml +f:Documentation/devicetree/bindings/regulator/ti,tps65219.yaml +f:Documentation/devicetree/bindings/regulator/ti-abb-regulator.txt +f:Documentation/devicetree/bindings/regulator/tps51632-regulator.txt +f:Documentation/devicetree/bindings/regulator/tps65023.txt +f:Documentation/devicetree/bindings/regulator/tps65090.txt +f:Documentation/devicetree/bindings/regulator/tps65217.txt +f:Documentation/devicetree/bindings/regulator/tps65218.txt +f:Documentation/devicetree/bindings/regulator/tps6586x.txt +f:Documentation/devicetree/bindings/regulator/vctrl-regulator.yaml +f:Documentation/devicetree/bindings/regulator/vexpress.txt +f:Documentation/devicetree/bindings/regulator/vqmmc-ipq4019-regulator.yaml +f:Documentation/devicetree/bindings/regulator/wlf,arizona.yaml +f:Documentation/devicetree/bindings/remoteproc/amlogic,meson-mx-ao-arc.yaml +f:Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml +f:Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml +f:Documentation/devicetree/bindings/remoteproc/mtk,scp.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,adsp.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,glink-edge.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,glink-rpm-edge.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,msm8916-mss-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,msm8996-mss-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,pas-common.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,pil-info.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,q6v5.txt +f:Documentation/devicetree/bindings/remoteproc/qcom,qcs404-cdsp-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,qcs404-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,rpm-proc.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sa8775p-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sc7180-mss-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sc7180-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sc7280-mss-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sc7280-wpss-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sc8280xp-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sdm845-adsp-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sdx55-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sm6115-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sm6350-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sm6375-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sm8150-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sm8350-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,sm8550-pas.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,smd-edge.yaml +f:Documentation/devicetree/bindings/remoteproc/qcom,wcnss-pil.yaml +f:Documentation/devicetree/bindings/remoteproc/renesas,rcar-rproc.yaml +f:Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml +f:Documentation/devicetree/bindings/remoteproc/st-rproc.txt +f:Documentation/devicetree/bindings/remoteproc/ti,davinci-rproc.txt +f:Documentation/devicetree/bindings/remoteproc/ti,k3-dsp-rproc.yaml +f:Documentation/devicetree/bindings/remoteproc/ti,k3-m4f-rproc.yaml +f:Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.yaml +f:Documentation/devicetree/bindings/remoteproc/ti,keystone-rproc.txt +f:Documentation/devicetree/bindings/remoteproc/ti,omap-remoteproc.yaml +f:Documentation/devicetree/bindings/remoteproc/ti,pru-consumer.yaml +f:Documentation/devicetree/bindings/remoteproc/ti,pru-rproc.yaml +f:Documentation/devicetree/bindings/remoteproc/wkup_m3_rproc.txt +f:Documentation/devicetree/bindings/remoteproc/xlnx,zynqmp-r5fss.yaml +f:Documentation/devicetree/bindings/reserved-memory/google,open-dice.yaml +f:Documentation/devicetree/bindings/reserved-memory/nvidia,tegra210-emc-table.yaml +f:Documentation/devicetree/bindings/reserved-memory/nvidia,tegra264-bpmp-shmem.yaml +f:Documentation/devicetree/bindings/reserved-memory/phram.yaml +f:Documentation/devicetree/bindings/reserved-memory/qcom,cmd-db.yaml +f:Documentation/devicetree/bindings/reserved-memory/qcom,rmtfs-mem.yaml +f:Documentation/devicetree/bindings/reserved-memory/ramoops.yaml +f:Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt +f:Documentation/devicetree/bindings/reserved-memory/xen,shared-memory.txt +f:Documentation/devicetree/bindings/reset/allwinner,sun6i-a31-clock-reset.yaml +f:Documentation/devicetree/bindings/reset/altr,rst-mgr.yaml +f:Documentation/devicetree/bindings/reset/amlogic,meson-axg-audio-arb.yaml +f:Documentation/devicetree/bindings/reset/amlogic,meson-reset.yaml +f:Documentation/devicetree/bindings/reset/atmel,at91sam9260-reset.yaml +f:Documentation/devicetree/bindings/reset/bitmain,bm1880-reset.yaml +f:Documentation/devicetree/bindings/reset/brcm,bcm4908-misc-pcie-reset.yaml +f:Documentation/devicetree/bindings/reset/brcm,bcm63138-pmb.txt +f:Documentation/devicetree/bindings/reset/brcm,bcm6345-reset.yaml +f:Documentation/devicetree/bindings/reset/brcm,bcm7216-pcie-sata-rescal.yaml +f:Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.yaml +f:Documentation/devicetree/bindings/reset/canaan,k210-rst.yaml +f:Documentation/devicetree/bindings/reset/canaan,k230-rst.yaml +f:Documentation/devicetree/bindings/reset/delta,tn48m-reset.yaml +f:Documentation/devicetree/bindings/reset/fsl,imx-src.yaml +f:Documentation/devicetree/bindings/reset/fsl,imx7-src.yaml +f:Documentation/devicetree/bindings/reset/hisilicon,hi3660-reset.yaml +f:Documentation/devicetree/bindings/reset/img,pistachio-reset.txt +f:Documentation/devicetree/bindings/reset/intel,rcu-gw.yaml +f:Documentation/devicetree/bindings/reset/lantiq,reset.yaml +f:Documentation/devicetree/bindings/reset/marvell,berlin2-reset.yaml +f:Documentation/devicetree/bindings/reset/microchip,rst.yaml +f:Documentation/devicetree/bindings/reset/nuvoton,ma35d1-reset.yaml +f:Documentation/devicetree/bindings/reset/nuvoton,npcm750-reset.yaml +f:Documentation/devicetree/bindings/reset/nxp,lpc1850-rgu.yaml +f:Documentation/devicetree/bindings/reset/qca,ar7100-reset.yaml +f:Documentation/devicetree/bindings/reset/qcom,aoss-reset.yaml +f:Documentation/devicetree/bindings/reset/qcom,pdc-global.yaml +f:Documentation/devicetree/bindings/reset/renesas,rst.yaml +f:Documentation/devicetree/bindings/reset/renesas,rzg2l-usbphy-ctrl.yaml +f:Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml +f:Documentation/devicetree/bindings/reset/reset.txt +f:Documentation/devicetree/bindings/reset/snps,axs10x-reset.yaml +f:Documentation/devicetree/bindings/reset/snps,dw-reset.yaml +f:Documentation/devicetree/bindings/reset/snps,hsdk-reset.txt +f:Documentation/devicetree/bindings/reset/socionext,uniphier-glue-reset.yaml +f:Documentation/devicetree/bindings/reset/socionext,uniphier-reset.yaml +f:Documentation/devicetree/bindings/reset/sophgo,sg2042-reset.yaml +f:Documentation/devicetree/bindings/reset/st,sti-softreset.txt +f:Documentation/devicetree/bindings/reset/st,stih407-picophyreset.yaml +f:Documentation/devicetree/bindings/reset/st,stih407-powerdown.yaml +f:Documentation/devicetree/bindings/reset/st,stm32-rcc.txt +f:Documentation/devicetree/bindings/reset/st,stm32mp1-rcc.txt +f:Documentation/devicetree/bindings/reset/starfive,jh7100-reset.yaml +f:Documentation/devicetree/bindings/reset/sunplus,reset.yaml +f:Documentation/devicetree/bindings/reset/thead,th1520-reset.yaml +f:Documentation/devicetree/bindings/reset/ti,sci-reset.yaml +f:Documentation/devicetree/bindings/reset/ti,tps380x-reset.yaml +f:Documentation/devicetree/bindings/reset/ti-syscon-reset.txt +f:Documentation/devicetree/bindings/reset/xlnx,zynqmp-reset.yaml +f:Documentation/devicetree/bindings/reset/zynq-reset.txt +f:Documentation/devicetree/bindings/resource-names.txt +f:Documentation/devicetree/bindings/riscv/andes.yaml +f:Documentation/devicetree/bindings/riscv/canaan.yaml +f:Documentation/devicetree/bindings/riscv/cpus.yaml +f:Documentation/devicetree/bindings/riscv/extensions.yaml +f:Documentation/devicetree/bindings/riscv/microchip.yaml +f:Documentation/devicetree/bindings/riscv/sifive.yaml +f:Documentation/devicetree/bindings/riscv/spacemit.yaml +f:Documentation/devicetree/bindings/riscv/starfive.yaml +f:Documentation/devicetree/bindings/riscv/sunxi.yaml +f:Documentation/devicetree/bindings/riscv/thead.yaml +f:Documentation/devicetree/bindings/rng/airoha,en7581-trng.yaml +f:Documentation/devicetree/bindings/rng/amlogic,meson-rng.yaml +f:Documentation/devicetree/bindings/rng/apm,x-gene-rng.yaml +f:Documentation/devicetree/bindings/rng/arm-cctrng.yaml +f:Documentation/devicetree/bindings/rng/atmel,at91-trng.yaml +f:Documentation/devicetree/bindings/rng/brcm,bcm2835.yaml +f:Documentation/devicetree/bindings/rng/brcm,bcm74110-rng.yaml +f:Documentation/devicetree/bindings/rng/brcm,iproc-rng200.yaml +f:Documentation/devicetree/bindings/rng/hisi-rng.txt +f:Documentation/devicetree/bindings/rng/imx-rng.yaml +f:Documentation/devicetree/bindings/rng/ingenic,rng.yaml +f:Documentation/devicetree/bindings/rng/ingenic,trng.yaml +f:Documentation/devicetree/bindings/rng/inside-secure,safexcel-eip76.yaml +f:Documentation/devicetree/bindings/rng/intel,ixp46x-rng.yaml +f:Documentation/devicetree/bindings/rng/microchip,pic32-rng.txt +f:Documentation/devicetree/bindings/rng/microsoft,vmgenid.yaml +f:Documentation/devicetree/bindings/rng/mtk-rng.yaml +f:Documentation/devicetree/bindings/rng/nuvoton,npcm-rng.yaml +f:Documentation/devicetree/bindings/rng/rockchip,rk3568-rng.yaml +f:Documentation/devicetree/bindings/rng/rockchip,rk3588-rng.yaml +f:Documentation/devicetree/bindings/rng/samsung,exynos4-rng.yaml +f:Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.yaml +f:Documentation/devicetree/bindings/rng/silex-insight,ba431-rng.yaml +f:Documentation/devicetree/bindings/rng/sparc_sun_oracle_rng.txt +f:Documentation/devicetree/bindings/rng/st,rng.yaml +f:Documentation/devicetree/bindings/rng/st,stm32-rng.yaml +f:Documentation/devicetree/bindings/rng/starfive,jh7110-trng.yaml +f:Documentation/devicetree/bindings/rng/ti,keystone-rng.yaml +f:Documentation/devicetree/bindings/rng/ti,omap-rom-rng.yaml +f:Documentation/devicetree/bindings/rng/timeriomem_rng.yaml +f:Documentation/devicetree/bindings/rng/xiphera,xip8001b-trng.yaml +f:Documentation/devicetree/bindings/rtc/abracon,abx80x.yaml +f:Documentation/devicetree/bindings/rtc/adi,max31335.yaml +f:Documentation/devicetree/bindings/rtc/allwinner,sun4i-a10-rtc.yaml +f:Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml +f:Documentation/devicetree/bindings/rtc/alphascale,asm9260-rtc.yaml +f:Documentation/devicetree/bindings/rtc/amlogic,a4-rtc.yaml +f:Documentation/devicetree/bindings/rtc/amlogic,meson-vrtc.yaml +f:Documentation/devicetree/bindings/rtc/amlogic,meson6-rtc.yaml +f:Documentation/devicetree/bindings/rtc/arm,pl031.yaml +f:Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.yaml +f:Documentation/devicetree/bindings/rtc/atmel,at91sam9260-rtt.yaml +f:Documentation/devicetree/bindings/rtc/brcm,brcmstb-waketimer.yaml +f:Documentation/devicetree/bindings/rtc/cdns,rtc.txt +f:Documentation/devicetree/bindings/rtc/cirrus,ep9301-rtc.yaml +f:Documentation/devicetree/bindings/rtc/cpcap-rtc.txt +f:Documentation/devicetree/bindings/rtc/dallas,ds1390.txt +f:Documentation/devicetree/bindings/rtc/epson,rtc7301.yaml +f:Documentation/devicetree/bindings/rtc/epson,rx6110.txt +f:Documentation/devicetree/bindings/rtc/epson,rx8900.yaml +f:Documentation/devicetree/bindings/rtc/faraday,ftrtc010.yaml +f:Documentation/devicetree/bindings/rtc/fsl,ls-ftm-alarm.yaml +f:Documentation/devicetree/bindings/rtc/fsl,scu-rtc.yaml +f:Documentation/devicetree/bindings/rtc/fsl,stmp3xxx-rtc.yaml +f:Documentation/devicetree/bindings/rtc/haoyu,hym8563.yaml +f:Documentation/devicetree/bindings/rtc/imxdi-rtc.yaml +f:Documentation/devicetree/bindings/rtc/ingenic,rtc.yaml +f:Documentation/devicetree/bindings/rtc/intersil,isl12022.yaml +f:Documentation/devicetree/bindings/rtc/isil,isl12026.txt +f:Documentation/devicetree/bindings/rtc/isil,isl12057.txt +f:Documentation/devicetree/bindings/rtc/isil,isl1208.yaml +f:Documentation/devicetree/bindings/rtc/loongson,rtc.yaml +f:Documentation/devicetree/bindings/rtc/marvell,armada-380-rtc.yaml +f:Documentation/devicetree/bindings/rtc/marvell,pxa-rtc.yaml +f:Documentation/devicetree/bindings/rtc/maxim-ds1302.txt +f:Documentation/devicetree/bindings/rtc/mediatek,mt2712-rtc.yaml +f:Documentation/devicetree/bindings/rtc/mediatek,mt7622-rtc.yaml +f:Documentation/devicetree/bindings/rtc/microchip,mpfs-rtc.yaml +f:Documentation/devicetree/bindings/rtc/microchip,pic32-rtc.txt +f:Documentation/devicetree/bindings/rtc/microcrystal,rv3028.yaml +f:Documentation/devicetree/bindings/rtc/microcrystal,rv3032.yaml +f:Documentation/devicetree/bindings/rtc/moxa,moxart-rtc.txt +f:Documentation/devicetree/bindings/rtc/mstar,msc313-rtc.yaml +f:Documentation/devicetree/bindings/rtc/mstar,ssd202d-rtc.yaml +f:Documentation/devicetree/bindings/rtc/nuvoton,ma35d1-rtc.yaml +f:Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml +f:Documentation/devicetree/bindings/rtc/nvidia,tegra20-rtc.yaml +f:Documentation/devicetree/bindings/rtc/nxp,lpc1788-rtc.yaml +f:Documentation/devicetree/bindings/rtc/nxp,pcf2123.yaml +f:Documentation/devicetree/bindings/rtc/nxp,pcf2127.yaml +f:Documentation/devicetree/bindings/rtc/nxp,pcf85063.yaml +f:Documentation/devicetree/bindings/rtc/nxp,pcf8523.yaml +f:Documentation/devicetree/bindings/rtc/nxp,pcf85363.yaml +f:Documentation/devicetree/bindings/rtc/nxp,pcf8563.yaml +f:Documentation/devicetree/bindings/rtc/nxp,s32g-rtc.yaml +f:Documentation/devicetree/bindings/rtc/olpc-xo1-rtc.txt +f:Documentation/devicetree/bindings/rtc/qcom-pm8xxx-rtc.yaml +f:Documentation/devicetree/bindings/rtc/realtek,rtd119x.txt +f:Documentation/devicetree/bindings/rtc/renesas,rz-rtca3.yaml +f:Documentation/devicetree/bindings/rtc/renesas,rzn1-rtc.yaml +f:Documentation/devicetree/bindings/rtc/renesas,sh-rtc.yaml +f:Documentation/devicetree/bindings/rtc/rtc-cmos.txt +f:Documentation/devicetree/bindings/rtc/rtc-ds1307.yaml +f:Documentation/devicetree/bindings/rtc/rtc-mxc.yaml +f:Documentation/devicetree/bindings/rtc/rtc-mxc_v2.yaml +f:Documentation/devicetree/bindings/rtc/rtc-omap.txt +f:Documentation/devicetree/bindings/rtc/rtc-opal.txt +f:Documentation/devicetree/bindings/rtc/rtc-palmas.txt +f:Documentation/devicetree/bindings/rtc/rtc-st-lpc.txt +f:Documentation/devicetree/bindings/rtc/rtc.yaml +f:Documentation/devicetree/bindings/rtc/s3c-rtc.yaml +f:Documentation/devicetree/bindings/rtc/sa1100-rtc.yaml +f:Documentation/devicetree/bindings/rtc/sprd,sc2731-rtc.yaml +f:Documentation/devicetree/bindings/rtc/st,m41t80.yaml +f:Documentation/devicetree/bindings/rtc/st,m48t86.yaml +f:Documentation/devicetree/bindings/rtc/st,stm32-rtc.yaml +f:Documentation/devicetree/bindings/rtc/sunplus,sp7021-rtc.yaml +f:Documentation/devicetree/bindings/rtc/ti,bq32000.yaml +f:Documentation/devicetree/bindings/rtc/ti,k3-rtc.yaml +f:Documentation/devicetree/bindings/rtc/trivial-rtc.yaml +f:Documentation/devicetree/bindings/rtc/xgene-rtc.txt +f:Documentation/devicetree/bindings/rtc/xlnx,zynqmp-rtc.yaml +f:Documentation/devicetree/bindings/scsi/hisilicon-sas.txt +f:Documentation/devicetree/bindings/serial/8250.yaml +f:Documentation/devicetree/bindings/serial/8250_omap.yaml +f:Documentation/devicetree/bindings/serial/actions,owl-uart.yaml +f:Documentation/devicetree/bindings/serial/altr,juart-1.0.yaml +f:Documentation/devicetree/bindings/serial/altr,uart-1.0.yaml +f:Documentation/devicetree/bindings/serial/amlogic,meson-uart.yaml +f:Documentation/devicetree/bindings/serial/arm,dcc.yaml +f:Documentation/devicetree/bindings/serial/arm,mps2-uart.yaml +f:Documentation/devicetree/bindings/serial/arm,sbsa-uart.yaml +f:Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml +f:Documentation/devicetree/bindings/serial/brcm,bcm2835-aux-uart.yaml +f:Documentation/devicetree/bindings/serial/brcm,bcm6345-uart.yaml +f:Documentation/devicetree/bindings/serial/brcm,bcm7271-uart.yaml +f:Documentation/devicetree/bindings/serial/cdns,uart.yaml +f:Documentation/devicetree/bindings/serial/cirrus,ep7209-uart.yaml +f:Documentation/devicetree/bindings/serial/cnxt,cx92755-usart.yaml +f:Documentation/devicetree/bindings/serial/esp,esp32-acm.yaml +f:Documentation/devicetree/bindings/serial/esp,esp32-uart.yaml +f:Documentation/devicetree/bindings/serial/fsl,s32-linflexuart.yaml +f:Documentation/devicetree/bindings/serial/fsl-imx-uart.yaml +f:Documentation/devicetree/bindings/serial/fsl-lpuart.yaml +f:Documentation/devicetree/bindings/serial/fsl-mxs-auart.yaml +f:Documentation/devicetree/bindings/serial/ingenic,uart.yaml +f:Documentation/devicetree/bindings/serial/lantiq,asc.yaml +f:Documentation/devicetree/bindings/serial/litex,liteuart.yaml +f:Documentation/devicetree/bindings/serial/marvell,armada-3700-uart.yaml +f:Documentation/devicetree/bindings/serial/maxim,max310x.yaml +f:Documentation/devicetree/bindings/serial/mediatek,uart.yaml +f:Documentation/devicetree/bindings/serial/microchip,pic32mzda-uart.yaml +f:Documentation/devicetree/bindings/serial/nuvoton,ma35d1-serial.yaml +f:Documentation/devicetree/bindings/serial/nvidia,tegra194-tcu.yaml +f:Documentation/devicetree/bindings/serial/nvidia,tegra20-hsuart.yaml +f:Documentation/devicetree/bindings/serial/nvidia,tegra264-utc.yaml +f:Documentation/devicetree/bindings/serial/nxp,lpc3220-hsuart.yaml +f:Documentation/devicetree/bindings/serial/nxp,sc16is7xx.yaml +f:Documentation/devicetree/bindings/serial/pl011.yaml +f:Documentation/devicetree/bindings/serial/qca,ar9330-uart.yaml +f:Documentation/devicetree/bindings/serial/qcom,msm-uart.yaml +f:Documentation/devicetree/bindings/serial/qcom,msm-uartdm.yaml +f:Documentation/devicetree/bindings/serial/qcom,sa8255p-geni-uart.yaml +f:Documentation/devicetree/bindings/serial/qcom,serial-geni-qcom.yaml +f:Documentation/devicetree/bindings/serial/rda,8810pl-uart.yaml +f:Documentation/devicetree/bindings/serial/renesas,em-uart.yaml +f:Documentation/devicetree/bindings/serial/renesas,hscif.yaml +f:Documentation/devicetree/bindings/serial/renesas,rsci.yaml +f:Documentation/devicetree/bindings/serial/renesas,sci.yaml +f:Documentation/devicetree/bindings/serial/renesas,scif.yaml +f:Documentation/devicetree/bindings/serial/renesas,scifa.yaml +f:Documentation/devicetree/bindings/serial/renesas,scifb.yaml +f:Documentation/devicetree/bindings/serial/rs485.txt +f:Documentation/devicetree/bindings/serial/rs485.yaml +f:Documentation/devicetree/bindings/serial/samsung_uart.yaml +f:Documentation/devicetree/bindings/serial/serial-peripheral-props.yaml +f:Documentation/devicetree/bindings/serial/serial.yaml +f:Documentation/devicetree/bindings/serial/sifive-serial.yaml +f:Documentation/devicetree/bindings/serial/snps,arc-uart.yaml +f:Documentation/devicetree/bindings/serial/snps-dw-apb-uart.yaml +f:Documentation/devicetree/bindings/serial/socionext,milbeaut-usio-uart.yaml +f:Documentation/devicetree/bindings/serial/socionext,uniphier-uart.yaml +f:Documentation/devicetree/bindings/serial/sprd-uart.yaml +f:Documentation/devicetree/bindings/serial/st,asc.yaml +f:Documentation/devicetree/bindings/serial/st,stm32-uart.yaml +f:Documentation/devicetree/bindings/serial/sunplus,sp7021-uart.yaml +f:Documentation/devicetree/bindings/serial/via,vt8500-uart.yaml +f:Documentation/devicetree/bindings/serial/xlnx,opb-uartlite.yaml +f:Documentation/devicetree/bindings/serio/allwinner,sun4i-a10-ps2.yaml +f:Documentation/devicetree/bindings/serio/altera_ps2.txt +f:Documentation/devicetree/bindings/serio/arm,pl050.yaml +f:Documentation/devicetree/bindings/serio/olpc,ap-sp.txt +f:Documentation/devicetree/bindings/serio/ps2-gpio.yaml +f:Documentation/devicetree/bindings/serio/snps-arc_ps2.txt +f:Documentation/devicetree/bindings/sifive/sifive-blocks-ip-versioning.txt +f:Documentation/devicetree/bindings/siox/eckelmann,siox-gpio.txt +f:Documentation/devicetree/bindings/slimbus/qcom,slim-ngd.yaml +f:Documentation/devicetree/bindings/slimbus/qcom,slim.yaml +f:Documentation/devicetree/bindings/slimbus/slimbus.yaml +f:Documentation/devicetree/bindings/soc/altera/altr,sys-mgr.yaml +f:Documentation/devicetree/bindings/soc/amlogic/amlogic,canvas.yaml +f:Documentation/devicetree/bindings/soc/amlogic/amlogic,meson-gx-clk-measure.yaml +f:Documentation/devicetree/bindings/soc/amlogic/amlogic,meson-gx-hhi-sysctrl.yaml +f:Documentation/devicetree/bindings/soc/aspeed/uart-routing.yaml +f:Documentation/devicetree/bindings/soc/bcm/brcm,bcm23550-cdc.yaml +f:Documentation/devicetree/bindings/soc/bcm/brcm,bcm2711-avs-monitor.yaml +f:Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-pm.yaml +f:Documentation/devicetree/bindings/soc/bcm/brcm,bcm2835-vchiq.yaml +f:Documentation/devicetree/bindings/soc/cirrus/cirrus,ep9301-syscon.yaml +f:Documentation/devicetree/bindings/soc/dove/pmu.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/cpm.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/cpm/brg.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/cpm/i2c.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/cpm/pic.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/cpm/usb.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,cpm1-scc-qmc.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,cpm1-tsa.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,qe-firmware.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,qe-ic.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,qe-muram.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,qe-si.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,qe-siram.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,qe-tsa.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,qe-ucc-qmc.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,qe.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/fsl,ucc-hdlc.yaml +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/gpio.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/qe/firmware.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/qe/par_io.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/qe/pincfg.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/qe/ucc.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/qe/usb.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/serial.txt +f:Documentation/devicetree/bindings/soc/fsl/cpm_qe/uqe_serial.txt +f:Documentation/devicetree/bindings/soc/fsl/fsl,bman-portal.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,bman.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,imx23-digctl.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,layerscape-dcfg.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,layerscape-scfg.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,ls1028a-reset.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,qman-fqd.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,qman-portal.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,qman.yaml +f:Documentation/devicetree/bindings/soc/fsl/fsl,rcpm.yaml +f:Documentation/devicetree/bindings/soc/fsl/guts.txt +f:Documentation/devicetree/bindings/soc/google/google,gs101-pmu-intr-gen.yaml +f:Documentation/devicetree/bindings/soc/hisilicon/hisilicon,hi3660-usb3-otg-bc.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,aips-bus.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx-anatop.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx-iomuxc-gpr.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx8mm-disp-blk-ctrl.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx8mm-vpu-blk-ctrl.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx8mn-disp-blk-ctrl.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx8mp-hdmi-blk-ctrl.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx8mp-hsio-blk-ctrl.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx8mp-media-blk-ctrl.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx8mq-vpu-blk-ctrl.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx93-media-blk-ctrl.yaml +f:Documentation/devicetree/bindings/soc/imx/fsl,imx93-src.yaml +f:Documentation/devicetree/bindings/soc/imx/imx8m-soc.yaml +f:Documentation/devicetree/bindings/soc/intel/intel,hps-copy-engine.yaml +f:Documentation/devicetree/bindings/soc/intel/intel,lgm-syscon.yaml +f:Documentation/devicetree/bindings/soc/litex/litex,soc-controller.yaml +f:Documentation/devicetree/bindings/soc/loongson/loongson,ls2k-pmc.yaml +f:Documentation/devicetree/bindings/soc/mediatek/devapc.yaml +f:Documentation/devicetree/bindings/soc/mediatek/mediatek,ccorr.yaml +f:Documentation/devicetree/bindings/soc/mediatek/mediatek,mt7986-wo-ccif.yaml +f:Documentation/devicetree/bindings/soc/mediatek/mediatek,mt8183-dvfsrc.yaml +f:Documentation/devicetree/bindings/soc/mediatek/mediatek,mutex.yaml +f:Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml +f:Documentation/devicetree/bindings/soc/mediatek/mediatek,wdma.yaml +f:Documentation/devicetree/bindings/soc/mediatek/mtk-svs.yaml +f:Documentation/devicetree/bindings/soc/mediatek/scpsys.txt +f:Documentation/devicetree/bindings/soc/microchip/atmel,at91rm9200-tcb.yaml +f:Documentation/devicetree/bindings/soc/microchip/microchip,mpfs-sys-controller.yaml +f:Documentation/devicetree/bindings/soc/microchip/microchip,sparx5-cpu-syscon.yaml +f:Documentation/devicetree/bindings/soc/mobileye/mobileye,eyeq5-olb.yaml +f:Documentation/devicetree/bindings/soc/nuvoton/nuvoton,gfxi.yaml +f:Documentation/devicetree/bindings/soc/nuvoton/nuvoton,npcm-gcr.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,aoss-qmp.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,apr-services.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,apr.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,dcc.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,eud.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,geni-se.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,gsbi.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,msm8976-ramp-controller.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,pbs.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,rpm-master-stats.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,rpm.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,rpmh-rsc.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,sa8255p-geni-se-qup.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,saw2.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,smd-rpm.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,smd.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,smem.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,smp2p.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,smsm.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom,wcnss.yaml +f:Documentation/devicetree/bindings/soc/qcom/qcom-stats.yaml +f:Documentation/devicetree/bindings/soc/renesas/renesas,r9a09g011-sys.yaml +f:Documentation/devicetree/bindings/soc/renesas/renesas,r9a09g057-sys.yaml +f:Documentation/devicetree/bindings/soc/renesas/renesas,rzg2l-sysc.yaml +f:Documentation/devicetree/bindings/soc/renesas/renesas,rzv2m-pwc.yaml +f:Documentation/devicetree/bindings/soc/renesas/renesas-soc.yaml +f:Documentation/devicetree/bindings/soc/renesas/renesas.yaml +f:Documentation/devicetree/bindings/soc/rockchip/grf.yaml +f:Documentation/devicetree/bindings/soc/samsung/exynos-pmu.yaml +f:Documentation/devicetree/bindings/soc/samsung/exynos-usi.yaml +f:Documentation/devicetree/bindings/soc/samsung/samsung,exynos-sysreg.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-adamv.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-ahci-glue.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-dwc3-glue.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-mioctrl.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-perictrl.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-sdctrl.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-soc-glue-debug.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-soc-glue.yaml +f:Documentation/devicetree/bindings/soc/socionext/socionext,uniphier-sysctrl.yaml +f:Documentation/devicetree/bindings/soc/sophgo/sophgo,cv1800b-rtc.yaml +f:Documentation/devicetree/bindings/soc/sophgo/sophgo,sg2044-top-syscon.yaml +f:Documentation/devicetree/bindings/soc/sophgo/sophgo.yaml +f:Documentation/devicetree/bindings/soc/spacemit/spacemit,k1-syscon.yaml +f:Documentation/devicetree/bindings/soc/sprd/sprd,sc9863a-glbregs.yaml +f:Documentation/devicetree/bindings/soc/starfive/starfive,jh7110-syscon.yaml +f:Documentation/devicetree/bindings/soc/sti/st,sti-syscon.yaml +f:Documentation/devicetree/bindings/soc/tegra/nvidia,nvec.yaml +f:Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-ahb.yaml +f:Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-flowctrl.yaml +f:Documentation/devicetree/bindings/soc/tegra/nvidia,tegra20-pmc.yaml +f:Documentation/devicetree/bindings/soc/ti/k3-ringacc.yaml +f:Documentation/devicetree/bindings/soc/ti/keystone-navigator-dma.txt +f:Documentation/devicetree/bindings/soc/ti/keystone-navigator-qmss.txt +f:Documentation/devicetree/bindings/soc/ti/sci-pm-domain.yaml +f:Documentation/devicetree/bindings/soc/ti/ti,am654-serdes-ctrl.yaml +f:Documentation/devicetree/bindings/soc/ti/ti,j721e-system-controller.yaml +f:Documentation/devicetree/bindings/soc/ti/ti,j784s4-bist.yaml +f:Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml +f:Documentation/devicetree/bindings/soc/ti/wkup-m3-ipc.yaml +f:Documentation/devicetree/bindings/soc/xilinx/xilinx.yaml +f:Documentation/devicetree/bindings/soc/xilinx/xlnx,vcu-settings.yaml +f:Documentation/devicetree/bindings/sound/ac97-bus.txt +f:Documentation/devicetree/bindings/sound/adi,adau1372.yaml +f:Documentation/devicetree/bindings/sound/adi,adau1373.yaml +f:Documentation/devicetree/bindings/sound/adi,adau1701.txt +f:Documentation/devicetree/bindings/sound/adi,adau17x1.yaml +f:Documentation/devicetree/bindings/sound/adi,adau1977.yaml +f:Documentation/devicetree/bindings/sound/adi,adau7002.yaml +f:Documentation/devicetree/bindings/sound/adi,adau7118.yaml +f:Documentation/devicetree/bindings/sound/adi,axi-i2s.txt +f:Documentation/devicetree/bindings/sound/adi,axi-spdif-tx.txt +f:Documentation/devicetree/bindings/sound/adi,max98363.yaml +f:Documentation/devicetree/bindings/sound/adi,max98388.yaml +f:Documentation/devicetree/bindings/sound/adi,max98396.yaml +f:Documentation/devicetree/bindings/sound/adi,ssm2305.txt +f:Documentation/devicetree/bindings/sound/adi,ssm2518.yaml +f:Documentation/devicetree/bindings/sound/adi,ssm2602.txt +f:Documentation/devicetree/bindings/sound/adi,ssm3515.yaml +f:Documentation/devicetree/bindings/sound/ak4118.txt +f:Documentation/devicetree/bindings/sound/ak5386.txt +f:Documentation/devicetree/bindings/sound/alc5623.txt +f:Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-codec.yaml +f:Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-i2s.yaml +f:Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-spdif.yaml +f:Documentation/devicetree/bindings/sound/allwinner,sun50i-a64-codec-analog.yaml +f:Documentation/devicetree/bindings/sound/allwinner,sun50i-h6-dmic.yaml +f:Documentation/devicetree/bindings/sound/allwinner,sun8i-a23-codec-analog.yaml +f:Documentation/devicetree/bindings/sound/allwinner,sun8i-a33-codec.yaml +f:Documentation/devicetree/bindings/sound/amlogic,aiu.yaml +f:Documentation/devicetree/bindings/sound/amlogic,axg-fifo.yaml +f:Documentation/devicetree/bindings/sound/amlogic,axg-pdm.yaml +f:Documentation/devicetree/bindings/sound/amlogic,axg-sound-card.yaml +f:Documentation/devicetree/bindings/sound/amlogic,axg-spdifin.yaml +f:Documentation/devicetree/bindings/sound/amlogic,axg-spdifout.yaml +f:Documentation/devicetree/bindings/sound/amlogic,axg-tdm-formatters.yaml +f:Documentation/devicetree/bindings/sound/amlogic,axg-tdm-iface.yaml +f:Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml +f:Documentation/devicetree/bindings/sound/amlogic,g12a-tohdmitx.yaml +f:Documentation/devicetree/bindings/sound/amlogic,gx-sound-card.yaml +f:Documentation/devicetree/bindings/sound/amlogic,t9015.yaml +f:Documentation/devicetree/bindings/sound/apple,mca.yaml +f:Documentation/devicetree/bindings/sound/arm,pl041.yaml +f:Documentation/devicetree/bindings/sound/armada-370db-audio.txt +f:Documentation/devicetree/bindings/sound/asahi-kasei,ak4104.yaml +f:Documentation/devicetree/bindings/sound/asahi-kasei,ak4375.yaml +f:Documentation/devicetree/bindings/sound/asahi-kasei,ak4458.yaml +f:Documentation/devicetree/bindings/sound/asahi-kasei,ak4554.yaml +f:Documentation/devicetree/bindings/sound/asahi-kasei,ak4613.yaml +f:Documentation/devicetree/bindings/sound/asahi-kasei,ak4619.yaml +f:Documentation/devicetree/bindings/sound/asahi-kasei,ak4642.yaml +f:Documentation/devicetree/bindings/sound/asahi-kasei,ak5558.yaml +f:Documentation/devicetree/bindings/sound/atmel,asoc-wm8904.yaml +f:Documentation/devicetree/bindings/sound/atmel,at91-ssc.yaml +f:Documentation/devicetree/bindings/sound/atmel,at91sam9g20ek-wm8731.yaml +f:Documentation/devicetree/bindings/sound/atmel,sam9x5-wm8731-audio.yaml +f:Documentation/devicetree/bindings/sound/atmel,sama5d2-classd.yaml +f:Documentation/devicetree/bindings/sound/atmel,sama5d2-i2s.yaml +f:Documentation/devicetree/bindings/sound/atmel,sama5d2-pdmic.yaml +f:Documentation/devicetree/bindings/sound/atmel_ac97c.txt +f:Documentation/devicetree/bindings/sound/audio-graph-card.yaml +f:Documentation/devicetree/bindings/sound/audio-graph-card2.yaml +f:Documentation/devicetree/bindings/sound/audio-graph-port.yaml +f:Documentation/devicetree/bindings/sound/audio-graph.yaml +f:Documentation/devicetree/bindings/sound/audio-iio-aux.yaml +f:Documentation/devicetree/bindings/sound/awinic,aw8738.yaml +f:Documentation/devicetree/bindings/sound/awinic,aw87390.yaml +f:Documentation/devicetree/bindings/sound/awinic,aw88395.yaml +f:Documentation/devicetree/bindings/sound/axentia,tse850-pcm5142.txt +f:Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt +f:Documentation/devicetree/bindings/sound/brcm,bcm63xx-audio.txt +f:Documentation/devicetree/bindings/sound/brcm,cygnus-audio.txt +f:Documentation/devicetree/bindings/sound/cdns,xtfpga-i2s.txt +f:Documentation/devicetree/bindings/sound/cirrus,cs35l41.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs35l45.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs4234.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs4270.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs4271.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs42l42.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs42l43.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs42l51.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs42l84.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs42xx8.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs48l32.yaml +f:Documentation/devicetree/bindings/sound/cirrus,cs530x.yaml +f:Documentation/devicetree/bindings/sound/cirrus,ep9301-i2s.yaml +f:Documentation/devicetree/bindings/sound/cirrus,lochnagar.yaml +f:Documentation/devicetree/bindings/sound/cirrus,madera.yaml +f:Documentation/devicetree/bindings/sound/component-common.yaml +f:Documentation/devicetree/bindings/sound/cs35l32.txt +f:Documentation/devicetree/bindings/sound/cs35l33.txt +f:Documentation/devicetree/bindings/sound/cs35l34.txt +f:Documentation/devicetree/bindings/sound/cs35l35.txt +f:Documentation/devicetree/bindings/sound/cs35l36.txt +f:Documentation/devicetree/bindings/sound/cs4265.txt +f:Documentation/devicetree/bindings/sound/cs42l52.txt +f:Documentation/devicetree/bindings/sound/cs42l56.txt +f:Documentation/devicetree/bindings/sound/cs42l73.txt +f:Documentation/devicetree/bindings/sound/cs43130.txt +f:Documentation/devicetree/bindings/sound/cs4341.txt +f:Documentation/devicetree/bindings/sound/cs4349.txt +f:Documentation/devicetree/bindings/sound/cs53l30.txt +f:Documentation/devicetree/bindings/sound/da7218.txt +f:Documentation/devicetree/bindings/sound/da9055.txt +f:Documentation/devicetree/bindings/sound/dai-common.yaml +f:Documentation/devicetree/bindings/sound/dai-params.yaml +f:Documentation/devicetree/bindings/sound/davinci-evm-audio.txt +f:Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml +f:Documentation/devicetree/bindings/sound/davinci-mcbsp.yaml +f:Documentation/devicetree/bindings/sound/dialog,da7219.yaml +f:Documentation/devicetree/bindings/sound/dlg,da7213.yaml +f:Documentation/devicetree/bindings/sound/dmic-codec.yaml +f:Documentation/devicetree/bindings/sound/eukrea-tlv320.txt +f:Documentation/devicetree/bindings/sound/everest,es71x4.yaml +f:Documentation/devicetree/bindings/sound/everest,es7241.yaml +f:Documentation/devicetree/bindings/sound/everest,es8316.yaml +f:Documentation/devicetree/bindings/sound/everest,es8326.yaml +f:Documentation/devicetree/bindings/sound/everest,es8328.yaml +f:Documentation/devicetree/bindings/sound/everest,es8375.yaml +f:Documentation/devicetree/bindings/sound/everest,es8389.yaml +f:Documentation/devicetree/bindings/sound/fsl,aud2htx.yaml +f:Documentation/devicetree/bindings/sound/fsl,audmix.yaml +f:Documentation/devicetree/bindings/sound/fsl,easrc.yaml +f:Documentation/devicetree/bindings/sound/fsl,esai.yaml +f:Documentation/devicetree/bindings/sound/fsl,imx-asrc.yaml +f:Documentation/devicetree/bindings/sound/fsl,imx-audio-es8328.yaml +f:Documentation/devicetree/bindings/sound/fsl,imx95-cm7-sof.yaml +f:Documentation/devicetree/bindings/sound/fsl,micfil.yaml +f:Documentation/devicetree/bindings/sound/fsl,mqs.yaml +f:Documentation/devicetree/bindings/sound/fsl,mxs-audio-sgtl5000.yaml +f:Documentation/devicetree/bindings/sound/fsl,qmc-audio.yaml +f:Documentation/devicetree/bindings/sound/fsl,rpmsg.yaml +f:Documentation/devicetree/bindings/sound/fsl,sai.yaml +f:Documentation/devicetree/bindings/sound/fsl,saif.yaml +f:Documentation/devicetree/bindings/sound/fsl,sgtl5000.yaml +f:Documentation/devicetree/bindings/sound/fsl,sof-cpu.yaml +f:Documentation/devicetree/bindings/sound/fsl,spdif.yaml +f:Documentation/devicetree/bindings/sound/fsl,ssi.yaml +f:Documentation/devicetree/bindings/sound/fsl,xcvr.yaml +f:Documentation/devicetree/bindings/sound/fsl-asoc-card.yaml +f:Documentation/devicetree/bindings/sound/google,chv3-codec.yaml +f:Documentation/devicetree/bindings/sound/google,chv3-i2s.yaml +f:Documentation/devicetree/bindings/sound/google,cros-ec-codec.yaml +f:Documentation/devicetree/bindings/sound/google,sc7180-trogdor.yaml +f:Documentation/devicetree/bindings/sound/google,sc7280-herobrine.yaml +f:Documentation/devicetree/bindings/sound/hisilicon,hi6210-i2s.txt +f:Documentation/devicetree/bindings/sound/img,i2s-in.txt +f:Documentation/devicetree/bindings/sound/img,i2s-out.txt +f:Documentation/devicetree/bindings/sound/img,parallel-out.txt +f:Documentation/devicetree/bindings/sound/img,pistachio-internal-dac.txt +f:Documentation/devicetree/bindings/sound/img,spdif-in.txt +f:Documentation/devicetree/bindings/sound/img,spdif-out.txt +f:Documentation/devicetree/bindings/sound/imx-audio-card.yaml +f:Documentation/devicetree/bindings/sound/imx-audio-hdmi.yaml +f:Documentation/devicetree/bindings/sound/imx-audio-sgtl5000.txt +f:Documentation/devicetree/bindings/sound/imx-audmux.yaml +f:Documentation/devicetree/bindings/sound/infineon,peb2466.yaml +f:Documentation/devicetree/bindings/sound/ingenic,aic.yaml +f:Documentation/devicetree/bindings/sound/ingenic,codec.yaml +f:Documentation/devicetree/bindings/sound/intel,keembay-i2s.yaml +f:Documentation/devicetree/bindings/sound/invensense,ics43432.yaml +f:Documentation/devicetree/bindings/sound/irondevice,sma1303.yaml +f:Documentation/devicetree/bindings/sound/irondevice,sma1307.yaml +f:Documentation/devicetree/bindings/sound/linux,bt-sco.yaml +f:Documentation/devicetree/bindings/sound/linux,spdif.yaml +f:Documentation/devicetree/bindings/sound/loongson,ls-audio-card.yaml +f:Documentation/devicetree/bindings/sound/loongson,ls1b-ac97.yaml +f:Documentation/devicetree/bindings/sound/loongson,ls2k1000-i2s.yaml +f:Documentation/devicetree/bindings/sound/marvell,mmp-sspa.yaml +f:Documentation/devicetree/bindings/sound/marvell,pxa2xx-ac97.txt +f:Documentation/devicetree/bindings/sound/max98373.txt +f:Documentation/devicetree/bindings/sound/max9860.txt +f:Documentation/devicetree/bindings/sound/maxim,max9759.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98088.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98090.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98095.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98357a.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98371.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98390.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98504.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98520.yaml +f:Documentation/devicetree/bindings/sound/maxim,max9867.yaml +f:Documentation/devicetree/bindings/sound/maxim,max98925.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt2701-audio.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt2701-wm8960.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt7986-afe.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt7986-wm8960.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt8173-afe-pcm.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt8188-afe.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt8188-mt6359.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt8365-afe.yaml +f:Documentation/devicetree/bindings/sound/mediatek,mt8365-mt6357.yaml +f:Documentation/devicetree/bindings/sound/microchip,sama7g5-i2smcc.yaml +f:Documentation/devicetree/bindings/sound/microchip,sama7g5-pdmc.yaml +f:Documentation/devicetree/bindings/sound/microchip,sama7g5-spdifrx.yaml +f:Documentation/devicetree/bindings/sound/microchip,sama7g5-spdiftx.yaml +f:Documentation/devicetree/bindings/sound/mikroe,mikroe-proto.txt +f:Documentation/devicetree/bindings/sound/mrvl,pxa-ssp.txt +f:Documentation/devicetree/bindings/sound/mscc,zl38060.yaml +f:Documentation/devicetree/bindings/sound/mt2701-cs42448.txt +f:Documentation/devicetree/bindings/sound/mt6351.txt +f:Documentation/devicetree/bindings/sound/mt6358.txt +f:Documentation/devicetree/bindings/sound/mt6359.yaml +f:Documentation/devicetree/bindings/sound/mt6797-afe-pcm.txt +f:Documentation/devicetree/bindings/sound/mt6797-mt6351.txt +f:Documentation/devicetree/bindings/sound/mt8173-max98090.txt +f:Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5514.txt +f:Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt +f:Documentation/devicetree/bindings/sound/mt8173-rt5650.txt +f:Documentation/devicetree/bindings/sound/mt8183-afe-pcm.txt +f:Documentation/devicetree/bindings/sound/mt8183-da7219-max98357.txt +f:Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt +f:Documentation/devicetree/bindings/sound/mt8186-afe-pcm.yaml +f:Documentation/devicetree/bindings/sound/mt8186-mt6366-da7219-max98357.yaml +f:Documentation/devicetree/bindings/sound/mt8186-mt6366-rt1019-rt5682s.yaml +f:Documentation/devicetree/bindings/sound/mt8192-afe-pcm.yaml +f:Documentation/devicetree/bindings/sound/mt8192-mt6359-rt1015-rt5682.yaml +f:Documentation/devicetree/bindings/sound/mt8195-afe-pcm.yaml +f:Documentation/devicetree/bindings/sound/mt8195-mt6359.yaml +f:Documentation/devicetree/bindings/sound/mtk-btcvsd-snd.txt +f:Documentation/devicetree/bindings/sound/mvebu-audio.txt +f:Documentation/devicetree/bindings/sound/neofidelity,ntp8835.yaml +f:Documentation/devicetree/bindings/sound/neofidelity,ntp8918.yaml +f:Documentation/devicetree/bindings/sound/nokia,rx51.txt +f:Documentation/devicetree/bindings/sound/nuvoton,nau8315.yaml +f:Documentation/devicetree/bindings/sound/nuvoton,nau8325.yaml +f:Documentation/devicetree/bindings/sound/nuvoton,nau8540.yaml +f:Documentation/devicetree/bindings/sound/nuvoton,nau8810.yaml +f:Documentation/devicetree/bindings/sound/nuvoton,nau8821.yaml +f:Documentation/devicetree/bindings/sound/nuvoton,nau8822.yaml +f:Documentation/devicetree/bindings/sound/nuvoton,nau8824.yaml +f:Documentation/devicetree/bindings/sound/nuvoton,nau8825.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-alc5632.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-common.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-graph-card.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-max9808x.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-max98090.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5640.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5677.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-sgtl5000.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-trimslice.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-wm8753.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-wm8903.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra-audio-wm9712.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra186-asrc.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra186-dspk.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra20-ac97.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra20-das.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra20-i2s.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra20-spdif.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-admaif.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-adx.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-ahub.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-amx.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-dmic.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-i2s.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-mbdrc.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-mixer.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-mvc.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-ope.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-peq.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra210-sfc.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra30-ahub.txt +f:Documentation/devicetree/bindings/sound/nvidia,tegra30-hda.yaml +f:Documentation/devicetree/bindings/sound/nvidia,tegra30-i2s.yaml +f:Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml +f:Documentation/devicetree/bindings/sound/nxp,tfa9879.yaml +f:Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml +f:Documentation/devicetree/bindings/sound/nxp,uda1342.yaml +f:Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt +f:Documentation/devicetree/bindings/sound/omap-dmic.txt +f:Documentation/devicetree/bindings/sound/omap-mcbsp.txt +f:Documentation/devicetree/bindings/sound/omap-twl4030.txt +f:Documentation/devicetree/bindings/sound/option,gtm601.yaml +f:Documentation/devicetree/bindings/sound/pcm1789.txt +f:Documentation/devicetree/bindings/sound/pcm179x.txt +f:Documentation/devicetree/bindings/sound/pcm186x.txt +f:Documentation/devicetree/bindings/sound/pcm3060.txt +f:Documentation/devicetree/bindings/sound/pcm5102a.txt +f:Documentation/devicetree/bindings/sound/qcom,apq8016-sbc-sndcard.yaml +f:Documentation/devicetree/bindings/sound/qcom,lpass-cpu.yaml +f:Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml +f:Documentation/devicetree/bindings/sound/qcom,lpass-tx-macro.yaml +f:Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml +f:Documentation/devicetree/bindings/sound/qcom,lpass-wsa-macro.yaml +f:Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital-codec.yaml +f:Documentation/devicetree/bindings/sound/qcom,pm8916-wcd-analog-codec.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6adm-routing.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6adm.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6afe.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6apm-dai.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6apm-lpass-dais.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6apm.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6asm-dais.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6asm.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6core.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6dsp-lpass-clocks.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6dsp-lpass-ports.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6prm.yaml +f:Documentation/devicetree/bindings/sound/qcom,q6usb.yaml +f:Documentation/devicetree/bindings/sound/qcom,sm8250.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd9335.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd934x.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd937x-sdw.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd937x.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd938x-sdw.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd938x.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd939x-sdw.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd939x.yaml +f:Documentation/devicetree/bindings/sound/qcom,wcd93xx-common.yaml +f:Documentation/devicetree/bindings/sound/qcom,wsa881x.yaml +f:Documentation/devicetree/bindings/sound/qcom,wsa883x.yaml +f:Documentation/devicetree/bindings/sound/qcom,wsa8840.yaml +f:Documentation/devicetree/bindings/sound/realtek,alc203.yaml +f:Documentation/devicetree/bindings/sound/realtek,alc5632.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt1015.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt1015p.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt1016.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt1019.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5514.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5616.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5631.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5640.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5645.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5659.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5677.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5682.yaml +f:Documentation/devicetree/bindings/sound/realtek,rt5682s.yaml +f:Documentation/devicetree/bindings/sound/renesas,fsi.yaml +f:Documentation/devicetree/bindings/sound/renesas,idt821034.yaml +f:Documentation/devicetree/bindings/sound/renesas,rsnd.txt +f:Documentation/devicetree/bindings/sound/renesas,rsnd.yaml +f:Documentation/devicetree/bindings/sound/renesas,rz-ssi.yaml +f:Documentation/devicetree/bindings/sound/richtek,rt9120.yaml +f:Documentation/devicetree/bindings/sound/richtek,rt9123.yaml +f:Documentation/devicetree/bindings/sound/richtek,rt9123p.yaml +f:Documentation/devicetree/bindings/sound/richtek,rtq9128.yaml +f:Documentation/devicetree/bindings/sound/rockchip,i2s-tdm.yaml +f:Documentation/devicetree/bindings/sound/rockchip,pdm.yaml +f:Documentation/devicetree/bindings/sound/rockchip,rk3036-codec.yaml +f:Documentation/devicetree/bindings/sound/rockchip,rk3288-hdmi-analog.txt +f:Documentation/devicetree/bindings/sound/rockchip,rk3308-codec.yaml +f:Documentation/devicetree/bindings/sound/rockchip,rk3328-codec.yaml +f:Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt +f:Documentation/devicetree/bindings/sound/rockchip,rk3576-sai.yaml +f:Documentation/devicetree/bindings/sound/rockchip-i2s.yaml +f:Documentation/devicetree/bindings/sound/rockchip-max98090.txt +f:Documentation/devicetree/bindings/sound/rockchip-rt5645.txt +f:Documentation/devicetree/bindings/sound/rockchip-spdif.yaml +f:Documentation/devicetree/bindings/sound/rohm,bd28623.yaml +f:Documentation/devicetree/bindings/sound/rt1011.txt +f:Documentation/devicetree/bindings/sound/rt1308.txt +f:Documentation/devicetree/bindings/sound/rt274.txt +f:Documentation/devicetree/bindings/sound/rt5651.txt +f:Documentation/devicetree/bindings/sound/rt5660.txt +f:Documentation/devicetree/bindings/sound/rt5663.txt +f:Documentation/devicetree/bindings/sound/rt5665.txt +f:Documentation/devicetree/bindings/sound/rt5668.txt +f:Documentation/devicetree/bindings/sound/samsung,aries-wm8994.yaml +f:Documentation/devicetree/bindings/sound/samsung,arndale.yaml +f:Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml +f:Documentation/devicetree/bindings/sound/samsung,odroid.yaml +f:Documentation/devicetree/bindings/sound/samsung,smdk5250.yaml +f:Documentation/devicetree/bindings/sound/samsung,snow.yaml +f:Documentation/devicetree/bindings/sound/samsung,tm2.yaml +f:Documentation/devicetree/bindings/sound/samsung-i2s.yaml +f:Documentation/devicetree/bindings/sound/serial-midi.yaml +f:Documentation/devicetree/bindings/sound/simple-audio-amplifier.yaml +f:Documentation/devicetree/bindings/sound/simple-audio-mux.yaml +f:Documentation/devicetree/bindings/sound/simple-card.yaml +f:Documentation/devicetree/bindings/sound/sirf-audio-port.txt +f:Documentation/devicetree/bindings/sound/sirf-audio.txt +f:Documentation/devicetree/bindings/sound/snps,designware-i2s.yaml +f:Documentation/devicetree/bindings/sound/soc-ac97link.txt +f:Documentation/devicetree/bindings/sound/socionext,uniphier-aio.yaml +f:Documentation/devicetree/bindings/sound/socionext,uniphier-evea.yaml +f:Documentation/devicetree/bindings/sound/sound-card-common.yaml +f:Documentation/devicetree/bindings/sound/sound-dai.yaml +f:Documentation/devicetree/bindings/sound/sprd,pcm-platform.yaml +f:Documentation/devicetree/bindings/sound/sprd,sc9860-mcdt.yaml +f:Documentation/devicetree/bindings/sound/ssm4567.txt +f:Documentation/devicetree/bindings/sound/st,sta32x.txt +f:Documentation/devicetree/bindings/sound/st,sta350.txt +f:Documentation/devicetree/bindings/sound/st,sti-asoc-card.txt +f:Documentation/devicetree/bindings/sound/st,stm32-i2s.yaml +f:Documentation/devicetree/bindings/sound/st,stm32-sai.yaml +f:Documentation/devicetree/bindings/sound/st,stm32-spdifrx.yaml +f:Documentation/devicetree/bindings/sound/starfive,jh7110-pwmdac.yaml +f:Documentation/devicetree/bindings/sound/starfive,jh7110-tdm.yaml +f:Documentation/devicetree/bindings/sound/storm.txt +f:Documentation/devicetree/bindings/sound/tas2552.txt +f:Documentation/devicetree/bindings/sound/tas5720.txt +f:Documentation/devicetree/bindings/sound/tda7419.txt +f:Documentation/devicetree/bindings/sound/tdm-slot.txt +f:Documentation/devicetree/bindings/sound/test-component.yaml +f:Documentation/devicetree/bindings/sound/ti,ads117x.txt +f:Documentation/devicetree/bindings/sound/ti,j721e-cpb-audio.yaml +f:Documentation/devicetree/bindings/sound/ti,j721e-cpb-ivi-audio.yaml +f:Documentation/devicetree/bindings/sound/ti,omap4-mcpdm.yaml +f:Documentation/devicetree/bindings/sound/ti,pcm1681.yaml +f:Documentation/devicetree/bindings/sound/ti,pcm3168a.yaml +f:Documentation/devicetree/bindings/sound/ti,pcm512x.yaml +f:Documentation/devicetree/bindings/sound/ti,pcm6240.yaml +f:Documentation/devicetree/bindings/sound/ti,src4xxx.yaml +f:Documentation/devicetree/bindings/sound/ti,tas2562.yaml +f:Documentation/devicetree/bindings/sound/ti,tas2770.yaml +f:Documentation/devicetree/bindings/sound/ti,tas2781.yaml +f:Documentation/devicetree/bindings/sound/ti,tas27xx.yaml +f:Documentation/devicetree/bindings/sound/ti,tas5086.txt +f:Documentation/devicetree/bindings/sound/ti,tas57xx.yaml +f:Documentation/devicetree/bindings/sound/ti,tas5805m.yaml +f:Documentation/devicetree/bindings/sound/ti,tas6424.txt +f:Documentation/devicetree/bindings/sound/ti,tlv320adc3xxx.yaml +f:Documentation/devicetree/bindings/sound/ti,tlv320adcx140.yaml +f:Documentation/devicetree/bindings/sound/ti,tlv320aic32x4.yaml +f:Documentation/devicetree/bindings/sound/ti,tlv320aic3x.yaml +f:Documentation/devicetree/bindings/sound/ti,tlv320dac3100.yaml +f:Documentation/devicetree/bindings/sound/ti,tpa6130a2.yaml +f:Documentation/devicetree/bindings/sound/ti,ts3a227e.yaml +f:Documentation/devicetree/bindings/sound/tscs42xx.txt +f:Documentation/devicetree/bindings/sound/tscs454.txt +f:Documentation/devicetree/bindings/sound/uda1334.txt +f:Documentation/devicetree/bindings/sound/ux500-mop500.txt +f:Documentation/devicetree/bindings/sound/ux500-msp.txt +f:Documentation/devicetree/bindings/sound/widgets.txt +f:Documentation/devicetree/bindings/sound/wlf,arizona.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8510.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8523.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8524.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8580.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8711.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8728.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8731.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8737.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8750.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8753.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8776.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8782.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8804.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8903.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8904.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8940.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8960.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8961.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8962.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8974.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8978.yaml +f:Documentation/devicetree/bindings/sound/wlf,wm8994.yaml +f:Documentation/devicetree/bindings/sound/wm8741.txt +f:Documentation/devicetree/bindings/sound/wm8770.txt +f:Documentation/devicetree/bindings/sound/xlnx,audio-formatter.yaml +f:Documentation/devicetree/bindings/sound/xlnx,i2s.yaml +f:Documentation/devicetree/bindings/sound/xlnx,spdif.yaml +f:Documentation/devicetree/bindings/sound/xmos,xvf3500.yaml +f:Documentation/devicetree/bindings/soundwire/qcom,soundwire.yaml +f:Documentation/devicetree/bindings/soundwire/soundwire-controller.yaml +f:Documentation/devicetree/bindings/spi/adi,axi-spi-engine.yaml +f:Documentation/devicetree/bindings/spi/airoha,en7581-snand.yaml +f:Documentation/devicetree/bindings/spi/allwinner,sun4i-a10-spi.yaml +f:Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml +f:Documentation/devicetree/bindings/spi/amlogic,a1-spifc.yaml +f:Documentation/devicetree/bindings/spi/amlogic,a4-spisg.yaml +f:Documentation/devicetree/bindings/spi/amlogic,meson-gx-spicc.yaml +f:Documentation/devicetree/bindings/spi/amlogic,meson6-spifc.yaml +f:Documentation/devicetree/bindings/spi/apple,spi.yaml +f:Documentation/devicetree/bindings/spi/arm,pl022-peripheral-props.yaml +f:Documentation/devicetree/bindings/spi/aspeed,ast2600-fmc.yaml +f:Documentation/devicetree/bindings/spi/atmel,at91rm9200-spi.yaml +f:Documentation/devicetree/bindings/spi/atmel,quadspi.yaml +f:Documentation/devicetree/bindings/spi/brcm,bcm2835-aux-spi.yaml +f:Documentation/devicetree/bindings/spi/brcm,bcm2835-spi.yaml +f:Documentation/devicetree/bindings/spi/brcm,bcm63xx-hsspi.yaml +f:Documentation/devicetree/bindings/spi/brcm,bcm63xx-spi.yaml +f:Documentation/devicetree/bindings/spi/brcm,spi-bcm-qspi.yaml +f:Documentation/devicetree/bindings/spi/cdns,qspi-nor-peripheral-props.yaml +f:Documentation/devicetree/bindings/spi/cdns,qspi-nor.yaml +f:Documentation/devicetree/bindings/spi/cdns,xspi.yaml +f:Documentation/devicetree/bindings/spi/cirrus,ep9301-spi.yaml +f:Documentation/devicetree/bindings/spi/fsl,dspi-peripheral-props.yaml +f:Documentation/devicetree/bindings/spi/fsl,dspi.yaml +f:Documentation/devicetree/bindings/spi/fsl,espi.yaml +f:Documentation/devicetree/bindings/spi/fsl,spi-fsl-qspi.yaml +f:Documentation/devicetree/bindings/spi/fsl,spi.yaml +f:Documentation/devicetree/bindings/spi/fsl-imx-cspi.yaml +f:Documentation/devicetree/bindings/spi/hpe,gxp-spifi.yaml +f:Documentation/devicetree/bindings/spi/ibm,spi-fsi.yaml +f:Documentation/devicetree/bindings/spi/icpdas-lp8841-spi-rtc.txt +f:Documentation/devicetree/bindings/spi/ingenic,spi.yaml +f:Documentation/devicetree/bindings/spi/jcore,spi.txt +f:Documentation/devicetree/bindings/spi/loongson,ls2k-spi.yaml +f:Documentation/devicetree/bindings/spi/marvell,armada-3700-spi.yaml +f:Documentation/devicetree/bindings/spi/marvell,mmp2-ssp.yaml +f:Documentation/devicetree/bindings/spi/marvell,orion-spi.yaml +f:Documentation/devicetree/bindings/spi/mediatek,spi-mt65xx.yaml +f:Documentation/devicetree/bindings/spi/mediatek,spi-mtk-nor.yaml +f:Documentation/devicetree/bindings/spi/mediatek,spi-mtk-snfi.yaml +f:Documentation/devicetree/bindings/spi/mediatek,spi-slave-mt27xx.yaml +f:Documentation/devicetree/bindings/spi/microchip,mpfs-spi.yaml +f:Documentation/devicetree/bindings/spi/microchip,spi-pic32.txt +f:Documentation/devicetree/bindings/spi/mikrotik,rb4xx-spi.yaml +f:Documentation/devicetree/bindings/spi/mxicy,mx25f0a-spi.yaml +f:Documentation/devicetree/bindings/spi/mxs-spi.yaml +f:Documentation/devicetree/bindings/spi/nuvoton,npcm-fiu.txt +f:Documentation/devicetree/bindings/spi/nuvoton,npcm-pspi.txt +f:Documentation/devicetree/bindings/spi/nuvoton,wpcm450-fiu.yaml +f:Documentation/devicetree/bindings/spi/nvidia,tegra114-spi.yaml +f:Documentation/devicetree/bindings/spi/nvidia,tegra20-sflash.yaml +f:Documentation/devicetree/bindings/spi/nvidia,tegra20-slink.yaml +f:Documentation/devicetree/bindings/spi/nvidia,tegra210-quad-peripheral-props.yaml +f:Documentation/devicetree/bindings/spi/nvidia,tegra210-quad.yaml +f:Documentation/devicetree/bindings/spi/nxp,lpc3220-spi.yaml +f:Documentation/devicetree/bindings/spi/nxp,sc18is.yaml +f:Documentation/devicetree/bindings/spi/omap-spi.yaml +f:Documentation/devicetree/bindings/spi/qca,ar934x-spi.yaml +f:Documentation/devicetree/bindings/spi/qcom,spi-geni-qcom.yaml +f:Documentation/devicetree/bindings/spi/qcom,spi-qcom-qspi.yaml +f:Documentation/devicetree/bindings/spi/qcom,spi-qpic-snand.yaml +f:Documentation/devicetree/bindings/spi/qcom,spi-qup.yaml +f:Documentation/devicetree/bindings/spi/ralink,mt7621-spi.yaml +f:Documentation/devicetree/bindings/spi/realtek,rtl-spi.yaml +f:Documentation/devicetree/bindings/spi/realtek,rtl9301-snand.yaml +f:Documentation/devicetree/bindings/spi/renesas,hspi.yaml +f:Documentation/devicetree/bindings/spi/renesas,rspi.yaml +f:Documentation/devicetree/bindings/spi/renesas,rzv2h-rspi.yaml +f:Documentation/devicetree/bindings/spi/renesas,rzv2m-csi.yaml +f:Documentation/devicetree/bindings/spi/renesas,sh-msiof.yaml +f:Documentation/devicetree/bindings/spi/rockchip-sfc.yaml +f:Documentation/devicetree/bindings/spi/samsung,spi-peripheral-props.yaml +f:Documentation/devicetree/bindings/spi/samsung,spi.yaml +f:Documentation/devicetree/bindings/spi/snps,dw-apb-ssi.yaml +f:Documentation/devicetree/bindings/spi/socionext,f-ospi.yaml +f:Documentation/devicetree/bindings/spi/socionext,synquacer-spi.yaml +f:Documentation/devicetree/bindings/spi/socionext,uniphier-spi.yaml +f:Documentation/devicetree/bindings/spi/spi-ath79.txt +f:Documentation/devicetree/bindings/spi/spi-bus.txt +f:Documentation/devicetree/bindings/spi/spi-cadence.yaml +f:Documentation/devicetree/bindings/spi/spi-clps711x.txt +f:Documentation/devicetree/bindings/spi/spi-controller.yaml +f:Documentation/devicetree/bindings/spi/spi-davinci.txt +f:Documentation/devicetree/bindings/spi/spi-fsl-lpspi.yaml +f:Documentation/devicetree/bindings/spi/spi-gpio.yaml +f:Documentation/devicetree/bindings/spi/spi-img-spfi.txt +f:Documentation/devicetree/bindings/spi/spi-lantiq-ssc.txt +f:Documentation/devicetree/bindings/spi/spi-mux.yaml +f:Documentation/devicetree/bindings/spi/spi-nxp-fspi.yaml +f:Documentation/devicetree/bindings/spi/spi-octeon.txt +f:Documentation/devicetree/bindings/spi/spi-peripheral-props.yaml +f:Documentation/devicetree/bindings/spi/spi-pl022.yaml +f:Documentation/devicetree/bindings/spi/spi-rockchip.yaml +f:Documentation/devicetree/bindings/spi/spi-sg2044-nor.yaml +f:Documentation/devicetree/bindings/spi/spi-sifive.yaml +f:Documentation/devicetree/bindings/spi/spi-sunplus-sp7021.yaml +f:Documentation/devicetree/bindings/spi/spi-xilinx.yaml +f:Documentation/devicetree/bindings/spi/spi-xtensa-xtfpga.txt +f:Documentation/devicetree/bindings/spi/spi-zynqmp-qspi.yaml +f:Documentation/devicetree/bindings/spi/spi_altera.txt +f:Documentation/devicetree/bindings/spi/spi_oc_tiny.txt +f:Documentation/devicetree/bindings/spi/sprd,sc9860-spi.yaml +f:Documentation/devicetree/bindings/spi/sprd,spi-adi.yaml +f:Documentation/devicetree/bindings/spi/sqi-pic32.txt +f:Documentation/devicetree/bindings/spi/st,ssc-spi.yaml +f:Documentation/devicetree/bindings/spi/st,stm32-qspi.yaml +f:Documentation/devicetree/bindings/spi/st,stm32-spi.yaml +f:Documentation/devicetree/bindings/spi/st,stm32mp25-ospi.yaml +f:Documentation/devicetree/bindings/spi/ti,qspi.yaml +f:Documentation/devicetree/bindings/spi/xlnx,zynq-qspi.yaml +f:Documentation/devicetree/bindings/spmi/apple,spmi.yaml +f:Documentation/devicetree/bindings/spmi/hisilicon,hisi-spmi-controller.yaml +f:Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml +f:Documentation/devicetree/bindings/spmi/qcom,spmi-pmic-arb.yaml +f:Documentation/devicetree/bindings/spmi/qcom,x1e80100-spmi-pmic-arb.yaml +f:Documentation/devicetree/bindings/spmi/spmi.yaml +f:Documentation/devicetree/bindings/sram/allwinner,sun4i-a10-system-control.yaml +f:Documentation/devicetree/bindings/sram/qcom,imem.yaml +f:Documentation/devicetree/bindings/sram/qcom,ocmem.yaml +f:Documentation/devicetree/bindings/sram/sram.yaml +f:Documentation/devicetree/bindings/submitting-patches.rst +f:Documentation/devicetree/bindings/thermal/airoha,en7581-thermal.yaml +f:Documentation/devicetree/bindings/thermal/allwinner,sun8i-a83t-ths.yaml +f:Documentation/devicetree/bindings/thermal/amazon,al-thermal.txt +f:Documentation/devicetree/bindings/thermal/amlogic,thermal.yaml +f:Documentation/devicetree/bindings/thermal/armada-thermal.txt +f:Documentation/devicetree/bindings/thermal/brcm,avs-ro-thermal.yaml +f:Documentation/devicetree/bindings/thermal/brcm,avs-tmon.yaml +f:Documentation/devicetree/bindings/thermal/brcm,bcm2835-thermal.yaml +f:Documentation/devicetree/bindings/thermal/brcm,ns-thermal.yaml +f:Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt +f:Documentation/devicetree/bindings/thermal/db8500-thermal.txt +f:Documentation/devicetree/bindings/thermal/dlg,da9062-thermal.yaml +f:Documentation/devicetree/bindings/thermal/dove-thermal.txt +f:Documentation/devicetree/bindings/thermal/fsl,scu-thermal.yaml +f:Documentation/devicetree/bindings/thermal/generic-adc-thermal.yaml +f:Documentation/devicetree/bindings/thermal/hisilicon,tsensor.yaml +f:Documentation/devicetree/bindings/thermal/imx-thermal.yaml +f:Documentation/devicetree/bindings/thermal/imx8mm-thermal.yaml +f:Documentation/devicetree/bindings/thermal/kirkwood-thermal.txt +f:Documentation/devicetree/bindings/thermal/loongson,ls2k-thermal.yaml +f:Documentation/devicetree/bindings/thermal/max77620_thermal.txt +f:Documentation/devicetree/bindings/thermal/mediatek,lvts-thermal.yaml +f:Documentation/devicetree/bindings/thermal/mediatek,thermal.yaml +f:Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml +f:Documentation/devicetree/bindings/thermal/nvidia,tegra186-bpmp-thermal.yaml +f:Documentation/devicetree/bindings/thermal/nvidia,tegra30-tsensor.yaml +f:Documentation/devicetree/bindings/thermal/qcom,spmi-temp-alarm.yaml +f:Documentation/devicetree/bindings/thermal/qcom-lmh.yaml +f:Documentation/devicetree/bindings/thermal/qcom-spmi-adc-tm-hc.yaml +f:Documentation/devicetree/bindings/thermal/qcom-spmi-adc-tm5.yaml +f:Documentation/devicetree/bindings/thermal/qcom-tsens.yaml +f:Documentation/devicetree/bindings/thermal/qoriq-thermal.yaml +f:Documentation/devicetree/bindings/thermal/rcar-gen3-thermal.yaml +f:Documentation/devicetree/bindings/thermal/rcar-thermal.yaml +f:Documentation/devicetree/bindings/thermal/rockchip-thermal.yaml +f:Documentation/devicetree/bindings/thermal/rzg2l-thermal.yaml +f:Documentation/devicetree/bindings/thermal/samsung,exynos-thermal.yaml +f:Documentation/devicetree/bindings/thermal/socionext,uniphier-thermal.yaml +f:Documentation/devicetree/bindings/thermal/spear-thermal.txt +f:Documentation/devicetree/bindings/thermal/sprd-thermal.yaml +f:Documentation/devicetree/bindings/thermal/st,stih407-thermal.yaml +f:Documentation/devicetree/bindings/thermal/st,stm32-thermal.yaml +f:Documentation/devicetree/bindings/thermal/thermal-cooling-devices.yaml +f:Documentation/devicetree/bindings/thermal/thermal-idle.yaml +f:Documentation/devicetree/bindings/thermal/thermal-sensor.yaml +f:Documentation/devicetree/bindings/thermal/thermal-zones.yaml +f:Documentation/devicetree/bindings/thermal/ti,am654-thermal.yaml +f:Documentation/devicetree/bindings/thermal/ti,j72xx-thermal.yaml +f:Documentation/devicetree/bindings/thermal/ti_soc_thermal.txt +f:Documentation/devicetree/bindings/timer/actions,owl-timer.yaml +f:Documentation/devicetree/bindings/timer/allwinner,sun4i-a10-timer.yaml +f:Documentation/devicetree/bindings/timer/allwinner,sun5i-a13-hstimer.yaml +f:Documentation/devicetree/bindings/timer/altr,timer-1.0.yaml +f:Documentation/devicetree/bindings/timer/amlogic,meson6-timer.yaml +f:Documentation/devicetree/bindings/timer/andestech,plmt0.yaml +f:Documentation/devicetree/bindings/timer/arm,arch_timer.yaml +f:Documentation/devicetree/bindings/timer/arm,arch_timer_mmio.yaml +f:Documentation/devicetree/bindings/timer/arm,armv7m-systick.yaml +f:Documentation/devicetree/bindings/timer/arm,global_timer.yaml +f:Documentation/devicetree/bindings/timer/arm,mps2-timer.yaml +f:Documentation/devicetree/bindings/timer/arm,sp804.yaml +f:Documentation/devicetree/bindings/timer/arm,twd-timer.yaml +f:Documentation/devicetree/bindings/timer/brcm,bcm2835-system-timer.yaml +f:Documentation/devicetree/bindings/timer/brcm,bcmbca-timer.yaml +f:Documentation/devicetree/bindings/timer/brcm,kona-timer.yaml +f:Documentation/devicetree/bindings/timer/cdns,ttc.yaml +f:Documentation/devicetree/bindings/timer/cirrus,clps711x-timer.yaml +f:Documentation/devicetree/bindings/timer/cirrus,ep9301-timer.yaml +f:Documentation/devicetree/bindings/timer/cnxt,cx92755-timer.yaml +f:Documentation/devicetree/bindings/timer/csky,gx6605s-timer.yaml +f:Documentation/devicetree/bindings/timer/csky,mptimer.yaml +f:Documentation/devicetree/bindings/timer/econet,en751221-timer.yaml +f:Documentation/devicetree/bindings/timer/ezchip,nps400-timer.yaml +f:Documentation/devicetree/bindings/timer/faraday,fttmr010.txt +f:Documentation/devicetree/bindings/timer/fsl,ftm-timer.yaml +f:Documentation/devicetree/bindings/timer/fsl,gtm.yaml +f:Documentation/devicetree/bindings/timer/fsl,imxgpt.yaml +f:Documentation/devicetree/bindings/timer/fsl,vf610-pit.yaml +f:Documentation/devicetree/bindings/timer/hpe,gxp-timer.yaml +f:Documentation/devicetree/bindings/timer/img,pistachio-gptimer.yaml +f:Documentation/devicetree/bindings/timer/ingenic,sysost.yaml +f:Documentation/devicetree/bindings/timer/ingenic,tcu.yaml +f:Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml +f:Documentation/devicetree/bindings/timer/jcore,pit.yaml +f:Documentation/devicetree/bindings/timer/loongson,ls1x-pwmtimer.yaml +f:Documentation/devicetree/bindings/timer/lsi,zevio-timer.yaml +f:Documentation/devicetree/bindings/timer/marvell,armada-370-timer.yaml +f:Documentation/devicetree/bindings/timer/marvell,orion-timer.yaml +f:Documentation/devicetree/bindings/timer/mediatek,timer.yaml +f:Documentation/devicetree/bindings/timer/mrvl,mmp-timer.yaml +f:Documentation/devicetree/bindings/timer/mstar,msc313e-timer.yaml +f:Documentation/devicetree/bindings/timer/nuvoton,npcm7xx-timer.yaml +f:Documentation/devicetree/bindings/timer/nvidia,tegra-timer.yaml +f:Documentation/devicetree/bindings/timer/nvidia,tegra186-timer.yaml +f:Documentation/devicetree/bindings/timer/nxp,lpc3220-timer.yaml +f:Documentation/devicetree/bindings/timer/nxp,s32g2-stm.yaml +f:Documentation/devicetree/bindings/timer/nxp,sysctr-timer.yaml +f:Documentation/devicetree/bindings/timer/nxp,tpm-timer.yaml +f:Documentation/devicetree/bindings/timer/ralink,cevt-systick.yaml +f:Documentation/devicetree/bindings/timer/ralink,rt2880-timer.yaml +f:Documentation/devicetree/bindings/timer/rda,8810pl-timer.yaml +f:Documentation/devicetree/bindings/timer/realtek,otto-timer.yaml +f:Documentation/devicetree/bindings/timer/renesas,cmt.yaml +f:Documentation/devicetree/bindings/timer/renesas,em-sti.yaml +f:Documentation/devicetree/bindings/timer/renesas,mtu2.yaml +f:Documentation/devicetree/bindings/timer/renesas,ostm.yaml +f:Documentation/devicetree/bindings/timer/renesas,rz-mtu3.yaml +f:Documentation/devicetree/bindings/timer/renesas,tmu.yaml +f:Documentation/devicetree/bindings/timer/riscv,timer.yaml +f:Documentation/devicetree/bindings/timer/rockchip,rk-timer.yaml +f:Documentation/devicetree/bindings/timer/samsung,exynos4210-mct.yaml +f:Documentation/devicetree/bindings/timer/sifive,clint.yaml +f:Documentation/devicetree/bindings/timer/snps,arc-timer.yaml +f:Documentation/devicetree/bindings/timer/snps,archs-gfrc.yaml +f:Documentation/devicetree/bindings/timer/snps,archs-rtc.yaml +f:Documentation/devicetree/bindings/timer/snps,dw-apb-timer.yaml +f:Documentation/devicetree/bindings/timer/socionext,milbeaut-timer.yaml +f:Documentation/devicetree/bindings/timer/sprd,sc9860-timer.yaml +f:Documentation/devicetree/bindings/timer/st,nomadik-mtu.yaml +f:Documentation/devicetree/bindings/timer/st,spear-timer.yaml +f:Documentation/devicetree/bindings/timer/st,stih407-lpc +f:Documentation/devicetree/bindings/timer/st,stm32-timer.yaml +f:Documentation/devicetree/bindings/timer/thead,c900-aclint-mtimer.yaml +f:Documentation/devicetree/bindings/timer/ti,da830-timer.yaml +f:Documentation/devicetree/bindings/timer/ti,keystone-timer.yaml +f:Documentation/devicetree/bindings/timer/ti,timer-dm.yaml +f:Documentation/devicetree/bindings/timer/via,vt8500-timer.yaml +f:Documentation/devicetree/bindings/timer/xlnx,xps-timer.yaml +f:Documentation/devicetree/bindings/timestamp/hardware-timestamps-common.yaml +f:Documentation/devicetree/bindings/timestamp/hte-consumer.yaml +f:Documentation/devicetree/bindings/timestamp/nvidia,tegra194-hte.yaml +f:Documentation/devicetree/bindings/tpm/google,cr50.yaml +f:Documentation/devicetree/bindings/tpm/ibm,vtpm.yaml +f:Documentation/devicetree/bindings/tpm/microsoft,ftpm.yaml +f:Documentation/devicetree/bindings/tpm/tcg,tpm-tis-i2c.yaml +f:Documentation/devicetree/bindings/tpm/tcg,tpm-tis-mmio.yaml +f:Documentation/devicetree/bindings/tpm/tcg,tpm_tis-spi.yaml +f:Documentation/devicetree/bindings/tpm/tpm-common.yaml +f:Documentation/devicetree/bindings/trigger-source/adi,util-sigma-delta-spi.yaml +f:Documentation/devicetree/bindings/trigger-source/gpio-trigger.yaml +f:Documentation/devicetree/bindings/trigger-source/pwm-trigger.yaml +f:Documentation/devicetree/bindings/trivial-devices.yaml +f:Documentation/devicetree/bindings/ufs/cdns,ufshc.yaml +f:Documentation/devicetree/bindings/ufs/hisilicon,ufs.yaml +f:Documentation/devicetree/bindings/ufs/mediatek,ufs.yaml +f:Documentation/devicetree/bindings/ufs/qcom,ufs.yaml +f:Documentation/devicetree/bindings/ufs/renesas,ufs.yaml +f:Documentation/devicetree/bindings/ufs/rockchip,rk3576-ufshc.yaml +f:Documentation/devicetree/bindings/ufs/samsung,exynos-ufs.yaml +f:Documentation/devicetree/bindings/ufs/snps,tc-dwc-g210.yaml +f:Documentation/devicetree/bindings/ufs/sprd,ums9620-ufs.yaml +f:Documentation/devicetree/bindings/ufs/ti,j721e-ufs.yaml +f:Documentation/devicetree/bindings/ufs/ufs-common.yaml +f:Documentation/devicetree/bindings/unittest.txt +f:Documentation/devicetree/bindings/usb/allwinner,sun4i-a10-musb.yaml +f:Documentation/devicetree/bindings/usb/am33xx-usb.txt +f:Documentation/devicetree/bindings/usb/amlogic,meson-g12a-usb-ctrl.yaml +f:Documentation/devicetree/bindings/usb/analogix,anx7411.yaml +f:Documentation/devicetree/bindings/usb/aspeed,ast2600-udc.yaml +f:Documentation/devicetree/bindings/usb/aspeed,usb-vhub.yaml +f:Documentation/devicetree/bindings/usb/atmel-usb.txt +f:Documentation/devicetree/bindings/usb/brcm,bcm7445-ehci.yaml +f:Documentation/devicetree/bindings/usb/brcm,bdc.yaml +f:Documentation/devicetree/bindings/usb/brcm,usb-pinmap.yaml +f:Documentation/devicetree/bindings/usb/cdns,usb3.yaml +f:Documentation/devicetree/bindings/usb/chipidea,usb2-common.yaml +f:Documentation/devicetree/bindings/usb/chipidea,usb2-imx.yaml +f:Documentation/devicetree/bindings/usb/ci-hdrc-usb2.yaml +f:Documentation/devicetree/bindings/usb/cypress,cypd4226.yaml +f:Documentation/devicetree/bindings/usb/cypress,hx3.yaml +f:Documentation/devicetree/bindings/usb/da8xx-usb.txt +f:Documentation/devicetree/bindings/usb/dwc2.yaml +f:Documentation/devicetree/bindings/usb/dwc3-cavium.txt +f:Documentation/devicetree/bindings/usb/dwc3-st.txt +f:Documentation/devicetree/bindings/usb/dwc3-xilinx.yaml +f:Documentation/devicetree/bindings/usb/ehci-st.txt +f:Documentation/devicetree/bindings/usb/faraday,fotg210.yaml +f:Documentation/devicetree/bindings/usb/fcs,fsa4480.yaml +f:Documentation/devicetree/bindings/usb/fcs,fusb302.yaml +f:Documentation/devicetree/bindings/usb/fsl,imx8mp-dwc3.yaml +f:Documentation/devicetree/bindings/usb/fsl,imx8mq-dwc3.yaml +f:Documentation/devicetree/bindings/usb/fsl,imx8qm-cdns3.yaml +f:Documentation/devicetree/bindings/usb/fsl,ls1028a.yaml +f:Documentation/devicetree/bindings/usb/fsl,usb2.yaml +f:Documentation/devicetree/bindings/usb/fsl,usbmisc.yaml +f:Documentation/devicetree/bindings/usb/generic-ehci.yaml +f:Documentation/devicetree/bindings/usb/generic-ohci.yaml +f:Documentation/devicetree/bindings/usb/generic-xhci.yaml +f:Documentation/devicetree/bindings/usb/genesys,gl850g.yaml +f:Documentation/devicetree/bindings/usb/gpio-sbu-mux.yaml +f:Documentation/devicetree/bindings/usb/gr-udc.txt +f:Documentation/devicetree/bindings/usb/hisilicon,hi3798mv200-dwc3.yaml +f:Documentation/devicetree/bindings/usb/hisilicon,histb-xhci.txt +f:Documentation/devicetree/bindings/usb/ingenic,musb.yaml +f:Documentation/devicetree/bindings/usb/intel,keembay-dwc3.yaml +f:Documentation/devicetree/bindings/usb/iproc-udc.txt +f:Documentation/devicetree/bindings/usb/ite,it5205.yaml +f:Documentation/devicetree/bindings/usb/marvell,pxau2o-ehci.yaml +f:Documentation/devicetree/bindings/usb/maxim,max33359.yaml +f:Documentation/devicetree/bindings/usb/maxim,max3420-udc.yaml +f:Documentation/devicetree/bindings/usb/maxim,max3421.txt +f:Documentation/devicetree/bindings/usb/mediatek,mt6360-tcpc.yaml +f:Documentation/devicetree/bindings/usb/mediatek,mt6370-tcpc.yaml +f:Documentation/devicetree/bindings/usb/mediatek,mtk-xhci.yaml +f:Documentation/devicetree/bindings/usb/mediatek,mtu3.yaml +f:Documentation/devicetree/bindings/usb/mediatek,musb.yaml +f:Documentation/devicetree/bindings/usb/microchip,mpfs-musb.yaml +f:Documentation/devicetree/bindings/usb/microchip,usb2514.yaml +f:Documentation/devicetree/bindings/usb/microchip,usb5744.yaml +f:Documentation/devicetree/bindings/usb/nvidia,tegra-xudc.yaml +f:Documentation/devicetree/bindings/usb/nvidia,tegra124-xusb.yaml +f:Documentation/devicetree/bindings/usb/nvidia,tegra186-xusb.yaml +f:Documentation/devicetree/bindings/usb/nvidia,tegra194-xusb.yaml +f:Documentation/devicetree/bindings/usb/nvidia,tegra20-ehci.txt +f:Documentation/devicetree/bindings/usb/nvidia,tegra210-xusb.yaml +f:Documentation/devicetree/bindings/usb/nvidia,tegra234-xusb.yaml +f:Documentation/devicetree/bindings/usb/nxp,isp1760.yaml +f:Documentation/devicetree/bindings/usb/nxp,lpc3220-udc.yaml +f:Documentation/devicetree/bindings/usb/nxp,ptn36502.yaml +f:Documentation/devicetree/bindings/usb/nxp,ptn5110.yaml +f:Documentation/devicetree/bindings/usb/octeon-usb.txt +f:Documentation/devicetree/bindings/usb/ohci-da8xx.txt +f:Documentation/devicetree/bindings/usb/ohci-st.txt +f:Documentation/devicetree/bindings/usb/omap-usb.txt +f:Documentation/devicetree/bindings/usb/onnn,nb7vpq904m.yaml +f:Documentation/devicetree/bindings/usb/parade,ps5511.yaml +f:Documentation/devicetree/bindings/usb/parade,ps8830.yaml +f:Documentation/devicetree/bindings/usb/pxa-usb.txt +f:Documentation/devicetree/bindings/usb/qcom,dwc3.yaml +f:Documentation/devicetree/bindings/usb/qcom,pmic-typec.yaml +f:Documentation/devicetree/bindings/usb/qcom,snps-dwc3.yaml +f:Documentation/devicetree/bindings/usb/qcom,wcd939x-usbss.yaml +f:Documentation/devicetree/bindings/usb/realtek,rtd-dwc3.yaml +f:Documentation/devicetree/bindings/usb/realtek,rtd-type-c.yaml +f:Documentation/devicetree/bindings/usb/realtek,rts5411.yaml +f:Documentation/devicetree/bindings/usb/renesas,rzn1-usbf.yaml +f:Documentation/devicetree/bindings/usb/renesas,rzv2m-usb3drd.yaml +f:Documentation/devicetree/bindings/usb/renesas,usb-xhci.yaml +f:Documentation/devicetree/bindings/usb/renesas,usb3-peri.yaml +f:Documentation/devicetree/bindings/usb/renesas,usbhs.yaml +f:Documentation/devicetree/bindings/usb/richtek,rt1711h.txt +f:Documentation/devicetree/bindings/usb/richtek,rt1711h.yaml +f:Documentation/devicetree/bindings/usb/richtek,rt1719.yaml +f:Documentation/devicetree/bindings/usb/rockchip,dwc3.yaml +f:Documentation/devicetree/bindings/usb/rockchip,rk3399-dwc3.yaml +f:Documentation/devicetree/bindings/usb/s3c2410-usb.txt +f:Documentation/devicetree/bindings/usb/samsung,exynos-dwc3.yaml +f:Documentation/devicetree/bindings/usb/samsung,exynos-usb2.yaml +f:Documentation/devicetree/bindings/usb/smsc,usb3503.yaml +f:Documentation/devicetree/bindings/usb/snps,dwc3-common.yaml +f:Documentation/devicetree/bindings/usb/snps,dwc3.yaml +f:Documentation/devicetree/bindings/usb/st,stusb160x.yaml +f:Documentation/devicetree/bindings/usb/st,typec-stm32g0.yaml +f:Documentation/devicetree/bindings/usb/starfive,jh7110-usb.yaml +f:Documentation/devicetree/bindings/usb/ti,am62-usb.yaml +f:Documentation/devicetree/bindings/usb/ti,hd3ss3220.yaml +f:Documentation/devicetree/bindings/usb/ti,j721e-usb.yaml +f:Documentation/devicetree/bindings/usb/ti,keystone-dwc3.yaml +f:Documentation/devicetree/bindings/usb/ti,tps6598x.yaml +f:Documentation/devicetree/bindings/usb/ti,tusb1046.yaml +f:Documentation/devicetree/bindings/usb/ti,tusb73x0-pci.yaml +f:Documentation/devicetree/bindings/usb/ti,usb8020b.yaml +f:Documentation/devicetree/bindings/usb/ti,usb8041.yaml +f:Documentation/devicetree/bindings/usb/twlxxxx-usb.txt +f:Documentation/devicetree/bindings/usb/ulpi.txt +f:Documentation/devicetree/bindings/usb/usb-device.yaml +f:Documentation/devicetree/bindings/usb/usb-drd.yaml +f:Documentation/devicetree/bindings/usb/usb-hcd.yaml +f:Documentation/devicetree/bindings/usb/usb-hub.yaml +f:Documentation/devicetree/bindings/usb/usb-nop-xceiv.yaml +f:Documentation/devicetree/bindings/usb/usb-switch.yaml +f:Documentation/devicetree/bindings/usb/usb-uhci.yaml +f:Documentation/devicetree/bindings/usb/usb-xhci.yaml +f:Documentation/devicetree/bindings/usb/usb.yaml +f:Documentation/devicetree/bindings/usb/usb251xb.yaml +f:Documentation/devicetree/bindings/usb/usb4604.txt +f:Documentation/devicetree/bindings/usb/ux500-usb.txt +f:Documentation/devicetree/bindings/usb/vialab,vl817.yaml +f:Documentation/devicetree/bindings/usb/willsemi,wusb3801.yaml +f:Documentation/devicetree/bindings/usb/xlnx,usb2.yaml +f:Documentation/devicetree/bindings/vendor-prefixes.yaml +f:Documentation/devicetree/bindings/virtio/mmio.yaml +f:Documentation/devicetree/bindings/virtio/pci-iommu.yaml +f:Documentation/devicetree/bindings/virtio/virtio-device.yaml +f:Documentation/devicetree/bindings/w1/amd,axi-1wire-host.yaml +f:Documentation/devicetree/bindings/w1/fsl-imx-owire.yaml +f:Documentation/devicetree/bindings/w1/maxim,ds2482.yaml +f:Documentation/devicetree/bindings/w1/omap-hdq.txt +f:Documentation/devicetree/bindings/w1/w1-gpio.yaml +f:Documentation/devicetree/bindings/w1/w1-uart.yaml +f:Documentation/devicetree/bindings/w1/w1.txt +f:Documentation/devicetree/bindings/watchdog/airoha,en7581-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/allwinner,sun4i-a10-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/alphascale,asm9260-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/amlogic,meson-gxbb-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/amlogic,meson6-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/apple,wdt.yaml +f:Documentation/devicetree/bindings/watchdog/arm,sbsa-gwdt.yaml +f:Documentation/devicetree/bindings/watchdog/arm,sp805.yaml +f:Documentation/devicetree/bindings/watchdog/arm,twd-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/arm-smc-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/armada-37xx-wdt.txt +f:Documentation/devicetree/bindings/watchdog/aspeed,ast2400-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/atmel,at91rm9200-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/atmel,at91sam9-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/atmel,sama5d4-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/brcm,bcm7038-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/brcm,kona-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/cdns,wdt-r1p2.yaml +f:Documentation/devicetree/bindings/watchdog/cirrus,ep9301-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/cnxt,cx92755-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/dlg,da9062-watchdog.yaml +f:Documentation/devicetree/bindings/watchdog/faraday,ftwdt010.yaml +f:Documentation/devicetree/bindings/watchdog/fsl,scu-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/fsl-imx7ulp-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/img,pdc-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/intel,keembay-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/kontron,sl28cpld-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/lantiq-wdt.txt +f:Documentation/devicetree/bindings/watchdog/linux,wdt-gpio.yaml +f:Documentation/devicetree/bindings/watchdog/loongson,ls1x-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/marvel.txt +f:Documentation/devicetree/bindings/watchdog/marvell,cn10624-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/maxim,max63xx.yaml +f:Documentation/devicetree/bindings/watchdog/mediatek,mt7621-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/mediatek,mtk-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/men-a021-wdt.txt +f:Documentation/devicetree/bindings/watchdog/microchip,pic32-dmt.txt +f:Documentation/devicetree/bindings/watchdog/microchip,pic32-wdt.txt +f:Documentation/devicetree/bindings/watchdog/moxa,moxart-watchdog.txt +f:Documentation/devicetree/bindings/watchdog/mpc8xxx-wdt.txt +f:Documentation/devicetree/bindings/watchdog/mstar,msc313e-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/nuvoton,npcm-wdt.txt +f:Documentation/devicetree/bindings/watchdog/nxp,lpc1850-wwdt.yaml +f:Documentation/devicetree/bindings/watchdog/nxp,pnx4008-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/nxp,s32g2-swt.yaml +f:Documentation/devicetree/bindings/watchdog/omap-wdt.txt +f:Documentation/devicetree/bindings/watchdog/qca,ar7130-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/qcom,pm8916-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/qcom-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/ralink,rt2880-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/realtek,otto-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/realtek,rtd1295-watchdog.yaml +f:Documentation/devicetree/bindings/watchdog/renesas,wdt.yaml +f:Documentation/devicetree/bindings/watchdog/samsung-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/snps,dw-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/socionext,uniphier-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/sprd,sp9860-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/st,stm32-iwdg.yaml +f:Documentation/devicetree/bindings/watchdog/st_lpc_wdt.txt +f:Documentation/devicetree/bindings/watchdog/starfive,jh7100-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/sunplus,sp7021-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/technologic,ts7200-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/ti,davinci-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/ti,rti-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/toshiba,visconti-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/ts4800-wdt.txt +f:Documentation/devicetree/bindings/watchdog/watchdog.yaml +f:Documentation/devicetree/bindings/watchdog/xlnx,versal-wwdt.yaml +f:Documentation/devicetree/bindings/watchdog/xlnx,xps-timebase-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/zii,rave-sp-wdt.yaml +f:Documentation/devicetree/bindings/watchdog/zii,rave-wdt.yaml +f:Documentation/devicetree/bindings/writing-bindings.rst +f:Documentation/devicetree/bindings/writing-schema.rst +f:Documentation/devicetree/bindings/x86/ce4100.txt +f:Documentation/devicetree/bindings/x86/timer.txt +f:Documentation/devicetree/bindings/xilinx.txt +f:Documentation/devicetree/bindings/xillybus/xillybus.txt +f:Documentation/devicetree/changesets.rst +f:Documentation/devicetree/dynamic-resolution-notes.rst +f:Documentation/devicetree/index.rst +f:Documentation/devicetree/kernel-api.rst +f:Documentation/devicetree/of_unittest.rst +f:Documentation/devicetree/overlay-notes.rst +f:Documentation/devicetree/usage-model.rst +f:Documentation/doc-guide/checktransupdate.rst +f:Documentation/doc-guide/contributing.rst +f:Documentation/doc-guide/hello.dot +f:Documentation/doc-guide/index.rst +f:Documentation/doc-guide/kernel-doc.rst +f:Documentation/doc-guide/maintainer-profile.rst +f:Documentation/doc-guide/parse-headers.rst +f:Documentation/doc-guide/sphinx.rst +f:Documentation/doc-guide/svg_image.svg +f:Documentation/docutils.conf +f:Documentation/driver-api/80211/cfg80211.rst +f:Documentation/driver-api/80211/index.rst +f:Documentation/driver-api/80211/introduction.rst +f:Documentation/driver-api/80211/mac80211-advanced.rst +f:Documentation/driver-api/80211/mac80211.rst +f:Documentation/driver-api/acpi/index.rst +f:Documentation/driver-api/acpi/linuxized-acpica.rst +f:Documentation/driver-api/acpi/scan_handlers.rst +f:Documentation/driver-api/aperture.rst +f:Documentation/driver-api/auxiliary_bus.rst +f:Documentation/driver-api/backlight/lp855x-driver.rst +f:Documentation/driver-api/basics.rst +f:Documentation/driver-api/clk.rst +f:Documentation/driver-api/coco/index.rst +f:Documentation/driver-api/coco/measurement-registers.rst +f:Documentation/driver-api/component.rst +f:Documentation/driver-api/connector.rst +f:Documentation/driver-api/console.rst +f:Documentation/driver-api/crypto/iaa/iaa-crypto.rst +f:Documentation/driver-api/crypto/iaa/index.rst +f:Documentation/driver-api/crypto/index.rst +f:Documentation/driver-api/cxl/allocation/dax.rst +f:Documentation/driver-api/cxl/allocation/hugepages.rst +f:Documentation/driver-api/cxl/allocation/page-allocator.rst +f:Documentation/driver-api/cxl/allocation/reclaim.rst +f:Documentation/driver-api/cxl/devices/device-types.rst +f:Documentation/driver-api/cxl/index.rst +f:Documentation/driver-api/cxl/linux/access-coordinates.rst +f:Documentation/driver-api/cxl/linux/cxl-driver.rst +f:Documentation/driver-api/cxl/linux/dax-driver.rst +f:Documentation/driver-api/cxl/linux/early-boot.rst +f:Documentation/driver-api/cxl/linux/example-configurations/hb-interleave.rst +f:Documentation/driver-api/cxl/linux/example-configurations/intra-hb-interleave.rst +f:Documentation/driver-api/cxl/linux/example-configurations/multi-interleave.rst +f:Documentation/driver-api/cxl/linux/example-configurations/single-device.rst +f:Documentation/driver-api/cxl/linux/memory-hotplug.rst +f:Documentation/driver-api/cxl/linux/overview.rst +f:Documentation/driver-api/cxl/maturity-map.rst +f:Documentation/driver-api/cxl/platform/acpi.rst +f:Documentation/driver-api/cxl/platform/acpi/cedt.rst +f:Documentation/driver-api/cxl/platform/acpi/dsdt.rst +f:Documentation/driver-api/cxl/platform/acpi/hmat.rst +f:Documentation/driver-api/cxl/platform/acpi/slit.rst +f:Documentation/driver-api/cxl/platform/acpi/srat.rst +f:Documentation/driver-api/cxl/platform/bios-and-efi.rst +f:Documentation/driver-api/cxl/platform/cdat.rst +f:Documentation/driver-api/cxl/platform/example-configs.rst +f:Documentation/driver-api/cxl/platform/example-configurations/flexible.rst +f:Documentation/driver-api/cxl/platform/example-configurations/hb-interleave.rst +f:Documentation/driver-api/cxl/platform/example-configurations/multi-dev-per-hb.rst +f:Documentation/driver-api/cxl/platform/example-configurations/one-dev-per-hb.rst +f:Documentation/driver-api/cxl/theory-of-operation.rst +f:Documentation/driver-api/devfreq.rst +f:Documentation/driver-api/device-io.rst +f:Documentation/driver-api/device_link.rst +f:Documentation/driver-api/dma-buf.rst +f:Documentation/driver-api/dmaengine/client.rst +f:Documentation/driver-api/dmaengine/dmatest.rst +f:Documentation/driver-api/dmaengine/index.rst +f:Documentation/driver-api/dmaengine/provider.rst +f:Documentation/driver-api/dmaengine/pxa_dma.rst +f:Documentation/driver-api/dpll.rst +f:Documentation/driver-api/driver-model/binding.rst +f:Documentation/driver-api/driver-model/bus.rst +f:Documentation/driver-api/driver-model/design-patterns.rst +f:Documentation/driver-api/driver-model/device.rst +f:Documentation/driver-api/driver-model/devres.rst +f:Documentation/driver-api/driver-model/driver.rst +f:Documentation/driver-api/driver-model/index.rst +f:Documentation/driver-api/driver-model/overview.rst +f:Documentation/driver-api/driver-model/platform.rst +f:Documentation/driver-api/driver-model/porting.rst +f:Documentation/driver-api/early-userspace/buffer-format.rst +f:Documentation/driver-api/early-userspace/early_userspace_support.rst +f:Documentation/driver-api/early-userspace/index.rst +f:Documentation/driver-api/edac.rst +f:Documentation/driver-api/eisa.rst +f:Documentation/driver-api/extcon.rst +f:Documentation/driver-api/firewire.rst +f:Documentation/driver-api/firmware/built-in-fw.rst +f:Documentation/driver-api/firmware/core.rst +f:Documentation/driver-api/firmware/direct-fs-lookup.rst +f:Documentation/driver-api/firmware/efi/index.rst +f:Documentation/driver-api/firmware/fallback-mechanisms.rst +f:Documentation/driver-api/firmware/firmware-usage-guidelines.rst +f:Documentation/driver-api/firmware/firmware_cache.rst +f:Documentation/driver-api/firmware/fw_search_path.rst +f:Documentation/driver-api/firmware/fw_upload.rst +f:Documentation/driver-api/firmware/index.rst +f:Documentation/driver-api/firmware/introduction.rst +f:Documentation/driver-api/firmware/lookup-order.rst +f:Documentation/driver-api/firmware/other_interfaces.rst +f:Documentation/driver-api/firmware/request_firmware.rst +f:Documentation/driver-api/fpga/fpga-bridge.rst +f:Documentation/driver-api/fpga/fpga-mgr.rst +f:Documentation/driver-api/fpga/fpga-programming.rst +f:Documentation/driver-api/fpga/fpga-region.rst +f:Documentation/driver-api/fpga/index.rst +f:Documentation/driver-api/fpga/intro.rst +f:Documentation/driver-api/frame-buffer.rst +f:Documentation/driver-api/generic-counter.rst +f:Documentation/driver-api/gpio/board.rst +f:Documentation/driver-api/gpio/bt8xxgpio.rst +f:Documentation/driver-api/gpio/consumer.rst +f:Documentation/driver-api/gpio/driver.rst +f:Documentation/driver-api/gpio/drivers-on-gpio.rst +f:Documentation/driver-api/gpio/index.rst +f:Documentation/driver-api/gpio/intro.rst +f:Documentation/driver-api/gpio/using-gpio.rst +f:Documentation/driver-api/hsi.rst +f:Documentation/driver-api/hte/hte.rst +f:Documentation/driver-api/hte/index.rst +f:Documentation/driver-api/hte/tegra-hte.rst +f:Documentation/driver-api/i2c.rst +f:Documentation/driver-api/i3c/device-driver-api.rst +f:Documentation/driver-api/i3c/index.rst +f:Documentation/driver-api/i3c/master-driver-api.rst +f:Documentation/driver-api/i3c/protocol.rst +f:Documentation/driver-api/iio/buffers.rst +f:Documentation/driver-api/iio/core.rst +f:Documentation/driver-api/iio/hw-consumer.rst +f:Documentation/driver-api/iio/index.rst +f:Documentation/driver-api/iio/intro.rst +f:Documentation/driver-api/iio/triggered-buffers.rst +f:Documentation/driver-api/iio/triggers.rst +f:Documentation/driver-api/index.rst +f:Documentation/driver-api/infiniband.rst +f:Documentation/driver-api/infrastructure.rst +f:Documentation/driver-api/input.rst +f:Documentation/driver-api/interconnect.rst +f:Documentation/driver-api/io-mapping.rst +f:Documentation/driver-api/io_ordering.rst +f:Documentation/driver-api/ioctl.rst +f:Documentation/driver-api/ipmb.rst +f:Documentation/driver-api/ipmi.rst +f:Documentation/driver-api/isa.rst +f:Documentation/driver-api/libata.rst +f:Documentation/driver-api/mailbox.rst +f:Documentation/driver-api/md/index.rst +f:Documentation/driver-api/md/md-cluster.rst +f:Documentation/driver-api/md/raid5-cache.rst +f:Documentation/driver-api/md/raid5-ppl.rst +f:Documentation/driver-api/media/camera-sensor.rst +f:Documentation/driver-api/media/cec-core.rst +f:Documentation/driver-api/media/drivers/bttv-devel.rst +f:Documentation/driver-api/media/drivers/ccs/ccs-regs.asc +f:Documentation/driver-api/media/drivers/ccs/ccs.rst +f:Documentation/driver-api/media/drivers/ccs/mk-ccs-regs +f:Documentation/driver-api/media/drivers/contributors.rst +f:Documentation/driver-api/media/drivers/cx2341x-devel.rst +f:Documentation/driver-api/media/drivers/cx88-devel.rst +f:Documentation/driver-api/media/drivers/dvb-usb.rst +f:Documentation/driver-api/media/drivers/fimc-devel.rst +f:Documentation/driver-api/media/drivers/frontends.rst +f:Documentation/driver-api/media/drivers/index.rst +f:Documentation/driver-api/media/drivers/ipu6.rst +f:Documentation/driver-api/media/drivers/pvrusb2.rst +f:Documentation/driver-api/media/drivers/pxa_camera.rst +f:Documentation/driver-api/media/drivers/radiotrack.rst +f:Documentation/driver-api/media/drivers/rkisp1.rst +f:Documentation/driver-api/media/drivers/saa7134-devel.rst +f:Documentation/driver-api/media/drivers/sh_mobile_ceu_camera.rst +f:Documentation/driver-api/media/drivers/tuners.rst +f:Documentation/driver-api/media/drivers/vidtv.rst +f:Documentation/driver-api/media/drivers/vimc-devel.rst +f:Documentation/driver-api/media/drivers/zoran.rst +f:Documentation/driver-api/media/dtv-ca.rst +f:Documentation/driver-api/media/dtv-common.rst +f:Documentation/driver-api/media/dtv-core.rst +f:Documentation/driver-api/media/dtv-demux.rst +f:Documentation/driver-api/media/dtv-frontend.rst +f:Documentation/driver-api/media/dtv-net.rst +f:Documentation/driver-api/media/index.rst +f:Documentation/driver-api/media/maintainer-entry-profile.rst +f:Documentation/driver-api/media/mc-core.rst +f:Documentation/driver-api/media/rc-core.rst +f:Documentation/driver-api/media/tx-rx.rst +f:Documentation/driver-api/media/v4l2-async.rst +f:Documentation/driver-api/media/v4l2-cci.rst +f:Documentation/driver-api/media/v4l2-common.rst +f:Documentation/driver-api/media/v4l2-controls.rst +f:Documentation/driver-api/media/v4l2-core.rst +f:Documentation/driver-api/media/v4l2-dev.rst +f:Documentation/driver-api/media/v4l2-device.rst +f:Documentation/driver-api/media/v4l2-dv-timings.rst +f:Documentation/driver-api/media/v4l2-event.rst +f:Documentation/driver-api/media/v4l2-fh.rst +f:Documentation/driver-api/media/v4l2-flash-led-class.rst +f:Documentation/driver-api/media/v4l2-fwnode.rst +f:Documentation/driver-api/media/v4l2-intro.rst +f:Documentation/driver-api/media/v4l2-jpeg.rst +f:Documentation/driver-api/media/v4l2-mc.rst +f:Documentation/driver-api/media/v4l2-mediabus.rst +f:Documentation/driver-api/media/v4l2-mem2mem.rst +f:Documentation/driver-api/media/v4l2-rect.rst +f:Documentation/driver-api/media/v4l2-subdev.rst +f:Documentation/driver-api/media/v4l2-tuner.rst +f:Documentation/driver-api/media/v4l2-tveeprom.rst +f:Documentation/driver-api/media/v4l2-videobuf2.rst +f:Documentation/driver-api/mei/hdcp.rst +f:Documentation/driver-api/mei/iamt.rst +f:Documentation/driver-api/mei/index.rst +f:Documentation/driver-api/mei/mei-client-bus.rst +f:Documentation/driver-api/mei/mei.rst +f:Documentation/driver-api/mei/nfc.rst +f:Documentation/driver-api/memory-devices/index.rst +f:Documentation/driver-api/memory-devices/ti-emif.rst +f:Documentation/driver-api/memory-devices/ti-gpmc.rst +f:Documentation/driver-api/men-chameleon-bus.rst +f:Documentation/driver-api/message-based.rst +f:Documentation/driver-api/misc_devices.rst +f:Documentation/driver-api/miscellaneous.rst +f:Documentation/driver-api/mmc/index.rst +f:Documentation/driver-api/mmc/mmc-async-req.rst +f:Documentation/driver-api/mmc/mmc-dev-attrs.rst +f:Documentation/driver-api/mmc/mmc-dev-parts.rst +f:Documentation/driver-api/mmc/mmc-test.rst +f:Documentation/driver-api/mmc/mmc-tools.rst +f:Documentation/driver-api/mtd/index.rst +f:Documentation/driver-api/mtd/nand_ecc.rst +f:Documentation/driver-api/mtd/spi-intel.rst +f:Documentation/driver-api/mtd/spi-nor.rst +f:Documentation/driver-api/mtdnand.rst +f:Documentation/driver-api/nfc/index.rst +f:Documentation/driver-api/nfc/nfc-hci.rst +f:Documentation/driver-api/nfc/nfc-pn544.rst +f:Documentation/driver-api/ntb.rst +f:Documentation/driver-api/nvdimm/btt.rst +f:Documentation/driver-api/nvdimm/firmware-activate.rst +f:Documentation/driver-api/nvdimm/index.rst +f:Documentation/driver-api/nvdimm/nvdimm.rst +f:Documentation/driver-api/nvdimm/security.rst +f:Documentation/driver-api/nvmem.rst +f:Documentation/driver-api/parport-lowlevel.rst +f:Documentation/driver-api/pci/index.rst +f:Documentation/driver-api/pci/p2pdma.rst +f:Documentation/driver-api/pci/pci.rst +f:Documentation/driver-api/phy/index.rst +f:Documentation/driver-api/phy/phy.rst +f:Documentation/driver-api/phy/samsung-usb2.rst +f:Documentation/driver-api/pin-control.rst +f:Documentation/driver-api/pldmfw/driver-ops.rst +f:Documentation/driver-api/pldmfw/file-format.rst +f:Documentation/driver-api/pldmfw/index.rst +f:Documentation/driver-api/pm/cpuidle.rst +f:Documentation/driver-api/pm/devices.rst +f:Documentation/driver-api/pm/index.rst +f:Documentation/driver-api/pm/notifiers.rst +f:Documentation/driver-api/pm/types.rst +f:Documentation/driver-api/pps.rst +f:Documentation/driver-api/ptp.rst +f:Documentation/driver-api/pwm.rst +f:Documentation/driver-api/pwrseq.rst +f:Documentation/driver-api/rapidio/index.rst +f:Documentation/driver-api/rapidio/mport_cdev.rst +f:Documentation/driver-api/rapidio/rapidio.rst +f:Documentation/driver-api/rapidio/rio_cm.rst +f:Documentation/driver-api/rapidio/sysfs.rst +f:Documentation/driver-api/rapidio/tsi721.rst +f:Documentation/driver-api/regulator.rst +f:Documentation/driver-api/reset.rst +f:Documentation/driver-api/rfkill.rst +f:Documentation/driver-api/s390-drivers.rst +f:Documentation/driver-api/scsi.rst +f:Documentation/driver-api/serial/driver.rst +f:Documentation/driver-api/serial/index.rst +f:Documentation/driver-api/serial/serial-iso7816.rst +f:Documentation/driver-api/serial/serial-rs485.rst +f:Documentation/driver-api/slimbus.rst +f:Documentation/driver-api/sm501.rst +f:Documentation/driver-api/soundwire/bra.rst +f:Documentation/driver-api/soundwire/bra_cadence.rst +f:Documentation/driver-api/soundwire/error_handling.rst +f:Documentation/driver-api/soundwire/index.rst +f:Documentation/driver-api/soundwire/locking.rst +f:Documentation/driver-api/soundwire/stream.rst +f:Documentation/driver-api/soundwire/summary.rst +f:Documentation/driver-api/spi.rst +f:Documentation/driver-api/surface_aggregator/client-api.rst +f:Documentation/driver-api/surface_aggregator/client.rst +f:Documentation/driver-api/surface_aggregator/clients/cdev.rst +f:Documentation/driver-api/surface_aggregator/clients/dtx.rst +f:Documentation/driver-api/surface_aggregator/clients/index.rst +f:Documentation/driver-api/surface_aggregator/clients/san.rst +f:Documentation/driver-api/surface_aggregator/index.rst +f:Documentation/driver-api/surface_aggregator/internal-api.rst +f:Documentation/driver-api/surface_aggregator/internal.rst +f:Documentation/driver-api/surface_aggregator/overview.rst +f:Documentation/driver-api/surface_aggregator/ssh.rst +f:Documentation/driver-api/switchtec.rst +f:Documentation/driver-api/sync_file.rst +f:Documentation/driver-api/target.rst +f:Documentation/driver-api/tee.rst +f:Documentation/driver-api/thermal/cpu-cooling-api.rst +f:Documentation/driver-api/thermal/cpu-idle-cooling.rst +f:Documentation/driver-api/thermal/exynos_thermal.rst +f:Documentation/driver-api/thermal/exynos_thermal_emulation.rst +f:Documentation/driver-api/thermal/index.rst +f:Documentation/driver-api/thermal/intel_dptf.rst +f:Documentation/driver-api/thermal/nouveau_thermal.rst +f:Documentation/driver-api/thermal/power_allocator.rst +f:Documentation/driver-api/thermal/sysfs-api.rst +f:Documentation/driver-api/thermal/x86_pkg_temperature_thermal.rst +f:Documentation/driver-api/tty/console.rst +f:Documentation/driver-api/tty/index.rst +f:Documentation/driver-api/tty/moxa-smartio.rst +f:Documentation/driver-api/tty/n_gsm.rst +f:Documentation/driver-api/tty/n_tty.rst +f:Documentation/driver-api/tty/tty_buffer.rst +f:Documentation/driver-api/tty/tty_driver.rst +f:Documentation/driver-api/tty/tty_internals.rst +f:Documentation/driver-api/tty/tty_ioctl.rst +f:Documentation/driver-api/tty/tty_ldisc.rst +f:Documentation/driver-api/tty/tty_port.rst +f:Documentation/driver-api/tty/tty_struct.rst +f:Documentation/driver-api/uio-howto.rst +f:Documentation/driver-api/usb/URB.rst +f:Documentation/driver-api/usb/anchors.rst +f:Documentation/driver-api/usb/bulk-streams.rst +f:Documentation/driver-api/usb/callbacks.rst +f:Documentation/driver-api/usb/dma.rst +f:Documentation/driver-api/usb/dwc3.rst +f:Documentation/driver-api/usb/error-codes.rst +f:Documentation/driver-api/usb/gadget.rst +f:Documentation/driver-api/usb/hotplug.rst +f:Documentation/driver-api/usb/index.rst +f:Documentation/driver-api/usb/persist.rst +f:Documentation/driver-api/usb/power-management.rst +f:Documentation/driver-api/usb/typec.rst +f:Documentation/driver-api/usb/typec_bus.rst +f:Documentation/driver-api/usb/usb.rst +f:Documentation/driver-api/usb/usb3-debug-port.rst +f:Documentation/driver-api/usb/writing_musb_glue_layer.rst +f:Documentation/driver-api/usb/writing_usb_driver.rst +f:Documentation/driver-api/vfio-mediated-device.rst +f:Documentation/driver-api/vfio-pci-device-specific-driver-acceptance.rst +f:Documentation/driver-api/vfio.rst +f:Documentation/driver-api/virtio/index.rst +f:Documentation/driver-api/virtio/virtio.rst +f:Documentation/driver-api/virtio/writing_virtio_drivers.rst +f:Documentation/driver-api/vme.rst +f:Documentation/driver-api/w1.rst +f:Documentation/driver-api/wbrf.rst +f:Documentation/driver-api/wmi.rst +f:Documentation/driver-api/xilinx/eemi.rst +f:Documentation/driver-api/xilinx/index.rst +f:Documentation/driver-api/xillybus.rst +f:Documentation/driver-api/zorro.rst +f:Documentation/edac/features.rst +f:Documentation/edac/index.rst +f:Documentation/edac/memory_repair.rst +f:Documentation/edac/scrub.rst +f:Documentation/fault-injection/fault-injection.rst +f:Documentation/fault-injection/index.rst +f:Documentation/fault-injection/notifier-error-inject.rst +f:Documentation/fault-injection/nvme-fault-injection.rst +f:Documentation/fault-injection/provoke-crashes.rst +f:Documentation/fb/api.rst +f:Documentation/fb/arkfb.rst +f:Documentation/fb/aty128fb.rst +f:Documentation/fb/cirrusfb.rst +f:Documentation/fb/cmap_xfbdev.rst +f:Documentation/fb/deferred_io.rst +f:Documentation/fb/efifb.rst +f:Documentation/fb/ep93xx-fb.rst +f:Documentation/fb/fbcon.rst +f:Documentation/fb/framebuffer.rst +f:Documentation/fb/gxfb.rst +f:Documentation/fb/index.rst +f:Documentation/fb/intel810.rst +f:Documentation/fb/internals.rst +f:Documentation/fb/lxfb.rst +f:Documentation/fb/matroxfb.rst +f:Documentation/fb/metronomefb.rst +f:Documentation/fb/modedb.rst +f:Documentation/fb/pvr2fb.rst +f:Documentation/fb/pxafb.rst +f:Documentation/fb/s3fb.rst +f:Documentation/fb/sa1100fb.rst +f:Documentation/fb/sh7760fb.rst +f:Documentation/fb/sisfb.rst +f:Documentation/fb/sm501.rst +f:Documentation/fb/sm712fb.rst +f:Documentation/fb/sstfb.rst +f:Documentation/fb/tgafb.rst +f:Documentation/fb/tridentfb.rst +f:Documentation/fb/udlfb.rst +f:Documentation/fb/uvesafb.rst +f:Documentation/fb/vesafb.rst +f:Documentation/fb/viafb.modes +f:Documentation/fb/viafb.rst +f:Documentation/fb/vt8623fb.rst +f:Documentation/features/arch-support.txt +f:Documentation/features/core/cBPF-JIT/arch-support.txt +f:Documentation/features/core/eBPF-JIT/arch-support.txt +f:Documentation/features/core/generic-idle-thread/arch-support.txt +f:Documentation/features/core/jump-labels/arch-support.txt +f:Documentation/features/core/mseal_sys_mappings/arch-support.txt +f:Documentation/features/core/thread-info-in-task/arch-support.txt +f:Documentation/features/core/tracehook/arch-support.txt +f:Documentation/features/debug/KASAN/arch-support.txt +f:Documentation/features/debug/debug-vm-pgtable/arch-support.txt +f:Documentation/features/debug/gcov-profile-all/arch-support.txt +f:Documentation/features/debug/kcov/arch-support.txt +f:Documentation/features/debug/kgdb/arch-support.txt +f:Documentation/features/debug/kmemleak/arch-support.txt +f:Documentation/features/debug/kprobes-on-ftrace/arch-support.txt +f:Documentation/features/debug/kprobes/arch-support.txt +f:Documentation/features/debug/kretprobes/arch-support.txt +f:Documentation/features/debug/optprobes/arch-support.txt +f:Documentation/features/debug/stackprotector/arch-support.txt +f:Documentation/features/debug/uprobes/arch-support.txt +f:Documentation/features/debug/user-ret-profiler/arch-support.txt +f:Documentation/features/io/dma-contiguous/arch-support.txt +f:Documentation/features/list-arch.sh +f:Documentation/features/locking/cmpxchg-local/arch-support.txt +f:Documentation/features/locking/lockdep/arch-support.txt +f:Documentation/features/locking/queued-rwlocks/arch-support.txt +f:Documentation/features/locking/queued-spinlocks/arch-support.txt +f:Documentation/features/perf/kprobes-event/arch-support.txt +f:Documentation/features/perf/perf-regs/arch-support.txt +f:Documentation/features/perf/perf-stackdump/arch-support.txt +f:Documentation/features/sched/membarrier-sync-core/arch-support.txt +f:Documentation/features/sched/numa-balancing/arch-support.txt +f:Documentation/features/scripts/features-refresh.sh +f:Documentation/features/seccomp/seccomp-filter/arch-support.txt +f:Documentation/features/time/arch-tick-broadcast/arch-support.txt +f:Documentation/features/time/clockevents/arch-support.txt +f:Documentation/features/time/context-tracking/arch-support.txt +f:Documentation/features/time/irq-time-acct/arch-support.txt +f:Documentation/features/time/virt-cpuacct/arch-support.txt +f:Documentation/features/vm/ELF-ASLR/arch-support.txt +f:Documentation/features/vm/THP/arch-support.txt +f:Documentation/features/vm/TLB/arch-support.txt +f:Documentation/features/vm/huge-vmap/arch-support.txt +f:Documentation/features/vm/ioremap_prot/arch-support.txt +f:Documentation/features/vm/pte_special/arch-support.txt +f:Documentation/filesystems/9p.rst +f:Documentation/filesystems/adfs.rst +f:Documentation/filesystems/affs.rst +f:Documentation/filesystems/afs.rst +f:Documentation/filesystems/api-summary.rst +f:Documentation/filesystems/autofs-mount-control.rst +f:Documentation/filesystems/autofs.rst +f:Documentation/filesystems/automount-support.rst +f:Documentation/filesystems/bcachefs/CodingStyle.rst +f:Documentation/filesystems/bcachefs/SubmittingPatches.rst +f:Documentation/filesystems/bcachefs/casefolding.rst +f:Documentation/filesystems/bcachefs/errorcodes.rst +f:Documentation/filesystems/bcachefs/future/idle_work.rst +f:Documentation/filesystems/bcachefs/index.rst +f:Documentation/filesystems/befs.rst +f:Documentation/filesystems/bfs.rst +f:Documentation/filesystems/btrfs.rst +f:Documentation/filesystems/buffer.rst +f:Documentation/filesystems/caching/backend-api.rst +f:Documentation/filesystems/caching/cachefiles.rst +f:Documentation/filesystems/caching/fscache.rst +f:Documentation/filesystems/caching/index.rst +f:Documentation/filesystems/caching/netfs-api.rst +f:Documentation/filesystems/ceph.rst +f:Documentation/filesystems/coda.rst +f:Documentation/filesystems/configfs.rst +f:Documentation/filesystems/cramfs.rst +f:Documentation/filesystems/dax.rst +f:Documentation/filesystems/debugfs.rst +f:Documentation/filesystems/devpts.rst +f:Documentation/filesystems/directory-locking.rst +f:Documentation/filesystems/dlmfs.rst +f:Documentation/filesystems/dnotify.rst +f:Documentation/filesystems/ecryptfs.rst +f:Documentation/filesystems/efivarfs.rst +f:Documentation/filesystems/erofs.rst +f:Documentation/filesystems/ext2.rst +f:Documentation/filesystems/ext3.rst +f:Documentation/filesystems/ext4/about.rst +f:Documentation/filesystems/ext4/allocators.rst +f:Documentation/filesystems/ext4/atomic_writes.rst +f:Documentation/filesystems/ext4/attributes.rst +f:Documentation/filesystems/ext4/bigalloc.rst +f:Documentation/filesystems/ext4/bitmaps.rst +f:Documentation/filesystems/ext4/blockgroup.rst +f:Documentation/filesystems/ext4/blockmap.rst +f:Documentation/filesystems/ext4/blocks.rst +f:Documentation/filesystems/ext4/checksums.rst +f:Documentation/filesystems/ext4/directory.rst +f:Documentation/filesystems/ext4/dynamic.rst +f:Documentation/filesystems/ext4/eainode.rst +f:Documentation/filesystems/ext4/globals.rst +f:Documentation/filesystems/ext4/group_descr.rst +f:Documentation/filesystems/ext4/ifork.rst +f:Documentation/filesystems/ext4/index.rst +f:Documentation/filesystems/ext4/inlinedata.rst +f:Documentation/filesystems/ext4/inode_table.rst +f:Documentation/filesystems/ext4/inodes.rst +f:Documentation/filesystems/ext4/journal.rst +f:Documentation/filesystems/ext4/mmp.rst +f:Documentation/filesystems/ext4/orphan.rst +f:Documentation/filesystems/ext4/overview.rst +f:Documentation/filesystems/ext4/special_inodes.rst +f:Documentation/filesystems/ext4/super.rst +f:Documentation/filesystems/ext4/verity.rst +f:Documentation/filesystems/f2fs.rst +f:Documentation/filesystems/fiemap.rst +f:Documentation/filesystems/files.rst +f:Documentation/filesystems/fscrypt.rst +f:Documentation/filesystems/fsverity.rst +f:Documentation/filesystems/fuse-io-uring.rst +f:Documentation/filesystems/fuse-io.rst +f:Documentation/filesystems/fuse-passthrough.rst +f:Documentation/filesystems/fuse.rst +f:Documentation/filesystems/gfs2-glocks.rst +f:Documentation/filesystems/gfs2-uevents.rst +f:Documentation/filesystems/gfs2.rst +f:Documentation/filesystems/hfs.rst +f:Documentation/filesystems/hfsplus.rst +f:Documentation/filesystems/hpfs.rst +f:Documentation/filesystems/idmappings.rst +f:Documentation/filesystems/index.rst +f:Documentation/filesystems/inotify.rst +f:Documentation/filesystems/iomap/design.rst +f:Documentation/filesystems/iomap/index.rst +f:Documentation/filesystems/iomap/operations.rst +f:Documentation/filesystems/iomap/porting.rst +f:Documentation/filesystems/isofs.rst +f:Documentation/filesystems/journalling.rst +f:Documentation/filesystems/locking.rst +f:Documentation/filesystems/locks.rst +f:Documentation/filesystems/mount_api.rst +f:Documentation/filesystems/multigrain-ts.rst +f:Documentation/filesystems/netfs_library.rst +f:Documentation/filesystems/nfs/client-identifier.rst +f:Documentation/filesystems/nfs/exporting.rst +f:Documentation/filesystems/nfs/index.rst +f:Documentation/filesystems/nfs/knfsd-stats.rst +f:Documentation/filesystems/nfs/localio.rst +f:Documentation/filesystems/nfs/nfs41-server.rst +f:Documentation/filesystems/nfs/pnfs.rst +f:Documentation/filesystems/nfs/reexport.rst +f:Documentation/filesystems/nfs/rpc-cache.rst +f:Documentation/filesystems/nfs/rpc-server-gss.rst +f:Documentation/filesystems/nilfs2.rst +f:Documentation/filesystems/ntfs3.rst +f:Documentation/filesystems/ocfs2-online-filecheck.rst +f:Documentation/filesystems/ocfs2.rst +f:Documentation/filesystems/omfs.rst +f:Documentation/filesystems/orangefs.rst +f:Documentation/filesystems/overlayfs.rst +f:Documentation/filesystems/path-lookup.rst +f:Documentation/filesystems/path-lookup.txt +f:Documentation/filesystems/porting.rst +f:Documentation/filesystems/proc.rst +f:Documentation/filesystems/propagate_umount.txt +f:Documentation/filesystems/qnx6.rst +f:Documentation/filesystems/quota.rst +f:Documentation/filesystems/ramfs-rootfs-initramfs.rst +f:Documentation/filesystems/relay.rst +f:Documentation/filesystems/resctrl.rst +f:Documentation/filesystems/romfs.rst +f:Documentation/filesystems/seq_file.rst +f:Documentation/filesystems/sharedsubtree.rst +f:Documentation/filesystems/smb/cifsroot.rst +f:Documentation/filesystems/smb/index.rst +f:Documentation/filesystems/smb/ksmbd.rst +f:Documentation/filesystems/smb/smbdirect.rst +f:Documentation/filesystems/splice.rst +f:Documentation/filesystems/spufs/index.rst +f:Documentation/filesystems/spufs/spu_create.rst +f:Documentation/filesystems/spufs/spu_run.rst +f:Documentation/filesystems/spufs/spufs.rst +f:Documentation/filesystems/squashfs.rst +f:Documentation/filesystems/sysfs.rst +f:Documentation/filesystems/tmpfs.rst +f:Documentation/filesystems/ubifs-authentication.rst +f:Documentation/filesystems/ubifs.rst +f:Documentation/filesystems/udf.rst +f:Documentation/filesystems/vfat.rst +f:Documentation/filesystems/vfs.rst +f:Documentation/filesystems/virtiofs.rst +f:Documentation/filesystems/xfs/index.rst +f:Documentation/filesystems/xfs/xfs-delayed-logging-design.rst +f:Documentation/filesystems/xfs/xfs-maintainer-entry-profile.rst +f:Documentation/filesystems/xfs/xfs-online-fsck-design.rst +f:Documentation/filesystems/xfs/xfs-self-describing-metadata.rst +f:Documentation/filesystems/zonefs.rst +f:Documentation/firmware-guide/acpi/DSD-properties-rules.rst +f:Documentation/firmware-guide/acpi/acpi-lid.rst +f:Documentation/firmware-guide/acpi/aml-debugger.rst +f:Documentation/firmware-guide/acpi/apei/einj.rst +f:Documentation/firmware-guide/acpi/apei/output_format.rst +f:Documentation/firmware-guide/acpi/chromeos-acpi-device.rst +f:Documentation/firmware-guide/acpi/debug.rst +f:Documentation/firmware-guide/acpi/dsd/data-node-references.rst +f:Documentation/firmware-guide/acpi/dsd/graph.rst +f:Documentation/firmware-guide/acpi/dsd/leds.rst +f:Documentation/firmware-guide/acpi/dsd/phy.rst +f:Documentation/firmware-guide/acpi/enumeration.rst +f:Documentation/firmware-guide/acpi/extcon-intel-int3496.rst +f:Documentation/firmware-guide/acpi/gpio-properties.rst +f:Documentation/firmware-guide/acpi/i2c-muxes.rst +f:Documentation/firmware-guide/acpi/index.rst +f:Documentation/firmware-guide/acpi/intel-pmc-mux.rst +f:Documentation/firmware-guide/acpi/lpit.rst +f:Documentation/firmware-guide/acpi/method-tracing.rst +f:Documentation/firmware-guide/acpi/namespace.rst +f:Documentation/firmware-guide/acpi/non-d0-probe.rst +f:Documentation/firmware-guide/acpi/osi.rst +f:Documentation/firmware-guide/acpi/video_extension.rst +f:Documentation/firmware-guide/index.rst +f:Documentation/firmware_class/hotplug-script +f:Documentation/fpga/dfl.rst +f:Documentation/fpga/index.rst +f:Documentation/gpu/afbc.rst +f:Documentation/gpu/amdgpu/amd-hardware-list-info.rst +f:Documentation/gpu/amdgpu/amdgpu-glossary.rst +f:Documentation/gpu/amdgpu/apu-asic-info-table.csv +f:Documentation/gpu/amdgpu/debugfs.rst +f:Documentation/gpu/amdgpu/debugging.rst +f:Documentation/gpu/amdgpu/dgpu-asic-info-table.csv +f:Documentation/gpu/amdgpu/display/config_example.svg +f:Documentation/gpu/amdgpu/display/dc-arch-overview.svg +f:Documentation/gpu/amdgpu/display/dc-components.svg +f:Documentation/gpu/amdgpu/display/dc-debug.rst +f:Documentation/gpu/amdgpu/display/dc-glossary.rst +f:Documentation/gpu/amdgpu/display/dc_pipeline_overview.svg +f:Documentation/gpu/amdgpu/display/dcn-blocks.rst +f:Documentation/gpu/amdgpu/display/dcn-overview.rst +f:Documentation/gpu/amdgpu/display/dcn2_cm_drm_current.svg +f:Documentation/gpu/amdgpu/display/dcn3_cm_drm_current.svg +f:Documentation/gpu/amdgpu/display/display-contributing.rst +f:Documentation/gpu/amdgpu/display/display-manager.rst +f:Documentation/gpu/amdgpu/display/global_sync_vblank.svg +f:Documentation/gpu/amdgpu/display/index.rst +f:Documentation/gpu/amdgpu/display/mpo-cursor.svg +f:Documentation/gpu/amdgpu/display/mpo-overview.rst +f:Documentation/gpu/amdgpu/display/multi-display-hdcp-mpo-less-pipe-ex.svg +f:Documentation/gpu/amdgpu/display/multi-display-hdcp-mpo.svg +f:Documentation/gpu/amdgpu/display/pipeline_4k_no_split.svg +f:Documentation/gpu/amdgpu/display/pipeline_4k_split.svg +f:Documentation/gpu/amdgpu/display/programming-model-dcn.rst +f:Documentation/gpu/amdgpu/display/single-display-mpo-multi-video.svg +f:Documentation/gpu/amdgpu/display/single-display-mpo.svg +f:Documentation/gpu/amdgpu/display/trace-groups-table.csv +f:Documentation/gpu/amdgpu/driver-core.rst +f:Documentation/gpu/amdgpu/driver-misc.rst +f:Documentation/gpu/amdgpu/flashing.rst +f:Documentation/gpu/amdgpu/gc/index.rst +f:Documentation/gpu/amdgpu/gc/mes.rst +f:Documentation/gpu/amdgpu/index.rst +f:Documentation/gpu/amdgpu/module-parameters.rst +f:Documentation/gpu/amdgpu/pipe_and_queue_abstraction.svg +f:Documentation/gpu/amdgpu/process-isolation.rst +f:Documentation/gpu/amdgpu/ras.rst +f:Documentation/gpu/amdgpu/thermal.rst +f:Documentation/gpu/amdgpu/xgmi.rst +f:Documentation/gpu/automated_testing.rst +f:Documentation/gpu/backlight.rst +f:Documentation/gpu/bridge/dw-hdmi.rst +f:Documentation/gpu/dp-mst/topology-figure-1.dot +f:Documentation/gpu/dp-mst/topology-figure-2.dot +f:Documentation/gpu/dp-mst/topology-figure-3.dot +f:Documentation/gpu/driver-uapi.rst +f:Documentation/gpu/drivers.rst +f:Documentation/gpu/drm-client.rst +f:Documentation/gpu/drm-compute.rst +f:Documentation/gpu/drm-internals.rst +f:Documentation/gpu/drm-kms-helpers.rst +f:Documentation/gpu/drm-kms.rst +f:Documentation/gpu/drm-mm.rst +f:Documentation/gpu/drm-uapi.rst +f:Documentation/gpu/drm-usage-stats.rst +f:Documentation/gpu/drm-vm-bind-async.rst +f:Documentation/gpu/drm-vm-bind-locking.rst +f:Documentation/gpu/i915.rst +f:Documentation/gpu/imagination/index.rst +f:Documentation/gpu/imagination/uapi.rst +f:Documentation/gpu/implementation_guidelines.rst +f:Documentation/gpu/index.rst +f:Documentation/gpu/introduction.rst +f:Documentation/gpu/kms-properties.csv +f:Documentation/gpu/komeda-kms.rst +f:Documentation/gpu/mcde.rst +f:Documentation/gpu/meson.rst +f:Documentation/gpu/msm-crash-dump.rst +f:Documentation/gpu/msm-preemption.rst +f:Documentation/gpu/nouveau.rst +f:Documentation/gpu/nova/core/devinit.rst +f:Documentation/gpu/nova/core/falcon.rst +f:Documentation/gpu/nova/core/fwsec.rst +f:Documentation/gpu/nova/core/guidelines.rst +f:Documentation/gpu/nova/core/todo.rst +f:Documentation/gpu/nova/core/vbios.rst +f:Documentation/gpu/nova/guidelines.rst +f:Documentation/gpu/nova/index.rst +f:Documentation/gpu/panfrost.rst +f:Documentation/gpu/panthor.rst +f:Documentation/gpu/pl111.rst +f:Documentation/gpu/rfc/gpusvm.rst +f:Documentation/gpu/rfc/i915_gem_lmem.rst +f:Documentation/gpu/rfc/i915_scheduler.rst +f:Documentation/gpu/rfc/i915_small_bar.h +f:Documentation/gpu/rfc/i915_small_bar.rst +f:Documentation/gpu/rfc/i915_vm_bind.h +f:Documentation/gpu/rfc/i915_vm_bind.rst +f:Documentation/gpu/rfc/index.rst +f:Documentation/gpu/tegra.rst +f:Documentation/gpu/todo.rst +f:Documentation/gpu/tve200.rst +f:Documentation/gpu/v3d.rst +f:Documentation/gpu/vc4.rst +f:Documentation/gpu/vga-switcheroo.rst +f:Documentation/gpu/vgaarbiter.rst +f:Documentation/gpu/vkms.rst +f:Documentation/gpu/xe/index.rst +f:Documentation/gpu/xe/xe-drm-usage-stats.rst +f:Documentation/gpu/xe/xe_configfs.rst +f:Documentation/gpu/xe/xe_cs.rst +f:Documentation/gpu/xe/xe_debugging.rst +f:Documentation/gpu/xe/xe_devcoredump.rst +f:Documentation/gpu/xe/xe_firmware.rst +f:Documentation/gpu/xe/xe_gt_freq.rst +f:Documentation/gpu/xe/xe_gt_mcr.rst +f:Documentation/gpu/xe/xe_map.rst +f:Documentation/gpu/xe/xe_migrate.rst +f:Documentation/gpu/xe/xe_mm.rst +f:Documentation/gpu/xe/xe_pcode.rst +f:Documentation/gpu/xe/xe_pm.rst +f:Documentation/gpu/xe/xe_rtp.rst +f:Documentation/gpu/xe/xe_tile.rst +f:Documentation/gpu/xe/xe_wa.rst +f:Documentation/gpu/xen-front.rst +f:Documentation/gpu/zynqmp.rst +f:Documentation/hid/amd-sfh-hid.rst +f:Documentation/hid/hid-alps.rst +f:Documentation/hid/hid-bpf.rst +f:Documentation/hid/hid-sensor.rst +f:Documentation/hid/hid-transport.rst +f:Documentation/hid/hiddev.rst +f:Documentation/hid/hidintro.rst +f:Documentation/hid/hidraw.rst +f:Documentation/hid/hidreport-parsing.rst +f:Documentation/hid/index.rst +f:Documentation/hid/intel-ish-hid.rst +f:Documentation/hid/intel-thc-hid.rst +f:Documentation/hid/uhid.rst +f:Documentation/hwmon/abituguru-datasheet.rst +f:Documentation/hwmon/abituguru.rst +f:Documentation/hwmon/abituguru3.rst +f:Documentation/hwmon/acbel-fsg032.rst +f:Documentation/hwmon/acpi_power_meter.rst +f:Documentation/hwmon/ad7314.rst +f:Documentation/hwmon/adc128d818.rst +f:Documentation/hwmon/adm1025.rst +f:Documentation/hwmon/adm1026.rst +f:Documentation/hwmon/adm1031.rst +f:Documentation/hwmon/adm1177.rst +f:Documentation/hwmon/adm1266.rst +f:Documentation/hwmon/adm1275.rst +f:Documentation/hwmon/adm9240.rst +f:Documentation/hwmon/adp1050.rst +f:Documentation/hwmon/ads7828.rst +f:Documentation/hwmon/adt7410.rst +f:Documentation/hwmon/adt7411.rst +f:Documentation/hwmon/adt7462.rst +f:Documentation/hwmon/adt7470.rst +f:Documentation/hwmon/adt7475.rst +f:Documentation/hwmon/aht10.rst +f:Documentation/hwmon/amc6821.rst +f:Documentation/hwmon/aquacomputer_d5next.rst +f:Documentation/hwmon/asb100.rst +f:Documentation/hwmon/asc7621.rst +f:Documentation/hwmon/aspeed-g6-pwm-tach.rst +f:Documentation/hwmon/aspeed-pwm-tacho.rst +f:Documentation/hwmon/asus_ec_sensors.rst +f:Documentation/hwmon/asus_rog_ryujin.rst +f:Documentation/hwmon/asus_wmi_sensors.rst +f:Documentation/hwmon/bcm54140.rst +f:Documentation/hwmon/bel-pfe.rst +f:Documentation/hwmon/bpa-rs600.rst +f:Documentation/hwmon/bt1-pvt.rst +f:Documentation/hwmon/cgbc-hwmon.rst +f:Documentation/hwmon/chipcap2.rst +f:Documentation/hwmon/coretemp.rst +f:Documentation/hwmon/corsair-cpro.rst +f:Documentation/hwmon/corsair-psu.rst +f:Documentation/hwmon/cros_ec_hwmon.rst +f:Documentation/hwmon/crps.rst +f:Documentation/hwmon/da9052.rst +f:Documentation/hwmon/da9055.rst +f:Documentation/hwmon/dell-smm-hwmon.rst +f:Documentation/hwmon/dme1737.rst +f:Documentation/hwmon/dps920ab.rst +f:Documentation/hwmon/drivetemp.rst +f:Documentation/hwmon/ds1621.rst +f:Documentation/hwmon/ds620.rst +f:Documentation/hwmon/emc1403.rst +f:Documentation/hwmon/emc2103.rst +f:Documentation/hwmon/emc2305.rst +f:Documentation/hwmon/emc6w201.rst +f:Documentation/hwmon/f71805f.rst +f:Documentation/hwmon/f71882fg.rst +f:Documentation/hwmon/fam15h_power.rst +f:Documentation/hwmon/fsp-3y.rst +f:Documentation/hwmon/ftsteutates.rst +f:Documentation/hwmon/g760a.rst +f:Documentation/hwmon/g762.rst +f:Documentation/hwmon/gigabyte_waterforce.rst +f:Documentation/hwmon/gl518sm.rst +f:Documentation/hwmon/gsc-hwmon.rst +f:Documentation/hwmon/gxp-fan-ctrl.rst +f:Documentation/hwmon/hih6130.rst +f:Documentation/hwmon/hp-wmi-sensors.rst +f:Documentation/hwmon/hs3001.rst +f:Documentation/hwmon/htu31.rst +f:Documentation/hwmon/hwmon-kernel-api.rst +f:Documentation/hwmon/ibm-cffps.rst +f:Documentation/hwmon/ibmaem.rst +f:Documentation/hwmon/ibmpowernv.rst +f:Documentation/hwmon/ina209.rst +f:Documentation/hwmon/ina233.rst +f:Documentation/hwmon/ina238.rst +f:Documentation/hwmon/ina2xx.rst +f:Documentation/hwmon/ina3221.rst +f:Documentation/hwmon/index.rst +f:Documentation/hwmon/inspur-ipsps1.rst +f:Documentation/hwmon/intel-m10-bmc-hwmon.rst +f:Documentation/hwmon/ir35221.rst +f:Documentation/hwmon/ir36021.rst +f:Documentation/hwmon/ir38064.rst +f:Documentation/hwmon/isl28022.rst +f:Documentation/hwmon/isl68137.rst +f:Documentation/hwmon/it87.rst +f:Documentation/hwmon/jc42.rst +f:Documentation/hwmon/k10temp.rst +f:Documentation/hwmon/k8temp.rst +f:Documentation/hwmon/kbatt.rst +f:Documentation/hwmon/kfan.rst +f:Documentation/hwmon/lan966x.rst +f:Documentation/hwmon/lineage-pem.rst +f:Documentation/hwmon/lm25066.rst +f:Documentation/hwmon/lm63.rst +f:Documentation/hwmon/lm70.rst +f:Documentation/hwmon/lm73.rst +f:Documentation/hwmon/lm75.rst +f:Documentation/hwmon/lm77.rst +f:Documentation/hwmon/lm78.rst +f:Documentation/hwmon/lm80.rst +f:Documentation/hwmon/lm83.rst +f:Documentation/hwmon/lm85.rst +f:Documentation/hwmon/lm87.rst +f:Documentation/hwmon/lm90.rst +f:Documentation/hwmon/lm92.rst +f:Documentation/hwmon/lm93.rst +f:Documentation/hwmon/lm95234.rst +f:Documentation/hwmon/lm95245.rst +f:Documentation/hwmon/lochnagar.rst +f:Documentation/hwmon/lt3074.rst +f:Documentation/hwmon/lt7182s.rst +f:Documentation/hwmon/ltc2945.rst +f:Documentation/hwmon/ltc2947.rst +f:Documentation/hwmon/ltc2978.rst +f:Documentation/hwmon/ltc2990.rst +f:Documentation/hwmon/ltc2991.rst +f:Documentation/hwmon/ltc2992.rst +f:Documentation/hwmon/ltc3815.rst +f:Documentation/hwmon/ltc4151.rst +f:Documentation/hwmon/ltc4215.rst +f:Documentation/hwmon/ltc4245.rst +f:Documentation/hwmon/ltc4260.rst +f:Documentation/hwmon/ltc4261.rst +f:Documentation/hwmon/ltc4282.rst +f:Documentation/hwmon/ltc4286.rst +f:Documentation/hwmon/max127.rst +f:Documentation/hwmon/max15301.rst +f:Documentation/hwmon/max16064.rst +f:Documentation/hwmon/max16065.rst +f:Documentation/hwmon/max1619.rst +f:Documentation/hwmon/max16601.rst +f:Documentation/hwmon/max1668.rst +f:Documentation/hwmon/max197.rst +f:Documentation/hwmon/max20730.rst +f:Documentation/hwmon/max20751.rst +f:Documentation/hwmon/max31722.rst +f:Documentation/hwmon/max31730.rst +f:Documentation/hwmon/max31760.rst +f:Documentation/hwmon/max31785.rst +f:Documentation/hwmon/max31790.rst +f:Documentation/hwmon/max31827.rst +f:Documentation/hwmon/max34440.rst +f:Documentation/hwmon/max6620.rst +f:Documentation/hwmon/max6639.rst +f:Documentation/hwmon/max6650.rst +f:Documentation/hwmon/max6697.rst +f:Documentation/hwmon/max77705.rst +f:Documentation/hwmon/max8688.rst +f:Documentation/hwmon/mc13783-adc.rst +f:Documentation/hwmon/mc33xs2410_hwmon.rst +f:Documentation/hwmon/mc34vr500.rst +f:Documentation/hwmon/mcp3021.rst +f:Documentation/hwmon/menf21bmc.rst +f:Documentation/hwmon/mlxreg-fan.rst +f:Documentation/hwmon/mp2856.rst +f:Documentation/hwmon/mp2888.rst +f:Documentation/hwmon/mp2891.rst +f:Documentation/hwmon/mp2975.rst +f:Documentation/hwmon/mp2993.rst +f:Documentation/hwmon/mp5023.rst +f:Documentation/hwmon/mp5920.rst +f:Documentation/hwmon/mp5990.rst +f:Documentation/hwmon/mp9941.rst +f:Documentation/hwmon/mpq8785.rst +f:Documentation/hwmon/nct6683.rst +f:Documentation/hwmon/nct6775.rst +f:Documentation/hwmon/nct7363.rst +f:Documentation/hwmon/nct7802.rst +f:Documentation/hwmon/nct7904.rst +f:Documentation/hwmon/npcm750-pwm-fan.rst +f:Documentation/hwmon/nsa320.rst +f:Documentation/hwmon/ntc_thermistor.rst +f:Documentation/hwmon/nzxt-kraken2.rst +f:Documentation/hwmon/nzxt-kraken3.rst +f:Documentation/hwmon/nzxt-smart2.rst +f:Documentation/hwmon/occ.rst +f:Documentation/hwmon/pc87360.rst +f:Documentation/hwmon/pc87427.rst +f:Documentation/hwmon/pcf8591.rst +f:Documentation/hwmon/peci-cputemp.rst +f:Documentation/hwmon/peci-dimmtemp.rst +f:Documentation/hwmon/pim4328.rst +f:Documentation/hwmon/pli1209bc.rst +f:Documentation/hwmon/pm6764tr.rst +f:Documentation/hwmon/pmbus-core.rst +f:Documentation/hwmon/pmbus.rst +f:Documentation/hwmon/powerz.rst +f:Documentation/hwmon/powr1220.rst +f:Documentation/hwmon/pt5161l.rst +f:Documentation/hwmon/pwm-fan.rst +f:Documentation/hwmon/pxe1610.rst +f:Documentation/hwmon/q54sj108a2.rst +f:Documentation/hwmon/qnap-mcu-hwmon.rst +f:Documentation/hwmon/raspberrypi-hwmon.rst +f:Documentation/hwmon/sbrmi.rst +f:Documentation/hwmon/sbtsi_temp.rst +f:Documentation/hwmon/sch5627.rst +f:Documentation/hwmon/sch5636.rst +f:Documentation/hwmon/scpi-hwmon.rst +f:Documentation/hwmon/sfctemp.rst +f:Documentation/hwmon/sg2042-mcu.rst +f:Documentation/hwmon/sht15.rst +f:Documentation/hwmon/sht21.rst +f:Documentation/hwmon/sht3x.rst +f:Documentation/hwmon/sht4x.rst +f:Documentation/hwmon/shtc1.rst +f:Documentation/hwmon/sis5595.rst +f:Documentation/hwmon/sl28cpld.rst +f:Documentation/hwmon/smpro-hwmon.rst +f:Documentation/hwmon/smsc47b397.rst +f:Documentation/hwmon/smsc47m1.rst +f:Documentation/hwmon/smsc47m192.rst +f:Documentation/hwmon/sparx5-temp.rst +f:Documentation/hwmon/spd5118.rst +f:Documentation/hwmon/stpddc60.rst +f:Documentation/hwmon/submitting-patches.rst +f:Documentation/hwmon/surface_fan.rst +f:Documentation/hwmon/sy7636a-hwmon.rst +f:Documentation/hwmon/sysfs-interface.rst +f:Documentation/hwmon/tc654.rst +f:Documentation/hwmon/tc74.rst +f:Documentation/hwmon/thmc50.rst +f:Documentation/hwmon/tmp102.rst +f:Documentation/hwmon/tmp103.rst +f:Documentation/hwmon/tmp108.rst +f:Documentation/hwmon/tmp401.rst +f:Documentation/hwmon/tmp421.rst +f:Documentation/hwmon/tmp464.rst +f:Documentation/hwmon/tmp513.rst +f:Documentation/hwmon/tps23861.rst +f:Documentation/hwmon/tps25990.rst +f:Documentation/hwmon/tps40422.rst +f:Documentation/hwmon/tps53679.rst +f:Documentation/hwmon/tps546d24.rst +f:Documentation/hwmon/twl4030-madc-hwmon.rst +f:Documentation/hwmon/ucd9000.rst +f:Documentation/hwmon/ucd9200.rst +f:Documentation/hwmon/userspace-tools.rst +f:Documentation/hwmon/vexpress.rst +f:Documentation/hwmon/via686a.rst +f:Documentation/hwmon/vt1211.rst +f:Documentation/hwmon/w83627ehf.rst +f:Documentation/hwmon/w83627hf.rst +f:Documentation/hwmon/w83773g.rst +f:Documentation/hwmon/w83781d.rst +f:Documentation/hwmon/w83791d.rst +f:Documentation/hwmon/w83792d.rst +f:Documentation/hwmon/w83793.rst +f:Documentation/hwmon/w83795.rst +f:Documentation/hwmon/w83l785ts.rst +f:Documentation/hwmon/w83l786ng.rst +f:Documentation/hwmon/wm831x.rst +f:Documentation/hwmon/wm8350.rst +f:Documentation/hwmon/xdp710.rst +f:Documentation/hwmon/xdpe12284.rst +f:Documentation/hwmon/xdpe152c4.rst +f:Documentation/hwmon/xgene-hwmon.rst +f:Documentation/hwmon/zl6100.rst +f:Documentation/i2c/busses/i2c-ali1535.rst +f:Documentation/i2c/busses/i2c-ali1563.rst +f:Documentation/i2c/busses/i2c-ali15x3.rst +f:Documentation/i2c/busses/i2c-amd-mp2.rst +f:Documentation/i2c/busses/i2c-amd756.rst +f:Documentation/i2c/busses/i2c-amd8111.rst +f:Documentation/i2c/busses/i2c-diolan-u2c.rst +f:Documentation/i2c/busses/i2c-i801.rst +f:Documentation/i2c/busses/i2c-ismt.rst +f:Documentation/i2c/busses/i2c-mlxcpld.rst +f:Documentation/i2c/busses/i2c-nforce2.rst +f:Documentation/i2c/busses/i2c-nvidia-gpu.rst +f:Documentation/i2c/busses/i2c-ocores.rst +f:Documentation/i2c/busses/i2c-parport.rst +f:Documentation/i2c/busses/i2c-pca-isa.rst +f:Documentation/i2c/busses/i2c-piix4.rst +f:Documentation/i2c/busses/i2c-sis5595.rst +f:Documentation/i2c/busses/i2c-sis630.rst +f:Documentation/i2c/busses/i2c-sis96x.rst +f:Documentation/i2c/busses/i2c-taos-evm.rst +f:Documentation/i2c/busses/i2c-via.rst +f:Documentation/i2c/busses/i2c-viapro.rst +f:Documentation/i2c/busses/index.rst +f:Documentation/i2c/busses/scx200_acb.rst +f:Documentation/i2c/dev-interface.rst +f:Documentation/i2c/dma-considerations.rst +f:Documentation/i2c/fault-codes.rst +f:Documentation/i2c/functionality.rst +f:Documentation/i2c/gpio-fault-injection.rst +f:Documentation/i2c/i2c-address-translators.rst +f:Documentation/i2c/i2c-protocol.rst +f:Documentation/i2c/i2c-stub.rst +f:Documentation/i2c/i2c-sysfs.rst +f:Documentation/i2c/i2c-topology.rst +f:Documentation/i2c/i2c_bus.svg +f:Documentation/i2c/index.rst +f:Documentation/i2c/instantiating-devices.rst +f:Documentation/i2c/muxes/i2c-mux-gpio.rst +f:Documentation/i2c/old-module-parameters.rst +f:Documentation/i2c/slave-eeprom-backend.rst +f:Documentation/i2c/slave-interface.rst +f:Documentation/i2c/slave-testunit-backend.rst +f:Documentation/i2c/smbus-protocol.rst +f:Documentation/i2c/summary.rst +f:Documentation/i2c/ten-bit-addresses.rst +f:Documentation/i2c/writing-clients.rst +f:Documentation/iio/ad3552r.rst +f:Documentation/iio/ad4000.rst +f:Documentation/iio/ad4030.rst +f:Documentation/iio/ad4695.rst +f:Documentation/iio/ad7191.rst +f:Documentation/iio/ad7380.rst +f:Documentation/iio/ad7606.rst +f:Documentation/iio/ad7625.rst +f:Documentation/iio/ad7944.rst +f:Documentation/iio/adis16475.rst +f:Documentation/iio/adis16480.rst +f:Documentation/iio/adis16550.rst +f:Documentation/iio/adxl313.rst +f:Documentation/iio/adxl380.rst +f:Documentation/iio/bno055.rst +f:Documentation/iio/ep93xx_adc.rst +f:Documentation/iio/iio_adc.rst +f:Documentation/iio/iio_configfs.rst +f:Documentation/iio/iio_devbuf.rst +f:Documentation/iio/iio_dmabuf_api.rst +f:Documentation/iio/iio_tools.rst +f:Documentation/iio/index.rst +f:Documentation/iio/opt4060.rst +f:Documentation/images/COPYING-logo +f:Documentation/images/logo.gif +f:Documentation/images/logo.svg +f:Documentation/index.rst +f:Documentation/infiniband/core_locking.rst +f:Documentation/infiniband/index.rst +f:Documentation/infiniband/ipoib.rst +f:Documentation/infiniband/opa_vnic.rst +f:Documentation/infiniband/sysfs.rst +f:Documentation/infiniband/tag_matching.rst +f:Documentation/infiniband/ucaps.rst +f:Documentation/infiniband/user_mad.rst +f:Documentation/infiniband/user_verbs.rst +f:Documentation/input/devices/alps.rst +f:Documentation/input/devices/amijoy.rst +f:Documentation/input/devices/appletouch.rst +f:Documentation/input/devices/atarikbd.rst +f:Documentation/input/devices/bcm5974.rst +f:Documentation/input/devices/cma3000_d0x.rst +f:Documentation/input/devices/cs461x.rst +f:Documentation/input/devices/edt-ft5x06.rst +f:Documentation/input/devices/elantech.rst +f:Documentation/input/devices/iforce-protocol.rst +f:Documentation/input/devices/index.rst +f:Documentation/input/devices/joystick-parport.rst +f:Documentation/input/devices/ntrig.rst +f:Documentation/input/devices/pxrc.rst +f:Documentation/input/devices/rotary-encoder.rst +f:Documentation/input/devices/sentelic.rst +f:Documentation/input/devices/walkera0701.rst +f:Documentation/input/devices/xpad.rst +f:Documentation/input/devices/yealink.rst +f:Documentation/input/event-codes.rst +f:Documentation/input/ff.rst +f:Documentation/input/gamepad.rst +f:Documentation/input/gameport-programming.rst +f:Documentation/input/index.rst +f:Documentation/input/input-programming.rst +f:Documentation/input/input.rst +f:Documentation/input/input_kapi.rst +f:Documentation/input/input_uapi.rst +f:Documentation/input/interactive.svg +f:Documentation/input/joydev/index.rst +f:Documentation/input/joydev/joystick-api.rst +f:Documentation/input/joydev/joystick.rst +f:Documentation/input/multi-touch-protocol.rst +f:Documentation/input/notifier.rst +f:Documentation/input/shape.svg +f:Documentation/input/uinput.rst +f:Documentation/input/userio.rst +f:Documentation/isdn/credits.rst +f:Documentation/isdn/index.rst +f:Documentation/isdn/interface_capi.rst +f:Documentation/isdn/m_isdn.rst +f:Documentation/kbuild/Kconfig.recursion-issue-01 +f:Documentation/kbuild/Kconfig.recursion-issue-02 +f:Documentation/kbuild/Kconfig.select-break +f:Documentation/kbuild/bash-completion.rst +f:Documentation/kbuild/gcc-plugins.rst +f:Documentation/kbuild/gendwarfksyms.rst +f:Documentation/kbuild/headers_install.rst +f:Documentation/kbuild/index.rst +f:Documentation/kbuild/issues.rst +f:Documentation/kbuild/kbuild.rst +f:Documentation/kbuild/kconfig-language.rst +f:Documentation/kbuild/kconfig-macro-language.rst +f:Documentation/kbuild/kconfig.rst +f:Documentation/kbuild/llvm.rst +f:Documentation/kbuild/makefiles.rst +f:Documentation/kbuild/modules.rst +f:Documentation/kbuild/reproducible-builds.rst +f:Documentation/kernel-hacking/false-sharing.rst +f:Documentation/kernel-hacking/hacking.rst +f:Documentation/kernel-hacking/index.rst +f:Documentation/kernel-hacking/locking.rst +f:Documentation/leds/index.rst +f:Documentation/leds/leds-blinkm.rst +f:Documentation/leds/leds-cht-wcove.rst +f:Documentation/leds/leds-class-flash.rst +f:Documentation/leds/leds-class-multicolor.rst +f:Documentation/leds/leds-class.rst +f:Documentation/leds/leds-el15203000.rst +f:Documentation/leds/leds-lm3556.rst +f:Documentation/leds/leds-lp3944.rst +f:Documentation/leds/leds-lp5521.rst +f:Documentation/leds/leds-lp5523.rst +f:Documentation/leds/leds-lp5562.rst +f:Documentation/leds/leds-lp55xx.rst +f:Documentation/leds/leds-mlxcpld.rst +f:Documentation/leds/leds-mt6370-rgb.rst +f:Documentation/leds/leds-qcom-lpg.rst +f:Documentation/leds/leds-sc27xx.rst +f:Documentation/leds/leds-st1202.rst +f:Documentation/leds/ledtrig-oneshot.rst +f:Documentation/leds/ledtrig-transient.rst +f:Documentation/leds/ledtrig-usbport.rst +f:Documentation/leds/uleds.rst +f:Documentation/leds/well-known-leds.txt +f:Documentation/litmus-tests/README +f:Documentation/litmus-tests/atomic/Atomic-RMW+mb__after_atomic-is-stronger-than-acquire.litmus +f:Documentation/litmus-tests/atomic/Atomic-RMW-ops-are-atomic-WRT-atomic_set.litmus +f:Documentation/litmus-tests/atomic/cmpxchg-fail-ordered-1.litmus +f:Documentation/litmus-tests/atomic/cmpxchg-fail-ordered-2.litmus +f:Documentation/litmus-tests/atomic/cmpxchg-fail-unordered-1.litmus +f:Documentation/litmus-tests/atomic/cmpxchg-fail-unordered-2.litmus +f:Documentation/litmus-tests/locking/DCL-broken.litmus +f:Documentation/litmus-tests/locking/DCL-fixed.litmus +f:Documentation/litmus-tests/locking/RM-broken.litmus +f:Documentation/litmus-tests/locking/RM-fixed.litmus +f:Documentation/litmus-tests/rcu/RCU+sync+free.litmus +f:Documentation/litmus-tests/rcu/RCU+sync+read.litmus +f:Documentation/livepatch/api.rst +f:Documentation/livepatch/callbacks.rst +f:Documentation/livepatch/cumulative-patches.rst +f:Documentation/livepatch/index.rst +f:Documentation/livepatch/livepatch.rst +f:Documentation/livepatch/module-elf-format.rst +f:Documentation/livepatch/reliable-stacktrace.rst +f:Documentation/livepatch/shadow-vars.rst +f:Documentation/livepatch/system-state.rst +f:Documentation/locking/futex-requeue-pi.rst +f:Documentation/locking/hwspinlock.rst +f:Documentation/locking/index.rst +f:Documentation/locking/lockdep-design.rst +f:Documentation/locking/lockstat.rst +f:Documentation/locking/locktorture.rst +f:Documentation/locking/locktypes.rst +f:Documentation/locking/mutex-design.rst +f:Documentation/locking/percpu-rw-semaphore.rst +f:Documentation/locking/pi-futex.rst +f:Documentation/locking/preempt-locking.rst +f:Documentation/locking/robust-futex-ABI.rst +f:Documentation/locking/robust-futexes.rst +f:Documentation/locking/rt-mutex-design.rst +f:Documentation/locking/rt-mutex.rst +f:Documentation/locking/seqlock.rst +f:Documentation/locking/spinlocks.rst +f:Documentation/locking/ww-mutex-design.rst +f:Documentation/maintainer/configure-git.rst +f:Documentation/maintainer/feature-and-driver-maintainers.rst +f:Documentation/maintainer/index.rst +f:Documentation/maintainer/maintainer-entry-profile.rst +f:Documentation/maintainer/messy-diffstat.rst +f:Documentation/maintainer/modifying-patches.rst +f:Documentation/maintainer/pull-requests.rst +f:Documentation/maintainer/rebasing-and-merging.rst +f:Documentation/memory-barriers.txt +f:Documentation/mhi/index.rst +f:Documentation/mhi/mhi.rst +f:Documentation/mhi/topology.rst +f:Documentation/misc-devices/ad525x_dpot.rst +f:Documentation/misc-devices/amd-sbi.rst +f:Documentation/misc-devices/apds990x.rst +f:Documentation/misc-devices/bh1770glc.rst +f:Documentation/misc-devices/c2port.rst +f:Documentation/misc-devices/dw-xdata-pcie.rst +f:Documentation/misc-devices/ibmvmc.rst +f:Documentation/misc-devices/ics932s401.rst +f:Documentation/misc-devices/index.rst +f:Documentation/misc-devices/isl29003.rst +f:Documentation/misc-devices/lis3lv02d.rst +f:Documentation/misc-devices/max6875.rst +f:Documentation/misc-devices/mrvl_cn10k_dpi.rst +f:Documentation/misc-devices/oxsemi-tornado.rst +f:Documentation/misc-devices/pci-endpoint-test.rst +f:Documentation/misc-devices/spear-pcie-gadget.rst +f:Documentation/misc-devices/tps6594-pfsm.rst +f:Documentation/misc-devices/uacce.rst +f:Documentation/misc-devices/xilinx_sdfec.rst +f:Documentation/mm/active_mm.rst +f:Documentation/mm/allocation-profiling.rst +f:Documentation/mm/arch_pgtable_helpers.rst +f:Documentation/mm/balance.rst +f:Documentation/mm/bootmem.rst +f:Documentation/mm/damon/api.rst +f:Documentation/mm/damon/design.rst +f:Documentation/mm/damon/faq.rst +f:Documentation/mm/damon/index.rst +f:Documentation/mm/damon/maintainer-profile.rst +f:Documentation/mm/damon/monitoring_intervals_tuning_example.rst +f:Documentation/mm/free_page_reporting.rst +f:Documentation/mm/highmem.rst +f:Documentation/mm/hmm.rst +f:Documentation/mm/hugetlbfs_reserv.rst +f:Documentation/mm/hwpoison.rst +f:Documentation/mm/index.rst +f:Documentation/mm/ksm.rst +f:Documentation/mm/memory-model.rst +f:Documentation/mm/mmu_notifier.rst +f:Documentation/mm/multigen_lru.rst +f:Documentation/mm/numa.rst +f:Documentation/mm/oom.rst +f:Documentation/mm/overcommit-accounting.rst +f:Documentation/mm/page_allocation.rst +f:Documentation/mm/page_cache.rst +f:Documentation/mm/page_frags.rst +f:Documentation/mm/page_migration.rst +f:Documentation/mm/page_owner.rst +f:Documentation/mm/page_reclaim.rst +f:Documentation/mm/page_table_check.rst +f:Documentation/mm/page_tables.rst +f:Documentation/mm/physical_memory.rst +f:Documentation/mm/process_addrs.rst +f:Documentation/mm/remap_file_pages.rst +f:Documentation/mm/shmfs.rst +f:Documentation/mm/slab.rst +f:Documentation/mm/split_page_table_lock.rst +f:Documentation/mm/swap.rst +f:Documentation/mm/transhuge.rst +f:Documentation/mm/unevictable-lru.rst +f:Documentation/mm/vmalloc.rst +f:Documentation/mm/vmalloced-kernel-stacks.rst +f:Documentation/mm/vmemmap_dedup.rst +f:Documentation/mm/zsmalloc.rst +f:Documentation/netlabel/cipso_ipv4.rst +f:Documentation/netlabel/draft-ietf-cipso-ipsecurity-01.txt +f:Documentation/netlabel/draft_ietf.rst +f:Documentation/netlabel/index.rst +f:Documentation/netlabel/introduction.rst +f:Documentation/netlabel/lsm_interface.rst +f:Documentation/netlink/genetlink-c.yaml +f:Documentation/netlink/genetlink-legacy.yaml +f:Documentation/netlink/genetlink.yaml +f:Documentation/netlink/netlink-raw.yaml +f:Documentation/netlink/specs/conntrack.yaml +f:Documentation/netlink/specs/devlink.yaml +f:Documentation/netlink/specs/dpll.yaml +f:Documentation/netlink/specs/ethtool.yaml +f:Documentation/netlink/specs/fou.yaml +f:Documentation/netlink/specs/handshake.yaml +f:Documentation/netlink/specs/lockd.yaml +f:Documentation/netlink/specs/mptcp_pm.yaml +f:Documentation/netlink/specs/net_shaper.yaml +f:Documentation/netlink/specs/netdev.yaml +f:Documentation/netlink/specs/nfsd.yaml +f:Documentation/netlink/specs/nftables.yaml +f:Documentation/netlink/specs/nl80211.yaml +f:Documentation/netlink/specs/nlctrl.yaml +f:Documentation/netlink/specs/ovpn.yaml +f:Documentation/netlink/specs/ovs_datapath.yaml +f:Documentation/netlink/specs/ovs_flow.yaml +f:Documentation/netlink/specs/ovs_vport.yaml +f:Documentation/netlink/specs/rt-addr.yaml +f:Documentation/netlink/specs/rt-link.yaml +f:Documentation/netlink/specs/rt-neigh.yaml +f:Documentation/netlink/specs/rt-route.yaml +f:Documentation/netlink/specs/rt-rule.yaml +f:Documentation/netlink/specs/tc.yaml +f:Documentation/netlink/specs/tcp_metrics.yaml +f:Documentation/netlink/specs/team.yaml +f:Documentation/networking/6lowpan.rst +f:Documentation/networking/6pack.rst +f:Documentation/networking/af_xdp.rst +f:Documentation/networking/alias.rst +f:Documentation/networking/arcnet-hardware.rst +f:Documentation/networking/arcnet.rst +f:Documentation/networking/atm.rst +f:Documentation/networking/ax25.rst +f:Documentation/networking/bareudp.rst +f:Documentation/networking/batman-adv.rst +f:Documentation/networking/bonding.rst +f:Documentation/networking/bridge.rst +f:Documentation/networking/caif/caif.rst +f:Documentation/networking/caif/index.rst +f:Documentation/networking/caif/linux_caif.rst +f:Documentation/networking/can.rst +f:Documentation/networking/can_ucan_protocol.rst +f:Documentation/networking/cdc_mbim.rst +f:Documentation/networking/checksum-offloads.rst +f:Documentation/networking/dctcp.rst +f:Documentation/networking/device_drivers/atm/cxacru-cf.py +f:Documentation/networking/device_drivers/atm/cxacru.rst +f:Documentation/networking/device_drivers/atm/fore200e.rst +f:Documentation/networking/device_drivers/atm/index.rst +f:Documentation/networking/device_drivers/atm/iphase.rst +f:Documentation/networking/device_drivers/can/can327.rst +f:Documentation/networking/device_drivers/can/ctu/ctucanfd-driver.rst +f:Documentation/networking/device_drivers/can/ctu/fsm_txt_buffer_user.svg +f:Documentation/networking/device_drivers/can/freescale/flexcan.rst +f:Documentation/networking/device_drivers/can/index.rst +f:Documentation/networking/device_drivers/cellular/index.rst +f:Documentation/networking/device_drivers/cellular/qualcomm/rmnet.rst +f:Documentation/networking/device_drivers/ethernet/3com/3c509.rst +f:Documentation/networking/device_drivers/ethernet/3com/vortex.rst +f:Documentation/networking/device_drivers/ethernet/altera/altera_tse.rst +f:Documentation/networking/device_drivers/ethernet/amazon/ena.rst +f:Documentation/networking/device_drivers/ethernet/amd/pds_core.rst +f:Documentation/networking/device_drivers/ethernet/amd/pds_vdpa.rst +f:Documentation/networking/device_drivers/ethernet/amd/pds_vfio_pci.rst +f:Documentation/networking/device_drivers/ethernet/aquantia/atlantic.rst +f:Documentation/networking/device_drivers/ethernet/chelsio/cxgb.rst +f:Documentation/networking/device_drivers/ethernet/cirrus/cs89x0.rst +f:Documentation/networking/device_drivers/ethernet/davicom/dm9000.rst +f:Documentation/networking/device_drivers/ethernet/dec/dmfe.rst +f:Documentation/networking/device_drivers/ethernet/dlink/dl2k.rst +f:Documentation/networking/device_drivers/ethernet/freescale/dpaa.rst +f:Documentation/networking/device_drivers/ethernet/freescale/dpaa2/dpio-driver.rst +f:Documentation/networking/device_drivers/ethernet/freescale/dpaa2/ethernet-driver.rst +f:Documentation/networking/device_drivers/ethernet/freescale/dpaa2/index.rst +f:Documentation/networking/device_drivers/ethernet/freescale/dpaa2/mac-phy-support.rst +f:Documentation/networking/device_drivers/ethernet/freescale/dpaa2/overview.rst +f:Documentation/networking/device_drivers/ethernet/freescale/dpaa2/switch-driver.rst +f:Documentation/networking/device_drivers/ethernet/freescale/gianfar.rst +f:Documentation/networking/device_drivers/ethernet/google/gve.rst +f:Documentation/networking/device_drivers/ethernet/huawei/hinic.rst +f:Documentation/networking/device_drivers/ethernet/huawei/hinic3.rst +f:Documentation/networking/device_drivers/ethernet/index.rst +f:Documentation/networking/device_drivers/ethernet/intel/e100.rst +f:Documentation/networking/device_drivers/ethernet/intel/e1000.rst +f:Documentation/networking/device_drivers/ethernet/intel/e1000e.rst +f:Documentation/networking/device_drivers/ethernet/intel/fm10k.rst +f:Documentation/networking/device_drivers/ethernet/intel/i40e.rst +f:Documentation/networking/device_drivers/ethernet/intel/iavf.rst +f:Documentation/networking/device_drivers/ethernet/intel/ice.rst +f:Documentation/networking/device_drivers/ethernet/intel/idpf.rst +f:Documentation/networking/device_drivers/ethernet/intel/igb.rst +f:Documentation/networking/device_drivers/ethernet/intel/igbvf.rst +f:Documentation/networking/device_drivers/ethernet/intel/ixgbe.rst +f:Documentation/networking/device_drivers/ethernet/intel/ixgbevf.rst +f:Documentation/networking/device_drivers/ethernet/marvell/octeon_ep.rst +f:Documentation/networking/device_drivers/ethernet/marvell/octeon_ep_vf.rst +f:Documentation/networking/device_drivers/ethernet/marvell/octeontx2.rst +f:Documentation/networking/device_drivers/ethernet/mellanox/mlx5/counters.rst +f:Documentation/networking/device_drivers/ethernet/mellanox/mlx5/index.rst +f:Documentation/networking/device_drivers/ethernet/mellanox/mlx5/kconfig.rst +f:Documentation/networking/device_drivers/ethernet/mellanox/mlx5/switchdev.rst +f:Documentation/networking/device_drivers/ethernet/mellanox/mlx5/tracepoints.rst +f:Documentation/networking/device_drivers/ethernet/meta/fbnic.rst +f:Documentation/networking/device_drivers/ethernet/microsoft/netvsc.rst +f:Documentation/networking/device_drivers/ethernet/neterion/s2io.rst +f:Documentation/networking/device_drivers/ethernet/netronome/nfp.rst +f:Documentation/networking/device_drivers/ethernet/pensando/ionic.rst +f:Documentation/networking/device_drivers/ethernet/smsc/smc9.rst +f:Documentation/networking/device_drivers/ethernet/stmicro/stmmac.rst +f:Documentation/networking/device_drivers/ethernet/ti/am65_nuss_cpsw_switchdev.rst +f:Documentation/networking/device_drivers/ethernet/ti/cpsw.rst +f:Documentation/networking/device_drivers/ethernet/ti/cpsw_switchdev.rst +f:Documentation/networking/device_drivers/ethernet/ti/icssg_prueth.rst +f:Documentation/networking/device_drivers/ethernet/ti/tlan.rst +f:Documentation/networking/device_drivers/ethernet/wangxun/ngbe.rst +f:Documentation/networking/device_drivers/ethernet/wangxun/ngbevf.rst +f:Documentation/networking/device_drivers/ethernet/wangxun/txgbe.rst +f:Documentation/networking/device_drivers/ethernet/wangxun/txgbevf.rst +f:Documentation/networking/device_drivers/fddi/defza.rst +f:Documentation/networking/device_drivers/fddi/index.rst +f:Documentation/networking/device_drivers/fddi/skfp.rst +f:Documentation/networking/device_drivers/hamradio/baycom.rst +f:Documentation/networking/device_drivers/hamradio/index.rst +f:Documentation/networking/device_drivers/hamradio/z8530drv.rst +f:Documentation/networking/device_drivers/index.rst +f:Documentation/networking/device_drivers/wifi/index.rst +f:Documentation/networking/device_drivers/wifi/intel/ipw2100.rst +f:Documentation/networking/device_drivers/wifi/intel/ipw2200.rst +f:Documentation/networking/device_drivers/wwan/index.rst +f:Documentation/networking/device_drivers/wwan/iosm.rst +f:Documentation/networking/device_drivers/wwan/t7xx.rst +f:Documentation/networking/devlink/am65-nuss-cpsw-switch.rst +f:Documentation/networking/devlink/bnxt.rst +f:Documentation/networking/devlink/devlink-dpipe.rst +f:Documentation/networking/devlink/devlink-eswitch-attr.rst +f:Documentation/networking/devlink/devlink-flash.rst +f:Documentation/networking/devlink/devlink-health.rst +f:Documentation/networking/devlink/devlink-info.rst +f:Documentation/networking/devlink/devlink-linecard.rst +f:Documentation/networking/devlink/devlink-params.rst +f:Documentation/networking/devlink/devlink-port.rst +f:Documentation/networking/devlink/devlink-region.rst +f:Documentation/networking/devlink/devlink-reload.rst +f:Documentation/networking/devlink/devlink-resource.rst +f:Documentation/networking/devlink/devlink-selftests.rst +f:Documentation/networking/devlink/devlink-trap.rst +f:Documentation/networking/devlink/etas_es58x.rst +f:Documentation/networking/devlink/hns3.rst +f:Documentation/networking/devlink/i40e.rst +f:Documentation/networking/devlink/ice.rst +f:Documentation/networking/devlink/index.rst +f:Documentation/networking/devlink/ionic.rst +f:Documentation/networking/devlink/iosm.rst +f:Documentation/networking/devlink/ixgbe.rst +f:Documentation/networking/devlink/kvaser_pciefd.rst +f:Documentation/networking/devlink/kvaser_usb.rst +f:Documentation/networking/devlink/mlx4.rst +f:Documentation/networking/devlink/mlx5.rst +f:Documentation/networking/devlink/mlxsw.rst +f:Documentation/networking/devlink/mv88e6xxx.rst +f:Documentation/networking/devlink/netdevsim.rst +f:Documentation/networking/devlink/nfp.rst +f:Documentation/networking/devlink/octeontx2.rst +f:Documentation/networking/devlink/prestera.rst +f:Documentation/networking/devlink/qed.rst +f:Documentation/networking/devlink/sfc.rst +f:Documentation/networking/devlink/ti-cpsw-switch.rst +f:Documentation/networking/devlink/zl3073x.rst +f:Documentation/networking/devmem.rst +f:Documentation/networking/diagnostic/index.rst +f:Documentation/networking/diagnostic/twisted_pair_layer1_diagnostics.rst +f:Documentation/networking/dns_resolver.rst +f:Documentation/networking/driver.rst +f:Documentation/networking/dsa/b53.rst +f:Documentation/networking/dsa/bcm_sf2.rst +f:Documentation/networking/dsa/configuration.rst +f:Documentation/networking/dsa/dsa.rst +f:Documentation/networking/dsa/index.rst +f:Documentation/networking/dsa/lan9303.rst +f:Documentation/networking/dsa/sja1105.rst +f:Documentation/networking/eql.rst +f:Documentation/networking/ethtool-netlink.rst +f:Documentation/networking/failover.rst +f:Documentation/networking/fib_trie.rst +f:Documentation/networking/filter.rst +f:Documentation/networking/gen_stats.rst +f:Documentation/networking/generic-hdlc.rst +f:Documentation/networking/generic_netlink.rst +f:Documentation/networking/gtp.rst +f:Documentation/networking/ieee802154.rst +f:Documentation/networking/ila.rst +f:Documentation/networking/index.rst +f:Documentation/networking/ioam6-sysctl.rst +f:Documentation/networking/iou-zcrx.rst +f:Documentation/networking/ip-sysctl.rst +f:Documentation/networking/ip_dynaddr.rst +f:Documentation/networking/ipsec.rst +f:Documentation/networking/ipv6.rst +f:Documentation/networking/ipvlan.rst +f:Documentation/networking/ipvs-sysctl.rst +f:Documentation/networking/iso15765-2.rst +f:Documentation/networking/j1939.rst +f:Documentation/networking/kapi.rst +f:Documentation/networking/kcm.rst +f:Documentation/networking/l2tp.rst +f:Documentation/networking/lapb-module.rst +f:Documentation/networking/mac80211-auth-assoc-deauth.txt +f:Documentation/networking/mac80211-injection.rst +f:Documentation/networking/mac80211_hwsim/hostapd.conf +f:Documentation/networking/mac80211_hwsim/mac80211_hwsim.rst +f:Documentation/networking/mac80211_hwsim/wpa_supplicant.conf +f:Documentation/networking/mctp.rst +f:Documentation/networking/mpls-sysctl.rst +f:Documentation/networking/mptcp-sysctl.rst +f:Documentation/networking/mptcp.rst +f:Documentation/networking/msg_zerocopy.rst +f:Documentation/networking/multi-pf-netdev.rst +f:Documentation/networking/multiqueue.rst +f:Documentation/networking/napi.rst +f:Documentation/networking/net_cachelines/index.rst +f:Documentation/networking/net_cachelines/inet_connection_sock.rst +f:Documentation/networking/net_cachelines/inet_sock.rst +f:Documentation/networking/net_cachelines/net_device.rst +f:Documentation/networking/net_cachelines/netns_ipv4_sysctl.rst +f:Documentation/networking/net_cachelines/snmp.rst +f:Documentation/networking/net_cachelines/tcp_sock.rst +f:Documentation/networking/net_dim.rst +f:Documentation/networking/net_failover.rst +f:Documentation/networking/netconsole.rst +f:Documentation/networking/netdev-features.rst +f:Documentation/networking/netdevices.rst +f:Documentation/networking/netfilter-sysctl.rst +f:Documentation/networking/netif-msg.rst +f:Documentation/networking/netlink_spec/.gitignore +f:Documentation/networking/netlink_spec/readme.txt +f:Documentation/networking/netmem.rst +f:Documentation/networking/nexthop-group-resilient.rst +f:Documentation/networking/nf_conntrack-sysctl.rst +f:Documentation/networking/nf_flowtable.rst +f:Documentation/networking/nfc.rst +f:Documentation/networking/oa-tc6-framework.rst +f:Documentation/networking/openvswitch.rst +f:Documentation/networking/operstates.rst +f:Documentation/networking/packet_mmap.rst +f:Documentation/networking/page_pool.rst +f:Documentation/networking/phonet.rst +f:Documentation/networking/phy-link-topology.rst +f:Documentation/networking/phy.rst +f:Documentation/networking/pktgen.rst +f:Documentation/networking/plip.rst +f:Documentation/networking/ppp_generic.rst +f:Documentation/networking/proc_net_tcp.rst +f:Documentation/networking/pse-pd/index.rst +f:Documentation/networking/pse-pd/introduction.rst +f:Documentation/networking/pse-pd/pse-pi.rst +f:Documentation/networking/radiotap-headers.rst +f:Documentation/networking/rds.rst +f:Documentation/networking/regulatory.rst +f:Documentation/networking/representors.rst +f:Documentation/networking/rxrpc.rst +f:Documentation/networking/scaling.rst +f:Documentation/networking/sctp.rst +f:Documentation/networking/secid.rst +f:Documentation/networking/seg6-sysctl.rst +f:Documentation/networking/segmentation-offloads.rst +f:Documentation/networking/sfp-phylink.rst +f:Documentation/networking/skbuff.rst +f:Documentation/networking/smc-sysctl.rst +f:Documentation/networking/snmp_counter.rst +f:Documentation/networking/sriov.rst +f:Documentation/networking/statistics.rst +f:Documentation/networking/strparser.rst +f:Documentation/networking/switchdev.rst +f:Documentation/networking/sysfs-tagging.rst +f:Documentation/networking/tc-actions-env-rules.rst +f:Documentation/networking/tc-queue-filters.rst +f:Documentation/networking/tcp-thin.rst +f:Documentation/networking/tcp_ao.rst +f:Documentation/networking/team.rst +f:Documentation/networking/timestamping.rst +f:Documentation/networking/tipc.rst +f:Documentation/networking/tls-handshake.rst +f:Documentation/networking/tls-offload-layers.svg +f:Documentation/networking/tls-offload-reorder-bad.svg +f:Documentation/networking/tls-offload-reorder-good.svg +f:Documentation/networking/tls-offload.rst +f:Documentation/networking/tls.rst +f:Documentation/networking/tproxy.rst +f:Documentation/networking/tuntap.rst +f:Documentation/networking/udplite.rst +f:Documentation/networking/vrf.rst +f:Documentation/networking/vxlan.rst +f:Documentation/networking/x25-iface.rst +f:Documentation/networking/x25.rst +f:Documentation/networking/xdp-rx-metadata.rst +f:Documentation/networking/xfrm_device.rst +f:Documentation/networking/xfrm_proc.rst +f:Documentation/networking/xfrm_sync.rst +f:Documentation/networking/xfrm_sysctl.rst +f:Documentation/networking/xsk-tx-metadata.rst +f:Documentation/nvdimm/maintainer-entry-profile.rst +f:Documentation/nvme/feature-and-quirk-policy.rst +f:Documentation/nvme/index.rst +f:Documentation/nvme/nvme-pci-endpoint-target.rst +f:Documentation/pcmcia/devicetable.rst +f:Documentation/pcmcia/driver-changes.rst +f:Documentation/pcmcia/driver.rst +f:Documentation/pcmcia/index.rst +f:Documentation/pcmcia/locking.rst +f:Documentation/peci/index.rst +f:Documentation/peci/peci.rst +f:Documentation/power/apm-acpi.rst +f:Documentation/power/basic-pm-debugging.rst +f:Documentation/power/charger-manager.rst +f:Documentation/power/drivers-testing.rst +f:Documentation/power/energy-model.rst +f:Documentation/power/freezing-of-tasks.rst +f:Documentation/power/index.rst +f:Documentation/power/opp.rst +f:Documentation/power/pci.rst +f:Documentation/power/pm_qos_interface.rst +f:Documentation/power/power_supply_class.rst +f:Documentation/power/powercap/dtpm.rst +f:Documentation/power/powercap/powercap.rst +f:Documentation/power/regulator/consumer.rst +f:Documentation/power/regulator/design.rst +f:Documentation/power/regulator/machine.rst +f:Documentation/power/regulator/overview.rst +f:Documentation/power/regulator/regulator.rst +f:Documentation/power/runtime_pm.rst +f:Documentation/power/s2ram.rst +f:Documentation/power/suspend-and-cpuhotplug.rst +f:Documentation/power/suspend-and-interrupts.rst +f:Documentation/power/swsusp-and-swap-files.rst +f:Documentation/power/swsusp-dmcrypt.rst +f:Documentation/power/swsusp.rst +f:Documentation/power/tricks.rst +f:Documentation/power/userland-swsusp.rst +f:Documentation/power/video.rst +f:Documentation/process/1.Intro.rst +f:Documentation/process/2.Process.rst +f:Documentation/process/3.Early-stage.rst +f:Documentation/process/4.Coding.rst +f:Documentation/process/5.Posting.rst +f:Documentation/process/6.Followthrough.rst +f:Documentation/process/7.AdvancedTopics.rst +f:Documentation/process/8.Conclusion.rst +f:Documentation/process/adding-syscalls.rst +f:Documentation/process/applying-patches.rst +f:Documentation/process/backporting.rst +f:Documentation/process/botching-up-ioctls.rst +f:Documentation/process/changes.rst +f:Documentation/process/code-of-conduct-interpretation.rst +f:Documentation/process/code-of-conduct.rst +f:Documentation/process/coding-style.rst +f:Documentation/process/contribution-maturity-model.rst +f:Documentation/process/cve.rst +f:Documentation/process/debugging/driver_development_debugging_guide.rst +f:Documentation/process/debugging/gdb-kernel-debugging.rst +f:Documentation/process/debugging/index.rst +f:Documentation/process/debugging/kgdb.rst +f:Documentation/process/debugging/media_specific_debugging_guide.rst +f:Documentation/process/debugging/userspace_debugging_guide.rst +f:Documentation/process/deprecated.rst +f:Documentation/process/development-process.rst +f:Documentation/process/email-clients.rst +f:Documentation/process/embargoed-hardware-issues.rst +f:Documentation/process/handling-regressions.rst +f:Documentation/process/howto.rst +f:Documentation/process/index.rst +f:Documentation/process/kernel-docs.rst +f:Documentation/process/kernel-driver-statement.rst +f:Documentation/process/kernel-enforcement-statement.rst +f:Documentation/process/license-rules.rst +f:Documentation/process/maintainer-handbooks.rst +f:Documentation/process/maintainer-kvm-x86.rst +f:Documentation/process/maintainer-netdev.rst +f:Documentation/process/maintainer-pgp-guide.rst +f:Documentation/process/maintainer-soc-clean-dts.rst +f:Documentation/process/maintainer-soc.rst +f:Documentation/process/maintainer-tip.rst +f:Documentation/process/maintainers.rst +f:Documentation/process/management-style.rst +f:Documentation/process/programming-language.rst +f:Documentation/process/researcher-guidelines.rst +f:Documentation/process/security-bugs.rst +f:Documentation/process/stable-api-nonsense.rst +f:Documentation/process/stable-kernel-rules.rst +f:Documentation/process/submit-checklist.rst +f:Documentation/process/submitting-patches.rst +f:Documentation/process/volatile-considered-harmful.rst +f:Documentation/rust/arch-support.rst +f:Documentation/rust/coding-guidelines.rst +f:Documentation/rust/general-information.rst +f:Documentation/rust/index.rst +f:Documentation/rust/quick-start.rst +f:Documentation/rust/testing.rst +f:Documentation/scheduler/completion.rst +f:Documentation/scheduler/index.rst +f:Documentation/scheduler/membarrier.rst +f:Documentation/scheduler/sched-arch.rst +f:Documentation/scheduler/sched-bwc.rst +f:Documentation/scheduler/sched-capacity.rst +f:Documentation/scheduler/sched-deadline.rst +f:Documentation/scheduler/sched-debug.rst +f:Documentation/scheduler/sched-design-CFS.rst +f:Documentation/scheduler/sched-domains.rst +f:Documentation/scheduler/sched-eevdf.rst +f:Documentation/scheduler/sched-energy.rst +f:Documentation/scheduler/sched-ext.rst +f:Documentation/scheduler/sched-nice-design.rst +f:Documentation/scheduler/sched-pelt.c +f:Documentation/scheduler/sched-rt-group.rst +f:Documentation/scheduler/sched-stats.rst +f:Documentation/scheduler/sched-util-clamp.rst +f:Documentation/scheduler/schedutil.rst +f:Documentation/scheduler/text_files.rst +f:Documentation/scsi/53c700.rst +f:Documentation/scsi/BusLogic.rst +f:Documentation/scsi/ChangeLog.arcmsr +f:Documentation/scsi/ChangeLog.ips +f:Documentation/scsi/ChangeLog.lpfc +f:Documentation/scsi/ChangeLog.megaraid +f:Documentation/scsi/ChangeLog.megaraid_sas +f:Documentation/scsi/ChangeLog.ncr53c8xx +f:Documentation/scsi/ChangeLog.sym53c8xx +f:Documentation/scsi/ChangeLog.sym53c8xx_2 +f:Documentation/scsi/FlashPoint.rst +f:Documentation/scsi/LICENSE.FlashPoint +f:Documentation/scsi/NinjaSCSI.rst +f:Documentation/scsi/aacraid.rst +f:Documentation/scsi/advansys.rst +f:Documentation/scsi/aha152x.rst +f:Documentation/scsi/aic79xx.rst +f:Documentation/scsi/aic7xxx.rst +f:Documentation/scsi/arcmsr_spec.rst +f:Documentation/scsi/bfa.rst +f:Documentation/scsi/bnx2fc.rst +f:Documentation/scsi/cxgb3i.rst +f:Documentation/scsi/dc395x.rst +f:Documentation/scsi/dpti.rst +f:Documentation/scsi/g_NCR5380.rst +f:Documentation/scsi/hpsa.rst +f:Documentation/scsi/hptiop.rst +f:Documentation/scsi/index.rst +f:Documentation/scsi/libsas.rst +f:Documentation/scsi/link_power_management_policy.rst +f:Documentation/scsi/lpfc.rst +f:Documentation/scsi/megaraid.rst +f:Documentation/scsi/ncr53c8xx.rst +f:Documentation/scsi/ppa.rst +f:Documentation/scsi/qlogicfas.rst +f:Documentation/scsi/scsi-changer.rst +f:Documentation/scsi/scsi-generic.rst +f:Documentation/scsi/scsi-parameters.rst +f:Documentation/scsi/scsi.rst +f:Documentation/scsi/scsi_eh.rst +f:Documentation/scsi/scsi_fc_transport.rst +f:Documentation/scsi/scsi_mid_low_api.rst +f:Documentation/scsi/scsi_transport_srp/figures.rst +f:Documentation/scsi/scsi_transport_srp/rport_state_diagram.dot +f:Documentation/scsi/sd-parameters.rst +f:Documentation/scsi/smartpqi.rst +f:Documentation/scsi/st.rst +f:Documentation/scsi/sym53c500_cs.rst +f:Documentation/scsi/sym53c8xx_2.rst +f:Documentation/scsi/tcm_qla2xxx.rst +f:Documentation/scsi/ufs.rst +f:Documentation/scsi/wd719x.rst +f:Documentation/security/IMA-templates.rst +f:Documentation/security/SCTP.rst +f:Documentation/security/credentials.rst +f:Documentation/security/digsig.rst +f:Documentation/security/index.rst +f:Documentation/security/ipe.rst +f:Documentation/security/keys/core.rst +f:Documentation/security/keys/ecryptfs.rst +f:Documentation/security/keys/index.rst +f:Documentation/security/keys/request-key.rst +f:Documentation/security/keys/trusted-encrypted.rst +f:Documentation/security/landlock.rst +f:Documentation/security/lsm-development.rst +f:Documentation/security/lsm.rst +f:Documentation/security/sak.rst +f:Documentation/security/secrets/coco.rst +f:Documentation/security/secrets/index.rst +f:Documentation/security/self-protection.rst +f:Documentation/security/siphash.rst +f:Documentation/security/snp-tdx-threat-model.rst +f:Documentation/security/tpm/index.rst +f:Documentation/security/tpm/tpm-security.rst +f:Documentation/security/tpm/tpm_event_log.rst +f:Documentation/security/tpm/tpm_ffa_crb.rst +f:Documentation/security/tpm/tpm_ftpm_tee.rst +f:Documentation/security/tpm/tpm_tis.rst +f:Documentation/security/tpm/tpm_vtpm_proxy.rst +f:Documentation/security/tpm/xen-tpmfront.rst +f:Documentation/sound/alsa-configuration.rst +f:Documentation/sound/cards/audigy-mixer.rst +f:Documentation/sound/cards/audiophile-usb.rst +f:Documentation/sound/cards/bt87x.rst +f:Documentation/sound/cards/cmipci.rst +f:Documentation/sound/cards/emu-mixer.rst +f:Documentation/sound/cards/emu10k1-jack.rst +f:Documentation/sound/cards/hdspm.rst +f:Documentation/sound/cards/img-spdif-in.rst +f:Documentation/sound/cards/index.rst +f:Documentation/sound/cards/joystick.rst +f:Documentation/sound/cards/maya44.rst +f:Documentation/sound/cards/mixart.rst +f:Documentation/sound/cards/multisound.sh +f:Documentation/sound/cards/pcmtest.rst +f:Documentation/sound/cards/sb-live-mixer.rst +f:Documentation/sound/cards/serial-u16550.rst +f:Documentation/sound/cards/via82xx-mixer.rst +f:Documentation/sound/codecs/cs35l56.rst +f:Documentation/sound/codecs/index.rst +f:Documentation/sound/designs/channel-mapping-api.rst +f:Documentation/sound/designs/compress-accel.rst +f:Documentation/sound/designs/compress-offload.rst +f:Documentation/sound/designs/control-names.rst +f:Documentation/sound/designs/index.rst +f:Documentation/sound/designs/jack-controls.rst +f:Documentation/sound/designs/jack-injection.rst +f:Documentation/sound/designs/midi-2.0.rst +f:Documentation/sound/designs/oss-emulation.rst +f:Documentation/sound/designs/powersave.rst +f:Documentation/sound/designs/procfile.rst +f:Documentation/sound/designs/seq-oss.rst +f:Documentation/sound/designs/timestamping.rst +f:Documentation/sound/designs/tracepoints.rst +f:Documentation/sound/hd-audio/controls.rst +f:Documentation/sound/hd-audio/dp-mst.rst +f:Documentation/sound/hd-audio/index.rst +f:Documentation/sound/hd-audio/intel-multi-link.rst +f:Documentation/sound/hd-audio/models.rst +f:Documentation/sound/hd-audio/notes.rst +f:Documentation/sound/hd-audio/realtek-pc-beep.rst +f:Documentation/sound/index.rst +f:Documentation/sound/kernel-api/alsa-driver-api.rst +f:Documentation/sound/kernel-api/index.rst +f:Documentation/sound/kernel-api/writing-an-alsa-driver.rst +f:Documentation/sound/soc/clocking.rst +f:Documentation/sound/soc/codec-to-codec.rst +f:Documentation/sound/soc/codec.rst +f:Documentation/sound/soc/dai.rst +f:Documentation/sound/soc/dapm-graph.svg +f:Documentation/sound/soc/dapm.rst +f:Documentation/sound/soc/dpcm.rst +f:Documentation/sound/soc/index.rst +f:Documentation/sound/soc/jack.rst +f:Documentation/sound/soc/machine.rst +f:Documentation/sound/soc/overview.rst +f:Documentation/sound/soc/platform.rst +f:Documentation/sound/soc/pops-clicks.rst +f:Documentation/sound/soc/usb.rst +f:Documentation/sound/utimers.rst +f:Documentation/sphinx-static/custom.css +f:Documentation/sphinx-static/theme_overrides.css +f:Documentation/sphinx-static/theme_rtd_colors.css +f:Documentation/sphinx/automarkup.py +f:Documentation/sphinx/cdomain.py +f:Documentation/sphinx/kernel_abi.py +f:Documentation/sphinx/kernel_feat.py +f:Documentation/sphinx/kernel_include.py +f:Documentation/sphinx/kerneldoc-preamble.sty +f:Documentation/sphinx/kerneldoc.py +f:Documentation/sphinx/kfigure.py +f:Documentation/sphinx/load_config.py +f:Documentation/sphinx/maintainers_include.py +f:Documentation/sphinx/min_requirements.txt +f:Documentation/sphinx/parallel-wrapper.sh +f:Documentation/sphinx/parse-headers.pl +f:Documentation/sphinx/requirements.txt +f:Documentation/sphinx/rstFlatTable.py +f:Documentation/sphinx/templates/kernel-toc.html +f:Documentation/sphinx/templates/translations.html +f:Documentation/sphinx/translations.py +f:Documentation/spi/butterfly.rst +f:Documentation/spi/index.rst +f:Documentation/spi/spi-lm70llp.rst +f:Documentation/spi/spi-sc18is602.rst +f:Documentation/spi/spi-summary.rst +f:Documentation/spi/spidev.rst +f:Documentation/staging/crc32.rst +f:Documentation/staging/index.rst +f:Documentation/staging/lzo.rst +f:Documentation/staging/magic-number.rst +f:Documentation/staging/remoteproc.rst +f:Documentation/staging/rpmsg.rst +f:Documentation/staging/speculation.rst +f:Documentation/staging/static-keys.rst +f:Documentation/staging/xz.rst +f:Documentation/subsystem-apis.rst +f:Documentation/sunrpc/xdr/nfs4_1.x +f:Documentation/target/index.rst +f:Documentation/target/scripts.rst +f:Documentation/target/target-export-device +f:Documentation/target/tcm_mod_builder.rst +f:Documentation/target/tcmu-design.rst +f:Documentation/tee/amd-tee.rst +f:Documentation/tee/index.rst +f:Documentation/tee/op-tee.rst +f:Documentation/tee/tee.rst +f:Documentation/tee/ts-tee.rst +f:Documentation/timers/delay_sleep_functions.rst +f:Documentation/timers/highres.rst +f:Documentation/timers/hpet.rst +f:Documentation/timers/hrtimers.rst +f:Documentation/timers/index.rst +f:Documentation/timers/no_hz.rst +f:Documentation/timers/timekeeping.rst +f:Documentation/tools/index.rst +f:Documentation/tools/rtla/Makefile +f:Documentation/tools/rtla/common_appendix.rst +f:Documentation/tools/rtla/common_hist_options.rst +f:Documentation/tools/rtla/common_options.rst +f:Documentation/tools/rtla/common_osnoise_description.rst +f:Documentation/tools/rtla/common_osnoise_options.rst +f:Documentation/tools/rtla/common_timerlat_aa.rst +f:Documentation/tools/rtla/common_timerlat_description.rst +f:Documentation/tools/rtla/common_timerlat_options.rst +f:Documentation/tools/rtla/common_top_options.rst +f:Documentation/tools/rtla/index.rst +f:Documentation/tools/rtla/rtla-hwnoise.rst +f:Documentation/tools/rtla/rtla-osnoise-hist.rst +f:Documentation/tools/rtla/rtla-osnoise-top.rst +f:Documentation/tools/rtla/rtla-osnoise.rst +f:Documentation/tools/rtla/rtla-timerlat-hist.rst +f:Documentation/tools/rtla/rtla-timerlat-top.rst +f:Documentation/tools/rtla/rtla-timerlat.rst +f:Documentation/tools/rtla/rtla.rst +f:Documentation/tools/rv/Makefile +f:Documentation/tools/rv/common_appendix.rst +f:Documentation/tools/rv/common_ikm.rst +f:Documentation/tools/rv/index.rst +f:Documentation/tools/rv/rv-list.rst +f:Documentation/tools/rv/rv-mon-sched.rst +f:Documentation/tools/rv/rv-mon-wip.rst +f:Documentation/tools/rv/rv-mon-wwnr.rst +f:Documentation/tools/rv/rv-mon.rst +f:Documentation/tools/rv/rv.rst +f:Documentation/trace/boottime-trace.rst +f:Documentation/trace/coresight/coresight-config.rst +f:Documentation/trace/coresight/coresight-cpu-debug.rst +f:Documentation/trace/coresight/coresight-dummy.rst +f:Documentation/trace/coresight/coresight-ect.rst +f:Documentation/trace/coresight/coresight-etm4x-reference.rst +f:Documentation/trace/coresight/coresight-perf.rst +f:Documentation/trace/coresight/coresight-tpda.rst +f:Documentation/trace/coresight/coresight-tpdm.rst +f:Documentation/trace/coresight/coresight-trbe.rst +f:Documentation/trace/coresight/coresight.rst +f:Documentation/trace/coresight/index.rst +f:Documentation/trace/coresight/panic.rst +f:Documentation/trace/coresight/ultrasoc-smb.rst +f:Documentation/trace/debugging.rst +f:Documentation/trace/events-kmem.rst +f:Documentation/trace/events-msr.rst +f:Documentation/trace/events-nmi.rst +f:Documentation/trace/events-power.rst +f:Documentation/trace/events.rst +f:Documentation/trace/fprobe.rst +f:Documentation/trace/fprobetrace.rst +f:Documentation/trace/ftrace-design.rst +f:Documentation/trace/ftrace-uses.rst +f:Documentation/trace/ftrace.rst +f:Documentation/trace/function-graph-fold.vim +f:Documentation/trace/hisi-ptt.rst +f:Documentation/trace/histogram-design.rst +f:Documentation/trace/histogram.rst +f:Documentation/trace/hwlat_detector.rst +f:Documentation/trace/index.rst +f:Documentation/trace/intel_th.rst +f:Documentation/trace/kprobes.rst +f:Documentation/trace/kprobetrace.rst +f:Documentation/trace/mmiotrace.rst +f:Documentation/trace/osnoise-tracer.rst +f:Documentation/trace/postprocess/decode_msr.py +f:Documentation/trace/postprocess/trace-pagealloc-postprocess.pl +f:Documentation/trace/postprocess/trace-vmscan-postprocess.pl +f:Documentation/trace/ring-buffer-design.rst +f:Documentation/trace/ring-buffer-map.rst +f:Documentation/trace/rv/da_monitor_instrumentation.rst +f:Documentation/trace/rv/deterministic_automata.rst +f:Documentation/trace/rv/index.rst +f:Documentation/trace/rv/linear_temporal_logic.rst +f:Documentation/trace/rv/monitor_rtapp.rst +f:Documentation/trace/rv/monitor_sched.rst +f:Documentation/trace/rv/monitor_synthesis.rst +f:Documentation/trace/rv/monitor_wip.rst +f:Documentation/trace/rv/monitor_wwnr.rst +f:Documentation/trace/rv/runtime-verification.rst +f:Documentation/trace/stm.rst +f:Documentation/trace/sys-t.rst +f:Documentation/trace/timerlat-tracer.rst +f:Documentation/trace/tracepoint-analysis.rst +f:Documentation/trace/tracepoints.rst +f:Documentation/trace/uprobetracer.rst +f:Documentation/trace/user_events.rst +f:Documentation/translations/index.rst +f:Documentation/translations/it_IT/RCU/index.rst +f:Documentation/translations/it_IT/RCU/torture.rst +f:Documentation/translations/it_IT/admin-guide/README.rst +f:Documentation/translations/it_IT/admin-guide/kernel-parameters.rst +f:Documentation/translations/it_IT/arch/riscv/patch-acceptance.rst +f:Documentation/translations/it_IT/core-api/index.rst +f:Documentation/translations/it_IT/core-api/memory-allocation.rst +f:Documentation/translations/it_IT/core-api/symbol-namespaces.rst +f:Documentation/translations/it_IT/dev-tools/clang-format.rst +f:Documentation/translations/it_IT/dev-tools/index.rst +f:Documentation/translations/it_IT/devicetree/bindings/submitting-patches.rst +f:Documentation/translations/it_IT/disclaimer-ita.rst +f:Documentation/translations/it_IT/doc-guide/index.rst +f:Documentation/translations/it_IT/doc-guide/kernel-doc.rst +f:Documentation/translations/it_IT/doc-guide/parse-headers.rst +f:Documentation/translations/it_IT/doc-guide/sphinx.rst +f:Documentation/translations/it_IT/i2c/i2c-protocol.rst +f:Documentation/translations/it_IT/i2c/index.rst +f:Documentation/translations/it_IT/i2c/summary.rst +f:Documentation/translations/it_IT/index.rst +f:Documentation/translations/it_IT/kernel-hacking/hacking.rst +f:Documentation/translations/it_IT/kernel-hacking/index.rst +f:Documentation/translations/it_IT/kernel-hacking/locking.rst +f:Documentation/translations/it_IT/locking/index.rst +f:Documentation/translations/it_IT/locking/lockdep-design.rst +f:Documentation/translations/it_IT/locking/lockstat.rst +f:Documentation/translations/it_IT/locking/locktorture.rst +f:Documentation/translations/it_IT/locking/locktypes.rst +f:Documentation/translations/it_IT/maintainer/configure-git.rst +f:Documentation/translations/it_IT/process/1.Intro.rst +f:Documentation/translations/it_IT/process/2.Process.rst +f:Documentation/translations/it_IT/process/3.Early-stage.rst +f:Documentation/translations/it_IT/process/4.Coding.rst +f:Documentation/translations/it_IT/process/5.Posting.rst +f:Documentation/translations/it_IT/process/6.Followthrough.rst +f:Documentation/translations/it_IT/process/7.AdvancedTopics.rst +f:Documentation/translations/it_IT/process/8.Conclusion.rst +f:Documentation/translations/it_IT/process/adding-syscalls.rst +f:Documentation/translations/it_IT/process/applying-patches.rst +f:Documentation/translations/it_IT/process/botching-up-ioctls.rst +f:Documentation/translations/it_IT/process/changes.rst +f:Documentation/translations/it_IT/process/code-of-conduct.rst +f:Documentation/translations/it_IT/process/coding-style.rst +f:Documentation/translations/it_IT/process/deprecated.rst +f:Documentation/translations/it_IT/process/development-process.rst +f:Documentation/translations/it_IT/process/email-clients.rst +f:Documentation/translations/it_IT/process/howto.rst +f:Documentation/translations/it_IT/process/index.rst +f:Documentation/translations/it_IT/process/kernel-docs.rst +f:Documentation/translations/it_IT/process/kernel-driver-statement.rst +f:Documentation/translations/it_IT/process/kernel-enforcement-statement.rst +f:Documentation/translations/it_IT/process/license-rules.rst +f:Documentation/translations/it_IT/process/maintainer-handbooks.rst +f:Documentation/translations/it_IT/process/maintainer-pgp-guide.rst +f:Documentation/translations/it_IT/process/maintainer-tip.rst +f:Documentation/translations/it_IT/process/maintainers.rst +f:Documentation/translations/it_IT/process/management-style.rst +f:Documentation/translations/it_IT/process/programming-language.rst +f:Documentation/translations/it_IT/process/security-bugs.rst +f:Documentation/translations/it_IT/process/stable-api-nonsense.rst +f:Documentation/translations/it_IT/process/stable-kernel-rules.rst +f:Documentation/translations/it_IT/process/submit-checklist.rst +f:Documentation/translations/it_IT/process/submitting-patches.rst +f:Documentation/translations/it_IT/process/volatile-considered-harmful.rst +f:Documentation/translations/it_IT/staging/index.rst +f:Documentation/translations/it_IT/staging/magic-number.rst +f:Documentation/translations/it_IT/subsystem-apis.rst +f:Documentation/translations/ja_JP/SubmittingPatches +f:Documentation/translations/ja_JP/disclaimer-ja_JP.rst +f:Documentation/translations/ja_JP/index.rst +f:Documentation/translations/ja_JP/process/howto.rst +f:Documentation/translations/ja_JP/process/submit-checklist.rst +f:Documentation/translations/ja_JP/stable_api_nonsense.txt +f:Documentation/translations/ja_JP/stable_kernel_rules.txt +f:Documentation/translations/ko_KR/core-api/wrappers/memory-barriers.rst +f:Documentation/translations/ko_KR/index.rst +f:Documentation/translations/ko_KR/memory-barriers.txt +f:Documentation/translations/ko_KR/process/howto.rst +f:Documentation/translations/ko_KR/stable_api_nonsense.txt +f:Documentation/translations/sp_SP/disclaimer-sp.rst +f:Documentation/translations/sp_SP/index.rst +f:Documentation/translations/sp_SP/memory-barriers.txt +f:Documentation/translations/sp_SP/process/1.Intro.rst +f:Documentation/translations/sp_SP/process/2.Process.rst +f:Documentation/translations/sp_SP/process/3.Early-stage.rst +f:Documentation/translations/sp_SP/process/4.Coding.rst +f:Documentation/translations/sp_SP/process/5.Posting.rst +f:Documentation/translations/sp_SP/process/6.Followthrough.rst +f:Documentation/translations/sp_SP/process/7.AdvancedTopics.rst +f:Documentation/translations/sp_SP/process/8.Conclusion.rst +f:Documentation/translations/sp_SP/process/adding-syscalls.rst +f:Documentation/translations/sp_SP/process/code-of-conduct.rst +f:Documentation/translations/sp_SP/process/coding-style.rst +f:Documentation/translations/sp_SP/process/contribution-maturity-model.rst +f:Documentation/translations/sp_SP/process/deprecated.rst +f:Documentation/translations/sp_SP/process/development-process.rst +f:Documentation/translations/sp_SP/process/email-clients.rst +f:Documentation/translations/sp_SP/process/embargoed-hardware-issues.rst +f:Documentation/translations/sp_SP/process/handling-regressions.rst +f:Documentation/translations/sp_SP/process/howto.rst +f:Documentation/translations/sp_SP/process/index.rst +f:Documentation/translations/sp_SP/process/kernel-docs.rst +f:Documentation/translations/sp_SP/process/kernel-enforcement-statement.rst +f:Documentation/translations/sp_SP/process/magic-number.rst +f:Documentation/translations/sp_SP/process/maintainer-kvm-x86.rst +f:Documentation/translations/sp_SP/process/management-style.rst +f:Documentation/translations/sp_SP/process/programming-language.rst +f:Documentation/translations/sp_SP/process/researcher-guidelines.rst +f:Documentation/translations/sp_SP/process/security-bugs.rst +f:Documentation/translations/sp_SP/process/submit-checklist.rst +f:Documentation/translations/sp_SP/process/submitting-patches.rst +f:Documentation/translations/sp_SP/scheduler/index.rst +f:Documentation/translations/sp_SP/scheduler/sched-bwc.rst +f:Documentation/translations/sp_SP/scheduler/sched-design-CFS.rst +f:Documentation/translations/sp_SP/scheduler/sched-eevdf.rst +f:Documentation/translations/sp_SP/wrappers/memory-barriers.rst +f:Documentation/translations/zh_CN/PCI/acpi-info.rst +f:Documentation/translations/zh_CN/PCI/index.rst +f:Documentation/translations/zh_CN/PCI/msi-howto.rst +f:Documentation/translations/zh_CN/PCI/pci-iov-howto.rst +f:Documentation/translations/zh_CN/PCI/pci.rst +f:Documentation/translations/zh_CN/PCI/pciebus-howto.rst +f:Documentation/translations/zh_CN/PCI/sysfs-pci.rst +f:Documentation/translations/zh_CN/accounting/delay-accounting.rst +f:Documentation/translations/zh_CN/accounting/index.rst +f:Documentation/translations/zh_CN/accounting/psi.rst +f:Documentation/translations/zh_CN/accounting/taskstats.rst +f:Documentation/translations/zh_CN/admin-guide/README.rst +f:Documentation/translations/zh_CN/admin-guide/bootconfig.rst +f:Documentation/translations/zh_CN/admin-guide/bug-bisect.rst +f:Documentation/translations/zh_CN/admin-guide/bug-hunting.rst +f:Documentation/translations/zh_CN/admin-guide/clearing-warn-once.rst +f:Documentation/translations/zh_CN/admin-guide/cpu-load.rst +f:Documentation/translations/zh_CN/admin-guide/cputopology.rst +f:Documentation/translations/zh_CN/admin-guide/index.rst +f:Documentation/translations/zh_CN/admin-guide/init.rst +f:Documentation/translations/zh_CN/admin-guide/lockup-watchdogs.rst +f:Documentation/translations/zh_CN/admin-guide/mm/damon/index.rst +f:Documentation/translations/zh_CN/admin-guide/mm/damon/lru_sort.rst +f:Documentation/translations/zh_CN/admin-guide/mm/damon/reclaim.rst +f:Documentation/translations/zh_CN/admin-guide/mm/damon/start.rst +f:Documentation/translations/zh_CN/admin-guide/mm/damon/usage.rst +f:Documentation/translations/zh_CN/admin-guide/mm/index.rst +f:Documentation/translations/zh_CN/admin-guide/mm/ksm.rst +f:Documentation/translations/zh_CN/admin-guide/numastat.rst +f:Documentation/translations/zh_CN/admin-guide/reporting-issues.rst +f:Documentation/translations/zh_CN/admin-guide/reporting-regressions.rst +f:Documentation/translations/zh_CN/admin-guide/sysrq.rst +f:Documentation/translations/zh_CN/admin-guide/tainted-kernels.rst +f:Documentation/translations/zh_CN/admin-guide/unicode.rst +f:Documentation/translations/zh_CN/arch/arm/Booting +f:Documentation/translations/zh_CN/arch/arm/kernel_user_helpers.txt +f:Documentation/translations/zh_CN/arch/arm64/amu.rst +f:Documentation/translations/zh_CN/arch/arm64/booting.txt +f:Documentation/translations/zh_CN/arch/arm64/elf_hwcaps.rst +f:Documentation/translations/zh_CN/arch/arm64/hugetlbpage.rst +f:Documentation/translations/zh_CN/arch/arm64/index.rst +f:Documentation/translations/zh_CN/arch/arm64/legacy_instructions.txt +f:Documentation/translations/zh_CN/arch/arm64/memory.txt +f:Documentation/translations/zh_CN/arch/arm64/perf.rst +f:Documentation/translations/zh_CN/arch/arm64/silicon-errata.txt +f:Documentation/translations/zh_CN/arch/arm64/tagged-pointers.txt +f:Documentation/translations/zh_CN/arch/index.rst +f:Documentation/translations/zh_CN/arch/loongarch/booting.rst +f:Documentation/translations/zh_CN/arch/loongarch/features.rst +f:Documentation/translations/zh_CN/arch/loongarch/index.rst +f:Documentation/translations/zh_CN/arch/loongarch/introduction.rst +f:Documentation/translations/zh_CN/arch/loongarch/irq-chip-model.rst +f:Documentation/translations/zh_CN/arch/mips/booting.rst +f:Documentation/translations/zh_CN/arch/mips/features.rst +f:Documentation/translations/zh_CN/arch/mips/index.rst +f:Documentation/translations/zh_CN/arch/mips/ingenic-tcu.rst +f:Documentation/translations/zh_CN/arch/openrisc/index.rst +f:Documentation/translations/zh_CN/arch/openrisc/openrisc_port.rst +f:Documentation/translations/zh_CN/arch/openrisc/todo.rst +f:Documentation/translations/zh_CN/arch/parisc/debugging.rst +f:Documentation/translations/zh_CN/arch/parisc/index.rst +f:Documentation/translations/zh_CN/arch/parisc/registers.rst +f:Documentation/translations/zh_CN/arch/riscv/boot-image-header.rst +f:Documentation/translations/zh_CN/arch/riscv/boot.rst +f:Documentation/translations/zh_CN/arch/riscv/index.rst +f:Documentation/translations/zh_CN/arch/riscv/patch-acceptance.rst +f:Documentation/translations/zh_CN/arch/riscv/vm-layout.rst +f:Documentation/translations/zh_CN/core-api/assoc_array.rst +f:Documentation/translations/zh_CN/core-api/boot-time-mm.rst +f:Documentation/translations/zh_CN/core-api/cachetlb.rst +f:Documentation/translations/zh_CN/core-api/circular-buffers.rst +f:Documentation/translations/zh_CN/core-api/cpu_hotplug.rst +f:Documentation/translations/zh_CN/core-api/errseq.rst +f:Documentation/translations/zh_CN/core-api/genalloc.rst +f:Documentation/translations/zh_CN/core-api/generic-radix-tree.rst +f:Documentation/translations/zh_CN/core-api/genericirq.rst +f:Documentation/translations/zh_CN/core-api/gfp_mask-from-fs-io.rst +f:Documentation/translations/zh_CN/core-api/idr.rst +f:Documentation/translations/zh_CN/core-api/index.rst +f:Documentation/translations/zh_CN/core-api/irq/concepts.rst +f:Documentation/translations/zh_CN/core-api/irq/index.rst +f:Documentation/translations/zh_CN/core-api/irq/irq-affinity.rst +f:Documentation/translations/zh_CN/core-api/irq/irq-domain.rst +f:Documentation/translations/zh_CN/core-api/irq/irqflags-tracing.rst +f:Documentation/translations/zh_CN/core-api/kernel-api.rst +f:Documentation/translations/zh_CN/core-api/kobject.rst +f:Documentation/translations/zh_CN/core-api/kref.rst +f:Documentation/translations/zh_CN/core-api/local_ops.rst +f:Documentation/translations/zh_CN/core-api/memory-allocation.rst +f:Documentation/translations/zh_CN/core-api/memory-hotplug.rst +f:Documentation/translations/zh_CN/core-api/mm-api.rst +f:Documentation/translations/zh_CN/core-api/packing.rst +f:Documentation/translations/zh_CN/core-api/padata.rst +f:Documentation/translations/zh_CN/core-api/printk-basics.rst +f:Documentation/translations/zh_CN/core-api/printk-formats.rst +f:Documentation/translations/zh_CN/core-api/protection-keys.rst +f:Documentation/translations/zh_CN/core-api/rbtree.rst +f:Documentation/translations/zh_CN/core-api/refcount-vs-atomic.rst +f:Documentation/translations/zh_CN/core-api/symbol-namespaces.rst +f:Documentation/translations/zh_CN/core-api/this_cpu_ops.rst +f:Documentation/translations/zh_CN/core-api/unaligned-memory-access.rst +f:Documentation/translations/zh_CN/core-api/union_find.rst +f:Documentation/translations/zh_CN/core-api/watch_queue.rst +f:Documentation/translations/zh_CN/core-api/workqueue.rst +f:Documentation/translations/zh_CN/core-api/xarray.rst +f:Documentation/translations/zh_CN/cpu-freq/core.rst +f:Documentation/translations/zh_CN/cpu-freq/cpu-drivers.rst +f:Documentation/translations/zh_CN/cpu-freq/cpufreq-stats.rst +f:Documentation/translations/zh_CN/cpu-freq/index.rst +f:Documentation/translations/zh_CN/dev-tools/gcov.rst +f:Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst +f:Documentation/translations/zh_CN/dev-tools/index.rst +f:Documentation/translations/zh_CN/dev-tools/kasan.rst +f:Documentation/translations/zh_CN/dev-tools/kcov.rst +f:Documentation/translations/zh_CN/dev-tools/kcsan.rst +f:Documentation/translations/zh_CN/dev-tools/kmemleak.rst +f:Documentation/translations/zh_CN/dev-tools/kmsan.rst +f:Documentation/translations/zh_CN/dev-tools/sparse.rst +f:Documentation/translations/zh_CN/dev-tools/testing-overview.rst +f:Documentation/translations/zh_CN/dev-tools/ubsan.rst +f:Documentation/translations/zh_CN/devicetree/changesets.rst +f:Documentation/translations/zh_CN/devicetree/dynamic-resolution-notes.rst +f:Documentation/translations/zh_CN/devicetree/index.rst +f:Documentation/translations/zh_CN/devicetree/kernel-api.rst +f:Documentation/translations/zh_CN/devicetree/of_unittest.rst +f:Documentation/translations/zh_CN/devicetree/overlay-notes.rst +f:Documentation/translations/zh_CN/devicetree/usage-model.rst +f:Documentation/translations/zh_CN/disclaimer-zh_CN.rst +f:Documentation/translations/zh_CN/doc-guide/checktransupdate.rst +f:Documentation/translations/zh_CN/doc-guide/contributing.rst +f:Documentation/translations/zh_CN/doc-guide/index.rst +f:Documentation/translations/zh_CN/doc-guide/kernel-doc.rst +f:Documentation/translations/zh_CN/doc-guide/maintainer-profile.rst +f:Documentation/translations/zh_CN/doc-guide/parse-headers.rst +f:Documentation/translations/zh_CN/doc-guide/sphinx.rst +f:Documentation/translations/zh_CN/driver-api/gpio/index.rst +f:Documentation/translations/zh_CN/driver-api/index.rst +f:Documentation/translations/zh_CN/driver-api/io_ordering.rst +f:Documentation/translations/zh_CN/driver-api/phy/index.rst +f:Documentation/translations/zh_CN/driver-api/phy/phy.rst +f:Documentation/translations/zh_CN/filesystems/debugfs.rst +f:Documentation/translations/zh_CN/filesystems/index.rst +f:Documentation/translations/zh_CN/filesystems/sysfs.txt +f:Documentation/translations/zh_CN/filesystems/tmpfs.rst +f:Documentation/translations/zh_CN/filesystems/virtiofs.rst +f:Documentation/translations/zh_CN/glossary.rst +f:Documentation/translations/zh_CN/how-to.rst +f:Documentation/translations/zh_CN/iio/ep93xx_adc.rst +f:Documentation/translations/zh_CN/iio/iio_configfs.rst +f:Documentation/translations/zh_CN/iio/index.rst +f:Documentation/translations/zh_CN/index.rst +f:Documentation/translations/zh_CN/infiniband/core_locking.rst +f:Documentation/translations/zh_CN/infiniband/index.rst +f:Documentation/translations/zh_CN/infiniband/ipoib.rst +f:Documentation/translations/zh_CN/infiniband/opa_vnic.rst +f:Documentation/translations/zh_CN/infiniband/sysfs.rst +f:Documentation/translations/zh_CN/infiniband/tag_matching.rst +f:Documentation/translations/zh_CN/infiniband/user_mad.rst +f:Documentation/translations/zh_CN/infiniband/user_verbs.rst +f:Documentation/translations/zh_CN/kbuild/gcc-plugins.rst +f:Documentation/translations/zh_CN/kbuild/headers_install.rst +f:Documentation/translations/zh_CN/kbuild/index.rst +f:Documentation/translations/zh_CN/kbuild/kbuild.rst +f:Documentation/translations/zh_CN/kbuild/kconfig.rst +f:Documentation/translations/zh_CN/kbuild/llvm.rst +f:Documentation/translations/zh_CN/kbuild/reproducible-builds.rst +f:Documentation/translations/zh_CN/kernel-hacking/hacking.rst +f:Documentation/translations/zh_CN/kernel-hacking/index.rst +f:Documentation/translations/zh_CN/locking/index.rst +f:Documentation/translations/zh_CN/locking/mutex-design.rst +f:Documentation/translations/zh_CN/locking/spinlocks.rst +f:Documentation/translations/zh_CN/maintainer/configure-git.rst +f:Documentation/translations/zh_CN/maintainer/index.rst +f:Documentation/translations/zh_CN/maintainer/maintainer-entry-profile.rst +f:Documentation/translations/zh_CN/maintainer/modifying-patches.rst +f:Documentation/translations/zh_CN/maintainer/pull-requests.rst +f:Documentation/translations/zh_CN/maintainer/rebasing-and-merging.rst +f:Documentation/translations/zh_CN/mm/active_mm.rst +f:Documentation/translations/zh_CN/mm/balance.rst +f:Documentation/translations/zh_CN/mm/damon/api.rst +f:Documentation/translations/zh_CN/mm/damon/design.rst +f:Documentation/translations/zh_CN/mm/damon/faq.rst +f:Documentation/translations/zh_CN/mm/damon/index.rst +f:Documentation/translations/zh_CN/mm/free_page_reporting.rst +f:Documentation/translations/zh_CN/mm/highmem.rst +f:Documentation/translations/zh_CN/mm/hmm.rst +f:Documentation/translations/zh_CN/mm/hugetlbfs_reserv.rst +f:Documentation/translations/zh_CN/mm/hwpoison.rst +f:Documentation/translations/zh_CN/mm/index.rst +f:Documentation/translations/zh_CN/mm/ksm.rst +f:Documentation/translations/zh_CN/mm/memory-model.rst +f:Documentation/translations/zh_CN/mm/mmu_notifier.rst +f:Documentation/translations/zh_CN/mm/numa.rst +f:Documentation/translations/zh_CN/mm/overcommit-accounting.rst +f:Documentation/translations/zh_CN/mm/page_frags.rst +f:Documentation/translations/zh_CN/mm/page_migration.rst +f:Documentation/translations/zh_CN/mm/page_owner.rst +f:Documentation/translations/zh_CN/mm/page_table_check.rst +f:Documentation/translations/zh_CN/mm/page_tables.rst +f:Documentation/translations/zh_CN/mm/physical_memory.rst +f:Documentation/translations/zh_CN/mm/remap_file_pages.rst +f:Documentation/translations/zh_CN/mm/split_page_table_lock.rst +f:Documentation/translations/zh_CN/mm/vmalloced-kernel-stacks.rst +f:Documentation/translations/zh_CN/mm/zsmalloc.rst +f:Documentation/translations/zh_CN/networking/alias.rst +f:Documentation/translations/zh_CN/networking/index.rst +f:Documentation/translations/zh_CN/networking/msg_zerocopy.rst +f:Documentation/translations/zh_CN/networking/napi.rst +f:Documentation/translations/zh_CN/networking/netif-msg.rst +f:Documentation/translations/zh_CN/networking/netmem.rst +f:Documentation/translations/zh_CN/networking/vxlan.rst +f:Documentation/translations/zh_CN/networking/xfrm_proc.rst +f:Documentation/translations/zh_CN/peci/index.rst +f:Documentation/translations/zh_CN/peci/peci.rst +f:Documentation/translations/zh_CN/power/energy-model.rst +f:Documentation/translations/zh_CN/power/index.rst +f:Documentation/translations/zh_CN/power/opp.rst +f:Documentation/translations/zh_CN/process/1.Intro.rst +f:Documentation/translations/zh_CN/process/2.Process.rst +f:Documentation/translations/zh_CN/process/3.Early-stage.rst +f:Documentation/translations/zh_CN/process/4.Coding.rst +f:Documentation/translations/zh_CN/process/5.Posting.rst +f:Documentation/translations/zh_CN/process/6.Followthrough.rst +f:Documentation/translations/zh_CN/process/7.AdvancedTopics.rst +f:Documentation/translations/zh_CN/process/8.Conclusion.rst +f:Documentation/translations/zh_CN/process/code-of-conduct-interpretation.rst +f:Documentation/translations/zh_CN/process/code-of-conduct.rst +f:Documentation/translations/zh_CN/process/coding-style.rst +f:Documentation/translations/zh_CN/process/cve.rst +f:Documentation/translations/zh_CN/process/development-process.rst +f:Documentation/translations/zh_CN/process/email-clients.rst +f:Documentation/translations/zh_CN/process/embargoed-hardware-issues.rst +f:Documentation/translations/zh_CN/process/howto.rst +f:Documentation/translations/zh_CN/process/index.rst +f:Documentation/translations/zh_CN/process/kernel-driver-statement.rst +f:Documentation/translations/zh_CN/process/kernel-enforcement-statement.rst +f:Documentation/translations/zh_CN/process/license-rules.rst +f:Documentation/translations/zh_CN/process/magic-number.rst +f:Documentation/translations/zh_CN/process/maintainer-pgp-guide.rst +f:Documentation/translations/zh_CN/process/management-style.rst +f:Documentation/translations/zh_CN/process/programming-language.rst +f:Documentation/translations/zh_CN/process/researcher-guidelines.rst +f:Documentation/translations/zh_CN/process/security-bugs.rst +f:Documentation/translations/zh_CN/process/stable-api-nonsense.rst +f:Documentation/translations/zh_CN/process/stable-kernel-rules.rst +f:Documentation/translations/zh_CN/process/submit-checklist.rst +f:Documentation/translations/zh_CN/process/submitting-patches.rst +f:Documentation/translations/zh_CN/process/volatile-considered-harmful.rst +f:Documentation/translations/zh_CN/rust/arch-support.rst +f:Documentation/translations/zh_CN/rust/coding-guidelines.rst +f:Documentation/translations/zh_CN/rust/general-information.rst +f:Documentation/translations/zh_CN/rust/index.rst +f:Documentation/translations/zh_CN/rust/quick-start.rst +f:Documentation/translations/zh_CN/scheduler/completion.rst +f:Documentation/translations/zh_CN/scheduler/index.rst +f:Documentation/translations/zh_CN/scheduler/sched-arch.rst +f:Documentation/translations/zh_CN/scheduler/sched-bwc.rst +f:Documentation/translations/zh_CN/scheduler/sched-capacity.rst +f:Documentation/translations/zh_CN/scheduler/sched-debug.rst +f:Documentation/translations/zh_CN/scheduler/sched-design-CFS.rst +f:Documentation/translations/zh_CN/scheduler/sched-domains.rst +f:Documentation/translations/zh_CN/scheduler/sched-energy.rst +f:Documentation/translations/zh_CN/scheduler/sched-nice-design.rst +f:Documentation/translations/zh_CN/scheduler/sched-stats.rst +f:Documentation/translations/zh_CN/scheduler/schedutil.rst +f:Documentation/translations/zh_CN/security/IMA-templates.rst +f:Documentation/translations/zh_CN/security/credentials.rst +f:Documentation/translations/zh_CN/security/digsig.rst +f:Documentation/translations/zh_CN/security/index.rst +f:Documentation/translations/zh_CN/security/keys/index.rst +f:Documentation/translations/zh_CN/security/landlock.rst +f:Documentation/translations/zh_CN/security/lsm.rst +f:Documentation/translations/zh_CN/security/sak.rst +f:Documentation/translations/zh_CN/security/secrets/index.rst +f:Documentation/translations/zh_CN/security/self-protection.rst +f:Documentation/translations/zh_CN/security/siphash.rst +f:Documentation/translations/zh_CN/security/snp-tdx-threat-model.rst +f:Documentation/translations/zh_CN/security/tpm/index.rst +f:Documentation/translations/zh_CN/security/tpm/tpm-security.rst +f:Documentation/translations/zh_CN/security/tpm/tpm_event_log.rst +f:Documentation/translations/zh_CN/security/tpm/tpm_ftpm_tee.rst +f:Documentation/translations/zh_CN/security/tpm/tpm_tis.rst +f:Documentation/translations/zh_CN/security/tpm/tpm_vtpm_proxy.rst +f:Documentation/translations/zh_CN/security/tpm/xen-tpmfront.rst +f:Documentation/translations/zh_CN/sound/hd-audio/controls.rst +f:Documentation/translations/zh_CN/sound/hd-audio/index.rst +f:Documentation/translations/zh_CN/sound/index.rst +f:Documentation/translations/zh_CN/staging/index.rst +f:Documentation/translations/zh_CN/staging/speculation.rst +f:Documentation/translations/zh_CN/staging/xz.rst +f:Documentation/translations/zh_CN/subsystem-apis.rst +f:Documentation/translations/zh_CN/userspace-api/accelerators/ocxl.rst +f:Documentation/translations/zh_CN/userspace-api/ebpf/index.rst +f:Documentation/translations/zh_CN/userspace-api/ebpf/syscall.rst +f:Documentation/translations/zh_CN/userspace-api/futex2.rst +f:Documentation/translations/zh_CN/userspace-api/index.rst +f:Documentation/translations/zh_CN/userspace-api/no_new_privs.rst +f:Documentation/translations/zh_CN/userspace-api/seccomp_filter.rst +f:Documentation/translations/zh_CN/userspace-api/sysfs-platform_profile.rst +f:Documentation/translations/zh_CN/video4linux/omap3isp.txt +f:Documentation/translations/zh_CN/video4linux/v4l2-framework.txt +f:Documentation/translations/zh_CN/virt/acrn/cpuid.rst +f:Documentation/translations/zh_CN/virt/acrn/index.rst +f:Documentation/translations/zh_CN/virt/acrn/introduction.rst +f:Documentation/translations/zh_CN/virt/acrn/io-request.rst +f:Documentation/translations/zh_CN/virt/guest-halt-polling.rst +f:Documentation/translations/zh_CN/virt/index.rst +f:Documentation/translations/zh_CN/virt/ne_overview.rst +f:Documentation/translations/zh_CN/virt/paravirt_ops.rst +f:Documentation/translations/zh_TW/IRQ.txt +f:Documentation/translations/zh_TW/admin-guide/README.rst +f:Documentation/translations/zh_TW/admin-guide/bootconfig.rst +f:Documentation/translations/zh_TW/admin-guide/bug-bisect.rst +f:Documentation/translations/zh_TW/admin-guide/bug-hunting.rst +f:Documentation/translations/zh_TW/admin-guide/clearing-warn-once.rst +f:Documentation/translations/zh_TW/admin-guide/cpu-load.rst +f:Documentation/translations/zh_TW/admin-guide/cputopology.rst +f:Documentation/translations/zh_TW/admin-guide/index.rst +f:Documentation/translations/zh_TW/admin-guide/init.rst +f:Documentation/translations/zh_TW/admin-guide/lockup-watchdogs.rst +f:Documentation/translations/zh_TW/admin-guide/mm/damon/index.rst +f:Documentation/translations/zh_TW/admin-guide/mm/damon/lru_sort.rst +f:Documentation/translations/zh_TW/admin-guide/mm/damon/reclaim.rst +f:Documentation/translations/zh_TW/admin-guide/mm/damon/start.rst +f:Documentation/translations/zh_TW/admin-guide/mm/damon/usage.rst +f:Documentation/translations/zh_TW/admin-guide/mm/index.rst +f:Documentation/translations/zh_TW/admin-guide/mm/ksm.rst +f:Documentation/translations/zh_TW/admin-guide/reporting-issues.rst +f:Documentation/translations/zh_TW/admin-guide/reporting-regressions.rst +f:Documentation/translations/zh_TW/admin-guide/security-bugs.rst +f:Documentation/translations/zh_TW/admin-guide/sysrq.rst +f:Documentation/translations/zh_TW/admin-guide/tainted-kernels.rst +f:Documentation/translations/zh_TW/admin-guide/unicode.rst +f:Documentation/translations/zh_TW/arch/arm/Booting +f:Documentation/translations/zh_TW/arch/arm/kernel_user_helpers.txt +f:Documentation/translations/zh_TW/arch/arm64/amu.rst +f:Documentation/translations/zh_TW/arch/arm64/booting.txt +f:Documentation/translations/zh_TW/arch/arm64/elf_hwcaps.rst +f:Documentation/translations/zh_TW/arch/arm64/hugetlbpage.rst +f:Documentation/translations/zh_TW/arch/arm64/index.rst +f:Documentation/translations/zh_TW/arch/arm64/legacy_instructions.txt +f:Documentation/translations/zh_TW/arch/arm64/memory.txt +f:Documentation/translations/zh_TW/arch/arm64/perf.rst +f:Documentation/translations/zh_TW/arch/arm64/silicon-errata.txt +f:Documentation/translations/zh_TW/arch/arm64/tagged-pointers.txt +f:Documentation/translations/zh_TW/arch/index.rst +f:Documentation/translations/zh_TW/arch/loongarch/booting.rst +f:Documentation/translations/zh_TW/arch/loongarch/features.rst +f:Documentation/translations/zh_TW/arch/loongarch/index.rst +f:Documentation/translations/zh_TW/arch/loongarch/introduction.rst +f:Documentation/translations/zh_TW/arch/loongarch/irq-chip-model.rst +f:Documentation/translations/zh_TW/arch/mips/booting.rst +f:Documentation/translations/zh_TW/arch/mips/features.rst +f:Documentation/translations/zh_TW/arch/mips/index.rst +f:Documentation/translations/zh_TW/arch/mips/ingenic-tcu.rst +f:Documentation/translations/zh_TW/arch/openrisc/index.rst +f:Documentation/translations/zh_TW/arch/openrisc/openrisc_port.rst +f:Documentation/translations/zh_TW/arch/openrisc/todo.rst +f:Documentation/translations/zh_TW/arch/parisc/debugging.rst +f:Documentation/translations/zh_TW/arch/parisc/index.rst +f:Documentation/translations/zh_TW/arch/parisc/registers.rst +f:Documentation/translations/zh_TW/cpu-freq/core.rst +f:Documentation/translations/zh_TW/cpu-freq/cpu-drivers.rst +f:Documentation/translations/zh_TW/cpu-freq/cpufreq-stats.rst +f:Documentation/translations/zh_TW/cpu-freq/index.rst +f:Documentation/translations/zh_TW/dev-tools/gcov.rst +f:Documentation/translations/zh_TW/dev-tools/gdb-kernel-debugging.rst +f:Documentation/translations/zh_TW/dev-tools/index.rst +f:Documentation/translations/zh_TW/dev-tools/kasan.rst +f:Documentation/translations/zh_TW/dev-tools/sparse.rst +f:Documentation/translations/zh_TW/dev-tools/testing-overview.rst +f:Documentation/translations/zh_TW/disclaimer-zh_TW.rst +f:Documentation/translations/zh_TW/filesystems/debugfs.rst +f:Documentation/translations/zh_TW/filesystems/index.rst +f:Documentation/translations/zh_TW/filesystems/sysfs.txt +f:Documentation/translations/zh_TW/filesystems/tmpfs.rst +f:Documentation/translations/zh_TW/filesystems/virtiofs.rst +f:Documentation/translations/zh_TW/index.rst +f:Documentation/translations/zh_TW/io_ordering.txt +f:Documentation/translations/zh_TW/process/1.Intro.rst +f:Documentation/translations/zh_TW/process/2.Process.rst +f:Documentation/translations/zh_TW/process/3.Early-stage.rst +f:Documentation/translations/zh_TW/process/4.Coding.rst +f:Documentation/translations/zh_TW/process/5.Posting.rst +f:Documentation/translations/zh_TW/process/6.Followthrough.rst +f:Documentation/translations/zh_TW/process/7.AdvancedTopics.rst +f:Documentation/translations/zh_TW/process/8.Conclusion.rst +f:Documentation/translations/zh_TW/process/code-of-conduct-interpretation.rst +f:Documentation/translations/zh_TW/process/code-of-conduct.rst +f:Documentation/translations/zh_TW/process/coding-style.rst +f:Documentation/translations/zh_TW/process/development-process.rst +f:Documentation/translations/zh_TW/process/email-clients.rst +f:Documentation/translations/zh_TW/process/embargoed-hardware-issues.rst +f:Documentation/translations/zh_TW/process/howto.rst +f:Documentation/translations/zh_TW/process/index.rst +f:Documentation/translations/zh_TW/process/kernel-driver-statement.rst +f:Documentation/translations/zh_TW/process/kernel-enforcement-statement.rst +f:Documentation/translations/zh_TW/process/license-rules.rst +f:Documentation/translations/zh_TW/process/magic-number.rst +f:Documentation/translations/zh_TW/process/management-style.rst +f:Documentation/translations/zh_TW/process/programming-language.rst +f:Documentation/translations/zh_TW/process/stable-api-nonsense.rst +f:Documentation/translations/zh_TW/process/stable-kernel-rules.rst +f:Documentation/translations/zh_TW/process/submit-checklist.rst +f:Documentation/translations/zh_TW/process/submitting-patches.rst +f:Documentation/translations/zh_TW/process/volatile-considered-harmful.rst +f:Documentation/usb/CREDITS +f:Documentation/usb/acm.rst +f:Documentation/usb/authorization.rst +f:Documentation/usb/chipidea.rst +f:Documentation/usb/dwc3.rst +f:Documentation/usb/ehci.rst +f:Documentation/usb/functionfs-desc.rst +f:Documentation/usb/functionfs.rst +f:Documentation/usb/gadget-testing.rst +f:Documentation/usb/gadget_configfs.rst +f:Documentation/usb/gadget_hid.rst +f:Documentation/usb/gadget_multi.rst +f:Documentation/usb/gadget_printer.rst +f:Documentation/usb/gadget_serial.rst +f:Documentation/usb/gadget_uvc.rst +f:Documentation/usb/index.rst +f:Documentation/usb/iuu_phoenix.rst +f:Documentation/usb/linux-cdc-acm.inf +f:Documentation/usb/linux.inf +f:Documentation/usb/mass-storage.rst +f:Documentation/usb/misc_usbsevseg.rst +f:Documentation/usb/mtouchusb.rst +f:Documentation/usb/ohci.rst +f:Documentation/usb/raw-gadget.rst +f:Documentation/usb/text_files.rst +f:Documentation/usb/usb-help.rst +f:Documentation/usb/usb-serial.rst +f:Documentation/usb/usbdevfs-drop-permissions.c +f:Documentation/usb/usbip_protocol.rst +f:Documentation/usb/usbmon.rst +f:Documentation/userspace-api/ELF.rst +f:Documentation/userspace-api/accelerators/ocxl.rst +f:Documentation/userspace-api/check_exec.rst +f:Documentation/userspace-api/dcdbas.rst +f:Documentation/userspace-api/dma-buf-alloc-exchange.rst +f:Documentation/userspace-api/dma-buf-heaps.rst +f:Documentation/userspace-api/ebpf/index.rst +f:Documentation/userspace-api/ebpf/syscall.rst +f:Documentation/userspace-api/futex2.rst +f:Documentation/userspace-api/fwctl/fwctl-cxl.rst +f:Documentation/userspace-api/fwctl/fwctl.rst +f:Documentation/userspace-api/fwctl/index.rst +f:Documentation/userspace-api/fwctl/pds_fwctl.rst +f:Documentation/userspace-api/gpio/chardev.rst +f:Documentation/userspace-api/gpio/chardev_v1.rst +f:Documentation/userspace-api/gpio/error-codes.rst +f:Documentation/userspace-api/gpio/gpio-get-chipinfo-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-get-lineevent-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-get-linehandle-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-get-lineinfo-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-get-lineinfo-unwatch-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-get-lineinfo-watch-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-handle-get-line-values-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-handle-set-config-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-handle-set-line-values-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-lineevent-data-read.rst +f:Documentation/userspace-api/gpio/gpio-lineinfo-changed-read.rst +f:Documentation/userspace-api/gpio/gpio-v2-get-line-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-v2-get-lineinfo-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-v2-get-lineinfo-watch-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-v2-line-event-read.rst +f:Documentation/userspace-api/gpio/gpio-v2-line-get-values-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-v2-line-set-config-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-v2-line-set-values-ioctl.rst +f:Documentation/userspace-api/gpio/gpio-v2-lineinfo-changed-read.rst +f:Documentation/userspace-api/gpio/index.rst +f:Documentation/userspace-api/gpio/obsolete.rst +f:Documentation/userspace-api/gpio/sysfs.rst +f:Documentation/userspace-api/index.rst +f:Documentation/userspace-api/ioctl/cdrom.rst +f:Documentation/userspace-api/ioctl/hdio.rst +f:Documentation/userspace-api/ioctl/index.rst +f:Documentation/userspace-api/ioctl/ioctl-decoding.rst +f:Documentation/userspace-api/ioctl/ioctl-number.rst +f:Documentation/userspace-api/iommufd.rst +f:Documentation/userspace-api/isapnp.rst +f:Documentation/userspace-api/landlock.rst +f:Documentation/userspace-api/lsm.rst +f:Documentation/userspace-api/media/Makefile +f:Documentation/userspace-api/media/ca.h.rst.exceptions +f:Documentation/userspace-api/media/cec.h.rst.exceptions +f:Documentation/userspace-api/media/cec/cec-api.rst +f:Documentation/userspace-api/media/cec/cec-func-close.rst +f:Documentation/userspace-api/media/cec/cec-func-ioctl.rst +f:Documentation/userspace-api/media/cec/cec-func-open.rst +f:Documentation/userspace-api/media/cec/cec-func-poll.rst +f:Documentation/userspace-api/media/cec/cec-funcs.rst +f:Documentation/userspace-api/media/cec/cec-header.rst +f:Documentation/userspace-api/media/cec/cec-intro.rst +f:Documentation/userspace-api/media/cec/cec-ioc-adap-g-caps.rst +f:Documentation/userspace-api/media/cec/cec-ioc-adap-g-conn-info.rst +f:Documentation/userspace-api/media/cec/cec-ioc-adap-g-log-addrs.rst +f:Documentation/userspace-api/media/cec/cec-ioc-adap-g-phys-addr.rst +f:Documentation/userspace-api/media/cec/cec-ioc-dqevent.rst +f:Documentation/userspace-api/media/cec/cec-ioc-g-mode.rst +f:Documentation/userspace-api/media/cec/cec-ioc-receive.rst +f:Documentation/userspace-api/media/cec/cec-pin-error-inj.rst +f:Documentation/userspace-api/media/conf_nitpick.py +f:Documentation/userspace-api/media/dmx.h.rst.exceptions +f:Documentation/userspace-api/media/drivers/aspeed-video.rst +f:Documentation/userspace-api/media/drivers/camera-sensor.rst +f:Documentation/userspace-api/media/drivers/ccs.rst +f:Documentation/userspace-api/media/drivers/cx2341x-uapi.rst +f:Documentation/userspace-api/media/drivers/dw100.rst +f:Documentation/userspace-api/media/drivers/imx-uapi.rst +f:Documentation/userspace-api/media/drivers/index.rst +f:Documentation/userspace-api/media/drivers/max2175.rst +f:Documentation/userspace-api/media/drivers/npcm-video.rst +f:Documentation/userspace-api/media/drivers/omap3isp-uapi.rst +f:Documentation/userspace-api/media/drivers/thp7312.rst +f:Documentation/userspace-api/media/drivers/uvcvideo.rst +f:Documentation/userspace-api/media/drivers/vgxy61.rst +f:Documentation/userspace-api/media/dvb/ca-fclose.rst +f:Documentation/userspace-api/media/dvb/ca-fopen.rst +f:Documentation/userspace-api/media/dvb/ca-get-cap.rst +f:Documentation/userspace-api/media/dvb/ca-get-descr-info.rst +f:Documentation/userspace-api/media/dvb/ca-get-msg.rst +f:Documentation/userspace-api/media/dvb/ca-get-slot-info.rst +f:Documentation/userspace-api/media/dvb/ca-reset.rst +f:Documentation/userspace-api/media/dvb/ca-send-msg.rst +f:Documentation/userspace-api/media/dvb/ca-set-descr.rst +f:Documentation/userspace-api/media/dvb/ca.rst +f:Documentation/userspace-api/media/dvb/ca_data_types.rst +f:Documentation/userspace-api/media/dvb/ca_function_calls.rst +f:Documentation/userspace-api/media/dvb/ca_high_level.rst +f:Documentation/userspace-api/media/dvb/demux.rst +f:Documentation/userspace-api/media/dvb/dmx-add-pid.rst +f:Documentation/userspace-api/media/dvb/dmx-expbuf.rst +f:Documentation/userspace-api/media/dvb/dmx-fclose.rst +f:Documentation/userspace-api/media/dvb/dmx-fopen.rst +f:Documentation/userspace-api/media/dvb/dmx-fread.rst +f:Documentation/userspace-api/media/dvb/dmx-fwrite.rst +f:Documentation/userspace-api/media/dvb/dmx-get-pes-pids.rst +f:Documentation/userspace-api/media/dvb/dmx-get-stc.rst +f:Documentation/userspace-api/media/dvb/dmx-mmap.rst +f:Documentation/userspace-api/media/dvb/dmx-munmap.rst +f:Documentation/userspace-api/media/dvb/dmx-qbuf.rst +f:Documentation/userspace-api/media/dvb/dmx-querybuf.rst +f:Documentation/userspace-api/media/dvb/dmx-remove-pid.rst +f:Documentation/userspace-api/media/dvb/dmx-reqbufs.rst +f:Documentation/userspace-api/media/dvb/dmx-set-buffer-size.rst +f:Documentation/userspace-api/media/dvb/dmx-set-filter.rst +f:Documentation/userspace-api/media/dvb/dmx-set-pes-filter.rst +f:Documentation/userspace-api/media/dvb/dmx-start.rst +f:Documentation/userspace-api/media/dvb/dmx-stop.rst +f:Documentation/userspace-api/media/dvb/dmx_fcalls.rst +f:Documentation/userspace-api/media/dvb/dmx_types.rst +f:Documentation/userspace-api/media/dvb/dvb-fe-read-status.rst +f:Documentation/userspace-api/media/dvb/dvb-frontend-event.rst +f:Documentation/userspace-api/media/dvb/dvb-frontend-parameters.rst +f:Documentation/userspace-api/media/dvb/dvbapi.rst +f:Documentation/userspace-api/media/dvb/dvbproperty.rst +f:Documentation/userspace-api/media/dvb/dvbstb.svg +f:Documentation/userspace-api/media/dvb/examples.rst +f:Documentation/userspace-api/media/dvb/fe-bandwidth-t.rst +f:Documentation/userspace-api/media/dvb/fe-diseqc-recv-slave-reply.rst +f:Documentation/userspace-api/media/dvb/fe-diseqc-reset-overload.rst +f:Documentation/userspace-api/media/dvb/fe-diseqc-send-burst.rst +f:Documentation/userspace-api/media/dvb/fe-diseqc-send-master-cmd.rst +f:Documentation/userspace-api/media/dvb/fe-dishnetwork-send-legacy-cmd.rst +f:Documentation/userspace-api/media/dvb/fe-enable-high-lnb-voltage.rst +f:Documentation/userspace-api/media/dvb/fe-get-event.rst +f:Documentation/userspace-api/media/dvb/fe-get-frontend.rst +f:Documentation/userspace-api/media/dvb/fe-get-info.rst +f:Documentation/userspace-api/media/dvb/fe-get-property.rst +f:Documentation/userspace-api/media/dvb/fe-read-ber.rst +f:Documentation/userspace-api/media/dvb/fe-read-signal-strength.rst +f:Documentation/userspace-api/media/dvb/fe-read-snr.rst +f:Documentation/userspace-api/media/dvb/fe-read-status.rst +f:Documentation/userspace-api/media/dvb/fe-read-uncorrected-blocks.rst +f:Documentation/userspace-api/media/dvb/fe-set-frontend-tune-mode.rst +f:Documentation/userspace-api/media/dvb/fe-set-frontend.rst +f:Documentation/userspace-api/media/dvb/fe-set-tone.rst +f:Documentation/userspace-api/media/dvb/fe-set-voltage.rst +f:Documentation/userspace-api/media/dvb/fe-type-t.rst +f:Documentation/userspace-api/media/dvb/fe_property_parameters.rst +f:Documentation/userspace-api/media/dvb/frontend-header.rst +f:Documentation/userspace-api/media/dvb/frontend-property-cable-systems.rst +f:Documentation/userspace-api/media/dvb/frontend-property-satellite-systems.rst +f:Documentation/userspace-api/media/dvb/frontend-property-terrestrial-systems.rst +f:Documentation/userspace-api/media/dvb/frontend-stat-properties.rst +f:Documentation/userspace-api/media/dvb/frontend.rst +f:Documentation/userspace-api/media/dvb/frontend_f_close.rst +f:Documentation/userspace-api/media/dvb/frontend_f_open.rst +f:Documentation/userspace-api/media/dvb/frontend_fcalls.rst +f:Documentation/userspace-api/media/dvb/frontend_legacy_api.rst +f:Documentation/userspace-api/media/dvb/frontend_legacy_dvbv3_api.rst +f:Documentation/userspace-api/media/dvb/headers.rst +f:Documentation/userspace-api/media/dvb/intro.rst +f:Documentation/userspace-api/media/dvb/legacy_dvb_apis.rst +f:Documentation/userspace-api/media/dvb/legacy_dvb_audio.rst +f:Documentation/userspace-api/media/dvb/legacy_dvb_decoder_api.rst +f:Documentation/userspace-api/media/dvb/legacy_dvb_osd.rst +f:Documentation/userspace-api/media/dvb/legacy_dvb_video.rst +f:Documentation/userspace-api/media/dvb/net-add-if.rst +f:Documentation/userspace-api/media/dvb/net-get-if.rst +f:Documentation/userspace-api/media/dvb/net-remove-if.rst +f:Documentation/userspace-api/media/dvb/net-types.rst +f:Documentation/userspace-api/media/dvb/net.rst +f:Documentation/userspace-api/media/dvb/query-dvb-frontend-info.rst +f:Documentation/userspace-api/media/fdl-appendix.rst +f:Documentation/userspace-api/media/frontend.h.rst.exceptions +f:Documentation/userspace-api/media/gen-errors.rst +f:Documentation/userspace-api/media/glossary.rst +f:Documentation/userspace-api/media/index.rst +f:Documentation/userspace-api/media/intro.rst +f:Documentation/userspace-api/media/lirc.h.rst.exceptions +f:Documentation/userspace-api/media/media.h.rst.exceptions +f:Documentation/userspace-api/media/mediactl/media-controller-intro.rst +f:Documentation/userspace-api/media/mediactl/media-controller-model.rst +f:Documentation/userspace-api/media/mediactl/media-controller.rst +f:Documentation/userspace-api/media/mediactl/media-func-close.rst +f:Documentation/userspace-api/media/mediactl/media-func-ioctl.rst +f:Documentation/userspace-api/media/mediactl/media-func-open.rst +f:Documentation/userspace-api/media/mediactl/media-funcs.rst +f:Documentation/userspace-api/media/mediactl/media-header.rst +f:Documentation/userspace-api/media/mediactl/media-ioc-device-info.rst +f:Documentation/userspace-api/media/mediactl/media-ioc-enum-entities.rst +f:Documentation/userspace-api/media/mediactl/media-ioc-enum-links.rst +f:Documentation/userspace-api/media/mediactl/media-ioc-g-topology.rst +f:Documentation/userspace-api/media/mediactl/media-ioc-request-alloc.rst +f:Documentation/userspace-api/media/mediactl/media-ioc-setup-link.rst +f:Documentation/userspace-api/media/mediactl/media-request-ioc-queue.rst +f:Documentation/userspace-api/media/mediactl/media-request-ioc-reinit.rst +f:Documentation/userspace-api/media/mediactl/media-types.rst +f:Documentation/userspace-api/media/mediactl/request-api.rst +f:Documentation/userspace-api/media/mediactl/request-func-close.rst +f:Documentation/userspace-api/media/mediactl/request-func-ioctl.rst +f:Documentation/userspace-api/media/mediactl/request-func-poll.rst +f:Documentation/userspace-api/media/net.h.rst.exceptions +f:Documentation/userspace-api/media/rc/keytable.c.rst +f:Documentation/userspace-api/media/rc/lirc-dev-intro.rst +f:Documentation/userspace-api/media/rc/lirc-dev.rst +f:Documentation/userspace-api/media/rc/lirc-func.rst +f:Documentation/userspace-api/media/rc/lirc-get-features.rst +f:Documentation/userspace-api/media/rc/lirc-get-rec-mode.rst +f:Documentation/userspace-api/media/rc/lirc-get-rec-resolution.rst +f:Documentation/userspace-api/media/rc/lirc-get-send-mode.rst +f:Documentation/userspace-api/media/rc/lirc-get-timeout.rst +f:Documentation/userspace-api/media/rc/lirc-header.rst +f:Documentation/userspace-api/media/rc/lirc-read.rst +f:Documentation/userspace-api/media/rc/lirc-set-measure-carrier-mode.rst +f:Documentation/userspace-api/media/rc/lirc-set-rec-carrier-range.rst +f:Documentation/userspace-api/media/rc/lirc-set-rec-carrier.rst +f:Documentation/userspace-api/media/rc/lirc-set-rec-timeout.rst +f:Documentation/userspace-api/media/rc/lirc-set-send-carrier.rst +f:Documentation/userspace-api/media/rc/lirc-set-send-duty-cycle.rst +f:Documentation/userspace-api/media/rc/lirc-set-transmitter-mask.rst +f:Documentation/userspace-api/media/rc/lirc-set-wideband-receiver.rst +f:Documentation/userspace-api/media/rc/lirc-write.rst +f:Documentation/userspace-api/media/rc/rc-intro.rst +f:Documentation/userspace-api/media/rc/rc-protos.rst +f:Documentation/userspace-api/media/rc/rc-sysfs-nodes.rst +f:Documentation/userspace-api/media/rc/rc-table-change.rst +f:Documentation/userspace-api/media/rc/rc-tables.rst +f:Documentation/userspace-api/media/rc/remote_controllers.rst +f:Documentation/userspace-api/media/typical_media_device.svg +f:Documentation/userspace-api/media/v4l/app-pri.rst +f:Documentation/userspace-api/media/v4l/audio.rst +f:Documentation/userspace-api/media/v4l/bayer.svg +f:Documentation/userspace-api/media/v4l/biblio.rst +f:Documentation/userspace-api/media/v4l/buffer.rst +f:Documentation/userspace-api/media/v4l/capture-example.rst +f:Documentation/userspace-api/media/v4l/capture.c.rst +f:Documentation/userspace-api/media/v4l/colorspaces-defs.rst +f:Documentation/userspace-api/media/v4l/colorspaces-details.rst +f:Documentation/userspace-api/media/v4l/colorspaces.rst +f:Documentation/userspace-api/media/v4l/common-defs.rst +f:Documentation/userspace-api/media/v4l/common.rst +f:Documentation/userspace-api/media/v4l/compat.rst +f:Documentation/userspace-api/media/v4l/constraints.svg +f:Documentation/userspace-api/media/v4l/control.rst +f:Documentation/userspace-api/media/v4l/crop.rst +f:Documentation/userspace-api/media/v4l/crop.svg +f:Documentation/userspace-api/media/v4l/depth-formats.rst +f:Documentation/userspace-api/media/v4l/dev-capture.rst +f:Documentation/userspace-api/media/v4l/dev-decoder.rst +f:Documentation/userspace-api/media/v4l/dev-encoder.rst +f:Documentation/userspace-api/media/v4l/dev-event.rst +f:Documentation/userspace-api/media/v4l/dev-mem2mem.rst +f:Documentation/userspace-api/media/v4l/dev-meta.rst +f:Documentation/userspace-api/media/v4l/dev-osd.rst +f:Documentation/userspace-api/media/v4l/dev-output.rst +f:Documentation/userspace-api/media/v4l/dev-overlay.rst +f:Documentation/userspace-api/media/v4l/dev-radio.rst +f:Documentation/userspace-api/media/v4l/dev-raw-vbi.rst +f:Documentation/userspace-api/media/v4l/dev-rds.rst +f:Documentation/userspace-api/media/v4l/dev-sdr.rst +f:Documentation/userspace-api/media/v4l/dev-sliced-vbi.rst +f:Documentation/userspace-api/media/v4l/dev-stateless-decoder.rst +f:Documentation/userspace-api/media/v4l/dev-subdev.rst +f:Documentation/userspace-api/media/v4l/dev-touch.rst +f:Documentation/userspace-api/media/v4l/devices.rst +f:Documentation/userspace-api/media/v4l/diff-v4l.rst +f:Documentation/userspace-api/media/v4l/dmabuf.rst +f:Documentation/userspace-api/media/v4l/dv-timings.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-colorimetry.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-detect.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-dv.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-flash.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-fm-rx.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-fm-tx.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-image-source.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-jpeg.rst +f:Documentation/userspace-api/media/v4l/ext-ctrls-rf-tuner.rst +f:Documentation/userspace-api/media/v4l/extended-controls.rst +f:Documentation/userspace-api/media/v4l/field-order.rst +f:Documentation/userspace-api/media/v4l/fieldseq_bt.svg +f:Documentation/userspace-api/media/v4l/fieldseq_tb.svg +f:Documentation/userspace-api/media/v4l/format.rst +f:Documentation/userspace-api/media/v4l/fourcc.rst +f:Documentation/userspace-api/media/v4l/func-close.rst +f:Documentation/userspace-api/media/v4l/func-ioctl.rst +f:Documentation/userspace-api/media/v4l/func-mmap.rst +f:Documentation/userspace-api/media/v4l/func-munmap.rst +f:Documentation/userspace-api/media/v4l/func-open.rst +f:Documentation/userspace-api/media/v4l/func-poll.rst +f:Documentation/userspace-api/media/v4l/func-read.rst +f:Documentation/userspace-api/media/v4l/func-select.rst +f:Documentation/userspace-api/media/v4l/func-write.rst +f:Documentation/userspace-api/media/v4l/hist-v4l2.rst +f:Documentation/userspace-api/media/v4l/hsv-formats.rst +f:Documentation/userspace-api/media/v4l/io.rst +f:Documentation/userspace-api/media/v4l/libv4l-introduction.rst +f:Documentation/userspace-api/media/v4l/libv4l.rst +f:Documentation/userspace-api/media/v4l/meta-formats.rst +f:Documentation/userspace-api/media/v4l/metafmt-c3-isp.rst +f:Documentation/userspace-api/media/v4l/metafmt-d4xx.rst +f:Documentation/userspace-api/media/v4l/metafmt-generic.rst +f:Documentation/userspace-api/media/v4l/metafmt-intel-ipu3.rst +f:Documentation/userspace-api/media/v4l/metafmt-pisp-be.rst +f:Documentation/userspace-api/media/v4l/metafmt-pisp-fe.rst +f:Documentation/userspace-api/media/v4l/metafmt-rkisp1.rst +f:Documentation/userspace-api/media/v4l/metafmt-uvc-msxu-1-5.rst +f:Documentation/userspace-api/media/v4l/metafmt-uvc.rst +f:Documentation/userspace-api/media/v4l/metafmt-vivid.rst +f:Documentation/userspace-api/media/v4l/metafmt-vsp1-hgo.rst +f:Documentation/userspace-api/media/v4l/metafmt-vsp1-hgt.rst +f:Documentation/userspace-api/media/v4l/mmap.rst +f:Documentation/userspace-api/media/v4l/mt2110t.svg +f:Documentation/userspace-api/media/v4l/nv12mt.svg +f:Documentation/userspace-api/media/v4l/nv12mt_example.svg +f:Documentation/userspace-api/media/v4l/open.rst +f:Documentation/userspace-api/media/v4l/pipeline.dot +f:Documentation/userspace-api/media/v4l/pixfmt-bayer.rst +f:Documentation/userspace-api/media/v4l/pixfmt-cnf4.rst +f:Documentation/userspace-api/media/v4l/pixfmt-compressed.rst +f:Documentation/userspace-api/media/v4l/pixfmt-indexed.rst +f:Documentation/userspace-api/media/v4l/pixfmt-intro.rst +f:Documentation/userspace-api/media/v4l/pixfmt-inzi.rst +f:Documentation/userspace-api/media/v4l/pixfmt-m420.rst +f:Documentation/userspace-api/media/v4l/pixfmt-packed-hsv.rst +f:Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst +f:Documentation/userspace-api/media/v4l/pixfmt-rawnn-cru.rst +f:Documentation/userspace-api/media/v4l/pixfmt-reserved.rst +f:Documentation/userspace-api/media/v4l/pixfmt-rgb.rst +f:Documentation/userspace-api/media/v4l/pixfmt-sdr-cs08.rst +f:Documentation/userspace-api/media/v4l/pixfmt-sdr-cs14le.rst +f:Documentation/userspace-api/media/v4l/pixfmt-sdr-cu08.rst +f:Documentation/userspace-api/media/v4l/pixfmt-sdr-cu16le.rst +f:Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu16be.rst +f:Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu18be.rst +f:Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu20be.rst +f:Documentation/userspace-api/media/v4l/pixfmt-sdr-ru12le.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb10.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb10alaw8.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb10dpcm8.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb10p.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb12.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb12p.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb14.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb14p.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb16.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb8-pisp-comp.rst +f:Documentation/userspace-api/media/v4l/pixfmt-srggb8.rst +f:Documentation/userspace-api/media/v4l/pixfmt-tch-td08.rst +f:Documentation/userspace-api/media/v4l/pixfmt-tch-td16.rst +f:Documentation/userspace-api/media/v4l/pixfmt-tch-tu08.rst +f:Documentation/userspace-api/media/v4l/pixfmt-tch-tu16.rst +f:Documentation/userspace-api/media/v4l/pixfmt-uv8.rst +f:Documentation/userspace-api/media/v4l/pixfmt-v4l2-mplane.rst +f:Documentation/userspace-api/media/v4l/pixfmt-v4l2.rst +f:Documentation/userspace-api/media/v4l/pixfmt-y12i.rst +f:Documentation/userspace-api/media/v4l/pixfmt-y16i.rst +f:Documentation/userspace-api/media/v4l/pixfmt-y8i.rst +f:Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst +f:Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst +f:Documentation/userspace-api/media/v4l/pixfmt-z16.rst +f:Documentation/userspace-api/media/v4l/pixfmt.rst +f:Documentation/userspace-api/media/v4l/planar-apis.rst +f:Documentation/userspace-api/media/v4l/querycap.rst +f:Documentation/userspace-api/media/v4l/rw.rst +f:Documentation/userspace-api/media/v4l/sdr-formats.rst +f:Documentation/userspace-api/media/v4l/selection-api-configuration.rst +f:Documentation/userspace-api/media/v4l/selection-api-examples.rst +f:Documentation/userspace-api/media/v4l/selection-api-intro.rst +f:Documentation/userspace-api/media/v4l/selection-api-targets.rst +f:Documentation/userspace-api/media/v4l/selection-api-vs-crop-api.rst +f:Documentation/userspace-api/media/v4l/selection-api.rst +f:Documentation/userspace-api/media/v4l/selection.svg +f:Documentation/userspace-api/media/v4l/selections-common.rst +f:Documentation/userspace-api/media/v4l/standard.rst +f:Documentation/userspace-api/media/v4l/streaming-par.rst +f:Documentation/userspace-api/media/v4l/subdev-formats.rst +f:Documentation/userspace-api/media/v4l/subdev-image-processing-crop.svg +f:Documentation/userspace-api/media/v4l/subdev-image-processing-full.svg +f:Documentation/userspace-api/media/v4l/subdev-image-processing-scaling-multi-source.svg +f:Documentation/userspace-api/media/v4l/tch-formats.rst +f:Documentation/userspace-api/media/v4l/tuner.rst +f:Documentation/userspace-api/media/v4l/user-func.rst +f:Documentation/userspace-api/media/v4l/userp.rst +f:Documentation/userspace-api/media/v4l/v4l2-selection-flags.rst +f:Documentation/userspace-api/media/v4l/v4l2-selection-targets.rst +f:Documentation/userspace-api/media/v4l/v4l2.rst +f:Documentation/userspace-api/media/v4l/v4l2grab-example.rst +f:Documentation/userspace-api/media/v4l/v4l2grab.c.rst +f:Documentation/userspace-api/media/v4l/vbi_525.svg +f:Documentation/userspace-api/media/v4l/vbi_625.svg +f:Documentation/userspace-api/media/v4l/vbi_hsync.svg +f:Documentation/userspace-api/media/v4l/video.rst +f:Documentation/userspace-api/media/v4l/videodev.rst +f:Documentation/userspace-api/media/v4l/vidioc-create-bufs.rst +f:Documentation/userspace-api/media/v4l/vidioc-cropcap.rst +f:Documentation/userspace-api/media/v4l/vidioc-dbg-g-chip-info.rst +f:Documentation/userspace-api/media/v4l/vidioc-dbg-g-register.rst +f:Documentation/userspace-api/media/v4l/vidioc-decoder-cmd.rst +f:Documentation/userspace-api/media/v4l/vidioc-dqevent.rst +f:Documentation/userspace-api/media/v4l/vidioc-dv-timings-cap.rst +f:Documentation/userspace-api/media/v4l/vidioc-encoder-cmd.rst +f:Documentation/userspace-api/media/v4l/vidioc-enum-dv-timings.rst +f:Documentation/userspace-api/media/v4l/vidioc-enum-fmt.rst +f:Documentation/userspace-api/media/v4l/vidioc-enum-frameintervals.rst +f:Documentation/userspace-api/media/v4l/vidioc-enum-framesizes.rst +f:Documentation/userspace-api/media/v4l/vidioc-enum-freq-bands.rst +f:Documentation/userspace-api/media/v4l/vidioc-enumaudio.rst +f:Documentation/userspace-api/media/v4l/vidioc-enumaudioout.rst +f:Documentation/userspace-api/media/v4l/vidioc-enuminput.rst +f:Documentation/userspace-api/media/v4l/vidioc-enumoutput.rst +f:Documentation/userspace-api/media/v4l/vidioc-enumstd.rst +f:Documentation/userspace-api/media/v4l/vidioc-expbuf.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-audio.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-audioout.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-crop.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-ctrl.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-dv-timings.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-edid.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-enc-index.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-fbuf.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-fmt.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-frequency.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-input.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-jpegcomp.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-modulator.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-output.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-parm.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-priority.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-selection.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-sliced-vbi-cap.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-std.rst +f:Documentation/userspace-api/media/v4l/vidioc-g-tuner.rst +f:Documentation/userspace-api/media/v4l/vidioc-log-status.rst +f:Documentation/userspace-api/media/v4l/vidioc-overlay.rst +f:Documentation/userspace-api/media/v4l/vidioc-prepare-buf.rst +f:Documentation/userspace-api/media/v4l/vidioc-qbuf.rst +f:Documentation/userspace-api/media/v4l/vidioc-query-dv-timings.rst +f:Documentation/userspace-api/media/v4l/vidioc-querybuf.rst +f:Documentation/userspace-api/media/v4l/vidioc-querycap.rst +f:Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst +f:Documentation/userspace-api/media/v4l/vidioc-querystd.rst +f:Documentation/userspace-api/media/v4l/vidioc-remove-bufs.rst +f:Documentation/userspace-api/media/v4l/vidioc-reqbufs.rst +f:Documentation/userspace-api/media/v4l/vidioc-s-hw-freq-seek.rst +f:Documentation/userspace-api/media/v4l/vidioc-streamon.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-interval.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-enum-frame-size.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-g-client-cap.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-g-crop.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-g-fmt.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-g-frame-interval.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-g-routing.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-g-selection.rst +f:Documentation/userspace-api/media/v4l/vidioc-subdev-querycap.rst +f:Documentation/userspace-api/media/v4l/vidioc-subscribe-event.rst +f:Documentation/userspace-api/media/v4l/yuv-formats.rst +f:Documentation/userspace-api/media/videodev2.h.rst.exceptions +f:Documentation/userspace-api/mfd_noexec.rst +f:Documentation/userspace-api/mseal.rst +f:Documentation/userspace-api/netlink/c-code-gen.rst +f:Documentation/userspace-api/netlink/genetlink-legacy.rst +f:Documentation/userspace-api/netlink/index.rst +f:Documentation/userspace-api/netlink/intro-specs.rst +f:Documentation/userspace-api/netlink/intro.rst +f:Documentation/userspace-api/netlink/netlink-raw.rst +f:Documentation/userspace-api/netlink/specs.rst +f:Documentation/userspace-api/no_new_privs.rst +f:Documentation/userspace-api/ntsync.rst +f:Documentation/userspace-api/perf_ring_buffer.rst +f:Documentation/userspace-api/seccomp_filter.rst +f:Documentation/userspace-api/spec_ctrl.rst +f:Documentation/userspace-api/sysfs-platform_profile.rst +f:Documentation/userspace-api/tee.rst +f:Documentation/userspace-api/unshare.rst +f:Documentation/userspace-api/vduse.rst +f:Documentation/virt/acrn/cpuid.rst +f:Documentation/virt/acrn/index.rst +f:Documentation/virt/acrn/introduction.rst +f:Documentation/virt/acrn/io-request.rst +f:Documentation/virt/coco/sev-guest.rst +f:Documentation/virt/coco/tdx-guest.rst +f:Documentation/virt/guest-halt-polling.rst +f:Documentation/virt/hyperv/clocks.rst +f:Documentation/virt/hyperv/coco.rst +f:Documentation/virt/hyperv/hibernation.rst +f:Documentation/virt/hyperv/index.rst +f:Documentation/virt/hyperv/overview.rst +f:Documentation/virt/hyperv/vmbus.rst +f:Documentation/virt/hyperv/vpci.rst +f:Documentation/virt/index.rst +f:Documentation/virt/kvm/api.rst +f:Documentation/virt/kvm/arm/fw-pseudo-registers.rst +f:Documentation/virt/kvm/arm/hyp-abi.rst +f:Documentation/virt/kvm/arm/hypercalls.rst +f:Documentation/virt/kvm/arm/index.rst +f:Documentation/virt/kvm/arm/ptp_kvm.rst +f:Documentation/virt/kvm/arm/pvtime.rst +f:Documentation/virt/kvm/arm/vcpu-features.rst +f:Documentation/virt/kvm/devices/README +f:Documentation/virt/kvm/devices/arm-vgic-its.rst +f:Documentation/virt/kvm/devices/arm-vgic-v3.rst +f:Documentation/virt/kvm/devices/arm-vgic.rst +f:Documentation/virt/kvm/devices/index.rst +f:Documentation/virt/kvm/devices/mpic.rst +f:Documentation/virt/kvm/devices/s390_flic.rst +f:Documentation/virt/kvm/devices/vcpu.rst +f:Documentation/virt/kvm/devices/vfio.rst +f:Documentation/virt/kvm/devices/vm.rst +f:Documentation/virt/kvm/devices/xics.rst +f:Documentation/virt/kvm/devices/xive.rst +f:Documentation/virt/kvm/halt-polling.rst +f:Documentation/virt/kvm/index.rst +f:Documentation/virt/kvm/locking.rst +f:Documentation/virt/kvm/loongarch/hypercalls.rst +f:Documentation/virt/kvm/loongarch/index.rst +f:Documentation/virt/kvm/ppc-pv.rst +f:Documentation/virt/kvm/review-checklist.rst +f:Documentation/virt/kvm/s390/index.rst +f:Documentation/virt/kvm/s390/s390-diag.rst +f:Documentation/virt/kvm/s390/s390-pv-boot.rst +f:Documentation/virt/kvm/s390/s390-pv-dump.rst +f:Documentation/virt/kvm/s390/s390-pv.rst +f:Documentation/virt/kvm/vcpu-requests.rst +f:Documentation/virt/kvm/x86/amd-memory-encryption.rst +f:Documentation/virt/kvm/x86/cpuid.rst +f:Documentation/virt/kvm/x86/errata.rst +f:Documentation/virt/kvm/x86/hypercalls.rst +f:Documentation/virt/kvm/x86/index.rst +f:Documentation/virt/kvm/x86/intel-tdx.rst +f:Documentation/virt/kvm/x86/mmu.rst +f:Documentation/virt/kvm/x86/msr.rst +f:Documentation/virt/kvm/x86/nested-vmx.rst +f:Documentation/virt/kvm/x86/running-nested-guests.rst +f:Documentation/virt/kvm/x86/timekeeping.rst +f:Documentation/virt/ne_overview.rst +f:Documentation/virt/paravirt_ops.rst +f:Documentation/virt/uml/user_mode_linux_howto_v2.rst +f:Documentation/w1/index.rst +f:Documentation/w1/masters/ds2482.rst +f:Documentation/w1/masters/ds2490.rst +f:Documentation/w1/masters/index.rst +f:Documentation/w1/masters/mxc-w1.rst +f:Documentation/w1/masters/omap-hdq.rst +f:Documentation/w1/masters/w1-gpio.rst +f:Documentation/w1/masters/w1-uart.rst +f:Documentation/w1/slaves/index.rst +f:Documentation/w1/slaves/w1_ds2406.rst +f:Documentation/w1/slaves/w1_ds2413.rst +f:Documentation/w1/slaves/w1_ds2423.rst +f:Documentation/w1/slaves/w1_ds2438.rst +f:Documentation/w1/slaves/w1_ds28e04.rst +f:Documentation/w1/slaves/w1_ds28e17.rst +f:Documentation/w1/slaves/w1_therm.rst +f:Documentation/w1/w1-generic.rst +f:Documentation/w1/w1-netlink.rst +f:Documentation/watchdog/convert_drivers_to_kernel_api.rst +f:Documentation/watchdog/hpwdt.rst +f:Documentation/watchdog/index.rst +f:Documentation/watchdog/mlx-wdt.rst +f:Documentation/watchdog/pcwd-watchdog.rst +f:Documentation/watchdog/watchdog-api.rst +f:Documentation/watchdog/watchdog-kernel-api.rst +f:Documentation/watchdog/watchdog-parameters.rst +f:Documentation/watchdog/watchdog-pm.rst +f:Documentation/watchdog/wdt.rst +f:Documentation/wmi/acpi-interface.rst +f:Documentation/wmi/devices/alienware-wmi.rst +f:Documentation/wmi/devices/dell-wmi-ddv.rst +f:Documentation/wmi/devices/index.rst +f:Documentation/wmi/devices/lenovo-wmi-gamezone.rst +f:Documentation/wmi/devices/lenovo-wmi-other.rst +f:Documentation/wmi/devices/msi-wmi-platform.rst +f:Documentation/wmi/devices/wmi-bmof.rst +f:Documentation/wmi/driver-development-guide.rst +f:Documentation/wmi/index.rst +f:Kbuild +f:Kconfig +f:LICENSES/deprecated/0BSD +f:LICENSES/deprecated/CC0-1.0 +f:LICENSES/deprecated/GFDL-1.1 +f:LICENSES/deprecated/GFDL-1.2 +f:LICENSES/deprecated/GPL-1.0 +f:LICENSES/deprecated/ISC +f:LICENSES/deprecated/Linux-OpenIB +f:LICENSES/deprecated/X11 +f:LICENSES/deprecated/Zlib +f:LICENSES/dual/Apache-2.0 +f:LICENSES/dual/CC-BY-4.0 +f:LICENSES/dual/CDDL-1.0 +f:LICENSES/dual/MPL-1.1 +f:LICENSES/dual/copyleft-next-0.3.1 +f:LICENSES/exceptions/GCC-exception-2.0 +f:LICENSES/exceptions/Linux-syscall-note +f:LICENSES/preferred/BSD-2-Clause +f:LICENSES/preferred/BSD-3-Clause +f:LICENSES/preferred/BSD-3-Clause-Clear +f:LICENSES/preferred/GPL-2.0 +f:LICENSES/preferred/LGPL-2.0 +f:LICENSES/preferred/LGPL-2.1 +f:LICENSES/preferred/MIT +f:MAINTAINERS +f:Makefile +f:README +f:arch/.gitignore +f:arch/Kconfig +f:arch/alpha/Kbuild +f:arch/alpha/Kconfig +f:arch/alpha/Kconfig.debug +f:arch/alpha/Makefile +f:arch/alpha/boot/Makefile +f:arch/alpha/boot/bootloader.lds +f:arch/alpha/boot/bootp.c +f:arch/alpha/boot/bootpz.c +f:arch/alpha/boot/head.S +f:arch/alpha/boot/main.c +f:arch/alpha/boot/misc.c +f:arch/alpha/boot/stdio.c +f:arch/alpha/boot/tools/mkbb.c +f:arch/alpha/boot/tools/objstrip.c +f:arch/alpha/configs/defconfig +f:arch/alpha/include/asm/Kbuild +f:arch/alpha/include/asm/agp_backend.h +f:arch/alpha/include/asm/asm-prototypes.h +f:arch/alpha/include/asm/atomic.h +f:arch/alpha/include/asm/barrier.h +f:arch/alpha/include/asm/bitops.h +f:arch/alpha/include/asm/bug.h +f:arch/alpha/include/asm/cache.h +f:arch/alpha/include/asm/cacheflush.h +f:arch/alpha/include/asm/checksum.h +f:arch/alpha/include/asm/cmpxchg.h +f:arch/alpha/include/asm/compiler.h +f:arch/alpha/include/asm/console.h +f:arch/alpha/include/asm/core_cia.h +f:arch/alpha/include/asm/core_irongate.h +f:arch/alpha/include/asm/core_marvel.h +f:arch/alpha/include/asm/core_mcpcia.h +f:arch/alpha/include/asm/core_polaris.h +f:arch/alpha/include/asm/core_t2.h +f:arch/alpha/include/asm/core_titan.h +f:arch/alpha/include/asm/core_tsunami.h +f:arch/alpha/include/asm/core_wildfire.h +f:arch/alpha/include/asm/delay.h +f:arch/alpha/include/asm/device.h +f:arch/alpha/include/asm/dma-mapping.h +f:arch/alpha/include/asm/dma.h +f:arch/alpha/include/asm/elf.h +f:arch/alpha/include/asm/emergency-restart.h +f:arch/alpha/include/asm/err_common.h +f:arch/alpha/include/asm/err_ev6.h +f:arch/alpha/include/asm/err_ev7.h +f:arch/alpha/include/asm/extable.h +f:arch/alpha/include/asm/floppy.h +f:arch/alpha/include/asm/fpu.h +f:arch/alpha/include/asm/ftrace.h +f:arch/alpha/include/asm/futex.h +f:arch/alpha/include/asm/gct.h +f:arch/alpha/include/asm/hardirq.h +f:arch/alpha/include/asm/hw_irq.h +f:arch/alpha/include/asm/hwrpb.h +f:arch/alpha/include/asm/io.h +f:arch/alpha/include/asm/io_trivial.h +f:arch/alpha/include/asm/irq.h +f:arch/alpha/include/asm/irqflags.h +f:arch/alpha/include/asm/linkage.h +f:arch/alpha/include/asm/local.h +f:arch/alpha/include/asm/machvec.h +f:arch/alpha/include/asm/mc146818rtc.h +f:arch/alpha/include/asm/mce.h +f:arch/alpha/include/asm/mmu.h +f:arch/alpha/include/asm/mmu_context.h +f:arch/alpha/include/asm/module.h +f:arch/alpha/include/asm/page.h +f:arch/alpha/include/asm/pal.h +f:arch/alpha/include/asm/parport.h +f:arch/alpha/include/asm/pci.h +f:arch/alpha/include/asm/percpu.h +f:arch/alpha/include/asm/perf_event.h +f:arch/alpha/include/asm/pgalloc.h +f:arch/alpha/include/asm/pgtable.h +f:arch/alpha/include/asm/processor.h +f:arch/alpha/include/asm/ptrace.h +f:arch/alpha/include/asm/rwonce.h +f:arch/alpha/include/asm/serial.h +f:arch/alpha/include/asm/setup.h +f:arch/alpha/include/asm/sfp-machine.h +f:arch/alpha/include/asm/shmparam.h +f:arch/alpha/include/asm/signal.h +f:arch/alpha/include/asm/smp.h +f:arch/alpha/include/asm/socket.h +f:arch/alpha/include/asm/sparsemem.h +f:arch/alpha/include/asm/special_insns.h +f:arch/alpha/include/asm/spinlock.h +f:arch/alpha/include/asm/spinlock_types.h +f:arch/alpha/include/asm/string.h +f:arch/alpha/include/asm/switch_to.h +f:arch/alpha/include/asm/syscall.h +f:arch/alpha/include/asm/thread_info.h +f:arch/alpha/include/asm/timex.h +f:arch/alpha/include/asm/tlb.h +f:arch/alpha/include/asm/tlbflush.h +f:arch/alpha/include/asm/topology.h +f:arch/alpha/include/asm/types.h +f:arch/alpha/include/asm/uaccess.h +f:arch/alpha/include/asm/ucontext.h +f:arch/alpha/include/asm/unistd.h +f:arch/alpha/include/asm/user.h +f:arch/alpha/include/asm/vga.h +f:arch/alpha/include/asm/vmalloc.h +f:arch/alpha/include/asm/word-at-a-time.h +f:arch/alpha/include/asm/wrperfmon.h +f:arch/alpha/include/asm/xor.h +f:arch/alpha/include/uapi/asm/Kbuild +f:arch/alpha/include/uapi/asm/a.out.h +f:arch/alpha/include/uapi/asm/auxvec.h +f:arch/alpha/include/uapi/asm/bitsperlong.h +f:arch/alpha/include/uapi/asm/byteorder.h +f:arch/alpha/include/uapi/asm/compiler.h +f:arch/alpha/include/uapi/asm/console.h +f:arch/alpha/include/uapi/asm/errno.h +f:arch/alpha/include/uapi/asm/fcntl.h +f:arch/alpha/include/uapi/asm/fpu.h +f:arch/alpha/include/uapi/asm/gentrap.h +f:arch/alpha/include/uapi/asm/ioctl.h +f:arch/alpha/include/uapi/asm/ioctls.h +f:arch/alpha/include/uapi/asm/mman.h +f:arch/alpha/include/uapi/asm/pal.h +f:arch/alpha/include/uapi/asm/param.h +f:arch/alpha/include/uapi/asm/posix_types.h +f:arch/alpha/include/uapi/asm/ptrace.h +f:arch/alpha/include/uapi/asm/reg.h +f:arch/alpha/include/uapi/asm/regdef.h +f:arch/alpha/include/uapi/asm/resource.h +f:arch/alpha/include/uapi/asm/setup.h +f:arch/alpha/include/uapi/asm/sigcontext.h +f:arch/alpha/include/uapi/asm/siginfo.h +f:arch/alpha/include/uapi/asm/signal.h +f:arch/alpha/include/uapi/asm/socket.h +f:arch/alpha/include/uapi/asm/sockios.h +f:arch/alpha/include/uapi/asm/stat.h +f:arch/alpha/include/uapi/asm/statfs.h +f:arch/alpha/include/uapi/asm/swab.h +f:arch/alpha/include/uapi/asm/sysinfo.h +f:arch/alpha/include/uapi/asm/termbits.h +f:arch/alpha/include/uapi/asm/termios.h +f:arch/alpha/include/uapi/asm/types.h +f:arch/alpha/include/uapi/asm/unistd.h +f:arch/alpha/kernel/.gitignore +f:arch/alpha/kernel/Makefile +f:arch/alpha/kernel/asm-offsets.c +f:arch/alpha/kernel/audit.c +f:arch/alpha/kernel/bugs.c +f:arch/alpha/kernel/console.c +f:arch/alpha/kernel/core_cia.c +f:arch/alpha/kernel/core_irongate.c +f:arch/alpha/kernel/core_marvel.c +f:arch/alpha/kernel/core_mcpcia.c +f:arch/alpha/kernel/core_polaris.c +f:arch/alpha/kernel/core_t2.c +f:arch/alpha/kernel/core_titan.c +f:arch/alpha/kernel/core_tsunami.c +f:arch/alpha/kernel/core_wildfire.c +f:arch/alpha/kernel/entry.S +f:arch/alpha/kernel/err_common.c +f:arch/alpha/kernel/err_ev6.c +f:arch/alpha/kernel/err_ev7.c +f:arch/alpha/kernel/err_impl.h +f:arch/alpha/kernel/err_marvel.c +f:arch/alpha/kernel/err_titan.c +f:arch/alpha/kernel/es1888.c +f:arch/alpha/kernel/gct.c +f:arch/alpha/kernel/head.S +f:arch/alpha/kernel/io.c +f:arch/alpha/kernel/irq.c +f:arch/alpha/kernel/irq_alpha.c +f:arch/alpha/kernel/irq_i8259.c +f:arch/alpha/kernel/irq_impl.h +f:arch/alpha/kernel/irq_pyxis.c +f:arch/alpha/kernel/irq_srm.c +f:arch/alpha/kernel/machvec_impl.h +f:arch/alpha/kernel/module.c +f:arch/alpha/kernel/osf_sys.c +f:arch/alpha/kernel/pc873xx.c +f:arch/alpha/kernel/pc873xx.h +f:arch/alpha/kernel/pci-sysfs.c +f:arch/alpha/kernel/pci.c +f:arch/alpha/kernel/pci_impl.h +f:arch/alpha/kernel/pci_iommu.c +f:arch/alpha/kernel/perf_event.c +f:arch/alpha/kernel/process.c +f:arch/alpha/kernel/proto.h +f:arch/alpha/kernel/ptrace.c +f:arch/alpha/kernel/rtc.c +f:arch/alpha/kernel/setup.c +f:arch/alpha/kernel/signal.c +f:arch/alpha/kernel/smc37c669.c +f:arch/alpha/kernel/smc37c93x.c +f:arch/alpha/kernel/smp.c +f:arch/alpha/kernel/srm_env.c +f:arch/alpha/kernel/srmcons.c +f:arch/alpha/kernel/sys_alcor.c +f:arch/alpha/kernel/sys_cabriolet.c +f:arch/alpha/kernel/sys_dp264.c +f:arch/alpha/kernel/sys_eiger.c +f:arch/alpha/kernel/sys_marvel.c +f:arch/alpha/kernel/sys_miata.c +f:arch/alpha/kernel/sys_mikasa.c +f:arch/alpha/kernel/sys_nautilus.c +f:arch/alpha/kernel/sys_noritake.c +f:arch/alpha/kernel/sys_rawhide.c +f:arch/alpha/kernel/sys_ruffian.c +f:arch/alpha/kernel/sys_rx164.c +f:arch/alpha/kernel/sys_sable.c +f:arch/alpha/kernel/sys_sx164.c +f:arch/alpha/kernel/sys_takara.c +f:arch/alpha/kernel/sys_titan.c +f:arch/alpha/kernel/sys_wildfire.c +f:arch/alpha/kernel/syscalls/Makefile +f:arch/alpha/kernel/syscalls/syscall.tbl +f:arch/alpha/kernel/systbls.S +f:arch/alpha/kernel/termios.c +f:arch/alpha/kernel/time.c +f:arch/alpha/kernel/traps.c +f:arch/alpha/kernel/vmlinux.lds.S +f:arch/alpha/lib/Makefile +f:arch/alpha/lib/callback_srm.S +f:arch/alpha/lib/checksum.c +f:arch/alpha/lib/clear_page.S +f:arch/alpha/lib/clear_user.S +f:arch/alpha/lib/copy_page.S +f:arch/alpha/lib/copy_user.S +f:arch/alpha/lib/csum_ipv6_magic.S +f:arch/alpha/lib/csum_partial_copy.c +f:arch/alpha/lib/dbg_current.S +f:arch/alpha/lib/dbg_stackcheck.S +f:arch/alpha/lib/dbg_stackkill.S +f:arch/alpha/lib/divide.S +f:arch/alpha/lib/ev6-clear_page.S +f:arch/alpha/lib/ev6-clear_user.S +f:arch/alpha/lib/ev6-copy_page.S +f:arch/alpha/lib/ev6-copy_user.S +f:arch/alpha/lib/ev6-csum_ipv6_magic.S +f:arch/alpha/lib/ev6-divide.S +f:arch/alpha/lib/ev6-memchr.S +f:arch/alpha/lib/ev6-memcpy.S +f:arch/alpha/lib/ev6-memset.S +f:arch/alpha/lib/ev6-stxcpy.S +f:arch/alpha/lib/ev6-stxncpy.S +f:arch/alpha/lib/ev67-strcat.S +f:arch/alpha/lib/ev67-strchr.S +f:arch/alpha/lib/ev67-strlen.S +f:arch/alpha/lib/ev67-strncat.S +f:arch/alpha/lib/ev67-strrchr.S +f:arch/alpha/lib/fls.c +f:arch/alpha/lib/fpreg.c +f:arch/alpha/lib/memchr.S +f:arch/alpha/lib/memcpy.c +f:arch/alpha/lib/memmove.S +f:arch/alpha/lib/memset.S +f:arch/alpha/lib/srm_printk.c +f:arch/alpha/lib/srm_puts.c +f:arch/alpha/lib/stacktrace.c +f:arch/alpha/lib/strcat.S +f:arch/alpha/lib/strchr.S +f:arch/alpha/lib/strcpy.S +f:arch/alpha/lib/strlen.S +f:arch/alpha/lib/strncat.S +f:arch/alpha/lib/strncpy.S +f:arch/alpha/lib/strrchr.S +f:arch/alpha/lib/stxcpy.S +f:arch/alpha/lib/stxncpy.S +f:arch/alpha/lib/stycpy.S +f:arch/alpha/lib/styncpy.S +f:arch/alpha/lib/udelay.c +f:arch/alpha/lib/udiv-qrnnd.S +f:arch/alpha/math-emu/Makefile +f:arch/alpha/math-emu/math.c +f:arch/alpha/math-emu/sfp-util.h +f:arch/alpha/mm/Makefile +f:arch/alpha/mm/fault.c +f:arch/alpha/mm/init.c +f:arch/arc/Kbuild +f:arch/arc/Kconfig +f:arch/arc/Kconfig.debug +f:arch/arc/Makefile +f:arch/arc/boot/.gitignore +f:arch/arc/boot/Makefile +f:arch/arc/boot/dts/Makefile +f:arch/arc/boot/dts/abilis_tb100.dtsi +f:arch/arc/boot/dts/abilis_tb100_dvk.dts +f:arch/arc/boot/dts/abilis_tb101.dtsi +f:arch/arc/boot/dts/abilis_tb101_dvk.dts +f:arch/arc/boot/dts/abilis_tb10x.dtsi +f:arch/arc/boot/dts/axc001.dtsi +f:arch/arc/boot/dts/axc003.dtsi +f:arch/arc/boot/dts/axc003_idu.dtsi +f:arch/arc/boot/dts/axs101.dts +f:arch/arc/boot/dts/axs103.dts +f:arch/arc/boot/dts/axs103_idu.dts +f:arch/arc/boot/dts/axs10x_mb.dtsi +f:arch/arc/boot/dts/haps_hs.dts +f:arch/arc/boot/dts/haps_hs_idu.dts +f:arch/arc/boot/dts/hsdk.dts +f:arch/arc/boot/dts/nsim_700.dts +f:arch/arc/boot/dts/nsimosci.dts +f:arch/arc/boot/dts/nsimosci_hs.dts +f:arch/arc/boot/dts/nsimosci_hs_idu.dts +f:arch/arc/boot/dts/skeleton.dtsi +f:arch/arc/boot/dts/skeleton_hs.dtsi +f:arch/arc/boot/dts/skeleton_hs_idu.dtsi +f:arch/arc/boot/dts/vdk_axc003.dtsi +f:arch/arc/boot/dts/vdk_axc003_idu.dtsi +f:arch/arc/boot/dts/vdk_axs10x_mb.dtsi +f:arch/arc/boot/dts/vdk_hs38.dts +f:arch/arc/boot/dts/vdk_hs38_smp.dts +f:arch/arc/configs/axs101_defconfig +f:arch/arc/configs/axs103_defconfig +f:arch/arc/configs/axs103_smp_defconfig +f:arch/arc/configs/haps_hs_defconfig +f:arch/arc/configs/haps_hs_smp_defconfig +f:arch/arc/configs/hsdk_defconfig +f:arch/arc/configs/nsim_700_defconfig +f:arch/arc/configs/nsimosci_defconfig +f:arch/arc/configs/nsimosci_hs_defconfig +f:arch/arc/configs/nsimosci_hs_smp_defconfig +f:arch/arc/configs/tb10x_defconfig +f:arch/arc/configs/vdk_hs38_defconfig +f:arch/arc/configs/vdk_hs38_smp_defconfig +f:arch/arc/include/asm/Kbuild +f:arch/arc/include/asm/arcregs.h +f:arch/arc/include/asm/asm-offsets.h +f:arch/arc/include/asm/asserts.h +f:arch/arc/include/asm/atomic-llsc.h +f:arch/arc/include/asm/atomic-spinlock.h +f:arch/arc/include/asm/atomic.h +f:arch/arc/include/asm/atomic64-arcv2.h +f:arch/arc/include/asm/barrier.h +f:arch/arc/include/asm/bitops.h +f:arch/arc/include/asm/bug.h +f:arch/arc/include/asm/cache.h +f:arch/arc/include/asm/cacheflush.h +f:arch/arc/include/asm/cachetype.h +f:arch/arc/include/asm/checksum.h +f:arch/arc/include/asm/cmpxchg.h +f:arch/arc/include/asm/current.h +f:arch/arc/include/asm/delay.h +f:arch/arc/include/asm/disasm.h +f:arch/arc/include/asm/dma.h +f:arch/arc/include/asm/dsp-impl.h +f:arch/arc/include/asm/dsp.h +f:arch/arc/include/asm/dwarf.h +f:arch/arc/include/asm/elf.h +f:arch/arc/include/asm/entry-arcv2.h +f:arch/arc/include/asm/entry-compact.h +f:arch/arc/include/asm/entry.h +f:arch/arc/include/asm/exec.h +f:arch/arc/include/asm/fpu.h +f:arch/arc/include/asm/futex.h +f:arch/arc/include/asm/highmem.h +f:arch/arc/include/asm/hugepage.h +f:arch/arc/include/asm/io.h +f:arch/arc/include/asm/irq.h +f:arch/arc/include/asm/irqflags-arcv2.h +f:arch/arc/include/asm/irqflags-compact.h +f:arch/arc/include/asm/irqflags.h +f:arch/arc/include/asm/jump_label.h +f:arch/arc/include/asm/kdebug.h +f:arch/arc/include/asm/kgdb.h +f:arch/arc/include/asm/kprobes.h +f:arch/arc/include/asm/linkage.h +f:arch/arc/include/asm/mach_desc.h +f:arch/arc/include/asm/mmu-arcv2.h +f:arch/arc/include/asm/mmu.h +f:arch/arc/include/asm/mmu_context.h +f:arch/arc/include/asm/module.h +f:arch/arc/include/asm/page.h +f:arch/arc/include/asm/pci.h +f:arch/arc/include/asm/perf_event.h +f:arch/arc/include/asm/pgalloc.h +f:arch/arc/include/asm/pgtable-bits-arcv2.h +f:arch/arc/include/asm/pgtable-levels.h +f:arch/arc/include/asm/pgtable.h +f:arch/arc/include/asm/processor.h +f:arch/arc/include/asm/ptrace.h +f:arch/arc/include/asm/sections.h +f:arch/arc/include/asm/serial.h +f:arch/arc/include/asm/setup.h +f:arch/arc/include/asm/shmparam.h +f:arch/arc/include/asm/smp.h +f:arch/arc/include/asm/spinlock.h +f:arch/arc/include/asm/spinlock_types.h +f:arch/arc/include/asm/stacktrace.h +f:arch/arc/include/asm/string.h +f:arch/arc/include/asm/switch_to.h +f:arch/arc/include/asm/syscall.h +f:arch/arc/include/asm/syscalls.h +f:arch/arc/include/asm/thread_info.h +f:arch/arc/include/asm/timex.h +f:arch/arc/include/asm/tlb.h +f:arch/arc/include/asm/tlbflush.h +f:arch/arc/include/asm/uaccess.h +f:arch/arc/include/asm/unistd.h +f:arch/arc/include/asm/unwind.h +f:arch/arc/include/asm/vermagic.h +f:arch/arc/include/asm/vmalloc.h +f:arch/arc/include/uapi/asm/Kbuild +f:arch/arc/include/uapi/asm/bpf_perf_event.h +f:arch/arc/include/uapi/asm/byteorder.h +f:arch/arc/include/uapi/asm/cachectl.h +f:arch/arc/include/uapi/asm/elf.h +f:arch/arc/include/uapi/asm/page.h +f:arch/arc/include/uapi/asm/ptrace.h +f:arch/arc/include/uapi/asm/setup.h +f:arch/arc/include/uapi/asm/sigcontext.h +f:arch/arc/include/uapi/asm/signal.h +f:arch/arc/include/uapi/asm/swab.h +f:arch/arc/include/uapi/asm/unistd.h +f:arch/arc/kernel/.gitignore +f:arch/arc/kernel/Makefile +f:arch/arc/kernel/Makefile.syscalls +f:arch/arc/kernel/arc_hostlink.c +f:arch/arc/kernel/arcksyms.c +f:arch/arc/kernel/asm-offsets.c +f:arch/arc/kernel/ctx_sw_asm.S +f:arch/arc/kernel/devtree.c +f:arch/arc/kernel/disasm.c +f:arch/arc/kernel/entry-arcv2.S +f:arch/arc/kernel/entry-compact.S +f:arch/arc/kernel/entry.S +f:arch/arc/kernel/fpu.c +f:arch/arc/kernel/head.S +f:arch/arc/kernel/intc-arcv2.c +f:arch/arc/kernel/intc-compact.c +f:arch/arc/kernel/irq.c +f:arch/arc/kernel/jump_label.c +f:arch/arc/kernel/kgdb.c +f:arch/arc/kernel/kprobes.c +f:arch/arc/kernel/mcip.c +f:arch/arc/kernel/module.c +f:arch/arc/kernel/perf_event.c +f:arch/arc/kernel/process.c +f:arch/arc/kernel/ptrace.c +f:arch/arc/kernel/reset.c +f:arch/arc/kernel/setup.c +f:arch/arc/kernel/signal.c +f:arch/arc/kernel/smp.c +f:arch/arc/kernel/stacktrace.c +f:arch/arc/kernel/sys.c +f:arch/arc/kernel/traps.c +f:arch/arc/kernel/troubleshoot.c +f:arch/arc/kernel/unaligned.c +f:arch/arc/kernel/unaligned.h +f:arch/arc/kernel/unwind.c +f:arch/arc/kernel/vmlinux.lds.S +f:arch/arc/lib/Makefile +f:arch/arc/lib/memcmp.S +f:arch/arc/lib/memcpy-700.S +f:arch/arc/lib/memcpy-archs-unaligned.S +f:arch/arc/lib/memcpy-archs.S +f:arch/arc/lib/memset-archs.S +f:arch/arc/lib/memset.S +f:arch/arc/lib/strchr-700.S +f:arch/arc/lib/strcmp-archs.S +f:arch/arc/lib/strcmp.S +f:arch/arc/lib/strcpy-700.S +f:arch/arc/lib/strlen.S +f:arch/arc/mm/Makefile +f:arch/arc/mm/cache.c +f:arch/arc/mm/dma.c +f:arch/arc/mm/extable.c +f:arch/arc/mm/fault.c +f:arch/arc/mm/highmem.c +f:arch/arc/mm/init.c +f:arch/arc/mm/ioremap.c +f:arch/arc/mm/mmap.c +f:arch/arc/mm/tlb.c +f:arch/arc/mm/tlbex.S +f:arch/arc/net/Makefile +f:arch/arc/net/bpf_jit.h +f:arch/arc/net/bpf_jit_arcv2.c +f:arch/arc/net/bpf_jit_core.c +f:arch/arc/plat-axs10x/Kconfig +f:arch/arc/plat-axs10x/Makefile +f:arch/arc/plat-axs10x/axs10x.c +f:arch/arc/plat-hsdk/Kconfig +f:arch/arc/plat-hsdk/Makefile +f:arch/arc/plat-hsdk/platform.c +f:arch/arc/plat-sim/Makefile +f:arch/arc/plat-sim/platform.c +f:arch/arc/plat-tb10x/Kconfig +f:arch/arc/plat-tb10x/Makefile +f:arch/arc/plat-tb10x/tb10x.c +f:arch/arm/Kbuild +f:arch/arm/Kconfig +f:arch/arm/Kconfig-nommu +f:arch/arm/Kconfig.debug +f:arch/arm/Kconfig.platforms +f:arch/arm/Makefile +f:arch/arm/boot/.gitignore +f:arch/arm/boot/Makefile +f:arch/arm/boot/bootp/Makefile +f:arch/arm/boot/bootp/bootp.lds +f:arch/arm/boot/bootp/init.S +f:arch/arm/boot/bootp/initrd.S +f:arch/arm/boot/bootp/kernel.S +f:arch/arm/boot/compressed/.gitignore +f:arch/arm/boot/compressed/Makefile +f:arch/arm/boot/compressed/ashldi3.S +f:arch/arm/boot/compressed/atags_to_fdt.c +f:arch/arm/boot/compressed/big-endian.S +f:arch/arm/boot/compressed/bswapsdi2.S +f:arch/arm/boot/compressed/debug.S +f:arch/arm/boot/compressed/decompress.c +f:arch/arm/boot/compressed/efi-header.S +f:arch/arm/boot/compressed/fdt.c +f:arch/arm/boot/compressed/fdt_check_mem_start.c +f:arch/arm/boot/compressed/fdt_ro.c +f:arch/arm/boot/compressed/fdt_rw.c +f:arch/arm/boot/compressed/fdt_wip.c +f:arch/arm/boot/compressed/font.c +f:arch/arm/boot/compressed/head-sa1100.S +f:arch/arm/boot/compressed/head-sharpsl.S +f:arch/arm/boot/compressed/head-xscale.S +f:arch/arm/boot/compressed/head.S +f:arch/arm/boot/compressed/hyp-stub.S +f:arch/arm/boot/compressed/lib1funcs.S +f:arch/arm/boot/compressed/ll_char_wr.S +f:arch/arm/boot/compressed/misc-ep93xx.h +f:arch/arm/boot/compressed/misc.c +f:arch/arm/boot/compressed/misc.h +f:arch/arm/boot/compressed/piggy.S +f:arch/arm/boot/compressed/string.c +f:arch/arm/boot/compressed/vmlinux.lds.S +f:arch/arm/boot/deflate_xip_data.sh +f:arch/arm/boot/dts/Makefile +f:arch/arm/boot/dts/actions/Makefile +f:arch/arm/boot/dts/actions/owl-s500-cubieboard6.dts +f:arch/arm/boot/dts/actions/owl-s500-guitar-bb-rev-b.dts +f:arch/arm/boot/dts/actions/owl-s500-guitar.dtsi +f:arch/arm/boot/dts/actions/owl-s500-labrador-base-m.dts +f:arch/arm/boot/dts/actions/owl-s500-labrador-v2.dtsi +f:arch/arm/boot/dts/actions/owl-s500-roseapplepi.dts +f:arch/arm/boot/dts/actions/owl-s500-sparky.dts +f:arch/arm/boot/dts/actions/owl-s500.dtsi +f:arch/arm/boot/dts/airoha/Makefile +f:arch/arm/boot/dts/airoha/en7523-evb.dts +f:arch/arm/boot/dts/airoha/en7523.dtsi +f:arch/arm/boot/dts/allwinner/Makefile +f:arch/arm/boot/dts/allwinner/axp152.dtsi +f:arch/arm/boot/dts/allwinner/axp209.dtsi +f:arch/arm/boot/dts/allwinner/axp223.dtsi +f:arch/arm/boot/dts/allwinner/axp22x.dtsi +f:arch/arm/boot/dts/allwinner/axp809.dtsi +f:arch/arm/boot/dts/allwinner/axp81x.dtsi +f:arch/arm/boot/dts/allwinner/sun4i-a10-a1000.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-ba10-tvbox.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-chuwi-v7-cw0825.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-cubieboard.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-dserve-dsrv9703c.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-gemei-g9.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-hackberry.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-hyundai-a7hd.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-inet1.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-inet97fv2.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-inet9f-rev03.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-itead-iteaduino-plus.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-jesurun-q5.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-marsboard.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-mini-xplus.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-mk802.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-mk802ii.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-olinuxino-lime.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-pcduino.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-pcduino2.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-pov-protab2-ips9.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10-topwise-a721.dts +f:arch/arm/boot/dts/allwinner/sun4i-a10.dtsi +f:arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t003.dts +f:arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t004.dts +f:arch/arm/boot/dts/allwinner/sun5i-a10s-mk802.dts +f:arch/arm/boot/dts/allwinner/sun5i-a10s-olinuxino-micro.dts +f:arch/arm/boot/dts/allwinner/sun5i-a10s-r7-tv-dongle.dts +f:arch/arm/boot/dts/allwinner/sun5i-a10s-wobo-i5.dts +f:arch/arm/boot/dts/allwinner/sun5i-a10s.dtsi +f:arch/arm/boot/dts/allwinner/sun5i-a13-difrnce-dit4350.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-empire-electronix-d709.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-empire-electronix-m712.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-hsg-h702.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-inet-98v-rev2.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-licheepi-one.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino-micro.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-614-plus.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-touch-lux-3.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-q8-tablet.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13-utoo-p66.dts +f:arch/arm/boot/dts/allwinner/sun5i-a13.dtsi +f:arch/arm/boot/dts/allwinner/sun5i-gr8-chip-pro.dts +f:arch/arm/boot/dts/allwinner/sun5i-gr8-evb.dts +f:arch/arm/boot/dts/allwinner/sun5i-gr8.dtsi +f:arch/arm/boot/dts/allwinner/sun5i-r8-chip.dts +f:arch/arm/boot/dts/allwinner/sun5i-r8.dtsi +f:arch/arm/boot/dts/allwinner/sun5i-reference-design-tablet.dtsi +f:arch/arm/boot/dts/allwinner/sun5i.dtsi +f:arch/arm/boot/dts/allwinner/sun6i-a31-app4-evb1.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31-colombus.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31-hummingbird.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31-i7.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31-m9.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31-mele-a1000g-quad.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31.dtsi +f:arch/arm/boot/dts/allwinner/sun6i-a31s-colorfly-e708-q1.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31s-cs908.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31s-inet-q972.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31s-primo81.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31s-sina31s-core.dtsi +f:arch/arm/boot/dts/allwinner/sun6i-a31s-sina31s.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31s-sinovoip-bpi-m2.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31s-yones-toptech-bs1078-v2.dts +f:arch/arm/boot/dts/allwinner/sun6i-a31s.dtsi +f:arch/arm/boot/dts/allwinner/sun6i-reference-design-tablet.dtsi +f:arch/arm/boot/dts/allwinner/sun7i-a20-bananapi-m1-plus.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-bananapi.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-bananapro.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-cubieboard2.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-cubietruck.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-haoyu-marsboard.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-hummingbird.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-i12-tvbox.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-icnova-a20-adb4006.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-icnova-a20.dtsi +f:arch/arm/boot/dts/allwinner/sun7i-a20-icnova-swac.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-itead-ibox.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-lamobo-r1.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-linutronix-testbox-v2.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-m3.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-mk808c.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som-evb-emmc.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som-evb.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som204-evb-emmc.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som204-evb.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime-emmc.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime2-emmc.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime2.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-micro-emmc.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-micro.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-orangepi-mini.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-orangepi.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3-nano.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-wexler-tab7200.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20-wits-pro-a20-dkt.dts +f:arch/arm/boot/dts/allwinner/sun7i-a20.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-a23-a33.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-a23-evb.dts +f:arch/arm/boot/dts/allwinner/sun8i-a23-gt90h-v4.dts +f:arch/arm/boot/dts/allwinner/sun8i-a23-inet86dz.dts +f:arch/arm/boot/dts/allwinner/sun8i-a23-polaroid-mid2407pxe03.dts +f:arch/arm/boot/dts/allwinner/sun8i-a23-polaroid-mid2809pxe04.dts +f:arch/arm/boot/dts/allwinner/sun8i-a23-q8-tablet.dts +f:arch/arm/boot/dts/allwinner/sun8i-a23.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-a33-ga10h-v1.1.dts +f:arch/arm/boot/dts/allwinner/sun8i-a33-inet-d978-rev2.dts +f:arch/arm/boot/dts/allwinner/sun8i-a33-olinuxino.dts +f:arch/arm/boot/dts/allwinner/sun8i-a33-q8-tablet.dts +f:arch/arm/boot/dts/allwinner/sun8i-a33-sinlinx-sina33.dts +f:arch/arm/boot/dts/allwinner/sun8i-a33-vstar-core1.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-a33-vstar.dts +f:arch/arm/boot/dts/allwinner/sun8i-a33.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-a83t-allwinner-h8homlet-v2.dts +f:arch/arm/boot/dts/allwinner/sun8i-a83t-bananapi-m3.dts +f:arch/arm/boot/dts/allwinner/sun8i-a83t-cubietruck-plus.dts +f:arch/arm/boot/dts/allwinner/sun8i-a83t-tbs-a711.dts +f:arch/arm/boot/dts/allwinner/sun8i-a83t.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-h2-plus-bananapi-m2-zero.dts +f:arch/arm/boot/dts/allwinner/sun8i-h2-plus-libretech-all-h3-cc.dts +f:arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-r1.dts +f:arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-zero.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-bananapi-m2-plus-v1.2.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-bananapi-m2-plus.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-beelink-x2.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-emlid-neutis-n5h3-devboard.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-emlid-neutis-n5h3.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-h3-libretech-all-h3-cc.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-mapleboard-mp130.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-duo2.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-m1-plus.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-m1.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-neo-air.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-neo.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-r1.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-nanopi.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-2.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-lite.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-one.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-pc-plus.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-pc.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus2e.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-zero-plus2.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-rervision-dvk.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3-zeropi.dts +f:arch/arm/boot/dts/allwinner/sun8i-h3.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-q8-common.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-r16-bananapi-m2m.dts +f:arch/arm/boot/dts/allwinner/sun8i-r16-nintendo-nes-classic.dts +f:arch/arm/boot/dts/allwinner/sun8i-r16-nintendo-super-nes-classic.dts +f:arch/arm/boot/dts/allwinner/sun8i-r16-parrot.dts +f:arch/arm/boot/dts/allwinner/sun8i-r40-bananapi-m2-ultra.dts +f:arch/arm/boot/dts/allwinner/sun8i-r40-cpu-opp.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-r40-feta40i.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-r40-oka40i-c.dts +f:arch/arm/boot/dts/allwinner/sun8i-r40.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-reference-design-tablet.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-s3-elimo-impetus.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-s3-elimo-initium.dts +f:arch/arm/boot/dts/allwinner/sun8i-s3-lichee-zero-plus.dts +f:arch/arm/boot/dts/allwinner/sun8i-s3-pinecube.dts +f:arch/arm/boot/dts/allwinner/sun8i-t113s-mangopi-mq-r-t113.dts +f:arch/arm/boot/dts/allwinner/sun8i-t113s.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-t3-cqa3t-bv3.dts +f:arch/arm/boot/dts/allwinner/sun8i-v3-sl631-imx179.dts +f:arch/arm/boot/dts/allwinner/sun8i-v3-sl631.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-v3.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-v3s-anbernic-rg-nano.dts +f:arch/arm/boot/dts/allwinner/sun8i-v3s-licheepi-zero-dock.dts +f:arch/arm/boot/dts/allwinner/sun8i-v3s-licheepi-zero.dts +f:arch/arm/boot/dts/allwinner/sun8i-v3s-netcube-kumquat.dts +f:arch/arm/boot/dts/allwinner/sun8i-v3s.dtsi +f:arch/arm/boot/dts/allwinner/sun8i-v40-bananapi-m2-berry.dts +f:arch/arm/boot/dts/allwinner/sun9i-a80-cubieboard4.dts +f:arch/arm/boot/dts/allwinner/sun9i-a80-optimus.dts +f:arch/arm/boot/dts/allwinner/sun9i-a80.dtsi +f:arch/arm/boot/dts/allwinner/suniv-f1c100s-licheepi-nano.dts +f:arch/arm/boot/dts/allwinner/suniv-f1c100s.dtsi +f:arch/arm/boot/dts/allwinner/suniv-f1c200s-lctech-pi.dts +f:arch/arm/boot/dts/allwinner/suniv-f1c200s-popstick-v1.1.dts +f:arch/arm/boot/dts/allwinner/sunxi-bananapi-m2-plus-v1.2.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-bananapi-m2-plus.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-common-regulators.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-d1s-t113-mangopi-mq-r.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-h3-h5-emlid-neutis.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-h3-h5.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-itead-core-common.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-cc.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-it.dtsi +f:arch/arm/boot/dts/allwinner/sunxi-reference-design-tablet.dtsi +f:arch/arm/boot/dts/alphascale/Makefile +f:arch/arm/boot/dts/alphascale/alphascale-asm9260-devkit.dts +f:arch/arm/boot/dts/alphascale/alphascale-asm9260.dtsi +f:arch/arm/boot/dts/amazon/Makefile +f:arch/arm/boot/dts/amazon/alpine-db.dts +f:arch/arm/boot/dts/amazon/alpine.dtsi +f:arch/arm/boot/dts/amlogic/Makefile +f:arch/arm/boot/dts/amlogic/meson.dtsi +f:arch/arm/boot/dts/amlogic/meson8-fernsehfee3.dts +f:arch/arm/boot/dts/amlogic/meson8-minix-neo-x8.dts +f:arch/arm/boot/dts/amlogic/meson8.dtsi +f:arch/arm/boot/dts/amlogic/meson8b-ec100.dts +f:arch/arm/boot/dts/amlogic/meson8b-mxq.dts +f:arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts +f:arch/arm/boot/dts/amlogic/meson8b.dtsi +f:arch/arm/boot/dts/amlogic/meson8m2-mxiii-plus.dts +f:arch/arm/boot/dts/amlogic/meson8m2.dtsi +f:arch/arm/boot/dts/arm/Makefile +f:arch/arm/boot/dts/arm/arm-realview-eb-11mp-bbrevd-ctrevb.dts +f:arch/arm/boot/dts/arm/arm-realview-eb-11mp-bbrevd.dts +f:arch/arm/boot/dts/arm/arm-realview-eb-11mp-ctrevb.dts +f:arch/arm/boot/dts/arm/arm-realview-eb-11mp.dts +f:arch/arm/boot/dts/arm/arm-realview-eb-a9mp-bbrevd.dts +f:arch/arm/boot/dts/arm/arm-realview-eb-a9mp.dts +f:arch/arm/boot/dts/arm/arm-realview-eb-bbrevd.dts +f:arch/arm/boot/dts/arm/arm-realview-eb-bbrevd.dtsi +f:arch/arm/boot/dts/arm/arm-realview-eb-mp.dtsi +f:arch/arm/boot/dts/arm/arm-realview-eb.dts +f:arch/arm/boot/dts/arm/arm-realview-eb.dtsi +f:arch/arm/boot/dts/arm/arm-realview-pb1176.dts +f:arch/arm/boot/dts/arm/arm-realview-pb11mp.dts +f:arch/arm/boot/dts/arm/arm-realview-pba8.dts +f:arch/arm/boot/dts/arm/arm-realview-pbx-a9.dts +f:arch/arm/boot/dts/arm/arm-realview-pbx.dtsi +f:arch/arm/boot/dts/arm/integrator.dtsi +f:arch/arm/boot/dts/arm/integratorap-im-pd1.dts +f:arch/arm/boot/dts/arm/integratorap.dts +f:arch/arm/boot/dts/arm/integratorcp.dts +f:arch/arm/boot/dts/arm/mps2-an385.dts +f:arch/arm/boot/dts/arm/mps2-an399.dts +f:arch/arm/boot/dts/arm/mps2.dtsi +f:arch/arm/boot/dts/arm/versatile-ab-ib2.dts +f:arch/arm/boot/dts/arm/versatile-ab.dts +f:arch/arm/boot/dts/arm/versatile-pb.dts +f:arch/arm/boot/dts/arm/vexpress-v2m-rs1.dtsi +f:arch/arm/boot/dts/arm/vexpress-v2m.dtsi +f:arch/arm/boot/dts/arm/vexpress-v2p-ca15-tc1.dts +f:arch/arm/boot/dts/arm/vexpress-v2p-ca15_a7.dts +f:arch/arm/boot/dts/arm/vexpress-v2p-ca5s.dts +f:arch/arm/boot/dts/arm/vexpress-v2p-ca9.dts +f:arch/arm/boot/dts/armv7-m.dtsi +f:arch/arm/boot/dts/aspeed/Makefile +f:arch/arm/boot/dts/aspeed/aspeed-ast2500-evb.dts +f:arch/arm/boot/dts/aspeed/aspeed-ast2600-evb-a1.dts +f:arch/arm/boot/dts/aspeed/aspeed-ast2600-evb.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-amd-daytonax.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-amd-ethanolx.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ampere-mtjade.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ampere-mtjefferson.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ampere-mtmitchell.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-arm-stardragon4800-rep2.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-asrock-e3c246d4i.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-asrock-e3c256d4i.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-asrock-romed8hm3.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-asrock-spc621d8hm3.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-asrock-x570d4u.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-asus-x4tf.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-bytedance-g220a.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-delta-ahe50dc.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-bletchley.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-catalina.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-cmm.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-elbert.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-fuji.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-galaxy100.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-greatlakes.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-harma.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-minerva.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-minipack.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-santabarbara.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-tiogapass.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-wedge100.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-wedge40.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-wedge400.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-yamp.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-yosemite4.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-yosemitev2.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-blueridge-4u.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-blueridge.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-bonnell.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-everest.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-fuji.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-rainier-1s4u.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-rainier-4u.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-rainier.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-sbp1.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ibm-system1.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-inspur-fp5280g2.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-inspur-nf5280m6.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-inspur-on5263m5.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-intel-s2600wf.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-inventec-starscream.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-inventec-transformers.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-lenovo-hr630.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-lenovo-hr855xg2.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-microsoft-olympus.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-nvidia-gb200nvl-bmc.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-lanyang.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-mowgli.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-nicole.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-palmetto.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-romulus.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-tacoma.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-vesnin.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-witherspoon.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-opp-zaius.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-portwell-neptune.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-qcom-dc-scm-v1.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-quanta-q71l.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-quanta-s6q.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-supermicro-x11spi.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-tyan-s7106.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-tyan-s8036.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-ufispace-ncplite.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-vegman-n110.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-vegman-rx20.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-vegman-sx20.dts +f:arch/arm/boot/dts/aspeed/aspeed-bmc-vegman.dtsi +f:arch/arm/boot/dts/aspeed/aspeed-g4.dtsi +f:arch/arm/boot/dts/aspeed/aspeed-g5.dtsi +f:arch/arm/boot/dts/aspeed/aspeed-g6-pinctrl.dtsi +f:arch/arm/boot/dts/aspeed/aspeed-g6.dtsi +f:arch/arm/boot/dts/aspeed/ast2400-facebook-netbmc-common.dtsi +f:arch/arm/boot/dts/aspeed/ast2500-facebook-netbmc-common.dtsi +f:arch/arm/boot/dts/aspeed/ast2600-facebook-netbmc-common.dtsi +f:arch/arm/boot/dts/aspeed/facebook-bmc-flash-layout-128.dtsi +f:arch/arm/boot/dts/aspeed/facebook-bmc-flash-layout.dtsi +f:arch/arm/boot/dts/aspeed/ibm-power10-dual.dtsi +f:arch/arm/boot/dts/aspeed/ibm-power10-quad.dtsi +f:arch/arm/boot/dts/aspeed/ibm-power11-quad.dtsi +f:arch/arm/boot/dts/aspeed/ibm-power9-dual.dtsi +f:arch/arm/boot/dts/aspeed/openbmc-flash-layout-128.dtsi +f:arch/arm/boot/dts/aspeed/openbmc-flash-layout-64-alt.dtsi +f:arch/arm/boot/dts/aspeed/openbmc-flash-layout-64.dtsi +f:arch/arm/boot/dts/aspeed/openbmc-flash-layout.dtsi +f:arch/arm/boot/dts/axis/Makefile +f:arch/arm/boot/dts/axis/artpec6-devboard.dts +f:arch/arm/boot/dts/axis/artpec6.dtsi +f:arch/arm/boot/dts/broadcom/Makefile +f:arch/arm/boot/dts/broadcom/bcm-cygnus-clock.dtsi +f:arch/arm/boot/dts/broadcom/bcm-cygnus.dtsi +f:arch/arm/boot/dts/broadcom/bcm-hr2.dtsi +f:arch/arm/boot/dts/broadcom/bcm-ns.dtsi +f:arch/arm/boot/dts/broadcom/bcm-nsp-ax.dtsi +f:arch/arm/boot/dts/broadcom/bcm-nsp.dtsi +f:arch/arm/boot/dts/broadcom/bcm11351.dtsi +f:arch/arm/boot/dts/broadcom/bcm21664-garnet.dts +f:arch/arm/boot/dts/broadcom/bcm21664.dtsi +f:arch/arm/boot/dts/broadcom/bcm2166x-common.dtsi +f:arch/arm/boot/dts/broadcom/bcm2166x-pinctrl.dtsi +f:arch/arm/boot/dts/broadcom/bcm23550-sparrow.dts +f:arch/arm/boot/dts/broadcom/bcm23550.dtsi +f:arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts +f:arch/arm/boot/dts/broadcom/bcm2711-rpi-400.dts +f:arch/arm/boot/dts/broadcom/bcm2711-rpi-cm4-io.dts +f:arch/arm/boot/dts/broadcom/bcm2711-rpi-cm4.dtsi +f:arch/arm/boot/dts/broadcom/bcm2711-rpi.dtsi +f:arch/arm/boot/dts/broadcom/bcm2711.dtsi +f:arch/arm/boot/dts/broadcom/bcm28155-ap.dts +f:arch/arm/boot/dts/broadcom/bcm2835-common.dtsi +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-a-plus.dts +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-a.dts +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-b-plus.dts +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-b-rev2.dts +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-b.dts +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-cm1-io1.dts +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-cm1.dtsi +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-common.dtsi +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-zero-w.dts +f:arch/arm/boot/dts/broadcom/bcm2835-rpi-zero.dts +f:arch/arm/boot/dts/broadcom/bcm2835-rpi.dtsi +f:arch/arm/boot/dts/broadcom/bcm2835.dtsi +f:arch/arm/boot/dts/broadcom/bcm2836-rpi-2-b.dts +f:arch/arm/boot/dts/broadcom/bcm2836-rpi.dtsi +f:arch/arm/boot/dts/broadcom/bcm2836.dtsi +f:arch/arm/boot/dts/broadcom/bcm2837-rpi-2-b.dts +f:arch/arm/boot/dts/broadcom/bcm2837-rpi-3-a-plus.dts +f:arch/arm/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts +f:arch/arm/boot/dts/broadcom/bcm2837-rpi-3-b.dts +f:arch/arm/boot/dts/broadcom/bcm2837-rpi-cm3-io3.dts +f:arch/arm/boot/dts/broadcom/bcm2837-rpi-cm3.dtsi +f:arch/arm/boot/dts/broadcom/bcm2837-rpi-zero-2-w.dts +f:arch/arm/boot/dts/broadcom/bcm2837.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x-rpi-led-deprecated.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x-rpi-smsc9512.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x-rpi-smsc9514.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x-rpi-usb-host.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x-rpi-usb-otg.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x-rpi-usb-peripheral.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x-rpi-wifi-bt.dtsi +f:arch/arm/boot/dts/broadcom/bcm283x.dtsi +f:arch/arm/boot/dts/broadcom/bcm4708-asus-rt-ac56u.dts +f:arch/arm/boot/dts/broadcom/bcm4708-asus-rt-ac68u.dts +f:arch/arm/boot/dts/broadcom/bcm4708-buffalo-wzr-1166dhp-common.dtsi +f:arch/arm/boot/dts/broadcom/bcm4708-buffalo-wzr-1166dhp.dts +f:arch/arm/boot/dts/broadcom/bcm4708-buffalo-wzr-1166dhp2.dts +f:arch/arm/boot/dts/broadcom/bcm4708-buffalo-wzr-1750dhp.dts +f:arch/arm/boot/dts/broadcom/bcm4708-linksys-ea6300-v1.dts +f:arch/arm/boot/dts/broadcom/bcm4708-linksys-ea6500-v2.dts +f:arch/arm/boot/dts/broadcom/bcm4708-luxul-xap-1510.dts +f:arch/arm/boot/dts/broadcom/bcm4708-luxul-xwc-1000.dts +f:arch/arm/boot/dts/broadcom/bcm4708-netgear-r6250.dts +f:arch/arm/boot/dts/broadcom/bcm4708-netgear-r6300-v2.dts +f:arch/arm/boot/dts/broadcom/bcm4708-smartrg-sr400ac.dts +f:arch/arm/boot/dts/broadcom/bcm4708.dtsi +f:arch/arm/boot/dts/broadcom/bcm47081-asus-rt-n18u.dts +f:arch/arm/boot/dts/broadcom/bcm47081-buffalo-wzr-600dhp2.dts +f:arch/arm/boot/dts/broadcom/bcm47081-buffalo-wzr-900dhp.dts +f:arch/arm/boot/dts/broadcom/bcm47081-luxul-xap-1410.dts +f:arch/arm/boot/dts/broadcom/bcm47081-luxul-xwr-1200.dts +f:arch/arm/boot/dts/broadcom/bcm47081-tplink-archer-c5-v2.dts +f:arch/arm/boot/dts/broadcom/bcm47081.dtsi +f:arch/arm/boot/dts/broadcom/bcm4709-asus-rt-ac3200.dts +f:arch/arm/boot/dts/broadcom/bcm4709-asus-rt-ac87u.dts +f:arch/arm/boot/dts/broadcom/bcm4709-buffalo-wxr-1900dhp.dts +f:arch/arm/boot/dts/broadcom/bcm4709-linksys-ea9200.dts +f:arch/arm/boot/dts/broadcom/bcm4709-netgear-r7000.dts +f:arch/arm/boot/dts/broadcom/bcm4709-netgear-r8000.dts +f:arch/arm/boot/dts/broadcom/bcm4709-tplink-archer-c9-v1.dts +f:arch/arm/boot/dts/broadcom/bcm4709.dtsi +f:arch/arm/boot/dts/broadcom/bcm47094-asus-rt-ac3100.dts +f:arch/arm/boot/dts/broadcom/bcm47094-asus-rt-ac3100.dtsi +f:arch/arm/boot/dts/broadcom/bcm47094-asus-rt-ac5300.dts +f:arch/arm/boot/dts/broadcom/bcm47094-asus-rt-ac88u.dts +f:arch/arm/boot/dts/broadcom/bcm47094-dlink-dir-885l.dts +f:arch/arm/boot/dts/broadcom/bcm47094-dlink-dir-890l.dts +f:arch/arm/boot/dts/broadcom/bcm47094-linksys-panamera.dts +f:arch/arm/boot/dts/broadcom/bcm47094-luxul-abr-4500.dts +f:arch/arm/boot/dts/broadcom/bcm47094-luxul-xap-1610.dts +f:arch/arm/boot/dts/broadcom/bcm47094-luxul-xbr-4500.dts +f:arch/arm/boot/dts/broadcom/bcm47094-luxul-xwc-2000.dts +f:arch/arm/boot/dts/broadcom/bcm47094-luxul-xwr-3100.dts +f:arch/arm/boot/dts/broadcom/bcm47094-luxul-xwr-3150-v1.dts +f:arch/arm/boot/dts/broadcom/bcm47094-netgear-r8500.dts +f:arch/arm/boot/dts/broadcom/bcm47094-phicomm-k3.dts +f:arch/arm/boot/dts/broadcom/bcm47094.dtsi +f:arch/arm/boot/dts/broadcom/bcm47189-luxul-xap-1440.dts +f:arch/arm/boot/dts/broadcom/bcm47189-luxul-xap-810.dts +f:arch/arm/boot/dts/broadcom/bcm47189-tenda-ac9.dts +f:arch/arm/boot/dts/broadcom/bcm47622.dtsi +f:arch/arm/boot/dts/broadcom/bcm53015-meraki-mr26.dts +f:arch/arm/boot/dts/broadcom/bcm53016-dlink-dwl-8610ap.dts +f:arch/arm/boot/dts/broadcom/bcm53016-meraki-mr32.dts +f:arch/arm/boot/dts/broadcom/bcm5301x-nand-cs0-bch1.dtsi +f:arch/arm/boot/dts/broadcom/bcm5301x-nand-cs0-bch4.dtsi +f:arch/arm/boot/dts/broadcom/bcm5301x-nand-cs0-bch8.dtsi +f:arch/arm/boot/dts/broadcom/bcm5301x-nand-cs0.dtsi +f:arch/arm/boot/dts/broadcom/bcm5301x.dtsi +f:arch/arm/boot/dts/broadcom/bcm53340-ubnt-unifi-switch8.dts +f:arch/arm/boot/dts/broadcom/bcm53573.dtsi +f:arch/arm/boot/dts/broadcom/bcm63138.dtsi +f:arch/arm/boot/dts/broadcom/bcm63148.dtsi +f:arch/arm/boot/dts/broadcom/bcm63178.dtsi +f:arch/arm/boot/dts/broadcom/bcm6756.dtsi +f:arch/arm/boot/dts/broadcom/bcm6846-genexis-xg6846b.dts +f:arch/arm/boot/dts/broadcom/bcm6846.dtsi +f:arch/arm/boot/dts/broadcom/bcm6855.dtsi +f:arch/arm/boot/dts/broadcom/bcm6878.dtsi +f:arch/arm/boot/dts/broadcom/bcm7445-bcm97445svmb.dts +f:arch/arm/boot/dts/broadcom/bcm7445.dtsi +f:arch/arm/boot/dts/broadcom/bcm911360_entphn.dts +f:arch/arm/boot/dts/broadcom/bcm911360k.dts +f:arch/arm/boot/dts/broadcom/bcm94708.dts +f:arch/arm/boot/dts/broadcom/bcm94709.dts +f:arch/arm/boot/dts/broadcom/bcm947189acdbmr.dts +f:arch/arm/boot/dts/broadcom/bcm947622.dts +f:arch/arm/boot/dts/broadcom/bcm953012er.dts +f:arch/arm/boot/dts/broadcom/bcm953012hr.dts +f:arch/arm/boot/dts/broadcom/bcm953012k.dts +f:arch/arm/boot/dts/broadcom/bcm958300k.dts +f:arch/arm/boot/dts/broadcom/bcm958305k.dts +f:arch/arm/boot/dts/broadcom/bcm958522er.dts +f:arch/arm/boot/dts/broadcom/bcm958525er.dts +f:arch/arm/boot/dts/broadcom/bcm958525xmc.dts +f:arch/arm/boot/dts/broadcom/bcm958622hr.dts +f:arch/arm/boot/dts/broadcom/bcm958623hr.dts +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-alamo.dtsi +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-kingpin.dtsi +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-mx64-a0.dts +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-mx64.dts +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-mx64w-a0.dts +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-mx64w.dts +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-mx65.dts +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-mx65w.dts +f:arch/arm/boot/dts/broadcom/bcm958625-meraki-mx6x-common.dtsi +f:arch/arm/boot/dts/broadcom/bcm958625hr.dts +f:arch/arm/boot/dts/broadcom/bcm958625k.dts +f:arch/arm/boot/dts/broadcom/bcm963138.dts +f:arch/arm/boot/dts/broadcom/bcm963138dvt.dts +f:arch/arm/boot/dts/broadcom/bcm963148.dts +f:arch/arm/boot/dts/broadcom/bcm963178.dts +f:arch/arm/boot/dts/broadcom/bcm96756.dts +f:arch/arm/boot/dts/broadcom/bcm96846.dts +f:arch/arm/boot/dts/broadcom/bcm96855.dts +f:arch/arm/boot/dts/broadcom/bcm96878.dts +f:arch/arm/boot/dts/broadcom/bcm988312hr.dts +f:arch/arm/boot/dts/broadcom/bcm9hmidc.dtsi +f:arch/arm/boot/dts/calxeda/Makefile +f:arch/arm/boot/dts/calxeda/ecx-2000.dts +f:arch/arm/boot/dts/calxeda/ecx-common.dtsi +f:arch/arm/boot/dts/calxeda/highbank.dts +f:arch/arm/boot/dts/cirrus/Makefile +f:arch/arm/boot/dts/cirrus/ep7209.dtsi +f:arch/arm/boot/dts/cirrus/ep7211-edb7211.dts +f:arch/arm/boot/dts/cirrus/ep7211.dtsi +f:arch/arm/boot/dts/cirrus/ep93xx-bk3.dts +f:arch/arm/boot/dts/cirrus/ep93xx-edb9302.dts +f:arch/arm/boot/dts/cirrus/ep93xx-ts7250.dts +f:arch/arm/boot/dts/cirrus/ep93xx.dtsi +f:arch/arm/boot/dts/cnxt/Makefile +f:arch/arm/boot/dts/cnxt/cx92755.dtsi +f:arch/arm/boot/dts/cnxt/cx92755_equinox.dts +f:arch/arm/boot/dts/cros-adc-thermistors.dtsi +f:arch/arm/boot/dts/cros-ec-keyboard.dtsi +f:arch/arm/boot/dts/cros-ec-sbs.dtsi +f:arch/arm/boot/dts/gemini/Makefile +f:arch/arm/boot/dts/gemini/gemini-dlink-dir-685.dts +f:arch/arm/boot/dts/gemini/gemini-dlink-dns-313.dts +f:arch/arm/boot/dts/gemini/gemini-nas4220b.dts +f:arch/arm/boot/dts/gemini/gemini-ns2502.dts +f:arch/arm/boot/dts/gemini/gemini-rut1xx.dts +f:arch/arm/boot/dts/gemini/gemini-sl93512r.dts +f:arch/arm/boot/dts/gemini/gemini-sq201.dts +f:arch/arm/boot/dts/gemini/gemini-ssi1328.dts +f:arch/arm/boot/dts/gemini/gemini-wbd111.dts +f:arch/arm/boot/dts/gemini/gemini-wbd222.dts +f:arch/arm/boot/dts/gemini/gemini.dtsi +f:arch/arm/boot/dts/hisilicon/Makefile +f:arch/arm/boot/dts/hisilicon/hi3519-demb.dts +f:arch/arm/boot/dts/hisilicon/hi3519.dtsi +f:arch/arm/boot/dts/hisilicon/hi3620-hi4511.dts +f:arch/arm/boot/dts/hisilicon/hi3620.dtsi +f:arch/arm/boot/dts/hisilicon/hip01-ca9x2.dts +f:arch/arm/boot/dts/hisilicon/hip01.dtsi +f:arch/arm/boot/dts/hisilicon/hip04-d01.dts +f:arch/arm/boot/dts/hisilicon/hip04.dtsi +f:arch/arm/boot/dts/hisilicon/hisi-x5hd2-dkb.dts +f:arch/arm/boot/dts/hisilicon/hisi-x5hd2.dtsi +f:arch/arm/boot/dts/hisilicon/sd5203.dts +f:arch/arm/boot/dts/hpe/Makefile +f:arch/arm/boot/dts/hpe/hpe-bmc-dl360gen10.dts +f:arch/arm/boot/dts/hpe/hpe-gxp.dtsi +f:arch/arm/boot/dts/intel/Makefile +f:arch/arm/boot/dts/intel/axm/Makefile +f:arch/arm/boot/dts/intel/axm/axm5516-amarillo.dts +f:arch/arm/boot/dts/intel/axm/axm5516-cpus.dtsi +f:arch/arm/boot/dts/intel/axm/axm55xx.dtsi +f:arch/arm/boot/dts/intel/ixp/Makefile +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-adi-coyote.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-arcom-vulcan.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-dlink-dsm-g600.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-freecom-fsg-3.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-gateway-7001.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-gateworks-gw2348.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-goramo-multilink.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-iomega-nas100d.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-ixdp425.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-ixdpg425.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-linksys-nslu2.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-linksys-wrv54g.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-netgear-wg302v1.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-usrobotics-usr8200.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x-welltech-epbx100.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp42x.dtsi +f:arch/arm/boot/dts/intel/ixp/intel-ixp43x-gateworks-gw2358.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp43x-kixrp435.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp43x.dtsi +f:arch/arm/boot/dts/intel/ixp/intel-ixp45x-ixp46x.dtsi +f:arch/arm/boot/dts/intel/ixp/intel-ixp46x-ixdp465.dts +f:arch/arm/boot/dts/intel/ixp/intel-ixp4xx-reference-design.dtsi +f:arch/arm/boot/dts/intel/ixp/intel-ixp4xx.dtsi +f:arch/arm/boot/dts/intel/pxa/Makefile +f:arch/arm/boot/dts/intel/pxa/pxa25x.dtsi +f:arch/arm/boot/dts/intel/pxa/pxa27x.dtsi +f:arch/arm/boot/dts/intel/pxa/pxa2xx.dtsi +f:arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi +f:arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-connector.dts +f:arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-controller.dts +f:arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-speaker-l.dts +f:arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-speaker-m.dts +f:arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-speaker-one.dts +f:arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-speaker-s.dts +f:arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-tuneable-clock.dtsi +f:arch/arm/boot/dts/intel/pxa/pxa3xx.dtsi +f:arch/arm/boot/dts/intel/socfpga/Makefile +f:arch/arm/boot/dts/intel/socfpga/socfpga.dtsi +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria10.dtsi +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria10_chameleonv3.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria10_mercury_aa1.dtsi +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria10_mercury_pe1.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria10_socdk.dtsi +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria10_socdk_nand.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria10_socdk_qspi.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria10_socdk_sdmmc.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria5.dtsi +f:arch/arm/boot/dts/intel/socfpga/socfpga_arria5_socdk.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5.dtsi +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_chameleon96.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_de0_nano_soc.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_de10nano.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_mcv.dtsi +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_mcvevk.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_socdk.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_sockit.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_socrates.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_sodia.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_vining_fpga.dts +f:arch/arm/boot/dts/intel/socfpga/socfpga_vt.dts +f:arch/arm/boot/dts/marvell/Makefile +f:arch/arm/boot/dts/marvell/armada-370-c200-v2.dts +f:arch/arm/boot/dts/marvell/armada-370-db.dts +f:arch/arm/boot/dts/marvell/armada-370-dlink-dns327l.dts +f:arch/arm/boot/dts/marvell/armada-370-mirabox.dts +f:arch/arm/boot/dts/marvell/armada-370-netgear-rn102.dts +f:arch/arm/boot/dts/marvell/armada-370-netgear-rn104.dts +f:arch/arm/boot/dts/marvell/armada-370-rd.dts +f:arch/arm/boot/dts/marvell/armada-370-seagate-nas-2bay.dts +f:arch/arm/boot/dts/marvell/armada-370-seagate-nas-4bay.dts +f:arch/arm/boot/dts/marvell/armada-370-seagate-nas-xbay.dtsi +f:arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud-2bay.dts +f:arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud.dts +f:arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud.dtsi +f:arch/arm/boot/dts/marvell/armada-370-synology-ds213j.dts +f:arch/arm/boot/dts/marvell/armada-370-xp.dtsi +f:arch/arm/boot/dts/marvell/armada-370.dtsi +f:arch/arm/boot/dts/marvell/armada-375-db.dts +f:arch/arm/boot/dts/marvell/armada-375.dtsi +f:arch/arm/boot/dts/marvell/armada-380.dtsi +f:arch/arm/boot/dts/marvell/armada-381-netgear-gs110emx.dts +f:arch/arm/boot/dts/marvell/armada-382-rd-ac3x-48g4x2xl.dts +f:arch/arm/boot/dts/marvell/armada-385-atl-x530.dts +f:arch/arm/boot/dts/marvell/armada-385-clearfog-gtr-l8.dts +f:arch/arm/boot/dts/marvell/armada-385-clearfog-gtr-s4.dts +f:arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi +f:arch/arm/boot/dts/marvell/armada-385-db-88f6820-amc.dts +f:arch/arm/boot/dts/marvell/armada-385-db-ap.dts +f:arch/arm/boot/dts/marvell/armada-385-linksys-caiman.dts +f:arch/arm/boot/dts/marvell/armada-385-linksys-cobra.dts +f:arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts +f:arch/arm/boot/dts/marvell/armada-385-linksys-shelby.dts +f:arch/arm/boot/dts/marvell/armada-385-linksys.dtsi +f:arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts +f:arch/arm/boot/dts/marvell/armada-385-turris-omnia.dts +f:arch/arm/boot/dts/marvell/armada-385.dtsi +f:arch/arm/boot/dts/marvell/armada-388-clearfog-base.dts +f:arch/arm/boot/dts/marvell/armada-388-clearfog-pro.dts +f:arch/arm/boot/dts/marvell/armada-388-clearfog.dts +f:arch/arm/boot/dts/marvell/armada-388-clearfog.dtsi +f:arch/arm/boot/dts/marvell/armada-388-db.dts +f:arch/arm/boot/dts/marvell/armada-388-gp.dts +f:arch/arm/boot/dts/marvell/armada-388-helios4.dts +f:arch/arm/boot/dts/marvell/armada-388-rd.dts +f:arch/arm/boot/dts/marvell/armada-388.dtsi +f:arch/arm/boot/dts/marvell/armada-38x-solidrun-microsom.dtsi +f:arch/arm/boot/dts/marvell/armada-38x.dtsi +f:arch/arm/boot/dts/marvell/armada-390-db.dts +f:arch/arm/boot/dts/marvell/armada-390.dtsi +f:arch/arm/boot/dts/marvell/armada-395-gp.dts +f:arch/arm/boot/dts/marvell/armada-395.dtsi +f:arch/arm/boot/dts/marvell/armada-398-db.dts +f:arch/arm/boot/dts/marvell/armada-398.dtsi +f:arch/arm/boot/dts/marvell/armada-39x.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-98dx3236.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-98dx3336.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-98dx4251.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-axpwifiap.dts +f:arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s-bit.dts +f:arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s.dts +f:arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s-bit.dts +f:arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s.dts +f:arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s-bit.dts +f:arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s.dts +f:arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-db-dxbc2.dts +f:arch/arm/boot/dts/marvell/armada-xp-db-xc3-24g4xg.dts +f:arch/arm/boot/dts/marvell/armada-xp-db.dts +f:arch/arm/boot/dts/marvell/armada-xp-gp.dts +f:arch/arm/boot/dts/marvell/armada-xp-lenovo-ix4-300d.dts +f:arch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts +f:arch/arm/boot/dts/marvell/armada-xp-matrix.dts +f:arch/arm/boot/dts/marvell/armada-xp-mv78230.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-mv78260.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-mv78460.dtsi +f:arch/arm/boot/dts/marvell/armada-xp-netgear-rn2120.dts +f:arch/arm/boot/dts/marvell/armada-xp-openblocks-ax3-4.dts +f:arch/arm/boot/dts/marvell/armada-xp-synology-ds414.dts +f:arch/arm/boot/dts/marvell/armada-xp.dtsi +f:arch/arm/boot/dts/marvell/dove-cm-a510.dtsi +f:arch/arm/boot/dts/marvell/dove-cubox-es.dts +f:arch/arm/boot/dts/marvell/dove-cubox.dts +f:arch/arm/boot/dts/marvell/dove-d2plug.dts +f:arch/arm/boot/dts/marvell/dove-d3plug.dts +f:arch/arm/boot/dts/marvell/dove-dove-db.dts +f:arch/arm/boot/dts/marvell/dove-sbc-a510.dts +f:arch/arm/boot/dts/marvell/dove.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts +f:arch/arm/boot/dts/marvell/kirkwood-6192.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-6281.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-6282.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-98dx4122.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-b3.dts +f:arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts +f:arch/arm/boot/dts/marvell/kirkwood-c200-v1.dts +f:arch/arm/boot/dts/marvell/kirkwood-cloudbox.dts +f:arch/arm/boot/dts/marvell/kirkwood-d2net.dts +f:arch/arm/boot/dts/marvell/kirkwood-db-88f6281.dts +f:arch/arm/boot/dts/marvell/kirkwood-db-88f6282.dts +f:arch/arm/boot/dts/marvell/kirkwood-db.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-dir665.dts +f:arch/arm/boot/dts/marvell/kirkwood-dns320.dts +f:arch/arm/boot/dts/marvell/kirkwood-dns325.dts +f:arch/arm/boot/dts/marvell/kirkwood-dnskw.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-dockstar.dts +f:arch/arm/boot/dts/marvell/kirkwood-dreamplug.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds109.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds110jv10.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds111.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds112.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds209.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds210.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds212.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds212j.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds409.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds409slim.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds411.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds411j.dts +f:arch/arm/boot/dts/marvell/kirkwood-ds411slim.dts +f:arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts +f:arch/arm/boot/dts/marvell/kirkwood-guruplug-server-plus.dts +f:arch/arm/boot/dts/marvell/kirkwood-ib62x0.dts +f:arch/arm/boot/dts/marvell/kirkwood-iconnect.dts +f:arch/arm/boot/dts/marvell/kirkwood-iomega_ix2_200.dts +f:arch/arm/boot/dts/marvell/kirkwood-is2.dts +f:arch/arm/boot/dts/marvell/kirkwood-km_common.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-km_fixedeth.dts +f:arch/arm/boot/dts/marvell/kirkwood-km_kirkwood.dts +f:arch/arm/boot/dts/marvell/kirkwood-l-50.dts +f:arch/arm/boot/dts/marvell/kirkwood-laplug.dts +f:arch/arm/boot/dts/marvell/kirkwood-linkstation-6282.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-linkstation-duo-6281.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts +f:arch/arm/boot/dts/marvell/kirkwood-linkstation-lsvl.dts +f:arch/arm/boot/dts/marvell/kirkwood-linkstation-lswsxl.dts +f:arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts +f:arch/arm/boot/dts/marvell/kirkwood-linkstation-lswxl.dts +f:arch/arm/boot/dts/marvell/kirkwood-linkstation.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts +f:arch/arm/boot/dts/marvell/kirkwood-lschlv2.dts +f:arch/arm/boot/dts/marvell/kirkwood-lsxhl.dts +f:arch/arm/boot/dts/marvell/kirkwood-lsxl.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-mplcec4.dts +f:arch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts +f:arch/arm/boot/dts/marvell/kirkwood-nas2big.dts +f:arch/arm/boot/dts/marvell/kirkwood-net2big.dts +f:arch/arm/boot/dts/marvell/kirkwood-net5big.dts +f:arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts +f:arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts +f:arch/arm/boot/dts/marvell/kirkwood-netxbig.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-ns2-common.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-ns2.dts +f:arch/arm/boot/dts/marvell/kirkwood-ns2lite.dts +f:arch/arm/boot/dts/marvell/kirkwood-ns2max.dts +f:arch/arm/boot/dts/marvell/kirkwood-ns2mini.dts +f:arch/arm/boot/dts/marvell/kirkwood-nsa310.dts +f:arch/arm/boot/dts/marvell/kirkwood-nsa310a.dts +f:arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts +f:arch/arm/boot/dts/marvell/kirkwood-nsa320.dts +f:arch/arm/boot/dts/marvell/kirkwood-nsa325.dts +f:arch/arm/boot/dts/marvell/kirkwood-nsa3x0-common.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-openblocks_a6.dts +f:arch/arm/boot/dts/marvell/kirkwood-openblocks_a7.dts +f:arch/arm/boot/dts/marvell/kirkwood-openrd-base.dts +f:arch/arm/boot/dts/marvell/kirkwood-openrd-client.dts +f:arch/arm/boot/dts/marvell/kirkwood-openrd-ultimate.dts +f:arch/arm/boot/dts/marvell/kirkwood-openrd.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts +f:arch/arm/boot/dts/marvell/kirkwood-pogoplug-series-4.dts +f:arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts +f:arch/arm/boot/dts/marvell/kirkwood-rd88f6281-a.dts +f:arch/arm/boot/dts/marvell/kirkwood-rd88f6281-z0.dts +f:arch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-rs212.dts +f:arch/arm/boot/dts/marvell/kirkwood-rs409.dts +f:arch/arm/boot/dts/marvell/kirkwood-rs411.dts +f:arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-sheevaplug-esata.dts +f:arch/arm/boot/dts/marvell/kirkwood-sheevaplug.dts +f:arch/arm/boot/dts/marvell/kirkwood-synology.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-t5325.dts +f:arch/arm/boot/dts/marvell/kirkwood-topkick.dts +f:arch/arm/boot/dts/marvell/kirkwood-ts219-6281.dts +f:arch/arm/boot/dts/marvell/kirkwood-ts219-6282.dts +f:arch/arm/boot/dts/marvell/kirkwood-ts219.dtsi +f:arch/arm/boot/dts/marvell/kirkwood-ts419-6281.dts +f:arch/arm/boot/dts/marvell/kirkwood-ts419-6282.dts +f:arch/arm/boot/dts/marvell/kirkwood-ts419.dtsi +f:arch/arm/boot/dts/marvell/kirkwood.dtsi +f:arch/arm/boot/dts/marvell/mmp2-brownstone.dts +f:arch/arm/boot/dts/marvell/mmp2-olpc-xo-1-75.dts +f:arch/arm/boot/dts/marvell/mmp2.dtsi +f:arch/arm/boot/dts/marvell/mmp3-dell-ariel.dts +f:arch/arm/boot/dts/marvell/mmp3.dtsi +f:arch/arm/boot/dts/marvell/mvebu-linkstation-fan.dtsi +f:arch/arm/boot/dts/marvell/mvebu-linkstation-gpio-simple.dtsi +f:arch/arm/boot/dts/marvell/orion5x-kuroboxpro.dts +f:arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts +f:arch/arm/boot/dts/marvell/orion5x-lacie-ethernet-disk-mini-v2.dts +f:arch/arm/boot/dts/marvell/orion5x-linkstation-lschl.dts +f:arch/arm/boot/dts/marvell/orion5x-linkstation-lsgl.dts +f:arch/arm/boot/dts/marvell/orion5x-linkstation-lswtgl.dts +f:arch/arm/boot/dts/marvell/orion5x-linkstation.dtsi +f:arch/arm/boot/dts/marvell/orion5x-lswsgl.dts +f:arch/arm/boot/dts/marvell/orion5x-maxtor-shared-storage-2.dts +f:arch/arm/boot/dts/marvell/orion5x-mv88f5181.dtsi +f:arch/arm/boot/dts/marvell/orion5x-mv88f5182.dtsi +f:arch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts +f:arch/arm/boot/dts/marvell/orion5x-rd88f5182-nas.dts +f:arch/arm/boot/dts/marvell/orion5x.dtsi +f:arch/arm/boot/dts/marvell/pxa168-aspenite.dts +f:arch/arm/boot/dts/marvell/pxa168.dtsi +f:arch/arm/boot/dts/marvell/pxa910-dkb.dts +f:arch/arm/boot/dts/marvell/pxa910.dtsi +f:arch/arm/boot/dts/mediatek/Makefile +f:arch/arm/boot/dts/mediatek/mt2701-evb.dts +f:arch/arm/boot/dts/mediatek/mt2701-pinfunc.h +f:arch/arm/boot/dts/mediatek/mt2701.dtsi +f:arch/arm/boot/dts/mediatek/mt6323.dtsi +f:arch/arm/boot/dts/mediatek/mt6572-jty-d101.dts +f:arch/arm/boot/dts/mediatek/mt6572-lenovo-a369i.dts +f:arch/arm/boot/dts/mediatek/mt6572.dtsi +f:arch/arm/boot/dts/mediatek/mt6580-evbp1.dts +f:arch/arm/boot/dts/mediatek/mt6580.dtsi +f:arch/arm/boot/dts/mediatek/mt6582-prestigio-pmt5008-3g.dts +f:arch/arm/boot/dts/mediatek/mt6582.dtsi +f:arch/arm/boot/dts/mediatek/mt6589-aquaris5.dts +f:arch/arm/boot/dts/mediatek/mt6589-fairphone-fp1.dts +f:arch/arm/boot/dts/mediatek/mt6589.dtsi +f:arch/arm/boot/dts/mediatek/mt6592-evb.dts +f:arch/arm/boot/dts/mediatek/mt6592.dtsi +f:arch/arm/boot/dts/mediatek/mt7623.dtsi +f:arch/arm/boot/dts/mediatek/mt7623a-rfb-emmc.dts +f:arch/arm/boot/dts/mediatek/mt7623a-rfb-nand.dts +f:arch/arm/boot/dts/mediatek/mt7623a.dtsi +f:arch/arm/boot/dts/mediatek/mt7623n-bananapi-bpi-r2.dts +f:arch/arm/boot/dts/mediatek/mt7623n-rfb-emmc.dts +f:arch/arm/boot/dts/mediatek/mt7623n.dtsi +f:arch/arm/boot/dts/mediatek/mt7629-rfb.dts +f:arch/arm/boot/dts/mediatek/mt7629.dtsi +f:arch/arm/boot/dts/mediatek/mt8127-moose.dts +f:arch/arm/boot/dts/mediatek/mt8127.dtsi +f:arch/arm/boot/dts/mediatek/mt8135-evbp1.dts +f:arch/arm/boot/dts/mediatek/mt8135.dtsi +f:arch/arm/boot/dts/microchip/Makefile +f:arch/arm/boot/dts/microchip/aks-cdu.dts +f:arch/arm/boot/dts/microchip/animeo_ip.dts +f:arch/arm/boot/dts/microchip/at91-ariag25.dts +f:arch/arm/boot/dts/microchip/at91-ariettag25.dts +f:arch/arm/boot/dts/microchip/at91-cosino.dtsi +f:arch/arm/boot/dts/microchip/at91-cosino_mega2560.dts +f:arch/arm/boot/dts/microchip/at91-dvk_som60.dts +f:arch/arm/boot/dts/microchip/at91-dvk_su60_somc.dtsi +f:arch/arm/boot/dts/microchip/at91-dvk_su60_somc_lcm.dtsi +f:arch/arm/boot/dts/microchip/at91-foxg20.dts +f:arch/arm/boot/dts/microchip/at91-gatwick.dts +f:arch/arm/boot/dts/microchip/at91-kizbox.dts +f:arch/arm/boot/dts/microchip/at91-kizbox2-2.dts +f:arch/arm/boot/dts/microchip/at91-kizbox2-common.dtsi +f:arch/arm/boot/dts/microchip/at91-kizbox3-hs.dts +f:arch/arm/boot/dts/microchip/at91-kizbox3_common.dtsi +f:arch/arm/boot/dts/microchip/at91-kizboxmini-base.dts +f:arch/arm/boot/dts/microchip/at91-kizboxmini-common.dtsi +f:arch/arm/boot/dts/microchip/at91-kizboxmini-mb.dts +f:arch/arm/boot/dts/microchip/at91-kizboxmini-rd.dts +f:arch/arm/boot/dts/microchip/at91-linea.dtsi +f:arch/arm/boot/dts/microchip/at91-lmu5000.dts +f:arch/arm/boot/dts/microchip/at91-natte.dtsi +f:arch/arm/boot/dts/microchip/at91-nattis-2-natte-2.dts +f:arch/arm/boot/dts/microchip/at91-q5xr5.dts +f:arch/arm/boot/dts/microchip/at91-qil_a9260.dts +f:arch/arm/boot/dts/microchip/at91-sam9_l9260.dts +f:arch/arm/boot/dts/microchip/at91-sam9x60_curiosity.dts +f:arch/arm/boot/dts/microchip/at91-sam9x60ek.dts +f:arch/arm/boot/dts/microchip/at91-sam9x75_curiosity.dts +f:arch/arm/boot/dts/microchip/at91-sama5d27_som1.dtsi +f:arch/arm/boot/dts/microchip/at91-sama5d27_som1_ek.dts +f:arch/arm/boot/dts/microchip/at91-sama5d27_wlsom1.dtsi +f:arch/arm/boot/dts/microchip/at91-sama5d27_wlsom1_ek.dts +f:arch/arm/boot/dts/microchip/at91-sama5d29_curiosity.dts +f:arch/arm/boot/dts/microchip/at91-sama5d2_icp.dts +f:arch/arm/boot/dts/microchip/at91-sama5d2_ptc_ek.dts +f:arch/arm/boot/dts/microchip/at91-sama5d2_xplained.dts +f:arch/arm/boot/dts/microchip/at91-sama5d3_eds.dts +f:arch/arm/boot/dts/microchip/at91-sama5d3_ksz9477_evb.dts +f:arch/arm/boot/dts/microchip/at91-sama5d3_xplained.dts +f:arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4.dtsi +f:arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4evk.dts +f:arch/arm/boot/dts/microchip/at91-sama5d4_xplained.dts +f:arch/arm/boot/dts/microchip/at91-sama5d4ek.dts +f:arch/arm/boot/dts/microchip/at91-sama7d65_curiosity.dts +f:arch/arm/boot/dts/microchip/at91-sama7g54_curiosity.dts +f:arch/arm/boot/dts/microchip/at91-sama7g5ek.dts +f:arch/arm/boot/dts/microchip/at91-smartkiz.dts +f:arch/arm/boot/dts/microchip/at91-som60.dtsi +f:arch/arm/boot/dts/microchip/at91-tse850-3.dts +f:arch/arm/boot/dts/microchip/at91-vinco.dts +f:arch/arm/boot/dts/microchip/at91-wb45n.dts +f:arch/arm/boot/dts/microchip/at91-wb45n.dtsi +f:arch/arm/boot/dts/microchip/at91-wb50n.dts +f:arch/arm/boot/dts/microchip/at91-wb50n.dtsi +f:arch/arm/boot/dts/microchip/at91rm9200.dtsi +f:arch/arm/boot/dts/microchip/at91rm9200_pqfp.dtsi +f:arch/arm/boot/dts/microchip/at91rm9200ek.dts +f:arch/arm/boot/dts/microchip/at91sam9260.dtsi +f:arch/arm/boot/dts/microchip/at91sam9260ek.dts +f:arch/arm/boot/dts/microchip/at91sam9261.dtsi +f:arch/arm/boot/dts/microchip/at91sam9261ek.dts +f:arch/arm/boot/dts/microchip/at91sam9263.dtsi +f:arch/arm/boot/dts/microchip/at91sam9263ek.dts +f:arch/arm/boot/dts/microchip/at91sam9g15.dtsi +f:arch/arm/boot/dts/microchip/at91sam9g15ek.dts +f:arch/arm/boot/dts/microchip/at91sam9g20.dtsi +f:arch/arm/boot/dts/microchip/at91sam9g20ek.dts +f:arch/arm/boot/dts/microchip/at91sam9g20ek_2mmc.dts +f:arch/arm/boot/dts/microchip/at91sam9g20ek_common.dtsi +f:arch/arm/boot/dts/microchip/at91sam9g25-gardena-smart-gateway.dts +f:arch/arm/boot/dts/microchip/at91sam9g25.dtsi +f:arch/arm/boot/dts/microchip/at91sam9g25ek.dts +f:arch/arm/boot/dts/microchip/at91sam9g35.dtsi +f:arch/arm/boot/dts/microchip/at91sam9g35ek.dts +f:arch/arm/boot/dts/microchip/at91sam9g45.dtsi +f:arch/arm/boot/dts/microchip/at91sam9m10g45ek.dts +f:arch/arm/boot/dts/microchip/at91sam9n12.dtsi +f:arch/arm/boot/dts/microchip/at91sam9n12ek.dts +f:arch/arm/boot/dts/microchip/at91sam9rl.dtsi +f:arch/arm/boot/dts/microchip/at91sam9rlek.dts +f:arch/arm/boot/dts/microchip/at91sam9x25.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x25ek.dts +f:arch/arm/boot/dts/microchip/at91sam9x35.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x35ek.dts +f:arch/arm/boot/dts/microchip/at91sam9x5.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5_can.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5_isi.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5_lcd.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5_macb0.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5_macb1.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5_usart3.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5cm.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5dm.dtsi +f:arch/arm/boot/dts/microchip/at91sam9x5ek.dtsi +f:arch/arm/boot/dts/microchip/at91sam9xe.dtsi +f:arch/arm/boot/dts/microchip/ethernut5.dts +f:arch/arm/boot/dts/microchip/evk-pro3.dts +f:arch/arm/boot/dts/microchip/ge863-pro3.dtsi +f:arch/arm/boot/dts/microchip/lan966x-kontron-kswitch-d10-mmt-6g-2gs.dts +f:arch/arm/boot/dts/microchip/lan966x-kontron-kswitch-d10-mmt-8g.dts +f:arch/arm/boot/dts/microchip/lan966x-kontron-kswitch-d10-mmt.dtsi +f:arch/arm/boot/dts/microchip/lan966x-pcb8290.dts +f:arch/arm/boot/dts/microchip/lan966x-pcb8291.dts +f:arch/arm/boot/dts/microchip/lan966x-pcb8309.dts +f:arch/arm/boot/dts/microchip/lan966x.dtsi +f:arch/arm/boot/dts/microchip/mpa1600.dts +f:arch/arm/boot/dts/microchip/pm9g45.dts +f:arch/arm/boot/dts/microchip/sam9x60.dtsi +f:arch/arm/boot/dts/microchip/sam9x7.dtsi +f:arch/arm/boot/dts/microchip/sama5d2-pinfunc.h +f:arch/arm/boot/dts/microchip/sama5d2.dtsi +f:arch/arm/boot/dts/microchip/sama5d29.dtsi +f:arch/arm/boot/dts/microchip/sama5d3.dtsi +f:arch/arm/boot/dts/microchip/sama5d31.dtsi +f:arch/arm/boot/dts/microchip/sama5d31ek.dts +f:arch/arm/boot/dts/microchip/sama5d33.dtsi +f:arch/arm/boot/dts/microchip/sama5d33ek.dts +f:arch/arm/boot/dts/microchip/sama5d34.dtsi +f:arch/arm/boot/dts/microchip/sama5d34ek.dts +f:arch/arm/boot/dts/microchip/sama5d35.dtsi +f:arch/arm/boot/dts/microchip/sama5d35ek.dts +f:arch/arm/boot/dts/microchip/sama5d36.dtsi +f:arch/arm/boot/dts/microchip/sama5d36ek.dts +f:arch/arm/boot/dts/microchip/sama5d36ek_cmp.dts +f:arch/arm/boot/dts/microchip/sama5d3_can.dtsi +f:arch/arm/boot/dts/microchip/sama5d3_emac.dtsi +f:arch/arm/boot/dts/microchip/sama5d3_gmac.dtsi +f:arch/arm/boot/dts/microchip/sama5d3_lcd.dtsi +f:arch/arm/boot/dts/microchip/sama5d3_mci2.dtsi +f:arch/arm/boot/dts/microchip/sama5d3_tcb1.dtsi +f:arch/arm/boot/dts/microchip/sama5d3_uart.dtsi +f:arch/arm/boot/dts/microchip/sama5d3xcm.dtsi +f:arch/arm/boot/dts/microchip/sama5d3xcm_cmp.dtsi +f:arch/arm/boot/dts/microchip/sama5d3xdm.dtsi +f:arch/arm/boot/dts/microchip/sama5d3xmb.dtsi +f:arch/arm/boot/dts/microchip/sama5d3xmb_cmp.dtsi +f:arch/arm/boot/dts/microchip/sama5d3xmb_emac.dtsi +f:arch/arm/boot/dts/microchip/sama5d3xmb_gmac.dtsi +f:arch/arm/boot/dts/microchip/sama5d4.dtsi +f:arch/arm/boot/dts/microchip/sama7d65-pinfunc.h +f:arch/arm/boot/dts/microchip/sama7d65.dtsi +f:arch/arm/boot/dts/microchip/sama7g5-pinfunc.h +f:arch/arm/boot/dts/microchip/sama7g5.dtsi +f:arch/arm/boot/dts/microchip/tny_a9260.dts +f:arch/arm/boot/dts/microchip/tny_a9260_common.dtsi +f:arch/arm/boot/dts/microchip/tny_a9263.dts +f:arch/arm/boot/dts/microchip/tny_a9g20.dts +f:arch/arm/boot/dts/microchip/usb_a9260.dts +f:arch/arm/boot/dts/microchip/usb_a9260_common.dtsi +f:arch/arm/boot/dts/microchip/usb_a9263.dts +f:arch/arm/boot/dts/microchip/usb_a9g20-dab-mmx.dtsi +f:arch/arm/boot/dts/microchip/usb_a9g20.dts +f:arch/arm/boot/dts/microchip/usb_a9g20_lpw.dts +f:arch/arm/boot/dts/moxa/Makefile +f:arch/arm/boot/dts/moxa/moxart-uc7112lx.dts +f:arch/arm/boot/dts/moxa/moxart.dtsi +f:arch/arm/boot/dts/nspire/Makefile +f:arch/arm/boot/dts/nspire/nspire-classic.dtsi +f:arch/arm/boot/dts/nspire/nspire-clp.dts +f:arch/arm/boot/dts/nspire/nspire-cx.dts +f:arch/arm/boot/dts/nspire/nspire-tp.dts +f:arch/arm/boot/dts/nspire/nspire.dtsi +f:arch/arm/boot/dts/nuvoton/Makefile +f:arch/arm/boot/dts/nuvoton/nuvoton-common-npcm7xx.dtsi +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gbs.dts +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gsj-gpio.dtsi +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gsj.dts +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm730-kudo.dts +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm730.dtsi +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm750-evb.dts +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm750-pincfg-evb.dtsi +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm750-runbmc-olympus-pincfg.dtsi +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm750-runbmc-olympus.dts +f:arch/arm/boot/dts/nuvoton/nuvoton-npcm750.dtsi +f:arch/arm/boot/dts/nuvoton/nuvoton-wpcm450-supermicro-x9sci-ln4f.dts +f:arch/arm/boot/dts/nuvoton/nuvoton-wpcm450.dtsi +f:arch/arm/boot/dts/nvidia/Makefile +f:arch/arm/boot/dts/nvidia/tegra114-asus-tf701t.dts +f:arch/arm/boot/dts/nvidia/tegra114-dalmore.dts +f:arch/arm/boot/dts/nvidia/tegra114-roth.dts +f:arch/arm/boot/dts/nvidia/tegra114-tn7.dts +f:arch/arm/boot/dts/nvidia/tegra114.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-apalis-emc.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-apalis-eval.dts +f:arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2-eval.dts +f:arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-apalis.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-jetson-tk1-emc.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-jetson-tk1.dts +f:arch/arm/boot/dts/nvidia/tegra124-nyan-big-emc.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-nyan-big-fhd.dts +f:arch/arm/boot/dts/nvidia/tegra124-nyan-big.dts +f:arch/arm/boot/dts/nvidia/tegra124-nyan-blaze-emc.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-nyan-blaze.dts +f:arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-peripherals-opp.dtsi +f:arch/arm/boot/dts/nvidia/tegra124-venice2.dts +f:arch/arm/boot/dts/nvidia/tegra124.dtsi +f:arch/arm/boot/dts/nvidia/tegra20-acer-a500-picasso.dts +f:arch/arm/boot/dts/nvidia/tegra20-asus-tf101.dts +f:arch/arm/boot/dts/nvidia/tegra20-colibri-eval-v3.dts +f:arch/arm/boot/dts/nvidia/tegra20-colibri-iris.dts +f:arch/arm/boot/dts/nvidia/tegra20-colibri.dtsi +f:arch/arm/boot/dts/nvidia/tegra20-cpu-opp-microvolt.dtsi +f:arch/arm/boot/dts/nvidia/tegra20-cpu-opp.dtsi +f:arch/arm/boot/dts/nvidia/tegra20-harmony.dts +f:arch/arm/boot/dts/nvidia/tegra20-medcom-wide.dts +f:arch/arm/boot/dts/nvidia/tegra20-paz00.dts +f:arch/arm/boot/dts/nvidia/tegra20-peripherals-opp.dtsi +f:arch/arm/boot/dts/nvidia/tegra20-plutux.dts +f:arch/arm/boot/dts/nvidia/tegra20-seaboard.dts +f:arch/arm/boot/dts/nvidia/tegra20-tamonten.dtsi +f:arch/arm/boot/dts/nvidia/tegra20-tec.dts +f:arch/arm/boot/dts/nvidia/tegra20-trimslice.dts +f:arch/arm/boot/dts/nvidia/tegra20-ventana.dts +f:arch/arm/boot/dts/nvidia/tegra20.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-apalis-eval.dts +f:arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1-eval.dts +f:arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-apalis.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-lvds-display.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-E1565.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-PM269.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-common.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-maxim-pmic.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-memory-timings.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-ti-pmic.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-tilapia-E1565.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-tilapia-memory-timings.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-tilapia.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-asus-p1801-t.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-tf201.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-tf300t.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-tf300tg.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-tf300tl.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-tf600t.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-tf700t.dts +f:arch/arm/boot/dts/nvidia/tegra30-asus-transformer-common.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-beaver.dts +f:arch/arm/boot/dts/nvidia/tegra30-cardhu-a02.dts +f:arch/arm/boot/dts/nvidia/tegra30-cardhu-a04.dts +f:arch/arm/boot/dts/nvidia/tegra30-cardhu.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-colibri-eval-v3.dts +f:arch/arm/boot/dts/nvidia/tegra30-colibri.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-cpu-opp-microvolt.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-cpu-opp.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-lg-p880.dts +f:arch/arm/boot/dts/nvidia/tegra30-lg-p895.dts +f:arch/arm/boot/dts/nvidia/tegra30-lg-x3.dtsi +f:arch/arm/boot/dts/nvidia/tegra30-ouya.dts +f:arch/arm/boot/dts/nvidia/tegra30-pegatron-chagall.dts +f:arch/arm/boot/dts/nvidia/tegra30-peripherals-opp.dtsi +f:arch/arm/boot/dts/nvidia/tegra30.dtsi +f:arch/arm/boot/dts/nxp/Makefile +f:arch/arm/boot/dts/nxp/imx/Makefile +f:arch/arm/boot/dts/nxp/imx/e60k02.dtsi +f:arch/arm/boot/dts/nxp/imx/e70k02.dtsi +f:arch/arm/boot/dts/nxp/imx/imx1-ads.dts +f:arch/arm/boot/dts/nxp/imx/imx1-apf9328.dts +f:arch/arm/boot/dts/nxp/imx/imx1-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx1.dtsi +f:arch/arm/boot/dts/nxp/imx/imx25-eukrea-cpuimx25.dtsi +f:arch/arm/boot/dts/nxp/imx/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts +f:arch/arm/boot/dts/nxp/imx/imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dts +f:arch/arm/boot/dts/nxp/imx/imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dts +f:arch/arm/boot/dts/nxp/imx/imx25-eukrea-mbimxsd25-baseboard.dts +f:arch/arm/boot/dts/nxp/imx/imx25-karo-tx25.dts +f:arch/arm/boot/dts/nxp/imx/imx25-pdk.dts +f:arch/arm/boot/dts/nxp/imx/imx25-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx25.dtsi +f:arch/arm/boot/dts/nxp/imx/imx27-apf27.dts +f:arch/arm/boot/dts/nxp/imx/imx27-apf27dev.dts +f:arch/arm/boot/dts/nxp/imx/imx27-eukrea-cpuimx27.dtsi +f:arch/arm/boot/dts/nxp/imx/imx27-eukrea-mbimxsd27-baseboard.dts +f:arch/arm/boot/dts/nxp/imx/imx27-pdk.dts +f:arch/arm/boot/dts/nxp/imx/imx27-phytec-phycard-s-rdk.dts +f:arch/arm/boot/dts/nxp/imx/imx27-phytec-phycard-s-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx27-phytec-phycore-rdk.dts +f:arch/arm/boot/dts/nxp/imx/imx27-phytec-phycore-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx27-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx27.dtsi +f:arch/arm/boot/dts/nxp/imx/imx31-bug.dts +f:arch/arm/boot/dts/nxp/imx/imx31-lite.dts +f:arch/arm/boot/dts/nxp/imx/imx31.dtsi +f:arch/arm/boot/dts/nxp/imx/imx35-eukrea-cpuimx35.dtsi +f:arch/arm/boot/dts/nxp/imx/imx35-eukrea-mbimxsd35-baseboard.dts +f:arch/arm/boot/dts/nxp/imx/imx35-pdk.dts +f:arch/arm/boot/dts/nxp/imx/imx35-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx35.dtsi +f:arch/arm/boot/dts/nxp/imx/imx50-evk.dts +f:arch/arm/boot/dts/nxp/imx/imx50-kobo-aura.dts +f:arch/arm/boot/dts/nxp/imx/imx50-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx50.dtsi +f:arch/arm/boot/dts/nxp/imx/imx51-apf51.dts +f:arch/arm/boot/dts/nxp/imx/imx51-apf51dev.dts +f:arch/arm/boot/dts/nxp/imx/imx51-babbage.dts +f:arch/arm/boot/dts/nxp/imx/imx51-digi-connectcore-jsk.dts +f:arch/arm/boot/dts/nxp/imx/imx51-digi-connectcore-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx51-eukrea-cpuimx51.dtsi +f:arch/arm/boot/dts/nxp/imx/imx51-eukrea-mbimxsd51-baseboard.dts +f:arch/arm/boot/dts/nxp/imx/imx51-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx51-ts4800.dts +f:arch/arm/boot/dts/nxp/imx/imx51-zii-rdu1.dts +f:arch/arm/boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts +f:arch/arm/boot/dts/nxp/imx/imx51-zii-scu3-esb.dts +f:arch/arm/boot/dts/nxp/imx/imx51.dtsi +f:arch/arm/boot/dts/nxp/imx/imx53-ard.dts +f:arch/arm/boot/dts/nxp/imx/imx53-cx9020.dts +f:arch/arm/boot/dts/nxp/imx/imx53-kp-ddc.dts +f:arch/arm/boot/dts/nxp/imx/imx53-kp-hsc.dts +f:arch/arm/boot/dts/nxp/imx/imx53-kp.dtsi +f:arch/arm/boot/dts/nxp/imx/imx53-m53.dtsi +f:arch/arm/boot/dts/nxp/imx/imx53-m53evk.dts +f:arch/arm/boot/dts/nxp/imx/imx53-m53menlo.dts +f:arch/arm/boot/dts/nxp/imx/imx53-mba53.dts +f:arch/arm/boot/dts/nxp/imx/imx53-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx53-ppd.dts +f:arch/arm/boot/dts/nxp/imx/imx53-qsb-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx53-qsb-hdmi.dtso +f:arch/arm/boot/dts/nxp/imx/imx53-qsb.dts +f:arch/arm/boot/dts/nxp/imx/imx53-qsrb.dts +f:arch/arm/boot/dts/nxp/imx/imx53-sk-imx53-atm0700d4-lvds.dts +f:arch/arm/boot/dts/nxp/imx/imx53-sk-imx53-atm0700d4-rgb.dts +f:arch/arm/boot/dts/nxp/imx/imx53-sk-imx53-atm0700d4.dtsi +f:arch/arm/boot/dts/nxp/imx/imx53-sk-imx53.dts +f:arch/arm/boot/dts/nxp/imx/imx53-smd.dts +f:arch/arm/boot/dts/nxp/imx/imx53-tqma53.dtsi +f:arch/arm/boot/dts/nxp/imx/imx53-tx53-x03x.dts +f:arch/arm/boot/dts/nxp/imx/imx53-tx53-x13x.dts +f:arch/arm/boot/dts/nxp/imx/imx53-tx53.dtsi +f:arch/arm/boot/dts/nxp/imx/imx53-usbarmory.dts +f:arch/arm/boot/dts/nxp/imx/imx53-voipac-bsb.dts +f:arch/arm/boot/dts/nxp/imx/imx53-voipac-dmm-668.dtsi +f:arch/arm/boot/dts/nxp/imx/imx53.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6-logicpd-baseboard.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6-logicpd-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-alti6p.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-apf6dev.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-aristainetos2_4.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-aristainetos2_7.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-aristainetos_4.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-aristainetos_7.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-b105pv2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-b105v2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-b125pv2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-b125v2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-b155v2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-b1x5pv2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-b1x5v2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-colibri-aster.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-colibri-eval-v3.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-colibri-iris-v2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-colibri-iris.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-colibri-v1.2-aster.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-colibri-v1.2-eval-v3.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-colibri-v1.2-iris-v2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-colibri-v1.2-iris.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-cubox-i-emmc-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-cubox-i-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-cubox-i.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-dfi-fs700-m60.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-dhcom-pdk2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-dhcom-picoitx.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-eckelmann-ci4x10.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-emcon-avari.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw51xx.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw52xx.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw53xx.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw54xx.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw551x.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw552x.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw553x.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw560x.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw5903.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw5904.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw5907.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw5910.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw5912.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-gw5913.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-hummingboard-emmc-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-hummingboard-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-hummingboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-hummingboard2-emmc-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-hummingboard2-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-hummingboard2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-icore-mipi.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-icore-rqs.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-icore.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-kontron-samx6i-ads2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-kontron-samx6i.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-lanmcu.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-mamoj.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-mba6.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-mba6a.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-mba6b.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-nit6xlite.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-nitrogen6x.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-phytec-mira-rdk-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-phytec-pbab01.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-phytec-pfla02.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-pico-dwarf.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-pico-hobbit.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-pico-nymph.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-pico-pi.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx6dl-plybas.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-plym2m.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-prtmvt.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-prtrvt.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-prtvt7.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-qmx6.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-rex-basic.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-riotboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-sabreauto.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-sabrelite.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-sabresd.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-savageboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-sielaff.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-skov-revc-lt2.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-skov-revc-lt6.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-solidsense.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tqma6a.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-tqma6b.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-ts4900.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-ts7970.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6dl-comtft.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6s-8034-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6s-8034.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6s-8035-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6s-8035.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6u-801x.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6u-8033-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6u-8033.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6u-80xx-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6u-811x.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-tx6u-81xx-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-udoo.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-victgo.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-vicut1.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-wandboard-revb1.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-wandboard-revd1.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-wandboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-draco.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-hydra.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-lynx.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-orion.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-phoenix.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-ursa.dts +f:arch/arm/boot/dts/nxp/imx/imx6dl-yapp43-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6dl.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval-v1.2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-ixora-v1.1.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-ixora-v1.2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-ixora.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-v1.2-eval-v1.2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-v1.2-eval.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-v1.2-ixora-v1.1.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-v1.2-ixora-v1.2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apalis-v1.2-ixora.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-apf6dev.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-arm2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-b450v3.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-b650v3.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-b850v3.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-ba16.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-bosch-acc.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-cm-fx6.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-cubox-i-emmc-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-cubox-i-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-cubox-i.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-dfi-fs700-m60.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-dhcom-pdk2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-display5-tianma-tm070-1280x768.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-display5.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-dmo-edmqmx6.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-dms-ba16.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-ds.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-emcon-avari.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-evi.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gk802.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw51xx.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw52xx.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw53xx.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw5400-a.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw54xx.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw551x.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw552x.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw553x.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw560x.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw5903.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw5904.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw5907.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw5910.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw5912.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-gw5913.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-h100.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-hummingboard-emmc-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-hummingboard-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-hummingboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-hummingboard2-emmc-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-hummingboard2-som-v15.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-hummingboard2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-icore-mipi.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-icore-ofcap10.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-icore-ofcap12.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-icore-rqs.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-icore.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-kontron-samx6i-ads2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-kontron-samx6i.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-kp-tpc.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-kp.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-logicpd.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-lxr.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-marsboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-mba6.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-mba6a.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-mba6b.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-mccmon6.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-nitrogen6_max.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-nitrogen6_som2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-nitrogen6x.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-novena.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-phytec-mira-rdk-emmc.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-phytec-mira-rdk-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-phytec-pbab01.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-phytec-pfla02.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-pico-dwarf.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-pico-hobbit.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-pico-nymph.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-pico-pi.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx6q-pistachio.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-prti6q.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-prtwd2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-rex-pro.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-sabreauto.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-sabrelite.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-sabresd.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-savageboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-sbc6x.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-skov-revc-lt2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-skov-revc-lt6.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-skov-reve-mi1010ait-1cp1.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-solidsense.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tbs2910.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tqma6a.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-tqma6b.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6q-ts4900.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-ts7970.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-1010-comtft.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-1010.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-1020-comtft.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-1020.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-1036-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-1036.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-10x0-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-1110.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-tx6q-11x0-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-udoo.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-utilite-pro.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-var-dt6customboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-var-mx6customboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-vicut1.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-wandboard-revb1.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-wandboard-revd1.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-wandboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-yapp4-crux.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-yapp4-pegasus.dts +f:arch/arm/boot/dts/nxp/imx/imx6q-zii-rdu2.dts +f:arch/arm/boot/dts/nxp/imx/imx6q.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-apalis-v1.2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-apalis.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-apf6.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-apf6dev.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-colibri-v1.2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-colibri.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-cubox-i.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-dfi-fs700-m60.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-dhcom-drc02.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-dhcom-pdk2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-dhcom-picoitx.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-dhcom-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-ds.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-emcon-avari.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-emcon.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw51xx.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw52xx.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw53xx.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw54xx.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw551x.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw552x.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw553x.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw560x.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw5903.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw5907.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw5910.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw5912.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-gw5913.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard2-emmc.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-icore-1.5.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-icore-rqs.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-icore.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-kontron-samx6i-ads2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-kontron-samx6i.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-mba6.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-mba6a.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-mba6b.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-nit6xlite.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_max.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_som2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6x.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira-peb-av-02.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira-peb-eval-01.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira-peb-wlbt-05.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-pbab01.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-pfla02.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-phycore-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-pico-dwarf.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-pico-hobbit.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-pico-nymph.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-pico-pi.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-pico.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-prti6q.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-rex.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-sabreauto.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-sabrelite.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-sabresd.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-savageboard.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-skov-cpu-revc.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-skov-cpu.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-skov-revc-lt2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-solidsense.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-sr-som-brcm.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-sr-som-emmc.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-sr-som-ti.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-sr-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-tqma6.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-tqma6a.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-tqma6b.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-ts4900.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-ts7970.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-tx6-lcd.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-tx6-lvds.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-tx6-mb7.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-tx6.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-udoo.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-var-dart.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-vicut1-12inch.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-vicut1.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard-revb1.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard-revc1.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard-revd1.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qdl.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qp-mba6b.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-nitrogen6_max.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-nitrogen6_som2.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-phytec-mira-rdk-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-prtwd3.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-sabreauto.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-sabresd.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-tqma6b.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6qp-tx6qp-8037-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-tx6qp-8037.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-tx6qp-8137-mb7.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-tx6qp-8137.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-vicutp.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-wandboard-revd1.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-yapp4-crux-plus.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-yapp4-pegasus-plus.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp-zii-rdu2.dts +f:arch/arm/boot/dts/nxp/imx/imx6qp.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6s-dhcom-drc02.dts +f:arch/arm/boot/dts/nxp/imx/imx6sl-evk.dts +f:arch/arm/boot/dts/nxp/imx/imx6sl-kobo-aura2.dts +f:arch/arm/boot/dts/nxp/imx/imx6sl-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx6sl-tolino-shine2hd.dts +f:arch/arm/boot/dts/nxp/imx/imx6sl-tolino-shine3.dts +f:arch/arm/boot/dts/nxp/imx/imx6sl-tolino-vision.dts +f:arch/arm/boot/dts/nxp/imx/imx6sl-tolino-vision5.dts +f:arch/arm/boot/dts/nxp/imx/imx6sl-warp.dts +f:arch/arm/boot/dts/nxp/imx/imx6sl.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6sll-evk.dts +f:arch/arm/boot/dts/nxp/imx/imx6sll-kobo-clara2e-a.dts +f:arch/arm/boot/dts/nxp/imx/imx6sll-kobo-clara2e-b.dts +f:arch/arm/boot/dts/nxp/imx/imx6sll-kobo-clara2e-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6sll-kobo-clarahd.dts +f:arch/arm/boot/dts/nxp/imx/imx6sll-kobo-librah2o.dts +f:arch/arm/boot/dts/nxp/imx/imx6sll-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx6sll.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6sx-nitrogen6sx.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx6sx-sabreauto.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-sdb-mqs.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-sdb-reva.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-sdb-sai.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6sx-softing-vining-2000.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-udoo-neo-basic.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-udoo-neo-extended.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-udoo-neo-full.dts +f:arch/arm/boot/dts/nxp/imx/imx6sx-udoo-neo.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6sx.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-ccimx6ulsbcexpress.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-ccimx6ulsbcpro.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-ccimx6ulsom.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-geam.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-imx6ull-opos6ul.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-imx6ull-opos6uldev.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-isiot-emmc.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-isiot-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-isiot.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-kontron-bl-43.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-kontron-bl-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-kontron-bl.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-kontron-sl-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-kontron-sl.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-liteboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-litesom.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-opos6ul.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-opos6uldev.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-phytec-phycore-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-ff-rdk-emmc.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-ff-rdk-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-av-02.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-eval-01.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-wlbt-05.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-pico-dwarf.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-pico-hobbit.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-pico-pi.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx6ul-prti6g.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ul-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ul1-mba6ulx.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ul1.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ul2-mba6ulx.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ul2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ul2l-mba6ulx.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ul2l.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ulx-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-tqma6ulxl-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul-0010.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul-0011.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul-mainboard.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul-var-som-concerto.dts +f:arch/arm/boot/dts/nxp/imx/imx6ul-var-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ul.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-14x14-evk.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-aster.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-aster.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-emmc-aster.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-emmc-eval-v3.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-emmc-iris-v2.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-emmc-iris.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-emmc-nonwifi.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-eval-v3.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-eval-v3.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris-v2.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris-v2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-nonwifi.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-wifi-aster.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-wifi-eval-v3.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-wifi-iris-v2.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-wifi-iris.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri-wifi.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-colibri.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-drc02.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-pdk2.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-picoitx.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-som-cfg-sdcard.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-dhcor-maveo-box.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-dhcor-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-engicam-microgea-bmm.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-engicam-microgea-gtw.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-engicam-microgea-rmm.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-engicam-microgea.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-jozacp.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-kontron-bl.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-kontron-sl.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-myir-mys-6ulx-eval.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-myir-mys-6ulx.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-opos6ul.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-opos6uldev.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-phycore-som.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-segin-ff-rdk-emmc.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-segin-ff-rdk-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-segin-lc-rdk-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-segin-peb-av-02.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-segin-peb-eval-01.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-segin-peb-wlbt-05.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-segin.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-tauri-emmc.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-tauri-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-phytec-tauri.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-pinfunc-snvs.h +f:arch/arm/boot/dts/nxp/imx/imx6ull-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx6ull-seeed-npi-dev-board-emmc.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-seeed-npi-dev-board-nand.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-seeed-npi-dev-board.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-seeed-npi.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-common.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-master.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-micro.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-slave.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-slavext.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-tqma6ull2-mba6ulx.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-tqma6ull2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-tqma6ull2l-mba6ulx.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull-tqma6ull2l.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ull-uti260b.dts +f:arch/arm/boot/dts/nxp/imx/imx6ull.dtsi +f:arch/arm/boot/dts/nxp/imx/imx6ulz-14x14-evk.dts +f:arch/arm/boot/dts/nxp/imx/imx6ulz-bsh-smm-m2.dts +f:arch/arm/boot/dts/nxp/imx/imx6ulz.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7-colibri-aster.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7-colibri-eval-v3.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7-colibri-iris-v2.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7-colibri-iris.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7-colibri.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7-mba7.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7-tqma7.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7d-cl-som-imx7.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-aster.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-emmc-aster.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-emmc-eval-v3.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-emmc-iris-v2.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-emmc-iris.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-emmc.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-eval-v3.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-iris-v2.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri-iris.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-colibri.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7d-flex-concentrator-mfg.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-flex-concentrator.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-mba7.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-meerkat96.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-nitrogen7.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-pico-dwarf.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-pico-hobbit.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-pico-nymph.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-pico-pi.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-pico.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7d-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx7d-remarkable2.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-sbc-imx7.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-sdb-reva.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-sdb-sht11.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-sdb.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-smegw01.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-tqma7.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7d-zii-rmu2.dts +f:arch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts +f:arch/arm/boot/dts/nxp/imx/imx7d.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7s-colibri-aster.dts +f:arch/arm/boot/dts/nxp/imx/imx7s-colibri-eval-v3.dts +f:arch/arm/boot/dts/nxp/imx/imx7s-colibri-iris-v2.dts +f:arch/arm/boot/dts/nxp/imx/imx7s-colibri-iris.dts +f:arch/arm/boot/dts/nxp/imx/imx7s-colibri.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7s-mba7.dts +f:arch/arm/boot/dts/nxp/imx/imx7s-tqma7.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7s-warp.dts +f:arch/arm/boot/dts/nxp/imx/imx7s.dtsi +f:arch/arm/boot/dts/nxp/imx/imx7ulp-com.dts +f:arch/arm/boot/dts/nxp/imx/imx7ulp-evk.dts +f:arch/arm/boot/dts/nxp/imx/imx7ulp-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imx7ulp.dtsi +f:arch/arm/boot/dts/nxp/imx/imxrt1050-evk.dts +f:arch/arm/boot/dts/nxp/imx/imxrt1050-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/imxrt1050.dtsi +f:arch/arm/boot/dts/nxp/imx/imxrt1170-pinfunc.h +f:arch/arm/boot/dts/nxp/imx/mba6ulx.dtsi +f:arch/arm/boot/dts/nxp/lpc/Makefile +f:arch/arm/boot/dts/nxp/lpc/lpc18xx.dtsi +f:arch/arm/boot/dts/nxp/lpc/lpc3250-ea3250.dts +f:arch/arm/boot/dts/nxp/lpc/lpc3250-phy3250.dts +f:arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi +f:arch/arm/boot/dts/nxp/lpc/lpc4337-ciaa.dts +f:arch/arm/boot/dts/nxp/lpc/lpc4350-hitex-eval.dts +f:arch/arm/boot/dts/nxp/lpc/lpc4350.dtsi +f:arch/arm/boot/dts/nxp/lpc/lpc4357-ea4357-devkit.dts +f:arch/arm/boot/dts/nxp/lpc/lpc4357-myd-lpc4357.dts +f:arch/arm/boot/dts/nxp/lpc/lpc4357.dtsi +f:arch/arm/boot/dts/nxp/ls/Makefile +f:arch/arm/boot/dts/nxp/ls/ls1021a-iot.dts +f:arch/arm/boot/dts/nxp/ls/ls1021a-moxa-uc-8410a.dts +f:arch/arm/boot/dts/nxp/ls/ls1021a-qds.dts +f:arch/arm/boot/dts/nxp/ls/ls1021a-tqmls1021a-mbls1021a-hdmi.dtso +f:arch/arm/boot/dts/nxp/ls/ls1021a-tqmls1021a-mbls1021a-lvds-tm070jvhg33.dtso +f:arch/arm/boot/dts/nxp/ls/ls1021a-tqmls1021a-mbls1021a-rgb-cdtech-dc44.dtso +f:arch/arm/boot/dts/nxp/ls/ls1021a-tqmls1021a-mbls1021a-rgb-cdtech-fc21.dtso +f:arch/arm/boot/dts/nxp/ls/ls1021a-tqmls1021a-mbls1021a.dts +f:arch/arm/boot/dts/nxp/ls/ls1021a-tqmls1021a.dtsi +f:arch/arm/boot/dts/nxp/ls/ls1021a-tsn.dts +f:arch/arm/boot/dts/nxp/ls/ls1021a-twr.dts +f:arch/arm/boot/dts/nxp/ls/ls1021a.dtsi +f:arch/arm/boot/dts/nxp/mxs/Makefile +f:arch/arm/boot/dts/nxp/mxs/imx23-evk.dts +f:arch/arm/boot/dts/nxp/mxs/imx23-olinuxino.dts +f:arch/arm/boot/dts/nxp/mxs/imx23-pinfunc.h +f:arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts +f:arch/arm/boot/dts/nxp/mxs/imx23-stmp378x_devb.dts +f:arch/arm/boot/dts/nxp/mxs/imx23-xfi3.dts +f:arch/arm/boot/dts/nxp/mxs/imx23.dtsi +f:arch/arm/boot/dts/nxp/mxs/imx28-amarula-rmm.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-apf28.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-apf28dev.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-apx4devkit.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-btt3-0.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-btt3-1.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-btt3-2.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-btt3.dtsi +f:arch/arm/boot/dts/nxp/mxs/imx28-cfa10036.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-cfa10037.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-cfa10049.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-cfa10055.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-cfa10056.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-cfa10057.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-cfa10058.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-duckbill-2-485.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-duckbill-2-enocean.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-duckbill-2-spi.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-duckbill-2.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-duckbill.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-eukrea-mbmx283lc.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-eukrea-mbmx287lc.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-eukrea-mbmx28lc.dtsi +f:arch/arm/boot/dts/nxp/mxs/imx28-evk.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-lwe.dtsi +f:arch/arm/boot/dts/nxp/mxs/imx28-m28.dtsi +f:arch/arm/boot/dts/nxp/mxs/imx28-m28cu3.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-m28evk.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-pinfunc.h +f:arch/arm/boot/dts/nxp/mxs/imx28-sps1.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-ts4600.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-tx28.dts +f:arch/arm/boot/dts/nxp/mxs/imx28-xea.dts +f:arch/arm/boot/dts/nxp/mxs/imx28.dtsi +f:arch/arm/boot/dts/nxp/mxs/mxs-pinfunc.h +f:arch/arm/boot/dts/nxp/vf/Makefile +f:arch/arm/boot/dts/nxp/vf/vf-colibri-eval-v3.dtsi +f:arch/arm/boot/dts/nxp/vf/vf-colibri.dtsi +f:arch/arm/boot/dts/nxp/vf/vf500-colibri-eval-v3.dts +f:arch/arm/boot/dts/nxp/vf/vf500-colibri.dtsi +f:arch/arm/boot/dts/nxp/vf/vf500.dtsi +f:arch/arm/boot/dts/nxp/vf/vf610-bk4.dts +f:arch/arm/boot/dts/nxp/vf/vf610-colibri-eval-v3.dts +f:arch/arm/boot/dts/nxp/vf/vf610-colibri.dtsi +f:arch/arm/boot/dts/nxp/vf/vf610-cosmic.dts +f:arch/arm/boot/dts/nxp/vf/vf610-pinfunc.h +f:arch/arm/boot/dts/nxp/vf/vf610-twr.dts +f:arch/arm/boot/dts/nxp/vf/vf610-zii-cfu1.dts +f:arch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts +f:arch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-c.dts +f:arch/arm/boot/dts/nxp/vf/vf610-zii-dev.dtsi +f:arch/arm/boot/dts/nxp/vf/vf610-zii-scu4-aib.dts +f:arch/arm/boot/dts/nxp/vf/vf610-zii-spb4.dts +f:arch/arm/boot/dts/nxp/vf/vf610-zii-ssmb-dtu.dts +f:arch/arm/boot/dts/nxp/vf/vf610-zii-ssmb-spu3.dts +f:arch/arm/boot/dts/nxp/vf/vf610.dtsi +f:arch/arm/boot/dts/nxp/vf/vf610m4-colibri.dts +f:arch/arm/boot/dts/nxp/vf/vf610m4-cosmic.dts +f:arch/arm/boot/dts/nxp/vf/vf610m4.dtsi +f:arch/arm/boot/dts/nxp/vf/vfxxx.dtsi +f:arch/arm/boot/dts/qcom/Makefile +f:arch/arm/boot/dts/qcom/msm8226-motorola-falcon.dts +f:arch/arm/boot/dts/qcom/msm8926.dtsi +f:arch/arm/boot/dts/qcom/pm8018.dtsi +f:arch/arm/boot/dts/qcom/pm8058.dtsi +f:arch/arm/boot/dts/qcom/pm8226.dtsi +f:arch/arm/boot/dts/qcom/pm8821.dtsi +f:arch/arm/boot/dts/qcom/pm8841.dtsi +f:arch/arm/boot/dts/qcom/pm8921.dtsi +f:arch/arm/boot/dts/qcom/pm8941.dtsi +f:arch/arm/boot/dts/qcom/pma8084.dtsi +f:arch/arm/boot/dts/qcom/pmx55.dtsi +f:arch/arm/boot/dts/qcom/pmx65.dtsi +f:arch/arm/boot/dts/qcom/qcom-apq8016-sbc.dts +f:arch/arm/boot/dts/qcom/qcom-apq8026-asus-sparrow.dts +f:arch/arm/boot/dts/qcom/qcom-apq8026-huawei-sturgeon.dts +f:arch/arm/boot/dts/qcom/qcom-apq8026-lg-lenok.dts +f:arch/arm/boot/dts/qcom/qcom-apq8026-samsung-matisse-wifi.dts +f:arch/arm/boot/dts/qcom/qcom-apq8026-samsung-milletwifi.dts +f:arch/arm/boot/dts/qcom/qcom-apq8060-dragonboard.dts +f:arch/arm/boot/dts/qcom/qcom-apq8064-asus-nexus7-flo.dts +f:arch/arm/boot/dts/qcom/qcom-apq8064-cm-qs600.dts +f:arch/arm/boot/dts/qcom/qcom-apq8064-ifc6410.dts +f:arch/arm/boot/dts/qcom/qcom-apq8064-lg-nexus4-mako.dts +f:arch/arm/boot/dts/qcom/qcom-apq8064-pins.dtsi +f:arch/arm/boot/dts/qcom/qcom-apq8064-sony-xperia-lagan-yuga.dts +f:arch/arm/boot/dts/qcom/qcom-apq8064-v2.0.dtsi +f:arch/arm/boot/dts/qcom/qcom-apq8064.dtsi +f:arch/arm/boot/dts/qcom/qcom-apq8074-dragonboard.dts +f:arch/arm/boot/dts/qcom/qcom-apq8084-ifc6540.dts +f:arch/arm/boot/dts/qcom/qcom-apq8084-mtp.dts +f:arch/arm/boot/dts/qcom/qcom-apq8084.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq4018-ap120c-ac-bit.dts +f:arch/arm/boot/dts/qcom/qcom-ipq4018-ap120c-ac.dts +f:arch/arm/boot/dts/qcom/qcom-ipq4018-ap120c-ac.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq4018-jalapeno.dts +f:arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk01.1-c1.dts +f:arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk01.1.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk04.1-c1.dts +f:arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk04.1-c3.dts +f:arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk04.1.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk07.1-c1.dts +f:arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk07.1-c2.dts +f:arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk07.1.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8062-smb208.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8062.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8064-ap148.dts +f:arch/arm/boot/dts/qcom/qcom-ipq8064-rb3011.dts +f:arch/arm/boot/dts/qcom/qcom-ipq8064-smb208.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8064-v1.0.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8064-v2.0-smb208.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8064-v2.0.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8064.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8065-smb208.dtsi +f:arch/arm/boot/dts/qcom/qcom-ipq8065.dtsi +f:arch/arm/boot/dts/qcom/qcom-mdm9615-wp8548-mangoh-green.dts +f:arch/arm/boot/dts/qcom/qcom-mdm9615-wp8548.dtsi +f:arch/arm/boot/dts/qcom/qcom-mdm9615.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8226-microsoft-common.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8226-microsoft-dempsey.dts +f:arch/arm/boot/dts/qcom/qcom-msm8226-microsoft-makepeace.dts +f:arch/arm/boot/dts/qcom/qcom-msm8226-microsoft-moneypenny.dts +f:arch/arm/boot/dts/qcom/qcom-msm8226-samsung-matisse-common.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8226-samsung-ms013g.dts +f:arch/arm/boot/dts/qcom/qcom-msm8226-samsung-s3ve3g.dts +f:arch/arm/boot/dts/qcom/qcom-msm8226.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8660-surf.dts +f:arch/arm/boot/dts/qcom/qcom-msm8660.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8916-samsung-e5.dts +f:arch/arm/boot/dts/qcom/qcom-msm8916-samsung-e7.dts +f:arch/arm/boot/dts/qcom/qcom-msm8916-samsung-grandmax.dts +f:arch/arm/boot/dts/qcom/qcom-msm8916-samsung-serranove.dts +f:arch/arm/boot/dts/qcom/qcom-msm8916-smp.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8926-htc-memul.dts +f:arch/arm/boot/dts/qcom/qcom-msm8926-microsoft-superman-lte.dts +f:arch/arm/boot/dts/qcom/qcom-msm8926-microsoft-tesla.dts +f:arch/arm/boot/dts/qcom/qcom-msm8926-motorola-peregrine.dts +f:arch/arm/boot/dts/qcom/qcom-msm8926-samsung-matisselte.dts +f:arch/arm/boot/dts/qcom/qcom-msm8960-cdp.dts +f:arch/arm/boot/dts/qcom/qcom-msm8960-pins.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8960-samsung-expressatt.dts +f:arch/arm/boot/dts/qcom/qcom-msm8960.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8974-lge-nexus5-hammerhead.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974-samsung-hlte.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974-sony-xperia-rhine-amami.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974-sony-xperia-rhine-honami.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974-sony-xperia-rhine-togari.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974-sony-xperia-rhine.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8974.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-fairphone-fp2.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-htc-m8.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-oneplus-bacon.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-samsung-klte-common.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-samsung-klte.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-samsung-kltechn.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-aries.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-castor.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-common.dtsi +f:arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-leo.dts +f:arch/arm/boot/dts/qcom/qcom-msm8974pro.dtsi +f:arch/arm/boot/dts/qcom/qcom-sdx55-mtp.dts +f:arch/arm/boot/dts/qcom/qcom-sdx55-t55.dts +f:arch/arm/boot/dts/qcom/qcom-sdx55-telit-fn980-tlb.dts +f:arch/arm/boot/dts/qcom/qcom-sdx55.dtsi +f:arch/arm/boot/dts/qcom/qcom-sdx65-mtp.dts +f:arch/arm/boot/dts/qcom/qcom-sdx65.dtsi +f:arch/arm/boot/dts/realtek/Makefile +f:arch/arm/boot/dts/realtek/rtd1195-horseradish.dts +f:arch/arm/boot/dts/realtek/rtd1195-mele-x1000.dts +f:arch/arm/boot/dts/realtek/rtd1195.dtsi +f:arch/arm/boot/dts/renesas/Makefile +f:arch/arm/boot/dts/renesas/emev2-kzm9d.dts +f:arch/arm/boot/dts/renesas/emev2.dtsi +f:arch/arm/boot/dts/renesas/gr-peach-audiocamerashield.dtsi +f:arch/arm/boot/dts/renesas/iwg20d-q7-common.dtsi +f:arch/arm/boot/dts/renesas/iwg20d-q7-dbcm-ca.dtsi +f:arch/arm/boot/dts/renesas/r7s72100-genmai.dts +f:arch/arm/boot/dts/renesas/r7s72100-gr-peach.dts +f:arch/arm/boot/dts/renesas/r7s72100-rskrza1.dts +f:arch/arm/boot/dts/renesas/r7s72100.dtsi +f:arch/arm/boot/dts/renesas/r7s9210-rza2mevb.dts +f:arch/arm/boot/dts/renesas/r7s9210.dtsi +f:arch/arm/boot/dts/renesas/r8a73a4-ape6evm.dts +f:arch/arm/boot/dts/renesas/r8a73a4.dtsi +f:arch/arm/boot/dts/renesas/r8a7740-armadillo800eva.dts +f:arch/arm/boot/dts/renesas/r8a7740.dtsi +f:arch/arm/boot/dts/renesas/r8a7742-iwg21d-q7-dbcm-ca.dts +f:arch/arm/boot/dts/renesas/r8a7742-iwg21d-q7-dbcm-ov5640-single.dtsi +f:arch/arm/boot/dts/renesas/r8a7742-iwg21d-q7-dbcm-ov7725-single.dtsi +f:arch/arm/boot/dts/renesas/r8a7742-iwg21d-q7.dts +f:arch/arm/boot/dts/renesas/r8a7742-iwg21m.dtsi +f:arch/arm/boot/dts/renesas/r8a7742.dtsi +f:arch/arm/boot/dts/renesas/r8a7743-iwg20d-q7-dbcm-ca.dts +f:arch/arm/boot/dts/renesas/r8a7743-iwg20d-q7.dts +f:arch/arm/boot/dts/renesas/r8a7743-iwg20m.dtsi +f:arch/arm/boot/dts/renesas/r8a7743-sk-rzg1m.dts +f:arch/arm/boot/dts/renesas/r8a7743.dtsi +f:arch/arm/boot/dts/renesas/r8a7744-iwg20d-q7-dbcm-ca.dts +f:arch/arm/boot/dts/renesas/r8a7744-iwg20d-q7.dts +f:arch/arm/boot/dts/renesas/r8a7744-iwg20m.dtsi +f:arch/arm/boot/dts/renesas/r8a7744.dtsi +f:arch/arm/boot/dts/renesas/r8a7745-iwg22d-sodimm-dbhd-ca.dts +f:arch/arm/boot/dts/renesas/r8a7745-iwg22d-sodimm.dts +f:arch/arm/boot/dts/renesas/r8a7745-iwg22m.dtsi +f:arch/arm/boot/dts/renesas/r8a7745-sk-rzg1e.dts +f:arch/arm/boot/dts/renesas/r8a7745.dtsi +f:arch/arm/boot/dts/renesas/r8a77470-iwg23s-sbc.dts +f:arch/arm/boot/dts/renesas/r8a77470.dtsi +f:arch/arm/boot/dts/renesas/r8a7778-bockw.dts +f:arch/arm/boot/dts/renesas/r8a7778.dtsi +f:arch/arm/boot/dts/renesas/r8a7779-marzen.dts +f:arch/arm/boot/dts/renesas/r8a7779.dtsi +f:arch/arm/boot/dts/renesas/r8a7790-lager.dts +f:arch/arm/boot/dts/renesas/r8a7790-stout.dts +f:arch/arm/boot/dts/renesas/r8a7790.dtsi +f:arch/arm/boot/dts/renesas/r8a7791-koelsch.dts +f:arch/arm/boot/dts/renesas/r8a7791-porter.dts +f:arch/arm/boot/dts/renesas/r8a7791.dtsi +f:arch/arm/boot/dts/renesas/r8a7792-blanche.dts +f:arch/arm/boot/dts/renesas/r8a7792-wheat.dts +f:arch/arm/boot/dts/renesas/r8a7792.dtsi +f:arch/arm/boot/dts/renesas/r8a7793-gose.dts +f:arch/arm/boot/dts/renesas/r8a7793.dtsi +f:arch/arm/boot/dts/renesas/r8a7794-alt.dts +f:arch/arm/boot/dts/renesas/r8a7794-silk.dts +f:arch/arm/boot/dts/renesas/r8a7794.dtsi +f:arch/arm/boot/dts/renesas/r8a77xx-aa121td01-panel.dtsi +f:arch/arm/boot/dts/renesas/r9a06g032-rzn1d400-db.dts +f:arch/arm/boot/dts/renesas/r9a06g032-rzn1d400-eb.dts +f:arch/arm/boot/dts/renesas/r9a06g032.dtsi +f:arch/arm/boot/dts/renesas/sh73a0-kzm9g.dts +f:arch/arm/boot/dts/renesas/sh73a0.dtsi +f:arch/arm/boot/dts/rockchip/Makefile +f:arch/arm/boot/dts/rockchip/rk3036-evb.dts +f:arch/arm/boot/dts/rockchip/rk3036-kylin.dts +f:arch/arm/boot/dts/rockchip/rk3036.dtsi +f:arch/arm/boot/dts/rockchip/rk3066a-bqcurie2.dts +f:arch/arm/boot/dts/rockchip/rk3066a-marsboard.dts +f:arch/arm/boot/dts/rockchip/rk3066a-mk808.dts +f:arch/arm/boot/dts/rockchip/rk3066a-rayeager.dts +f:arch/arm/boot/dts/rockchip/rk3066a.dtsi +f:arch/arm/boot/dts/rockchip/rk3128-evb.dts +f:arch/arm/boot/dts/rockchip/rk3128-xpi-3128.dts +f:arch/arm/boot/dts/rockchip/rk3128.dtsi +f:arch/arm/boot/dts/rockchip/rk3188-bqedison2qc.dts +f:arch/arm/boot/dts/rockchip/rk3188-px3-evb.dts +f:arch/arm/boot/dts/rockchip/rk3188-radxarock.dts +f:arch/arm/boot/dts/rockchip/rk3188.dtsi +f:arch/arm/boot/dts/rockchip/rk3228-evb.dts +f:arch/arm/boot/dts/rockchip/rk3229-evb.dts +f:arch/arm/boot/dts/rockchip/rk3229-xms6.dts +f:arch/arm/boot/dts/rockchip/rk3229.dtsi +f:arch/arm/boot/dts/rockchip/rk322x.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-evb-act8846.dts +f:arch/arm/boot/dts/rockchip/rk3288-evb-rk808.dts +f:arch/arm/boot/dts/rockchip/rk3288-evb.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-firefly-beta.dts +f:arch/arm/boot/dts/rockchip/rk3288-firefly-reload-core.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-firefly-reload.dts +f:arch/arm/boot/dts/rockchip/rk3288-firefly.dts +f:arch/arm/boot/dts/rockchip/rk3288-firefly.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-miqi.dts +f:arch/arm/boot/dts/rockchip/rk3288-phycore-rdk.dts +f:arch/arm/boot/dts/rockchip/rk3288-phycore-som.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-popmetal.dts +f:arch/arm/boot/dts/rockchip/rk3288-r89.dts +f:arch/arm/boot/dts/rockchip/rk3288-rock-pi-n8.dts +f:arch/arm/boot/dts/rockchip/rk3288-rock2-som.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-rock2-square.dts +f:arch/arm/boot/dts/rockchip/rk3288-tinker-s.dts +f:arch/arm/boot/dts/rockchip/rk3288-tinker.dts +f:arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-veyron-analog-audio.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-veyron-brain.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-broadcom-bluetooth.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-veyron-chromebook.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-veyron-edp.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-veyron-fievel.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-jaq.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-jerry.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-mickey.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-mighty.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-minnie.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-pinky.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-sdmmc.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-veyron-speedy.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron-tiger.dts +f:arch/arm/boot/dts/rockchip/rk3288-veyron.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-vmarc-som.dtsi +f:arch/arm/boot/dts/rockchip/rk3288-vyasa.dts +f:arch/arm/boot/dts/rockchip/rk3288.dtsi +f:arch/arm/boot/dts/rockchip/rk3xxx.dtsi +f:arch/arm/boot/dts/rockchip/rockchip-radxa-dalang-carrier.dtsi +f:arch/arm/boot/dts/rockchip/rv1108-elgin-r1.dts +f:arch/arm/boot/dts/rockchip/rv1108-evb.dts +f:arch/arm/boot/dts/rockchip/rv1108.dtsi +f:arch/arm/boot/dts/rockchip/rv1109-relfor-saib.dts +f:arch/arm/boot/dts/rockchip/rv1109-sonoff-ihost.dts +f:arch/arm/boot/dts/rockchip/rv1109.dtsi +f:arch/arm/boot/dts/rockchip/rv1126-edgeble-neu2-io.dts +f:arch/arm/boot/dts/rockchip/rv1126-edgeble-neu2.dtsi +f:arch/arm/boot/dts/rockchip/rv1126-pinctrl.dtsi +f:arch/arm/boot/dts/rockchip/rv1126-sonoff-ihost.dts +f:arch/arm/boot/dts/rockchip/rv1126-sonoff-ihost.dtsi +f:arch/arm/boot/dts/rockchip/rv1126.dtsi +f:arch/arm/boot/dts/samsung/Makefile +f:arch/arm/boot/dts/samsung/exynos-mfc-reserved-memory.dtsi +f:arch/arm/boot/dts/samsung/exynos-pinctrl.h +f:arch/arm/boot/dts/samsung/exynos-syscon-restart.dtsi +f:arch/arm/boot/dts/samsung/exynos3250-artik5-eval.dts +f:arch/arm/boot/dts/samsung/exynos3250-artik5.dtsi +f:arch/arm/boot/dts/samsung/exynos3250-monk.dts +f:arch/arm/boot/dts/samsung/exynos3250-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/exynos3250-rinato.dts +f:arch/arm/boot/dts/samsung/exynos3250.dtsi +f:arch/arm/boot/dts/samsung/exynos4-cpu-thermal.dtsi +f:arch/arm/boot/dts/samsung/exynos4.dtsi +f:arch/arm/boot/dts/samsung/exynos4210-i9100.dts +f:arch/arm/boot/dts/samsung/exynos4210-origen.dts +f:arch/arm/boot/dts/samsung/exynos4210-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/exynos4210-smdkv310.dts +f:arch/arm/boot/dts/samsung/exynos4210-trats.dts +f:arch/arm/boot/dts/samsung/exynos4210-universal_c210.dts +f:arch/arm/boot/dts/samsung/exynos4210.dtsi +f:arch/arm/boot/dts/samsung/exynos4212-tab3-3g8.dts +f:arch/arm/boot/dts/samsung/exynos4212-tab3-lte8.dts +f:arch/arm/boot/dts/samsung/exynos4212-tab3-wifi8.dts +f:arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi +f:arch/arm/boot/dts/samsung/exynos4212.dtsi +f:arch/arm/boot/dts/samsung/exynos4412-galaxy-s3.dtsi +f:arch/arm/boot/dts/samsung/exynos4412-i9300.dts +f:arch/arm/boot/dts/samsung/exynos4412-i9305.dts +f:arch/arm/boot/dts/samsung/exynos4412-itop-elite.dts +f:arch/arm/boot/dts/samsung/exynos4412-itop-scp-core.dtsi +f:arch/arm/boot/dts/samsung/exynos4412-midas.dtsi +f:arch/arm/boot/dts/samsung/exynos4412-n710x.dts +f:arch/arm/boot/dts/samsung/exynos4412-odroid-common.dtsi +f:arch/arm/boot/dts/samsung/exynos4412-odroidu3.dts +f:arch/arm/boot/dts/samsung/exynos4412-odroidx.dts +f:arch/arm/boot/dts/samsung/exynos4412-odroidx2.dts +f:arch/arm/boot/dts/samsung/exynos4412-origen.dts +f:arch/arm/boot/dts/samsung/exynos4412-p4note-n8010.dts +f:arch/arm/boot/dts/samsung/exynos4412-p4note.dtsi +f:arch/arm/boot/dts/samsung/exynos4412-ppmu-common.dtsi +f:arch/arm/boot/dts/samsung/exynos4412-prime.dtsi +f:arch/arm/boot/dts/samsung/exynos4412-smdk4412.dts +f:arch/arm/boot/dts/samsung/exynos4412-tiny4412.dts +f:arch/arm/boot/dts/samsung/exynos4412-trats2.dts +f:arch/arm/boot/dts/samsung/exynos4412.dtsi +f:arch/arm/boot/dts/samsung/exynos4x12-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/exynos4x12.dtsi +f:arch/arm/boot/dts/samsung/exynos5.dtsi +f:arch/arm/boot/dts/samsung/exynos5250-arndale.dts +f:arch/arm/boot/dts/samsung/exynos5250-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/exynos5250-smdk5250.dts +f:arch/arm/boot/dts/samsung/exynos5250-snow-common.dtsi +f:arch/arm/boot/dts/samsung/exynos5250-snow-rev5.dts +f:arch/arm/boot/dts/samsung/exynos5250-snow.dts +f:arch/arm/boot/dts/samsung/exynos5250-spring.dts +f:arch/arm/boot/dts/samsung/exynos5250.dtsi +f:arch/arm/boot/dts/samsung/exynos5260-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/exynos5260-xyref5260.dts +f:arch/arm/boot/dts/samsung/exynos5260.dtsi +f:arch/arm/boot/dts/samsung/exynos5410-odroidxu.dts +f:arch/arm/boot/dts/samsung/exynos5410-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/exynos5410-smdk5410.dts +f:arch/arm/boot/dts/samsung/exynos5410.dtsi +f:arch/arm/boot/dts/samsung/exynos5420-arndale-octa.dts +f:arch/arm/boot/dts/samsung/exynos5420-chagall-wifi.dts +f:arch/arm/boot/dts/samsung/exynos5420-cpus.dtsi +f:arch/arm/boot/dts/samsung/exynos5420-galaxy-tab-common.dtsi +f:arch/arm/boot/dts/samsung/exynos5420-klimt-wifi.dts +f:arch/arm/boot/dts/samsung/exynos5420-peach-pit.dts +f:arch/arm/boot/dts/samsung/exynos5420-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/exynos5420-smdk5420.dts +f:arch/arm/boot/dts/samsung/exynos5420-trip-points.dtsi +f:arch/arm/boot/dts/samsung/exynos5420.dtsi +f:arch/arm/boot/dts/samsung/exynos5422-cpus.dtsi +f:arch/arm/boot/dts/samsung/exynos5422-odroid-core.dtsi +f:arch/arm/boot/dts/samsung/exynos5422-odroidhc1.dts +f:arch/arm/boot/dts/samsung/exynos5422-odroidxu3-audio.dtsi +f:arch/arm/boot/dts/samsung/exynos5422-odroidxu3-common.dtsi +f:arch/arm/boot/dts/samsung/exynos5422-odroidxu3-lite.dts +f:arch/arm/boot/dts/samsung/exynos5422-odroidxu3.dts +f:arch/arm/boot/dts/samsung/exynos5422-odroidxu4.dts +f:arch/arm/boot/dts/samsung/exynos5422-samsung-k3g.dts +f:arch/arm/boot/dts/samsung/exynos54xx-odroidxu-leds.dtsi +f:arch/arm/boot/dts/samsung/exynos54xx.dtsi +f:arch/arm/boot/dts/samsung/exynos5800-peach-pi.dts +f:arch/arm/boot/dts/samsung/exynos5800.dtsi +f:arch/arm/boot/dts/samsung/s3c6400.dtsi +f:arch/arm/boot/dts/samsung/s3c6410-mini6410.dts +f:arch/arm/boot/dts/samsung/s3c6410-smdk6410.dts +f:arch/arm/boot/dts/samsung/s3c6410.dtsi +f:arch/arm/boot/dts/samsung/s3c64xx-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/s3c64xx-pinctrl.h +f:arch/arm/boot/dts/samsung/s3c64xx.dtsi +f:arch/arm/boot/dts/samsung/s5pv210-aquila.dts +f:arch/arm/boot/dts/samsung/s5pv210-aries.dtsi +f:arch/arm/boot/dts/samsung/s5pv210-fascinate4g.dts +f:arch/arm/boot/dts/samsung/s5pv210-galaxys.dts +f:arch/arm/boot/dts/samsung/s5pv210-goni.dts +f:arch/arm/boot/dts/samsung/s5pv210-pinctrl.dtsi +f:arch/arm/boot/dts/samsung/s5pv210-pinctrl.h +f:arch/arm/boot/dts/samsung/s5pv210-smdkc110.dts +f:arch/arm/boot/dts/samsung/s5pv210-smdkv210.dts +f:arch/arm/boot/dts/samsung/s5pv210-torbreck.dts +f:arch/arm/boot/dts/samsung/s5pv210.dtsi +f:arch/arm/boot/dts/sigmastar/Makefile +f:arch/arm/boot/dts/sigmastar/mstar-infinity-breadbee-common.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity-msc313-breadbee_crust.dts +f:arch/arm/boot/dts/sigmastar/mstar-infinity-msc313.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd201-som2d01.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d-100ask-dongshanpione.dts +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d-miyoo-mini.dts +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d-ssd201htv2.dts +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d-unitv2.dts +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d-wirelesstag-ido-sbc2d06-v1b-22w.dts +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d-wirelesstag-ido-som2d01.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd20xd.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity2m.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity3-msc313e-breadbee.dts +f:arch/arm/boot/dts/sigmastar/mstar-infinity3-msc313e.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-infinity3.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-mercury5-ssc8336n-midrived08.dts +f:arch/arm/boot/dts/sigmastar/mstar-mercury5-ssc8336n.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-mercury5.dtsi +f:arch/arm/boot/dts/sigmastar/mstar-v7.dtsi +f:arch/arm/boot/dts/socionext/Makefile +f:arch/arm/boot/dts/socionext/milbeaut-m10v-evb.dts +f:arch/arm/boot/dts/socionext/milbeaut-m10v.dtsi +f:arch/arm/boot/dts/socionext/uniphier-ld4-ref.dts +f:arch/arm/boot/dts/socionext/uniphier-ld4.dtsi +f:arch/arm/boot/dts/socionext/uniphier-ld6b-ref.dts +f:arch/arm/boot/dts/socionext/uniphier-ld6b.dtsi +f:arch/arm/boot/dts/socionext/uniphier-pinctrl.dtsi +f:arch/arm/boot/dts/socionext/uniphier-pro4-ace.dts +f:arch/arm/boot/dts/socionext/uniphier-pro4-ref.dts +f:arch/arm/boot/dts/socionext/uniphier-pro4-sanji.dts +f:arch/arm/boot/dts/socionext/uniphier-pro4.dtsi +f:arch/arm/boot/dts/socionext/uniphier-pro5-epcore.dts +f:arch/arm/boot/dts/socionext/uniphier-pro5-proex.dts +f:arch/arm/boot/dts/socionext/uniphier-pro5.dtsi +f:arch/arm/boot/dts/socionext/uniphier-pxs2-gentil.dts +f:arch/arm/boot/dts/socionext/uniphier-pxs2-vodka.dts +f:arch/arm/boot/dts/socionext/uniphier-pxs2.dtsi +f:arch/arm/boot/dts/socionext/uniphier-ref-daughter.dtsi +f:arch/arm/boot/dts/socionext/uniphier-sld8-ref.dts +f:arch/arm/boot/dts/socionext/uniphier-sld8.dtsi +f:arch/arm/boot/dts/socionext/uniphier-support-card.dtsi +f:arch/arm/boot/dts/st/Makefile +f:arch/arm/boot/dts/st/spear1310-evb.dts +f:arch/arm/boot/dts/st/spear1310.dtsi +f:arch/arm/boot/dts/st/spear1340-evb.dts +f:arch/arm/boot/dts/st/spear1340.dtsi +f:arch/arm/boot/dts/st/spear13xx.dtsi +f:arch/arm/boot/dts/st/spear300-evb.dts +f:arch/arm/boot/dts/st/spear300.dtsi +f:arch/arm/boot/dts/st/spear310-evb.dts +f:arch/arm/boot/dts/st/spear310.dtsi +f:arch/arm/boot/dts/st/spear320-evb.dts +f:arch/arm/boot/dts/st/spear320-hmi.dts +f:arch/arm/boot/dts/st/spear320.dtsi +f:arch/arm/boot/dts/st/spear320s.dtsi +f:arch/arm/boot/dts/st/spear3xx.dtsi +f:arch/arm/boot/dts/st/spear600-evb.dts +f:arch/arm/boot/dts/st/spear600.dtsi +f:arch/arm/boot/dts/st/st-pincfg.h +f:arch/arm/boot/dts/st/ste-ab8500.dtsi +f:arch/arm/boot/dts/st/ste-ab8505.dtsi +f:arch/arm/boot/dts/st/ste-db8500.dtsi +f:arch/arm/boot/dts/st/ste-db8520.dtsi +f:arch/arm/boot/dts/st/ste-db9500.dtsi +f:arch/arm/boot/dts/st/ste-dbx5x0-pinctrl.dtsi +f:arch/arm/boot/dts/st/ste-dbx5x0.dtsi +f:arch/arm/boot/dts/st/ste-href-ab8500.dtsi +f:arch/arm/boot/dts/st/ste-href-ab8505.dtsi +f:arch/arm/boot/dts/st/ste-href-family-pinctrl.dtsi +f:arch/arm/boot/dts/st/ste-href-stuib.dtsi +f:arch/arm/boot/dts/st/ste-href-tvk1281618-r2.dtsi +f:arch/arm/boot/dts/st/ste-href-tvk1281618-r3.dtsi +f:arch/arm/boot/dts/st/ste-href.dtsi +f:arch/arm/boot/dts/st/ste-href520-tvk.dts +f:arch/arm/boot/dts/st/ste-hrefprev60-stuib.dts +f:arch/arm/boot/dts/st/ste-hrefprev60-tvk.dts +f:arch/arm/boot/dts/st/ste-hrefprev60.dtsi +f:arch/arm/boot/dts/st/ste-hrefv60plus-stuib.dts +f:arch/arm/boot/dts/st/ste-hrefv60plus-tvk.dts +f:arch/arm/boot/dts/st/ste-hrefv60plus.dtsi +f:arch/arm/boot/dts/st/ste-nomadik-nhk15.dts +f:arch/arm/boot/dts/st/ste-nomadik-pinctrl.dtsi +f:arch/arm/boot/dts/st/ste-nomadik-s8815.dts +f:arch/arm/boot/dts/st/ste-nomadik-stn8815.dtsi +f:arch/arm/boot/dts/st/ste-snowball.dts +f:arch/arm/boot/dts/st/ste-ux500-samsung-codina-tmo.dts +f:arch/arm/boot/dts/st/ste-ux500-samsung-codina.dts +f:arch/arm/boot/dts/st/ste-ux500-samsung-gavini.dts +f:arch/arm/boot/dts/st/ste-ux500-samsung-golden.dts +f:arch/arm/boot/dts/st/ste-ux500-samsung-janice.dts +f:arch/arm/boot/dts/st/ste-ux500-samsung-kyle.dts +f:arch/arm/boot/dts/st/ste-ux500-samsung-skomer.dts +f:arch/arm/boot/dts/st/stih407-b2120.dts +f:arch/arm/boot/dts/st/stih407-clock.dtsi +f:arch/arm/boot/dts/st/stih407-family.dtsi +f:arch/arm/boot/dts/st/stih407-pinctrl.dtsi +f:arch/arm/boot/dts/st/stih407.dtsi +f:arch/arm/boot/dts/st/stih410-b2120.dts +f:arch/arm/boot/dts/st/stih410-b2260.dts +f:arch/arm/boot/dts/st/stih410-clock.dtsi +f:arch/arm/boot/dts/st/stih410-pinctrl.dtsi +f:arch/arm/boot/dts/st/stih410.dtsi +f:arch/arm/boot/dts/st/stih418-b2199.dts +f:arch/arm/boot/dts/st/stih418-b2264.dts +f:arch/arm/boot/dts/st/stih418-clock.dtsi +f:arch/arm/boot/dts/st/stih418.dtsi +f:arch/arm/boot/dts/st/stihxxx-b2120.dtsi +f:arch/arm/boot/dts/st/stm32429i-eval.dts +f:arch/arm/boot/dts/st/stm32746g-eval.dts +f:arch/arm/boot/dts/st/stm32f4-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32f429-disco.dts +f:arch/arm/boot/dts/st/stm32f429-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32f429.dtsi +f:arch/arm/boot/dts/st/stm32f469-disco.dts +f:arch/arm/boot/dts/st/stm32f469-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32f469.dtsi +f:arch/arm/boot/dts/st/stm32f7-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32f746-disco.dts +f:arch/arm/boot/dts/st/stm32f746-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32f746.dtsi +f:arch/arm/boot/dts/st/stm32f769-disco-mb1166-reva09.dts +f:arch/arm/boot/dts/st/stm32f769-disco.dts +f:arch/arm/boot/dts/st/stm32f769-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32f769.dtsi +f:arch/arm/boot/dts/st/stm32h7-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32h743.dtsi +f:arch/arm/boot/dts/st/stm32h743i-disco.dts +f:arch/arm/boot/dts/st/stm32h743i-eval.dts +f:arch/arm/boot/dts/st/stm32h747i-disco.dts +f:arch/arm/boot/dts/st/stm32h750.dtsi +f:arch/arm/boot/dts/st/stm32h750i-art-pi.dts +f:arch/arm/boot/dts/st/stm32mp13-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32mp131.dtsi +f:arch/arm/boot/dts/st/stm32mp133.dtsi +f:arch/arm/boot/dts/st/stm32mp133c-prihmb.dts +f:arch/arm/boot/dts/st/stm32mp135.dtsi +f:arch/arm/boot/dts/st/stm32mp135f-dhcor-dhsbc.dts +f:arch/arm/boot/dts/st/stm32mp135f-dk.dts +f:arch/arm/boot/dts/st/stm32mp13xc.dtsi +f:arch/arm/boot/dts/st/stm32mp13xf.dtsi +f:arch/arm/boot/dts/st/stm32mp13xx-dhcor-som.dtsi +f:arch/arm/boot/dts/st/stm32mp15-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32mp15-scmi.dtsi +f:arch/arm/boot/dts/st/stm32mp151.dtsi +f:arch/arm/boot/dts/st/stm32mp151a-dhcor-testbench.dts +f:arch/arm/boot/dts/st/stm32mp151a-prtt1a.dts +f:arch/arm/boot/dts/st/stm32mp151a-prtt1c.dts +f:arch/arm/boot/dts/st/stm32mp151a-prtt1l.dtsi +f:arch/arm/boot/dts/st/stm32mp151a-prtt1s.dts +f:arch/arm/boot/dts/st/stm32mp151c-mecio1r0.dts +f:arch/arm/boot/dts/st/stm32mp151c-mect1s.dts +f:arch/arm/boot/dts/st/stm32mp151c-plyaqm.dts +f:arch/arm/boot/dts/st/stm32mp153.dtsi +f:arch/arm/boot/dts/st/stm32mp153c-dhcom-drc02.dts +f:arch/arm/boot/dts/st/stm32mp153c-dhcor-drc-compact.dts +f:arch/arm/boot/dts/st/stm32mp153c-lxa-fairytux2-gen1.dts +f:arch/arm/boot/dts/st/stm32mp153c-lxa-fairytux2-gen2.dts +f:arch/arm/boot/dts/st/stm32mp153c-lxa-fairytux2.dtsi +f:arch/arm/boot/dts/st/stm32mp153c-lxa-tac-gen3.dts +f:arch/arm/boot/dts/st/stm32mp153c-mecio1r1.dts +f:arch/arm/boot/dts/st/stm32mp157.dtsi +f:arch/arm/boot/dts/st/stm32mp157a-avenger96.dts +f:arch/arm/boot/dts/st/stm32mp157a-dhcor-avenger96.dts +f:arch/arm/boot/dts/st/stm32mp157a-dk1-scmi.dts +f:arch/arm/boot/dts/st/stm32mp157a-dk1.dts +f:arch/arm/boot/dts/st/stm32mp157a-icore-stm32mp1-ctouch2-of10.dts +f:arch/arm/boot/dts/st/stm32mp157a-icore-stm32mp1-ctouch2.dts +f:arch/arm/boot/dts/st/stm32mp157a-icore-stm32mp1-edimm2.2.dts +f:arch/arm/boot/dts/st/stm32mp157a-icore-stm32mp1.dtsi +f:arch/arm/boot/dts/st/stm32mp157a-iot-box.dts +f:arch/arm/boot/dts/st/stm32mp157a-microgea-stm32mp1-microdev2.0-of7.dts +f:arch/arm/boot/dts/st/stm32mp157a-microgea-stm32mp1-microdev2.0.dts +f:arch/arm/boot/dts/st/stm32mp157a-microgea-stm32mp1.dtsi +f:arch/arm/boot/dts/st/stm32mp157a-stinger96.dts +f:arch/arm/boot/dts/st/stm32mp157a-stinger96.dtsi +f:arch/arm/boot/dts/st/stm32mp157c-dhcom-pdk2.dts +f:arch/arm/boot/dts/st/stm32mp157c-dhcom-picoitx.dts +f:arch/arm/boot/dts/st/stm32mp157c-dk2-scmi.dts +f:arch/arm/boot/dts/st/stm32mp157c-dk2.dts +f:arch/arm/boot/dts/st/stm32mp157c-ed1-scmi.dts +f:arch/arm/boot/dts/st/stm32mp157c-ed1.dts +f:arch/arm/boot/dts/st/stm32mp157c-emsbc-argon.dts +f:arch/arm/boot/dts/st/stm32mp157c-emstamp-argon.dtsi +f:arch/arm/boot/dts/st/stm32mp157c-ev1-scmi.dts +f:arch/arm/boot/dts/st/stm32mp157c-ev1.dts +f:arch/arm/boot/dts/st/stm32mp157c-lxa-mc1.dts +f:arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen1.dts +f:arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen2.dts +f:arch/arm/boot/dts/st/stm32mp157c-odyssey-som.dtsi +f:arch/arm/boot/dts/st/stm32mp157c-odyssey.dts +f:arch/arm/boot/dts/st/stm32mp157c-osd32mp1-red.dts +f:arch/arm/boot/dts/st/stm32mp157c-phycore-stm32mp1-3.dts +f:arch/arm/boot/dts/st/stm32mp157c-phycore-stm32mp15-som.dtsi +f:arch/arm/boot/dts/st/stm32mp157c-ultra-fly-sbc.dts +f:arch/arm/boot/dts/st/stm32mp157f-dk2-scmi.dtsi +f:arch/arm/boot/dts/st/stm32mp157f-dk2.dts +f:arch/arm/boot/dts/st/stm32mp15x-mecio1-io.dtsi +f:arch/arm/boot/dts/st/stm32mp15xc-lxa-tac.dtsi +f:arch/arm/boot/dts/st/stm32mp15xc.dtsi +f:arch/arm/boot/dts/st/stm32mp15xf.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcom-drc02.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcom-pdk2.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcom-picoitx.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcom-som.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcor-avenger96.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcor-drc-compact.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcor-io1v8.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcor-som.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dhcor-testbench.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-dkx.dtsi +f:arch/arm/boot/dts/st/stm32mp15xx-osd32.dtsi +f:arch/arm/boot/dts/st/stm32mp15xxaa-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32mp15xxab-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32mp15xxac-pinctrl.dtsi +f:arch/arm/boot/dts/st/stm32mp15xxad-pinctrl.dtsi +f:arch/arm/boot/dts/sunplus/Makefile +f:arch/arm/boot/dts/sunplus/sunplus-sp7021-achip.dtsi +f:arch/arm/boot/dts/sunplus/sunplus-sp7021-demo-v3.dts +f:arch/arm/boot/dts/sunplus/sunplus-sp7021.dtsi +f:arch/arm/boot/dts/synaptics/Makefile +f:arch/arm/boot/dts/synaptics/berlin2-sony-nsz-gs7.dts +f:arch/arm/boot/dts/synaptics/berlin2.dtsi +f:arch/arm/boot/dts/synaptics/berlin2cd-google-chromecast.dts +f:arch/arm/boot/dts/synaptics/berlin2cd-valve-steamlink.dts +f:arch/arm/boot/dts/synaptics/berlin2cd.dtsi +f:arch/arm/boot/dts/synaptics/berlin2q-marvell-dmp.dts +f:arch/arm/boot/dts/synaptics/berlin2q.dtsi +f:arch/arm/boot/dts/ti/Makefile +f:arch/arm/boot/dts/ti/davinci/Makefile +f:arch/arm/boot/dts/ti/davinci/da850-enbw-cmc.dts +f:arch/arm/boot/dts/ti/davinci/da850-evm.dts +f:arch/arm/boot/dts/ti/davinci/da850-lcdk.dts +f:arch/arm/boot/dts/ti/davinci/da850-lego-ev3.dts +f:arch/arm/boot/dts/ti/davinci/da850.dtsi +f:arch/arm/boot/dts/ti/keystone/Makefile +f:arch/arm/boot/dts/ti/keystone/keystone-clocks.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2e-clocks.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2e-evm.dts +f:arch/arm/boot/dts/ti/keystone/keystone-k2e-netcp.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2e.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2g-evm.dts +f:arch/arm/boot/dts/ti/keystone/keystone-k2g-ice.dts +f:arch/arm/boot/dts/ti/keystone/keystone-k2g-netcp.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2g.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2hk-clocks.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2hk-evm.dts +f:arch/arm/boot/dts/ti/keystone/keystone-k2hk-netcp.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2hk.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2l-clocks.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2l-evm.dts +f:arch/arm/boot/dts/ti/keystone/keystone-k2l-netcp.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone-k2l.dtsi +f:arch/arm/boot/dts/ti/keystone/keystone.dtsi +f:arch/arm/boot/dts/ti/omap/Makefile +f:arch/arm/boot/dts/ti/omap/am335x-baltos-ir2110.dts +f:arch/arm/boot/dts/ti/omap/am335x-baltos-ir3220.dts +f:arch/arm/boot/dts/ti/omap/am335x-baltos-ir5221.dts +f:arch/arm/boot/dts/ti/omap/am335x-baltos-leds.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-baltos.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-base0033.dts +f:arch/arm/boot/dts/ti/omap/am335x-bone-common.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-bone.dts +f:arch/arm/boot/dts/ti/omap/am335x-boneblack-common.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-boneblack-hdmi.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-boneblack-wireless.dts +f:arch/arm/boot/dts/ti/omap/am335x-boneblack.dts +f:arch/arm/boot/dts/ti/omap/am335x-boneblue.dts +f:arch/arm/boot/dts/ti/omap/am335x-bonegreen-common.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-bonegreen-eco.dts +f:arch/arm/boot/dts/ti/omap/am335x-bonegreen-wireless.dts +f:arch/arm/boot/dts/ti/omap/am335x-bonegreen.dts +f:arch/arm/boot/dts/ti/omap/am335x-chiliboard.dts +f:arch/arm/boot/dts/ti/omap/am335x-chilisom.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-cm-t335.dts +f:arch/arm/boot/dts/ti/omap/am335x-evm.dts +f:arch/arm/boot/dts/ti/omap/am335x-evmsk.dts +f:arch/arm/boot/dts/ti/omap/am335x-guardian.dts +f:arch/arm/boot/dts/ti/omap/am335x-icev2.dts +f:arch/arm/boot/dts/ti/omap/am335x-igep0033.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-lxm.dts +f:arch/arm/boot/dts/ti/omap/am335x-moxa-uc-2100-common.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-moxa-uc-2101.dts +f:arch/arm/boot/dts/ti/omap/am335x-moxa-uc-8100-common.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-moxa-uc-8100-me-t.dts +f:arch/arm/boot/dts/ti/omap/am335x-myirtech-myc.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-myirtech-myd.dts +f:arch/arm/boot/dts/ti/omap/am335x-nano.dts +f:arch/arm/boot/dts/ti/omap/am335x-netcan-plus-1xx.dts +f:arch/arm/boot/dts/ti/omap/am335x-netcom-plus-2xx.dts +f:arch/arm/boot/dts/ti/omap/am335x-netcom-plus-8xx.dts +f:arch/arm/boot/dts/ti/omap/am335x-osd3358-sm-red.dts +f:arch/arm/boot/dts/ti/omap/am335x-osd335x-common.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-pcm-953.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-pdu001.dts +f:arch/arm/boot/dts/ti/omap/am335x-pepper.dts +f:arch/arm/boot/dts/ti/omap/am335x-phycore-rdk.dts +f:arch/arm/boot/dts/ti/omap/am335x-phycore-som.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-pocketbeagle.dts +f:arch/arm/boot/dts/ti/omap/am335x-regor-rdk.dts +f:arch/arm/boot/dts/ti/omap/am335x-regor.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-sancloud-bbe-common.dtsi +f:arch/arm/boot/dts/ti/omap/am335x-sancloud-bbe-extended-wifi.dts +f:arch/arm/boot/dts/ti/omap/am335x-sancloud-bbe-lite.dts +f:arch/arm/boot/dts/ti/omap/am335x-sancloud-bbe.dts +f:arch/arm/boot/dts/ti/omap/am335x-sbc-t335.dts +f:arch/arm/boot/dts/ti/omap/am335x-shc.dts +f:arch/arm/boot/dts/ti/omap/am335x-sl50.dts +f:arch/arm/boot/dts/ti/omap/am335x-wega-rdk.dts +f:arch/arm/boot/dts/ti/omap/am335x-wega.dtsi +f:arch/arm/boot/dts/ti/omap/am33xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/am33xx-l4.dtsi +f:arch/arm/boot/dts/ti/omap/am33xx.dtsi +f:arch/arm/boot/dts/ti/omap/am3517-craneboard.dts +f:arch/arm/boot/dts/ti/omap/am3517-evm-ui.dtsi +f:arch/arm/boot/dts/ti/omap/am3517-evm.dts +f:arch/arm/boot/dts/ti/omap/am3517-som.dtsi +f:arch/arm/boot/dts/ti/omap/am3517.dtsi +f:arch/arm/boot/dts/ti/omap/am3517_mt_ventoux.dts +f:arch/arm/boot/dts/ti/omap/am35xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/am3703.dtsi +f:arch/arm/boot/dts/ti/omap/am3715.dtsi +f:arch/arm/boot/dts/ti/omap/am3874-iceboard.dts +f:arch/arm/boot/dts/ti/omap/am4372.dtsi +f:arch/arm/boot/dts/ti/omap/am437x-cm-t43.dts +f:arch/arm/boot/dts/ti/omap/am437x-gp-evm.dts +f:arch/arm/boot/dts/ti/omap/am437x-idk-evm.dts +f:arch/arm/boot/dts/ti/omap/am437x-l4.dtsi +f:arch/arm/boot/dts/ti/omap/am437x-sbc-t43.dts +f:arch/arm/boot/dts/ti/omap/am437x-sk-evm.dts +f:arch/arm/boot/dts/ti/omap/am43x-epos-evm.dts +f:arch/arm/boot/dts/ti/omap/am43xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/am57-pruss.dtsi +f:arch/arm/boot/dts/ti/omap/am5718.dtsi +f:arch/arm/boot/dts/ti/omap/am571x-idk-touchscreen.dtso +f:arch/arm/boot/dts/ti/omap/am571x-idk.dts +f:arch/arm/boot/dts/ti/omap/am5728.dtsi +f:arch/arm/boot/dts/ti/omap/am5729-beagleboneai.dts +f:arch/arm/boot/dts/ti/omap/am572x-idk-common.dtsi +f:arch/arm/boot/dts/ti/omap/am572x-idk-touchscreen.dtso +f:arch/arm/boot/dts/ti/omap/am572x-idk.dts +f:arch/arm/boot/dts/ti/omap/am5748.dtsi +f:arch/arm/boot/dts/ti/omap/am574x-idk.dts +f:arch/arm/boot/dts/ti/omap/am57xx-beagle-x15-common.dtsi +f:arch/arm/boot/dts/ti/omap/am57xx-beagle-x15-revb1.dts +f:arch/arm/boot/dts/ti/omap/am57xx-beagle-x15-revc.dts +f:arch/arm/boot/dts/ti/omap/am57xx-beagle-x15.dts +f:arch/arm/boot/dts/ti/omap/am57xx-cl-som-am57x.dts +f:arch/arm/boot/dts/ti/omap/am57xx-commercial-grade.dtsi +f:arch/arm/boot/dts/ti/omap/am57xx-evm.dtso +f:arch/arm/boot/dts/ti/omap/am57xx-idk-common.dtsi +f:arch/arm/boot/dts/ti/omap/am57xx-idk-lcd-osd101t2045.dtso +f:arch/arm/boot/dts/ti/omap/am57xx-idk-lcd-osd101t2587.dtso +f:arch/arm/boot/dts/ti/omap/am57xx-industrial-grade.dtsi +f:arch/arm/boot/dts/ti/omap/am57xx-sbc-am57x.dts +f:arch/arm/boot/dts/ti/omap/compulab-sb-som.dtsi +f:arch/arm/boot/dts/ti/omap/dm3725.dtsi +f:arch/arm/boot/dts/ti/omap/dm8148-evm.dts +f:arch/arm/boot/dts/ti/omap/dm8148-t410.dts +f:arch/arm/boot/dts/ti/omap/dm814x-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/dm814x.dtsi +f:arch/arm/boot/dts/ti/omap/dm8168-evm.dts +f:arch/arm/boot/dts/ti/omap/dm816x-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/dm816x.dtsi +f:arch/arm/boot/dts/ti/omap/dra62x-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/dra62x-j5eco-evm.dts +f:arch/arm/boot/dts/ti/omap/dra62x.dtsi +f:arch/arm/boot/dts/ti/omap/dra7-dspeve-thermal.dtsi +f:arch/arm/boot/dts/ti/omap/dra7-evm-common.dtsi +f:arch/arm/boot/dts/ti/omap/dra7-evm.dts +f:arch/arm/boot/dts/ti/omap/dra7-ipu-dsp-common.dtsi +f:arch/arm/boot/dts/ti/omap/dra7-iva-thermal.dtsi +f:arch/arm/boot/dts/ti/omap/dra7-l4.dtsi +f:arch/arm/boot/dts/ti/omap/dra7-mmc-iodelay.dtsi +f:arch/arm/boot/dts/ti/omap/dra7.dtsi +f:arch/arm/boot/dts/ti/omap/dra71-evm.dts +f:arch/arm/boot/dts/ti/omap/dra71x.dtsi +f:arch/arm/boot/dts/ti/omap/dra72-evm-common.dtsi +f:arch/arm/boot/dts/ti/omap/dra72-evm-revc.dts +f:arch/arm/boot/dts/ti/omap/dra72-evm-tps65917.dtsi +f:arch/arm/boot/dts/ti/omap/dra72-evm.dts +f:arch/arm/boot/dts/ti/omap/dra72x-mmc-iodelay.dtsi +f:arch/arm/boot/dts/ti/omap/dra72x.dtsi +f:arch/arm/boot/dts/ti/omap/dra74-ipu-dsp-common.dtsi +f:arch/arm/boot/dts/ti/omap/dra74x-mmc-iodelay.dtsi +f:arch/arm/boot/dts/ti/omap/dra74x-p.dtsi +f:arch/arm/boot/dts/ti/omap/dra74x.dtsi +f:arch/arm/boot/dts/ti/omap/dra76-evm.dts +f:arch/arm/boot/dts/ti/omap/dra76x-mmc-iodelay.dtsi +f:arch/arm/boot/dts/ti/omap/dra76x.dtsi +f:arch/arm/boot/dts/ti/omap/dra7xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/elpida_ecb240abacn.dtsi +f:arch/arm/boot/dts/ti/omap/logicpd-som-lv-35xx-devkit.dts +f:arch/arm/boot/dts/ti/omap/logicpd-som-lv-37xx-devkit.dts +f:arch/arm/boot/dts/ti/omap/logicpd-som-lv-baseboard.dtsi +f:arch/arm/boot/dts/ti/omap/logicpd-som-lv.dtsi +f:arch/arm/boot/dts/ti/omap/logicpd-torpedo-35xx-devkit.dts +f:arch/arm/boot/dts/ti/omap/logicpd-torpedo-37xx-devkit-28.dts +f:arch/arm/boot/dts/ti/omap/logicpd-torpedo-37xx-devkit.dts +f:arch/arm/boot/dts/ti/omap/logicpd-torpedo-baseboard.dtsi +f:arch/arm/boot/dts/ti/omap/logicpd-torpedo-som.dtsi +f:arch/arm/boot/dts/ti/omap/motorola-cpcap-mapphone.dtsi +f:arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi +f:arch/arm/boot/dts/ti/omap/motorola-mapphone-handset.dtsi +f:arch/arm/boot/dts/ti/omap/motorola-mapphone-mz607-mz617.dtsi +f:arch/arm/boot/dts/ti/omap/motorola-mapphone-xt8xx.dtsi +f:arch/arm/boot/dts/ti/omap/omap-gpmc-smsc911x.dtsi +f:arch/arm/boot/dts/ti/omap/omap-gpmc-smsc9221.dtsi +f:arch/arm/boot/dts/ti/omap/omap-zoom-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap2.dtsi +f:arch/arm/boot/dts/ti/omap/omap2420-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap2420-h4.dts +f:arch/arm/boot/dts/ti/omap/omap2420-n800.dts +f:arch/arm/boot/dts/ti/omap/omap2420-n810-wimax.dts +f:arch/arm/boot/dts/ti/omap/omap2420-n810.dts +f:arch/arm/boot/dts/ti/omap/omap2420-n8x0-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap2420.dtsi +f:arch/arm/boot/dts/ti/omap/omap2430-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap2430-sdp.dts +f:arch/arm/boot/dts/ti/omap/omap2430.dtsi +f:arch/arm/boot/dts/ti/omap/omap24xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-beagle-ab4.dts +f:arch/arm/boot/dts/ti/omap/omap3-beagle-xm-ab.dts +f:arch/arm/boot/dts/ti/omap/omap3-beagle-xm.dts +f:arch/arm/boot/dts/ti/omap/omap3-beagle.dts +f:arch/arm/boot/dts/ti/omap/omap3-cm-t3517.dts +f:arch/arm/boot/dts/ti/omap/omap3-cm-t3530.dts +f:arch/arm/boot/dts/ti/omap/omap3-cm-t3730.dts +f:arch/arm/boot/dts/ti/omap/omap3-cm-t3x.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-cm-t3x30.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-cpu-thermal.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-devkit8000-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-devkit8000-lcd-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-devkit8000-lcd43.dts +f:arch/arm/boot/dts/ti/omap/omap3-devkit8000-lcd70.dts +f:arch/arm/boot/dts/ti/omap/omap3-devkit8000.dts +f:arch/arm/boot/dts/ti/omap/omap3-echo.dts +f:arch/arm/boot/dts/ti/omap/omap3-evm-37xx.dts +f:arch/arm/boot/dts/ti/omap/omap3-evm-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-evm-processor-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-evm.dts +f:arch/arm/boot/dts/ti/omap/omap3-gta04.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-gta04a3.dts +f:arch/arm/boot/dts/ti/omap/omap3-gta04a4.dts +f:arch/arm/boot/dts/ti/omap/omap3-gta04a5.dts +f:arch/arm/boot/dts/ti/omap/omap3-gta04a5one.dts +f:arch/arm/boot/dts/ti/omap/omap3-ha-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-ha-lcd.dts +f:arch/arm/boot/dts/ti/omap/omap3-ha.dts +f:arch/arm/boot/dts/ti/omap/omap3-igep.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-igep0020-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-igep0020-rev-f.dts +f:arch/arm/boot/dts/ti/omap/omap3-igep0020.dts +f:arch/arm/boot/dts/ti/omap/omap3-igep0030-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-igep0030-rev-g.dts +f:arch/arm/boot/dts/ti/omap/omap3-igep0030.dts +f:arch/arm/boot/dts/ti/omap/omap3-ldp.dts +f:arch/arm/boot/dts/ti/omap/omap3-lilly-a83x.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-lilly-dbb056.dts +f:arch/arm/boot/dts/ti/omap/omap3-n9.dts +f:arch/arm/boot/dts/ti/omap/omap3-n900.dts +f:arch/arm/boot/dts/ti/omap/omap3-n950-n9.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-n950.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-alto35-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-alto35.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-base.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-chestnut43-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-chestnut43.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-common-dvi.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-common-lcd35.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-common-lcd43.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-common-peripherals.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-gallop43-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-gallop43.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-palo35-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-palo35.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-palo43-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-palo43.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm-alto35.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm-chestnut43.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm-gallop43.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm-palo35.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm-palo43.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm-summit.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm-tobi.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm-tobiduo.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-storm.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-summit-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-summit.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-tobi-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-tobi.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo-tobiduo-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-overo-tobiduo.dts +f:arch/arm/boot/dts/ti/omap/omap3-overo.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-pandora-1ghz.dts +f:arch/arm/boot/dts/ti/omap/omap3-pandora-600mhz.dts +f:arch/arm/boot/dts/ti/omap/omap3-pandora-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-panel-sharp-ls037v7dw01.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-sb-t35.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-sbc-t3517.dts +f:arch/arm/boot/dts/ti/omap/omap3-sbc-t3530.dts +f:arch/arm/boot/dts/ti/omap/omap3-sbc-t3730.dts +f:arch/arm/boot/dts/ti/omap/omap3-sniper.dts +f:arch/arm/boot/dts/ti/omap/omap3-tao3530.dtsi +f:arch/arm/boot/dts/ti/omap/omap3-thunder.dts +f:arch/arm/boot/dts/ti/omap/omap3-zoom3.dts +f:arch/arm/boot/dts/ti/omap/omap3.dtsi +f:arch/arm/boot/dts/ti/omap/omap3430-sdp.dts +f:arch/arm/boot/dts/ti/omap/omap3430es1-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap34xx-omap36xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap34xx.dtsi +f:arch/arm/boot/dts/ti/omap/omap36xx-am35xx-omap3430es2plus-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap36xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap36xx-omap3430es2plus-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap36xx.dtsi +f:arch/arm/boot/dts/ti/omap/omap3xxx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-cpu-thermal.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-droid-bionic-xt875.dts +f:arch/arm/boot/dts/ti/omap/omap4-droid4-xt894.dts +f:arch/arm/boot/dts/ti/omap/omap4-duovero-parlor.dts +f:arch/arm/boot/dts/ti/omap/omap4-duovero.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts +f:arch/arm/boot/dts/ti/omap/omap4-kc1.dts +f:arch/arm/boot/dts/ti/omap/omap4-l4-abe.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-l4.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-mcpdm.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-panda-a4.dts +f:arch/arm/boot/dts/ti/omap/omap4-panda-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-panda-es.dts +f:arch/arm/boot/dts/ti/omap/omap4-panda.dts +f:arch/arm/boot/dts/ti/omap/omap4-sdp-es23plus.dts +f:arch/arm/boot/dts/ti/omap/omap4-sdp.dts +f:arch/arm/boot/dts/ti/omap/omap4-var-dvk-om44.dts +f:arch/arm/boot/dts/ti/omap/omap4-var-om44customboard.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-var-som-om44-wlan.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-var-som-om44.dtsi +f:arch/arm/boot/dts/ti/omap/omap4-var-stk-om44.dts +f:arch/arm/boot/dts/ti/omap/omap4-xyboard-mz609.dts +f:arch/arm/boot/dts/ti/omap/omap4-xyboard-mz617.dts +f:arch/arm/boot/dts/ti/omap/omap4.dtsi +f:arch/arm/boot/dts/ti/omap/omap443x-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap443x.dtsi +f:arch/arm/boot/dts/ti/omap/omap4460.dtsi +f:arch/arm/boot/dts/ti/omap/omap446x-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap44xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/omap5-board-common.dtsi +f:arch/arm/boot/dts/ti/omap/omap5-cm-t54.dts +f:arch/arm/boot/dts/ti/omap/omap5-core-thermal.dtsi +f:arch/arm/boot/dts/ti/omap/omap5-gpu-thermal.dtsi +f:arch/arm/boot/dts/ti/omap/omap5-igep0050.dts +f:arch/arm/boot/dts/ti/omap/omap5-l4-abe.dtsi +f:arch/arm/boot/dts/ti/omap/omap5-l4.dtsi +f:arch/arm/boot/dts/ti/omap/omap5-sbc-t54.dts +f:arch/arm/boot/dts/ti/omap/omap5-uevm.dts +f:arch/arm/boot/dts/ti/omap/omap5.dtsi +f:arch/arm/boot/dts/ti/omap/omap54xx-clocks.dtsi +f:arch/arm/boot/dts/ti/omap/twl4030.dtsi +f:arch/arm/boot/dts/ti/omap/twl4030_omap3.dtsi +f:arch/arm/boot/dts/ti/omap/twl6030.dtsi +f:arch/arm/boot/dts/ti/omap/twl6030_omap4.dtsi +f:arch/arm/boot/dts/tps6507x.dtsi +f:arch/arm/boot/dts/tps65217.dtsi +f:arch/arm/boot/dts/tps65910.dtsi +f:arch/arm/boot/dts/unisoc/Makefile +f:arch/arm/boot/dts/unisoc/rda8810pl-orangepi-2g-iot.dts +f:arch/arm/boot/dts/unisoc/rda8810pl-orangepi-i96.dts +f:arch/arm/boot/dts/unisoc/rda8810pl.dtsi +f:arch/arm/boot/dts/vt8500/Makefile +f:arch/arm/boot/dts/vt8500/vt8500-bv07.dts +f:arch/arm/boot/dts/vt8500/vt8500.dtsi +f:arch/arm/boot/dts/vt8500/wm8505-ref.dts +f:arch/arm/boot/dts/vt8500/wm8505.dtsi +f:arch/arm/boot/dts/vt8500/wm8650-mid.dts +f:arch/arm/boot/dts/vt8500/wm8650.dtsi +f:arch/arm/boot/dts/vt8500/wm8750-apc8750.dts +f:arch/arm/boot/dts/vt8500/wm8750.dtsi +f:arch/arm/boot/dts/vt8500/wm8850-w70v2.dts +f:arch/arm/boot/dts/vt8500/wm8850.dtsi +f:arch/arm/boot/dts/vt8500/wm8950-apc-rock.dts +f:arch/arm/boot/dts/vt8500/wm8950.dtsi +f:arch/arm/boot/dts/xen/Makefile +f:arch/arm/boot/dts/xen/xenvm-4.2.dts +f:arch/arm/boot/dts/xilinx/Makefile +f:arch/arm/boot/dts/xilinx/zynq-7000.dtsi +f:arch/arm/boot/dts/xilinx/zynq-cc108.dts +f:arch/arm/boot/dts/xilinx/zynq-ebaz4205.dts +f:arch/arm/boot/dts/xilinx/zynq-microzed.dts +f:arch/arm/boot/dts/xilinx/zynq-parallella.dts +f:arch/arm/boot/dts/xilinx/zynq-zc702.dts +f:arch/arm/boot/dts/xilinx/zynq-zc706.dts +f:arch/arm/boot/dts/xilinx/zynq-zc770-xm010.dts +f:arch/arm/boot/dts/xilinx/zynq-zc770-xm011.dts +f:arch/arm/boot/dts/xilinx/zynq-zc770-xm012.dts +f:arch/arm/boot/dts/xilinx/zynq-zc770-xm013.dts +f:arch/arm/boot/dts/xilinx/zynq-zed.dts +f:arch/arm/boot/dts/xilinx/zynq-zturn-common.dtsi +f:arch/arm/boot/dts/xilinx/zynq-zturn-v5.dts +f:arch/arm/boot/dts/xilinx/zynq-zturn.dts +f:arch/arm/boot/dts/xilinx/zynq-zybo-z7.dts +f:arch/arm/boot/dts/xilinx/zynq-zybo.dts +f:arch/arm/boot/install.sh +f:arch/arm/common/Kconfig +f:arch/arm/common/Makefile +f:arch/arm/common/bL_switcher.c +f:arch/arm/common/bL_switcher_dummy_if.c +f:arch/arm/common/firmware.c +f:arch/arm/common/krait-l2-accessors.c +f:arch/arm/common/locomo.c +f:arch/arm/common/mcpm_entry.c +f:arch/arm/common/mcpm_head.S +f:arch/arm/common/mcpm_platsmp.c +f:arch/arm/common/sa1111.c +f:arch/arm/common/scoop.c +f:arch/arm/common/secure_cntvoff.S +f:arch/arm/common/sharpsl_param.c +f:arch/arm/common/vlock.S +f:arch/arm/common/vlock.h +f:arch/arm/configs/am200epdkit_defconfig +f:arch/arm/configs/aspeed_g4_defconfig +f:arch/arm/configs/aspeed_g5_defconfig +f:arch/arm/configs/assabet_defconfig +f:arch/arm/configs/at91_dt_defconfig +f:arch/arm/configs/axm55xx_defconfig +f:arch/arm/configs/bcm2835_defconfig +f:arch/arm/configs/clps711x_defconfig +f:arch/arm/configs/collie_defconfig +f:arch/arm/configs/davinci_all_defconfig +f:arch/arm/configs/dove_defconfig +f:arch/arm/configs/dram_0x00000000.config +f:arch/arm/configs/dram_0xc0000000.config +f:arch/arm/configs/dram_0xd0000000.config +f:arch/arm/configs/ep93xx_defconfig +f:arch/arm/configs/exynos_defconfig +f:arch/arm/configs/footbridge_defconfig +f:arch/arm/configs/gemini_defconfig +f:arch/arm/configs/h3600_defconfig +f:arch/arm/configs/hardening.config +f:arch/arm/configs/hisi_defconfig +f:arch/arm/configs/imx_v4_v5_defconfig +f:arch/arm/configs/imx_v6_v7_defconfig +f:arch/arm/configs/imxrt_defconfig +f:arch/arm/configs/integrator_defconfig +f:arch/arm/configs/ixp4xx_defconfig +f:arch/arm/configs/jornada720_defconfig +f:arch/arm/configs/keystone_defconfig +f:arch/arm/configs/lpae.config +f:arch/arm/configs/lpc18xx_defconfig +f:arch/arm/configs/lpc32xx_defconfig +f:arch/arm/configs/milbeaut_m10v_defconfig +f:arch/arm/configs/mmp2_defconfig +f:arch/arm/configs/moxart_defconfig +f:arch/arm/configs/mps2_defconfig +f:arch/arm/configs/multi_v4t_defconfig +f:arch/arm/configs/multi_v5_defconfig +f:arch/arm/configs/multi_v7_defconfig +f:arch/arm/configs/mv78xx0_defconfig +f:arch/arm/configs/mvebu_v5_defconfig +f:arch/arm/configs/mvebu_v7_defconfig +f:arch/arm/configs/mxs_defconfig +f:arch/arm/configs/neponset_defconfig +f:arch/arm/configs/netwinder_defconfig +f:arch/arm/configs/nhk8815_defconfig +f:arch/arm/configs/omap1_defconfig +f:arch/arm/configs/omap2plus_defconfig +f:arch/arm/configs/orion5x_defconfig +f:arch/arm/configs/pxa168_defconfig +f:arch/arm/configs/pxa3xx_defconfig +f:arch/arm/configs/pxa910_defconfig +f:arch/arm/configs/pxa_defconfig +f:arch/arm/configs/qcom_defconfig +f:arch/arm/configs/realview_defconfig +f:arch/arm/configs/rpc_defconfig +f:arch/arm/configs/s3c6400_defconfig +f:arch/arm/configs/s5pv210_defconfig +f:arch/arm/configs/sama5_defconfig +f:arch/arm/configs/sama7_defconfig +f:arch/arm/configs/shmobile_defconfig +f:arch/arm/configs/socfpga_defconfig +f:arch/arm/configs/sp7021_defconfig +f:arch/arm/configs/spear13xx_defconfig +f:arch/arm/configs/spear3xx_defconfig +f:arch/arm/configs/spear6xx_defconfig +f:arch/arm/configs/spitz_defconfig +f:arch/arm/configs/stm32_defconfig +f:arch/arm/configs/sunxi_defconfig +f:arch/arm/configs/tegra_defconfig +f:arch/arm/configs/u8500_defconfig +f:arch/arm/configs/versatile_defconfig +f:arch/arm/configs/vexpress_defconfig +f:arch/arm/configs/vf610m4_defconfig +f:arch/arm/configs/vt8500_v6_v7_defconfig +f:arch/arm/configs/wpcm450_defconfig +f:arch/arm/crypto/.gitignore +f:arch/arm/crypto/Kconfig +f:arch/arm/crypto/Makefile +f:arch/arm/crypto/aes-ce-core.S +f:arch/arm/crypto/aes-ce-glue.c +f:arch/arm/crypto/aes-cipher-core.S +f:arch/arm/crypto/aes-cipher-glue.c +f:arch/arm/crypto/aes-cipher.h +f:arch/arm/crypto/aes-neonbs-core.S +f:arch/arm/crypto/aes-neonbs-glue.c +f:arch/arm/crypto/blake2b-neon-core.S +f:arch/arm/crypto/blake2b-neon-glue.c +f:arch/arm/crypto/curve25519-core.S +f:arch/arm/crypto/curve25519-glue.c +f:arch/arm/crypto/ghash-ce-core.S +f:arch/arm/crypto/ghash-ce-glue.c +f:arch/arm/crypto/nh-neon-core.S +f:arch/arm/crypto/nhpoly1305-neon-glue.c +f:arch/arm/include/asm/Kbuild +f:arch/arm/include/asm/arch_gicv3.h +f:arch/arm/include/asm/arch_timer.h +f:arch/arm/include/asm/archrandom.h +f:arch/arm/include/asm/arm-cci.h +f:arch/arm/include/asm/arm_pmuv3.h +f:arch/arm/include/asm/asm-offsets.h +f:arch/arm/include/asm/assembler.h +f:arch/arm/include/asm/atomic.h +f:arch/arm/include/asm/auxvec.h +f:arch/arm/include/asm/bL_switcher.h +f:arch/arm/include/asm/barrier.h +f:arch/arm/include/asm/bitops.h +f:arch/arm/include/asm/bitrev.h +f:arch/arm/include/asm/bug.h +f:arch/arm/include/asm/bugs.h +f:arch/arm/include/asm/cache.h +f:arch/arm/include/asm/cacheflush.h +f:arch/arm/include/asm/cachetype.h +f:arch/arm/include/asm/checksum.h +f:arch/arm/include/asm/clocksource.h +f:arch/arm/include/asm/cmpxchg.h +f:arch/arm/include/asm/compiler.h +f:arch/arm/include/asm/cp15.h +f:arch/arm/include/asm/cpu.h +f:arch/arm/include/asm/cpufeature.h +f:arch/arm/include/asm/cpuidle.h +f:arch/arm/include/asm/cputype.h +f:arch/arm/include/asm/cti.h +f:arch/arm/include/asm/current.h +f:arch/arm/include/asm/dcc.h +f:arch/arm/include/asm/delay.h +f:arch/arm/include/asm/device.h +f:arch/arm/include/asm/div64.h +f:arch/arm/include/asm/dma-iommu.h +f:arch/arm/include/asm/dma.h +f:arch/arm/include/asm/dmi.h +f:arch/arm/include/asm/domain.h +f:arch/arm/include/asm/ecard.h +f:arch/arm/include/asm/edac.h +f:arch/arm/include/asm/efi.h +f:arch/arm/include/asm/elf.h +f:arch/arm/include/asm/exception.h +f:arch/arm/include/asm/fiq.h +f:arch/arm/include/asm/firmware.h +f:arch/arm/include/asm/fixmap.h +f:arch/arm/include/asm/floppy.h +f:arch/arm/include/asm/fncpy.h +f:arch/arm/include/asm/fpstate.h +f:arch/arm/include/asm/fpu.h +f:arch/arm/include/asm/ftrace.h +f:arch/arm/include/asm/futex.h +f:arch/arm/include/asm/glue-cache.h +f:arch/arm/include/asm/glue-df.h +f:arch/arm/include/asm/glue-pf.h +f:arch/arm/include/asm/glue-proc.h +f:arch/arm/include/asm/glue.h +f:arch/arm/include/asm/hardirq.h +f:arch/arm/include/asm/hardware/cache-aurora-l2.h +f:arch/arm/include/asm/hardware/cache-b15-rac.h +f:arch/arm/include/asm/hardware/cache-feroceon-l2.h +f:arch/arm/include/asm/hardware/cache-l2x0.h +f:arch/arm/include/asm/hardware/cache-tauros2.h +f:arch/arm/include/asm/hardware/cache-uniphier.h +f:arch/arm/include/asm/hardware/cp14.h +f:arch/arm/include/asm/hardware/dec21285.h +f:arch/arm/include/asm/hardware/ioc.h +f:arch/arm/include/asm/hardware/iomd.h +f:arch/arm/include/asm/hardware/locomo.h +f:arch/arm/include/asm/hardware/memc.h +f:arch/arm/include/asm/hardware/sa1111.h +f:arch/arm/include/asm/hardware/scoop.h +f:arch/arm/include/asm/hardware/ssp.h +f:arch/arm/include/asm/highmem.h +f:arch/arm/include/asm/hugetlb-3level.h +f:arch/arm/include/asm/hugetlb.h +f:arch/arm/include/asm/hw_breakpoint.h +f:arch/arm/include/asm/hw_irq.h +f:arch/arm/include/asm/hwcap.h +f:arch/arm/include/asm/hypervisor.h +f:arch/arm/include/asm/idmap.h +f:arch/arm/include/asm/insn.h +f:arch/arm/include/asm/io.h +f:arch/arm/include/asm/irq.h +f:arch/arm/include/asm/irq_work.h +f:arch/arm/include/asm/irqflags.h +f:arch/arm/include/asm/jump_label.h +f:arch/arm/include/asm/kasan.h +f:arch/arm/include/asm/kasan_def.h +f:arch/arm/include/asm/kexec-internal.h +f:arch/arm/include/asm/kexec.h +f:arch/arm/include/asm/kfence.h +f:arch/arm/include/asm/kgdb.h +f:arch/arm/include/asm/kprobes.h +f:arch/arm/include/asm/krait-l2-accessors.h +f:arch/arm/include/asm/linkage.h +f:arch/arm/include/asm/mach/arch.h +f:arch/arm/include/asm/mach/dma.h +f:arch/arm/include/asm/mach/flash.h +f:arch/arm/include/asm/mach/irq.h +f:arch/arm/include/asm/mach/map.h +f:arch/arm/include/asm/mach/pci.h +f:arch/arm/include/asm/mach/sharpsl_param.h +f:arch/arm/include/asm/mach/time.h +f:arch/arm/include/asm/mc146818rtc.h +f:arch/arm/include/asm/mcpm.h +f:arch/arm/include/asm/mcs_spinlock.h +f:arch/arm/include/asm/memblock.h +f:arch/arm/include/asm/memory.h +f:arch/arm/include/asm/mman.h +f:arch/arm/include/asm/mmu.h +f:arch/arm/include/asm/mmu_context.h +f:arch/arm/include/asm/module.h +f:arch/arm/include/asm/module.lds.h +f:arch/arm/include/asm/mpu.h +f:arch/arm/include/asm/mtd-xip.h +f:arch/arm/include/asm/neon.h +f:arch/arm/include/asm/nwflash.h +f:arch/arm/include/asm/opcodes-sec.h +f:arch/arm/include/asm/opcodes-virt.h +f:arch/arm/include/asm/opcodes.h +f:arch/arm/include/asm/outercache.h +f:arch/arm/include/asm/page-nommu.h +f:arch/arm/include/asm/page.h +f:arch/arm/include/asm/paravirt.h +f:arch/arm/include/asm/paravirt_api_clock.h +f:arch/arm/include/asm/pci.h +f:arch/arm/include/asm/percpu.h +f:arch/arm/include/asm/perf_event.h +f:arch/arm/include/asm/pgalloc.h +f:arch/arm/include/asm/pgtable-2level-hwdef.h +f:arch/arm/include/asm/pgtable-2level-types.h +f:arch/arm/include/asm/pgtable-2level.h +f:arch/arm/include/asm/pgtable-3level-hwdef.h +f:arch/arm/include/asm/pgtable-3level-types.h +f:arch/arm/include/asm/pgtable-3level.h +f:arch/arm/include/asm/pgtable-hwdef.h +f:arch/arm/include/asm/pgtable-nommu.h +f:arch/arm/include/asm/pgtable.h +f:arch/arm/include/asm/probes.h +f:arch/arm/include/asm/proc-fns.h +f:arch/arm/include/asm/processor.h +f:arch/arm/include/asm/procinfo.h +f:arch/arm/include/asm/prom.h +f:arch/arm/include/asm/psci.h +f:arch/arm/include/asm/ptdump.h +f:arch/arm/include/asm/ptrace.h +f:arch/arm/include/asm/seccomp.h +f:arch/arm/include/asm/sections.h +f:arch/arm/include/asm/secure_cntvoff.h +f:arch/arm/include/asm/semihost.h +f:arch/arm/include/asm/set_memory.h +f:arch/arm/include/asm/setup.h +f:arch/arm/include/asm/shmparam.h +f:arch/arm/include/asm/signal.h +f:arch/arm/include/asm/simd.h +f:arch/arm/include/asm/smp.h +f:arch/arm/include/asm/smp_plat.h +f:arch/arm/include/asm/smp_scu.h +f:arch/arm/include/asm/smp_twd.h +f:arch/arm/include/asm/sparsemem.h +f:arch/arm/include/asm/spectre.h +f:arch/arm/include/asm/spinlock.h +f:arch/arm/include/asm/spinlock_types.h +f:arch/arm/include/asm/stackprotector.h +f:arch/arm/include/asm/stacktrace.h +f:arch/arm/include/asm/string.h +f:arch/arm/include/asm/suspend.h +f:arch/arm/include/asm/swab.h +f:arch/arm/include/asm/switch_to.h +f:arch/arm/include/asm/sync_bitops.h +f:arch/arm/include/asm/syscall.h +f:arch/arm/include/asm/syscalls.h +f:arch/arm/include/asm/system_info.h +f:arch/arm/include/asm/system_misc.h +f:arch/arm/include/asm/tcm.h +f:arch/arm/include/asm/text-patching.h +f:arch/arm/include/asm/therm.h +f:arch/arm/include/asm/thread_info.h +f:arch/arm/include/asm/thread_notify.h +f:arch/arm/include/asm/timex.h +f:arch/arm/include/asm/tlb.h +f:arch/arm/include/asm/tlbflush.h +f:arch/arm/include/asm/tls.h +f:arch/arm/include/asm/topology.h +f:arch/arm/include/asm/traps.h +f:arch/arm/include/asm/uaccess-asm.h +f:arch/arm/include/asm/uaccess.h +f:arch/arm/include/asm/ucontext.h +f:arch/arm/include/asm/unified.h +f:arch/arm/include/asm/unistd.h +f:arch/arm/include/asm/unwind.h +f:arch/arm/include/asm/uprobes.h +f:arch/arm/include/asm/user.h +f:arch/arm/include/asm/v7m.h +f:arch/arm/include/asm/vdso.h +f:arch/arm/include/asm/vdso/clocksource.h +f:arch/arm/include/asm/vdso/cp15.h +f:arch/arm/include/asm/vdso/gettimeofday.h +f:arch/arm/include/asm/vdso/processor.h +f:arch/arm/include/asm/vdso/vsyscall.h +f:arch/arm/include/asm/vermagic.h +f:arch/arm/include/asm/vfp.h +f:arch/arm/include/asm/vfpmacros.h +f:arch/arm/include/asm/vga.h +f:arch/arm/include/asm/virt.h +f:arch/arm/include/asm/vmalloc.h +f:arch/arm/include/asm/vmlinux.lds.h +f:arch/arm/include/asm/word-at-a-time.h +f:arch/arm/include/asm/xen/events.h +f:arch/arm/include/asm/xen/hypercall.h +f:arch/arm/include/asm/xen/hypervisor.h +f:arch/arm/include/asm/xen/interface.h +f:arch/arm/include/asm/xen/page.h +f:arch/arm/include/asm/xen/swiotlb-xen.h +f:arch/arm/include/asm/xen/xen-ops.h +f:arch/arm/include/asm/xor.h +f:arch/arm/include/debug/8250.S +f:arch/arm/include/debug/asm9260.S +f:arch/arm/include/debug/at91.S +f:arch/arm/include/debug/bcm63xx.S +f:arch/arm/include/debug/brcmstb.S +f:arch/arm/include/debug/clps711x.S +f:arch/arm/include/debug/dc21285.S +f:arch/arm/include/debug/digicolor.S +f:arch/arm/include/debug/exynos.S +f:arch/arm/include/debug/icedcc.S +f:arch/arm/include/debug/imx-uart.h +f:arch/arm/include/debug/imx.S +f:arch/arm/include/debug/meson.S +f:arch/arm/include/debug/msm.S +f:arch/arm/include/debug/omap2plus.S +f:arch/arm/include/debug/palmchip.S +f:arch/arm/include/debug/pl01x.S +f:arch/arm/include/debug/renesas-scif.S +f:arch/arm/include/debug/s3c24xx.S +f:arch/arm/include/debug/s5pv210.S +f:arch/arm/include/debug/sa1100.S +f:arch/arm/include/debug/samsung.S +f:arch/arm/include/debug/sti.S +f:arch/arm/include/debug/stm32.S +f:arch/arm/include/debug/tegra.S +f:arch/arm/include/debug/uncompress.h +f:arch/arm/include/debug/ux500.S +f:arch/arm/include/debug/vexpress.S +f:arch/arm/include/debug/vf.S +f:arch/arm/include/debug/vt8500.S +f:arch/arm/include/debug/zynq.S +f:arch/arm/include/uapi/asm/Kbuild +f:arch/arm/include/uapi/asm/auxvec.h +f:arch/arm/include/uapi/asm/byteorder.h +f:arch/arm/include/uapi/asm/fcntl.h +f:arch/arm/include/uapi/asm/hwcap.h +f:arch/arm/include/uapi/asm/ioctls.h +f:arch/arm/include/uapi/asm/mman.h +f:arch/arm/include/uapi/asm/perf_regs.h +f:arch/arm/include/uapi/asm/posix_types.h +f:arch/arm/include/uapi/asm/ptrace.h +f:arch/arm/include/uapi/asm/setup.h +f:arch/arm/include/uapi/asm/sigcontext.h +f:arch/arm/include/uapi/asm/signal.h +f:arch/arm/include/uapi/asm/stat.h +f:arch/arm/include/uapi/asm/statfs.h +f:arch/arm/include/uapi/asm/swab.h +f:arch/arm/include/uapi/asm/types.h +f:arch/arm/include/uapi/asm/unistd.h +f:arch/arm/kernel/.gitignore +f:arch/arm/kernel/Makefile +f:arch/arm/kernel/arch_timer.c +f:arch/arm/kernel/armksyms.c +f:arch/arm/kernel/asm-offsets.c +f:arch/arm/kernel/atags.h +f:arch/arm/kernel/atags_compat.c +f:arch/arm/kernel/atags_parse.c +f:arch/arm/kernel/atags_proc.c +f:arch/arm/kernel/bios32.c +f:arch/arm/kernel/bugs.c +f:arch/arm/kernel/cacheinfo.c +f:arch/arm/kernel/cpuidle.c +f:arch/arm/kernel/crash_dump.c +f:arch/arm/kernel/debug.S +f:arch/arm/kernel/devtree.c +f:arch/arm/kernel/dma.c +f:arch/arm/kernel/early_printk.c +f:arch/arm/kernel/efi.c +f:arch/arm/kernel/elf.c +f:arch/arm/kernel/entry-armv.S +f:arch/arm/kernel/entry-common.S +f:arch/arm/kernel/entry-ftrace.S +f:arch/arm/kernel/entry-header.S +f:arch/arm/kernel/entry-v7m.S +f:arch/arm/kernel/fiq.c +f:arch/arm/kernel/fiqasm.S +f:arch/arm/kernel/ftrace.c +f:arch/arm/kernel/head-common.S +f:arch/arm/kernel/head-inflate-data.c +f:arch/arm/kernel/head-nommu.S +f:arch/arm/kernel/head.S +f:arch/arm/kernel/head.h +f:arch/arm/kernel/hibernate.c +f:arch/arm/kernel/hw_breakpoint.c +f:arch/arm/kernel/hyp-stub.S +f:arch/arm/kernel/insn.c +f:arch/arm/kernel/io.c +f:arch/arm/kernel/irq.c +f:arch/arm/kernel/isa.c +f:arch/arm/kernel/iwmmxt.S +f:arch/arm/kernel/iwmmxt.h +f:arch/arm/kernel/jump_label.c +f:arch/arm/kernel/kgdb.c +f:arch/arm/kernel/machine_kexec.c +f:arch/arm/kernel/module-plts.c +f:arch/arm/kernel/module.c +f:arch/arm/kernel/opcodes.c +f:arch/arm/kernel/paravirt.c +f:arch/arm/kernel/patch.c +f:arch/arm/kernel/perf_callchain.c +f:arch/arm/kernel/perf_regs.c +f:arch/arm/kernel/phys2virt.S +f:arch/arm/kernel/process.c +f:arch/arm/kernel/psci_smp.c +f:arch/arm/kernel/ptrace.c +f:arch/arm/kernel/reboot.c +f:arch/arm/kernel/reboot.h +f:arch/arm/kernel/relocate_kernel.S +f:arch/arm/kernel/return_address.c +f:arch/arm/kernel/setup.c +f:arch/arm/kernel/signal.c +f:arch/arm/kernel/signal.h +f:arch/arm/kernel/sigreturn_codes.S +f:arch/arm/kernel/sleep.S +f:arch/arm/kernel/smccc-call.S +f:arch/arm/kernel/smp.c +f:arch/arm/kernel/smp_scu.c +f:arch/arm/kernel/smp_tlb.c +f:arch/arm/kernel/smp_twd.c +f:arch/arm/kernel/spectre.c +f:arch/arm/kernel/stacktrace.c +f:arch/arm/kernel/suspend.c +f:arch/arm/kernel/swp_emulate.c +f:arch/arm/kernel/sys_arm.c +f:arch/arm/kernel/sys_oabi-compat.c +f:arch/arm/kernel/tcm.c +f:arch/arm/kernel/thumbee.c +f:arch/arm/kernel/time.c +f:arch/arm/kernel/topology.c +f:arch/arm/kernel/traps.c +f:arch/arm/kernel/unwind.c +f:arch/arm/kernel/v7m.c +f:arch/arm/kernel/vdso.c +f:arch/arm/kernel/vmcore_info.c +f:arch/arm/kernel/vmlinux-xip.lds.S +f:arch/arm/kernel/vmlinux.lds.S +f:arch/arm/kernel/xscale-cp0.c +f:arch/arm/lib/.gitignore +f:arch/arm/lib/Makefile +f:arch/arm/lib/ashldi3.S +f:arch/arm/lib/ashrdi3.S +f:arch/arm/lib/backtrace-clang.S +f:arch/arm/lib/backtrace.S +f:arch/arm/lib/bitops.h +f:arch/arm/lib/bswapsdi2.S +f:arch/arm/lib/call_with_stack.S +f:arch/arm/lib/changebit.S +f:arch/arm/lib/clear_user.S +f:arch/arm/lib/clearbit.S +f:arch/arm/lib/copy_from_user.S +f:arch/arm/lib/copy_page.S +f:arch/arm/lib/copy_template.S +f:arch/arm/lib/copy_to_user.S +f:arch/arm/lib/csumipv6.S +f:arch/arm/lib/csumpartial.S +f:arch/arm/lib/csumpartialcopy.S +f:arch/arm/lib/csumpartialcopygeneric.S +f:arch/arm/lib/csumpartialcopyuser.S +f:arch/arm/lib/delay-loop.S +f:arch/arm/lib/delay.c +f:arch/arm/lib/div64.S +f:arch/arm/lib/error-inject.c +f:arch/arm/lib/findbit.S +f:arch/arm/lib/getuser.S +f:arch/arm/lib/io-readsb.S +f:arch/arm/lib/io-readsl.S +f:arch/arm/lib/io-readsw-armv3.S +f:arch/arm/lib/io-readsw-armv4.S +f:arch/arm/lib/io-writesb.S +f:arch/arm/lib/io-writesl.S +f:arch/arm/lib/io-writesw-armv3.S +f:arch/arm/lib/io-writesw-armv4.S +f:arch/arm/lib/lib1funcs.S +f:arch/arm/lib/lshrdi3.S +f:arch/arm/lib/memchr.S +f:arch/arm/lib/memcpy.S +f:arch/arm/lib/memmove.S +f:arch/arm/lib/memset.S +f:arch/arm/lib/muldi3.S +f:arch/arm/lib/putuser.S +f:arch/arm/lib/setbit.S +f:arch/arm/lib/strchr.S +f:arch/arm/lib/strrchr.S +f:arch/arm/lib/testchangebit.S +f:arch/arm/lib/testclearbit.S +f:arch/arm/lib/testsetbit.S +f:arch/arm/lib/uaccess_with_memcpy.c +f:arch/arm/lib/ucmpdi2.S +f:arch/arm/lib/xor-neon.c +f:arch/arm/mach-actions/Kconfig +f:arch/arm/mach-actions/Makefile +f:arch/arm/mach-actions/platsmp.c +f:arch/arm/mach-alpine/Kconfig +f:arch/arm/mach-alpine/Makefile +f:arch/arm/mach-alpine/alpine_cpu_pm.c +f:arch/arm/mach-alpine/alpine_cpu_pm.h +f:arch/arm/mach-alpine/alpine_cpu_resume.h +f:arch/arm/mach-alpine/alpine_machine.c +f:arch/arm/mach-alpine/platsmp.c +f:arch/arm/mach-artpec/Kconfig +f:arch/arm/mach-artpec/Makefile +f:arch/arm/mach-artpec/board-artpec6.c +f:arch/arm/mach-aspeed/Kconfig +f:arch/arm/mach-aspeed/Makefile +f:arch/arm/mach-aspeed/platsmp.c +f:arch/arm/mach-at91/.gitignore +f:arch/arm/mach-at91/Kconfig +f:arch/arm/mach-at91/Makefile +f:arch/arm/mach-at91/at91rm9200.c +f:arch/arm/mach-at91/at91sam9.c +f:arch/arm/mach-at91/generic.h +f:arch/arm/mach-at91/pm.c +f:arch/arm/mach-at91/pm.h +f:arch/arm/mach-at91/pm_data-offsets.c +f:arch/arm/mach-at91/pm_suspend.S +f:arch/arm/mach-at91/sam9x60.c +f:arch/arm/mach-at91/sam9x7.c +f:arch/arm/mach-at91/sam_secure.c +f:arch/arm/mach-at91/sam_secure.h +f:arch/arm/mach-at91/sama5.c +f:arch/arm/mach-at91/sama7.c +f:arch/arm/mach-at91/samv7.c +f:arch/arm/mach-axxia/Kconfig +f:arch/arm/mach-axxia/Makefile +f:arch/arm/mach-axxia/axxia.c +f:arch/arm/mach-axxia/platsmp.c +f:arch/arm/mach-bcm/Kconfig +f:arch/arm/mach-bcm/Makefile +f:arch/arm/mach-bcm/bcm2711.c +f:arch/arm/mach-bcm/bcm63xx_pmb.c +f:arch/arm/mach-bcm/bcm63xx_smp.c +f:arch/arm/mach-bcm/bcm63xx_smp.h +f:arch/arm/mach-bcm/bcm_5301x.c +f:arch/arm/mach-bcm/bcm_cygnus.c +f:arch/arm/mach-bcm/bcm_hr2.c +f:arch/arm/mach-bcm/bcm_kona_smc.c +f:arch/arm/mach-bcm/bcm_kona_smc.h +f:arch/arm/mach-bcm/bcm_nsp.c +f:arch/arm/mach-bcm/board_bcm21664.c +f:arch/arm/mach-bcm/board_bcm23550.c +f:arch/arm/mach-bcm/board_bcm281xx.c +f:arch/arm/mach-bcm/board_bcm2835.c +f:arch/arm/mach-bcm/board_bcmbca.c +f:arch/arm/mach-bcm/brcmstb.c +f:arch/arm/mach-bcm/kona_l2_cache.c +f:arch/arm/mach-bcm/kona_l2_cache.h +f:arch/arm/mach-bcm/platsmp-brcmstb.c +f:arch/arm/mach-bcm/platsmp.c +f:arch/arm/mach-bcm/platsmp.h +f:arch/arm/mach-berlin/Kconfig +f:arch/arm/mach-berlin/Makefile +f:arch/arm/mach-berlin/berlin.c +f:arch/arm/mach-berlin/headsmp.S +f:arch/arm/mach-berlin/platsmp.c +f:arch/arm/mach-clps711x/Kconfig +f:arch/arm/mach-clps711x/Makefile +f:arch/arm/mach-clps711x/board-dt.c +f:arch/arm/mach-davinci/Kconfig +f:arch/arm/mach-davinci/Makefile +f:arch/arm/mach-davinci/clock.h +f:arch/arm/mach-davinci/common.c +f:arch/arm/mach-davinci/common.h +f:arch/arm/mach-davinci/cputype.h +f:arch/arm/mach-davinci/da850.c +f:arch/arm/mach-davinci/da8xx-dt.c +f:arch/arm/mach-davinci/da8xx.h +f:arch/arm/mach-davinci/ddr2.h +f:arch/arm/mach-davinci/devices-da8xx.c +f:arch/arm/mach-davinci/hardware.h +f:arch/arm/mach-davinci/irqs.h +f:arch/arm/mach-davinci/mux.c +f:arch/arm/mach-davinci/mux.h +f:arch/arm/mach-davinci/pdata-quirks.c +f:arch/arm/mach-davinci/pm.c +f:arch/arm/mach-davinci/pm.h +f:arch/arm/mach-davinci/pm_domain.c +f:arch/arm/mach-davinci/psc.h +f:arch/arm/mach-davinci/sleep.S +f:arch/arm/mach-davinci/sram.c +f:arch/arm/mach-davinci/sram.h +f:arch/arm/mach-digicolor/Kconfig +f:arch/arm/mach-digicolor/Makefile +f:arch/arm/mach-digicolor/digicolor.c +f:arch/arm/mach-dove/Kconfig +f:arch/arm/mach-dove/Makefile +f:arch/arm/mach-dove/bridge-regs.h +f:arch/arm/mach-dove/cm-a510.c +f:arch/arm/mach-dove/common.c +f:arch/arm/mach-dove/common.h +f:arch/arm/mach-dove/dove.h +f:arch/arm/mach-dove/irq.c +f:arch/arm/mach-dove/irqs.h +f:arch/arm/mach-dove/mpp.c +f:arch/arm/mach-dove/mpp.h +f:arch/arm/mach-dove/pcie.c +f:arch/arm/mach-dove/pm.h +f:arch/arm/mach-ep93xx/Kconfig +f:arch/arm/mach-exynos/Kconfig +f:arch/arm/mach-exynos/Makefile +f:arch/arm/mach-exynos/common.h +f:arch/arm/mach-exynos/exynos-smc.S +f:arch/arm/mach-exynos/exynos.c +f:arch/arm/mach-exynos/firmware.c +f:arch/arm/mach-exynos/headsmp.S +f:arch/arm/mach-exynos/mcpm-exynos.c +f:arch/arm/mach-exynos/platsmp.c +f:arch/arm/mach-exynos/pm.c +f:arch/arm/mach-exynos/sleep.S +f:arch/arm/mach-exynos/smc.h +f:arch/arm/mach-exynos/suspend.c +f:arch/arm/mach-footbridge/Kconfig +f:arch/arm/mach-footbridge/Makefile +f:arch/arm/mach-footbridge/common.c +f:arch/arm/mach-footbridge/common.h +f:arch/arm/mach-footbridge/dc21285-timer.c +f:arch/arm/mach-footbridge/dc21285.c +f:arch/arm/mach-footbridge/dma-isa.c +f:arch/arm/mach-footbridge/ebsa285-pci.c +f:arch/arm/mach-footbridge/ebsa285.c +f:arch/arm/mach-footbridge/include/mach/hardware.h +f:arch/arm/mach-footbridge/include/mach/irqs.h +f:arch/arm/mach-footbridge/include/mach/isa-dma.h +f:arch/arm/mach-footbridge/include/mach/memory.h +f:arch/arm/mach-footbridge/include/mach/uncompress.h +f:arch/arm/mach-footbridge/isa-irq.c +f:arch/arm/mach-footbridge/isa-rtc.c +f:arch/arm/mach-footbridge/isa-timer.c +f:arch/arm/mach-footbridge/isa.c +f:arch/arm/mach-footbridge/netwinder-hw.c +f:arch/arm/mach-footbridge/netwinder-pci.c +f:arch/arm/mach-gemini/Kconfig +f:arch/arm/mach-gemini/Makefile +f:arch/arm/mach-gemini/board-dt.c +f:arch/arm/mach-highbank/Kconfig +f:arch/arm/mach-highbank/Makefile +f:arch/arm/mach-highbank/core.h +f:arch/arm/mach-highbank/highbank.c +f:arch/arm/mach-highbank/pm.c +f:arch/arm/mach-highbank/smc.S +f:arch/arm/mach-highbank/sysregs.h +f:arch/arm/mach-highbank/system.c +f:arch/arm/mach-hisi/Kconfig +f:arch/arm/mach-hisi/Makefile +f:arch/arm/mach-hisi/core.h +f:arch/arm/mach-hisi/hisilicon.c +f:arch/arm/mach-hisi/hotplug.c +f:arch/arm/mach-hisi/platmcpm.c +f:arch/arm/mach-hisi/platsmp.c +f:arch/arm/mach-hpe/Kconfig +f:arch/arm/mach-hpe/Makefile +f:arch/arm/mach-hpe/gxp.c +f:arch/arm/mach-imx/Kconfig +f:arch/arm/mach-imx/Makefile +f:arch/arm/mach-imx/anatop.c +f:arch/arm/mach-imx/avic.c +f:arch/arm/mach-imx/common.h +f:arch/arm/mach-imx/cpu-imx25.c +f:arch/arm/mach-imx/cpu-imx27.c +f:arch/arm/mach-imx/cpu-imx31.c +f:arch/arm/mach-imx/cpu-imx35.c +f:arch/arm/mach-imx/cpu-imx5.c +f:arch/arm/mach-imx/cpu.c +f:arch/arm/mach-imx/cpuidle-imx5.c +f:arch/arm/mach-imx/cpuidle-imx6q.c +f:arch/arm/mach-imx/cpuidle-imx6sl.c +f:arch/arm/mach-imx/cpuidle-imx6sx.c +f:arch/arm/mach-imx/cpuidle-imx7ulp.c +f:arch/arm/mach-imx/cpuidle.h +f:arch/arm/mach-imx/crmregs-imx3.h +f:arch/arm/mach-imx/gpc.c +f:arch/arm/mach-imx/hardware.h +f:arch/arm/mach-imx/headsmp.S +f:arch/arm/mach-imx/hotplug.c +f:arch/arm/mach-imx/iim.h +f:arch/arm/mach-imx/irq-common.c +f:arch/arm/mach-imx/irq-common.h +f:arch/arm/mach-imx/mach-imx1.c +f:arch/arm/mach-imx/mach-imx25.c +f:arch/arm/mach-imx/mach-imx27.c +f:arch/arm/mach-imx/mach-imx31.c +f:arch/arm/mach-imx/mach-imx35.c +f:arch/arm/mach-imx/mach-imx50.c +f:arch/arm/mach-imx/mach-imx51.c +f:arch/arm/mach-imx/mach-imx53.c +f:arch/arm/mach-imx/mach-imx6q.c +f:arch/arm/mach-imx/mach-imx6sl.c +f:arch/arm/mach-imx/mach-imx6sx.c +f:arch/arm/mach-imx/mach-imx6ul.c +f:arch/arm/mach-imx/mach-imx7d-cm4.c +f:arch/arm/mach-imx/mach-imx7d.c +f:arch/arm/mach-imx/mach-imx7ulp.c +f:arch/arm/mach-imx/mach-imxrt.c +f:arch/arm/mach-imx/mach-ls1021a.c +f:arch/arm/mach-imx/mach-vf610.c +f:arch/arm/mach-imx/mm-imx3.c +f:arch/arm/mach-imx/mmdc.c +f:arch/arm/mach-imx/mx27.h +f:arch/arm/mach-imx/mx2x.h +f:arch/arm/mach-imx/mx31.h +f:arch/arm/mach-imx/mx35.h +f:arch/arm/mach-imx/mx3x.h +f:arch/arm/mach-imx/mxc.h +f:arch/arm/mach-imx/platsmp.c +f:arch/arm/mach-imx/pm-imx25.c +f:arch/arm/mach-imx/pm-imx27.c +f:arch/arm/mach-imx/pm-imx5.c +f:arch/arm/mach-imx/pm-imx6.c +f:arch/arm/mach-imx/pm-imx7ulp.c +f:arch/arm/mach-imx/resume-imx6.S +f:arch/arm/mach-imx/src.c +f:arch/arm/mach-imx/ssi-fiq-ksym.c +f:arch/arm/mach-imx/ssi-fiq.S +f:arch/arm/mach-imx/suspend-imx53.S +f:arch/arm/mach-imx/suspend-imx6.S +f:arch/arm/mach-imx/system.c +f:arch/arm/mach-imx/tzic.c +f:arch/arm/mach-ixp4xx/Kconfig +f:arch/arm/mach-ixp4xx/Makefile +f:arch/arm/mach-ixp4xx/ixp4xx-of.c +f:arch/arm/mach-keystone/Kconfig +f:arch/arm/mach-keystone/Makefile +f:arch/arm/mach-keystone/keystone.c +f:arch/arm/mach-lpc18xx/Makefile +f:arch/arm/mach-lpc18xx/board-dt.c +f:arch/arm/mach-lpc32xx/Kconfig +f:arch/arm/mach-lpc32xx/Makefile +f:arch/arm/mach-lpc32xx/common.c +f:arch/arm/mach-lpc32xx/common.h +f:arch/arm/mach-lpc32xx/lpc32xx.h +f:arch/arm/mach-lpc32xx/phy3250.c +f:arch/arm/mach-lpc32xx/pm.c +f:arch/arm/mach-lpc32xx/serial.c +f:arch/arm/mach-lpc32xx/suspend.S +f:arch/arm/mach-mediatek/Kconfig +f:arch/arm/mach-mediatek/Makefile +f:arch/arm/mach-mediatek/mediatek.c +f:arch/arm/mach-mediatek/platsmp.c +f:arch/arm/mach-meson/Kconfig +f:arch/arm/mach-meson/Makefile +f:arch/arm/mach-meson/meson.c +f:arch/arm/mach-meson/platsmp.c +f:arch/arm/mach-milbeaut/Kconfig +f:arch/arm/mach-milbeaut/Makefile +f:arch/arm/mach-milbeaut/platsmp.c +f:arch/arm/mach-mmp/Kconfig +f:arch/arm/mach-mmp/Makefile +f:arch/arm/mach-mmp/addr-map.h +f:arch/arm/mach-mmp/common.c +f:arch/arm/mach-mmp/common.h +f:arch/arm/mach-mmp/mmp-dt.c +f:arch/arm/mach-mmp/mmp2-dt.c +f:arch/arm/mach-mmp/mmp3.c +f:arch/arm/mach-mmp/platsmp.c +f:arch/arm/mach-mmp/regs-timers.h +f:arch/arm/mach-mmp/time.c +f:arch/arm/mach-mstar/Kconfig +f:arch/arm/mach-mstar/Makefile +f:arch/arm/mach-mstar/mstarv7.c +f:arch/arm/mach-mv78xx0/Kconfig +f:arch/arm/mach-mv78xx0/Makefile +f:arch/arm/mach-mv78xx0/bridge-regs.h +f:arch/arm/mach-mv78xx0/buffalo-wxl-setup.c +f:arch/arm/mach-mv78xx0/common.c +f:arch/arm/mach-mv78xx0/common.h +f:arch/arm/mach-mv78xx0/irq.c +f:arch/arm/mach-mv78xx0/irqs.h +f:arch/arm/mach-mv78xx0/mpp.c +f:arch/arm/mach-mv78xx0/mpp.h +f:arch/arm/mach-mv78xx0/mv78xx0.h +f:arch/arm/mach-mv78xx0/pcie.c +f:arch/arm/mach-mvebu/Kconfig +f:arch/arm/mach-mvebu/Makefile +f:arch/arm/mach-mvebu/armada-370-xp.h +f:arch/arm/mach-mvebu/board-v7.c +f:arch/arm/mach-mvebu/coherency.c +f:arch/arm/mach-mvebu/coherency.h +f:arch/arm/mach-mvebu/coherency_ll.S +f:arch/arm/mach-mvebu/common.h +f:arch/arm/mach-mvebu/cpu-reset.c +f:arch/arm/mach-mvebu/dove.c +f:arch/arm/mach-mvebu/headsmp-a9.S +f:arch/arm/mach-mvebu/headsmp.S +f:arch/arm/mach-mvebu/kirkwood-pm.c +f:arch/arm/mach-mvebu/kirkwood-pm.h +f:arch/arm/mach-mvebu/kirkwood.c +f:arch/arm/mach-mvebu/kirkwood.h +f:arch/arm/mach-mvebu/mvebu-soc-id.c +f:arch/arm/mach-mvebu/mvebu-soc-id.h +f:arch/arm/mach-mvebu/platsmp-a9.c +f:arch/arm/mach-mvebu/platsmp.c +f:arch/arm/mach-mvebu/pm-board.c +f:arch/arm/mach-mvebu/pm.c +f:arch/arm/mach-mvebu/pmsu.c +f:arch/arm/mach-mvebu/pmsu.h +f:arch/arm/mach-mvebu/pmsu_ll.S +f:arch/arm/mach-mvebu/system-controller.c +f:arch/arm/mach-mxs/Kconfig +f:arch/arm/mach-mxs/Makefile +f:arch/arm/mach-mxs/mach-mxs.c +f:arch/arm/mach-mxs/pm.c +f:arch/arm/mach-mxs/pm.h +f:arch/arm/mach-nomadik/Kconfig +f:arch/arm/mach-nomadik/Makefile +f:arch/arm/mach-nomadik/cpu-8815.c +f:arch/arm/mach-npcm/Kconfig +f:arch/arm/mach-npcm/Makefile +f:arch/arm/mach-npcm/headsmp.S +f:arch/arm/mach-npcm/npcm7xx.c +f:arch/arm/mach-npcm/platsmp.c +f:arch/arm/mach-npcm/wpcm450.c +f:arch/arm/mach-omap1/Kconfig +f:arch/arm/mach-omap1/Makefile +f:arch/arm/mach-omap1/ams-delta-fiq-handler.S +f:arch/arm/mach-omap1/ams-delta-fiq.c +f:arch/arm/mach-omap1/ams-delta-fiq.h +f:arch/arm/mach-omap1/board-ams-delta.c +f:arch/arm/mach-omap1/board-ams-delta.h +f:arch/arm/mach-omap1/board-nokia770.c +f:arch/arm/mach-omap1/board-osk.c +f:arch/arm/mach-omap1/board-palmte.c +f:arch/arm/mach-omap1/board-sx1-mmc.c +f:arch/arm/mach-omap1/board-sx1.c +f:arch/arm/mach-omap1/board-sx1.h +f:arch/arm/mach-omap1/clock.c +f:arch/arm/mach-omap1/clock.h +f:arch/arm/mach-omap1/clock_data.c +f:arch/arm/mach-omap1/common.h +f:arch/arm/mach-omap1/devices.c +f:arch/arm/mach-omap1/dma.c +f:arch/arm/mach-omap1/fb.c +f:arch/arm/mach-omap1/flash.c +f:arch/arm/mach-omap1/flash.h +f:arch/arm/mach-omap1/gpio15xx.c +f:arch/arm/mach-omap1/gpio16xx.c +f:arch/arm/mach-omap1/hardware.h +f:arch/arm/mach-omap1/i2c.c +f:arch/arm/mach-omap1/i2c.h +f:arch/arm/mach-omap1/id.c +f:arch/arm/mach-omap1/io.c +f:arch/arm/mach-omap1/iomap.h +f:arch/arm/mach-omap1/irq.c +f:arch/arm/mach-omap1/irqs.h +f:arch/arm/mach-omap1/mcbsp.c +f:arch/arm/mach-omap1/mmc.h +f:arch/arm/mach-omap1/mtd-xip.h +f:arch/arm/mach-omap1/mux.c +f:arch/arm/mach-omap1/mux.h +f:arch/arm/mach-omap1/ocpi.c +f:arch/arm/mach-omap1/omap-dma.c +f:arch/arm/mach-omap1/opp.h +f:arch/arm/mach-omap1/opp_data.c +f:arch/arm/mach-omap1/pm.c +f:arch/arm/mach-omap1/pm.h +f:arch/arm/mach-omap1/pm_bus.c +f:arch/arm/mach-omap1/reset.c +f:arch/arm/mach-omap1/serial.c +f:arch/arm/mach-omap1/serial.h +f:arch/arm/mach-omap1/sleep.S +f:arch/arm/mach-omap1/soc.h +f:arch/arm/mach-omap1/sram-init.c +f:arch/arm/mach-omap1/sram.S +f:arch/arm/mach-omap1/sram.h +f:arch/arm/mach-omap1/tc.h +f:arch/arm/mach-omap1/time.c +f:arch/arm/mach-omap1/timer.c +f:arch/arm/mach-omap1/timer32k.c +f:arch/arm/mach-omap1/usb.c +f:arch/arm/mach-omap1/usb.h +f:arch/arm/mach-omap2/.gitignore +f:arch/arm/mach-omap2/Kconfig +f:arch/arm/mach-omap2/Makefile +f:arch/arm/mach-omap2/am33xx-restart.c +f:arch/arm/mach-omap2/am33xx.h +f:arch/arm/mach-omap2/board-generic.c +f:arch/arm/mach-omap2/board-n8x0.c +f:arch/arm/mach-omap2/clkt2xxx_dpll.c +f:arch/arm/mach-omap2/clkt2xxx_dpllcore.c +f:arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c +f:arch/arm/mach-omap2/clock.c +f:arch/arm/mach-omap2/clock.h +f:arch/arm/mach-omap2/clock2xxx.h +f:arch/arm/mach-omap2/clockdomain.c +f:arch/arm/mach-omap2/clockdomain.h +f:arch/arm/mach-omap2/clockdomains2420_data.c +f:arch/arm/mach-omap2/clockdomains2430_data.c +f:arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c +f:arch/arm/mach-omap2/clockdomains33xx_data.c +f:arch/arm/mach-omap2/clockdomains3xxx_data.c +f:arch/arm/mach-omap2/clockdomains43xx_data.c +f:arch/arm/mach-omap2/clockdomains44xx_data.c +f:arch/arm/mach-omap2/clockdomains54xx_data.c +f:arch/arm/mach-omap2/clockdomains7xx_data.c +f:arch/arm/mach-omap2/clockdomains81xx_data.c +f:arch/arm/mach-omap2/cm-regbits-24xx.h +f:arch/arm/mach-omap2/cm-regbits-33xx.h +f:arch/arm/mach-omap2/cm-regbits-34xx.h +f:arch/arm/mach-omap2/cm-regbits-44xx.h +f:arch/arm/mach-omap2/cm-regbits-54xx.h +f:arch/arm/mach-omap2/cm-regbits-7xx.h +f:arch/arm/mach-omap2/cm.h +f:arch/arm/mach-omap2/cm1_44xx.h +f:arch/arm/mach-omap2/cm1_54xx.h +f:arch/arm/mach-omap2/cm1_7xx.h +f:arch/arm/mach-omap2/cm2_44xx.h +f:arch/arm/mach-omap2/cm2_54xx.h +f:arch/arm/mach-omap2/cm2_7xx.h +f:arch/arm/mach-omap2/cm2xxx.c +f:arch/arm/mach-omap2/cm2xxx.h +f:arch/arm/mach-omap2/cm2xxx_3xxx.h +f:arch/arm/mach-omap2/cm33xx.c +f:arch/arm/mach-omap2/cm33xx.h +f:arch/arm/mach-omap2/cm3xxx.c +f:arch/arm/mach-omap2/cm3xxx.h +f:arch/arm/mach-omap2/cm44xx.h +f:arch/arm/mach-omap2/cm81xx.h +f:arch/arm/mach-omap2/cm_common.c +f:arch/arm/mach-omap2/cminst44xx.c +f:arch/arm/mach-omap2/common-board-devices.h +f:arch/arm/mach-omap2/common.c +f:arch/arm/mach-omap2/common.h +f:arch/arm/mach-omap2/control.c +f:arch/arm/mach-omap2/control.h +f:arch/arm/mach-omap2/cpuidle34xx.c +f:arch/arm/mach-omap2/cpuidle44xx.c +f:arch/arm/mach-omap2/ctrl_module_wkup_44xx.h +f:arch/arm/mach-omap2/devices.c +f:arch/arm/mach-omap2/display.c +f:arch/arm/mach-omap2/display.h +f:arch/arm/mach-omap2/dma.c +f:arch/arm/mach-omap2/fb.c +f:arch/arm/mach-omap2/gpmc.h +f:arch/arm/mach-omap2/hdq1w.c +f:arch/arm/mach-omap2/hdq1w.h +f:arch/arm/mach-omap2/i2c.c +f:arch/arm/mach-omap2/i2c.h +f:arch/arm/mach-omap2/id.c +f:arch/arm/mach-omap2/id.h +f:arch/arm/mach-omap2/io.c +f:arch/arm/mach-omap2/iomap.h +f:arch/arm/mach-omap2/l3_2xxx.h +f:arch/arm/mach-omap2/l3_3xxx.h +f:arch/arm/mach-omap2/l4_2xxx.h +f:arch/arm/mach-omap2/l4_3xxx.h +f:arch/arm/mach-omap2/mcbsp.c +f:arch/arm/mach-omap2/mmc.h +f:arch/arm/mach-omap2/msdi.c +f:arch/arm/mach-omap2/omap-headsmp.S +f:arch/arm/mach-omap2/omap-hotplug.c +f:arch/arm/mach-omap2/omap-iommu.c +f:arch/arm/mach-omap2/omap-mpuss-lowpower.c +f:arch/arm/mach-omap2/omap-secure.c +f:arch/arm/mach-omap2/omap-secure.h +f:arch/arm/mach-omap2/omap-smc.S +f:arch/arm/mach-omap2/omap-smp.c +f:arch/arm/mach-omap2/omap-wakeupgen.c +f:arch/arm/mach-omap2/omap-wakeupgen.h +f:arch/arm/mach-omap2/omap2-restart.c +f:arch/arm/mach-omap2/omap24xx.h +f:arch/arm/mach-omap2/omap3-restart.c +f:arch/arm/mach-omap2/omap34xx.h +f:arch/arm/mach-omap2/omap4-common.c +f:arch/arm/mach-omap2/omap4-restart.c +f:arch/arm/mach-omap2/omap4-sar-layout.h +f:arch/arm/mach-omap2/omap44xx.h +f:arch/arm/mach-omap2/omap54xx.h +f:arch/arm/mach-omap2/omap_device.c +f:arch/arm/mach-omap2/omap_device.h +f:arch/arm/mach-omap2/omap_hwmod.c +f:arch/arm/mach-omap2/omap_hwmod.h +f:arch/arm/mach-omap2/omap_hwmod_2420_data.c +f:arch/arm/mach-omap2/omap_hwmod_2430_data.c +f:arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c +f:arch/arm/mach-omap2/omap_hwmod_2xxx_interconnect_data.c +f:arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +f:arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +f:arch/arm/mach-omap2/omap_hwmod_81xx_data.c +f:arch/arm/mach-omap2/omap_hwmod_common_data.c +f:arch/arm/mach-omap2/omap_hwmod_common_data.h +f:arch/arm/mach-omap2/omap_hwmod_common_ipblock_data.c +f:arch/arm/mach-omap2/omap_opp_data.h +f:arch/arm/mach-omap2/omap_phy_internal.c +f:arch/arm/mach-omap2/omap_twl.c +f:arch/arm/mach-omap2/opp2420_data.c +f:arch/arm/mach-omap2/opp2430_data.c +f:arch/arm/mach-omap2/opp2xxx.h +f:arch/arm/mach-omap2/opp3xxx_data.c +f:arch/arm/mach-omap2/opp4xxx_data.c +f:arch/arm/mach-omap2/pdata-quirks.c +f:arch/arm/mach-omap2/pm-asm-offsets.c +f:arch/arm/mach-omap2/pm-debug.c +f:arch/arm/mach-omap2/pm.c +f:arch/arm/mach-omap2/pm.h +f:arch/arm/mach-omap2/pm33xx-core.c +f:arch/arm/mach-omap2/pm34xx.c +f:arch/arm/mach-omap2/pm44xx.c +f:arch/arm/mach-omap2/pmic-cpcap.c +f:arch/arm/mach-omap2/powerdomain-common.c +f:arch/arm/mach-omap2/powerdomain.c +f:arch/arm/mach-omap2/powerdomain.h +f:arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c +f:arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.h +f:arch/arm/mach-omap2/powerdomains2xxx_data.c +f:arch/arm/mach-omap2/powerdomains33xx_data.c +f:arch/arm/mach-omap2/powerdomains3xxx_data.c +f:arch/arm/mach-omap2/powerdomains43xx_data.c +f:arch/arm/mach-omap2/powerdomains44xx_data.c +f:arch/arm/mach-omap2/powerdomains54xx_data.c +f:arch/arm/mach-omap2/powerdomains7xx_data.c +f:arch/arm/mach-omap2/prcm-common.h +f:arch/arm/mach-omap2/prcm43xx.h +f:arch/arm/mach-omap2/prcm44xx.h +f:arch/arm/mach-omap2/prcm_mpu44xx.c +f:arch/arm/mach-omap2/prcm_mpu44xx.h +f:arch/arm/mach-omap2/prcm_mpu54xx.h +f:arch/arm/mach-omap2/prcm_mpu7xx.h +f:arch/arm/mach-omap2/prcm_mpu_44xx_54xx.h +f:arch/arm/mach-omap2/prm-regbits-24xx.h +f:arch/arm/mach-omap2/prm-regbits-33xx.h +f:arch/arm/mach-omap2/prm-regbits-34xx.h +f:arch/arm/mach-omap2/prm-regbits-44xx.h +f:arch/arm/mach-omap2/prm.h +f:arch/arm/mach-omap2/prm2xxx.c +f:arch/arm/mach-omap2/prm2xxx.h +f:arch/arm/mach-omap2/prm2xxx_3xxx.c +f:arch/arm/mach-omap2/prm2xxx_3xxx.h +f:arch/arm/mach-omap2/prm33xx.c +f:arch/arm/mach-omap2/prm33xx.h +f:arch/arm/mach-omap2/prm3xxx.c +f:arch/arm/mach-omap2/prm3xxx.h +f:arch/arm/mach-omap2/prm44xx.c +f:arch/arm/mach-omap2/prm44xx.h +f:arch/arm/mach-omap2/prm44xx_54xx.h +f:arch/arm/mach-omap2/prm54xx.h +f:arch/arm/mach-omap2/prm7xx.h +f:arch/arm/mach-omap2/prm_common.c +f:arch/arm/mach-omap2/prminst44xx.c +f:arch/arm/mach-omap2/prminst44xx.h +f:arch/arm/mach-omap2/scrm44xx.h +f:arch/arm/mach-omap2/sdrc.c +f:arch/arm/mach-omap2/sdrc.h +f:arch/arm/mach-omap2/sdrc2xxx.c +f:arch/arm/mach-omap2/sleep24xx.S +f:arch/arm/mach-omap2/sleep33xx.S +f:arch/arm/mach-omap2/sleep34xx.S +f:arch/arm/mach-omap2/sleep43xx.S +f:arch/arm/mach-omap2/sleep44xx.S +f:arch/arm/mach-omap2/smartreflex-class3.c +f:arch/arm/mach-omap2/soc.h +f:arch/arm/mach-omap2/sr_device.c +f:arch/arm/mach-omap2/sram.c +f:arch/arm/mach-omap2/sram.h +f:arch/arm/mach-omap2/sram242x.S +f:arch/arm/mach-omap2/sram243x.S +f:arch/arm/mach-omap2/ti81xx-restart.c +f:arch/arm/mach-omap2/ti81xx.h +f:arch/arm/mach-omap2/timer.c +f:arch/arm/mach-omap2/usb-tusb6010.c +f:arch/arm/mach-omap2/usb-tusb6010.h +f:arch/arm/mach-omap2/vc.c +f:arch/arm/mach-omap2/vc.h +f:arch/arm/mach-omap2/vc3xxx_data.c +f:arch/arm/mach-omap2/vc44xx_data.c +f:arch/arm/mach-omap2/voltage.c +f:arch/arm/mach-omap2/voltage.h +f:arch/arm/mach-omap2/voltagedomains2xxx_data.c +f:arch/arm/mach-omap2/voltagedomains3xxx_data.c +f:arch/arm/mach-omap2/voltagedomains44xx_data.c +f:arch/arm/mach-omap2/voltagedomains54xx_data.c +f:arch/arm/mach-omap2/vp.c +f:arch/arm/mach-omap2/vp.h +f:arch/arm/mach-omap2/vp3xxx_data.c +f:arch/arm/mach-omap2/vp44xx_data.c +f:arch/arm/mach-omap2/wd_timer.c +f:arch/arm/mach-omap2/wd_timer.h +f:arch/arm/mach-orion5x/Kconfig +f:arch/arm/mach-orion5x/Makefile +f:arch/arm/mach-orion5x/board-d2net.c +f:arch/arm/mach-orion5x/board-dt.c +f:arch/arm/mach-orion5x/board-mss2.c +f:arch/arm/mach-orion5x/board-rd88f5182.c +f:arch/arm/mach-orion5x/bridge-regs.h +f:arch/arm/mach-orion5x/common.c +f:arch/arm/mach-orion5x/common.h +f:arch/arm/mach-orion5x/dns323-setup.c +f:arch/arm/mach-orion5x/irq.c +f:arch/arm/mach-orion5x/irqs.h +f:arch/arm/mach-orion5x/kurobox_pro-setup.c +f:arch/arm/mach-orion5x/mpp.c +f:arch/arm/mach-orion5x/mpp.h +f:arch/arm/mach-orion5x/mv2120-setup.c +f:arch/arm/mach-orion5x/net2big-setup.c +f:arch/arm/mach-orion5x/orion5x.h +f:arch/arm/mach-orion5x/pci.c +f:arch/arm/mach-orion5x/terastation_pro2-setup.c +f:arch/arm/mach-orion5x/ts209-setup.c +f:arch/arm/mach-orion5x/ts409-setup.c +f:arch/arm/mach-orion5x/ts78xx-fpga.h +f:arch/arm/mach-orion5x/ts78xx-setup.c +f:arch/arm/mach-orion5x/tsx09-common.c +f:arch/arm/mach-orion5x/tsx09-common.h +f:arch/arm/mach-pxa/Kconfig +f:arch/arm/mach-pxa/Makefile +f:arch/arm/mach-pxa/addr-map.h +f:arch/arm/mach-pxa/am200epd.c +f:arch/arm/mach-pxa/am300epd.c +f:arch/arm/mach-pxa/devices.c +f:arch/arm/mach-pxa/devices.h +f:arch/arm/mach-pxa/generic.c +f:arch/arm/mach-pxa/generic.h +f:arch/arm/mach-pxa/gumstix.c +f:arch/arm/mach-pxa/gumstix.h +f:arch/arm/mach-pxa/irq.c +f:arch/arm/mach-pxa/irqs.h +f:arch/arm/mach-pxa/mfp-pxa25x.h +f:arch/arm/mach-pxa/mfp-pxa27x.h +f:arch/arm/mach-pxa/mfp-pxa2xx.c +f:arch/arm/mach-pxa/mfp-pxa2xx.h +f:arch/arm/mach-pxa/mfp-pxa300.h +f:arch/arm/mach-pxa/mfp-pxa320.h +f:arch/arm/mach-pxa/mfp-pxa3xx.c +f:arch/arm/mach-pxa/mfp-pxa3xx.h +f:arch/arm/mach-pxa/mfp.h +f:arch/arm/mach-pxa/pm.c +f:arch/arm/mach-pxa/pm.h +f:arch/arm/mach-pxa/pxa-dt.c +f:arch/arm/mach-pxa/pxa-regs.h +f:arch/arm/mach-pxa/pxa25x.c +f:arch/arm/mach-pxa/pxa25x.h +f:arch/arm/mach-pxa/pxa27x-udc.h +f:arch/arm/mach-pxa/pxa27x.c +f:arch/arm/mach-pxa/pxa27x.h +f:arch/arm/mach-pxa/pxa2xx-regs.h +f:arch/arm/mach-pxa/pxa2xx.c +f:arch/arm/mach-pxa/pxa300.c +f:arch/arm/mach-pxa/pxa300.h +f:arch/arm/mach-pxa/pxa320.c +f:arch/arm/mach-pxa/pxa320.h +f:arch/arm/mach-pxa/pxa3xx-regs.h +f:arch/arm/mach-pxa/pxa3xx.c +f:arch/arm/mach-pxa/pxa3xx.h +f:arch/arm/mach-pxa/regs-ost.h +f:arch/arm/mach-pxa/regs-rtc.h +f:arch/arm/mach-pxa/reset.c +f:arch/arm/mach-pxa/reset.h +f:arch/arm/mach-pxa/sharpsl_pm.c +f:arch/arm/mach-pxa/sharpsl_pm.h +f:arch/arm/mach-pxa/sleep.S +f:arch/arm/mach-pxa/smemc.c +f:arch/arm/mach-pxa/smemc.h +f:arch/arm/mach-pxa/spitz.c +f:arch/arm/mach-pxa/spitz.h +f:arch/arm/mach-pxa/spitz_pm.c +f:arch/arm/mach-pxa/standby.S +f:arch/arm/mach-pxa/udc.h +f:arch/arm/mach-qcom/Kconfig +f:arch/arm/mach-qcom/Makefile +f:arch/arm/mach-qcom/platsmp.c +f:arch/arm/mach-realtek/Kconfig +f:arch/arm/mach-realtek/Makefile +f:arch/arm/mach-realtek/rtd1195.c +f:arch/arm/mach-rockchip/Kconfig +f:arch/arm/mach-rockchip/Makefile +f:arch/arm/mach-rockchip/core.h +f:arch/arm/mach-rockchip/headsmp.S +f:arch/arm/mach-rockchip/platsmp.c +f:arch/arm/mach-rockchip/pm.c +f:arch/arm/mach-rockchip/pm.h +f:arch/arm/mach-rockchip/rockchip.c +f:arch/arm/mach-rockchip/sleep.S +f:arch/arm/mach-rpc/Kconfig +f:arch/arm/mach-rpc/Makefile +f:arch/arm/mach-rpc/dma.c +f:arch/arm/mach-rpc/ecard-loader.S +f:arch/arm/mach-rpc/ecard.c +f:arch/arm/mach-rpc/ecard.h +f:arch/arm/mach-rpc/fiq.S +f:arch/arm/mach-rpc/floppydma.S +f:arch/arm/mach-rpc/include/mach/acornfb.h +f:arch/arm/mach-rpc/include/mach/hardware.h +f:arch/arm/mach-rpc/include/mach/io.h +f:arch/arm/mach-rpc/include/mach/irqs.h +f:arch/arm/mach-rpc/include/mach/isa-dma.h +f:arch/arm/mach-rpc/include/mach/memory.h +f:arch/arm/mach-rpc/include/mach/uncompress.h +f:arch/arm/mach-rpc/io-acorn.S +f:arch/arm/mach-rpc/irq.c +f:arch/arm/mach-rpc/riscpc.c +f:arch/arm/mach-rpc/time.c +f:arch/arm/mach-s3c/Kconfig +f:arch/arm/mach-s3c/Kconfig.s3c64xx +f:arch/arm/mach-s3c/Makefile +f:arch/arm/mach-s3c/Makefile.s3c64xx +f:arch/arm/mach-s3c/cpu.c +f:arch/arm/mach-s3c/cpu.h +f:arch/arm/mach-s3c/cpuidle-s3c64xx.c +f:arch/arm/mach-s3c/crag6410.h +f:arch/arm/mach-s3c/dev-audio-s3c64xx.c +f:arch/arm/mach-s3c/dev-uart-s3c64xx.c +f:arch/arm/mach-s3c/dev-uart.c +f:arch/arm/mach-s3c/devs.c +f:arch/arm/mach-s3c/devs.h +f:arch/arm/mach-s3c/fb.h +f:arch/arm/mach-s3c/gpio-cfg-helpers.h +f:arch/arm/mach-s3c/gpio-cfg.h +f:arch/arm/mach-s3c/gpio-core.h +f:arch/arm/mach-s3c/gpio-samsung-s3c64xx.h +f:arch/arm/mach-s3c/gpio-samsung.c +f:arch/arm/mach-s3c/gpio-samsung.h +f:arch/arm/mach-s3c/iic-core.h +f:arch/arm/mach-s3c/init.c +f:arch/arm/mach-s3c/irq-pm-s3c64xx.c +f:arch/arm/mach-s3c/irq-uart-s3c64xx.h +f:arch/arm/mach-s3c/irqs-s3c64xx.h +f:arch/arm/mach-s3c/irqs.h +f:arch/arm/mach-s3c/keypad.h +f:arch/arm/mach-s3c/mach-crag6410-module.c +f:arch/arm/mach-s3c/mach-crag6410.c +f:arch/arm/mach-s3c/mach-s3c64xx-dt.c +f:arch/arm/mach-s3c/map-base.h +f:arch/arm/mach-s3c/map-s3c.h +f:arch/arm/mach-s3c/map-s3c64xx.h +f:arch/arm/mach-s3c/map-s5p.h +f:arch/arm/mach-s3c/map.h +f:arch/arm/mach-s3c/pl080.c +f:arch/arm/mach-s3c/platformdata.c +f:arch/arm/mach-s3c/pm-common.c +f:arch/arm/mach-s3c/pm-common.h +f:arch/arm/mach-s3c/pm-core-s3c64xx.h +f:arch/arm/mach-s3c/pm-core.h +f:arch/arm/mach-s3c/pm-gpio.c +f:arch/arm/mach-s3c/pm-s3c64xx.c +f:arch/arm/mach-s3c/pm.c +f:arch/arm/mach-s3c/pm.h +f:arch/arm/mach-s3c/pwm-core.h +f:arch/arm/mach-s3c/regs-clock-s3c64xx.h +f:arch/arm/mach-s3c/regs-clock.h +f:arch/arm/mach-s3c/regs-gpio-memport-s3c64xx.h +f:arch/arm/mach-s3c/regs-gpio-s3c64xx.h +f:arch/arm/mach-s3c/regs-gpio.h +f:arch/arm/mach-s3c/regs-irq-s3c64xx.h +f:arch/arm/mach-s3c/regs-irq.h +f:arch/arm/mach-s3c/regs-irqtype.h +f:arch/arm/mach-s3c/regs-modem-s3c64xx.h +f:arch/arm/mach-s3c/regs-sys-s3c64xx.h +f:arch/arm/mach-s3c/regs-syscon-power-s3c64xx.h +f:arch/arm/mach-s3c/regs-usb-hsotg-phy-s3c64xx.h +f:arch/arm/mach-s3c/s3c6410.c +f:arch/arm/mach-s3c/s3c64xx.c +f:arch/arm/mach-s3c/s3c64xx.h +f:arch/arm/mach-s3c/sdhci.h +f:arch/arm/mach-s3c/setup-fb-24bpp-s3c64xx.c +f:arch/arm/mach-s3c/setup-i2c0-s3c64xx.c +f:arch/arm/mach-s3c/setup-i2c1-s3c64xx.c +f:arch/arm/mach-s3c/setup-keypad-s3c64xx.c +f:arch/arm/mach-s3c/setup-sdhci-gpio-s3c64xx.c +f:arch/arm/mach-s3c/setup-spi-s3c64xx.c +f:arch/arm/mach-s3c/setup-usb-phy-s3c64xx.c +f:arch/arm/mach-s3c/sleep-s3c64xx.S +f:arch/arm/mach-s3c/usb-phy.h +f:arch/arm/mach-s3c/wakeup-mask.c +f:arch/arm/mach-s3c/wakeup-mask.h +f:arch/arm/mach-s5pv210/Kconfig +f:arch/arm/mach-s5pv210/Makefile +f:arch/arm/mach-s5pv210/common.h +f:arch/arm/mach-s5pv210/pm.c +f:arch/arm/mach-s5pv210/regs-clock.h +f:arch/arm/mach-s5pv210/s5pv210.c +f:arch/arm/mach-s5pv210/sleep.S +f:arch/arm/mach-sa1100/Kconfig +f:arch/arm/mach-sa1100/Makefile +f:arch/arm/mach-sa1100/assabet.c +f:arch/arm/mach-sa1100/clock.c +f:arch/arm/mach-sa1100/collie.c +f:arch/arm/mach-sa1100/generic.c +f:arch/arm/mach-sa1100/generic.h +f:arch/arm/mach-sa1100/h3600.c +f:arch/arm/mach-sa1100/h3xxx.c +f:arch/arm/mach-sa1100/include/mach/SA-1100.h +f:arch/arm/mach-sa1100/include/mach/assabet.h +f:arch/arm/mach-sa1100/include/mach/bitfield.h +f:arch/arm/mach-sa1100/include/mach/collie.h +f:arch/arm/mach-sa1100/include/mach/generic.h +f:arch/arm/mach-sa1100/include/mach/h3xxx.h +f:arch/arm/mach-sa1100/include/mach/hardware.h +f:arch/arm/mach-sa1100/include/mach/irqs.h +f:arch/arm/mach-sa1100/include/mach/jornada720.h +f:arch/arm/mach-sa1100/include/mach/memory.h +f:arch/arm/mach-sa1100/include/mach/mtd-xip.h +f:arch/arm/mach-sa1100/include/mach/neponset.h +f:arch/arm/mach-sa1100/include/mach/reset.h +f:arch/arm/mach-sa1100/include/mach/uncompress.h +f:arch/arm/mach-sa1100/jornada720.c +f:arch/arm/mach-sa1100/jornada720_ssp.c +f:arch/arm/mach-sa1100/neponset.c +f:arch/arm/mach-sa1100/pm.c +f:arch/arm/mach-sa1100/sleep.S +f:arch/arm/mach-sa1100/ssp.c +f:arch/arm/mach-shmobile/Kconfig +f:arch/arm/mach-shmobile/Makefile +f:arch/arm/mach-shmobile/common.h +f:arch/arm/mach-shmobile/emev2.h +f:arch/arm/mach-shmobile/headsmp-apmu.S +f:arch/arm/mach-shmobile/headsmp-scu.S +f:arch/arm/mach-shmobile/headsmp.S +f:arch/arm/mach-shmobile/platsmp-apmu.c +f:arch/arm/mach-shmobile/platsmp-scu.c +f:arch/arm/mach-shmobile/platsmp.c +f:arch/arm/mach-shmobile/pm-rcar-gen2.c +f:arch/arm/mach-shmobile/r8a7779.h +f:arch/arm/mach-shmobile/rcar-gen2.h +f:arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c +f:arch/arm/mach-shmobile/setup-emev2.c +f:arch/arm/mach-shmobile/setup-r7s72100.c +f:arch/arm/mach-shmobile/setup-r7s9210.c +f:arch/arm/mach-shmobile/setup-r8a73a4.c +f:arch/arm/mach-shmobile/setup-r8a7740.c +f:arch/arm/mach-shmobile/setup-r8a7778.c +f:arch/arm/mach-shmobile/setup-r8a7779.c +f:arch/arm/mach-shmobile/setup-rcar-gen2.c +f:arch/arm/mach-shmobile/setup-sh73a0.c +f:arch/arm/mach-shmobile/sh73a0.h +f:arch/arm/mach-shmobile/smp-emev2.c +f:arch/arm/mach-shmobile/smp-r8a7779.c +f:arch/arm/mach-shmobile/smp-sh73a0.c +f:arch/arm/mach-shmobile/suspend.c +f:arch/arm/mach-shmobile/timer.c +f:arch/arm/mach-socfpga/Kconfig +f:arch/arm/mach-socfpga/Makefile +f:arch/arm/mach-socfpga/core.h +f:arch/arm/mach-socfpga/headsmp.S +f:arch/arm/mach-socfpga/l2_cache.c +f:arch/arm/mach-socfpga/ocram.c +f:arch/arm/mach-socfpga/platsmp.c +f:arch/arm/mach-socfpga/pm.c +f:arch/arm/mach-socfpga/self-refresh.S +f:arch/arm/mach-socfpga/socfpga.c +f:arch/arm/mach-spear/Kconfig +f:arch/arm/mach-spear/Makefile +f:arch/arm/mach-spear/generic.h +f:arch/arm/mach-spear/headsmp.S +f:arch/arm/mach-spear/hotplug.c +f:arch/arm/mach-spear/misc_regs.h +f:arch/arm/mach-spear/pl080.c +f:arch/arm/mach-spear/pl080.h +f:arch/arm/mach-spear/platsmp.c +f:arch/arm/mach-spear/restart.c +f:arch/arm/mach-spear/spear.h +f:arch/arm/mach-spear/spear1310.c +f:arch/arm/mach-spear/spear1340.c +f:arch/arm/mach-spear/spear13xx.c +f:arch/arm/mach-spear/spear300.c +f:arch/arm/mach-spear/spear310.c +f:arch/arm/mach-spear/spear320.c +f:arch/arm/mach-spear/spear3xx.c +f:arch/arm/mach-spear/spear6xx.c +f:arch/arm/mach-spear/time.c +f:arch/arm/mach-sti/Kconfig +f:arch/arm/mach-sti/Makefile +f:arch/arm/mach-sti/board-dt.c +f:arch/arm/mach-sti/platsmp.c +f:arch/arm/mach-sti/smp.h +f:arch/arm/mach-stm32/Kconfig +f:arch/arm/mach-stm32/Makefile +f:arch/arm/mach-stm32/board-dt.c +f:arch/arm/mach-sunxi/Kconfig +f:arch/arm/mach-sunxi/Makefile +f:arch/arm/mach-sunxi/headsmp.S +f:arch/arm/mach-sunxi/mc_smp.c +f:arch/arm/mach-sunxi/platsmp.c +f:arch/arm/mach-sunxi/sunxi.c +f:arch/arm/mach-tegra/Kconfig +f:arch/arm/mach-tegra/Makefile +f:arch/arm/mach-tegra/board-paz00.c +f:arch/arm/mach-tegra/board.h +f:arch/arm/mach-tegra/common.h +f:arch/arm/mach-tegra/hotplug.c +f:arch/arm/mach-tegra/io.c +f:arch/arm/mach-tegra/iomap.h +f:arch/arm/mach-tegra/irammap.h +f:arch/arm/mach-tegra/irq.c +f:arch/arm/mach-tegra/platsmp.c +f:arch/arm/mach-tegra/pm-tegra20.c +f:arch/arm/mach-tegra/pm-tegra30.c +f:arch/arm/mach-tegra/pm.c +f:arch/arm/mach-tegra/pm.h +f:arch/arm/mach-tegra/reset-handler.S +f:arch/arm/mach-tegra/reset.c +f:arch/arm/mach-tegra/reset.h +f:arch/arm/mach-tegra/sleep-tegra20.S +f:arch/arm/mach-tegra/sleep-tegra30.S +f:arch/arm/mach-tegra/sleep.S +f:arch/arm/mach-tegra/sleep.h +f:arch/arm/mach-tegra/tegra.c +f:arch/arm/mach-ux500/Kconfig +f:arch/arm/mach-ux500/Makefile +f:arch/arm/mach-ux500/cpu-db8500.c +f:arch/arm/mach-ux500/platsmp.c +f:arch/arm/mach-ux500/pm.c +f:arch/arm/mach-versatile/Kconfig +f:arch/arm/mach-versatile/Makefile +f:arch/arm/mach-versatile/headsmp.S +f:arch/arm/mach-versatile/hotplug.c +f:arch/arm/mach-versatile/integrator-cm.h +f:arch/arm/mach-versatile/integrator-hardware.h +f:arch/arm/mach-versatile/integrator.c +f:arch/arm/mach-versatile/integrator.h +f:arch/arm/mach-versatile/integrator_ap.c +f:arch/arm/mach-versatile/integrator_cp.c +f:arch/arm/mach-versatile/platsmp-realview.c +f:arch/arm/mach-versatile/platsmp-vexpress.c +f:arch/arm/mach-versatile/platsmp.c +f:arch/arm/mach-versatile/platsmp.h +f:arch/arm/mach-versatile/realview.c +f:arch/arm/mach-versatile/spc.c +f:arch/arm/mach-versatile/spc.h +f:arch/arm/mach-versatile/tc2_pm.c +f:arch/arm/mach-versatile/v2m-mps2.c +f:arch/arm/mach-versatile/v2m.c +f:arch/arm/mach-versatile/versatile.c +f:arch/arm/mach-versatile/vexpress.h +f:arch/arm/mach-vt8500/Kconfig +f:arch/arm/mach-vt8500/Makefile +f:arch/arm/mach-vt8500/vt8500.c +f:arch/arm/mach-zynq/Kconfig +f:arch/arm/mach-zynq/Makefile +f:arch/arm/mach-zynq/common.c +f:arch/arm/mach-zynq/common.h +f:arch/arm/mach-zynq/headsmp.S +f:arch/arm/mach-zynq/platsmp.c +f:arch/arm/mach-zynq/pm.c +f:arch/arm/mach-zynq/slcr.c +f:arch/arm/mm/Kconfig +f:arch/arm/mm/Makefile +f:arch/arm/mm/abort-ev4.S +f:arch/arm/mm/abort-ev4t.S +f:arch/arm/mm/abort-ev5t.S +f:arch/arm/mm/abort-ev5tj.S +f:arch/arm/mm/abort-ev6.S +f:arch/arm/mm/abort-ev7.S +f:arch/arm/mm/abort-lv4t.S +f:arch/arm/mm/abort-macro.S +f:arch/arm/mm/abort-nommu.S +f:arch/arm/mm/alignment.c +f:arch/arm/mm/cache-b15-rac.c +f:arch/arm/mm/cache-fa.S +f:arch/arm/mm/cache-feroceon-l2.c +f:arch/arm/mm/cache-l2x0-pmu.c +f:arch/arm/mm/cache-l2x0.c +f:arch/arm/mm/cache-nop.S +f:arch/arm/mm/cache-tauros2.c +f:arch/arm/mm/cache-tauros3.h +f:arch/arm/mm/cache-uniphier.c +f:arch/arm/mm/cache-v4.S +f:arch/arm/mm/cache-v4wb.S +f:arch/arm/mm/cache-v4wt.S +f:arch/arm/mm/cache-v6.S +f:arch/arm/mm/cache-v7.S +f:arch/arm/mm/cache-v7m.S +f:arch/arm/mm/cache-xsc3l2.c +f:arch/arm/mm/cache.c +f:arch/arm/mm/context.c +f:arch/arm/mm/copypage-fa.c +f:arch/arm/mm/copypage-feroceon.c +f:arch/arm/mm/copypage-v4mc.c +f:arch/arm/mm/copypage-v4wb.c +f:arch/arm/mm/copypage-v4wt.c +f:arch/arm/mm/copypage-v6.c +f:arch/arm/mm/copypage-xsc3.c +f:arch/arm/mm/copypage-xscale.c +f:arch/arm/mm/dma-mapping-nommu.c +f:arch/arm/mm/dma-mapping.c +f:arch/arm/mm/dma.h +f:arch/arm/mm/dump.c +f:arch/arm/mm/extable.c +f:arch/arm/mm/fault-armv.c +f:arch/arm/mm/fault.c +f:arch/arm/mm/fault.h +f:arch/arm/mm/flush.c +f:arch/arm/mm/fsr-2level.c +f:arch/arm/mm/fsr-3level.c +f:arch/arm/mm/idmap.c +f:arch/arm/mm/init.c +f:arch/arm/mm/iomap.c +f:arch/arm/mm/ioremap.c +f:arch/arm/mm/kasan_init.c +f:arch/arm/mm/l2c-common.c +f:arch/arm/mm/l2c-l2x0-resume.S +f:arch/arm/mm/mm.h +f:arch/arm/mm/mmap.c +f:arch/arm/mm/mmu.c +f:arch/arm/mm/nommu.c +f:arch/arm/mm/pabort-legacy.S +f:arch/arm/mm/pabort-v6.S +f:arch/arm/mm/pabort-v7.S +f:arch/arm/mm/pageattr.c +f:arch/arm/mm/pgd.c +f:arch/arm/mm/physaddr.c +f:arch/arm/mm/pmsa-v7.c +f:arch/arm/mm/pmsa-v8.c +f:arch/arm/mm/proc-arm1020.S +f:arch/arm/mm/proc-arm1020e.S +f:arch/arm/mm/proc-arm1022.S +f:arch/arm/mm/proc-arm1026.S +f:arch/arm/mm/proc-arm720.S +f:arch/arm/mm/proc-arm740.S +f:arch/arm/mm/proc-arm7tdmi.S +f:arch/arm/mm/proc-arm920.S +f:arch/arm/mm/proc-arm922.S +f:arch/arm/mm/proc-arm925.S +f:arch/arm/mm/proc-arm926.S +f:arch/arm/mm/proc-arm940.S +f:arch/arm/mm/proc-arm946.S +f:arch/arm/mm/proc-arm9tdmi.S +f:arch/arm/mm/proc-fa526.S +f:arch/arm/mm/proc-feroceon.S +f:arch/arm/mm/proc-macros.S +f:arch/arm/mm/proc-mohawk.S +f:arch/arm/mm/proc-sa110.S +f:arch/arm/mm/proc-sa1100.S +f:arch/arm/mm/proc-syms.c +f:arch/arm/mm/proc-v6.S +f:arch/arm/mm/proc-v7-2level.S +f:arch/arm/mm/proc-v7-3level.S +f:arch/arm/mm/proc-v7-bugs.c +f:arch/arm/mm/proc-v7.S +f:arch/arm/mm/proc-v7m.S +f:arch/arm/mm/proc-xsc3.S +f:arch/arm/mm/proc-xscale.S +f:arch/arm/mm/proc.c +f:arch/arm/mm/ptdump_debugfs.c +f:arch/arm/mm/pv-fixup-asm.S +f:arch/arm/mm/tlb-fa.S +f:arch/arm/mm/tlb-v4.S +f:arch/arm/mm/tlb-v4wb.S +f:arch/arm/mm/tlb-v4wbi.S +f:arch/arm/mm/tlb-v6.S +f:arch/arm/mm/tlb-v7.S +f:arch/arm/mm/tlb.c +f:arch/arm/net/Makefile +f:arch/arm/net/bpf_jit_32.c +f:arch/arm/net/bpf_jit_32.h +f:arch/arm/nwfpe/ARM-gcc.h +f:arch/arm/nwfpe/ChangeLog +f:arch/arm/nwfpe/Makefile +f:arch/arm/nwfpe/double_cpdo.c +f:arch/arm/nwfpe/entry.S +f:arch/arm/nwfpe/extended_cpdo.c +f:arch/arm/nwfpe/fpa11.c +f:arch/arm/nwfpe/fpa11.h +f:arch/arm/nwfpe/fpa11.inl +f:arch/arm/nwfpe/fpa11_cpdo.c +f:arch/arm/nwfpe/fpa11_cpdt.c +f:arch/arm/nwfpe/fpa11_cprt.c +f:arch/arm/nwfpe/fpmodule.c +f:arch/arm/nwfpe/fpmodule.h +f:arch/arm/nwfpe/fpmodule.inl +f:arch/arm/nwfpe/fpopcode.c +f:arch/arm/nwfpe/fpopcode.h +f:arch/arm/nwfpe/fpsr.h +f:arch/arm/nwfpe/milieu.h +f:arch/arm/nwfpe/single_cpdo.c +f:arch/arm/nwfpe/softfloat-macros +f:arch/arm/nwfpe/softfloat-specialize +f:arch/arm/nwfpe/softfloat.c +f:arch/arm/nwfpe/softfloat.h +f:arch/arm/plat-orion/Makefile +f:arch/arm/plat-orion/common.c +f:arch/arm/plat-orion/gpio.c +f:arch/arm/plat-orion/include/plat/addr-map.h +f:arch/arm/plat-orion/include/plat/common.h +f:arch/arm/plat-orion/include/plat/irq.h +f:arch/arm/plat-orion/include/plat/mpp.h +f:arch/arm/plat-orion/include/plat/orion-gpio.h +f:arch/arm/plat-orion/include/plat/pcie.h +f:arch/arm/plat-orion/include/plat/time.h +f:arch/arm/plat-orion/irq.c +f:arch/arm/plat-orion/mpp.c +f:arch/arm/plat-orion/pcie.c +f:arch/arm/plat-orion/time.c +f:arch/arm/probes/Makefile +f:arch/arm/probes/decode-arm.c +f:arch/arm/probes/decode-arm.h +f:arch/arm/probes/decode-thumb.c +f:arch/arm/probes/decode-thumb.h +f:arch/arm/probes/decode.c +f:arch/arm/probes/decode.h +f:arch/arm/probes/kprobes/Makefile +f:arch/arm/probes/kprobes/actions-arm.c +f:arch/arm/probes/kprobes/actions-common.c +f:arch/arm/probes/kprobes/actions-thumb.c +f:arch/arm/probes/kprobes/checkers-arm.c +f:arch/arm/probes/kprobes/checkers-common.c +f:arch/arm/probes/kprobes/checkers-thumb.c +f:arch/arm/probes/kprobes/checkers.h +f:arch/arm/probes/kprobes/core.c +f:arch/arm/probes/kprobes/core.h +f:arch/arm/probes/kprobes/opt-arm.c +f:arch/arm/probes/kprobes/test-arm.c +f:arch/arm/probes/kprobes/test-core.c +f:arch/arm/probes/kprobes/test-core.h +f:arch/arm/probes/kprobes/test-thumb.c +f:arch/arm/probes/uprobes/Makefile +f:arch/arm/probes/uprobes/actions-arm.c +f:arch/arm/probes/uprobes/core.c +f:arch/arm/probes/uprobes/core.h +f:arch/arm/tools/Makefile +f:arch/arm/tools/gen-mach-types +f:arch/arm/tools/mach-types +f:arch/arm/tools/syscall.tbl +f:arch/arm/tools/syscallnr.sh +f:arch/arm/vdso/.gitignore +f:arch/arm/vdso/Makefile +f:arch/arm/vdso/note.c +f:arch/arm/vdso/vdso.S +f:arch/arm/vdso/vdso.lds.S +f:arch/arm/vdso/vdsomunge.c +f:arch/arm/vdso/vgettimeofday.c +f:arch/arm/vfp/Makefile +f:arch/arm/vfp/vfp.h +f:arch/arm/vfp/vfpdouble.c +f:arch/arm/vfp/vfphw.S +f:arch/arm/vfp/vfpinstr.h +f:arch/arm/vfp/vfpmodule.c +f:arch/arm/vfp/vfpsingle.c +f:arch/arm/xen/Makefile +f:arch/arm/xen/enlighten.c +f:arch/arm/xen/grant-table.c +f:arch/arm/xen/hypercall.S +f:arch/arm/xen/mm.c +f:arch/arm/xen/p2m.c +f:arch/arm64/Kbuild +f:arch/arm64/Kconfig +f:arch/arm64/Kconfig.debug +f:arch/arm64/Kconfig.platforms +f:arch/arm64/Makefile +f:arch/arm64/boot/.gitignore +f:arch/arm64/boot/Makefile +f:arch/arm64/boot/dts/Makefile +f:arch/arm64/boot/dts/actions/Makefile +f:arch/arm64/boot/dts/actions/s700-cubieboard7.dts +f:arch/arm64/boot/dts/actions/s700.dtsi +f:arch/arm64/boot/dts/actions/s900-bubblegum-96.dts +f:arch/arm64/boot/dts/actions/s900.dtsi +f:arch/arm64/boot/dts/airoha/Makefile +f:arch/arm64/boot/dts/airoha/en7581-evb.dts +f:arch/arm64/boot/dts/airoha/en7581.dtsi +f:arch/arm64/boot/dts/allwinner/Makefile +f:arch/arm64/boot/dts/allwinner/axp803.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-a100-allwinner-perf1.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a100-cpu-opp.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-a100.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-a133-liontron-h-a133l.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-amarula-relic.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-oceanic-5205-5inmfd.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino-emmc.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone-1.0.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone-1.1.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone-1.2.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab-early-adopter.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts +f:arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h313-tanix-tx1.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-bananapi-m2-plus-v1.2.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-bananapi-m2-plus.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-cpu-opp.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h5-emlid-neutis-n5-devboard.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-emlid-neutis-n5.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h5-libretech-all-h3-cc.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-libretech-all-h3-it.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-libretech-all-h5-cc.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo-plus2.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-pc2.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-prime.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-zero-plus.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5-orangepi-zero-plus2.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h6-cpu-opp.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h6-gpu-opp.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-lite2.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64-model-b.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6-mini.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h616-bigtreetech-cb1-manta.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h616-bigtreetech-cb1.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h616-bigtreetech-pi.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h616-cpu-opp.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h618-longan-module-3h.dtsi +f:arch/arm64/boot/dts/allwinner/sun50i-h618-longanpi-3h.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h618-orangepi-zero2w.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h618-orangepi-zero3.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h618-transpeed-8k618-t.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h618-yuzukihd-chameleon.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h64-remix-mini-pc.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h700-anbernic-rg35xx-2024.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h700-anbernic-rg35xx-h.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h700-anbernic-rg35xx-plus.dts +f:arch/arm64/boot/dts/allwinner/sun50i-h700-anbernic-rg35xx-sp.dts +f:arch/arm64/boot/dts/allwinner/sun55i-a523.dtsi +f:arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts +f:arch/arm64/boot/dts/allwinner/sun55i-h728-x96qpro+.dts +f:arch/arm64/boot/dts/allwinner/sun55i-t527-avaota-a1.dts +f:arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts +f:arch/arm64/boot/dts/altera/Makefile +f:arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi +f:arch/arm64/boot/dts/altera/socfpga_stratix10_socdk.dts +f:arch/arm64/boot/dts/altera/socfpga_stratix10_socdk_nand.dts +f:arch/arm64/boot/dts/altera/socfpga_stratix10_swvp.dts +f:arch/arm64/boot/dts/amazon/Makefile +f:arch/arm64/boot/dts/amazon/alpine-v2-evp.dts +f:arch/arm64/boot/dts/amazon/alpine-v2.dtsi +f:arch/arm64/boot/dts/amazon/alpine-v3-evp.dts +f:arch/arm64/boot/dts/amazon/alpine-v3.dtsi +f:arch/arm64/boot/dts/amd/Makefile +f:arch/arm64/boot/dts/amd/amd-overdrive-rev-b0.dts +f:arch/arm64/boot/dts/amd/amd-overdrive-rev-b1.dts +f:arch/arm64/boot/dts/amd/amd-seattle-clks.dtsi +f:arch/arm64/boot/dts/amd/amd-seattle-cpus.dtsi +f:arch/arm64/boot/dts/amd/amd-seattle-soc.dtsi +f:arch/arm64/boot/dts/amd/amd-seattle-xgbe-b.dtsi +f:arch/arm64/boot/dts/amd/elba-16core.dtsi +f:arch/arm64/boot/dts/amd/elba-asic-common.dtsi +f:arch/arm64/boot/dts/amd/elba-asic.dts +f:arch/arm64/boot/dts/amd/elba-flash-parts.dtsi +f:arch/arm64/boot/dts/amd/elba.dtsi +f:arch/arm64/boot/dts/amlogic/Makefile +f:arch/arm64/boot/dts/amlogic/amlogic-a4-a113l2-ba400.dts +f:arch/arm64/boot/dts/amlogic/amlogic-a4-common.dtsi +f:arch/arm64/boot/dts/amlogic/amlogic-a4-reset.h +f:arch/arm64/boot/dts/amlogic/amlogic-a4.dtsi +f:arch/arm64/boot/dts/amlogic/amlogic-a5-a113x2-av400.dts +f:arch/arm64/boot/dts/amlogic/amlogic-a5-reset.h +f:arch/arm64/boot/dts/amlogic/amlogic-a5.dtsi +f:arch/arm64/boot/dts/amlogic/amlogic-c3-c302x-aw409.dts +f:arch/arm64/boot/dts/amlogic/amlogic-c3-c308l-aw419.dts +f:arch/arm64/boot/dts/amlogic/amlogic-c3.dtsi +f:arch/arm64/boot/dts/amlogic/amlogic-s6-s905x5-bl209.dts +f:arch/arm64/boot/dts/amlogic/amlogic-s6.dtsi +f:arch/arm64/boot/dts/amlogic/amlogic-s7-s805x3-bp201.dts +f:arch/arm64/boot/dts/amlogic/amlogic-s7.dtsi +f:arch/arm64/boot/dts/amlogic/amlogic-s7d-s905x5m-bm202.dts +f:arch/arm64/boot/dts/amlogic/amlogic-s7d.dtsi +f:arch/arm64/boot/dts/amlogic/amlogic-t7-a311d2-an400.dts +f:arch/arm64/boot/dts/amlogic/amlogic-t7-a311d2-khadas-vim4.dts +f:arch/arm64/boot/dts/amlogic/amlogic-t7-reset.h +f:arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi +f:arch/arm64/boot/dts/amlogic/meson-a1-ad401.dts +f:arch/arm64/boot/dts/amlogic/meson-a1-ad402.dts +f:arch/arm64/boot/dts/amlogic/meson-a1.dtsi +f:arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j100.dts +f:arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-2.dts +f:arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-3.dts +f:arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j1xx.dtsi +f:arch/arm64/boot/dts/amlogic/meson-axg-s400.dts +f:arch/arm64/boot/dts/amlogic/meson-axg.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12a-fbx8am-brcm.dtso +f:arch/arm64/boot/dts/amlogic/meson-g12a-fbx8am-realtek.dtso +f:arch/arm64/boot/dts/amlogic/meson-g12a-fbx8am.dts +f:arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts +f:arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts +f:arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts +f:arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts +f:arch/arm64/boot/dts/amlogic/meson-g12a.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-a311d-bananapi-m2s.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-a311d-khadas-vim3.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-a311d-libretech-cc.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4-cm4io.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4-mnt-reform2.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-bananapi-cm4.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-bananapi.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-one.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-dreambox-two.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-dreambox.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-gsking-x.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-gtking-pro.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-gtking.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-khadas-vim3.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-odroid-go-ultra.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2l.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-odroid.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-s922x-bananapi-m2s.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-s922x-khadas-vim3.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b-ugoos-am6.dts +f:arch/arm64/boot/dts/amlogic/meson-g12b-w400.dtsi +f:arch/arm64/boot/dts/amlogic/meson-g12b.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gx-libretech-pc.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gx-mali450.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gx.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxbb-kii-pro.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-p200.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-p201.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95-meta.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95-pro.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95-telos.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-hub.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-wetek-play2.dts +f:arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxl-mali.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxl-s805x-libretech-ac.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s805x-p241.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxl-s805y-xiaomi-aquaman.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s805y.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905d-libretech-pc.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905d-mecool-kii-pro.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p231.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905d-phicomm-n1.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905d-sml5442tw.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905d-vero4k-plus.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905d.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905w-jethome-jethub-j80.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905w-p281.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905w-tx3-mini.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc-v2.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x-vero4k.dts +f:arch/arm64/boot/dts/amlogic/meson-gxl-s905x.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxl.dtsi +f:arch/arm64/boot/dts/amlogic/meson-gxlx-s905l-p271.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-gt1-ultimate.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-mecool-kiii-pro.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-minix-neo-u9h.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-nexbox-a1.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-q200.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-q201.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-s912-libretech-pc.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-ugoos-am3.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-vega-s96.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm-wetek-core2.dts +f:arch/arm64/boot/dts/amlogic/meson-gxm.dtsi +f:arch/arm64/boot/dts/amlogic/meson-khadas-vim3-ts050.dtso +f:arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi +f:arch/arm64/boot/dts/amlogic/meson-libretech-cottonwood.dtsi +f:arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts +f:arch/arm64/boot/dts/amlogic/meson-s4.dtsi +f:arch/arm64/boot/dts/amlogic/meson-sm1-a95xf3-air-gbit.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-a95xf3-air.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-ac2xx.dtsi +f:arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m2-pro.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-bananapi.dtsi +f:arch/arm64/boot/dts/amlogic/meson-sm1-h96-max.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-odroid.dtsi +f:arch/arm64/boot/dts/amlogic/meson-sm1-s905d3-libretech-cc.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-x96-air-gbit.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1-x96-air.dts +f:arch/arm64/boot/dts/amlogic/meson-sm1.dtsi +f:arch/arm64/boot/dts/apm/Makefile +f:arch/arm64/boot/dts/apm/apm-merlin.dts +f:arch/arm64/boot/dts/apm/apm-mustang.dts +f:arch/arm64/boot/dts/apm/apm-shadowcat.dtsi +f:arch/arm64/boot/dts/apm/apm-storm.dtsi +f:arch/arm64/boot/dts/apple/Makefile +f:arch/arm64/boot/dts/apple/multi-die-cpp.h +f:arch/arm64/boot/dts/apple/s5l8960x-5s.dtsi +f:arch/arm64/boot/dts/apple/s5l8960x-air1.dtsi +f:arch/arm64/boot/dts/apple/s5l8960x-common.dtsi +f:arch/arm64/boot/dts/apple/s5l8960x-j71.dts +f:arch/arm64/boot/dts/apple/s5l8960x-j72.dts +f:arch/arm64/boot/dts/apple/s5l8960x-j73.dts +f:arch/arm64/boot/dts/apple/s5l8960x-j85.dts +f:arch/arm64/boot/dts/apple/s5l8960x-j85m.dts +f:arch/arm64/boot/dts/apple/s5l8960x-j86.dts +f:arch/arm64/boot/dts/apple/s5l8960x-j86m.dts +f:arch/arm64/boot/dts/apple/s5l8960x-j87.dts +f:arch/arm64/boot/dts/apple/s5l8960x-j87m.dts +f:arch/arm64/boot/dts/apple/s5l8960x-mini2.dtsi +f:arch/arm64/boot/dts/apple/s5l8960x-mini3.dtsi +f:arch/arm64/boot/dts/apple/s5l8960x-n51.dts +f:arch/arm64/boot/dts/apple/s5l8960x-n53.dts +f:arch/arm64/boot/dts/apple/s5l8960x-opp.dtsi +f:arch/arm64/boot/dts/apple/s5l8960x-pmgr.dtsi +f:arch/arm64/boot/dts/apple/s5l8960x.dtsi +f:arch/arm64/boot/dts/apple/s5l8965x-opp.dtsi +f:arch/arm64/boot/dts/apple/s800-0-3-common.dtsi +f:arch/arm64/boot/dts/apple/s800-0-3-pmgr.dtsi +f:arch/arm64/boot/dts/apple/s800-0-3.dtsi +f:arch/arm64/boot/dts/apple/s8000-j71s.dts +f:arch/arm64/boot/dts/apple/s8000-j72s.dts +f:arch/arm64/boot/dts/apple/s8000-n66.dts +f:arch/arm64/boot/dts/apple/s8000-n69u.dts +f:arch/arm64/boot/dts/apple/s8000-n71.dts +f:arch/arm64/boot/dts/apple/s8000.dtsi +f:arch/arm64/boot/dts/apple/s8001-common.dtsi +f:arch/arm64/boot/dts/apple/s8001-j127.dts +f:arch/arm64/boot/dts/apple/s8001-j128.dts +f:arch/arm64/boot/dts/apple/s8001-j98a-j99a.dtsi +f:arch/arm64/boot/dts/apple/s8001-j98a.dts +f:arch/arm64/boot/dts/apple/s8001-j99a.dts +f:arch/arm64/boot/dts/apple/s8001-pmgr.dtsi +f:arch/arm64/boot/dts/apple/s8001-pro.dtsi +f:arch/arm64/boot/dts/apple/s8001.dtsi +f:arch/arm64/boot/dts/apple/s8003-j71t.dts +f:arch/arm64/boot/dts/apple/s8003-j72t.dts +f:arch/arm64/boot/dts/apple/s8003-n66m.dts +f:arch/arm64/boot/dts/apple/s8003-n69.dts +f:arch/arm64/boot/dts/apple/s8003-n71m.dts +f:arch/arm64/boot/dts/apple/s8003.dtsi +f:arch/arm64/boot/dts/apple/s800x-6s.dtsi +f:arch/arm64/boot/dts/apple/s800x-ipad5.dtsi +f:arch/arm64/boot/dts/apple/s800x-se.dtsi +f:arch/arm64/boot/dts/apple/spi1-nvram.dtsi +f:arch/arm64/boot/dts/apple/t6000-j314s.dts +f:arch/arm64/boot/dts/apple/t6000-j316s.dts +f:arch/arm64/boot/dts/apple/t6000.dtsi +f:arch/arm64/boot/dts/apple/t6001-j314c.dts +f:arch/arm64/boot/dts/apple/t6001-j316c.dts +f:arch/arm64/boot/dts/apple/t6001-j375c.dts +f:arch/arm64/boot/dts/apple/t6001.dtsi +f:arch/arm64/boot/dts/apple/t6002-j375d.dts +f:arch/arm64/boot/dts/apple/t6002.dtsi +f:arch/arm64/boot/dts/apple/t600x-common.dtsi +f:arch/arm64/boot/dts/apple/t600x-die0.dtsi +f:arch/arm64/boot/dts/apple/t600x-dieX.dtsi +f:arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi +f:arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi +f:arch/arm64/boot/dts/apple/t600x-j375.dtsi +f:arch/arm64/boot/dts/apple/t600x-nvme.dtsi +f:arch/arm64/boot/dts/apple/t600x-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t7000-6.dtsi +f:arch/arm64/boot/dts/apple/t7000-common.dtsi +f:arch/arm64/boot/dts/apple/t7000-handheld.dtsi +f:arch/arm64/boot/dts/apple/t7000-j42d.dts +f:arch/arm64/boot/dts/apple/t7000-j96.dts +f:arch/arm64/boot/dts/apple/t7000-j97.dts +f:arch/arm64/boot/dts/apple/t7000-mini4.dtsi +f:arch/arm64/boot/dts/apple/t7000-n102.dts +f:arch/arm64/boot/dts/apple/t7000-n56.dts +f:arch/arm64/boot/dts/apple/t7000-n61.dts +f:arch/arm64/boot/dts/apple/t7000-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t7000.dtsi +f:arch/arm64/boot/dts/apple/t7001-air2.dtsi +f:arch/arm64/boot/dts/apple/t7001-j81.dts +f:arch/arm64/boot/dts/apple/t7001-j82.dts +f:arch/arm64/boot/dts/apple/t7001-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t7001.dtsi +f:arch/arm64/boot/dts/apple/t8010-7.dtsi +f:arch/arm64/boot/dts/apple/t8010-common.dtsi +f:arch/arm64/boot/dts/apple/t8010-d10.dts +f:arch/arm64/boot/dts/apple/t8010-d101.dts +f:arch/arm64/boot/dts/apple/t8010-d11.dts +f:arch/arm64/boot/dts/apple/t8010-d111.dts +f:arch/arm64/boot/dts/apple/t8010-ipad6.dtsi +f:arch/arm64/boot/dts/apple/t8010-ipad7.dtsi +f:arch/arm64/boot/dts/apple/t8010-j171.dts +f:arch/arm64/boot/dts/apple/t8010-j172.dts +f:arch/arm64/boot/dts/apple/t8010-j71b.dts +f:arch/arm64/boot/dts/apple/t8010-j72b.dts +f:arch/arm64/boot/dts/apple/t8010-n112.dts +f:arch/arm64/boot/dts/apple/t8010-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t8010.dtsi +f:arch/arm64/boot/dts/apple/t8011-common.dtsi +f:arch/arm64/boot/dts/apple/t8011-j105a.dts +f:arch/arm64/boot/dts/apple/t8011-j120.dts +f:arch/arm64/boot/dts/apple/t8011-j121.dts +f:arch/arm64/boot/dts/apple/t8011-j207.dts +f:arch/arm64/boot/dts/apple/t8011-j208.dts +f:arch/arm64/boot/dts/apple/t8011-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t8011-pro2.dtsi +f:arch/arm64/boot/dts/apple/t8011.dtsi +f:arch/arm64/boot/dts/apple/t8012-j132.dts +f:arch/arm64/boot/dts/apple/t8012-j137.dts +f:arch/arm64/boot/dts/apple/t8012-j140a.dts +f:arch/arm64/boot/dts/apple/t8012-j140k.dts +f:arch/arm64/boot/dts/apple/t8012-j152f.dts +f:arch/arm64/boot/dts/apple/t8012-j160.dts +f:arch/arm64/boot/dts/apple/t8012-j174.dts +f:arch/arm64/boot/dts/apple/t8012-j185.dts +f:arch/arm64/boot/dts/apple/t8012-j185f.dts +f:arch/arm64/boot/dts/apple/t8012-j213.dts +f:arch/arm64/boot/dts/apple/t8012-j214k.dts +f:arch/arm64/boot/dts/apple/t8012-j215.dts +f:arch/arm64/boot/dts/apple/t8012-j223.dts +f:arch/arm64/boot/dts/apple/t8012-j230k.dts +f:arch/arm64/boot/dts/apple/t8012-j680.dts +f:arch/arm64/boot/dts/apple/t8012-j780.dts +f:arch/arm64/boot/dts/apple/t8012-jxxx.dtsi +f:arch/arm64/boot/dts/apple/t8012-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t8012-touchbar.dtsi +f:arch/arm64/boot/dts/apple/t8012.dtsi +f:arch/arm64/boot/dts/apple/t8015-8.dtsi +f:arch/arm64/boot/dts/apple/t8015-8plus.dtsi +f:arch/arm64/boot/dts/apple/t8015-common.dtsi +f:arch/arm64/boot/dts/apple/t8015-d20.dts +f:arch/arm64/boot/dts/apple/t8015-d201.dts +f:arch/arm64/boot/dts/apple/t8015-d21.dts +f:arch/arm64/boot/dts/apple/t8015-d211.dts +f:arch/arm64/boot/dts/apple/t8015-d22.dts +f:arch/arm64/boot/dts/apple/t8015-d221.dts +f:arch/arm64/boot/dts/apple/t8015-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t8015-x.dtsi +f:arch/arm64/boot/dts/apple/t8015.dtsi +f:arch/arm64/boot/dts/apple/t8103-j274.dts +f:arch/arm64/boot/dts/apple/t8103-j293.dts +f:arch/arm64/boot/dts/apple/t8103-j313.dts +f:arch/arm64/boot/dts/apple/t8103-j456.dts +f:arch/arm64/boot/dts/apple/t8103-j457.dts +f:arch/arm64/boot/dts/apple/t8103-jxxx.dtsi +f:arch/arm64/boot/dts/apple/t8103-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t8103.dtsi +f:arch/arm64/boot/dts/apple/t8112-j413.dts +f:arch/arm64/boot/dts/apple/t8112-j473.dts +f:arch/arm64/boot/dts/apple/t8112-j493.dts +f:arch/arm64/boot/dts/apple/t8112-jxxx.dtsi +f:arch/arm64/boot/dts/apple/t8112-pmgr.dtsi +f:arch/arm64/boot/dts/apple/t8112.dtsi +f:arch/arm64/boot/dts/arm/Makefile +f:arch/arm64/boot/dts/arm/corstone1000-fvp.dts +f:arch/arm64/boot/dts/arm/corstone1000-mps3.dts +f:arch/arm64/boot/dts/arm/corstone1000.dtsi +f:arch/arm64/boot/dts/arm/foundation-v8-gicv2.dtsi +f:arch/arm64/boot/dts/arm/foundation-v8-gicv3-psci.dts +f:arch/arm64/boot/dts/arm/foundation-v8-gicv3.dts +f:arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi +f:arch/arm64/boot/dts/arm/foundation-v8-psci.dts +f:arch/arm64/boot/dts/arm/foundation-v8-psci.dtsi +f:arch/arm64/boot/dts/arm/foundation-v8-spin-table.dtsi +f:arch/arm64/boot/dts/arm/foundation-v8.dts +f:arch/arm64/boot/dts/arm/foundation-v8.dtsi +f:arch/arm64/boot/dts/arm/fvp-base-revc.dts +f:arch/arm64/boot/dts/arm/juno-base.dtsi +f:arch/arm64/boot/dts/arm/juno-clocks.dtsi +f:arch/arm64/boot/dts/arm/juno-cs-r1r2.dtsi +f:arch/arm64/boot/dts/arm/juno-motherboard.dtsi +f:arch/arm64/boot/dts/arm/juno-r1-scmi.dts +f:arch/arm64/boot/dts/arm/juno-r1.dts +f:arch/arm64/boot/dts/arm/juno-r2-scmi.dts +f:arch/arm64/boot/dts/arm/juno-r2.dts +f:arch/arm64/boot/dts/arm/juno-scmi.dts +f:arch/arm64/boot/dts/arm/juno-scmi.dtsi +f:arch/arm64/boot/dts/arm/juno.dts +f:arch/arm64/boot/dts/arm/morello-fvp.dts +f:arch/arm64/boot/dts/arm/morello-sdp.dts +f:arch/arm64/boot/dts/arm/morello.dtsi +f:arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts +f:arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi +f:arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi +f:arch/arm64/boot/dts/arm/vexpress-v2f-1xv7-ca53x2.dts +f:arch/arm64/boot/dts/axiado/Makefile +f:arch/arm64/boot/dts/axiado/ax3000-evk.dts +f:arch/arm64/boot/dts/axiado/ax3000.dtsi +f:arch/arm64/boot/dts/bitmain/Makefile +f:arch/arm64/boot/dts/bitmain/bm1880-sophon-edge.dts +f:arch/arm64/boot/dts/bitmain/bm1880.dtsi +f:arch/arm64/boot/dts/blaize/Makefile +f:arch/arm64/boot/dts/blaize/blaize-blzp1600-cb2.dts +f:arch/arm64/boot/dts/blaize/blaize-blzp1600-som.dtsi +f:arch/arm64/boot/dts/blaize/blaize-blzp1600.dtsi +f:arch/arm64/boot/dts/broadcom/Makefile +f:arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts +f:arch/arm64/boot/dts/broadcom/bcm2711-rpi-400.dts +f:arch/arm64/boot/dts/broadcom/bcm2711-rpi-cm4-io.dts +f:arch/arm64/boot/dts/broadcom/bcm2712-d-rpi-5-b.dts +f:arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b-ovl-rp1.dts +f:arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b.dts +f:arch/arm64/boot/dts/broadcom/bcm2712.dtsi +f:arch/arm64/boot/dts/broadcom/bcm2837-rpi-2-b.dts +f:arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-a-plus.dts +f:arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts +f:arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts +f:arch/arm64/boot/dts/broadcom/bcm2837-rpi-cm3-io3.dts +f:arch/arm64/boot/dts/broadcom/bcm2837-rpi-zero-2-w.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/Makefile +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4906-netgear-r8000p.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4906-tplink-archer-c2300-v1.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4906-zyxel-ex3510b.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4906.dtsi +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4908-asus-gt-ac5300.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4908-netgear-raxe500.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4908.dtsi +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4912-asus-gt-ax6000.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm4912.dtsi +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm63146.dtsi +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm63158.dtsi +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm6813.dtsi +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm6856.dtsi +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm6858.dtsi +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm94908.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm94912.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm963146.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm963158.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm96813.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm96856.dts +f:arch/arm64/boot/dts/broadcom/bcmbca/bcm96858.dts +f:arch/arm64/boot/dts/broadcom/northstar2/Makefile +f:arch/arm64/boot/dts/broadcom/northstar2/ns2-clock.dtsi +f:arch/arm64/boot/dts/broadcom/northstar2/ns2-svk.dts +f:arch/arm64/boot/dts/broadcom/northstar2/ns2-xmc.dts +f:arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi +f:arch/arm64/boot/dts/broadcom/rp1-common.dtsi +f:arch/arm64/boot/dts/broadcom/rp1-nexus.dtsi +f:arch/arm64/boot/dts/broadcom/rp1.dtso +f:arch/arm64/boot/dts/broadcom/stingray/Makefile +f:arch/arm64/boot/dts/broadcom/stingray/bcm958742-base.dtsi +f:arch/arm64/boot/dts/broadcom/stingray/bcm958742k.dts +f:arch/arm64/boot/dts/broadcom/stingray/bcm958742t.dts +f:arch/arm64/boot/dts/broadcom/stingray/bcm958802a802x.dts +f:arch/arm64/boot/dts/broadcom/stingray/stingray-board-base.dtsi +f:arch/arm64/boot/dts/broadcom/stingray/stingray-clock.dtsi +f:arch/arm64/boot/dts/broadcom/stingray/stingray-fs4.dtsi +f:arch/arm64/boot/dts/broadcom/stingray/stingray-pcie.dtsi +f:arch/arm64/boot/dts/broadcom/stingray/stingray-pinctrl.dtsi +f:arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi +f:arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi +f:arch/arm64/boot/dts/cavium/Makefile +f:arch/arm64/boot/dts/cavium/thunder-88xx.dts +f:arch/arm64/boot/dts/cavium/thunder-88xx.dtsi +f:arch/arm64/boot/dts/cavium/thunder2-99xx.dts +f:arch/arm64/boot/dts/cavium/thunder2-99xx.dtsi +f:arch/arm64/boot/dts/cix/Makefile +f:arch/arm64/boot/dts/cix/sky1-orion-o6.dts +f:arch/arm64/boot/dts/cix/sky1.dtsi +f:arch/arm64/boot/dts/exynos/Makefile +f:arch/arm64/boot/dts/exynos/exynos-pinctrl.h +f:arch/arm64/boot/dts/exynos/exynos2200-g0s.dts +f:arch/arm64/boot/dts/exynos/exynos2200-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos2200.dtsi +f:arch/arm64/boot/dts/exynos/exynos5433-bus.dtsi +f:arch/arm64/boot/dts/exynos/exynos5433-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi +f:arch/arm64/boot/dts/exynos/exynos5433-tm2.dts +f:arch/arm64/boot/dts/exynos/exynos5433-tm2e.dts +f:arch/arm64/boot/dts/exynos/exynos5433-tmu.dtsi +f:arch/arm64/boot/dts/exynos/exynos5433.dtsi +f:arch/arm64/boot/dts/exynos/exynos7-espresso.dts +f:arch/arm64/boot/dts/exynos/exynos7-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos7-trip-points.dtsi +f:arch/arm64/boot/dts/exynos/exynos7.dtsi +f:arch/arm64/boot/dts/exynos/exynos7870-a2corelte.dts +f:arch/arm64/boot/dts/exynos/exynos7870-j6lte.dts +f:arch/arm64/boot/dts/exynos/exynos7870-on7xelte.dts +f:arch/arm64/boot/dts/exynos/exynos7870-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos7870.dtsi +f:arch/arm64/boot/dts/exynos/exynos7885-jackpotlte.dts +f:arch/arm64/boot/dts/exynos/exynos7885-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos7885.dtsi +f:arch/arm64/boot/dts/exynos/exynos850-e850-96.dts +f:arch/arm64/boot/dts/exynos/exynos850-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos850.dtsi +f:arch/arm64/boot/dts/exynos/exynos8895-dreamlte.dts +f:arch/arm64/boot/dts/exynos/exynos8895-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos8895.dtsi +f:arch/arm64/boot/dts/exynos/exynos9810-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos9810-starlte.dts +f:arch/arm64/boot/dts/exynos/exynos9810.dtsi +f:arch/arm64/boot/dts/exynos/exynos990-c1s.dts +f:arch/arm64/boot/dts/exynos/exynos990-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynos990-r8s.dts +f:arch/arm64/boot/dts/exynos/exynos990-x1s-common.dtsi +f:arch/arm64/boot/dts/exynos/exynos990-x1s.dts +f:arch/arm64/boot/dts/exynos/exynos990-x1slte.dts +f:arch/arm64/boot/dts/exynos/exynos990.dtsi +f:arch/arm64/boot/dts/exynos/exynosautov9-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynosautov9-sadk.dts +f:arch/arm64/boot/dts/exynos/exynosautov9.dtsi +f:arch/arm64/boot/dts/exynos/exynosautov920-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/exynosautov920-sadk.dts +f:arch/arm64/boot/dts/exynos/exynosautov920.dtsi +f:arch/arm64/boot/dts/exynos/google/Makefile +f:arch/arm64/boot/dts/exynos/google/gs101-oriole.dts +f:arch/arm64/boot/dts/exynos/google/gs101-pinctrl.dtsi +f:arch/arm64/boot/dts/exynos/google/gs101-pinctrl.h +f:arch/arm64/boot/dts/exynos/google/gs101-pixel-common.dtsi +f:arch/arm64/boot/dts/exynos/google/gs101-raven.dts +f:arch/arm64/boot/dts/exynos/google/gs101.dtsi +f:arch/arm64/boot/dts/freescale/Makefile +f:arch/arm64/boot/dts/freescale/fsl-ls1012a-frdm.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1012a-frwy.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1012a-oxalis.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1012a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-kbox-a-230-ls.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var1.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var2.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3-ads2.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var4.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-13bb.dtso +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-65bb.dtso +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-7777.dtso +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-85bb.dtso +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-899b.dtso +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-9999.dtso +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1043-post.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1043a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1043a-tqmls1043a-mbls10xxa.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1043a-tqmls1043a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1046-post.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1046a-frwy.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1046a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1046a-tqmls1046a-mbls10xxa.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1046a-tqmls1046a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1088a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1088a-ten64.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1088a-tqmls1088a-mbls10xxa.dts +f:arch/arm64/boot/dts/freescale/fsl-ls1088a-tqmls1088a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-ls2080a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-ls2080a-simu.dts +f:arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls2081a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-ls2088a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-ls2088a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-ls2088a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls208xa-qds.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls208xa-rdb.dtsi +f:arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-bluebox3-rev-a.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-bluebox3.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-cex7.dtsi +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-clearfog-cx.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-clearfog-itx.dtsi +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-honeycomb.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-rdb.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-rev2.dtsi +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-tqmlx2160a-mblx2160a.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-tqmlx2160a-mblx2160a_12_x_x.dtso +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-tqmlx2160a-mblx2160a_14_x_x.dtso +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-tqmlx2160a-mblx2160a_x_11_x.dtso +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-tqmlx2160a-mblx2160a_x_7_x.dtso +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-tqmlx2160a-mblx2160a_x_8_x.dtso +f:arch/arm64/boot/dts/freescale/fsl-lx2160a-tqmlx2160a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi +f:arch/arm64/boot/dts/freescale/fsl-lx2162a-clearfog.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2162a-qds.dts +f:arch/arm64/boot/dts/freescale/fsl-lx2162a-sr-som.dtsi +f:arch/arm64/boot/dts/freescale/imx-pcie0-ep.dtso +f:arch/arm64/boot/dts/freescale/imx-pcie1-ep.dtso +f:arch/arm64/boot/dts/freescale/imx8-apalis-eval-v1.1.dtsi +f:arch/arm64/boot/dts/freescale/imx8-apalis-eval-v1.2.dtsi +f:arch/arm64/boot/dts/freescale/imx8-apalis-eval.dtsi +f:arch/arm64/boot/dts/freescale/imx8-apalis-ixora-v1.1.dtsi +f:arch/arm64/boot/dts/freescale/imx8-apalis-ixora-v1.2.dtsi +f:arch/arm64/boot/dts/freescale/imx8-apalis-v1.1.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-adma.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-audio.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-cm40.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-cm41.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-conn.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-ddr.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-dma.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-gpu0.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-hsio.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-img.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-lsio.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-lvds0.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-lvds1.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-mipi0.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-mipi1.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-security.dtsi +f:arch/arm64/boot/dts/freescale/imx8-ss-vpu.dtsi +f:arch/arm64/boot/dts/freescale/imx8dx-colibri-aster.dts +f:arch/arm64/boot/dts/freescale/imx8dx-colibri-eval-v3.dts +f:arch/arm64/boot/dts/freescale/imx8dx-colibri-iris-v2.dts +f:arch/arm64/boot/dts/freescale/imx8dx-colibri-iris.dts +f:arch/arm64/boot/dts/freescale/imx8dx-colibri.dtsi +f:arch/arm64/boot/dts/freescale/imx8dx.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxl-evk.dts +f:arch/arm64/boot/dts/freescale/imx8dxl-ss-adma.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxl-ss-conn.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxl-ss-ddr.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxl-ss-hsio.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxl-ss-lsio.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxl.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxp-tqma8xdp-mba8xx.dts +f:arch/arm64/boot/dts/freescale/imx8dxp-tqma8xdp.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxp-tqma8xdps-mb-smarc-2.dts +f:arch/arm64/boot/dts/freescale/imx8dxp-tqma8xdps.dtsi +f:arch/arm64/boot/dts/freescale/imx8dxp.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-beacon-baseboard.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-beacon-kit.dts +f:arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-data-modul-edm-sbc.dts +f:arch/arm64/boot/dts/freescale/imx8mm-ddr4-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mm-emcon-avari.dts +f:arch/arm64/boot/dts/freescale/imx8mm-emcon-avari.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-emcon.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-emtop-baseboard.dts +f:arch/arm64/boot/dts/freescale/imx8mm-emtop-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-evkb.dts +f:arch/arm64/boot/dts/freescale/imx8mm-icore-mx8mm-ctouch2.dts +f:arch/arm64/boot/dts/freescale/imx8mm-icore-mx8mm-edimm2.2.dts +f:arch/arm64/boot/dts/freescale/imx8mm-icore-mx8mm.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-innocomm-wb15-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mm-innocomm-wb15.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-iot-gateway.dts +f:arch/arm64/boot/dts/freescale/imx8mm-kontron-bl-osm-s.dts +f:arch/arm64/boot/dts/freescale/imx8mm-kontron-bl.dts +f:arch/arm64/boot/dts/freescale/imx8mm-kontron-dl.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-kontron-osm-s.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-kontron-sl.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-mx8menlo.dts +f:arch/arm64/boot/dts/freescale/imx8mm-nitrogen-r2.dts +f:arch/arm64/boot/dts/freescale/imx8mm-overdrive.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-phg.dts +f:arch/arm64/boot/dts/freescale/imx8mm-phyboard-polis-peb-av-10.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-phyboard-polis-peb-eval-01.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-phyboard-polis-rdk.dts +f:arch/arm64/boot/dts/freescale/imx8mm-phycore-no-eth.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-phycore-no-spiflash.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-phycore-rpmsg.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-phycore-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-phygate-tauri-l-rs232-rs232.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-phygate-tauri-l-rs232-rs485.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-phygate-tauri-l-rs232-rts-cts.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-phygate-tauri-l.dts +f:arch/arm64/boot/dts/freescale/imx8mm-pinfunc.h +f:arch/arm64/boot/dts/freescale/imx8mm-prt8mm.dts +f:arch/arm64/boot/dts/freescale/imx8mm-tqma8mqml-mba8mx-lvds-tm070jvhg33.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-tqma8mqml-mba8mx.dts +f:arch/arm64/boot/dts/freescale/imx8mm-tqma8mqml.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-ucm-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-var-som-symphony.dts +f:arch/arm64/boot/dts/freescale/imx8mm-var-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw700x.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw71xx-0x.dts +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw71xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw72xx-0x-imx219.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw72xx-0x-rpidsi.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw72xx-0x-rs232-rts.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw72xx-0x-rs422.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw72xx-0x-rs485.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw72xx-0x.dts +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw72xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw73xx-0x-imx219.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw73xx-0x-rpidsi.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw73xx-0x-rs232-rts.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw73xx-0x-rs422.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw73xx-0x-rs485.dtso +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw73xx-0x.dts +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw73xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw75xx-0x.dts +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw75xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw7901.dts +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw7902.dts +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw7903.dts +f:arch/arm64/boot/dts/freescale/imx8mm-venice-gw7904.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-dahlia.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-dev.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-ivy.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-mallow.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-nonwifi-dahlia.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-nonwifi-dev.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-nonwifi-ivy.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-nonwifi-mallow.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-nonwifi-yavia.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-nonwifi.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-wifi-dahlia.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-wifi-dev.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-wifi-ivy.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-wifi-mallow.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-wifi-yavia.dts +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-wifi.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-verdin-yavia.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi +f:arch/arm64/boot/dts/freescale/imx8mm.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-beacon-baseboard.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-beacon-kit.dts +f:arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-bsh-smm-s2-common.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-bsh-smm-s2-display.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-bsh-smm-s2.dts +f:arch/arm64/boot/dts/freescale/imx8mn-bsh-smm-s2pro.dts +f:arch/arm64/boot/dts/freescale/imx8mn-ddr3l-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mn-dimonoff-gateway-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mn-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mn-evk.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-overdrive.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-pinfunc.h +f:arch/arm64/boot/dts/freescale/imx8mn-rve-gateway.dts +f:arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl-mba8mx-lvds-tm070jvhg33.dtso +f:arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl-mba8mx-usbotg.dtso +f:arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl-mba8mx.dts +f:arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-var-som-symphony.dts +f:arch/arm64/boot/dts/freescale/imx8mn-var-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mn-venice-gw7902.dts +f:arch/arm64/boot/dts/freescale/imx8mn.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-aristainetos3-adpismarc.dts +f:arch/arm64/boot/dts/freescale/imx8mp-aristainetos3-helios-lvds.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-aristainetos3-helios.dts +f:arch/arm64/boot/dts/freescale/imx8mp-aristainetos3-proton2s.dts +f:arch/arm64/boot/dts/freescale/imx8mp-aristainetos3a-som-v1.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts +f:arch/arm64/boot/dts/freescale/imx8mp-beacon-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-data-modul-edm-sbc.dts +f:arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts +f:arch/arm64/boot/dts/freescale/imx8mp-debix-som-a-bmb-08.dts +f:arch/arm64/boot/dts/freescale/imx8mp-debix-som-a.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-dhcom-drc02.dts +f:arch/arm64/boot/dts/freescale/imx8mp-dhcom-pdk2.dts +f:arch/arm64/boot/dts/freescale/imx8mp-dhcom-pdk3.dts +f:arch/arm64/boot/dts/freescale/imx8mp-dhcom-picoitx.dts +f:arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-evk-imx-lvds-hdmi-common.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-evk-lvds0-imx-dlvds-hdmi-channel0.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-evk-lvds0-imx-lvds-hdmi-common.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-evk-lvds0-imx-lvds-hdmi.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-evk-lvds1-imx-dlvds-hdmi-channel0.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-evk-lvds1-imx-lvds-hdmi-common.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-evk-lvds1-imx-lvds-hdmi.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-evk-mx8-dlvds-lcd1.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts +f:arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-iota2-lumpy.dts +f:arch/arm64/boot/dts/freescale/imx8mp-kontron-bl-osm-s.dts +f:arch/arm64/boot/dts/freescale/imx8mp-kontron-dl.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-kontron-osm-s.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-kontron-smarc-eval-carrier.dts +f:arch/arm64/boot/dts/freescale/imx8mp-kontron-smarc.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-libra-rdk-fpsc-lvds-etml1010g3dra.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-libra-rdk-fpsc.dts +f:arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s-14N0600E.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s-ep1.dts +f:arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-navqp.dts +f:arch/arm64/boot/dts/freescale/imx8mp-nitrogen-enc-carrier-board.dts +f:arch/arm64/boot/dts/freescale/imx8mp-nitrogen-smarc-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-nitrogen-smarc-universal-board.dts +f:arch/arm64/boot/dts/freescale/imx8mp-nitrogen-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-nominal.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-phyboard-pollux-rdk.dts +f:arch/arm64/boot/dts/freescale/imx8mp-phycore-fpsc.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-phycore-no-eth.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-pinfunc.h +f:arch/arm64/boot/dts/freescale/imx8mp-skov-basic.dts +f:arch/arm64/boot/dts/freescale/imx8mp-skov-reva.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-skov-revb-hdmi.dts +f:arch/arm64/boot/dts/freescale/imx8mp-skov-revb-lt6.dts +f:arch/arm64/boot/dts/freescale/imx8mp-skov-revb-mi1010ait-1cp1.dts +f:arch/arm64/boot/dts/freescale/imx8mp-skov-revc-bd500.dts +f:arch/arm64/boot/dts/freescale/imx8mp-skov-revc-tian-g07017.dts +f:arch/arm64/boot/dts/freescale/imx8mp-toradex-smarc-dev.dts +f:arch/arm64/boot/dts/freescale/imx8mp-toradex-smarc.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mp-ras314-imx219.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mp-ras314.dts +f:arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mpxl-lvds-g133han01.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mpxl-lvds-tm070jvhg33.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mpxl.dts +f:arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-tx8p-ml81-moduline-display-106-av101hdt-a10.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-tx8p-ml81-moduline-display-106-av123z7m-n17.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-tx8p-ml81-moduline-display-106.dts +f:arch/arm64/boot/dts/freescale/imx8mp-tx8p-ml81.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-var-som-symphony.dts +f:arch/arm64/boot/dts/freescale/imx8mp-var-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw702x.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw71xx-2x.dts +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw71xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw72xx-2x.dts +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw72xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw73xx-2x.dts +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw73xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx-imx219.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx-rpidsi.dtso +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw75xx-2x.dts +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw75xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw82xx-2x.dts +f:arch/arm64/boot/dts/freescale/imx8mp-venice-gw82xx.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-dahlia.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-ivy.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-mallow.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-dahlia.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-dev.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-ivy.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-mallow.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi-yavia.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-nonwifi.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-dahlia.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-dev.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-mallow.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-yavia.dts +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-verdin-yavia.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi +f:arch/arm64/boot/dts/freescale/imx8mp.dtsi +f:arch/arm64/boot/dts/freescale/imx8mq-evk.dts +f:arch/arm64/boot/dts/freescale/imx8mq-hummingboard-pulse.dts +f:arch/arm64/boot/dts/freescale/imx8mq-kontron-pitx-imx8m.dts +f:arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts +f:arch/arm64/boot/dts/freescale/imx8mq-librem5-r2.dts +f:arch/arm64/boot/dts/freescale/imx8mq-librem5-r3.dts +f:arch/arm64/boot/dts/freescale/imx8mq-librem5-r3.dtsi +f:arch/arm64/boot/dts/freescale/imx8mq-librem5-r4.dts +f:arch/arm64/boot/dts/freescale/imx8mq-librem5.dtsi +f:arch/arm64/boot/dts/freescale/imx8mq-mnt-reform2.dts +f:arch/arm64/boot/dts/freescale/imx8mq-nitrogen-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mq-nitrogen.dts +f:arch/arm64/boot/dts/freescale/imx8mq-phanbell.dts +f:arch/arm64/boot/dts/freescale/imx8mq-pico-pi.dts +f:arch/arm64/boot/dts/freescale/imx8mq-pinfunc.h +f:arch/arm64/boot/dts/freescale/imx8mq-sr-som.dtsi +f:arch/arm64/boot/dts/freescale/imx8mq-thor96.dts +f:arch/arm64/boot/dts/freescale/imx8mq-tqma8mq-mba8mx-lvds-tm070jvhg33.dtso +f:arch/arm64/boot/dts/freescale/imx8mq-tqma8mq-mba8mx.dts +f:arch/arm64/boot/dts/freescale/imx8mq-tqma8mq.dtsi +f:arch/arm64/boot/dts/freescale/imx8mq-zii-ultra-rmb3.dts +f:arch/arm64/boot/dts/freescale/imx8mq-zii-ultra-zest.dts +f:arch/arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi +f:arch/arm64/boot/dts/freescale/imx8mq.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-apalis-eval-v1.2.dts +f:arch/arm64/boot/dts/freescale/imx8qm-apalis-eval.dts +f:arch/arm64/boot/dts/freescale/imx8qm-apalis-ixora-v1.1.dts +f:arch/arm64/boot/dts/freescale/imx8qm-apalis-v1.1-eval-v1.2.dts +f:arch/arm64/boot/dts/freescale/imx8qm-apalis-v1.1-eval.dts +f:arch/arm64/boot/dts/freescale/imx8qm-apalis-v1.1-ixora-v1.1.dts +f:arch/arm64/boot/dts/freescale/imx8qm-apalis-v1.1-ixora-v1.2.dts +f:arch/arm64/boot/dts/freescale/imx8qm-apalis-v1.1.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-apalis.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-mek-ov5640-csi0.dtso +f:arch/arm64/boot/dts/freescale/imx8qm-mek-ov5640-csi1.dtso +f:arch/arm64/boot/dts/freescale/imx8qm-mek.dts +f:arch/arm64/boot/dts/freescale/imx8qm-ss-audio.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-ss-conn.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-ss-dma.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-ss-hsio.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-ss-img.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-ss-lsio.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-ss-lvds.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm-ss-mipi.dtsi +f:arch/arm64/boot/dts/freescale/imx8qm.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-ai_ml.dts +f:arch/arm64/boot/dts/freescale/imx8qxp-colibri-aster.dts +f:arch/arm64/boot/dts/freescale/imx8qxp-colibri-eval-v3.dts +f:arch/arm64/boot/dts/freescale/imx8qxp-colibri-iris-v2.dts +f:arch/arm64/boot/dts/freescale/imx8qxp-colibri-iris.dts +f:arch/arm64/boot/dts/freescale/imx8qxp-colibri.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-mek-ov5640-csi.dtso +f:arch/arm64/boot/dts/freescale/imx8qxp-mek.dts +f:arch/arm64/boot/dts/freescale/imx8qxp-ss-adma.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-ss-conn.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-ss-hsio.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-ss-img.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-ss-lsio.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-ss-security.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-ss-vpu.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-tqma8xqp-mba8xx.dts +f:arch/arm64/boot/dts/freescale/imx8qxp-tqma8xqp.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp-tqma8xqps-mb-smarc-2.dts +f:arch/arm64/boot/dts/freescale/imx8qxp-tqma8xqps.dtsi +f:arch/arm64/boot/dts/freescale/imx8qxp.dtsi +f:arch/arm64/boot/dts/freescale/imx8ulp-evk.dts +f:arch/arm64/boot/dts/freescale/imx8ulp-pinfunc.h +f:arch/arm64/boot/dts/freescale/imx8ulp.dtsi +f:arch/arm64/boot/dts/freescale/imx8x-colibri-aster.dtsi +f:arch/arm64/boot/dts/freescale/imx8x-colibri-eval-v3.dtsi +f:arch/arm64/boot/dts/freescale/imx8x-colibri-iris-v2.dtsi +f:arch/arm64/boot/dts/freescale/imx8x-colibri-iris.dtsi +f:arch/arm64/boot/dts/freescale/imx8x-colibri.dtsi +f:arch/arm64/boot/dts/freescale/imx93-11x11-evk.dts +f:arch/arm64/boot/dts/freescale/imx93-14x14-evk.dts +f:arch/arm64/boot/dts/freescale/imx93-9x9-qsb-i3c.dtso +f:arch/arm64/boot/dts/freescale/imx93-9x9-qsb.dts +f:arch/arm64/boot/dts/freescale/imx93-kontron-bl-osm-s.dts +f:arch/arm64/boot/dts/freescale/imx93-kontron-osm-s.dtsi +f:arch/arm64/boot/dts/freescale/imx93-phyboard-nash-peb-wlbt-07.dtso +f:arch/arm64/boot/dts/freescale/imx93-phyboard-nash.dts +f:arch/arm64/boot/dts/freescale/imx93-phyboard-segin-peb-eval-01.dtso +f:arch/arm64/boot/dts/freescale/imx93-phyboard-segin-peb-wlbt-05.dtso +f:arch/arm64/boot/dts/freescale/imx93-phyboard-segin.dts +f:arch/arm64/boot/dts/freescale/imx93-phycore-rpmsg.dtso +f:arch/arm64/boot/dts/freescale/imx93-phycore-som.dtsi +f:arch/arm64/boot/dts/freescale/imx93-pinfunc.h +f:arch/arm64/boot/dts/freescale/imx93-tqma9352-mba91xxca.dts +f:arch/arm64/boot/dts/freescale/imx93-tqma9352-mba93xxca.dts +f:arch/arm64/boot/dts/freescale/imx93-tqma9352-mba93xxla.dts +f:arch/arm64/boot/dts/freescale/imx93-tqma9352.dtsi +f:arch/arm64/boot/dts/freescale/imx93-var-som-symphony.dts +f:arch/arm64/boot/dts/freescale/imx93-var-som.dtsi +f:arch/arm64/boot/dts/freescale/imx93.dtsi +f:arch/arm64/boot/dts/freescale/imx94-clock.h +f:arch/arm64/boot/dts/freescale/imx94-pinfunc.h +f:arch/arm64/boot/dts/freescale/imx94-power.h +f:arch/arm64/boot/dts/freescale/imx94.dtsi +f:arch/arm64/boot/dts/freescale/imx943-evk.dts +f:arch/arm64/boot/dts/freescale/imx943.dtsi +f:arch/arm64/boot/dts/freescale/imx95-15x15-evk.dts +f:arch/arm64/boot/dts/freescale/imx95-19x19-evk-sof.dts +f:arch/arm64/boot/dts/freescale/imx95-19x19-evk.dts +f:arch/arm64/boot/dts/freescale/imx95-clock.h +f:arch/arm64/boot/dts/freescale/imx95-libra-rdk-fpsc.dts +f:arch/arm64/boot/dts/freescale/imx95-phycore-fpsc.dtsi +f:arch/arm64/boot/dts/freescale/imx95-pinfunc.h +f:arch/arm64/boot/dts/freescale/imx95-power.h +f:arch/arm64/boot/dts/freescale/imx95-tqma9596sa-mb-smarc-2.dts +f:arch/arm64/boot/dts/freescale/imx95-tqma9596sa.dtsi +f:arch/arm64/boot/dts/freescale/imx95.dtsi +f:arch/arm64/boot/dts/freescale/mba8mx.dtsi +f:arch/arm64/boot/dts/freescale/mba8xx.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-bman-portals.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0-10g-0.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0-10g-1.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0-1g-0.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0-1g-1.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0-1g-2.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0-1g-3.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0-1g-4.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0-1g-5.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-fman3-0.dtsi +f:arch/arm64/boot/dts/freescale/qoriq-qman-portals.dtsi +f:arch/arm64/boot/dts/freescale/s32g2.dtsi +f:arch/arm64/boot/dts/freescale/s32g274a-evb.dts +f:arch/arm64/boot/dts/freescale/s32g274a-rdb2.dts +f:arch/arm64/boot/dts/freescale/s32g3.dtsi +f:arch/arm64/boot/dts/freescale/s32g399a-rdb3.dts +f:arch/arm64/boot/dts/freescale/s32gxxxa-evb.dtsi +f:arch/arm64/boot/dts/freescale/s32gxxxa-rdb.dtsi +f:arch/arm64/boot/dts/freescale/s32v234-evb.dts +f:arch/arm64/boot/dts/freescale/s32v234.dtsi +f:arch/arm64/boot/dts/freescale/tqma8xx.dtsi +f:arch/arm64/boot/dts/freescale/tqma8xxs-mb-smarc-2.dtsi +f:arch/arm64/boot/dts/freescale/tqma8xxs.dtsi +f:arch/arm64/boot/dts/freescale/tqmls104xa-mbls10xxa-fman.dtsi +f:arch/arm64/boot/dts/freescale/tqmls1088a-mbls10xxa-mc.dtsi +f:arch/arm64/boot/dts/freescale/tqmls10xxa-mbls10xxa.dtsi +f:arch/arm64/boot/dts/freescale/tqmls10xxa.dtsi +f:arch/arm64/boot/dts/hisilicon/Makefile +f:arch/arm64/boot/dts/hisilicon/hi3660-coresight.dtsi +f:arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts +f:arch/arm64/boot/dts/hisilicon/hi3660.dtsi +f:arch/arm64/boot/dts/hisilicon/hi3670-hikey970.dts +f:arch/arm64/boot/dts/hisilicon/hi3670.dtsi +f:arch/arm64/boot/dts/hisilicon/hi3798cv200-poplar.dts +f:arch/arm64/boot/dts/hisilicon/hi3798cv200.dtsi +f:arch/arm64/boot/dts/hisilicon/hi6220-coresight.dtsi +f:arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts +f:arch/arm64/boot/dts/hisilicon/hi6220.dtsi +f:arch/arm64/boot/dts/hisilicon/hikey-pinctrl.dtsi +f:arch/arm64/boot/dts/hisilicon/hikey960-pinctrl.dtsi +f:arch/arm64/boot/dts/hisilicon/hikey970-pinctrl.dtsi +f:arch/arm64/boot/dts/hisilicon/hikey970-pmic.dtsi +f:arch/arm64/boot/dts/hisilicon/hip05-d02.dts +f:arch/arm64/boot/dts/hisilicon/hip05.dtsi +f:arch/arm64/boot/dts/hisilicon/hip06-d03.dts +f:arch/arm64/boot/dts/hisilicon/hip06.dtsi +f:arch/arm64/boot/dts/hisilicon/hip07-d05.dts +f:arch/arm64/boot/dts/hisilicon/hip07.dtsi +f:arch/arm64/boot/dts/hisilicon/poplar-pinctrl.dtsi +f:arch/arm64/boot/dts/intel/Makefile +f:arch/arm64/boot/dts/intel/keembay-evm.dts +f:arch/arm64/boot/dts/intel/keembay-soc.dtsi +f:arch/arm64/boot/dts/intel/socfpga_agilex.dtsi +f:arch/arm64/boot/dts/intel/socfpga_agilex5.dtsi +f:arch/arm64/boot/dts/intel/socfpga_agilex5_socdk.dts +f:arch/arm64/boot/dts/intel/socfpga_agilex5_socdk_nand.dts +f:arch/arm64/boot/dts/intel/socfpga_agilex_n6000.dts +f:arch/arm64/boot/dts/intel/socfpga_agilex_socdk.dts +f:arch/arm64/boot/dts/intel/socfpga_agilex_socdk_nand.dts +f:arch/arm64/boot/dts/intel/socfpga_n5x_socdk.dts +f:arch/arm64/boot/dts/lg/Makefile +f:arch/arm64/boot/dts/lg/lg1312-ref.dts +f:arch/arm64/boot/dts/lg/lg1312.dtsi +f:arch/arm64/boot/dts/lg/lg1313-ref.dts +f:arch/arm64/boot/dts/lg/lg1313.dtsi +f:arch/arm64/boot/dts/lg/lg131x.dtsi +f:arch/arm64/boot/dts/marvell/Makefile +f:arch/arm64/boot/dts/marvell/ac5-98dx25xx.dtsi +f:arch/arm64/boot/dts/marvell/ac5-98dx35xx-rd.dts +f:arch/arm64/boot/dts/marvell/ac5-98dx35xx.dtsi +f:arch/arm64/boot/dts/marvell/ac5x-rd-carrier-cn9131.dts +f:arch/arm64/boot/dts/marvell/ac5x-rd-carrier.dtsi +f:arch/arm64/boot/dts/marvell/armada-3720-db.dts +f:arch/arm64/boot/dts/marvell/armada-3720-eDPU.dts +f:arch/arm64/boot/dts/marvell/armada-3720-espressobin-emmc.dts +f:arch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts +f:arch/arm64/boot/dts/marvell/armada-3720-espressobin-v7-emmc.dts +f:arch/arm64/boot/dts/marvell/armada-3720-espressobin-v7.dts +f:arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts +f:arch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi +f:arch/arm64/boot/dts/marvell/armada-3720-gl-mv1000.dts +f:arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +f:arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts +f:arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi +f:arch/arm64/boot/dts/marvell/armada-372x.dtsi +f:arch/arm64/boot/dts/marvell/armada-37xx.dtsi +f:arch/arm64/boot/dts/marvell/armada-7020.dtsi +f:arch/arm64/boot/dts/marvell/armada-7040-db.dts +f:arch/arm64/boot/dts/marvell/armada-7040-mochabin.dts +f:arch/arm64/boot/dts/marvell/armada-7040.dtsi +f:arch/arm64/boot/dts/marvell/armada-70x0.dtsi +f:arch/arm64/boot/dts/marvell/armada-8020.dtsi +f:arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts +f:arch/arm64/boot/dts/marvell/armada-8040-db.dts +f:arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts +f:arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts +f:arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi +f:arch/arm64/boot/dts/marvell/armada-8040-puzzle-m801.dts +f:arch/arm64/boot/dts/marvell/armada-8040.dtsi +f:arch/arm64/boot/dts/marvell/armada-8080-db.dts +f:arch/arm64/boot/dts/marvell/armada-8080.dtsi +f:arch/arm64/boot/dts/marvell/armada-80x0.dtsi +f:arch/arm64/boot/dts/marvell/armada-ap806-dual.dtsi +f:arch/arm64/boot/dts/marvell/armada-ap806-quad.dtsi +f:arch/arm64/boot/dts/marvell/armada-ap806.dtsi +f:arch/arm64/boot/dts/marvell/armada-ap807-quad.dtsi +f:arch/arm64/boot/dts/marvell/armada-ap807.dtsi +f:arch/arm64/boot/dts/marvell/armada-ap80x.dtsi +f:arch/arm64/boot/dts/marvell/armada-ap810-ap0-octa-core.dtsi +f:arch/arm64/boot/dts/marvell/armada-ap810-ap0.dtsi +f:arch/arm64/boot/dts/marvell/armada-common.dtsi +f:arch/arm64/boot/dts/marvell/armada-cp110.dtsi +f:arch/arm64/boot/dts/marvell/armada-cp115.dtsi +f:arch/arm64/boot/dts/marvell/armada-cp11x.dtsi +f:arch/arm64/boot/dts/marvell/cn9130-cf-base.dts +f:arch/arm64/boot/dts/marvell/cn9130-cf-pro.dts +f:arch/arm64/boot/dts/marvell/cn9130-cf.dtsi +f:arch/arm64/boot/dts/marvell/cn9130-crb-A.dts +f:arch/arm64/boot/dts/marvell/cn9130-crb-B.dts +f:arch/arm64/boot/dts/marvell/cn9130-crb.dtsi +f:arch/arm64/boot/dts/marvell/cn9130-db-B.dts +f:arch/arm64/boot/dts/marvell/cn9130-db-comexpress.dtsi +f:arch/arm64/boot/dts/marvell/cn9130-db.dts +f:arch/arm64/boot/dts/marvell/cn9130-db.dtsi +f:arch/arm64/boot/dts/marvell/cn9130-sr-som.dtsi +f:arch/arm64/boot/dts/marvell/cn9130.dtsi +f:arch/arm64/boot/dts/marvell/cn9131-cf-solidwan.dts +f:arch/arm64/boot/dts/marvell/cn9131-db-B.dts +f:arch/arm64/boot/dts/marvell/cn9131-db-comexpress.dtsi +f:arch/arm64/boot/dts/marvell/cn9131-db.dts +f:arch/arm64/boot/dts/marvell/cn9131-db.dtsi +f:arch/arm64/boot/dts/marvell/cn9132-clearfog.dts +f:arch/arm64/boot/dts/marvell/cn9132-db-B.dts +f:arch/arm64/boot/dts/marvell/cn9132-db.dts +f:arch/arm64/boot/dts/marvell/cn9132-db.dtsi +f:arch/arm64/boot/dts/marvell/cn9132-sr-cex7.dtsi +f:arch/arm64/boot/dts/marvell/mmp/Makefile +f:arch/arm64/boot/dts/marvell/mmp/pxa1908-samsung-coreprimevelte.dts +f:arch/arm64/boot/dts/marvell/mmp/pxa1908.dtsi +f:arch/arm64/boot/dts/mediatek/Makefile +f:arch/arm64/boot/dts/mediatek/mt2712-evb.dts +f:arch/arm64/boot/dts/mediatek/mt2712-pinfunc.h +f:arch/arm64/boot/dts/mediatek/mt2712e.dtsi +f:arch/arm64/boot/dts/mediatek/mt6331.dtsi +f:arch/arm64/boot/dts/mediatek/mt6357.dtsi +f:arch/arm64/boot/dts/mediatek/mt6358.dtsi +f:arch/arm64/boot/dts/mediatek/mt6359.dtsi +f:arch/arm64/boot/dts/mediatek/mt6380.dtsi +f:arch/arm64/boot/dts/mediatek/mt6755-evb.dts +f:arch/arm64/boot/dts/mediatek/mt6755.dtsi +f:arch/arm64/boot/dts/mediatek/mt6779-evb.dts +f:arch/arm64/boot/dts/mediatek/mt6779.dtsi +f:arch/arm64/boot/dts/mediatek/mt6795-evb.dts +f:arch/arm64/boot/dts/mediatek/mt6795-sony-xperia-m5.dts +f:arch/arm64/boot/dts/mediatek/mt6795.dtsi +f:arch/arm64/boot/dts/mediatek/mt6797-evb.dts +f:arch/arm64/boot/dts/mediatek/mt6797-x20-dev.dts +f:arch/arm64/boot/dts/mediatek/mt6797.dtsi +f:arch/arm64/boot/dts/mediatek/mt6893-pinfunc.h +f:arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +f:arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts +f:arch/arm64/boot/dts/mediatek/mt7622.dtsi +f:arch/arm64/boot/dts/mediatek/mt7981b-cudy-wr3000-v1.dts +f:arch/arm64/boot/dts/mediatek/mt7981b-openwrt-one.dts +f:arch/arm64/boot/dts/mediatek/mt7981b-xiaomi-ax3000t.dts +f:arch/arm64/boot/dts/mediatek/mt7981b.dtsi +f:arch/arm64/boot/dts/mediatek/mt7986a-acelink-ew-7886cax.dts +f:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3-emmc.dtso +f:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3-mini.dts +f:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3-nand.dtso +f:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3-nor.dtso +f:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3-sata.dtso +f:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3-sd.dtso +f:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts +f:arch/arm64/boot/dts/mediatek/mt7986a-rfb.dts +f:arch/arm64/boot/dts/mediatek/mt7986a.dtsi +f:arch/arm64/boot/dts/mediatek/mt7986b-rfb.dts +f:arch/arm64/boot/dts/mediatek/mt7986b.dtsi +f:arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-2g5.dts +f:arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-emmc.dtso +f:arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4-sd.dtso +f:arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dts +f:arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dtsi +f:arch/arm64/boot/dts/mediatek/mt7988a.dtsi +f:arch/arm64/boot/dts/mediatek/mt8167-pinfunc.h +f:arch/arm64/boot/dts/mediatek/mt8167-pumpkin.dts +f:arch/arm64/boot/dts/mediatek/mt8167.dtsi +f:arch/arm64/boot/dts/mediatek/mt8173-elm-hana-rev7.dts +f:arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dts +f:arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi +f:arch/arm64/boot/dts/mediatek/mt8173-elm.dts +f:arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi +f:arch/arm64/boot/dts/mediatek/mt8173-evb.dts +f:arch/arm64/boot/dts/mediatek/mt8173-pinfunc.h +f:arch/arm64/boot/dts/mediatek/mt8173.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-evb.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-audio-da7219-max98357a.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-audio-da7219-rt1015p.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-audio-da7219.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-audio-max98357a.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-audio-rt1015p.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-audio-ts3a227e-max98357a.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-audio-ts3a227e-rt1015p.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-audio-ts3a227e.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku1.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku6.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku7.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel14-sku2.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel14.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-juniper-sku16.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-juniper.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-kappa.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-kenzo.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-makomo-sku0.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-makomo-sku1.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-pico.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-pico6.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow-sku0.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow-sku1.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu-sku22.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-katsu-sku32.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-katsu-sku38.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama-sku16.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama-sku272.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama-sku288.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama-sku32.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-krane-sku0.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-krane-sku176.dts +f:arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +f:arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts +f:arch/arm64/boot/dts/mediatek/mt8183.dtsi +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-krabby.dtsi +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-magneton-sku393216.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-magneton-sku393217.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-magneton-sku393218.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-rusty-sku196608.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-squirtle.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-starmie-sku0.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-starmie-sku1.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-starmie.dtsi +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-steelix-sku131072.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-steelix-sku131073.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-steelix.dtsi +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-tentacool-sku327681.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-tentacool-sku327683.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-tentacruel-sku262144.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-tentacruel-sku262148.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-voltorb.dts +f:arch/arm64/boot/dts/mediatek/mt8186-corsola-voltorb.dtsi +f:arch/arm64/boot/dts/mediatek/mt8186-corsola.dtsi +f:arch/arm64/boot/dts/mediatek/mt8186-evb.dts +f:arch/arm64/boot/dts/mediatek/mt8186.dtsi +f:arch/arm64/boot/dts/mediatek/mt8188-evb.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri-sku0.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri-sku1.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri-sku2.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri-sku3.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri-sku4.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri-sku5.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri-sku6.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri-sku7.dts +f:arch/arm64/boot/dts/mediatek/mt8188-geralt-ciri.dtsi +f:arch/arm64/boot/dts/mediatek/mt8188-geralt.dtsi +f:arch/arm64/boot/dts/mediatek/mt8188.dtsi +f:arch/arm64/boot/dts/mediatek/mt8192-asurada-hayato-r1.dts +f:arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts +f:arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi +f:arch/arm64/boot/dts/mediatek/mt8192-evb.dts +f:arch/arm64/boot/dts/mediatek/mt8192.dtsi +f:arch/arm64/boot/dts/mediatek/mt8195-cherry-dojo-r1.dts +f:arch/arm64/boot/dts/mediatek/mt8195-cherry-tomato-r1.dts +f:arch/arm64/boot/dts/mediatek/mt8195-cherry-tomato-r2.dts +f:arch/arm64/boot/dts/mediatek/mt8195-cherry-tomato-r3.dts +f:arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi +f:arch/arm64/boot/dts/mediatek/mt8195-demo.dts +f:arch/arm64/boot/dts/mediatek/mt8195-evb.dts +f:arch/arm64/boot/dts/mediatek/mt8195.dtsi +f:arch/arm64/boot/dts/mediatek/mt8196-pinfunc.h +f:arch/arm64/boot/dts/mediatek/mt8365-evk.dts +f:arch/arm64/boot/dts/mediatek/mt8365.dtsi +f:arch/arm64/boot/dts/mediatek/mt8370-genio-510-evk.dts +f:arch/arm64/boot/dts/mediatek/mt8370.dtsi +f:arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts +f:arch/arm64/boot/dts/mediatek/mt8390-genio-common.dtsi +f:arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts +f:arch/arm64/boot/dts/mediatek/mt8395-kontron-3-5-sbc-i1200.dts +f:arch/arm64/boot/dts/mediatek/mt8395-radxa-nio-12l-8-hd-panel.dtso +f:arch/arm64/boot/dts/mediatek/mt8395-radxa-nio-12l.dts +f:arch/arm64/boot/dts/mediatek/mt8516-pinfunc.h +f:arch/arm64/boot/dts/mediatek/mt8516-pumpkin.dts +f:arch/arm64/boot/dts/mediatek/mt8516.dtsi +f:arch/arm64/boot/dts/mediatek/pumpkin-common.dtsi +f:arch/arm64/boot/dts/microchip/Makefile +f:arch/arm64/boot/dts/microchip/sparx5.dtsi +f:arch/arm64/boot/dts/microchip/sparx5_nand.dtsi +f:arch/arm64/boot/dts/microchip/sparx5_pcb125.dts +f:arch/arm64/boot/dts/microchip/sparx5_pcb134.dts +f:arch/arm64/boot/dts/microchip/sparx5_pcb134_board.dtsi +f:arch/arm64/boot/dts/microchip/sparx5_pcb134_emmc.dts +f:arch/arm64/boot/dts/microchip/sparx5_pcb135.dts +f:arch/arm64/boot/dts/microchip/sparx5_pcb135_board.dtsi +f:arch/arm64/boot/dts/microchip/sparx5_pcb135_emmc.dts +f:arch/arm64/boot/dts/microchip/sparx5_pcb_common.dtsi +f:arch/arm64/boot/dts/nuvoton/Makefile +f:arch/arm64/boot/dts/nuvoton/ma35d1-iot-512m.dts +f:arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts +f:arch/arm64/boot/dts/nuvoton/ma35d1.dtsi +f:arch/arm64/boot/dts/nuvoton/nuvoton-common-npcm8xx.dtsi +f:arch/arm64/boot/dts/nuvoton/nuvoton-npcm845-evb.dts +f:arch/arm64/boot/dts/nuvoton/nuvoton-npcm845.dtsi +f:arch/arm64/boot/dts/nvidia/Makefile +f:arch/arm64/boot/dts/nvidia/tegra132-norrin.dts +f:arch/arm64/boot/dts/nvidia/tegra132-peripherals-opp.dtsi +f:arch/arm64/boot/dts/nvidia/tegra132.dtsi +f:arch/arm64/boot/dts/nvidia/tegra186-p2771-0000.dts +f:arch/arm64/boot/dts/nvidia/tegra186-p3310.dtsi +f:arch/arm64/boot/dts/nvidia/tegra186-p3509-0000+p3636-0001.dts +f:arch/arm64/boot/dts/nvidia/tegra186.dtsi +f:arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi +f:arch/arm64/boot/dts/nvidia/tegra194-p2972-0000.dts +f:arch/arm64/boot/dts/nvidia/tegra194-p3509-0000+p3668-0000.dts +f:arch/arm64/boot/dts/nvidia/tegra194-p3509-0000+p3668-0001.dts +f:arch/arm64/boot/dts/nvidia/tegra194-p3509-0000.dtsi +f:arch/arm64/boot/dts/nvidia/tegra194-p3668-0000.dtsi +f:arch/arm64/boot/dts/nvidia/tegra194-p3668-0001.dtsi +f:arch/arm64/boot/dts/nvidia/tegra194-p3668.dtsi +f:arch/arm64/boot/dts/nvidia/tegra194.dtsi +f:arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi +f:arch/arm64/boot/dts/nvidia/tegra210-p2371-0000.dts +f:arch/arm64/boot/dts/nvidia/tegra210-p2371-2180.dts +f:arch/arm64/boot/dts/nvidia/tegra210-p2530.dtsi +f:arch/arm64/boot/dts/nvidia/tegra210-p2571.dts +f:arch/arm64/boot/dts/nvidia/tegra210-p2595.dtsi +f:arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi +f:arch/arm64/boot/dts/nvidia/tegra210-p2894-0050-a08.dts +f:arch/arm64/boot/dts/nvidia/tegra210-p2894.dtsi +f:arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts +f:arch/arm64/boot/dts/nvidia/tegra210-smaug.dts +f:arch/arm64/boot/dts/nvidia/tegra210.dtsi +f:arch/arm64/boot/dts/nvidia/tegra234-p3701-0000.dtsi +f:arch/arm64/boot/dts/nvidia/tegra234-p3701-0008.dtsi +f:arch/arm64/boot/dts/nvidia/tegra234-p3701.dtsi +f:arch/arm64/boot/dts/nvidia/tegra234-p3737-0000+p3701-0000.dts +f:arch/arm64/boot/dts/nvidia/tegra234-p3737-0000+p3701-0008.dts +f:arch/arm64/boot/dts/nvidia/tegra234-p3737-0000+p3701.dtsi +f:arch/arm64/boot/dts/nvidia/tegra234-p3740-0002+p3701-0008.dts +f:arch/arm64/boot/dts/nvidia/tegra234-p3767.dtsi +f:arch/arm64/boot/dts/nvidia/tegra234-p3768-0000+p3767-0000.dts +f:arch/arm64/boot/dts/nvidia/tegra234-p3768-0000+p3767-0005.dts +f:arch/arm64/boot/dts/nvidia/tegra234-p3768-0000+p3767.dtsi +f:arch/arm64/boot/dts/nvidia/tegra234-sim-vdk.dts +f:arch/arm64/boot/dts/nvidia/tegra234.dtsi +f:arch/arm64/boot/dts/nvidia/tegra264-p3834-0008.dtsi +f:arch/arm64/boot/dts/nvidia/tegra264-p3834.dtsi +f:arch/arm64/boot/dts/nvidia/tegra264-p3971-0089+p3834-0008.dts +f:arch/arm64/boot/dts/nvidia/tegra264-p3971-0089+p3834.dtsi +f:arch/arm64/boot/dts/nvidia/tegra264-p3971-0089.dtsi +f:arch/arm64/boot/dts/nvidia/tegra264-p3971.dtsi +f:arch/arm64/boot/dts/nvidia/tegra264.dtsi +f:arch/arm64/boot/dts/qcom/Makefile +f:arch/arm64/boot/dts/qcom/apq8016-sbc-d3-camera-mezzanine.dtso +f:arch/arm64/boot/dts/qcom/apq8016-sbc-usb-host.dtso +f:arch/arm64/boot/dts/qcom/apq8016-sbc.dts +f:arch/arm64/boot/dts/qcom/apq8016-schneider-hmibsc.dts +f:arch/arm64/boot/dts/qcom/apq8039-t2.dts +f:arch/arm64/boot/dts/qcom/apq8094-sony-xperia-kitakami-karin_windy.dts +f:arch/arm64/boot/dts/qcom/apq8096-db820c.dts +f:arch/arm64/boot/dts/qcom/apq8096-ifc6640.dts +f:arch/arm64/boot/dts/qcom/ipq5018-rdp432-c2.dts +f:arch/arm64/boot/dts/qcom/ipq5018-tplink-archer-ax55-v1.dts +f:arch/arm64/boot/dts/qcom/ipq5018.dtsi +f:arch/arm64/boot/dts/qcom/ipq5332-rdp-common.dtsi +f:arch/arm64/boot/dts/qcom/ipq5332-rdp441.dts +f:arch/arm64/boot/dts/qcom/ipq5332-rdp442.dts +f:arch/arm64/boot/dts/qcom/ipq5332-rdp468.dts +f:arch/arm64/boot/dts/qcom/ipq5332-rdp474.dts +f:arch/arm64/boot/dts/qcom/ipq5332.dtsi +f:arch/arm64/boot/dts/qcom/ipq5424-rdp466.dts +f:arch/arm64/boot/dts/qcom/ipq5424.dtsi +f:arch/arm64/boot/dts/qcom/ipq6018-cp01-c1.dts +f:arch/arm64/boot/dts/qcom/ipq6018-mp5496.dtsi +f:arch/arm64/boot/dts/qcom/ipq6018.dtsi +f:arch/arm64/boot/dts/qcom/ipq8074-hk01.dts +f:arch/arm64/boot/dts/qcom/ipq8074-hk10-c1.dts +f:arch/arm64/boot/dts/qcom/ipq8074-hk10-c2.dts +f:arch/arm64/boot/dts/qcom/ipq8074-hk10.dtsi +f:arch/arm64/boot/dts/qcom/ipq8074.dtsi +f:arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi +f:arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts +f:arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +f:arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts +f:arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts +f:arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts +f:arch/arm64/boot/dts/qcom/ipq9574.dtsi +f:arch/arm64/boot/dts/qcom/msm8216-samsung-fortuna3g.dts +f:arch/arm64/boot/dts/qcom/msm8916-acer-a1-724.dts +f:arch/arm64/boot/dts/qcom/msm8916-alcatel-idol347.dts +f:arch/arm64/boot/dts/qcom/msm8916-asus-z00l.dts +f:arch/arm64/boot/dts/qcom/msm8916-gplus-fl8005a.dts +f:arch/arm64/boot/dts/qcom/msm8916-huawei-g7.dts +f:arch/arm64/boot/dts/qcom/msm8916-lg-c50.dts +f:arch/arm64/boot/dts/qcom/msm8916-lg-m216.dts +f:arch/arm64/boot/dts/qcom/msm8916-longcheer-l8150.dts +f:arch/arm64/boot/dts/qcom/msm8916-longcheer-l8910.dts +f:arch/arm64/boot/dts/qcom/msm8916-modem-qdsp6.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-motorola-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-motorola-harpia.dts +f:arch/arm64/boot/dts/qcom/msm8916-motorola-osprey.dts +f:arch/arm64/boot/dts/qcom/msm8916-motorola-surnia.dts +f:arch/arm64/boot/dts/qcom/msm8916-mtp.dts +f:arch/arm64/boot/dts/qcom/msm8916-pm8916.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-samsung-a2015-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-samsung-a3u-eur.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-a5u-eur.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-e2015-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-samsung-e5.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-e7.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-fortuna-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-samsung-gprimeltecan.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-grandmax.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-grandprimelte.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-gt5-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-samsung-gt510.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-gt58.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-j3-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-samsung-j3ltetw.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-j5-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-samsung-j5.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-j5x.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-rossa-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-samsung-rossa.dts +f:arch/arm64/boot/dts/qcom/msm8916-samsung-serranove.dts +f:arch/arm64/boot/dts/qcom/msm8916-thwc-uf896.dts +f:arch/arm64/boot/dts/qcom/msm8916-thwc-ufi001c.dts +f:arch/arm64/boot/dts/qcom/msm8916-ufi.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-wingtech-wt86518.dts +f:arch/arm64/boot/dts/qcom/msm8916-wingtech-wt86528.dts +f:arch/arm64/boot/dts/qcom/msm8916-wingtech-wt865x8.dtsi +f:arch/arm64/boot/dts/qcom/msm8916-wingtech-wt88047.dts +f:arch/arm64/boot/dts/qcom/msm8916-yiming-uz801v3.dts +f:arch/arm64/boot/dts/qcom/msm8916.dtsi +f:arch/arm64/boot/dts/qcom/msm8917-xiaomi-riva.dts +f:arch/arm64/boot/dts/qcom/msm8917.dtsi +f:arch/arm64/boot/dts/qcom/msm8929-pm8916.dtsi +f:arch/arm64/boot/dts/qcom/msm8929-wingtech-wt82918hd.dts +f:arch/arm64/boot/dts/qcom/msm8929.dtsi +f:arch/arm64/boot/dts/qcom/msm8939-huawei-kiwi.dts +f:arch/arm64/boot/dts/qcom/msm8939-longcheer-l9100.dts +f:arch/arm64/boot/dts/qcom/msm8939-pm8916.dtsi +f:arch/arm64/boot/dts/qcom/msm8939-samsung-a7.dts +f:arch/arm64/boot/dts/qcom/msm8939-sony-xperia-kanuti-tulip.dts +f:arch/arm64/boot/dts/qcom/msm8939-wingtech-wt82918.dts +f:arch/arm64/boot/dts/qcom/msm8939-wingtech-wt82918.dtsi +f:arch/arm64/boot/dts/qcom/msm8939-wingtech-wt82918hd.dts +f:arch/arm64/boot/dts/qcom/msm8939.dtsi +f:arch/arm64/boot/dts/qcom/msm8953-motorola-potter.dts +f:arch/arm64/boot/dts/qcom/msm8953-xiaomi-daisy.dts +f:arch/arm64/boot/dts/qcom/msm8953-xiaomi-mido.dts +f:arch/arm64/boot/dts/qcom/msm8953-xiaomi-tissot.dts +f:arch/arm64/boot/dts/qcom/msm8953-xiaomi-vince.dts +f:arch/arm64/boot/dts/qcom/msm8953.dtsi +f:arch/arm64/boot/dts/qcom/msm8956-sony-xperia-loire-kugo.dts +f:arch/arm64/boot/dts/qcom/msm8956-sony-xperia-loire-suzu.dts +f:arch/arm64/boot/dts/qcom/msm8956-sony-xperia-loire.dtsi +f:arch/arm64/boot/dts/qcom/msm8956.dtsi +f:arch/arm64/boot/dts/qcom/msm8976-longcheer-l9360.dts +f:arch/arm64/boot/dts/qcom/msm8976.dtsi +f:arch/arm64/boot/dts/qcom/msm8992-lg-bullhead-rev-10.dts +f:arch/arm64/boot/dts/qcom/msm8992-lg-bullhead-rev-101.dts +f:arch/arm64/boot/dts/qcom/msm8992-lg-bullhead.dtsi +f:arch/arm64/boot/dts/qcom/msm8992-lg-h815.dts +f:arch/arm64/boot/dts/qcom/msm8992-msft-lumia-octagon-talkman.dts +f:arch/arm64/boot/dts/qcom/msm8992-xiaomi-libra.dts +f:arch/arm64/boot/dts/qcom/msm8992.dtsi +f:arch/arm64/boot/dts/qcom/msm8994-huawei-angler-rev-101.dts +f:arch/arm64/boot/dts/qcom/msm8994-msft-lumia-octagon-cityman.dts +f:arch/arm64/boot/dts/qcom/msm8994-msft-lumia-octagon.dtsi +f:arch/arm64/boot/dts/qcom/msm8994-sony-xperia-kitakami-ivy.dts +f:arch/arm64/boot/dts/qcom/msm8994-sony-xperia-kitakami-karin.dts +f:arch/arm64/boot/dts/qcom/msm8994-sony-xperia-kitakami-satsuki.dts +f:arch/arm64/boot/dts/qcom/msm8994-sony-xperia-kitakami-sumire.dts +f:arch/arm64/boot/dts/qcom/msm8994-sony-xperia-kitakami-suzuran.dts +f:arch/arm64/boot/dts/qcom/msm8994-sony-xperia-kitakami.dtsi +f:arch/arm64/boot/dts/qcom/msm8994.dtsi +f:arch/arm64/boot/dts/qcom/msm8996-mtp.dts +f:arch/arm64/boot/dts/qcom/msm8996-oneplus-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8996-oneplus3.dts +f:arch/arm64/boot/dts/qcom/msm8996-oneplus3t.dts +f:arch/arm64/boot/dts/qcom/msm8996-sony-xperia-tone-dora.dts +f:arch/arm64/boot/dts/qcom/msm8996-sony-xperia-tone-kagura.dts +f:arch/arm64/boot/dts/qcom/msm8996-sony-xperia-tone-keyaki.dts +f:arch/arm64/boot/dts/qcom/msm8996-sony-xperia-tone.dtsi +f:arch/arm64/boot/dts/qcom/msm8996-v3.0.dtsi +f:arch/arm64/boot/dts/qcom/msm8996-xiaomi-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8996-xiaomi-gemini.dts +f:arch/arm64/boot/dts/qcom/msm8996.dtsi +f:arch/arm64/boot/dts/qcom/msm8996pro-xiaomi-natrium.dts +f:arch/arm64/boot/dts/qcom/msm8996pro-xiaomi-scorpio.dts +f:arch/arm64/boot/dts/qcom/msm8996pro.dtsi +f:arch/arm64/boot/dts/qcom/msm8998-asus-novago-tp370ql.dts +f:arch/arm64/boot/dts/qcom/msm8998-clamshell.dtsi +f:arch/arm64/boot/dts/qcom/msm8998-fxtec-pro1.dts +f:arch/arm64/boot/dts/qcom/msm8998-hp-envy-x2.dts +f:arch/arm64/boot/dts/qcom/msm8998-lenovo-miix-630.dts +f:arch/arm64/boot/dts/qcom/msm8998-mtp.dts +f:arch/arm64/boot/dts/qcom/msm8998-oneplus-cheeseburger.dts +f:arch/arm64/boot/dts/qcom/msm8998-oneplus-common.dtsi +f:arch/arm64/boot/dts/qcom/msm8998-oneplus-dumpling.dts +f:arch/arm64/boot/dts/qcom/msm8998-sony-xperia-yoshino-lilac.dts +f:arch/arm64/boot/dts/qcom/msm8998-sony-xperia-yoshino-maple.dts +f:arch/arm64/boot/dts/qcom/msm8998-sony-xperia-yoshino-poplar.dts +f:arch/arm64/boot/dts/qcom/msm8998-sony-xperia-yoshino.dtsi +f:arch/arm64/boot/dts/qcom/msm8998-xiaomi-sagit.dts +f:arch/arm64/boot/dts/qcom/msm8998.dtsi +f:arch/arm64/boot/dts/qcom/pm4125.dtsi +f:arch/arm64/boot/dts/qcom/pm6125.dtsi +f:arch/arm64/boot/dts/qcom/pm6150.dtsi +f:arch/arm64/boot/dts/qcom/pm6150l.dtsi +f:arch/arm64/boot/dts/qcom/pm6350.dtsi +f:arch/arm64/boot/dts/qcom/pm660.dtsi +f:arch/arm64/boot/dts/qcom/pm660l.dtsi +f:arch/arm64/boot/dts/qcom/pm7250b.dtsi +f:arch/arm64/boot/dts/qcom/pm7325.dtsi +f:arch/arm64/boot/dts/qcom/pm7550ba.dtsi +f:arch/arm64/boot/dts/qcom/pm8004.dtsi +f:arch/arm64/boot/dts/qcom/pm8005.dtsi +f:arch/arm64/boot/dts/qcom/pm8009.dtsi +f:arch/arm64/boot/dts/qcom/pm8010.dtsi +f:arch/arm64/boot/dts/qcom/pm8150.dtsi +f:arch/arm64/boot/dts/qcom/pm8150b.dtsi +f:arch/arm64/boot/dts/qcom/pm8150l.dtsi +f:arch/arm64/boot/dts/qcom/pm8350.dtsi +f:arch/arm64/boot/dts/qcom/pm8350b.dtsi +f:arch/arm64/boot/dts/qcom/pm8350c.dtsi +f:arch/arm64/boot/dts/qcom/pm8450.dtsi +f:arch/arm64/boot/dts/qcom/pm8550.dtsi +f:arch/arm64/boot/dts/qcom/pm8550b.dtsi +f:arch/arm64/boot/dts/qcom/pm8550ve.dtsi +f:arch/arm64/boot/dts/qcom/pm8550vs.dtsi +f:arch/arm64/boot/dts/qcom/pm8916.dtsi +f:arch/arm64/boot/dts/qcom/pm8937.dtsi +f:arch/arm64/boot/dts/qcom/pm8950.dtsi +f:arch/arm64/boot/dts/qcom/pm8953.dtsi +f:arch/arm64/boot/dts/qcom/pm8994.dtsi +f:arch/arm64/boot/dts/qcom/pm8998.dtsi +f:arch/arm64/boot/dts/qcom/pmd8028.dtsi +f:arch/arm64/boot/dts/qcom/pmi632.dtsi +f:arch/arm64/boot/dts/qcom/pmi8950.dtsi +f:arch/arm64/boot/dts/qcom/pmi8994.dtsi +f:arch/arm64/boot/dts/qcom/pmi8996.dtsi +f:arch/arm64/boot/dts/qcom/pmi8998.dtsi +f:arch/arm64/boot/dts/qcom/pmih0108.dtsi +f:arch/arm64/boot/dts/qcom/pmk8350.dtsi +f:arch/arm64/boot/dts/qcom/pmk8550.dtsi +f:arch/arm64/boot/dts/qcom/pmm8155au_1.dtsi +f:arch/arm64/boot/dts/qcom/pmm8155au_2.dtsi +f:arch/arm64/boot/dts/qcom/pmp8074.dtsi +f:arch/arm64/boot/dts/qcom/pmr735a.dtsi +f:arch/arm64/boot/dts/qcom/pmr735b.dtsi +f:arch/arm64/boot/dts/qcom/pmr735d_a.dtsi +f:arch/arm64/boot/dts/qcom/pmr735d_b.dtsi +f:arch/arm64/boot/dts/qcom/pms405.dtsi +f:arch/arm64/boot/dts/qcom/pmx75.dtsi +f:arch/arm64/boot/dts/qcom/qcm2290.dtsi +f:arch/arm64/boot/dts/qcom/qcm6490-fairphone-fp5.dts +f:arch/arm64/boot/dts/qcom/qcm6490-idp.dts +f:arch/arm64/boot/dts/qcom/qcm6490-shift-otter.dts +f:arch/arm64/boot/dts/qcom/qcs404-evb-1000.dts +f:arch/arm64/boot/dts/qcom/qcs404-evb-4000.dts +f:arch/arm64/boot/dts/qcom/qcs404-evb.dtsi +f:arch/arm64/boot/dts/qcom/qcs404.dtsi +f:arch/arm64/boot/dts/qcom/qcs615-ride.dts +f:arch/arm64/boot/dts/qcom/qcs615.dtsi +f:arch/arm64/boot/dts/qcom/qcs6490-rb3gen2-industrial-mezzanine.dtso +f:arch/arm64/boot/dts/qcom/qcs6490-rb3gen2-vision-mezzanine.dtso +f:arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts +f:arch/arm64/boot/dts/qcom/qcs8300-pmics.dtsi +f:arch/arm64/boot/dts/qcom/qcs8300-ride.dts +f:arch/arm64/boot/dts/qcom/qcs8300.dtsi +f:arch/arm64/boot/dts/qcom/qcs8550-aim300-aiot.dts +f:arch/arm64/boot/dts/qcom/qcs8550-aim300.dtsi +f:arch/arm64/boot/dts/qcom/qcs8550.dtsi +f:arch/arm64/boot/dts/qcom/qcs9100-ride-r3.dts +f:arch/arm64/boot/dts/qcom/qcs9100-ride.dts +f:arch/arm64/boot/dts/qcom/qdu1000-idp.dts +f:arch/arm64/boot/dts/qcom/qdu1000.dtsi +f:arch/arm64/boot/dts/qcom/qrb2210-rb1.dts +f:arch/arm64/boot/dts/qcom/qrb4210-rb2.dts +f:arch/arm64/boot/dts/qcom/qrb5165-rb5-vision-mezzanine.dtso +f:arch/arm64/boot/dts/qcom/qrb5165-rb5.dts +f:arch/arm64/boot/dts/qcom/qru1000-idp.dts +f:arch/arm64/boot/dts/qcom/qru1000.dtsi +f:arch/arm64/boot/dts/qcom/sa8155p-adp.dts +f:arch/arm64/boot/dts/qcom/sa8155p.dtsi +f:arch/arm64/boot/dts/qcom/sa8295p-adp.dts +f:arch/arm64/boot/dts/qcom/sa8540p-pmics.dtsi +f:arch/arm64/boot/dts/qcom/sa8540p-ride.dts +f:arch/arm64/boot/dts/qcom/sa8540p.dtsi +f:arch/arm64/boot/dts/qcom/sa8775p-pmics.dtsi +f:arch/arm64/boot/dts/qcom/sa8775p-ride-r3.dts +f:arch/arm64/boot/dts/qcom/sa8775p-ride.dts +f:arch/arm64/boot/dts/qcom/sa8775p-ride.dtsi +f:arch/arm64/boot/dts/qcom/sa8775p.dtsi +f:arch/arm64/boot/dts/qcom/sar2130p-qar2130p.dts +f:arch/arm64/boot/dts/qcom/sar2130p.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-acer-aspire1.dts +f:arch/arm64/boot/dts/qcom/sc7180-el2.dtso +f:arch/arm64/boot/dts/qcom/sc7180-firmware-tfa.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-idp.dts +f:arch/arm64/boot/dts/qcom/sc7180-lite.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-clamshell.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-detachable.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r2.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r3.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r4.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-kingoftown.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r10.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r4.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r5.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r9.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r10.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r4.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r9.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1-kb.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10-kb.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3-kb.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9-kb.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-lte-sku.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-parade-ps8640.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel-lte-parade.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel-lte-ti.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel-parade.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel-ti.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel360-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel360-wifi.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel360.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-quackingstick-r0-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-quackingstick-r0.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-quackingstick.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-r1-lte.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-r1.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-rt5682i-sku.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-rt5682s-sku.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-ti-sn65dsi86.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler-rev1-boe-rt5682s.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler-rev1-boe.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler-rev1-inx-rt5682s.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler-rev1-inx.dts +f:arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler.dtsi +f:arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi +f:arch/arm64/boot/dts/qcom/sc7180.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-chrome-common.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-crd-r3.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-audio-rt5682-3mic.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-audio-rt5682.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-audio-wcd9385.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-crd-pro.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-crd.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-evoker-lte.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-evoker.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-evoker.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-herobrine-r1.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-lte-sku.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-nvme-sku.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-pro-sku.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r0.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r1-lte.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r1.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-villager-r1.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-villager.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-wifi-sku.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-zombie-lte.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-zombie-nvme-lte.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-zombie-nvme.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-zombie.dts +f:arch/arm64/boot/dts/qcom/sc7280-herobrine-zombie.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-herobrine.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-idp-ec-h1.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-idp.dts +f:arch/arm64/boot/dts/qcom/sc7280-idp.dtsi +f:arch/arm64/boot/dts/qcom/sc7280-idp2.dts +f:arch/arm64/boot/dts/qcom/sc7280-qcard.dtsi +f:arch/arm64/boot/dts/qcom/sc7280.dtsi +f:arch/arm64/boot/dts/qcom/sc8180x-lenovo-flex-5g.dts +f:arch/arm64/boot/dts/qcom/sc8180x-pmics.dtsi +f:arch/arm64/boot/dts/qcom/sc8180x-primus.dts +f:arch/arm64/boot/dts/qcom/sc8180x.dtsi +f:arch/arm64/boot/dts/qcom/sc8280xp-crd.dts +f:arch/arm64/boot/dts/qcom/sc8280xp-el2.dtso +f:arch/arm64/boot/dts/qcom/sc8280xp-huawei-gaokun3.dts +f:arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts +f:arch/arm64/boot/dts/qcom/sc8280xp-microsoft-arcata.dts +f:arch/arm64/boot/dts/qcom/sc8280xp-microsoft-blackrock.dts +f:arch/arm64/boot/dts/qcom/sc8280xp-pmics.dtsi +f:arch/arm64/boot/dts/qcom/sc8280xp.dtsi +f:arch/arm64/boot/dts/qcom/sda660-inforce-ifc6560.dts +f:arch/arm64/boot/dts/qcom/sdm450-lenovo-tbx605f.dts +f:arch/arm64/boot/dts/qcom/sdm450-motorola-ali.dts +f:arch/arm64/boot/dts/qcom/sdm450.dtsi +f:arch/arm64/boot/dts/qcom/sdm630-sony-xperia-ganges-kirin.dts +f:arch/arm64/boot/dts/qcom/sdm630-sony-xperia-nile-discovery.dts +f:arch/arm64/boot/dts/qcom/sdm630-sony-xperia-nile-pioneer.dts +f:arch/arm64/boot/dts/qcom/sdm630-sony-xperia-nile-voyager.dts +f:arch/arm64/boot/dts/qcom/sdm630-sony-xperia-nile.dtsi +f:arch/arm64/boot/dts/qcom/sdm630.dtsi +f:arch/arm64/boot/dts/qcom/sdm632-fairphone-fp3.dts +f:arch/arm64/boot/dts/qcom/sdm632-motorola-ocean.dts +f:arch/arm64/boot/dts/qcom/sdm632.dtsi +f:arch/arm64/boot/dts/qcom/sdm636-sony-xperia-ganges-mermaid.dts +f:arch/arm64/boot/dts/qcom/sdm636.dtsi +f:arch/arm64/boot/dts/qcom/sdm660-xiaomi-lavender.dts +f:arch/arm64/boot/dts/qcom/sdm660.dtsi +f:arch/arm64/boot/dts/qcom/sdm670-google-sargo.dts +f:arch/arm64/boot/dts/qcom/sdm670.dtsi +f:arch/arm64/boot/dts/qcom/sdm845-cheza-r1.dts +f:arch/arm64/boot/dts/qcom/sdm845-cheza-r2.dts +f:arch/arm64/boot/dts/qcom/sdm845-cheza-r3.dts +f:arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi +f:arch/arm64/boot/dts/qcom/sdm845-db845c-navigation-mezzanine.dtso +f:arch/arm64/boot/dts/qcom/sdm845-db845c.dts +f:arch/arm64/boot/dts/qcom/sdm845-lg-common.dtsi +f:arch/arm64/boot/dts/qcom/sdm845-lg-judyln.dts +f:arch/arm64/boot/dts/qcom/sdm845-lg-judyp.dts +f:arch/arm64/boot/dts/qcom/sdm845-mtp.dts +f:arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi +f:arch/arm64/boot/dts/qcom/sdm845-oneplus-enchilada.dts +f:arch/arm64/boot/dts/qcom/sdm845-oneplus-fajita.dts +f:arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts +f:arch/arm64/boot/dts/qcom/sdm845-shift-axolotl.dts +f:arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama-akari.dts +f:arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama-akatsuki.dts +f:arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama-apollo.dts +f:arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama.dtsi +f:arch/arm64/boot/dts/qcom/sdm845-wcd9340.dtsi +f:arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium-common.dtsi +f:arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium-ebbg.dts +f:arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium-tianma.dts +f:arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts +f:arch/arm64/boot/dts/qcom/sdm845.dtsi +f:arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts +f:arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts +f:arch/arm64/boot/dts/qcom/sdm850.dtsi +f:arch/arm64/boot/dts/qcom/sdx75-idp.dts +f:arch/arm64/boot/dts/qcom/sdx75.dtsi +f:arch/arm64/boot/dts/qcom/sm4250-oneplus-billie2.dts +f:arch/arm64/boot/dts/qcom/sm4250.dtsi +f:arch/arm64/boot/dts/qcom/sm4450-qrd.dts +f:arch/arm64/boot/dts/qcom/sm4450.dtsi +f:arch/arm64/boot/dts/qcom/sm6115-fxtec-pro1x.dts +f:arch/arm64/boot/dts/qcom/sm6115.dtsi +f:arch/arm64/boot/dts/qcom/sm6115p-lenovo-j606f.dts +f:arch/arm64/boot/dts/qcom/sm6125-sony-xperia-seine-pdx201.dts +f:arch/arm64/boot/dts/qcom/sm6125-xiaomi-ginkgo.dts +f:arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts +f:arch/arm64/boot/dts/qcom/sm6125.dtsi +f:arch/arm64/boot/dts/qcom/sm6350-sony-xperia-lena-pdx213.dts +f:arch/arm64/boot/dts/qcom/sm6350.dtsi +f:arch/arm64/boot/dts/qcom/sm6375-sony-xperia-murray-pdx225.dts +f:arch/arm64/boot/dts/qcom/sm6375.dtsi +f:arch/arm64/boot/dts/qcom/sm7125-xiaomi-common.dtsi +f:arch/arm64/boot/dts/qcom/sm7125-xiaomi-curtana.dts +f:arch/arm64/boot/dts/qcom/sm7125-xiaomi-joyeuse.dts +f:arch/arm64/boot/dts/qcom/sm7125.dtsi +f:arch/arm64/boot/dts/qcom/sm7225-fairphone-fp4.dts +f:arch/arm64/boot/dts/qcom/sm7225.dtsi +f:arch/arm64/boot/dts/qcom/sm7325-nothing-spacewar.dts +f:arch/arm64/boot/dts/qcom/sm7325.dtsi +f:arch/arm64/boot/dts/qcom/sm8150-hdk.dts +f:arch/arm64/boot/dts/qcom/sm8150-microsoft-surface-duo.dts +f:arch/arm64/boot/dts/qcom/sm8150-mtp.dts +f:arch/arm64/boot/dts/qcom/sm8150-sony-xperia-kumano-bahamut.dts +f:arch/arm64/boot/dts/qcom/sm8150-sony-xperia-kumano-griffin.dts +f:arch/arm64/boot/dts/qcom/sm8150-sony-xperia-kumano.dtsi +f:arch/arm64/boot/dts/qcom/sm8150.dtsi +f:arch/arm64/boot/dts/qcom/sm8250-hdk.dts +f:arch/arm64/boot/dts/qcom/sm8250-mtp.dts +f:arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo-pdx203.dts +f:arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo-pdx206.dts +f:arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo.dtsi +f:arch/arm64/boot/dts/qcom/sm8250-xiaomi-elish-boe.dts +f:arch/arm64/boot/dts/qcom/sm8250-xiaomi-elish-common.dtsi +f:arch/arm64/boot/dts/qcom/sm8250-xiaomi-elish-csot.dts +f:arch/arm64/boot/dts/qcom/sm8250-xiaomi-pipa.dts +f:arch/arm64/boot/dts/qcom/sm8250.dtsi +f:arch/arm64/boot/dts/qcom/sm8350-hdk.dts +f:arch/arm64/boot/dts/qcom/sm8350-microsoft-surface-duo2.dts +f:arch/arm64/boot/dts/qcom/sm8350-mtp.dts +f:arch/arm64/boot/dts/qcom/sm8350-sony-xperia-sagami-pdx214.dts +f:arch/arm64/boot/dts/qcom/sm8350-sony-xperia-sagami-pdx215.dts +f:arch/arm64/boot/dts/qcom/sm8350-sony-xperia-sagami.dtsi +f:arch/arm64/boot/dts/qcom/sm8350.dtsi +f:arch/arm64/boot/dts/qcom/sm8450-hdk.dts +f:arch/arm64/boot/dts/qcom/sm8450-qrd.dts +f:arch/arm64/boot/dts/qcom/sm8450-sony-xperia-nagara-pdx223.dts +f:arch/arm64/boot/dts/qcom/sm8450-sony-xperia-nagara-pdx224.dts +f:arch/arm64/boot/dts/qcom/sm8450-sony-xperia-nagara.dtsi +f:arch/arm64/boot/dts/qcom/sm8450.dtsi +f:arch/arm64/boot/dts/qcom/sm8550-hdk.dts +f:arch/arm64/boot/dts/qcom/sm8550-mtp.dts +f:arch/arm64/boot/dts/qcom/sm8550-qrd.dts +f:arch/arm64/boot/dts/qcom/sm8550-samsung-q5q.dts +f:arch/arm64/boot/dts/qcom/sm8550-sony-xperia-yodo-pdx234.dts +f:arch/arm64/boot/dts/qcom/sm8550.dtsi +f:arch/arm64/boot/dts/qcom/sm8650-hdk-display-card.dtso +f:arch/arm64/boot/dts/qcom/sm8650-hdk.dts +f:arch/arm64/boot/dts/qcom/sm8650-mtp.dts +f:arch/arm64/boot/dts/qcom/sm8650-qrd.dts +f:arch/arm64/boot/dts/qcom/sm8650.dtsi +f:arch/arm64/boot/dts/qcom/sm8750-mtp.dts +f:arch/arm64/boot/dts/qcom/sm8750-pmics.dtsi +f:arch/arm64/boot/dts/qcom/sm8750-qrd.dts +f:arch/arm64/boot/dts/qcom/sm8750.dtsi +f:arch/arm64/boot/dts/qcom/x1-asus-zenbook-a14.dtsi +f:arch/arm64/boot/dts/qcom/x1-crd.dtsi +f:arch/arm64/boot/dts/qcom/x1-el2.dtso +f:arch/arm64/boot/dts/qcom/x1e001de-devkit.dts +f:arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s-oled.dts +f:arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dts +f:arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi +f:arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts +f:arch/arm64/boot/dts/qcom/x1e80100-asus-zenbook-a14.dts +f:arch/arm64/boot/dts/qcom/x1e80100-crd.dts +f:arch/arm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts +f:arch/arm64/boot/dts/qcom/x1e80100-hp-elitebook-ultra-g1q.dts +f:arch/arm64/boot/dts/qcom/x1e80100-hp-omnibook-x14.dts +f:arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts +f:arch/arm64/boot/dts/qcom/x1e80100-microsoft-romulus.dtsi +f:arch/arm64/boot/dts/qcom/x1e80100-microsoft-romulus13.dts +f:arch/arm64/boot/dts/qcom/x1e80100-microsoft-romulus15.dts +f:arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi +f:arch/arm64/boot/dts/qcom/x1e80100-qcp.dts +f:arch/arm64/boot/dts/qcom/x1e80100.dtsi +f:arch/arm64/boot/dts/qcom/x1p42100-asus-zenbook-a14.dts +f:arch/arm64/boot/dts/qcom/x1p42100-crd.dts +f:arch/arm64/boot/dts/qcom/x1p42100.dtsi +f:arch/arm64/boot/dts/realtek/Makefile +f:arch/arm64/boot/dts/realtek/rtd1293-ds418j.dts +f:arch/arm64/boot/dts/realtek/rtd1293.dtsi +f:arch/arm64/boot/dts/realtek/rtd1295-mele-v9.dts +f:arch/arm64/boot/dts/realtek/rtd1295-probox2-ava.dts +f:arch/arm64/boot/dts/realtek/rtd1295-xnano-x5.dts +f:arch/arm64/boot/dts/realtek/rtd1295-zidoo-x9s.dts +f:arch/arm64/boot/dts/realtek/rtd1295.dtsi +f:arch/arm64/boot/dts/realtek/rtd1296-ds418.dts +f:arch/arm64/boot/dts/realtek/rtd1296.dtsi +f:arch/arm64/boot/dts/realtek/rtd129x.dtsi +f:arch/arm64/boot/dts/realtek/rtd1395-bpi-m4.dts +f:arch/arm64/boot/dts/realtek/rtd1395-lionskin.dts +f:arch/arm64/boot/dts/realtek/rtd1395.dtsi +f:arch/arm64/boot/dts/realtek/rtd139x.dtsi +f:arch/arm64/boot/dts/realtek/rtd1619-mjolnir.dts +f:arch/arm64/boot/dts/realtek/rtd1619.dtsi +f:arch/arm64/boot/dts/realtek/rtd16xx.dtsi +f:arch/arm64/boot/dts/renesas/Makefile +f:arch/arm64/boot/dts/renesas/aistarvision-mipi-adapter-2.1.dtsi +f:arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi +f:arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi +f:arch/arm64/boot/dts/renesas/cat875.dtsi +f:arch/arm64/boot/dts/renesas/condor-common.dtsi +f:arch/arm64/boot/dts/renesas/draak-ebisu-panel-aa104xd12.dtso +f:arch/arm64/boot/dts/renesas/draak.dtsi +f:arch/arm64/boot/dts/renesas/ebisu.dtsi +f:arch/arm64/boot/dts/renesas/gmsl-cameras.dtsi +f:arch/arm64/boot/dts/renesas/gray-hawk-single.dtsi +f:arch/arm64/boot/dts/renesas/hihope-common.dtsi +f:arch/arm64/boot/dts/renesas/hihope-rev2.dtsi +f:arch/arm64/boot/dts/renesas/hihope-rev4.dtsi +f:arch/arm64/boot/dts/renesas/hihope-rzg2-ex-aistarvision-mipi-adapter-2.1.dtsi +f:arch/arm64/boot/dts/renesas/hihope-rzg2-ex-lvds.dtsi +f:arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi +f:arch/arm64/boot/dts/renesas/panel-aa104xd12.dtsi +f:arch/arm64/boot/dts/renesas/r8a774a1-beacon-rzg2m-kit.dts +f:arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-ex-idk-1110wr.dts +f:arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-ex-mipi-2.1.dts +f:arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-ex.dts +f:arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-rev2-ex-idk-1110wr.dts +f:arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-rev2-ex.dts +f:arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-rev2.dts +f:arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m.dts +f:arch/arm64/boot/dts/renesas/r8a774a1.dtsi +f:arch/arm64/boot/dts/renesas/r8a774b1-beacon-rzg2n-kit.dts +f:arch/arm64/boot/dts/renesas/r8a774b1-hihope-rzg2n-ex-idk-1110wr.dts +f:arch/arm64/boot/dts/renesas/r8a774b1-hihope-rzg2n-ex-mipi-2.1.dts +f:arch/arm64/boot/dts/renesas/r8a774b1-hihope-rzg2n-ex.dts +f:arch/arm64/boot/dts/renesas/r8a774b1-hihope-rzg2n-rev2-ex-idk-1110wr.dts +f:arch/arm64/boot/dts/renesas/r8a774b1-hihope-rzg2n-rev2-ex.dts +f:arch/arm64/boot/dts/renesas/r8a774b1-hihope-rzg2n-rev2.dts +f:arch/arm64/boot/dts/renesas/r8a774b1-hihope-rzg2n.dts +f:arch/arm64/boot/dts/renesas/r8a774b1.dtsi +f:arch/arm64/boot/dts/renesas/r8a774c0-cat874.dts +f:arch/arm64/boot/dts/renesas/r8a774c0-ek874-idk-2121wr.dts +f:arch/arm64/boot/dts/renesas/r8a774c0-ek874-mipi-2.1.dts +f:arch/arm64/boot/dts/renesas/r8a774c0-ek874.dts +f:arch/arm64/boot/dts/renesas/r8a774c0.dtsi +f:arch/arm64/boot/dts/renesas/r8a774e1-beacon-rzg2h-kit.dts +f:arch/arm64/boot/dts/renesas/r8a774e1-hihope-rzg2h-ex-idk-1110wr.dts +f:arch/arm64/boot/dts/renesas/r8a774e1-hihope-rzg2h-ex-mipi-2.1.dts +f:arch/arm64/boot/dts/renesas/r8a774e1-hihope-rzg2h-ex.dts +f:arch/arm64/boot/dts/renesas/r8a774e1-hihope-rzg2h.dts +f:arch/arm64/boot/dts/renesas/r8a774e1.dtsi +f:arch/arm64/boot/dts/renesas/r8a77951-salvator-x.dts +f:arch/arm64/boot/dts/renesas/r8a77951-salvator-xs.dts +f:arch/arm64/boot/dts/renesas/r8a77951-ulcb-kf.dts +f:arch/arm64/boot/dts/renesas/r8a77951-ulcb.dts +f:arch/arm64/boot/dts/renesas/r8a77951.dtsi +f:arch/arm64/boot/dts/renesas/r8a77960-salvator-x.dts +f:arch/arm64/boot/dts/renesas/r8a77960-salvator-xs.dts +f:arch/arm64/boot/dts/renesas/r8a77960-ulcb-kf.dts +f:arch/arm64/boot/dts/renesas/r8a77960-ulcb.dts +f:arch/arm64/boot/dts/renesas/r8a77960.dtsi +f:arch/arm64/boot/dts/renesas/r8a77961-salvator-xs.dts +f:arch/arm64/boot/dts/renesas/r8a77961-ulcb-kf.dts +f:arch/arm64/boot/dts/renesas/r8a77961-ulcb.dts +f:arch/arm64/boot/dts/renesas/r8a77961.dtsi +f:arch/arm64/boot/dts/renesas/r8a77965-salvator-x.dts +f:arch/arm64/boot/dts/renesas/r8a77965-salvator-xs.dts +f:arch/arm64/boot/dts/renesas/r8a77965-ulcb-kf.dts +f:arch/arm64/boot/dts/renesas/r8a77965-ulcb.dts +f:arch/arm64/boot/dts/renesas/r8a77965.dtsi +f:arch/arm64/boot/dts/renesas/r8a77970-eagle-function-expansion.dtso +f:arch/arm64/boot/dts/renesas/r8a77970-eagle.dts +f:arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts +f:arch/arm64/boot/dts/renesas/r8a77970.dtsi +f:arch/arm64/boot/dts/renesas/r8a77980-condor.dts +f:arch/arm64/boot/dts/renesas/r8a77980-v3hsk.dts +f:arch/arm64/boot/dts/renesas/r8a77980.dtsi +f:arch/arm64/boot/dts/renesas/r8a77980a-condor-i.dts +f:arch/arm64/boot/dts/renesas/r8a77980a.dtsi +f:arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts +f:arch/arm64/boot/dts/renesas/r8a77990.dtsi +f:arch/arm64/boot/dts/renesas/r8a77995-draak.dts +f:arch/arm64/boot/dts/renesas/r8a77995.dtsi +f:arch/arm64/boot/dts/renesas/r8a779a0-falcon-cpu.dtsi +f:arch/arm64/boot/dts/renesas/r8a779a0-falcon-csi-dsi.dtsi +f:arch/arm64/boot/dts/renesas/r8a779a0-falcon-ethernet.dtsi +f:arch/arm64/boot/dts/renesas/r8a779a0-falcon.dts +f:arch/arm64/boot/dts/renesas/r8a779a0.dtsi +f:arch/arm64/boot/dts/renesas/r8a779f0-spider-cpu.dtsi +f:arch/arm64/boot/dts/renesas/r8a779f0-spider-ethernet.dtsi +f:arch/arm64/boot/dts/renesas/r8a779f0-spider.dts +f:arch/arm64/boot/dts/renesas/r8a779f0.dtsi +f:arch/arm64/boot/dts/renesas/r8a779f4-s4sk.dts +f:arch/arm64/boot/dts/renesas/r8a779f4.dtsi +f:arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-cpu.dts +f:arch/arm64/boot/dts/renesas/r8a779g0-white-hawk-cpu.dtsi +f:arch/arm64/boot/dts/renesas/r8a779g0-white-hawk.dts +f:arch/arm64/boot/dts/renesas/r8a779g0.dtsi +f:arch/arm64/boot/dts/renesas/r8a779g2-white-hawk-single.dts +f:arch/arm64/boot/dts/renesas/r8a779g2.dtsi +f:arch/arm64/boot/dts/renesas/r8a779g3-sparrow-hawk-fan-pwm.dtso +f:arch/arm64/boot/dts/renesas/r8a779g3-sparrow-hawk.dts +f:arch/arm64/boot/dts/renesas/r8a779g3-white-hawk-single.dts +f:arch/arm64/boot/dts/renesas/r8a779g3.dtsi +f:arch/arm64/boot/dts/renesas/r8a779h0-gray-hawk-single.dts +f:arch/arm64/boot/dts/renesas/r8a779h0.dtsi +f:arch/arm64/boot/dts/renesas/r8a779h2-gray-hawk-single.dts +f:arch/arm64/boot/dts/renesas/r8a779h2.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m0.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m1-salvator-xs.dts +f:arch/arm64/boot/dts/renesas/r8a779m1-ulcb-kf.dts +f:arch/arm64/boot/dts/renesas/r8a779m1-ulcb.dts +f:arch/arm64/boot/dts/renesas/r8a779m1.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m2.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m3-salvator-xs.dts +f:arch/arm64/boot/dts/renesas/r8a779m3-ulcb-kf.dts +f:arch/arm64/boot/dts/renesas/r8a779m3-ulcb.dts +f:arch/arm64/boot/dts/renesas/r8a779m3.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m4.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m5-salvator-xs.dts +f:arch/arm64/boot/dts/renesas/r8a779m5.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m6.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m7.dtsi +f:arch/arm64/boot/dts/renesas/r8a779m8.dtsi +f:arch/arm64/boot/dts/renesas/r8a779mb.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g043-smarc-pmod.dtso +f:arch/arm64/boot/dts/renesas/r9a07g043.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g043u.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g043u11-smarc-cru-csi-ov5645.dtso +f:arch/arm64/boot/dts/renesas/r9a07g043u11-smarc-du-adv7513.dtso +f:arch/arm64/boot/dts/renesas/r9a07g043u11-smarc.dts +f:arch/arm64/boot/dts/renesas/r9a07g044.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g044c1.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g044c2-smarc-cru-csi-ov5645.dtso +f:arch/arm64/boot/dts/renesas/r9a07g044c2-smarc.dts +f:arch/arm64/boot/dts/renesas/r9a07g044c2.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g044l1.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g044l2-remi-pi.dts +f:arch/arm64/boot/dts/renesas/r9a07g044l2-smarc-cru-csi-ov5645.dtso +f:arch/arm64/boot/dts/renesas/r9a07g044l2-smarc.dts +f:arch/arm64/boot/dts/renesas/r9a07g044l2.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g054.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g054l1.dtsi +f:arch/arm64/boot/dts/renesas/r9a07g054l2-smarc.dts +f:arch/arm64/boot/dts/renesas/r9a07g054l2.dtsi +f:arch/arm64/boot/dts/renesas/r9a08g045.dtsi +f:arch/arm64/boot/dts/renesas/r9a08g045s33-smarc-pmod1-type-3a.dtso +f:arch/arm64/boot/dts/renesas/r9a08g045s33-smarc.dts +f:arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi +f:arch/arm64/boot/dts/renesas/r9a09g011-v2mevk2.dts +f:arch/arm64/boot/dts/renesas/r9a09g011.dtsi +f:arch/arm64/boot/dts/renesas/r9a09g047.dtsi +f:arch/arm64/boot/dts/renesas/r9a09g047e37.dtsi +f:arch/arm64/boot/dts/renesas/r9a09g047e57-smarc-cru-csi-ov5645.dtso +f:arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts +f:arch/arm64/boot/dts/renesas/r9a09g047e57.dtsi +f:arch/arm64/boot/dts/renesas/r9a09g056.dtsi +f:arch/arm64/boot/dts/renesas/r9a09g056n48-rzv2n-evk.dts +f:arch/arm64/boot/dts/renesas/r9a09g057.dtsi +f:arch/arm64/boot/dts/renesas/r9a09g057h44-rzv2h-evk.dts +f:arch/arm64/boot/dts/renesas/r9a09g057h48-kakip.dts +f:arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi +f:arch/arm64/boot/dts/renesas/rz-smarc-common.dtsi +f:arch/arm64/boot/dts/renesas/rz-smarc-cru-csi-ov5645.dtsi +f:arch/arm64/boot/dts/renesas/rz-smarc-du-adv7513.dtsi +f:arch/arm64/boot/dts/renesas/rzg2-advantech-idk-1110wr-panel.dtsi +f:arch/arm64/boot/dts/renesas/rzg2l-smarc-pinfunction.dtsi +f:arch/arm64/boot/dts/renesas/rzg2l-smarc-som.dtsi +f:arch/arm64/boot/dts/renesas/rzg2l-smarc.dtsi +f:arch/arm64/boot/dts/renesas/rzg2lc-smarc-pinfunction.dtsi +f:arch/arm64/boot/dts/renesas/rzg2lc-smarc-som.dtsi +f:arch/arm64/boot/dts/renesas/rzg2lc-smarc.dtsi +f:arch/arm64/boot/dts/renesas/rzg2ul-smarc-pinfunction.dtsi +f:arch/arm64/boot/dts/renesas/rzg2ul-smarc-som.dtsi +f:arch/arm64/boot/dts/renesas/rzg2ul-smarc.dtsi +f:arch/arm64/boot/dts/renesas/rzg3e-smarc-som.dtsi +f:arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi +f:arch/arm64/boot/dts/renesas/rzg3s-smarc-switches.h +f:arch/arm64/boot/dts/renesas/rzg3s-smarc.dtsi +f:arch/arm64/boot/dts/renesas/rzv2-evk-cn15-emmc.dtso +f:arch/arm64/boot/dts/renesas/rzv2-evk-cn15-sd.dtso +f:arch/arm64/boot/dts/renesas/salvator-common.dtsi +f:arch/arm64/boot/dts/renesas/salvator-panel-aa104xd12.dtso +f:arch/arm64/boot/dts/renesas/salvator-x.dtsi +f:arch/arm64/boot/dts/renesas/salvator-xs.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-audio-graph-card-mix+split.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-audio-graph-card.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-audio-graph-card2-mix+split.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-audio-graph-card2.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-kf-audio-graph-card-mix+split.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-kf-audio-graph-card.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-kf-audio-graph-card2-mix+split.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-kf-audio-graph-card2.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-kf-simple-audio-card-mix+split.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-kf-simple-audio-card.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-kf.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-simple-audio-card-mix+split.dtsi +f:arch/arm64/boot/dts/renesas/ulcb-simple-audio-card.dtsi +f:arch/arm64/boot/dts/renesas/ulcb.dtsi +f:arch/arm64/boot/dts/renesas/white-hawk-ard-audio-da7212.dtso +f:arch/arm64/boot/dts/renesas/white-hawk-common.dtsi +f:arch/arm64/boot/dts/renesas/white-hawk-cpu-common.dtsi +f:arch/arm64/boot/dts/renesas/white-hawk-csi-dsi.dtsi +f:arch/arm64/boot/dts/renesas/white-hawk-ethernet.dtsi +f:arch/arm64/boot/dts/renesas/white-hawk-single.dtsi +f:arch/arm64/boot/dts/rockchip/Makefile +f:arch/arm64/boot/dts/rockchip/px30-cobra-ltk050h3146w-a2.dts +f:arch/arm64/boot/dts/rockchip/px30-cobra-ltk050h3146w.dts +f:arch/arm64/boot/dts/rockchip/px30-cobra-ltk050h3148w.dts +f:arch/arm64/boot/dts/rockchip/px30-cobra-ltk500hd1829.dts +f:arch/arm64/boot/dts/rockchip/px30-cobra.dtsi +f:arch/arm64/boot/dts/rockchip/px30-engicam-common.dtsi +f:arch/arm64/boot/dts/rockchip/px30-engicam-ctouch2.dtsi +f:arch/arm64/boot/dts/rockchip/px30-engicam-edimm2.2.dtsi +f:arch/arm64/boot/dts/rockchip/px30-engicam-px30-core-ctouch2-of10.dts +f:arch/arm64/boot/dts/rockchip/px30-engicam-px30-core-ctouch2.dts +f:arch/arm64/boot/dts/rockchip/px30-engicam-px30-core-edimm2.2.dts +f:arch/arm64/boot/dts/rockchip/px30-engicam-px30-core.dtsi +f:arch/arm64/boot/dts/rockchip/px30-evb.dts +f:arch/arm64/boot/dts/rockchip/px30-firefly-jd4-core-mb.dts +f:arch/arm64/boot/dts/rockchip/px30-firefly-jd4-core.dtsi +f:arch/arm64/boot/dts/rockchip/px30-pp1516-ltk050h3146w-a2.dts +f:arch/arm64/boot/dts/rockchip/px30-pp1516-ltk050h3148w.dts +f:arch/arm64/boot/dts/rockchip/px30-pp1516.dtsi +f:arch/arm64/boot/dts/rockchip/px30-ringneck-haikou-lvds-9904379.dtso +f:arch/arm64/boot/dts/rockchip/px30-ringneck-haikou-video-demo.dtso +f:arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts +f:arch/arm64/boot/dts/rockchip/px30-ringneck.dtsi +f:arch/arm64/boot/dts/rockchip/px30.dtsi +f:arch/arm64/boot/dts/rockchip/rk3308-bpi-p2-pro.dts +f:arch/arm64/boot/dts/rockchip/rk3308-evb.dts +f:arch/arm64/boot/dts/rockchip/rk3308-roc-cc.dts +f:arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts +f:arch/arm64/boot/dts/rockchip/rk3308-rock-s0.dts +f:arch/arm64/boot/dts/rockchip/rk3308-sakurapi-rk3308b.dts +f:arch/arm64/boot/dts/rockchip/rk3308.dtsi +f:arch/arm64/boot/dts/rockchip/rk3318-a95x-z2.dts +f:arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dts +f:arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dtsi +f:arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351v.dts +f:arch/arm64/boot/dts/rockchip/rk3326-gameforce-chi.dts +f:arch/arm64/boot/dts/rockchip/rk3326-odroid-go.dtsi +f:arch/arm64/boot/dts/rockchip/rk3326-odroid-go2-v11.dts +f:arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts +f:arch/arm64/boot/dts/rockchip/rk3326-odroid-go3.dts +f:arch/arm64/boot/dts/rockchip/rk3326.dtsi +f:arch/arm64/boot/dts/rockchip/rk3328-a1.dts +f:arch/arm64/boot/dts/rockchip/rk3328-evb.dts +f:arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2.dtsi +f:arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dts +f:arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dtsi +f:arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +f:arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dtsi +f:arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts +f:arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dtsi +f:arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts +f:arch/arm64/boot/dts/rockchip/rk3328-roc-pc.dts +f:arch/arm64/boot/dts/rockchip/rk3328-roc.dtsi +f:arch/arm64/boot/dts/rockchip/rk3328-rock-pi-e.dts +f:arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +f:arch/arm64/boot/dts/rockchip/rk3328.dtsi +f:arch/arm64/boot/dts/rockchip/rk3368-evb-act8846.dts +f:arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi +f:arch/arm64/boot/dts/rockchip/rk3368-geekbox.dts +f:arch/arm64/boot/dts/rockchip/rk3368-lba3368.dts +f:arch/arm64/boot/dts/rockchip/rk3368-lion-haikou.dts +f:arch/arm64/boot/dts/rockchip/rk3368-lion.dtsi +f:arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts +f:arch/arm64/boot/dts/rockchip/rk3368-px5-evb.dts +f:arch/arm64/boot/dts/rockchip/rk3368-r88.dts +f:arch/arm64/boot/dts/rockchip/rk3368.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-base.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-eaidk-610.dts +f:arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dts +f:arch/arm64/boot/dts/rockchip/rk3399-evb.dts +f:arch/arm64/boot/dts/rockchip/rk3399-ficus.dts +f:arch/arm64/boot/dts/rockchip/rk3399-firefly.dts +f:arch/arm64/boot/dts/rockchip/rk3399-gru-bob.dts +f:arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts +f:arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-dumo.dts +f:arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-inx.dts +f:arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-kd.dts +f:arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-hugsun-x99.dts +f:arch/arm64/boot/dts/rockchip/rk3399-khadas-edge-captain.dts +f:arch/arm64/boot/dts/rockchip/rk3399-khadas-edge-v.dts +f:arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dts +f:arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-kobol-helios64.dts +f:arch/arm64/boot/dts/rockchip/rk3399-leez-p710.dts +f:arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts +f:arch/arm64/boot/dts/rockchip/rk3399-nanopi-m4.dts +f:arch/arm64/boot/dts/rockchip/rk3399-nanopi-m4.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-nanopi-m4b.dts +f:arch/arm64/boot/dts/rockchip/rk3399-nanopi-neo4.dts +f:arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s-enterprise.dts +f:arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts +f:arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-op1.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-orangepi.dts +f:arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts +f:arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts +f:arch/arm64/boot/dts/rockchip/rk3399-puma-haikou-video-demo.dtso +f:arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts +f:arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-roc-pc-mezzanine.dts +f:arch/arm64/boot/dts/rockchip/rk3399-roc-pc-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dts +f:arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-rock-4c-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rock-4se.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4a-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4a.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4b-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4b.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4c.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rock960.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-rockpro64-screen.dtso +f:arch/arm64/boot/dts/rockchip/rk3399-rockpro64-v2.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts +f:arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-s.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts +f:arch/arm64/boot/dts/rockchip/rk3399-sapphire.dts +f:arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399-t.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399.dtsi +f:arch/arm64/boot/dts/rockchip/rk3399pro-rock-pi-n10.dts +f:arch/arm64/boot/dts/rockchip/rk3399pro-vmarc-som.dtsi +f:arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi +f:arch/arm64/boot/dts/rockchip/rk3528-radxa-e20c.dts +f:arch/arm64/boot/dts/rockchip/rk3528.dtsi +f:arch/arm64/boot/dts/rockchip/rk3562-evb2-v10.dts +f:arch/arm64/boot/dts/rockchip/rk3562-pinctrl.dtsi +f:arch/arm64/boot/dts/rockchip/rk3562.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg-arc-d.dts +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg-arc-s.dts +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg-arc.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353v.dts +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353vs.dts +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353x.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts +f:arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-base.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-bigtreetech-cb2-manta.dts +f:arch/arm64/boot/dts/rockchip/rk3566-bigtreetech-cb2.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-bigtreetech-pi2.dts +f:arch/arm64/boot/dts/rockchip/rk3566-box-demo.dts +f:arch/arm64/boot/dts/rockchip/rk3566-lckfb-tspi.dts +f:arch/arm64/boot/dts/rockchip/rk3566-lubancat-1.dts +f:arch/arm64/boot/dts/rockchip/rk3566-nanopi-r3s.dts +f:arch/arm64/boot/dts/rockchip/rk3566-odroid-m1s.dts +f:arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b-v1.1.dts +f:arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b-v2.1.dts +f:arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-pinenote-v1.1.dts +f:arch/arm64/boot/dts/rockchip/rk3566-pinenote-v1.2.dts +f:arch/arm64/boot/dts/rockchip/rk3566-pinenote.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-pinetab2-v0.1.dts +f:arch/arm64/boot/dts/rockchip/rk3566-pinetab2-v2.0.dts +f:arch/arm64/boot/dts/rockchip/rk3566-pinetab2.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts +f:arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb20sx.dts +f:arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts +f:arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts +f:arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-powkiddy-x55.dts +f:arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts +f:arch/arm64/boot/dts/rockchip/rk3566-quartz64-b.dts +f:arch/arm64/boot/dts/rockchip/rk3566-radxa-cm3-io.dts +f:arch/arm64/boot/dts/rockchip/rk3566-radxa-cm3.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-radxa-zero-3.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566-radxa-zero-3e.dts +f:arch/arm64/boot/dts/rockchip/rk3566-radxa-zero-3w.dts +f:arch/arm64/boot/dts/rockchip/rk3566-roc-pc.dts +f:arch/arm64/boot/dts/rockchip/rk3566-rock-3c.dts +f:arch/arm64/boot/dts/rockchip/rk3566-soquartz-blade.dts +f:arch/arm64/boot/dts/rockchip/rk3566-soquartz-cm4.dts +f:arch/arm64/boot/dts/rockchip/rk3566-soquartz-model-a.dts +f:arch/arm64/boot/dts/rockchip/rk3566-soquartz.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566.dtsi +f:arch/arm64/boot/dts/rockchip/rk3566t.dtsi +f:arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +f:arch/arm64/boot/dts/rockchip/rk3568-evb1-v10.dts +f:arch/arm64/boot/dts/rockchip/rk3568-fastrhino-r66s.dts +f:arch/arm64/boot/dts/rockchip/rk3568-fastrhino-r66s.dtsi +f:arch/arm64/boot/dts/rockchip/rk3568-fastrhino-r68s.dts +f:arch/arm64/boot/dts/rockchip/rk3568-lubancat-2.dts +f:arch/arm64/boot/dts/rockchip/rk3568-mecsbc.dts +f:arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5c.dts +f:arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dts +f:arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dtsi +f:arch/arm64/boot/dts/rockchip/rk3568-odroid-m1.dts +f:arch/arm64/boot/dts/rockchip/rk3568-photonicat.dts +f:arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi +f:arch/arm64/boot/dts/rockchip/rk3568-qnap-ts433.dts +f:arch/arm64/boot/dts/rockchip/rk3568-radxa-cm3i.dtsi +f:arch/arm64/boot/dts/rockchip/rk3568-radxa-e25.dts +f:arch/arm64/boot/dts/rockchip/rk3568-roc-pc.dts +f:arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts +f:arch/arm64/boot/dts/rockchip/rk3568-rock-3b.dts +f:arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5-display-vz.dtso +f:arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5-display.dtsi +f:arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5-io-expander.dtso +f:arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5.dts +f:arch/arm64/boot/dts/rockchip/rk3568.dtsi +f:arch/arm64/boot/dts/rockchip/rk356x-base.dtsi +f:arch/arm64/boot/dts/rockchip/rk3576-armsom-sige5-v1.2-wifibt.dtso +f:arch/arm64/boot/dts/rockchip/rk3576-armsom-sige5.dts +f:arch/arm64/boot/dts/rockchip/rk3576-evb1-v10.dts +f:arch/arm64/boot/dts/rockchip/rk3576-luckfox-core3576.dtsi +f:arch/arm64/boot/dts/rockchip/rk3576-luckfox-omni3576.dts +f:arch/arm64/boot/dts/rockchip/rk3576-nanopi-m5.dts +f:arch/arm64/boot/dts/rockchip/rk3576-pinctrl.dtsi +f:arch/arm64/boot/dts/rockchip/rk3576-roc-pc.dts +f:arch/arm64/boot/dts/rockchip/rk3576-rock-4d.dts +f:arch/arm64/boot/dts/rockchip/rk3576.dtsi +f:arch/arm64/boot/dts/rockchip/rk3582-radxa-e52c.dts +f:arch/arm64/boot/dts/rockchip/rk3588-armsom-lm7.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-armsom-sige7.dts +f:arch/arm64/boot/dts/rockchip/rk3588-armsom-w3.dts +f:arch/arm64/boot/dts/rockchip/rk3588-base-pinctrl.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-base.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-evb.dts +f:arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5-genbook.dts +f:arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-common.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-io.dts +f:arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-io.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-wifi.dtso +f:arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6b-io.dts +f:arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6b.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts +f:arch/arm64/boot/dts/rockchip/rk3588-evb2-v10.dts +f:arch/arm64/boot/dts/rockchip/rk3588-extra-pinctrl.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-fet3588-c.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-firefly-core-3588j.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-firefly-icore-3588q.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-firefly-itx-3588j.dts +f:arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588-nas.dts +f:arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-h96-max-v58.dts +f:arch/arm64/boot/dts/rockchip/rk3588-jaguar-ethernet-switch.dtso +f:arch/arm64/boot/dts/rockchip/rk3588-jaguar-pre-ict-tester.dtso +f:arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts +f:arch/arm64/boot/dts/rockchip/rk3588-mnt-reform2.dts +f:arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6-lts.dts +f:arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dts +f:arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-ok3588-c.dts +f:arch/arm64/boot/dts/rockchip/rk3588-opp.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-compact.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-max.dts +f:arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-ultra.dts +f:arch/arm64/boot/dts/rockchip/rk3588-orangepi-5.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-quartzpro64.dts +f:arch/arm64/boot/dts/rockchip/rk3588-rock-5-itx.dts +f:arch/arm64/boot/dts/rockchip/rk3588-rock-5b-5bp-5t.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-rock-5b-pcie-ep.dtso +f:arch/arm64/boot/dts/rockchip/rk3588-rock-5b-pcie-srns.dtso +f:arch/arm64/boot/dts/rockchip/rk3588-rock-5b-plus.dts +f:arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts +f:arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-rock-5t.dts +f:arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou-video-demo.dtso +f:arch/arm64/boot/dts/rockchip/rk3588-tiger-haikou.dts +f:arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588-toybrick-x0.dts +f:arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dts +f:arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588j.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-evb1-v10.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-khadas-edge2.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6c.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6s.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dtsi +f:arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5b.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-roc-pc.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts +f:arch/arm64/boot/dts/rockchip/rk3588s-rock-5c.dts +f:arch/arm64/boot/dts/rockchip/rk3588s.dtsi +f:arch/arm64/boot/dts/rockchip/rk8xx.h +f:arch/arm64/boot/dts/rockchip/rockchip-pinconf.dtsi +f:arch/arm64/boot/dts/socionext/Makefile +f:arch/arm64/boot/dts/socionext/uniphier-ld11-global.dts +f:arch/arm64/boot/dts/socionext/uniphier-ld11-ref.dts +f:arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi +f:arch/arm64/boot/dts/socionext/uniphier-ld20-akebi96.dts +f:arch/arm64/boot/dts/socionext/uniphier-ld20-global.dts +f:arch/arm64/boot/dts/socionext/uniphier-ld20-ref.dts +f:arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi +f:arch/arm64/boot/dts/socionext/uniphier-pinctrl.dtsi +f:arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget0.dts +f:arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget1.dts +f:arch/arm64/boot/dts/socionext/uniphier-pxs3-ref.dts +f:arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi +f:arch/arm64/boot/dts/socionext/uniphier-ref-daughter.dtsi +f:arch/arm64/boot/dts/socionext/uniphier-support-card.dtsi +f:arch/arm64/boot/dts/sophgo/Makefile +f:arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-module-01-evb.dts +f:arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-module-01.dtsi +f:arch/arm64/boot/dts/sophgo/sg2000.dtsi +f:arch/arm64/boot/dts/sprd/Makefile +f:arch/arm64/boot/dts/sprd/sc2731.dtsi +f:arch/arm64/boot/dts/sprd/sc9836-openphone.dts +f:arch/arm64/boot/dts/sprd/sc9836.dtsi +f:arch/arm64/boot/dts/sprd/sc9860.dtsi +f:arch/arm64/boot/dts/sprd/sc9863a.dtsi +f:arch/arm64/boot/dts/sprd/sharkl3.dtsi +f:arch/arm64/boot/dts/sprd/sharkl64.dtsi +f:arch/arm64/boot/dts/sprd/sp9860g-1h10.dts +f:arch/arm64/boot/dts/sprd/sp9863a-1h10.dts +f:arch/arm64/boot/dts/sprd/ums512-1h10.dts +f:arch/arm64/boot/dts/sprd/ums512.dtsi +f:arch/arm64/boot/dts/sprd/ums9620-2h10.dts +f:arch/arm64/boot/dts/sprd/ums9620.dtsi +f:arch/arm64/boot/dts/sprd/whale2.dtsi +f:arch/arm64/boot/dts/st/Makefile +f:arch/arm64/boot/dts/st/stm32mp211.dtsi +f:arch/arm64/boot/dts/st/stm32mp213.dtsi +f:arch/arm64/boot/dts/st/stm32mp215.dtsi +f:arch/arm64/boot/dts/st/stm32mp215f-dk.dts +f:arch/arm64/boot/dts/st/stm32mp21xc.dtsi +f:arch/arm64/boot/dts/st/stm32mp21xf.dtsi +f:arch/arm64/boot/dts/st/stm32mp231.dtsi +f:arch/arm64/boot/dts/st/stm32mp233.dtsi +f:arch/arm64/boot/dts/st/stm32mp235.dtsi +f:arch/arm64/boot/dts/st/stm32mp235f-dk.dts +f:arch/arm64/boot/dts/st/stm32mp23xc.dtsi +f:arch/arm64/boot/dts/st/stm32mp23xf.dtsi +f:arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi +f:arch/arm64/boot/dts/st/stm32mp251.dtsi +f:arch/arm64/boot/dts/st/stm32mp253.dtsi +f:arch/arm64/boot/dts/st/stm32mp255.dtsi +f:arch/arm64/boot/dts/st/stm32mp257.dtsi +f:arch/arm64/boot/dts/st/stm32mp257f-dk.dts +f:arch/arm64/boot/dts/st/stm32mp257f-ev1.dts +f:arch/arm64/boot/dts/st/stm32mp25xc.dtsi +f:arch/arm64/boot/dts/st/stm32mp25xf.dtsi +f:arch/arm64/boot/dts/st/stm32mp25xxai-pinctrl.dtsi +f:arch/arm64/boot/dts/st/stm32mp25xxak-pinctrl.dtsi +f:arch/arm64/boot/dts/st/stm32mp25xxal-pinctrl.dtsi +f:arch/arm64/boot/dts/synaptics/Makefile +f:arch/arm64/boot/dts/synaptics/berlin4ct-dmp.dts +f:arch/arm64/boot/dts/synaptics/berlin4ct-stb.dts +f:arch/arm64/boot/dts/synaptics/berlin4ct.dtsi +f:arch/arm64/boot/dts/tesla/Makefile +f:arch/arm64/boot/dts/tesla/fsd-evb.dts +f:arch/arm64/boot/dts/tesla/fsd-pinctrl.dtsi +f:arch/arm64/boot/dts/tesla/fsd-pinctrl.h +f:arch/arm64/boot/dts/tesla/fsd.dtsi +f:arch/arm64/boot/dts/ti/Makefile +f:arch/arm64/boot/dts/ti/k3-am62-lp-sk-nand.dtso +f:arch/arm64/boot/dts/ti/k3-am62-lp-sk.dts +f:arch/arm64/boot/dts/ti/k3-am62-main.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-phycore-som.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-pocketbeagle2.dts +f:arch/arm64/boot/dts/ti/k3-am62-thermal.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-verdin-dahlia.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-verdin-dev.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-verdin-ivy.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-verdin-mallow.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-verdin-nonwifi.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-verdin-wifi.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-verdin-yavia.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-verdin.dtsi +f:arch/arm64/boot/dts/ti/k3-am62-wakeup.dtsi +f:arch/arm64/boot/dts/ti/k3-am62.dtsi +f:arch/arm64/boot/dts/ti/k3-am625-beagleplay-csi2-ov5640.dtso +f:arch/arm64/boot/dts/ti/k3-am625-beagleplay-csi2-tevi-ov5640.dtso +f:arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts +f:arch/arm64/boot/dts/ti/k3-am625-phyboard-lyra-rdk.dts +f:arch/arm64/boot/dts/ti/k3-am625-sk.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-nonwifi-dahlia.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-nonwifi-dev.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-nonwifi-ivy.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-nonwifi-mallow.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-nonwifi-yavia.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-wifi-dahlia.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-wifi-dev.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-wifi-ivy.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-wifi-mallow.dts +f:arch/arm64/boot/dts/ti/k3-am625-verdin-wifi-yavia.dts +f:arch/arm64/boot/dts/ti/k3-am625.dtsi +f:arch/arm64/boot/dts/ti/k3-am62a-main.dtsi +f:arch/arm64/boot/dts/ti/k3-am62a-mcu.dtsi +f:arch/arm64/boot/dts/ti/k3-am62a-phycore-som.dtsi +f:arch/arm64/boot/dts/ti/k3-am62a-thermal.dtsi +f:arch/arm64/boot/dts/ti/k3-am62a-wakeup.dtsi +f:arch/arm64/boot/dts/ti/k3-am62a.dtsi +f:arch/arm64/boot/dts/ti/k3-am62a7-phyboard-lyra-rdk.dts +f:arch/arm64/boot/dts/ti/k3-am62a7-sk.dts +f:arch/arm64/boot/dts/ti/k3-am62a7.dtsi +f:arch/arm64/boot/dts/ti/k3-am62d2-evm.dts +f:arch/arm64/boot/dts/ti/k3-am62d2.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-j722s-common-main.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-j722s-common-mcu.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-j722s-common-thermal.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-j722s-common-wakeup.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-main.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-verdin-dahlia.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-verdin-dev.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-verdin-ivy.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-verdin-mallow.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-verdin-nonwifi.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-verdin-wifi.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-verdin-yavia.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p-verdin.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p.dtsi +f:arch/arm64/boot/dts/ti/k3-am62p5-sk.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-nonwifi-dahlia.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-nonwifi-dev.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-nonwifi-ivy.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-nonwifi-mallow.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-nonwifi-yavia.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-wifi-dahlia.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-wifi-dev.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-wifi-ivy.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-wifi-mallow.dts +f:arch/arm64/boot/dts/ti/k3-am62p5-verdin-wifi-yavia.dts +f:arch/arm64/boot/dts/ti/k3-am62p5.dtsi +f:arch/arm64/boot/dts/ti/k3-am62x-phyboard-lyra-gpio-fan.dtso +f:arch/arm64/boot/dts/ti/k3-am62x-phyboard-lyra.dtsi +f:arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi +f:arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-imx219.dtso +f:arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-ov5640.dtso +f:arch/arm64/boot/dts/ti/k3-am62x-sk-csi2-tevi-ov5640.dtso +f:arch/arm64/boot/dts/ti/k3-am62x-sk-hdmi-audio.dtso +f:arch/arm64/boot/dts/ti/k3-am64-main.dtsi +f:arch/arm64/boot/dts/ti/k3-am64-mcu.dtsi +f:arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi +f:arch/arm64/boot/dts/ti/k3-am64-thermal.dtsi +f:arch/arm64/boot/dts/ti/k3-am64-tqma64xxl-mbax4xxl-sdcard.dtso +f:arch/arm64/boot/dts/ti/k3-am64-tqma64xxl-mbax4xxl-wlan.dtso +f:arch/arm64/boot/dts/ti/k3-am64.dtsi +f:arch/arm64/boot/dts/ti/k3-am642-evm-icssg1-dualemac-mii.dtso +f:arch/arm64/boot/dts/ti/k3-am642-evm-icssg1-dualemac.dtso +f:arch/arm64/boot/dts/ti/k3-am642-evm-nand.dtso +f:arch/arm64/boot/dts/ti/k3-am642-evm-pcie0-ep.dtso +f:arch/arm64/boot/dts/ti/k3-am642-evm.dts +f:arch/arm64/boot/dts/ti/k3-am642-hummingboard-t-pcie.dts +f:arch/arm64/boot/dts/ti/k3-am642-hummingboard-t-usb3.dts +f:arch/arm64/boot/dts/ti/k3-am642-hummingboard-t.dts +f:arch/arm64/boot/dts/ti/k3-am642-phyboard-electra-gpio-fan.dtso +f:arch/arm64/boot/dts/ti/k3-am642-phyboard-electra-pcie-usb2.dtso +f:arch/arm64/boot/dts/ti/k3-am642-phyboard-electra-rdk.dts +f:arch/arm64/boot/dts/ti/k3-am642-phyboard-electra-x27-gpio1-spi1-uart3.dtso +f:arch/arm64/boot/dts/ti/k3-am642-sk.dts +f:arch/arm64/boot/dts/ti/k3-am642-sr-som.dtsi +f:arch/arm64/boot/dts/ti/k3-am642-tqma64xxl-mbax4xxl.dts +f:arch/arm64/boot/dts/ti/k3-am642-tqma64xxl.dtsi +f:arch/arm64/boot/dts/ti/k3-am642.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-iot2050-arduino-connector.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-iot2050-common-pg1.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-iot2050-common-pg2.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-iot2050-common.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-iot2050-dp.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-iot2050-usb3.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-main.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-mcu.dtsi +f:arch/arm64/boot/dts/ti/k3-am65-wakeup.dtsi +f:arch/arm64/boot/dts/ti/k3-am65.dtsi +f:arch/arm64/boot/dts/ti/k3-am652.dtsi +f:arch/arm64/boot/dts/ti/k3-am6528-iot2050-basic-common.dtsi +f:arch/arm64/boot/dts/ti/k3-am6528-iot2050-basic-pg2.dts +f:arch/arm64/boot/dts/ti/k3-am6528-iot2050-basic.dts +f:arch/arm64/boot/dts/ti/k3-am654-base-board-rocktech-rk101-panel.dtso +f:arch/arm64/boot/dts/ti/k3-am654-base-board.dts +f:arch/arm64/boot/dts/ti/k3-am654-icssg2.dtso +f:arch/arm64/boot/dts/ti/k3-am654-idk.dtso +f:arch/arm64/boot/dts/ti/k3-am654-industrial-thermal.dtsi +f:arch/arm64/boot/dts/ti/k3-am654-pcie-usb2.dtso +f:arch/arm64/boot/dts/ti/k3-am654-pcie-usb3.dtso +f:arch/arm64/boot/dts/ti/k3-am654.dtsi +f:arch/arm64/boot/dts/ti/k3-am6548-iot2050-advanced-common.dtsi +f:arch/arm64/boot/dts/ti/k3-am6548-iot2050-advanced-m2-bkey-ekey-pcie.dtso +f:arch/arm64/boot/dts/ti/k3-am6548-iot2050-advanced-m2-bkey-usb3.dtso +f:arch/arm64/boot/dts/ti/k3-am6548-iot2050-advanced-m2.dts +f:arch/arm64/boot/dts/ti/k3-am6548-iot2050-advanced-pg2.dts +f:arch/arm64/boot/dts/ti/k3-am6548-iot2050-advanced-sm.dts +f:arch/arm64/boot/dts/ti/k3-am6548-iot2050-advanced.dts +f:arch/arm64/boot/dts/ti/k3-am67a-beagley-ai.dts +f:arch/arm64/boot/dts/ti/k3-am68-phyboard-izar.dts +f:arch/arm64/boot/dts/ti/k3-am68-phycore-som.dtsi +f:arch/arm64/boot/dts/ti/k3-am68-sk-base-board-pcie1-ep.dtso +f:arch/arm64/boot/dts/ti/k3-am68-sk-base-board.dts +f:arch/arm64/boot/dts/ti/k3-am68-sk-som.dtsi +f:arch/arm64/boot/dts/ti/k3-am69-sk-pcie0-ep.dtso +f:arch/arm64/boot/dts/ti/k3-am69-sk.dts +f:arch/arm64/boot/dts/ti/k3-am6xx-phycore-disable-eth-phy.dtso +f:arch/arm64/boot/dts/ti/k3-am6xx-phycore-disable-rtc.dtso +f:arch/arm64/boot/dts/ti/k3-am6xx-phycore-disable-spi-nor.dtso +f:arch/arm64/boot/dts/ti/k3-am6xx-phycore-qspi-nor.dtso +f:arch/arm64/boot/dts/ti/k3-j7200-common-proc-board.dts +f:arch/arm64/boot/dts/ti/k3-j7200-evm-pcie1-ep.dtso +f:arch/arm64/boot/dts/ti/k3-j7200-evm-quad-port-eth-exp.dtso +f:arch/arm64/boot/dts/ti/k3-j7200-main.dtsi +f:arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi +f:arch/arm64/boot/dts/ti/k3-j7200-som-p0.dtsi +f:arch/arm64/boot/dts/ti/k3-j7200-thermal.dtsi +f:arch/arm64/boot/dts/ti/k3-j7200.dtsi +f:arch/arm64/boot/dts/ti/k3-j721e-beagleboneai64.dts +f:arch/arm64/boot/dts/ti/k3-j721e-common-proc-board-infotainment.dtso +f:arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts +f:arch/arm64/boot/dts/ti/k3-j721e-evm-gesi-exp-board.dtso +f:arch/arm64/boot/dts/ti/k3-j721e-evm-pcie0-ep.dtso +f:arch/arm64/boot/dts/ti/k3-j721e-evm-pcie1-ep.dtso +f:arch/arm64/boot/dts/ti/k3-j721e-evm-quad-port-eth-exp.dtso +f:arch/arm64/boot/dts/ti/k3-j721e-main.dtsi +f:arch/arm64/boot/dts/ti/k3-j721e-mcu-wakeup.dtsi +f:arch/arm64/boot/dts/ti/k3-j721e-sk-csi2-dual-imx219.dtso +f:arch/arm64/boot/dts/ti/k3-j721e-sk.dts +f:arch/arm64/boot/dts/ti/k3-j721e-som-p0.dtsi +f:arch/arm64/boot/dts/ti/k3-j721e-thermal.dtsi +f:arch/arm64/boot/dts/ti/k3-j721e.dtsi +f:arch/arm64/boot/dts/ti/k3-j721s2-common-proc-board.dts +f:arch/arm64/boot/dts/ti/k3-j721s2-evm-gesi-exp-board.dtso +f:arch/arm64/boot/dts/ti/k3-j721s2-evm-pcie1-ep.dtso +f:arch/arm64/boot/dts/ti/k3-j721s2-main.dtsi +f:arch/arm64/boot/dts/ti/k3-j721s2-mcu-wakeup.dtsi +f:arch/arm64/boot/dts/ti/k3-j721s2-som-p0.dtsi +f:arch/arm64/boot/dts/ti/k3-j721s2-thermal.dtsi +f:arch/arm64/boot/dts/ti/k3-j721s2.dtsi +f:arch/arm64/boot/dts/ti/k3-j722s-evm-csi2-quad-rpi-cam-imx219.dtso +f:arch/arm64/boot/dts/ti/k3-j722s-evm-csi2-quad-tevi-ov5640.dtso +f:arch/arm64/boot/dts/ti/k3-j722s-evm.dts +f:arch/arm64/boot/dts/ti/k3-j722s-main.dtsi +f:arch/arm64/boot/dts/ti/k3-j722s.dtsi +f:arch/arm64/boot/dts/ti/k3-j742s2-evm.dts +f:arch/arm64/boot/dts/ti/k3-j742s2-main.dtsi +f:arch/arm64/boot/dts/ti/k3-j742s2.dtsi +f:arch/arm64/boot/dts/ti/k3-j784s4-evm-pcie0-pcie1-ep.dtso +f:arch/arm64/boot/dts/ti/k3-j784s4-evm-quad-port-eth-exp1.dtso +f:arch/arm64/boot/dts/ti/k3-j784s4-evm-usxgmii-exp1-exp2.dtso +f:arch/arm64/boot/dts/ti/k3-j784s4-evm.dts +f:arch/arm64/boot/dts/ti/k3-j784s4-j742s2-common.dtsi +f:arch/arm64/boot/dts/ti/k3-j784s4-j742s2-evm-common.dtsi +f:arch/arm64/boot/dts/ti/k3-j784s4-j742s2-evm-usb0-type-a.dtso +f:arch/arm64/boot/dts/ti/k3-j784s4-j742s2-main-common.dtsi +f:arch/arm64/boot/dts/ti/k3-j784s4-j742s2-mcu-wakeup-common.dtsi +f:arch/arm64/boot/dts/ti/k3-j784s4-j742s2-thermal-common.dtsi +f:arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi +f:arch/arm64/boot/dts/ti/k3-j784s4.dtsi +f:arch/arm64/boot/dts/ti/k3-pinctrl.h +f:arch/arm64/boot/dts/ti/k3-serdes.h +f:arch/arm64/boot/dts/toshiba/Makefile +f:arch/arm64/boot/dts/toshiba/tmpv7708-rm-mbrc.dts +f:arch/arm64/boot/dts/toshiba/tmpv7708-visrobo-vrb.dts +f:arch/arm64/boot/dts/toshiba/tmpv7708-visrobo-vrc.dtsi +f:arch/arm64/boot/dts/toshiba/tmpv7708.dtsi +f:arch/arm64/boot/dts/toshiba/tmpv7708_pins.dtsi +f:arch/arm64/boot/dts/xilinx/Makefile +f:arch/arm64/boot/dts/xilinx/avnet-ultra96-rev1.dts +f:arch/arm64/boot/dts/xilinx/versal-net-clk.dtsi +f:arch/arm64/boot/dts/xilinx/versal-net-vn-x-b2197-01-revA.dts +f:arch/arm64/boot/dts/xilinx/versal-net.dtsi +f:arch/arm64/boot/dts/xilinx/xlnx-zynqmp-clk.h +f:arch/arm64/boot/dts/xilinx/zynqmp-clk-ccf.dtsi +f:arch/arm64/boot/dts/xilinx/zynqmp-sck-kv-g-revA.dtso +f:arch/arm64/boot/dts/xilinx/zynqmp-sck-kv-g-revB.dtso +f:arch/arm64/boot/dts/xilinx/zynqmp-sm-k26-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-smk-k26-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zc1232-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zc1254-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm015-dc1.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm017-dc3.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm018-dc4.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm019-dc5.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu102-rev1.0.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu102-rev1.1.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revB.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu104-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu104-revC.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu106-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu111-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp-zcu1275-revA.dts +f:arch/arm64/boot/dts/xilinx/zynqmp.dtsi +f:arch/arm64/boot/install.sh +f:arch/arm64/configs/defconfig +f:arch/arm64/configs/hardening.config +f:arch/arm64/configs/virt.config +f:arch/arm64/crypto/.gitignore +f:arch/arm64/crypto/Kconfig +f:arch/arm64/crypto/Makefile +f:arch/arm64/crypto/aes-ce-ccm-core.S +f:arch/arm64/crypto/aes-ce-ccm-glue.c +f:arch/arm64/crypto/aes-ce-core.S +f:arch/arm64/crypto/aes-ce-glue.c +f:arch/arm64/crypto/aes-ce-setkey.h +f:arch/arm64/crypto/aes-ce.S +f:arch/arm64/crypto/aes-cipher-core.S +f:arch/arm64/crypto/aes-cipher-glue.c +f:arch/arm64/crypto/aes-glue-ce.c +f:arch/arm64/crypto/aes-glue-neon.c +f:arch/arm64/crypto/aes-glue.c +f:arch/arm64/crypto/aes-modes.S +f:arch/arm64/crypto/aes-neon.S +f:arch/arm64/crypto/aes-neonbs-core.S +f:arch/arm64/crypto/aes-neonbs-glue.c +f:arch/arm64/crypto/ghash-ce-core.S +f:arch/arm64/crypto/ghash-ce-glue.c +f:arch/arm64/crypto/nh-neon-core.S +f:arch/arm64/crypto/nhpoly1305-neon-glue.c +f:arch/arm64/crypto/polyval-ce-core.S +f:arch/arm64/crypto/polyval-ce-glue.c +f:arch/arm64/crypto/sha3-ce-core.S +f:arch/arm64/crypto/sha3-ce-glue.c +f:arch/arm64/crypto/sm3-ce-core.S +f:arch/arm64/crypto/sm3-ce-glue.c +f:arch/arm64/crypto/sm3-neon-core.S +f:arch/arm64/crypto/sm3-neon-glue.c +f:arch/arm64/crypto/sm4-ce-asm.h +f:arch/arm64/crypto/sm4-ce-ccm-core.S +f:arch/arm64/crypto/sm4-ce-ccm-glue.c +f:arch/arm64/crypto/sm4-ce-cipher-core.S +f:arch/arm64/crypto/sm4-ce-cipher-glue.c +f:arch/arm64/crypto/sm4-ce-core.S +f:arch/arm64/crypto/sm4-ce-gcm-core.S +f:arch/arm64/crypto/sm4-ce-gcm-glue.c +f:arch/arm64/crypto/sm4-ce-glue.c +f:arch/arm64/crypto/sm4-ce.h +f:arch/arm64/crypto/sm4-neon-core.S +f:arch/arm64/crypto/sm4-neon-glue.c +f:arch/arm64/hyperv/Makefile +f:arch/arm64/hyperv/hv_core.c +f:arch/arm64/hyperv/mshyperv.c +f:arch/arm64/include/asm/Kbuild +f:arch/arm64/include/asm/acenv.h +f:arch/arm64/include/asm/acpi.h +f:arch/arm64/include/asm/alternative-macros.h +f:arch/arm64/include/asm/alternative.h +f:arch/arm64/include/asm/apple_m1_pmu.h +f:arch/arm64/include/asm/arch_gicv3.h +f:arch/arm64/include/asm/arch_timer.h +f:arch/arm64/include/asm/archrandom.h +f:arch/arm64/include/asm/arm-cci.h +f:arch/arm64/include/asm/arm_dsu_pmu.h +f:arch/arm64/include/asm/arm_pmuv3.h +f:arch/arm64/include/asm/asm-bug.h +f:arch/arm64/include/asm/asm-extable.h +f:arch/arm64/include/asm/asm-offsets.h +f:arch/arm64/include/asm/asm-prototypes.h +f:arch/arm64/include/asm/asm-uaccess.h +f:arch/arm64/include/asm/asm_pointer_auth.h +f:arch/arm64/include/asm/assembler.h +f:arch/arm64/include/asm/atomic.h +f:arch/arm64/include/asm/atomic_ll_sc.h +f:arch/arm64/include/asm/atomic_lse.h +f:arch/arm64/include/asm/barrier.h +f:arch/arm64/include/asm/bitops.h +f:arch/arm64/include/asm/bitrev.h +f:arch/arm64/include/asm/boot.h +f:arch/arm64/include/asm/brk-imm.h +f:arch/arm64/include/asm/bug.h +f:arch/arm64/include/asm/cache.h +f:arch/arm64/include/asm/cacheflush.h +f:arch/arm64/include/asm/checksum.h +f:arch/arm64/include/asm/clocksource.h +f:arch/arm64/include/asm/cmpxchg.h +f:arch/arm64/include/asm/compat.h +f:arch/arm64/include/asm/compiler.h +f:arch/arm64/include/asm/cpu.h +f:arch/arm64/include/asm/cpu_ops.h +f:arch/arm64/include/asm/cpucaps.h +f:arch/arm64/include/asm/cpufeature.h +f:arch/arm64/include/asm/cpuidle.h +f:arch/arm64/include/asm/cputype.h +f:arch/arm64/include/asm/crash_reserve.h +f:arch/arm64/include/asm/current.h +f:arch/arm64/include/asm/daifflags.h +f:arch/arm64/include/asm/dcc.h +f:arch/arm64/include/asm/debug-monitors.h +f:arch/arm64/include/asm/device.h +f:arch/arm64/include/asm/dmi.h +f:arch/arm64/include/asm/efi.h +f:arch/arm64/include/asm/el2_setup.h +f:arch/arm64/include/asm/elf.h +f:arch/arm64/include/asm/esr.h +f:arch/arm64/include/asm/exception.h +f:arch/arm64/include/asm/exec.h +f:arch/arm64/include/asm/extable.h +f:arch/arm64/include/asm/fixmap.h +f:arch/arm64/include/asm/fpsimd.h +f:arch/arm64/include/asm/fpsimdmacros.h +f:arch/arm64/include/asm/fpu.h +f:arch/arm64/include/asm/ftrace.h +f:arch/arm64/include/asm/futex.h +f:arch/arm64/include/asm/gcs.h +f:arch/arm64/include/asm/gpr-num.h +f:arch/arm64/include/asm/hardirq.h +f:arch/arm64/include/asm/hugetlb.h +f:arch/arm64/include/asm/hw_breakpoint.h +f:arch/arm64/include/asm/hwcap.h +f:arch/arm64/include/asm/hyp_image.h +f:arch/arm64/include/asm/hypervisor.h +f:arch/arm64/include/asm/image.h +f:arch/arm64/include/asm/insn-def.h +f:arch/arm64/include/asm/insn.h +f:arch/arm64/include/asm/io.h +f:arch/arm64/include/asm/irq.h +f:arch/arm64/include/asm/irq_work.h +f:arch/arm64/include/asm/irqflags.h +f:arch/arm64/include/asm/jump_label.h +f:arch/arm64/include/asm/kasan.h +f:arch/arm64/include/asm/kernel-pgtable.h +f:arch/arm64/include/asm/kexec.h +f:arch/arm64/include/asm/kfence.h +f:arch/arm64/include/asm/kgdb.h +f:arch/arm64/include/asm/kprobes.h +f:arch/arm64/include/asm/kvm_arm.h +f:arch/arm64/include/asm/kvm_asm.h +f:arch/arm64/include/asm/kvm_emulate.h +f:arch/arm64/include/asm/kvm_host.h +f:arch/arm64/include/asm/kvm_hyp.h +f:arch/arm64/include/asm/kvm_mmu.h +f:arch/arm64/include/asm/kvm_mte.h +f:arch/arm64/include/asm/kvm_nested.h +f:arch/arm64/include/asm/kvm_pgtable.h +f:arch/arm64/include/asm/kvm_pkvm.h +f:arch/arm64/include/asm/kvm_ptrauth.h +f:arch/arm64/include/asm/kvm_ras.h +f:arch/arm64/include/asm/kvm_types.h +f:arch/arm64/include/asm/linkage.h +f:arch/arm64/include/asm/lse.h +f:arch/arm64/include/asm/mem_encrypt.h +f:arch/arm64/include/asm/memory.h +f:arch/arm64/include/asm/mman.h +f:arch/arm64/include/asm/mmu.h +f:arch/arm64/include/asm/mmu_context.h +f:arch/arm64/include/asm/module.h +f:arch/arm64/include/asm/module.lds.h +f:arch/arm64/include/asm/mshyperv.h +f:arch/arm64/include/asm/mte-def.h +f:arch/arm64/include/asm/mte-kasan.h +f:arch/arm64/include/asm/mte.h +f:arch/arm64/include/asm/neon-intrinsics.h +f:arch/arm64/include/asm/neon.h +f:arch/arm64/include/asm/numa.h +f:arch/arm64/include/asm/page-def.h +f:arch/arm64/include/asm/page.h +f:arch/arm64/include/asm/paravirt.h +f:arch/arm64/include/asm/paravirt_api_clock.h +f:arch/arm64/include/asm/pci.h +f:arch/arm64/include/asm/percpu.h +f:arch/arm64/include/asm/perf_event.h +f:arch/arm64/include/asm/pgalloc.h +f:arch/arm64/include/asm/pgtable-hwdef.h +f:arch/arm64/include/asm/pgtable-prot.h +f:arch/arm64/include/asm/pgtable-types.h +f:arch/arm64/include/asm/pgtable.h +f:arch/arm64/include/asm/pkeys.h +f:arch/arm64/include/asm/pointer_auth.h +f:arch/arm64/include/asm/por.h +f:arch/arm64/include/asm/preempt.h +f:arch/arm64/include/asm/probes.h +f:arch/arm64/include/asm/proc-fns.h +f:arch/arm64/include/asm/processor.h +f:arch/arm64/include/asm/ptdump.h +f:arch/arm64/include/asm/ptrace.h +f:arch/arm64/include/asm/pvclock-abi.h +f:arch/arm64/include/asm/rqspinlock.h +f:arch/arm64/include/asm/rsi.h +f:arch/arm64/include/asm/rsi_cmds.h +f:arch/arm64/include/asm/rsi_smc.h +f:arch/arm64/include/asm/runtime-const.h +f:arch/arm64/include/asm/rwonce.h +f:arch/arm64/include/asm/scs.h +f:arch/arm64/include/asm/sdei.h +f:arch/arm64/include/asm/seccomp.h +f:arch/arm64/include/asm/sections.h +f:arch/arm64/include/asm/semihost.h +f:arch/arm64/include/asm/set_memory.h +f:arch/arm64/include/asm/setup.h +f:arch/arm64/include/asm/shmparam.h +f:arch/arm64/include/asm/signal.h +f:arch/arm64/include/asm/signal32.h +f:arch/arm64/include/asm/simd.h +f:arch/arm64/include/asm/smp.h +f:arch/arm64/include/asm/smp_plat.h +f:arch/arm64/include/asm/sparsemem.h +f:arch/arm64/include/asm/spectre.h +f:arch/arm64/include/asm/spinlock.h +f:arch/arm64/include/asm/spinlock_types.h +f:arch/arm64/include/asm/stack_pointer.h +f:arch/arm64/include/asm/stackprotector.h +f:arch/arm64/include/asm/stacktrace.h +f:arch/arm64/include/asm/stacktrace/common.h +f:arch/arm64/include/asm/stacktrace/frame.h +f:arch/arm64/include/asm/stacktrace/nvhe.h +f:arch/arm64/include/asm/stage2_pgtable.h +f:arch/arm64/include/asm/stat.h +f:arch/arm64/include/asm/string.h +f:arch/arm64/include/asm/suspend.h +f:arch/arm64/include/asm/sync_bitops.h +f:arch/arm64/include/asm/syscall.h +f:arch/arm64/include/asm/syscall_wrapper.h +f:arch/arm64/include/asm/sysreg.h +f:arch/arm64/include/asm/system_misc.h +f:arch/arm64/include/asm/text-patching.h +f:arch/arm64/include/asm/thread_info.h +f:arch/arm64/include/asm/timex.h +f:arch/arm64/include/asm/tlb.h +f:arch/arm64/include/asm/tlbbatch.h +f:arch/arm64/include/asm/tlbflush.h +f:arch/arm64/include/asm/topology.h +f:arch/arm64/include/asm/trans_pgd.h +f:arch/arm64/include/asm/traps.h +f:arch/arm64/include/asm/uaccess.h +f:arch/arm64/include/asm/unistd.h +f:arch/arm64/include/asm/unistd32.h +f:arch/arm64/include/asm/uprobes.h +f:arch/arm64/include/asm/vdso.h +f:arch/arm64/include/asm/vdso/clocksource.h +f:arch/arm64/include/asm/vdso/compat_barrier.h +f:arch/arm64/include/asm/vdso/compat_gettimeofday.h +f:arch/arm64/include/asm/vdso/getrandom.h +f:arch/arm64/include/asm/vdso/gettimeofday.h +f:arch/arm64/include/asm/vdso/processor.h +f:arch/arm64/include/asm/vdso/vsyscall.h +f:arch/arm64/include/asm/vectors.h +f:arch/arm64/include/asm/vermagic.h +f:arch/arm64/include/asm/virt.h +f:arch/arm64/include/asm/vmalloc.h +f:arch/arm64/include/asm/vmap_stack.h +f:arch/arm64/include/asm/vncr_mapping.h +f:arch/arm64/include/asm/word-at-a-time.h +f:arch/arm64/include/asm/xen/events.h +f:arch/arm64/include/asm/xen/hypercall.h +f:arch/arm64/include/asm/xen/hypervisor.h +f:arch/arm64/include/asm/xen/interface.h +f:arch/arm64/include/asm/xen/page.h +f:arch/arm64/include/asm/xen/swiotlb-xen.h +f:arch/arm64/include/asm/xen/xen-ops.h +f:arch/arm64/include/asm/xor.h +f:arch/arm64/include/uapi/asm/Kbuild +f:arch/arm64/include/uapi/asm/auxvec.h +f:arch/arm64/include/uapi/asm/bitsperlong.h +f:arch/arm64/include/uapi/asm/bpf_perf_event.h +f:arch/arm64/include/uapi/asm/byteorder.h +f:arch/arm64/include/uapi/asm/fcntl.h +f:arch/arm64/include/uapi/asm/hwcap.h +f:arch/arm64/include/uapi/asm/kvm.h +f:arch/arm64/include/uapi/asm/mman.h +f:arch/arm64/include/uapi/asm/param.h +f:arch/arm64/include/uapi/asm/perf_regs.h +f:arch/arm64/include/uapi/asm/posix_types.h +f:arch/arm64/include/uapi/asm/ptrace.h +f:arch/arm64/include/uapi/asm/setup.h +f:arch/arm64/include/uapi/asm/sigcontext.h +f:arch/arm64/include/uapi/asm/signal.h +f:arch/arm64/include/uapi/asm/statfs.h +f:arch/arm64/include/uapi/asm/sve_context.h +f:arch/arm64/include/uapi/asm/ucontext.h +f:arch/arm64/include/uapi/asm/unistd.h +f:arch/arm64/kernel/.gitignore +f:arch/arm64/kernel/Makefile +f:arch/arm64/kernel/Makefile.syscalls +f:arch/arm64/kernel/acpi.c +f:arch/arm64/kernel/acpi_numa.c +f:arch/arm64/kernel/acpi_parking_protocol.c +f:arch/arm64/kernel/alternative.c +f:arch/arm64/kernel/armv8_deprecated.c +f:arch/arm64/kernel/asm-offsets.c +f:arch/arm64/kernel/cacheinfo.c +f:arch/arm64/kernel/compat_alignment.c +f:arch/arm64/kernel/cpu-reset.S +f:arch/arm64/kernel/cpu_errata.c +f:arch/arm64/kernel/cpu_ops.c +f:arch/arm64/kernel/cpufeature.c +f:arch/arm64/kernel/cpuinfo.c +f:arch/arm64/kernel/crash_dump.c +f:arch/arm64/kernel/debug-monitors.c +f:arch/arm64/kernel/efi-header.S +f:arch/arm64/kernel/efi-rt-wrapper.S +f:arch/arm64/kernel/efi.c +f:arch/arm64/kernel/elfcore.c +f:arch/arm64/kernel/entry-common.c +f:arch/arm64/kernel/entry-fpsimd.S +f:arch/arm64/kernel/entry-ftrace.S +f:arch/arm64/kernel/entry.S +f:arch/arm64/kernel/fpsimd.c +f:arch/arm64/kernel/ftrace.c +f:arch/arm64/kernel/head.S +f:arch/arm64/kernel/hibernate-asm.S +f:arch/arm64/kernel/hibernate.c +f:arch/arm64/kernel/hw_breakpoint.c +f:arch/arm64/kernel/hyp-stub.S +f:arch/arm64/kernel/idle.c +f:arch/arm64/kernel/image-vars.h +f:arch/arm64/kernel/image.h +f:arch/arm64/kernel/io.c +f:arch/arm64/kernel/irq.c +f:arch/arm64/kernel/jump_label.c +f:arch/arm64/kernel/kaslr.c +f:arch/arm64/kernel/kexec_image.c +f:arch/arm64/kernel/kgdb.c +f:arch/arm64/kernel/kuser32.S +f:arch/arm64/kernel/machine_kexec.c +f:arch/arm64/kernel/machine_kexec_file.c +f:arch/arm64/kernel/module-plts.c +f:arch/arm64/kernel/module.c +f:arch/arm64/kernel/mte.c +f:arch/arm64/kernel/paravirt.c +f:arch/arm64/kernel/patching.c +f:arch/arm64/kernel/pci.c +f:arch/arm64/kernel/perf_callchain.c +f:arch/arm64/kernel/perf_regs.c +f:arch/arm64/kernel/pi/.gitignore +f:arch/arm64/kernel/pi/Makefile +f:arch/arm64/kernel/pi/idreg-override.c +f:arch/arm64/kernel/pi/kaslr_early.c +f:arch/arm64/kernel/pi/map_kernel.c +f:arch/arm64/kernel/pi/map_range.c +f:arch/arm64/kernel/pi/patch-scs.c +f:arch/arm64/kernel/pi/pi.h +f:arch/arm64/kernel/pi/relacheck.c +f:arch/arm64/kernel/pi/relocate.c +f:arch/arm64/kernel/pointer_auth.c +f:arch/arm64/kernel/probes/Makefile +f:arch/arm64/kernel/probes/decode-insn.c +f:arch/arm64/kernel/probes/decode-insn.h +f:arch/arm64/kernel/probes/kprobes.c +f:arch/arm64/kernel/probes/kprobes_trampoline.S +f:arch/arm64/kernel/probes/simulate-insn.c +f:arch/arm64/kernel/probes/simulate-insn.h +f:arch/arm64/kernel/probes/uprobes.c +f:arch/arm64/kernel/process.c +f:arch/arm64/kernel/proton-pack.c +f:arch/arm64/kernel/psci.c +f:arch/arm64/kernel/ptrace.c +f:arch/arm64/kernel/reloc_test_core.c +f:arch/arm64/kernel/reloc_test_syms.S +f:arch/arm64/kernel/relocate_kernel.S +f:arch/arm64/kernel/return_address.c +f:arch/arm64/kernel/rsi.c +f:arch/arm64/kernel/sdei.c +f:arch/arm64/kernel/setup.c +f:arch/arm64/kernel/signal.c +f:arch/arm64/kernel/signal32.c +f:arch/arm64/kernel/sigreturn32.S +f:arch/arm64/kernel/sleep.S +f:arch/arm64/kernel/smccc-call.S +f:arch/arm64/kernel/smp.c +f:arch/arm64/kernel/smp_spin_table.c +f:arch/arm64/kernel/stacktrace.c +f:arch/arm64/kernel/suspend.c +f:arch/arm64/kernel/sys.c +f:arch/arm64/kernel/sys32.c +f:arch/arm64/kernel/sys_compat.c +f:arch/arm64/kernel/syscall.c +f:arch/arm64/kernel/time.c +f:arch/arm64/kernel/topology.c +f:arch/arm64/kernel/trace-events-emulation.h +f:arch/arm64/kernel/traps.c +f:arch/arm64/kernel/vdso-wrap.S +f:arch/arm64/kernel/vdso.c +f:arch/arm64/kernel/vdso/.gitignore +f:arch/arm64/kernel/vdso/Makefile +f:arch/arm64/kernel/vdso/gen_vdso_offsets.sh +f:arch/arm64/kernel/vdso/note.S +f:arch/arm64/kernel/vdso/sigreturn.S +f:arch/arm64/kernel/vdso/vdso.lds.S +f:arch/arm64/kernel/vdso/vgetrandom-chacha.S +f:arch/arm64/kernel/vdso/vgetrandom.c +f:arch/arm64/kernel/vdso/vgettimeofday.c +f:arch/arm64/kernel/vdso32-wrap.S +f:arch/arm64/kernel/vdso32/.gitignore +f:arch/arm64/kernel/vdso32/Makefile +f:arch/arm64/kernel/vdso32/note.c +f:arch/arm64/kernel/vdso32/vdso.lds.S +f:arch/arm64/kernel/vdso32/vgettimeofday.c +f:arch/arm64/kernel/vmcore_info.c +f:arch/arm64/kernel/vmlinux.lds.S +f:arch/arm64/kernel/watchdog_hld.c +f:arch/arm64/kvm/.gitignore +f:arch/arm64/kvm/Kconfig +f:arch/arm64/kvm/Makefile +f:arch/arm64/kvm/arch_timer.c +f:arch/arm64/kvm/arm.c +f:arch/arm64/kvm/at.c +f:arch/arm64/kvm/config.c +f:arch/arm64/kvm/debug.c +f:arch/arm64/kvm/emulate-nested.c +f:arch/arm64/kvm/fpsimd.c +f:arch/arm64/kvm/guest.c +f:arch/arm64/kvm/handle_exit.c +f:arch/arm64/kvm/hyp/Makefile +f:arch/arm64/kvm/hyp/aarch32.c +f:arch/arm64/kvm/hyp/entry.S +f:arch/arm64/kvm/hyp/exception.c +f:arch/arm64/kvm/hyp/fpsimd.S +f:arch/arm64/kvm/hyp/hyp-constants.c +f:arch/arm64/kvm/hyp/hyp-entry.S +f:arch/arm64/kvm/hyp/include/hyp/adjust_pc.h +f:arch/arm64/kvm/hyp/include/hyp/debug-sr.h +f:arch/arm64/kvm/hyp/include/hyp/fault.h +f:arch/arm64/kvm/hyp/include/hyp/switch.h +f:arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h +f:arch/arm64/kvm/hyp/include/nvhe/early_alloc.h +f:arch/arm64/kvm/hyp/include/nvhe/ffa.h +f:arch/arm64/kvm/hyp/include/nvhe/gfp.h +f:arch/arm64/kvm/hyp/include/nvhe/mem_protect.h +f:arch/arm64/kvm/hyp/include/nvhe/memory.h +f:arch/arm64/kvm/hyp/include/nvhe/mm.h +f:arch/arm64/kvm/hyp/include/nvhe/pkvm.h +f:arch/arm64/kvm/hyp/include/nvhe/spinlock.h +f:arch/arm64/kvm/hyp/include/nvhe/trap_handler.h +f:arch/arm64/kvm/hyp/nvhe/.gitignore +f:arch/arm64/kvm/hyp/nvhe/Makefile +f:arch/arm64/kvm/hyp/nvhe/cache.S +f:arch/arm64/kvm/hyp/nvhe/debug-sr.c +f:arch/arm64/kvm/hyp/nvhe/early_alloc.c +f:arch/arm64/kvm/hyp/nvhe/ffa.c +f:arch/arm64/kvm/hyp/nvhe/gen-hyprel.c +f:arch/arm64/kvm/hyp/nvhe/host.S +f:arch/arm64/kvm/hyp/nvhe/hyp-init.S +f:arch/arm64/kvm/hyp/nvhe/hyp-main.c +f:arch/arm64/kvm/hyp/nvhe/hyp-smp.c +f:arch/arm64/kvm/hyp/nvhe/hyp.lds.S +f:arch/arm64/kvm/hyp/nvhe/list_debug.c +f:arch/arm64/kvm/hyp/nvhe/mem_protect.c +f:arch/arm64/kvm/hyp/nvhe/mm.c +f:arch/arm64/kvm/hyp/nvhe/page_alloc.c +f:arch/arm64/kvm/hyp/nvhe/pkvm.c +f:arch/arm64/kvm/hyp/nvhe/psci-relay.c +f:arch/arm64/kvm/hyp/nvhe/setup.c +f:arch/arm64/kvm/hyp/nvhe/stacktrace.c +f:arch/arm64/kvm/hyp/nvhe/switch.c +f:arch/arm64/kvm/hyp/nvhe/sys_regs.c +f:arch/arm64/kvm/hyp/nvhe/sysreg-sr.c +f:arch/arm64/kvm/hyp/nvhe/timer-sr.c +f:arch/arm64/kvm/hyp/nvhe/tlb.c +f:arch/arm64/kvm/hyp/pgtable.c +f:arch/arm64/kvm/hyp/vgic-v2-cpuif-proxy.c +f:arch/arm64/kvm/hyp/vgic-v3-sr.c +f:arch/arm64/kvm/hyp/vhe/Makefile +f:arch/arm64/kvm/hyp/vhe/debug-sr.c +f:arch/arm64/kvm/hyp/vhe/switch.c +f:arch/arm64/kvm/hyp/vhe/sysreg-sr.c +f:arch/arm64/kvm/hyp/vhe/timer-sr.c +f:arch/arm64/kvm/hyp/vhe/tlb.c +f:arch/arm64/kvm/hypercalls.c +f:arch/arm64/kvm/inject_fault.c +f:arch/arm64/kvm/mmio.c +f:arch/arm64/kvm/mmu.c +f:arch/arm64/kvm/nested.c +f:arch/arm64/kvm/pauth.c +f:arch/arm64/kvm/pkvm.c +f:arch/arm64/kvm/pmu-emul.c +f:arch/arm64/kvm/pmu.c +f:arch/arm64/kvm/psci.c +f:arch/arm64/kvm/ptdump.c +f:arch/arm64/kvm/pvtime.c +f:arch/arm64/kvm/reset.c +f:arch/arm64/kvm/stacktrace.c +f:arch/arm64/kvm/sys_regs.c +f:arch/arm64/kvm/sys_regs.h +f:arch/arm64/kvm/trace.h +f:arch/arm64/kvm/trace_arm.h +f:arch/arm64/kvm/trace_handle_exit.h +f:arch/arm64/kvm/trng.c +f:arch/arm64/kvm/va_layout.c +f:arch/arm64/kvm/vgic-sys-reg-v3.c +f:arch/arm64/kvm/vgic/trace.h +f:arch/arm64/kvm/vgic/vgic-debug.c +f:arch/arm64/kvm/vgic/vgic-init.c +f:arch/arm64/kvm/vgic/vgic-irqfd.c +f:arch/arm64/kvm/vgic/vgic-its.c +f:arch/arm64/kvm/vgic/vgic-kvm-device.c +f:arch/arm64/kvm/vgic/vgic-mmio-v2.c +f:arch/arm64/kvm/vgic/vgic-mmio-v3.c +f:arch/arm64/kvm/vgic/vgic-mmio.c +f:arch/arm64/kvm/vgic/vgic-mmio.h +f:arch/arm64/kvm/vgic/vgic-v2.c +f:arch/arm64/kvm/vgic/vgic-v3-nested.c +f:arch/arm64/kvm/vgic/vgic-v3.c +f:arch/arm64/kvm/vgic/vgic-v4.c +f:arch/arm64/kvm/vgic/vgic-v5.c +f:arch/arm64/kvm/vgic/vgic.c +f:arch/arm64/kvm/vgic/vgic.h +f:arch/arm64/kvm/vmid.c +f:arch/arm64/lib/.gitignore +f:arch/arm64/lib/Makefile +f:arch/arm64/lib/clear_page.S +f:arch/arm64/lib/clear_user.S +f:arch/arm64/lib/copy_from_user.S +f:arch/arm64/lib/copy_page.S +f:arch/arm64/lib/copy_template.S +f:arch/arm64/lib/copy_to_user.S +f:arch/arm64/lib/csum.c +f:arch/arm64/lib/delay.c +f:arch/arm64/lib/error-inject.c +f:arch/arm64/lib/insn.c +f:arch/arm64/lib/kasan_sw_tags.S +f:arch/arm64/lib/memchr.S +f:arch/arm64/lib/memcmp.S +f:arch/arm64/lib/memcpy.S +f:arch/arm64/lib/memset.S +f:arch/arm64/lib/mte.S +f:arch/arm64/lib/strchr.S +f:arch/arm64/lib/strcmp.S +f:arch/arm64/lib/strlen.S +f:arch/arm64/lib/strncmp.S +f:arch/arm64/lib/strnlen.S +f:arch/arm64/lib/strrchr.S +f:arch/arm64/lib/tishift.S +f:arch/arm64/lib/uaccess_flushcache.c +f:arch/arm64/lib/xor-neon.c +f:arch/arm64/mm/Makefile +f:arch/arm64/mm/cache.S +f:arch/arm64/mm/context.c +f:arch/arm64/mm/contpte.c +f:arch/arm64/mm/copypage.c +f:arch/arm64/mm/dma-mapping.c +f:arch/arm64/mm/extable.c +f:arch/arm64/mm/fault.c +f:arch/arm64/mm/fixmap.c +f:arch/arm64/mm/flush.c +f:arch/arm64/mm/gcs.c +f:arch/arm64/mm/hugetlbpage.c +f:arch/arm64/mm/init.c +f:arch/arm64/mm/ioremap.c +f:arch/arm64/mm/kasan_init.c +f:arch/arm64/mm/mem_encrypt.c +f:arch/arm64/mm/mmap.c +f:arch/arm64/mm/mmu.c +f:arch/arm64/mm/mteswap.c +f:arch/arm64/mm/pageattr.c +f:arch/arm64/mm/pgd.c +f:arch/arm64/mm/physaddr.c +f:arch/arm64/mm/proc.S +f:arch/arm64/mm/ptdump.c +f:arch/arm64/mm/ptdump_debugfs.c +f:arch/arm64/mm/trans_pgd-asm.S +f:arch/arm64/mm/trans_pgd.c +f:arch/arm64/net/Makefile +f:arch/arm64/net/bpf_jit.h +f:arch/arm64/net/bpf_jit_comp.c +f:arch/arm64/tools/Makefile +f:arch/arm64/tools/cpucaps +f:arch/arm64/tools/gen-cpucaps.awk +f:arch/arm64/tools/gen-sysreg.awk +f:arch/arm64/tools/syscall_32.tbl +f:arch/arm64/tools/sysreg +f:arch/arm64/xen/Makefile +f:arch/arm64/xen/hypercall.S +f:arch/csky/Kbuild +f:arch/csky/Kconfig +f:arch/csky/Kconfig.debug +f:arch/csky/Kconfig.platforms +f:arch/csky/Makefile +f:arch/csky/abiv1/Makefile +f:arch/csky/abiv1/alignment.c +f:arch/csky/abiv1/bswapdi.c +f:arch/csky/abiv1/bswapsi.c +f:arch/csky/abiv1/cacheflush.c +f:arch/csky/abiv1/inc/abi/cacheflush.h +f:arch/csky/abiv1/inc/abi/ckmmu.h +f:arch/csky/abiv1/inc/abi/elf.h +f:arch/csky/abiv1/inc/abi/entry.h +f:arch/csky/abiv1/inc/abi/page.h +f:arch/csky/abiv1/inc/abi/pgtable-bits.h +f:arch/csky/abiv1/inc/abi/reg_ops.h +f:arch/csky/abiv1/inc/abi/regdef.h +f:arch/csky/abiv1/inc/abi/string.h +f:arch/csky/abiv1/inc/abi/switch_context.h +f:arch/csky/abiv1/inc/abi/vdso.h +f:arch/csky/abiv1/mmap.c +f:arch/csky/abiv2/Makefile +f:arch/csky/abiv2/cacheflush.c +f:arch/csky/abiv2/fpu.c +f:arch/csky/abiv2/inc/abi/cacheflush.h +f:arch/csky/abiv2/inc/abi/ckmmu.h +f:arch/csky/abiv2/inc/abi/elf.h +f:arch/csky/abiv2/inc/abi/entry.h +f:arch/csky/abiv2/inc/abi/fpu.h +f:arch/csky/abiv2/inc/abi/page.h +f:arch/csky/abiv2/inc/abi/pgtable-bits.h +f:arch/csky/abiv2/inc/abi/reg_ops.h +f:arch/csky/abiv2/inc/abi/regdef.h +f:arch/csky/abiv2/inc/abi/string.h +f:arch/csky/abiv2/inc/abi/switch_context.h +f:arch/csky/abiv2/inc/abi/vdso.h +f:arch/csky/abiv2/mcount.S +f:arch/csky/abiv2/memcmp.S +f:arch/csky/abiv2/memcpy.S +f:arch/csky/abiv2/memmove.S +f:arch/csky/abiv2/memset.S +f:arch/csky/abiv2/strcmp.S +f:arch/csky/abiv2/strcpy.S +f:arch/csky/abiv2/strksyms.c +f:arch/csky/abiv2/strlen.S +f:arch/csky/abiv2/sysdep.h +f:arch/csky/boot/Makefile +f:arch/csky/boot/dts/Makefile +f:arch/csky/configs/defconfig +f:arch/csky/include/asm/Kbuild +f:arch/csky/include/asm/addrspace.h +f:arch/csky/include/asm/asid.h +f:arch/csky/include/asm/atomic.h +f:arch/csky/include/asm/barrier.h +f:arch/csky/include/asm/bitops.h +f:arch/csky/include/asm/bug.h +f:arch/csky/include/asm/cache.h +f:arch/csky/include/asm/cacheflush.h +f:arch/csky/include/asm/cachetype.h +f:arch/csky/include/asm/checksum.h +f:arch/csky/include/asm/clocksource.h +f:arch/csky/include/asm/cmpxchg.h +f:arch/csky/include/asm/elf.h +f:arch/csky/include/asm/fixmap.h +f:arch/csky/include/asm/ftrace.h +f:arch/csky/include/asm/futex.h +f:arch/csky/include/asm/highmem.h +f:arch/csky/include/asm/io.h +f:arch/csky/include/asm/irq_work.h +f:arch/csky/include/asm/irqflags.h +f:arch/csky/include/asm/jump_label.h +f:arch/csky/include/asm/kprobes.h +f:arch/csky/include/asm/memory.h +f:arch/csky/include/asm/mmu.h +f:arch/csky/include/asm/mmu_context.h +f:arch/csky/include/asm/page.h +f:arch/csky/include/asm/pci.h +f:arch/csky/include/asm/perf_event.h +f:arch/csky/include/asm/pgalloc.h +f:arch/csky/include/asm/pgtable.h +f:arch/csky/include/asm/probes.h +f:arch/csky/include/asm/processor.h +f:arch/csky/include/asm/ptrace.h +f:arch/csky/include/asm/reg_ops.h +f:arch/csky/include/asm/seccomp.h +f:arch/csky/include/asm/sections.h +f:arch/csky/include/asm/shmparam.h +f:arch/csky/include/asm/smp.h +f:arch/csky/include/asm/spinlock.h +f:arch/csky/include/asm/spinlock_types.h +f:arch/csky/include/asm/stackprotector.h +f:arch/csky/include/asm/string.h +f:arch/csky/include/asm/switch_to.h +f:arch/csky/include/asm/syscall.h +f:arch/csky/include/asm/syscalls.h +f:arch/csky/include/asm/tcm.h +f:arch/csky/include/asm/thread_info.h +f:arch/csky/include/asm/tlb.h +f:arch/csky/include/asm/tlbflush.h +f:arch/csky/include/asm/traps.h +f:arch/csky/include/asm/uaccess.h +f:arch/csky/include/asm/unistd.h +f:arch/csky/include/asm/uprobes.h +f:arch/csky/include/asm/vdso.h +f:arch/csky/include/asm/vmalloc.h +f:arch/csky/include/uapi/asm/Kbuild +f:arch/csky/include/uapi/asm/byteorder.h +f:arch/csky/include/uapi/asm/cachectl.h +f:arch/csky/include/uapi/asm/perf_regs.h +f:arch/csky/include/uapi/asm/ptrace.h +f:arch/csky/include/uapi/asm/sigcontext.h +f:arch/csky/include/uapi/asm/unistd.h +f:arch/csky/kernel/Makefile +f:arch/csky/kernel/Makefile.syscalls +f:arch/csky/kernel/asm-offsets.c +f:arch/csky/kernel/atomic.S +f:arch/csky/kernel/cpu-probe.c +f:arch/csky/kernel/entry.S +f:arch/csky/kernel/ftrace.c +f:arch/csky/kernel/head.S +f:arch/csky/kernel/irq.c +f:arch/csky/kernel/jump_label.c +f:arch/csky/kernel/module.c +f:arch/csky/kernel/perf_callchain.c +f:arch/csky/kernel/perf_event.c +f:arch/csky/kernel/perf_regs.c +f:arch/csky/kernel/power.c +f:arch/csky/kernel/probes/Makefile +f:arch/csky/kernel/probes/decode-insn.c +f:arch/csky/kernel/probes/decode-insn.h +f:arch/csky/kernel/probes/ftrace.c +f:arch/csky/kernel/probes/kprobes.c +f:arch/csky/kernel/probes/kprobes_trampoline.S +f:arch/csky/kernel/probes/simulate-insn.c +f:arch/csky/kernel/probes/simulate-insn.h +f:arch/csky/kernel/probes/uprobes.c +f:arch/csky/kernel/process.c +f:arch/csky/kernel/ptrace.c +f:arch/csky/kernel/setup.c +f:arch/csky/kernel/signal.c +f:arch/csky/kernel/smp.c +f:arch/csky/kernel/stacktrace.c +f:arch/csky/kernel/syscall.c +f:arch/csky/kernel/syscall_table.c +f:arch/csky/kernel/time.c +f:arch/csky/kernel/traps.c +f:arch/csky/kernel/vdso.c +f:arch/csky/kernel/vdso/.gitignore +f:arch/csky/kernel/vdso/Makefile +f:arch/csky/kernel/vdso/note.S +f:arch/csky/kernel/vdso/rt_sigreturn.S +f:arch/csky/kernel/vdso/so2s.sh +f:arch/csky/kernel/vdso/vdso.S +f:arch/csky/kernel/vdso/vdso.lds.S +f:arch/csky/kernel/vmlinux.lds.S +f:arch/csky/lib/Makefile +f:arch/csky/lib/delay.c +f:arch/csky/lib/error-inject.c +f:arch/csky/lib/string.c +f:arch/csky/lib/usercopy.c +f:arch/csky/mm/Makefile +f:arch/csky/mm/asid.c +f:arch/csky/mm/cachev1.c +f:arch/csky/mm/cachev2.c +f:arch/csky/mm/context.c +f:arch/csky/mm/dma-mapping.c +f:arch/csky/mm/fault.c +f:arch/csky/mm/highmem.c +f:arch/csky/mm/init.c +f:arch/csky/mm/ioremap.c +f:arch/csky/mm/syscache.c +f:arch/csky/mm/tcm.c +f:arch/csky/mm/tlb.c +f:arch/hexagon/Kbuild +f:arch/hexagon/Kconfig +f:arch/hexagon/Kconfig.debug +f:arch/hexagon/Makefile +f:arch/hexagon/configs/comet_defconfig +f:arch/hexagon/include/asm/Kbuild +f:arch/hexagon/include/asm/asm-offsets.h +f:arch/hexagon/include/asm/atomic.h +f:arch/hexagon/include/asm/bitops.h +f:arch/hexagon/include/asm/cache.h +f:arch/hexagon/include/asm/cacheflush.h +f:arch/hexagon/include/asm/checksum.h +f:arch/hexagon/include/asm/cmpxchg.h +f:arch/hexagon/include/asm/delay.h +f:arch/hexagon/include/asm/dma.h +f:arch/hexagon/include/asm/elf.h +f:arch/hexagon/include/asm/exec.h +f:arch/hexagon/include/asm/fixmap.h +f:arch/hexagon/include/asm/fpu.h +f:arch/hexagon/include/asm/futex.h +f:arch/hexagon/include/asm/hexagon_vm.h +f:arch/hexagon/include/asm/intrinsics.h +f:arch/hexagon/include/asm/io.h +f:arch/hexagon/include/asm/irq.h +f:arch/hexagon/include/asm/irqflags.h +f:arch/hexagon/include/asm/kgdb.h +f:arch/hexagon/include/asm/linkage.h +f:arch/hexagon/include/asm/mem-layout.h +f:arch/hexagon/include/asm/mmu.h +f:arch/hexagon/include/asm/mmu_context.h +f:arch/hexagon/include/asm/page.h +f:arch/hexagon/include/asm/perf_event.h +f:arch/hexagon/include/asm/pgalloc.h +f:arch/hexagon/include/asm/pgtable.h +f:arch/hexagon/include/asm/processor.h +f:arch/hexagon/include/asm/ptrace.h +f:arch/hexagon/include/asm/setup.h +f:arch/hexagon/include/asm/smp.h +f:arch/hexagon/include/asm/spinlock.h +f:arch/hexagon/include/asm/spinlock_types.h +f:arch/hexagon/include/asm/string.h +f:arch/hexagon/include/asm/suspend.h +f:arch/hexagon/include/asm/switch_to.h +f:arch/hexagon/include/asm/syscall.h +f:arch/hexagon/include/asm/syscalls.h +f:arch/hexagon/include/asm/thread_info.h +f:arch/hexagon/include/asm/time.h +f:arch/hexagon/include/asm/timex.h +f:arch/hexagon/include/asm/tlb.h +f:arch/hexagon/include/asm/tlbflush.h +f:arch/hexagon/include/asm/traps.h +f:arch/hexagon/include/asm/uaccess.h +f:arch/hexagon/include/asm/unistd.h +f:arch/hexagon/include/asm/vdso.h +f:arch/hexagon/include/asm/vermagic.h +f:arch/hexagon/include/asm/vm_fault.h +f:arch/hexagon/include/asm/vm_mmu.h +f:arch/hexagon/include/asm/vmalloc.h +f:arch/hexagon/include/uapi/asm/Kbuild +f:arch/hexagon/include/uapi/asm/byteorder.h +f:arch/hexagon/include/uapi/asm/param.h +f:arch/hexagon/include/uapi/asm/ptrace.h +f:arch/hexagon/include/uapi/asm/registers.h +f:arch/hexagon/include/uapi/asm/setup.h +f:arch/hexagon/include/uapi/asm/sigcontext.h +f:arch/hexagon/include/uapi/asm/signal.h +f:arch/hexagon/include/uapi/asm/swab.h +f:arch/hexagon/include/uapi/asm/unistd.h +f:arch/hexagon/include/uapi/asm/user.h +f:arch/hexagon/kernel/.gitignore +f:arch/hexagon/kernel/Makefile +f:arch/hexagon/kernel/Makefile.syscalls +f:arch/hexagon/kernel/asm-offsets.c +f:arch/hexagon/kernel/dma.c +f:arch/hexagon/kernel/head.S +f:arch/hexagon/kernel/hexagon_ksyms.c +f:arch/hexagon/kernel/irq_cpu.c +f:arch/hexagon/kernel/kgdb.c +f:arch/hexagon/kernel/module.c +f:arch/hexagon/kernel/process.c +f:arch/hexagon/kernel/ptrace.c +f:arch/hexagon/kernel/reset.c +f:arch/hexagon/kernel/setup.c +f:arch/hexagon/kernel/signal.c +f:arch/hexagon/kernel/smp.c +f:arch/hexagon/kernel/stacktrace.c +f:arch/hexagon/kernel/syscalltab.c +f:arch/hexagon/kernel/time.c +f:arch/hexagon/kernel/trampoline.S +f:arch/hexagon/kernel/traps.c +f:arch/hexagon/kernel/vdso.c +f:arch/hexagon/kernel/vm_entry.S +f:arch/hexagon/kernel/vm_events.c +f:arch/hexagon/kernel/vm_init_segtable.S +f:arch/hexagon/kernel/vm_ops.S +f:arch/hexagon/kernel/vm_switch.S +f:arch/hexagon/kernel/vm_vectors.S +f:arch/hexagon/kernel/vmlinux.lds.S +f:arch/hexagon/lib/Makefile +f:arch/hexagon/lib/checksum.c +f:arch/hexagon/lib/divsi3.S +f:arch/hexagon/lib/memcpy.S +f:arch/hexagon/lib/memcpy_likely_aligned.S +f:arch/hexagon/lib/memset.S +f:arch/hexagon/lib/modsi3.S +f:arch/hexagon/lib/udivsi3.S +f:arch/hexagon/lib/umodsi3.S +f:arch/hexagon/mm/Makefile +f:arch/hexagon/mm/cache.c +f:arch/hexagon/mm/copy_from_user.S +f:arch/hexagon/mm/copy_to_user.S +f:arch/hexagon/mm/copy_user_template.S +f:arch/hexagon/mm/init.c +f:arch/hexagon/mm/uaccess.c +f:arch/hexagon/mm/vm_fault.c +f:arch/hexagon/mm/vm_tlb.c +f:arch/loongarch/Kbuild +f:arch/loongarch/Kconfig +f:arch/loongarch/Kconfig.debug +f:arch/loongarch/Makefile +f:arch/loongarch/boot/.gitignore +f:arch/loongarch/boot/Makefile +f:arch/loongarch/boot/dts/Makefile +f:arch/loongarch/boot/dts/loongson-2k0500-ref.dts +f:arch/loongarch/boot/dts/loongson-2k0500.dtsi +f:arch/loongarch/boot/dts/loongson-2k1000-ref.dts +f:arch/loongarch/boot/dts/loongson-2k1000.dtsi +f:arch/loongarch/boot/dts/loongson-2k2000-ref.dts +f:arch/loongarch/boot/dts/loongson-2k2000.dtsi +f:arch/loongarch/boot/install.sh +f:arch/loongarch/configs/loongson3_defconfig +f:arch/loongarch/crypto/Kconfig +f:arch/loongarch/crypto/Makefile +f:arch/loongarch/include/asm/Kbuild +f:arch/loongarch/include/asm/acenv.h +f:arch/loongarch/include/asm/acpi.h +f:arch/loongarch/include/asm/addrspace.h +f:arch/loongarch/include/asm/alternative-asm.h +f:arch/loongarch/include/asm/alternative.h +f:arch/loongarch/include/asm/asm-extable.h +f:arch/loongarch/include/asm/asm-offsets.h +f:arch/loongarch/include/asm/asm-prototypes.h +f:arch/loongarch/include/asm/asm.h +f:arch/loongarch/include/asm/asmmacro.h +f:arch/loongarch/include/asm/atomic.h +f:arch/loongarch/include/asm/barrier.h +f:arch/loongarch/include/asm/bitops.h +f:arch/loongarch/include/asm/bitrev.h +f:arch/loongarch/include/asm/bootinfo.h +f:arch/loongarch/include/asm/branch.h +f:arch/loongarch/include/asm/bug.h +f:arch/loongarch/include/asm/cache.h +f:arch/loongarch/include/asm/cacheflush.h +f:arch/loongarch/include/asm/cacheops.h +f:arch/loongarch/include/asm/checksum.h +f:arch/loongarch/include/asm/clocksource.h +f:arch/loongarch/include/asm/cmpxchg.h +f:arch/loongarch/include/asm/cpu-features.h +f:arch/loongarch/include/asm/cpu-info.h +f:arch/loongarch/include/asm/cpu.h +f:arch/loongarch/include/asm/cpufeature.h +f:arch/loongarch/include/asm/crash_reserve.h +f:arch/loongarch/include/asm/delay.h +f:arch/loongarch/include/asm/dma.h +f:arch/loongarch/include/asm/dmi.h +f:arch/loongarch/include/asm/efi.h +f:arch/loongarch/include/asm/elf.h +f:arch/loongarch/include/asm/entry-common.h +f:arch/loongarch/include/asm/exception.h +f:arch/loongarch/include/asm/exec.h +f:arch/loongarch/include/asm/extable.h +f:arch/loongarch/include/asm/fixmap.h +f:arch/loongarch/include/asm/fpregdef.h +f:arch/loongarch/include/asm/fprobe.h +f:arch/loongarch/include/asm/fpu.h +f:arch/loongarch/include/asm/ftrace.h +f:arch/loongarch/include/asm/futex.h +f:arch/loongarch/include/asm/gpr-num.h +f:arch/loongarch/include/asm/hardirq.h +f:arch/loongarch/include/asm/hugetlb.h +f:arch/loongarch/include/asm/hw_breakpoint.h +f:arch/loongarch/include/asm/hw_irq.h +f:arch/loongarch/include/asm/idle.h +f:arch/loongarch/include/asm/inst.h +f:arch/loongarch/include/asm/io.h +f:arch/loongarch/include/asm/irq.h +f:arch/loongarch/include/asm/irq_regs.h +f:arch/loongarch/include/asm/irq_work.h +f:arch/loongarch/include/asm/irqflags.h +f:arch/loongarch/include/asm/jump_label.h +f:arch/loongarch/include/asm/kasan.h +f:arch/loongarch/include/asm/kdebug.h +f:arch/loongarch/include/asm/kexec.h +f:arch/loongarch/include/asm/kfence.h +f:arch/loongarch/include/asm/kgdb.h +f:arch/loongarch/include/asm/kprobes.h +f:arch/loongarch/include/asm/kvm_csr.h +f:arch/loongarch/include/asm/kvm_eiointc.h +f:arch/loongarch/include/asm/kvm_host.h +f:arch/loongarch/include/asm/kvm_ipi.h +f:arch/loongarch/include/asm/kvm_mmu.h +f:arch/loongarch/include/asm/kvm_para.h +f:arch/loongarch/include/asm/kvm_pch_pic.h +f:arch/loongarch/include/asm/kvm_types.h +f:arch/loongarch/include/asm/kvm_vcpu.h +f:arch/loongarch/include/asm/lbt.h +f:arch/loongarch/include/asm/linkage.h +f:arch/loongarch/include/asm/local.h +f:arch/loongarch/include/asm/loongarch.h +f:arch/loongarch/include/asm/loongson.h +f:arch/loongarch/include/asm/mmu.h +f:arch/loongarch/include/asm/mmu_context.h +f:arch/loongarch/include/asm/module.h +f:arch/loongarch/include/asm/module.lds.h +f:arch/loongarch/include/asm/numa.h +f:arch/loongarch/include/asm/orc_header.h +f:arch/loongarch/include/asm/orc_lookup.h +f:arch/loongarch/include/asm/orc_types.h +f:arch/loongarch/include/asm/page.h +f:arch/loongarch/include/asm/paravirt.h +f:arch/loongarch/include/asm/paravirt_api_clock.h +f:arch/loongarch/include/asm/pci.h +f:arch/loongarch/include/asm/percpu.h +f:arch/loongarch/include/asm/perf_event.h +f:arch/loongarch/include/asm/pgalloc.h +f:arch/loongarch/include/asm/pgtable-bits.h +f:arch/loongarch/include/asm/pgtable.h +f:arch/loongarch/include/asm/prefetch.h +f:arch/loongarch/include/asm/processor.h +f:arch/loongarch/include/asm/ptrace.h +f:arch/loongarch/include/asm/qspinlock.h +f:arch/loongarch/include/asm/regdef.h +f:arch/loongarch/include/asm/seccomp.h +f:arch/loongarch/include/asm/serial.h +f:arch/loongarch/include/asm/set_memory.h +f:arch/loongarch/include/asm/setup.h +f:arch/loongarch/include/asm/smp.h +f:arch/loongarch/include/asm/sparsemem.h +f:arch/loongarch/include/asm/spinlock.h +f:arch/loongarch/include/asm/spinlock_types.h +f:arch/loongarch/include/asm/stackframe.h +f:arch/loongarch/include/asm/stackprotector.h +f:arch/loongarch/include/asm/stacktrace.h +f:arch/loongarch/include/asm/string.h +f:arch/loongarch/include/asm/suspend.h +f:arch/loongarch/include/asm/switch_to.h +f:arch/loongarch/include/asm/syscall.h +f:arch/loongarch/include/asm/thread_info.h +f:arch/loongarch/include/asm/time.h +f:arch/loongarch/include/asm/timex.h +f:arch/loongarch/include/asm/tlb.h +f:arch/loongarch/include/asm/tlbflush.h +f:arch/loongarch/include/asm/topology.h +f:arch/loongarch/include/asm/types.h +f:arch/loongarch/include/asm/uaccess.h +f:arch/loongarch/include/asm/unistd.h +f:arch/loongarch/include/asm/unwind.h +f:arch/loongarch/include/asm/unwind_hints.h +f:arch/loongarch/include/asm/uprobes.h +f:arch/loongarch/include/asm/vdso.h +f:arch/loongarch/include/asm/vdso/arch_data.h +f:arch/loongarch/include/asm/vdso/clocksource.h +f:arch/loongarch/include/asm/vdso/getrandom.h +f:arch/loongarch/include/asm/vdso/gettimeofday.h +f:arch/loongarch/include/asm/vdso/processor.h +f:arch/loongarch/include/asm/vdso/vdso.h +f:arch/loongarch/include/asm/vdso/vsyscall.h +f:arch/loongarch/include/asm/vermagic.h +f:arch/loongarch/include/asm/video.h +f:arch/loongarch/include/asm/vmalloc.h +f:arch/loongarch/include/asm/xor.h +f:arch/loongarch/include/asm/xor_simd.h +f:arch/loongarch/include/uapi/asm/Kbuild +f:arch/loongarch/include/uapi/asm/auxvec.h +f:arch/loongarch/include/uapi/asm/bpf_perf_event.h +f:arch/loongarch/include/uapi/asm/break.h +f:arch/loongarch/include/uapi/asm/byteorder.h +f:arch/loongarch/include/uapi/asm/hwcap.h +f:arch/loongarch/include/uapi/asm/kvm.h +f:arch/loongarch/include/uapi/asm/kvm_para.h +f:arch/loongarch/include/uapi/asm/perf_regs.h +f:arch/loongarch/include/uapi/asm/ptrace.h +f:arch/loongarch/include/uapi/asm/reg.h +f:arch/loongarch/include/uapi/asm/sigcontext.h +f:arch/loongarch/include/uapi/asm/signal.h +f:arch/loongarch/include/uapi/asm/ucontext.h +f:arch/loongarch/include/uapi/asm/unistd.h +f:arch/loongarch/kernel/.gitignore +f:arch/loongarch/kernel/Makefile +f:arch/loongarch/kernel/Makefile.syscalls +f:arch/loongarch/kernel/access-helper.h +f:arch/loongarch/kernel/acpi.c +f:arch/loongarch/kernel/alternative.c +f:arch/loongarch/kernel/asm-offsets.c +f:arch/loongarch/kernel/cacheinfo.c +f:arch/loongarch/kernel/cpu-probe.c +f:arch/loongarch/kernel/crash_dump.c +f:arch/loongarch/kernel/dma.c +f:arch/loongarch/kernel/efi-header.S +f:arch/loongarch/kernel/efi.c +f:arch/loongarch/kernel/elf.c +f:arch/loongarch/kernel/entry.S +f:arch/loongarch/kernel/env.c +f:arch/loongarch/kernel/fpu.S +f:arch/loongarch/kernel/ftrace.c +f:arch/loongarch/kernel/ftrace_dyn.c +f:arch/loongarch/kernel/genex.S +f:arch/loongarch/kernel/head.S +f:arch/loongarch/kernel/hw_breakpoint.c +f:arch/loongarch/kernel/idle.c +f:arch/loongarch/kernel/image-vars.h +f:arch/loongarch/kernel/inst.c +f:arch/loongarch/kernel/irq.c +f:arch/loongarch/kernel/jump_label.c +f:arch/loongarch/kernel/kdebugfs.c +f:arch/loongarch/kernel/kfpu.c +f:arch/loongarch/kernel/kgdb.c +f:arch/loongarch/kernel/kprobes.c +f:arch/loongarch/kernel/lbt.S +f:arch/loongarch/kernel/machine_kexec.c +f:arch/loongarch/kernel/mcount.S +f:arch/loongarch/kernel/mcount_dyn.S +f:arch/loongarch/kernel/mem.c +f:arch/loongarch/kernel/module-sections.c +f:arch/loongarch/kernel/module.c +f:arch/loongarch/kernel/numa.c +f:arch/loongarch/kernel/paravirt.c +f:arch/loongarch/kernel/perf_event.c +f:arch/loongarch/kernel/perf_regs.c +f:arch/loongarch/kernel/proc.c +f:arch/loongarch/kernel/process.c +f:arch/loongarch/kernel/ptrace.c +f:arch/loongarch/kernel/relocate.c +f:arch/loongarch/kernel/relocate_kernel.S +f:arch/loongarch/kernel/reset.c +f:arch/loongarch/kernel/rethook.c +f:arch/loongarch/kernel/rethook.h +f:arch/loongarch/kernel/rethook_trampoline.S +f:arch/loongarch/kernel/setup.c +f:arch/loongarch/kernel/signal.c +f:arch/loongarch/kernel/smp.c +f:arch/loongarch/kernel/stacktrace.c +f:arch/loongarch/kernel/switch.S +f:arch/loongarch/kernel/syscall.c +f:arch/loongarch/kernel/sysrq.c +f:arch/loongarch/kernel/time.c +f:arch/loongarch/kernel/topology.c +f:arch/loongarch/kernel/traps.c +f:arch/loongarch/kernel/unaligned.c +f:arch/loongarch/kernel/unwind.c +f:arch/loongarch/kernel/unwind_guess.c +f:arch/loongarch/kernel/unwind_orc.c +f:arch/loongarch/kernel/unwind_prologue.c +f:arch/loongarch/kernel/uprobes.c +f:arch/loongarch/kernel/vdso.c +f:arch/loongarch/kernel/vmlinux.lds.S +f:arch/loongarch/kvm/Kconfig +f:arch/loongarch/kvm/Makefile +f:arch/loongarch/kvm/exit.c +f:arch/loongarch/kvm/intc/eiointc.c +f:arch/loongarch/kvm/intc/ipi.c +f:arch/loongarch/kvm/intc/pch_pic.c +f:arch/loongarch/kvm/interrupt.c +f:arch/loongarch/kvm/irqfd.c +f:arch/loongarch/kvm/main.c +f:arch/loongarch/kvm/mmu.c +f:arch/loongarch/kvm/switch.S +f:arch/loongarch/kvm/timer.c +f:arch/loongarch/kvm/tlb.c +f:arch/loongarch/kvm/trace.h +f:arch/loongarch/kvm/vcpu.c +f:arch/loongarch/kvm/vm.c +f:arch/loongarch/lib/Makefile +f:arch/loongarch/lib/clear_user.S +f:arch/loongarch/lib/copy_user.S +f:arch/loongarch/lib/csum.c +f:arch/loongarch/lib/delay.c +f:arch/loongarch/lib/dump_tlb.c +f:arch/loongarch/lib/error-inject.c +f:arch/loongarch/lib/memcpy.S +f:arch/loongarch/lib/memmove.S +f:arch/loongarch/lib/memset.S +f:arch/loongarch/lib/tishift.S +f:arch/loongarch/lib/unaligned.S +f:arch/loongarch/lib/xor_simd.c +f:arch/loongarch/lib/xor_simd.h +f:arch/loongarch/lib/xor_simd_glue.c +f:arch/loongarch/lib/xor_template.c +f:arch/loongarch/mm/Makefile +f:arch/loongarch/mm/cache.c +f:arch/loongarch/mm/extable.c +f:arch/loongarch/mm/fault.c +f:arch/loongarch/mm/hugetlbpage.c +f:arch/loongarch/mm/init.c +f:arch/loongarch/mm/ioremap.c +f:arch/loongarch/mm/kasan_init.c +f:arch/loongarch/mm/maccess.c +f:arch/loongarch/mm/mmap.c +f:arch/loongarch/mm/page.S +f:arch/loongarch/mm/pageattr.c +f:arch/loongarch/mm/pgtable.c +f:arch/loongarch/mm/tlb.c +f:arch/loongarch/mm/tlbex.S +f:arch/loongarch/net/Makefile +f:arch/loongarch/net/bpf_jit.c +f:arch/loongarch/net/bpf_jit.h +f:arch/loongarch/pci/Makefile +f:arch/loongarch/pci/acpi.c +f:arch/loongarch/pci/pci.c +f:arch/loongarch/power/Makefile +f:arch/loongarch/power/hibernate.c +f:arch/loongarch/power/hibernate_asm.S +f:arch/loongarch/power/platform.c +f:arch/loongarch/power/suspend.c +f:arch/loongarch/power/suspend_asm.S +f:arch/loongarch/vdso/.gitignore +f:arch/loongarch/vdso/Makefile +f:arch/loongarch/vdso/elf.S +f:arch/loongarch/vdso/gen_vdso_offsets.sh +f:arch/loongarch/vdso/sigreturn.S +f:arch/loongarch/vdso/vdso.S +f:arch/loongarch/vdso/vdso.lds.S +f:arch/loongarch/vdso/vgetcpu.c +f:arch/loongarch/vdso/vgetrandom-chacha.S +f:arch/loongarch/vdso/vgetrandom.c +f:arch/loongarch/vdso/vgettimeofday.c +f:arch/m68k/68000/Makefile +f:arch/m68k/68000/bootlogo-vz.h +f:arch/m68k/68000/bootlogo.h +f:arch/m68k/68000/dragen2.c +f:arch/m68k/68000/entry.S +f:arch/m68k/68000/head.S +f:arch/m68k/68000/ints.c +f:arch/m68k/68000/ints.h +f:arch/m68k/68000/m68328.c +f:arch/m68k/68000/m68328.h +f:arch/m68k/68000/romvec.S +f:arch/m68k/68000/screen.h +f:arch/m68k/68000/timers.c +f:arch/m68k/68000/ucsimm.c +f:arch/m68k/Kbuild +f:arch/m68k/Kconfig +f:arch/m68k/Kconfig.bus +f:arch/m68k/Kconfig.cpu +f:arch/m68k/Kconfig.debug +f:arch/m68k/Kconfig.devices +f:arch/m68k/Kconfig.machine +f:arch/m68k/Makefile +f:arch/m68k/amiga/Makefile +f:arch/m68k/amiga/amiga.h +f:arch/m68k/amiga/amiints.c +f:arch/m68k/amiga/amisound.c +f:arch/m68k/amiga/chipram.c +f:arch/m68k/amiga/cia.c +f:arch/m68k/amiga/config.c +f:arch/m68k/amiga/pcmcia.c +f:arch/m68k/amiga/platform.c +f:arch/m68k/apollo/Makefile +f:arch/m68k/apollo/apollo.h +f:arch/m68k/apollo/config.c +f:arch/m68k/apollo/dn_ints.c +f:arch/m68k/atari/Makefile +f:arch/m68k/atari/ataints.c +f:arch/m68k/atari/atakeyb.c +f:arch/m68k/atari/atari.h +f:arch/m68k/atari/atasound.c +f:arch/m68k/atari/config.c +f:arch/m68k/atari/debug.c +f:arch/m68k/atari/nvram.c +f:arch/m68k/atari/stdma.c +f:arch/m68k/atari/stram.c +f:arch/m68k/atari/time.c +f:arch/m68k/bvme6000/Makefile +f:arch/m68k/bvme6000/config.c +f:arch/m68k/bvme6000/rtc.c +f:arch/m68k/coldfire/Makefile +f:arch/m68k/coldfire/amcore.c +f:arch/m68k/coldfire/cache.c +f:arch/m68k/coldfire/clk.c +f:arch/m68k/coldfire/device.c +f:arch/m68k/coldfire/dma_timer.c +f:arch/m68k/coldfire/entry.S +f:arch/m68k/coldfire/firebee.c +f:arch/m68k/coldfire/gpio.c +f:arch/m68k/coldfire/head.S +f:arch/m68k/coldfire/intc-2.c +f:arch/m68k/coldfire/intc-5249.c +f:arch/m68k/coldfire/intc-525x.c +f:arch/m68k/coldfire/intc-5272.c +f:arch/m68k/coldfire/intc-simr.c +f:arch/m68k/coldfire/intc.c +f:arch/m68k/coldfire/m5206.c +f:arch/m68k/coldfire/m520x.c +f:arch/m68k/coldfire/m523x.c +f:arch/m68k/coldfire/m5249.c +f:arch/m68k/coldfire/m525x.c +f:arch/m68k/coldfire/m5272.c +f:arch/m68k/coldfire/m527x.c +f:arch/m68k/coldfire/m528x.c +f:arch/m68k/coldfire/m5307.c +f:arch/m68k/coldfire/m53xx.c +f:arch/m68k/coldfire/m5407.c +f:arch/m68k/coldfire/m5441x.c +f:arch/m68k/coldfire/m54xx.c +f:arch/m68k/coldfire/mcf8390.c +f:arch/m68k/coldfire/nettel.c +f:arch/m68k/coldfire/pci.c +f:arch/m68k/coldfire/pit.c +f:arch/m68k/coldfire/reset.c +f:arch/m68k/coldfire/sltimers.c +f:arch/m68k/coldfire/stmark2.c +f:arch/m68k/coldfire/timers.c +f:arch/m68k/coldfire/vectors.c +f:arch/m68k/configs/amcore_defconfig +f:arch/m68k/configs/amiga_defconfig +f:arch/m68k/configs/apollo_defconfig +f:arch/m68k/configs/atari_defconfig +f:arch/m68k/configs/bvme6000_defconfig +f:arch/m68k/configs/hp300_defconfig +f:arch/m68k/configs/m5208evb_defconfig +f:arch/m68k/configs/m5249evb_defconfig +f:arch/m68k/configs/m5272c3_defconfig +f:arch/m68k/configs/m5275evb_defconfig +f:arch/m68k/configs/m5307c3_defconfig +f:arch/m68k/configs/m5407c3_defconfig +f:arch/m68k/configs/m5475evb_defconfig +f:arch/m68k/configs/mac_defconfig +f:arch/m68k/configs/multi_defconfig +f:arch/m68k/configs/mvme147_defconfig +f:arch/m68k/configs/mvme16x_defconfig +f:arch/m68k/configs/q40_defconfig +f:arch/m68k/configs/stmark2_defconfig +f:arch/m68k/configs/sun3_defconfig +f:arch/m68k/configs/sun3x_defconfig +f:arch/m68k/configs/virt_defconfig +f:arch/m68k/emu/Makefile +f:arch/m68k/emu/natfeat.c +f:arch/m68k/emu/nfblock.c +f:arch/m68k/emu/nfcon.c +f:arch/m68k/emu/nfeth.c +f:arch/m68k/fpsp040/Makefile +f:arch/m68k/fpsp040/README +f:arch/m68k/fpsp040/bindec.S +f:arch/m68k/fpsp040/binstr.S +f:arch/m68k/fpsp040/bugfix.S +f:arch/m68k/fpsp040/decbin.S +f:arch/m68k/fpsp040/do_func.S +f:arch/m68k/fpsp040/fpsp.h +f:arch/m68k/fpsp040/gen_except.S +f:arch/m68k/fpsp040/get_op.S +f:arch/m68k/fpsp040/kernel_ex.S +f:arch/m68k/fpsp040/res_func.S +f:arch/m68k/fpsp040/round.S +f:arch/m68k/fpsp040/sacos.S +f:arch/m68k/fpsp040/sasin.S +f:arch/m68k/fpsp040/satan.S +f:arch/m68k/fpsp040/satanh.S +f:arch/m68k/fpsp040/scale.S +f:arch/m68k/fpsp040/scosh.S +f:arch/m68k/fpsp040/setox.S +f:arch/m68k/fpsp040/sgetem.S +f:arch/m68k/fpsp040/sint.S +f:arch/m68k/fpsp040/skeleton.S +f:arch/m68k/fpsp040/slog2.S +f:arch/m68k/fpsp040/slogn.S +f:arch/m68k/fpsp040/smovecr.S +f:arch/m68k/fpsp040/srem_mod.S +f:arch/m68k/fpsp040/ssin.S +f:arch/m68k/fpsp040/ssinh.S +f:arch/m68k/fpsp040/stan.S +f:arch/m68k/fpsp040/stanh.S +f:arch/m68k/fpsp040/sto_res.S +f:arch/m68k/fpsp040/stwotox.S +f:arch/m68k/fpsp040/tbldo.S +f:arch/m68k/fpsp040/util.S +f:arch/m68k/fpsp040/x_bsun.S +f:arch/m68k/fpsp040/x_fline.S +f:arch/m68k/fpsp040/x_operr.S +f:arch/m68k/fpsp040/x_ovfl.S +f:arch/m68k/fpsp040/x_snan.S +f:arch/m68k/fpsp040/x_store.S +f:arch/m68k/fpsp040/x_unfl.S +f:arch/m68k/fpsp040/x_unimp.S +f:arch/m68k/fpsp040/x_unsupp.S +f:arch/m68k/hp300/Makefile +f:arch/m68k/hp300/README.hp300 +f:arch/m68k/hp300/config.c +f:arch/m68k/hp300/hp300map.map +f:arch/m68k/hp300/reboot.S +f:arch/m68k/hp300/time.c +f:arch/m68k/hp300/time.h +f:arch/m68k/ifpsp060/CHANGES +f:arch/m68k/ifpsp060/MISC +f:arch/m68k/ifpsp060/Makefile +f:arch/m68k/ifpsp060/README +f:arch/m68k/ifpsp060/TEST.DOC +f:arch/m68k/ifpsp060/fplsp.doc +f:arch/m68k/ifpsp060/fplsp.sa +f:arch/m68k/ifpsp060/fpsp.doc +f:arch/m68k/ifpsp060/fpsp.sa +f:arch/m68k/ifpsp060/fskeleton.S +f:arch/m68k/ifpsp060/ftest.sa +f:arch/m68k/ifpsp060/ilsp.doc +f:arch/m68k/ifpsp060/ilsp.sa +f:arch/m68k/ifpsp060/iskeleton.S +f:arch/m68k/ifpsp060/isp.doc +f:arch/m68k/ifpsp060/isp.sa +f:arch/m68k/ifpsp060/itest.sa +f:arch/m68k/ifpsp060/os.S +f:arch/m68k/ifpsp060/pfpsp.sa +f:arch/m68k/ifpsp060/src/README-SRC +f:arch/m68k/ifpsp060/src/fplsp.S +f:arch/m68k/ifpsp060/src/fpsp.S +f:arch/m68k/ifpsp060/src/ftest.S +f:arch/m68k/ifpsp060/src/ilsp.S +f:arch/m68k/ifpsp060/src/isp.S +f:arch/m68k/ifpsp060/src/itest.S +f:arch/m68k/ifpsp060/src/pfpsp.S +f:arch/m68k/include/asm/Kbuild +f:arch/m68k/include/asm/MC68328.h +f:arch/m68k/include/asm/MC68EZ328.h +f:arch/m68k/include/asm/MC68VZ328.h +f:arch/m68k/include/asm/adb_iop.h +f:arch/m68k/include/asm/amigahw.h +f:arch/m68k/include/asm/amigaints.h +f:arch/m68k/include/asm/amigayle.h +f:arch/m68k/include/asm/amipcmcia.h +f:arch/m68k/include/asm/apollohw.h +f:arch/m68k/include/asm/asm-offsets.h +f:arch/m68k/include/asm/asm-prototypes.h +f:arch/m68k/include/asm/atari_joystick.h +f:arch/m68k/include/asm/atari_stdma.h +f:arch/m68k/include/asm/atari_stram.h +f:arch/m68k/include/asm/atarihw.h +f:arch/m68k/include/asm/atariints.h +f:arch/m68k/include/asm/atarikb.h +f:arch/m68k/include/asm/atomic.h +f:arch/m68k/include/asm/bitops.h +f:arch/m68k/include/asm/blinken.h +f:arch/m68k/include/asm/bootinfo.h +f:arch/m68k/include/asm/bootstd.h +f:arch/m68k/include/asm/bug.h +f:arch/m68k/include/asm/bvme6000hw.h +f:arch/m68k/include/asm/cache.h +f:arch/m68k/include/asm/cacheflush.h +f:arch/m68k/include/asm/cacheflush_mm.h +f:arch/m68k/include/asm/cacheflush_no.h +f:arch/m68k/include/asm/cachetype.h +f:arch/m68k/include/asm/checksum.h +f:arch/m68k/include/asm/cmpxchg.h +f:arch/m68k/include/asm/coldfire.h +f:arch/m68k/include/asm/config.h +f:arch/m68k/include/asm/contregs.h +f:arch/m68k/include/asm/current.h +f:arch/m68k/include/asm/delay.h +f:arch/m68k/include/asm/div64.h +f:arch/m68k/include/asm/dma.h +f:arch/m68k/include/asm/dsp56k.h +f:arch/m68k/include/asm/dvma.h +f:arch/m68k/include/asm/elf.h +f:arch/m68k/include/asm/entry.h +f:arch/m68k/include/asm/fbio.h +f:arch/m68k/include/asm/flat.h +f:arch/m68k/include/asm/floppy.h +f:arch/m68k/include/asm/fpu.h +f:arch/m68k/include/asm/ftrace.h +f:arch/m68k/include/asm/hash.h +f:arch/m68k/include/asm/hp300hw.h +f:arch/m68k/include/asm/hwtest.h +f:arch/m68k/include/asm/idprom.h +f:arch/m68k/include/asm/intersil.h +f:arch/m68k/include/asm/io.h +f:arch/m68k/include/asm/io_mm.h +f:arch/m68k/include/asm/io_no.h +f:arch/m68k/include/asm/irq.h +f:arch/m68k/include/asm/irqflags.h +f:arch/m68k/include/asm/kexec.h +f:arch/m68k/include/asm/kmap.h +f:arch/m68k/include/asm/libgcc.h +f:arch/m68k/include/asm/linkage.h +f:arch/m68k/include/asm/m5206sim.h +f:arch/m68k/include/asm/m520xsim.h +f:arch/m68k/include/asm/m523xsim.h +f:arch/m68k/include/asm/m525xsim.h +f:arch/m68k/include/asm/m5272sim.h +f:arch/m68k/include/asm/m527xsim.h +f:arch/m68k/include/asm/m528xsim.h +f:arch/m68k/include/asm/m52xxacr.h +f:arch/m68k/include/asm/m5307sim.h +f:arch/m68k/include/asm/m53xxacr.h +f:arch/m68k/include/asm/m53xxsim.h +f:arch/m68k/include/asm/m5407sim.h +f:arch/m68k/include/asm/m5441xsim.h +f:arch/m68k/include/asm/m54xxacr.h +f:arch/m68k/include/asm/m54xxgpt.h +f:arch/m68k/include/asm/m54xxpci.h +f:arch/m68k/include/asm/m54xxsim.h +f:arch/m68k/include/asm/mac_asc.h +f:arch/m68k/include/asm/mac_baboon.h +f:arch/m68k/include/asm/mac_iop.h +f:arch/m68k/include/asm/mac_oss.h +f:arch/m68k/include/asm/mac_psc.h +f:arch/m68k/include/asm/mac_via.h +f:arch/m68k/include/asm/machdep.h +f:arch/m68k/include/asm/machines.h +f:arch/m68k/include/asm/machw.h +f:arch/m68k/include/asm/macintosh.h +f:arch/m68k/include/asm/macints.h +f:arch/m68k/include/asm/math-emu.h +f:arch/m68k/include/asm/mc146818rtc.h +f:arch/m68k/include/asm/mcf8390.h +f:arch/m68k/include/asm/mcf_pgalloc.h +f:arch/m68k/include/asm/mcf_pgtable.h +f:arch/m68k/include/asm/mcfclk.h +f:arch/m68k/include/asm/mcfdma.h +f:arch/m68k/include/asm/mcfgpio.h +f:arch/m68k/include/asm/mcfintc.h +f:arch/m68k/include/asm/mcfmmu.h +f:arch/m68k/include/asm/mcfpit.h +f:arch/m68k/include/asm/mcfqspi.h +f:arch/m68k/include/asm/mcfsim.h +f:arch/m68k/include/asm/mcfslt.h +f:arch/m68k/include/asm/mcftimer.h +f:arch/m68k/include/asm/mcfuart.h +f:arch/m68k/include/asm/mcfwdebug.h +f:arch/m68k/include/asm/mmu.h +f:arch/m68k/include/asm/mmu_context.h +f:arch/m68k/include/asm/module.h +f:arch/m68k/include/asm/module.lds.h +f:arch/m68k/include/asm/motorola_pgalloc.h +f:arch/m68k/include/asm/motorola_pgtable.h +f:arch/m68k/include/asm/movs.h +f:arch/m68k/include/asm/mvme147hw.h +f:arch/m68k/include/asm/mvme16xhw.h +f:arch/m68k/include/asm/natfeat.h +f:arch/m68k/include/asm/nettel.h +f:arch/m68k/include/asm/nubus.h +f:arch/m68k/include/asm/openprom.h +f:arch/m68k/include/asm/oplib.h +f:arch/m68k/include/asm/page.h +f:arch/m68k/include/asm/page_mm.h +f:arch/m68k/include/asm/page_no.h +f:arch/m68k/include/asm/page_offset.h +f:arch/m68k/include/asm/parport.h +f:arch/m68k/include/asm/pci.h +f:arch/m68k/include/asm/pgalloc.h +f:arch/m68k/include/asm/pgtable.h +f:arch/m68k/include/asm/pgtable_mm.h +f:arch/m68k/include/asm/pgtable_no.h +f:arch/m68k/include/asm/processor.h +f:arch/m68k/include/asm/ptrace.h +f:arch/m68k/include/asm/q40_master.h +f:arch/m68k/include/asm/q40ints.h +f:arch/m68k/include/asm/quicc_simple.h +f:arch/m68k/include/asm/raw_io.h +f:arch/m68k/include/asm/seccomp.h +f:arch/m68k/include/asm/serial.h +f:arch/m68k/include/asm/setup.h +f:arch/m68k/include/asm/signal.h +f:arch/m68k/include/asm/smp.h +f:arch/m68k/include/asm/string.h +f:arch/m68k/include/asm/sun3-head.h +f:arch/m68k/include/asm/sun3_pgalloc.h +f:arch/m68k/include/asm/sun3_pgtable.h +f:arch/m68k/include/asm/sun3ints.h +f:arch/m68k/include/asm/sun3mmu.h +f:arch/m68k/include/asm/sun3x.h +f:arch/m68k/include/asm/sun3xflop.h +f:arch/m68k/include/asm/sun3xprom.h +f:arch/m68k/include/asm/switch_to.h +f:arch/m68k/include/asm/syscall.h +f:arch/m68k/include/asm/syscalls.h +f:arch/m68k/include/asm/thread_info.h +f:arch/m68k/include/asm/timex.h +f:arch/m68k/include/asm/tlb.h +f:arch/m68k/include/asm/tlbflush.h +f:arch/m68k/include/asm/traps.h +f:arch/m68k/include/asm/uaccess.h +f:arch/m68k/include/asm/ucontext.h +f:arch/m68k/include/asm/unistd.h +f:arch/m68k/include/asm/user.h +f:arch/m68k/include/asm/vga.h +f:arch/m68k/include/asm/video.h +f:arch/m68k/include/asm/virt.h +f:arch/m68k/include/asm/virtconvert.h +f:arch/m68k/include/asm/vmalloc.h +f:arch/m68k/include/asm/zorro.h +f:arch/m68k/include/uapi/asm/Kbuild +f:arch/m68k/include/uapi/asm/a.out.h +f:arch/m68k/include/uapi/asm/bootinfo-amiga.h +f:arch/m68k/include/uapi/asm/bootinfo-apollo.h +f:arch/m68k/include/uapi/asm/bootinfo-atari.h +f:arch/m68k/include/uapi/asm/bootinfo-hp300.h +f:arch/m68k/include/uapi/asm/bootinfo-mac.h +f:arch/m68k/include/uapi/asm/bootinfo-q40.h +f:arch/m68k/include/uapi/asm/bootinfo-virt.h +f:arch/m68k/include/uapi/asm/bootinfo-vme.h +f:arch/m68k/include/uapi/asm/bootinfo.h +f:arch/m68k/include/uapi/asm/byteorder.h +f:arch/m68k/include/uapi/asm/cachectl.h +f:arch/m68k/include/uapi/asm/fcntl.h +f:arch/m68k/include/uapi/asm/ioctls.h +f:arch/m68k/include/uapi/asm/param.h +f:arch/m68k/include/uapi/asm/poll.h +f:arch/m68k/include/uapi/asm/posix_types.h +f:arch/m68k/include/uapi/asm/ptrace.h +f:arch/m68k/include/uapi/asm/setup.h +f:arch/m68k/include/uapi/asm/sigcontext.h +f:arch/m68k/include/uapi/asm/signal.h +f:arch/m68k/include/uapi/asm/stat.h +f:arch/m68k/include/uapi/asm/swab.h +f:arch/m68k/include/uapi/asm/unistd.h +f:arch/m68k/install.sh +f:arch/m68k/kernel/.gitignore +f:arch/m68k/kernel/Makefile +f:arch/m68k/kernel/asm-offsets.c +f:arch/m68k/kernel/bootinfo_proc.c +f:arch/m68k/kernel/dma.c +f:arch/m68k/kernel/early_printk.c +f:arch/m68k/kernel/entry.S +f:arch/m68k/kernel/head.S +f:arch/m68k/kernel/ints.c +f:arch/m68k/kernel/ints.h +f:arch/m68k/kernel/irq.c +f:arch/m68k/kernel/machine_kexec.c +f:arch/m68k/kernel/module.c +f:arch/m68k/kernel/pcibios.c +f:arch/m68k/kernel/process.c +f:arch/m68k/kernel/process.h +f:arch/m68k/kernel/ptrace.c +f:arch/m68k/kernel/ptrace.h +f:arch/m68k/kernel/relocate_kernel.S +f:arch/m68k/kernel/setup.c +f:arch/m68k/kernel/setup_mm.c +f:arch/m68k/kernel/setup_no.c +f:arch/m68k/kernel/signal.c +f:arch/m68k/kernel/signal.h +f:arch/m68k/kernel/sun3-head.S +f:arch/m68k/kernel/sys_m68k.c +f:arch/m68k/kernel/syscalls/Makefile +f:arch/m68k/kernel/syscalls/syscall.tbl +f:arch/m68k/kernel/syscalltable.S +f:arch/m68k/kernel/time.c +f:arch/m68k/kernel/traps.c +f:arch/m68k/kernel/traps.h +f:arch/m68k/kernel/uboot.c +f:arch/m68k/kernel/vectors.c +f:arch/m68k/kernel/vectors.h +f:arch/m68k/kernel/vmlinux-nommu.lds +f:arch/m68k/kernel/vmlinux-std.lds +f:arch/m68k/kernel/vmlinux-sun3.lds +f:arch/m68k/kernel/vmlinux.lds.S +f:arch/m68k/lib/Makefile +f:arch/m68k/lib/checksum.c +f:arch/m68k/lib/divsi3.S +f:arch/m68k/lib/memcpy.c +f:arch/m68k/lib/memmove.c +f:arch/m68k/lib/memset.c +f:arch/m68k/lib/modsi3.S +f:arch/m68k/lib/mulsi3.S +f:arch/m68k/lib/uaccess.c +f:arch/m68k/lib/udivsi3.S +f:arch/m68k/lib/umodsi3.S +f:arch/m68k/mac/Makefile +f:arch/m68k/mac/baboon.c +f:arch/m68k/mac/config.c +f:arch/m68k/mac/iop.c +f:arch/m68k/mac/mac.h +f:arch/m68k/mac/mac_penguin.S +f:arch/m68k/mac/macboing.c +f:arch/m68k/mac/macints.c +f:arch/m68k/mac/misc.c +f:arch/m68k/mac/oss.c +f:arch/m68k/mac/psc.c +f:arch/m68k/mac/via.c +f:arch/m68k/math-emu/Makefile +f:arch/m68k/math-emu/fp_arith.c +f:arch/m68k/math-emu/fp_arith.h +f:arch/m68k/math-emu/fp_cond.S +f:arch/m68k/math-emu/fp_decode.h +f:arch/m68k/math-emu/fp_emu.h +f:arch/m68k/math-emu/fp_entry.S +f:arch/m68k/math-emu/fp_log.c +f:arch/m68k/math-emu/fp_log.h +f:arch/m68k/math-emu/fp_move.S +f:arch/m68k/math-emu/fp_movem.S +f:arch/m68k/math-emu/fp_scan.S +f:arch/m68k/math-emu/fp_trig.c +f:arch/m68k/math-emu/fp_trig.h +f:arch/m68k/math-emu/fp_util.S +f:arch/m68k/math-emu/multi_arith.h +f:arch/m68k/mm/Makefile +f:arch/m68k/mm/cache.c +f:arch/m68k/mm/fault.c +f:arch/m68k/mm/fault.h +f:arch/m68k/mm/hwtest.c +f:arch/m68k/mm/init.c +f:arch/m68k/mm/kmap.c +f:arch/m68k/mm/mcfmmu.c +f:arch/m68k/mm/memory.c +f:arch/m68k/mm/motorola.c +f:arch/m68k/mm/sun3kmap.c +f:arch/m68k/mm/sun3mmu.c +f:arch/m68k/mvme147/Makefile +f:arch/m68k/mvme147/config.c +f:arch/m68k/mvme147/mvme147.h +f:arch/m68k/mvme16x/Makefile +f:arch/m68k/mvme16x/config.c +f:arch/m68k/mvme16x/mvme16x.h +f:arch/m68k/q40/Makefile +f:arch/m68k/q40/README +f:arch/m68k/q40/config.c +f:arch/m68k/q40/q40.h +f:arch/m68k/q40/q40ints.c +f:arch/m68k/sun3/Makefile +f:arch/m68k/sun3/config.c +f:arch/m68k/sun3/dvma.c +f:arch/m68k/sun3/idprom.c +f:arch/m68k/sun3/intersil.c +f:arch/m68k/sun3/leds.c +f:arch/m68k/sun3/mmu_emu.c +f:arch/m68k/sun3/prom/Makefile +f:arch/m68k/sun3/prom/console.c +f:arch/m68k/sun3/prom/init.c +f:arch/m68k/sun3/prom/misc.c +f:arch/m68k/sun3/prom/printf.c +f:arch/m68k/sun3/sun3.h +f:arch/m68k/sun3/sun3dvma.c +f:arch/m68k/sun3/sun3ints.c +f:arch/m68k/sun3x/Makefile +f:arch/m68k/sun3x/config.c +f:arch/m68k/sun3x/dvma.c +f:arch/m68k/sun3x/prom.c +f:arch/m68k/sun3x/time.c +f:arch/m68k/sun3x/time.h +f:arch/m68k/tools/amiga/Makefile +f:arch/m68k/tools/amiga/dmesg.c +f:arch/m68k/virt/Makefile +f:arch/m68k/virt/config.c +f:arch/m68k/virt/ints.c +f:arch/m68k/virt/platform.c +f:arch/microblaze/Kbuild +f:arch/microblaze/Kconfig +f:arch/microblaze/Kconfig.debug +f:arch/microblaze/Kconfig.platform +f:arch/microblaze/Makefile +f:arch/microblaze/boot/.gitignore +f:arch/microblaze/boot/Makefile +f:arch/microblaze/boot/dts/Makefile +f:arch/microblaze/boot/dts/linked_dtb.S +f:arch/microblaze/boot/dts/system.dts +f:arch/microblaze/configs/mmu_defconfig +f:arch/microblaze/include/asm/Kbuild +f:arch/microblaze/include/asm/asm-compat.h +f:arch/microblaze/include/asm/asm-offsets.h +f:arch/microblaze/include/asm/barrier.h +f:arch/microblaze/include/asm/cache.h +f:arch/microblaze/include/asm/cacheflush.h +f:arch/microblaze/include/asm/checksum.h +f:arch/microblaze/include/asm/cpuinfo.h +f:arch/microblaze/include/asm/current.h +f:arch/microblaze/include/asm/delay.h +f:arch/microblaze/include/asm/dma.h +f:arch/microblaze/include/asm/elf.h +f:arch/microblaze/include/asm/entry.h +f:arch/microblaze/include/asm/exceptions.h +f:arch/microblaze/include/asm/fixmap.h +f:arch/microblaze/include/asm/flat.h +f:arch/microblaze/include/asm/ftrace.h +f:arch/microblaze/include/asm/futex.h +f:arch/microblaze/include/asm/hash.h +f:arch/microblaze/include/asm/highmem.h +f:arch/microblaze/include/asm/io.h +f:arch/microblaze/include/asm/irq.h +f:arch/microblaze/include/asm/irqflags.h +f:arch/microblaze/include/asm/kgdb.h +f:arch/microblaze/include/asm/mmu.h +f:arch/microblaze/include/asm/mmu_context.h +f:arch/microblaze/include/asm/mmu_context_mm.h +f:arch/microblaze/include/asm/module.h +f:arch/microblaze/include/asm/page.h +f:arch/microblaze/include/asm/pci-bridge.h +f:arch/microblaze/include/asm/pci.h +f:arch/microblaze/include/asm/pgalloc.h +f:arch/microblaze/include/asm/pgtable.h +f:arch/microblaze/include/asm/processor.h +f:arch/microblaze/include/asm/ptrace.h +f:arch/microblaze/include/asm/pvr.h +f:arch/microblaze/include/asm/registers.h +f:arch/microblaze/include/asm/seccomp.h +f:arch/microblaze/include/asm/sections.h +f:arch/microblaze/include/asm/setup.h +f:arch/microblaze/include/asm/string.h +f:arch/microblaze/include/asm/switch_to.h +f:arch/microblaze/include/asm/syscall.h +f:arch/microblaze/include/asm/thread_info.h +f:arch/microblaze/include/asm/timex.h +f:arch/microblaze/include/asm/tlbflush.h +f:arch/microblaze/include/asm/uaccess.h +f:arch/microblaze/include/asm/unistd.h +f:arch/microblaze/include/asm/unwind.h +f:arch/microblaze/include/asm/vmalloc.h +f:arch/microblaze/include/asm/xilinx_mb_manager.h +f:arch/microblaze/include/uapi/asm/Kbuild +f:arch/microblaze/include/uapi/asm/auxvec.h +f:arch/microblaze/include/uapi/asm/byteorder.h +f:arch/microblaze/include/uapi/asm/elf.h +f:arch/microblaze/include/uapi/asm/posix_types.h +f:arch/microblaze/include/uapi/asm/ptrace.h +f:arch/microblaze/include/uapi/asm/setup.h +f:arch/microblaze/include/uapi/asm/sigcontext.h +f:arch/microblaze/include/uapi/asm/unistd.h +f:arch/microblaze/kernel/.gitignore +f:arch/microblaze/kernel/Makefile +f:arch/microblaze/kernel/asm-offsets.c +f:arch/microblaze/kernel/cpu/Makefile +f:arch/microblaze/kernel/cpu/cache.c +f:arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c +f:arch/microblaze/kernel/cpu/cpuinfo-static.c +f:arch/microblaze/kernel/cpu/cpuinfo.c +f:arch/microblaze/kernel/cpu/mb.c +f:arch/microblaze/kernel/cpu/pvr.c +f:arch/microblaze/kernel/dma.c +f:arch/microblaze/kernel/entry.S +f:arch/microblaze/kernel/exceptions.c +f:arch/microblaze/kernel/ftrace.c +f:arch/microblaze/kernel/head.S +f:arch/microblaze/kernel/hw_exception_handler.S +f:arch/microblaze/kernel/irq.c +f:arch/microblaze/kernel/kgdb.c +f:arch/microblaze/kernel/mcount.S +f:arch/microblaze/kernel/microblaze_ksyms.c +f:arch/microblaze/kernel/misc.S +f:arch/microblaze/kernel/module.c +f:arch/microblaze/kernel/process.c +f:arch/microblaze/kernel/prom.c +f:arch/microblaze/kernel/ptrace.c +f:arch/microblaze/kernel/reset.c +f:arch/microblaze/kernel/setup.c +f:arch/microblaze/kernel/signal.c +f:arch/microblaze/kernel/stacktrace.c +f:arch/microblaze/kernel/sys_microblaze.c +f:arch/microblaze/kernel/syscall_table.S +f:arch/microblaze/kernel/syscalls/Makefile +f:arch/microblaze/kernel/syscalls/syscall.tbl +f:arch/microblaze/kernel/timer.c +f:arch/microblaze/kernel/traps.c +f:arch/microblaze/kernel/unwind.c +f:arch/microblaze/kernel/vmlinux.lds.S +f:arch/microblaze/lib/Makefile +f:arch/microblaze/lib/ashldi3.c +f:arch/microblaze/lib/ashrdi3.c +f:arch/microblaze/lib/cmpdi2.c +f:arch/microblaze/lib/divsi3.S +f:arch/microblaze/lib/fastcopy.S +f:arch/microblaze/lib/libgcc.h +f:arch/microblaze/lib/lshrdi3.c +f:arch/microblaze/lib/memcpy.c +f:arch/microblaze/lib/memmove.c +f:arch/microblaze/lib/memset.c +f:arch/microblaze/lib/modsi3.S +f:arch/microblaze/lib/muldi3.c +f:arch/microblaze/lib/mulsi3.S +f:arch/microblaze/lib/uaccess_old.S +f:arch/microblaze/lib/ucmpdi2.c +f:arch/microblaze/lib/udivsi3.S +f:arch/microblaze/lib/umodsi3.S +f:arch/microblaze/mm/Makefile +f:arch/microblaze/mm/consistent.c +f:arch/microblaze/mm/fault.c +f:arch/microblaze/mm/init.c +f:arch/microblaze/mm/mmu_context.c +f:arch/microblaze/mm/pgtable.c +f:arch/microblaze/pci/Makefile +f:arch/microblaze/pci/iomap.c +f:arch/mips/Kbuild +f:arch/mips/Kbuild.platforms +f:arch/mips/Kconfig +f:arch/mips/Kconfig.debug +f:arch/mips/Makefile +f:arch/mips/Makefile.postlink +f:arch/mips/alchemy/Kconfig +f:arch/mips/alchemy/Makefile +f:arch/mips/alchemy/Platform +f:arch/mips/alchemy/board-gpr.c +f:arch/mips/alchemy/board-mtx1.c +f:arch/mips/alchemy/board-xxs1500.c +f:arch/mips/alchemy/common/Makefile +f:arch/mips/alchemy/common/clock.c +f:arch/mips/alchemy/common/dbdma.c +f:arch/mips/alchemy/common/dma.c +f:arch/mips/alchemy/common/gpiolib.c +f:arch/mips/alchemy/common/irq.c +f:arch/mips/alchemy/common/platform.c +f:arch/mips/alchemy/common/power.c +f:arch/mips/alchemy/common/prom.c +f:arch/mips/alchemy/common/setup.c +f:arch/mips/alchemy/common/sleeper.S +f:arch/mips/alchemy/common/time.c +f:arch/mips/alchemy/common/usb.c +f:arch/mips/alchemy/common/vss.c +f:arch/mips/alchemy/devboards/Makefile +f:arch/mips/alchemy/devboards/bcsr.c +f:arch/mips/alchemy/devboards/db1000.c +f:arch/mips/alchemy/devboards/db1200.c +f:arch/mips/alchemy/devboards/db1300.c +f:arch/mips/alchemy/devboards/db1550.c +f:arch/mips/alchemy/devboards/db1xxx.c +f:arch/mips/alchemy/devboards/platform.c +f:arch/mips/alchemy/devboards/platform.h +f:arch/mips/alchemy/devboards/pm.c +f:arch/mips/ath25/Kconfig +f:arch/mips/ath25/Makefile +f:arch/mips/ath25/Platform +f:arch/mips/ath25/ar2315.c +f:arch/mips/ath25/ar2315.h +f:arch/mips/ath25/ar2315_regs.h +f:arch/mips/ath25/ar5312.c +f:arch/mips/ath25/ar5312.h +f:arch/mips/ath25/ar5312_regs.h +f:arch/mips/ath25/board.c +f:arch/mips/ath25/devices.c +f:arch/mips/ath25/devices.h +f:arch/mips/ath25/early_printk.c +f:arch/mips/ath25/prom.c +f:arch/mips/ath79/Kconfig +f:arch/mips/ath79/Makefile +f:arch/mips/ath79/Platform +f:arch/mips/ath79/clock.c +f:arch/mips/ath79/common.c +f:arch/mips/ath79/common.h +f:arch/mips/ath79/early_printk.c +f:arch/mips/ath79/prom.c +f:arch/mips/ath79/setup.c +f:arch/mips/bcm47xx/Kconfig +f:arch/mips/bcm47xx/Makefile +f:arch/mips/bcm47xx/Platform +f:arch/mips/bcm47xx/bcm47xx_private.h +f:arch/mips/bcm47xx/board.c +f:arch/mips/bcm47xx/buttons.c +f:arch/mips/bcm47xx/irq.c +f:arch/mips/bcm47xx/leds.c +f:arch/mips/bcm47xx/prom.c +f:arch/mips/bcm47xx/serial.c +f:arch/mips/bcm47xx/setup.c +f:arch/mips/bcm47xx/time.c +f:arch/mips/bcm47xx/workarounds.c +f:arch/mips/bcm63xx/Kconfig +f:arch/mips/bcm63xx/Makefile +f:arch/mips/bcm63xx/Platform +f:arch/mips/bcm63xx/boards/Kconfig +f:arch/mips/bcm63xx/boards/Makefile +f:arch/mips/bcm63xx/boards/board_bcm963xx.c +f:arch/mips/bcm63xx/clk.c +f:arch/mips/bcm63xx/cpu.c +f:arch/mips/bcm63xx/cs.c +f:arch/mips/bcm63xx/dev-enet.c +f:arch/mips/bcm63xx/dev-flash.c +f:arch/mips/bcm63xx/dev-hsspi.c +f:arch/mips/bcm63xx/dev-pcmcia.c +f:arch/mips/bcm63xx/dev-rng.c +f:arch/mips/bcm63xx/dev-spi.c +f:arch/mips/bcm63xx/dev-uart.c +f:arch/mips/bcm63xx/dev-usb-usbd.c +f:arch/mips/bcm63xx/dev-wdt.c +f:arch/mips/bcm63xx/early_printk.c +f:arch/mips/bcm63xx/gpio.c +f:arch/mips/bcm63xx/irq.c +f:arch/mips/bcm63xx/nvram.c +f:arch/mips/bcm63xx/prom.c +f:arch/mips/bcm63xx/reset.c +f:arch/mips/bcm63xx/setup.c +f:arch/mips/bcm63xx/timer.c +f:arch/mips/bmips/Kconfig +f:arch/mips/bmips/Makefile +f:arch/mips/bmips/Platform +f:arch/mips/bmips/dma.c +f:arch/mips/bmips/irq.c +f:arch/mips/bmips/setup.c +f:arch/mips/boot/.gitignore +f:arch/mips/boot/Makefile +f:arch/mips/boot/compressed/Makefile +f:arch/mips/boot/compressed/ashldi3.c +f:arch/mips/boot/compressed/bswapdi.c +f:arch/mips/boot/compressed/bswapsi.c +f:arch/mips/boot/compressed/calc_vmlinuz_load_addr.c +f:arch/mips/boot/compressed/clz_ctz.c +f:arch/mips/boot/compressed/dbg.c +f:arch/mips/boot/compressed/decompress.c +f:arch/mips/boot/compressed/decompress.h +f:arch/mips/boot/compressed/dummy.c +f:arch/mips/boot/compressed/head.S +f:arch/mips/boot/compressed/ld.script +f:arch/mips/boot/compressed/string.c +f:arch/mips/boot/compressed/uart-16550.c +f:arch/mips/boot/compressed/uart-alchemy.c +f:arch/mips/boot/compressed/uart-ath79.c +f:arch/mips/boot/compressed/uart-prom.c +f:arch/mips/boot/dts/Makefile +f:arch/mips/boot/dts/brcm/Makefile +f:arch/mips/boot/dts/brcm/bcm3368-netgear-cvg834g.dts +f:arch/mips/boot/dts/brcm/bcm3368.dtsi +f:arch/mips/boot/dts/brcm/bcm3384_viper.dtsi +f:arch/mips/boot/dts/brcm/bcm3384_zephyr.dtsi +f:arch/mips/boot/dts/brcm/bcm63268-comtrend-vr-3032u.dts +f:arch/mips/boot/dts/brcm/bcm63268.dtsi +f:arch/mips/boot/dts/brcm/bcm6328.dtsi +f:arch/mips/boot/dts/brcm/bcm6358-neufbox4-sercomm.dts +f:arch/mips/boot/dts/brcm/bcm6358.dtsi +f:arch/mips/boot/dts/brcm/bcm6362-neufbox6-sercomm.dts +f:arch/mips/boot/dts/brcm/bcm6362.dtsi +f:arch/mips/boot/dts/brcm/bcm6368.dtsi +f:arch/mips/boot/dts/brcm/bcm7125.dtsi +f:arch/mips/boot/dts/brcm/bcm7346.dtsi +f:arch/mips/boot/dts/brcm/bcm7358.dtsi +f:arch/mips/boot/dts/brcm/bcm7360.dtsi +f:arch/mips/boot/dts/brcm/bcm7362.dtsi +f:arch/mips/boot/dts/brcm/bcm7420.dtsi +f:arch/mips/boot/dts/brcm/bcm7425.dtsi +f:arch/mips/boot/dts/brcm/bcm7435.dtsi +f:arch/mips/boot/dts/brcm/bcm93384wvg.dts +f:arch/mips/boot/dts/brcm/bcm93384wvg_viper.dts +f:arch/mips/boot/dts/brcm/bcm96368mvwg.dts +f:arch/mips/boot/dts/brcm/bcm97125cbmb.dts +f:arch/mips/boot/dts/brcm/bcm97346dbsmb.dts +f:arch/mips/boot/dts/brcm/bcm97358svmb.dts +f:arch/mips/boot/dts/brcm/bcm97360svmb.dts +f:arch/mips/boot/dts/brcm/bcm97362svmb.dts +f:arch/mips/boot/dts/brcm/bcm97420c.dts +f:arch/mips/boot/dts/brcm/bcm97425svmb.dts +f:arch/mips/boot/dts/brcm/bcm97435svmb.dts +f:arch/mips/boot/dts/brcm/bcm97xxx-nand-cs1-bch24.dtsi +f:arch/mips/boot/dts/brcm/bcm97xxx-nand-cs1-bch4.dtsi +f:arch/mips/boot/dts/brcm/bcm9ejtagprb.dts +f:arch/mips/boot/dts/cavium-octeon/Makefile +f:arch/mips/boot/dts/cavium-octeon/dlink_dsr-1000n.dts +f:arch/mips/boot/dts/cavium-octeon/dlink_dsr-500n-1000n.dtsi +f:arch/mips/boot/dts/cavium-octeon/dlink_dsr-500n.dts +f:arch/mips/boot/dts/cavium-octeon/octeon_3xxx.dts +f:arch/mips/boot/dts/cavium-octeon/octeon_3xxx.dtsi +f:arch/mips/boot/dts/cavium-octeon/octeon_68xx.dts +f:arch/mips/boot/dts/cavium-octeon/ubnt_e100.dts +f:arch/mips/boot/dts/econet/Makefile +f:arch/mips/boot/dts/econet/en751221.dtsi +f:arch/mips/boot/dts/econet/en751221_smartfiber_xp8421-b.dts +f:arch/mips/boot/dts/img/Makefile +f:arch/mips/boot/dts/img/boston.dts +f:arch/mips/boot/dts/img/pistachio.dtsi +f:arch/mips/boot/dts/img/pistachio_marduk.dts +f:arch/mips/boot/dts/ingenic/Makefile +f:arch/mips/boot/dts/ingenic/ci20.dts +f:arch/mips/boot/dts/ingenic/cu1000-neo.dts +f:arch/mips/boot/dts/ingenic/cu1830-neo.dts +f:arch/mips/boot/dts/ingenic/gcw0.dts +f:arch/mips/boot/dts/ingenic/gcw0_proto.dts +f:arch/mips/boot/dts/ingenic/jz4725b.dtsi +f:arch/mips/boot/dts/ingenic/jz4740.dtsi +f:arch/mips/boot/dts/ingenic/jz4770.dtsi +f:arch/mips/boot/dts/ingenic/jz4780.dtsi +f:arch/mips/boot/dts/ingenic/qi_lb60.dts +f:arch/mips/boot/dts/ingenic/rs90.dts +f:arch/mips/boot/dts/ingenic/x1000.dtsi +f:arch/mips/boot/dts/ingenic/x1830.dtsi +f:arch/mips/boot/dts/lantiq/Makefile +f:arch/mips/boot/dts/lantiq/danube.dtsi +f:arch/mips/boot/dts/lantiq/danube_easy50712.dts +f:arch/mips/boot/dts/loongson/Makefile +f:arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi +f:arch/mips/boot/dts/loongson/loongson64_2core_2k1000.dts +f:arch/mips/boot/dts/loongson/loongson64c-package.dtsi +f:arch/mips/boot/dts/loongson/loongson64c_4core_ls7a.dts +f:arch/mips/boot/dts/loongson/loongson64c_4core_rs780e.dts +f:arch/mips/boot/dts/loongson/loongson64c_8core_rs780e.dts +f:arch/mips/boot/dts/loongson/loongson64g-package.dtsi +f:arch/mips/boot/dts/loongson/loongson64g_4core_ls7a.dts +f:arch/mips/boot/dts/loongson/loongson64v_4core_virtio.dts +f:arch/mips/boot/dts/loongson/ls7a-pch.dtsi +f:arch/mips/boot/dts/loongson/rs780e-pch.dtsi +f:arch/mips/boot/dts/mobileye/Makefile +f:arch/mips/boot/dts/mobileye/eyeq5-epm5.dts +f:arch/mips/boot/dts/mobileye/eyeq5-pins.dtsi +f:arch/mips/boot/dts/mobileye/eyeq5.dtsi +f:arch/mips/boot/dts/mobileye/eyeq6h-epm6.dts +f:arch/mips/boot/dts/mobileye/eyeq6h-pins.dtsi +f:arch/mips/boot/dts/mobileye/eyeq6h.dtsi +f:arch/mips/boot/dts/mscc/Makefile +f:arch/mips/boot/dts/mscc/jaguar2.dtsi +f:arch/mips/boot/dts/mscc/jaguar2_common.dtsi +f:arch/mips/boot/dts/mscc/jaguar2_pcb110.dts +f:arch/mips/boot/dts/mscc/jaguar2_pcb111.dts +f:arch/mips/boot/dts/mscc/jaguar2_pcb118.dts +f:arch/mips/boot/dts/mscc/luton.dtsi +f:arch/mips/boot/dts/mscc/luton_pcb091.dts +f:arch/mips/boot/dts/mscc/ocelot.dtsi +f:arch/mips/boot/dts/mscc/ocelot_pcb120.dts +f:arch/mips/boot/dts/mscc/ocelot_pcb123.dts +f:arch/mips/boot/dts/mscc/serval.dtsi +f:arch/mips/boot/dts/mscc/serval_common.dtsi +f:arch/mips/boot/dts/mscc/serval_pcb105.dts +f:arch/mips/boot/dts/mscc/serval_pcb106.dts +f:arch/mips/boot/dts/mti/Makefile +f:arch/mips/boot/dts/mti/malta.dts +f:arch/mips/boot/dts/mti/sead3.dts +f:arch/mips/boot/dts/ni/169445.dts +f:arch/mips/boot/dts/ni/Makefile +f:arch/mips/boot/dts/pic32/Makefile +f:arch/mips/boot/dts/pic32/pic32mzda.dtsi +f:arch/mips/boot/dts/pic32/pic32mzda_sk.dts +f:arch/mips/boot/dts/qca/Makefile +f:arch/mips/boot/dts/qca/ar9132.dtsi +f:arch/mips/boot/dts/qca/ar9132_tl_wr1043nd_v1.dts +f:arch/mips/boot/dts/qca/ar9331.dtsi +f:arch/mips/boot/dts/qca/ar9331_dpt_module.dts +f:arch/mips/boot/dts/qca/ar9331_dragino_ms14.dts +f:arch/mips/boot/dts/qca/ar9331_omega.dts +f:arch/mips/boot/dts/qca/ar9331_openembed_som9331_board.dts +f:arch/mips/boot/dts/qca/ar9331_tl_mr3020.dts +f:arch/mips/boot/dts/ralink/Makefile +f:arch/mips/boot/dts/ralink/gardena_smart_gateway_mt7688.dts +f:arch/mips/boot/dts/ralink/mt7620a.dtsi +f:arch/mips/boot/dts/ralink/mt7620a_eval.dts +f:arch/mips/boot/dts/ralink/mt7621-gnubee-gb-pc1.dts +f:arch/mips/boot/dts/ralink/mt7621-gnubee-gb-pc2.dts +f:arch/mips/boot/dts/ralink/mt7621-tplink-hc220-g5-v1.dts +f:arch/mips/boot/dts/ralink/mt7621.dtsi +f:arch/mips/boot/dts/ralink/mt7628a.dtsi +f:arch/mips/boot/dts/ralink/omega2p.dts +f:arch/mips/boot/dts/ralink/rt2880.dtsi +f:arch/mips/boot/dts/ralink/rt2880_eval.dts +f:arch/mips/boot/dts/ralink/rt3050.dtsi +f:arch/mips/boot/dts/ralink/rt3052_eval.dts +f:arch/mips/boot/dts/ralink/rt3883.dtsi +f:arch/mips/boot/dts/ralink/rt3883_eval.dts +f:arch/mips/boot/dts/ralink/vocore2.dts +f:arch/mips/boot/dts/realtek/Makefile +f:arch/mips/boot/dts/realtek/cameo-rtl9302c-2x-rtl8224-2xge.dts +f:arch/mips/boot/dts/realtek/cisco_sg220-26.dts +f:arch/mips/boot/dts/realtek/rtl838x.dtsi +f:arch/mips/boot/dts/realtek/rtl9302c.dtsi +f:arch/mips/boot/dts/realtek/rtl930x.dtsi +f:arch/mips/boot/dts/xilfpga/Makefile +f:arch/mips/boot/dts/xilfpga/microAptiv.dtsi +f:arch/mips/boot/dts/xilfpga/nexys4ddr.dts +f:arch/mips/boot/ecoff.h +f:arch/mips/boot/elf2ecoff.c +f:arch/mips/boot/tools/.gitignore +f:arch/mips/boot/tools/Makefile +f:arch/mips/boot/tools/relocs.c +f:arch/mips/boot/tools/relocs.h +f:arch/mips/boot/tools/relocs_32.c +f:arch/mips/boot/tools/relocs_64.c +f:arch/mips/boot/tools/relocs_main.c +f:arch/mips/cavium-octeon/Kconfig +f:arch/mips/cavium-octeon/Makefile +f:arch/mips/cavium-octeon/Platform +f:arch/mips/cavium-octeon/cpu.c +f:arch/mips/cavium-octeon/crypto/Makefile +f:arch/mips/cavium-octeon/crypto/octeon-crypto.c +f:arch/mips/cavium-octeon/crypto/octeon-md5.c +f:arch/mips/cavium-octeon/csrc-octeon.c +f:arch/mips/cavium-octeon/dma-octeon.c +f:arch/mips/cavium-octeon/executive/Makefile +f:arch/mips/cavium-octeon/executive/cvmx-boot-vector.c +f:arch/mips/cavium-octeon/executive/cvmx-bootmem.c +f:arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-board.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-errata.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-jtag.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-loop.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-npi.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-rgmii.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-sgmii.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-spi.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-util.c +f:arch/mips/cavium-octeon/executive/cvmx-helper-xaui.c +f:arch/mips/cavium-octeon/executive/cvmx-helper.c +f:arch/mips/cavium-octeon/executive/cvmx-interrupt-decodes.c +f:arch/mips/cavium-octeon/executive/cvmx-interrupt-rsl.c +f:arch/mips/cavium-octeon/executive/cvmx-l2c.c +f:arch/mips/cavium-octeon/executive/cvmx-pko.c +f:arch/mips/cavium-octeon/executive/cvmx-spi.c +f:arch/mips/cavium-octeon/executive/cvmx-sysinfo.c +f:arch/mips/cavium-octeon/executive/octeon-model.c +f:arch/mips/cavium-octeon/flash_setup.c +f:arch/mips/cavium-octeon/oct_ilm.c +f:arch/mips/cavium-octeon/octeon-irq.c +f:arch/mips/cavium-octeon/octeon-memcpy.S +f:arch/mips/cavium-octeon/octeon-platform.c +f:arch/mips/cavium-octeon/octeon_boot.h +f:arch/mips/cavium-octeon/setup.c +f:arch/mips/cavium-octeon/smp.c +f:arch/mips/cobalt/Makefile +f:arch/mips/cobalt/Platform +f:arch/mips/cobalt/buttons.c +f:arch/mips/cobalt/irq.c +f:arch/mips/cobalt/lcd.c +f:arch/mips/cobalt/led.c +f:arch/mips/cobalt/mtd.c +f:arch/mips/cobalt/pci.c +f:arch/mips/cobalt/reset.c +f:arch/mips/cobalt/rtc.c +f:arch/mips/cobalt/serial.c +f:arch/mips/cobalt/setup.c +f:arch/mips/cobalt/time.c +f:arch/mips/configs/ath25_defconfig +f:arch/mips/configs/ath79_defconfig +f:arch/mips/configs/bcm47xx_defconfig +f:arch/mips/configs/bcm63xx_defconfig +f:arch/mips/configs/bigsur_defconfig +f:arch/mips/configs/bmips_be_defconfig +f:arch/mips/configs/bmips_stb_defconfig +f:arch/mips/configs/cavium_octeon_defconfig +f:arch/mips/configs/ci20_defconfig +f:arch/mips/configs/cobalt_defconfig +f:arch/mips/configs/cu1000-neo_defconfig +f:arch/mips/configs/cu1830-neo_defconfig +f:arch/mips/configs/db1xxx_defconfig +f:arch/mips/configs/decstation_64_defconfig +f:arch/mips/configs/decstation_defconfig +f:arch/mips/configs/decstation_r4k_defconfig +f:arch/mips/configs/eyeq5_defconfig +f:arch/mips/configs/eyeq6_defconfig +f:arch/mips/configs/fuloong2e_defconfig +f:arch/mips/configs/gcw0_defconfig +f:arch/mips/configs/generic/32r1.config +f:arch/mips/configs/generic/32r2.config +f:arch/mips/configs/generic/32r6.config +f:arch/mips/configs/generic/64r1.config +f:arch/mips/configs/generic/64r2.config +f:arch/mips/configs/generic/64r6.config +f:arch/mips/configs/generic/board-boston.config +f:arch/mips/configs/generic/board-litex.config +f:arch/mips/configs/generic/board-marduk.config +f:arch/mips/configs/generic/board-ni169445.config +f:arch/mips/configs/generic/board-ocelot.config +f:arch/mips/configs/generic/board-ranchu.config +f:arch/mips/configs/generic/board-sead-3.config +f:arch/mips/configs/generic/board-virt.config +f:arch/mips/configs/generic/board-xilfpga.config +f:arch/mips/configs/generic/eb.config +f:arch/mips/configs/generic/el.config +f:arch/mips/configs/generic/micro32r2.config +f:arch/mips/configs/generic_defconfig +f:arch/mips/configs/gpr_defconfig +f:arch/mips/configs/ip22_defconfig +f:arch/mips/configs/ip27_defconfig +f:arch/mips/configs/ip28_defconfig +f:arch/mips/configs/ip30_defconfig +f:arch/mips/configs/ip32_defconfig +f:arch/mips/configs/jazz_defconfig +f:arch/mips/configs/lemote2f_defconfig +f:arch/mips/configs/loongson1b_defconfig +f:arch/mips/configs/loongson1c_defconfig +f:arch/mips/configs/loongson2k_defconfig +f:arch/mips/configs/loongson3_defconfig +f:arch/mips/configs/malta_defconfig +f:arch/mips/configs/malta_kvm_defconfig +f:arch/mips/configs/malta_qemu_32r6_defconfig +f:arch/mips/configs/maltaaprp_defconfig +f:arch/mips/configs/maltasmvp_defconfig +f:arch/mips/configs/maltasmvp_eva_defconfig +f:arch/mips/configs/maltaup_defconfig +f:arch/mips/configs/maltaup_xpa_defconfig +f:arch/mips/configs/mtx1_defconfig +f:arch/mips/configs/omega2p_defconfig +f:arch/mips/configs/pic32mzda_defconfig +f:arch/mips/configs/qi_lb60_defconfig +f:arch/mips/configs/rb532_defconfig +f:arch/mips/configs/rbtx49xx_defconfig +f:arch/mips/configs/rm200_defconfig +f:arch/mips/configs/rs90_defconfig +f:arch/mips/configs/rt305x_defconfig +f:arch/mips/configs/sb1250_swarm_defconfig +f:arch/mips/configs/vocore2_defconfig +f:arch/mips/configs/xway_defconfig +f:arch/mips/crypto/.gitignore +f:arch/mips/crypto/Kconfig +f:arch/mips/crypto/Makefile +f:arch/mips/dec/Makefile +f:arch/mips/dec/Platform +f:arch/mips/dec/ecc-berr.c +f:arch/mips/dec/int-handler.S +f:arch/mips/dec/ioasic-irq.c +f:arch/mips/dec/kn01-berr.c +f:arch/mips/dec/kn02-irq.c +f:arch/mips/dec/kn02xa-berr.c +f:arch/mips/dec/platform.c +f:arch/mips/dec/prom/Makefile +f:arch/mips/dec/prom/cmdline.c +f:arch/mips/dec/prom/console.c +f:arch/mips/dec/prom/dectypes.h +f:arch/mips/dec/prom/identify.c +f:arch/mips/dec/prom/init.c +f:arch/mips/dec/prom/locore.S +f:arch/mips/dec/prom/memory.c +f:arch/mips/dec/reset.c +f:arch/mips/dec/setup.c +f:arch/mips/dec/tc.c +f:arch/mips/dec/time.c +f:arch/mips/dec/wbflush.c +f:arch/mips/econet/Kconfig +f:arch/mips/econet/Makefile +f:arch/mips/econet/Platform +f:arch/mips/econet/init.c +f:arch/mips/fw/arc/Makefile +f:arch/mips/fw/arc/arc_con.c +f:arch/mips/fw/arc/cmdline.c +f:arch/mips/fw/arc/env.c +f:arch/mips/fw/arc/file.c +f:arch/mips/fw/arc/identify.c +f:arch/mips/fw/arc/init.c +f:arch/mips/fw/arc/memory.c +f:arch/mips/fw/arc/misc.c +f:arch/mips/fw/arc/promlib.c +f:arch/mips/fw/cfe/Makefile +f:arch/mips/fw/cfe/cfe_api.c +f:arch/mips/fw/cfe/cfe_api_int.h +f:arch/mips/fw/lib/Makefile +f:arch/mips/fw/lib/call_o32.S +f:arch/mips/fw/lib/cmdline.c +f:arch/mips/fw/sni/Makefile +f:arch/mips/fw/sni/sniprom.c +f:arch/mips/generic/Kconfig +f:arch/mips/generic/Makefile +f:arch/mips/generic/Platform +f:arch/mips/generic/board-boston.its.S +f:arch/mips/generic/board-ingenic.c +f:arch/mips/generic/board-jaguar2.its.S +f:arch/mips/generic/board-luton.its.S +f:arch/mips/generic/board-marduk.its.S +f:arch/mips/generic/board-ni169445.its.S +f:arch/mips/generic/board-ocelot.c +f:arch/mips/generic/board-ocelot.its.S +f:arch/mips/generic/board-ranchu.c +f:arch/mips/generic/board-realtek.c +f:arch/mips/generic/board-sead3.c +f:arch/mips/generic/board-serval.its.S +f:arch/mips/generic/board-xilfpga.its.S +f:arch/mips/generic/init.c +f:arch/mips/generic/irq.c +f:arch/mips/generic/proc.c +f:arch/mips/generic/vmlinux.its.S +f:arch/mips/generic/yamon-dt.c +f:arch/mips/include/asm/Kbuild +f:arch/mips/include/asm/abi.h +f:arch/mips/include/asm/addrspace.h +f:arch/mips/include/asm/amon.h +f:arch/mips/include/asm/arch_hweight.h +f:arch/mips/include/asm/asm-eva.h +f:arch/mips/include/asm/asm-offsets.h +f:arch/mips/include/asm/asm-prototypes.h +f:arch/mips/include/asm/asm.h +f:arch/mips/include/asm/asmmacro-32.h +f:arch/mips/include/asm/asmmacro-64.h +f:arch/mips/include/asm/asmmacro.h +f:arch/mips/include/asm/atomic.h +f:arch/mips/include/asm/barrier.h +f:arch/mips/include/asm/bcache.h +f:arch/mips/include/asm/bitops.h +f:arch/mips/include/asm/bitrev.h +f:arch/mips/include/asm/bmips-spaces.h +f:arch/mips/include/asm/bmips.h +f:arch/mips/include/asm/bootinfo.h +f:arch/mips/include/asm/branch.h +f:arch/mips/include/asm/break.h +f:arch/mips/include/asm/bug.h +f:arch/mips/include/asm/bugs.h +f:arch/mips/include/asm/cache.h +f:arch/mips/include/asm/cacheflush.h +f:arch/mips/include/asm/cacheops.h +f:arch/mips/include/asm/cachetype.h +f:arch/mips/include/asm/cdmm.h +f:arch/mips/include/asm/cevt-r4k.h +f:arch/mips/include/asm/checksum.h +f:arch/mips/include/asm/clocksource.h +f:arch/mips/include/asm/cmp.h +f:arch/mips/include/asm/cmpxchg.h +f:arch/mips/include/asm/compat-signal.h +f:arch/mips/include/asm/compat.h +f:arch/mips/include/asm/compiler.h +f:arch/mips/include/asm/cop2.h +f:arch/mips/include/asm/cpu-features.h +f:arch/mips/include/asm/cpu-info.h +f:arch/mips/include/asm/cpu-type.h +f:arch/mips/include/asm/cpu.h +f:arch/mips/include/asm/cpufeature.h +f:arch/mips/include/asm/debug.h +f:arch/mips/include/asm/dec/ecc.h +f:arch/mips/include/asm/dec/interrupts.h +f:arch/mips/include/asm/dec/ioasic.h +f:arch/mips/include/asm/dec/ioasic_addrs.h +f:arch/mips/include/asm/dec/ioasic_ints.h +f:arch/mips/include/asm/dec/kn01.h +f:arch/mips/include/asm/dec/kn02.h +f:arch/mips/include/asm/dec/kn02ba.h +f:arch/mips/include/asm/dec/kn02ca.h +f:arch/mips/include/asm/dec/kn02xa.h +f:arch/mips/include/asm/dec/kn03.h +f:arch/mips/include/asm/dec/kn05.h +f:arch/mips/include/asm/dec/kn230.h +f:arch/mips/include/asm/dec/machtype.h +f:arch/mips/include/asm/dec/prom.h +f:arch/mips/include/asm/dec/system.h +f:arch/mips/include/asm/delay.h +f:arch/mips/include/asm/div64.h +f:arch/mips/include/asm/dma-direct.h +f:arch/mips/include/asm/dma-mapping.h +f:arch/mips/include/asm/dma.h +f:arch/mips/include/asm/dmi.h +f:arch/mips/include/asm/ds1287.h +f:arch/mips/include/asm/dsemul.h +f:arch/mips/include/asm/dsp.h +f:arch/mips/include/asm/edac.h +f:arch/mips/include/asm/elf.h +f:arch/mips/include/asm/elfcore-compat.h +f:arch/mips/include/asm/errno.h +f:arch/mips/include/asm/eva.h +f:arch/mips/include/asm/exec.h +f:arch/mips/include/asm/extable.h +f:arch/mips/include/asm/fixmap.h +f:arch/mips/include/asm/floppy.h +f:arch/mips/include/asm/fpregdef.h +f:arch/mips/include/asm/fpu.h +f:arch/mips/include/asm/fpu_emulator.h +f:arch/mips/include/asm/ftrace.h +f:arch/mips/include/asm/futex.h +f:arch/mips/include/asm/fw/arc/hinv.h +f:arch/mips/include/asm/fw/arc/types.h +f:arch/mips/include/asm/fw/cfe/cfe_api.h +f:arch/mips/include/asm/fw/cfe/cfe_error.h +f:arch/mips/include/asm/fw/fw.h +f:arch/mips/include/asm/ginvt.h +f:arch/mips/include/asm/gio_device.h +f:arch/mips/include/asm/gt64120.h +f:arch/mips/include/asm/hardirq.h +f:arch/mips/include/asm/hazards.h +f:arch/mips/include/asm/highmem.h +f:arch/mips/include/asm/hpet.h +f:arch/mips/include/asm/hugetlb.h +f:arch/mips/include/asm/hw_irq.h +f:arch/mips/include/asm/i8259.h +f:arch/mips/include/asm/idle.h +f:arch/mips/include/asm/inst.h +f:arch/mips/include/asm/io.h +f:arch/mips/include/asm/ip32/crime.h +f:arch/mips/include/asm/ip32/ip32_ints.h +f:arch/mips/include/asm/ip32/mace.h +f:arch/mips/include/asm/irq.h +f:arch/mips/include/asm/irq_cpu.h +f:arch/mips/include/asm/irq_gt641xx.h +f:arch/mips/include/asm/irq_regs.h +f:arch/mips/include/asm/irqflags.h +f:arch/mips/include/asm/isa-rev.h +f:arch/mips/include/asm/isadep.h +f:arch/mips/include/asm/jazz.h +f:arch/mips/include/asm/jazzdma.h +f:arch/mips/include/asm/jump_label.h +f:arch/mips/include/asm/kdebug.h +f:arch/mips/include/asm/kexec.h +f:arch/mips/include/asm/kgdb.h +f:arch/mips/include/asm/kprobes.h +f:arch/mips/include/asm/kvm_host.h +f:arch/mips/include/asm/kvm_types.h +f:arch/mips/include/asm/linkage.h +f:arch/mips/include/asm/local.h +f:arch/mips/include/asm/maar.h +f:arch/mips/include/asm/mach-ath25/ath25_platform.h +f:arch/mips/include/asm/mach-ath25/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ath79/ar71xx_regs.h +f:arch/mips/include/asm/mach-ath79/ar933x_uart.h +f:arch/mips/include/asm/mach-ath79/ath79.h +f:arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ath79/irq.h +f:arch/mips/include/asm/mach-ath79/kernel-entry-init.h +f:arch/mips/include/asm/mach-au1x00/au1000.h +f:arch/mips/include/asm/mach-au1x00/au1000_dma.h +f:arch/mips/include/asm/mach-au1x00/au1100_mmc.h +f:arch/mips/include/asm/mach-au1x00/au1200fb.h +f:arch/mips/include/asm/mach-au1x00/au1550_spi.h +f:arch/mips/include/asm/mach-au1x00/au1550nd.h +f:arch/mips/include/asm/mach-au1x00/au1xxx_dbdma.h +f:arch/mips/include/asm/mach-au1x00/au1xxx_eth.h +f:arch/mips/include/asm/mach-au1x00/au1xxx_psc.h +f:arch/mips/include/asm/mach-au1x00/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-au1x00/gpio-au1000.h +f:arch/mips/include/asm/mach-au1x00/gpio-au1300.h +f:arch/mips/include/asm/mach-au1x00/prom.h +f:arch/mips/include/asm/mach-bcm47xx/bcm47xx.h +f:arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h +f:arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_cs.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_enet.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_flash.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_hsspi.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pci.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pcmcia.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_uart.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_usbd.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_iudma.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_reset.h +f:arch/mips/include/asm/mach-bcm63xx/bcm63xx_timer.h +f:arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h +f:arch/mips/include/asm/mach-bcm63xx/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-bcm63xx/ioremap.h +f:arch/mips/include/asm/mach-bcm63xx/irq.h +f:arch/mips/include/asm/mach-bcm63xx/spaces.h +f:arch/mips/include/asm/mach-bmips/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-bmips/ioremap.h +f:arch/mips/include/asm/mach-bmips/spaces.h +f:arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-cavium-octeon/irq.h +f:arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h +f:arch/mips/include/asm/mach-cavium-octeon/mangle-port.h +f:arch/mips/include/asm/mach-cavium-octeon/spaces.h +f:arch/mips/include/asm/mach-cobalt/cobalt.h +f:arch/mips/include/asm/mach-cobalt/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-cobalt/irq.h +f:arch/mips/include/asm/mach-cobalt/mach-gt64120.h +f:arch/mips/include/asm/mach-db1x00/bcsr.h +f:arch/mips/include/asm/mach-db1x00/irq.h +f:arch/mips/include/asm/mach-dec/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-dec/mc146818rtc.h +f:arch/mips/include/asm/mach-generic/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-generic/floppy.h +f:arch/mips/include/asm/mach-generic/ioremap.h +f:arch/mips/include/asm/mach-generic/irq.h +f:arch/mips/include/asm/mach-generic/kernel-entry-init.h +f:arch/mips/include/asm/mach-generic/kmalloc.h +f:arch/mips/include/asm/mach-generic/mangle-port.h +f:arch/mips/include/asm/mach-generic/mc146818rtc.h +f:arch/mips/include/asm/mach-generic/spaces.h +f:arch/mips/include/asm/mach-generic/topology.h +f:arch/mips/include/asm/mach-ingenic/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ip22/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ip22/spaces.h +f:arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ip27/irq.h +f:arch/mips/include/asm/mach-ip27/kernel-entry-init.h +f:arch/mips/include/asm/mach-ip27/mangle-port.h +f:arch/mips/include/asm/mach-ip27/mmzone.h +f:arch/mips/include/asm/mach-ip27/spaces.h +f:arch/mips/include/asm/mach-ip27/topology.h +f:arch/mips/include/asm/mach-ip28/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ip28/spaces.h +f:arch/mips/include/asm/mach-ip30/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ip30/kernel-entry-init.h +f:arch/mips/include/asm/mach-ip30/mangle-port.h +f:arch/mips/include/asm/mach-ip30/spaces.h +f:arch/mips/include/asm/mach-ip32/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ip32/kmalloc.h +f:arch/mips/include/asm/mach-ip32/mangle-port.h +f:arch/mips/include/asm/mach-jazz/floppy.h +f:arch/mips/include/asm/mach-jazz/mc146818rtc.h +f:arch/mips/include/asm/mach-lantiq/falcon/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h +f:arch/mips/include/asm/mach-lantiq/falcon/irq.h +f:arch/mips/include/asm/mach-lantiq/falcon/lantiq_soc.h +f:arch/mips/include/asm/mach-lantiq/lantiq.h +f:arch/mips/include/asm/mach-lantiq/lantiq_platform.h +f:arch/mips/include/asm/mach-lantiq/xway/irq.h +f:arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h +f:arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h +f:arch/mips/include/asm/mach-lantiq/xway/xway_dma.h +f:arch/mips/include/asm/mach-loongson2ef/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-loongson2ef/cs5536/cs5536.h +f:arch/mips/include/asm/mach-loongson2ef/cs5536/cs5536_mfgpt.h +f:arch/mips/include/asm/mach-loongson2ef/cs5536/cs5536_pci.h +f:arch/mips/include/asm/mach-loongson2ef/cs5536/cs5536_vsm.h +f:arch/mips/include/asm/mach-loongson2ef/loongson.h +f:arch/mips/include/asm/mach-loongson2ef/machine.h +f:arch/mips/include/asm/mach-loongson2ef/mem.h +f:arch/mips/include/asm/mach-loongson2ef/pci.h +f:arch/mips/include/asm/mach-loongson2ef/spaces.h +f:arch/mips/include/asm/mach-loongson32/irq.h +f:arch/mips/include/asm/mach-loongson32/loongson1.h +f:arch/mips/include/asm/mach-loongson32/platform.h +f:arch/mips/include/asm/mach-loongson32/regs-mux.h +f:arch/mips/include/asm/mach-loongson64/boot_param.h +f:arch/mips/include/asm/mach-loongson64/builtin_dtbs.h +f:arch/mips/include/asm/mach-loongson64/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-loongson64/cpucfg-emul.h +f:arch/mips/include/asm/mach-loongson64/irq.h +f:arch/mips/include/asm/mach-loongson64/kernel-entry-init.h +f:arch/mips/include/asm/mach-loongson64/loongson.h +f:arch/mips/include/asm/mach-loongson64/loongson_hwmon.h +f:arch/mips/include/asm/mach-loongson64/loongson_regs.h +f:arch/mips/include/asm/mach-loongson64/mmzone.h +f:arch/mips/include/asm/mach-loongson64/pci.h +f:arch/mips/include/asm/mach-loongson64/spaces.h +f:arch/mips/include/asm/mach-loongson64/topology.h +f:arch/mips/include/asm/mach-loongson64/workarounds.h +f:arch/mips/include/asm/mach-malta/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-malta/irq.h +f:arch/mips/include/asm/mach-malta/kernel-entry-init.h +f:arch/mips/include/asm/mach-malta/mach-gt64120.h +f:arch/mips/include/asm/mach-malta/mc146818rtc.h +f:arch/mips/include/asm/mach-malta/spaces.h +f:arch/mips/include/asm/mach-n64/irq.h +f:arch/mips/include/asm/mach-n64/kmalloc.h +f:arch/mips/include/asm/mach-pic32/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-pic32/irq.h +f:arch/mips/include/asm/mach-pic32/pic32.h +f:arch/mips/include/asm/mach-pic32/spaces.h +f:arch/mips/include/asm/mach-ralink/irq.h +f:arch/mips/include/asm/mach-ralink/mt7620.h +f:arch/mips/include/asm/mach-ralink/mt7620/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ralink/mt7621.h +f:arch/mips/include/asm/mach-ralink/mt7621/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ralink/ralink_regs.h +f:arch/mips/include/asm/mach-ralink/rt288x.h +f:arch/mips/include/asm/mach-ralink/rt288x/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ralink/rt305x.h +f:arch/mips/include/asm/mach-ralink/rt305x/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ralink/rt3883.h +f:arch/mips/include/asm/mach-ralink/rt3883/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-ralink/spaces.h +f:arch/mips/include/asm/mach-rc32434/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-rc32434/ddr.h +f:arch/mips/include/asm/mach-rc32434/dma.h +f:arch/mips/include/asm/mach-rc32434/dma_v.h +f:arch/mips/include/asm/mach-rc32434/eth.h +f:arch/mips/include/asm/mach-rc32434/gpio.h +f:arch/mips/include/asm/mach-rc32434/integ.h +f:arch/mips/include/asm/mach-rc32434/irq.h +f:arch/mips/include/asm/mach-rc32434/pci.h +f:arch/mips/include/asm/mach-rc32434/prom.h +f:arch/mips/include/asm/mach-rc32434/rb.h +f:arch/mips/include/asm/mach-rc32434/rc32434.h +f:arch/mips/include/asm/mach-rc32434/timer.h +f:arch/mips/include/asm/mach-rm/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-sibyte/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-tx49xx/cpu-feature-overrides.h +f:arch/mips/include/asm/mach-tx49xx/ioremap.h +f:arch/mips/include/asm/mach-tx49xx/kmalloc.h +f:arch/mips/include/asm/mach-tx49xx/mangle-port.h +f:arch/mips/include/asm/mach-tx49xx/spaces.h +f:arch/mips/include/asm/machine.h +f:arch/mips/include/asm/mc146818-time.h +f:arch/mips/include/asm/mc146818rtc.h +f:arch/mips/include/asm/mips-boards/bonito64.h +f:arch/mips/include/asm/mips-boards/generic.h +f:arch/mips/include/asm/mips-boards/launch.h +f:arch/mips/include/asm/mips-boards/malta.h +f:arch/mips/include/asm/mips-boards/maltaint.h +f:arch/mips/include/asm/mips-boards/msc01_pci.h +f:arch/mips/include/asm/mips-boards/piix4.h +f:arch/mips/include/asm/mips-boards/sead3-addr.h +f:arch/mips/include/asm/mips-boards/sim.h +f:arch/mips/include/asm/mips-cm.h +f:arch/mips/include/asm/mips-cpc.h +f:arch/mips/include/asm/mips-cps.h +f:arch/mips/include/asm/mips-gic.h +f:arch/mips/include/asm/mips-r2-to-r6-emul.h +f:arch/mips/include/asm/mips_mt.h +f:arch/mips/include/asm/mipsmtregs.h +f:arch/mips/include/asm/mipsprom.h +f:arch/mips/include/asm/mipsregs.h +f:arch/mips/include/asm/mmiowb.h +f:arch/mips/include/asm/mmu.h +f:arch/mips/include/asm/mmu_context.h +f:arch/mips/include/asm/mmzone.h +f:arch/mips/include/asm/module.h +f:arch/mips/include/asm/msa.h +f:arch/mips/include/asm/msc01_ic.h +f:arch/mips/include/asm/octeon/crypto.h +f:arch/mips/include/asm/octeon/cvmx-address.h +f:arch/mips/include/asm/octeon/cvmx-agl-defs.h +f:arch/mips/include/asm/octeon/cvmx-asm.h +f:arch/mips/include/asm/octeon/cvmx-asxx-defs.h +f:arch/mips/include/asm/octeon/cvmx-boot-vector.h +f:arch/mips/include/asm/octeon/cvmx-bootinfo.h +f:arch/mips/include/asm/octeon/cvmx-bootmem.h +f:arch/mips/include/asm/octeon/cvmx-ciu-defs.h +f:arch/mips/include/asm/octeon/cvmx-ciu2-defs.h +f:arch/mips/include/asm/octeon/cvmx-ciu3-defs.h +f:arch/mips/include/asm/octeon/cvmx-cmd-queue.h +f:arch/mips/include/asm/octeon/cvmx-config.h +f:arch/mips/include/asm/octeon/cvmx-coremask.h +f:arch/mips/include/asm/octeon/cvmx-dbg-defs.h +f:arch/mips/include/asm/octeon/cvmx-dpi-defs.h +f:arch/mips/include/asm/octeon/cvmx-fau.h +f:arch/mips/include/asm/octeon/cvmx-fpa-defs.h +f:arch/mips/include/asm/octeon/cvmx-fpa.h +f:arch/mips/include/asm/octeon/cvmx-gmxx-defs.h +f:arch/mips/include/asm/octeon/cvmx-gpio-defs.h +f:arch/mips/include/asm/octeon/cvmx-helper-board.h +f:arch/mips/include/asm/octeon/cvmx-helper-errata.h +f:arch/mips/include/asm/octeon/cvmx-helper-jtag.h +f:arch/mips/include/asm/octeon/cvmx-helper-loop.h +f:arch/mips/include/asm/octeon/cvmx-helper-npi.h +f:arch/mips/include/asm/octeon/cvmx-helper-rgmii.h +f:arch/mips/include/asm/octeon/cvmx-helper-sgmii.h +f:arch/mips/include/asm/octeon/cvmx-helper-spi.h +f:arch/mips/include/asm/octeon/cvmx-helper-util.h +f:arch/mips/include/asm/octeon/cvmx-helper-xaui.h +f:arch/mips/include/asm/octeon/cvmx-helper.h +f:arch/mips/include/asm/octeon/cvmx-iob-defs.h +f:arch/mips/include/asm/octeon/cvmx-ipd-defs.h +f:arch/mips/include/asm/octeon/cvmx-ipd.h +f:arch/mips/include/asm/octeon/cvmx-l2c-defs.h +f:arch/mips/include/asm/octeon/cvmx-l2c.h +f:arch/mips/include/asm/octeon/cvmx-l2d-defs.h +f:arch/mips/include/asm/octeon/cvmx-l2t-defs.h +f:arch/mips/include/asm/octeon/cvmx-led-defs.h +f:arch/mips/include/asm/octeon/cvmx-lmcx-defs.h +f:arch/mips/include/asm/octeon/cvmx-mio-defs.h +f:arch/mips/include/asm/octeon/cvmx-mixx-defs.h +f:arch/mips/include/asm/octeon/cvmx-npei-defs.h +f:arch/mips/include/asm/octeon/cvmx-npi-defs.h +f:arch/mips/include/asm/octeon/cvmx-packet.h +f:arch/mips/include/asm/octeon/cvmx-pci-defs.h +f:arch/mips/include/asm/octeon/cvmx-pciercx-defs.h +f:arch/mips/include/asm/octeon/cvmx-pcsx-defs.h +f:arch/mips/include/asm/octeon/cvmx-pcsxx-defs.h +f:arch/mips/include/asm/octeon/cvmx-pemx-defs.h +f:arch/mips/include/asm/octeon/cvmx-pescx-defs.h +f:arch/mips/include/asm/octeon/cvmx-pexp-defs.h +f:arch/mips/include/asm/octeon/cvmx-pip-defs.h +f:arch/mips/include/asm/octeon/cvmx-pip.h +f:arch/mips/include/asm/octeon/cvmx-pko-defs.h +f:arch/mips/include/asm/octeon/cvmx-pko.h +f:arch/mips/include/asm/octeon/cvmx-pow-defs.h +f:arch/mips/include/asm/octeon/cvmx-pow.h +f:arch/mips/include/asm/octeon/cvmx-rnm-defs.h +f:arch/mips/include/asm/octeon/cvmx-rst-defs.h +f:arch/mips/include/asm/octeon/cvmx-scratch.h +f:arch/mips/include/asm/octeon/cvmx-sli-defs.h +f:arch/mips/include/asm/octeon/cvmx-spi.h +f:arch/mips/include/asm/octeon/cvmx-spinlock.h +f:arch/mips/include/asm/octeon/cvmx-spxx-defs.h +f:arch/mips/include/asm/octeon/cvmx-sriox-defs.h +f:arch/mips/include/asm/octeon/cvmx-srxx-defs.h +f:arch/mips/include/asm/octeon/cvmx-stxx-defs.h +f:arch/mips/include/asm/octeon/cvmx-sysinfo.h +f:arch/mips/include/asm/octeon/cvmx-uctlx-defs.h +f:arch/mips/include/asm/octeon/cvmx-wqe.h +f:arch/mips/include/asm/octeon/cvmx.h +f:arch/mips/include/asm/octeon/octeon-feature.h +f:arch/mips/include/asm/octeon/octeon-model.h +f:arch/mips/include/asm/octeon/octeon.h +f:arch/mips/include/asm/octeon/pci-octeon.h +f:arch/mips/include/asm/paccess.h +f:arch/mips/include/asm/page.h +f:arch/mips/include/asm/pci.h +f:arch/mips/include/asm/pci/bridge.h +f:arch/mips/include/asm/perf_event.h +f:arch/mips/include/asm/pgalloc.h +f:arch/mips/include/asm/pgtable-32.h +f:arch/mips/include/asm/pgtable-64.h +f:arch/mips/include/asm/pgtable-bits.h +f:arch/mips/include/asm/pgtable.h +f:arch/mips/include/asm/pm-cps.h +f:arch/mips/include/asm/pm.h +f:arch/mips/include/asm/prefetch.h +f:arch/mips/include/asm/processor.h +f:arch/mips/include/asm/prom.h +f:arch/mips/include/asm/ptrace.h +f:arch/mips/include/asm/r4k-timer.h +f:arch/mips/include/asm/r4kcache.h +f:arch/mips/include/asm/reboot.h +f:arch/mips/include/asm/reg.h +f:arch/mips/include/asm/regdef.h +f:arch/mips/include/asm/rtlx.h +f:arch/mips/include/asm/seccomp.h +f:arch/mips/include/asm/setup.h +f:arch/mips/include/asm/sgi/gio.h +f:arch/mips/include/asm/sgi/heart.h +f:arch/mips/include/asm/sgi/hpc3.h +f:arch/mips/include/asm/sgi/ioc.h +f:arch/mips/include/asm/sgi/ip22.h +f:arch/mips/include/asm/sgi/mc.h +f:arch/mips/include/asm/sgi/pi1.h +f:arch/mips/include/asm/sgi/seeq.h +f:arch/mips/include/asm/sgi/wd.h +f:arch/mips/include/asm/sgialib.h +f:arch/mips/include/asm/sgiarcs.h +f:arch/mips/include/asm/shmparam.h +f:arch/mips/include/asm/sibyte/bcm1480_int.h +f:arch/mips/include/asm/sibyte/bcm1480_l2c.h +f:arch/mips/include/asm/sibyte/bcm1480_mc.h +f:arch/mips/include/asm/sibyte/bcm1480_regs.h +f:arch/mips/include/asm/sibyte/bcm1480_scd.h +f:arch/mips/include/asm/sibyte/bigsur.h +f:arch/mips/include/asm/sibyte/board.h +f:arch/mips/include/asm/sibyte/sb1250.h +f:arch/mips/include/asm/sibyte/sb1250_defs.h +f:arch/mips/include/asm/sibyte/sb1250_dma.h +f:arch/mips/include/asm/sibyte/sb1250_genbus.h +f:arch/mips/include/asm/sibyte/sb1250_int.h +f:arch/mips/include/asm/sibyte/sb1250_l2c.h +f:arch/mips/include/asm/sibyte/sb1250_ldt.h +f:arch/mips/include/asm/sibyte/sb1250_mac.h +f:arch/mips/include/asm/sibyte/sb1250_mc.h +f:arch/mips/include/asm/sibyte/sb1250_regs.h +f:arch/mips/include/asm/sibyte/sb1250_scd.h +f:arch/mips/include/asm/sibyte/sb1250_smbus.h +f:arch/mips/include/asm/sibyte/sb1250_syncser.h +f:arch/mips/include/asm/sibyte/sb1250_uart.h +f:arch/mips/include/asm/sibyte/sentosa.h +f:arch/mips/include/asm/sibyte/swarm.h +f:arch/mips/include/asm/sigcontext.h +f:arch/mips/include/asm/signal.h +f:arch/mips/include/asm/sim.h +f:arch/mips/include/asm/smp-cps.h +f:arch/mips/include/asm/smp-ops.h +f:arch/mips/include/asm/smp.h +f:arch/mips/include/asm/sn/addrs.h +f:arch/mips/include/asm/sn/agent.h +f:arch/mips/include/asm/sn/arch.h +f:arch/mips/include/asm/sn/fru.h +f:arch/mips/include/asm/sn/gda.h +f:arch/mips/include/asm/sn/intr.h +f:arch/mips/include/asm/sn/io.h +f:arch/mips/include/asm/sn/ioc3.h +f:arch/mips/include/asm/sn/irq_alloc.h +f:arch/mips/include/asm/sn/klconfig.h +f:arch/mips/include/asm/sn/kldir.h +f:arch/mips/include/asm/sn/klkernvars.h +f:arch/mips/include/asm/sn/launch.h +f:arch/mips/include/asm/sn/mapped_kernel.h +f:arch/mips/include/asm/sn/nmi.h +f:arch/mips/include/asm/sn/sn0/addrs.h +f:arch/mips/include/asm/sn/sn0/arch.h +f:arch/mips/include/asm/sn/sn0/hub.h +f:arch/mips/include/asm/sn/sn0/hubio.h +f:arch/mips/include/asm/sn/sn0/hubmd.h +f:arch/mips/include/asm/sn/sn0/hubni.h +f:arch/mips/include/asm/sn/sn0/hubpi.h +f:arch/mips/include/asm/sn/sn0/kldir.h +f:arch/mips/include/asm/sn/types.h +f:arch/mips/include/asm/sni.h +f:arch/mips/include/asm/socket.h +f:arch/mips/include/asm/sparsemem.h +f:arch/mips/include/asm/spinlock.h +f:arch/mips/include/asm/spinlock_types.h +f:arch/mips/include/asm/spram.h +f:arch/mips/include/asm/stackframe.h +f:arch/mips/include/asm/stackprotector.h +f:arch/mips/include/asm/stacktrace.h +f:arch/mips/include/asm/string.h +f:arch/mips/include/asm/switch_to.h +f:arch/mips/include/asm/sync.h +f:arch/mips/include/asm/syscall.h +f:arch/mips/include/asm/syscalls.h +f:arch/mips/include/asm/thread_info.h +f:arch/mips/include/asm/time.h +f:arch/mips/include/asm/timex.h +f:arch/mips/include/asm/tlb.h +f:arch/mips/include/asm/tlbdebug.h +f:arch/mips/include/asm/tlbex.h +f:arch/mips/include/asm/tlbflush.h +f:arch/mips/include/asm/tlbmisc.h +f:arch/mips/include/asm/topology.h +f:arch/mips/include/asm/traps.h +f:arch/mips/include/asm/txx9/boards.h +f:arch/mips/include/asm/txx9/dmac.h +f:arch/mips/include/asm/txx9/generic.h +f:arch/mips/include/asm/txx9/pci.h +f:arch/mips/include/asm/txx9/rbtx4927.h +f:arch/mips/include/asm/txx9/smsc_fdc37m81x.h +f:arch/mips/include/asm/txx9/tx4927.h +f:arch/mips/include/asm/txx9/tx4927pcic.h +f:arch/mips/include/asm/txx9/tx4938.h +f:arch/mips/include/asm/txx9irq.h +f:arch/mips/include/asm/txx9pio.h +f:arch/mips/include/asm/txx9tmr.h +f:arch/mips/include/asm/types.h +f:arch/mips/include/asm/uaccess.h +f:arch/mips/include/asm/uasm.h +f:arch/mips/include/asm/unaligned-emul.h +f:arch/mips/include/asm/unistd.h +f:arch/mips/include/asm/unroll.h +f:arch/mips/include/asm/uprobes.h +f:arch/mips/include/asm/vdso.h +f:arch/mips/include/asm/vdso/clocksource.h +f:arch/mips/include/asm/vdso/gettimeofday.h +f:arch/mips/include/asm/vdso/processor.h +f:arch/mips/include/asm/vdso/vdso.h +f:arch/mips/include/asm/vdso/vsyscall.h +f:arch/mips/include/asm/vermagic.h +f:arch/mips/include/asm/vga.h +f:arch/mips/include/asm/video.h +f:arch/mips/include/asm/vmalloc.h +f:arch/mips/include/asm/vpe.h +f:arch/mips/include/asm/watch.h +f:arch/mips/include/asm/wbflush.h +f:arch/mips/include/asm/xtalk/xtalk.h +f:arch/mips/include/asm/xtalk/xwidget.h +f:arch/mips/include/asm/yamon-dt.h +f:arch/mips/include/uapi/asm/Kbuild +f:arch/mips/include/uapi/asm/auxvec.h +f:arch/mips/include/uapi/asm/bitfield.h +f:arch/mips/include/uapi/asm/bitsperlong.h +f:arch/mips/include/uapi/asm/break.h +f:arch/mips/include/uapi/asm/byteorder.h +f:arch/mips/include/uapi/asm/cachectl.h +f:arch/mips/include/uapi/asm/errno.h +f:arch/mips/include/uapi/asm/fcntl.h +f:arch/mips/include/uapi/asm/hwcap.h +f:arch/mips/include/uapi/asm/inst.h +f:arch/mips/include/uapi/asm/ioctl.h +f:arch/mips/include/uapi/asm/ioctls.h +f:arch/mips/include/uapi/asm/kvm.h +f:arch/mips/include/uapi/asm/mman.h +f:arch/mips/include/uapi/asm/msgbuf.h +f:arch/mips/include/uapi/asm/param.h +f:arch/mips/include/uapi/asm/perf_regs.h +f:arch/mips/include/uapi/asm/poll.h +f:arch/mips/include/uapi/asm/posix_types.h +f:arch/mips/include/uapi/asm/ptrace.h +f:arch/mips/include/uapi/asm/reg.h +f:arch/mips/include/uapi/asm/resource.h +f:arch/mips/include/uapi/asm/sembuf.h +f:arch/mips/include/uapi/asm/setup.h +f:arch/mips/include/uapi/asm/sgidefs.h +f:arch/mips/include/uapi/asm/shmbuf.h +f:arch/mips/include/uapi/asm/sigcontext.h +f:arch/mips/include/uapi/asm/siginfo.h +f:arch/mips/include/uapi/asm/signal.h +f:arch/mips/include/uapi/asm/socket.h +f:arch/mips/include/uapi/asm/sockios.h +f:arch/mips/include/uapi/asm/stat.h +f:arch/mips/include/uapi/asm/statfs.h +f:arch/mips/include/uapi/asm/swab.h +f:arch/mips/include/uapi/asm/sysmips.h +f:arch/mips/include/uapi/asm/termbits.h +f:arch/mips/include/uapi/asm/termios.h +f:arch/mips/include/uapi/asm/types.h +f:arch/mips/include/uapi/asm/ucontext.h +f:arch/mips/include/uapi/asm/unistd.h +f:arch/mips/ingenic/Kconfig +f:arch/mips/jazz/Kconfig +f:arch/mips/jazz/Makefile +f:arch/mips/jazz/Platform +f:arch/mips/jazz/irq.c +f:arch/mips/jazz/jazzdma.c +f:arch/mips/jazz/reset.c +f:arch/mips/jazz/setup.c +f:arch/mips/kernel/.gitignore +f:arch/mips/kernel/Makefile +f:arch/mips/kernel/access-helper.h +f:arch/mips/kernel/asm-offsets.c +f:arch/mips/kernel/bmips_5xxx_init.S +f:arch/mips/kernel/bmips_vec.S +f:arch/mips/kernel/branch.c +f:arch/mips/kernel/cacheinfo.c +f:arch/mips/kernel/cevt-bcm1480.c +f:arch/mips/kernel/cevt-ds1287.c +f:arch/mips/kernel/cevt-gt641xx.c +f:arch/mips/kernel/cevt-r4k.c +f:arch/mips/kernel/cevt-sb1250.c +f:arch/mips/kernel/cevt-txx9.c +f:arch/mips/kernel/cmpxchg.c +f:arch/mips/kernel/cps-vec-ns16550.S +f:arch/mips/kernel/cps-vec.S +f:arch/mips/kernel/cpu-probe.c +f:arch/mips/kernel/cpu-r3k-probe.c +f:arch/mips/kernel/crash.c +f:arch/mips/kernel/crash_dump.c +f:arch/mips/kernel/csrc-bcm1480.c +f:arch/mips/kernel/csrc-ioasic.c +f:arch/mips/kernel/csrc-r4k.c +f:arch/mips/kernel/csrc-sb1250.c +f:arch/mips/kernel/early_printk.c +f:arch/mips/kernel/early_printk_8250.c +f:arch/mips/kernel/elf.c +f:arch/mips/kernel/entry.S +f:arch/mips/kernel/fpu-probe.c +f:arch/mips/kernel/fpu-probe.h +f:arch/mips/kernel/ftrace.c +f:arch/mips/kernel/genex.S +f:arch/mips/kernel/gpio_txx9.c +f:arch/mips/kernel/head.S +f:arch/mips/kernel/i8253.c +f:arch/mips/kernel/idle.c +f:arch/mips/kernel/irq-gt641xx.c +f:arch/mips/kernel/irq-msc01.c +f:arch/mips/kernel/irq.c +f:arch/mips/kernel/irq_txx9.c +f:arch/mips/kernel/jump_label.c +f:arch/mips/kernel/kgdb.c +f:arch/mips/kernel/kprobes.c +f:arch/mips/kernel/linux32.c +f:arch/mips/kernel/machine_kexec.c +f:arch/mips/kernel/mcount.S +f:arch/mips/kernel/mips-cm.c +f:arch/mips/kernel/mips-cpc.c +f:arch/mips/kernel/mips-mt-fpaff.c +f:arch/mips/kernel/mips-mt.c +f:arch/mips/kernel/mips-r2-to-r6-emul.c +f:arch/mips/kernel/module.c +f:arch/mips/kernel/octeon_switch.S +f:arch/mips/kernel/perf_event.c +f:arch/mips/kernel/perf_event_mipsxx.c +f:arch/mips/kernel/perf_regs.c +f:arch/mips/kernel/pm-cps.c +f:arch/mips/kernel/pm.c +f:arch/mips/kernel/probes-common.h +f:arch/mips/kernel/proc.c +f:arch/mips/kernel/process.c +f:arch/mips/kernel/prom.c +f:arch/mips/kernel/ptrace.c +f:arch/mips/kernel/ptrace32.c +f:arch/mips/kernel/r2300_fpu.S +f:arch/mips/kernel/r2300_switch.S +f:arch/mips/kernel/r4k-bugs64.c +f:arch/mips/kernel/r4k_fpu.S +f:arch/mips/kernel/r4k_switch.S +f:arch/mips/kernel/relocate.c +f:arch/mips/kernel/relocate_kernel.S +f:arch/mips/kernel/reset.c +f:arch/mips/kernel/rtlx-mt.c +f:arch/mips/kernel/rtlx.c +f:arch/mips/kernel/scall32-o32.S +f:arch/mips/kernel/scall64-n32.S +f:arch/mips/kernel/scall64-n64.S +f:arch/mips/kernel/scall64-o32.S +f:arch/mips/kernel/segment.c +f:arch/mips/kernel/setup.c +f:arch/mips/kernel/signal-common.h +f:arch/mips/kernel/signal.c +f:arch/mips/kernel/signal32.c +f:arch/mips/kernel/signal_n32.c +f:arch/mips/kernel/signal_o32.c +f:arch/mips/kernel/smp-bmips.c +f:arch/mips/kernel/smp-cps.c +f:arch/mips/kernel/smp-mt.c +f:arch/mips/kernel/smp-up.c +f:arch/mips/kernel/smp.c +f:arch/mips/kernel/spinlock_test.c +f:arch/mips/kernel/spram.c +f:arch/mips/kernel/stacktrace.c +f:arch/mips/kernel/sync-r4k.c +f:arch/mips/kernel/syscall.c +f:arch/mips/kernel/syscalls/Makefile +f:arch/mips/kernel/syscalls/syscall_n32.tbl +f:arch/mips/kernel/syscalls/syscall_n64.tbl +f:arch/mips/kernel/syscalls/syscall_o32.tbl +f:arch/mips/kernel/syscalls/syscallnr.sh +f:arch/mips/kernel/sysrq.c +f:arch/mips/kernel/time.c +f:arch/mips/kernel/topology.c +f:arch/mips/kernel/traps.c +f:arch/mips/kernel/unaligned.c +f:arch/mips/kernel/uprobes.c +f:arch/mips/kernel/vdso.c +f:arch/mips/kernel/vmlinux.lds.S +f:arch/mips/kernel/vpe-mt.c +f:arch/mips/kernel/vpe.c +f:arch/mips/kernel/watch.c +f:arch/mips/kvm/Kconfig +f:arch/mips/kvm/Makefile +f:arch/mips/kvm/emulate.c +f:arch/mips/kvm/entry.c +f:arch/mips/kvm/fpu.S +f:arch/mips/kvm/hypcall.c +f:arch/mips/kvm/interrupt.c +f:arch/mips/kvm/interrupt.h +f:arch/mips/kvm/loongson_ipi.c +f:arch/mips/kvm/mips.c +f:arch/mips/kvm/mmu.c +f:arch/mips/kvm/msa.S +f:arch/mips/kvm/stats.c +f:arch/mips/kvm/tlb.c +f:arch/mips/kvm/trace.h +f:arch/mips/kvm/vz.c +f:arch/mips/lantiq/Kconfig +f:arch/mips/lantiq/Makefile +f:arch/mips/lantiq/Platform +f:arch/mips/lantiq/clk.c +f:arch/mips/lantiq/clk.h +f:arch/mips/lantiq/early_printk.c +f:arch/mips/lantiq/falcon/Makefile +f:arch/mips/lantiq/falcon/prom.c +f:arch/mips/lantiq/falcon/reset.c +f:arch/mips/lantiq/falcon/sysctrl.c +f:arch/mips/lantiq/irq.c +f:arch/mips/lantiq/prom.c +f:arch/mips/lantiq/prom.h +f:arch/mips/lantiq/xway/Makefile +f:arch/mips/lantiq/xway/clk.c +f:arch/mips/lantiq/xway/dcdc.c +f:arch/mips/lantiq/xway/dma.c +f:arch/mips/lantiq/xway/gptu.c +f:arch/mips/lantiq/xway/prom.c +f:arch/mips/lantiq/xway/sysctrl.c +f:arch/mips/lantiq/xway/vmmc.c +f:arch/mips/lib/.gitignore +f:arch/mips/lib/Makefile +f:arch/mips/lib/bitops.c +f:arch/mips/lib/bswapdi.c +f:arch/mips/lib/bswapsi.c +f:arch/mips/lib/csum_partial.S +f:arch/mips/lib/delay.c +f:arch/mips/lib/dump_tlb.c +f:arch/mips/lib/iomap-pci.c +f:arch/mips/lib/iomap_copy.c +f:arch/mips/lib/libgcc.h +f:arch/mips/lib/memcpy.S +f:arch/mips/lib/memset.S +f:arch/mips/lib/mips-atomic.c +f:arch/mips/lib/multi3.c +f:arch/mips/lib/r3k_dump_tlb.c +f:arch/mips/lib/strncpy_user.S +f:arch/mips/lib/strnlen_user.S +f:arch/mips/lib/uncached.c +f:arch/mips/loongson2ef/Kconfig +f:arch/mips/loongson2ef/Makefile +f:arch/mips/loongson2ef/Platform +f:arch/mips/loongson2ef/common/Makefile +f:arch/mips/loongson2ef/common/bonito-irq.c +f:arch/mips/loongson2ef/common/cs5536/Makefile +f:arch/mips/loongson2ef/common/cs5536/cs5536_acc.c +f:arch/mips/loongson2ef/common/cs5536/cs5536_ehci.c +f:arch/mips/loongson2ef/common/cs5536/cs5536_ide.c +f:arch/mips/loongson2ef/common/cs5536/cs5536_isa.c +f:arch/mips/loongson2ef/common/cs5536/cs5536_mfgpt.c +f:arch/mips/loongson2ef/common/cs5536/cs5536_ohci.c +f:arch/mips/loongson2ef/common/cs5536/cs5536_pci.c +f:arch/mips/loongson2ef/common/env.c +f:arch/mips/loongson2ef/common/init.c +f:arch/mips/loongson2ef/common/irq.c +f:arch/mips/loongson2ef/common/machtype.c +f:arch/mips/loongson2ef/common/mem.c +f:arch/mips/loongson2ef/common/pci.c +f:arch/mips/loongson2ef/common/platform.c +f:arch/mips/loongson2ef/common/pm.c +f:arch/mips/loongson2ef/common/reset.c +f:arch/mips/loongson2ef/common/rtc.c +f:arch/mips/loongson2ef/common/serial.c +f:arch/mips/loongson2ef/common/setup.c +f:arch/mips/loongson2ef/common/time.c +f:arch/mips/loongson2ef/common/uart_base.c +f:arch/mips/loongson2ef/fuloong-2e/Makefile +f:arch/mips/loongson2ef/fuloong-2e/dma.c +f:arch/mips/loongson2ef/fuloong-2e/irq.c +f:arch/mips/loongson2ef/fuloong-2e/reset.c +f:arch/mips/loongson2ef/lemote-2f/Makefile +f:arch/mips/loongson2ef/lemote-2f/clock.c +f:arch/mips/loongson2ef/lemote-2f/dma.c +f:arch/mips/loongson2ef/lemote-2f/ec_kb3310b.c +f:arch/mips/loongson2ef/lemote-2f/ec_kb3310b.h +f:arch/mips/loongson2ef/lemote-2f/irq.c +f:arch/mips/loongson2ef/lemote-2f/machtype.c +f:arch/mips/loongson2ef/lemote-2f/pm.c +f:arch/mips/loongson2ef/lemote-2f/reset.c +f:arch/mips/loongson32/Kconfig +f:arch/mips/loongson32/Makefile +f:arch/mips/loongson32/Platform +f:arch/mips/loongson32/common/Makefile +f:arch/mips/loongson32/common/irq.c +f:arch/mips/loongson32/common/platform.c +f:arch/mips/loongson32/common/prom.c +f:arch/mips/loongson32/common/setup.c +f:arch/mips/loongson32/common/time.c +f:arch/mips/loongson32/ls1b/Makefile +f:arch/mips/loongson32/ls1b/board.c +f:arch/mips/loongson32/ls1c/Makefile +f:arch/mips/loongson32/ls1c/board.c +f:arch/mips/loongson64/Kconfig +f:arch/mips/loongson64/Makefile +f:arch/mips/loongson64/Platform +f:arch/mips/loongson64/boardinfo.c +f:arch/mips/loongson64/cop2-ex.c +f:arch/mips/loongson64/cpucfg-emul.c +f:arch/mips/loongson64/dma.c +f:arch/mips/loongson64/env.c +f:arch/mips/loongson64/hpet.c +f:arch/mips/loongson64/init.c +f:arch/mips/loongson64/numa.c +f:arch/mips/loongson64/pm.c +f:arch/mips/loongson64/reset.c +f:arch/mips/loongson64/setup.c +f:arch/mips/loongson64/sleeper.S +f:arch/mips/loongson64/smp.c +f:arch/mips/loongson64/smp.h +f:arch/mips/loongson64/time.c +f:arch/mips/loongson64/vbios_quirk.c +f:arch/mips/math-emu/Makefile +f:arch/mips/math-emu/cp1emu.c +f:arch/mips/math-emu/dp_2008class.c +f:arch/mips/math-emu/dp_add.c +f:arch/mips/math-emu/dp_cmp.c +f:arch/mips/math-emu/dp_div.c +f:arch/mips/math-emu/dp_fint.c +f:arch/mips/math-emu/dp_flong.c +f:arch/mips/math-emu/dp_fmax.c +f:arch/mips/math-emu/dp_fmin.c +f:arch/mips/math-emu/dp_fsp.c +f:arch/mips/math-emu/dp_maddf.c +f:arch/mips/math-emu/dp_mul.c +f:arch/mips/math-emu/dp_rint.c +f:arch/mips/math-emu/dp_simple.c +f:arch/mips/math-emu/dp_sqrt.c +f:arch/mips/math-emu/dp_sub.c +f:arch/mips/math-emu/dp_tint.c +f:arch/mips/math-emu/dp_tlong.c +f:arch/mips/math-emu/dsemul.c +f:arch/mips/math-emu/ieee754.c +f:arch/mips/math-emu/ieee754.h +f:arch/mips/math-emu/ieee754d.c +f:arch/mips/math-emu/ieee754dp.c +f:arch/mips/math-emu/ieee754dp.h +f:arch/mips/math-emu/ieee754int.h +f:arch/mips/math-emu/ieee754sp.c +f:arch/mips/math-emu/ieee754sp.h +f:arch/mips/math-emu/me-debugfs.c +f:arch/mips/math-emu/sp_2008class.c +f:arch/mips/math-emu/sp_add.c +f:arch/mips/math-emu/sp_cmp.c +f:arch/mips/math-emu/sp_div.c +f:arch/mips/math-emu/sp_fdp.c +f:arch/mips/math-emu/sp_fint.c +f:arch/mips/math-emu/sp_flong.c +f:arch/mips/math-emu/sp_fmax.c +f:arch/mips/math-emu/sp_fmin.c +f:arch/mips/math-emu/sp_maddf.c +f:arch/mips/math-emu/sp_mul.c +f:arch/mips/math-emu/sp_rint.c +f:arch/mips/math-emu/sp_simple.c +f:arch/mips/math-emu/sp_sqrt.c +f:arch/mips/math-emu/sp_sub.c +f:arch/mips/math-emu/sp_tint.c +f:arch/mips/math-emu/sp_tlong.c +f:arch/mips/mm/Makefile +f:arch/mips/mm/c-octeon.c +f:arch/mips/mm/c-r3k.c +f:arch/mips/mm/c-r4k.c +f:arch/mips/mm/cache.c +f:arch/mips/mm/cerr-sb1.c +f:arch/mips/mm/cex-gen.S +f:arch/mips/mm/cex-oct.S +f:arch/mips/mm/cex-sb1.S +f:arch/mips/mm/context.c +f:arch/mips/mm/dma-noncoherent.c +f:arch/mips/mm/extable.c +f:arch/mips/mm/fault.c +f:arch/mips/mm/highmem.c +f:arch/mips/mm/hugetlbpage.c +f:arch/mips/mm/init.c +f:arch/mips/mm/ioremap.c +f:arch/mips/mm/ioremap64.c +f:arch/mips/mm/maccess.c +f:arch/mips/mm/mmap.c +f:arch/mips/mm/page-funcs.S +f:arch/mips/mm/page.c +f:arch/mips/mm/pgtable-32.c +f:arch/mips/mm/pgtable-64.c +f:arch/mips/mm/pgtable.c +f:arch/mips/mm/physaddr.c +f:arch/mips/mm/sc-debugfs.c +f:arch/mips/mm/sc-ip22.c +f:arch/mips/mm/sc-mips.c +f:arch/mips/mm/sc-r5k.c +f:arch/mips/mm/sc-rm7k.c +f:arch/mips/mm/tlb-funcs.S +f:arch/mips/mm/tlb-r3k.c +f:arch/mips/mm/tlb-r4k.c +f:arch/mips/mm/tlbex-fault.S +f:arch/mips/mm/tlbex.c +f:arch/mips/mm/uasm-micromips.c +f:arch/mips/mm/uasm-mips.c +f:arch/mips/mm/uasm.c +f:arch/mips/mobileye/Kconfig +f:arch/mips/mobileye/Makefile +f:arch/mips/mobileye/Platform +f:arch/mips/mobileye/board-epm5.its.S +f:arch/mips/mobileye/vmlinux.its.S +f:arch/mips/mti-malta/Makefile +f:arch/mips/mti-malta/Platform +f:arch/mips/mti-malta/malta-dtshim.c +f:arch/mips/mti-malta/malta-init.c +f:arch/mips/mti-malta/malta-int.c +f:arch/mips/mti-malta/malta-memory.c +f:arch/mips/mti-malta/malta-platform.c +f:arch/mips/mti-malta/malta-setup.c +f:arch/mips/mti-malta/malta-time.c +f:arch/mips/n64/Makefile +f:arch/mips/n64/Platform +f:arch/mips/n64/init.c +f:arch/mips/n64/irq.c +f:arch/mips/net/Makefile +f:arch/mips/net/bpf_jit_comp.c +f:arch/mips/net/bpf_jit_comp.h +f:arch/mips/net/bpf_jit_comp32.c +f:arch/mips/net/bpf_jit_comp64.c +f:arch/mips/pci/Makefile +f:arch/mips/pci/fixup-ath79.c +f:arch/mips/pci/fixup-bcm63xx.c +f:arch/mips/pci/fixup-cobalt.c +f:arch/mips/pci/fixup-fuloong2e.c +f:arch/mips/pci/fixup-ip32.c +f:arch/mips/pci/fixup-lantiq.c +f:arch/mips/pci/fixup-lemote2f.c +f:arch/mips/pci/fixup-malta.c +f:arch/mips/pci/fixup-rbtx4927.c +f:arch/mips/pci/fixup-rc32434.c +f:arch/mips/pci/fixup-sb1250.c +f:arch/mips/pci/fixup-sni.c +f:arch/mips/pci/msi-octeon.c +f:arch/mips/pci/ops-bcm63xx.c +f:arch/mips/pci/ops-bonito64.c +f:arch/mips/pci/ops-gt64xxx_pci0.c +f:arch/mips/pci/ops-lantiq.c +f:arch/mips/pci/ops-loongson2.c +f:arch/mips/pci/ops-mace.c +f:arch/mips/pci/ops-msc.c +f:arch/mips/pci/ops-rc32434.c +f:arch/mips/pci/ops-sni.c +f:arch/mips/pci/ops-tx4927.c +f:arch/mips/pci/pci-alchemy.c +f:arch/mips/pci/pci-ar2315.c +f:arch/mips/pci/pci-ar71xx.c +f:arch/mips/pci/pci-ar724x.c +f:arch/mips/pci/pci-bcm1480.c +f:arch/mips/pci/pci-bcm1480ht.c +f:arch/mips/pci/pci-bcm47xx.c +f:arch/mips/pci/pci-bcm63xx.c +f:arch/mips/pci/pci-bcm63xx.h +f:arch/mips/pci/pci-generic.c +f:arch/mips/pci/pci-ip27.c +f:arch/mips/pci/pci-ip32.c +f:arch/mips/pci/pci-lantiq.c +f:arch/mips/pci/pci-lantiq.h +f:arch/mips/pci/pci-legacy.c +f:arch/mips/pci/pci-malta.c +f:arch/mips/pci/pci-mt7620.c +f:arch/mips/pci/pci-octeon.c +f:arch/mips/pci/pci-rc32434.c +f:arch/mips/pci/pci-rt2880.c +f:arch/mips/pci/pci-rt3883.c +f:arch/mips/pci/pci-sb1250.c +f:arch/mips/pci/pci-tx4927.c +f:arch/mips/pci/pci-tx4938.c +f:arch/mips/pci/pci-xtalk-bridge.c +f:arch/mips/pci/pci.c +f:arch/mips/pci/pcie-octeon.c +f:arch/mips/pic32/Kconfig +f:arch/mips/pic32/Makefile +f:arch/mips/pic32/Platform +f:arch/mips/pic32/common/Makefile +f:arch/mips/pic32/common/irq.c +f:arch/mips/pic32/common/reset.c +f:arch/mips/pic32/pic32mzda/Makefile +f:arch/mips/pic32/pic32mzda/config.c +f:arch/mips/pic32/pic32mzda/early_clk.c +f:arch/mips/pic32/pic32mzda/early_console.c +f:arch/mips/pic32/pic32mzda/early_pin.c +f:arch/mips/pic32/pic32mzda/early_pin.h +f:arch/mips/pic32/pic32mzda/init.c +f:arch/mips/pic32/pic32mzda/pic32mzda.h +f:arch/mips/pic32/pic32mzda/time.c +f:arch/mips/power/Makefile +f:arch/mips/power/cpu.c +f:arch/mips/power/hibernate.c +f:arch/mips/power/hibernate_asm.S +f:arch/mips/ralink/Kconfig +f:arch/mips/ralink/Makefile +f:arch/mips/ralink/Platform +f:arch/mips/ralink/bootrom.c +f:arch/mips/ralink/clk.c +f:arch/mips/ralink/common.h +f:arch/mips/ralink/early_printk.c +f:arch/mips/ralink/ill_acc.c +f:arch/mips/ralink/irq-gic.c +f:arch/mips/ralink/irq.c +f:arch/mips/ralink/mt7620.c +f:arch/mips/ralink/mt7621.c +f:arch/mips/ralink/of.c +f:arch/mips/ralink/prom.c +f:arch/mips/ralink/reset.c +f:arch/mips/ralink/rt288x.c +f:arch/mips/ralink/rt305x.c +f:arch/mips/ralink/rt3883.c +f:arch/mips/ralink/timer-gic.c +f:arch/mips/ralink/timer.c +f:arch/mips/rb532/Makefile +f:arch/mips/rb532/Platform +f:arch/mips/rb532/devices.c +f:arch/mips/rb532/gpio.c +f:arch/mips/rb532/irq.c +f:arch/mips/rb532/prom.c +f:arch/mips/rb532/serial.c +f:arch/mips/rb532/setup.c +f:arch/mips/rb532/time.c +f:arch/mips/sgi-ip22/Makefile +f:arch/mips/sgi-ip22/Platform +f:arch/mips/sgi-ip22/ip22-berr.c +f:arch/mips/sgi-ip22/ip22-eisa.c +f:arch/mips/sgi-ip22/ip22-gio.c +f:arch/mips/sgi-ip22/ip22-hpc.c +f:arch/mips/sgi-ip22/ip22-int.c +f:arch/mips/sgi-ip22/ip22-mc.c +f:arch/mips/sgi-ip22/ip22-nvram.c +f:arch/mips/sgi-ip22/ip22-platform.c +f:arch/mips/sgi-ip22/ip22-reset.c +f:arch/mips/sgi-ip22/ip22-setup.c +f:arch/mips/sgi-ip22/ip22-time.c +f:arch/mips/sgi-ip22/ip28-berr.c +f:arch/mips/sgi-ip27/Kconfig +f:arch/mips/sgi-ip27/Makefile +f:arch/mips/sgi-ip27/Platform +f:arch/mips/sgi-ip27/ip27-berr.c +f:arch/mips/sgi-ip27/ip27-common.h +f:arch/mips/sgi-ip27/ip27-console.c +f:arch/mips/sgi-ip27/ip27-init.c +f:arch/mips/sgi-ip27/ip27-irq.c +f:arch/mips/sgi-ip27/ip27-klconfig.c +f:arch/mips/sgi-ip27/ip27-klnuma.c +f:arch/mips/sgi-ip27/ip27-memory.c +f:arch/mips/sgi-ip27/ip27-nmi.c +f:arch/mips/sgi-ip27/ip27-reset.c +f:arch/mips/sgi-ip27/ip27-smp.c +f:arch/mips/sgi-ip27/ip27-timer.c +f:arch/mips/sgi-ip27/ip27-xtalk.c +f:arch/mips/sgi-ip30/Makefile +f:arch/mips/sgi-ip30/Platform +f:arch/mips/sgi-ip30/ip30-common.h +f:arch/mips/sgi-ip30/ip30-console.c +f:arch/mips/sgi-ip30/ip30-irq.c +f:arch/mips/sgi-ip30/ip30-power.c +f:arch/mips/sgi-ip30/ip30-setup.c +f:arch/mips/sgi-ip30/ip30-smp.c +f:arch/mips/sgi-ip30/ip30-timer.c +f:arch/mips/sgi-ip30/ip30-xtalk.c +f:arch/mips/sgi-ip32/Makefile +f:arch/mips/sgi-ip32/Platform +f:arch/mips/sgi-ip32/crime.c +f:arch/mips/sgi-ip32/ip32-berr.c +f:arch/mips/sgi-ip32/ip32-common.h +f:arch/mips/sgi-ip32/ip32-dma.c +f:arch/mips/sgi-ip32/ip32-irq.c +f:arch/mips/sgi-ip32/ip32-memory.c +f:arch/mips/sgi-ip32/ip32-platform.c +f:arch/mips/sgi-ip32/ip32-reset.c +f:arch/mips/sgi-ip32/ip32-setup.c +f:arch/mips/sibyte/Kconfig +f:arch/mips/sibyte/Makefile +f:arch/mips/sibyte/Platform +f:arch/mips/sibyte/bcm1480/Makefile +f:arch/mips/sibyte/bcm1480/irq.c +f:arch/mips/sibyte/bcm1480/setup.c +f:arch/mips/sibyte/bcm1480/smp.c +f:arch/mips/sibyte/bcm1480/time.c +f:arch/mips/sibyte/common/Makefile +f:arch/mips/sibyte/common/bus_watcher.c +f:arch/mips/sibyte/common/cfe.c +f:arch/mips/sibyte/common/cfe_console.c +f:arch/mips/sibyte/common/dma.c +f:arch/mips/sibyte/common/sb_tbprof.c +f:arch/mips/sibyte/sb1250/Makefile +f:arch/mips/sibyte/sb1250/irq.c +f:arch/mips/sibyte/sb1250/setup.c +f:arch/mips/sibyte/sb1250/smp.c +f:arch/mips/sibyte/sb1250/time.c +f:arch/mips/sibyte/swarm/Makefile +f:arch/mips/sibyte/swarm/platform.c +f:arch/mips/sibyte/swarm/rtc_m41t81.c +f:arch/mips/sibyte/swarm/rtc_xicor1241.c +f:arch/mips/sibyte/swarm/setup.c +f:arch/mips/sibyte/swarm/swarm-i2c.c +f:arch/mips/sni/Makefile +f:arch/mips/sni/Platform +f:arch/mips/sni/a20r.c +f:arch/mips/sni/eisa.c +f:arch/mips/sni/irq.c +f:arch/mips/sni/pcimt.c +f:arch/mips/sni/pcit.c +f:arch/mips/sni/reset.c +f:arch/mips/sni/rm200.c +f:arch/mips/sni/setup.c +f:arch/mips/sni/time.c +f:arch/mips/tools/.gitignore +f:arch/mips/tools/Makefile +f:arch/mips/tools/elf-entry.c +f:arch/mips/tools/generic-board-config.sh +f:arch/mips/tools/loongson3-llsc-check.c +f:arch/mips/txx9/Kconfig +f:arch/mips/txx9/Makefile +f:arch/mips/txx9/Platform +f:arch/mips/txx9/generic/Makefile +f:arch/mips/txx9/generic/irq_tx4927.c +f:arch/mips/txx9/generic/irq_tx4938.c +f:arch/mips/txx9/generic/mem_tx4927.c +f:arch/mips/txx9/generic/pci.c +f:arch/mips/txx9/generic/setup.c +f:arch/mips/txx9/generic/setup_tx4927.c +f:arch/mips/txx9/generic/setup_tx4938.c +f:arch/mips/txx9/generic/smsc_fdc37m81x.c +f:arch/mips/txx9/rbtx4927/Makefile +f:arch/mips/txx9/rbtx4927/irq.c +f:arch/mips/txx9/rbtx4927/prom.c +f:arch/mips/txx9/rbtx4927/setup.c +f:arch/mips/vdso/.gitignore +f:arch/mips/vdso/Kconfig +f:arch/mips/vdso/Makefile +f:arch/mips/vdso/config-n32-o32-env.c +f:arch/mips/vdso/elf.S +f:arch/mips/vdso/genvdso.c +f:arch/mips/vdso/genvdso.h +f:arch/mips/vdso/sigreturn.S +f:arch/mips/vdso/vdso.lds.S +f:arch/mips/vdso/vgettimeofday.c +f:arch/nios2/Kbuild +f:arch/nios2/Kconfig +f:arch/nios2/Kconfig.debug +f:arch/nios2/Makefile +f:arch/nios2/boot/.gitignore +f:arch/nios2/boot/Makefile +f:arch/nios2/boot/compressed/Makefile +f:arch/nios2/boot/compressed/console.c +f:arch/nios2/boot/compressed/head.S +f:arch/nios2/boot/compressed/misc.c +f:arch/nios2/boot/compressed/vmlinux.lds.S +f:arch/nios2/boot/compressed/vmlinux.scr +f:arch/nios2/boot/dts/10m50_devboard.dts +f:arch/nios2/boot/dts/3c120_devboard.dts +f:arch/nios2/boot/dts/Makefile +f:arch/nios2/boot/install.sh +f:arch/nios2/configs/10m50_defconfig +f:arch/nios2/configs/3c120_defconfig +f:arch/nios2/include/asm/Kbuild +f:arch/nios2/include/asm/asm-macros.h +f:arch/nios2/include/asm/asm-offsets.h +f:arch/nios2/include/asm/cache.h +f:arch/nios2/include/asm/cacheflush.h +f:arch/nios2/include/asm/cachetype.h +f:arch/nios2/include/asm/checksum.h +f:arch/nios2/include/asm/cpuinfo.h +f:arch/nios2/include/asm/delay.h +f:arch/nios2/include/asm/elf.h +f:arch/nios2/include/asm/entry.h +f:arch/nios2/include/asm/io.h +f:arch/nios2/include/asm/irq.h +f:arch/nios2/include/asm/irqflags.h +f:arch/nios2/include/asm/kgdb.h +f:arch/nios2/include/asm/linkage.h +f:arch/nios2/include/asm/mmu.h +f:arch/nios2/include/asm/mmu_context.h +f:arch/nios2/include/asm/page.h +f:arch/nios2/include/asm/pgalloc.h +f:arch/nios2/include/asm/pgtable-bits.h +f:arch/nios2/include/asm/pgtable.h +f:arch/nios2/include/asm/processor.h +f:arch/nios2/include/asm/ptrace.h +f:arch/nios2/include/asm/registers.h +f:arch/nios2/include/asm/setup.h +f:arch/nios2/include/asm/shmparam.h +f:arch/nios2/include/asm/string.h +f:arch/nios2/include/asm/switch_to.h +f:arch/nios2/include/asm/syscall.h +f:arch/nios2/include/asm/syscalls.h +f:arch/nios2/include/asm/thread_info.h +f:arch/nios2/include/asm/timex.h +f:arch/nios2/include/asm/tlb.h +f:arch/nios2/include/asm/tlbflush.h +f:arch/nios2/include/asm/traps.h +f:arch/nios2/include/asm/uaccess.h +f:arch/nios2/include/asm/unistd.h +f:arch/nios2/include/asm/vmalloc.h +f:arch/nios2/include/uapi/asm/Kbuild +f:arch/nios2/include/uapi/asm/byteorder.h +f:arch/nios2/include/uapi/asm/elf.h +f:arch/nios2/include/uapi/asm/ptrace.h +f:arch/nios2/include/uapi/asm/sigcontext.h +f:arch/nios2/include/uapi/asm/signal.h +f:arch/nios2/include/uapi/asm/swab.h +f:arch/nios2/include/uapi/asm/unistd.h +f:arch/nios2/kernel/.gitignore +f:arch/nios2/kernel/Makefile +f:arch/nios2/kernel/Makefile.syscalls +f:arch/nios2/kernel/asm-offsets.c +f:arch/nios2/kernel/cpuinfo.c +f:arch/nios2/kernel/entry.S +f:arch/nios2/kernel/head.S +f:arch/nios2/kernel/insnemu.S +f:arch/nios2/kernel/irq.c +f:arch/nios2/kernel/kgdb.c +f:arch/nios2/kernel/misaligned.c +f:arch/nios2/kernel/module.c +f:arch/nios2/kernel/nios2_ksyms.c +f:arch/nios2/kernel/process.c +f:arch/nios2/kernel/prom.c +f:arch/nios2/kernel/ptrace.c +f:arch/nios2/kernel/setup.c +f:arch/nios2/kernel/signal.c +f:arch/nios2/kernel/sys_nios2.c +f:arch/nios2/kernel/syscall_table.c +f:arch/nios2/kernel/time.c +f:arch/nios2/kernel/traps.c +f:arch/nios2/kernel/vmlinux.lds.S +f:arch/nios2/lib/Makefile +f:arch/nios2/lib/delay.c +f:arch/nios2/lib/memcpy.c +f:arch/nios2/lib/memmove.c +f:arch/nios2/lib/memset.c +f:arch/nios2/mm/Makefile +f:arch/nios2/mm/cacheflush.c +f:arch/nios2/mm/dma-mapping.c +f:arch/nios2/mm/extable.c +f:arch/nios2/mm/fault.c +f:arch/nios2/mm/init.c +f:arch/nios2/mm/ioremap.c +f:arch/nios2/mm/mmu_context.c +f:arch/nios2/mm/pgtable.c +f:arch/nios2/mm/tlb.c +f:arch/nios2/mm/uaccess.c +f:arch/nios2/platform/Kconfig.platform +f:arch/nios2/platform/Makefile +f:arch/nios2/platform/platform.c +f:arch/openrisc/Kbuild +f:arch/openrisc/Kconfig +f:arch/openrisc/Kconfig.debug +f:arch/openrisc/Makefile +f:arch/openrisc/boot/.gitignore +f:arch/openrisc/boot/Makefile +f:arch/openrisc/boot/dts/Makefile +f:arch/openrisc/boot/dts/or1klitex.dts +f:arch/openrisc/boot/dts/or1ksim.dts +f:arch/openrisc/boot/dts/simple_smp.dts +f:arch/openrisc/configs/or1klitex_defconfig +f:arch/openrisc/configs/or1ksim_defconfig +f:arch/openrisc/configs/simple_smp_defconfig +f:arch/openrisc/configs/virt_defconfig +f:arch/openrisc/include/asm/Kbuild +f:arch/openrisc/include/asm/asm-offsets.h +f:arch/openrisc/include/asm/atomic.h +f:arch/openrisc/include/asm/barrier.h +f:arch/openrisc/include/asm/bitops.h +f:arch/openrisc/include/asm/bitops/__ffs.h +f:arch/openrisc/include/asm/bitops/__fls.h +f:arch/openrisc/include/asm/bitops/atomic.h +f:arch/openrisc/include/asm/bitops/ffs.h +f:arch/openrisc/include/asm/bitops/fls.h +f:arch/openrisc/include/asm/bug.h +f:arch/openrisc/include/asm/cache.h +f:arch/openrisc/include/asm/cacheflush.h +f:arch/openrisc/include/asm/cmpxchg.h +f:arch/openrisc/include/asm/cpuinfo.h +f:arch/openrisc/include/asm/delay.h +f:arch/openrisc/include/asm/elf.h +f:arch/openrisc/include/asm/fixmap.h +f:arch/openrisc/include/asm/fpu.h +f:arch/openrisc/include/asm/futex.h +f:arch/openrisc/include/asm/io.h +f:arch/openrisc/include/asm/irq.h +f:arch/openrisc/include/asm/irqflags.h +f:arch/openrisc/include/asm/linkage.h +f:arch/openrisc/include/asm/mmu.h +f:arch/openrisc/include/asm/mmu_context.h +f:arch/openrisc/include/asm/page.h +f:arch/openrisc/include/asm/pgalloc.h +f:arch/openrisc/include/asm/pgtable.h +f:arch/openrisc/include/asm/processor.h +f:arch/openrisc/include/asm/ptrace.h +f:arch/openrisc/include/asm/serial.h +f:arch/openrisc/include/asm/setup.h +f:arch/openrisc/include/asm/smp.h +f:arch/openrisc/include/asm/spr.h +f:arch/openrisc/include/asm/spr_defs.h +f:arch/openrisc/include/asm/string.h +f:arch/openrisc/include/asm/syscall.h +f:arch/openrisc/include/asm/syscalls.h +f:arch/openrisc/include/asm/thread_info.h +f:arch/openrisc/include/asm/time.h +f:arch/openrisc/include/asm/timex.h +f:arch/openrisc/include/asm/tlb.h +f:arch/openrisc/include/asm/tlbflush.h +f:arch/openrisc/include/asm/uaccess.h +f:arch/openrisc/include/asm/unistd.h +f:arch/openrisc/include/asm/unwinder.h +f:arch/openrisc/include/asm/vmalloc.h +f:arch/openrisc/include/uapi/asm/Kbuild +f:arch/openrisc/include/uapi/asm/byteorder.h +f:arch/openrisc/include/uapi/asm/elf.h +f:arch/openrisc/include/uapi/asm/param.h +f:arch/openrisc/include/uapi/asm/ptrace.h +f:arch/openrisc/include/uapi/asm/sigcontext.h +f:arch/openrisc/include/uapi/asm/unistd.h +f:arch/openrisc/kernel/.gitignore +f:arch/openrisc/kernel/Makefile +f:arch/openrisc/kernel/Makefile.syscalls +f:arch/openrisc/kernel/asm-offsets.c +f:arch/openrisc/kernel/cacheinfo.c +f:arch/openrisc/kernel/dma.c +f:arch/openrisc/kernel/entry.S +f:arch/openrisc/kernel/head.S +f:arch/openrisc/kernel/irq.c +f:arch/openrisc/kernel/module.c +f:arch/openrisc/kernel/or32_ksyms.c +f:arch/openrisc/kernel/process.c +f:arch/openrisc/kernel/prom.c +f:arch/openrisc/kernel/ptrace.c +f:arch/openrisc/kernel/setup.c +f:arch/openrisc/kernel/signal.c +f:arch/openrisc/kernel/smp.c +f:arch/openrisc/kernel/stacktrace.c +f:arch/openrisc/kernel/sync-timer.c +f:arch/openrisc/kernel/sys_call_table.c +f:arch/openrisc/kernel/time.c +f:arch/openrisc/kernel/traps.c +f:arch/openrisc/kernel/unwinder.c +f:arch/openrisc/kernel/vmlinux.h +f:arch/openrisc/kernel/vmlinux.lds.S +f:arch/openrisc/lib/Makefile +f:arch/openrisc/lib/delay.c +f:arch/openrisc/lib/memcpy.c +f:arch/openrisc/lib/memset.S +f:arch/openrisc/lib/string.S +f:arch/openrisc/mm/Makefile +f:arch/openrisc/mm/cache.c +f:arch/openrisc/mm/fault.c +f:arch/openrisc/mm/init.c +f:arch/openrisc/mm/ioremap.c +f:arch/openrisc/mm/tlb.c +f:arch/parisc/Kbuild +f:arch/parisc/Kconfig +f:arch/parisc/Kconfig.debug +f:arch/parisc/Makefile +f:arch/parisc/boot/.gitignore +f:arch/parisc/boot/Makefile +f:arch/parisc/boot/compressed/.gitignore +f:arch/parisc/boot/compressed/Makefile +f:arch/parisc/boot/compressed/firmware.c +f:arch/parisc/boot/compressed/head.S +f:arch/parisc/boot/compressed/misc.c +f:arch/parisc/boot/compressed/real2.S +f:arch/parisc/boot/compressed/vmlinux.lds.S +f:arch/parisc/boot/compressed/vmlinux.scr +f:arch/parisc/configs/generic-32bit_defconfig +f:arch/parisc/configs/generic-64bit_defconfig +f:arch/parisc/defpalo.conf +f:arch/parisc/include/asm/Kbuild +f:arch/parisc/include/asm/alternative.h +f:arch/parisc/include/asm/asm-offsets.h +f:arch/parisc/include/asm/asmregs.h +f:arch/parisc/include/asm/assembly.h +f:arch/parisc/include/asm/atomic.h +f:arch/parisc/include/asm/barrier.h +f:arch/parisc/include/asm/bitops.h +f:arch/parisc/include/asm/bug.h +f:arch/parisc/include/asm/cache.h +f:arch/parisc/include/asm/cacheflush.h +f:arch/parisc/include/asm/cachetype.h +f:arch/parisc/include/asm/checksum.h +f:arch/parisc/include/asm/cmpxchg.h +f:arch/parisc/include/asm/compat.h +f:arch/parisc/include/asm/compat_ucontext.h +f:arch/parisc/include/asm/current.h +f:arch/parisc/include/asm/delay.h +f:arch/parisc/include/asm/dma-mapping.h +f:arch/parisc/include/asm/dma.h +f:arch/parisc/include/asm/dwarf.h +f:arch/parisc/include/asm/eisa_bus.h +f:arch/parisc/include/asm/eisa_eeprom.h +f:arch/parisc/include/asm/elf.h +f:arch/parisc/include/asm/extable.h +f:arch/parisc/include/asm/fixmap.h +f:arch/parisc/include/asm/floppy.h +f:arch/parisc/include/asm/ftrace.h +f:arch/parisc/include/asm/futex.h +f:arch/parisc/include/asm/grfioctl.h +f:arch/parisc/include/asm/hardirq.h +f:arch/parisc/include/asm/hardware.h +f:arch/parisc/include/asm/hash.h +f:arch/parisc/include/asm/hugetlb.h +f:arch/parisc/include/asm/io.h +f:arch/parisc/include/asm/irq.h +f:arch/parisc/include/asm/irqflags.h +f:arch/parisc/include/asm/jump_label.h +f:arch/parisc/include/asm/kbdleds.h +f:arch/parisc/include/asm/kexec.h +f:arch/parisc/include/asm/kfence.h +f:arch/parisc/include/asm/kgdb.h +f:arch/parisc/include/asm/kprobes.h +f:arch/parisc/include/asm/ldcw.h +f:arch/parisc/include/asm/led.h +f:arch/parisc/include/asm/linkage.h +f:arch/parisc/include/asm/mman.h +f:arch/parisc/include/asm/mmu.h +f:arch/parisc/include/asm/mmu_context.h +f:arch/parisc/include/asm/mmzone.h +f:arch/parisc/include/asm/module.h +f:arch/parisc/include/asm/page.h +f:arch/parisc/include/asm/parisc-device.h +f:arch/parisc/include/asm/parport.h +f:arch/parisc/include/asm/pci.h +f:arch/parisc/include/asm/pdc.h +f:arch/parisc/include/asm/pdc_chassis.h +f:arch/parisc/include/asm/pdcpat.h +f:arch/parisc/include/asm/perf.h +f:arch/parisc/include/asm/perf_event.h +f:arch/parisc/include/asm/pgalloc.h +f:arch/parisc/include/asm/pgtable.h +f:arch/parisc/include/asm/prefetch.h +f:arch/parisc/include/asm/processor.h +f:arch/parisc/include/asm/psw.h +f:arch/parisc/include/asm/ptrace.h +f:arch/parisc/include/asm/ropes.h +f:arch/parisc/include/asm/rt_sigframe.h +f:arch/parisc/include/asm/runway.h +f:arch/parisc/include/asm/seccomp.h +f:arch/parisc/include/asm/sections.h +f:arch/parisc/include/asm/serial.h +f:arch/parisc/include/asm/shmparam.h +f:arch/parisc/include/asm/signal.h +f:arch/parisc/include/asm/smp.h +f:arch/parisc/include/asm/socket.h +f:arch/parisc/include/asm/sparsemem.h +f:arch/parisc/include/asm/special_insns.h +f:arch/parisc/include/asm/spinlock.h +f:arch/parisc/include/asm/spinlock_types.h +f:arch/parisc/include/asm/string.h +f:arch/parisc/include/asm/superio.h +f:arch/parisc/include/asm/switch_to.h +f:arch/parisc/include/asm/syscall.h +f:arch/parisc/include/asm/text-patching.h +f:arch/parisc/include/asm/thread_info.h +f:arch/parisc/include/asm/timex.h +f:arch/parisc/include/asm/tlb.h +f:arch/parisc/include/asm/tlbflush.h +f:arch/parisc/include/asm/topology.h +f:arch/parisc/include/asm/traps.h +f:arch/parisc/include/asm/uaccess.h +f:arch/parisc/include/asm/ucontext.h +f:arch/parisc/include/asm/unistd.h +f:arch/parisc/include/asm/unwind.h +f:arch/parisc/include/asm/vdso.h +f:arch/parisc/include/asm/video.h +f:arch/parisc/include/asm/vmalloc.h +f:arch/parisc/include/uapi/asm/Kbuild +f:arch/parisc/include/uapi/asm/auxvec.h +f:arch/parisc/include/uapi/asm/bitsperlong.h +f:arch/parisc/include/uapi/asm/byteorder.h +f:arch/parisc/include/uapi/asm/cachectl.h +f:arch/parisc/include/uapi/asm/errno.h +f:arch/parisc/include/uapi/asm/fcntl.h +f:arch/parisc/include/uapi/asm/ioctl.h +f:arch/parisc/include/uapi/asm/ioctls.h +f:arch/parisc/include/uapi/asm/ipcbuf.h +f:arch/parisc/include/uapi/asm/mman.h +f:arch/parisc/include/uapi/asm/msgbuf.h +f:arch/parisc/include/uapi/asm/pdc.h +f:arch/parisc/include/uapi/asm/posix_types.h +f:arch/parisc/include/uapi/asm/ptrace.h +f:arch/parisc/include/uapi/asm/sembuf.h +f:arch/parisc/include/uapi/asm/setup.h +f:arch/parisc/include/uapi/asm/shmbuf.h +f:arch/parisc/include/uapi/asm/sigcontext.h +f:arch/parisc/include/uapi/asm/signal.h +f:arch/parisc/include/uapi/asm/socket.h +f:arch/parisc/include/uapi/asm/stat.h +f:arch/parisc/include/uapi/asm/statfs.h +f:arch/parisc/include/uapi/asm/termbits.h +f:arch/parisc/include/uapi/asm/unistd.h +f:arch/parisc/install.sh +f:arch/parisc/kernel/.gitignore +f:arch/parisc/kernel/Makefile +f:arch/parisc/kernel/alternative.c +f:arch/parisc/kernel/asm-offsets.c +f:arch/parisc/kernel/audit.c +f:arch/parisc/kernel/cache.c +f:arch/parisc/kernel/compat_audit.c +f:arch/parisc/kernel/drivers.c +f:arch/parisc/kernel/entry.S +f:arch/parisc/kernel/firmware.c +f:arch/parisc/kernel/ftrace.c +f:arch/parisc/kernel/hardware.c +f:arch/parisc/kernel/head.S +f:arch/parisc/kernel/hpmc.S +f:arch/parisc/kernel/inventory.c +f:arch/parisc/kernel/irq.c +f:arch/parisc/kernel/jump_label.c +f:arch/parisc/kernel/kexec.c +f:arch/parisc/kernel/kexec_file.c +f:arch/parisc/kernel/kgdb.c +f:arch/parisc/kernel/kprobes.c +f:arch/parisc/kernel/module.c +f:arch/parisc/kernel/pacache.S +f:arch/parisc/kernel/parisc_ksyms.c +f:arch/parisc/kernel/patch.c +f:arch/parisc/kernel/pci-dma.c +f:arch/parisc/kernel/pci.c +f:arch/parisc/kernel/pdc_chassis.c +f:arch/parisc/kernel/pdc_cons.c +f:arch/parisc/kernel/pdt.c +f:arch/parisc/kernel/perf.c +f:arch/parisc/kernel/perf_asm.S +f:arch/parisc/kernel/perf_images.h +f:arch/parisc/kernel/process.c +f:arch/parisc/kernel/processor.c +f:arch/parisc/kernel/ptrace.c +f:arch/parisc/kernel/real2.S +f:arch/parisc/kernel/relocate_kernel.S +f:arch/parisc/kernel/setup.c +f:arch/parisc/kernel/signal.c +f:arch/parisc/kernel/signal32.c +f:arch/parisc/kernel/signal32.h +f:arch/parisc/kernel/smp.c +f:arch/parisc/kernel/stacktrace.c +f:arch/parisc/kernel/sys_parisc.c +f:arch/parisc/kernel/sys_parisc32.c +f:arch/parisc/kernel/syscall.S +f:arch/parisc/kernel/syscalls/Makefile +f:arch/parisc/kernel/syscalls/syscall.tbl +f:arch/parisc/kernel/time.c +f:arch/parisc/kernel/toc.c +f:arch/parisc/kernel/toc_asm.S +f:arch/parisc/kernel/topology.c +f:arch/parisc/kernel/traps.c +f:arch/parisc/kernel/unaligned.c +f:arch/parisc/kernel/unaligned.h +f:arch/parisc/kernel/unwind.c +f:arch/parisc/kernel/vdso.c +f:arch/parisc/kernel/vdso32/Makefile +f:arch/parisc/kernel/vdso32/gen_vdso_offsets.sh +f:arch/parisc/kernel/vdso32/note.S +f:arch/parisc/kernel/vdso32/restart_syscall.S +f:arch/parisc/kernel/vdso32/sigtramp.S +f:arch/parisc/kernel/vdso32/vdso32.lds.S +f:arch/parisc/kernel/vdso32/vdso32_generic.c +f:arch/parisc/kernel/vdso32/vdso32_wrapper.S +f:arch/parisc/kernel/vdso64/Makefile +f:arch/parisc/kernel/vdso64/gen_vdso_offsets.sh +f:arch/parisc/kernel/vdso64/note.S +f:arch/parisc/kernel/vdso64/restart_syscall.S +f:arch/parisc/kernel/vdso64/sigtramp.S +f:arch/parisc/kernel/vdso64/vdso64.lds.S +f:arch/parisc/kernel/vdso64/vdso64_generic.c +f:arch/parisc/kernel/vdso64/vdso64_wrapper.S +f:arch/parisc/kernel/vmlinux.lds.S +f:arch/parisc/lib/Makefile +f:arch/parisc/lib/bitops.c +f:arch/parisc/lib/checksum.c +f:arch/parisc/lib/delay.c +f:arch/parisc/lib/io.c +f:arch/parisc/lib/iomap.c +f:arch/parisc/lib/lusercopy.S +f:arch/parisc/lib/memcpy.c +f:arch/parisc/lib/memset.c +f:arch/parisc/lib/ucmpdi2.c +f:arch/parisc/math-emu/Makefile +f:arch/parisc/math-emu/README +f:arch/parisc/math-emu/cnv_float.h +f:arch/parisc/math-emu/dbl_float.h +f:arch/parisc/math-emu/decode_exc.c +f:arch/parisc/math-emu/denormal.c +f:arch/parisc/math-emu/dfadd.c +f:arch/parisc/math-emu/dfcmp.c +f:arch/parisc/math-emu/dfdiv.c +f:arch/parisc/math-emu/dfmpy.c +f:arch/parisc/math-emu/dfrem.c +f:arch/parisc/math-emu/dfsqrt.c +f:arch/parisc/math-emu/dfsub.c +f:arch/parisc/math-emu/driver.c +f:arch/parisc/math-emu/fcnvff.c +f:arch/parisc/math-emu/fcnvfu.c +f:arch/parisc/math-emu/fcnvfut.c +f:arch/parisc/math-emu/fcnvfx.c +f:arch/parisc/math-emu/fcnvfxt.c +f:arch/parisc/math-emu/fcnvuf.c +f:arch/parisc/math-emu/fcnvxf.c +f:arch/parisc/math-emu/float.h +f:arch/parisc/math-emu/fmpyfadd.c +f:arch/parisc/math-emu/fpbits.h +f:arch/parisc/math-emu/fpu.h +f:arch/parisc/math-emu/fpudispatch.c +f:arch/parisc/math-emu/frnd.c +f:arch/parisc/math-emu/hppa.h +f:arch/parisc/math-emu/math-emu.h +f:arch/parisc/math-emu/sfadd.c +f:arch/parisc/math-emu/sfcmp.c +f:arch/parisc/math-emu/sfdiv.c +f:arch/parisc/math-emu/sfmpy.c +f:arch/parisc/math-emu/sfrem.c +f:arch/parisc/math-emu/sfsqrt.c +f:arch/parisc/math-emu/sfsub.c +f:arch/parisc/math-emu/sgl_float.h +f:arch/parisc/mm/Makefile +f:arch/parisc/mm/fault.c +f:arch/parisc/mm/fixmap.c +f:arch/parisc/mm/hugetlbpage.c +f:arch/parisc/mm/init.c +f:arch/parisc/mm/ioremap.c +f:arch/parisc/net/Makefile +f:arch/parisc/net/bpf_jit.h +f:arch/parisc/net/bpf_jit_comp32.c +f:arch/parisc/net/bpf_jit_comp64.c +f:arch/parisc/net/bpf_jit_core.c +f:arch/parisc/video/Makefile +f:arch/parisc/video/video-sti.c +f:arch/powerpc/Kbuild +f:arch/powerpc/Kconfig +f:arch/powerpc/Kconfig.debug +f:arch/powerpc/Makefile +f:arch/powerpc/Makefile.postlink +f:arch/powerpc/boot/.gitignore +f:arch/powerpc/boot/44x.h +f:arch/powerpc/boot/4xx.c +f:arch/powerpc/boot/4xx.h +f:arch/powerpc/boot/Makefile +f:arch/powerpc/boot/README +f:arch/powerpc/boot/addnote.c +f:arch/powerpc/boot/bamboo.c +f:arch/powerpc/boot/cpm-serial.c +f:arch/powerpc/boot/crt0.S +f:arch/powerpc/boot/crtsavres.S +f:arch/powerpc/boot/cuboot-52xx.c +f:arch/powerpc/boot/cuboot-824x.c +f:arch/powerpc/boot/cuboot-83xx.c +f:arch/powerpc/boot/cuboot-85xx-cpm2.c +f:arch/powerpc/boot/cuboot-85xx.c +f:arch/powerpc/boot/cuboot-8xx.c +f:arch/powerpc/boot/cuboot-amigaone.c +f:arch/powerpc/boot/cuboot-bamboo.c +f:arch/powerpc/boot/cuboot-ebony.c +f:arch/powerpc/boot/cuboot-katmai.c +f:arch/powerpc/boot/cuboot-pq2.c +f:arch/powerpc/boot/cuboot-rainier.c +f:arch/powerpc/boot/cuboot-sam440ep.c +f:arch/powerpc/boot/cuboot-sequoia.c +f:arch/powerpc/boot/cuboot-taishan.c +f:arch/powerpc/boot/cuboot-warp.c +f:arch/powerpc/boot/cuboot-yosemite.c +f:arch/powerpc/boot/cuboot.c +f:arch/powerpc/boot/cuboot.h +f:arch/powerpc/boot/dcr.h +f:arch/powerpc/boot/decompress.c +f:arch/powerpc/boot/devtree.c +f:arch/powerpc/boot/div64.S +f:arch/powerpc/boot/dts/Makefile +f:arch/powerpc/boot/dts/a3m071.dts +f:arch/powerpc/boot/dts/a4m072.dts +f:arch/powerpc/boot/dts/ac14xx.dts +f:arch/powerpc/boot/dts/adder875-redboot.dts +f:arch/powerpc/boot/dts/adder875-uboot.dts +f:arch/powerpc/boot/dts/akebono.dts +f:arch/powerpc/boot/dts/amigaone.dts +f:arch/powerpc/boot/dts/arches.dts +f:arch/powerpc/boot/dts/asp834x-redboot.dts +f:arch/powerpc/boot/dts/bamboo.dts +f:arch/powerpc/boot/dts/bluestone.dts +f:arch/powerpc/boot/dts/canyonlands.dts +f:arch/powerpc/boot/dts/charon.dts +f:arch/powerpc/boot/dts/cm5200.dts +f:arch/powerpc/boot/dts/currituck.dts +f:arch/powerpc/boot/dts/digsy_mtc.dts +f:arch/powerpc/boot/dts/ebony.dts +f:arch/powerpc/boot/dts/eiger.dts +f:arch/powerpc/boot/dts/ep8248e.dts +f:arch/powerpc/boot/dts/ep88xc.dts +f:arch/powerpc/boot/dts/fsl/Makefile +f:arch/powerpc/boot/dts/fsl/b4420qds.dts +f:arch/powerpc/boot/dts/fsl/b4420si-post.dtsi +f:arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/b4860qds.dts +f:arch/powerpc/boot/dts/fsl/b4860si-post.dtsi +f:arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/b4qds.dtsi +f:arch/powerpc/boot/dts/fsl/b4si-post.dtsi +f:arch/powerpc/boot/dts/fsl/bsc9131rdb.dts +f:arch/powerpc/boot/dts/fsl/bsc9131rdb.dtsi +f:arch/powerpc/boot/dts/fsl/bsc9131si-post.dtsi +f:arch/powerpc/boot/dts/fsl/bsc9131si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/bsc9132qds.dts +f:arch/powerpc/boot/dts/fsl/bsc9132qds.dtsi +f:arch/powerpc/boot/dts/fsl/bsc9132si-post.dtsi +f:arch/powerpc/boot/dts/fsl/bsc9132si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/c293pcie.dts +f:arch/powerpc/boot/dts/fsl/c293si-post.dtsi +f:arch/powerpc/boot/dts/fsl/c293si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/cyrus_p5020.dts +f:arch/powerpc/boot/dts/fsl/e500mc_power_isa.dtsi +f:arch/powerpc/boot/dts/fsl/e500v1_power_isa.dtsi +f:arch/powerpc/boot/dts/fsl/e500v2_power_isa.dtsi +f:arch/powerpc/boot/dts/fsl/e5500_power_isa.dtsi +f:arch/powerpc/boot/dts/fsl/e6500_power_isa.dtsi +f:arch/powerpc/boot/dts/fsl/elo3-dma-0.dtsi +f:arch/powerpc/boot/dts/fsl/elo3-dma-1.dtsi +f:arch/powerpc/boot/dts/fsl/elo3-dma-2.dtsi +f:arch/powerpc/boot/dts/fsl/ge_imp3a.dts +f:arch/powerpc/boot/dts/fsl/gef_ppc9a.dts +f:arch/powerpc/boot/dts/fsl/gef_sbc310.dts +f:arch/powerpc/boot/dts/fsl/gef_sbc610.dts +f:arch/powerpc/boot/dts/fsl/interlaken-lac-portals.dtsi +f:arch/powerpc/boot/dts/fsl/interlaken-lac.dtsi +f:arch/powerpc/boot/dts/fsl/kmcent2.dts +f:arch/powerpc/boot/dts/fsl/kmcoge4.dts +f:arch/powerpc/boot/dts/fsl/mpc8536ds.dts +f:arch/powerpc/boot/dts/fsl/mpc8536ds.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8536ds_36b.dts +f:arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8536si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8544ds.dts +f:arch/powerpc/boot/dts/fsl/mpc8544ds.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8544si-post.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8544si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8548si-post.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8548si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8568mds.dts +f:arch/powerpc/boot/dts/fsl/mpc8568si-post.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8568si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8569mds.dts +f:arch/powerpc/boot/dts/fsl/mpc8569si-post.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8569si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8572ds.dts +f:arch/powerpc/boot/dts/fsl/mpc8572ds.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8572ds_36b.dts +f:arch/powerpc/boot/dts/fsl/mpc8572ds_camp_core0.dts +f:arch/powerpc/boot/dts/fsl/mpc8572ds_camp_core1.dts +f:arch/powerpc/boot/dts/fsl/mpc8572si-post.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8572si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8641si-post.dtsi +f:arch/powerpc/boot/dts/fsl/mpc8641si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/mvme2500.dts +f:arch/powerpc/boot/dts/fsl/mvme7100.dts +f:arch/powerpc/boot/dts/fsl/oca4080.dts +f:arch/powerpc/boot/dts/fsl/p1010rdb-pa.dts +f:arch/powerpc/boot/dts/fsl/p1010rdb-pa.dtsi +f:arch/powerpc/boot/dts/fsl/p1010rdb-pa_36b.dts +f:arch/powerpc/boot/dts/fsl/p1010rdb-pb.dts +f:arch/powerpc/boot/dts/fsl/p1010rdb-pb_36b.dts +f:arch/powerpc/boot/dts/fsl/p1010rdb.dtsi +f:arch/powerpc/boot/dts/fsl/p1010rdb_32b.dtsi +f:arch/powerpc/boot/dts/fsl/p1010rdb_36b.dtsi +f:arch/powerpc/boot/dts/fsl/p1010si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p1010si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p1020mbg-pc.dtsi +f:arch/powerpc/boot/dts/fsl/p1020mbg-pc_32b.dts +f:arch/powerpc/boot/dts/fsl/p1020mbg-pc_36b.dts +f:arch/powerpc/boot/dts/fsl/p1020rdb-pc.dtsi +f:arch/powerpc/boot/dts/fsl/p1020rdb-pc_32b.dts +f:arch/powerpc/boot/dts/fsl/p1020rdb-pc_36b.dts +f:arch/powerpc/boot/dts/fsl/p1020rdb-pc_camp_core0.dts +f:arch/powerpc/boot/dts/fsl/p1020rdb-pc_camp_core1.dts +f:arch/powerpc/boot/dts/fsl/p1020rdb-pd.dts +f:arch/powerpc/boot/dts/fsl/p1020rdb.dts +f:arch/powerpc/boot/dts/fsl/p1020rdb.dtsi +f:arch/powerpc/boot/dts/fsl/p1020rdb_36b.dts +f:arch/powerpc/boot/dts/fsl/p1020si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p1020si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p1020utm-pc.dtsi +f:arch/powerpc/boot/dts/fsl/p1020utm-pc_32b.dts +f:arch/powerpc/boot/dts/fsl/p1020utm-pc_36b.dts +f:arch/powerpc/boot/dts/fsl/p1021mds.dts +f:arch/powerpc/boot/dts/fsl/p1021rdb-pc.dtsi +f:arch/powerpc/boot/dts/fsl/p1021rdb-pc_32b.dts +f:arch/powerpc/boot/dts/fsl/p1021rdb-pc_36b.dts +f:arch/powerpc/boot/dts/fsl/p1021si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p1021si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p1022ds.dtsi +f:arch/powerpc/boot/dts/fsl/p1022ds_32b.dts +f:arch/powerpc/boot/dts/fsl/p1022ds_36b.dts +f:arch/powerpc/boot/dts/fsl/p1022rdk.dts +f:arch/powerpc/boot/dts/fsl/p1022si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p1022si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p1023rdb.dts +f:arch/powerpc/boot/dts/fsl/p1023si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p1023si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p1024rdb.dtsi +f:arch/powerpc/boot/dts/fsl/p1024rdb_32b.dts +f:arch/powerpc/boot/dts/fsl/p1024rdb_36b.dts +f:arch/powerpc/boot/dts/fsl/p1025rdb.dtsi +f:arch/powerpc/boot/dts/fsl/p1025rdb_32b.dts +f:arch/powerpc/boot/dts/fsl/p1025rdb_36b.dts +f:arch/powerpc/boot/dts/fsl/p1025twr.dts +f:arch/powerpc/boot/dts/fsl/p1025twr.dtsi +f:arch/powerpc/boot/dts/fsl/p2020ds.dts +f:arch/powerpc/boot/dts/fsl/p2020ds.dtsi +f:arch/powerpc/boot/dts/fsl/p2020rdb-pc.dtsi +f:arch/powerpc/boot/dts/fsl/p2020rdb-pc_32b.dts +f:arch/powerpc/boot/dts/fsl/p2020rdb-pc_36b.dts +f:arch/powerpc/boot/dts/fsl/p2020rdb.dts +f:arch/powerpc/boot/dts/fsl/p2020si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p2020si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p2041rdb.dts +f:arch/powerpc/boot/dts/fsl/p2041si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p3041ds.dts +f:arch/powerpc/boot/dts/fsl/p3041si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p4080ds.dts +f:arch/powerpc/boot/dts/fsl/p4080si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p5020ds.dts +f:arch/powerpc/boot/dts/fsl/p5020si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/p5040ds.dts +f:arch/powerpc/boot/dts/fsl/p5040si-post.dtsi +f:arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi +f:arch/powerpc/boot/dts/fsl/ppa8548.dts +f:arch/powerpc/boot/dts/fsl/pq3-dma-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-dma-1.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-duart-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-esdhc-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-espi-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec1-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec1-1.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec1-2.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec1-3.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec1-timer-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec2-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec2-1.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec2-2.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-1.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-etsec2-grp2-2.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-gpio-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-i2c-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-i2c-1.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-mpic-message-B.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-mpic-timer-B.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-mpic.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-power.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-rmu-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-sata2-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-sata2-1.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-sec2.1-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-sec3.0-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-sec3.1-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-sec3.3-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-sec4.4-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-usb2-dr-0.dtsi +f:arch/powerpc/boot/dts/fsl/pq3-usb2-dr-1.dtsi +f:arch/powerpc/boot/dts/fsl/qonverge-usb2-dr-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-bman1-portals.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-bman1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-clockgen1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-clockgen2.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-dma-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-dma-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-duart-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-duart-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-esdhc-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-espi-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-0-10g-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-2.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-3.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-0-1g-4.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-1-10g-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-2.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-3.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-1-1g-4.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-2.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-3.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-fman3l-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-gpio-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-gpio-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-gpio-2.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-gpio-3.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-i2c-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-i2c-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-mpic.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-mpic4.3.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-qman1-portals.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-qman1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-qman3.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-raid1.0-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-rmu-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-sata2-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-sata2-1.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-sec4.0-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-sec4.2-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-sec5.0-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-sec5.2-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-sec5.3-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-sec6.0-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-usb2-dr-0.dtsi +f:arch/powerpc/boot/dts/fsl/qoriq-usb2-mph-0.dtsi +f:arch/powerpc/boot/dts/fsl/t1023rdb.dts +f:arch/powerpc/boot/dts/fsl/t1023si-post.dtsi +f:arch/powerpc/boot/dts/fsl/t1024qds.dts +f:arch/powerpc/boot/dts/fsl/t1024rdb.dts +f:arch/powerpc/boot/dts/fsl/t1024si-post.dtsi +f:arch/powerpc/boot/dts/fsl/t102xsi-pre.dtsi +f:arch/powerpc/boot/dts/fsl/t1040d4rdb.dts +f:arch/powerpc/boot/dts/fsl/t1040qds.dts +f:arch/powerpc/boot/dts/fsl/t1040rdb-rev-a.dts +f:arch/powerpc/boot/dts/fsl/t1040rdb.dts +f:arch/powerpc/boot/dts/fsl/t1040si-post.dtsi +f:arch/powerpc/boot/dts/fsl/t1042d4rdb.dts +f:arch/powerpc/boot/dts/fsl/t1042qds.dts +f:arch/powerpc/boot/dts/fsl/t1042rdb.dts +f:arch/powerpc/boot/dts/fsl/t1042rdb_pi.dts +f:arch/powerpc/boot/dts/fsl/t1042si-post.dtsi +f:arch/powerpc/boot/dts/fsl/t104xd4rdb.dtsi +f:arch/powerpc/boot/dts/fsl/t104xqds.dtsi +f:arch/powerpc/boot/dts/fsl/t104xrdb.dtsi +f:arch/powerpc/boot/dts/fsl/t104xsi-pre.dtsi +f:arch/powerpc/boot/dts/fsl/t2080qds.dts +f:arch/powerpc/boot/dts/fsl/t2080rdb.dts +f:arch/powerpc/boot/dts/fsl/t2080si-post.dtsi +f:arch/powerpc/boot/dts/fsl/t2081qds.dts +f:arch/powerpc/boot/dts/fsl/t2081si-post.dtsi +f:arch/powerpc/boot/dts/fsl/t208xqds.dtsi +f:arch/powerpc/boot/dts/fsl/t208xrdb.dtsi +f:arch/powerpc/boot/dts/fsl/t208xsi-pre.dtsi +f:arch/powerpc/boot/dts/fsl/t4240qds.dts +f:arch/powerpc/boot/dts/fsl/t4240rdb.dts +f:arch/powerpc/boot/dts/fsl/t4240si-post.dtsi +f:arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi +f:arch/powerpc/boot/dts/fsp2.dts +f:arch/powerpc/boot/dts/gamecube.dts +f:arch/powerpc/boot/dts/glacier.dts +f:arch/powerpc/boot/dts/holly.dts +f:arch/powerpc/boot/dts/icon.dts +f:arch/powerpc/boot/dts/iss4xx-mpic.dts +f:arch/powerpc/boot/dts/iss4xx.dts +f:arch/powerpc/boot/dts/katmai.dts +f:arch/powerpc/boot/dts/kmeter1.dts +f:arch/powerpc/boot/dts/ksi8560.dts +f:arch/powerpc/boot/dts/kuroboxHD.dts +f:arch/powerpc/boot/dts/kuroboxHG.dts +f:arch/powerpc/boot/dts/lite5200.dts +f:arch/powerpc/boot/dts/lite5200b.dts +f:arch/powerpc/boot/dts/media5200.dts +f:arch/powerpc/boot/dts/mgcoge.dts +f:arch/powerpc/boot/dts/microwatt.dts +f:arch/powerpc/boot/dts/motionpro.dts +f:arch/powerpc/boot/dts/mpc5121.dtsi +f:arch/powerpc/boot/dts/mpc5121ads.dts +f:arch/powerpc/boot/dts/mpc5125twr.dts +f:arch/powerpc/boot/dts/mpc5200b.dtsi +f:arch/powerpc/boot/dts/mpc8308_p1m.dts +f:arch/powerpc/boot/dts/mpc8308rdb.dts +f:arch/powerpc/boot/dts/mpc8313erdb.dts +f:arch/powerpc/boot/dts/mpc8315erdb.dts +f:arch/powerpc/boot/dts/mpc832x_rdb.dts +f:arch/powerpc/boot/dts/mpc8349emitx.dts +f:arch/powerpc/boot/dts/mpc8349emitxgp.dts +f:arch/powerpc/boot/dts/mpc836x_rdk.dts +f:arch/powerpc/boot/dts/mpc8377_rdb.dts +f:arch/powerpc/boot/dts/mpc8377_wlan.dts +f:arch/powerpc/boot/dts/mpc8378_rdb.dts +f:arch/powerpc/boot/dts/mpc8379_rdb.dts +f:arch/powerpc/boot/dts/mpc866ads.dts +f:arch/powerpc/boot/dts/mpc885ads.dts +f:arch/powerpc/boot/dts/mucmc52.dts +f:arch/powerpc/boot/dts/mvme5100.dts +f:arch/powerpc/boot/dts/o2d.dts +f:arch/powerpc/boot/dts/o2d.dtsi +f:arch/powerpc/boot/dts/o2d300.dts +f:arch/powerpc/boot/dts/o2dnt2.dts +f:arch/powerpc/boot/dts/o2i.dts +f:arch/powerpc/boot/dts/o2mnt.dts +f:arch/powerpc/boot/dts/o3dnt.dts +f:arch/powerpc/boot/dts/pcm030.dts +f:arch/powerpc/boot/dts/pcm032.dts +f:arch/powerpc/boot/dts/pdm360ng.dts +f:arch/powerpc/boot/dts/ps3.dts +f:arch/powerpc/boot/dts/rainier.dts +f:arch/powerpc/boot/dts/redwood.dts +f:arch/powerpc/boot/dts/sam440ep.dts +f:arch/powerpc/boot/dts/sequoia.dts +f:arch/powerpc/boot/dts/socrates.dts +f:arch/powerpc/boot/dts/storcenter.dts +f:arch/powerpc/boot/dts/stx_gp3_8560.dts +f:arch/powerpc/boot/dts/stxssa8555.dts +f:arch/powerpc/boot/dts/taishan.dts +f:arch/powerpc/boot/dts/tqm5200.dts +f:arch/powerpc/boot/dts/tqm8540.dts +f:arch/powerpc/boot/dts/tqm8541.dts +f:arch/powerpc/boot/dts/tqm8548-bigflash.dts +f:arch/powerpc/boot/dts/tqm8548.dts +f:arch/powerpc/boot/dts/tqm8555.dts +f:arch/powerpc/boot/dts/tqm8560.dts +f:arch/powerpc/boot/dts/tqm8xx.dts +f:arch/powerpc/boot/dts/turris1x.dts +f:arch/powerpc/boot/dts/uc101.dts +f:arch/powerpc/boot/dts/warp.dts +f:arch/powerpc/boot/dts/wii.dts +f:arch/powerpc/boot/dts/xcalibur1501.dts +f:arch/powerpc/boot/dts/xpedite5200.dts +f:arch/powerpc/boot/dts/xpedite5200_xmon.dts +f:arch/powerpc/boot/dts/xpedite5301.dts +f:arch/powerpc/boot/dts/xpedite5330.dts +f:arch/powerpc/boot/dts/xpedite5370.dts +f:arch/powerpc/boot/dts/yosemite.dts +f:arch/powerpc/boot/ebony.c +f:arch/powerpc/boot/elf.h +f:arch/powerpc/boot/elf_util.c +f:arch/powerpc/boot/ep8248e.c +f:arch/powerpc/boot/ep88xc.c +f:arch/powerpc/boot/epapr-wrapper.c +f:arch/powerpc/boot/epapr.c +f:arch/powerpc/boot/fixed-head.S +f:arch/powerpc/boot/fixup-headers.sed +f:arch/powerpc/boot/fsl-soc.c +f:arch/powerpc/boot/fsl-soc.h +f:arch/powerpc/boot/gamecube-head.S +f:arch/powerpc/boot/gamecube.c +f:arch/powerpc/boot/hack-coff.c +f:arch/powerpc/boot/holly.c +f:arch/powerpc/boot/install.sh +f:arch/powerpc/boot/io.h +f:arch/powerpc/boot/libfdt-wrapper.c +f:arch/powerpc/boot/libfdt_env.h +f:arch/powerpc/boot/main.c +f:arch/powerpc/boot/microwatt.c +f:arch/powerpc/boot/mktree.c +f:arch/powerpc/boot/motload-head.S +f:arch/powerpc/boot/mpc52xx-psc.c +f:arch/powerpc/boot/mpc8xx.c +f:arch/powerpc/boot/mpc8xx.h +f:arch/powerpc/boot/mvme5100.c +f:arch/powerpc/boot/mvme7100.c +f:arch/powerpc/boot/ns16550.c +f:arch/powerpc/boot/of.c +f:arch/powerpc/boot/of.h +f:arch/powerpc/boot/ofconsole.c +f:arch/powerpc/boot/oflib.c +f:arch/powerpc/boot/opal-calls.S +f:arch/powerpc/boot/opal.c +f:arch/powerpc/boot/ops.h +f:arch/powerpc/boot/page.h +f:arch/powerpc/boot/planetcore.c +f:arch/powerpc/boot/planetcore.h +f:arch/powerpc/boot/ppc_asm.h +f:arch/powerpc/boot/ppcboot.h +f:arch/powerpc/boot/pq2.c +f:arch/powerpc/boot/pq2.h +f:arch/powerpc/boot/ps3-head.S +f:arch/powerpc/boot/ps3-hvcall.S +f:arch/powerpc/boot/ps3.c +f:arch/powerpc/boot/pseries-head.S +f:arch/powerpc/boot/redboot-83xx.c +f:arch/powerpc/boot/redboot-8xx.c +f:arch/powerpc/boot/redboot.h +f:arch/powerpc/boot/reg.h +f:arch/powerpc/boot/rs6000.h +f:arch/powerpc/boot/serial.c +f:arch/powerpc/boot/simple_alloc.c +f:arch/powerpc/boot/simpleboot.c +f:arch/powerpc/boot/stdbool.h +f:arch/powerpc/boot/stdint.h +f:arch/powerpc/boot/stdio.c +f:arch/powerpc/boot/stdio.h +f:arch/powerpc/boot/stdlib.c +f:arch/powerpc/boot/stdlib.h +f:arch/powerpc/boot/string.S +f:arch/powerpc/boot/string.h +f:arch/powerpc/boot/swab.h +f:arch/powerpc/boot/treeboot-akebono.c +f:arch/powerpc/boot/treeboot-bamboo.c +f:arch/powerpc/boot/treeboot-currituck.c +f:arch/powerpc/boot/treeboot-ebony.c +f:arch/powerpc/boot/treeboot-iss4xx.c +f:arch/powerpc/boot/types.h +f:arch/powerpc/boot/ugecon.c +f:arch/powerpc/boot/ugecon.h +f:arch/powerpc/boot/util.S +f:arch/powerpc/boot/wii-head.S +f:arch/powerpc/boot/wii.c +f:arch/powerpc/boot/wrapper +f:arch/powerpc/boot/xz_config.h +f:arch/powerpc/boot/zImage.coff.lds.S +f:arch/powerpc/boot/zImage.lds.S +f:arch/powerpc/boot/zImage.ps3.lds.S +f:arch/powerpc/configs/32-bit.config +f:arch/powerpc/configs/44x.config +f:arch/powerpc/configs/44x/akebono_defconfig +f:arch/powerpc/configs/44x/arches_defconfig +f:arch/powerpc/configs/44x/bamboo_defconfig +f:arch/powerpc/configs/44x/bluestone_defconfig +f:arch/powerpc/configs/44x/canyonlands_defconfig +f:arch/powerpc/configs/44x/currituck_defconfig +f:arch/powerpc/configs/44x/ebony_defconfig +f:arch/powerpc/configs/44x/eiger_defconfig +f:arch/powerpc/configs/44x/fsp2_defconfig +f:arch/powerpc/configs/44x/icon_defconfig +f:arch/powerpc/configs/44x/iss476-smp_defconfig +f:arch/powerpc/configs/44x/katmai_defconfig +f:arch/powerpc/configs/44x/rainier_defconfig +f:arch/powerpc/configs/44x/redwood_defconfig +f:arch/powerpc/configs/44x/sam440ep_defconfig +f:arch/powerpc/configs/44x/sequoia_defconfig +f:arch/powerpc/configs/44x/taishan_defconfig +f:arch/powerpc/configs/44x/warp_defconfig +f:arch/powerpc/configs/52xx/cm5200_defconfig +f:arch/powerpc/configs/52xx/lite5200b_defconfig +f:arch/powerpc/configs/52xx/motionpro_defconfig +f:arch/powerpc/configs/52xx/pcm030_defconfig +f:arch/powerpc/configs/52xx/tqm5200_defconfig +f:arch/powerpc/configs/64-bit.config +f:arch/powerpc/configs/83xx/asp8347_defconfig +f:arch/powerpc/configs/83xx/kmeter1_defconfig +f:arch/powerpc/configs/83xx/mpc8313_rdb_defconfig +f:arch/powerpc/configs/83xx/mpc8315_rdb_defconfig +f:arch/powerpc/configs/83xx/mpc832x_rdb_defconfig +f:arch/powerpc/configs/83xx/mpc834x_itx_defconfig +f:arch/powerpc/configs/83xx/mpc834x_itxgp_defconfig +f:arch/powerpc/configs/83xx/mpc836x_rdk_defconfig +f:arch/powerpc/configs/83xx/mpc837x_rdb_defconfig +f:arch/powerpc/configs/85xx-32bit.config +f:arch/powerpc/configs/85xx-64bit.config +f:arch/powerpc/configs/85xx-hw.config +f:arch/powerpc/configs/85xx-smp.config +f:arch/powerpc/configs/85xx/ge_imp3a_defconfig +f:arch/powerpc/configs/85xx/ksi8560_defconfig +f:arch/powerpc/configs/85xx/ppa8548_defconfig +f:arch/powerpc/configs/85xx/socrates_defconfig +f:arch/powerpc/configs/85xx/stx_gp3_defconfig +f:arch/powerpc/configs/85xx/tqm8540_defconfig +f:arch/powerpc/configs/85xx/tqm8541_defconfig +f:arch/powerpc/configs/85xx/tqm8548_defconfig +f:arch/powerpc/configs/85xx/tqm8555_defconfig +f:arch/powerpc/configs/85xx/tqm8560_defconfig +f:arch/powerpc/configs/85xx/xes_mpc85xx_defconfig +f:arch/powerpc/configs/86xx-hw.config +f:arch/powerpc/configs/86xx-smp.config +f:arch/powerpc/configs/8xx.config +f:arch/powerpc/configs/adder875_defconfig +f:arch/powerpc/configs/altivec.config +f:arch/powerpc/configs/amigaone_defconfig +f:arch/powerpc/configs/be.config +f:arch/powerpc/configs/book3s_32.config +f:arch/powerpc/configs/cell_defconfig +f:arch/powerpc/configs/chrp32_defconfig +f:arch/powerpc/configs/corenet_base.config +f:arch/powerpc/configs/debug.config +f:arch/powerpc/configs/disable-werror.config +f:arch/powerpc/configs/dpaa.config +f:arch/powerpc/configs/ep8248e_defconfig +f:arch/powerpc/configs/ep88xc_defconfig +f:arch/powerpc/configs/fsl-emb-nonhw.config +f:arch/powerpc/configs/g5_defconfig +f:arch/powerpc/configs/gamecube_defconfig +f:arch/powerpc/configs/guest.config +f:arch/powerpc/configs/hardening.config +f:arch/powerpc/configs/holly_defconfig +f:arch/powerpc/configs/le.config +f:arch/powerpc/configs/linkstation_defconfig +f:arch/powerpc/configs/mgcoge_defconfig +f:arch/powerpc/configs/microwatt_defconfig +f:arch/powerpc/configs/mpc512x_defconfig +f:arch/powerpc/configs/mpc5200_defconfig +f:arch/powerpc/configs/mpc83xx_defconfig +f:arch/powerpc/configs/mpc85xx_base.config +f:arch/powerpc/configs/mpc866_ads_defconfig +f:arch/powerpc/configs/mpc86xx_base.config +f:arch/powerpc/configs/mpc885_ads_defconfig +f:arch/powerpc/configs/mvme5100_defconfig +f:arch/powerpc/configs/pasemi_defconfig +f:arch/powerpc/configs/pmac32_defconfig +f:arch/powerpc/configs/powernv_defconfig +f:arch/powerpc/configs/ppc44x_defconfig +f:arch/powerpc/configs/ppc64_defconfig +f:arch/powerpc/configs/ppc64e_defconfig +f:arch/powerpc/configs/ppc64le.config +f:arch/powerpc/configs/ppc6xx_defconfig +f:arch/powerpc/configs/ps3_defconfig +f:arch/powerpc/configs/security.config +f:arch/powerpc/configs/skiroot_defconfig +f:arch/powerpc/configs/storcenter_defconfig +f:arch/powerpc/configs/tqm8xx_defconfig +f:arch/powerpc/configs/wii_defconfig +f:arch/powerpc/crypto/.gitignore +f:arch/powerpc/crypto/Kconfig +f:arch/powerpc/crypto/Makefile +f:arch/powerpc/crypto/aes-gcm-p10-glue.c +f:arch/powerpc/crypto/aes-gcm-p10.S +f:arch/powerpc/crypto/aes-spe-core.S +f:arch/powerpc/crypto/aes-spe-glue.c +f:arch/powerpc/crypto/aes-spe-keys.S +f:arch/powerpc/crypto/aes-spe-modes.S +f:arch/powerpc/crypto/aes-spe-regs.h +f:arch/powerpc/crypto/aes-tab-4k.S +f:arch/powerpc/crypto/aes.c +f:arch/powerpc/crypto/aes_cbc.c +f:arch/powerpc/crypto/aes_ctr.c +f:arch/powerpc/crypto/aes_xts.c +f:arch/powerpc/crypto/aesp10-ppc.pl +f:arch/powerpc/crypto/aesp8-ppc.h +f:arch/powerpc/crypto/aesp8-ppc.pl +f:arch/powerpc/crypto/curve25519-ppc64le-core.c +f:arch/powerpc/crypto/curve25519-ppc64le_asm.S +f:arch/powerpc/crypto/ghash.c +f:arch/powerpc/crypto/ghashp10-ppc.pl +f:arch/powerpc/crypto/ghashp8-ppc.pl +f:arch/powerpc/crypto/md5-asm.S +f:arch/powerpc/crypto/md5-glue.c +f:arch/powerpc/crypto/ppc-xlate.pl +f:arch/powerpc/crypto/vmx.c +f:arch/powerpc/include/asm/8xx_immap.h +f:arch/powerpc/include/asm/Kbuild +f:arch/powerpc/include/asm/accounting.h +f:arch/powerpc/include/asm/archrandom.h +f:arch/powerpc/include/asm/asm-compat.h +f:arch/powerpc/include/asm/asm-const.h +f:arch/powerpc/include/asm/asm-offsets.h +f:arch/powerpc/include/asm/asm-prototypes.h +f:arch/powerpc/include/asm/asm.h +f:arch/powerpc/include/asm/async_tx.h +f:arch/powerpc/include/asm/atomic.h +f:arch/powerpc/include/asm/backlight.h +f:arch/powerpc/include/asm/barrier.h +f:arch/powerpc/include/asm/bitops.h +f:arch/powerpc/include/asm/book3s/32/kup.h +f:arch/powerpc/include/asm/book3s/32/mmu-hash.h +f:arch/powerpc/include/asm/book3s/32/pgalloc.h +f:arch/powerpc/include/asm/book3s/32/pgtable.h +f:arch/powerpc/include/asm/book3s/32/tlbflush.h +f:arch/powerpc/include/asm/book3s/64/hash-4k.h +f:arch/powerpc/include/asm/book3s/64/hash-64k.h +f:arch/powerpc/include/asm/book3s/64/hash-pkey.h +f:arch/powerpc/include/asm/book3s/64/hash.h +f:arch/powerpc/include/asm/book3s/64/hugetlb.h +f:arch/powerpc/include/asm/book3s/64/kexec.h +f:arch/powerpc/include/asm/book3s/64/kup.h +f:arch/powerpc/include/asm/book3s/64/mmu-hash.h +f:arch/powerpc/include/asm/book3s/64/mmu.h +f:arch/powerpc/include/asm/book3s/64/pgalloc.h +f:arch/powerpc/include/asm/book3s/64/pgtable-64k.h +f:arch/powerpc/include/asm/book3s/64/pgtable.h +f:arch/powerpc/include/asm/book3s/64/pkeys.h +f:arch/powerpc/include/asm/book3s/64/radix-4k.h +f:arch/powerpc/include/asm/book3s/64/radix-64k.h +f:arch/powerpc/include/asm/book3s/64/radix.h +f:arch/powerpc/include/asm/book3s/64/slice.h +f:arch/powerpc/include/asm/book3s/64/tlbflush-hash.h +f:arch/powerpc/include/asm/book3s/64/tlbflush-radix.h +f:arch/powerpc/include/asm/book3s/64/tlbflush.h +f:arch/powerpc/include/asm/book3s/pgalloc.h +f:arch/powerpc/include/asm/book3s/pgtable.h +f:arch/powerpc/include/asm/book3s/tlbflush.h +f:arch/powerpc/include/asm/bootx.h +f:arch/powerpc/include/asm/bpf_perf_event.h +f:arch/powerpc/include/asm/btext.h +f:arch/powerpc/include/asm/bug.h +f:arch/powerpc/include/asm/cache.h +f:arch/powerpc/include/asm/cacheflush.h +f:arch/powerpc/include/asm/cell-pmu.h +f:arch/powerpc/include/asm/cell-regs.h +f:arch/powerpc/include/asm/checksum.h +f:arch/powerpc/include/asm/clocksource.h +f:arch/powerpc/include/asm/cmpxchg.h +f:arch/powerpc/include/asm/code-patching-asm.h +f:arch/powerpc/include/asm/compat.h +f:arch/powerpc/include/asm/context_tracking.h +f:arch/powerpc/include/asm/copro.h +f:arch/powerpc/include/asm/cpm.h +f:arch/powerpc/include/asm/cpm1.h +f:arch/powerpc/include/asm/cpm2.h +f:arch/powerpc/include/asm/cpu_has_feature.h +f:arch/powerpc/include/asm/cpu_setup.h +f:arch/powerpc/include/asm/cpufeature.h +f:arch/powerpc/include/asm/cpuidle.h +f:arch/powerpc/include/asm/cputable.h +f:arch/powerpc/include/asm/cputhreads.h +f:arch/powerpc/include/asm/cputime.h +f:arch/powerpc/include/asm/crash_reserve.h +f:arch/powerpc/include/asm/crashdump-ppc64.h +f:arch/powerpc/include/asm/current.h +f:arch/powerpc/include/asm/dbdma.h +f:arch/powerpc/include/asm/dbell.h +f:arch/powerpc/include/asm/dcr-native.h +f:arch/powerpc/include/asm/dcr-regs.h +f:arch/powerpc/include/asm/dcr.h +f:arch/powerpc/include/asm/debug.h +f:arch/powerpc/include/asm/delay.h +f:arch/powerpc/include/asm/device.h +f:arch/powerpc/include/asm/disassemble.h +f:arch/powerpc/include/asm/dma-direct.h +f:arch/powerpc/include/asm/dma.h +f:arch/powerpc/include/asm/drmem.h +f:arch/powerpc/include/asm/dt_cpu_ftrs.h +f:arch/powerpc/include/asm/dtl.h +f:arch/powerpc/include/asm/edac.h +f:arch/powerpc/include/asm/eeh.h +f:arch/powerpc/include/asm/eeh_event.h +f:arch/powerpc/include/asm/ehv_pic.h +f:arch/powerpc/include/asm/elf.h +f:arch/powerpc/include/asm/elfnote.h +f:arch/powerpc/include/asm/emergency-restart.h +f:arch/powerpc/include/asm/emulated_ops.h +f:arch/powerpc/include/asm/epapr_hcalls.h +f:arch/powerpc/include/asm/exception-64e.h +f:arch/powerpc/include/asm/exception-64s.h +f:arch/powerpc/include/asm/exec.h +f:arch/powerpc/include/asm/extable.h +f:arch/powerpc/include/asm/fadump-internal.h +f:arch/powerpc/include/asm/fadump.h +f:arch/powerpc/include/asm/feature-fixups.h +f:arch/powerpc/include/asm/firmware.h +f:arch/powerpc/include/asm/fixmap.h +f:arch/powerpc/include/asm/floppy.h +f:arch/powerpc/include/asm/fpu.h +f:arch/powerpc/include/asm/fsl_gtm.h +f:arch/powerpc/include/asm/fsl_hcalls.h +f:arch/powerpc/include/asm/fsl_lbc.h +f:arch/powerpc/include/asm/fsl_pamu_stash.h +f:arch/powerpc/include/asm/fsl_pm.h +f:arch/powerpc/include/asm/ftrace.h +f:arch/powerpc/include/asm/futex.h +f:arch/powerpc/include/asm/grackle.h +f:arch/powerpc/include/asm/guest-state-buffer.h +f:arch/powerpc/include/asm/hardirq.h +f:arch/powerpc/include/asm/head-64.h +f:arch/powerpc/include/asm/heathrow.h +f:arch/powerpc/include/asm/highmem.h +f:arch/powerpc/include/asm/hmi.h +f:arch/powerpc/include/asm/hugetlb.h +f:arch/powerpc/include/asm/hvcall.h +f:arch/powerpc/include/asm/hvconsole.h +f:arch/powerpc/include/asm/hvcserver.h +f:arch/powerpc/include/asm/hvsi.h +f:arch/powerpc/include/asm/hw_breakpoint.h +f:arch/powerpc/include/asm/hw_irq.h +f:arch/powerpc/include/asm/hydra.h +f:arch/powerpc/include/asm/i8259.h +f:arch/powerpc/include/asm/ibmebus.h +f:arch/powerpc/include/asm/icswx.h +f:arch/powerpc/include/asm/idle.h +f:arch/powerpc/include/asm/imc-pmu.h +f:arch/powerpc/include/asm/immap_cpm2.h +f:arch/powerpc/include/asm/inst.h +f:arch/powerpc/include/asm/interrupt.h +f:arch/powerpc/include/asm/io-defs.h +f:arch/powerpc/include/asm/io.h +f:arch/powerpc/include/asm/io_event_irq.h +f:arch/powerpc/include/asm/iommu.h +f:arch/powerpc/include/asm/ipic.h +f:arch/powerpc/include/asm/irq.h +f:arch/powerpc/include/asm/irq_work.h +f:arch/powerpc/include/asm/irqflags.h +f:arch/powerpc/include/asm/isa-bridge.h +f:arch/powerpc/include/asm/jump_label.h +f:arch/powerpc/include/asm/kasan.h +f:arch/powerpc/include/asm/kdebug.h +f:arch/powerpc/include/asm/kdump.h +f:arch/powerpc/include/asm/kexec.h +f:arch/powerpc/include/asm/kexec_ranges.h +f:arch/powerpc/include/asm/keylargo.h +f:arch/powerpc/include/asm/kfence.h +f:arch/powerpc/include/asm/kgdb.h +f:arch/powerpc/include/asm/kprobes.h +f:arch/powerpc/include/asm/kup.h +f:arch/powerpc/include/asm/kvm_asm.h +f:arch/powerpc/include/asm/kvm_book3s.h +f:arch/powerpc/include/asm/kvm_book3s_32.h +f:arch/powerpc/include/asm/kvm_book3s_64.h +f:arch/powerpc/include/asm/kvm_book3s_asm.h +f:arch/powerpc/include/asm/kvm_book3s_uvmem.h +f:arch/powerpc/include/asm/kvm_booke.h +f:arch/powerpc/include/asm/kvm_booke_hv_asm.h +f:arch/powerpc/include/asm/kvm_fpu.h +f:arch/powerpc/include/asm/kvm_guest.h +f:arch/powerpc/include/asm/kvm_host.h +f:arch/powerpc/include/asm/kvm_para.h +f:arch/powerpc/include/asm/kvm_ppc.h +f:arch/powerpc/include/asm/libata-portmap.h +f:arch/powerpc/include/asm/linkage.h +f:arch/powerpc/include/asm/livepatch.h +f:arch/powerpc/include/asm/local.h +f:arch/powerpc/include/asm/lppaca.h +f:arch/powerpc/include/asm/lv1call.h +f:arch/powerpc/include/asm/machdep.h +f:arch/powerpc/include/asm/macio.h +f:arch/powerpc/include/asm/mc146818rtc.h +f:arch/powerpc/include/asm/mce.h +f:arch/powerpc/include/asm/mediabay.h +f:arch/powerpc/include/asm/mem_encrypt.h +f:arch/powerpc/include/asm/membarrier.h +f:arch/powerpc/include/asm/mman.h +f:arch/powerpc/include/asm/mmiowb.h +f:arch/powerpc/include/asm/mmu.h +f:arch/powerpc/include/asm/mmu_context.h +f:arch/powerpc/include/asm/mmzone.h +f:arch/powerpc/include/asm/module.h +f:arch/powerpc/include/asm/module.lds.h +f:arch/powerpc/include/asm/mpc5121.h +f:arch/powerpc/include/asm/mpc52xx.h +f:arch/powerpc/include/asm/mpc52xx_psc.h +f:arch/powerpc/include/asm/mpc5xxx.h +f:arch/powerpc/include/asm/mpc6xx.h +f:arch/powerpc/include/asm/mpc85xx.h +f:arch/powerpc/include/asm/mpic.h +f:arch/powerpc/include/asm/mpic_msgr.h +f:arch/powerpc/include/asm/mpic_timer.h +f:arch/powerpc/include/asm/msi_bitmap.h +f:arch/powerpc/include/asm/nmi.h +f:arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h +f:arch/powerpc/include/asm/nohash/32/kup-8xx.h +f:arch/powerpc/include/asm/nohash/32/mmu-44x.h +f:arch/powerpc/include/asm/nohash/32/mmu-8xx.h +f:arch/powerpc/include/asm/nohash/32/pgalloc.h +f:arch/powerpc/include/asm/nohash/32/pgtable.h +f:arch/powerpc/include/asm/nohash/32/pte-44x.h +f:arch/powerpc/include/asm/nohash/32/pte-85xx.h +f:arch/powerpc/include/asm/nohash/32/pte-8xx.h +f:arch/powerpc/include/asm/nohash/64/pgalloc.h +f:arch/powerpc/include/asm/nohash/64/pgtable-4k.h +f:arch/powerpc/include/asm/nohash/64/pgtable.h +f:arch/powerpc/include/asm/nohash/hugetlb-e500.h +f:arch/powerpc/include/asm/nohash/kup-booke.h +f:arch/powerpc/include/asm/nohash/mmu-e500.h +f:arch/powerpc/include/asm/nohash/mmu.h +f:arch/powerpc/include/asm/nohash/pgalloc.h +f:arch/powerpc/include/asm/nohash/pgtable.h +f:arch/powerpc/include/asm/nohash/pte-e500.h +f:arch/powerpc/include/asm/nohash/tlbflush.h +f:arch/powerpc/include/asm/nvram.h +f:arch/powerpc/include/asm/ohare.h +f:arch/powerpc/include/asm/opal-api.h +f:arch/powerpc/include/asm/opal.h +f:arch/powerpc/include/asm/paca.h +f:arch/powerpc/include/asm/page.h +f:arch/powerpc/include/asm/page_32.h +f:arch/powerpc/include/asm/page_64.h +f:arch/powerpc/include/asm/papr-sysparm.h +f:arch/powerpc/include/asm/paravirt.h +f:arch/powerpc/include/asm/paravirt_api_clock.h +f:arch/powerpc/include/asm/parport.h +f:arch/powerpc/include/asm/pasemi_dma.h +f:arch/powerpc/include/asm/pci-bridge.h +f:arch/powerpc/include/asm/pci.h +f:arch/powerpc/include/asm/percpu.h +f:arch/powerpc/include/asm/perf_event.h +f:arch/powerpc/include/asm/perf_event_fsl_emb.h +f:arch/powerpc/include/asm/perf_event_server.h +f:arch/powerpc/include/asm/pgalloc.h +f:arch/powerpc/include/asm/pgtable-be-types.h +f:arch/powerpc/include/asm/pgtable-masks.h +f:arch/powerpc/include/asm/pgtable-types.h +f:arch/powerpc/include/asm/pgtable.h +f:arch/powerpc/include/asm/pkeys.h +f:arch/powerpc/include/asm/plpar_wrappers.h +f:arch/powerpc/include/asm/plpks.h +f:arch/powerpc/include/asm/pmac_feature.h +f:arch/powerpc/include/asm/pmac_low_i2c.h +f:arch/powerpc/include/asm/pmac_pfunc.h +f:arch/powerpc/include/asm/pmc.h +f:arch/powerpc/include/asm/pnv-ocxl.h +f:arch/powerpc/include/asm/pnv-pci.h +f:arch/powerpc/include/asm/powernv.h +f:arch/powerpc/include/asm/ppc-opcode.h +f:arch/powerpc/include/asm/ppc-pci.h +f:arch/powerpc/include/asm/ppc4xx.h +f:arch/powerpc/include/asm/ppc_asm.h +f:arch/powerpc/include/asm/preempt.h +f:arch/powerpc/include/asm/probes.h +f:arch/powerpc/include/asm/processor.h +f:arch/powerpc/include/asm/prom.h +f:arch/powerpc/include/asm/ps3.h +f:arch/powerpc/include/asm/ps3av.h +f:arch/powerpc/include/asm/ps3gpu.h +f:arch/powerpc/include/asm/ps3stor.h +f:arch/powerpc/include/asm/pte-walk.h +f:arch/powerpc/include/asm/ptrace.h +f:arch/powerpc/include/asm/qspinlock.h +f:arch/powerpc/include/asm/qspinlock_types.h +f:arch/powerpc/include/asm/reg.h +f:arch/powerpc/include/asm/reg_8xx.h +f:arch/powerpc/include/asm/reg_booke.h +f:arch/powerpc/include/asm/reg_fsl_emb.h +f:arch/powerpc/include/asm/rheap.h +f:arch/powerpc/include/asm/rio.h +f:arch/powerpc/include/asm/rtas-types.h +f:arch/powerpc/include/asm/rtas-work-area.h +f:arch/powerpc/include/asm/rtas.h +f:arch/powerpc/include/asm/runlatch.h +f:arch/powerpc/include/asm/seccomp.h +f:arch/powerpc/include/asm/sections.h +f:arch/powerpc/include/asm/secure_boot.h +f:arch/powerpc/include/asm/security_features.h +f:arch/powerpc/include/asm/secvar.h +f:arch/powerpc/include/asm/serial.h +f:arch/powerpc/include/asm/set_memory.h +f:arch/powerpc/include/asm/setjmp.h +f:arch/powerpc/include/asm/setup.h +f:arch/powerpc/include/asm/sfp-machine.h +f:arch/powerpc/include/asm/shmparam.h +f:arch/powerpc/include/asm/signal.h +f:arch/powerpc/include/asm/simple_spinlock.h +f:arch/powerpc/include/asm/simple_spinlock_types.h +f:arch/powerpc/include/asm/smp.h +f:arch/powerpc/include/asm/smu.h +f:arch/powerpc/include/asm/sparsemem.h +f:arch/powerpc/include/asm/spinlock.h +f:arch/powerpc/include/asm/spinlock_types.h +f:arch/powerpc/include/asm/spu.h +f:arch/powerpc/include/asm/spu_csa.h +f:arch/powerpc/include/asm/spu_info.h +f:arch/powerpc/include/asm/spu_priv1.h +f:arch/powerpc/include/asm/sstep.h +f:arch/powerpc/include/asm/stackprotector.h +f:arch/powerpc/include/asm/stacktrace.h +f:arch/powerpc/include/asm/static_call.h +f:arch/powerpc/include/asm/string.h +f:arch/powerpc/include/asm/svm.h +f:arch/powerpc/include/asm/swab.h +f:arch/powerpc/include/asm/swiotlb.h +f:arch/powerpc/include/asm/switch_to.h +f:arch/powerpc/include/asm/synch.h +f:arch/powerpc/include/asm/syscall.h +f:arch/powerpc/include/asm/syscall_wrapper.h +f:arch/powerpc/include/asm/syscalls.h +f:arch/powerpc/include/asm/syscalls_32.h +f:arch/powerpc/include/asm/systemcfg.h +f:arch/powerpc/include/asm/task_size_32.h +f:arch/powerpc/include/asm/task_size_64.h +f:arch/powerpc/include/asm/tce.h +f:arch/powerpc/include/asm/text-patching.h +f:arch/powerpc/include/asm/thread_info.h +f:arch/powerpc/include/asm/time.h +f:arch/powerpc/include/asm/timex.h +f:arch/powerpc/include/asm/tlb.h +f:arch/powerpc/include/asm/tlbflush.h +f:arch/powerpc/include/asm/tm.h +f:arch/powerpc/include/asm/topology.h +f:arch/powerpc/include/asm/trace.h +f:arch/powerpc/include/asm/trace_clock.h +f:arch/powerpc/include/asm/tsi108.h +f:arch/powerpc/include/asm/tsi108_irq.h +f:arch/powerpc/include/asm/tsi108_pci.h +f:arch/powerpc/include/asm/types.h +f:arch/powerpc/include/asm/uaccess.h +f:arch/powerpc/include/asm/udbg.h +f:arch/powerpc/include/asm/uic.h +f:arch/powerpc/include/asm/ultravisor-api.h +f:arch/powerpc/include/asm/ultravisor.h +f:arch/powerpc/include/asm/uninorth.h +f:arch/powerpc/include/asm/unistd.h +f:arch/powerpc/include/asm/uprobes.h +f:arch/powerpc/include/asm/user.h +f:arch/powerpc/include/asm/vas.h +f:arch/powerpc/include/asm/vdso.h +f:arch/powerpc/include/asm/vdso/arch_data.h +f:arch/powerpc/include/asm/vdso/clocksource.h +f:arch/powerpc/include/asm/vdso/getrandom.h +f:arch/powerpc/include/asm/vdso/gettimeofday.h +f:arch/powerpc/include/asm/vdso/processor.h +f:arch/powerpc/include/asm/vdso/timebase.h +f:arch/powerpc/include/asm/vdso/vsyscall.h +f:arch/powerpc/include/asm/vdso_datapage.h +f:arch/powerpc/include/asm/vermagic.h +f:arch/powerpc/include/asm/vga.h +f:arch/powerpc/include/asm/video.h +f:arch/powerpc/include/asm/vio.h +f:arch/powerpc/include/asm/vmalloc.h +f:arch/powerpc/include/asm/vphn.h +f:arch/powerpc/include/asm/word-at-a-time.h +f:arch/powerpc/include/asm/xics.h +f:arch/powerpc/include/asm/xive-regs.h +f:arch/powerpc/include/asm/xive.h +f:arch/powerpc/include/asm/xmon.h +f:arch/powerpc/include/asm/xor.h +f:arch/powerpc/include/asm/xor_altivec.h +f:arch/powerpc/include/uapi/asm/Kbuild +f:arch/powerpc/include/uapi/asm/auxvec.h +f:arch/powerpc/include/uapi/asm/bitsperlong.h +f:arch/powerpc/include/uapi/asm/bootx.h +f:arch/powerpc/include/uapi/asm/byteorder.h +f:arch/powerpc/include/uapi/asm/cputable.h +f:arch/powerpc/include/uapi/asm/eeh.h +f:arch/powerpc/include/uapi/asm/elf.h +f:arch/powerpc/include/uapi/asm/epapr_hcalls.h +f:arch/powerpc/include/uapi/asm/errno.h +f:arch/powerpc/include/uapi/asm/fcntl.h +f:arch/powerpc/include/uapi/asm/ioctl.h +f:arch/powerpc/include/uapi/asm/ioctls.h +f:arch/powerpc/include/uapi/asm/ipcbuf.h +f:arch/powerpc/include/uapi/asm/kvm.h +f:arch/powerpc/include/uapi/asm/kvm_para.h +f:arch/powerpc/include/uapi/asm/mman.h +f:arch/powerpc/include/uapi/asm/msgbuf.h +f:arch/powerpc/include/uapi/asm/nvram.h +f:arch/powerpc/include/uapi/asm/opal-prd.h +f:arch/powerpc/include/uapi/asm/papr-indices.h +f:arch/powerpc/include/uapi/asm/papr-miscdev.h +f:arch/powerpc/include/uapi/asm/papr-physical-attestation.h +f:arch/powerpc/include/uapi/asm/papr-platform-dump.h +f:arch/powerpc/include/uapi/asm/papr-sysparm.h +f:arch/powerpc/include/uapi/asm/papr-vpd.h +f:arch/powerpc/include/uapi/asm/perf_event.h +f:arch/powerpc/include/uapi/asm/perf_regs.h +f:arch/powerpc/include/uapi/asm/posix_types.h +f:arch/powerpc/include/uapi/asm/ps3fb.h +f:arch/powerpc/include/uapi/asm/ptrace.h +f:arch/powerpc/include/uapi/asm/sembuf.h +f:arch/powerpc/include/uapi/asm/setup.h +f:arch/powerpc/include/uapi/asm/shmbuf.h +f:arch/powerpc/include/uapi/asm/sigcontext.h +f:arch/powerpc/include/uapi/asm/signal.h +f:arch/powerpc/include/uapi/asm/socket.h +f:arch/powerpc/include/uapi/asm/spu_info.h +f:arch/powerpc/include/uapi/asm/stat.h +f:arch/powerpc/include/uapi/asm/swab.h +f:arch/powerpc/include/uapi/asm/termbits.h +f:arch/powerpc/include/uapi/asm/termios.h +f:arch/powerpc/include/uapi/asm/tm.h +f:arch/powerpc/include/uapi/asm/types.h +f:arch/powerpc/include/uapi/asm/ucontext.h +f:arch/powerpc/include/uapi/asm/unistd.h +f:arch/powerpc/include/uapi/asm/vas-api.h +f:arch/powerpc/kernel/.gitignore +f:arch/powerpc/kernel/85xx_entry_mapping.S +f:arch/powerpc/kernel/Makefile +f:arch/powerpc/kernel/align.c +f:arch/powerpc/kernel/asm-offsets.c +f:arch/powerpc/kernel/audit.c +f:arch/powerpc/kernel/audit_32.h +f:arch/powerpc/kernel/btext.c +f:arch/powerpc/kernel/cacheinfo.c +f:arch/powerpc/kernel/cacheinfo.h +f:arch/powerpc/kernel/compat_audit.c +f:arch/powerpc/kernel/cpu_setup_44x.S +f:arch/powerpc/kernel/cpu_setup_6xx.S +f:arch/powerpc/kernel/cpu_setup_e500.S +f:arch/powerpc/kernel/cpu_setup_pa6t.S +f:arch/powerpc/kernel/cpu_setup_power.c +f:arch/powerpc/kernel/cpu_setup_ppc970.S +f:arch/powerpc/kernel/cpu_specs.h +f:arch/powerpc/kernel/cpu_specs_44x.h +f:arch/powerpc/kernel/cpu_specs_47x.h +f:arch/powerpc/kernel/cpu_specs_85xx.h +f:arch/powerpc/kernel/cpu_specs_8xx.h +f:arch/powerpc/kernel/cpu_specs_book3s_32.h +f:arch/powerpc/kernel/cpu_specs_book3s_64.h +f:arch/powerpc/kernel/cpu_specs_e500mc.h +f:arch/powerpc/kernel/cputable.c +f:arch/powerpc/kernel/crash_dump.c +f:arch/powerpc/kernel/dawr.c +f:arch/powerpc/kernel/dbell.c +f:arch/powerpc/kernel/dexcr.c +f:arch/powerpc/kernel/dma-iommu.c +f:arch/powerpc/kernel/dma-mask.c +f:arch/powerpc/kernel/dma-swiotlb.c +f:arch/powerpc/kernel/dt_cpu_ftrs.c +f:arch/powerpc/kernel/early_32.c +f:arch/powerpc/kernel/eeh.c +f:arch/powerpc/kernel/eeh_cache.c +f:arch/powerpc/kernel/eeh_driver.c +f:arch/powerpc/kernel/eeh_event.c +f:arch/powerpc/kernel/eeh_pe.c +f:arch/powerpc/kernel/eeh_sysfs.c +f:arch/powerpc/kernel/entry_32.S +f:arch/powerpc/kernel/epapr_hcalls.S +f:arch/powerpc/kernel/epapr_paravirt.c +f:arch/powerpc/kernel/exceptions-64e.S +f:arch/powerpc/kernel/exceptions-64s.S +f:arch/powerpc/kernel/fadump.c +f:arch/powerpc/kernel/firmware.c +f:arch/powerpc/kernel/fpu.S +f:arch/powerpc/kernel/head_32.h +f:arch/powerpc/kernel/head_44x.S +f:arch/powerpc/kernel/head_64.S +f:arch/powerpc/kernel/head_85xx.S +f:arch/powerpc/kernel/head_8xx.S +f:arch/powerpc/kernel/head_book3s_32.S +f:arch/powerpc/kernel/head_booke.h +f:arch/powerpc/kernel/hw_breakpoint.c +f:arch/powerpc/kernel/hw_breakpoint_constraints.c +f:arch/powerpc/kernel/idle.c +f:arch/powerpc/kernel/idle_64e.S +f:arch/powerpc/kernel/idle_6xx.S +f:arch/powerpc/kernel/idle_85xx.S +f:arch/powerpc/kernel/idle_book3s.S +f:arch/powerpc/kernel/ima_arch.c +f:arch/powerpc/kernel/interrupt.c +f:arch/powerpc/kernel/interrupt_64.S +f:arch/powerpc/kernel/io.c +f:arch/powerpc/kernel/iomap.c +f:arch/powerpc/kernel/iommu.c +f:arch/powerpc/kernel/irq.c +f:arch/powerpc/kernel/irq_64.c +f:arch/powerpc/kernel/isa-bridge.c +f:arch/powerpc/kernel/jump_label.c +f:arch/powerpc/kernel/kdebugfs.c +f:arch/powerpc/kernel/kgdb.c +f:arch/powerpc/kernel/kprobes-ftrace.c +f:arch/powerpc/kernel/kprobes.c +f:arch/powerpc/kernel/kvm.c +f:arch/powerpc/kernel/kvm_emul.S +f:arch/powerpc/kernel/l2cr_6xx.S +f:arch/powerpc/kernel/legacy_serial.c +f:arch/powerpc/kernel/mce.c +f:arch/powerpc/kernel/mce_power.c +f:arch/powerpc/kernel/misc.S +f:arch/powerpc/kernel/misc_32.S +f:arch/powerpc/kernel/misc_64.S +f:arch/powerpc/kernel/module.c +f:arch/powerpc/kernel/module_32.c +f:arch/powerpc/kernel/module_64.c +f:arch/powerpc/kernel/msi.c +f:arch/powerpc/kernel/note.S +f:arch/powerpc/kernel/nvram_64.c +f:arch/powerpc/kernel/optprobes.c +f:arch/powerpc/kernel/optprobes_head.S +f:arch/powerpc/kernel/paca.c +f:arch/powerpc/kernel/pci-common.c +f:arch/powerpc/kernel/pci-hotplug.c +f:arch/powerpc/kernel/pci_32.c +f:arch/powerpc/kernel/pci_64.c +f:arch/powerpc/kernel/pci_dn.c +f:arch/powerpc/kernel/pci_of_scan.c +f:arch/powerpc/kernel/pmc.c +f:arch/powerpc/kernel/ppc_save_regs.S +f:arch/powerpc/kernel/proc_powerpc.c +f:arch/powerpc/kernel/process.c +f:arch/powerpc/kernel/prom.c +f:arch/powerpc/kernel/prom_entry_64.S +f:arch/powerpc/kernel/prom_init.c +f:arch/powerpc/kernel/prom_init_check.sh +f:arch/powerpc/kernel/prom_parse.c +f:arch/powerpc/kernel/ptrace/Makefile +f:arch/powerpc/kernel/ptrace/ptrace-adv.c +f:arch/powerpc/kernel/ptrace/ptrace-altivec.c +f:arch/powerpc/kernel/ptrace/ptrace-decl.h +f:arch/powerpc/kernel/ptrace/ptrace-fpu.c +f:arch/powerpc/kernel/ptrace/ptrace-noadv.c +f:arch/powerpc/kernel/ptrace/ptrace-novsx.c +f:arch/powerpc/kernel/ptrace/ptrace-spe.c +f:arch/powerpc/kernel/ptrace/ptrace-tm.c +f:arch/powerpc/kernel/ptrace/ptrace-view.c +f:arch/powerpc/kernel/ptrace/ptrace-vsx.c +f:arch/powerpc/kernel/ptrace/ptrace.c +f:arch/powerpc/kernel/ptrace/ptrace32.c +f:arch/powerpc/kernel/reloc_32.S +f:arch/powerpc/kernel/reloc_64.S +f:arch/powerpc/kernel/rethook.c +f:arch/powerpc/kernel/rtas-proc.c +f:arch/powerpc/kernel/rtas-rtc.c +f:arch/powerpc/kernel/rtas.c +f:arch/powerpc/kernel/rtas_entry.S +f:arch/powerpc/kernel/rtas_flash.c +f:arch/powerpc/kernel/rtas_pci.c +f:arch/powerpc/kernel/rtasd.c +f:arch/powerpc/kernel/secure_boot.c +f:arch/powerpc/kernel/security.c +f:arch/powerpc/kernel/secvar-ops.c +f:arch/powerpc/kernel/secvar-sysfs.c +f:arch/powerpc/kernel/setup-common.c +f:arch/powerpc/kernel/setup.h +f:arch/powerpc/kernel/setup_32.c +f:arch/powerpc/kernel/setup_64.c +f:arch/powerpc/kernel/signal.c +f:arch/powerpc/kernel/signal.h +f:arch/powerpc/kernel/signal_32.c +f:arch/powerpc/kernel/signal_64.c +f:arch/powerpc/kernel/smp-tbsync.c +f:arch/powerpc/kernel/smp.c +f:arch/powerpc/kernel/stacktrace.c +f:arch/powerpc/kernel/static_call.c +f:arch/powerpc/kernel/suspend.c +f:arch/powerpc/kernel/switch.S +f:arch/powerpc/kernel/swsusp.c +f:arch/powerpc/kernel/swsusp_32.S +f:arch/powerpc/kernel/swsusp_64.c +f:arch/powerpc/kernel/swsusp_85xx.S +f:arch/powerpc/kernel/swsusp_asm64.S +f:arch/powerpc/kernel/sys_ppc32.c +f:arch/powerpc/kernel/syscall.c +f:arch/powerpc/kernel/syscalls.c +f:arch/powerpc/kernel/syscalls/Makefile +f:arch/powerpc/kernel/syscalls/syscall.tbl +f:arch/powerpc/kernel/sysfs.c +f:arch/powerpc/kernel/systbl.c +f:arch/powerpc/kernel/tau_6xx.c +f:arch/powerpc/kernel/time.c +f:arch/powerpc/kernel/tm.S +f:arch/powerpc/kernel/trace/Makefile +f:arch/powerpc/kernel/trace/ftrace.c +f:arch/powerpc/kernel/trace/ftrace_64_pg.c +f:arch/powerpc/kernel/trace/ftrace_64_pg_entry.S +f:arch/powerpc/kernel/trace/ftrace_entry.S +f:arch/powerpc/kernel/trace/trace_clock.c +f:arch/powerpc/kernel/traps.c +f:arch/powerpc/kernel/ucall.S +f:arch/powerpc/kernel/udbg.c +f:arch/powerpc/kernel/udbg_16550.c +f:arch/powerpc/kernel/uprobes.c +f:arch/powerpc/kernel/vdso.c +f:arch/powerpc/kernel/vdso/.gitignore +f:arch/powerpc/kernel/vdso/Makefile +f:arch/powerpc/kernel/vdso/cacheflush.S +f:arch/powerpc/kernel/vdso/datapage.S +f:arch/powerpc/kernel/vdso/gen_vdso32_offsets.sh +f:arch/powerpc/kernel/vdso/gen_vdso64_offsets.sh +f:arch/powerpc/kernel/vdso/getcpu.S +f:arch/powerpc/kernel/vdso/getrandom.S +f:arch/powerpc/kernel/vdso/gettimeofday.S +f:arch/powerpc/kernel/vdso/note.S +f:arch/powerpc/kernel/vdso/sigtramp32.S +f:arch/powerpc/kernel/vdso/sigtramp64.S +f:arch/powerpc/kernel/vdso/vdso32.lds.S +f:arch/powerpc/kernel/vdso/vdso64.lds.S +f:arch/powerpc/kernel/vdso/vgetrandom-chacha.S +f:arch/powerpc/kernel/vdso/vgetrandom.c +f:arch/powerpc/kernel/vdso/vgettimeofday.c +f:arch/powerpc/kernel/vdso32_wrapper.S +f:arch/powerpc/kernel/vdso64_wrapper.S +f:arch/powerpc/kernel/vecemu.c +f:arch/powerpc/kernel/vector.S +f:arch/powerpc/kernel/vmlinux.lds.S +f:arch/powerpc/kernel/watchdog.c +f:arch/powerpc/kexec/Makefile +f:arch/powerpc/kexec/core.c +f:arch/powerpc/kexec/core_32.c +f:arch/powerpc/kexec/core_64.c +f:arch/powerpc/kexec/crash.c +f:arch/powerpc/kexec/elf_64.c +f:arch/powerpc/kexec/file_load.c +f:arch/powerpc/kexec/file_load_64.c +f:arch/powerpc/kexec/ranges.c +f:arch/powerpc/kexec/relocate_32.S +f:arch/powerpc/kexec/vmcore_info.c +f:arch/powerpc/kvm/Kconfig +f:arch/powerpc/kvm/Makefile +f:arch/powerpc/kvm/book3s.c +f:arch/powerpc/kvm/book3s.h +f:arch/powerpc/kvm/book3s_32_mmu.c +f:arch/powerpc/kvm/book3s_32_mmu_host.c +f:arch/powerpc/kvm/book3s_32_sr.S +f:arch/powerpc/kvm/book3s_64_entry.S +f:arch/powerpc/kvm/book3s_64_mmu.c +f:arch/powerpc/kvm/book3s_64_mmu_host.c +f:arch/powerpc/kvm/book3s_64_mmu_hv.c +f:arch/powerpc/kvm/book3s_64_mmu_radix.c +f:arch/powerpc/kvm/book3s_64_slb.S +f:arch/powerpc/kvm/book3s_64_vio.c +f:arch/powerpc/kvm/book3s_emulate.c +f:arch/powerpc/kvm/book3s_exports.c +f:arch/powerpc/kvm/book3s_hv.c +f:arch/powerpc/kvm/book3s_hv.h +f:arch/powerpc/kvm/book3s_hv_builtin.c +f:arch/powerpc/kvm/book3s_hv_hmi.c +f:arch/powerpc/kvm/book3s_hv_interrupts.S +f:arch/powerpc/kvm/book3s_hv_nested.c +f:arch/powerpc/kvm/book3s_hv_nestedv2.c +f:arch/powerpc/kvm/book3s_hv_p9_entry.c +f:arch/powerpc/kvm/book3s_hv_p9_perf.c +f:arch/powerpc/kvm/book3s_hv_ras.c +f:arch/powerpc/kvm/book3s_hv_rm_mmu.c +f:arch/powerpc/kvm/book3s_hv_rm_xics.c +f:arch/powerpc/kvm/book3s_hv_rmhandlers.S +f:arch/powerpc/kvm/book3s_hv_tm.c +f:arch/powerpc/kvm/book3s_hv_tm_builtin.c +f:arch/powerpc/kvm/book3s_hv_uvmem.c +f:arch/powerpc/kvm/book3s_interrupts.S +f:arch/powerpc/kvm/book3s_mmu_hpte.c +f:arch/powerpc/kvm/book3s_paired_singles.c +f:arch/powerpc/kvm/book3s_pr.c +f:arch/powerpc/kvm/book3s_pr_papr.c +f:arch/powerpc/kvm/book3s_rmhandlers.S +f:arch/powerpc/kvm/book3s_rtas.c +f:arch/powerpc/kvm/book3s_segment.S +f:arch/powerpc/kvm/book3s_xics.c +f:arch/powerpc/kvm/book3s_xics.h +f:arch/powerpc/kvm/book3s_xive.c +f:arch/powerpc/kvm/book3s_xive.h +f:arch/powerpc/kvm/book3s_xive_native.c +f:arch/powerpc/kvm/booke.c +f:arch/powerpc/kvm/booke.h +f:arch/powerpc/kvm/booke_emulate.c +f:arch/powerpc/kvm/booke_interrupts.S +f:arch/powerpc/kvm/bookehv_interrupts.S +f:arch/powerpc/kvm/e500.c +f:arch/powerpc/kvm/e500.h +f:arch/powerpc/kvm/e500_emulate.c +f:arch/powerpc/kvm/e500_mmu.c +f:arch/powerpc/kvm/e500_mmu_host.c +f:arch/powerpc/kvm/e500_mmu_host.h +f:arch/powerpc/kvm/e500mc.c +f:arch/powerpc/kvm/emulate.c +f:arch/powerpc/kvm/emulate_loadstore.c +f:arch/powerpc/kvm/fpu.S +f:arch/powerpc/kvm/guest-state-buffer.c +f:arch/powerpc/kvm/mpic.c +f:arch/powerpc/kvm/powerpc.c +f:arch/powerpc/kvm/test-guest-state-buffer.c +f:arch/powerpc/kvm/timing.c +f:arch/powerpc/kvm/timing.h +f:arch/powerpc/kvm/tm.S +f:arch/powerpc/kvm/trace.h +f:arch/powerpc/kvm/trace_book3s.h +f:arch/powerpc/kvm/trace_booke.h +f:arch/powerpc/kvm/trace_hv.h +f:arch/powerpc/kvm/trace_pr.h +f:arch/powerpc/lib/Makefile +f:arch/powerpc/lib/checksum_32.S +f:arch/powerpc/lib/checksum_64.S +f:arch/powerpc/lib/checksum_wrappers.c +f:arch/powerpc/lib/code-patching.c +f:arch/powerpc/lib/copy_32.S +f:arch/powerpc/lib/copy_mc_64.S +f:arch/powerpc/lib/copypage_64.S +f:arch/powerpc/lib/copypage_power7.S +f:arch/powerpc/lib/copyuser_64.S +f:arch/powerpc/lib/copyuser_power7.S +f:arch/powerpc/lib/crtsavres.S +f:arch/powerpc/lib/div64.S +f:arch/powerpc/lib/error-inject.c +f:arch/powerpc/lib/feature-fixups-test.S +f:arch/powerpc/lib/feature-fixups.c +f:arch/powerpc/lib/hweight_64.S +f:arch/powerpc/lib/ldstfp.S +f:arch/powerpc/lib/locks.c +f:arch/powerpc/lib/mem_64.S +f:arch/powerpc/lib/memcmp_32.S +f:arch/powerpc/lib/memcmp_64.S +f:arch/powerpc/lib/memcpy_64.S +f:arch/powerpc/lib/memcpy_power7.S +f:arch/powerpc/lib/pmem.c +f:arch/powerpc/lib/qspinlock.c +f:arch/powerpc/lib/quad.S +f:arch/powerpc/lib/restart_table.c +f:arch/powerpc/lib/rheap.c +f:arch/powerpc/lib/sstep.c +f:arch/powerpc/lib/string.S +f:arch/powerpc/lib/string_32.S +f:arch/powerpc/lib/string_64.S +f:arch/powerpc/lib/strlen_32.S +f:arch/powerpc/lib/test-code-patching.c +f:arch/powerpc/lib/test_emulate_step.c +f:arch/powerpc/lib/test_emulate_step_exec_instr.S +f:arch/powerpc/lib/vmx-helper.c +f:arch/powerpc/lib/xor_vmx.c +f:arch/powerpc/lib/xor_vmx.h +f:arch/powerpc/lib/xor_vmx_glue.c +f:arch/powerpc/math-emu/Makefile +f:arch/powerpc/math-emu/fabs.c +f:arch/powerpc/math-emu/fadd.c +f:arch/powerpc/math-emu/fadds.c +f:arch/powerpc/math-emu/fcmpo.c +f:arch/powerpc/math-emu/fcmpu.c +f:arch/powerpc/math-emu/fctiw.c +f:arch/powerpc/math-emu/fctiwz.c +f:arch/powerpc/math-emu/fdiv.c +f:arch/powerpc/math-emu/fdivs.c +f:arch/powerpc/math-emu/fmadd.c +f:arch/powerpc/math-emu/fmadds.c +f:arch/powerpc/math-emu/fmr.c +f:arch/powerpc/math-emu/fmsub.c +f:arch/powerpc/math-emu/fmsubs.c +f:arch/powerpc/math-emu/fmul.c +f:arch/powerpc/math-emu/fmuls.c +f:arch/powerpc/math-emu/fnabs.c +f:arch/powerpc/math-emu/fneg.c +f:arch/powerpc/math-emu/fnmadd.c +f:arch/powerpc/math-emu/fnmadds.c +f:arch/powerpc/math-emu/fnmsub.c +f:arch/powerpc/math-emu/fnmsubs.c +f:arch/powerpc/math-emu/fre.c +f:arch/powerpc/math-emu/fres.c +f:arch/powerpc/math-emu/frsp.c +f:arch/powerpc/math-emu/frsqrte.c +f:arch/powerpc/math-emu/frsqrtes.c +f:arch/powerpc/math-emu/fsel.c +f:arch/powerpc/math-emu/fsqrt.c +f:arch/powerpc/math-emu/fsqrts.c +f:arch/powerpc/math-emu/fsub.c +f:arch/powerpc/math-emu/fsubs.c +f:arch/powerpc/math-emu/lfd.c +f:arch/powerpc/math-emu/lfs.c +f:arch/powerpc/math-emu/math.c +f:arch/powerpc/math-emu/math_efp.c +f:arch/powerpc/math-emu/mcrfs.c +f:arch/powerpc/math-emu/mffs.c +f:arch/powerpc/math-emu/mtfsb0.c +f:arch/powerpc/math-emu/mtfsb1.c +f:arch/powerpc/math-emu/mtfsf.c +f:arch/powerpc/math-emu/mtfsfi.c +f:arch/powerpc/math-emu/stfd.c +f:arch/powerpc/math-emu/stfiwx.c +f:arch/powerpc/math-emu/stfs.c +f:arch/powerpc/math-emu/udivmodti4.c +f:arch/powerpc/mm/Makefile +f:arch/powerpc/mm/book3s32/Makefile +f:arch/powerpc/mm/book3s32/hash_low.S +f:arch/powerpc/mm/book3s32/kuap.c +f:arch/powerpc/mm/book3s32/mmu.c +f:arch/powerpc/mm/book3s32/mmu_context.c +f:arch/powerpc/mm/book3s32/nohash_low.S +f:arch/powerpc/mm/book3s32/tlb.c +f:arch/powerpc/mm/book3s64/Makefile +f:arch/powerpc/mm/book3s64/hash_4k.c +f:arch/powerpc/mm/book3s64/hash_64k.c +f:arch/powerpc/mm/book3s64/hash_hugepage.c +f:arch/powerpc/mm/book3s64/hash_native.c +f:arch/powerpc/mm/book3s64/hash_pgtable.c +f:arch/powerpc/mm/book3s64/hash_tlb.c +f:arch/powerpc/mm/book3s64/hash_utils.c +f:arch/powerpc/mm/book3s64/hugetlbpage.c +f:arch/powerpc/mm/book3s64/internal.h +f:arch/powerpc/mm/book3s64/iommu_api.c +f:arch/powerpc/mm/book3s64/mmu_context.c +f:arch/powerpc/mm/book3s64/pgtable.c +f:arch/powerpc/mm/book3s64/pkeys.c +f:arch/powerpc/mm/book3s64/radix_hugetlbpage.c +f:arch/powerpc/mm/book3s64/radix_pgtable.c +f:arch/powerpc/mm/book3s64/radix_tlb.c +f:arch/powerpc/mm/book3s64/slb.c +f:arch/powerpc/mm/book3s64/slice.c +f:arch/powerpc/mm/book3s64/subpage_prot.c +f:arch/powerpc/mm/book3s64/trace.c +f:arch/powerpc/mm/cacheflush.c +f:arch/powerpc/mm/copro_fault.c +f:arch/powerpc/mm/dma-noncoherent.c +f:arch/powerpc/mm/drmem.c +f:arch/powerpc/mm/fault.c +f:arch/powerpc/mm/hugetlbpage.c +f:arch/powerpc/mm/init-common.c +f:arch/powerpc/mm/init_32.c +f:arch/powerpc/mm/init_64.c +f:arch/powerpc/mm/ioremap.c +f:arch/powerpc/mm/ioremap_32.c +f:arch/powerpc/mm/ioremap_64.c +f:arch/powerpc/mm/kasan/8xx.c +f:arch/powerpc/mm/kasan/Makefile +f:arch/powerpc/mm/kasan/book3s_32.c +f:arch/powerpc/mm/kasan/init_32.c +f:arch/powerpc/mm/kasan/init_book3e_64.c +f:arch/powerpc/mm/kasan/init_book3s_64.c +f:arch/powerpc/mm/maccess.c +f:arch/powerpc/mm/mem.c +f:arch/powerpc/mm/mmu_context.c +f:arch/powerpc/mm/mmu_decl.h +f:arch/powerpc/mm/nohash/44x.c +f:arch/powerpc/mm/nohash/8xx.c +f:arch/powerpc/mm/nohash/Makefile +f:arch/powerpc/mm/nohash/book3e_pgtable.c +f:arch/powerpc/mm/nohash/e500.c +f:arch/powerpc/mm/nohash/e500_hugetlbpage.c +f:arch/powerpc/mm/nohash/kaslr_booke.c +f:arch/powerpc/mm/nohash/kup.c +f:arch/powerpc/mm/nohash/mmu_context.c +f:arch/powerpc/mm/nohash/tlb.c +f:arch/powerpc/mm/nohash/tlb_64e.c +f:arch/powerpc/mm/nohash/tlb_low.S +f:arch/powerpc/mm/nohash/tlb_low_64e.S +f:arch/powerpc/mm/numa.c +f:arch/powerpc/mm/pageattr.c +f:arch/powerpc/mm/pgtable-frag.c +f:arch/powerpc/mm/pgtable.c +f:arch/powerpc/mm/pgtable_32.c +f:arch/powerpc/mm/pgtable_64.c +f:arch/powerpc/mm/ptdump/8xx.c +f:arch/powerpc/mm/ptdump/Makefile +f:arch/powerpc/mm/ptdump/bats.c +f:arch/powerpc/mm/ptdump/book3s64.c +f:arch/powerpc/mm/ptdump/hashpagetable.c +f:arch/powerpc/mm/ptdump/ptdump.c +f:arch/powerpc/mm/ptdump/ptdump.h +f:arch/powerpc/mm/ptdump/segment_regs.c +f:arch/powerpc/mm/ptdump/shared.c +f:arch/powerpc/net/Makefile +f:arch/powerpc/net/bpf_jit.h +f:arch/powerpc/net/bpf_jit_comp.c +f:arch/powerpc/net/bpf_jit_comp32.c +f:arch/powerpc/net/bpf_jit_comp64.c +f:arch/powerpc/perf/8xx-pmu.c +f:arch/powerpc/perf/Makefile +f:arch/powerpc/perf/bhrb.S +f:arch/powerpc/perf/callchain.c +f:arch/powerpc/perf/callchain.h +f:arch/powerpc/perf/callchain_32.c +f:arch/powerpc/perf/callchain_64.c +f:arch/powerpc/perf/core-book3s.c +f:arch/powerpc/perf/core-fsl-emb.c +f:arch/powerpc/perf/e500-pmu.c +f:arch/powerpc/perf/e6500-pmu.c +f:arch/powerpc/perf/generic-compat-pmu.c +f:arch/powerpc/perf/hv-24x7-catalog.h +f:arch/powerpc/perf/hv-24x7-domains.h +f:arch/powerpc/perf/hv-24x7.c +f:arch/powerpc/perf/hv-24x7.h +f:arch/powerpc/perf/hv-common.c +f:arch/powerpc/perf/hv-common.h +f:arch/powerpc/perf/hv-gpci-requests.h +f:arch/powerpc/perf/hv-gpci.c +f:arch/powerpc/perf/hv-gpci.h +f:arch/powerpc/perf/imc-pmu.c +f:arch/powerpc/perf/internal.h +f:arch/powerpc/perf/isa207-common.c +f:arch/powerpc/perf/isa207-common.h +f:arch/powerpc/perf/kvm-hv-pmu.c +f:arch/powerpc/perf/mpc7450-pmu.c +f:arch/powerpc/perf/perf_regs.c +f:arch/powerpc/perf/power10-events-list.h +f:arch/powerpc/perf/power10-pmu.c +f:arch/powerpc/perf/power5+-pmu.c +f:arch/powerpc/perf/power5-pmu.c +f:arch/powerpc/perf/power6-pmu.c +f:arch/powerpc/perf/power7-events-list.h +f:arch/powerpc/perf/power7-pmu.c +f:arch/powerpc/perf/power8-events-list.h +f:arch/powerpc/perf/power8-pmu.c +f:arch/powerpc/perf/power9-events-list.h +f:arch/powerpc/perf/power9-pmu.c +f:arch/powerpc/perf/ppc970-pmu.c +f:arch/powerpc/perf/req-gen/_begin.h +f:arch/powerpc/perf/req-gen/_clear.h +f:arch/powerpc/perf/req-gen/_end.h +f:arch/powerpc/perf/req-gen/_request-begin.h +f:arch/powerpc/perf/req-gen/_request-end.h +f:arch/powerpc/perf/req-gen/perf.h +f:arch/powerpc/perf/vpa-pmu.c +f:arch/powerpc/platforms/44x/44x.h +f:arch/powerpc/platforms/44x/Kconfig +f:arch/powerpc/platforms/44x/Makefile +f:arch/powerpc/platforms/44x/canyonlands.c +f:arch/powerpc/platforms/44x/cpm.c +f:arch/powerpc/platforms/44x/ebony.c +f:arch/powerpc/platforms/44x/fsp2.c +f:arch/powerpc/platforms/44x/fsp2.h +f:arch/powerpc/platforms/44x/gpio.c +f:arch/powerpc/platforms/44x/hsta_msi.c +f:arch/powerpc/platforms/44x/idle.c +f:arch/powerpc/platforms/44x/iss4xx.c +f:arch/powerpc/platforms/44x/machine_check.c +f:arch/powerpc/platforms/44x/misc_44x.S +f:arch/powerpc/platforms/44x/pci.c +f:arch/powerpc/platforms/44x/pci.h +f:arch/powerpc/platforms/44x/ppc44x_simple.c +f:arch/powerpc/platforms/44x/ppc476.c +f:arch/powerpc/platforms/44x/ppc476_modules.lds +f:arch/powerpc/platforms/44x/sam440ep.c +f:arch/powerpc/platforms/44x/soc.c +f:arch/powerpc/platforms/44x/uic.c +f:arch/powerpc/platforms/44x/warp.c +f:arch/powerpc/platforms/512x/Kconfig +f:arch/powerpc/platforms/512x/Makefile +f:arch/powerpc/platforms/512x/clock-commonclk.c +f:arch/powerpc/platforms/512x/mpc5121_ads.c +f:arch/powerpc/platforms/512x/mpc5121_ads.h +f:arch/powerpc/platforms/512x/mpc5121_ads_cpld.c +f:arch/powerpc/platforms/512x/mpc512x.h +f:arch/powerpc/platforms/512x/mpc512x_generic.c +f:arch/powerpc/platforms/512x/mpc512x_lpbfifo.c +f:arch/powerpc/platforms/512x/mpc512x_shared.c +f:arch/powerpc/platforms/512x/pdm360ng.c +f:arch/powerpc/platforms/52xx/Kconfig +f:arch/powerpc/platforms/52xx/Makefile +f:arch/powerpc/platforms/52xx/efika.c +f:arch/powerpc/platforms/52xx/lite5200.c +f:arch/powerpc/platforms/52xx/lite5200_pm.c +f:arch/powerpc/platforms/52xx/lite5200_sleep.S +f:arch/powerpc/platforms/52xx/media5200.c +f:arch/powerpc/platforms/52xx/mpc5200_simple.c +f:arch/powerpc/platforms/52xx/mpc52xx_common.c +f:arch/powerpc/platforms/52xx/mpc52xx_gpt.c +f:arch/powerpc/platforms/52xx/mpc52xx_pci.c +f:arch/powerpc/platforms/52xx/mpc52xx_pic.c +f:arch/powerpc/platforms/52xx/mpc52xx_pm.c +f:arch/powerpc/platforms/52xx/mpc52xx_sleep.S +f:arch/powerpc/platforms/82xx/Kconfig +f:arch/powerpc/platforms/82xx/Makefile +f:arch/powerpc/platforms/82xx/ep8248e.c +f:arch/powerpc/platforms/82xx/km82xx.c +f:arch/powerpc/platforms/82xx/pq2.c +f:arch/powerpc/platforms/82xx/pq2.h +f:arch/powerpc/platforms/83xx/Kconfig +f:arch/powerpc/platforms/83xx/Makefile +f:arch/powerpc/platforms/83xx/asp834x.c +f:arch/powerpc/platforms/83xx/km83xx.c +f:arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c +f:arch/powerpc/platforms/83xx/misc.c +f:arch/powerpc/platforms/83xx/mpc830x_rdb.c +f:arch/powerpc/platforms/83xx/mpc831x_rdb.c +f:arch/powerpc/platforms/83xx/mpc832x_rdb.c +f:arch/powerpc/platforms/83xx/mpc834x_itx.c +f:arch/powerpc/platforms/83xx/mpc836x_rdk.c +f:arch/powerpc/platforms/83xx/mpc837x_rdb.c +f:arch/powerpc/platforms/83xx/mpc83xx.h +f:arch/powerpc/platforms/83xx/suspend-asm.S +f:arch/powerpc/platforms/83xx/suspend.c +f:arch/powerpc/platforms/83xx/usb_831x.c +f:arch/powerpc/platforms/83xx/usb_834x.c +f:arch/powerpc/platforms/83xx/usb_837x.c +f:arch/powerpc/platforms/85xx/Kconfig +f:arch/powerpc/platforms/85xx/Makefile +f:arch/powerpc/platforms/85xx/bsc913x_qds.c +f:arch/powerpc/platforms/85xx/bsc913x_rdb.c +f:arch/powerpc/platforms/85xx/c293pcie.c +f:arch/powerpc/platforms/85xx/common.c +f:arch/powerpc/platforms/85xx/corenet_generic.c +f:arch/powerpc/platforms/85xx/ge_imp3a.c +f:arch/powerpc/platforms/85xx/ksi8560.c +f:arch/powerpc/platforms/85xx/mpc8536_ds.c +f:arch/powerpc/platforms/85xx/mpc85xx.h +f:arch/powerpc/platforms/85xx/mpc85xx_8259.c +f:arch/powerpc/platforms/85xx/mpc85xx_ds.c +f:arch/powerpc/platforms/85xx/mpc85xx_mds.c +f:arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c +f:arch/powerpc/platforms/85xx/mpc85xx_rdb.c +f:arch/powerpc/platforms/85xx/mvme2500.c +f:arch/powerpc/platforms/85xx/p1010rdb.c +f:arch/powerpc/platforms/85xx/p1022_ds.c +f:arch/powerpc/platforms/85xx/p1022_rdk.c +f:arch/powerpc/platforms/85xx/p1023_rdb.c +f:arch/powerpc/platforms/85xx/p2020.c +f:arch/powerpc/platforms/85xx/ppa8548.c +f:arch/powerpc/platforms/85xx/qemu_e500.c +f:arch/powerpc/platforms/85xx/sgy_cts1000.c +f:arch/powerpc/platforms/85xx/smp.c +f:arch/powerpc/platforms/85xx/smp.h +f:arch/powerpc/platforms/85xx/socrates.c +f:arch/powerpc/platforms/85xx/socrates_fpga_pic.c +f:arch/powerpc/platforms/85xx/socrates_fpga_pic.h +f:arch/powerpc/platforms/85xx/stx_gp3.c +f:arch/powerpc/platforms/85xx/t1042rdb_diu.c +f:arch/powerpc/platforms/85xx/tqm85xx.c +f:arch/powerpc/platforms/85xx/twr_p102x.c +f:arch/powerpc/platforms/85xx/xes_mpc85xx.c +f:arch/powerpc/platforms/86xx/Kconfig +f:arch/powerpc/platforms/86xx/Makefile +f:arch/powerpc/platforms/86xx/common.c +f:arch/powerpc/platforms/86xx/gef_ppc9a.c +f:arch/powerpc/platforms/86xx/gef_sbc310.c +f:arch/powerpc/platforms/86xx/gef_sbc610.c +f:arch/powerpc/platforms/86xx/mpc86xx.h +f:arch/powerpc/platforms/86xx/mpc86xx_smp.c +f:arch/powerpc/platforms/86xx/mvme7100.c +f:arch/powerpc/platforms/86xx/pic.c +f:arch/powerpc/platforms/8xx/Kconfig +f:arch/powerpc/platforms/8xx/Makefile +f:arch/powerpc/platforms/8xx/adder875.c +f:arch/powerpc/platforms/8xx/cpm1-ic.c +f:arch/powerpc/platforms/8xx/cpm1.c +f:arch/powerpc/platforms/8xx/ep88xc.c +f:arch/powerpc/platforms/8xx/m8xx_setup.c +f:arch/powerpc/platforms/8xx/machine_check.c +f:arch/powerpc/platforms/8xx/micropatch.c +f:arch/powerpc/platforms/8xx/mpc86xads.h +f:arch/powerpc/platforms/8xx/mpc86xads_setup.c +f:arch/powerpc/platforms/8xx/mpc885ads.h +f:arch/powerpc/platforms/8xx/mpc885ads_setup.c +f:arch/powerpc/platforms/8xx/mpc8xx.h +f:arch/powerpc/platforms/8xx/pic.c +f:arch/powerpc/platforms/8xx/pic.h +f:arch/powerpc/platforms/8xx/tqm8xx_setup.c +f:arch/powerpc/platforms/Kconfig +f:arch/powerpc/platforms/Kconfig.cputype +f:arch/powerpc/platforms/Makefile +f:arch/powerpc/platforms/amigaone/Kconfig +f:arch/powerpc/platforms/amigaone/Makefile +f:arch/powerpc/platforms/amigaone/setup.c +f:arch/powerpc/platforms/book3s/Kconfig +f:arch/powerpc/platforms/book3s/Makefile +f:arch/powerpc/platforms/book3s/vas-api.c +f:arch/powerpc/platforms/cell/Kconfig +f:arch/powerpc/platforms/cell/Makefile +f:arch/powerpc/platforms/cell/spu_base.c +f:arch/powerpc/platforms/cell/spu_callbacks.c +f:arch/powerpc/platforms/cell/spu_syscalls.c +f:arch/powerpc/platforms/cell/spufs/.gitignore +f:arch/powerpc/platforms/cell/spufs/Makefile +f:arch/powerpc/platforms/cell/spufs/backing_ops.c +f:arch/powerpc/platforms/cell/spufs/context.c +f:arch/powerpc/platforms/cell/spufs/coredump.c +f:arch/powerpc/platforms/cell/spufs/fault.c +f:arch/powerpc/platforms/cell/spufs/file.c +f:arch/powerpc/platforms/cell/spufs/gang.c +f:arch/powerpc/platforms/cell/spufs/hw_ops.c +f:arch/powerpc/platforms/cell/spufs/inode.c +f:arch/powerpc/platforms/cell/spufs/lscsa_alloc.c +f:arch/powerpc/platforms/cell/spufs/run.c +f:arch/powerpc/platforms/cell/spufs/sched.c +f:arch/powerpc/platforms/cell/spufs/spu_restore.c +f:arch/powerpc/platforms/cell/spufs/spu_restore_crt0.S +f:arch/powerpc/platforms/cell/spufs/spu_restore_dump.h_shipped +f:arch/powerpc/platforms/cell/spufs/spu_save.c +f:arch/powerpc/platforms/cell/spufs/spu_save_crt0.S +f:arch/powerpc/platforms/cell/spufs/spu_save_dump.h_shipped +f:arch/powerpc/platforms/cell/spufs/spu_utils.h +f:arch/powerpc/platforms/cell/spufs/spufs.h +f:arch/powerpc/platforms/cell/spufs/sputrace.h +f:arch/powerpc/platforms/cell/spufs/switch.c +f:arch/powerpc/platforms/cell/spufs/syscalls.c +f:arch/powerpc/platforms/chrp/Kconfig +f:arch/powerpc/platforms/chrp/Makefile +f:arch/powerpc/platforms/chrp/chrp.h +f:arch/powerpc/platforms/chrp/gg2.h +f:arch/powerpc/platforms/chrp/nvram.c +f:arch/powerpc/platforms/chrp/pci.c +f:arch/powerpc/platforms/chrp/pegasos_eth.c +f:arch/powerpc/platforms/chrp/setup.c +f:arch/powerpc/platforms/chrp/smp.c +f:arch/powerpc/platforms/chrp/time.c +f:arch/powerpc/platforms/embedded6xx/Kconfig +f:arch/powerpc/platforms/embedded6xx/Makefile +f:arch/powerpc/platforms/embedded6xx/flipper-pic.c +f:arch/powerpc/platforms/embedded6xx/flipper-pic.h +f:arch/powerpc/platforms/embedded6xx/gamecube.c +f:arch/powerpc/platforms/embedded6xx/hlwd-pic.c +f:arch/powerpc/platforms/embedded6xx/hlwd-pic.h +f:arch/powerpc/platforms/embedded6xx/holly.c +f:arch/powerpc/platforms/embedded6xx/linkstation.c +f:arch/powerpc/platforms/embedded6xx/ls_uart.c +f:arch/powerpc/platforms/embedded6xx/mpc10x.h +f:arch/powerpc/platforms/embedded6xx/mvme5100.c +f:arch/powerpc/platforms/embedded6xx/storcenter.c +f:arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c +f:arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h +f:arch/powerpc/platforms/embedded6xx/wii.c +f:arch/powerpc/platforms/fsl_uli1575.c +f:arch/powerpc/platforms/microwatt/Kconfig +f:arch/powerpc/platforms/microwatt/Makefile +f:arch/powerpc/platforms/microwatt/microwatt.h +f:arch/powerpc/platforms/microwatt/rng.c +f:arch/powerpc/platforms/microwatt/setup.c +f:arch/powerpc/platforms/microwatt/smp.c +f:arch/powerpc/platforms/pasemi/Kconfig +f:arch/powerpc/platforms/pasemi/Makefile +f:arch/powerpc/platforms/pasemi/dma_lib.c +f:arch/powerpc/platforms/pasemi/gpio_mdio.c +f:arch/powerpc/platforms/pasemi/idle.c +f:arch/powerpc/platforms/pasemi/iommu.c +f:arch/powerpc/platforms/pasemi/misc.c +f:arch/powerpc/platforms/pasemi/msi.c +f:arch/powerpc/platforms/pasemi/pasemi.h +f:arch/powerpc/platforms/pasemi/pci.c +f:arch/powerpc/platforms/pasemi/powersave.S +f:arch/powerpc/platforms/pasemi/setup.c +f:arch/powerpc/platforms/pasemi/time.c +f:arch/powerpc/platforms/powermac/Kconfig +f:arch/powerpc/platforms/powermac/Makefile +f:arch/powerpc/platforms/powermac/backlight.c +f:arch/powerpc/platforms/powermac/bootx_init.c +f:arch/powerpc/platforms/powermac/cache.S +f:arch/powerpc/platforms/powermac/feature.c +f:arch/powerpc/platforms/powermac/low_i2c.c +f:arch/powerpc/platforms/powermac/nvram.c +f:arch/powerpc/platforms/powermac/pci.c +f:arch/powerpc/platforms/powermac/pfunc_base.c +f:arch/powerpc/platforms/powermac/pfunc_core.c +f:arch/powerpc/platforms/powermac/pic.c +f:arch/powerpc/platforms/powermac/pmac.h +f:arch/powerpc/platforms/powermac/setup.c +f:arch/powerpc/platforms/powermac/sleep.S +f:arch/powerpc/platforms/powermac/smp.c +f:arch/powerpc/platforms/powermac/time.c +f:arch/powerpc/platforms/powermac/udbg_adb.c +f:arch/powerpc/platforms/powermac/udbg_scc.c +f:arch/powerpc/platforms/powernv/Kconfig +f:arch/powerpc/platforms/powernv/Makefile +f:arch/powerpc/platforms/powernv/copy-paste.h +f:arch/powerpc/platforms/powernv/eeh-powernv.c +f:arch/powerpc/platforms/powernv/idle.c +f:arch/powerpc/platforms/powernv/memtrace.c +f:arch/powerpc/platforms/powernv/ocxl.c +f:arch/powerpc/platforms/powernv/opal-async.c +f:arch/powerpc/platforms/powernv/opal-call.c +f:arch/powerpc/platforms/powernv/opal-core.c +f:arch/powerpc/platforms/powernv/opal-dump.c +f:arch/powerpc/platforms/powernv/opal-elog.c +f:arch/powerpc/platforms/powernv/opal-fadump.c +f:arch/powerpc/platforms/powernv/opal-fadump.h +f:arch/powerpc/platforms/powernv/opal-flash.c +f:arch/powerpc/platforms/powernv/opal-hmi.c +f:arch/powerpc/platforms/powernv/opal-imc.c +f:arch/powerpc/platforms/powernv/opal-irqchip.c +f:arch/powerpc/platforms/powernv/opal-kmsg.c +f:arch/powerpc/platforms/powernv/opal-lpc.c +f:arch/powerpc/platforms/powernv/opal-memory-errors.c +f:arch/powerpc/platforms/powernv/opal-msglog.c +f:arch/powerpc/platforms/powernv/opal-nvram.c +f:arch/powerpc/platforms/powernv/opal-power.c +f:arch/powerpc/platforms/powernv/opal-powercap.c +f:arch/powerpc/platforms/powernv/opal-prd.c +f:arch/powerpc/platforms/powernv/opal-psr.c +f:arch/powerpc/platforms/powernv/opal-rtc.c +f:arch/powerpc/platforms/powernv/opal-secvar.c +f:arch/powerpc/platforms/powernv/opal-sensor-groups.c +f:arch/powerpc/platforms/powernv/opal-sensor.c +f:arch/powerpc/platforms/powernv/opal-sysparam.c +f:arch/powerpc/platforms/powernv/opal-tracepoints.c +f:arch/powerpc/platforms/powernv/opal-wrappers.S +f:arch/powerpc/platforms/powernv/opal-xscom.c +f:arch/powerpc/platforms/powernv/opal.c +f:arch/powerpc/platforms/powernv/pci-ioda-tce.c +f:arch/powerpc/platforms/powernv/pci-ioda.c +f:arch/powerpc/platforms/powernv/pci-sriov.c +f:arch/powerpc/platforms/powernv/pci.c +f:arch/powerpc/platforms/powernv/pci.h +f:arch/powerpc/platforms/powernv/powernv.h +f:arch/powerpc/platforms/powernv/rng.c +f:arch/powerpc/platforms/powernv/setup.c +f:arch/powerpc/platforms/powernv/smp.c +f:arch/powerpc/platforms/powernv/subcore-asm.S +f:arch/powerpc/platforms/powernv/subcore.c +f:arch/powerpc/platforms/powernv/subcore.h +f:arch/powerpc/platforms/powernv/ultravisor.c +f:arch/powerpc/platforms/powernv/vas-debug.c +f:arch/powerpc/platforms/powernv/vas-fault.c +f:arch/powerpc/platforms/powernv/vas-trace.h +f:arch/powerpc/platforms/powernv/vas-window.c +f:arch/powerpc/platforms/powernv/vas.c +f:arch/powerpc/platforms/powernv/vas.h +f:arch/powerpc/platforms/ps3/Kconfig +f:arch/powerpc/platforms/ps3/Makefile +f:arch/powerpc/platforms/ps3/device-init.c +f:arch/powerpc/platforms/ps3/exports.c +f:arch/powerpc/platforms/ps3/gelic_udbg.c +f:arch/powerpc/platforms/ps3/htab.c +f:arch/powerpc/platforms/ps3/hvcall.S +f:arch/powerpc/platforms/ps3/interrupt.c +f:arch/powerpc/platforms/ps3/mm.c +f:arch/powerpc/platforms/ps3/os-area.c +f:arch/powerpc/platforms/ps3/platform.h +f:arch/powerpc/platforms/ps3/repository.c +f:arch/powerpc/platforms/ps3/setup.c +f:arch/powerpc/platforms/ps3/smp.c +f:arch/powerpc/platforms/ps3/spu.c +f:arch/powerpc/platforms/ps3/system-bus.c +f:arch/powerpc/platforms/ps3/time.c +f:arch/powerpc/platforms/pseries/Kconfig +f:arch/powerpc/platforms/pseries/Makefile +f:arch/powerpc/platforms/pseries/cc_platform.c +f:arch/powerpc/platforms/pseries/cmm.c +f:arch/powerpc/platforms/pseries/dlpar.c +f:arch/powerpc/platforms/pseries/dtl.c +f:arch/powerpc/platforms/pseries/eeh_pseries.c +f:arch/powerpc/platforms/pseries/event_sources.c +f:arch/powerpc/platforms/pseries/firmware.c +f:arch/powerpc/platforms/pseries/hotplug-cpu.c +f:arch/powerpc/platforms/pseries/hotplug-memory.c +f:arch/powerpc/platforms/pseries/htmdump.c +f:arch/powerpc/platforms/pseries/hvCall.S +f:arch/powerpc/platforms/pseries/hvCall_inst.c +f:arch/powerpc/platforms/pseries/hvconsole.c +f:arch/powerpc/platforms/pseries/hvcserver.c +f:arch/powerpc/platforms/pseries/ibmebus.c +f:arch/powerpc/platforms/pseries/io_event_irq.c +f:arch/powerpc/platforms/pseries/iommu.c +f:arch/powerpc/platforms/pseries/kexec.c +f:arch/powerpc/platforms/pseries/lpar.c +f:arch/powerpc/platforms/pseries/lparcfg.c +f:arch/powerpc/platforms/pseries/mobility.c +f:arch/powerpc/platforms/pseries/msi.c +f:arch/powerpc/platforms/pseries/nvram.c +f:arch/powerpc/platforms/pseries/of_helpers.c +f:arch/powerpc/platforms/pseries/of_helpers.h +f:arch/powerpc/platforms/pseries/papr-indices.c +f:arch/powerpc/platforms/pseries/papr-phy-attest.c +f:arch/powerpc/platforms/pseries/papr-platform-dump.c +f:arch/powerpc/platforms/pseries/papr-rtas-common.c +f:arch/powerpc/platforms/pseries/papr-rtas-common.h +f:arch/powerpc/platforms/pseries/papr-sysparm.c +f:arch/powerpc/platforms/pseries/papr-vpd.c +f:arch/powerpc/platforms/pseries/papr_platform_attributes.c +f:arch/powerpc/platforms/pseries/papr_scm.c +f:arch/powerpc/platforms/pseries/pci.c +f:arch/powerpc/platforms/pseries/pci_dlpar.c +f:arch/powerpc/platforms/pseries/plpks-secvar.c +f:arch/powerpc/platforms/pseries/plpks.c +f:arch/powerpc/platforms/pseries/plpks_sed_ops.c +f:arch/powerpc/platforms/pseries/pmem.c +f:arch/powerpc/platforms/pseries/power.c +f:arch/powerpc/platforms/pseries/pseries.h +f:arch/powerpc/platforms/pseries/pseries_energy.c +f:arch/powerpc/platforms/pseries/ras.c +f:arch/powerpc/platforms/pseries/reconfig.c +f:arch/powerpc/platforms/pseries/rng.c +f:arch/powerpc/platforms/pseries/rtas-fadump.c +f:arch/powerpc/platforms/pseries/rtas-fadump.h +f:arch/powerpc/platforms/pseries/rtas-work-area.c +f:arch/powerpc/platforms/pseries/setup.c +f:arch/powerpc/platforms/pseries/smp.c +f:arch/powerpc/platforms/pseries/suspend.c +f:arch/powerpc/platforms/pseries/svm.c +f:arch/powerpc/platforms/pseries/vas-sysfs.c +f:arch/powerpc/platforms/pseries/vas.c +f:arch/powerpc/platforms/pseries/vas.h +f:arch/powerpc/platforms/pseries/vio.c +f:arch/powerpc/platforms/pseries/vphn.c +f:arch/powerpc/purgatory/.gitignore +f:arch/powerpc/purgatory/Makefile +f:arch/powerpc/purgatory/kexec-purgatory.S +f:arch/powerpc/purgatory/trampoline_64.S +f:arch/powerpc/sysdev/6xx-suspend.S +f:arch/powerpc/sysdev/Kconfig +f:arch/powerpc/sysdev/Makefile +f:arch/powerpc/sysdev/cpm2.c +f:arch/powerpc/sysdev/cpm2_pic.c +f:arch/powerpc/sysdev/cpm2_pic.h +f:arch/powerpc/sysdev/cpm_common.c +f:arch/powerpc/sysdev/cpm_gpio.c +f:arch/powerpc/sysdev/dart.h +f:arch/powerpc/sysdev/dart_iommu.c +f:arch/powerpc/sysdev/dcr-low.S +f:arch/powerpc/sysdev/dcr.c +f:arch/powerpc/sysdev/ehv_pic.c +f:arch/powerpc/sysdev/fsl_gtm.c +f:arch/powerpc/sysdev/fsl_lbc.c +f:arch/powerpc/sysdev/fsl_mpic_err.c +f:arch/powerpc/sysdev/fsl_mpic_timer_wakeup.c +f:arch/powerpc/sysdev/fsl_msi.c +f:arch/powerpc/sysdev/fsl_msi.h +f:arch/powerpc/sysdev/fsl_pci.c +f:arch/powerpc/sysdev/fsl_pci.h +f:arch/powerpc/sysdev/fsl_pmc.c +f:arch/powerpc/sysdev/fsl_rcpm.c +f:arch/powerpc/sysdev/fsl_rio.c +f:arch/powerpc/sysdev/fsl_rio.h +f:arch/powerpc/sysdev/fsl_rmu.c +f:arch/powerpc/sysdev/fsl_soc.c +f:arch/powerpc/sysdev/fsl_soc.h +f:arch/powerpc/sysdev/ge/Makefile +f:arch/powerpc/sysdev/ge/ge_pic.c +f:arch/powerpc/sysdev/ge/ge_pic.h +f:arch/powerpc/sysdev/grackle.c +f:arch/powerpc/sysdev/i8259.c +f:arch/powerpc/sysdev/indirect_pci.c +f:arch/powerpc/sysdev/ipic.c +f:arch/powerpc/sysdev/ipic.h +f:arch/powerpc/sysdev/mmio_nvram.c +f:arch/powerpc/sysdev/mpc5xxx_clocks.c +f:arch/powerpc/sysdev/mpic.c +f:arch/powerpc/sysdev/mpic.h +f:arch/powerpc/sysdev/mpic_msgr.c +f:arch/powerpc/sysdev/mpic_msi.c +f:arch/powerpc/sysdev/mpic_timer.c +f:arch/powerpc/sysdev/mpic_u3msi.c +f:arch/powerpc/sysdev/msi_bitmap.c +f:arch/powerpc/sysdev/of_rtc.c +f:arch/powerpc/sysdev/rtc_cmos_setup.c +f:arch/powerpc/sysdev/tsi108_dev.c +f:arch/powerpc/sysdev/tsi108_pci.c +f:arch/powerpc/sysdev/udbg_memcons.c +f:arch/powerpc/sysdev/xics/Kconfig +f:arch/powerpc/sysdev/xics/Makefile +f:arch/powerpc/sysdev/xics/icp-hv.c +f:arch/powerpc/sysdev/xics/icp-native.c +f:arch/powerpc/sysdev/xics/icp-opal.c +f:arch/powerpc/sysdev/xics/ics-native.c +f:arch/powerpc/sysdev/xics/ics-opal.c +f:arch/powerpc/sysdev/xics/ics-rtas.c +f:arch/powerpc/sysdev/xics/xics-common.c +f:arch/powerpc/sysdev/xive/Kconfig +f:arch/powerpc/sysdev/xive/Makefile +f:arch/powerpc/sysdev/xive/common.c +f:arch/powerpc/sysdev/xive/native.c +f:arch/powerpc/sysdev/xive/spapr.c +f:arch/powerpc/sysdev/xive/xive-internal.h +f:arch/powerpc/tools/.gitignore +f:arch/powerpc/tools/Makefile +f:arch/powerpc/tools/checkpatch.sh +f:arch/powerpc/tools/ftrace-gen-ool-stubs.sh +f:arch/powerpc/tools/ftrace_check.sh +f:arch/powerpc/tools/gcc-check-fpatchable-function-entry.sh +f:arch/powerpc/tools/gcc-check-mprofile-kernel.sh +f:arch/powerpc/tools/head_check.sh +f:arch/powerpc/tools/relocs_check.sh +f:arch/powerpc/tools/unrel_branch_check.sh +f:arch/powerpc/xmon/Makefile +f:arch/powerpc/xmon/ansidecl.h +f:arch/powerpc/xmon/dis-asm.h +f:arch/powerpc/xmon/nonstdio.c +f:arch/powerpc/xmon/nonstdio.h +f:arch/powerpc/xmon/ppc-dis.c +f:arch/powerpc/xmon/ppc-opc.c +f:arch/powerpc/xmon/ppc.h +f:arch/powerpc/xmon/spr_access.S +f:arch/powerpc/xmon/xmon.c +f:arch/powerpc/xmon/xmon_bpts.S +f:arch/powerpc/xmon/xmon_bpts.h +f:arch/riscv/Kbuild +f:arch/riscv/Kconfig +f:arch/riscv/Kconfig.debug +f:arch/riscv/Kconfig.errata +f:arch/riscv/Kconfig.socs +f:arch/riscv/Kconfig.vendor +f:arch/riscv/Makefile +f:arch/riscv/Makefile.postlink +f:arch/riscv/boot/.gitignore +f:arch/riscv/boot/Makefile +f:arch/riscv/boot/dts/Makefile +f:arch/riscv/boot/dts/allwinner/Makefile +f:arch/riscv/boot/dts/allwinner/sun20i-common-regulators.dtsi +f:arch/riscv/boot/dts/allwinner/sun20i-d1-clockworkpi-v3.14.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1-devterm-v3.14.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1-dongshan-nezha-stu.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1-lichee-rv-86-panel-480p.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1-lichee-rv-86-panel-720p.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1-lichee-rv-86-panel.dtsi +f:arch/riscv/boot/dts/allwinner/sun20i-d1-lichee-rv-dock.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1-lichee-rv.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1-mangopi-mq-pro.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1-nezha.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1.dtsi +f:arch/riscv/boot/dts/allwinner/sun20i-d1s-mangopi-mq.dts +f:arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi +f:arch/riscv/boot/dts/allwinner/sunxi-d1-t113.dtsi +f:arch/riscv/boot/dts/allwinner/sunxi-d1s-t113.dtsi +f:arch/riscv/boot/dts/andes/Makefile +f:arch/riscv/boot/dts/andes/qilai-voyager.dts +f:arch/riscv/boot/dts/andes/qilai.dtsi +f:arch/riscv/boot/dts/canaan/Makefile +f:arch/riscv/boot/dts/canaan/canaan_kd233.dts +f:arch/riscv/boot/dts/canaan/k210.dtsi +f:arch/riscv/boot/dts/canaan/k210_generic.dts +f:arch/riscv/boot/dts/canaan/sipeed_maix_bit.dts +f:arch/riscv/boot/dts/canaan/sipeed_maix_dock.dts +f:arch/riscv/boot/dts/canaan/sipeed_maix_go.dts +f:arch/riscv/boot/dts/canaan/sipeed_maixduino.dts +f:arch/riscv/boot/dts/microchip/Makefile +f:arch/riscv/boot/dts/microchip/mpfs-beaglev-fire-fabric.dtsi +f:arch/riscv/boot/dts/microchip/mpfs-beaglev-fire.dts +f:arch/riscv/boot/dts/microchip/mpfs-icicle-kit-fabric.dtsi +f:arch/riscv/boot/dts/microchip/mpfs-icicle-kit.dts +f:arch/riscv/boot/dts/microchip/mpfs-m100pfs-fabric.dtsi +f:arch/riscv/boot/dts/microchip/mpfs-m100pfsevp.dts +f:arch/riscv/boot/dts/microchip/mpfs-polarberry-fabric.dtsi +f:arch/riscv/boot/dts/microchip/mpfs-polarberry.dts +f:arch/riscv/boot/dts/microchip/mpfs-sev-kit-fabric.dtsi +f:arch/riscv/boot/dts/microchip/mpfs-sev-kit.dts +f:arch/riscv/boot/dts/microchip/mpfs-tysom-m-fabric.dtsi +f:arch/riscv/boot/dts/microchip/mpfs-tysom-m.dts +f:arch/riscv/boot/dts/microchip/mpfs.dtsi +f:arch/riscv/boot/dts/renesas/Makefile +f:arch/riscv/boot/dts/renesas/r9a07g043f.dtsi +f:arch/riscv/boot/dts/renesas/r9a07g043f01-smarc.dts +f:arch/riscv/boot/dts/renesas/rzfive-smarc-som.dtsi +f:arch/riscv/boot/dts/renesas/rzfive-smarc.dtsi +f:arch/riscv/boot/dts/sifive/Makefile +f:arch/riscv/boot/dts/sifive/fu540-c000.dtsi +f:arch/riscv/boot/dts/sifive/fu740-c000.dtsi +f:arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dts +f:arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dts +f:arch/riscv/boot/dts/sophgo/Makefile +f:arch/riscv/boot/dts/sophgo/cv1800b-milkv-duo.dts +f:arch/riscv/boot/dts/sophgo/cv1800b.dtsi +f:arch/riscv/boot/dts/sophgo/cv180x-cpus.dtsi +f:arch/riscv/boot/dts/sophgo/cv180x.dtsi +f:arch/riscv/boot/dts/sophgo/cv1812h-huashan-pi.dts +f:arch/riscv/boot/dts/sophgo/cv1812h.dtsi +f:arch/riscv/boot/dts/sophgo/cv181x.dtsi +f:arch/riscv/boot/dts/sophgo/cv18xx-reset.h +f:arch/riscv/boot/dts/sophgo/sg2002-licheerv-nano-b.dts +f:arch/riscv/boot/dts/sophgo/sg2002.dtsi +f:arch/riscv/boot/dts/sophgo/sg2042-cpus.dtsi +f:arch/riscv/boot/dts/sophgo/sg2042-evb-v1.dts +f:arch/riscv/boot/dts/sophgo/sg2042-evb-v2.dts +f:arch/riscv/boot/dts/sophgo/sg2042-milkv-pioneer.dts +f:arch/riscv/boot/dts/sophgo/sg2042.dtsi +f:arch/riscv/boot/dts/sophgo/sg2044-cpus.dtsi +f:arch/riscv/boot/dts/sophgo/sg2044-reset.h +f:arch/riscv/boot/dts/sophgo/sg2044-sophgo-srd3-10.dts +f:arch/riscv/boot/dts/sophgo/sg2044.dtsi +f:arch/riscv/boot/dts/spacemit/Makefile +f:arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts +f:arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts +f:arch/riscv/boot/dts/spacemit/k1-pinctrl.dtsi +f:arch/riscv/boot/dts/spacemit/k1.dtsi +f:arch/riscv/boot/dts/starfive/Makefile +f:arch/riscv/boot/dts/starfive/jh7100-beaglev-starlight.dts +f:arch/riscv/boot/dts/starfive/jh7100-common.dtsi +f:arch/riscv/boot/dts/starfive/jh7100-starfive-visionfive-v1.dts +f:arch/riscv/boot/dts/starfive/jh7100.dtsi +f:arch/riscv/boot/dts/starfive/jh7110-common.dtsi +f:arch/riscv/boot/dts/starfive/jh7110-deepcomputing-fml13v01.dts +f:arch/riscv/boot/dts/starfive/jh7110-milkv-mars.dts +f:arch/riscv/boot/dts/starfive/jh7110-pine64-star64.dts +f:arch/riscv/boot/dts/starfive/jh7110-pinfunc.h +f:arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2-v1.2a.dts +f:arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2-v1.3b.dts +f:arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi +f:arch/riscv/boot/dts/starfive/jh7110.dtsi +f:arch/riscv/boot/dts/thead/Makefile +f:arch/riscv/boot/dts/thead/th1520-beaglev-ahead.dts +f:arch/riscv/boot/dts/thead/th1520-lichee-module-4a.dtsi +f:arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts +f:arch/riscv/boot/dts/thead/th1520.dtsi +f:arch/riscv/boot/install.sh +f:arch/riscv/boot/loader.S +f:arch/riscv/boot/loader.lds.S +f:arch/riscv/configs/32-bit.config +f:arch/riscv/configs/64-bit.config +f:arch/riscv/configs/defconfig +f:arch/riscv/configs/nommu_k210_defconfig +f:arch/riscv/configs/nommu_k210_sdcard_defconfig +f:arch/riscv/configs/nommu_virt_defconfig +f:arch/riscv/crypto/Kconfig +f:arch/riscv/crypto/Makefile +f:arch/riscv/crypto/aes-macros.S +f:arch/riscv/crypto/aes-riscv64-glue.c +f:arch/riscv/crypto/aes-riscv64-zvkned-zvbb-zvkg.S +f:arch/riscv/crypto/aes-riscv64-zvkned-zvkb.S +f:arch/riscv/crypto/aes-riscv64-zvkned.S +f:arch/riscv/crypto/ghash-riscv64-glue.c +f:arch/riscv/crypto/ghash-riscv64-zvkg.S +f:arch/riscv/crypto/sm3-riscv64-glue.c +f:arch/riscv/crypto/sm3-riscv64-zvksh-zvkb.S +f:arch/riscv/crypto/sm4-riscv64-glue.c +f:arch/riscv/crypto/sm4-riscv64-zvksed-zvkb.S +f:arch/riscv/errata/Makefile +f:arch/riscv/errata/andes/Makefile +f:arch/riscv/errata/andes/errata.c +f:arch/riscv/errata/sifive/Makefile +f:arch/riscv/errata/sifive/errata.c +f:arch/riscv/errata/sifive/errata_cip_453.S +f:arch/riscv/errata/thead/Makefile +f:arch/riscv/errata/thead/errata.c +f:arch/riscv/include/asm/Kbuild +f:arch/riscv/include/asm/acenv.h +f:arch/riscv/include/asm/acpi.h +f:arch/riscv/include/asm/alternative-macros.h +f:arch/riscv/include/asm/alternative.h +f:arch/riscv/include/asm/arch_hweight.h +f:arch/riscv/include/asm/archrandom.h +f:arch/riscv/include/asm/asm-extable.h +f:arch/riscv/include/asm/asm-offsets.h +f:arch/riscv/include/asm/asm-prototypes.h +f:arch/riscv/include/asm/asm.h +f:arch/riscv/include/asm/assembler.h +f:arch/riscv/include/asm/atomic.h +f:arch/riscv/include/asm/barrier.h +f:arch/riscv/include/asm/bitops.h +f:arch/riscv/include/asm/bug.h +f:arch/riscv/include/asm/bugs.h +f:arch/riscv/include/asm/cache.h +f:arch/riscv/include/asm/cacheflush.h +f:arch/riscv/include/asm/cacheinfo.h +f:arch/riscv/include/asm/cfi.h +f:arch/riscv/include/asm/checksum.h +f:arch/riscv/include/asm/clint.h +f:arch/riscv/include/asm/clocksource.h +f:arch/riscv/include/asm/cmpxchg.h +f:arch/riscv/include/asm/compat.h +f:arch/riscv/include/asm/cpu.h +f:arch/riscv/include/asm/cpu_ops.h +f:arch/riscv/include/asm/cpu_ops_sbi.h +f:arch/riscv/include/asm/cpufeature-macros.h +f:arch/riscv/include/asm/cpufeature.h +f:arch/riscv/include/asm/cpuidle.h +f:arch/riscv/include/asm/crash_reserve.h +f:arch/riscv/include/asm/csr.h +f:arch/riscv/include/asm/current.h +f:arch/riscv/include/asm/delay.h +f:arch/riscv/include/asm/dma-noncoherent.h +f:arch/riscv/include/asm/dmi.h +f:arch/riscv/include/asm/efi.h +f:arch/riscv/include/asm/elf.h +f:arch/riscv/include/asm/entry-common.h +f:arch/riscv/include/asm/errata_list.h +f:arch/riscv/include/asm/exec.h +f:arch/riscv/include/asm/extable.h +f:arch/riscv/include/asm/fence.h +f:arch/riscv/include/asm/fixmap.h +f:arch/riscv/include/asm/fpu.h +f:arch/riscv/include/asm/ftrace.h +f:arch/riscv/include/asm/futex.h +f:arch/riscv/include/asm/gdb_xml.h +f:arch/riscv/include/asm/gpr-num.h +f:arch/riscv/include/asm/hugetlb.h +f:arch/riscv/include/asm/hwcap.h +f:arch/riscv/include/asm/hwprobe.h +f:arch/riscv/include/asm/image.h +f:arch/riscv/include/asm/insn-def.h +f:arch/riscv/include/asm/insn.h +f:arch/riscv/include/asm/io.h +f:arch/riscv/include/asm/irq.h +f:arch/riscv/include/asm/irq_stack.h +f:arch/riscv/include/asm/irq_work.h +f:arch/riscv/include/asm/irqflags.h +f:arch/riscv/include/asm/jump_label.h +f:arch/riscv/include/asm/kasan.h +f:arch/riscv/include/asm/kdebug.h +f:arch/riscv/include/asm/kexec.h +f:arch/riscv/include/asm/kfence.h +f:arch/riscv/include/asm/kgdb.h +f:arch/riscv/include/asm/kprobes.h +f:arch/riscv/include/asm/kvm_aia.h +f:arch/riscv/include/asm/kvm_gstage.h +f:arch/riscv/include/asm/kvm_host.h +f:arch/riscv/include/asm/kvm_mmu.h +f:arch/riscv/include/asm/kvm_nacl.h +f:arch/riscv/include/asm/kvm_tlb.h +f:arch/riscv/include/asm/kvm_types.h +f:arch/riscv/include/asm/kvm_vcpu_fp.h +f:arch/riscv/include/asm/kvm_vcpu_insn.h +f:arch/riscv/include/asm/kvm_vcpu_pmu.h +f:arch/riscv/include/asm/kvm_vcpu_sbi.h +f:arch/riscv/include/asm/kvm_vcpu_timer.h +f:arch/riscv/include/asm/kvm_vcpu_vector.h +f:arch/riscv/include/asm/kvm_vmid.h +f:arch/riscv/include/asm/linkage.h +f:arch/riscv/include/asm/membarrier.h +f:arch/riscv/include/asm/mmio.h +f:arch/riscv/include/asm/mmiowb.h +f:arch/riscv/include/asm/mmu.h +f:arch/riscv/include/asm/mmu_context.h +f:arch/riscv/include/asm/module.h +f:arch/riscv/include/asm/module.lds.h +f:arch/riscv/include/asm/numa.h +f:arch/riscv/include/asm/page.h +f:arch/riscv/include/asm/paravirt.h +f:arch/riscv/include/asm/paravirt_api_clock.h +f:arch/riscv/include/asm/pci.h +f:arch/riscv/include/asm/perf_event.h +f:arch/riscv/include/asm/pgalloc.h +f:arch/riscv/include/asm/pgtable-32.h +f:arch/riscv/include/asm/pgtable-64.h +f:arch/riscv/include/asm/pgtable-bits.h +f:arch/riscv/include/asm/pgtable.h +f:arch/riscv/include/asm/probes.h +f:arch/riscv/include/asm/processor.h +f:arch/riscv/include/asm/ptrace.h +f:arch/riscv/include/asm/runtime-const.h +f:arch/riscv/include/asm/sbi.h +f:arch/riscv/include/asm/scs.h +f:arch/riscv/include/asm/seccomp.h +f:arch/riscv/include/asm/sections.h +f:arch/riscv/include/asm/semihost.h +f:arch/riscv/include/asm/set_memory.h +f:arch/riscv/include/asm/signal32.h +f:arch/riscv/include/asm/simd.h +f:arch/riscv/include/asm/smp.h +f:arch/riscv/include/asm/soc.h +f:arch/riscv/include/asm/sparsemem.h +f:arch/riscv/include/asm/spinlock.h +f:arch/riscv/include/asm/stackprotector.h +f:arch/riscv/include/asm/stacktrace.h +f:arch/riscv/include/asm/string.h +f:arch/riscv/include/asm/suspend.h +f:arch/riscv/include/asm/switch_to.h +f:arch/riscv/include/asm/sync_core.h +f:arch/riscv/include/asm/syscall.h +f:arch/riscv/include/asm/syscall_table.h +f:arch/riscv/include/asm/syscall_wrapper.h +f:arch/riscv/include/asm/text-patching.h +f:arch/riscv/include/asm/thread_info.h +f:arch/riscv/include/asm/timex.h +f:arch/riscv/include/asm/tlb.h +f:arch/riscv/include/asm/tlbbatch.h +f:arch/riscv/include/asm/tlbflush.h +f:arch/riscv/include/asm/topology.h +f:arch/riscv/include/asm/trace.h +f:arch/riscv/include/asm/uaccess.h +f:arch/riscv/include/asm/unistd.h +f:arch/riscv/include/asm/uprobes.h +f:arch/riscv/include/asm/vdso.h +f:arch/riscv/include/asm/vdso/arch_data.h +f:arch/riscv/include/asm/vdso/clocksource.h +f:arch/riscv/include/asm/vdso/getrandom.h +f:arch/riscv/include/asm/vdso/gettimeofday.h +f:arch/riscv/include/asm/vdso/processor.h +f:arch/riscv/include/asm/vdso/vsyscall.h +f:arch/riscv/include/asm/vector.h +f:arch/riscv/include/asm/vendor_extensions.h +f:arch/riscv/include/asm/vendor_extensions/andes.h +f:arch/riscv/include/asm/vendor_extensions/sifive.h +f:arch/riscv/include/asm/vendor_extensions/sifive_hwprobe.h +f:arch/riscv/include/asm/vendor_extensions/thead.h +f:arch/riscv/include/asm/vendor_extensions/thead_hwprobe.h +f:arch/riscv/include/asm/vendor_extensions/vendor_hwprobe.h +f:arch/riscv/include/asm/vendorid_list.h +f:arch/riscv/include/asm/vermagic.h +f:arch/riscv/include/asm/vmalloc.h +f:arch/riscv/include/asm/word-at-a-time.h +f:arch/riscv/include/asm/xip_fixup.h +f:arch/riscv/include/asm/xor.h +f:arch/riscv/include/uapi/asm/Kbuild +f:arch/riscv/include/uapi/asm/auxvec.h +f:arch/riscv/include/uapi/asm/bitsperlong.h +f:arch/riscv/include/uapi/asm/bpf_perf_event.h +f:arch/riscv/include/uapi/asm/byteorder.h +f:arch/riscv/include/uapi/asm/elf.h +f:arch/riscv/include/uapi/asm/hwcap.h +f:arch/riscv/include/uapi/asm/hwprobe.h +f:arch/riscv/include/uapi/asm/kvm.h +f:arch/riscv/include/uapi/asm/perf_regs.h +f:arch/riscv/include/uapi/asm/ptrace.h +f:arch/riscv/include/uapi/asm/setup.h +f:arch/riscv/include/uapi/asm/sigcontext.h +f:arch/riscv/include/uapi/asm/ucontext.h +f:arch/riscv/include/uapi/asm/unistd.h +f:arch/riscv/include/uapi/asm/vendor/sifive.h +f:arch/riscv/include/uapi/asm/vendor/thead.h +f:arch/riscv/kernel/.gitignore +f:arch/riscv/kernel/Makefile +f:arch/riscv/kernel/Makefile.syscalls +f:arch/riscv/kernel/acpi.c +f:arch/riscv/kernel/acpi_numa.c +f:arch/riscv/kernel/alternative.c +f:arch/riscv/kernel/asm-offsets.c +f:arch/riscv/kernel/bugs.c +f:arch/riscv/kernel/cacheinfo.c +f:arch/riscv/kernel/cfi.c +f:arch/riscv/kernel/compat_signal.c +f:arch/riscv/kernel/compat_syscall_table.c +f:arch/riscv/kernel/compat_vdso/.gitignore +f:arch/riscv/kernel/compat_vdso/Makefile +f:arch/riscv/kernel/compat_vdso/compat_vdso.S +f:arch/riscv/kernel/compat_vdso/compat_vdso.lds.S +f:arch/riscv/kernel/compat_vdso/flush_icache.S +f:arch/riscv/kernel/compat_vdso/gen_compat_vdso_offsets.sh +f:arch/riscv/kernel/compat_vdso/getcpu.S +f:arch/riscv/kernel/compat_vdso/note.S +f:arch/riscv/kernel/compat_vdso/rt_sigreturn.S +f:arch/riscv/kernel/copy-unaligned.S +f:arch/riscv/kernel/copy-unaligned.h +f:arch/riscv/kernel/cpu-hotplug.c +f:arch/riscv/kernel/cpu.c +f:arch/riscv/kernel/cpu_ops.c +f:arch/riscv/kernel/cpu_ops_sbi.c +f:arch/riscv/kernel/cpu_ops_spinwait.c +f:arch/riscv/kernel/cpufeature.c +f:arch/riscv/kernel/crash_dump.c +f:arch/riscv/kernel/crash_save_regs.S +f:arch/riscv/kernel/efi-header.S +f:arch/riscv/kernel/efi.c +f:arch/riscv/kernel/entry.S +f:arch/riscv/kernel/fpu.S +f:arch/riscv/kernel/ftrace.c +f:arch/riscv/kernel/head.S +f:arch/riscv/kernel/head.h +f:arch/riscv/kernel/hibernate-asm.S +f:arch/riscv/kernel/hibernate.c +f:arch/riscv/kernel/image-vars.h +f:arch/riscv/kernel/irq.c +f:arch/riscv/kernel/jump_label.c +f:arch/riscv/kernel/kernel_mode_fpu.c +f:arch/riscv/kernel/kernel_mode_vector.c +f:arch/riscv/kernel/kexec_elf.c +f:arch/riscv/kernel/kexec_image.c +f:arch/riscv/kernel/kexec_relocate.S +f:arch/riscv/kernel/kgdb.c +f:arch/riscv/kernel/machine_kexec.c +f:arch/riscv/kernel/machine_kexec_file.c +f:arch/riscv/kernel/mcount-dyn.S +f:arch/riscv/kernel/mcount.S +f:arch/riscv/kernel/module-sections.c +f:arch/riscv/kernel/module.c +f:arch/riscv/kernel/paravirt.c +f:arch/riscv/kernel/patch.c +f:arch/riscv/kernel/perf_callchain.c +f:arch/riscv/kernel/perf_regs.c +f:arch/riscv/kernel/pi/Makefile +f:arch/riscv/kernel/pi/archrandom_early.c +f:arch/riscv/kernel/pi/cmdline_early.c +f:arch/riscv/kernel/pi/fdt_early.c +f:arch/riscv/kernel/pi/pi.h +f:arch/riscv/kernel/probes/Makefile +f:arch/riscv/kernel/probes/decode-insn.c +f:arch/riscv/kernel/probes/decode-insn.h +f:arch/riscv/kernel/probes/kprobes.c +f:arch/riscv/kernel/probes/rethook.c +f:arch/riscv/kernel/probes/rethook.h +f:arch/riscv/kernel/probes/rethook_trampoline.S +f:arch/riscv/kernel/probes/simulate-insn.c +f:arch/riscv/kernel/probes/simulate-insn.h +f:arch/riscv/kernel/probes/uprobes.c +f:arch/riscv/kernel/process.c +f:arch/riscv/kernel/ptrace.c +f:arch/riscv/kernel/reset.c +f:arch/riscv/kernel/return_address.c +f:arch/riscv/kernel/riscv_ksyms.c +f:arch/riscv/kernel/sbi-ipi.c +f:arch/riscv/kernel/sbi.c +f:arch/riscv/kernel/sbi_ecall.c +f:arch/riscv/kernel/setup.c +f:arch/riscv/kernel/signal.c +f:arch/riscv/kernel/smp.c +f:arch/riscv/kernel/smpboot.c +f:arch/riscv/kernel/soc.c +f:arch/riscv/kernel/stacktrace.c +f:arch/riscv/kernel/suspend.c +f:arch/riscv/kernel/suspend_entry.S +f:arch/riscv/kernel/sys_hwprobe.c +f:arch/riscv/kernel/sys_riscv.c +f:arch/riscv/kernel/syscall_table.c +f:arch/riscv/kernel/tests/Kconfig.debug +f:arch/riscv/kernel/tests/Makefile +f:arch/riscv/kernel/tests/module_test/Makefile +f:arch/riscv/kernel/tests/module_test/test_module_linking_main.c +f:arch/riscv/kernel/tests/module_test/test_set16.S +f:arch/riscv/kernel/tests/module_test/test_set32.S +f:arch/riscv/kernel/tests/module_test/test_set6.S +f:arch/riscv/kernel/tests/module_test/test_set8.S +f:arch/riscv/kernel/tests/module_test/test_sub16.S +f:arch/riscv/kernel/tests/module_test/test_sub32.S +f:arch/riscv/kernel/tests/module_test/test_sub6.S +f:arch/riscv/kernel/tests/module_test/test_sub64.S +f:arch/riscv/kernel/tests/module_test/test_sub8.S +f:arch/riscv/kernel/tests/module_test/test_uleb128.S +f:arch/riscv/kernel/time.c +f:arch/riscv/kernel/traps.c +f:arch/riscv/kernel/traps_misaligned.c +f:arch/riscv/kernel/unaligned_access_speed.c +f:arch/riscv/kernel/vdso.c +f:arch/riscv/kernel/vdso/.gitignore +f:arch/riscv/kernel/vdso/Makefile +f:arch/riscv/kernel/vdso/flush_icache.S +f:arch/riscv/kernel/vdso/gen_vdso_offsets.sh +f:arch/riscv/kernel/vdso/getcpu.S +f:arch/riscv/kernel/vdso/getrandom.c +f:arch/riscv/kernel/vdso/hwprobe.c +f:arch/riscv/kernel/vdso/note.S +f:arch/riscv/kernel/vdso/rt_sigreturn.S +f:arch/riscv/kernel/vdso/sys_hwprobe.S +f:arch/riscv/kernel/vdso/vdso.S +f:arch/riscv/kernel/vdso/vdso.lds.S +f:arch/riscv/kernel/vdso/vgetrandom-chacha.S +f:arch/riscv/kernel/vdso/vgettimeofday.c +f:arch/riscv/kernel/vec-copy-unaligned.S +f:arch/riscv/kernel/vector.c +f:arch/riscv/kernel/vendor_extensions.c +f:arch/riscv/kernel/vendor_extensions/Makefile +f:arch/riscv/kernel/vendor_extensions/andes.c +f:arch/riscv/kernel/vendor_extensions/sifive.c +f:arch/riscv/kernel/vendor_extensions/sifive_hwprobe.c +f:arch/riscv/kernel/vendor_extensions/thead.c +f:arch/riscv/kernel/vendor_extensions/thead_hwprobe.c +f:arch/riscv/kernel/vmcore_info.c +f:arch/riscv/kernel/vmlinux-xip.lds.S +f:arch/riscv/kernel/vmlinux.lds.S +f:arch/riscv/kvm/Kconfig +f:arch/riscv/kvm/Makefile +f:arch/riscv/kvm/aia.c +f:arch/riscv/kvm/aia_aplic.c +f:arch/riscv/kvm/aia_device.c +f:arch/riscv/kvm/aia_imsic.c +f:arch/riscv/kvm/gstage.c +f:arch/riscv/kvm/main.c +f:arch/riscv/kvm/mmu.c +f:arch/riscv/kvm/nacl.c +f:arch/riscv/kvm/tlb.c +f:arch/riscv/kvm/trace.h +f:arch/riscv/kvm/vcpu.c +f:arch/riscv/kvm/vcpu_exit.c +f:arch/riscv/kvm/vcpu_fp.c +f:arch/riscv/kvm/vcpu_insn.c +f:arch/riscv/kvm/vcpu_onereg.c +f:arch/riscv/kvm/vcpu_pmu.c +f:arch/riscv/kvm/vcpu_sbi.c +f:arch/riscv/kvm/vcpu_sbi_base.c +f:arch/riscv/kvm/vcpu_sbi_hsm.c +f:arch/riscv/kvm/vcpu_sbi_pmu.c +f:arch/riscv/kvm/vcpu_sbi_replace.c +f:arch/riscv/kvm/vcpu_sbi_sta.c +f:arch/riscv/kvm/vcpu_sbi_system.c +f:arch/riscv/kvm/vcpu_sbi_v01.c +f:arch/riscv/kvm/vcpu_switch.S +f:arch/riscv/kvm/vcpu_timer.c +f:arch/riscv/kvm/vcpu_vector.c +f:arch/riscv/kvm/vm.c +f:arch/riscv/kvm/vmid.c +f:arch/riscv/lib/Makefile +f:arch/riscv/lib/clear_page.S +f:arch/riscv/lib/csum.c +f:arch/riscv/lib/delay.c +f:arch/riscv/lib/error-inject.c +f:arch/riscv/lib/memcpy.S +f:arch/riscv/lib/memmove.S +f:arch/riscv/lib/memset.S +f:arch/riscv/lib/riscv_v_helpers.c +f:arch/riscv/lib/strcmp.S +f:arch/riscv/lib/strlen.S +f:arch/riscv/lib/strncmp.S +f:arch/riscv/lib/tishift.S +f:arch/riscv/lib/uaccess.S +f:arch/riscv/lib/uaccess_vector.S +f:arch/riscv/lib/xor.S +f:arch/riscv/mm/Makefile +f:arch/riscv/mm/cache-ops.c +f:arch/riscv/mm/cacheflush.c +f:arch/riscv/mm/context.c +f:arch/riscv/mm/dma-noncoherent.c +f:arch/riscv/mm/extable.c +f:arch/riscv/mm/fault.c +f:arch/riscv/mm/hugetlbpage.c +f:arch/riscv/mm/init.c +f:arch/riscv/mm/kasan_init.c +f:arch/riscv/mm/pageattr.c +f:arch/riscv/mm/pgtable.c +f:arch/riscv/mm/physaddr.c +f:arch/riscv/mm/pmem.c +f:arch/riscv/mm/ptdump.c +f:arch/riscv/mm/tlbflush.c +f:arch/riscv/net/Makefile +f:arch/riscv/net/bpf_jit.h +f:arch/riscv/net/bpf_jit_comp32.c +f:arch/riscv/net/bpf_jit_comp64.c +f:arch/riscv/net/bpf_jit_core.c +f:arch/riscv/purgatory/.gitignore +f:arch/riscv/purgatory/Makefile +f:arch/riscv/purgatory/entry.S +f:arch/riscv/purgatory/kexec-purgatory.S +f:arch/riscv/purgatory/purgatory.c +f:arch/riscv/tools/relocs_check.sh +f:arch/s390/Kbuild +f:arch/s390/Kconfig +f:arch/s390/Kconfig.debug +f:arch/s390/Makefile +f:arch/s390/Makefile.postlink +f:arch/s390/appldata/Makefile +f:arch/s390/appldata/appldata.h +f:arch/s390/appldata/appldata_base.c +f:arch/s390/appldata/appldata_mem.c +f:arch/s390/appldata/appldata_net_sum.c +f:arch/s390/appldata/appldata_os.c +f:arch/s390/boot/.gitignore +f:arch/s390/boot/Makefile +f:arch/s390/boot/als.c +f:arch/s390/boot/alternative.c +f:arch/s390/boot/boot.h +f:arch/s390/boot/clz_ctz.c +f:arch/s390/boot/cmdline.c +f:arch/s390/boot/ctype.c +f:arch/s390/boot/decompressor.c +f:arch/s390/boot/decompressor.h +f:arch/s390/boot/ebcdic.c +f:arch/s390/boot/head.S +f:arch/s390/boot/head_kdump.S +f:arch/s390/boot/install.sh +f:arch/s390/boot/ipl_data.c +f:arch/s390/boot/ipl_parm.c +f:arch/s390/boot/ipl_report.c +f:arch/s390/boot/ipl_vmparm.c +f:arch/s390/boot/kaslr.c +f:arch/s390/boot/kmsan.c +f:arch/s390/boot/machine_kexec_reloc.c +f:arch/s390/boot/mem.S +f:arch/s390/boot/pgm_check.c +f:arch/s390/boot/physmem_info.c +f:arch/s390/boot/printk.c +f:arch/s390/boot/sclp_early_core.c +f:arch/s390/boot/startup.c +f:arch/s390/boot/string.c +f:arch/s390/boot/trampoline.S +f:arch/s390/boot/uv.c +f:arch/s390/boot/uv.h +f:arch/s390/boot/version.c +f:arch/s390/boot/vmem.c +f:arch/s390/boot/vmlinux.lds.S +f:arch/s390/configs/btf.config +f:arch/s390/configs/compat.config +f:arch/s390/configs/debug_defconfig +f:arch/s390/configs/defconfig +f:arch/s390/configs/kasan.config +f:arch/s390/configs/mmtypes.config +f:arch/s390/configs/zfcpdump_defconfig +f:arch/s390/crypto/Kconfig +f:arch/s390/crypto/Makefile +f:arch/s390/crypto/aes_s390.c +f:arch/s390/crypto/arch_random.c +f:arch/s390/crypto/des_s390.c +f:arch/s390/crypto/ghash_s390.c +f:arch/s390/crypto/hmac_s390.c +f:arch/s390/crypto/paes_s390.c +f:arch/s390/crypto/phmac_s390.c +f:arch/s390/crypto/prng.c +f:arch/s390/crypto/sha.h +f:arch/s390/crypto/sha3_256_s390.c +f:arch/s390/crypto/sha3_512_s390.c +f:arch/s390/crypto/sha_common.c +f:arch/s390/hypfs/Makefile +f:arch/s390/hypfs/hypfs.h +f:arch/s390/hypfs/hypfs_dbfs.c +f:arch/s390/hypfs/hypfs_diag.c +f:arch/s390/hypfs/hypfs_diag.h +f:arch/s390/hypfs/hypfs_diag0c.c +f:arch/s390/hypfs/hypfs_diag_fs.c +f:arch/s390/hypfs/hypfs_sprp.c +f:arch/s390/hypfs/hypfs_vm.c +f:arch/s390/hypfs/hypfs_vm.h +f:arch/s390/hypfs/hypfs_vm_fs.c +f:arch/s390/hypfs/inode.c +f:arch/s390/include/asm/Kbuild +f:arch/s390/include/asm/abs_lowcore.h +f:arch/s390/include/asm/access-regs.h +f:arch/s390/include/asm/airq.h +f:arch/s390/include/asm/alternative.h +f:arch/s390/include/asm/ap.h +f:arch/s390/include/asm/appldata.h +f:arch/s390/include/asm/arch_hweight.h +f:arch/s390/include/asm/archrandom.h +f:arch/s390/include/asm/asce.h +f:arch/s390/include/asm/asm-const.h +f:arch/s390/include/asm/asm-extable.h +f:arch/s390/include/asm/asm-prototypes.h +f:arch/s390/include/asm/asm.h +f:arch/s390/include/asm/atomic.h +f:arch/s390/include/asm/atomic_ops.h +f:arch/s390/include/asm/barrier.h +f:arch/s390/include/asm/bitops.h +f:arch/s390/include/asm/boot_data.h +f:arch/s390/include/asm/bug.h +f:arch/s390/include/asm/cache.h +f:arch/s390/include/asm/ccwdev.h +f:arch/s390/include/asm/ccwgroup.h +f:arch/s390/include/asm/checksum.h +f:arch/s390/include/asm/chpid.h +f:arch/s390/include/asm/chsc.h +f:arch/s390/include/asm/cio.h +f:arch/s390/include/asm/clocksource.h +f:arch/s390/include/asm/clp.h +f:arch/s390/include/asm/cmb.h +f:arch/s390/include/asm/cmpxchg.h +f:arch/s390/include/asm/compat.h +f:arch/s390/include/asm/cpacf.h +f:arch/s390/include/asm/cpcmd.h +f:arch/s390/include/asm/cpu.h +f:arch/s390/include/asm/cpu_mf-insn.h +f:arch/s390/include/asm/cpu_mf.h +f:arch/s390/include/asm/cpufeature.h +f:arch/s390/include/asm/cputime.h +f:arch/s390/include/asm/crw.h +f:arch/s390/include/asm/css_chars.h +f:arch/s390/include/asm/ctlreg.h +f:arch/s390/include/asm/current.h +f:arch/s390/include/asm/dat-bits.h +f:arch/s390/include/asm/debug.h +f:arch/s390/include/asm/delay.h +f:arch/s390/include/asm/diag.h +f:arch/s390/include/asm/diag288.h +f:arch/s390/include/asm/dis.h +f:arch/s390/include/asm/dma-types.h +f:arch/s390/include/asm/dma.h +f:arch/s390/include/asm/dwarf.h +f:arch/s390/include/asm/eadm.h +f:arch/s390/include/asm/ebcdic.h +f:arch/s390/include/asm/elf.h +f:arch/s390/include/asm/entry-common.h +f:arch/s390/include/asm/exec.h +f:arch/s390/include/asm/extable.h +f:arch/s390/include/asm/extmem.h +f:arch/s390/include/asm/facility.h +f:arch/s390/include/asm/fault.h +f:arch/s390/include/asm/fcx.h +f:arch/s390/include/asm/fprobe.h +f:arch/s390/include/asm/fpu-insn-asm.h +f:arch/s390/include/asm/fpu-insn.h +f:arch/s390/include/asm/fpu-types.h +f:arch/s390/include/asm/fpu.h +f:arch/s390/include/asm/ftrace.h +f:arch/s390/include/asm/ftrace.lds.h +f:arch/s390/include/asm/futex.h +f:arch/s390/include/asm/gmap.h +f:arch/s390/include/asm/gmap_helpers.h +f:arch/s390/include/asm/hardirq.h +f:arch/s390/include/asm/hiperdispatch.h +f:arch/s390/include/asm/hugetlb.h +f:arch/s390/include/asm/hw_irq.h +f:arch/s390/include/asm/idals.h +f:arch/s390/include/asm/idle.h +f:arch/s390/include/asm/io.h +f:arch/s390/include/asm/ipl.h +f:arch/s390/include/asm/irq.h +f:arch/s390/include/asm/irq_work.h +f:arch/s390/include/asm/irqflags.h +f:arch/s390/include/asm/isc.h +f:arch/s390/include/asm/itcw.h +f:arch/s390/include/asm/jump_label.h +f:arch/s390/include/asm/kasan.h +f:arch/s390/include/asm/kdebug.h +f:arch/s390/include/asm/kexec.h +f:arch/s390/include/asm/kfence.h +f:arch/s390/include/asm/kmsan.h +f:arch/s390/include/asm/kprobes.h +f:arch/s390/include/asm/kvm_host.h +f:arch/s390/include/asm/kvm_host_types.h +f:arch/s390/include/asm/kvm_para.h +f:arch/s390/include/asm/linkage.h +f:arch/s390/include/asm/lowcore.h +f:arch/s390/include/asm/maccess.h +f:arch/s390/include/asm/machine.h +f:arch/s390/include/asm/march.h +f:arch/s390/include/asm/mem_encrypt.h +f:arch/s390/include/asm/mmu.h +f:arch/s390/include/asm/mmu_context.h +f:arch/s390/include/asm/module.h +f:arch/s390/include/asm/msi.h +f:arch/s390/include/asm/nmi.h +f:arch/s390/include/asm/nospec-branch.h +f:arch/s390/include/asm/nospec-insn.h +f:arch/s390/include/asm/numa.h +f:arch/s390/include/asm/os_info.h +f:arch/s390/include/asm/page-states.h +f:arch/s390/include/asm/page.h +f:arch/s390/include/asm/pai.h +f:arch/s390/include/asm/pci.h +f:arch/s390/include/asm/pci_clp.h +f:arch/s390/include/asm/pci_debug.h +f:arch/s390/include/asm/pci_dma.h +f:arch/s390/include/asm/pci_insn.h +f:arch/s390/include/asm/pci_io.h +f:arch/s390/include/asm/percpu.h +f:arch/s390/include/asm/perf_event.h +f:arch/s390/include/asm/pfault.h +f:arch/s390/include/asm/pgalloc.h +f:arch/s390/include/asm/pgtable.h +f:arch/s390/include/asm/physmem_info.h +f:arch/s390/include/asm/pkey.h +f:arch/s390/include/asm/pnet.h +f:arch/s390/include/asm/preempt.h +f:arch/s390/include/asm/processor.h +f:arch/s390/include/asm/ptrace.h +f:arch/s390/include/asm/purgatory.h +f:arch/s390/include/asm/qdio.h +f:arch/s390/include/asm/runtime-const.h +f:arch/s390/include/asm/runtime_instr.h +f:arch/s390/include/asm/rwonce.h +f:arch/s390/include/asm/schid.h +f:arch/s390/include/asm/sclp.h +f:arch/s390/include/asm/scsw.h +f:arch/s390/include/asm/seccomp.h +f:arch/s390/include/asm/sections.h +f:arch/s390/include/asm/set_memory.h +f:arch/s390/include/asm/setup.h +f:arch/s390/include/asm/signal.h +f:arch/s390/include/asm/sigp.h +f:arch/s390/include/asm/skey.h +f:arch/s390/include/asm/smp.h +f:arch/s390/include/asm/softirq_stack.h +f:arch/s390/include/asm/sparsemem.h +f:arch/s390/include/asm/spinlock.h +f:arch/s390/include/asm/spinlock_types.h +f:arch/s390/include/asm/stacktrace.h +f:arch/s390/include/asm/stp.h +f:arch/s390/include/asm/string.h +f:arch/s390/include/asm/syscall.h +f:arch/s390/include/asm/syscall_wrapper.h +f:arch/s390/include/asm/sysinfo.h +f:arch/s390/include/asm/text-patching.h +f:arch/s390/include/asm/thread_info.h +f:arch/s390/include/asm/timex.h +f:arch/s390/include/asm/tlb.h +f:arch/s390/include/asm/tlbflush.h +f:arch/s390/include/asm/topology.h +f:arch/s390/include/asm/tpi.h +f:arch/s390/include/asm/trace/diag.h +f:arch/s390/include/asm/trace/hiperdispatch.h +f:arch/s390/include/asm/trace/zcrypt.h +f:arch/s390/include/asm/types.h +f:arch/s390/include/asm/uaccess.h +f:arch/s390/include/asm/unistd.h +f:arch/s390/include/asm/unwind.h +f:arch/s390/include/asm/uprobes.h +f:arch/s390/include/asm/user.h +f:arch/s390/include/asm/uv.h +f:arch/s390/include/asm/vdso-symbols.h +f:arch/s390/include/asm/vdso.h +f:arch/s390/include/asm/vdso/clocksource.h +f:arch/s390/include/asm/vdso/getrandom.h +f:arch/s390/include/asm/vdso/gettimeofday.h +f:arch/s390/include/asm/vdso/processor.h +f:arch/s390/include/asm/vdso/time_data.h +f:arch/s390/include/asm/vdso/vsyscall.h +f:arch/s390/include/asm/vmalloc.h +f:arch/s390/include/asm/vmlinux.lds.h +f:arch/s390/include/asm/vtime.h +f:arch/s390/include/asm/vtimer.h +f:arch/s390/include/asm/word-at-a-time.h +f:arch/s390/include/asm/xor.h +f:arch/s390/include/uapi/asm/Kbuild +f:arch/s390/include/uapi/asm/auxvec.h +f:arch/s390/include/uapi/asm/bitsperlong.h +f:arch/s390/include/uapi/asm/bpf_perf_event.h +f:arch/s390/include/uapi/asm/byteorder.h +f:arch/s390/include/uapi/asm/chpid.h +f:arch/s390/include/uapi/asm/chsc.h +f:arch/s390/include/uapi/asm/clp.h +f:arch/s390/include/uapi/asm/cmb.h +f:arch/s390/include/uapi/asm/dasd.h +f:arch/s390/include/uapi/asm/diag.h +f:arch/s390/include/uapi/asm/fs3270.h +f:arch/s390/include/uapi/asm/guarded_storage.h +f:arch/s390/include/uapi/asm/hwctrset.h +f:arch/s390/include/uapi/asm/hypfs.h +f:arch/s390/include/uapi/asm/ioctls.h +f:arch/s390/include/uapi/asm/ipcbuf.h +f:arch/s390/include/uapi/asm/ipl.h +f:arch/s390/include/uapi/asm/kvm.h +f:arch/s390/include/uapi/asm/kvm_para.h +f:arch/s390/include/uapi/asm/kvm_perf.h +f:arch/s390/include/uapi/asm/monwriter.h +f:arch/s390/include/uapi/asm/perf_regs.h +f:arch/s390/include/uapi/asm/pkey.h +f:arch/s390/include/uapi/asm/posix_types.h +f:arch/s390/include/uapi/asm/ptrace.h +f:arch/s390/include/uapi/asm/qeth.h +f:arch/s390/include/uapi/asm/raw3270.h +f:arch/s390/include/uapi/asm/runtime_instr.h +f:arch/s390/include/uapi/asm/schid.h +f:arch/s390/include/uapi/asm/sclp_ctl.h +f:arch/s390/include/uapi/asm/setup.h +f:arch/s390/include/uapi/asm/sie.h +f:arch/s390/include/uapi/asm/sigcontext.h +f:arch/s390/include/uapi/asm/signal.h +f:arch/s390/include/uapi/asm/stat.h +f:arch/s390/include/uapi/asm/statfs.h +f:arch/s390/include/uapi/asm/sthyi.h +f:arch/s390/include/uapi/asm/tape390.h +f:arch/s390/include/uapi/asm/types.h +f:arch/s390/include/uapi/asm/ucontext.h +f:arch/s390/include/uapi/asm/unistd.h +f:arch/s390/include/uapi/asm/uvdevice.h +f:arch/s390/include/uapi/asm/virtio-ccw.h +f:arch/s390/include/uapi/asm/vmcp.h +f:arch/s390/include/uapi/asm/vtoc.h +f:arch/s390/include/uapi/asm/zcrypt.h +f:arch/s390/kernel/.gitignore +f:arch/s390/kernel/Makefile +f:arch/s390/kernel/abs_lowcore.c +f:arch/s390/kernel/alternative.c +f:arch/s390/kernel/asm-offsets.c +f:arch/s390/kernel/audit.c +f:arch/s390/kernel/audit.h +f:arch/s390/kernel/cache.c +f:arch/s390/kernel/cert_store.c +f:arch/s390/kernel/compat_audit.c +f:arch/s390/kernel/compat_linux.c +f:arch/s390/kernel/compat_linux.h +f:arch/s390/kernel/compat_ptrace.h +f:arch/s390/kernel/compat_signal.c +f:arch/s390/kernel/cpacf.c +f:arch/s390/kernel/cpcmd.c +f:arch/s390/kernel/cpufeature.c +f:arch/s390/kernel/crash_dump.c +f:arch/s390/kernel/ctlreg.c +f:arch/s390/kernel/debug.c +f:arch/s390/kernel/diag/Makefile +f:arch/s390/kernel/diag/diag.c +f:arch/s390/kernel/diag/diag310.c +f:arch/s390/kernel/diag/diag324.c +f:arch/s390/kernel/diag/diag_ioctl.h +f:arch/s390/kernel/diag/diag_misc.c +f:arch/s390/kernel/dis.c +f:arch/s390/kernel/dumpstack.c +f:arch/s390/kernel/early.c +f:arch/s390/kernel/early_printk.c +f:arch/s390/kernel/ebcdic.c +f:arch/s390/kernel/entry.S +f:arch/s390/kernel/entry.h +f:arch/s390/kernel/facility.c +f:arch/s390/kernel/fpu.c +f:arch/s390/kernel/ftrace.c +f:arch/s390/kernel/ftrace.h +f:arch/s390/kernel/guarded_storage.c +f:arch/s390/kernel/head64.S +f:arch/s390/kernel/hiperdispatch.c +f:arch/s390/kernel/idle.c +f:arch/s390/kernel/ima_arch.c +f:arch/s390/kernel/ipl.c +f:arch/s390/kernel/ipl_vmparm.c +f:arch/s390/kernel/irq.c +f:arch/s390/kernel/jump_label.c +f:arch/s390/kernel/kdebugfs.c +f:arch/s390/kernel/kexec_elf.c +f:arch/s390/kernel/kexec_image.c +f:arch/s390/kernel/kprobes.c +f:arch/s390/kernel/lgr.c +f:arch/s390/kernel/machine_kexec.c +f:arch/s390/kernel/machine_kexec_file.c +f:arch/s390/kernel/machine_kexec_reloc.c +f:arch/s390/kernel/mcount.S +f:arch/s390/kernel/module.c +f:arch/s390/kernel/nmi.c +f:arch/s390/kernel/nospec-branch.c +f:arch/s390/kernel/nospec-sysfs.c +f:arch/s390/kernel/numa.c +f:arch/s390/kernel/os_info.c +f:arch/s390/kernel/perf_cpum_cf.c +f:arch/s390/kernel/perf_cpum_cf_events.c +f:arch/s390/kernel/perf_cpum_sf.c +f:arch/s390/kernel/perf_event.c +f:arch/s390/kernel/perf_pai_crypto.c +f:arch/s390/kernel/perf_pai_ext.c +f:arch/s390/kernel/perf_regs.c +f:arch/s390/kernel/process.c +f:arch/s390/kernel/processor.c +f:arch/s390/kernel/ptrace.c +f:arch/s390/kernel/reipl.S +f:arch/s390/kernel/relocate_kernel.S +f:arch/s390/kernel/rethook.c +f:arch/s390/kernel/rethook.h +f:arch/s390/kernel/runtime_instr.c +f:arch/s390/kernel/setup.c +f:arch/s390/kernel/signal.c +f:arch/s390/kernel/skey.c +f:arch/s390/kernel/smp.c +f:arch/s390/kernel/stacktrace.c +f:arch/s390/kernel/sthyi.c +f:arch/s390/kernel/syscall.c +f:arch/s390/kernel/syscalls/Makefile +f:arch/s390/kernel/syscalls/syscall.tbl +f:arch/s390/kernel/syscalls/syscalltbl +f:arch/s390/kernel/sysinfo.c +f:arch/s390/kernel/text_amode31.S +f:arch/s390/kernel/time.c +f:arch/s390/kernel/topology.c +f:arch/s390/kernel/trace.c +f:arch/s390/kernel/traps.c +f:arch/s390/kernel/unwind_bc.c +f:arch/s390/kernel/uprobes.c +f:arch/s390/kernel/uv.c +f:arch/s390/kernel/vdso.c +f:arch/s390/kernel/vdso32/.gitignore +f:arch/s390/kernel/vdso32/Makefile +f:arch/s390/kernel/vdso32/gen_vdso_offsets.sh +f:arch/s390/kernel/vdso32/note.S +f:arch/s390/kernel/vdso32/vdso32.lds.S +f:arch/s390/kernel/vdso32/vdso32_wrapper.S +f:arch/s390/kernel/vdso32/vdso_user_wrapper.S +f:arch/s390/kernel/vdso64/.gitignore +f:arch/s390/kernel/vdso64/Makefile +f:arch/s390/kernel/vdso64/gen_vdso_offsets.sh +f:arch/s390/kernel/vdso64/getcpu.c +f:arch/s390/kernel/vdso64/note.S +f:arch/s390/kernel/vdso64/vdso.h +f:arch/s390/kernel/vdso64/vdso64.lds.S +f:arch/s390/kernel/vdso64/vdso64_generic.c +f:arch/s390/kernel/vdso64/vdso64_wrapper.S +f:arch/s390/kernel/vdso64/vdso_user_wrapper.S +f:arch/s390/kernel/vdso64/vgetrandom-chacha.S +f:arch/s390/kernel/vdso64/vgetrandom.c +f:arch/s390/kernel/vmcore_info.c +f:arch/s390/kernel/vmlinux.lds.S +f:arch/s390/kernel/vtime.c +f:arch/s390/kernel/wti.c +f:arch/s390/kvm/Kconfig +f:arch/s390/kvm/Makefile +f:arch/s390/kvm/diag.c +f:arch/s390/kvm/gaccess.c +f:arch/s390/kvm/gaccess.h +f:arch/s390/kvm/gmap-vsie.c +f:arch/s390/kvm/guestdbg.c +f:arch/s390/kvm/intercept.c +f:arch/s390/kvm/interrupt.c +f:arch/s390/kvm/kvm-s390.c +f:arch/s390/kvm/kvm-s390.h +f:arch/s390/kvm/pci.c +f:arch/s390/kvm/pci.h +f:arch/s390/kvm/priv.c +f:arch/s390/kvm/pv.c +f:arch/s390/kvm/sigp.c +f:arch/s390/kvm/trace-s390.h +f:arch/s390/kvm/trace.h +f:arch/s390/kvm/vsie.c +f:arch/s390/lib/Makefile +f:arch/s390/lib/csum-partial.c +f:arch/s390/lib/delay.c +f:arch/s390/lib/error-inject.c +f:arch/s390/lib/expoline.S +f:arch/s390/lib/find.c +f:arch/s390/lib/mem.S +f:arch/s390/lib/probes.c +f:arch/s390/lib/spinlock.c +f:arch/s390/lib/string.c +f:arch/s390/lib/test_kprobes.c +f:arch/s390/lib/test_kprobes.h +f:arch/s390/lib/test_kprobes_asm.S +f:arch/s390/lib/test_modules.c +f:arch/s390/lib/test_modules.h +f:arch/s390/lib/test_modules_helpers.c +f:arch/s390/lib/test_unwind.c +f:arch/s390/lib/tishift.S +f:arch/s390/lib/uaccess.c +f:arch/s390/lib/xor.c +f:arch/s390/mm/Makefile +f:arch/s390/mm/cmm.c +f:arch/s390/mm/dump_pagetables.c +f:arch/s390/mm/extable.c +f:arch/s390/mm/extmem.c +f:arch/s390/mm/fault.c +f:arch/s390/mm/gmap.c +f:arch/s390/mm/gmap_helpers.c +f:arch/s390/mm/hugetlbpage.c +f:arch/s390/mm/init.c +f:arch/s390/mm/maccess.c +f:arch/s390/mm/mmap.c +f:arch/s390/mm/page-states.c +f:arch/s390/mm/pageattr.c +f:arch/s390/mm/pfault.c +f:arch/s390/mm/pgalloc.c +f:arch/s390/mm/pgtable.c +f:arch/s390/mm/physaddr.c +f:arch/s390/mm/vmem.c +f:arch/s390/net/Makefile +f:arch/s390/net/bpf_jit_comp.c +f:arch/s390/net/pnet.c +f:arch/s390/pci/Makefile +f:arch/s390/pci/pci.c +f:arch/s390/pci/pci_bus.c +f:arch/s390/pci/pci_bus.h +f:arch/s390/pci/pci_clp.c +f:arch/s390/pci/pci_debug.c +f:arch/s390/pci/pci_event.c +f:arch/s390/pci/pci_fixup.c +f:arch/s390/pci/pci_insn.c +f:arch/s390/pci/pci_iov.c +f:arch/s390/pci/pci_iov.h +f:arch/s390/pci/pci_irq.c +f:arch/s390/pci/pci_kvm_hook.c +f:arch/s390/pci/pci_mmio.c +f:arch/s390/pci/pci_report.c +f:arch/s390/pci/pci_report.h +f:arch/s390/pci/pci_sysfs.c +f:arch/s390/purgatory/.gitignore +f:arch/s390/purgatory/Makefile +f:arch/s390/purgatory/head.S +f:arch/s390/purgatory/kexec-purgatory.S +f:arch/s390/purgatory/purgatory.c +f:arch/s390/purgatory/purgatory.lds.S +f:arch/s390/purgatory/string.c +f:arch/s390/tools/.gitignore +f:arch/s390/tools/Makefile +f:arch/s390/tools/gcc-thunk-extern.sh +f:arch/s390/tools/gen_facilities.c +f:arch/s390/tools/gen_opcode_table.c +f:arch/s390/tools/opcodes.txt +f:arch/s390/tools/relocs.c +f:arch/sh/Kbuild +f:arch/sh/Kconfig +f:arch/sh/Kconfig.cpu +f:arch/sh/Kconfig.debug +f:arch/sh/Makefile +f:arch/sh/boards/Kconfig +f:arch/sh/boards/Makefile +f:arch/sh/boards/board-apsh4a3a.c +f:arch/sh/boards/board-apsh4ad0a.c +f:arch/sh/boards/board-edosk7705.c +f:arch/sh/boards/board-edosk7760.c +f:arch/sh/boards/board-espt.c +f:arch/sh/boards/board-magicpanelr2.c +f:arch/sh/boards/board-polaris.c +f:arch/sh/boards/board-secureedge5410.c +f:arch/sh/boards/board-sh2007.c +f:arch/sh/boards/board-sh7757lcr.c +f:arch/sh/boards/board-sh7785lcr.c +f:arch/sh/boards/board-shmin.c +f:arch/sh/boards/board-titan.c +f:arch/sh/boards/board-urquell.c +f:arch/sh/boards/mach-ap325rxa/Makefile +f:arch/sh/boards/mach-ap325rxa/sdram.S +f:arch/sh/boards/mach-ap325rxa/setup.c +f:arch/sh/boards/mach-dreamcast/Makefile +f:arch/sh/boards/mach-dreamcast/irq.c +f:arch/sh/boards/mach-dreamcast/rtc.c +f:arch/sh/boards/mach-dreamcast/setup.c +f:arch/sh/boards/mach-ecovec24/Makefile +f:arch/sh/boards/mach-ecovec24/sdram.S +f:arch/sh/boards/mach-ecovec24/setup.c +f:arch/sh/boards/mach-highlander/Kconfig +f:arch/sh/boards/mach-highlander/Makefile +f:arch/sh/boards/mach-highlander/irq-r7780mp.c +f:arch/sh/boards/mach-highlander/irq-r7780rp.c +f:arch/sh/boards/mach-highlander/irq-r7785rp.c +f:arch/sh/boards/mach-highlander/pinmux-r7785rp.c +f:arch/sh/boards/mach-highlander/psw.c +f:arch/sh/boards/mach-highlander/setup.c +f:arch/sh/boards/mach-hp6xx/Makefile +f:arch/sh/boards/mach-hp6xx/hp6xx_apm.c +f:arch/sh/boards/mach-hp6xx/pm.c +f:arch/sh/boards/mach-hp6xx/pm_wakeup.S +f:arch/sh/boards/mach-hp6xx/setup.c +f:arch/sh/boards/mach-kfr2r09/Makefile +f:arch/sh/boards/mach-kfr2r09/lcd_wqvga.c +f:arch/sh/boards/mach-kfr2r09/sdram.S +f:arch/sh/boards/mach-kfr2r09/setup.c +f:arch/sh/boards/mach-landisk/Makefile +f:arch/sh/boards/mach-landisk/gio.c +f:arch/sh/boards/mach-landisk/irq.c +f:arch/sh/boards/mach-landisk/psw.c +f:arch/sh/boards/mach-landisk/setup.c +f:arch/sh/boards/mach-lboxre2/Makefile +f:arch/sh/boards/mach-lboxre2/irq.c +f:arch/sh/boards/mach-lboxre2/setup.c +f:arch/sh/boards/mach-migor/Kconfig +f:arch/sh/boards/mach-migor/Makefile +f:arch/sh/boards/mach-migor/lcd_qvga.c +f:arch/sh/boards/mach-migor/sdram.S +f:arch/sh/boards/mach-migor/setup.c +f:arch/sh/boards/mach-r2d/Kconfig +f:arch/sh/boards/mach-r2d/Makefile +f:arch/sh/boards/mach-r2d/irq.c +f:arch/sh/boards/mach-r2d/setup.c +f:arch/sh/boards/mach-rsk/Kconfig +f:arch/sh/boards/mach-rsk/Makefile +f:arch/sh/boards/mach-rsk/devices-rsk7203.c +f:arch/sh/boards/mach-rsk/devices-rsk7264.c +f:arch/sh/boards/mach-rsk/devices-rsk7269.c +f:arch/sh/boards/mach-rsk/setup.c +f:arch/sh/boards/mach-sdk7780/Kconfig +f:arch/sh/boards/mach-sdk7780/Makefile +f:arch/sh/boards/mach-sdk7780/irq.c +f:arch/sh/boards/mach-sdk7780/setup.c +f:arch/sh/boards/mach-sdk7786/Makefile +f:arch/sh/boards/mach-sdk7786/fpga.c +f:arch/sh/boards/mach-sdk7786/gpio.c +f:arch/sh/boards/mach-sdk7786/irq.c +f:arch/sh/boards/mach-sdk7786/nmi.c +f:arch/sh/boards/mach-sdk7786/setup.c +f:arch/sh/boards/mach-sdk7786/sram.c +f:arch/sh/boards/mach-se/7206/Makefile +f:arch/sh/boards/mach-se/7206/irq.c +f:arch/sh/boards/mach-se/7206/setup.c +f:arch/sh/boards/mach-se/7343/Makefile +f:arch/sh/boards/mach-se/7343/irq.c +f:arch/sh/boards/mach-se/7343/setup.c +f:arch/sh/boards/mach-se/770x/Makefile +f:arch/sh/boards/mach-se/770x/irq.c +f:arch/sh/boards/mach-se/770x/setup.c +f:arch/sh/boards/mach-se/7721/Makefile +f:arch/sh/boards/mach-se/7721/irq.c +f:arch/sh/boards/mach-se/7721/setup.c +f:arch/sh/boards/mach-se/7722/Makefile +f:arch/sh/boards/mach-se/7722/irq.c +f:arch/sh/boards/mach-se/7722/setup.c +f:arch/sh/boards/mach-se/7724/Makefile +f:arch/sh/boards/mach-se/7724/irq.c +f:arch/sh/boards/mach-se/7724/sdram.S +f:arch/sh/boards/mach-se/7724/setup.c +f:arch/sh/boards/mach-se/7751/Makefile +f:arch/sh/boards/mach-se/7751/irq.c +f:arch/sh/boards/mach-se/7751/setup.c +f:arch/sh/boards/mach-se/7780/Makefile +f:arch/sh/boards/mach-se/7780/irq.c +f:arch/sh/boards/mach-se/7780/setup.c +f:arch/sh/boards/mach-se/Makefile +f:arch/sh/boards/mach-se/board-se7619.c +f:arch/sh/boards/mach-sh03/Makefile +f:arch/sh/boards/mach-sh03/rtc.c +f:arch/sh/boards/mach-sh03/setup.c +f:arch/sh/boards/mach-sh7763rdp/Makefile +f:arch/sh/boards/mach-sh7763rdp/irq.c +f:arch/sh/boards/mach-sh7763rdp/setup.c +f:arch/sh/boards/mach-x3proto/Makefile +f:arch/sh/boards/mach-x3proto/gpio.c +f:arch/sh/boards/mach-x3proto/ilsel.c +f:arch/sh/boards/mach-x3proto/setup.c +f:arch/sh/boards/of-generic.c +f:arch/sh/boot/.gitignore +f:arch/sh/boot/Makefile +f:arch/sh/boot/compressed/.gitignore +f:arch/sh/boot/compressed/Makefile +f:arch/sh/boot/compressed/ashiftrt.S +f:arch/sh/boot/compressed/ashldi3.c +f:arch/sh/boot/compressed/ashlsi3.S +f:arch/sh/boot/compressed/ashrsi3.S +f:arch/sh/boot/compressed/head_32.S +f:arch/sh/boot/compressed/head_64.S +f:arch/sh/boot/compressed/lshrsi3.S +f:arch/sh/boot/compressed/misc.c +f:arch/sh/boot/compressed/misc.h +f:arch/sh/boot/compressed/vmlinux.scr +f:arch/sh/boot/dts/Makefile +f:arch/sh/boot/dts/j2_mimas_v2.dts +f:arch/sh/boot/romimage/Makefile +f:arch/sh/boot/romimage/head.S +f:arch/sh/boot/romimage/mmcif-sh7724.c +f:arch/sh/boot/romimage/vmlinux.scr +f:arch/sh/cchips/Kconfig +f:arch/sh/cchips/hd6446x/Makefile +f:arch/sh/cchips/hd6446x/hd64461.c +f:arch/sh/configs/ap325rxa_defconfig +f:arch/sh/configs/apsh4a3a_defconfig +f:arch/sh/configs/apsh4ad0a_defconfig +f:arch/sh/configs/dreamcast_defconfig +f:arch/sh/configs/ecovec24-romimage_defconfig +f:arch/sh/configs/ecovec24_defconfig +f:arch/sh/configs/edosk7705_defconfig +f:arch/sh/configs/edosk7760_defconfig +f:arch/sh/configs/espt_defconfig +f:arch/sh/configs/hp6xx_defconfig +f:arch/sh/configs/j2_defconfig +f:arch/sh/configs/kfr2r09-romimage_defconfig +f:arch/sh/configs/kfr2r09_defconfig +f:arch/sh/configs/landisk_defconfig +f:arch/sh/configs/lboxre2_defconfig +f:arch/sh/configs/magicpanelr2_defconfig +f:arch/sh/configs/migor_defconfig +f:arch/sh/configs/polaris_defconfig +f:arch/sh/configs/r7780mp_defconfig +f:arch/sh/configs/r7785rp_defconfig +f:arch/sh/configs/rsk7201_defconfig +f:arch/sh/configs/rsk7203_defconfig +f:arch/sh/configs/rsk7264_defconfig +f:arch/sh/configs/rsk7269_defconfig +f:arch/sh/configs/rts7751r2d1_defconfig +f:arch/sh/configs/rts7751r2dplus_defconfig +f:arch/sh/configs/sdk7780_defconfig +f:arch/sh/configs/sdk7786_defconfig +f:arch/sh/configs/se7206_defconfig +f:arch/sh/configs/se7343_defconfig +f:arch/sh/configs/se7619_defconfig +f:arch/sh/configs/se7705_defconfig +f:arch/sh/configs/se7712_defconfig +f:arch/sh/configs/se7721_defconfig +f:arch/sh/configs/se7722_defconfig +f:arch/sh/configs/se7724_defconfig +f:arch/sh/configs/se7750_defconfig +f:arch/sh/configs/se7751_defconfig +f:arch/sh/configs/se7780_defconfig +f:arch/sh/configs/secureedge5410_defconfig +f:arch/sh/configs/sh03_defconfig +f:arch/sh/configs/sh2007_defconfig +f:arch/sh/configs/sh7710voipgw_defconfig +f:arch/sh/configs/sh7724_generic_defconfig +f:arch/sh/configs/sh7757lcr_defconfig +f:arch/sh/configs/sh7763rdp_defconfig +f:arch/sh/configs/sh7770_generic_defconfig +f:arch/sh/configs/sh7785lcr_32bit_defconfig +f:arch/sh/configs/sh7785lcr_defconfig +f:arch/sh/configs/shmin_defconfig +f:arch/sh/configs/shx3_defconfig +f:arch/sh/configs/titan_defconfig +f:arch/sh/configs/ul2_defconfig +f:arch/sh/configs/urquell_defconfig +f:arch/sh/drivers/Kconfig +f:arch/sh/drivers/Makefile +f:arch/sh/drivers/dma/Kconfig +f:arch/sh/drivers/dma/Makefile +f:arch/sh/drivers/dma/dma-api.c +f:arch/sh/drivers/dma/dma-g2.c +f:arch/sh/drivers/dma/dma-pvr2.c +f:arch/sh/drivers/dma/dma-sh.c +f:arch/sh/drivers/dma/dma-sysfs.c +f:arch/sh/drivers/dma/dmabrg.c +f:arch/sh/drivers/heartbeat.c +f:arch/sh/drivers/pci/Makefile +f:arch/sh/drivers/pci/common.c +f:arch/sh/drivers/pci/fixups-dreamcast.c +f:arch/sh/drivers/pci/fixups-landisk.c +f:arch/sh/drivers/pci/fixups-r7780rp.c +f:arch/sh/drivers/pci/fixups-rts7751r2d.c +f:arch/sh/drivers/pci/fixups-sdk7780.c +f:arch/sh/drivers/pci/fixups-sdk7786.c +f:arch/sh/drivers/pci/fixups-se7751.c +f:arch/sh/drivers/pci/fixups-sh03.c +f:arch/sh/drivers/pci/fixups-snapgear.c +f:arch/sh/drivers/pci/fixups-titan.c +f:arch/sh/drivers/pci/ops-dreamcast.c +f:arch/sh/drivers/pci/ops-sh4.c +f:arch/sh/drivers/pci/ops-sh7786.c +f:arch/sh/drivers/pci/pci-dreamcast.c +f:arch/sh/drivers/pci/pci-sh4.h +f:arch/sh/drivers/pci/pci-sh7751.c +f:arch/sh/drivers/pci/pci-sh7751.h +f:arch/sh/drivers/pci/pci-sh7780.c +f:arch/sh/drivers/pci/pci-sh7780.h +f:arch/sh/drivers/pci/pci.c +f:arch/sh/drivers/pci/pcie-sh7786.c +f:arch/sh/drivers/pci/pcie-sh7786.h +f:arch/sh/drivers/platform_early.c +f:arch/sh/drivers/push-switch.c +f:arch/sh/include/asm/Kbuild +f:arch/sh/include/asm/adc.h +f:arch/sh/include/asm/addrspace.h +f:arch/sh/include/asm/alignment.h +f:arch/sh/include/asm/asm-offsets.h +f:arch/sh/include/asm/atomic-grb.h +f:arch/sh/include/asm/atomic-irq.h +f:arch/sh/include/asm/atomic-llsc.h +f:arch/sh/include/asm/atomic.h +f:arch/sh/include/asm/barrier.h +f:arch/sh/include/asm/bitops-cas.h +f:arch/sh/include/asm/bitops-grb.h +f:arch/sh/include/asm/bitops-llsc.h +f:arch/sh/include/asm/bitops-op32.h +f:arch/sh/include/asm/bitops.h +f:arch/sh/include/asm/bl_bit.h +f:arch/sh/include/asm/bl_bit_32.h +f:arch/sh/include/asm/bug.h +f:arch/sh/include/asm/cache.h +f:arch/sh/include/asm/cache_insns.h +f:arch/sh/include/asm/cache_insns_32.h +f:arch/sh/include/asm/cacheflush.h +f:arch/sh/include/asm/cachetype.h +f:arch/sh/include/asm/checksum.h +f:arch/sh/include/asm/checksum_32.h +f:arch/sh/include/asm/clock.h +f:arch/sh/include/asm/cmpxchg-cas.h +f:arch/sh/include/asm/cmpxchg-grb.h +f:arch/sh/include/asm/cmpxchg-irq.h +f:arch/sh/include/asm/cmpxchg-llsc.h +f:arch/sh/include/asm/cmpxchg-xchg.h +f:arch/sh/include/asm/cmpxchg.h +f:arch/sh/include/asm/device.h +f:arch/sh/include/asm/dma-register.h +f:arch/sh/include/asm/dma.h +f:arch/sh/include/asm/dmabrg.h +f:arch/sh/include/asm/dwarf.h +f:arch/sh/include/asm/elf.h +f:arch/sh/include/asm/entry-macros.S +f:arch/sh/include/asm/extable.h +f:arch/sh/include/asm/fixmap.h +f:arch/sh/include/asm/flat.h +f:arch/sh/include/asm/fpu.h +f:arch/sh/include/asm/freq.h +f:arch/sh/include/asm/ftrace.h +f:arch/sh/include/asm/futex-cas.h +f:arch/sh/include/asm/futex-irq.h +f:arch/sh/include/asm/futex-llsc.h +f:arch/sh/include/asm/futex.h +f:arch/sh/include/asm/hardirq.h +f:arch/sh/include/asm/hd64461.h +f:arch/sh/include/asm/heartbeat.h +f:arch/sh/include/asm/hugetlb.h +f:arch/sh/include/asm/hw_breakpoint.h +f:arch/sh/include/asm/hw_irq.h +f:arch/sh/include/asm/i2c-sh7760.h +f:arch/sh/include/asm/io.h +f:arch/sh/include/asm/io_generic.h +f:arch/sh/include/asm/io_noioport.h +f:arch/sh/include/asm/io_trapped.h +f:arch/sh/include/asm/irq.h +f:arch/sh/include/asm/irqflags.h +f:arch/sh/include/asm/kdebug.h +f:arch/sh/include/asm/kexec.h +f:arch/sh/include/asm/kgdb.h +f:arch/sh/include/asm/kprobes.h +f:arch/sh/include/asm/linkage.h +f:arch/sh/include/asm/machvec.h +f:arch/sh/include/asm/mmiowb.h +f:arch/sh/include/asm/mmu.h +f:arch/sh/include/asm/mmu_context.h +f:arch/sh/include/asm/mmu_context_32.h +f:arch/sh/include/asm/mmzone.h +f:arch/sh/include/asm/module.h +f:arch/sh/include/asm/page.h +f:arch/sh/include/asm/pci.h +f:arch/sh/include/asm/perf_event.h +f:arch/sh/include/asm/pgalloc.h +f:arch/sh/include/asm/pgtable-2level.h +f:arch/sh/include/asm/pgtable-3level.h +f:arch/sh/include/asm/pgtable.h +f:arch/sh/include/asm/pgtable_32.h +f:arch/sh/include/asm/platform_early.h +f:arch/sh/include/asm/posix_types.h +f:arch/sh/include/asm/processor.h +f:arch/sh/include/asm/processor_32.h +f:arch/sh/include/asm/ptrace.h +f:arch/sh/include/asm/ptrace_32.h +f:arch/sh/include/asm/push-switch.h +f:arch/sh/include/asm/reboot.h +f:arch/sh/include/asm/romimage-macros.h +f:arch/sh/include/asm/rtc.h +f:arch/sh/include/asm/seccomp.h +f:arch/sh/include/asm/sections.h +f:arch/sh/include/asm/setup.h +f:arch/sh/include/asm/sfp-machine.h +f:arch/sh/include/asm/sh7760fb.h +f:arch/sh/include/asm/sh_bios.h +f:arch/sh/include/asm/shmparam.h +f:arch/sh/include/asm/siu.h +f:arch/sh/include/asm/smc37c93x.h +f:arch/sh/include/asm/smp-ops.h +f:arch/sh/include/asm/smp.h +f:arch/sh/include/asm/sparsemem.h +f:arch/sh/include/asm/spi.h +f:arch/sh/include/asm/spinlock-cas.h +f:arch/sh/include/asm/spinlock-llsc.h +f:arch/sh/include/asm/spinlock.h +f:arch/sh/include/asm/spinlock_types.h +f:arch/sh/include/asm/sram.h +f:arch/sh/include/asm/stackprotector.h +f:arch/sh/include/asm/stacktrace.h +f:arch/sh/include/asm/string.h +f:arch/sh/include/asm/string_32.h +f:arch/sh/include/asm/suspend.h +f:arch/sh/include/asm/switch_to.h +f:arch/sh/include/asm/switch_to_32.h +f:arch/sh/include/asm/syscall.h +f:arch/sh/include/asm/syscall_32.h +f:arch/sh/include/asm/syscalls.h +f:arch/sh/include/asm/syscalls_32.h +f:arch/sh/include/asm/thread_info.h +f:arch/sh/include/asm/timex.h +f:arch/sh/include/asm/tlb.h +f:arch/sh/include/asm/tlbflush.h +f:arch/sh/include/asm/topology.h +f:arch/sh/include/asm/traps.h +f:arch/sh/include/asm/traps_32.h +f:arch/sh/include/asm/types.h +f:arch/sh/include/asm/uaccess.h +f:arch/sh/include/asm/uaccess_32.h +f:arch/sh/include/asm/uncached.h +f:arch/sh/include/asm/unistd.h +f:arch/sh/include/asm/unwinder.h +f:arch/sh/include/asm/user.h +f:arch/sh/include/asm/vermagic.h +f:arch/sh/include/asm/vmalloc.h +f:arch/sh/include/asm/vmlinux.lds.h +f:arch/sh/include/asm/watchdog.h +f:arch/sh/include/asm/word-at-a-time.h +f:arch/sh/include/cpu-common/cpu/addrspace.h +f:arch/sh/include/cpu-common/cpu/mmu_context.h +f:arch/sh/include/cpu-common/cpu/pfc.h +f:arch/sh/include/cpu-common/cpu/rtc.h +f:arch/sh/include/cpu-common/cpu/sigcontext.h +f:arch/sh/include/cpu-common/cpu/timer.h +f:arch/sh/include/cpu-sh2/cpu/cache.h +f:arch/sh/include/cpu-sh2/cpu/freq.h +f:arch/sh/include/cpu-sh2/cpu/watchdog.h +f:arch/sh/include/cpu-sh2a/cpu/addrspace.h +f:arch/sh/include/cpu-sh2a/cpu/cache.h +f:arch/sh/include/cpu-sh2a/cpu/freq.h +f:arch/sh/include/cpu-sh2a/cpu/rtc.h +f:arch/sh/include/cpu-sh2a/cpu/sh7203.h +f:arch/sh/include/cpu-sh2a/cpu/sh7264.h +f:arch/sh/include/cpu-sh2a/cpu/sh7269.h +f:arch/sh/include/cpu-sh2a/cpu/watchdog.h +f:arch/sh/include/cpu-sh3/cpu/adc.h +f:arch/sh/include/cpu-sh3/cpu/cache.h +f:arch/sh/include/cpu-sh3/cpu/dac.h +f:arch/sh/include/cpu-sh3/cpu/dma-register.h +f:arch/sh/include/cpu-sh3/cpu/dma.h +f:arch/sh/include/cpu-sh3/cpu/freq.h +f:arch/sh/include/cpu-sh3/cpu/gpio.h +f:arch/sh/include/cpu-sh3/cpu/mmu_context.h +f:arch/sh/include/cpu-sh3/cpu/serial.h +f:arch/sh/include/cpu-sh3/cpu/sh7720.h +f:arch/sh/include/cpu-sh3/cpu/watchdog.h +f:arch/sh/include/cpu-sh4/cpu/addrspace.h +f:arch/sh/include/cpu-sh4/cpu/cache.h +f:arch/sh/include/cpu-sh4/cpu/dma-register.h +f:arch/sh/include/cpu-sh4/cpu/dma.h +f:arch/sh/include/cpu-sh4/cpu/fpu.h +f:arch/sh/include/cpu-sh4/cpu/freq.h +f:arch/sh/include/cpu-sh4/cpu/mmu_context.h +f:arch/sh/include/cpu-sh4/cpu/rtc.h +f:arch/sh/include/cpu-sh4/cpu/sh7722.h +f:arch/sh/include/cpu-sh4/cpu/sh7723.h +f:arch/sh/include/cpu-sh4/cpu/sh7724.h +f:arch/sh/include/cpu-sh4/cpu/sh7734.h +f:arch/sh/include/cpu-sh4/cpu/sh7757.h +f:arch/sh/include/cpu-sh4/cpu/sh7785.h +f:arch/sh/include/cpu-sh4/cpu/sh7786.h +f:arch/sh/include/cpu-sh4/cpu/shx3.h +f:arch/sh/include/cpu-sh4/cpu/sigcontext.h +f:arch/sh/include/cpu-sh4/cpu/sq.h +f:arch/sh/include/cpu-sh4/cpu/watchdog.h +f:arch/sh/include/cpu-sh4a/cpu/dma.h +f:arch/sh/include/cpu-sh4a/cpu/serial.h +f:arch/sh/include/mach-common/mach/highlander.h +f:arch/sh/include/mach-common/mach/hp6xx.h +f:arch/sh/include/mach-common/mach/lboxre2.h +f:arch/sh/include/mach-common/mach/magicpanelr2.h +f:arch/sh/include/mach-common/mach/mangle-port.h +f:arch/sh/include/mach-common/mach/r2d.h +f:arch/sh/include/mach-common/mach/romimage.h +f:arch/sh/include/mach-common/mach/sdk7780.h +f:arch/sh/include/mach-common/mach/secureedge5410.h +f:arch/sh/include/mach-common/mach/sh2007.h +f:arch/sh/include/mach-common/mach/sh7763rdp.h +f:arch/sh/include/mach-common/mach/sh7785lcr.h +f:arch/sh/include/mach-common/mach/shmin.h +f:arch/sh/include/mach-common/mach/titan.h +f:arch/sh/include/mach-common/mach/urquell.h +f:arch/sh/include/mach-dreamcast/mach/dma.h +f:arch/sh/include/mach-dreamcast/mach/maple.h +f:arch/sh/include/mach-dreamcast/mach/pci.h +f:arch/sh/include/mach-dreamcast/mach/sysasic.h +f:arch/sh/include/mach-ecovec24/mach/partner-jet-setup.txt +f:arch/sh/include/mach-ecovec24/mach/romimage.h +f:arch/sh/include/mach-kfr2r09/mach/kfr2r09.h +f:arch/sh/include/mach-kfr2r09/mach/partner-jet-setup.txt +f:arch/sh/include/mach-kfr2r09/mach/romimage.h +f:arch/sh/include/mach-landisk/mach/gio.h +f:arch/sh/include/mach-landisk/mach/iodata_landisk.h +f:arch/sh/include/mach-migor/mach/migor.h +f:arch/sh/include/mach-sdk7786/mach/fpga.h +f:arch/sh/include/mach-sdk7786/mach/irq.h +f:arch/sh/include/mach-se/mach/mrshpc.h +f:arch/sh/include/mach-se/mach/se.h +f:arch/sh/include/mach-se/mach/se7206.h +f:arch/sh/include/mach-se/mach/se7343.h +f:arch/sh/include/mach-se/mach/se7721.h +f:arch/sh/include/mach-se/mach/se7722.h +f:arch/sh/include/mach-se/mach/se7724.h +f:arch/sh/include/mach-se/mach/se7751.h +f:arch/sh/include/mach-se/mach/se7780.h +f:arch/sh/include/mach-sh03/mach/io.h +f:arch/sh/include/mach-sh03/mach/sh03.h +f:arch/sh/include/mach-x3proto/mach/hardware.h +f:arch/sh/include/mach-x3proto/mach/ilsel.h +f:arch/sh/include/uapi/asm/Kbuild +f:arch/sh/include/uapi/asm/auxvec.h +f:arch/sh/include/uapi/asm/byteorder.h +f:arch/sh/include/uapi/asm/cachectl.h +f:arch/sh/include/uapi/asm/cpu-features.h +f:arch/sh/include/uapi/asm/hw_breakpoint.h +f:arch/sh/include/uapi/asm/ioctls.h +f:arch/sh/include/uapi/asm/posix_types.h +f:arch/sh/include/uapi/asm/posix_types_32.h +f:arch/sh/include/uapi/asm/ptrace.h +f:arch/sh/include/uapi/asm/ptrace_32.h +f:arch/sh/include/uapi/asm/sigcontext.h +f:arch/sh/include/uapi/asm/signal.h +f:arch/sh/include/uapi/asm/sockios.h +f:arch/sh/include/uapi/asm/stat.h +f:arch/sh/include/uapi/asm/swab.h +f:arch/sh/include/uapi/asm/unistd.h +f:arch/sh/kernel/.gitignore +f:arch/sh/kernel/Makefile +f:arch/sh/kernel/asm-offsets.c +f:arch/sh/kernel/cpu/Makefile +f:arch/sh/kernel/cpu/adc.c +f:arch/sh/kernel/cpu/clock-cpg.c +f:arch/sh/kernel/cpu/clock.c +f:arch/sh/kernel/cpu/fpu.c +f:arch/sh/kernel/cpu/init.c +f:arch/sh/kernel/cpu/irq/Makefile +f:arch/sh/kernel/cpu/irq/imask.c +f:arch/sh/kernel/cpu/irq/ipr.c +f:arch/sh/kernel/cpu/pfc.c +f:arch/sh/kernel/cpu/proc.c +f:arch/sh/kernel/cpu/sh2/Makefile +f:arch/sh/kernel/cpu/sh2/clock-sh7619.c +f:arch/sh/kernel/cpu/sh2/entry.S +f:arch/sh/kernel/cpu/sh2/ex.S +f:arch/sh/kernel/cpu/sh2/probe.c +f:arch/sh/kernel/cpu/sh2/setup-sh7619.c +f:arch/sh/kernel/cpu/sh2/smp-j2.c +f:arch/sh/kernel/cpu/sh2a/Makefile +f:arch/sh/kernel/cpu/sh2a/clock-sh7201.c +f:arch/sh/kernel/cpu/sh2a/clock-sh7203.c +f:arch/sh/kernel/cpu/sh2a/clock-sh7206.c +f:arch/sh/kernel/cpu/sh2a/clock-sh7264.c +f:arch/sh/kernel/cpu/sh2a/clock-sh7269.c +f:arch/sh/kernel/cpu/sh2a/entry.S +f:arch/sh/kernel/cpu/sh2a/ex.S +f:arch/sh/kernel/cpu/sh2a/fpu.c +f:arch/sh/kernel/cpu/sh2a/opcode_helper.c +f:arch/sh/kernel/cpu/sh2a/pinmux-sh7203.c +f:arch/sh/kernel/cpu/sh2a/pinmux-sh7264.c +f:arch/sh/kernel/cpu/sh2a/pinmux-sh7269.c +f:arch/sh/kernel/cpu/sh2a/probe.c +f:arch/sh/kernel/cpu/sh2a/setup-mxg.c +f:arch/sh/kernel/cpu/sh2a/setup-sh7201.c +f:arch/sh/kernel/cpu/sh2a/setup-sh7203.c +f:arch/sh/kernel/cpu/sh2a/setup-sh7206.c +f:arch/sh/kernel/cpu/sh2a/setup-sh7264.c +f:arch/sh/kernel/cpu/sh2a/setup-sh7269.c +f:arch/sh/kernel/cpu/sh3/Makefile +f:arch/sh/kernel/cpu/sh3/clock-sh3.c +f:arch/sh/kernel/cpu/sh3/clock-sh7705.c +f:arch/sh/kernel/cpu/sh3/clock-sh7706.c +f:arch/sh/kernel/cpu/sh3/clock-sh7709.c +f:arch/sh/kernel/cpu/sh3/clock-sh7710.c +f:arch/sh/kernel/cpu/sh3/clock-sh7712.c +f:arch/sh/kernel/cpu/sh3/entry.S +f:arch/sh/kernel/cpu/sh3/ex.S +f:arch/sh/kernel/cpu/sh3/pinmux-sh7720.c +f:arch/sh/kernel/cpu/sh3/probe.c +f:arch/sh/kernel/cpu/sh3/serial-sh770x.c +f:arch/sh/kernel/cpu/sh3/serial-sh7710.c +f:arch/sh/kernel/cpu/sh3/serial-sh7720.c +f:arch/sh/kernel/cpu/sh3/setup-sh3.c +f:arch/sh/kernel/cpu/sh3/setup-sh7705.c +f:arch/sh/kernel/cpu/sh3/setup-sh770x.c +f:arch/sh/kernel/cpu/sh3/setup-sh7710.c +f:arch/sh/kernel/cpu/sh3/setup-sh7720.c +f:arch/sh/kernel/cpu/sh3/swsusp.S +f:arch/sh/kernel/cpu/sh4/Makefile +f:arch/sh/kernel/cpu/sh4/clock-sh4.c +f:arch/sh/kernel/cpu/sh4/fpu.c +f:arch/sh/kernel/cpu/sh4/perf_event.c +f:arch/sh/kernel/cpu/sh4/probe.c +f:arch/sh/kernel/cpu/sh4/setup-sh7750.c +f:arch/sh/kernel/cpu/sh4/setup-sh7760.c +f:arch/sh/kernel/cpu/sh4/softfloat.c +f:arch/sh/kernel/cpu/sh4/sq.c +f:arch/sh/kernel/cpu/sh4a/Makefile +f:arch/sh/kernel/cpu/sh4a/clock-sh7343.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7366.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7722.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7723.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7724.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7734.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7757.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7763.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7770.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7780.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7785.c +f:arch/sh/kernel/cpu/sh4a/clock-sh7786.c +f:arch/sh/kernel/cpu/sh4a/clock-shx3.c +f:arch/sh/kernel/cpu/sh4a/intc-shx3.c +f:arch/sh/kernel/cpu/sh4a/perf_event.c +f:arch/sh/kernel/cpu/sh4a/pinmux-sh7722.c +f:arch/sh/kernel/cpu/sh4a/pinmux-sh7723.c +f:arch/sh/kernel/cpu/sh4a/pinmux-sh7724.c +f:arch/sh/kernel/cpu/sh4a/pinmux-sh7734.c +f:arch/sh/kernel/cpu/sh4a/pinmux-sh7757.c +f:arch/sh/kernel/cpu/sh4a/pinmux-sh7785.c +f:arch/sh/kernel/cpu/sh4a/pinmux-sh7786.c +f:arch/sh/kernel/cpu/sh4a/pinmux-shx3.c +f:arch/sh/kernel/cpu/sh4a/serial-sh7722.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7343.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7366.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7722.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7723.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7724.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7734.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7757.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7763.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7770.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7780.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7785.c +f:arch/sh/kernel/cpu/sh4a/setup-sh7786.c +f:arch/sh/kernel/cpu/sh4a/setup-shx3.c +f:arch/sh/kernel/cpu/sh4a/smp-shx3.c +f:arch/sh/kernel/cpu/sh4a/ubc.c +f:arch/sh/kernel/cpu/shmobile/Makefile +f:arch/sh/kernel/cpu/shmobile/cpuidle.c +f:arch/sh/kernel/cpu/shmobile/pm.c +f:arch/sh/kernel/cpu/shmobile/sleep.S +f:arch/sh/kernel/crash_dump.c +f:arch/sh/kernel/debugtraps.S +f:arch/sh/kernel/disassemble.c +f:arch/sh/kernel/dma-coherent.c +f:arch/sh/kernel/dumpstack.c +f:arch/sh/kernel/dwarf.c +f:arch/sh/kernel/entry-common.S +f:arch/sh/kernel/ftrace.c +f:arch/sh/kernel/head_32.S +f:arch/sh/kernel/hw_breakpoint.c +f:arch/sh/kernel/idle.c +f:arch/sh/kernel/io.c +f:arch/sh/kernel/io_trapped.c +f:arch/sh/kernel/ioport.c +f:arch/sh/kernel/irq.c +f:arch/sh/kernel/irq_32.c +f:arch/sh/kernel/kdebugfs.c +f:arch/sh/kernel/kgdb.c +f:arch/sh/kernel/kprobes.c +f:arch/sh/kernel/machine_kexec.c +f:arch/sh/kernel/machvec.c +f:arch/sh/kernel/module.c +f:arch/sh/kernel/nmi_debug.c +f:arch/sh/kernel/perf_callchain.c +f:arch/sh/kernel/perf_event.c +f:arch/sh/kernel/process.c +f:arch/sh/kernel/process_32.c +f:arch/sh/kernel/ptrace.c +f:arch/sh/kernel/ptrace_32.c +f:arch/sh/kernel/reboot.c +f:arch/sh/kernel/relocate_kernel.S +f:arch/sh/kernel/return_address.c +f:arch/sh/kernel/setup.c +f:arch/sh/kernel/sh_bios.c +f:arch/sh/kernel/sh_ksyms_32.c +f:arch/sh/kernel/signal_32.c +f:arch/sh/kernel/smp.c +f:arch/sh/kernel/stacktrace.c +f:arch/sh/kernel/swsusp.c +f:arch/sh/kernel/sys_sh.c +f:arch/sh/kernel/sys_sh32.c +f:arch/sh/kernel/syscalls/Makefile +f:arch/sh/kernel/syscalls/syscall.tbl +f:arch/sh/kernel/syscalls_32.S +f:arch/sh/kernel/time.c +f:arch/sh/kernel/topology.c +f:arch/sh/kernel/traps.c +f:arch/sh/kernel/traps_32.c +f:arch/sh/kernel/unwinder.c +f:arch/sh/kernel/vmcore_info.c +f:arch/sh/kernel/vmlinux.lds.S +f:arch/sh/kernel/vsyscall/.gitignore +f:arch/sh/kernel/vsyscall/Makefile +f:arch/sh/kernel/vsyscall/vsyscall-note.S +f:arch/sh/kernel/vsyscall/vsyscall-sigreturn.S +f:arch/sh/kernel/vsyscall/vsyscall-syscall.S +f:arch/sh/kernel/vsyscall/vsyscall-trapa.S +f:arch/sh/kernel/vsyscall/vsyscall.c +f:arch/sh/kernel/vsyscall/vsyscall.lds.S +f:arch/sh/lib/Makefile +f:arch/sh/lib/__clear_user.S +f:arch/sh/lib/ashiftrt.S +f:arch/sh/lib/ashlsi3.S +f:arch/sh/lib/ashrsi3.S +f:arch/sh/lib/checksum.S +f:arch/sh/lib/copy_page.S +f:arch/sh/lib/delay.c +f:arch/sh/lib/div64-generic.c +f:arch/sh/lib/div64.S +f:arch/sh/lib/io.c +f:arch/sh/lib/libgcc.h +f:arch/sh/lib/lshrsi3.S +f:arch/sh/lib/mcount.S +f:arch/sh/lib/memchr.S +f:arch/sh/lib/memcpy-sh4.S +f:arch/sh/lib/memcpy.S +f:arch/sh/lib/memmove.S +f:arch/sh/lib/memset-sh4.S +f:arch/sh/lib/memset.S +f:arch/sh/lib/movmem.S +f:arch/sh/lib/strlen.S +f:arch/sh/lib/udiv_qrnnd.S +f:arch/sh/lib/udivsi3.S +f:arch/sh/lib/udivsi3_i4i-Os.S +f:arch/sh/lib/udivsi3_i4i.S +f:arch/sh/math-emu/Makefile +f:arch/sh/math-emu/math.c +f:arch/sh/math-emu/sfp-util.h +f:arch/sh/mm/Kconfig +f:arch/sh/mm/Makefile +f:arch/sh/mm/alignment.c +f:arch/sh/mm/asids-debugfs.c +f:arch/sh/mm/cache-debugfs.c +f:arch/sh/mm/cache-j2.c +f:arch/sh/mm/cache-sh2.c +f:arch/sh/mm/cache-sh2a.c +f:arch/sh/mm/cache-sh3.c +f:arch/sh/mm/cache-sh4.c +f:arch/sh/mm/cache-sh7705.c +f:arch/sh/mm/cache-shx3.c +f:arch/sh/mm/cache.c +f:arch/sh/mm/consistent.c +f:arch/sh/mm/extable_32.c +f:arch/sh/mm/fault.c +f:arch/sh/mm/flush-sh4.c +f:arch/sh/mm/hugetlbpage.c +f:arch/sh/mm/init.c +f:arch/sh/mm/ioremap.c +f:arch/sh/mm/ioremap.h +f:arch/sh/mm/ioremap_fixed.c +f:arch/sh/mm/kmap.c +f:arch/sh/mm/mmap.c +f:arch/sh/mm/nommu.c +f:arch/sh/mm/numa.c +f:arch/sh/mm/pgtable.c +f:arch/sh/mm/pmb.c +f:arch/sh/mm/sram.c +f:arch/sh/mm/tlb-debugfs.c +f:arch/sh/mm/tlb-pteaex.c +f:arch/sh/mm/tlb-sh3.c +f:arch/sh/mm/tlb-sh4.c +f:arch/sh/mm/tlb-urb.c +f:arch/sh/mm/tlbex_32.c +f:arch/sh/mm/tlbflush_32.c +f:arch/sh/mm/uncached.c +f:arch/sh/tools/Makefile +f:arch/sh/tools/gen-mach-types +f:arch/sh/tools/mach-types +f:arch/sparc/Kbuild +f:arch/sparc/Kconfig +f:arch/sparc/Kconfig.debug +f:arch/sparc/Makefile +f:arch/sparc/boot/.gitignore +f:arch/sparc/boot/Makefile +f:arch/sparc/boot/install.sh +f:arch/sparc/boot/piggyback.c +f:arch/sparc/configs/sparc32_defconfig +f:arch/sparc/configs/sparc64_defconfig +f:arch/sparc/crypto/Kconfig +f:arch/sparc/crypto/Makefile +f:arch/sparc/crypto/aes_asm.S +f:arch/sparc/crypto/aes_glue.c +f:arch/sparc/crypto/camellia_asm.S +f:arch/sparc/crypto/camellia_glue.c +f:arch/sparc/crypto/crop_devid.c +f:arch/sparc/crypto/des_asm.S +f:arch/sparc/crypto/des_glue.c +f:arch/sparc/crypto/md5_asm.S +f:arch/sparc/crypto/md5_glue.c +f:arch/sparc/include/asm/Kbuild +f:arch/sparc/include/asm/adi.h +f:arch/sparc/include/asm/adi_64.h +f:arch/sparc/include/asm/apb.h +f:arch/sparc/include/asm/asm-offsets.h +f:arch/sparc/include/asm/asm-prototypes.h +f:arch/sparc/include/asm/asm.h +f:arch/sparc/include/asm/asmmacro.h +f:arch/sparc/include/asm/atomic.h +f:arch/sparc/include/asm/atomic_32.h +f:arch/sparc/include/asm/atomic_64.h +f:arch/sparc/include/asm/auxio.h +f:arch/sparc/include/asm/auxio_32.h +f:arch/sparc/include/asm/auxio_64.h +f:arch/sparc/include/asm/backoff.h +f:arch/sparc/include/asm/barrier.h +f:arch/sparc/include/asm/barrier_32.h +f:arch/sparc/include/asm/barrier_64.h +f:arch/sparc/include/asm/bbc.h +f:arch/sparc/include/asm/bitext.h +f:arch/sparc/include/asm/bitops.h +f:arch/sparc/include/asm/bitops_32.h +f:arch/sparc/include/asm/bitops_64.h +f:arch/sparc/include/asm/btext.h +f:arch/sparc/include/asm/bug.h +f:arch/sparc/include/asm/cache.h +f:arch/sparc/include/asm/cacheflush.h +f:arch/sparc/include/asm/cacheflush_32.h +f:arch/sparc/include/asm/cacheflush_64.h +f:arch/sparc/include/asm/cachetlb_32.h +f:arch/sparc/include/asm/cachetype.h +f:arch/sparc/include/asm/chafsr.h +f:arch/sparc/include/asm/checksum.h +f:arch/sparc/include/asm/checksum_32.h +f:arch/sparc/include/asm/checksum_64.h +f:arch/sparc/include/asm/chmctrl.h +f:arch/sparc/include/asm/clock.h +f:arch/sparc/include/asm/clocksource.h +f:arch/sparc/include/asm/cmpxchg.h +f:arch/sparc/include/asm/cmpxchg_32.h +f:arch/sparc/include/asm/cmpxchg_64.h +f:arch/sparc/include/asm/compat.h +f:arch/sparc/include/asm/compat_signal.h +f:arch/sparc/include/asm/contregs.h +f:arch/sparc/include/asm/cpu_type.h +f:arch/sparc/include/asm/cpudata.h +f:arch/sparc/include/asm/cpudata_32.h +f:arch/sparc/include/asm/cpudata_64.h +f:arch/sparc/include/asm/current.h +f:arch/sparc/include/asm/dcr.h +f:arch/sparc/include/asm/dcu.h +f:arch/sparc/include/asm/delay.h +f:arch/sparc/include/asm/delay_32.h +f:arch/sparc/include/asm/delay_64.h +f:arch/sparc/include/asm/device.h +f:arch/sparc/include/asm/dma-mapping.h +f:arch/sparc/include/asm/dma.h +f:arch/sparc/include/asm/ebus_dma.h +f:arch/sparc/include/asm/ecc.h +f:arch/sparc/include/asm/eeprom.h +f:arch/sparc/include/asm/elf.h +f:arch/sparc/include/asm/elf_32.h +f:arch/sparc/include/asm/elf_64.h +f:arch/sparc/include/asm/estate.h +f:arch/sparc/include/asm/extable.h +f:arch/sparc/include/asm/fbio.h +f:arch/sparc/include/asm/fhc.h +f:arch/sparc/include/asm/floppy.h +f:arch/sparc/include/asm/floppy_32.h +f:arch/sparc/include/asm/floppy_64.h +f:arch/sparc/include/asm/fpumacro.h +f:arch/sparc/include/asm/ftrace.h +f:arch/sparc/include/asm/futex.h +f:arch/sparc/include/asm/futex_32.h +f:arch/sparc/include/asm/futex_64.h +f:arch/sparc/include/asm/hardirq.h +f:arch/sparc/include/asm/hardirq_32.h +f:arch/sparc/include/asm/hardirq_64.h +f:arch/sparc/include/asm/head.h +f:arch/sparc/include/asm/head_32.h +f:arch/sparc/include/asm/head_64.h +f:arch/sparc/include/asm/hibernate.h +f:arch/sparc/include/asm/highmem.h +f:arch/sparc/include/asm/hugetlb.h +f:arch/sparc/include/asm/hvtramp.h +f:arch/sparc/include/asm/hw_irq.h +f:arch/sparc/include/asm/hypervisor.h +f:arch/sparc/include/asm/idprom.h +f:arch/sparc/include/asm/intr_queue.h +f:arch/sparc/include/asm/io-unit.h +f:arch/sparc/include/asm/io.h +f:arch/sparc/include/asm/io_32.h +f:arch/sparc/include/asm/io_64.h +f:arch/sparc/include/asm/ioctls.h +f:arch/sparc/include/asm/iommu-common.h +f:arch/sparc/include/asm/iommu.h +f:arch/sparc/include/asm/iommu_32.h +f:arch/sparc/include/asm/iommu_64.h +f:arch/sparc/include/asm/irq.h +f:arch/sparc/include/asm/irq_32.h +f:arch/sparc/include/asm/irq_64.h +f:arch/sparc/include/asm/irqflags.h +f:arch/sparc/include/asm/irqflags_32.h +f:arch/sparc/include/asm/irqflags_64.h +f:arch/sparc/include/asm/jump_label.h +f:arch/sparc/include/asm/kdebug.h +f:arch/sparc/include/asm/kdebug_32.h +f:arch/sparc/include/asm/kdebug_64.h +f:arch/sparc/include/asm/kgdb.h +f:arch/sparc/include/asm/kprobes.h +f:arch/sparc/include/asm/ldc.h +f:arch/sparc/include/asm/leon.h +f:arch/sparc/include/asm/leon_amba.h +f:arch/sparc/include/asm/leon_pci.h +f:arch/sparc/include/asm/lsu.h +f:arch/sparc/include/asm/machines.h +f:arch/sparc/include/asm/mbus.h +f:arch/sparc/include/asm/mc146818rtc.h +f:arch/sparc/include/asm/mc146818rtc_32.h +f:arch/sparc/include/asm/mc146818rtc_64.h +f:arch/sparc/include/asm/mdesc.h +f:arch/sparc/include/asm/memctrl.h +f:arch/sparc/include/asm/mman.h +f:arch/sparc/include/asm/mmu.h +f:arch/sparc/include/asm/mmu_32.h +f:arch/sparc/include/asm/mmu_64.h +f:arch/sparc/include/asm/mmu_context.h +f:arch/sparc/include/asm/mmu_context_32.h +f:arch/sparc/include/asm/mmu_context_64.h +f:arch/sparc/include/asm/mmzone.h +f:arch/sparc/include/asm/mxcc.h +f:arch/sparc/include/asm/nmi.h +f:arch/sparc/include/asm/ns87303.h +f:arch/sparc/include/asm/obio.h +f:arch/sparc/include/asm/opcodes.h +f:arch/sparc/include/asm/openprom.h +f:arch/sparc/include/asm/oplib.h +f:arch/sparc/include/asm/oplib_32.h +f:arch/sparc/include/asm/oplib_64.h +f:arch/sparc/include/asm/page.h +f:arch/sparc/include/asm/page_32.h +f:arch/sparc/include/asm/page_64.h +f:arch/sparc/include/asm/parport.h +f:arch/sparc/include/asm/parport_64.h +f:arch/sparc/include/asm/pbm.h +f:arch/sparc/include/asm/pci.h +f:arch/sparc/include/asm/pcic.h +f:arch/sparc/include/asm/pcr.h +f:arch/sparc/include/asm/percpu.h +f:arch/sparc/include/asm/percpu_32.h +f:arch/sparc/include/asm/percpu_64.h +f:arch/sparc/include/asm/perf_event.h +f:arch/sparc/include/asm/pgalloc.h +f:arch/sparc/include/asm/pgalloc_32.h +f:arch/sparc/include/asm/pgalloc_64.h +f:arch/sparc/include/asm/pgtable.h +f:arch/sparc/include/asm/pgtable_32.h +f:arch/sparc/include/asm/pgtable_64.h +f:arch/sparc/include/asm/pgtsrmmu.h +f:arch/sparc/include/asm/pil.h +f:arch/sparc/include/asm/processor.h +f:arch/sparc/include/asm/processor_32.h +f:arch/sparc/include/asm/processor_64.h +f:arch/sparc/include/asm/prom.h +f:arch/sparc/include/asm/psr.h +f:arch/sparc/include/asm/ptrace.h +f:arch/sparc/include/asm/qrwlock.h +f:arch/sparc/include/asm/qspinlock.h +f:arch/sparc/include/asm/ross.h +f:arch/sparc/include/asm/sbi.h +f:arch/sparc/include/asm/scratchpad.h +f:arch/sparc/include/asm/seccomp.h +f:arch/sparc/include/asm/sections.h +f:arch/sparc/include/asm/setup.h +f:arch/sparc/include/asm/sfafsr.h +f:arch/sparc/include/asm/sfp-machine.h +f:arch/sparc/include/asm/sfp-machine_32.h +f:arch/sparc/include/asm/sfp-machine_64.h +f:arch/sparc/include/asm/shmparam.h +f:arch/sparc/include/asm/shmparam_32.h +f:arch/sparc/include/asm/shmparam_64.h +f:arch/sparc/include/asm/sigcontext.h +f:arch/sparc/include/asm/signal.h +f:arch/sparc/include/asm/smp.h +f:arch/sparc/include/asm/smp_32.h +f:arch/sparc/include/asm/smp_64.h +f:arch/sparc/include/asm/sparsemem.h +f:arch/sparc/include/asm/spinlock.h +f:arch/sparc/include/asm/spinlock_32.h +f:arch/sparc/include/asm/spinlock_64.h +f:arch/sparc/include/asm/spinlock_types.h +f:arch/sparc/include/asm/spitfire.h +f:arch/sparc/include/asm/stacktrace.h +f:arch/sparc/include/asm/starfire.h +f:arch/sparc/include/asm/string.h +f:arch/sparc/include/asm/string_32.h +f:arch/sparc/include/asm/string_64.h +f:arch/sparc/include/asm/sunbpp.h +f:arch/sparc/include/asm/swift.h +f:arch/sparc/include/asm/switch_to.h +f:arch/sparc/include/asm/switch_to_32.h +f:arch/sparc/include/asm/switch_to_64.h +f:arch/sparc/include/asm/syscall.h +f:arch/sparc/include/asm/syscalls.h +f:arch/sparc/include/asm/termbits.h +f:arch/sparc/include/asm/thread_info.h +f:arch/sparc/include/asm/thread_info_32.h +f:arch/sparc/include/asm/thread_info_64.h +f:arch/sparc/include/asm/timer.h +f:arch/sparc/include/asm/timer_32.h +f:arch/sparc/include/asm/timer_64.h +f:arch/sparc/include/asm/timex.h +f:arch/sparc/include/asm/timex_32.h +f:arch/sparc/include/asm/timex_64.h +f:arch/sparc/include/asm/tlb.h +f:arch/sparc/include/asm/tlb_32.h +f:arch/sparc/include/asm/tlb_64.h +f:arch/sparc/include/asm/tlbflush.h +f:arch/sparc/include/asm/tlbflush_32.h +f:arch/sparc/include/asm/tlbflush_64.h +f:arch/sparc/include/asm/topology.h +f:arch/sparc/include/asm/topology_32.h +f:arch/sparc/include/asm/topology_64.h +f:arch/sparc/include/asm/trap_block.h +f:arch/sparc/include/asm/traps.h +f:arch/sparc/include/asm/tsb.h +f:arch/sparc/include/asm/tsunami.h +f:arch/sparc/include/asm/ttable.h +f:arch/sparc/include/asm/turbosparc.h +f:arch/sparc/include/asm/uaccess.h +f:arch/sparc/include/asm/uaccess_32.h +f:arch/sparc/include/asm/uaccess_64.h +f:arch/sparc/include/asm/unistd.h +f:arch/sparc/include/asm/upa.h +f:arch/sparc/include/asm/uprobes.h +f:arch/sparc/include/asm/user.h +f:arch/sparc/include/asm/vaddrs.h +f:arch/sparc/include/asm/vdso.h +f:arch/sparc/include/asm/video.h +f:arch/sparc/include/asm/viking.h +f:arch/sparc/include/asm/vio.h +f:arch/sparc/include/asm/visasm.h +f:arch/sparc/include/asm/vmalloc.h +f:arch/sparc/include/asm/vvar.h +f:arch/sparc/include/asm/winmacro.h +f:arch/sparc/include/asm/xor.h +f:arch/sparc/include/asm/xor_32.h +f:arch/sparc/include/asm/xor_64.h +f:arch/sparc/include/uapi/asm/Kbuild +f:arch/sparc/include/uapi/asm/apc.h +f:arch/sparc/include/uapi/asm/asi.h +f:arch/sparc/include/uapi/asm/auxvec.h +f:arch/sparc/include/uapi/asm/bitsperlong.h +f:arch/sparc/include/uapi/asm/byteorder.h +f:arch/sparc/include/uapi/asm/display7seg.h +f:arch/sparc/include/uapi/asm/envctrl.h +f:arch/sparc/include/uapi/asm/errno.h +f:arch/sparc/include/uapi/asm/fbio.h +f:arch/sparc/include/uapi/asm/fcntl.h +f:arch/sparc/include/uapi/asm/ioctl.h +f:arch/sparc/include/uapi/asm/ioctls.h +f:arch/sparc/include/uapi/asm/ipcbuf.h +f:arch/sparc/include/uapi/asm/mman.h +f:arch/sparc/include/uapi/asm/msgbuf.h +f:arch/sparc/include/uapi/asm/openpromio.h +f:arch/sparc/include/uapi/asm/oradax.h +f:arch/sparc/include/uapi/asm/param.h +f:arch/sparc/include/uapi/asm/perfctr.h +f:arch/sparc/include/uapi/asm/poll.h +f:arch/sparc/include/uapi/asm/posix_types.h +f:arch/sparc/include/uapi/asm/psr.h +f:arch/sparc/include/uapi/asm/psrcompat.h +f:arch/sparc/include/uapi/asm/pstate.h +f:arch/sparc/include/uapi/asm/ptrace.h +f:arch/sparc/include/uapi/asm/resource.h +f:arch/sparc/include/uapi/asm/sembuf.h +f:arch/sparc/include/uapi/asm/setup.h +f:arch/sparc/include/uapi/asm/shmbuf.h +f:arch/sparc/include/uapi/asm/sigcontext.h +f:arch/sparc/include/uapi/asm/siginfo.h +f:arch/sparc/include/uapi/asm/signal.h +f:arch/sparc/include/uapi/asm/socket.h +f:arch/sparc/include/uapi/asm/stat.h +f:arch/sparc/include/uapi/asm/swab.h +f:arch/sparc/include/uapi/asm/termbits.h +f:arch/sparc/include/uapi/asm/termios.h +f:arch/sparc/include/uapi/asm/traps.h +f:arch/sparc/include/uapi/asm/uctx.h +f:arch/sparc/include/uapi/asm/unistd.h +f:arch/sparc/include/uapi/asm/utrap.h +f:arch/sparc/include/uapi/asm/watchdog.h +f:arch/sparc/kernel/.gitignore +f:arch/sparc/kernel/Makefile +f:arch/sparc/kernel/adi_64.c +f:arch/sparc/kernel/apc.c +f:arch/sparc/kernel/asm-offsets.c +f:arch/sparc/kernel/audit.c +f:arch/sparc/kernel/auxio_32.c +f:arch/sparc/kernel/auxio_64.c +f:arch/sparc/kernel/btext.c +f:arch/sparc/kernel/central.c +f:arch/sparc/kernel/cherrs.S +f:arch/sparc/kernel/chmc.c +f:arch/sparc/kernel/compat_audit.c +f:arch/sparc/kernel/cpu.c +f:arch/sparc/kernel/cpumap.c +f:arch/sparc/kernel/cpumap.h +f:arch/sparc/kernel/devices.c +f:arch/sparc/kernel/ds.c +f:arch/sparc/kernel/dtlb_miss.S +f:arch/sparc/kernel/dtlb_prot.S +f:arch/sparc/kernel/ebus.c +f:arch/sparc/kernel/entry.S +f:arch/sparc/kernel/entry.h +f:arch/sparc/kernel/etrap_32.S +f:arch/sparc/kernel/etrap_64.S +f:arch/sparc/kernel/fpu_traps.S +f:arch/sparc/kernel/ftrace.c +f:arch/sparc/kernel/getsetcc.S +f:arch/sparc/kernel/head_32.S +f:arch/sparc/kernel/head_64.S +f:arch/sparc/kernel/helpers.S +f:arch/sparc/kernel/hvapi.c +f:arch/sparc/kernel/hvcalls.S +f:arch/sparc/kernel/hvtramp.S +f:arch/sparc/kernel/idprom.c +f:arch/sparc/kernel/iommu-common.c +f:arch/sparc/kernel/iommu.c +f:arch/sparc/kernel/iommu_common.h +f:arch/sparc/kernel/ioport.c +f:arch/sparc/kernel/irq.h +f:arch/sparc/kernel/irq_32.c +f:arch/sparc/kernel/irq_64.c +f:arch/sparc/kernel/itlb_miss.S +f:arch/sparc/kernel/ivec.S +f:arch/sparc/kernel/jump_label.c +f:arch/sparc/kernel/kernel.h +f:arch/sparc/kernel/kgdb_32.c +f:arch/sparc/kernel/kgdb_64.c +f:arch/sparc/kernel/kprobes.c +f:arch/sparc/kernel/kstack.h +f:arch/sparc/kernel/ktlb.S +f:arch/sparc/kernel/ldc.c +f:arch/sparc/kernel/led.c +f:arch/sparc/kernel/leon_kernel.c +f:arch/sparc/kernel/leon_pci.c +f:arch/sparc/kernel/leon_pci_grpci1.c +f:arch/sparc/kernel/leon_pci_grpci2.c +f:arch/sparc/kernel/leon_pmc.c +f:arch/sparc/kernel/leon_smp.c +f:arch/sparc/kernel/mdesc.c +f:arch/sparc/kernel/misctrap.S +f:arch/sparc/kernel/module.c +f:arch/sparc/kernel/nmi.c +f:arch/sparc/kernel/of_device_32.c +f:arch/sparc/kernel/of_device_64.c +f:arch/sparc/kernel/of_device_common.c +f:arch/sparc/kernel/of_device_common.h +f:arch/sparc/kernel/pci.c +f:arch/sparc/kernel/pci_common.c +f:arch/sparc/kernel/pci_fire.c +f:arch/sparc/kernel/pci_impl.h +f:arch/sparc/kernel/pci_msi.c +f:arch/sparc/kernel/pci_psycho.c +f:arch/sparc/kernel/pci_sabre.c +f:arch/sparc/kernel/pci_schizo.c +f:arch/sparc/kernel/pci_sun4v.c +f:arch/sparc/kernel/pci_sun4v.h +f:arch/sparc/kernel/pci_sun4v_asm.S +f:arch/sparc/kernel/pcic.c +f:arch/sparc/kernel/pcr.c +f:arch/sparc/kernel/perf_event.c +f:arch/sparc/kernel/pmc.c +f:arch/sparc/kernel/power.c +f:arch/sparc/kernel/process.c +f:arch/sparc/kernel/process_32.c +f:arch/sparc/kernel/process_64.c +f:arch/sparc/kernel/prom.h +f:arch/sparc/kernel/prom_32.c +f:arch/sparc/kernel/prom_64.c +f:arch/sparc/kernel/prom_common.c +f:arch/sparc/kernel/prom_irqtrans.c +f:arch/sparc/kernel/psycho_common.c +f:arch/sparc/kernel/psycho_common.h +f:arch/sparc/kernel/ptrace_32.c +f:arch/sparc/kernel/ptrace_64.c +f:arch/sparc/kernel/reboot.c +f:arch/sparc/kernel/rtrap_32.S +f:arch/sparc/kernel/rtrap_64.S +f:arch/sparc/kernel/sbus.c +f:arch/sparc/kernel/setup.c +f:arch/sparc/kernel/setup_32.c +f:arch/sparc/kernel/setup_64.c +f:arch/sparc/kernel/signal32.c +f:arch/sparc/kernel/signal_32.c +f:arch/sparc/kernel/signal_64.c +f:arch/sparc/kernel/sigutil.h +f:arch/sparc/kernel/sigutil_32.c +f:arch/sparc/kernel/sigutil_64.c +f:arch/sparc/kernel/smp_32.c +f:arch/sparc/kernel/smp_64.c +f:arch/sparc/kernel/sparc_ksyms.c +f:arch/sparc/kernel/spiterrs.S +f:arch/sparc/kernel/sstate.c +f:arch/sparc/kernel/stacktrace.c +f:arch/sparc/kernel/starfire.c +f:arch/sparc/kernel/sun4d_irq.c +f:arch/sparc/kernel/sun4d_smp.c +f:arch/sparc/kernel/sun4m_irq.c +f:arch/sparc/kernel/sun4m_smp.c +f:arch/sparc/kernel/sun4v_ivec.S +f:arch/sparc/kernel/sun4v_mcd.S +f:arch/sparc/kernel/sun4v_tlb_miss.S +f:arch/sparc/kernel/sys32.S +f:arch/sparc/kernel/sys_sparc32.c +f:arch/sparc/kernel/sys_sparc_32.c +f:arch/sparc/kernel/sys_sparc_64.c +f:arch/sparc/kernel/syscalls.S +f:arch/sparc/kernel/syscalls/Makefile +f:arch/sparc/kernel/syscalls/syscall.tbl +f:arch/sparc/kernel/sysfs.c +f:arch/sparc/kernel/systbls.h +f:arch/sparc/kernel/systbls_32.S +f:arch/sparc/kernel/systbls_64.S +f:arch/sparc/kernel/termios.c +f:arch/sparc/kernel/time_32.c +f:arch/sparc/kernel/time_64.c +f:arch/sparc/kernel/trampoline_32.S +f:arch/sparc/kernel/trampoline_64.S +f:arch/sparc/kernel/traps_32.c +f:arch/sparc/kernel/traps_64.c +f:arch/sparc/kernel/tsb.S +f:arch/sparc/kernel/ttable_32.S +f:arch/sparc/kernel/ttable_64.S +f:arch/sparc/kernel/una_asm_32.S +f:arch/sparc/kernel/una_asm_64.S +f:arch/sparc/kernel/unaligned_32.c +f:arch/sparc/kernel/unaligned_64.c +f:arch/sparc/kernel/uprobes.c +f:arch/sparc/kernel/urtt_fill.S +f:arch/sparc/kernel/utrap.S +f:arch/sparc/kernel/vdso.c +f:arch/sparc/kernel/vio.c +f:arch/sparc/kernel/viohs.c +f:arch/sparc/kernel/visemul.c +f:arch/sparc/kernel/vmlinux.lds.S +f:arch/sparc/kernel/windows.c +f:arch/sparc/kernel/winfixup.S +f:arch/sparc/kernel/wof.S +f:arch/sparc/kernel/wuf.S +f:arch/sparc/lib/GENbzero.S +f:arch/sparc/lib/GENcopy_from_user.S +f:arch/sparc/lib/GENcopy_to_user.S +f:arch/sparc/lib/GENmemcpy.S +f:arch/sparc/lib/GENpage.S +f:arch/sparc/lib/GENpatch.S +f:arch/sparc/lib/M7copy_from_user.S +f:arch/sparc/lib/M7copy_to_user.S +f:arch/sparc/lib/M7memcpy.S +f:arch/sparc/lib/M7memset.S +f:arch/sparc/lib/M7patch.S +f:arch/sparc/lib/Makefile +f:arch/sparc/lib/Memcpy_utils.S +f:arch/sparc/lib/NG2copy_from_user.S +f:arch/sparc/lib/NG2copy_to_user.S +f:arch/sparc/lib/NG2memcpy.S +f:arch/sparc/lib/NG2patch.S +f:arch/sparc/lib/NG4clear_page.S +f:arch/sparc/lib/NG4copy_from_user.S +f:arch/sparc/lib/NG4copy_page.S +f:arch/sparc/lib/NG4copy_to_user.S +f:arch/sparc/lib/NG4fls.S +f:arch/sparc/lib/NG4memcpy.S +f:arch/sparc/lib/NG4memset.S +f:arch/sparc/lib/NG4patch.S +f:arch/sparc/lib/NGbzero.S +f:arch/sparc/lib/NGcopy_from_user.S +f:arch/sparc/lib/NGcopy_to_user.S +f:arch/sparc/lib/NGmemcpy.S +f:arch/sparc/lib/NGpage.S +f:arch/sparc/lib/NGpatch.S +f:arch/sparc/lib/PeeCeeI.c +f:arch/sparc/lib/U1copy_from_user.S +f:arch/sparc/lib/U1copy_to_user.S +f:arch/sparc/lib/U1memcpy.S +f:arch/sparc/lib/U3copy_from_user.S +f:arch/sparc/lib/U3copy_to_user.S +f:arch/sparc/lib/U3memcpy.S +f:arch/sparc/lib/U3patch.S +f:arch/sparc/lib/VISsave.S +f:arch/sparc/lib/ashldi3.S +f:arch/sparc/lib/ashrdi3.S +f:arch/sparc/lib/atomic32.c +f:arch/sparc/lib/atomic_64.S +f:arch/sparc/lib/bitext.c +f:arch/sparc/lib/bitops.S +f:arch/sparc/lib/blockops.S +f:arch/sparc/lib/bzero.S +f:arch/sparc/lib/checksum_32.S +f:arch/sparc/lib/checksum_64.S +f:arch/sparc/lib/clear_page.S +f:arch/sparc/lib/copy_in_user.S +f:arch/sparc/lib/copy_page.S +f:arch/sparc/lib/copy_user.S +f:arch/sparc/lib/csum_copy.S +f:arch/sparc/lib/csum_copy_from_user.S +f:arch/sparc/lib/csum_copy_to_user.S +f:arch/sparc/lib/divdi3.S +f:arch/sparc/lib/ffs.S +f:arch/sparc/lib/fls.S +f:arch/sparc/lib/fls64.S +f:arch/sparc/lib/hweight.S +f:arch/sparc/lib/iomap.c +f:arch/sparc/lib/ipcsum.S +f:arch/sparc/lib/libgcc.h +f:arch/sparc/lib/locks.S +f:arch/sparc/lib/lshrdi3.S +f:arch/sparc/lib/mcount.S +f:arch/sparc/lib/memcmp.S +f:arch/sparc/lib/memcpy.S +f:arch/sparc/lib/memmove.S +f:arch/sparc/lib/memscan_32.S +f:arch/sparc/lib/memscan_64.S +f:arch/sparc/lib/memset.S +f:arch/sparc/lib/muldi3.S +f:arch/sparc/lib/multi3.S +f:arch/sparc/lib/strlen.S +f:arch/sparc/lib/strncmp_32.S +f:arch/sparc/lib/strncmp_64.S +f:arch/sparc/lib/udivdi3.S +f:arch/sparc/lib/xor.S +f:arch/sparc/math-emu/Makefile +f:arch/sparc/math-emu/math_32.c +f:arch/sparc/math-emu/math_64.c +f:arch/sparc/math-emu/sfp-util_32.h +f:arch/sparc/math-emu/sfp-util_64.h +f:arch/sparc/mm/Makefile +f:arch/sparc/mm/execmem.c +f:arch/sparc/mm/fault_32.c +f:arch/sparc/mm/fault_64.c +f:arch/sparc/mm/hugetlbpage.c +f:arch/sparc/mm/hypersparc.S +f:arch/sparc/mm/init_32.c +f:arch/sparc/mm/init_64.c +f:arch/sparc/mm/init_64.h +f:arch/sparc/mm/io-unit.c +f:arch/sparc/mm/iommu.c +f:arch/sparc/mm/leon_mm.c +f:arch/sparc/mm/mm_32.h +f:arch/sparc/mm/srmmu.c +f:arch/sparc/mm/srmmu_access.S +f:arch/sparc/mm/swift.S +f:arch/sparc/mm/tlb.c +f:arch/sparc/mm/tsb.c +f:arch/sparc/mm/tsunami.S +f:arch/sparc/mm/ultra.S +f:arch/sparc/mm/viking.S +f:arch/sparc/net/Makefile +f:arch/sparc/net/bpf_jit_32.h +f:arch/sparc/net/bpf_jit_64.h +f:arch/sparc/net/bpf_jit_asm_32.S +f:arch/sparc/net/bpf_jit_comp_32.c +f:arch/sparc/net/bpf_jit_comp_64.c +f:arch/sparc/power/Makefile +f:arch/sparc/power/hibernate.c +f:arch/sparc/power/hibernate_asm.S +f:arch/sparc/prom/Makefile +f:arch/sparc/prom/bootstr_32.c +f:arch/sparc/prom/bootstr_64.c +f:arch/sparc/prom/cif.S +f:arch/sparc/prom/console_32.c +f:arch/sparc/prom/console_64.c +f:arch/sparc/prom/init_32.c +f:arch/sparc/prom/init_64.c +f:arch/sparc/prom/memory.c +f:arch/sparc/prom/misc_32.c +f:arch/sparc/prom/misc_64.c +f:arch/sparc/prom/mp.c +f:arch/sparc/prom/p1275.c +f:arch/sparc/prom/printf.c +f:arch/sparc/prom/ranges.c +f:arch/sparc/prom/tree_32.c +f:arch/sparc/prom/tree_64.c +f:arch/sparc/vdso/.gitignore +f:arch/sparc/vdso/Makefile +f:arch/sparc/vdso/vclock_gettime.c +f:arch/sparc/vdso/vdso-layout.lds.S +f:arch/sparc/vdso/vdso-note.S +f:arch/sparc/vdso/vdso.lds.S +f:arch/sparc/vdso/vdso2c.c +f:arch/sparc/vdso/vdso2c.h +f:arch/sparc/vdso/vdso32/.gitignore +f:arch/sparc/vdso/vdso32/vclock_gettime.c +f:arch/sparc/vdso/vdso32/vdso-note.S +f:arch/sparc/vdso/vdso32/vdso32.lds.S +f:arch/sparc/vdso/vma.c +f:arch/sparc/video/Makefile +f:arch/sparc/video/video-common.c +f:arch/um/.gitignore +f:arch/um/Kbuild +f:arch/um/Kconfig +f:arch/um/Kconfig.debug +f:arch/um/Makefile +f:arch/um/Makefile-os-Linux +f:arch/um/Makefile-skas +f:arch/um/configs/i386_defconfig +f:arch/um/configs/x86_64_defconfig +f:arch/um/drivers/Kconfig +f:arch/um/drivers/Makefile +f:arch/um/drivers/chan.h +f:arch/um/drivers/chan_kern.c +f:arch/um/drivers/chan_user.c +f:arch/um/drivers/chan_user.h +f:arch/um/drivers/cow.h +f:arch/um/drivers/cow_sys.h +f:arch/um/drivers/cow_user.c +f:arch/um/drivers/fd.c +f:arch/um/drivers/harddog.h +f:arch/um/drivers/harddog_kern.c +f:arch/um/drivers/harddog_user.c +f:arch/um/drivers/harddog_user_exp.c +f:arch/um/drivers/hostaudio_kern.c +f:arch/um/drivers/line.c +f:arch/um/drivers/line.h +f:arch/um/drivers/mconsole.h +f:arch/um/drivers/mconsole_kern.c +f:arch/um/drivers/mconsole_kern.h +f:arch/um/drivers/mconsole_user.c +f:arch/um/drivers/mmapper_kern.c +f:arch/um/drivers/null.c +f:arch/um/drivers/port.h +f:arch/um/drivers/port_kern.c +f:arch/um/drivers/port_user.c +f:arch/um/drivers/pty.c +f:arch/um/drivers/random.c +f:arch/um/drivers/rtc.h +f:arch/um/drivers/rtc_kern.c +f:arch/um/drivers/rtc_user.c +f:arch/um/drivers/ssl.c +f:arch/um/drivers/stderr_console.c +f:arch/um/drivers/stdio_console.c +f:arch/um/drivers/stdio_console.h +f:arch/um/drivers/tty.c +f:arch/um/drivers/ubd.h +f:arch/um/drivers/ubd_kern.c +f:arch/um/drivers/ubd_user.c +f:arch/um/drivers/vector_kern.c +f:arch/um/drivers/vector_kern.h +f:arch/um/drivers/vector_transports.c +f:arch/um/drivers/vector_user.c +f:arch/um/drivers/vector_user.h +f:arch/um/drivers/vfio_kern.c +f:arch/um/drivers/vfio_user.c +f:arch/um/drivers/vfio_user.h +f:arch/um/drivers/vhost_user.h +f:arch/um/drivers/virt-pci.c +f:arch/um/drivers/virt-pci.h +f:arch/um/drivers/virtio_pcidev.c +f:arch/um/drivers/virtio_uml.c +f:arch/um/drivers/xterm.c +f:arch/um/drivers/xterm.h +f:arch/um/drivers/xterm_kern.c +f:arch/um/include/asm/Kbuild +f:arch/um/include/asm/archrandom.h +f:arch/um/include/asm/asm-prototypes.h +f:arch/um/include/asm/bpf_perf_event.h +f:arch/um/include/asm/cache.h +f:arch/um/include/asm/cacheflush.h +f:arch/um/include/asm/common.lds.S +f:arch/um/include/asm/cpufeature.h +f:arch/um/include/asm/current.h +f:arch/um/include/asm/delay.h +f:arch/um/include/asm/dma.h +f:arch/um/include/asm/fpu/api.h +f:arch/um/include/asm/futex.h +f:arch/um/include/asm/hardirq.h +f:arch/um/include/asm/io.h +f:arch/um/include/asm/irq.h +f:arch/um/include/asm/irqflags.h +f:arch/um/include/asm/kasan.h +f:arch/um/include/asm/kvm_para.h +f:arch/um/include/asm/mmu.h +f:arch/um/include/asm/mmu_context.h +f:arch/um/include/asm/msi.h +f:arch/um/include/asm/page.h +f:arch/um/include/asm/pci.h +f:arch/um/include/asm/pgalloc.h +f:arch/um/include/asm/pgtable-2level.h +f:arch/um/include/asm/pgtable-4level.h +f:arch/um/include/asm/pgtable.h +f:arch/um/include/asm/processor-generic.h +f:arch/um/include/asm/ptrace-generic.h +f:arch/um/include/asm/sections.h +f:arch/um/include/asm/setup.h +f:arch/um/include/asm/smp.h +f:arch/um/include/asm/stacktrace.h +f:arch/um/include/asm/syscall-generic.h +f:arch/um/include/asm/thread_info.h +f:arch/um/include/asm/timex.h +f:arch/um/include/asm/tlb.h +f:arch/um/include/asm/tlbflush.h +f:arch/um/include/asm/uaccess.h +f:arch/um/include/asm/unwind.h +f:arch/um/include/asm/vmalloc.h +f:arch/um/include/asm/vmlinux.lds.h +f:arch/um/include/asm/xor.h +f:arch/um/include/linux/time-internal.h +f:arch/um/include/linux/virtio-uml.h +f:arch/um/include/shared/arch.h +f:arch/um/include/shared/as-layout.h +f:arch/um/include/shared/common-offsets.h +f:arch/um/include/shared/elf_user.h +f:arch/um/include/shared/frame_kern.h +f:arch/um/include/shared/init.h +f:arch/um/include/shared/irq_kern.h +f:arch/um/include/shared/irq_user.h +f:arch/um/include/shared/kern.h +f:arch/um/include/shared/kern_util.h +f:arch/um/include/shared/longjmp.h +f:arch/um/include/shared/mem.h +f:arch/um/include/shared/mem_user.h +f:arch/um/include/shared/os.h +f:arch/um/include/shared/ptrace_user.h +f:arch/um/include/shared/registers.h +f:arch/um/include/shared/sigio.h +f:arch/um/include/shared/skas/mm_id.h +f:arch/um/include/shared/skas/skas.h +f:arch/um/include/shared/skas/stub-data.h +f:arch/um/include/shared/timetravel.h +f:arch/um/include/shared/um_malloc.h +f:arch/um/include/shared/user.h +f:arch/um/include/uapi/asm/Kbuild +f:arch/um/kernel/Makefile +f:arch/um/kernel/asm-offsets.c +f:arch/um/kernel/config.c.in +f:arch/um/kernel/dtb.c +f:arch/um/kernel/dyn.lds.S +f:arch/um/kernel/early_printk.c +f:arch/um/kernel/exec.c +f:arch/um/kernel/exitcode.c +f:arch/um/kernel/gprof_syms.c +f:arch/um/kernel/initrd.c +f:arch/um/kernel/irq.c +f:arch/um/kernel/kmsg_dump.c +f:arch/um/kernel/ksyms.c +f:arch/um/kernel/load_file.c +f:arch/um/kernel/mem.c +f:arch/um/kernel/physmem.c +f:arch/um/kernel/process.c +f:arch/um/kernel/ptrace.c +f:arch/um/kernel/reboot.c +f:arch/um/kernel/sigio.c +f:arch/um/kernel/signal.c +f:arch/um/kernel/skas/.gitignore +f:arch/um/kernel/skas/Makefile +f:arch/um/kernel/skas/mmu.c +f:arch/um/kernel/skas/process.c +f:arch/um/kernel/skas/stub.c +f:arch/um/kernel/skas/stub_exe.c +f:arch/um/kernel/skas/stub_exe_embed.S +f:arch/um/kernel/skas/syscall.c +f:arch/um/kernel/skas/uaccess.c +f:arch/um/kernel/stacktrace.c +f:arch/um/kernel/sysrq.c +f:arch/um/kernel/time.c +f:arch/um/kernel/tlb.c +f:arch/um/kernel/trap.c +f:arch/um/kernel/um_arch.c +f:arch/um/kernel/um_arch.h +f:arch/um/kernel/umid.c +f:arch/um/kernel/uml.lds.S +f:arch/um/kernel/vmlinux.lds.S +f:arch/um/os-Linux/Makefile +f:arch/um/os-Linux/elf_aux.c +f:arch/um/os-Linux/execvp.c +f:arch/um/os-Linux/file.c +f:arch/um/os-Linux/helper.c +f:arch/um/os-Linux/internal.h +f:arch/um/os-Linux/irq.c +f:arch/um/os-Linux/main.c +f:arch/um/os-Linux/mem.c +f:arch/um/os-Linux/process.c +f:arch/um/os-Linux/registers.c +f:arch/um/os-Linux/sigio.c +f:arch/um/os-Linux/signal.c +f:arch/um/os-Linux/skas/Makefile +f:arch/um/os-Linux/skas/mem.c +f:arch/um/os-Linux/skas/process.c +f:arch/um/os-Linux/start_up.c +f:arch/um/os-Linux/time.c +f:arch/um/os-Linux/tty.c +f:arch/um/os-Linux/umid.c +f:arch/um/os-Linux/user_syms.c +f:arch/um/os-Linux/util.c +f:arch/um/scripts/Makefile.rules +f:arch/x86/.gitignore +f:arch/x86/Kbuild +f:arch/x86/Kconfig +f:arch/x86/Kconfig.assembler +f:arch/x86/Kconfig.cpu +f:arch/x86/Kconfig.cpufeatures +f:arch/x86/Kconfig.debug +f:arch/x86/Makefile +f:arch/x86/Makefile.um +f:arch/x86/Makefile_32.cpu +f:arch/x86/boot/.gitignore +f:arch/x86/boot/Makefile +f:arch/x86/boot/a20.c +f:arch/x86/boot/apm.c +f:arch/x86/boot/bioscall.S +f:arch/x86/boot/bitops.h +f:arch/x86/boot/boot.h +f:arch/x86/boot/cmdline.c +f:arch/x86/boot/compressed/.gitignore +f:arch/x86/boot/compressed/Makefile +f:arch/x86/boot/compressed/acpi.c +f:arch/x86/boot/compressed/cmdline.c +f:arch/x86/boot/compressed/cpuflags.c +f:arch/x86/boot/compressed/early_serial_console.c +f:arch/x86/boot/compressed/efi.c +f:arch/x86/boot/compressed/efi.h +f:arch/x86/boot/compressed/error.c +f:arch/x86/boot/compressed/error.h +f:arch/x86/boot/compressed/head_32.S +f:arch/x86/boot/compressed/head_64.S +f:arch/x86/boot/compressed/ident_map_64.c +f:arch/x86/boot/compressed/idt_64.c +f:arch/x86/boot/compressed/idt_handlers_64.S +f:arch/x86/boot/compressed/kaslr.c +f:arch/x86/boot/compressed/kernel_info.S +f:arch/x86/boot/compressed/mem.c +f:arch/x86/boot/compressed/mem_encrypt.S +f:arch/x86/boot/compressed/misc.c +f:arch/x86/boot/compressed/misc.h +f:arch/x86/boot/compressed/mkpiggy.c +f:arch/x86/boot/compressed/pgtable_64.c +f:arch/x86/boot/compressed/sbat.S +f:arch/x86/boot/compressed/sev-handle-vc.c +f:arch/x86/boot/compressed/sev.c +f:arch/x86/boot/compressed/sev.h +f:arch/x86/boot/compressed/string.c +f:arch/x86/boot/compressed/tdcall.S +f:arch/x86/boot/compressed/tdx-shared.c +f:arch/x86/boot/compressed/tdx.c +f:arch/x86/boot/compressed/tdx.h +f:arch/x86/boot/compressed/vmlinux.lds.S +f:arch/x86/boot/copy.S +f:arch/x86/boot/cpu.c +f:arch/x86/boot/cpucheck.c +f:arch/x86/boot/cpuflags.c +f:arch/x86/boot/cpuflags.h +f:arch/x86/boot/ctype.h +f:arch/x86/boot/early_serial_console.c +f:arch/x86/boot/edd.c +f:arch/x86/boot/genimage.sh +f:arch/x86/boot/header.S +f:arch/x86/boot/install.sh +f:arch/x86/boot/io.h +f:arch/x86/boot/main.c +f:arch/x86/boot/memory.c +f:arch/x86/boot/mkcpustr.c +f:arch/x86/boot/msr.h +f:arch/x86/boot/mtools.conf.in +f:arch/x86/boot/pm.c +f:arch/x86/boot/pmjump.S +f:arch/x86/boot/printf.c +f:arch/x86/boot/regs.c +f:arch/x86/boot/setup.ld +f:arch/x86/boot/startup/Makefile +f:arch/x86/boot/startup/efi-mixed.S +f:arch/x86/boot/startup/gdt_idt.c +f:arch/x86/boot/startup/la57toggle.S +f:arch/x86/boot/startup/map_kernel.c +f:arch/x86/boot/startup/sev-shared.c +f:arch/x86/boot/startup/sev-startup.c +f:arch/x86/boot/startup/sme.c +f:arch/x86/boot/string.c +f:arch/x86/boot/string.h +f:arch/x86/boot/tty.c +f:arch/x86/boot/version.c +f:arch/x86/boot/vesa.h +f:arch/x86/boot/video-bios.c +f:arch/x86/boot/video-mode.c +f:arch/x86/boot/video-vesa.c +f:arch/x86/boot/video-vga.c +f:arch/x86/boot/video.c +f:arch/x86/boot/video.h +f:arch/x86/coco/Makefile +f:arch/x86/coco/core.c +f:arch/x86/coco/sev/Makefile +f:arch/x86/coco/sev/core.c +f:arch/x86/coco/sev/sev-nmi.c +f:arch/x86/coco/sev/vc-handle.c +f:arch/x86/coco/sev/vc-shared.c +f:arch/x86/coco/tdx/Makefile +f:arch/x86/coco/tdx/debug.c +f:arch/x86/coco/tdx/tdcall.S +f:arch/x86/coco/tdx/tdx-shared.c +f:arch/x86/coco/tdx/tdx.c +f:arch/x86/configs/hardening.config +f:arch/x86/configs/i386_defconfig +f:arch/x86/configs/tiny.config +f:arch/x86/configs/x86_64_defconfig +f:arch/x86/configs/xen.config +f:arch/x86/crypto/.gitignore +f:arch/x86/crypto/Kconfig +f:arch/x86/crypto/Makefile +f:arch/x86/crypto/aegis128-aesni-asm.S +f:arch/x86/crypto/aegis128-aesni-glue.c +f:arch/x86/crypto/aes-ctr-avx-x86_64.S +f:arch/x86/crypto/aes-gcm-aesni-x86_64.S +f:arch/x86/crypto/aes-gcm-avx10-x86_64.S +f:arch/x86/crypto/aes-xts-avx-x86_64.S +f:arch/x86/crypto/aesni-intel_asm.S +f:arch/x86/crypto/aesni-intel_glue.c +f:arch/x86/crypto/aria-aesni-avx-asm_64.S +f:arch/x86/crypto/aria-aesni-avx2-asm_64.S +f:arch/x86/crypto/aria-avx.h +f:arch/x86/crypto/aria-gfni-avx512-asm_64.S +f:arch/x86/crypto/aria_aesni_avx2_glue.c +f:arch/x86/crypto/aria_aesni_avx_glue.c +f:arch/x86/crypto/aria_gfni_avx512_glue.c +f:arch/x86/crypto/blowfish-x86_64-asm_64.S +f:arch/x86/crypto/blowfish_glue.c +f:arch/x86/crypto/camellia-aesni-avx-asm_64.S +f:arch/x86/crypto/camellia-aesni-avx2-asm_64.S +f:arch/x86/crypto/camellia-x86_64-asm_64.S +f:arch/x86/crypto/camellia.h +f:arch/x86/crypto/camellia_aesni_avx2_glue.c +f:arch/x86/crypto/camellia_aesni_avx_glue.c +f:arch/x86/crypto/camellia_glue.c +f:arch/x86/crypto/cast5-avx-x86_64-asm_64.S +f:arch/x86/crypto/cast5_avx_glue.c +f:arch/x86/crypto/cast6-avx-x86_64-asm_64.S +f:arch/x86/crypto/cast6_avx_glue.c +f:arch/x86/crypto/curve25519-x86_64.c +f:arch/x86/crypto/des3_ede-asm_64.S +f:arch/x86/crypto/des3_ede_glue.c +f:arch/x86/crypto/ecb_cbc_helpers.h +f:arch/x86/crypto/ghash-clmulni-intel_asm.S +f:arch/x86/crypto/ghash-clmulni-intel_glue.c +f:arch/x86/crypto/glue_helper-asm-avx.S +f:arch/x86/crypto/glue_helper-asm-avx2.S +f:arch/x86/crypto/nh-avx2-x86_64.S +f:arch/x86/crypto/nh-sse2-x86_64.S +f:arch/x86/crypto/nhpoly1305-avx2-glue.c +f:arch/x86/crypto/nhpoly1305-sse2-glue.c +f:arch/x86/crypto/polyval-clmulni_asm.S +f:arch/x86/crypto/polyval-clmulni_glue.c +f:arch/x86/crypto/serpent-avx-x86_64-asm_64.S +f:arch/x86/crypto/serpent-avx.h +f:arch/x86/crypto/serpent-avx2-asm_64.S +f:arch/x86/crypto/serpent-sse2-i586-asm_32.S +f:arch/x86/crypto/serpent-sse2-x86_64-asm_64.S +f:arch/x86/crypto/serpent-sse2.h +f:arch/x86/crypto/serpent_avx2_glue.c +f:arch/x86/crypto/serpent_avx_glue.c +f:arch/x86/crypto/serpent_sse2_glue.c +f:arch/x86/crypto/sm3-avx-asm_64.S +f:arch/x86/crypto/sm3_avx_glue.c +f:arch/x86/crypto/sm4-aesni-avx-asm_64.S +f:arch/x86/crypto/sm4-aesni-avx2-asm_64.S +f:arch/x86/crypto/sm4-avx.h +f:arch/x86/crypto/sm4_aesni_avx2_glue.c +f:arch/x86/crypto/sm4_aesni_avx_glue.c +f:arch/x86/crypto/twofish-avx-x86_64-asm_64.S +f:arch/x86/crypto/twofish-i586-asm_32.S +f:arch/x86/crypto/twofish-x86_64-asm_64-3way.S +f:arch/x86/crypto/twofish-x86_64-asm_64.S +f:arch/x86/crypto/twofish.h +f:arch/x86/crypto/twofish_avx_glue.c +f:arch/x86/crypto/twofish_glue.c +f:arch/x86/crypto/twofish_glue_3way.c +f:arch/x86/entry/Makefile +f:arch/x86/entry/calling.h +f:arch/x86/entry/entry.S +f:arch/x86/entry/entry_32.S +f:arch/x86/entry/entry_64.S +f:arch/x86/entry/entry_64_compat.S +f:arch/x86/entry/entry_64_fred.S +f:arch/x86/entry/entry_fred.c +f:arch/x86/entry/syscall_32.c +f:arch/x86/entry/syscall_64.c +f:arch/x86/entry/syscalls/Makefile +f:arch/x86/entry/syscalls/syscall_32.tbl +f:arch/x86/entry/syscalls/syscall_64.tbl +f:arch/x86/entry/thunk.S +f:arch/x86/entry/vdso/.gitignore +f:arch/x86/entry/vdso/Makefile +f:arch/x86/entry/vdso/extable.c +f:arch/x86/entry/vdso/extable.h +f:arch/x86/entry/vdso/vclock_gettime.c +f:arch/x86/entry/vdso/vdso-layout.lds.S +f:arch/x86/entry/vdso/vdso-note.S +f:arch/x86/entry/vdso/vdso.lds.S +f:arch/x86/entry/vdso/vdso2c.c +f:arch/x86/entry/vdso/vdso2c.h +f:arch/x86/entry/vdso/vdso32-setup.c +f:arch/x86/entry/vdso/vdso32/.gitignore +f:arch/x86/entry/vdso/vdso32/fake_32bit_build.h +f:arch/x86/entry/vdso/vdso32/note.S +f:arch/x86/entry/vdso/vdso32/sigreturn.S +f:arch/x86/entry/vdso/vdso32/system_call.S +f:arch/x86/entry/vdso/vdso32/vclock_gettime.c +f:arch/x86/entry/vdso/vdso32/vdso32.lds.S +f:arch/x86/entry/vdso/vdso32/vgetcpu.c +f:arch/x86/entry/vdso/vdsox32.lds.S +f:arch/x86/entry/vdso/vgetcpu.c +f:arch/x86/entry/vdso/vgetrandom-chacha.S +f:arch/x86/entry/vdso/vgetrandom.c +f:arch/x86/entry/vdso/vma.c +f:arch/x86/entry/vdso/vsgx.S +f:arch/x86/entry/vsyscall/Makefile +f:arch/x86/entry/vsyscall/vsyscall_64.c +f:arch/x86/entry/vsyscall/vsyscall_emu_64.S +f:arch/x86/entry/vsyscall/vsyscall_trace.h +f:arch/x86/events/Kconfig +f:arch/x86/events/Makefile +f:arch/x86/events/amd/Makefile +f:arch/x86/events/amd/brs.c +f:arch/x86/events/amd/core.c +f:arch/x86/events/amd/ibs.c +f:arch/x86/events/amd/iommu.c +f:arch/x86/events/amd/iommu.h +f:arch/x86/events/amd/lbr.c +f:arch/x86/events/amd/power.c +f:arch/x86/events/amd/uncore.c +f:arch/x86/events/core.c +f:arch/x86/events/intel/Makefile +f:arch/x86/events/intel/bts.c +f:arch/x86/events/intel/core.c +f:arch/x86/events/intel/cstate.c +f:arch/x86/events/intel/ds.c +f:arch/x86/events/intel/knc.c +f:arch/x86/events/intel/lbr.c +f:arch/x86/events/intel/p4.c +f:arch/x86/events/intel/p6.c +f:arch/x86/events/intel/pt.c +f:arch/x86/events/intel/pt.h +f:arch/x86/events/intel/uncore.c +f:arch/x86/events/intel/uncore.h +f:arch/x86/events/intel/uncore_discovery.c +f:arch/x86/events/intel/uncore_discovery.h +f:arch/x86/events/intel/uncore_nhmex.c +f:arch/x86/events/intel/uncore_snb.c +f:arch/x86/events/intel/uncore_snbep.c +f:arch/x86/events/msr.c +f:arch/x86/events/perf_event.h +f:arch/x86/events/perf_event_flags.h +f:arch/x86/events/probe.c +f:arch/x86/events/probe.h +f:arch/x86/events/rapl.c +f:arch/x86/events/utils.c +f:arch/x86/events/zhaoxin/Makefile +f:arch/x86/events/zhaoxin/core.c +f:arch/x86/hyperv/Makefile +f:arch/x86/hyperv/hv_apic.c +f:arch/x86/hyperv/hv_init.c +f:arch/x86/hyperv/hv_spinlock.c +f:arch/x86/hyperv/hv_vtl.c +f:arch/x86/hyperv/irqdomain.c +f:arch/x86/hyperv/ivm.c +f:arch/x86/hyperv/mmu.c +f:arch/x86/hyperv/nested.c +f:arch/x86/ia32/Makefile +f:arch/x86/ia32/audit.c +f:arch/x86/include/asm/GEN-for-each-reg.h +f:arch/x86/include/asm/Kbuild +f:arch/x86/include/asm/acenv.h +f:arch/x86/include/asm/acpi.h +f:arch/x86/include/asm/acrn.h +f:arch/x86/include/asm/agp.h +f:arch/x86/include/asm/alternative.h +f:arch/x86/include/asm/amd/hsmp.h +f:arch/x86/include/asm/amd/ibs.h +f:arch/x86/include/asm/amd/nb.h +f:arch/x86/include/asm/amd/node.h +f:arch/x86/include/asm/apic.h +f:arch/x86/include/asm/apicdef.h +f:arch/x86/include/asm/apm.h +f:arch/x86/include/asm/arch_hweight.h +f:arch/x86/include/asm/archrandom.h +f:arch/x86/include/asm/asm-offsets.h +f:arch/x86/include/asm/asm-prototypes.h +f:arch/x86/include/asm/asm.h +f:arch/x86/include/asm/atomic.h +f:arch/x86/include/asm/atomic64_32.h +f:arch/x86/include/asm/atomic64_64.h +f:arch/x86/include/asm/audit.h +f:arch/x86/include/asm/barrier.h +f:arch/x86/include/asm/bios_ebda.h +f:arch/x86/include/asm/bitops.h +f:arch/x86/include/asm/boot.h +f:arch/x86/include/asm/bootparam_utils.h +f:arch/x86/include/asm/bug.h +f:arch/x86/include/asm/bugs.h +f:arch/x86/include/asm/cache.h +f:arch/x86/include/asm/cacheflush.h +f:arch/x86/include/asm/cacheinfo.h +f:arch/x86/include/asm/ce4100.h +f:arch/x86/include/asm/cfi.h +f:arch/x86/include/asm/checksum.h +f:arch/x86/include/asm/checksum_32.h +f:arch/x86/include/asm/checksum_64.h +f:arch/x86/include/asm/clocksource.h +f:arch/x86/include/asm/cmdline.h +f:arch/x86/include/asm/cmpxchg.h +f:arch/x86/include/asm/cmpxchg_32.h +f:arch/x86/include/asm/cmpxchg_64.h +f:arch/x86/include/asm/coco.h +f:arch/x86/include/asm/compat.h +f:arch/x86/include/asm/cpu.h +f:arch/x86/include/asm/cpu_device_id.h +f:arch/x86/include/asm/cpu_entry_area.h +f:arch/x86/include/asm/cpufeature.h +f:arch/x86/include/asm/cpufeatures.h +f:arch/x86/include/asm/cpuid.h +f:arch/x86/include/asm/cpuid/api.h +f:arch/x86/include/asm/cpuid/types.h +f:arch/x86/include/asm/cpuidle_haltpoll.h +f:arch/x86/include/asm/cpumask.h +f:arch/x86/include/asm/crash.h +f:arch/x86/include/asm/crash_reserve.h +f:arch/x86/include/asm/current.h +f:arch/x86/include/asm/debugreg.h +f:arch/x86/include/asm/delay.h +f:arch/x86/include/asm/desc.h +f:arch/x86/include/asm/desc_defs.h +f:arch/x86/include/asm/device.h +f:arch/x86/include/asm/div64.h +f:arch/x86/include/asm/dma-mapping.h +f:arch/x86/include/asm/dma.h +f:arch/x86/include/asm/dmi.h +f:arch/x86/include/asm/doublefault.h +f:arch/x86/include/asm/dwarf2.h +f:arch/x86/include/asm/e820/api.h +f:arch/x86/include/asm/e820/types.h +f:arch/x86/include/asm/edac.h +f:arch/x86/include/asm/efi.h +f:arch/x86/include/asm/elf.h +f:arch/x86/include/asm/elfcore-compat.h +f:arch/x86/include/asm/emergency-restart.h +f:arch/x86/include/asm/emulate_prefix.h +f:arch/x86/include/asm/enclu.h +f:arch/x86/include/asm/entry-common.h +f:arch/x86/include/asm/espfix.h +f:arch/x86/include/asm/exec.h +f:arch/x86/include/asm/extable.h +f:arch/x86/include/asm/extable_fixup_types.h +f:arch/x86/include/asm/fixmap.h +f:arch/x86/include/asm/floppy.h +f:arch/x86/include/asm/fpu.h +f:arch/x86/include/asm/fpu/api.h +f:arch/x86/include/asm/fpu/regset.h +f:arch/x86/include/asm/fpu/sched.h +f:arch/x86/include/asm/fpu/signal.h +f:arch/x86/include/asm/fpu/types.h +f:arch/x86/include/asm/fpu/xcr.h +f:arch/x86/include/asm/fpu/xstate.h +f:arch/x86/include/asm/frame.h +f:arch/x86/include/asm/fred.h +f:arch/x86/include/asm/fsgsbase.h +f:arch/x86/include/asm/ftrace.h +f:arch/x86/include/asm/futex.h +f:arch/x86/include/asm/gart.h +f:arch/x86/include/asm/genapic.h +f:arch/x86/include/asm/geode.h +f:arch/x86/include/asm/gsseg.h +f:arch/x86/include/asm/hardirq.h +f:arch/x86/include/asm/highmem.h +f:arch/x86/include/asm/hpet.h +f:arch/x86/include/asm/hugetlb.h +f:arch/x86/include/asm/hw_breakpoint.h +f:arch/x86/include/asm/hw_irq.h +f:arch/x86/include/asm/hyperv_timer.h +f:arch/x86/include/asm/hypervisor.h +f:arch/x86/include/asm/i8259.h +f:arch/x86/include/asm/ia32.h +f:arch/x86/include/asm/ibt.h +f:arch/x86/include/asm/idtentry.h +f:arch/x86/include/asm/imr.h +f:arch/x86/include/asm/inat.h +f:arch/x86/include/asm/inat_types.h +f:arch/x86/include/asm/init.h +f:arch/x86/include/asm/insn-eval.h +f:arch/x86/include/asm/insn.h +f:arch/x86/include/asm/inst.h +f:arch/x86/include/asm/intel-family.h +f:arch/x86/include/asm/intel-mid.h +f:arch/x86/include/asm/intel_ds.h +f:arch/x86/include/asm/intel_pt.h +f:arch/x86/include/asm/intel_punit_ipc.h +f:arch/x86/include/asm/intel_telemetry.h +f:arch/x86/include/asm/invpcid.h +f:arch/x86/include/asm/io.h +f:arch/x86/include/asm/io_apic.h +f:arch/x86/include/asm/io_bitmap.h +f:arch/x86/include/asm/iomap.h +f:arch/x86/include/asm/iommu.h +f:arch/x86/include/asm/iosf_mbi.h +f:arch/x86/include/asm/irq.h +f:arch/x86/include/asm/irq_remapping.h +f:arch/x86/include/asm/irq_stack.h +f:arch/x86/include/asm/irq_vectors.h +f:arch/x86/include/asm/irq_work.h +f:arch/x86/include/asm/irqdomain.h +f:arch/x86/include/asm/irqflags.h +f:arch/x86/include/asm/ist.h +f:arch/x86/include/asm/jailhouse_para.h +f:arch/x86/include/asm/jump_label.h +f:arch/x86/include/asm/kasan.h +f:arch/x86/include/asm/kaslr.h +f:arch/x86/include/asm/kbdleds.h +f:arch/x86/include/asm/kdebug.h +f:arch/x86/include/asm/kexec-bzimage64.h +f:arch/x86/include/asm/kexec.h +f:arch/x86/include/asm/kfence.h +f:arch/x86/include/asm/kgdb.h +f:arch/x86/include/asm/kmsan.h +f:arch/x86/include/asm/kprobes.h +f:arch/x86/include/asm/kvm-x86-ops.h +f:arch/x86/include/asm/kvm-x86-pmu-ops.h +f:arch/x86/include/asm/kvm_host.h +f:arch/x86/include/asm/kvm_page_track.h +f:arch/x86/include/asm/kvm_para.h +f:arch/x86/include/asm/kvm_types.h +f:arch/x86/include/asm/kvm_vcpu_regs.h +f:arch/x86/include/asm/kvmclock.h +f:arch/x86/include/asm/linkage.h +f:arch/x86/include/asm/local.h +f:arch/x86/include/asm/mach_timer.h +f:arch/x86/include/asm/mach_traps.h +f:arch/x86/include/asm/math_emu.h +f:arch/x86/include/asm/mc146818rtc.h +f:arch/x86/include/asm/mce.h +f:arch/x86/include/asm/mem_encrypt.h +f:arch/x86/include/asm/memtype.h +f:arch/x86/include/asm/microcode.h +f:arch/x86/include/asm/misc.h +f:arch/x86/include/asm/mman.h +f:arch/x86/include/asm/mmconfig.h +f:arch/x86/include/asm/mmu.h +f:arch/x86/include/asm/mmu_context.h +f:arch/x86/include/asm/module.h +f:arch/x86/include/asm/mpspec.h +f:arch/x86/include/asm/mpspec_def.h +f:arch/x86/include/asm/mshyperv.h +f:arch/x86/include/asm/msi.h +f:arch/x86/include/asm/msr-index.h +f:arch/x86/include/asm/msr-trace.h +f:arch/x86/include/asm/msr.h +f:arch/x86/include/asm/mtrr.h +f:arch/x86/include/asm/mwait.h +f:arch/x86/include/asm/nmi.h +f:arch/x86/include/asm/nops.h +f:arch/x86/include/asm/nospec-branch.h +f:arch/x86/include/asm/numa.h +f:arch/x86/include/asm/numachip/numachip.h +f:arch/x86/include/asm/numachip/numachip_csr.h +f:arch/x86/include/asm/olpc.h +f:arch/x86/include/asm/olpc_ofw.h +f:arch/x86/include/asm/orc_header.h +f:arch/x86/include/asm/orc_lookup.h +f:arch/x86/include/asm/orc_types.h +f:arch/x86/include/asm/page.h +f:arch/x86/include/asm/page_32.h +f:arch/x86/include/asm/page_32_types.h +f:arch/x86/include/asm/page_64.h +f:arch/x86/include/asm/page_64_types.h +f:arch/x86/include/asm/page_types.h +f:arch/x86/include/asm/paravirt.h +f:arch/x86/include/asm/paravirt_api_clock.h +f:arch/x86/include/asm/paravirt_types.h +f:arch/x86/include/asm/parport.h +f:arch/x86/include/asm/pc-conf-reg.h +f:arch/x86/include/asm/pci-direct.h +f:arch/x86/include/asm/pci-functions.h +f:arch/x86/include/asm/pci.h +f:arch/x86/include/asm/pci_x86.h +f:arch/x86/include/asm/percpu.h +f:arch/x86/include/asm/perf_event.h +f:arch/x86/include/asm/perf_event_p4.h +f:arch/x86/include/asm/pgalloc.h +f:arch/x86/include/asm/pgtable-2level.h +f:arch/x86/include/asm/pgtable-2level_types.h +f:arch/x86/include/asm/pgtable-3level.h +f:arch/x86/include/asm/pgtable-3level_types.h +f:arch/x86/include/asm/pgtable-invert.h +f:arch/x86/include/asm/pgtable.h +f:arch/x86/include/asm/pgtable_32.h +f:arch/x86/include/asm/pgtable_32_areas.h +f:arch/x86/include/asm/pgtable_32_types.h +f:arch/x86/include/asm/pgtable_64.h +f:arch/x86/include/asm/pgtable_64_types.h +f:arch/x86/include/asm/pgtable_areas.h +f:arch/x86/include/asm/pgtable_types.h +f:arch/x86/include/asm/pkeys.h +f:arch/x86/include/asm/pkru.h +f:arch/x86/include/asm/platform_sst_audio.h +f:arch/x86/include/asm/pm-trace.h +f:arch/x86/include/asm/posix_types.h +f:arch/x86/include/asm/posted_intr.h +f:arch/x86/include/asm/preempt.h +f:arch/x86/include/asm/probe_roms.h +f:arch/x86/include/asm/processor-cyrix.h +f:arch/x86/include/asm/processor-flags.h +f:arch/x86/include/asm/processor.h +f:arch/x86/include/asm/prom.h +f:arch/x86/include/asm/proto.h +f:arch/x86/include/asm/pti.h +f:arch/x86/include/asm/ptrace.h +f:arch/x86/include/asm/purgatory.h +f:arch/x86/include/asm/pvclock-abi.h +f:arch/x86/include/asm/pvclock.h +f:arch/x86/include/asm/qrwlock.h +f:arch/x86/include/asm/qspinlock.h +f:arch/x86/include/asm/qspinlock_paravirt.h +f:arch/x86/include/asm/realmode.h +f:arch/x86/include/asm/reboot.h +f:arch/x86/include/asm/reboot_fixups.h +f:arch/x86/include/asm/resctrl.h +f:arch/x86/include/asm/rmwcc.h +f:arch/x86/include/asm/rqspinlock.h +f:arch/x86/include/asm/runtime-const.h +f:arch/x86/include/asm/seccomp.h +f:arch/x86/include/asm/sections.h +f:arch/x86/include/asm/segment.h +f:arch/x86/include/asm/serial.h +f:arch/x86/include/asm/set_memory.h +f:arch/x86/include/asm/setup.h +f:arch/x86/include/asm/setup_arch.h +f:arch/x86/include/asm/setup_data.h +f:arch/x86/include/asm/sev-common.h +f:arch/x86/include/asm/sev-internal.h +f:arch/x86/include/asm/sev.h +f:arch/x86/include/asm/sgx.h +f:arch/x86/include/asm/shared/io.h +f:arch/x86/include/asm/shared/msr.h +f:arch/x86/include/asm/shared/tdx.h +f:arch/x86/include/asm/shmparam.h +f:arch/x86/include/asm/shstk.h +f:arch/x86/include/asm/sigcontext.h +f:arch/x86/include/asm/sigframe.h +f:arch/x86/include/asm/sighandling.h +f:arch/x86/include/asm/signal.h +f:arch/x86/include/asm/simd.h +f:arch/x86/include/asm/smap.h +f:arch/x86/include/asm/smp.h +f:arch/x86/include/asm/softirq_stack.h +f:arch/x86/include/asm/sparsemem.h +f:arch/x86/include/asm/spec-ctrl.h +f:arch/x86/include/asm/special_insns.h +f:arch/x86/include/asm/spinlock.h +f:arch/x86/include/asm/spinlock_types.h +f:arch/x86/include/asm/stackprotector.h +f:arch/x86/include/asm/stacktrace.h +f:arch/x86/include/asm/static_call.h +f:arch/x86/include/asm/string.h +f:arch/x86/include/asm/string_32.h +f:arch/x86/include/asm/string_64.h +f:arch/x86/include/asm/suspend.h +f:arch/x86/include/asm/suspend_32.h +f:arch/x86/include/asm/suspend_64.h +f:arch/x86/include/asm/svm.h +f:arch/x86/include/asm/switch_to.h +f:arch/x86/include/asm/sync_bitops.h +f:arch/x86/include/asm/sync_core.h +f:arch/x86/include/asm/syscall.h +f:arch/x86/include/asm/syscall_wrapper.h +f:arch/x86/include/asm/syscalls.h +f:arch/x86/include/asm/tdx.h +f:arch/x86/include/asm/tdx_global_metadata.h +f:arch/x86/include/asm/text-patching.h +f:arch/x86/include/asm/thermal.h +f:arch/x86/include/asm/thread_info.h +f:arch/x86/include/asm/time.h +f:arch/x86/include/asm/timer.h +f:arch/x86/include/asm/timex.h +f:arch/x86/include/asm/tlb.h +f:arch/x86/include/asm/tlbbatch.h +f:arch/x86/include/asm/tlbflush.h +f:arch/x86/include/asm/topology.h +f:arch/x86/include/asm/trace/fpu.h +f:arch/x86/include/asm/trace/hyperv.h +f:arch/x86/include/asm/trace/irq_vectors.h +f:arch/x86/include/asm/trace_clock.h +f:arch/x86/include/asm/trap_pf.h +f:arch/x86/include/asm/trapnr.h +f:arch/x86/include/asm/traps.h +f:arch/x86/include/asm/tsc.h +f:arch/x86/include/asm/uaccess.h +f:arch/x86/include/asm/uaccess_32.h +f:arch/x86/include/asm/uaccess_64.h +f:arch/x86/include/asm/umip.h +f:arch/x86/include/asm/unaccepted_memory.h +f:arch/x86/include/asm/unistd.h +f:arch/x86/include/asm/unwind.h +f:arch/x86/include/asm/unwind_hints.h +f:arch/x86/include/asm/uprobes.h +f:arch/x86/include/asm/user.h +f:arch/x86/include/asm/user32.h +f:arch/x86/include/asm/user_32.h +f:arch/x86/include/asm/user_64.h +f:arch/x86/include/asm/uv/bios.h +f:arch/x86/include/asm/uv/uv.h +f:arch/x86/include/asm/uv/uv_geo.h +f:arch/x86/include/asm/uv/uv_hub.h +f:arch/x86/include/asm/uv/uv_irq.h +f:arch/x86/include/asm/uv/uv_mmrs.h +f:arch/x86/include/asm/vdso.h +f:arch/x86/include/asm/vdso/clocksource.h +f:arch/x86/include/asm/vdso/getrandom.h +f:arch/x86/include/asm/vdso/gettimeofday.h +f:arch/x86/include/asm/vdso/processor.h +f:arch/x86/include/asm/vdso/vsyscall.h +f:arch/x86/include/asm/vermagic.h +f:arch/x86/include/asm/vga.h +f:arch/x86/include/asm/vgtod.h +f:arch/x86/include/asm/video.h +f:arch/x86/include/asm/vm86.h +f:arch/x86/include/asm/vmalloc.h +f:arch/x86/include/asm/vmware.h +f:arch/x86/include/asm/vmx.h +f:arch/x86/include/asm/vmxfeatures.h +f:arch/x86/include/asm/vsyscall.h +f:arch/x86/include/asm/word-at-a-time.h +f:arch/x86/include/asm/x86_init.h +f:arch/x86/include/asm/xen/cpuid.h +f:arch/x86/include/asm/xen/events.h +f:arch/x86/include/asm/xen/hypercall.h +f:arch/x86/include/asm/xen/hypervisor.h +f:arch/x86/include/asm/xen/interface.h +f:arch/x86/include/asm/xen/interface_32.h +f:arch/x86/include/asm/xen/interface_64.h +f:arch/x86/include/asm/xen/page.h +f:arch/x86/include/asm/xen/pci.h +f:arch/x86/include/asm/xen/swiotlb-xen.h +f:arch/x86/include/asm/xen/trace_types.h +f:arch/x86/include/asm/xor.h +f:arch/x86/include/asm/xor_32.h +f:arch/x86/include/asm/xor_64.h +f:arch/x86/include/asm/xor_avx.h +f:arch/x86/include/uapi/asm/Kbuild +f:arch/x86/include/uapi/asm/a.out.h +f:arch/x86/include/uapi/asm/amd_hsmp.h +f:arch/x86/include/uapi/asm/auxvec.h +f:arch/x86/include/uapi/asm/bitsperlong.h +f:arch/x86/include/uapi/asm/boot.h +f:arch/x86/include/uapi/asm/bootparam.h +f:arch/x86/include/uapi/asm/byteorder.h +f:arch/x86/include/uapi/asm/debugreg.h +f:arch/x86/include/uapi/asm/e820.h +f:arch/x86/include/uapi/asm/elf.h +f:arch/x86/include/uapi/asm/hw_breakpoint.h +f:arch/x86/include/uapi/asm/hwcap2.h +f:arch/x86/include/uapi/asm/ist.h +f:arch/x86/include/uapi/asm/kvm.h +f:arch/x86/include/uapi/asm/kvm_para.h +f:arch/x86/include/uapi/asm/kvm_perf.h +f:arch/x86/include/uapi/asm/ldt.h +f:arch/x86/include/uapi/asm/mce.h +f:arch/x86/include/uapi/asm/mman.h +f:arch/x86/include/uapi/asm/msgbuf.h +f:arch/x86/include/uapi/asm/msr.h +f:arch/x86/include/uapi/asm/mtrr.h +f:arch/x86/include/uapi/asm/perf_regs.h +f:arch/x86/include/uapi/asm/posix_types.h +f:arch/x86/include/uapi/asm/posix_types_32.h +f:arch/x86/include/uapi/asm/posix_types_64.h +f:arch/x86/include/uapi/asm/posix_types_x32.h +f:arch/x86/include/uapi/asm/prctl.h +f:arch/x86/include/uapi/asm/processor-flags.h +f:arch/x86/include/uapi/asm/ptrace-abi.h +f:arch/x86/include/uapi/asm/ptrace.h +f:arch/x86/include/uapi/asm/sembuf.h +f:arch/x86/include/uapi/asm/setup.h +f:arch/x86/include/uapi/asm/setup_data.h +f:arch/x86/include/uapi/asm/sgx.h +f:arch/x86/include/uapi/asm/shmbuf.h +f:arch/x86/include/uapi/asm/sigcontext.h +f:arch/x86/include/uapi/asm/sigcontext32.h +f:arch/x86/include/uapi/asm/siginfo.h +f:arch/x86/include/uapi/asm/signal.h +f:arch/x86/include/uapi/asm/stat.h +f:arch/x86/include/uapi/asm/statfs.h +f:arch/x86/include/uapi/asm/svm.h +f:arch/x86/include/uapi/asm/swab.h +f:arch/x86/include/uapi/asm/ucontext.h +f:arch/x86/include/uapi/asm/unistd.h +f:arch/x86/include/uapi/asm/vm86.h +f:arch/x86/include/uapi/asm/vmx.h +f:arch/x86/include/uapi/asm/vsyscall.h +f:arch/x86/kernel/.gitignore +f:arch/x86/kernel/Makefile +f:arch/x86/kernel/acpi/Makefile +f:arch/x86/kernel/acpi/apei.c +f:arch/x86/kernel/acpi/boot.c +f:arch/x86/kernel/acpi/cppc.c +f:arch/x86/kernel/acpi/cstate.c +f:arch/x86/kernel/acpi/madt_playdead.S +f:arch/x86/kernel/acpi/madt_wakeup.c +f:arch/x86/kernel/acpi/sleep.c +f:arch/x86/kernel/acpi/sleep.h +f:arch/x86/kernel/acpi/wakeup_32.S +f:arch/x86/kernel/acpi/wakeup_64.S +f:arch/x86/kernel/alternative.c +f:arch/x86/kernel/amd_gart_64.c +f:arch/x86/kernel/amd_nb.c +f:arch/x86/kernel/amd_node.c +f:arch/x86/kernel/aperture_64.c +f:arch/x86/kernel/apic/Makefile +f:arch/x86/kernel/apic/apic.c +f:arch/x86/kernel/apic/apic_common.c +f:arch/x86/kernel/apic/apic_flat_64.c +f:arch/x86/kernel/apic/apic_noop.c +f:arch/x86/kernel/apic/apic_numachip.c +f:arch/x86/kernel/apic/hw_nmi.c +f:arch/x86/kernel/apic/init.c +f:arch/x86/kernel/apic/io_apic.c +f:arch/x86/kernel/apic/ipi.c +f:arch/x86/kernel/apic/local.h +f:arch/x86/kernel/apic/msi.c +f:arch/x86/kernel/apic/probe_32.c +f:arch/x86/kernel/apic/probe_64.c +f:arch/x86/kernel/apic/vector.c +f:arch/x86/kernel/apic/x2apic_cluster.c +f:arch/x86/kernel/apic/x2apic_phys.c +f:arch/x86/kernel/apic/x2apic_uv_x.c +f:arch/x86/kernel/apm_32.c +f:arch/x86/kernel/asm-offsets.c +f:arch/x86/kernel/asm-offsets_32.c +f:arch/x86/kernel/asm-offsets_64.c +f:arch/x86/kernel/audit_64.c +f:arch/x86/kernel/bootflag.c +f:arch/x86/kernel/callthunks.c +f:arch/x86/kernel/cet.c +f:arch/x86/kernel/cfi.c +f:arch/x86/kernel/check.c +f:arch/x86/kernel/cpu/.gitignore +f:arch/x86/kernel/cpu/Makefile +f:arch/x86/kernel/cpu/acrn.c +f:arch/x86/kernel/cpu/amd.c +f:arch/x86/kernel/cpu/amd_cache_disable.c +f:arch/x86/kernel/cpu/aperfmperf.c +f:arch/x86/kernel/cpu/bugs.c +f:arch/x86/kernel/cpu/bus_lock.c +f:arch/x86/kernel/cpu/cacheinfo.c +f:arch/x86/kernel/cpu/centaur.c +f:arch/x86/kernel/cpu/common.c +f:arch/x86/kernel/cpu/cpu.h +f:arch/x86/kernel/cpu/cpuid-deps.c +f:arch/x86/kernel/cpu/cpuid_0x2_table.c +f:arch/x86/kernel/cpu/cyrix.c +f:arch/x86/kernel/cpu/debugfs.c +f:arch/x86/kernel/cpu/feat_ctl.c +f:arch/x86/kernel/cpu/hygon.c +f:arch/x86/kernel/cpu/hypervisor.c +f:arch/x86/kernel/cpu/intel.c +f:arch/x86/kernel/cpu/intel_epb.c +f:arch/x86/kernel/cpu/match.c +f:arch/x86/kernel/cpu/mce/Makefile +f:arch/x86/kernel/cpu/mce/amd.c +f:arch/x86/kernel/cpu/mce/apei.c +f:arch/x86/kernel/cpu/mce/core.c +f:arch/x86/kernel/cpu/mce/dev-mcelog.c +f:arch/x86/kernel/cpu/mce/genpool.c +f:arch/x86/kernel/cpu/mce/inject.c +f:arch/x86/kernel/cpu/mce/intel.c +f:arch/x86/kernel/cpu/mce/internal.h +f:arch/x86/kernel/cpu/mce/p5.c +f:arch/x86/kernel/cpu/mce/severity.c +f:arch/x86/kernel/cpu/mce/threshold.c +f:arch/x86/kernel/cpu/mce/winchip.c +f:arch/x86/kernel/cpu/microcode/Makefile +f:arch/x86/kernel/cpu/microcode/amd.c +f:arch/x86/kernel/cpu/microcode/amd_shas.c +f:arch/x86/kernel/cpu/microcode/core.c +f:arch/x86/kernel/cpu/microcode/intel-ucode-defs.h +f:arch/x86/kernel/cpu/microcode/intel.c +f:arch/x86/kernel/cpu/microcode/internal.h +f:arch/x86/kernel/cpu/mkcapflags.sh +f:arch/x86/kernel/cpu/mshyperv.c +f:arch/x86/kernel/cpu/mtrr/Makefile +f:arch/x86/kernel/cpu/mtrr/amd.c +f:arch/x86/kernel/cpu/mtrr/centaur.c +f:arch/x86/kernel/cpu/mtrr/cleanup.c +f:arch/x86/kernel/cpu/mtrr/cyrix.c +f:arch/x86/kernel/cpu/mtrr/generic.c +f:arch/x86/kernel/cpu/mtrr/if.c +f:arch/x86/kernel/cpu/mtrr/legacy.c +f:arch/x86/kernel/cpu/mtrr/mtrr.c +f:arch/x86/kernel/cpu/mtrr/mtrr.h +f:arch/x86/kernel/cpu/perfctr-watchdog.c +f:arch/x86/kernel/cpu/powerflags.c +f:arch/x86/kernel/cpu/proc.c +f:arch/x86/kernel/cpu/rdrand.c +f:arch/x86/kernel/cpu/resctrl/Makefile +f:arch/x86/kernel/cpu/resctrl/core.c +f:arch/x86/kernel/cpu/resctrl/ctrlmondata.c +f:arch/x86/kernel/cpu/resctrl/internal.h +f:arch/x86/kernel/cpu/resctrl/monitor.c +f:arch/x86/kernel/cpu/resctrl/pseudo_lock.c +f:arch/x86/kernel/cpu/resctrl/pseudo_lock_trace.h +f:arch/x86/kernel/cpu/resctrl/rdtgroup.c +f:arch/x86/kernel/cpu/scattered.c +f:arch/x86/kernel/cpu/sgx/Makefile +f:arch/x86/kernel/cpu/sgx/driver.c +f:arch/x86/kernel/cpu/sgx/driver.h +f:arch/x86/kernel/cpu/sgx/encl.c +f:arch/x86/kernel/cpu/sgx/encl.h +f:arch/x86/kernel/cpu/sgx/encls.h +f:arch/x86/kernel/cpu/sgx/ioctl.c +f:arch/x86/kernel/cpu/sgx/main.c +f:arch/x86/kernel/cpu/sgx/sgx.h +f:arch/x86/kernel/cpu/sgx/virt.c +f:arch/x86/kernel/cpu/topology.c +f:arch/x86/kernel/cpu/topology.h +f:arch/x86/kernel/cpu/topology_amd.c +f:arch/x86/kernel/cpu/topology_common.c +f:arch/x86/kernel/cpu/topology_ext.c +f:arch/x86/kernel/cpu/transmeta.c +f:arch/x86/kernel/cpu/tsx.c +f:arch/x86/kernel/cpu/umc.c +f:arch/x86/kernel/cpu/umwait.c +f:arch/x86/kernel/cpu/vmware.c +f:arch/x86/kernel/cpu/vortex.c +f:arch/x86/kernel/cpu/zhaoxin.c +f:arch/x86/kernel/cpuid.c +f:arch/x86/kernel/crash.c +f:arch/x86/kernel/crash_dump_32.c +f:arch/x86/kernel/crash_dump_64.c +f:arch/x86/kernel/devicetree.c +f:arch/x86/kernel/doublefault_32.c +f:arch/x86/kernel/dumpstack.c +f:arch/x86/kernel/dumpstack_32.c +f:arch/x86/kernel/dumpstack_64.c +f:arch/x86/kernel/e820.c +f:arch/x86/kernel/early-quirks.c +f:arch/x86/kernel/early_printk.c +f:arch/x86/kernel/ebda.c +f:arch/x86/kernel/eisa.c +f:arch/x86/kernel/espfix_64.c +f:arch/x86/kernel/fpu/Makefile +f:arch/x86/kernel/fpu/bugs.c +f:arch/x86/kernel/fpu/context.h +f:arch/x86/kernel/fpu/core.c +f:arch/x86/kernel/fpu/init.c +f:arch/x86/kernel/fpu/internal.h +f:arch/x86/kernel/fpu/legacy.h +f:arch/x86/kernel/fpu/regset.c +f:arch/x86/kernel/fpu/signal.c +f:arch/x86/kernel/fpu/xstate.c +f:arch/x86/kernel/fpu/xstate.h +f:arch/x86/kernel/fred.c +f:arch/x86/kernel/ftrace.c +f:arch/x86/kernel/ftrace_32.S +f:arch/x86/kernel/ftrace_64.S +f:arch/x86/kernel/head32.c +f:arch/x86/kernel/head64.c +f:arch/x86/kernel/head_32.S +f:arch/x86/kernel/head_64.S +f:arch/x86/kernel/hpet.c +f:arch/x86/kernel/hw_breakpoint.c +f:arch/x86/kernel/i8237.c +f:arch/x86/kernel/i8253.c +f:arch/x86/kernel/i8259.c +f:arch/x86/kernel/ibt_selftest.S +f:arch/x86/kernel/idt.c +f:arch/x86/kernel/io_delay.c +f:arch/x86/kernel/ioport.c +f:arch/x86/kernel/irq.c +f:arch/x86/kernel/irq_32.c +f:arch/x86/kernel/irq_64.c +f:arch/x86/kernel/irq_work.c +f:arch/x86/kernel/irqflags.S +f:arch/x86/kernel/irqinit.c +f:arch/x86/kernel/itmt.c +f:arch/x86/kernel/jailhouse.c +f:arch/x86/kernel/jump_label.c +f:arch/x86/kernel/kdebugfs.c +f:arch/x86/kernel/kexec-bzimage64.c +f:arch/x86/kernel/kgdb.c +f:arch/x86/kernel/kprobes/Makefile +f:arch/x86/kernel/kprobes/common.h +f:arch/x86/kernel/kprobes/core.c +f:arch/x86/kernel/kprobes/ftrace.c +f:arch/x86/kernel/kprobes/opt.c +f:arch/x86/kernel/ksysfs.c +f:arch/x86/kernel/kvm.c +f:arch/x86/kernel/kvmclock.c +f:arch/x86/kernel/ldt.c +f:arch/x86/kernel/machine_kexec_32.c +f:arch/x86/kernel/machine_kexec_64.c +f:arch/x86/kernel/mmconf-fam10h_64.c +f:arch/x86/kernel/module.c +f:arch/x86/kernel/mpparse.c +f:arch/x86/kernel/msr.c +f:arch/x86/kernel/nmi.c +f:arch/x86/kernel/nmi_selftest.c +f:arch/x86/kernel/paravirt-spinlocks.c +f:arch/x86/kernel/paravirt.c +f:arch/x86/kernel/pci-dma.c +f:arch/x86/kernel/pcspeaker.c +f:arch/x86/kernel/perf_regs.c +f:arch/x86/kernel/platform-quirks.c +f:arch/x86/kernel/pmem.c +f:arch/x86/kernel/probe_roms.c +f:arch/x86/kernel/process.c +f:arch/x86/kernel/process.h +f:arch/x86/kernel/process_32.c +f:arch/x86/kernel/process_64.c +f:arch/x86/kernel/ptrace.c +f:arch/x86/kernel/pvclock.c +f:arch/x86/kernel/quirks.c +f:arch/x86/kernel/reboot.c +f:arch/x86/kernel/reboot_fixups_32.c +f:arch/x86/kernel/relocate_kernel_32.S +f:arch/x86/kernel/relocate_kernel_64.S +f:arch/x86/kernel/resource.c +f:arch/x86/kernel/rethook.c +f:arch/x86/kernel/rtc.c +f:arch/x86/kernel/setup.c +f:arch/x86/kernel/setup_percpu.c +f:arch/x86/kernel/sev_verify_cbit.S +f:arch/x86/kernel/shstk.c +f:arch/x86/kernel/signal.c +f:arch/x86/kernel/signal_32.c +f:arch/x86/kernel/signal_64.c +f:arch/x86/kernel/smp.c +f:arch/x86/kernel/smpboot.c +f:arch/x86/kernel/stacktrace.c +f:arch/x86/kernel/static_call.c +f:arch/x86/kernel/step.c +f:arch/x86/kernel/sys_ia32.c +f:arch/x86/kernel/sys_x86_64.c +f:arch/x86/kernel/tboot.c +f:arch/x86/kernel/time.c +f:arch/x86/kernel/tls.c +f:arch/x86/kernel/tls.h +f:arch/x86/kernel/trace.c +f:arch/x86/kernel/trace_clock.c +f:arch/x86/kernel/traps.c +f:arch/x86/kernel/tsc.c +f:arch/x86/kernel/tsc_msr.c +f:arch/x86/kernel/tsc_sync.c +f:arch/x86/kernel/umip.c +f:arch/x86/kernel/unwind_frame.c +f:arch/x86/kernel/unwind_guess.c +f:arch/x86/kernel/unwind_orc.c +f:arch/x86/kernel/uprobes.c +f:arch/x86/kernel/verify_cpu.S +f:arch/x86/kernel/vm86_32.c +f:arch/x86/kernel/vmcore_info_32.c +f:arch/x86/kernel/vmcore_info_64.c +f:arch/x86/kernel/vmlinux.lds.S +f:arch/x86/kernel/vsmp_64.c +f:arch/x86/kernel/x86_init.c +f:arch/x86/kvm/.gitignore +f:arch/x86/kvm/Kconfig +f:arch/x86/kvm/Makefile +f:arch/x86/kvm/cpuid.c +f:arch/x86/kvm/cpuid.h +f:arch/x86/kvm/debugfs.c +f:arch/x86/kvm/emulate.c +f:arch/x86/kvm/fpu.h +f:arch/x86/kvm/hyperv.c +f:arch/x86/kvm/hyperv.h +f:arch/x86/kvm/i8254.c +f:arch/x86/kvm/i8254.h +f:arch/x86/kvm/i8259.c +f:arch/x86/kvm/ioapic.c +f:arch/x86/kvm/ioapic.h +f:arch/x86/kvm/irq.c +f:arch/x86/kvm/irq.h +f:arch/x86/kvm/kvm-asm-offsets.c +f:arch/x86/kvm/kvm_cache_regs.h +f:arch/x86/kvm/kvm_emulate.h +f:arch/x86/kvm/kvm_onhyperv.c +f:arch/x86/kvm/kvm_onhyperv.h +f:arch/x86/kvm/lapic.c +f:arch/x86/kvm/lapic.h +f:arch/x86/kvm/mmu.h +f:arch/x86/kvm/mmu/mmu.c +f:arch/x86/kvm/mmu/mmu_internal.h +f:arch/x86/kvm/mmu/mmutrace.h +f:arch/x86/kvm/mmu/page_track.c +f:arch/x86/kvm/mmu/page_track.h +f:arch/x86/kvm/mmu/paging_tmpl.h +f:arch/x86/kvm/mmu/spte.c +f:arch/x86/kvm/mmu/spte.h +f:arch/x86/kvm/mmu/tdp_iter.c +f:arch/x86/kvm/mmu/tdp_iter.h +f:arch/x86/kvm/mmu/tdp_mmu.c +f:arch/x86/kvm/mmu/tdp_mmu.h +f:arch/x86/kvm/mtrr.c +f:arch/x86/kvm/pmu.c +f:arch/x86/kvm/pmu.h +f:arch/x86/kvm/reverse_cpuid.h +f:arch/x86/kvm/smm.c +f:arch/x86/kvm/smm.h +f:arch/x86/kvm/svm/avic.c +f:arch/x86/kvm/svm/hyperv.c +f:arch/x86/kvm/svm/hyperv.h +f:arch/x86/kvm/svm/nested.c +f:arch/x86/kvm/svm/pmu.c +f:arch/x86/kvm/svm/sev.c +f:arch/x86/kvm/svm/svm.c +f:arch/x86/kvm/svm/svm.h +f:arch/x86/kvm/svm/svm_onhyperv.c +f:arch/x86/kvm/svm/svm_onhyperv.h +f:arch/x86/kvm/svm/svm_ops.h +f:arch/x86/kvm/svm/vmenter.S +f:arch/x86/kvm/trace.h +f:arch/x86/kvm/tss.h +f:arch/x86/kvm/vmx/capabilities.h +f:arch/x86/kvm/vmx/common.h +f:arch/x86/kvm/vmx/hyperv.c +f:arch/x86/kvm/vmx/hyperv.h +f:arch/x86/kvm/vmx/hyperv_evmcs.c +f:arch/x86/kvm/vmx/hyperv_evmcs.h +f:arch/x86/kvm/vmx/main.c +f:arch/x86/kvm/vmx/nested.c +f:arch/x86/kvm/vmx/nested.h +f:arch/x86/kvm/vmx/pmu_intel.c +f:arch/x86/kvm/vmx/pmu_intel.h +f:arch/x86/kvm/vmx/posted_intr.c +f:arch/x86/kvm/vmx/posted_intr.h +f:arch/x86/kvm/vmx/run_flags.h +f:arch/x86/kvm/vmx/sgx.c +f:arch/x86/kvm/vmx/sgx.h +f:arch/x86/kvm/vmx/tdx.c +f:arch/x86/kvm/vmx/tdx.h +f:arch/x86/kvm/vmx/tdx_arch.h +f:arch/x86/kvm/vmx/tdx_errno.h +f:arch/x86/kvm/vmx/vmcs.h +f:arch/x86/kvm/vmx/vmcs12.c +f:arch/x86/kvm/vmx/vmcs12.h +f:arch/x86/kvm/vmx/vmcs_shadow_fields.h +f:arch/x86/kvm/vmx/vmenter.S +f:arch/x86/kvm/vmx/vmx.c +f:arch/x86/kvm/vmx/vmx.h +f:arch/x86/kvm/vmx/vmx_onhyperv.c +f:arch/x86/kvm/vmx/vmx_onhyperv.h +f:arch/x86/kvm/vmx/vmx_ops.h +f:arch/x86/kvm/vmx/x86_ops.h +f:arch/x86/kvm/x86.c +f:arch/x86/kvm/x86.h +f:arch/x86/kvm/xen.c +f:arch/x86/kvm/xen.h +f:arch/x86/lib/.gitignore +f:arch/x86/lib/Makefile +f:arch/x86/lib/atomic64_32.c +f:arch/x86/lib/atomic64_386_32.S +f:arch/x86/lib/atomic64_cx8_32.S +f:arch/x86/lib/bhi.S +f:arch/x86/lib/cache-smp.c +f:arch/x86/lib/checksum_32.S +f:arch/x86/lib/clear_page_64.S +f:arch/x86/lib/cmdline.c +f:arch/x86/lib/cmpxchg16b_emu.S +f:arch/x86/lib/cmpxchg8b_emu.S +f:arch/x86/lib/copy_mc.c +f:arch/x86/lib/copy_mc_64.S +f:arch/x86/lib/copy_page_64.S +f:arch/x86/lib/copy_user_64.S +f:arch/x86/lib/copy_user_uncached_64.S +f:arch/x86/lib/cpu.c +f:arch/x86/lib/csum-copy_64.S +f:arch/x86/lib/csum-partial_64.c +f:arch/x86/lib/csum-wrappers_64.c +f:arch/x86/lib/delay.c +f:arch/x86/lib/error-inject.c +f:arch/x86/lib/getuser.S +f:arch/x86/lib/hweight.S +f:arch/x86/lib/inat.c +f:arch/x86/lib/insn-eval.c +f:arch/x86/lib/insn.c +f:arch/x86/lib/iomem.c +f:arch/x86/lib/kaslr.c +f:arch/x86/lib/memcpy_32.c +f:arch/x86/lib/memcpy_64.S +f:arch/x86/lib/memmove_32.S +f:arch/x86/lib/memmove_64.S +f:arch/x86/lib/memset_64.S +f:arch/x86/lib/misc.c +f:arch/x86/lib/msr-reg-export.c +f:arch/x86/lib/msr-reg.S +f:arch/x86/lib/msr-smp.c +f:arch/x86/lib/msr.c +f:arch/x86/lib/pc-conf-reg.c +f:arch/x86/lib/putuser.S +f:arch/x86/lib/retpoline.S +f:arch/x86/lib/string_32.c +f:arch/x86/lib/strstr_32.c +f:arch/x86/lib/usercopy.c +f:arch/x86/lib/usercopy_32.c +f:arch/x86/lib/usercopy_64.c +f:arch/x86/lib/x86-opcode-map.txt +f:arch/x86/math-emu/Makefile +f:arch/x86/math-emu/README +f:arch/x86/math-emu/control_w.h +f:arch/x86/math-emu/div_Xsig.S +f:arch/x86/math-emu/div_small.S +f:arch/x86/math-emu/errors.c +f:arch/x86/math-emu/exception.h +f:arch/x86/math-emu/fpu_arith.c +f:arch/x86/math-emu/fpu_asm.h +f:arch/x86/math-emu/fpu_aux.c +f:arch/x86/math-emu/fpu_emu.h +f:arch/x86/math-emu/fpu_entry.c +f:arch/x86/math-emu/fpu_etc.c +f:arch/x86/math-emu/fpu_proto.h +f:arch/x86/math-emu/fpu_system.h +f:arch/x86/math-emu/fpu_tags.c +f:arch/x86/math-emu/fpu_trig.c +f:arch/x86/math-emu/get_address.c +f:arch/x86/math-emu/load_store.c +f:arch/x86/math-emu/mul_Xsig.S +f:arch/x86/math-emu/poly.h +f:arch/x86/math-emu/poly_2xm1.c +f:arch/x86/math-emu/poly_atan.c +f:arch/x86/math-emu/poly_l2.c +f:arch/x86/math-emu/poly_sin.c +f:arch/x86/math-emu/poly_tan.c +f:arch/x86/math-emu/polynom_Xsig.S +f:arch/x86/math-emu/reg_add_sub.c +f:arch/x86/math-emu/reg_compare.c +f:arch/x86/math-emu/reg_constant.c +f:arch/x86/math-emu/reg_constant.h +f:arch/x86/math-emu/reg_convert.c +f:arch/x86/math-emu/reg_divide.c +f:arch/x86/math-emu/reg_ld_str.c +f:arch/x86/math-emu/reg_mul.c +f:arch/x86/math-emu/reg_norm.S +f:arch/x86/math-emu/reg_round.S +f:arch/x86/math-emu/reg_u_add.S +f:arch/x86/math-emu/reg_u_div.S +f:arch/x86/math-emu/reg_u_mul.S +f:arch/x86/math-emu/reg_u_sub.S +f:arch/x86/math-emu/round_Xsig.S +f:arch/x86/math-emu/shr_Xsig.S +f:arch/x86/math-emu/status_w.h +f:arch/x86/math-emu/version.h +f:arch/x86/math-emu/wm_shrx.S +f:arch/x86/math-emu/wm_sqrt.S +f:arch/x86/mm/Makefile +f:arch/x86/mm/amdtopology.c +f:arch/x86/mm/cpu_entry_area.c +f:arch/x86/mm/debug_pagetables.c +f:arch/x86/mm/dump_pagetables.c +f:arch/x86/mm/extable.c +f:arch/x86/mm/fault.c +f:arch/x86/mm/hugetlbpage.c +f:arch/x86/mm/ident_map.c +f:arch/x86/mm/init.c +f:arch/x86/mm/init_32.c +f:arch/x86/mm/init_64.c +f:arch/x86/mm/iomap_32.c +f:arch/x86/mm/ioremap.c +f:arch/x86/mm/kasan_init_64.c +f:arch/x86/mm/kaslr.c +f:arch/x86/mm/kmmio.c +f:arch/x86/mm/kmsan_shadow.c +f:arch/x86/mm/maccess.c +f:arch/x86/mm/mem_encrypt.c +f:arch/x86/mm/mem_encrypt_amd.c +f:arch/x86/mm/mem_encrypt_boot.S +f:arch/x86/mm/mm_internal.h +f:arch/x86/mm/mmap.c +f:arch/x86/mm/mmio-mod.c +f:arch/x86/mm/numa.c +f:arch/x86/mm/pat/Makefile +f:arch/x86/mm/pat/cpa-test.c +f:arch/x86/mm/pat/memtype.c +f:arch/x86/mm/pat/memtype.h +f:arch/x86/mm/pat/memtype_interval.c +f:arch/x86/mm/pat/set_memory.c +f:arch/x86/mm/pf_in.c +f:arch/x86/mm/pf_in.h +f:arch/x86/mm/pgprot.c +f:arch/x86/mm/pgtable.c +f:arch/x86/mm/pgtable_32.c +f:arch/x86/mm/physaddr.c +f:arch/x86/mm/physaddr.h +f:arch/x86/mm/pkeys.c +f:arch/x86/mm/pti.c +f:arch/x86/mm/srat.c +f:arch/x86/mm/testmmiotrace.c +f:arch/x86/mm/tlb.c +f:arch/x86/net/Makefile +f:arch/x86/net/bpf_jit_comp.c +f:arch/x86/net/bpf_jit_comp32.c +f:arch/x86/net/bpf_timed_may_goto.S +f:arch/x86/pci/Makefile +f:arch/x86/pci/acpi.c +f:arch/x86/pci/amd_bus.c +f:arch/x86/pci/broadcom_bus.c +f:arch/x86/pci/bus_numa.c +f:arch/x86/pci/bus_numa.h +f:arch/x86/pci/ce4100.c +f:arch/x86/pci/common.c +f:arch/x86/pci/direct.c +f:arch/x86/pci/early.c +f:arch/x86/pci/fixup.c +f:arch/x86/pci/i386.c +f:arch/x86/pci/init.c +f:arch/x86/pci/intel_mid.c +f:arch/x86/pci/irq.c +f:arch/x86/pci/legacy.c +f:arch/x86/pci/mmconfig-shared.c +f:arch/x86/pci/mmconfig_32.c +f:arch/x86/pci/mmconfig_64.c +f:arch/x86/pci/numachip.c +f:arch/x86/pci/olpc.c +f:arch/x86/pci/pcbios.c +f:arch/x86/pci/xen.c +f:arch/x86/platform/Makefile +f:arch/x86/platform/atom/Makefile +f:arch/x86/platform/atom/punit_atom_debug.c +f:arch/x86/platform/ce4100/Makefile +f:arch/x86/platform/ce4100/ce4100.c +f:arch/x86/platform/ce4100/falconfalls.dts +f:arch/x86/platform/efi/Makefile +f:arch/x86/platform/efi/efi.c +f:arch/x86/platform/efi/efi_32.c +f:arch/x86/platform/efi/efi_64.c +f:arch/x86/platform/efi/efi_stub_32.S +f:arch/x86/platform/efi/efi_stub_64.S +f:arch/x86/platform/efi/efi_thunk_64.S +f:arch/x86/platform/efi/memmap.c +f:arch/x86/platform/efi/quirks.c +f:arch/x86/platform/efi/runtime-map.c +f:arch/x86/platform/geode/Makefile +f:arch/x86/platform/geode/alix.c +f:arch/x86/platform/geode/geode-common.c +f:arch/x86/platform/geode/geode-common.h +f:arch/x86/platform/geode/geos.c +f:arch/x86/platform/geode/net5501.c +f:arch/x86/platform/intel-mid/Makefile +f:arch/x86/platform/intel-mid/intel-mid.c +f:arch/x86/platform/intel-mid/pwr.c +f:arch/x86/platform/intel-quark/Makefile +f:arch/x86/platform/intel-quark/imr.c +f:arch/x86/platform/intel-quark/imr_selftest.c +f:arch/x86/platform/intel/Makefile +f:arch/x86/platform/intel/iosf_mbi.c +f:arch/x86/platform/iris/Makefile +f:arch/x86/platform/iris/iris.c +f:arch/x86/platform/olpc/Makefile +f:arch/x86/platform/olpc/olpc-xo1-pm.c +f:arch/x86/platform/olpc/olpc-xo1-rtc.c +f:arch/x86/platform/olpc/olpc-xo1-sci.c +f:arch/x86/platform/olpc/olpc-xo15-sci.c +f:arch/x86/platform/olpc/olpc.c +f:arch/x86/platform/olpc/olpc_dt.c +f:arch/x86/platform/olpc/olpc_ofw.c +f:arch/x86/platform/olpc/xo1-wakeup.S +f:arch/x86/platform/pvh/Makefile +f:arch/x86/platform/pvh/enlighten.c +f:arch/x86/platform/pvh/head.S +f:arch/x86/platform/scx200/Makefile +f:arch/x86/platform/scx200/scx200_32.c +f:arch/x86/platform/ts5500/Makefile +f:arch/x86/platform/ts5500/ts5500.c +f:arch/x86/platform/uv/Makefile +f:arch/x86/platform/uv/bios_uv.c +f:arch/x86/platform/uv/uv_irq.c +f:arch/x86/platform/uv/uv_nmi.c +f:arch/x86/platform/uv/uv_time.c +f:arch/x86/power/Makefile +f:arch/x86/power/cpu.c +f:arch/x86/power/hibernate.c +f:arch/x86/power/hibernate_32.c +f:arch/x86/power/hibernate_64.c +f:arch/x86/power/hibernate_asm_32.S +f:arch/x86/power/hibernate_asm_64.S +f:arch/x86/purgatory/.gitignore +f:arch/x86/purgatory/Makefile +f:arch/x86/purgatory/entry64.S +f:arch/x86/purgatory/kexec-purgatory.S +f:arch/x86/purgatory/purgatory.c +f:arch/x86/purgatory/setup-x86_64.S +f:arch/x86/purgatory/stack.S +f:arch/x86/ras/Kconfig +f:arch/x86/realmode/Makefile +f:arch/x86/realmode/init.c +f:arch/x86/realmode/rm/.gitignore +f:arch/x86/realmode/rm/Makefile +f:arch/x86/realmode/rm/bioscall.S +f:arch/x86/realmode/rm/copy.S +f:arch/x86/realmode/rm/header.S +f:arch/x86/realmode/rm/realmode.h +f:arch/x86/realmode/rm/realmode.lds.S +f:arch/x86/realmode/rm/reboot.S +f:arch/x86/realmode/rm/regs.c +f:arch/x86/realmode/rm/stack.S +f:arch/x86/realmode/rm/trampoline_32.S +f:arch/x86/realmode/rm/trampoline_64.S +f:arch/x86/realmode/rm/trampoline_common.S +f:arch/x86/realmode/rm/video-bios.c +f:arch/x86/realmode/rm/video-mode.c +f:arch/x86/realmode/rm/video-vesa.c +f:arch/x86/realmode/rm/video-vga.c +f:arch/x86/realmode/rm/wakemain.c +f:arch/x86/realmode/rm/wakeup.h +f:arch/x86/realmode/rm/wakeup_asm.S +f:arch/x86/realmode/rmpiggy.S +f:arch/x86/tools/.gitignore +f:arch/x86/tools/Makefile +f:arch/x86/tools/cpufeaturemasks.awk +f:arch/x86/tools/gen-insn-attr-x86.awk +f:arch/x86/tools/insn_decoder_test.c +f:arch/x86/tools/insn_sanity.c +f:arch/x86/tools/objdump_reformat.awk +f:arch/x86/tools/relocs.c +f:arch/x86/tools/relocs.h +f:arch/x86/tools/relocs_32.c +f:arch/x86/tools/relocs_64.c +f:arch/x86/tools/relocs_common.c +f:arch/x86/um/Kconfig +f:arch/x86/um/Makefile +f:arch/x86/um/asm/apic.h +f:arch/x86/um/asm/arch_hweight.h +f:arch/x86/um/asm/barrier.h +f:arch/x86/um/asm/checksum.h +f:arch/x86/um/asm/checksum_32.h +f:arch/x86/um/asm/checksum_64.h +f:arch/x86/um/asm/desc.h +f:arch/x86/um/asm/elf.h +f:arch/x86/um/asm/irq_vectors.h +f:arch/x86/um/asm/processor.h +f:arch/x86/um/asm/processor_32.h +f:arch/x86/um/asm/processor_64.h +f:arch/x86/um/asm/ptrace.h +f:arch/x86/um/asm/required-features.h +f:arch/x86/um/asm/segment.h +f:arch/x86/um/asm/syscall.h +f:arch/x86/um/asm/vm-flags.h +f:arch/x86/um/bugs_32.c +f:arch/x86/um/bugs_64.c +f:arch/x86/um/delay.c +f:arch/x86/um/elfcore.c +f:arch/x86/um/fault.c +f:arch/x86/um/mem_32.c +f:arch/x86/um/mem_64.c +f:arch/x86/um/os-Linux/Makefile +f:arch/x86/um/os-Linux/mcontext.c +f:arch/x86/um/os-Linux/registers.c +f:arch/x86/um/os-Linux/tls.c +f:arch/x86/um/ptrace.c +f:arch/x86/um/ptrace_32.c +f:arch/x86/um/ptrace_64.c +f:arch/x86/um/ptrace_user.c +f:arch/x86/um/setjmp_32.S +f:arch/x86/um/setjmp_64.S +f:arch/x86/um/shared/sysdep/archsetjmp.h +f:arch/x86/um/shared/sysdep/archsetjmp_32.h +f:arch/x86/um/shared/sysdep/archsetjmp_64.h +f:arch/x86/um/shared/sysdep/faultinfo.h +f:arch/x86/um/shared/sysdep/faultinfo_32.h +f:arch/x86/um/shared/sysdep/faultinfo_64.h +f:arch/x86/um/shared/sysdep/kernel-offsets.h +f:arch/x86/um/shared/sysdep/mcontext.h +f:arch/x86/um/shared/sysdep/ptrace.h +f:arch/x86/um/shared/sysdep/ptrace_32.h +f:arch/x86/um/shared/sysdep/ptrace_64.h +f:arch/x86/um/shared/sysdep/ptrace_user.h +f:arch/x86/um/shared/sysdep/stub-data.h +f:arch/x86/um/shared/sysdep/stub.h +f:arch/x86/um/shared/sysdep/stub_32.h +f:arch/x86/um/shared/sysdep/stub_64.h +f:arch/x86/um/shared/sysdep/tls.h +f:arch/x86/um/signal.c +f:arch/x86/um/stub_segv.c +f:arch/x86/um/sys_call_table_32.c +f:arch/x86/um/sys_call_table_64.c +f:arch/x86/um/syscalls_32.c +f:arch/x86/um/syscalls_64.c +f:arch/x86/um/sysrq_32.c +f:arch/x86/um/sysrq_64.c +f:arch/x86/um/tls_32.c +f:arch/x86/um/tls_64.c +f:arch/x86/um/user-offsets.c +f:arch/x86/um/vdso/.gitignore +f:arch/x86/um/vdso/Makefile +f:arch/x86/um/vdso/um_vdso.c +f:arch/x86/um/vdso/vdso-layout.lds.S +f:arch/x86/um/vdso/vdso-note.S +f:arch/x86/um/vdso/vdso.S +f:arch/x86/um/vdso/vdso.lds.S +f:arch/x86/um/vdso/vma.c +f:arch/x86/video/Makefile +f:arch/x86/video/video-common.c +f:arch/x86/virt/Makefile +f:arch/x86/virt/svm/Makefile +f:arch/x86/virt/svm/cmdline.c +f:arch/x86/virt/svm/sev.c +f:arch/x86/virt/vmx/Makefile +f:arch/x86/virt/vmx/tdx/Makefile +f:arch/x86/virt/vmx/tdx/seamcall.S +f:arch/x86/virt/vmx/tdx/tdx.c +f:arch/x86/virt/vmx/tdx/tdx.h +f:arch/x86/virt/vmx/tdx/tdx_global_metadata.c +f:arch/x86/virt/vmx/tdx/tdxcall.S +f:arch/x86/xen/Kconfig +f:arch/x86/xen/Makefile +f:arch/x86/xen/apic.c +f:arch/x86/xen/debugfs.c +f:arch/x86/xen/efi.c +f:arch/x86/xen/enlighten.c +f:arch/x86/xen/enlighten_hvm.c +f:arch/x86/xen/enlighten_pv.c +f:arch/x86/xen/enlighten_pvh.c +f:arch/x86/xen/grant-table.c +f:arch/x86/xen/irq.c +f:arch/x86/xen/mmu.c +f:arch/x86/xen/mmu_hvm.c +f:arch/x86/xen/mmu_pv.c +f:arch/x86/xen/multicalls.c +f:arch/x86/xen/p2m.c +f:arch/x86/xen/platform-pci-unplug.c +f:arch/x86/xen/pmu.c +f:arch/x86/xen/setup.c +f:arch/x86/xen/smp.c +f:arch/x86/xen/smp_hvm.c +f:arch/x86/xen/smp_pv.c +f:arch/x86/xen/spinlock.c +f:arch/x86/xen/suspend.c +f:arch/x86/xen/suspend_hvm.c +f:arch/x86/xen/suspend_pv.c +f:arch/x86/xen/time.c +f:arch/x86/xen/trace.c +f:arch/x86/xen/vga.c +f:arch/x86/xen/xen-asm.S +f:arch/x86/xen/xen-head.S +f:arch/x86/xen/xen-ops.h +f:arch/xtensa/Kbuild +f:arch/xtensa/Kconfig +f:arch/xtensa/Kconfig.debug +f:arch/xtensa/Makefile +f:arch/xtensa/boot/.gitignore +f:arch/xtensa/boot/Makefile +f:arch/xtensa/boot/boot-elf/.gitignore +f:arch/xtensa/boot/boot-elf/Makefile +f:arch/xtensa/boot/boot-elf/boot.lds.S +f:arch/xtensa/boot/boot-elf/bootstrap.S +f:arch/xtensa/boot/boot-redboot/Makefile +f:arch/xtensa/boot/boot-redboot/boot.ld +f:arch/xtensa/boot/boot-redboot/bootstrap.S +f:arch/xtensa/boot/dts/Makefile +f:arch/xtensa/boot/dts/csp.dts +f:arch/xtensa/boot/dts/kc705.dts +f:arch/xtensa/boot/dts/kc705_nommu.dts +f:arch/xtensa/boot/dts/lx200mx.dts +f:arch/xtensa/boot/dts/lx60.dts +f:arch/xtensa/boot/dts/ml605.dts +f:arch/xtensa/boot/dts/virt.dts +f:arch/xtensa/boot/dts/xtfpga-flash-128m.dtsi +f:arch/xtensa/boot/dts/xtfpga-flash-16m.dtsi +f:arch/xtensa/boot/dts/xtfpga-flash-4m.dtsi +f:arch/xtensa/boot/dts/xtfpga.dtsi +f:arch/xtensa/boot/lib/.gitignore +f:arch/xtensa/boot/lib/Makefile +f:arch/xtensa/boot/lib/zmem.c +f:arch/xtensa/configs/audio_kc705_defconfig +f:arch/xtensa/configs/cadence_csp_defconfig +f:arch/xtensa/configs/common_defconfig +f:arch/xtensa/configs/generic_kc705_defconfig +f:arch/xtensa/configs/iss_defconfig +f:arch/xtensa/configs/nommu_kc705_defconfig +f:arch/xtensa/configs/smp_lx200_defconfig +f:arch/xtensa/configs/virt_defconfig +f:arch/xtensa/configs/xip_kc705_defconfig +f:arch/xtensa/include/asm/Kbuild +f:arch/xtensa/include/asm/asm-offsets.h +f:arch/xtensa/include/asm/asm-prototypes.h +f:arch/xtensa/include/asm/asm-uaccess.h +f:arch/xtensa/include/asm/asmmacro.h +f:arch/xtensa/include/asm/atomic.h +f:arch/xtensa/include/asm/barrier.h +f:arch/xtensa/include/asm/bitops.h +f:arch/xtensa/include/asm/bootparam.h +f:arch/xtensa/include/asm/cache.h +f:arch/xtensa/include/asm/cacheasm.h +f:arch/xtensa/include/asm/cacheflush.h +f:arch/xtensa/include/asm/cachetype.h +f:arch/xtensa/include/asm/checksum.h +f:arch/xtensa/include/asm/cmpxchg.h +f:arch/xtensa/include/asm/coprocessor.h +f:arch/xtensa/include/asm/core.h +f:arch/xtensa/include/asm/current.h +f:arch/xtensa/include/asm/delay.h +f:arch/xtensa/include/asm/dma.h +f:arch/xtensa/include/asm/elf.h +f:arch/xtensa/include/asm/fixmap.h +f:arch/xtensa/include/asm/flat.h +f:arch/xtensa/include/asm/ftrace.h +f:arch/xtensa/include/asm/futex.h +f:arch/xtensa/include/asm/highmem.h +f:arch/xtensa/include/asm/hw_breakpoint.h +f:arch/xtensa/include/asm/initialize_mmu.h +f:arch/xtensa/include/asm/io.h +f:arch/xtensa/include/asm/irq.h +f:arch/xtensa/include/asm/irqflags.h +f:arch/xtensa/include/asm/jump_label.h +f:arch/xtensa/include/asm/kasan.h +f:arch/xtensa/include/asm/kmem_layout.h +f:arch/xtensa/include/asm/linkage.h +f:arch/xtensa/include/asm/mmu.h +f:arch/xtensa/include/asm/mmu_context.h +f:arch/xtensa/include/asm/mtd-xip.h +f:arch/xtensa/include/asm/mxregs.h +f:arch/xtensa/include/asm/nommu_context.h +f:arch/xtensa/include/asm/page.h +f:arch/xtensa/include/asm/pci-bridge.h +f:arch/xtensa/include/asm/pci.h +f:arch/xtensa/include/asm/perf_event.h +f:arch/xtensa/include/asm/pgalloc.h +f:arch/xtensa/include/asm/pgtable.h +f:arch/xtensa/include/asm/platform.h +f:arch/xtensa/include/asm/processor.h +f:arch/xtensa/include/asm/ptrace.h +f:arch/xtensa/include/asm/regs.h +f:arch/xtensa/include/asm/seccomp.h +f:arch/xtensa/include/asm/sections.h +f:arch/xtensa/include/asm/serial.h +f:arch/xtensa/include/asm/shmparam.h +f:arch/xtensa/include/asm/signal.h +f:arch/xtensa/include/asm/smp.h +f:arch/xtensa/include/asm/spinlock.h +f:arch/xtensa/include/asm/spinlock_types.h +f:arch/xtensa/include/asm/stackprotector.h +f:arch/xtensa/include/asm/stacktrace.h +f:arch/xtensa/include/asm/string.h +f:arch/xtensa/include/asm/switch_to.h +f:arch/xtensa/include/asm/syscall.h +f:arch/xtensa/include/asm/sysmem.h +f:arch/xtensa/include/asm/thread_info.h +f:arch/xtensa/include/asm/timex.h +f:arch/xtensa/include/asm/tlb.h +f:arch/xtensa/include/asm/tlbflush.h +f:arch/xtensa/include/asm/traps.h +f:arch/xtensa/include/asm/uaccess.h +f:arch/xtensa/include/asm/ucontext.h +f:arch/xtensa/include/asm/unistd.h +f:arch/xtensa/include/asm/vectors.h +f:arch/xtensa/include/asm/vermagic.h +f:arch/xtensa/include/asm/vmalloc.h +f:arch/xtensa/include/uapi/asm/Kbuild +f:arch/xtensa/include/uapi/asm/auxvec.h +f:arch/xtensa/include/uapi/asm/byteorder.h +f:arch/xtensa/include/uapi/asm/ioctls.h +f:arch/xtensa/include/uapi/asm/ipcbuf.h +f:arch/xtensa/include/uapi/asm/mman.h +f:arch/xtensa/include/uapi/asm/msgbuf.h +f:arch/xtensa/include/uapi/asm/poll.h +f:arch/xtensa/include/uapi/asm/posix_types.h +f:arch/xtensa/include/uapi/asm/ptrace.h +f:arch/xtensa/include/uapi/asm/sembuf.h +f:arch/xtensa/include/uapi/asm/setup.h +f:arch/xtensa/include/uapi/asm/shmbuf.h +f:arch/xtensa/include/uapi/asm/sigcontext.h +f:arch/xtensa/include/uapi/asm/signal.h +f:arch/xtensa/include/uapi/asm/sockios.h +f:arch/xtensa/include/uapi/asm/stat.h +f:arch/xtensa/include/uapi/asm/swab.h +f:arch/xtensa/include/uapi/asm/types.h +f:arch/xtensa/include/uapi/asm/unistd.h +f:arch/xtensa/kernel/.gitignore +f:arch/xtensa/kernel/Makefile +f:arch/xtensa/kernel/align.S +f:arch/xtensa/kernel/asm-offsets.c +f:arch/xtensa/kernel/coprocessor.S +f:arch/xtensa/kernel/entry.S +f:arch/xtensa/kernel/head.S +f:arch/xtensa/kernel/hibernate.c +f:arch/xtensa/kernel/hw_breakpoint.c +f:arch/xtensa/kernel/irq.c +f:arch/xtensa/kernel/jump_label.c +f:arch/xtensa/kernel/mcount.S +f:arch/xtensa/kernel/module.c +f:arch/xtensa/kernel/mxhead.S +f:arch/xtensa/kernel/pci-dma.c +f:arch/xtensa/kernel/pci.c +f:arch/xtensa/kernel/perf_event.c +f:arch/xtensa/kernel/platform.c +f:arch/xtensa/kernel/process.c +f:arch/xtensa/kernel/ptrace.c +f:arch/xtensa/kernel/s32c1i_selftest.c +f:arch/xtensa/kernel/setup.c +f:arch/xtensa/kernel/signal.c +f:arch/xtensa/kernel/smp.c +f:arch/xtensa/kernel/stacktrace.c +f:arch/xtensa/kernel/syscall.c +f:arch/xtensa/kernel/syscalls/Makefile +f:arch/xtensa/kernel/syscalls/syscall.tbl +f:arch/xtensa/kernel/time.c +f:arch/xtensa/kernel/traps.c +f:arch/xtensa/kernel/vectors.S +f:arch/xtensa/kernel/vmlinux.lds.S +f:arch/xtensa/kernel/xtensa_ksyms.c +f:arch/xtensa/lib/Makefile +f:arch/xtensa/lib/ashldi3.S +f:arch/xtensa/lib/ashrdi3.S +f:arch/xtensa/lib/bswapdi2.S +f:arch/xtensa/lib/bswapsi2.S +f:arch/xtensa/lib/checksum.S +f:arch/xtensa/lib/divsi3.S +f:arch/xtensa/lib/lshrdi3.S +f:arch/xtensa/lib/memcopy.S +f:arch/xtensa/lib/memset.S +f:arch/xtensa/lib/modsi3.S +f:arch/xtensa/lib/mulsi3.S +f:arch/xtensa/lib/pci-auto.c +f:arch/xtensa/lib/strncpy_user.S +f:arch/xtensa/lib/strnlen_user.S +f:arch/xtensa/lib/udivsi3.S +f:arch/xtensa/lib/umodsi3.S +f:arch/xtensa/lib/umulsidi3.S +f:arch/xtensa/lib/usercopy.S +f:arch/xtensa/mm/Makefile +f:arch/xtensa/mm/cache.c +f:arch/xtensa/mm/fault.c +f:arch/xtensa/mm/highmem.c +f:arch/xtensa/mm/init.c +f:arch/xtensa/mm/ioremap.c +f:arch/xtensa/mm/kasan_init.c +f:arch/xtensa/mm/misc.S +f:arch/xtensa/mm/mmu.c +f:arch/xtensa/mm/tlb.c +f:arch/xtensa/platforms/Makefile +f:arch/xtensa/platforms/iss/Makefile +f:arch/xtensa/platforms/iss/console.c +f:arch/xtensa/platforms/iss/include/platform/serial.h +f:arch/xtensa/platforms/iss/include/platform/simcall-gdbio.h +f:arch/xtensa/platforms/iss/include/platform/simcall-iss.h +f:arch/xtensa/platforms/iss/include/platform/simcall.h +f:arch/xtensa/platforms/iss/network.c +f:arch/xtensa/platforms/iss/setup.c +f:arch/xtensa/platforms/iss/simdisk.c +f:arch/xtensa/platforms/xt2000/Makefile +f:arch/xtensa/platforms/xt2000/include/platform/hardware.h +f:arch/xtensa/platforms/xt2000/include/platform/serial.h +f:arch/xtensa/platforms/xt2000/setup.c +f:arch/xtensa/platforms/xtfpga/Makefile +f:arch/xtensa/platforms/xtfpga/include/platform/hardware.h +f:arch/xtensa/platforms/xtfpga/include/platform/lcd.h +f:arch/xtensa/platforms/xtfpga/include/platform/serial.h +f:arch/xtensa/platforms/xtfpga/lcd.c +f:arch/xtensa/platforms/xtfpga/setup.c +f:arch/xtensa/variants/csp/include/variant/core.h +f:arch/xtensa/variants/csp/include/variant/tie-asm.h +f:arch/xtensa/variants/csp/include/variant/tie.h +f:arch/xtensa/variants/dc232b/include/variant/core.h +f:arch/xtensa/variants/dc232b/include/variant/tie-asm.h +f:arch/xtensa/variants/dc232b/include/variant/tie.h +f:arch/xtensa/variants/dc233c/include/variant/core.h +f:arch/xtensa/variants/dc233c/include/variant/tie-asm.h +f:arch/xtensa/variants/dc233c/include/variant/tie.h +f:arch/xtensa/variants/de212/include/variant/core.h +f:arch/xtensa/variants/de212/include/variant/tie-asm.h +f:arch/xtensa/variants/de212/include/variant/tie.h +f:arch/xtensa/variants/fsf/include/variant/core.h +f:arch/xtensa/variants/fsf/include/variant/tie-asm.h +f:arch/xtensa/variants/fsf/include/variant/tie.h +f:arch/xtensa/variants/test_kc705_be/include/variant/core.h +f:arch/xtensa/variants/test_kc705_be/include/variant/tie-asm.h +f:arch/xtensa/variants/test_kc705_be/include/variant/tie.h +f:arch/xtensa/variants/test_kc705_hifi/include/variant/core.h +f:arch/xtensa/variants/test_kc705_hifi/include/variant/tie-asm.h +f:arch/xtensa/variants/test_kc705_hifi/include/variant/tie.h +f:arch/xtensa/variants/test_mmuhifi_c3/include/variant/core.h +f:arch/xtensa/variants/test_mmuhifi_c3/include/variant/tie-asm.h +f:arch/xtensa/variants/test_mmuhifi_c3/include/variant/tie.h +f:block/Kconfig +f:block/Kconfig.iosched +f:block/Makefile +f:block/badblocks.c +f:block/bdev.c +f:block/bfq-cgroup.c +f:block/bfq-iosched.c +f:block/bfq-iosched.h +f:block/bfq-wf2q.c +f:block/bio-integrity-auto.c +f:block/bio-integrity.c +f:block/bio.c +f:block/blk-cgroup-fc-appid.c +f:block/blk-cgroup-rwstat.c +f:block/blk-cgroup-rwstat.h +f:block/blk-cgroup.c +f:block/blk-cgroup.h +f:block/blk-core.c +f:block/blk-crypto-fallback.c +f:block/blk-crypto-internal.h +f:block/blk-crypto-profile.c +f:block/blk-crypto-sysfs.c +f:block/blk-crypto.c +f:block/blk-flush.c +f:block/blk-ia-ranges.c +f:block/blk-integrity.c +f:block/blk-ioc.c +f:block/blk-iocost.c +f:block/blk-iolatency.c +f:block/blk-ioprio.c +f:block/blk-ioprio.h +f:block/blk-lib.c +f:block/blk-map.c +f:block/blk-merge.c +f:block/blk-mq-cpumap.c +f:block/blk-mq-debugfs.c +f:block/blk-mq-debugfs.h +f:block/blk-mq-dma.c +f:block/blk-mq-sched.c +f:block/blk-mq-sched.h +f:block/blk-mq-sysfs.c +f:block/blk-mq-tag.c +f:block/blk-mq.c +f:block/blk-mq.h +f:block/blk-pm.c +f:block/blk-pm.h +f:block/blk-rq-qos.c +f:block/blk-rq-qos.h +f:block/blk-settings.c +f:block/blk-stat.c +f:block/blk-stat.h +f:block/blk-sysfs.c +f:block/blk-throttle.c +f:block/blk-throttle.h +f:block/blk-timeout.c +f:block/blk-wbt.c +f:block/blk-wbt.h +f:block/blk-zoned.c +f:block/blk.h +f:block/bsg-lib.c +f:block/bsg.c +f:block/disk-events.c +f:block/early-lookup.c +f:block/elevator.c +f:block/elevator.h +f:block/fops.c +f:block/genhd.c +f:block/holder.c +f:block/ioctl.c +f:block/ioprio.c +f:block/kyber-iosched.c +f:block/mq-deadline.c +f:block/opal_proto.h +f:block/partitions/Kconfig +f:block/partitions/Makefile +f:block/partitions/acorn.c +f:block/partitions/aix.c +f:block/partitions/amiga.c +f:block/partitions/atari.c +f:block/partitions/atari.h +f:block/partitions/check.h +f:block/partitions/cmdline.c +f:block/partitions/core.c +f:block/partitions/efi.c +f:block/partitions/efi.h +f:block/partitions/ibm.c +f:block/partitions/karma.c +f:block/partitions/ldm.c +f:block/partitions/ldm.h +f:block/partitions/mac.c +f:block/partitions/mac.h +f:block/partitions/msdos.c +f:block/partitions/of.c +f:block/partitions/osf.c +f:block/partitions/sgi.c +f:block/partitions/sun.c +f:block/partitions/sysv68.c +f:block/partitions/ultrix.c +f:block/sed-opal.c +f:block/t10-pi.c +f:certs/.gitignore +f:certs/Kconfig +f:certs/Makefile +f:certs/blacklist.c +f:certs/blacklist.h +f:certs/blacklist_hashes.c +f:certs/check-blacklist-hashes.awk +f:certs/default_x509.genkey +f:certs/extract-cert.c +f:certs/revocation_certificates.S +f:certs/system_certificates.S +f:certs/system_keyring.c +f:crypto/842.c +f:crypto/Kconfig +f:crypto/Makefile +f:crypto/acompress.c +f:crypto/adiantum.c +f:crypto/aead.c +f:crypto/aegis-neon.h +f:crypto/aegis.h +f:crypto/aegis128-core.c +f:crypto/aegis128-neon-inner.c +f:crypto/aegis128-neon.c +f:crypto/aes_generic.c +f:crypto/aes_ti.c +f:crypto/af_alg.c +f:crypto/ahash.c +f:crypto/akcipher.c +f:crypto/algapi.c +f:crypto/algboss.c +f:crypto/algif_aead.c +f:crypto/algif_hash.c +f:crypto/algif_rng.c +f:crypto/algif_skcipher.c +f:crypto/ansi_cprng.c +f:crypto/anubis.c +f:crypto/api.c +f:crypto/arc4.c +f:crypto/aria_generic.c +f:crypto/asymmetric_keys/Kconfig +f:crypto/asymmetric_keys/Makefile +f:crypto/asymmetric_keys/asymmetric_keys.h +f:crypto/asymmetric_keys/asymmetric_type.c +f:crypto/asymmetric_keys/mscode.asn1 +f:crypto/asymmetric_keys/mscode_parser.c +f:crypto/asymmetric_keys/pkcs7.asn1 +f:crypto/asymmetric_keys/pkcs7_key_type.c +f:crypto/asymmetric_keys/pkcs7_parser.c +f:crypto/asymmetric_keys/pkcs7_parser.h +f:crypto/asymmetric_keys/pkcs7_trust.c +f:crypto/asymmetric_keys/pkcs7_verify.c +f:crypto/asymmetric_keys/pkcs8.asn1 +f:crypto/asymmetric_keys/pkcs8_parser.c +f:crypto/asymmetric_keys/public_key.c +f:crypto/asymmetric_keys/restrict.c +f:crypto/asymmetric_keys/selftest.c +f:crypto/asymmetric_keys/selftest.h +f:crypto/asymmetric_keys/selftest_ecdsa.c +f:crypto/asymmetric_keys/selftest_rsa.c +f:crypto/asymmetric_keys/signature.c +f:crypto/asymmetric_keys/verify_pefile.c +f:crypto/asymmetric_keys/verify_pefile.h +f:crypto/asymmetric_keys/x509.asn1 +f:crypto/asymmetric_keys/x509_akid.asn1 +f:crypto/asymmetric_keys/x509_cert_parser.c +f:crypto/asymmetric_keys/x509_loader.c +f:crypto/asymmetric_keys/x509_parser.h +f:crypto/asymmetric_keys/x509_public_key.c +f:crypto/async_tx/Kconfig +f:crypto/async_tx/Makefile +f:crypto/async_tx/async_memcpy.c +f:crypto/async_tx/async_pq.c +f:crypto/async_tx/async_raid6_recov.c +f:crypto/async_tx/async_tx.c +f:crypto/async_tx/async_xor.c +f:crypto/async_tx/raid6test.c +f:crypto/authenc.c +f:crypto/authencesn.c +f:crypto/blake2b_generic.c +f:crypto/blowfish_common.c +f:crypto/blowfish_generic.c +f:crypto/bpf_crypto_skcipher.c +f:crypto/camellia_generic.c +f:crypto/cast5_generic.c +f:crypto/cast6_generic.c +f:crypto/cast_common.c +f:crypto/cbc.c +f:crypto/ccm.c +f:crypto/chacha.c +f:crypto/chacha20poly1305.c +f:crypto/cipher.c +f:crypto/cmac.c +f:crypto/compress.h +f:crypto/crc32.c +f:crypto/crc32c.c +f:crypto/cryptd.c +f:crypto/crypto_engine.c +f:crypto/crypto_null.c +f:crypto/crypto_user.c +f:crypto/ctr.c +f:crypto/cts.c +f:crypto/curve25519-generic.c +f:crypto/deflate.c +f:crypto/des_generic.c +f:crypto/dh.c +f:crypto/dh_helper.c +f:crypto/drbg.c +f:crypto/ecb.c +f:crypto/ecc.c +f:crypto/ecc_curve_defs.h +f:crypto/ecdh.c +f:crypto/ecdh_helper.c +f:crypto/ecdsa-p1363.c +f:crypto/ecdsa-x962.c +f:crypto/ecdsa.c +f:crypto/ecdsasignature.asn1 +f:crypto/echainiv.c +f:crypto/ecrdsa.c +f:crypto/ecrdsa_defs.h +f:crypto/ecrdsa_params.asn1 +f:crypto/ecrdsa_pub_key.asn1 +f:crypto/essiv.c +f:crypto/fcrypt.c +f:crypto/fips.c +f:crypto/gcm.c +f:crypto/geniv.c +f:crypto/ghash-generic.c +f:crypto/hash.h +f:crypto/hctr2.c +f:crypto/hkdf.c +f:crypto/hmac.c +f:crypto/internal.h +f:crypto/jitterentropy-kcapi.c +f:crypto/jitterentropy-testing.c +f:crypto/jitterentropy.c +f:crypto/jitterentropy.h +f:crypto/kdf_sp800108.c +f:crypto/khazad.c +f:crypto/kpp.c +f:crypto/krb5/Kconfig +f:crypto/krb5/Makefile +f:crypto/krb5/internal.h +f:crypto/krb5/krb5_api.c +f:crypto/krb5/krb5_kdf.c +f:crypto/krb5/rfc3961_simplified.c +f:crypto/krb5/rfc3962_aes.c +f:crypto/krb5/rfc6803_camellia.c +f:crypto/krb5/rfc8009_aes2.c +f:crypto/krb5/selftest.c +f:crypto/krb5/selftest_data.c +f:crypto/krb5enc.c +f:crypto/lrw.c +f:crypto/lskcipher.c +f:crypto/lz4.c +f:crypto/lz4hc.c +f:crypto/lzo-rle.c +f:crypto/lzo.c +f:crypto/md4.c +f:crypto/md5.c +f:crypto/michael_mic.c +f:crypto/nhpoly1305.c +f:crypto/pcbc.c +f:crypto/pcrypt.c +f:crypto/polyval-generic.c +f:crypto/proc.c +f:crypto/ripemd.h +f:crypto/rmd160.c +f:crypto/rng.c +f:crypto/rsa-pkcs1pad.c +f:crypto/rsa.c +f:crypto/rsa_helper.c +f:crypto/rsaprivkey.asn1 +f:crypto/rsapubkey.asn1 +f:crypto/rsassa-pkcs1.c +f:crypto/scatterwalk.c +f:crypto/scompress.c +f:crypto/seed.c +f:crypto/seqiv.c +f:crypto/serpent_generic.c +f:crypto/sha1.c +f:crypto/sha256.c +f:crypto/sha3_generic.c +f:crypto/sha512.c +f:crypto/shash.c +f:crypto/sig.c +f:crypto/simd.c +f:crypto/skcipher.c +f:crypto/skcipher.h +f:crypto/sm3_generic.c +f:crypto/sm4.c +f:crypto/sm4_generic.c +f:crypto/streebog_generic.c +f:crypto/tcrypt.c +f:crypto/tcrypt.h +f:crypto/tea.c +f:crypto/testmgr.c +f:crypto/testmgr.h +f:crypto/twofish_common.c +f:crypto/twofish_generic.c +f:crypto/wp512.c +f:crypto/xcbc.c +f:crypto/xctr.c +f:crypto/xor.c +f:crypto/xts.c +f:crypto/xxhash_generic.c +f:crypto/zstd.c +f:drivers/Kconfig +f:drivers/Makefile +f:drivers/accel/Kconfig +f:drivers/accel/Makefile +f:drivers/accel/amdxdna/Kconfig +f:drivers/accel/amdxdna/Makefile +f:drivers/accel/amdxdna/TODO +f:drivers/accel/amdxdna/aie2_ctx.c +f:drivers/accel/amdxdna/aie2_error.c +f:drivers/accel/amdxdna/aie2_message.c +f:drivers/accel/amdxdna/aie2_msg_priv.h +f:drivers/accel/amdxdna/aie2_pci.c +f:drivers/accel/amdxdna/aie2_pci.h +f:drivers/accel/amdxdna/aie2_pm.c +f:drivers/accel/amdxdna/aie2_psp.c +f:drivers/accel/amdxdna/aie2_smu.c +f:drivers/accel/amdxdna/aie2_solver.c +f:drivers/accel/amdxdna/aie2_solver.h +f:drivers/accel/amdxdna/amdxdna_ctx.c +f:drivers/accel/amdxdna/amdxdna_ctx.h +f:drivers/accel/amdxdna/amdxdna_gem.c +f:drivers/accel/amdxdna/amdxdna_gem.h +f:drivers/accel/amdxdna/amdxdna_mailbox.c +f:drivers/accel/amdxdna/amdxdna_mailbox.h +f:drivers/accel/amdxdna/amdxdna_mailbox_helper.c +f:drivers/accel/amdxdna/amdxdna_mailbox_helper.h +f:drivers/accel/amdxdna/amdxdna_pci_drv.c +f:drivers/accel/amdxdna/amdxdna_pci_drv.h +f:drivers/accel/amdxdna/amdxdna_sysfs.c +f:drivers/accel/amdxdna/npu1_regs.c +f:drivers/accel/amdxdna/npu2_regs.c +f:drivers/accel/amdxdna/npu4_regs.c +f:drivers/accel/amdxdna/npu5_regs.c +f:drivers/accel/amdxdna/npu6_regs.c +f:drivers/accel/drm_accel.c +f:drivers/accel/habanalabs/Kconfig +f:drivers/accel/habanalabs/Makefile +f:drivers/accel/habanalabs/common/Makefile +f:drivers/accel/habanalabs/common/asid.c +f:drivers/accel/habanalabs/common/command_buffer.c +f:drivers/accel/habanalabs/common/command_submission.c +f:drivers/accel/habanalabs/common/context.c +f:drivers/accel/habanalabs/common/debugfs.c +f:drivers/accel/habanalabs/common/decoder.c +f:drivers/accel/habanalabs/common/device.c +f:drivers/accel/habanalabs/common/firmware_if.c +f:drivers/accel/habanalabs/common/habanalabs.h +f:drivers/accel/habanalabs/common/habanalabs_drv.c +f:drivers/accel/habanalabs/common/habanalabs_ioctl.c +f:drivers/accel/habanalabs/common/hw_queue.c +f:drivers/accel/habanalabs/common/hwmon.c +f:drivers/accel/habanalabs/common/irq.c +f:drivers/accel/habanalabs/common/memory.c +f:drivers/accel/habanalabs/common/memory_mgr.c +f:drivers/accel/habanalabs/common/mmu/Makefile +f:drivers/accel/habanalabs/common/mmu/mmu.c +f:drivers/accel/habanalabs/common/mmu/mmu_v1.c +f:drivers/accel/habanalabs/common/mmu/mmu_v2.c +f:drivers/accel/habanalabs/common/mmu/mmu_v2_hr.c +f:drivers/accel/habanalabs/common/pci/Makefile +f:drivers/accel/habanalabs/common/pci/pci.c +f:drivers/accel/habanalabs/common/security.c +f:drivers/accel/habanalabs/common/security.h +f:drivers/accel/habanalabs/common/state_dump.c +f:drivers/accel/habanalabs/common/sysfs.c +f:drivers/accel/habanalabs/gaudi/Makefile +f:drivers/accel/habanalabs/gaudi/gaudi.c +f:drivers/accel/habanalabs/gaudi/gaudiP.h +f:drivers/accel/habanalabs/gaudi/gaudi_coresight.c +f:drivers/accel/habanalabs/gaudi/gaudi_security.c +f:drivers/accel/habanalabs/gaudi2/Makefile +f:drivers/accel/habanalabs/gaudi2/gaudi2.c +f:drivers/accel/habanalabs/gaudi2/gaudi2P.h +f:drivers/accel/habanalabs/gaudi2/gaudi2_coresight.c +f:drivers/accel/habanalabs/gaudi2/gaudi2_coresight_regs.h +f:drivers/accel/habanalabs/gaudi2/gaudi2_masks.h +f:drivers/accel/habanalabs/gaudi2/gaudi2_security.c +f:drivers/accel/habanalabs/goya/Makefile +f:drivers/accel/habanalabs/goya/goya.c +f:drivers/accel/habanalabs/goya/goyaP.h +f:drivers/accel/habanalabs/goya/goya_coresight.c +f:drivers/accel/habanalabs/goya/goya_hwmgr.c +f:drivers/accel/habanalabs/goya/goya_security.c +f:drivers/accel/habanalabs/include/common/qman_if.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/cpu_if_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma0_core_masks.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma0_core_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma0_qm_masks.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma0_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma1_core_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma1_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma2_core_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma2_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma3_core_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma3_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma4_core_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma4_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma5_core_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma5_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma6_core_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma6_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma7_core_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma7_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_e_n_down_ch0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_e_n_down_ch1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_e_n_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_e_s_down_ch0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_e_s_down_ch1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_e_s_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_w_n_down_ch0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_w_n_down_ch1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_w_n_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_w_s_down_ch0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_w_s_down_ch1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/dma_if_w_s_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/gaudi_blocks.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/gaudi_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/mme0_ctrl_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/mme0_qm_masks.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/mme0_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/mme1_ctrl_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/mme2_ctrl_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/mme2_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/mme3_ctrl_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/mmu_up_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic0_qm0_masks.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic0_qm0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic0_qm1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic1_qm0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic1_qm1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic2_qm0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic2_qm1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic3_qm0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic3_qm1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic4_qm0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nic4_qm1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_2_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_3_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_4_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_5_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_6_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_7_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/psoc_cpu_pll_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/psoc_etr_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/psoc_global_conf_masks.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/psoc_global_conf_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/psoc_timestamp_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_0_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_1_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_2_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_3_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_4_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_5_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_6_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_7_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/stlb_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc0_cfg_masks.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc0_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc0_qm_masks.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc0_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc1_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc1_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc2_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc2_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc3_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc3_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc4_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc4_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc5_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc5_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc6_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc6_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc7_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi/asic_reg/tpc7_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi/gaudi.h +f:drivers/accel/habanalabs/include/gaudi/gaudi_async_events.h +f:drivers/accel/habanalabs/include/gaudi/gaudi_async_ids_map_extended.h +f:drivers/accel/habanalabs/include/gaudi/gaudi_coresight.h +f:drivers/accel/habanalabs/include/gaudi/gaudi_fw_if.h +f:drivers/accel/habanalabs/include/gaudi/gaudi_masks.h +f:drivers/accel/habanalabs/include/gaudi/gaudi_packets.h +f:drivers/accel/habanalabs/include/gaudi/gaudi_reg_map.h +f:drivers/accel/habanalabs/include/gaudi2/arc/gaudi2_arc_common_packets.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_arc0_acp_eng_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_arc0_aux_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_arc0_aux_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_arc0_dup_eng_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_arc0_dup_eng_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_kdma_ctx_axuser_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_kdma_ctx_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_kdma_ctx_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_kdma_ctx_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_kdma_kdma_cgm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_kdma_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/arc_farm_kdma_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/cpu_if_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_dec0_cmd_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_dec0_cmd_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_core_ctx_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_core_ctx_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_core_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_core_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_qm_arc_aux_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_qm_axuser_nonsecured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_qm_cgm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_qm_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma0_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma1_core_ctx_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_edma1_qm_axuser_nonsecured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_hmmu0_mmu_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_hmmu0_mmu_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_hmmu0_stlb_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_hmmu0_stlb_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_acc_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_cout0_master_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_cout0_slave_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_cout1_master_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_cout1_slave_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in0_master_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in0_slave_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in1_master_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in1_slave_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in2_master_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in2_slave_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in3_master_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in3_slave_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in4_master_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_agu_in4_slave_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_base_addr_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_non_tensor_end_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_non_tensor_start_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_tensor_a_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_tensor_b_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_arch_tensor_cout_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_mme_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_ctrl_lo_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_qm_arc_acp_eng_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_qm_arc_aux_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_qm_arc_dup_eng_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_qm_arc_dup_eng_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_qm_axuser_nonsecured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_qm_axuser_secured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_qm_cgm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_sbte0_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_sbte0_mstr_if_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_mme_wb0_mstr_if_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_rtr0_ctrl_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_rtr0_mstr_if_rr_prvt_hbw_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_rtr0_mstr_if_rr_prvt_lbw_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_rtr0_mstr_if_rr_shrd_hbw_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_rtr0_mstr_if_rr_shrd_lbw_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_sync_mngr_glbl_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_sync_mngr_glbl_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_sync_mngr_mstr_if_axuser_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_sync_mngr_mstr_if_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_sync_mngr_objs_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_sync_mngr_objs_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_kernel_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_kernel_tensor_0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_qm_sync_object_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_qm_tensor_0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_cfg_special_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_eml_busmon_0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_eml_etf_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_eml_funnel_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_eml_spmu_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_eml_stm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_qm_arc_aux_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_qm_axuser_nonsecured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_qm_cgm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_tpc0_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_vdec0_brdg_ctrl_axuser_dec_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_vdec0_brdg_ctrl_axuser_msix_abnrm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_vdec0_brdg_ctrl_axuser_msix_l2c_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_vdec0_brdg_ctrl_axuser_msix_nrm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_vdec0_brdg_ctrl_axuser_msix_vcd_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_vdec0_brdg_ctrl_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_vdec0_brdg_ctrl_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore0_vdec0_ctrl_special_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore1_mme_ctrl_lo_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore1_sync_mngr_glbl_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/dcore3_mme_ctrl_lo_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/gaudi2_blocks_linux_driver.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/gaudi2_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/nic0_qm0_cgm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/nic0_qm0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/nic0_qm_arc_aux0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/nic0_qpc0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/nic0_umr0_0_completion_queue_ci_1_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/nic0_umr0_0_unsecure_doorbell0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_aux_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_dbi_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_dec0_cmd_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_dec0_cmd_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_vdec0_brdg_ctrl_axuser_dec_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_vdec0_brdg_ctrl_axuser_msix_abnrm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_vdec0_brdg_ctrl_axuser_msix_l2c_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_vdec0_brdg_ctrl_axuser_msix_nrm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_vdec0_brdg_ctrl_axuser_msix_vcd_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_vdec0_brdg_ctrl_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_vdec0_brdg_ctrl_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_vdec0_ctrl_special_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_wrap_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pcie_wrap_special_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_core_ctx_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_core_ctx_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_core_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_core_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_core_special_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_qm_arc_aux_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_qm_axuser_nonsecured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_qm_axuser_secured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_qm_cgm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_qm_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma0_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma1_core_ctx_axuser_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pdma1_qm_axuser_nonsecured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pmmu_hbw_stlb_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pmmu_hbw_stlb_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/pmmu_pif_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/psoc_etr_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/psoc_etr_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/psoc_global_conf_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/psoc_global_conf_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/psoc_reset_conf_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/psoc_reset_conf_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/psoc_timestamp_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/rot0_desc_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/rot0_masks.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/rot0_qm_arc_aux_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/rot0_qm_axuser_nonsecured_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/rot0_qm_cgm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/rot0_qm_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/rot0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/xbar_edge_0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/asic_reg/xbar_mid_0_regs.h +f:drivers/accel/habanalabs/include/gaudi2/gaudi2.h +f:drivers/accel/habanalabs/include/gaudi2/gaudi2_async_events.h +f:drivers/accel/habanalabs/include/gaudi2/gaudi2_async_ids_map_extended.h +f:drivers/accel/habanalabs/include/gaudi2/gaudi2_coresight.h +f:drivers/accel/habanalabs/include/gaudi2/gaudi2_fw_if.h +f:drivers/accel/habanalabs/include/gaudi2/gaudi2_packets.h +f:drivers/accel/habanalabs/include/gaudi2/gaudi2_reg_map.h +f:drivers/accel/habanalabs/include/gaudi2/gaudi2_special_blocks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/cpu_ca53_cfg_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/cpu_ca53_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/cpu_if_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/cpu_pll_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_ch_0_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_ch_0_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_ch_1_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_ch_2_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_ch_3_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_ch_4_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_macro_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_macro_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_nrtr_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_nrtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_qm_0_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_qm_0_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_qm_1_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_qm_2_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_qm_3_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/dma_qm_4_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/goya_blocks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/goya_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/goya_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/ic_pll_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mc_pll_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme1_rtr_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme1_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme2_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme3_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme4_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme5_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme6_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme_cmdq_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme_qm_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mme_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mmu_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/mmu_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/pci_nrtr_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/pci_nrtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/pcie_aux_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/pcie_wrap_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/psoc_emmc_pll_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/psoc_etr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/psoc_global_conf_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/psoc_global_conf_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/psoc_mme_pll_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/psoc_pci_pll_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/psoc_spi_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/psoc_timestamp_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/sram_y0_x0_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/sram_y0_x1_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/sram_y0_x2_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/sram_y0_x3_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/sram_y0_x4_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/stlb_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/stlb_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_cfg_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_cmdq_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_eml_cfg_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_eml_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_nrtr_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_nrtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_qm_masks.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc0_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc1_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc1_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc1_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc1_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc2_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc2_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc2_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc2_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc3_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc3_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc3_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc3_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc4_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc4_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc4_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc4_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc5_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc5_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc5_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc5_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc6_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc6_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc6_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc6_rtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc7_cfg_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc7_cmdq_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc7_nrtr_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc7_qm_regs.h +f:drivers/accel/habanalabs/include/goya/asic_reg/tpc_pll_regs.h +f:drivers/accel/habanalabs/include/goya/goya.h +f:drivers/accel/habanalabs/include/goya/goya_async_events.h +f:drivers/accel/habanalabs/include/goya/goya_coresight.h +f:drivers/accel/habanalabs/include/goya/goya_fw_if.h +f:drivers/accel/habanalabs/include/goya/goya_packets.h +f:drivers/accel/habanalabs/include/goya/goya_reg_map.h +f:drivers/accel/habanalabs/include/hw_ip/mmu/mmu_general.h +f:drivers/accel/habanalabs/include/hw_ip/mmu/mmu_v1_0.h +f:drivers/accel/habanalabs/include/hw_ip/mmu/mmu_v1_1.h +f:drivers/accel/habanalabs/include/hw_ip/mmu/mmu_v2_0.h +f:drivers/accel/habanalabs/include/hw_ip/pci/pci_general.h +f:drivers/accel/ivpu/Kconfig +f:drivers/accel/ivpu/Makefile +f:drivers/accel/ivpu/ivpu_coredump.c +f:drivers/accel/ivpu/ivpu_coredump.h +f:drivers/accel/ivpu/ivpu_debugfs.c +f:drivers/accel/ivpu/ivpu_debugfs.h +f:drivers/accel/ivpu/ivpu_drv.c +f:drivers/accel/ivpu/ivpu_drv.h +f:drivers/accel/ivpu/ivpu_fw.c +f:drivers/accel/ivpu/ivpu_fw.h +f:drivers/accel/ivpu/ivpu_fw_log.c +f:drivers/accel/ivpu/ivpu_fw_log.h +f:drivers/accel/ivpu/ivpu_gem.c +f:drivers/accel/ivpu/ivpu_gem.h +f:drivers/accel/ivpu/ivpu_hw.c +f:drivers/accel/ivpu/ivpu_hw.h +f:drivers/accel/ivpu/ivpu_hw_37xx_reg.h +f:drivers/accel/ivpu/ivpu_hw_40xx_reg.h +f:drivers/accel/ivpu/ivpu_hw_btrs.c +f:drivers/accel/ivpu/ivpu_hw_btrs.h +f:drivers/accel/ivpu/ivpu_hw_btrs_lnl_reg.h +f:drivers/accel/ivpu/ivpu_hw_btrs_mtl_reg.h +f:drivers/accel/ivpu/ivpu_hw_ip.c +f:drivers/accel/ivpu/ivpu_hw_ip.h +f:drivers/accel/ivpu/ivpu_hw_reg_io.h +f:drivers/accel/ivpu/ivpu_ipc.c +f:drivers/accel/ivpu/ivpu_ipc.h +f:drivers/accel/ivpu/ivpu_job.c +f:drivers/accel/ivpu/ivpu_job.h +f:drivers/accel/ivpu/ivpu_jsm_msg.c +f:drivers/accel/ivpu/ivpu_jsm_msg.h +f:drivers/accel/ivpu/ivpu_mmu.c +f:drivers/accel/ivpu/ivpu_mmu.h +f:drivers/accel/ivpu/ivpu_mmu_context.c +f:drivers/accel/ivpu/ivpu_mmu_context.h +f:drivers/accel/ivpu/ivpu_ms.c +f:drivers/accel/ivpu/ivpu_ms.h +f:drivers/accel/ivpu/ivpu_pm.c +f:drivers/accel/ivpu/ivpu_pm.h +f:drivers/accel/ivpu/ivpu_sysfs.c +f:drivers/accel/ivpu/ivpu_sysfs.h +f:drivers/accel/ivpu/ivpu_trace.h +f:drivers/accel/ivpu/ivpu_trace_points.c +f:drivers/accel/ivpu/vpu_boot_api.h +f:drivers/accel/ivpu/vpu_jsm_api.h +f:drivers/accel/qaic/Kconfig +f:drivers/accel/qaic/Makefile +f:drivers/accel/qaic/mhi_controller.c +f:drivers/accel/qaic/mhi_controller.h +f:drivers/accel/qaic/qaic.h +f:drivers/accel/qaic/qaic_control.c +f:drivers/accel/qaic/qaic_data.c +f:drivers/accel/qaic/qaic_debugfs.c +f:drivers/accel/qaic/qaic_debugfs.h +f:drivers/accel/qaic/qaic_drv.c +f:drivers/accel/qaic/qaic_ras.c +f:drivers/accel/qaic/qaic_ras.h +f:drivers/accel/qaic/qaic_timesync.c +f:drivers/accel/qaic/qaic_timesync.h +f:drivers/accel/qaic/sahara.c +f:drivers/accel/qaic/sahara.h +f:drivers/accessibility/Kconfig +f:drivers/accessibility/Makefile +f:drivers/accessibility/braille/Makefile +f:drivers/accessibility/braille/braille_console.c +f:drivers/accessibility/speakup/.gitignore +f:drivers/accessibility/speakup/DefaultKeyAssignments +f:drivers/accessibility/speakup/Kconfig +f:drivers/accessibility/speakup/Makefile +f:drivers/accessibility/speakup/TODO +f:drivers/accessibility/speakup/buffers.c +f:drivers/accessibility/speakup/devsynth.c +f:drivers/accessibility/speakup/fakekey.c +f:drivers/accessibility/speakup/genmap.c +f:drivers/accessibility/speakup/i18n.c +f:drivers/accessibility/speakup/i18n.h +f:drivers/accessibility/speakup/keyhelp.c +f:drivers/accessibility/speakup/kobjects.c +f:drivers/accessibility/speakup/main.c +f:drivers/accessibility/speakup/makemapdata.c +f:drivers/accessibility/speakup/selection.c +f:drivers/accessibility/speakup/serialio.c +f:drivers/accessibility/speakup/serialio.h +f:drivers/accessibility/speakup/speakup.h +f:drivers/accessibility/speakup/speakup_acnt.h +f:drivers/accessibility/speakup/speakup_acntpc.c +f:drivers/accessibility/speakup/speakup_acntsa.c +f:drivers/accessibility/speakup/speakup_apollo.c +f:drivers/accessibility/speakup/speakup_audptr.c +f:drivers/accessibility/speakup/speakup_bns.c +f:drivers/accessibility/speakup/speakup_decext.c +f:drivers/accessibility/speakup/speakup_decpc.c +f:drivers/accessibility/speakup/speakup_dectlk.c +f:drivers/accessibility/speakup/speakup_dtlk.c +f:drivers/accessibility/speakup/speakup_dtlk.h +f:drivers/accessibility/speakup/speakup_dummy.c +f:drivers/accessibility/speakup/speakup_keypc.c +f:drivers/accessibility/speakup/speakup_ltlk.c +f:drivers/accessibility/speakup/speakup_soft.c +f:drivers/accessibility/speakup/speakup_spkout.c +f:drivers/accessibility/speakup/speakup_txprt.c +f:drivers/accessibility/speakup/speakupmap.map +f:drivers/accessibility/speakup/spk_priv.h +f:drivers/accessibility/speakup/spk_priv_keyinfo.h +f:drivers/accessibility/speakup/spk_ttyio.c +f:drivers/accessibility/speakup/spk_types.h +f:drivers/accessibility/speakup/synth.c +f:drivers/accessibility/speakup/thread.c +f:drivers/accessibility/speakup/utils.h +f:drivers/accessibility/speakup/varhandlers.c +f:drivers/acpi/Kconfig +f:drivers/acpi/Makefile +f:drivers/acpi/ac.c +f:drivers/acpi/acpi_adxl.c +f:drivers/acpi/acpi_apd.c +f:drivers/acpi/acpi_configfs.c +f:drivers/acpi/acpi_dbg.c +f:drivers/acpi/acpi_extlog.c +f:drivers/acpi/acpi_ffh.c +f:drivers/acpi/acpi_fpdt.c +f:drivers/acpi/acpi_ipmi.c +f:drivers/acpi/acpi_lpat.c +f:drivers/acpi/acpi_lpit.c +f:drivers/acpi/acpi_memhotplug.c +f:drivers/acpi/acpi_mrrm.c +f:drivers/acpi/acpi_pad.c +f:drivers/acpi/acpi_pcc.c +f:drivers/acpi/acpi_platform.c +f:drivers/acpi/acpi_pnp.c +f:drivers/acpi/acpi_processor.c +f:drivers/acpi/acpi_tad.c +f:drivers/acpi/acpi_video.c +f:drivers/acpi/acpi_watchdog.c +f:drivers/acpi/acpica/Makefile +f:drivers/acpi/acpica/acapps.h +f:drivers/acpi/acpica/accommon.h +f:drivers/acpi/acpica/acconvert.h +f:drivers/acpi/acpica/acdebug.h +f:drivers/acpi/acpica/acdispat.h +f:drivers/acpi/acpica/acevents.h +f:drivers/acpi/acpica/acglobal.h +f:drivers/acpi/acpica/achware.h +f:drivers/acpi/acpica/acinterp.h +f:drivers/acpi/acpica/aclocal.h +f:drivers/acpi/acpica/acmacros.h +f:drivers/acpi/acpica/acnamesp.h +f:drivers/acpi/acpica/acobject.h +f:drivers/acpi/acpica/acopcode.h +f:drivers/acpi/acpica/acparser.h +f:drivers/acpi/acpica/acpredef.h +f:drivers/acpi/acpica/acresrc.h +f:drivers/acpi/acpica/acstruct.h +f:drivers/acpi/acpica/actables.h +f:drivers/acpi/acpica/acutils.h +f:drivers/acpi/acpica/amlcode.h +f:drivers/acpi/acpica/amlresrc.h +f:drivers/acpi/acpica/dbcmds.c +f:drivers/acpi/acpica/dbconvert.c +f:drivers/acpi/acpica/dbdisply.c +f:drivers/acpi/acpica/dbexec.c +f:drivers/acpi/acpica/dbfileio.c +f:drivers/acpi/acpica/dbhistry.c +f:drivers/acpi/acpica/dbinput.c +f:drivers/acpi/acpica/dbmethod.c +f:drivers/acpi/acpica/dbnames.c +f:drivers/acpi/acpica/dbobject.c +f:drivers/acpi/acpica/dbstats.c +f:drivers/acpi/acpica/dbtest.c +f:drivers/acpi/acpica/dbutils.c +f:drivers/acpi/acpica/dbxface.c +f:drivers/acpi/acpica/dsargs.c +f:drivers/acpi/acpica/dscontrol.c +f:drivers/acpi/acpica/dsdebug.c +f:drivers/acpi/acpica/dsfield.c +f:drivers/acpi/acpica/dsinit.c +f:drivers/acpi/acpica/dsmethod.c +f:drivers/acpi/acpica/dsmthdat.c +f:drivers/acpi/acpica/dsobject.c +f:drivers/acpi/acpica/dsopcode.c +f:drivers/acpi/acpica/dspkginit.c +f:drivers/acpi/acpica/dsutils.c +f:drivers/acpi/acpica/dswexec.c +f:drivers/acpi/acpica/dswload.c +f:drivers/acpi/acpica/dswload2.c +f:drivers/acpi/acpica/dswscope.c +f:drivers/acpi/acpica/dswstate.c +f:drivers/acpi/acpica/evevent.c +f:drivers/acpi/acpica/evglock.c +f:drivers/acpi/acpica/evgpe.c +f:drivers/acpi/acpica/evgpeblk.c +f:drivers/acpi/acpica/evgpeinit.c +f:drivers/acpi/acpica/evgpeutil.c +f:drivers/acpi/acpica/evhandler.c +f:drivers/acpi/acpica/evmisc.c +f:drivers/acpi/acpica/evregion.c +f:drivers/acpi/acpica/evrgnini.c +f:drivers/acpi/acpica/evsci.c +f:drivers/acpi/acpica/evxface.c +f:drivers/acpi/acpica/evxfevnt.c +f:drivers/acpi/acpica/evxfgpe.c +f:drivers/acpi/acpica/evxfregn.c +f:drivers/acpi/acpica/exconcat.c +f:drivers/acpi/acpica/exconfig.c +f:drivers/acpi/acpica/exconvrt.c +f:drivers/acpi/acpica/excreate.c +f:drivers/acpi/acpica/exdebug.c +f:drivers/acpi/acpica/exdump.c +f:drivers/acpi/acpica/exfield.c +f:drivers/acpi/acpica/exfldio.c +f:drivers/acpi/acpica/exmisc.c +f:drivers/acpi/acpica/exmutex.c +f:drivers/acpi/acpica/exnames.c +f:drivers/acpi/acpica/exoparg1.c +f:drivers/acpi/acpica/exoparg2.c +f:drivers/acpi/acpica/exoparg3.c +f:drivers/acpi/acpica/exoparg6.c +f:drivers/acpi/acpica/exprep.c +f:drivers/acpi/acpica/exregion.c +f:drivers/acpi/acpica/exresnte.c +f:drivers/acpi/acpica/exresolv.c +f:drivers/acpi/acpica/exresop.c +f:drivers/acpi/acpica/exserial.c +f:drivers/acpi/acpica/exstore.c +f:drivers/acpi/acpica/exstoren.c +f:drivers/acpi/acpica/exstorob.c +f:drivers/acpi/acpica/exsystem.c +f:drivers/acpi/acpica/extrace.c +f:drivers/acpi/acpica/exutils.c +f:drivers/acpi/acpica/hwacpi.c +f:drivers/acpi/acpica/hwesleep.c +f:drivers/acpi/acpica/hwgpe.c +f:drivers/acpi/acpica/hwpci.c +f:drivers/acpi/acpica/hwregs.c +f:drivers/acpi/acpica/hwsleep.c +f:drivers/acpi/acpica/hwtimer.c +f:drivers/acpi/acpica/hwvalid.c +f:drivers/acpi/acpica/hwxface.c +f:drivers/acpi/acpica/hwxfsleep.c +f:drivers/acpi/acpica/nsaccess.c +f:drivers/acpi/acpica/nsalloc.c +f:drivers/acpi/acpica/nsarguments.c +f:drivers/acpi/acpica/nsconvert.c +f:drivers/acpi/acpica/nsdump.c +f:drivers/acpi/acpica/nsdumpdv.c +f:drivers/acpi/acpica/nseval.c +f:drivers/acpi/acpica/nsinit.c +f:drivers/acpi/acpica/nsload.c +f:drivers/acpi/acpica/nsnames.c +f:drivers/acpi/acpica/nsobject.c +f:drivers/acpi/acpica/nsparse.c +f:drivers/acpi/acpica/nspredef.c +f:drivers/acpi/acpica/nsprepkg.c +f:drivers/acpi/acpica/nsrepair.c +f:drivers/acpi/acpica/nsrepair2.c +f:drivers/acpi/acpica/nssearch.c +f:drivers/acpi/acpica/nsutils.c +f:drivers/acpi/acpica/nswalk.c +f:drivers/acpi/acpica/nsxfeval.c +f:drivers/acpi/acpica/nsxfname.c +f:drivers/acpi/acpica/nsxfobj.c +f:drivers/acpi/acpica/psargs.c +f:drivers/acpi/acpica/psloop.c +f:drivers/acpi/acpica/psobject.c +f:drivers/acpi/acpica/psopcode.c +f:drivers/acpi/acpica/psopinfo.c +f:drivers/acpi/acpica/psparse.c +f:drivers/acpi/acpica/psscope.c +f:drivers/acpi/acpica/pstree.c +f:drivers/acpi/acpica/psutils.c +f:drivers/acpi/acpica/pswalk.c +f:drivers/acpi/acpica/psxface.c +f:drivers/acpi/acpica/rsaddr.c +f:drivers/acpi/acpica/rscalc.c +f:drivers/acpi/acpica/rscreate.c +f:drivers/acpi/acpica/rsdump.c +f:drivers/acpi/acpica/rsdumpinfo.c +f:drivers/acpi/acpica/rsinfo.c +f:drivers/acpi/acpica/rsio.c +f:drivers/acpi/acpica/rsirq.c +f:drivers/acpi/acpica/rslist.c +f:drivers/acpi/acpica/rsmemory.c +f:drivers/acpi/acpica/rsmisc.c +f:drivers/acpi/acpica/rsserial.c +f:drivers/acpi/acpica/rsutils.c +f:drivers/acpi/acpica/rsxface.c +f:drivers/acpi/acpica/tbdata.c +f:drivers/acpi/acpica/tbfadt.c +f:drivers/acpi/acpica/tbfind.c +f:drivers/acpi/acpica/tbinstal.c +f:drivers/acpi/acpica/tbprint.c +f:drivers/acpi/acpica/tbutils.c +f:drivers/acpi/acpica/tbxface.c +f:drivers/acpi/acpica/tbxfload.c +f:drivers/acpi/acpica/tbxfroot.c +f:drivers/acpi/acpica/utaddress.c +f:drivers/acpi/acpica/utalloc.c +f:drivers/acpi/acpica/utascii.c +f:drivers/acpi/acpica/utbuffer.c +f:drivers/acpi/acpica/utcache.c +f:drivers/acpi/acpica/utcksum.c +f:drivers/acpi/acpica/utcopy.c +f:drivers/acpi/acpica/utdebug.c +f:drivers/acpi/acpica/utdecode.c +f:drivers/acpi/acpica/utdelete.c +f:drivers/acpi/acpica/uterror.c +f:drivers/acpi/acpica/uteval.c +f:drivers/acpi/acpica/utexcep.c +f:drivers/acpi/acpica/utglobal.c +f:drivers/acpi/acpica/uthex.c +f:drivers/acpi/acpica/utids.c +f:drivers/acpi/acpica/utinit.c +f:drivers/acpi/acpica/utlock.c +f:drivers/acpi/acpica/utmath.c +f:drivers/acpi/acpica/utmisc.c +f:drivers/acpi/acpica/utmutex.c +f:drivers/acpi/acpica/utnonansi.c +f:drivers/acpi/acpica/utobject.c +f:drivers/acpi/acpica/utosi.c +f:drivers/acpi/acpica/utownerid.c +f:drivers/acpi/acpica/utpredef.c +f:drivers/acpi/acpica/utprint.c +f:drivers/acpi/acpica/utresdecode.c +f:drivers/acpi/acpica/utresrc.c +f:drivers/acpi/acpica/utstate.c +f:drivers/acpi/acpica/utstring.c +f:drivers/acpi/acpica/utstrsuppt.c +f:drivers/acpi/acpica/utstrtoul64.c +f:drivers/acpi/acpica/uttrack.c +f:drivers/acpi/acpica/utuuid.c +f:drivers/acpi/acpica/utxface.c +f:drivers/acpi/acpica/utxferror.c +f:drivers/acpi/acpica/utxfinit.c +f:drivers/acpi/acpica/utxfmutex.c +f:drivers/acpi/apei/Kconfig +f:drivers/acpi/apei/Makefile +f:drivers/acpi/apei/apei-base.c +f:drivers/acpi/apei/apei-internal.h +f:drivers/acpi/apei/bert.c +f:drivers/acpi/apei/einj-core.c +f:drivers/acpi/apei/einj-cxl.c +f:drivers/acpi/apei/erst-dbg.c +f:drivers/acpi/apei/erst.c +f:drivers/acpi/apei/ghes.c +f:drivers/acpi/apei/hest.c +f:drivers/acpi/arm64/Kconfig +f:drivers/acpi/arm64/Makefile +f:drivers/acpi/arm64/agdi.c +f:drivers/acpi/arm64/amba.c +f:drivers/acpi/arm64/apmt.c +f:drivers/acpi/arm64/cpuidle.c +f:drivers/acpi/arm64/dma.c +f:drivers/acpi/arm64/ffh.c +f:drivers/acpi/arm64/gtdt.c +f:drivers/acpi/arm64/init.c +f:drivers/acpi/arm64/init.h +f:drivers/acpi/arm64/iort.c +f:drivers/acpi/arm64/thermal_cpufreq.c +f:drivers/acpi/battery.c +f:drivers/acpi/bgrt.c +f:drivers/acpi/bus.c +f:drivers/acpi/button.c +f:drivers/acpi/container.c +f:drivers/acpi/cppc_acpi.c +f:drivers/acpi/debugfs.c +f:drivers/acpi/device_pm.c +f:drivers/acpi/device_sysfs.c +f:drivers/acpi/dock.c +f:drivers/acpi/dptf/Kconfig +f:drivers/acpi/dptf/Makefile +f:drivers/acpi/dptf/dptf_pch_fivr.c +f:drivers/acpi/dptf/dptf_power.c +f:drivers/acpi/dptf/int340x_thermal.c +f:drivers/acpi/ec.c +f:drivers/acpi/ec_sys.c +f:drivers/acpi/event.c +f:drivers/acpi/evged.c +f:drivers/acpi/fan.h +f:drivers/acpi/fan_attr.c +f:drivers/acpi/fan_core.c +f:drivers/acpi/fan_hwmon.c +f:drivers/acpi/glue.c +f:drivers/acpi/hed.c +f:drivers/acpi/internal.h +f:drivers/acpi/ioapic.c +f:drivers/acpi/irq.c +f:drivers/acpi/mipi-disco-img.c +f:drivers/acpi/nfit/Kconfig +f:drivers/acpi/nfit/Makefile +f:drivers/acpi/nfit/core.c +f:drivers/acpi/nfit/intel.c +f:drivers/acpi/nfit/intel.h +f:drivers/acpi/nfit/mce.c +f:drivers/acpi/nfit/nfit.h +f:drivers/acpi/nhlt.c +f:drivers/acpi/numa/Kconfig +f:drivers/acpi/numa/Makefile +f:drivers/acpi/numa/hmat.c +f:drivers/acpi/numa/srat.c +f:drivers/acpi/nvs.c +f:drivers/acpi/osi.c +f:drivers/acpi/osl.c +f:drivers/acpi/pci_irq.c +f:drivers/acpi/pci_link.c +f:drivers/acpi/pci_mcfg.c +f:drivers/acpi/pci_root.c +f:drivers/acpi/pci_slot.c +f:drivers/acpi/pfr_telemetry.c +f:drivers/acpi/pfr_update.c +f:drivers/acpi/platform_profile.c +f:drivers/acpi/pmic/Kconfig +f:drivers/acpi/pmic/Makefile +f:drivers/acpi/pmic/intel_pmic.c +f:drivers/acpi/pmic/intel_pmic.h +f:drivers/acpi/pmic/intel_pmic_bxtwc.c +f:drivers/acpi/pmic/intel_pmic_bytcrc.c +f:drivers/acpi/pmic/intel_pmic_chtcrc.c +f:drivers/acpi/pmic/intel_pmic_chtdc_ti.c +f:drivers/acpi/pmic/intel_pmic_chtwc.c +f:drivers/acpi/pmic/intel_pmic_xpower.c +f:drivers/acpi/pmic/tps68470_pmic.c +f:drivers/acpi/power.c +f:drivers/acpi/pptt.c +f:drivers/acpi/prmt.c +f:drivers/acpi/proc.c +f:drivers/acpi/processor_core.c +f:drivers/acpi/processor_driver.c +f:drivers/acpi/processor_idle.c +f:drivers/acpi/processor_pdc.c +f:drivers/acpi/processor_perflib.c +f:drivers/acpi/processor_thermal.c +f:drivers/acpi/processor_throttling.c +f:drivers/acpi/property.c +f:drivers/acpi/reboot.c +f:drivers/acpi/resource.c +f:drivers/acpi/riscv/Makefile +f:drivers/acpi/riscv/cppc.c +f:drivers/acpi/riscv/cpuidle.c +f:drivers/acpi/riscv/init.c +f:drivers/acpi/riscv/init.h +f:drivers/acpi/riscv/irq.c +f:drivers/acpi/riscv/rhct.c +f:drivers/acpi/sbs.c +f:drivers/acpi/sbshc.c +f:drivers/acpi/sbshc.h +f:drivers/acpi/scan.c +f:drivers/acpi/sleep.c +f:drivers/acpi/sleep.h +f:drivers/acpi/spcr.c +f:drivers/acpi/sysfs.c +f:drivers/acpi/tables.c +f:drivers/acpi/thermal.c +f:drivers/acpi/thermal_lib.c +f:drivers/acpi/tiny-power-button.c +f:drivers/acpi/utils.c +f:drivers/acpi/video_detect.c +f:drivers/acpi/viot.c +f:drivers/acpi/wakeup.c +f:drivers/acpi/x86/Makefile +f:drivers/acpi/x86/apple.c +f:drivers/acpi/x86/blacklist.c +f:drivers/acpi/x86/cmos_rtc.c +f:drivers/acpi/x86/lpss.c +f:drivers/acpi/x86/s2idle.c +f:drivers/acpi/x86/utils.c +f:drivers/amba/Kconfig +f:drivers/amba/Makefile +f:drivers/amba/bus.c +f:drivers/amba/tegra-ahb.c +f:drivers/android/Kconfig +f:drivers/android/Makefile +f:drivers/android/binder.c +f:drivers/android/binder_alloc.c +f:drivers/android/binder_alloc.h +f:drivers/android/binder_internal.h +f:drivers/android/binder_trace.h +f:drivers/android/binderfs.c +f:drivers/android/dbitmap.h +f:drivers/android/tests/.kunitconfig +f:drivers/android/tests/Makefile +f:drivers/android/tests/binder_alloc_kunit.c +f:drivers/ata/Kconfig +f:drivers/ata/Makefile +f:drivers/ata/acard-ahci.c +f:drivers/ata/ahci.c +f:drivers/ata/ahci.h +f:drivers/ata/ahci_brcm.c +f:drivers/ata/ahci_ceva.c +f:drivers/ata/ahci_da850.c +f:drivers/ata/ahci_dm816.c +f:drivers/ata/ahci_dwc.c +f:drivers/ata/ahci_imx.c +f:drivers/ata/ahci_mtk.c +f:drivers/ata/ahci_mvebu.c +f:drivers/ata/ahci_octeon.c +f:drivers/ata/ahci_platform.c +f:drivers/ata/ahci_qoriq.c +f:drivers/ata/ahci_seattle.c +f:drivers/ata/ahci_st.c +f:drivers/ata/ahci_sunxi.c +f:drivers/ata/ahci_tegra.c +f:drivers/ata/ahci_xgene.c +f:drivers/ata/ata_generic.c +f:drivers/ata/ata_piix.c +f:drivers/ata/libahci.c +f:drivers/ata/libahci_platform.c +f:drivers/ata/libata-acpi.c +f:drivers/ata/libata-core.c +f:drivers/ata/libata-eh.c +f:drivers/ata/libata-pata-timings.c +f:drivers/ata/libata-pmp.c +f:drivers/ata/libata-sata.c +f:drivers/ata/libata-scsi.c +f:drivers/ata/libata-sff.c +f:drivers/ata/libata-trace.c +f:drivers/ata/libata-transport.c +f:drivers/ata/libata-transport.h +f:drivers/ata/libata-zpodd.c +f:drivers/ata/libata.h +f:drivers/ata/pata_acpi.c +f:drivers/ata/pata_ali.c +f:drivers/ata/pata_amd.c +f:drivers/ata/pata_arasan_cf.c +f:drivers/ata/pata_artop.c +f:drivers/ata/pata_atiixp.c +f:drivers/ata/pata_atp867x.c +f:drivers/ata/pata_buddha.c +f:drivers/ata/pata_cmd640.c +f:drivers/ata/pata_cmd64x.c +f:drivers/ata/pata_cs5520.c +f:drivers/ata/pata_cs5530.c +f:drivers/ata/pata_cs5535.c +f:drivers/ata/pata_cs5536.c +f:drivers/ata/pata_cypress.c +f:drivers/ata/pata_efar.c +f:drivers/ata/pata_ep93xx.c +f:drivers/ata/pata_falcon.c +f:drivers/ata/pata_ftide010.c +f:drivers/ata/pata_gayle.c +f:drivers/ata/pata_hpt366.c +f:drivers/ata/pata_hpt37x.c +f:drivers/ata/pata_hpt3x2n.c +f:drivers/ata/pata_hpt3x3.c +f:drivers/ata/pata_icside.c +f:drivers/ata/pata_imx.c +f:drivers/ata/pata_isapnp.c +f:drivers/ata/pata_it8213.c +f:drivers/ata/pata_it821x.c +f:drivers/ata/pata_ixp4xx_cf.c +f:drivers/ata/pata_jmicron.c +f:drivers/ata/pata_legacy.c +f:drivers/ata/pata_macio.c +f:drivers/ata/pata_marvell.c +f:drivers/ata/pata_mpc52xx.c +f:drivers/ata/pata_mpiix.c +f:drivers/ata/pata_netcell.c +f:drivers/ata/pata_ninja32.c +f:drivers/ata/pata_ns87410.c +f:drivers/ata/pata_ns87415.c +f:drivers/ata/pata_octeon_cf.c +f:drivers/ata/pata_of_platform.c +f:drivers/ata/pata_oldpiix.c +f:drivers/ata/pata_opti.c +f:drivers/ata/pata_optidma.c +f:drivers/ata/pata_parport/Kconfig +f:drivers/ata/pata_parport/Makefile +f:drivers/ata/pata_parport/aten.c +f:drivers/ata/pata_parport/bpck.c +f:drivers/ata/pata_parport/bpck6.c +f:drivers/ata/pata_parport/comm.c +f:drivers/ata/pata_parport/dstr.c +f:drivers/ata/pata_parport/epat.c +f:drivers/ata/pata_parport/epia.c +f:drivers/ata/pata_parport/fit2.c +f:drivers/ata/pata_parport/fit3.c +f:drivers/ata/pata_parport/friq.c +f:drivers/ata/pata_parport/frpw.c +f:drivers/ata/pata_parport/kbic.c +f:drivers/ata/pata_parport/ktti.c +f:drivers/ata/pata_parport/on20.c +f:drivers/ata/pata_parport/on26.c +f:drivers/ata/pata_parport/pata_parport.c +f:drivers/ata/pata_parport/pata_parport.h +f:drivers/ata/pata_pcmcia.c +f:drivers/ata/pata_pdc2027x.c +f:drivers/ata/pata_pdc202xx_old.c +f:drivers/ata/pata_piccolo.c +f:drivers/ata/pata_platform.c +f:drivers/ata/pata_pxa.c +f:drivers/ata/pata_radisys.c +f:drivers/ata/pata_rb532_cf.c +f:drivers/ata/pata_rdc.c +f:drivers/ata/pata_rz1000.c +f:drivers/ata/pata_sc1200.c +f:drivers/ata/pata_sch.c +f:drivers/ata/pata_serverworks.c +f:drivers/ata/pata_sil680.c +f:drivers/ata/pata_sis.c +f:drivers/ata/pata_sl82c105.c +f:drivers/ata/pata_triflex.c +f:drivers/ata/pata_via.c +f:drivers/ata/pdc_adma.c +f:drivers/ata/sata_dwc_460ex.c +f:drivers/ata/sata_fsl.c +f:drivers/ata/sata_gemini.c +f:drivers/ata/sata_gemini.h +f:drivers/ata/sata_highbank.c +f:drivers/ata/sata_inic162x.c +f:drivers/ata/sata_mv.c +f:drivers/ata/sata_nv.c +f:drivers/ata/sata_promise.c +f:drivers/ata/sata_promise.h +f:drivers/ata/sata_qstor.c +f:drivers/ata/sata_rcar.c +f:drivers/ata/sata_sil.c +f:drivers/ata/sata_sil24.c +f:drivers/ata/sata_sis.c +f:drivers/ata/sata_svw.c +f:drivers/ata/sata_sx4.c +f:drivers/ata/sata_uli.c +f:drivers/ata/sata_via.c +f:drivers/ata/sata_vsc.c +f:drivers/ata/sis.h +f:drivers/atm/.gitignore +f:drivers/atm/Kconfig +f:drivers/atm/Makefile +f:drivers/atm/adummy.c +f:drivers/atm/atmtcp.c +f:drivers/atm/eni.c +f:drivers/atm/eni.h +f:drivers/atm/fore200e.c +f:drivers/atm/fore200e.h +f:drivers/atm/he.c +f:drivers/atm/he.h +f:drivers/atm/idt77105.c +f:drivers/atm/idt77105.h +f:drivers/atm/idt77252.c +f:drivers/atm/idt77252.h +f:drivers/atm/idt77252_tables.h +f:drivers/atm/iphase.c +f:drivers/atm/iphase.h +f:drivers/atm/lanai.c +f:drivers/atm/midway.h +f:drivers/atm/nicstar.c +f:drivers/atm/nicstar.h +f:drivers/atm/nicstarmac.c +f:drivers/atm/nicstarmac.copyright +f:drivers/atm/solos-attrlist.c +f:drivers/atm/solos-pci.c +f:drivers/atm/suni.c +f:drivers/atm/suni.h +f:drivers/atm/tonga.h +f:drivers/atm/zeprom.h +f:drivers/auxdisplay/Kconfig +f:drivers/auxdisplay/Makefile +f:drivers/auxdisplay/arm-charlcd.c +f:drivers/auxdisplay/cfag12864b.c +f:drivers/auxdisplay/cfag12864bfb.c +f:drivers/auxdisplay/charlcd.c +f:drivers/auxdisplay/charlcd.h +f:drivers/auxdisplay/hd44780.c +f:drivers/auxdisplay/hd44780_common.c +f:drivers/auxdisplay/hd44780_common.h +f:drivers/auxdisplay/ht16k33.c +f:drivers/auxdisplay/img-ascii-lcd.c +f:drivers/auxdisplay/ks0108.c +f:drivers/auxdisplay/lcd2s.c +f:drivers/auxdisplay/line-display.c +f:drivers/auxdisplay/line-display.h +f:drivers/auxdisplay/max6959.c +f:drivers/auxdisplay/panel.c +f:drivers/auxdisplay/seg-led-gpio.c +f:drivers/base/Kconfig +f:drivers/base/Makefile +f:drivers/base/arch_numa.c +f:drivers/base/arch_topology.c +f:drivers/base/attribute_container.c +f:drivers/base/auxiliary.c +f:drivers/base/auxiliary_sysfs.c +f:drivers/base/base.h +f:drivers/base/bus.c +f:drivers/base/cacheinfo.c +f:drivers/base/class.c +f:drivers/base/component.c +f:drivers/base/container.c +f:drivers/base/core.c +f:drivers/base/cpu.c +f:drivers/base/dd.c +f:drivers/base/devcoredump.c +f:drivers/base/devres.c +f:drivers/base/devtmpfs.c +f:drivers/base/driver.c +f:drivers/base/faux.c +f:drivers/base/firmware.c +f:drivers/base/firmware_loader/Kconfig +f:drivers/base/firmware_loader/Makefile +f:drivers/base/firmware_loader/builtin/.gitignore +f:drivers/base/firmware_loader/builtin/Makefile +f:drivers/base/firmware_loader/builtin/main.c +f:drivers/base/firmware_loader/fallback.c +f:drivers/base/firmware_loader/fallback.h +f:drivers/base/firmware_loader/fallback_platform.c +f:drivers/base/firmware_loader/fallback_table.c +f:drivers/base/firmware_loader/firmware.h +f:drivers/base/firmware_loader/main.c +f:drivers/base/firmware_loader/sysfs.c +f:drivers/base/firmware_loader/sysfs.h +f:drivers/base/firmware_loader/sysfs_upload.c +f:drivers/base/firmware_loader/sysfs_upload.h +f:drivers/base/hypervisor.c +f:drivers/base/init.c +f:drivers/base/isa.c +f:drivers/base/map.c +f:drivers/base/memory.c +f:drivers/base/module.c +f:drivers/base/node.c +f:drivers/base/physical_location.c +f:drivers/base/physical_location.h +f:drivers/base/pinctrl.c +f:drivers/base/platform-msi.c +f:drivers/base/platform.c +f:drivers/base/power/Makefile +f:drivers/base/power/clock_ops.c +f:drivers/base/power/common.c +f:drivers/base/power/generic_ops.c +f:drivers/base/power/main.c +f:drivers/base/power/power.h +f:drivers/base/power/qos-test.c +f:drivers/base/power/qos.c +f:drivers/base/power/runtime.c +f:drivers/base/power/sysfs.c +f:drivers/base/power/trace.c +f:drivers/base/power/wakeirq.c +f:drivers/base/power/wakeup.c +f:drivers/base/power/wakeup_stats.c +f:drivers/base/property.c +f:drivers/base/regmap/Kconfig +f:drivers/base/regmap/Makefile +f:drivers/base/regmap/internal.h +f:drivers/base/regmap/regcache-flat.c +f:drivers/base/regmap/regcache-maple.c +f:drivers/base/regmap/regcache-rbtree.c +f:drivers/base/regmap/regcache.c +f:drivers/base/regmap/regmap-ac97.c +f:drivers/base/regmap/regmap-debugfs.c +f:drivers/base/regmap/regmap-fsi.c +f:drivers/base/regmap/regmap-i2c.c +f:drivers/base/regmap/regmap-i3c.c +f:drivers/base/regmap/regmap-irq.c +f:drivers/base/regmap/regmap-kunit.c +f:drivers/base/regmap/regmap-mdio.c +f:drivers/base/regmap/regmap-mmio.c +f:drivers/base/regmap/regmap-ram.c +f:drivers/base/regmap/regmap-raw-ram.c +f:drivers/base/regmap/regmap-sccb.c +f:drivers/base/regmap/regmap-sdw-mbq.c +f:drivers/base/regmap/regmap-sdw.c +f:drivers/base/regmap/regmap-slimbus.c +f:drivers/base/regmap/regmap-spi-avmm.c +f:drivers/base/regmap/regmap-spi.c +f:drivers/base/regmap/regmap-spmi.c +f:drivers/base/regmap/regmap-w1.c +f:drivers/base/regmap/regmap.c +f:drivers/base/regmap/trace.h +f:drivers/base/soc.c +f:drivers/base/swnode.c +f:drivers/base/syscore.c +f:drivers/base/test/.kunitconfig +f:drivers/base/test/Kconfig +f:drivers/base/test/Makefile +f:drivers/base/test/platform-device-test.c +f:drivers/base/test/property-entry-test.c +f:drivers/base/test/root-device-test.c +f:drivers/base/test/test_async_driver_probe.c +f:drivers/base/topology.c +f:drivers/base/trace.c +f:drivers/base/trace.h +f:drivers/base/transport_class.c +f:drivers/bcma/Kconfig +f:drivers/bcma/Makefile +f:drivers/bcma/README +f:drivers/bcma/TODO +f:drivers/bcma/bcma_private.h +f:drivers/bcma/core.c +f:drivers/bcma/driver_chipcommon.c +f:drivers/bcma/driver_chipcommon_b.c +f:drivers/bcma/driver_chipcommon_nflash.c +f:drivers/bcma/driver_chipcommon_pflash.c +f:drivers/bcma/driver_chipcommon_pmu.c +f:drivers/bcma/driver_chipcommon_sflash.c +f:drivers/bcma/driver_gmac_cmn.c +f:drivers/bcma/driver_gpio.c +f:drivers/bcma/driver_mips.c +f:drivers/bcma/driver_pci.c +f:drivers/bcma/driver_pci_host.c +f:drivers/bcma/driver_pcie2.c +f:drivers/bcma/host_pci.c +f:drivers/bcma/host_soc.c +f:drivers/bcma/main.c +f:drivers/bcma/scan.c +f:drivers/bcma/scan.h +f:drivers/bcma/sprom.c +f:drivers/block/Kconfig +f:drivers/block/Makefile +f:drivers/block/amiflop.c +f:drivers/block/aoe/Makefile +f:drivers/block/aoe/aoe.h +f:drivers/block/aoe/aoeblk.c +f:drivers/block/aoe/aoechr.c +f:drivers/block/aoe/aoecmd.c +f:drivers/block/aoe/aoedev.c +f:drivers/block/aoe/aoemain.c +f:drivers/block/aoe/aoenet.c +f:drivers/block/ataflop.c +f:drivers/block/brd.c +f:drivers/block/drbd/Kconfig +f:drivers/block/drbd/Makefile +f:drivers/block/drbd/drbd_actlog.c +f:drivers/block/drbd/drbd_bitmap.c +f:drivers/block/drbd/drbd_buildtag.c +f:drivers/block/drbd/drbd_debugfs.c +f:drivers/block/drbd/drbd_debugfs.h +f:drivers/block/drbd/drbd_int.h +f:drivers/block/drbd/drbd_interval.c +f:drivers/block/drbd/drbd_interval.h +f:drivers/block/drbd/drbd_main.c +f:drivers/block/drbd/drbd_nl.c +f:drivers/block/drbd/drbd_nla.c +f:drivers/block/drbd/drbd_nla.h +f:drivers/block/drbd/drbd_polymorph_printk.h +f:drivers/block/drbd/drbd_proc.c +f:drivers/block/drbd/drbd_protocol.h +f:drivers/block/drbd/drbd_receiver.c +f:drivers/block/drbd/drbd_req.c +f:drivers/block/drbd/drbd_req.h +f:drivers/block/drbd/drbd_state.c +f:drivers/block/drbd/drbd_state.h +f:drivers/block/drbd/drbd_state_change.h +f:drivers/block/drbd/drbd_strings.c +f:drivers/block/drbd/drbd_strings.h +f:drivers/block/drbd/drbd_vli.h +f:drivers/block/drbd/drbd_worker.c +f:drivers/block/floppy.c +f:drivers/block/loop.c +f:drivers/block/mtip32xx/Kconfig +f:drivers/block/mtip32xx/Makefile +f:drivers/block/mtip32xx/mtip32xx.c +f:drivers/block/mtip32xx/mtip32xx.h +f:drivers/block/n64cart.c +f:drivers/block/nbd.c +f:drivers/block/null_blk/Kconfig +f:drivers/block/null_blk/Makefile +f:drivers/block/null_blk/main.c +f:drivers/block/null_blk/null_blk.h +f:drivers/block/null_blk/trace.c +f:drivers/block/null_blk/trace.h +f:drivers/block/null_blk/zoned.c +f:drivers/block/ps3disk.c +f:drivers/block/ps3vram.c +f:drivers/block/rbd.c +f:drivers/block/rbd_types.h +f:drivers/block/rnbd/Kconfig +f:drivers/block/rnbd/Makefile +f:drivers/block/rnbd/README +f:drivers/block/rnbd/rnbd-clt-sysfs.c +f:drivers/block/rnbd/rnbd-clt.c +f:drivers/block/rnbd/rnbd-clt.h +f:drivers/block/rnbd/rnbd-log.h +f:drivers/block/rnbd/rnbd-proto.h +f:drivers/block/rnbd/rnbd-srv-sysfs.c +f:drivers/block/rnbd/rnbd-srv-trace.c +f:drivers/block/rnbd/rnbd-srv-trace.h +f:drivers/block/rnbd/rnbd-srv.c +f:drivers/block/rnbd/rnbd-srv.h +f:drivers/block/rnull.rs +f:drivers/block/sunvdc.c +f:drivers/block/swim.c +f:drivers/block/swim3.c +f:drivers/block/swim_asm.S +f:drivers/block/ublk_drv.c +f:drivers/block/virtio_blk.c +f:drivers/block/xen-blkback/Makefile +f:drivers/block/xen-blkback/blkback.c +f:drivers/block/xen-blkback/common.h +f:drivers/block/xen-blkback/xenbus.c +f:drivers/block/xen-blkfront.c +f:drivers/block/z2ram.c +f:drivers/block/zloop.c +f:drivers/block/zram/Kconfig +f:drivers/block/zram/Makefile +f:drivers/block/zram/backend_842.c +f:drivers/block/zram/backend_842.h +f:drivers/block/zram/backend_deflate.c +f:drivers/block/zram/backend_deflate.h +f:drivers/block/zram/backend_lz4.c +f:drivers/block/zram/backend_lz4.h +f:drivers/block/zram/backend_lz4hc.c +f:drivers/block/zram/backend_lz4hc.h +f:drivers/block/zram/backend_lzo.c +f:drivers/block/zram/backend_lzo.h +f:drivers/block/zram/backend_lzorle.c +f:drivers/block/zram/backend_lzorle.h +f:drivers/block/zram/backend_zstd.c +f:drivers/block/zram/backend_zstd.h +f:drivers/block/zram/zcomp.c +f:drivers/block/zram/zcomp.h +f:drivers/block/zram/zram_drv.c +f:drivers/block/zram/zram_drv.h +f:drivers/bluetooth/Kconfig +f:drivers/bluetooth/Makefile +f:drivers/bluetooth/ath3k.c +f:drivers/bluetooth/bcm203x.c +f:drivers/bluetooth/bfusb.c +f:drivers/bluetooth/bluecard_cs.c +f:drivers/bluetooth/bpa10x.c +f:drivers/bluetooth/bt3c_cs.c +f:drivers/bluetooth/btbcm.c +f:drivers/bluetooth/btbcm.h +f:drivers/bluetooth/btintel.c +f:drivers/bluetooth/btintel.h +f:drivers/bluetooth/btintel_pcie.c +f:drivers/bluetooth/btintel_pcie.h +f:drivers/bluetooth/btmrvl_debugfs.c +f:drivers/bluetooth/btmrvl_drv.h +f:drivers/bluetooth/btmrvl_main.c +f:drivers/bluetooth/btmrvl_sdio.c +f:drivers/bluetooth/btmrvl_sdio.h +f:drivers/bluetooth/btmtk.c +f:drivers/bluetooth/btmtk.h +f:drivers/bluetooth/btmtksdio.c +f:drivers/bluetooth/btmtkuart.c +f:drivers/bluetooth/btnxpuart.c +f:drivers/bluetooth/btqca.c +f:drivers/bluetooth/btqca.h +f:drivers/bluetooth/btqcomsmd.c +f:drivers/bluetooth/btrsi.c +f:drivers/bluetooth/btrtl.c +f:drivers/bluetooth/btrtl.h +f:drivers/bluetooth/btsdio.c +f:drivers/bluetooth/btusb.c +f:drivers/bluetooth/dtl1_cs.c +f:drivers/bluetooth/h4_recv.h +f:drivers/bluetooth/hci_ag6xx.c +f:drivers/bluetooth/hci_aml.c +f:drivers/bluetooth/hci_ath.c +f:drivers/bluetooth/hci_bcm.c +f:drivers/bluetooth/hci_bcm4377.c +f:drivers/bluetooth/hci_bcsp.c +f:drivers/bluetooth/hci_h4.c +f:drivers/bluetooth/hci_h5.c +f:drivers/bluetooth/hci_intel.c +f:drivers/bluetooth/hci_ldisc.c +f:drivers/bluetooth/hci_ll.c +f:drivers/bluetooth/hci_mrvl.c +f:drivers/bluetooth/hci_nokia.c +f:drivers/bluetooth/hci_qca.c +f:drivers/bluetooth/hci_serdev.c +f:drivers/bluetooth/hci_uart.h +f:drivers/bluetooth/hci_vhci.c +f:drivers/bluetooth/virtio_bt.c +f:drivers/bus/Kconfig +f:drivers/bus/Makefile +f:drivers/bus/arm-cci.c +f:drivers/bus/arm-integrator-lm.c +f:drivers/bus/brcmstb_gisb.c +f:drivers/bus/bt1-apb.c +f:drivers/bus/bt1-axi.c +f:drivers/bus/da8xx-mstpri.c +f:drivers/bus/fsl-mc/Kconfig +f:drivers/bus/fsl-mc/Makefile +f:drivers/bus/fsl-mc/dpbp.c +f:drivers/bus/fsl-mc/dpcon.c +f:drivers/bus/fsl-mc/dpmcp.c +f:drivers/bus/fsl-mc/dprc-driver.c +f:drivers/bus/fsl-mc/dprc.c +f:drivers/bus/fsl-mc/fsl-mc-allocator.c +f:drivers/bus/fsl-mc/fsl-mc-bus.c +f:drivers/bus/fsl-mc/fsl-mc-msi.c +f:drivers/bus/fsl-mc/fsl-mc-private.h +f:drivers/bus/fsl-mc/fsl-mc-uapi.c +f:drivers/bus/fsl-mc/mc-io.c +f:drivers/bus/fsl-mc/mc-sys.c +f:drivers/bus/fsl-mc/obj-api.c +f:drivers/bus/hisi_lpc.c +f:drivers/bus/imx-aipstz.c +f:drivers/bus/imx-weim.c +f:drivers/bus/intel-ixp4xx-eb.c +f:drivers/bus/mhi/Kconfig +f:drivers/bus/mhi/Makefile +f:drivers/bus/mhi/common.h +f:drivers/bus/mhi/ep/Kconfig +f:drivers/bus/mhi/ep/Makefile +f:drivers/bus/mhi/ep/internal.h +f:drivers/bus/mhi/ep/main.c +f:drivers/bus/mhi/ep/mmio.c +f:drivers/bus/mhi/ep/ring.c +f:drivers/bus/mhi/ep/sm.c +f:drivers/bus/mhi/host/Kconfig +f:drivers/bus/mhi/host/Makefile +f:drivers/bus/mhi/host/boot.c +f:drivers/bus/mhi/host/debugfs.c +f:drivers/bus/mhi/host/init.c +f:drivers/bus/mhi/host/internal.h +f:drivers/bus/mhi/host/main.c +f:drivers/bus/mhi/host/pci_generic.c +f:drivers/bus/mhi/host/pm.c +f:drivers/bus/mhi/host/trace.h +f:drivers/bus/mips_cdmm.c +f:drivers/bus/moxtet.c +f:drivers/bus/mvebu-mbus.c +f:drivers/bus/omap-ocp2scp.c +f:drivers/bus/omap_l3_noc.c +f:drivers/bus/omap_l3_noc.h +f:drivers/bus/omap_l3_smx.c +f:drivers/bus/omap_l3_smx.h +f:drivers/bus/qcom-ebi2.c +f:drivers/bus/qcom-ssc-block-bus.c +f:drivers/bus/simple-pm-bus.c +f:drivers/bus/stm32_etzpc.c +f:drivers/bus/stm32_firewall.c +f:drivers/bus/stm32_firewall.h +f:drivers/bus/stm32_rifsc.c +f:drivers/bus/sun50i-de2.c +f:drivers/bus/sunxi-rsb.c +f:drivers/bus/tegra-aconnect.c +f:drivers/bus/tegra-gmi.c +f:drivers/bus/ti-pwmss.c +f:drivers/bus/ti-sysc.c +f:drivers/bus/ts-nbus.c +f:drivers/bus/uniphier-system-bus.c +f:drivers/bus/vexpress-config.c +f:drivers/cache/Kconfig +f:drivers/cache/Makefile +f:drivers/cache/ax45mp_cache.c +f:drivers/cache/sifive_ccache.c +f:drivers/cache/starfive_starlink_cache.c +f:drivers/cdrom/Makefile +f:drivers/cdrom/cdrom.c +f:drivers/cdrom/gdrom.c +f:drivers/cdx/Kconfig +f:drivers/cdx/Makefile +f:drivers/cdx/cdx.c +f:drivers/cdx/cdx.h +f:drivers/cdx/cdx_msi.c +f:drivers/cdx/controller/Kconfig +f:drivers/cdx/controller/Makefile +f:drivers/cdx/controller/bitfield.h +f:drivers/cdx/controller/cdx_controller.c +f:drivers/cdx/controller/cdx_controller.h +f:drivers/cdx/controller/cdx_rpmsg.c +f:drivers/cdx/controller/mc_cdx_pcol.h +f:drivers/cdx/controller/mcdi.c +f:drivers/cdx/controller/mcdi.h +f:drivers/cdx/controller/mcdi_functions.c +f:drivers/cdx/controller/mcdi_functions.h +f:drivers/char/Kconfig +f:drivers/char/Makefile +f:drivers/char/adi.c +f:drivers/char/agp/Kconfig +f:drivers/char/agp/Makefile +f:drivers/char/agp/agp.h +f:drivers/char/agp/ali-agp.c +f:drivers/char/agp/alpha-agp.c +f:drivers/char/agp/amd-k7-agp.c +f:drivers/char/agp/amd64-agp.c +f:drivers/char/agp/ati-agp.c +f:drivers/char/agp/backend.c +f:drivers/char/agp/efficeon-agp.c +f:drivers/char/agp/generic.c +f:drivers/char/agp/intel-agp.c +f:drivers/char/agp/intel-agp.h +f:drivers/char/agp/intel-gtt.c +f:drivers/char/agp/isoch.c +f:drivers/char/agp/nvidia-agp.c +f:drivers/char/agp/parisc-agp.c +f:drivers/char/agp/sis-agp.c +f:drivers/char/agp/sworks-agp.c +f:drivers/char/agp/uninorth-agp.c +f:drivers/char/agp/via-agp.c +f:drivers/char/apm-emulation.c +f:drivers/char/applicom.c +f:drivers/char/applicom.h +f:drivers/char/bsr.c +f:drivers/char/ds1620.c +f:drivers/char/dsp56k.c +f:drivers/char/dtlk.c +f:drivers/char/hangcheck-timer.c +f:drivers/char/hpet.c +f:drivers/char/hw_random/Kconfig +f:drivers/char/hw_random/Makefile +f:drivers/char/hw_random/airoha-trng.c +f:drivers/char/hw_random/amd-rng.c +f:drivers/char/hw_random/arm_smccc_trng.c +f:drivers/char/hw_random/atmel-rng.c +f:drivers/char/hw_random/ba431-rng.c +f:drivers/char/hw_random/bcm2835-rng.c +f:drivers/char/hw_random/bcm74110-rng.c +f:drivers/char/hw_random/cavium-rng-vf.c +f:drivers/char/hw_random/cavium-rng.c +f:drivers/char/hw_random/cctrng.c +f:drivers/char/hw_random/cctrng.h +f:drivers/char/hw_random/cn10k-rng.c +f:drivers/char/hw_random/core.c +f:drivers/char/hw_random/exynos-trng.c +f:drivers/char/hw_random/geode-rng.c +f:drivers/char/hw_random/hisi-rng.c +f:drivers/char/hw_random/histb-rng.c +f:drivers/char/hw_random/imx-rngc.c +f:drivers/char/hw_random/ingenic-rng.c +f:drivers/char/hw_random/ingenic-trng.c +f:drivers/char/hw_random/intel-rng.c +f:drivers/char/hw_random/iproc-rng200.c +f:drivers/char/hw_random/ixp4xx-rng.c +f:drivers/char/hw_random/jh7110-trng.c +f:drivers/char/hw_random/ks-sa-rng.c +f:drivers/char/hw_random/meson-rng.c +f:drivers/char/hw_random/mpfs-rng.c +f:drivers/char/hw_random/mtk-rng.c +f:drivers/char/hw_random/mxc-rnga.c +f:drivers/char/hw_random/n2-asm.S +f:drivers/char/hw_random/n2-drv.c +f:drivers/char/hw_random/n2rng.h +f:drivers/char/hw_random/nomadik-rng.c +f:drivers/char/hw_random/npcm-rng.c +f:drivers/char/hw_random/octeon-rng.c +f:drivers/char/hw_random/omap-rng.c +f:drivers/char/hw_random/omap3-rom-rng.c +f:drivers/char/hw_random/optee-rng.c +f:drivers/char/hw_random/pasemi-rng.c +f:drivers/char/hw_random/pic32-rng.c +f:drivers/char/hw_random/powernv-rng.c +f:drivers/char/hw_random/pseries-rng.c +f:drivers/char/hw_random/rockchip-rng.c +f:drivers/char/hw_random/s390-trng.c +f:drivers/char/hw_random/st-rng.c +f:drivers/char/hw_random/stm32-rng.c +f:drivers/char/hw_random/timeriomem-rng.c +f:drivers/char/hw_random/via-rng.c +f:drivers/char/hw_random/virtio-rng.c +f:drivers/char/hw_random/xgene-rng.c +f:drivers/char/hw_random/xiphera-trng.c +f:drivers/char/ipmi/Kconfig +f:drivers/char/ipmi/Makefile +f:drivers/char/ipmi/bt-bmc.c +f:drivers/char/ipmi/ipmb_dev_int.c +f:drivers/char/ipmi/ipmi_bt_sm.c +f:drivers/char/ipmi/ipmi_devintf.c +f:drivers/char/ipmi/ipmi_dmi.c +f:drivers/char/ipmi/ipmi_dmi.h +f:drivers/char/ipmi/ipmi_ipmb.c +f:drivers/char/ipmi/ipmi_kcs_sm.c +f:drivers/char/ipmi/ipmi_msghandler.c +f:drivers/char/ipmi/ipmi_plat_data.c +f:drivers/char/ipmi/ipmi_plat_data.h +f:drivers/char/ipmi/ipmi_powernv.c +f:drivers/char/ipmi/ipmi_poweroff.c +f:drivers/char/ipmi/ipmi_si.h +f:drivers/char/ipmi/ipmi_si_hardcode.c +f:drivers/char/ipmi/ipmi_si_hotmod.c +f:drivers/char/ipmi/ipmi_si_intf.c +f:drivers/char/ipmi/ipmi_si_mem_io.c +f:drivers/char/ipmi/ipmi_si_parisc.c +f:drivers/char/ipmi/ipmi_si_pci.c +f:drivers/char/ipmi/ipmi_si_platform.c +f:drivers/char/ipmi/ipmi_si_port_io.c +f:drivers/char/ipmi/ipmi_si_sm.h +f:drivers/char/ipmi/ipmi_smic_sm.c +f:drivers/char/ipmi/ipmi_ssif.c +f:drivers/char/ipmi/ipmi_watchdog.c +f:drivers/char/ipmi/kcs_bmc.c +f:drivers/char/ipmi/kcs_bmc.h +f:drivers/char/ipmi/kcs_bmc_aspeed.c +f:drivers/char/ipmi/kcs_bmc_cdev_ipmi.c +f:drivers/char/ipmi/kcs_bmc_client.h +f:drivers/char/ipmi/kcs_bmc_device.h +f:drivers/char/ipmi/kcs_bmc_npcm7xx.c +f:drivers/char/ipmi/kcs_bmc_serio.c +f:drivers/char/ipmi/ssif_bmc.c +f:drivers/char/lp.c +f:drivers/char/mem.c +f:drivers/char/misc.c +f:drivers/char/mwave/3780i.c +f:drivers/char/mwave/3780i.h +f:drivers/char/mwave/Makefile +f:drivers/char/mwave/README +f:drivers/char/mwave/mwavedd.c +f:drivers/char/mwave/mwavedd.h +f:drivers/char/mwave/mwavepub.h +f:drivers/char/mwave/smapi.c +f:drivers/char/mwave/smapi.h +f:drivers/char/mwave/tp3780i.c +f:drivers/char/mwave/tp3780i.h +f:drivers/char/nsc_gpio.c +f:drivers/char/nvram.c +f:drivers/char/nwbutton.c +f:drivers/char/nwbutton.h +f:drivers/char/nwflash.c +f:drivers/char/pc8736x_gpio.c +f:drivers/char/powernv-op-panel.c +f:drivers/char/ppdev.c +f:drivers/char/ps3flash.c +f:drivers/char/random.c +f:drivers/char/scx200_gpio.c +f:drivers/char/sonypi.c +f:drivers/char/tlclk.c +f:drivers/char/toshiba.c +f:drivers/char/tpm/Kconfig +f:drivers/char/tpm/Makefile +f:drivers/char/tpm/eventlog/acpi.c +f:drivers/char/tpm/eventlog/common.c +f:drivers/char/tpm/eventlog/common.h +f:drivers/char/tpm/eventlog/efi.c +f:drivers/char/tpm/eventlog/of.c +f:drivers/char/tpm/eventlog/tpm1.c +f:drivers/char/tpm/eventlog/tpm2.c +f:drivers/char/tpm/st33zp24/Kconfig +f:drivers/char/tpm/st33zp24/Makefile +f:drivers/char/tpm/st33zp24/i2c.c +f:drivers/char/tpm/st33zp24/spi.c +f:drivers/char/tpm/st33zp24/st33zp24.c +f:drivers/char/tpm/st33zp24/st33zp24.h +f:drivers/char/tpm/tpm-buf.c +f:drivers/char/tpm/tpm-chip.c +f:drivers/char/tpm/tpm-dev-common.c +f:drivers/char/tpm/tpm-dev.c +f:drivers/char/tpm/tpm-dev.h +f:drivers/char/tpm/tpm-interface.c +f:drivers/char/tpm/tpm-sysfs.c +f:drivers/char/tpm/tpm.h +f:drivers/char/tpm/tpm1-cmd.c +f:drivers/char/tpm/tpm2-cmd.c +f:drivers/char/tpm/tpm2-sessions.c +f:drivers/char/tpm/tpm2-space.c +f:drivers/char/tpm/tpm_atmel.c +f:drivers/char/tpm/tpm_crb.c +f:drivers/char/tpm/tpm_crb_ffa.c +f:drivers/char/tpm/tpm_crb_ffa.h +f:drivers/char/tpm/tpm_ftpm_tee.c +f:drivers/char/tpm/tpm_ftpm_tee.h +f:drivers/char/tpm/tpm_i2c_atmel.c +f:drivers/char/tpm/tpm_i2c_infineon.c +f:drivers/char/tpm/tpm_i2c_nuvoton.c +f:drivers/char/tpm/tpm_ibmvtpm.c +f:drivers/char/tpm/tpm_ibmvtpm.h +f:drivers/char/tpm/tpm_infineon.c +f:drivers/char/tpm/tpm_nsc.c +f:drivers/char/tpm/tpm_ppi.c +f:drivers/char/tpm/tpm_svsm.c +f:drivers/char/tpm/tpm_tis.c +f:drivers/char/tpm/tpm_tis_core.c +f:drivers/char/tpm/tpm_tis_core.h +f:drivers/char/tpm/tpm_tis_i2c.c +f:drivers/char/tpm/tpm_tis_i2c_cr50.c +f:drivers/char/tpm/tpm_tis_spi.h +f:drivers/char/tpm/tpm_tis_spi_cr50.c +f:drivers/char/tpm/tpm_tis_spi_main.c +f:drivers/char/tpm/tpm_tis_synquacer.c +f:drivers/char/tpm/tpm_vtpm_proxy.c +f:drivers/char/tpm/tpmrm-dev.c +f:drivers/char/tpm/xen-tpmfront.c +f:drivers/char/ttyprintk.c +f:drivers/char/uv_mmtimer.c +f:drivers/char/virtio_console.c +f:drivers/char/xilinx_hwicap/Makefile +f:drivers/char/xilinx_hwicap/buffer_icap.c +f:drivers/char/xilinx_hwicap/buffer_icap.h +f:drivers/char/xilinx_hwicap/fifo_icap.c +f:drivers/char/xilinx_hwicap/fifo_icap.h +f:drivers/char/xilinx_hwicap/xilinx_hwicap.c +f:drivers/char/xilinx_hwicap/xilinx_hwicap.h +f:drivers/char/xillybus/Kconfig +f:drivers/char/xillybus/Makefile +f:drivers/char/xillybus/xillybus.h +f:drivers/char/xillybus/xillybus_class.c +f:drivers/char/xillybus/xillybus_class.h +f:drivers/char/xillybus/xillybus_core.c +f:drivers/char/xillybus/xillybus_of.c +f:drivers/char/xillybus/xillybus_pcie.c +f:drivers/char/xillybus/xillyusb.c +f:drivers/clk/.kunitconfig +f:drivers/clk/Kconfig +f:drivers/clk/Makefile +f:drivers/clk/actions/Kconfig +f:drivers/clk/actions/Makefile +f:drivers/clk/actions/owl-common.c +f:drivers/clk/actions/owl-common.h +f:drivers/clk/actions/owl-composite.c +f:drivers/clk/actions/owl-composite.h +f:drivers/clk/actions/owl-divider.c +f:drivers/clk/actions/owl-divider.h +f:drivers/clk/actions/owl-factor.c +f:drivers/clk/actions/owl-factor.h +f:drivers/clk/actions/owl-fixed-factor.h +f:drivers/clk/actions/owl-gate.c +f:drivers/clk/actions/owl-gate.h +f:drivers/clk/actions/owl-mux.c +f:drivers/clk/actions/owl-mux.h +f:drivers/clk/actions/owl-pll.c +f:drivers/clk/actions/owl-pll.h +f:drivers/clk/actions/owl-reset.c +f:drivers/clk/actions/owl-reset.h +f:drivers/clk/actions/owl-s500.c +f:drivers/clk/actions/owl-s700.c +f:drivers/clk/actions/owl-s900.c +f:drivers/clk/analogbits/Kconfig +f:drivers/clk/analogbits/Makefile +f:drivers/clk/analogbits/wrpll-cln28hpc.c +f:drivers/clk/at91/Makefile +f:drivers/clk/at91/at91rm9200.c +f:drivers/clk/at91/at91sam9260.c +f:drivers/clk/at91/at91sam9g45.c +f:drivers/clk/at91/at91sam9n12.c +f:drivers/clk/at91/at91sam9rl.c +f:drivers/clk/at91/at91sam9x5.c +f:drivers/clk/at91/clk-audio-pll.c +f:drivers/clk/at91/clk-generated.c +f:drivers/clk/at91/clk-h32mx.c +f:drivers/clk/at91/clk-i2s-mux.c +f:drivers/clk/at91/clk-main.c +f:drivers/clk/at91/clk-master.c +f:drivers/clk/at91/clk-peripheral.c +f:drivers/clk/at91/clk-pll.c +f:drivers/clk/at91/clk-plldiv.c +f:drivers/clk/at91/clk-programmable.c +f:drivers/clk/at91/clk-sam9x60-pll.c +f:drivers/clk/at91/clk-slow.c +f:drivers/clk/at91/clk-smd.c +f:drivers/clk/at91/clk-system.c +f:drivers/clk/at91/clk-usb.c +f:drivers/clk/at91/clk-utmi.c +f:drivers/clk/at91/dt-compat.c +f:drivers/clk/at91/pmc.c +f:drivers/clk/at91/pmc.h +f:drivers/clk/at91/sam9x60.c +f:drivers/clk/at91/sam9x7.c +f:drivers/clk/at91/sama5d2.c +f:drivers/clk/at91/sama5d3.c +f:drivers/clk/at91/sama5d4.c +f:drivers/clk/at91/sama7d65.c +f:drivers/clk/at91/sama7g5.c +f:drivers/clk/at91/sckc.c +f:drivers/clk/axis/Makefile +f:drivers/clk/axis/clk-artpec6.c +f:drivers/clk/axs10x/Makefile +f:drivers/clk/axs10x/i2s_pll_clock.c +f:drivers/clk/axs10x/pll_clock.c +f:drivers/clk/baikal-t1/Kconfig +f:drivers/clk/baikal-t1/Makefile +f:drivers/clk/baikal-t1/ccu-div.c +f:drivers/clk/baikal-t1/ccu-div.h +f:drivers/clk/baikal-t1/ccu-pll.c +f:drivers/clk/baikal-t1/ccu-pll.h +f:drivers/clk/baikal-t1/ccu-rst.c +f:drivers/clk/baikal-t1/ccu-rst.h +f:drivers/clk/baikal-t1/clk-ccu-div.c +f:drivers/clk/baikal-t1/clk-ccu-pll.c +f:drivers/clk/bcm/Kconfig +f:drivers/clk/bcm/Makefile +f:drivers/clk/bcm/clk-bcm21664.c +f:drivers/clk/bcm/clk-bcm2711-dvp.c +f:drivers/clk/bcm/clk-bcm281xx.c +f:drivers/clk/bcm/clk-bcm2835-aux.c +f:drivers/clk/bcm/clk-bcm2835.c +f:drivers/clk/bcm/clk-bcm53573-ilp.c +f:drivers/clk/bcm/clk-bcm63268-timer.c +f:drivers/clk/bcm/clk-bcm63xx-gate.c +f:drivers/clk/bcm/clk-bcm63xx.c +f:drivers/clk/bcm/clk-cygnus.c +f:drivers/clk/bcm/clk-hr2.c +f:drivers/clk/bcm/clk-iproc-armpll.c +f:drivers/clk/bcm/clk-iproc-asiu.c +f:drivers/clk/bcm/clk-iproc-pll.c +f:drivers/clk/bcm/clk-iproc.h +f:drivers/clk/bcm/clk-kona-setup.c +f:drivers/clk/bcm/clk-kona.c +f:drivers/clk/bcm/clk-kona.h +f:drivers/clk/bcm/clk-ns2.c +f:drivers/clk/bcm/clk-nsp.c +f:drivers/clk/bcm/clk-raspberrypi.c +f:drivers/clk/bcm/clk-sr.c +f:drivers/clk/berlin/Makefile +f:drivers/clk/berlin/berlin2-avpll.c +f:drivers/clk/berlin/berlin2-avpll.h +f:drivers/clk/berlin/berlin2-div.c +f:drivers/clk/berlin/berlin2-div.h +f:drivers/clk/berlin/berlin2-pll.c +f:drivers/clk/berlin/berlin2-pll.h +f:drivers/clk/berlin/bg2.c +f:drivers/clk/berlin/bg2q.c +f:drivers/clk/berlin/common.h +f:drivers/clk/clk-apple-nco.c +f:drivers/clk/clk-asm9260.c +f:drivers/clk/clk-aspeed.c +f:drivers/clk/clk-aspeed.h +f:drivers/clk/clk-ast2600.c +f:drivers/clk/clk-axi-clkgen.c +f:drivers/clk/clk-axm5516.c +f:drivers/clk/clk-bd718x7.c +f:drivers/clk/clk-bm1880.c +f:drivers/clk/clk-bulk.c +f:drivers/clk/clk-cdce706.c +f:drivers/clk/clk-cdce925.c +f:drivers/clk/clk-clps711x.c +f:drivers/clk/clk-composite.c +f:drivers/clk/clk-conf.c +f:drivers/clk/clk-cs2000-cp.c +f:drivers/clk/clk-devres.c +f:drivers/clk/clk-divider.c +f:drivers/clk/clk-en7523.c +f:drivers/clk/clk-ep93xx.c +f:drivers/clk/clk-eyeq.c +f:drivers/clk/clk-fixed-factor.c +f:drivers/clk/clk-fixed-mmio.c +f:drivers/clk/clk-fixed-rate.c +f:drivers/clk/clk-fixed-rate_test.c +f:drivers/clk/clk-fixed-rate_test.h +f:drivers/clk/clk-fractional-divider.c +f:drivers/clk/clk-fractional-divider.h +f:drivers/clk/clk-fractional-divider_test.c +f:drivers/clk/clk-fsl-flexspi.c +f:drivers/clk/clk-fsl-sai.c +f:drivers/clk/clk-gate.c +f:drivers/clk/clk-gate_test.c +f:drivers/clk/clk-gemini.c +f:drivers/clk/clk-gpio.c +f:drivers/clk/clk-hi655x.c +f:drivers/clk/clk-highbank.c +f:drivers/clk/clk-hsdk-pll.c +f:drivers/clk/clk-k210.c +f:drivers/clk/clk-lan966x.c +f:drivers/clk/clk-lmk04832.c +f:drivers/clk/clk-lochnagar.c +f:drivers/clk/clk-loongson1.c +f:drivers/clk/clk-loongson2.c +f:drivers/clk/clk-max77686.c +f:drivers/clk/clk-max9485.c +f:drivers/clk/clk-milbeaut.c +f:drivers/clk/clk-moxart.c +f:drivers/clk/clk-multiplier.c +f:drivers/clk/clk-mux.c +f:drivers/clk/clk-nomadik.c +f:drivers/clk/clk-npcm7xx.c +f:drivers/clk/clk-npcm8xx.c +f:drivers/clk/clk-nspire.c +f:drivers/clk/clk-palmas.c +f:drivers/clk/clk-plldig.c +f:drivers/clk/clk-pwm.c +f:drivers/clk/clk-qoriq.c +f:drivers/clk/clk-renesas-pcie.c +f:drivers/clk/clk-rk808.c +f:drivers/clk/clk-rp1.c +f:drivers/clk/clk-s2mps11.c +f:drivers/clk/clk-scmi.c +f:drivers/clk/clk-scpi.c +f:drivers/clk/clk-si514.c +f:drivers/clk/clk-si521xx.c +f:drivers/clk/clk-si5341.c +f:drivers/clk/clk-si5351.c +f:drivers/clk/clk-si5351.h +f:drivers/clk/clk-si544.c +f:drivers/clk/clk-si570.c +f:drivers/clk/clk-sp7021.c +f:drivers/clk/clk-sparx5.c +f:drivers/clk/clk-stm32f4.c +f:drivers/clk/clk-stm32h7.c +f:drivers/clk/clk-tps68470.c +f:drivers/clk/clk-twl.c +f:drivers/clk/clk-twl6040.c +f:drivers/clk/clk-versaclock3.c +f:drivers/clk/clk-versaclock5.c +f:drivers/clk/clk-versaclock7.c +f:drivers/clk/clk-vt8500.c +f:drivers/clk/clk-wm831x.c +f:drivers/clk/clk-xgene.c +f:drivers/clk/clk.c +f:drivers/clk/clk.h +f:drivers/clk/clk_kunit_helpers.c +f:drivers/clk/clk_parent_data_test.h +f:drivers/clk/clk_test.c +f:drivers/clk/clkdev.c +f:drivers/clk/davinci/Makefile +f:drivers/clk/davinci/da8xx-cfgchip.c +f:drivers/clk/davinci/pll-da850.c +f:drivers/clk/davinci/pll.c +f:drivers/clk/davinci/pll.h +f:drivers/clk/davinci/psc-da850.c +f:drivers/clk/davinci/psc.c +f:drivers/clk/davinci/psc.h +f:drivers/clk/hisilicon/Kconfig +f:drivers/clk/hisilicon/Makefile +f:drivers/clk/hisilicon/clk-hi3519.c +f:drivers/clk/hisilicon/clk-hi3559a.c +f:drivers/clk/hisilicon/clk-hi3620.c +f:drivers/clk/hisilicon/clk-hi3660-stub.c +f:drivers/clk/hisilicon/clk-hi3660.c +f:drivers/clk/hisilicon/clk-hi3670.c +f:drivers/clk/hisilicon/clk-hi6220-stub.c +f:drivers/clk/hisilicon/clk-hi6220.c +f:drivers/clk/hisilicon/clk-hip04.c +f:drivers/clk/hisilicon/clk-hisi-phase.c +f:drivers/clk/hisilicon/clk-hix5hd2.c +f:drivers/clk/hisilicon/clk.c +f:drivers/clk/hisilicon/clk.h +f:drivers/clk/hisilicon/clkdivider-hi6220.c +f:drivers/clk/hisilicon/clkgate-separated.c +f:drivers/clk/hisilicon/crg-hi3516cv300.c +f:drivers/clk/hisilicon/crg-hi3798cv200.c +f:drivers/clk/hisilicon/crg.h +f:drivers/clk/hisilicon/reset.c +f:drivers/clk/hisilicon/reset.h +f:drivers/clk/imgtec/Kconfig +f:drivers/clk/imgtec/Makefile +f:drivers/clk/imgtec/clk-boston.c +f:drivers/clk/imx/Kconfig +f:drivers/clk/imx/Makefile +f:drivers/clk/imx/clk-busy.c +f:drivers/clk/imx/clk-composite-7ulp.c +f:drivers/clk/imx/clk-composite-8m.c +f:drivers/clk/imx/clk-composite-93.c +f:drivers/clk/imx/clk-cpu.c +f:drivers/clk/imx/clk-divider-gate.c +f:drivers/clk/imx/clk-fixup-div.c +f:drivers/clk/imx/clk-fixup-mux.c +f:drivers/clk/imx/clk-frac-pll.c +f:drivers/clk/imx/clk-fracn-gppll.c +f:drivers/clk/imx/clk-gate-93.c +f:drivers/clk/imx/clk-gate-exclusive.c +f:drivers/clk/imx/clk-gate2.c +f:drivers/clk/imx/clk-gpr-mux.c +f:drivers/clk/imx/clk-imx1.c +f:drivers/clk/imx/clk-imx25.c +f:drivers/clk/imx/clk-imx27.c +f:drivers/clk/imx/clk-imx31.c +f:drivers/clk/imx/clk-imx35.c +f:drivers/clk/imx/clk-imx5.c +f:drivers/clk/imx/clk-imx6q.c +f:drivers/clk/imx/clk-imx6sl.c +f:drivers/clk/imx/clk-imx6sll.c +f:drivers/clk/imx/clk-imx6sx.c +f:drivers/clk/imx/clk-imx6ul.c +f:drivers/clk/imx/clk-imx7d.c +f:drivers/clk/imx/clk-imx7ulp.c +f:drivers/clk/imx/clk-imx8-acm.c +f:drivers/clk/imx/clk-imx8dxl-rsrc.c +f:drivers/clk/imx/clk-imx8mm.c +f:drivers/clk/imx/clk-imx8mn.c +f:drivers/clk/imx/clk-imx8mp-audiomix.c +f:drivers/clk/imx/clk-imx8mp.c +f:drivers/clk/imx/clk-imx8mq.c +f:drivers/clk/imx/clk-imx8qm-rsrc.c +f:drivers/clk/imx/clk-imx8qxp-lpcg.c +f:drivers/clk/imx/clk-imx8qxp-lpcg.h +f:drivers/clk/imx/clk-imx8qxp-rsrc.c +f:drivers/clk/imx/clk-imx8qxp.c +f:drivers/clk/imx/clk-imx8ulp.c +f:drivers/clk/imx/clk-imx93.c +f:drivers/clk/imx/clk-imx95-blk-ctl.c +f:drivers/clk/imx/clk-imxrt1050.c +f:drivers/clk/imx/clk-lpcg-scu.c +f:drivers/clk/imx/clk-pfd.c +f:drivers/clk/imx/clk-pfdv2.c +f:drivers/clk/imx/clk-pll14xx.c +f:drivers/clk/imx/clk-pllv1.c +f:drivers/clk/imx/clk-pllv2.c +f:drivers/clk/imx/clk-pllv3.c +f:drivers/clk/imx/clk-pllv4.c +f:drivers/clk/imx/clk-scu.c +f:drivers/clk/imx/clk-scu.h +f:drivers/clk/imx/clk-sscg-pll.c +f:drivers/clk/imx/clk-vf610.c +f:drivers/clk/imx/clk.c +f:drivers/clk/imx/clk.h +f:drivers/clk/ingenic/Kconfig +f:drivers/clk/ingenic/Makefile +f:drivers/clk/ingenic/cgu.c +f:drivers/clk/ingenic/cgu.h +f:drivers/clk/ingenic/jz4725b-cgu.c +f:drivers/clk/ingenic/jz4740-cgu.c +f:drivers/clk/ingenic/jz4755-cgu.c +f:drivers/clk/ingenic/jz4760-cgu.c +f:drivers/clk/ingenic/jz4770-cgu.c +f:drivers/clk/ingenic/jz4780-cgu.c +f:drivers/clk/ingenic/pm.c +f:drivers/clk/ingenic/pm.h +f:drivers/clk/ingenic/tcu.c +f:drivers/clk/ingenic/x1000-cgu.c +f:drivers/clk/ingenic/x1830-cgu.c +f:drivers/clk/keystone/Kconfig +f:drivers/clk/keystone/Makefile +f:drivers/clk/keystone/gate.c +f:drivers/clk/keystone/pll.c +f:drivers/clk/keystone/sci-clk.c +f:drivers/clk/keystone/syscon-clk.c +f:drivers/clk/kunit_clk_assigned_rates.h +f:drivers/clk/kunit_clk_assigned_rates_multiple.dtso +f:drivers/clk/kunit_clk_assigned_rates_multiple_consumer.dtso +f:drivers/clk/kunit_clk_assigned_rates_null.dtso +f:drivers/clk/kunit_clk_assigned_rates_null_consumer.dtso +f:drivers/clk/kunit_clk_assigned_rates_one.dtso +f:drivers/clk/kunit_clk_assigned_rates_one_consumer.dtso +f:drivers/clk/kunit_clk_assigned_rates_u64_multiple.dtso +f:drivers/clk/kunit_clk_assigned_rates_u64_multiple_consumer.dtso +f:drivers/clk/kunit_clk_assigned_rates_u64_one.dtso +f:drivers/clk/kunit_clk_assigned_rates_u64_one_consumer.dtso +f:drivers/clk/kunit_clk_assigned_rates_without.dtso +f:drivers/clk/kunit_clk_assigned_rates_without_consumer.dtso +f:drivers/clk/kunit_clk_assigned_rates_zero.dtso +f:drivers/clk/kunit_clk_assigned_rates_zero_consumer.dtso +f:drivers/clk/kunit_clk_fixed_rate_test.dtso +f:drivers/clk/kunit_clk_hw_get_dev_of_node.dtso +f:drivers/clk/kunit_clk_parent_data_test.dtso +f:drivers/clk/mediatek/Kconfig +f:drivers/clk/mediatek/Makefile +f:drivers/clk/mediatek/clk-apmixed.c +f:drivers/clk/mediatek/clk-cpumux.c +f:drivers/clk/mediatek/clk-cpumux.h +f:drivers/clk/mediatek/clk-fhctl.c +f:drivers/clk/mediatek/clk-fhctl.h +f:drivers/clk/mediatek/clk-gate.c +f:drivers/clk/mediatek/clk-gate.h +f:drivers/clk/mediatek/clk-mt2701-aud.c +f:drivers/clk/mediatek/clk-mt2701-bdp.c +f:drivers/clk/mediatek/clk-mt2701-eth.c +f:drivers/clk/mediatek/clk-mt2701-g3d.c +f:drivers/clk/mediatek/clk-mt2701-hif.c +f:drivers/clk/mediatek/clk-mt2701-img.c +f:drivers/clk/mediatek/clk-mt2701-mm.c +f:drivers/clk/mediatek/clk-mt2701-vdec.c +f:drivers/clk/mediatek/clk-mt2701.c +f:drivers/clk/mediatek/clk-mt2712-apmixedsys.c +f:drivers/clk/mediatek/clk-mt2712-bdp.c +f:drivers/clk/mediatek/clk-mt2712-img.c +f:drivers/clk/mediatek/clk-mt2712-jpgdec.c +f:drivers/clk/mediatek/clk-mt2712-mfg.c +f:drivers/clk/mediatek/clk-mt2712-mm.c +f:drivers/clk/mediatek/clk-mt2712-vdec.c +f:drivers/clk/mediatek/clk-mt2712-venc.c +f:drivers/clk/mediatek/clk-mt2712.c +f:drivers/clk/mediatek/clk-mt6735-apmixedsys.c +f:drivers/clk/mediatek/clk-mt6735-imgsys.c +f:drivers/clk/mediatek/clk-mt6735-infracfg.c +f:drivers/clk/mediatek/clk-mt6735-mfgcfg.c +f:drivers/clk/mediatek/clk-mt6735-pericfg.c +f:drivers/clk/mediatek/clk-mt6735-topckgen.c +f:drivers/clk/mediatek/clk-mt6735-vdecsys.c +f:drivers/clk/mediatek/clk-mt6735-vencsys.c +f:drivers/clk/mediatek/clk-mt6765-audio.c +f:drivers/clk/mediatek/clk-mt6765-cam.c +f:drivers/clk/mediatek/clk-mt6765-img.c +f:drivers/clk/mediatek/clk-mt6765-mipi0a.c +f:drivers/clk/mediatek/clk-mt6765-mm.c +f:drivers/clk/mediatek/clk-mt6765-vcodec.c +f:drivers/clk/mediatek/clk-mt6765.c +f:drivers/clk/mediatek/clk-mt6779-aud.c +f:drivers/clk/mediatek/clk-mt6779-cam.c +f:drivers/clk/mediatek/clk-mt6779-img.c +f:drivers/clk/mediatek/clk-mt6779-ipe.c +f:drivers/clk/mediatek/clk-mt6779-mfg.c +f:drivers/clk/mediatek/clk-mt6779-mm.c +f:drivers/clk/mediatek/clk-mt6779-vdec.c +f:drivers/clk/mediatek/clk-mt6779-venc.c +f:drivers/clk/mediatek/clk-mt6779.c +f:drivers/clk/mediatek/clk-mt6795-apmixedsys.c +f:drivers/clk/mediatek/clk-mt6795-infracfg.c +f:drivers/clk/mediatek/clk-mt6795-mfg.c +f:drivers/clk/mediatek/clk-mt6795-mm.c +f:drivers/clk/mediatek/clk-mt6795-pericfg.c +f:drivers/clk/mediatek/clk-mt6795-topckgen.c +f:drivers/clk/mediatek/clk-mt6795-vdecsys.c +f:drivers/clk/mediatek/clk-mt6795-vencsys.c +f:drivers/clk/mediatek/clk-mt6797-img.c +f:drivers/clk/mediatek/clk-mt6797-mm.c +f:drivers/clk/mediatek/clk-mt6797-vdec.c +f:drivers/clk/mediatek/clk-mt6797-venc.c +f:drivers/clk/mediatek/clk-mt6797.c +f:drivers/clk/mediatek/clk-mt7622-apmixedsys.c +f:drivers/clk/mediatek/clk-mt7622-aud.c +f:drivers/clk/mediatek/clk-mt7622-eth.c +f:drivers/clk/mediatek/clk-mt7622-hif.c +f:drivers/clk/mediatek/clk-mt7622-infracfg.c +f:drivers/clk/mediatek/clk-mt7622.c +f:drivers/clk/mediatek/clk-mt7629-eth.c +f:drivers/clk/mediatek/clk-mt7629-hif.c +f:drivers/clk/mediatek/clk-mt7629.c +f:drivers/clk/mediatek/clk-mt7981-apmixed.c +f:drivers/clk/mediatek/clk-mt7981-eth.c +f:drivers/clk/mediatek/clk-mt7981-infracfg.c +f:drivers/clk/mediatek/clk-mt7981-topckgen.c +f:drivers/clk/mediatek/clk-mt7986-apmixed.c +f:drivers/clk/mediatek/clk-mt7986-eth.c +f:drivers/clk/mediatek/clk-mt7986-infracfg.c +f:drivers/clk/mediatek/clk-mt7986-topckgen.c +f:drivers/clk/mediatek/clk-mt7988-apmixed.c +f:drivers/clk/mediatek/clk-mt7988-eth.c +f:drivers/clk/mediatek/clk-mt7988-infracfg.c +f:drivers/clk/mediatek/clk-mt7988-topckgen.c +f:drivers/clk/mediatek/clk-mt7988-xfipll.c +f:drivers/clk/mediatek/clk-mt8135-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8135.c +f:drivers/clk/mediatek/clk-mt8167-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8167-aud.c +f:drivers/clk/mediatek/clk-mt8167-img.c +f:drivers/clk/mediatek/clk-mt8167-mfgcfg.c +f:drivers/clk/mediatek/clk-mt8167-mm.c +f:drivers/clk/mediatek/clk-mt8167-vdec.c +f:drivers/clk/mediatek/clk-mt8167.c +f:drivers/clk/mediatek/clk-mt8173-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8173-img.c +f:drivers/clk/mediatek/clk-mt8173-infracfg.c +f:drivers/clk/mediatek/clk-mt8173-mm.c +f:drivers/clk/mediatek/clk-mt8173-pericfg.c +f:drivers/clk/mediatek/clk-mt8173-topckgen.c +f:drivers/clk/mediatek/clk-mt8173-vdecsys.c +f:drivers/clk/mediatek/clk-mt8173-vencsys.c +f:drivers/clk/mediatek/clk-mt8183-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8183-audio.c +f:drivers/clk/mediatek/clk-mt8183-cam.c +f:drivers/clk/mediatek/clk-mt8183-img.c +f:drivers/clk/mediatek/clk-mt8183-ipu0.c +f:drivers/clk/mediatek/clk-mt8183-ipu1.c +f:drivers/clk/mediatek/clk-mt8183-ipu_adl.c +f:drivers/clk/mediatek/clk-mt8183-ipu_conn.c +f:drivers/clk/mediatek/clk-mt8183-mfgcfg.c +f:drivers/clk/mediatek/clk-mt8183-mm.c +f:drivers/clk/mediatek/clk-mt8183-vdec.c +f:drivers/clk/mediatek/clk-mt8183-venc.c +f:drivers/clk/mediatek/clk-mt8183.c +f:drivers/clk/mediatek/clk-mt8186-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8186-cam.c +f:drivers/clk/mediatek/clk-mt8186-img.c +f:drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c +f:drivers/clk/mediatek/clk-mt8186-infra_ao.c +f:drivers/clk/mediatek/clk-mt8186-ipe.c +f:drivers/clk/mediatek/clk-mt8186-mcu.c +f:drivers/clk/mediatek/clk-mt8186-mdp.c +f:drivers/clk/mediatek/clk-mt8186-mfg.c +f:drivers/clk/mediatek/clk-mt8186-mm.c +f:drivers/clk/mediatek/clk-mt8186-topckgen.c +f:drivers/clk/mediatek/clk-mt8186-vdec.c +f:drivers/clk/mediatek/clk-mt8186-venc.c +f:drivers/clk/mediatek/clk-mt8186-wpe.c +f:drivers/clk/mediatek/clk-mt8188-adsp_audio26m.c +f:drivers/clk/mediatek/clk-mt8188-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8188-cam.c +f:drivers/clk/mediatek/clk-mt8188-ccu.c +f:drivers/clk/mediatek/clk-mt8188-img.c +f:drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.c +f:drivers/clk/mediatek/clk-mt8188-infra_ao.c +f:drivers/clk/mediatek/clk-mt8188-ipe.c +f:drivers/clk/mediatek/clk-mt8188-mfg.c +f:drivers/clk/mediatek/clk-mt8188-peri_ao.c +f:drivers/clk/mediatek/clk-mt8188-topckgen.c +f:drivers/clk/mediatek/clk-mt8188-vdec.c +f:drivers/clk/mediatek/clk-mt8188-vdo0.c +f:drivers/clk/mediatek/clk-mt8188-vdo1.c +f:drivers/clk/mediatek/clk-mt8188-venc.c +f:drivers/clk/mediatek/clk-mt8188-vpp0.c +f:drivers/clk/mediatek/clk-mt8188-vpp1.c +f:drivers/clk/mediatek/clk-mt8188-wpe.c +f:drivers/clk/mediatek/clk-mt8192-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8192-aud.c +f:drivers/clk/mediatek/clk-mt8192-cam.c +f:drivers/clk/mediatek/clk-mt8192-img.c +f:drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c +f:drivers/clk/mediatek/clk-mt8192-ipe.c +f:drivers/clk/mediatek/clk-mt8192-mdp.c +f:drivers/clk/mediatek/clk-mt8192-mfg.c +f:drivers/clk/mediatek/clk-mt8192-mm.c +f:drivers/clk/mediatek/clk-mt8192-msdc.c +f:drivers/clk/mediatek/clk-mt8192-scp_adsp.c +f:drivers/clk/mediatek/clk-mt8192-vdec.c +f:drivers/clk/mediatek/clk-mt8192-venc.c +f:drivers/clk/mediatek/clk-mt8192.c +f:drivers/clk/mediatek/clk-mt8195-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8195-apusys_pll.c +f:drivers/clk/mediatek/clk-mt8195-cam.c +f:drivers/clk/mediatek/clk-mt8195-ccu.c +f:drivers/clk/mediatek/clk-mt8195-img.c +f:drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c +f:drivers/clk/mediatek/clk-mt8195-infra_ao.c +f:drivers/clk/mediatek/clk-mt8195-ipe.c +f:drivers/clk/mediatek/clk-mt8195-mfg.c +f:drivers/clk/mediatek/clk-mt8195-peri_ao.c +f:drivers/clk/mediatek/clk-mt8195-scp_adsp.c +f:drivers/clk/mediatek/clk-mt8195-topckgen.c +f:drivers/clk/mediatek/clk-mt8195-vdec.c +f:drivers/clk/mediatek/clk-mt8195-vdo0.c +f:drivers/clk/mediatek/clk-mt8195-vdo1.c +f:drivers/clk/mediatek/clk-mt8195-venc.c +f:drivers/clk/mediatek/clk-mt8195-vpp0.c +f:drivers/clk/mediatek/clk-mt8195-vpp1.c +f:drivers/clk/mediatek/clk-mt8195-wpe.c +f:drivers/clk/mediatek/clk-mt8365-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8365-apu.c +f:drivers/clk/mediatek/clk-mt8365-cam.c +f:drivers/clk/mediatek/clk-mt8365-mfg.c +f:drivers/clk/mediatek/clk-mt8365-mm.c +f:drivers/clk/mediatek/clk-mt8365-vdec.c +f:drivers/clk/mediatek/clk-mt8365-venc.c +f:drivers/clk/mediatek/clk-mt8365.c +f:drivers/clk/mediatek/clk-mt8516-apmixedsys.c +f:drivers/clk/mediatek/clk-mt8516-aud.c +f:drivers/clk/mediatek/clk-mt8516.c +f:drivers/clk/mediatek/clk-mtk.c +f:drivers/clk/mediatek/clk-mtk.h +f:drivers/clk/mediatek/clk-mux.c +f:drivers/clk/mediatek/clk-mux.h +f:drivers/clk/mediatek/clk-pll.c +f:drivers/clk/mediatek/clk-pll.h +f:drivers/clk/mediatek/clk-pllfh.c +f:drivers/clk/mediatek/clk-pllfh.h +f:drivers/clk/mediatek/reset.c +f:drivers/clk/mediatek/reset.h +f:drivers/clk/meson/Kconfig +f:drivers/clk/meson/Makefile +f:drivers/clk/meson/a1-peripherals.c +f:drivers/clk/meson/a1-pll.c +f:drivers/clk/meson/axg-aoclk.c +f:drivers/clk/meson/axg-audio.c +f:drivers/clk/meson/axg.c +f:drivers/clk/meson/c3-peripherals.c +f:drivers/clk/meson/c3-pll.c +f:drivers/clk/meson/clk-cpu-dyndiv.c +f:drivers/clk/meson/clk-cpu-dyndiv.h +f:drivers/clk/meson/clk-dualdiv.c +f:drivers/clk/meson/clk-dualdiv.h +f:drivers/clk/meson/clk-mpll.c +f:drivers/clk/meson/clk-mpll.h +f:drivers/clk/meson/clk-phase.c +f:drivers/clk/meson/clk-phase.h +f:drivers/clk/meson/clk-pll.c +f:drivers/clk/meson/clk-pll.h +f:drivers/clk/meson/clk-regmap.c +f:drivers/clk/meson/clk-regmap.h +f:drivers/clk/meson/g12a-aoclk.c +f:drivers/clk/meson/g12a.c +f:drivers/clk/meson/gxbb-aoclk.c +f:drivers/clk/meson/gxbb.c +f:drivers/clk/meson/meson-aoclk.c +f:drivers/clk/meson/meson-aoclk.h +f:drivers/clk/meson/meson-clkc-utils.c +f:drivers/clk/meson/meson-clkc-utils.h +f:drivers/clk/meson/meson-eeclk.c +f:drivers/clk/meson/meson-eeclk.h +f:drivers/clk/meson/meson8-ddr.c +f:drivers/clk/meson/meson8b.c +f:drivers/clk/meson/parm.h +f:drivers/clk/meson/s4-peripherals.c +f:drivers/clk/meson/s4-pll.c +f:drivers/clk/meson/sclk-div.c +f:drivers/clk/meson/sclk-div.h +f:drivers/clk/meson/vclk.c +f:drivers/clk/meson/vclk.h +f:drivers/clk/meson/vid-pll-div.c +f:drivers/clk/meson/vid-pll-div.h +f:drivers/clk/microchip/Kconfig +f:drivers/clk/microchip/Makefile +f:drivers/clk/microchip/clk-core.c +f:drivers/clk/microchip/clk-core.h +f:drivers/clk/microchip/clk-mpfs-ccc.c +f:drivers/clk/microchip/clk-mpfs.c +f:drivers/clk/microchip/clk-pic32mzda.c +f:drivers/clk/mmp/Makefile +f:drivers/clk/mmp/clk-apbc.c +f:drivers/clk/mmp/clk-apmu.c +f:drivers/clk/mmp/clk-audio.c +f:drivers/clk/mmp/clk-frac.c +f:drivers/clk/mmp/clk-gate.c +f:drivers/clk/mmp/clk-mix.c +f:drivers/clk/mmp/clk-of-mmp2.c +f:drivers/clk/mmp/clk-of-pxa168.c +f:drivers/clk/mmp/clk-of-pxa1928.c +f:drivers/clk/mmp/clk-of-pxa910.c +f:drivers/clk/mmp/clk-pll.c +f:drivers/clk/mmp/clk-pxa1908-apbc.c +f:drivers/clk/mmp/clk-pxa1908-apbcp.c +f:drivers/clk/mmp/clk-pxa1908-apmu.c +f:drivers/clk/mmp/clk-pxa1908-mpmu.c +f:drivers/clk/mmp/clk.c +f:drivers/clk/mmp/clk.h +f:drivers/clk/mmp/pwr-island.c +f:drivers/clk/mmp/reset.c +f:drivers/clk/mmp/reset.h +f:drivers/clk/mstar/Kconfig +f:drivers/clk/mstar/Makefile +f:drivers/clk/mstar/clk-msc313-cpupll.c +f:drivers/clk/mstar/clk-msc313-mpll.c +f:drivers/clk/mvebu/Kconfig +f:drivers/clk/mvebu/Makefile +f:drivers/clk/mvebu/ap-cpu-clk.c +f:drivers/clk/mvebu/ap806-system-controller.c +f:drivers/clk/mvebu/armada-370.c +f:drivers/clk/mvebu/armada-375.c +f:drivers/clk/mvebu/armada-37xx-periph.c +f:drivers/clk/mvebu/armada-37xx-tbg.c +f:drivers/clk/mvebu/armada-37xx-xtal.c +f:drivers/clk/mvebu/armada-38x.c +f:drivers/clk/mvebu/armada-39x.c +f:drivers/clk/mvebu/armada-xp.c +f:drivers/clk/mvebu/armada_ap_cp_helper.c +f:drivers/clk/mvebu/armada_ap_cp_helper.h +f:drivers/clk/mvebu/clk-corediv.c +f:drivers/clk/mvebu/clk-cpu.c +f:drivers/clk/mvebu/common.c +f:drivers/clk/mvebu/common.h +f:drivers/clk/mvebu/cp110-system-controller.c +f:drivers/clk/mvebu/dove-divider.c +f:drivers/clk/mvebu/dove-divider.h +f:drivers/clk/mvebu/dove.c +f:drivers/clk/mvebu/kirkwood.c +f:drivers/clk/mvebu/mv98dx3236.c +f:drivers/clk/mvebu/orion.c +f:drivers/clk/mxs/Makefile +f:drivers/clk/mxs/clk-div.c +f:drivers/clk/mxs/clk-frac.c +f:drivers/clk/mxs/clk-imx23.c +f:drivers/clk/mxs/clk-imx28.c +f:drivers/clk/mxs/clk-pll.c +f:drivers/clk/mxs/clk-ref.c +f:drivers/clk/mxs/clk-ssp.c +f:drivers/clk/mxs/clk.c +f:drivers/clk/mxs/clk.h +f:drivers/clk/nuvoton/Kconfig +f:drivers/clk/nuvoton/Makefile +f:drivers/clk/nuvoton/clk-ma35d1-divider.c +f:drivers/clk/nuvoton/clk-ma35d1-pll.c +f:drivers/clk/nuvoton/clk-ma35d1.c +f:drivers/clk/nuvoton/clk-ma35d1.h +f:drivers/clk/nxp/Makefile +f:drivers/clk/nxp/clk-lpc18xx-ccu.c +f:drivers/clk/nxp/clk-lpc18xx-cgu.c +f:drivers/clk/nxp/clk-lpc18xx-creg.c +f:drivers/clk/nxp/clk-lpc32xx.c +f:drivers/clk/pistachio/Kconfig +f:drivers/clk/pistachio/Makefile +f:drivers/clk/pistachio/clk-pistachio.c +f:drivers/clk/pistachio/clk-pll.c +f:drivers/clk/pistachio/clk.c +f:drivers/clk/pistachio/clk.h +f:drivers/clk/pxa/Makefile +f:drivers/clk/pxa/clk-pxa.c +f:drivers/clk/pxa/clk-pxa.h +f:drivers/clk/pxa/clk-pxa25x.c +f:drivers/clk/pxa/clk-pxa27x.c +f:drivers/clk/pxa/clk-pxa2xx.h +f:drivers/clk/pxa/clk-pxa3xx.c +f:drivers/clk/qcom/Kconfig +f:drivers/clk/qcom/Makefile +f:drivers/clk/qcom/a53-pll.c +f:drivers/clk/qcom/a7-pll.c +f:drivers/clk/qcom/apcs-msm8916.c +f:drivers/clk/qcom/apcs-msm8996.c +f:drivers/clk/qcom/apcs-sdx55.c +f:drivers/clk/qcom/apss-ipq-pll.c +f:drivers/clk/qcom/apss-ipq6018.c +f:drivers/clk/qcom/camcc-milos.c +f:drivers/clk/qcom/camcc-qcs615.c +f:drivers/clk/qcom/camcc-sa8775p.c +f:drivers/clk/qcom/camcc-sc7180.c +f:drivers/clk/qcom/camcc-sc7280.c +f:drivers/clk/qcom/camcc-sc8180x.c +f:drivers/clk/qcom/camcc-sc8280xp.c +f:drivers/clk/qcom/camcc-sdm845.c +f:drivers/clk/qcom/camcc-sm4450.c +f:drivers/clk/qcom/camcc-sm6350.c +f:drivers/clk/qcom/camcc-sm7150.c +f:drivers/clk/qcom/camcc-sm8150.c +f:drivers/clk/qcom/camcc-sm8250.c +f:drivers/clk/qcom/camcc-sm8450.c +f:drivers/clk/qcom/camcc-sm8550.c +f:drivers/clk/qcom/camcc-sm8650.c +f:drivers/clk/qcom/camcc-x1e80100.c +f:drivers/clk/qcom/clk-alpha-pll.c +f:drivers/clk/qcom/clk-alpha-pll.h +f:drivers/clk/qcom/clk-branch.c +f:drivers/clk/qcom/clk-branch.h +f:drivers/clk/qcom/clk-cbf-8996.c +f:drivers/clk/qcom/clk-cpu-8996.c +f:drivers/clk/qcom/clk-hfpll.c +f:drivers/clk/qcom/clk-hfpll.h +f:drivers/clk/qcom/clk-krait.c +f:drivers/clk/qcom/clk-krait.h +f:drivers/clk/qcom/clk-pll.c +f:drivers/clk/qcom/clk-pll.h +f:drivers/clk/qcom/clk-rcg.c +f:drivers/clk/qcom/clk-rcg.h +f:drivers/clk/qcom/clk-rcg2.c +f:drivers/clk/qcom/clk-regmap-divider.c +f:drivers/clk/qcom/clk-regmap-divider.h +f:drivers/clk/qcom/clk-regmap-mux-div.c +f:drivers/clk/qcom/clk-regmap-mux-div.h +f:drivers/clk/qcom/clk-regmap-mux.c +f:drivers/clk/qcom/clk-regmap-mux.h +f:drivers/clk/qcom/clk-regmap-phy-mux.c +f:drivers/clk/qcom/clk-regmap-phy-mux.h +f:drivers/clk/qcom/clk-regmap.c +f:drivers/clk/qcom/clk-regmap.h +f:drivers/clk/qcom/clk-rpm.c +f:drivers/clk/qcom/clk-rpmh.c +f:drivers/clk/qcom/clk-smd-rpm.c +f:drivers/clk/qcom/clk-spmi-pmic-div.c +f:drivers/clk/qcom/common.c +f:drivers/clk/qcom/common.h +f:drivers/clk/qcom/dispcc-milos.c +f:drivers/clk/qcom/dispcc-qcm2290.c +f:drivers/clk/qcom/dispcc-qcs615.c +f:drivers/clk/qcom/dispcc-sc7180.c +f:drivers/clk/qcom/dispcc-sc7280.c +f:drivers/clk/qcom/dispcc-sc8280xp.c +f:drivers/clk/qcom/dispcc-sdm845.c +f:drivers/clk/qcom/dispcc-sm4450.c +f:drivers/clk/qcom/dispcc-sm6115.c +f:drivers/clk/qcom/dispcc-sm6125.c +f:drivers/clk/qcom/dispcc-sm6350.c +f:drivers/clk/qcom/dispcc-sm6375.c +f:drivers/clk/qcom/dispcc-sm7150.c +f:drivers/clk/qcom/dispcc-sm8250.c +f:drivers/clk/qcom/dispcc-sm8450.c +f:drivers/clk/qcom/dispcc-sm8550.c +f:drivers/clk/qcom/dispcc-sm8750.c +f:drivers/clk/qcom/dispcc-x1e80100.c +f:drivers/clk/qcom/dispcc0-sa8775p.c +f:drivers/clk/qcom/dispcc1-sa8775p.c +f:drivers/clk/qcom/ecpricc-qdu1000.c +f:drivers/clk/qcom/gcc-apq8084.c +f:drivers/clk/qcom/gcc-ipq4019.c +f:drivers/clk/qcom/gcc-ipq5018.c +f:drivers/clk/qcom/gcc-ipq5332.c +f:drivers/clk/qcom/gcc-ipq5424.c +f:drivers/clk/qcom/gcc-ipq6018.c +f:drivers/clk/qcom/gcc-ipq806x.c +f:drivers/clk/qcom/gcc-ipq8074.c +f:drivers/clk/qcom/gcc-ipq9574.c +f:drivers/clk/qcom/gcc-mdm9607.c +f:drivers/clk/qcom/gcc-mdm9615.c +f:drivers/clk/qcom/gcc-milos.c +f:drivers/clk/qcom/gcc-msm8660.c +f:drivers/clk/qcom/gcc-msm8909.c +f:drivers/clk/qcom/gcc-msm8916.c +f:drivers/clk/qcom/gcc-msm8917.c +f:drivers/clk/qcom/gcc-msm8939.c +f:drivers/clk/qcom/gcc-msm8953.c +f:drivers/clk/qcom/gcc-msm8960.c +f:drivers/clk/qcom/gcc-msm8974.c +f:drivers/clk/qcom/gcc-msm8976.c +f:drivers/clk/qcom/gcc-msm8994.c +f:drivers/clk/qcom/gcc-msm8996.c +f:drivers/clk/qcom/gcc-msm8998.c +f:drivers/clk/qcom/gcc-qcm2290.c +f:drivers/clk/qcom/gcc-qcs404.c +f:drivers/clk/qcom/gcc-qcs615.c +f:drivers/clk/qcom/gcc-qcs8300.c +f:drivers/clk/qcom/gcc-qdu1000.c +f:drivers/clk/qcom/gcc-sa8775p.c +f:drivers/clk/qcom/gcc-sar2130p.c +f:drivers/clk/qcom/gcc-sc7180.c +f:drivers/clk/qcom/gcc-sc7280.c +f:drivers/clk/qcom/gcc-sc8180x.c +f:drivers/clk/qcom/gcc-sc8280xp.c +f:drivers/clk/qcom/gcc-sdm660.c +f:drivers/clk/qcom/gcc-sdm845.c +f:drivers/clk/qcom/gcc-sdx55.c +f:drivers/clk/qcom/gcc-sdx65.c +f:drivers/clk/qcom/gcc-sdx75.c +f:drivers/clk/qcom/gcc-sm4450.c +f:drivers/clk/qcom/gcc-sm6115.c +f:drivers/clk/qcom/gcc-sm6125.c +f:drivers/clk/qcom/gcc-sm6350.c +f:drivers/clk/qcom/gcc-sm6375.c +f:drivers/clk/qcom/gcc-sm7150.c +f:drivers/clk/qcom/gcc-sm8150.c +f:drivers/clk/qcom/gcc-sm8250.c +f:drivers/clk/qcom/gcc-sm8350.c +f:drivers/clk/qcom/gcc-sm8450.c +f:drivers/clk/qcom/gcc-sm8550.c +f:drivers/clk/qcom/gcc-sm8650.c +f:drivers/clk/qcom/gcc-sm8750.c +f:drivers/clk/qcom/gcc-x1e80100.c +f:drivers/clk/qcom/gdsc.c +f:drivers/clk/qcom/gdsc.h +f:drivers/clk/qcom/gpucc-milos.c +f:drivers/clk/qcom/gpucc-msm8998.c +f:drivers/clk/qcom/gpucc-qcm2290.c +f:drivers/clk/qcom/gpucc-qcs615.c +f:drivers/clk/qcom/gpucc-sa8775p.c +f:drivers/clk/qcom/gpucc-sar2130p.c +f:drivers/clk/qcom/gpucc-sc7180.c +f:drivers/clk/qcom/gpucc-sc7280.c +f:drivers/clk/qcom/gpucc-sc8280xp.c +f:drivers/clk/qcom/gpucc-sdm660.c +f:drivers/clk/qcom/gpucc-sdm845.c +f:drivers/clk/qcom/gpucc-sm4450.c +f:drivers/clk/qcom/gpucc-sm6115.c +f:drivers/clk/qcom/gpucc-sm6125.c +f:drivers/clk/qcom/gpucc-sm6350.c +f:drivers/clk/qcom/gpucc-sm6375.c +f:drivers/clk/qcom/gpucc-sm8150.c +f:drivers/clk/qcom/gpucc-sm8250.c +f:drivers/clk/qcom/gpucc-sm8350.c +f:drivers/clk/qcom/gpucc-sm8450.c +f:drivers/clk/qcom/gpucc-sm8550.c +f:drivers/clk/qcom/gpucc-sm8650.c +f:drivers/clk/qcom/gpucc-x1e80100.c +f:drivers/clk/qcom/gpucc-x1p42100.c +f:drivers/clk/qcom/hfpll.c +f:drivers/clk/qcom/ipq-cmn-pll.c +f:drivers/clk/qcom/kpss-xcc.c +f:drivers/clk/qcom/krait-cc.c +f:drivers/clk/qcom/lcc-ipq806x.c +f:drivers/clk/qcom/lcc-msm8960.c +f:drivers/clk/qcom/lpass-gfm-sm8250.c +f:drivers/clk/qcom/lpassaudiocc-sc7280.c +f:drivers/clk/qcom/lpasscc-sc7280.c +f:drivers/clk/qcom/lpasscc-sc8280xp.c +f:drivers/clk/qcom/lpasscc-sdm845.c +f:drivers/clk/qcom/lpasscc-sm6115.c +f:drivers/clk/qcom/lpasscorecc-sc7180.c +f:drivers/clk/qcom/lpasscorecc-sc7280.c +f:drivers/clk/qcom/mmcc-apq8084.c +f:drivers/clk/qcom/mmcc-msm8960.c +f:drivers/clk/qcom/mmcc-msm8974.c +f:drivers/clk/qcom/mmcc-msm8994.c +f:drivers/clk/qcom/mmcc-msm8996.c +f:drivers/clk/qcom/mmcc-msm8998.c +f:drivers/clk/qcom/mmcc-sdm660.c +f:drivers/clk/qcom/nsscc-ipq9574.c +f:drivers/clk/qcom/nsscc-qca8k.c +f:drivers/clk/qcom/q6sstop-qcs404.c +f:drivers/clk/qcom/reset.c +f:drivers/clk/qcom/reset.h +f:drivers/clk/qcom/tcsrcc-sm8550.c +f:drivers/clk/qcom/tcsrcc-sm8650.c +f:drivers/clk/qcom/tcsrcc-sm8750.c +f:drivers/clk/qcom/tcsrcc-x1e80100.c +f:drivers/clk/qcom/turingcc-qcs404.c +f:drivers/clk/qcom/videocc-milos.c +f:drivers/clk/qcom/videocc-qcs615.c +f:drivers/clk/qcom/videocc-sa8775p.c +f:drivers/clk/qcom/videocc-sc7180.c +f:drivers/clk/qcom/videocc-sc7280.c +f:drivers/clk/qcom/videocc-sdm845.c +f:drivers/clk/qcom/videocc-sm6350.c +f:drivers/clk/qcom/videocc-sm7150.c +f:drivers/clk/qcom/videocc-sm8150.c +f:drivers/clk/qcom/videocc-sm8250.c +f:drivers/clk/qcom/videocc-sm8350.c +f:drivers/clk/qcom/videocc-sm8450.c +f:drivers/clk/qcom/videocc-sm8550.c +f:drivers/clk/ralink/Kconfig +f:drivers/clk/ralink/Makefile +f:drivers/clk/ralink/clk-mt7621.c +f:drivers/clk/ralink/clk-mtmips.c +f:drivers/clk/renesas/Kconfig +f:drivers/clk/renesas/Makefile +f:drivers/clk/renesas/clk-div6.c +f:drivers/clk/renesas/clk-div6.h +f:drivers/clk/renesas/clk-emev2.c +f:drivers/clk/renesas/clk-mstp.c +f:drivers/clk/renesas/clk-r8a73a4.c +f:drivers/clk/renesas/clk-r8a7740.c +f:drivers/clk/renesas/clk-r8a7778.c +f:drivers/clk/renesas/clk-r8a7779.c +f:drivers/clk/renesas/clk-rz.c +f:drivers/clk/renesas/clk-sh73a0.c +f:drivers/clk/renesas/clk-vbattb.c +f:drivers/clk/renesas/r7s9210-cpg-mssr.c +f:drivers/clk/renesas/r8a7742-cpg-mssr.c +f:drivers/clk/renesas/r8a7743-cpg-mssr.c +f:drivers/clk/renesas/r8a7745-cpg-mssr.c +f:drivers/clk/renesas/r8a77470-cpg-mssr.c +f:drivers/clk/renesas/r8a774a1-cpg-mssr.c +f:drivers/clk/renesas/r8a774b1-cpg-mssr.c +f:drivers/clk/renesas/r8a774c0-cpg-mssr.c +f:drivers/clk/renesas/r8a774e1-cpg-mssr.c +f:drivers/clk/renesas/r8a7790-cpg-mssr.c +f:drivers/clk/renesas/r8a7791-cpg-mssr.c +f:drivers/clk/renesas/r8a7792-cpg-mssr.c +f:drivers/clk/renesas/r8a7794-cpg-mssr.c +f:drivers/clk/renesas/r8a7795-cpg-mssr.c +f:drivers/clk/renesas/r8a7796-cpg-mssr.c +f:drivers/clk/renesas/r8a77965-cpg-mssr.c +f:drivers/clk/renesas/r8a77970-cpg-mssr.c +f:drivers/clk/renesas/r8a77980-cpg-mssr.c +f:drivers/clk/renesas/r8a77990-cpg-mssr.c +f:drivers/clk/renesas/r8a77995-cpg-mssr.c +f:drivers/clk/renesas/r8a779a0-cpg-mssr.c +f:drivers/clk/renesas/r8a779f0-cpg-mssr.c +f:drivers/clk/renesas/r8a779g0-cpg-mssr.c +f:drivers/clk/renesas/r8a779h0-cpg-mssr.c +f:drivers/clk/renesas/r9a06g032-clocks.c +f:drivers/clk/renesas/r9a07g043-cpg.c +f:drivers/clk/renesas/r9a07g044-cpg.c +f:drivers/clk/renesas/r9a08g045-cpg.c +f:drivers/clk/renesas/r9a09g011-cpg.c +f:drivers/clk/renesas/r9a09g047-cpg.c +f:drivers/clk/renesas/r9a09g056-cpg.c +f:drivers/clk/renesas/r9a09g057-cpg.c +f:drivers/clk/renesas/r9a09g077-cpg.c +f:drivers/clk/renesas/rcar-cpg-lib.c +f:drivers/clk/renesas/rcar-cpg-lib.h +f:drivers/clk/renesas/rcar-gen2-cpg.c +f:drivers/clk/renesas/rcar-gen2-cpg.h +f:drivers/clk/renesas/rcar-gen3-cpg.c +f:drivers/clk/renesas/rcar-gen3-cpg.h +f:drivers/clk/renesas/rcar-gen4-cpg.c +f:drivers/clk/renesas/rcar-gen4-cpg.h +f:drivers/clk/renesas/rcar-usb2-clock-sel.c +f:drivers/clk/renesas/renesas-cpg-mssr.c +f:drivers/clk/renesas/renesas-cpg-mssr.h +f:drivers/clk/renesas/rzg2l-cpg.c +f:drivers/clk/renesas/rzg2l-cpg.h +f:drivers/clk/renesas/rzv2h-cpg.c +f:drivers/clk/renesas/rzv2h-cpg.h +f:drivers/clk/rockchip/Kconfig +f:drivers/clk/rockchip/Makefile +f:drivers/clk/rockchip/clk-cpu.c +f:drivers/clk/rockchip/clk-ddr.c +f:drivers/clk/rockchip/clk-gate-grf.c +f:drivers/clk/rockchip/clk-half-divider.c +f:drivers/clk/rockchip/clk-inverter.c +f:drivers/clk/rockchip/clk-mmc-phase.c +f:drivers/clk/rockchip/clk-muxgrf.c +f:drivers/clk/rockchip/clk-pll.c +f:drivers/clk/rockchip/clk-px30.c +f:drivers/clk/rockchip/clk-rk3036.c +f:drivers/clk/rockchip/clk-rk3128.c +f:drivers/clk/rockchip/clk-rk3188.c +f:drivers/clk/rockchip/clk-rk3228.c +f:drivers/clk/rockchip/clk-rk3288.c +f:drivers/clk/rockchip/clk-rk3308.c +f:drivers/clk/rockchip/clk-rk3328.c +f:drivers/clk/rockchip/clk-rk3368.c +f:drivers/clk/rockchip/clk-rk3399.c +f:drivers/clk/rockchip/clk-rk3528.c +f:drivers/clk/rockchip/clk-rk3562.c +f:drivers/clk/rockchip/clk-rk3568.c +f:drivers/clk/rockchip/clk-rk3576.c +f:drivers/clk/rockchip/clk-rk3588.c +f:drivers/clk/rockchip/clk-rv1108.c +f:drivers/clk/rockchip/clk-rv1126.c +f:drivers/clk/rockchip/clk.c +f:drivers/clk/rockchip/clk.h +f:drivers/clk/rockchip/gate-link.c +f:drivers/clk/rockchip/rst-rk3528.c +f:drivers/clk/rockchip/rst-rk3562.c +f:drivers/clk/rockchip/rst-rk3576.c +f:drivers/clk/rockchip/rst-rk3588.c +f:drivers/clk/rockchip/softrst.c +f:drivers/clk/samsung/Kconfig +f:drivers/clk/samsung/Makefile +f:drivers/clk/samsung/clk-cpu.c +f:drivers/clk/samsung/clk-cpu.h +f:drivers/clk/samsung/clk-exynos-arm64.c +f:drivers/clk/samsung/clk-exynos-arm64.h +f:drivers/clk/samsung/clk-exynos-audss.c +f:drivers/clk/samsung/clk-exynos-clkout.c +f:drivers/clk/samsung/clk-exynos2200.c +f:drivers/clk/samsung/clk-exynos3250.c +f:drivers/clk/samsung/clk-exynos4.c +f:drivers/clk/samsung/clk-exynos4412-isp.c +f:drivers/clk/samsung/clk-exynos5-subcmu.c +f:drivers/clk/samsung/clk-exynos5-subcmu.h +f:drivers/clk/samsung/clk-exynos5250.c +f:drivers/clk/samsung/clk-exynos5260.c +f:drivers/clk/samsung/clk-exynos5260.h +f:drivers/clk/samsung/clk-exynos5410.c +f:drivers/clk/samsung/clk-exynos5420.c +f:drivers/clk/samsung/clk-exynos5433.c +f:drivers/clk/samsung/clk-exynos7.c +f:drivers/clk/samsung/clk-exynos7870.c +f:drivers/clk/samsung/clk-exynos7885.c +f:drivers/clk/samsung/clk-exynos850.c +f:drivers/clk/samsung/clk-exynos8895.c +f:drivers/clk/samsung/clk-exynos990.c +f:drivers/clk/samsung/clk-exynosautov9.c +f:drivers/clk/samsung/clk-exynosautov920.c +f:drivers/clk/samsung/clk-fsd.c +f:drivers/clk/samsung/clk-gs101.c +f:drivers/clk/samsung/clk-pll.c +f:drivers/clk/samsung/clk-pll.h +f:drivers/clk/samsung/clk-s3c64xx.c +f:drivers/clk/samsung/clk-s5pv210-audss.c +f:drivers/clk/samsung/clk-s5pv210.c +f:drivers/clk/samsung/clk.c +f:drivers/clk/samsung/clk.h +f:drivers/clk/sifive/Kconfig +f:drivers/clk/sifive/Makefile +f:drivers/clk/sifive/fu540-prci.h +f:drivers/clk/sifive/fu740-prci.h +f:drivers/clk/sifive/sifive-prci.c +f:drivers/clk/sifive/sifive-prci.h +f:drivers/clk/socfpga/Kconfig +f:drivers/clk/socfpga/Makefile +f:drivers/clk/socfpga/clk-agilex.c +f:drivers/clk/socfpga/clk-gate-a10.c +f:drivers/clk/socfpga/clk-gate-s10.c +f:drivers/clk/socfpga/clk-gate.c +f:drivers/clk/socfpga/clk-periph-a10.c +f:drivers/clk/socfpga/clk-periph-s10.c +f:drivers/clk/socfpga/clk-periph.c +f:drivers/clk/socfpga/clk-pll-a10.c +f:drivers/clk/socfpga/clk-pll-s10.c +f:drivers/clk/socfpga/clk-pll.c +f:drivers/clk/socfpga/clk-s10.c +f:drivers/clk/socfpga/clk.c +f:drivers/clk/socfpga/clk.h +f:drivers/clk/socfpga/stratix10-clk.h +f:drivers/clk/sophgo/Kconfig +f:drivers/clk/sophgo/Makefile +f:drivers/clk/sophgo/clk-cv1800.c +f:drivers/clk/sophgo/clk-cv1800.h +f:drivers/clk/sophgo/clk-cv18xx-common.c +f:drivers/clk/sophgo/clk-cv18xx-common.h +f:drivers/clk/sophgo/clk-cv18xx-ip.c +f:drivers/clk/sophgo/clk-cv18xx-ip.h +f:drivers/clk/sophgo/clk-cv18xx-pll.c +f:drivers/clk/sophgo/clk-cv18xx-pll.h +f:drivers/clk/sophgo/clk-sg2042-clkgen.c +f:drivers/clk/sophgo/clk-sg2042-pll.c +f:drivers/clk/sophgo/clk-sg2042-rpgate.c +f:drivers/clk/sophgo/clk-sg2042.h +f:drivers/clk/sophgo/clk-sg2044-pll.c +f:drivers/clk/sophgo/clk-sg2044.c +f:drivers/clk/spacemit/Kconfig +f:drivers/clk/spacemit/Makefile +f:drivers/clk/spacemit/ccu-k1.c +f:drivers/clk/spacemit/ccu_common.h +f:drivers/clk/spacemit/ccu_ddn.c +f:drivers/clk/spacemit/ccu_ddn.h +f:drivers/clk/spacemit/ccu_mix.c +f:drivers/clk/spacemit/ccu_mix.h +f:drivers/clk/spacemit/ccu_pll.c +f:drivers/clk/spacemit/ccu_pll.h +f:drivers/clk/spear/Makefile +f:drivers/clk/spear/clk-aux-synth.c +f:drivers/clk/spear/clk-frac-synth.c +f:drivers/clk/spear/clk-gpt-synth.c +f:drivers/clk/spear/clk-vco-pll.c +f:drivers/clk/spear/clk.c +f:drivers/clk/spear/clk.h +f:drivers/clk/spear/spear1310_clock.c +f:drivers/clk/spear/spear1340_clock.c +f:drivers/clk/spear/spear3xx_clock.c +f:drivers/clk/spear/spear6xx_clock.c +f:drivers/clk/sprd/Kconfig +f:drivers/clk/sprd/Makefile +f:drivers/clk/sprd/common.c +f:drivers/clk/sprd/common.h +f:drivers/clk/sprd/composite.c +f:drivers/clk/sprd/composite.h +f:drivers/clk/sprd/div.c +f:drivers/clk/sprd/div.h +f:drivers/clk/sprd/gate.c +f:drivers/clk/sprd/gate.h +f:drivers/clk/sprd/mux.c +f:drivers/clk/sprd/mux.h +f:drivers/clk/sprd/pll.c +f:drivers/clk/sprd/pll.h +f:drivers/clk/sprd/sc9860-clk.c +f:drivers/clk/sprd/sc9863a-clk.c +f:drivers/clk/sprd/ums512-clk.c +f:drivers/clk/st/Makefile +f:drivers/clk/st/clk-flexgen.c +f:drivers/clk/st/clkgen-fsyn.c +f:drivers/clk/st/clkgen-mux.c +f:drivers/clk/st/clkgen-pll.c +f:drivers/clk/st/clkgen.h +f:drivers/clk/starfive/Kconfig +f:drivers/clk/starfive/Makefile +f:drivers/clk/starfive/clk-starfive-jh7100-audio.c +f:drivers/clk/starfive/clk-starfive-jh7100.c +f:drivers/clk/starfive/clk-starfive-jh7110-aon.c +f:drivers/clk/starfive/clk-starfive-jh7110-isp.c +f:drivers/clk/starfive/clk-starfive-jh7110-pll.c +f:drivers/clk/starfive/clk-starfive-jh7110-stg.c +f:drivers/clk/starfive/clk-starfive-jh7110-sys.c +f:drivers/clk/starfive/clk-starfive-jh7110-vout.c +f:drivers/clk/starfive/clk-starfive-jh7110.h +f:drivers/clk/starfive/clk-starfive-jh71x0.c +f:drivers/clk/starfive/clk-starfive-jh71x0.h +f:drivers/clk/stm32/Kconfig +f:drivers/clk/stm32/Makefile +f:drivers/clk/stm32/clk-stm32-core.c +f:drivers/clk/stm32/clk-stm32-core.h +f:drivers/clk/stm32/clk-stm32mp1.c +f:drivers/clk/stm32/clk-stm32mp13.c +f:drivers/clk/stm32/clk-stm32mp25.c +f:drivers/clk/stm32/reset-stm32.c +f:drivers/clk/stm32/reset-stm32.h +f:drivers/clk/stm32/stm32mp13_rcc.h +f:drivers/clk/stm32/stm32mp25_rcc.h +f:drivers/clk/sunxi-ng/Kconfig +f:drivers/clk/sunxi-ng/Makefile +f:drivers/clk/sunxi-ng/ccu-sun20i-d1-r.c +f:drivers/clk/sunxi-ng/ccu-sun20i-d1-r.h +f:drivers/clk/sunxi-ng/ccu-sun20i-d1.c +f:drivers/clk/sunxi-ng/ccu-sun20i-d1.h +f:drivers/clk/sunxi-ng/ccu-sun4i-a10.c +f:drivers/clk/sunxi-ng/ccu-sun4i-a10.h +f:drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c +f:drivers/clk/sunxi-ng/ccu-sun50i-a100-r.h +f:drivers/clk/sunxi-ng/ccu-sun50i-a100.c +f:drivers/clk/sunxi-ng/ccu-sun50i-a100.h +f:drivers/clk/sunxi-ng/ccu-sun50i-a64.c +f:drivers/clk/sunxi-ng/ccu-sun50i-a64.h +f:drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c +f:drivers/clk/sunxi-ng/ccu-sun50i-h6-r.h +f:drivers/clk/sunxi-ng/ccu-sun50i-h6.c +f:drivers/clk/sunxi-ng/ccu-sun50i-h6.h +f:drivers/clk/sunxi-ng/ccu-sun50i-h616.c +f:drivers/clk/sunxi-ng/ccu-sun50i-h616.h +f:drivers/clk/sunxi-ng/ccu-sun55i-a523-r.c +f:drivers/clk/sunxi-ng/ccu-sun55i-a523-r.h +f:drivers/clk/sunxi-ng/ccu-sun55i-a523.c +f:drivers/clk/sunxi-ng/ccu-sun55i-a523.h +f:drivers/clk/sunxi-ng/ccu-sun5i.c +f:drivers/clk/sunxi-ng/ccu-sun5i.h +f:drivers/clk/sunxi-ng/ccu-sun6i-a31.c +f:drivers/clk/sunxi-ng/ccu-sun6i-a31.h +f:drivers/clk/sunxi-ng/ccu-sun6i-rtc.c +f:drivers/clk/sunxi-ng/ccu-sun6i-rtc.h +f:drivers/clk/sunxi-ng/ccu-sun8i-a23-a33.h +f:drivers/clk/sunxi-ng/ccu-sun8i-a23.c +f:drivers/clk/sunxi-ng/ccu-sun8i-a33.c +f:drivers/clk/sunxi-ng/ccu-sun8i-a83t.c +f:drivers/clk/sunxi-ng/ccu-sun8i-a83t.h +f:drivers/clk/sunxi-ng/ccu-sun8i-de2.c +f:drivers/clk/sunxi-ng/ccu-sun8i-de2.h +f:drivers/clk/sunxi-ng/ccu-sun8i-h3.c +f:drivers/clk/sunxi-ng/ccu-sun8i-h3.h +f:drivers/clk/sunxi-ng/ccu-sun8i-r.c +f:drivers/clk/sunxi-ng/ccu-sun8i-r.h +f:drivers/clk/sunxi-ng/ccu-sun8i-r40.c +f:drivers/clk/sunxi-ng/ccu-sun8i-r40.h +f:drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +f:drivers/clk/sunxi-ng/ccu-sun8i-v3s.h +f:drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c +f:drivers/clk/sunxi-ng/ccu-sun9i-a80-de.h +f:drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c +f:drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.h +f:drivers/clk/sunxi-ng/ccu-sun9i-a80.c +f:drivers/clk/sunxi-ng/ccu-sun9i-a80.h +f:drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c +f:drivers/clk/sunxi-ng/ccu-suniv-f1c100s.h +f:drivers/clk/sunxi-ng/ccu_common.c +f:drivers/clk/sunxi-ng/ccu_common.h +f:drivers/clk/sunxi-ng/ccu_div.c +f:drivers/clk/sunxi-ng/ccu_div.h +f:drivers/clk/sunxi-ng/ccu_frac.c +f:drivers/clk/sunxi-ng/ccu_frac.h +f:drivers/clk/sunxi-ng/ccu_gate.c +f:drivers/clk/sunxi-ng/ccu_gate.h +f:drivers/clk/sunxi-ng/ccu_mmc_timing.c +f:drivers/clk/sunxi-ng/ccu_mp.c +f:drivers/clk/sunxi-ng/ccu_mp.h +f:drivers/clk/sunxi-ng/ccu_mult.c +f:drivers/clk/sunxi-ng/ccu_mult.h +f:drivers/clk/sunxi-ng/ccu_mux.c +f:drivers/clk/sunxi-ng/ccu_mux.h +f:drivers/clk/sunxi-ng/ccu_nk.c +f:drivers/clk/sunxi-ng/ccu_nk.h +f:drivers/clk/sunxi-ng/ccu_nkm.c +f:drivers/clk/sunxi-ng/ccu_nkm.h +f:drivers/clk/sunxi-ng/ccu_nkmp.c +f:drivers/clk/sunxi-ng/ccu_nkmp.h +f:drivers/clk/sunxi-ng/ccu_nm.c +f:drivers/clk/sunxi-ng/ccu_nm.h +f:drivers/clk/sunxi-ng/ccu_phase.c +f:drivers/clk/sunxi-ng/ccu_phase.h +f:drivers/clk/sunxi-ng/ccu_reset.c +f:drivers/clk/sunxi-ng/ccu_reset.h +f:drivers/clk/sunxi-ng/ccu_sdm.c +f:drivers/clk/sunxi-ng/ccu_sdm.h +f:drivers/clk/sunxi/Kconfig +f:drivers/clk/sunxi/Makefile +f:drivers/clk/sunxi/clk-a10-codec.c +f:drivers/clk/sunxi/clk-a10-hosc.c +f:drivers/clk/sunxi/clk-a10-mod1.c +f:drivers/clk/sunxi/clk-a10-pll2.c +f:drivers/clk/sunxi/clk-a10-ve.c +f:drivers/clk/sunxi/clk-a20-gmac.c +f:drivers/clk/sunxi/clk-factors.c +f:drivers/clk/sunxi/clk-factors.h +f:drivers/clk/sunxi/clk-mod0.c +f:drivers/clk/sunxi/clk-simple-gates.c +f:drivers/clk/sunxi/clk-sun4i-display.c +f:drivers/clk/sunxi/clk-sun4i-pll3.c +f:drivers/clk/sunxi/clk-sun4i-tcon-ch1.c +f:drivers/clk/sunxi/clk-sun6i-apb0-gates.c +f:drivers/clk/sunxi/clk-sun6i-apb0.c +f:drivers/clk/sunxi/clk-sun6i-ar100.c +f:drivers/clk/sunxi/clk-sun8i-apb0.c +f:drivers/clk/sunxi/clk-sun8i-bus-gates.c +f:drivers/clk/sunxi/clk-sun8i-mbus.c +f:drivers/clk/sunxi/clk-sun9i-core.c +f:drivers/clk/sunxi/clk-sun9i-cpus.c +f:drivers/clk/sunxi/clk-sun9i-mmc.c +f:drivers/clk/sunxi/clk-sunxi.c +f:drivers/clk/sunxi/clk-usb.c +f:drivers/clk/tegra/Kconfig +f:drivers/clk/tegra/Makefile +f:drivers/clk/tegra/clk-audio-sync.c +f:drivers/clk/tegra/clk-bpmp.c +f:drivers/clk/tegra/clk-device.c +f:drivers/clk/tegra/clk-dfll.c +f:drivers/clk/tegra/clk-dfll.h +f:drivers/clk/tegra/clk-divider.c +f:drivers/clk/tegra/clk-id.h +f:drivers/clk/tegra/clk-periph-fixed.c +f:drivers/clk/tegra/clk-periph-gate.c +f:drivers/clk/tegra/clk-periph.c +f:drivers/clk/tegra/clk-pll-out.c +f:drivers/clk/tegra/clk-pll.c +f:drivers/clk/tegra/clk-sdmmc-mux.c +f:drivers/clk/tegra/clk-super.c +f:drivers/clk/tegra/clk-tegra-audio.c +f:drivers/clk/tegra/clk-tegra-fixed.c +f:drivers/clk/tegra/clk-tegra-periph.c +f:drivers/clk/tegra/clk-tegra-super-cclk.c +f:drivers/clk/tegra/clk-tegra-super-gen4.c +f:drivers/clk/tegra/clk-tegra114.c +f:drivers/clk/tegra/clk-tegra124-dfll-fcpu.c +f:drivers/clk/tegra/clk-tegra124-emc.c +f:drivers/clk/tegra/clk-tegra124.c +f:drivers/clk/tegra/clk-tegra20-emc.c +f:drivers/clk/tegra/clk-tegra20.c +f:drivers/clk/tegra/clk-tegra210-emc.c +f:drivers/clk/tegra/clk-tegra210.c +f:drivers/clk/tegra/clk-tegra30.c +f:drivers/clk/tegra/clk-utils.c +f:drivers/clk/tegra/clk.c +f:drivers/clk/tegra/clk.h +f:drivers/clk/tegra/cvb.c +f:drivers/clk/tegra/cvb.h +f:drivers/clk/thead/Kconfig +f:drivers/clk/thead/Makefile +f:drivers/clk/thead/clk-th1520-ap.c +f:drivers/clk/ti/Kconfig +f:drivers/clk/ti/Makefile +f:drivers/clk/ti/adpll.c +f:drivers/clk/ti/apll.c +f:drivers/clk/ti/autoidle.c +f:drivers/clk/ti/clk-2xxx.c +f:drivers/clk/ti/clk-33xx.c +f:drivers/clk/ti/clk-3xxx.c +f:drivers/clk/ti/clk-43xx.c +f:drivers/clk/ti/clk-44xx.c +f:drivers/clk/ti/clk-54xx.c +f:drivers/clk/ti/clk-7xx.c +f:drivers/clk/ti/clk-814x.c +f:drivers/clk/ti/clk-816x.c +f:drivers/clk/ti/clk-dra7-atl.c +f:drivers/clk/ti/clk.c +f:drivers/clk/ti/clkctrl.c +f:drivers/clk/ti/clkt_dflt.c +f:drivers/clk/ti/clkt_dpll.c +f:drivers/clk/ti/clkt_iclk.c +f:drivers/clk/ti/clock.h +f:drivers/clk/ti/clockdomain.c +f:drivers/clk/ti/composite.c +f:drivers/clk/ti/divider.c +f:drivers/clk/ti/dpll.c +f:drivers/clk/ti/dpll3xxx.c +f:drivers/clk/ti/dpll44xx.c +f:drivers/clk/ti/fapll.c +f:drivers/clk/ti/fixed-factor.c +f:drivers/clk/ti/gate.c +f:drivers/clk/ti/interface.c +f:drivers/clk/ti/mux.c +f:drivers/clk/uniphier/Kconfig +f:drivers/clk/uniphier/Makefile +f:drivers/clk/uniphier/clk-uniphier-core.c +f:drivers/clk/uniphier/clk-uniphier-cpugear.c +f:drivers/clk/uniphier/clk-uniphier-fixed-factor.c +f:drivers/clk/uniphier/clk-uniphier-fixed-rate.c +f:drivers/clk/uniphier/clk-uniphier-gate.c +f:drivers/clk/uniphier/clk-uniphier-mio.c +f:drivers/clk/uniphier/clk-uniphier-mux.c +f:drivers/clk/uniphier/clk-uniphier-peri.c +f:drivers/clk/uniphier/clk-uniphier-sys.c +f:drivers/clk/uniphier/clk-uniphier.h +f:drivers/clk/ux500/Makefile +f:drivers/clk/ux500/abx500-clk.c +f:drivers/clk/ux500/clk-prcc.c +f:drivers/clk/ux500/clk-prcmu.c +f:drivers/clk/ux500/clk-sysctrl.c +f:drivers/clk/ux500/clk.h +f:drivers/clk/ux500/prcc.h +f:drivers/clk/ux500/reset-prcc.c +f:drivers/clk/ux500/reset-prcc.h +f:drivers/clk/ux500/u8500_of_clk.c +f:drivers/clk/versatile/Kconfig +f:drivers/clk/versatile/Makefile +f:drivers/clk/versatile/clk-icst.c +f:drivers/clk/versatile/clk-icst.h +f:drivers/clk/versatile/clk-impd1.c +f:drivers/clk/versatile/clk-sp810.c +f:drivers/clk/versatile/clk-versatile.c +f:drivers/clk/versatile/clk-vexpress-osc.c +f:drivers/clk/versatile/icst.c +f:drivers/clk/versatile/icst.h +f:drivers/clk/visconti/Kconfig +f:drivers/clk/visconti/Makefile +f:drivers/clk/visconti/clkc-tmpv770x.c +f:drivers/clk/visconti/clkc.c +f:drivers/clk/visconti/clkc.h +f:drivers/clk/visconti/pll-tmpv770x.c +f:drivers/clk/visconti/pll.c +f:drivers/clk/visconti/pll.h +f:drivers/clk/visconti/reset.c +f:drivers/clk/visconti/reset.h +f:drivers/clk/x86/Kconfig +f:drivers/clk/x86/Makefile +f:drivers/clk/x86/clk-cgu-pll.c +f:drivers/clk/x86/clk-cgu.c +f:drivers/clk/x86/clk-cgu.h +f:drivers/clk/x86/clk-fch.c +f:drivers/clk/x86/clk-lgm.c +f:drivers/clk/x86/clk-lpss-atom.c +f:drivers/clk/x86/clk-pmc-atom.c +f:drivers/clk/xilinx/Kconfig +f:drivers/clk/xilinx/Makefile +f:drivers/clk/xilinx/clk-xlnx-clock-wizard.c +f:drivers/clk/xilinx/xlnx_vcu.c +f:drivers/clk/zynq/Makefile +f:drivers/clk/zynq/clkc.c +f:drivers/clk/zynq/pll.c +f:drivers/clk/zynqmp/Kconfig +f:drivers/clk/zynqmp/Makefile +f:drivers/clk/zynqmp/clk-gate-zynqmp.c +f:drivers/clk/zynqmp/clk-mux-zynqmp.c +f:drivers/clk/zynqmp/clk-zynqmp.h +f:drivers/clk/zynqmp/clkc.c +f:drivers/clk/zynqmp/divider.c +f:drivers/clk/zynqmp/pll.c +f:drivers/clocksource/Kconfig +f:drivers/clocksource/Makefile +f:drivers/clocksource/acpi_pm.c +f:drivers/clocksource/arc_timer.c +f:drivers/clocksource/arm_arch_timer.c +f:drivers/clocksource/arm_global_timer.c +f:drivers/clocksource/armv7m_systick.c +f:drivers/clocksource/asm9260_timer.c +f:drivers/clocksource/bcm2835_timer.c +f:drivers/clocksource/bcm_kona_timer.c +f:drivers/clocksource/clksrc-dbx500-prcmu.c +f:drivers/clocksource/clksrc_st_lpc.c +f:drivers/clocksource/clps711x-timer.c +f:drivers/clocksource/dummy_timer.c +f:drivers/clocksource/dw_apb_timer.c +f:drivers/clocksource/dw_apb_timer_of.c +f:drivers/clocksource/em_sti.c +f:drivers/clocksource/exynos_mct.c +f:drivers/clocksource/hyperv_timer.c +f:drivers/clocksource/i8253.c +f:drivers/clocksource/ingenic-ost.c +f:drivers/clocksource/ingenic-sysost.c +f:drivers/clocksource/ingenic-timer.c +f:drivers/clocksource/jcore-pit.c +f:drivers/clocksource/mips-gic-timer.c +f:drivers/clocksource/mmio.c +f:drivers/clocksource/mps2-timer.c +f:drivers/clocksource/mxs_timer.c +f:drivers/clocksource/nomadik-mtu.c +f:drivers/clocksource/numachip.c +f:drivers/clocksource/renesas-ostm.c +f:drivers/clocksource/samsung_pwm_timer.c +f:drivers/clocksource/scx200_hrt.c +f:drivers/clocksource/sh_cmt.c +f:drivers/clocksource/sh_mtu2.c +f:drivers/clocksource/sh_tmu.c +f:drivers/clocksource/timer-armada-370-xp.c +f:drivers/clocksource/timer-atmel-pit.c +f:drivers/clocksource/timer-atmel-st.c +f:drivers/clocksource/timer-atmel-tcb.c +f:drivers/clocksource/timer-cadence-ttc.c +f:drivers/clocksource/timer-clint.c +f:drivers/clocksource/timer-cs5535.c +f:drivers/clocksource/timer-davinci.c +f:drivers/clocksource/timer-digicolor.c +f:drivers/clocksource/timer-econet-en751221.c +f:drivers/clocksource/timer-ep93xx.c +f:drivers/clocksource/timer-fsl-ftm.c +f:drivers/clocksource/timer-fttmr010.c +f:drivers/clocksource/timer-goldfish.c +f:drivers/clocksource/timer-gx6605s.c +f:drivers/clocksource/timer-gxp.c +f:drivers/clocksource/timer-imx-gpt.c +f:drivers/clocksource/timer-imx-sysctr.c +f:drivers/clocksource/timer-imx-tpm.c +f:drivers/clocksource/timer-integrator-ap.c +f:drivers/clocksource/timer-ixp4xx.c +f:drivers/clocksource/timer-keystone.c +f:drivers/clocksource/timer-loongson1-pwm.c +f:drivers/clocksource/timer-lpc32xx.c +f:drivers/clocksource/timer-mediatek-cpux.c +f:drivers/clocksource/timer-mediatek.c +f:drivers/clocksource/timer-meson6.c +f:drivers/clocksource/timer-microchip-pit64b.c +f:drivers/clocksource/timer-milbeaut.c +f:drivers/clocksource/timer-mp-csky.c +f:drivers/clocksource/timer-msc313e.c +f:drivers/clocksource/timer-npcm7xx.c +f:drivers/clocksource/timer-nxp-stm.c +f:drivers/clocksource/timer-of.c +f:drivers/clocksource/timer-of.h +f:drivers/clocksource/timer-orion.c +f:drivers/clocksource/timer-owl.c +f:drivers/clocksource/timer-pistachio.c +f:drivers/clocksource/timer-probe.c +f:drivers/clocksource/timer-pxa.c +f:drivers/clocksource/timer-qcom.c +f:drivers/clocksource/timer-ralink.c +f:drivers/clocksource/timer-rda.c +f:drivers/clocksource/timer-riscv.c +f:drivers/clocksource/timer-rockchip.c +f:drivers/clocksource/timer-rtl-otto.c +f:drivers/clocksource/timer-sp.h +f:drivers/clocksource/timer-sp804.c +f:drivers/clocksource/timer-sprd.c +f:drivers/clocksource/timer-stm32-lp.c +f:drivers/clocksource/timer-stm32.c +f:drivers/clocksource/timer-sun4i.c +f:drivers/clocksource/timer-sun5i.c +f:drivers/clocksource/timer-tegra.c +f:drivers/clocksource/timer-tegra186.c +f:drivers/clocksource/timer-ti-32k.c +f:drivers/clocksource/timer-ti-dm-systimer.c +f:drivers/clocksource/timer-ti-dm.c +f:drivers/clocksource/timer-versatile.c +f:drivers/clocksource/timer-vf-pit.c +f:drivers/clocksource/timer-vt8500.c +f:drivers/clocksource/timer-zevio.c +f:drivers/comedi/Kconfig +f:drivers/comedi/Makefile +f:drivers/comedi/TODO +f:drivers/comedi/comedi_buf.c +f:drivers/comedi/comedi_fops.c +f:drivers/comedi/comedi_internal.h +f:drivers/comedi/comedi_pci.c +f:drivers/comedi/comedi_pcmcia.c +f:drivers/comedi/comedi_usb.c +f:drivers/comedi/drivers.c +f:drivers/comedi/drivers/8255.c +f:drivers/comedi/drivers/8255_pci.c +f:drivers/comedi/drivers/Makefile +f:drivers/comedi/drivers/addi_apci_1032.c +f:drivers/comedi/drivers/addi_apci_1500.c +f:drivers/comedi/drivers/addi_apci_1516.c +f:drivers/comedi/drivers/addi_apci_1564.c +f:drivers/comedi/drivers/addi_apci_16xx.c +f:drivers/comedi/drivers/addi_apci_2032.c +f:drivers/comedi/drivers/addi_apci_2200.c +f:drivers/comedi/drivers/addi_apci_3120.c +f:drivers/comedi/drivers/addi_apci_3501.c +f:drivers/comedi/drivers/addi_apci_3xxx.c +f:drivers/comedi/drivers/addi_tcw.h +f:drivers/comedi/drivers/addi_watchdog.c +f:drivers/comedi/drivers/addi_watchdog.h +f:drivers/comedi/drivers/adl_pci6208.c +f:drivers/comedi/drivers/adl_pci7x3x.c +f:drivers/comedi/drivers/adl_pci8164.c +f:drivers/comedi/drivers/adl_pci9111.c +f:drivers/comedi/drivers/adl_pci9118.c +f:drivers/comedi/drivers/adq12b.c +f:drivers/comedi/drivers/adv_pci1710.c +f:drivers/comedi/drivers/adv_pci1720.c +f:drivers/comedi/drivers/adv_pci1723.c +f:drivers/comedi/drivers/adv_pci1724.c +f:drivers/comedi/drivers/adv_pci1760.c +f:drivers/comedi/drivers/adv_pci_dio.c +f:drivers/comedi/drivers/aio_aio12_8.c +f:drivers/comedi/drivers/aio_iiro_16.c +f:drivers/comedi/drivers/amcc_s5933.h +f:drivers/comedi/drivers/amplc_dio200.c +f:drivers/comedi/drivers/amplc_dio200.h +f:drivers/comedi/drivers/amplc_dio200_common.c +f:drivers/comedi/drivers/amplc_dio200_pci.c +f:drivers/comedi/drivers/amplc_pc236.c +f:drivers/comedi/drivers/amplc_pc236.h +f:drivers/comedi/drivers/amplc_pc236_common.c +f:drivers/comedi/drivers/amplc_pc263.c +f:drivers/comedi/drivers/amplc_pci224.c +f:drivers/comedi/drivers/amplc_pci230.c +f:drivers/comedi/drivers/amplc_pci236.c +f:drivers/comedi/drivers/amplc_pci263.c +f:drivers/comedi/drivers/c6xdigio.c +f:drivers/comedi/drivers/cb_das16_cs.c +f:drivers/comedi/drivers/cb_pcidas.c +f:drivers/comedi/drivers/cb_pcidas64.c +f:drivers/comedi/drivers/cb_pcidda.c +f:drivers/comedi/drivers/cb_pcimdas.c +f:drivers/comedi/drivers/cb_pcimdda.c +f:drivers/comedi/drivers/comedi_8254.c +f:drivers/comedi/drivers/comedi_8255.c +f:drivers/comedi/drivers/comedi_bond.c +f:drivers/comedi/drivers/comedi_isadma.c +f:drivers/comedi/drivers/comedi_parport.c +f:drivers/comedi/drivers/comedi_test.c +f:drivers/comedi/drivers/contec_pci_dio.c +f:drivers/comedi/drivers/dac02.c +f:drivers/comedi/drivers/daqboard2000.c +f:drivers/comedi/drivers/das08.c +f:drivers/comedi/drivers/das08.h +f:drivers/comedi/drivers/das08_cs.c +f:drivers/comedi/drivers/das08_isa.c +f:drivers/comedi/drivers/das08_pci.c +f:drivers/comedi/drivers/das16.c +f:drivers/comedi/drivers/das16m1.c +f:drivers/comedi/drivers/das1800.c +f:drivers/comedi/drivers/das6402.c +f:drivers/comedi/drivers/das800.c +f:drivers/comedi/drivers/dmm32at.c +f:drivers/comedi/drivers/dt2801.c +f:drivers/comedi/drivers/dt2811.c +f:drivers/comedi/drivers/dt2814.c +f:drivers/comedi/drivers/dt2815.c +f:drivers/comedi/drivers/dt2817.c +f:drivers/comedi/drivers/dt282x.c +f:drivers/comedi/drivers/dt3000.c +f:drivers/comedi/drivers/dt9812.c +f:drivers/comedi/drivers/dyna_pci10xx.c +f:drivers/comedi/drivers/fl512.c +f:drivers/comedi/drivers/gsc_hpdi.c +f:drivers/comedi/drivers/icp_multi.c +f:drivers/comedi/drivers/ii_pci20kc.c +f:drivers/comedi/drivers/jr3_pci.c +f:drivers/comedi/drivers/jr3_pci.h +f:drivers/comedi/drivers/ke_counter.c +f:drivers/comedi/drivers/me4000.c +f:drivers/comedi/drivers/me_daq.c +f:drivers/comedi/drivers/mf6x4.c +f:drivers/comedi/drivers/mite.c +f:drivers/comedi/drivers/mite.h +f:drivers/comedi/drivers/mpc624.c +f:drivers/comedi/drivers/multiq3.c +f:drivers/comedi/drivers/ni_6527.c +f:drivers/comedi/drivers/ni_65xx.c +f:drivers/comedi/drivers/ni_660x.c +f:drivers/comedi/drivers/ni_670x.c +f:drivers/comedi/drivers/ni_at_a2150.c +f:drivers/comedi/drivers/ni_at_ao.c +f:drivers/comedi/drivers/ni_atmio.c +f:drivers/comedi/drivers/ni_atmio16d.c +f:drivers/comedi/drivers/ni_daq_700.c +f:drivers/comedi/drivers/ni_daq_dio24.c +f:drivers/comedi/drivers/ni_labpc.c +f:drivers/comedi/drivers/ni_labpc.h +f:drivers/comedi/drivers/ni_labpc_common.c +f:drivers/comedi/drivers/ni_labpc_cs.c +f:drivers/comedi/drivers/ni_labpc_isadma.c +f:drivers/comedi/drivers/ni_labpc_isadma.h +f:drivers/comedi/drivers/ni_labpc_pci.c +f:drivers/comedi/drivers/ni_labpc_regs.h +f:drivers/comedi/drivers/ni_mio_common.c +f:drivers/comedi/drivers/ni_mio_cs.c +f:drivers/comedi/drivers/ni_pcidio.c +f:drivers/comedi/drivers/ni_pcimio.c +f:drivers/comedi/drivers/ni_routes.c +f:drivers/comedi/drivers/ni_routes.h +f:drivers/comedi/drivers/ni_routing/README +f:drivers/comedi/drivers/ni_routing/ni_device_routes.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes.h +f:drivers/comedi/drivers/ni_routing/ni_device_routes/all.h +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6070e.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6220.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6221.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6229.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6251.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6254.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6259.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6534.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6602.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6713.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6723.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pci-6733.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pxi-6030e.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pxi-6224.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pxi-6225.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pxi-6251.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pxi-6733.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pxie-6251.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pxie-6535.c +f:drivers/comedi/drivers/ni_routing/ni_device_routes/pxie-6738.c +f:drivers/comedi/drivers/ni_routing/ni_route_values.c +f:drivers/comedi/drivers/ni_routing/ni_route_values.h +f:drivers/comedi/drivers/ni_routing/ni_route_values/all.h +f:drivers/comedi/drivers/ni_routing/ni_route_values/ni_660x.c +f:drivers/comedi/drivers/ni_routing/ni_route_values/ni_eseries.c +f:drivers/comedi/drivers/ni_routing/ni_route_values/ni_mseries.c +f:drivers/comedi/drivers/ni_routing/tools/.gitignore +f:drivers/comedi/drivers/ni_routing/tools/Makefile +f:drivers/comedi/drivers/ni_routing/tools/convert_c_to_py.c +f:drivers/comedi/drivers/ni_routing/tools/convert_csv_to_c.py +f:drivers/comedi/drivers/ni_routing/tools/convert_py_to_csv.py +f:drivers/comedi/drivers/ni_routing/tools/csv_collection.py +f:drivers/comedi/drivers/ni_routing/tools/make_blank_csv.py +f:drivers/comedi/drivers/ni_routing/tools/ni_names.py +f:drivers/comedi/drivers/ni_stc.h +f:drivers/comedi/drivers/ni_tio.c +f:drivers/comedi/drivers/ni_tio.h +f:drivers/comedi/drivers/ni_tio_internal.h +f:drivers/comedi/drivers/ni_tiocmd.c +f:drivers/comedi/drivers/ni_usb6501.c +f:drivers/comedi/drivers/pcl711.c +f:drivers/comedi/drivers/pcl724.c +f:drivers/comedi/drivers/pcl726.c +f:drivers/comedi/drivers/pcl730.c +f:drivers/comedi/drivers/pcl812.c +f:drivers/comedi/drivers/pcl816.c +f:drivers/comedi/drivers/pcl818.c +f:drivers/comedi/drivers/pcm3724.c +f:drivers/comedi/drivers/pcmad.c +f:drivers/comedi/drivers/pcmda12.c +f:drivers/comedi/drivers/pcmmio.c +f:drivers/comedi/drivers/pcmuio.c +f:drivers/comedi/drivers/plx9052.h +f:drivers/comedi/drivers/plx9080.h +f:drivers/comedi/drivers/quatech_daqp_cs.c +f:drivers/comedi/drivers/rtd520.c +f:drivers/comedi/drivers/rti800.c +f:drivers/comedi/drivers/rti802.c +f:drivers/comedi/drivers/s526.c +f:drivers/comedi/drivers/s626.c +f:drivers/comedi/drivers/s626.h +f:drivers/comedi/drivers/ssv_dnp.c +f:drivers/comedi/drivers/tests/Makefile +f:drivers/comedi/drivers/tests/comedi_example_test.c +f:drivers/comedi/drivers/tests/ni_routes_test.c +f:drivers/comedi/drivers/tests/unittest.h +f:drivers/comedi/drivers/usbdux.c +f:drivers/comedi/drivers/usbduxfast.c +f:drivers/comedi/drivers/usbduxsigma.c +f:drivers/comedi/drivers/vmk80xx.c +f:drivers/comedi/drivers/z8536.h +f:drivers/comedi/kcomedilib/Makefile +f:drivers/comedi/kcomedilib/kcomedilib_main.c +f:drivers/comedi/proc.c +f:drivers/comedi/range.c +f:drivers/connector/Kconfig +f:drivers/connector/Makefile +f:drivers/connector/cn_proc.c +f:drivers/connector/cn_queue.c +f:drivers/connector/connector.c +f:drivers/counter/104-quad-8.c +f:drivers/counter/Kconfig +f:drivers/counter/Makefile +f:drivers/counter/counter-chrdev.c +f:drivers/counter/counter-chrdev.h +f:drivers/counter/counter-core.c +f:drivers/counter/counter-sysfs.c +f:drivers/counter/counter-sysfs.h +f:drivers/counter/ftm-quaddec.c +f:drivers/counter/i8254.c +f:drivers/counter/intel-qep.c +f:drivers/counter/interrupt-cnt.c +f:drivers/counter/microchip-tcb-capture.c +f:drivers/counter/rz-mtu3-cnt.c +f:drivers/counter/stm32-lptimer-cnt.c +f:drivers/counter/stm32-timer-cnt.c +f:drivers/counter/ti-ecap-capture.c +f:drivers/counter/ti-eqep.c +f:drivers/cpufreq/Kconfig +f:drivers/cpufreq/Kconfig.arm +f:drivers/cpufreq/Kconfig.powerpc +f:drivers/cpufreq/Kconfig.x86 +f:drivers/cpufreq/Makefile +f:drivers/cpufreq/acpi-cpufreq.c +f:drivers/cpufreq/airoha-cpufreq.c +f:drivers/cpufreq/amd-pstate-trace.c +f:drivers/cpufreq/amd-pstate-trace.h +f:drivers/cpufreq/amd-pstate-ut.c +f:drivers/cpufreq/amd-pstate.c +f:drivers/cpufreq/amd-pstate.h +f:drivers/cpufreq/amd_freq_sensitivity.c +f:drivers/cpufreq/apple-soc-cpufreq.c +f:drivers/cpufreq/armada-37xx-cpufreq.c +f:drivers/cpufreq/armada-8k-cpufreq.c +f:drivers/cpufreq/bmips-cpufreq.c +f:drivers/cpufreq/brcmstb-avs-cpufreq.c +f:drivers/cpufreq/cppc_cpufreq.c +f:drivers/cpufreq/cpufreq-dt-platdev.c +f:drivers/cpufreq/cpufreq-dt.c +f:drivers/cpufreq/cpufreq-dt.h +f:drivers/cpufreq/cpufreq-nforce2.c +f:drivers/cpufreq/cpufreq.c +f:drivers/cpufreq/cpufreq_conservative.c +f:drivers/cpufreq/cpufreq_governor.c +f:drivers/cpufreq/cpufreq_governor.h +f:drivers/cpufreq/cpufreq_governor_attr_set.c +f:drivers/cpufreq/cpufreq_ondemand.c +f:drivers/cpufreq/cpufreq_ondemand.h +f:drivers/cpufreq/cpufreq_performance.c +f:drivers/cpufreq/cpufreq_powersave.c +f:drivers/cpufreq/cpufreq_stats.c +f:drivers/cpufreq/cpufreq_userspace.c +f:drivers/cpufreq/davinci-cpufreq.c +f:drivers/cpufreq/e_powersaver.c +f:drivers/cpufreq/elanfreq.c +f:drivers/cpufreq/freq_table.c +f:drivers/cpufreq/gx-suspmod.c +f:drivers/cpufreq/highbank-cpufreq.c +f:drivers/cpufreq/imx-cpufreq-dt.c +f:drivers/cpufreq/imx6q-cpufreq.c +f:drivers/cpufreq/intel_pstate.c +f:drivers/cpufreq/kirkwood-cpufreq.c +f:drivers/cpufreq/longhaul.c +f:drivers/cpufreq/longhaul.h +f:drivers/cpufreq/longrun.c +f:drivers/cpufreq/loongson2_cpufreq.c +f:drivers/cpufreq/loongson3_cpufreq.c +f:drivers/cpufreq/mediatek-cpufreq-hw.c +f:drivers/cpufreq/mediatek-cpufreq.c +f:drivers/cpufreq/mvebu-cpufreq.c +f:drivers/cpufreq/omap-cpufreq.c +f:drivers/cpufreq/p4-clockmod.c +f:drivers/cpufreq/pasemi-cpufreq.c +f:drivers/cpufreq/pcc-cpufreq.c +f:drivers/cpufreq/pmac32-cpufreq.c +f:drivers/cpufreq/pmac64-cpufreq.c +f:drivers/cpufreq/powernow-k6.c +f:drivers/cpufreq/powernow-k7.c +f:drivers/cpufreq/powernow-k7.h +f:drivers/cpufreq/powernow-k8.c +f:drivers/cpufreq/powernow-k8.h +f:drivers/cpufreq/powernv-cpufreq.c +f:drivers/cpufreq/powernv-trace.h +f:drivers/cpufreq/pxa2xx-cpufreq.c +f:drivers/cpufreq/pxa3xx-cpufreq.c +f:drivers/cpufreq/qcom-cpufreq-hw.c +f:drivers/cpufreq/qcom-cpufreq-nvmem.c +f:drivers/cpufreq/qoriq-cpufreq.c +f:drivers/cpufreq/raspberrypi-cpufreq.c +f:drivers/cpufreq/rcpufreq_dt.rs +f:drivers/cpufreq/s3c64xx-cpufreq.c +f:drivers/cpufreq/s5pv210-cpufreq.c +f:drivers/cpufreq/sa1110-cpufreq.c +f:drivers/cpufreq/sc520_freq.c +f:drivers/cpufreq/scmi-cpufreq.c +f:drivers/cpufreq/scpi-cpufreq.c +f:drivers/cpufreq/sh-cpufreq.c +f:drivers/cpufreq/sparc-us2e-cpufreq.c +f:drivers/cpufreq/sparc-us3-cpufreq.c +f:drivers/cpufreq/spear-cpufreq.c +f:drivers/cpufreq/speedstep-centrino.c +f:drivers/cpufreq/speedstep-ich.c +f:drivers/cpufreq/speedstep-lib.c +f:drivers/cpufreq/speedstep-lib.h +f:drivers/cpufreq/speedstep-smi.c +f:drivers/cpufreq/sti-cpufreq.c +f:drivers/cpufreq/sun50i-cpufreq-nvmem.c +f:drivers/cpufreq/tegra124-cpufreq.c +f:drivers/cpufreq/tegra186-cpufreq.c +f:drivers/cpufreq/tegra194-cpufreq.c +f:drivers/cpufreq/tegra20-cpufreq.c +f:drivers/cpufreq/ti-cpufreq.c +f:drivers/cpufreq/vexpress-spc-cpufreq.c +f:drivers/cpufreq/virtual-cpufreq.c +f:drivers/cpuidle/Kconfig +f:drivers/cpuidle/Kconfig.arm +f:drivers/cpuidle/Kconfig.mips +f:drivers/cpuidle/Kconfig.powerpc +f:drivers/cpuidle/Kconfig.riscv +f:drivers/cpuidle/Makefile +f:drivers/cpuidle/coupled.c +f:drivers/cpuidle/cpuidle-arm.c +f:drivers/cpuidle/cpuidle-at91.c +f:drivers/cpuidle/cpuidle-big_little.c +f:drivers/cpuidle/cpuidle-calxeda.c +f:drivers/cpuidle/cpuidle-clps711x.c +f:drivers/cpuidle/cpuidle-cps.c +f:drivers/cpuidle/cpuidle-exynos.c +f:drivers/cpuidle/cpuidle-haltpoll.c +f:drivers/cpuidle/cpuidle-kirkwood.c +f:drivers/cpuidle/cpuidle-mvebu-v7.c +f:drivers/cpuidle/cpuidle-powernv.c +f:drivers/cpuidle/cpuidle-psci-domain.c +f:drivers/cpuidle/cpuidle-psci.c +f:drivers/cpuidle/cpuidle-psci.h +f:drivers/cpuidle/cpuidle-pseries.c +f:drivers/cpuidle/cpuidle-qcom-spm.c +f:drivers/cpuidle/cpuidle-riscv-sbi.c +f:drivers/cpuidle/cpuidle-tegra.c +f:drivers/cpuidle/cpuidle-ux500.c +f:drivers/cpuidle/cpuidle-zynq.c +f:drivers/cpuidle/cpuidle.c +f:drivers/cpuidle/cpuidle.h +f:drivers/cpuidle/driver.c +f:drivers/cpuidle/dt_idle_genpd.c +f:drivers/cpuidle/dt_idle_genpd.h +f:drivers/cpuidle/dt_idle_states.c +f:drivers/cpuidle/dt_idle_states.h +f:drivers/cpuidle/governor.c +f:drivers/cpuidle/governors/Makefile +f:drivers/cpuidle/governors/gov.h +f:drivers/cpuidle/governors/haltpoll.c +f:drivers/cpuidle/governors/ladder.c +f:drivers/cpuidle/governors/menu.c +f:drivers/cpuidle/governors/teo.c +f:drivers/cpuidle/poll_state.c +f:drivers/cpuidle/sysfs.c +f:drivers/crypto/Kconfig +f:drivers/crypto/Makefile +f:drivers/crypto/allwinner/Kconfig +f:drivers/crypto/allwinner/Makefile +f:drivers/crypto/allwinner/sun4i-ss/Makefile +f:drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c +f:drivers/crypto/allwinner/sun4i-ss/sun4i-ss-core.c +f:drivers/crypto/allwinner/sun4i-ss/sun4i-ss-hash.c +f:drivers/crypto/allwinner/sun4i-ss/sun4i-ss-prng.c +f:drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h +f:drivers/crypto/allwinner/sun8i-ce/Makefile +f:drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +f:drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c +f:drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c +f:drivers/crypto/allwinner/sun8i-ce/sun8i-ce-prng.c +f:drivers/crypto/allwinner/sun8i-ce/sun8i-ce-trng.c +f:drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h +f:drivers/crypto/allwinner/sun8i-ss/Makefile +f:drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +f:drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +f:drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +f:drivers/crypto/allwinner/sun8i-ss/sun8i-ss-prng.c +f:drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +f:drivers/crypto/amcc/Makefile +f:drivers/crypto/amcc/crypto4xx_alg.c +f:drivers/crypto/amcc/crypto4xx_core.c +f:drivers/crypto/amcc/crypto4xx_core.h +f:drivers/crypto/amcc/crypto4xx_reg_def.h +f:drivers/crypto/amcc/crypto4xx_sa.h +f:drivers/crypto/amcc/crypto4xx_trng.c +f:drivers/crypto/amcc/crypto4xx_trng.h +f:drivers/crypto/amlogic/Kconfig +f:drivers/crypto/amlogic/Makefile +f:drivers/crypto/amlogic/amlogic-gxl-cipher.c +f:drivers/crypto/amlogic/amlogic-gxl-core.c +f:drivers/crypto/amlogic/amlogic-gxl.h +f:drivers/crypto/aspeed/Kconfig +f:drivers/crypto/aspeed/Makefile +f:drivers/crypto/aspeed/aspeed-acry.c +f:drivers/crypto/aspeed/aspeed-hace-crypto.c +f:drivers/crypto/aspeed/aspeed-hace-hash.c +f:drivers/crypto/aspeed/aspeed-hace.c +f:drivers/crypto/aspeed/aspeed-hace.h +f:drivers/crypto/atmel-aes-regs.h +f:drivers/crypto/atmel-aes.c +f:drivers/crypto/atmel-authenc.h +f:drivers/crypto/atmel-ecc.c +f:drivers/crypto/atmel-i2c.c +f:drivers/crypto/atmel-i2c.h +f:drivers/crypto/atmel-sha-regs.h +f:drivers/crypto/atmel-sha.c +f:drivers/crypto/atmel-sha204a.c +f:drivers/crypto/atmel-tdes-regs.h +f:drivers/crypto/atmel-tdes.c +f:drivers/crypto/axis/Makefile +f:drivers/crypto/axis/artpec6_crypto.c +f:drivers/crypto/bcm/Makefile +f:drivers/crypto/bcm/cipher.c +f:drivers/crypto/bcm/cipher.h +f:drivers/crypto/bcm/spu.c +f:drivers/crypto/bcm/spu.h +f:drivers/crypto/bcm/spu2.c +f:drivers/crypto/bcm/spu2.h +f:drivers/crypto/bcm/spum.h +f:drivers/crypto/bcm/util.c +f:drivers/crypto/bcm/util.h +f:drivers/crypto/caam/Kconfig +f:drivers/crypto/caam/Makefile +f:drivers/crypto/caam/blob_gen.c +f:drivers/crypto/caam/caamalg.c +f:drivers/crypto/caam/caamalg_desc.c +f:drivers/crypto/caam/caamalg_desc.h +f:drivers/crypto/caam/caamalg_qi.c +f:drivers/crypto/caam/caamalg_qi2.c +f:drivers/crypto/caam/caamalg_qi2.h +f:drivers/crypto/caam/caamhash.c +f:drivers/crypto/caam/caamhash_desc.c +f:drivers/crypto/caam/caamhash_desc.h +f:drivers/crypto/caam/caampkc.c +f:drivers/crypto/caam/caampkc.h +f:drivers/crypto/caam/caamprng.c +f:drivers/crypto/caam/caamrng.c +f:drivers/crypto/caam/compat.h +f:drivers/crypto/caam/ctrl.c +f:drivers/crypto/caam/ctrl.h +f:drivers/crypto/caam/debugfs.c +f:drivers/crypto/caam/debugfs.h +f:drivers/crypto/caam/desc.h +f:drivers/crypto/caam/desc_constr.h +f:drivers/crypto/caam/dpseci-debugfs.c +f:drivers/crypto/caam/dpseci-debugfs.h +f:drivers/crypto/caam/dpseci.c +f:drivers/crypto/caam/dpseci.h +f:drivers/crypto/caam/dpseci_cmd.h +f:drivers/crypto/caam/error.c +f:drivers/crypto/caam/error.h +f:drivers/crypto/caam/intern.h +f:drivers/crypto/caam/jr.c +f:drivers/crypto/caam/jr.h +f:drivers/crypto/caam/key_gen.c +f:drivers/crypto/caam/key_gen.h +f:drivers/crypto/caam/pdb.h +f:drivers/crypto/caam/pkc_desc.c +f:drivers/crypto/caam/qi.c +f:drivers/crypto/caam/qi.h +f:drivers/crypto/caam/regs.h +f:drivers/crypto/caam/sg_sw_qm.h +f:drivers/crypto/caam/sg_sw_qm2.h +f:drivers/crypto/caam/sg_sw_sec4.h +f:drivers/crypto/cavium/Makefile +f:drivers/crypto/cavium/cpt/Kconfig +f:drivers/crypto/cavium/cpt/Makefile +f:drivers/crypto/cavium/cpt/cpt_common.h +f:drivers/crypto/cavium/cpt/cpt_hw_types.h +f:drivers/crypto/cavium/cpt/cptpf.h +f:drivers/crypto/cavium/cpt/cptpf_main.c +f:drivers/crypto/cavium/cpt/cptpf_mbox.c +f:drivers/crypto/cavium/cpt/cptvf.h +f:drivers/crypto/cavium/cpt/cptvf_algs.c +f:drivers/crypto/cavium/cpt/cptvf_algs.h +f:drivers/crypto/cavium/cpt/cptvf_main.c +f:drivers/crypto/cavium/cpt/cptvf_mbox.c +f:drivers/crypto/cavium/cpt/cptvf_reqmanager.c +f:drivers/crypto/cavium/cpt/request_manager.h +f:drivers/crypto/cavium/nitrox/Kconfig +f:drivers/crypto/cavium/nitrox/Makefile +f:drivers/crypto/cavium/nitrox/nitrox_aead.c +f:drivers/crypto/cavium/nitrox/nitrox_algs.c +f:drivers/crypto/cavium/nitrox/nitrox_common.h +f:drivers/crypto/cavium/nitrox/nitrox_csr.h +f:drivers/crypto/cavium/nitrox/nitrox_debugfs.c +f:drivers/crypto/cavium/nitrox/nitrox_debugfs.h +f:drivers/crypto/cavium/nitrox/nitrox_dev.h +f:drivers/crypto/cavium/nitrox/nitrox_hal.c +f:drivers/crypto/cavium/nitrox/nitrox_hal.h +f:drivers/crypto/cavium/nitrox/nitrox_isr.c +f:drivers/crypto/cavium/nitrox/nitrox_isr.h +f:drivers/crypto/cavium/nitrox/nitrox_lib.c +f:drivers/crypto/cavium/nitrox/nitrox_main.c +f:drivers/crypto/cavium/nitrox/nitrox_mbx.c +f:drivers/crypto/cavium/nitrox/nitrox_mbx.h +f:drivers/crypto/cavium/nitrox/nitrox_req.h +f:drivers/crypto/cavium/nitrox/nitrox_reqmgr.c +f:drivers/crypto/cavium/nitrox/nitrox_skcipher.c +f:drivers/crypto/cavium/nitrox/nitrox_sriov.c +f:drivers/crypto/ccp/Kconfig +f:drivers/crypto/ccp/Makefile +f:drivers/crypto/ccp/ccp-crypto-aes-cmac.c +f:drivers/crypto/ccp/ccp-crypto-aes-galois.c +f:drivers/crypto/ccp/ccp-crypto-aes-xts.c +f:drivers/crypto/ccp/ccp-crypto-aes.c +f:drivers/crypto/ccp/ccp-crypto-des3.c +f:drivers/crypto/ccp/ccp-crypto-main.c +f:drivers/crypto/ccp/ccp-crypto-rsa.c +f:drivers/crypto/ccp/ccp-crypto-sha.c +f:drivers/crypto/ccp/ccp-crypto.h +f:drivers/crypto/ccp/ccp-debugfs.c +f:drivers/crypto/ccp/ccp-dev-v3.c +f:drivers/crypto/ccp/ccp-dev-v5.c +f:drivers/crypto/ccp/ccp-dev.c +f:drivers/crypto/ccp/ccp-dev.h +f:drivers/crypto/ccp/ccp-dmaengine.c +f:drivers/crypto/ccp/ccp-ops.c +f:drivers/crypto/ccp/dbc.c +f:drivers/crypto/ccp/dbc.h +f:drivers/crypto/ccp/hsti.c +f:drivers/crypto/ccp/hsti.h +f:drivers/crypto/ccp/platform-access.c +f:drivers/crypto/ccp/platform-access.h +f:drivers/crypto/ccp/psp-dev.c +f:drivers/crypto/ccp/psp-dev.h +f:drivers/crypto/ccp/sev-dev.c +f:drivers/crypto/ccp/sev-dev.h +f:drivers/crypto/ccp/sp-dev.c +f:drivers/crypto/ccp/sp-dev.h +f:drivers/crypto/ccp/sp-pci.c +f:drivers/crypto/ccp/sp-platform.c +f:drivers/crypto/ccp/tee-dev.c +f:drivers/crypto/ccp/tee-dev.h +f:drivers/crypto/ccree/Makefile +f:drivers/crypto/ccree/cc_aead.c +f:drivers/crypto/ccree/cc_aead.h +f:drivers/crypto/ccree/cc_buffer_mgr.c +f:drivers/crypto/ccree/cc_buffer_mgr.h +f:drivers/crypto/ccree/cc_cipher.c +f:drivers/crypto/ccree/cc_cipher.h +f:drivers/crypto/ccree/cc_crypto_ctx.h +f:drivers/crypto/ccree/cc_debugfs.c +f:drivers/crypto/ccree/cc_debugfs.h +f:drivers/crypto/ccree/cc_driver.c +f:drivers/crypto/ccree/cc_driver.h +f:drivers/crypto/ccree/cc_fips.c +f:drivers/crypto/ccree/cc_fips.h +f:drivers/crypto/ccree/cc_hash.c +f:drivers/crypto/ccree/cc_hash.h +f:drivers/crypto/ccree/cc_host_regs.h +f:drivers/crypto/ccree/cc_hw_queue_defs.h +f:drivers/crypto/ccree/cc_kernel_regs.h +f:drivers/crypto/ccree/cc_lli_defs.h +f:drivers/crypto/ccree/cc_pm.c +f:drivers/crypto/ccree/cc_pm.h +f:drivers/crypto/ccree/cc_request_mgr.c +f:drivers/crypto/ccree/cc_request_mgr.h +f:drivers/crypto/ccree/cc_sram_mgr.c +f:drivers/crypto/ccree/cc_sram_mgr.h +f:drivers/crypto/chelsio/Kconfig +f:drivers/crypto/chelsio/Makefile +f:drivers/crypto/chelsio/chcr_algo.c +f:drivers/crypto/chelsio/chcr_algo.h +f:drivers/crypto/chelsio/chcr_core.c +f:drivers/crypto/chelsio/chcr_core.h +f:drivers/crypto/chelsio/chcr_crypto.h +f:drivers/crypto/exynos-rng.c +f:drivers/crypto/gemini/Makefile +f:drivers/crypto/gemini/sl3516-ce-cipher.c +f:drivers/crypto/gemini/sl3516-ce-core.c +f:drivers/crypto/gemini/sl3516-ce-rng.c +f:drivers/crypto/gemini/sl3516-ce.h +f:drivers/crypto/geode-aes.c +f:drivers/crypto/geode-aes.h +f:drivers/crypto/hifn_795x.c +f:drivers/crypto/hisilicon/Kconfig +f:drivers/crypto/hisilicon/Makefile +f:drivers/crypto/hisilicon/debugfs.c +f:drivers/crypto/hisilicon/hpre/Makefile +f:drivers/crypto/hisilicon/hpre/hpre.h +f:drivers/crypto/hisilicon/hpre/hpre_crypto.c +f:drivers/crypto/hisilicon/hpre/hpre_main.c +f:drivers/crypto/hisilicon/qm.c +f:drivers/crypto/hisilicon/qm_common.h +f:drivers/crypto/hisilicon/sec/Makefile +f:drivers/crypto/hisilicon/sec/sec_algs.c +f:drivers/crypto/hisilicon/sec/sec_drv.c +f:drivers/crypto/hisilicon/sec/sec_drv.h +f:drivers/crypto/hisilicon/sec2/Makefile +f:drivers/crypto/hisilicon/sec2/sec.h +f:drivers/crypto/hisilicon/sec2/sec_crypto.c +f:drivers/crypto/hisilicon/sec2/sec_crypto.h +f:drivers/crypto/hisilicon/sec2/sec_main.c +f:drivers/crypto/hisilicon/sgl.c +f:drivers/crypto/hisilicon/trng/Makefile +f:drivers/crypto/hisilicon/trng/trng.c +f:drivers/crypto/hisilicon/zip/Makefile +f:drivers/crypto/hisilicon/zip/dae_main.c +f:drivers/crypto/hisilicon/zip/zip.h +f:drivers/crypto/hisilicon/zip/zip_crypto.c +f:drivers/crypto/hisilicon/zip/zip_main.c +f:drivers/crypto/img-hash.c +f:drivers/crypto/inside-secure/Makefile +f:drivers/crypto/inside-secure/eip93/Kconfig +f:drivers/crypto/inside-secure/eip93/Makefile +f:drivers/crypto/inside-secure/eip93/eip93-aead.c +f:drivers/crypto/inside-secure/eip93/eip93-aead.h +f:drivers/crypto/inside-secure/eip93/eip93-aes.h +f:drivers/crypto/inside-secure/eip93/eip93-cipher.c +f:drivers/crypto/inside-secure/eip93/eip93-cipher.h +f:drivers/crypto/inside-secure/eip93/eip93-common.c +f:drivers/crypto/inside-secure/eip93/eip93-common.h +f:drivers/crypto/inside-secure/eip93/eip93-des.h +f:drivers/crypto/inside-secure/eip93/eip93-hash.c +f:drivers/crypto/inside-secure/eip93/eip93-hash.h +f:drivers/crypto/inside-secure/eip93/eip93-main.c +f:drivers/crypto/inside-secure/eip93/eip93-main.h +f:drivers/crypto/inside-secure/eip93/eip93-regs.h +f:drivers/crypto/inside-secure/safexcel.c +f:drivers/crypto/inside-secure/safexcel.h +f:drivers/crypto/inside-secure/safexcel_cipher.c +f:drivers/crypto/inside-secure/safexcel_hash.c +f:drivers/crypto/inside-secure/safexcel_ring.c +f:drivers/crypto/intel/Kconfig +f:drivers/crypto/intel/Makefile +f:drivers/crypto/intel/iaa/Kconfig +f:drivers/crypto/intel/iaa/Makefile +f:drivers/crypto/intel/iaa/iaa_crypto.h +f:drivers/crypto/intel/iaa/iaa_crypto_comp_fixed.c +f:drivers/crypto/intel/iaa/iaa_crypto_main.c +f:drivers/crypto/intel/iaa/iaa_crypto_stats.c +f:drivers/crypto/intel/iaa/iaa_crypto_stats.h +f:drivers/crypto/intel/ixp4xx/Kconfig +f:drivers/crypto/intel/ixp4xx/Makefile +f:drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c +f:drivers/crypto/intel/keembay/Kconfig +f:drivers/crypto/intel/keembay/Makefile +f:drivers/crypto/intel/keembay/keembay-ocs-aes-core.c +f:drivers/crypto/intel/keembay/keembay-ocs-ecc.c +f:drivers/crypto/intel/keembay/keembay-ocs-hcu-core.c +f:drivers/crypto/intel/keembay/ocs-aes.c +f:drivers/crypto/intel/keembay/ocs-aes.h +f:drivers/crypto/intel/keembay/ocs-hcu.c +f:drivers/crypto/intel/keembay/ocs-hcu.h +f:drivers/crypto/intel/qat/Kconfig +f:drivers/crypto/intel/qat/Makefile +f:drivers/crypto/intel/qat/qat_420xx/Makefile +f:drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c +f:drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.h +f:drivers/crypto/intel/qat/qat_420xx/adf_drv.c +f:drivers/crypto/intel/qat/qat_4xxx/Makefile +f:drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c +f:drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.h +f:drivers/crypto/intel/qat/qat_4xxx/adf_drv.c +f:drivers/crypto/intel/qat/qat_6xxx/Makefile +f:drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c +f:drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.h +f:drivers/crypto/intel/qat/qat_6xxx/adf_drv.c +f:drivers/crypto/intel/qat/qat_c3xxx/Makefile +f:drivers/crypto/intel/qat/qat_c3xxx/adf_c3xxx_hw_data.c +f:drivers/crypto/intel/qat/qat_c3xxx/adf_c3xxx_hw_data.h +f:drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c +f:drivers/crypto/intel/qat/qat_c3xxxvf/Makefile +f:drivers/crypto/intel/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c +f:drivers/crypto/intel/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.h +f:drivers/crypto/intel/qat/qat_c3xxxvf/adf_drv.c +f:drivers/crypto/intel/qat/qat_c62x/Makefile +f:drivers/crypto/intel/qat/qat_c62x/adf_c62x_hw_data.c +f:drivers/crypto/intel/qat/qat_c62x/adf_c62x_hw_data.h +f:drivers/crypto/intel/qat/qat_c62x/adf_drv.c +f:drivers/crypto/intel/qat/qat_c62xvf/Makefile +f:drivers/crypto/intel/qat/qat_c62xvf/adf_c62xvf_hw_data.c +f:drivers/crypto/intel/qat/qat_c62xvf/adf_c62xvf_hw_data.h +f:drivers/crypto/intel/qat/qat_c62xvf/adf_drv.c +f:drivers/crypto/intel/qat/qat_common/Makefile +f:drivers/crypto/intel/qat/qat_common/adf_accel_devices.h +f:drivers/crypto/intel/qat/qat_common/adf_accel_engine.c +f:drivers/crypto/intel/qat/qat_common/adf_admin.c +f:drivers/crypto/intel/qat/qat_common/adf_admin.h +f:drivers/crypto/intel/qat/qat_common/adf_aer.c +f:drivers/crypto/intel/qat/qat_common/adf_bank_state.c +f:drivers/crypto/intel/qat/qat_common/adf_bank_state.h +f:drivers/crypto/intel/qat/qat_common/adf_cfg.c +f:drivers/crypto/intel/qat/qat_common/adf_cfg.h +f:drivers/crypto/intel/qat/qat_common/adf_cfg_common.h +f:drivers/crypto/intel/qat/qat_common/adf_cfg_services.c +f:drivers/crypto/intel/qat/qat_common/adf_cfg_services.h +f:drivers/crypto/intel/qat/qat_common/adf_cfg_strings.h +f:drivers/crypto/intel/qat/qat_common/adf_cfg_user.h +f:drivers/crypto/intel/qat/qat_common/adf_clock.c +f:drivers/crypto/intel/qat/qat_common/adf_clock.h +f:drivers/crypto/intel/qat/qat_common/adf_cnv_dbgfs.c +f:drivers/crypto/intel/qat/qat_common/adf_cnv_dbgfs.h +f:drivers/crypto/intel/qat/qat_common/adf_common_drv.h +f:drivers/crypto/intel/qat/qat_common/adf_ctl_drv.c +f:drivers/crypto/intel/qat/qat_common/adf_dbgfs.c +f:drivers/crypto/intel/qat/qat_common/adf_dbgfs.h +f:drivers/crypto/intel/qat/qat_common/adf_dc.c +f:drivers/crypto/intel/qat/qat_common/adf_dc.h +f:drivers/crypto/intel/qat/qat_common/adf_dev_mgr.c +f:drivers/crypto/intel/qat/qat_common/adf_fw_config.h +f:drivers/crypto/intel/qat/qat_common/adf_fw_counters.c +f:drivers/crypto/intel/qat/qat_common/adf_fw_counters.h +f:drivers/crypto/intel/qat/qat_common/adf_gen2_config.c +f:drivers/crypto/intel/qat/qat_common/adf_gen2_config.h +f:drivers/crypto/intel/qat/qat_common/adf_gen2_hw_csr_data.c +f:drivers/crypto/intel/qat/qat_common/adf_gen2_hw_csr_data.h +f:drivers/crypto/intel/qat/qat_common/adf_gen2_hw_data.c +f:drivers/crypto/intel/qat/qat_common/adf_gen2_hw_data.h +f:drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.c +f:drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.h +f:drivers/crypto/intel/qat/qat_common/adf_gen4_config.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_config.h +f:drivers/crypto/intel/qat/qat_common/adf_gen4_hw_csr_data.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_hw_csr_data.h +f:drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h +f:drivers/crypto/intel/qat/qat_common/adf_gen4_pfvf.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_pfvf.h +f:drivers/crypto/intel/qat/qat_common/adf_gen4_pm.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_pm.h +f:drivers/crypto/intel/qat/qat_common/adf_gen4_pm_debugfs.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h +f:drivers/crypto/intel/qat/qat_common/adf_gen4_tl.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_tl.h +f:drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.c +f:drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.h +f:drivers/crypto/intel/qat/qat_common/adf_gen6_pm.h +f:drivers/crypto/intel/qat/qat_common/adf_gen6_pm_dbgfs.c +f:drivers/crypto/intel/qat/qat_common/adf_gen6_ras.c +f:drivers/crypto/intel/qat/qat_common/adf_gen6_ras.h +f:drivers/crypto/intel/qat/qat_common/adf_gen6_shared.c +f:drivers/crypto/intel/qat/qat_common/adf_gen6_shared.h +f:drivers/crypto/intel/qat/qat_common/adf_gen6_tl.c +f:drivers/crypto/intel/qat/qat_common/adf_gen6_tl.h +f:drivers/crypto/intel/qat/qat_common/adf_heartbeat.c +f:drivers/crypto/intel/qat/qat_common/adf_heartbeat.h +f:drivers/crypto/intel/qat/qat_common/adf_heartbeat_dbgfs.c +f:drivers/crypto/intel/qat/qat_common/adf_heartbeat_dbgfs.h +f:drivers/crypto/intel/qat/qat_common/adf_heartbeat_inject.c +f:drivers/crypto/intel/qat/qat_common/adf_hw_arbiter.c +f:drivers/crypto/intel/qat/qat_common/adf_init.c +f:drivers/crypto/intel/qat/qat_common/adf_isr.c +f:drivers/crypto/intel/qat/qat_common/adf_mstate_mgr.c +f:drivers/crypto/intel/qat/qat_common/adf_mstate_mgr.h +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_msg.h +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_pf_msg.c +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_pf_msg.h +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_pf_proto.c +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_pf_proto.h +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_utils.c +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_utils.h +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_vf_msg.c +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_vf_msg.h +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_vf_proto.c +f:drivers/crypto/intel/qat/qat_common/adf_pfvf_vf_proto.h +f:drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs.c +f:drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs.h +f:drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs_utils.c +f:drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs_utils.h +f:drivers/crypto/intel/qat/qat_common/adf_rl.c +f:drivers/crypto/intel/qat/qat_common/adf_rl.h +f:drivers/crypto/intel/qat/qat_common/adf_rl_admin.c +f:drivers/crypto/intel/qat/qat_common/adf_rl_admin.h +f:drivers/crypto/intel/qat/qat_common/adf_sriov.c +f:drivers/crypto/intel/qat/qat_common/adf_sysfs.c +f:drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.c +f:drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.h +f:drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c +f:drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.h +f:drivers/crypto/intel/qat/qat_common/adf_telemetry.c +f:drivers/crypto/intel/qat/qat_common/adf_telemetry.h +f:drivers/crypto/intel/qat/qat_common/adf_timer.c +f:drivers/crypto/intel/qat/qat_common/adf_timer.h +f:drivers/crypto/intel/qat/qat_common/adf_tl_debugfs.c +f:drivers/crypto/intel/qat/qat_common/adf_tl_debugfs.h +f:drivers/crypto/intel/qat/qat_common/adf_transport.c +f:drivers/crypto/intel/qat/qat_common/adf_transport.h +f:drivers/crypto/intel/qat/qat_common/adf_transport_access_macros.h +f:drivers/crypto/intel/qat/qat_common/adf_transport_debug.c +f:drivers/crypto/intel/qat/qat_common/adf_transport_internal.h +f:drivers/crypto/intel/qat/qat_common/adf_vf_isr.c +f:drivers/crypto/intel/qat/qat_common/icp_qat_fw.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_fw_comp.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_fw_init_admin.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_fw_la.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_fw_loader_handle.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_fw_pke.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_hal.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_hw.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_hw_20_comp.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_hw_20_comp_defs.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_hw_51_comp.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_hw_51_comp_defs.h +f:drivers/crypto/intel/qat/qat_common/icp_qat_uclo.h +f:drivers/crypto/intel/qat/qat_common/qat_algs.c +f:drivers/crypto/intel/qat/qat_common/qat_algs_send.c +f:drivers/crypto/intel/qat/qat_common/qat_algs_send.h +f:drivers/crypto/intel/qat/qat_common/qat_asym_algs.c +f:drivers/crypto/intel/qat/qat_common/qat_bl.c +f:drivers/crypto/intel/qat/qat_common/qat_bl.h +f:drivers/crypto/intel/qat/qat_common/qat_comp_algs.c +f:drivers/crypto/intel/qat/qat_common/qat_comp_req.h +f:drivers/crypto/intel/qat/qat_common/qat_compression.c +f:drivers/crypto/intel/qat/qat_common/qat_compression.h +f:drivers/crypto/intel/qat/qat_common/qat_crypto.c +f:drivers/crypto/intel/qat/qat_common/qat_crypto.h +f:drivers/crypto/intel/qat/qat_common/qat_hal.c +f:drivers/crypto/intel/qat/qat_common/qat_mig_dev.c +f:drivers/crypto/intel/qat/qat_common/qat_uclo.c +f:drivers/crypto/intel/qat/qat_dh895xcc/Makefile +f:drivers/crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c +f:drivers/crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.h +f:drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c +f:drivers/crypto/intel/qat/qat_dh895xccvf/Makefile +f:drivers/crypto/intel/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c +f:drivers/crypto/intel/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.h +f:drivers/crypto/intel/qat/qat_dh895xccvf/adf_drv.c +f:drivers/crypto/marvell/Kconfig +f:drivers/crypto/marvell/Makefile +f:drivers/crypto/marvell/cesa/Makefile +f:drivers/crypto/marvell/cesa/cesa.c +f:drivers/crypto/marvell/cesa/cesa.h +f:drivers/crypto/marvell/cesa/cipher.c +f:drivers/crypto/marvell/cesa/hash.c +f:drivers/crypto/marvell/cesa/tdma.c +f:drivers/crypto/marvell/octeontx/Makefile +f:drivers/crypto/marvell/octeontx/otx_cpt_common.h +f:drivers/crypto/marvell/octeontx/otx_cpt_hw_types.h +f:drivers/crypto/marvell/octeontx/otx_cptpf.h +f:drivers/crypto/marvell/octeontx/otx_cptpf_main.c +f:drivers/crypto/marvell/octeontx/otx_cptpf_mbox.c +f:drivers/crypto/marvell/octeontx/otx_cptpf_ucode.c +f:drivers/crypto/marvell/octeontx/otx_cptpf_ucode.h +f:drivers/crypto/marvell/octeontx/otx_cptvf.h +f:drivers/crypto/marvell/octeontx/otx_cptvf_algs.c +f:drivers/crypto/marvell/octeontx/otx_cptvf_algs.h +f:drivers/crypto/marvell/octeontx/otx_cptvf_main.c +f:drivers/crypto/marvell/octeontx/otx_cptvf_mbox.c +f:drivers/crypto/marvell/octeontx/otx_cptvf_reqmgr.c +f:drivers/crypto/marvell/octeontx/otx_cptvf_reqmgr.h +f:drivers/crypto/marvell/octeontx2/Makefile +f:drivers/crypto/marvell/octeontx2/cn10k_cpt.c +f:drivers/crypto/marvell/octeontx2/cn10k_cpt.h +f:drivers/crypto/marvell/octeontx2/otx2_cpt_common.h +f:drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.c +f:drivers/crypto/marvell/octeontx2/otx2_cpt_devlink.h +f:drivers/crypto/marvell/octeontx2/otx2_cpt_hw_types.h +f:drivers/crypto/marvell/octeontx2/otx2_cpt_mbox_common.c +f:drivers/crypto/marvell/octeontx2/otx2_cpt_reqmgr.h +f:drivers/crypto/marvell/octeontx2/otx2_cptlf.c +f:drivers/crypto/marvell/octeontx2/otx2_cptlf.h +f:drivers/crypto/marvell/octeontx2/otx2_cptpf.h +f:drivers/crypto/marvell/octeontx2/otx2_cptpf_main.c +f:drivers/crypto/marvell/octeontx2/otx2_cptpf_mbox.c +f:drivers/crypto/marvell/octeontx2/otx2_cptpf_ucode.c +f:drivers/crypto/marvell/octeontx2/otx2_cptpf_ucode.h +f:drivers/crypto/marvell/octeontx2/otx2_cptvf.h +f:drivers/crypto/marvell/octeontx2/otx2_cptvf_algs.c +f:drivers/crypto/marvell/octeontx2/otx2_cptvf_algs.h +f:drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c +f:drivers/crypto/marvell/octeontx2/otx2_cptvf_mbox.c +f:drivers/crypto/marvell/octeontx2/otx2_cptvf_reqmgr.c +f:drivers/crypto/mxs-dcp.c +f:drivers/crypto/nx/Kconfig +f:drivers/crypto/nx/Makefile +f:drivers/crypto/nx/nx-842.c +f:drivers/crypto/nx/nx-842.h +f:drivers/crypto/nx/nx-aes-cbc.c +f:drivers/crypto/nx/nx-aes-ccm.c +f:drivers/crypto/nx/nx-aes-ctr.c +f:drivers/crypto/nx/nx-aes-ecb.c +f:drivers/crypto/nx/nx-aes-gcm.c +f:drivers/crypto/nx/nx-aes-xcbc.c +f:drivers/crypto/nx/nx-common-powernv.c +f:drivers/crypto/nx/nx-common-pseries.c +f:drivers/crypto/nx/nx-sha256.c +f:drivers/crypto/nx/nx-sha512.c +f:drivers/crypto/nx/nx.c +f:drivers/crypto/nx/nx.h +f:drivers/crypto/nx/nx_csbcpb.h +f:drivers/crypto/nx/nx_debugfs.c +f:drivers/crypto/omap-aes-gcm.c +f:drivers/crypto/omap-aes.c +f:drivers/crypto/omap-aes.h +f:drivers/crypto/omap-crypto.c +f:drivers/crypto/omap-crypto.h +f:drivers/crypto/omap-des.c +f:drivers/crypto/omap-sham.c +f:drivers/crypto/padlock-aes.c +f:drivers/crypto/padlock-sha.c +f:drivers/crypto/qce/Makefile +f:drivers/crypto/qce/aead.c +f:drivers/crypto/qce/aead.h +f:drivers/crypto/qce/cipher.h +f:drivers/crypto/qce/common.c +f:drivers/crypto/qce/common.h +f:drivers/crypto/qce/core.c +f:drivers/crypto/qce/core.h +f:drivers/crypto/qce/dma.c +f:drivers/crypto/qce/dma.h +f:drivers/crypto/qce/regs-v5.h +f:drivers/crypto/qce/sha.c +f:drivers/crypto/qce/sha.h +f:drivers/crypto/qce/skcipher.c +f:drivers/crypto/qcom-rng.c +f:drivers/crypto/rockchip/Makefile +f:drivers/crypto/rockchip/rk3288_crypto.c +f:drivers/crypto/rockchip/rk3288_crypto.h +f:drivers/crypto/rockchip/rk3288_crypto_ahash.c +f:drivers/crypto/rockchip/rk3288_crypto_skcipher.c +f:drivers/crypto/s5p-sss.c +f:drivers/crypto/sa2ul.c +f:drivers/crypto/sa2ul.h +f:drivers/crypto/sahara.c +f:drivers/crypto/starfive/Kconfig +f:drivers/crypto/starfive/Makefile +f:drivers/crypto/starfive/jh7110-aes.c +f:drivers/crypto/starfive/jh7110-cryp.c +f:drivers/crypto/starfive/jh7110-cryp.h +f:drivers/crypto/starfive/jh7110-hash.c +f:drivers/crypto/starfive/jh7110-rsa.c +f:drivers/crypto/stm32/Kconfig +f:drivers/crypto/stm32/Makefile +f:drivers/crypto/stm32/stm32-cryp.c +f:drivers/crypto/stm32/stm32-hash.c +f:drivers/crypto/talitos.c +f:drivers/crypto/talitos.h +f:drivers/crypto/tegra/Makefile +f:drivers/crypto/tegra/tegra-se-aes.c +f:drivers/crypto/tegra/tegra-se-hash.c +f:drivers/crypto/tegra/tegra-se-key.c +f:drivers/crypto/tegra/tegra-se-main.c +f:drivers/crypto/tegra/tegra-se.h +f:drivers/crypto/virtio/Kconfig +f:drivers/crypto/virtio/Makefile +f:drivers/crypto/virtio/virtio_crypto_akcipher_algs.c +f:drivers/crypto/virtio/virtio_crypto_common.h +f:drivers/crypto/virtio/virtio_crypto_core.c +f:drivers/crypto/virtio/virtio_crypto_mgr.c +f:drivers/crypto/virtio/virtio_crypto_skcipher_algs.c +f:drivers/crypto/xilinx/Makefile +f:drivers/crypto/xilinx/zynqmp-aes-gcm.c +f:drivers/crypto/xilinx/zynqmp-sha.c +f:drivers/cxl/Kconfig +f:drivers/cxl/Makefile +f:drivers/cxl/acpi.c +f:drivers/cxl/core/Makefile +f:drivers/cxl/core/acpi.c +f:drivers/cxl/core/cdat.c +f:drivers/cxl/core/core.h +f:drivers/cxl/core/edac.c +f:drivers/cxl/core/features.c +f:drivers/cxl/core/hdm.c +f:drivers/cxl/core/mbox.c +f:drivers/cxl/core/mce.c +f:drivers/cxl/core/mce.h +f:drivers/cxl/core/memdev.c +f:drivers/cxl/core/pci.c +f:drivers/cxl/core/pmem.c +f:drivers/cxl/core/pmu.c +f:drivers/cxl/core/port.c +f:drivers/cxl/core/ras.c +f:drivers/cxl/core/region.c +f:drivers/cxl/core/regs.c +f:drivers/cxl/core/suspend.c +f:drivers/cxl/core/trace.c +f:drivers/cxl/core/trace.h +f:drivers/cxl/cxl.h +f:drivers/cxl/cxlmem.h +f:drivers/cxl/cxlpci.h +f:drivers/cxl/mem.c +f:drivers/cxl/pci.c +f:drivers/cxl/pmem.c +f:drivers/cxl/pmu.h +f:drivers/cxl/port.c +f:drivers/cxl/security.c +f:drivers/dax/Kconfig +f:drivers/dax/Makefile +f:drivers/dax/bus.c +f:drivers/dax/bus.h +f:drivers/dax/cxl.c +f:drivers/dax/dax-private.h +f:drivers/dax/device.c +f:drivers/dax/hmem/Makefile +f:drivers/dax/hmem/device.c +f:drivers/dax/hmem/hmem.c +f:drivers/dax/kmem.c +f:drivers/dax/pmem.c +f:drivers/dax/super.c +f:drivers/dca/Kconfig +f:drivers/dca/Makefile +f:drivers/dca/dca-core.c +f:drivers/dca/dca-sysfs.c +f:drivers/devfreq/Kconfig +f:drivers/devfreq/Makefile +f:drivers/devfreq/devfreq-event.c +f:drivers/devfreq/devfreq.c +f:drivers/devfreq/event/Kconfig +f:drivers/devfreq/event/Makefile +f:drivers/devfreq/event/exynos-nocp.c +f:drivers/devfreq/event/exynos-nocp.h +f:drivers/devfreq/event/exynos-ppmu.c +f:drivers/devfreq/event/exynos-ppmu.h +f:drivers/devfreq/event/rockchip-dfi.c +f:drivers/devfreq/exynos-bus.c +f:drivers/devfreq/governor.h +f:drivers/devfreq/governor_passive.c +f:drivers/devfreq/governor_performance.c +f:drivers/devfreq/governor_powersave.c +f:drivers/devfreq/governor_simpleondemand.c +f:drivers/devfreq/governor_userspace.c +f:drivers/devfreq/hisi_uncore_freq.c +f:drivers/devfreq/imx-bus.c +f:drivers/devfreq/imx8m-ddrc.c +f:drivers/devfreq/mtk-cci-devfreq.c +f:drivers/devfreq/rk3399_dmc.c +f:drivers/devfreq/sun8i-a33-mbus.c +f:drivers/devfreq/tegra30-devfreq.c +f:drivers/dio/Makefile +f:drivers/dio/dio-driver.c +f:drivers/dio/dio-sysfs.c +f:drivers/dio/dio.c +f:drivers/dma-buf/Kconfig +f:drivers/dma-buf/Makefile +f:drivers/dma-buf/dma-buf-sysfs-stats.c +f:drivers/dma-buf/dma-buf-sysfs-stats.h +f:drivers/dma-buf/dma-buf.c +f:drivers/dma-buf/dma-fence-array.c +f:drivers/dma-buf/dma-fence-chain.c +f:drivers/dma-buf/dma-fence-unwrap.c +f:drivers/dma-buf/dma-fence.c +f:drivers/dma-buf/dma-heap.c +f:drivers/dma-buf/dma-resv.c +f:drivers/dma-buf/heaps/Kconfig +f:drivers/dma-buf/heaps/Makefile +f:drivers/dma-buf/heaps/cma_heap.c +f:drivers/dma-buf/heaps/system_heap.c +f:drivers/dma-buf/selftest.c +f:drivers/dma-buf/selftest.h +f:drivers/dma-buf/selftests.h +f:drivers/dma-buf/st-dma-fence-chain.c +f:drivers/dma-buf/st-dma-fence-unwrap.c +f:drivers/dma-buf/st-dma-fence.c +f:drivers/dma-buf/st-dma-resv.c +f:drivers/dma-buf/sw_sync.c +f:drivers/dma-buf/sync_debug.c +f:drivers/dma-buf/sync_debug.h +f:drivers/dma-buf/sync_file.c +f:drivers/dma-buf/sync_trace.h +f:drivers/dma-buf/udmabuf.c +f:drivers/dma/Kconfig +f:drivers/dma/Makefile +f:drivers/dma/TODO +f:drivers/dma/acpi-dma.c +f:drivers/dma/altera-msgdma.c +f:drivers/dma/amba-pl08x.c +f:drivers/dma/amd/Kconfig +f:drivers/dma/amd/Makefile +f:drivers/dma/amd/ae4dma/Makefile +f:drivers/dma/amd/ae4dma/ae4dma-dev.c +f:drivers/dma/amd/ae4dma/ae4dma-pci.c +f:drivers/dma/amd/ae4dma/ae4dma.h +f:drivers/dma/amd/ptdma/Makefile +f:drivers/dma/amd/ptdma/ptdma-debugfs.c +f:drivers/dma/amd/ptdma/ptdma-dev.c +f:drivers/dma/amd/ptdma/ptdma-dmaengine.c +f:drivers/dma/amd/ptdma/ptdma-pci.c +f:drivers/dma/amd/ptdma/ptdma.h +f:drivers/dma/amd/qdma/Makefile +f:drivers/dma/amd/qdma/qdma-comm-regs.c +f:drivers/dma/amd/qdma/qdma.c +f:drivers/dma/amd/qdma/qdma.h +f:drivers/dma/apple-admac.c +f:drivers/dma/arm-dma350.c +f:drivers/dma/at_hdmac.c +f:drivers/dma/at_xdmac.c +f:drivers/dma/bcm-sba-raid.c +f:drivers/dma/bcm2835-dma.c +f:drivers/dma/bestcomm/Kconfig +f:drivers/dma/bestcomm/Makefile +f:drivers/dma/bestcomm/ata.c +f:drivers/dma/bestcomm/bcom_ata_task.c +f:drivers/dma/bestcomm/bcom_fec_rx_task.c +f:drivers/dma/bestcomm/bcom_fec_tx_task.c +f:drivers/dma/bestcomm/bcom_gen_bd_rx_task.c +f:drivers/dma/bestcomm/bcom_gen_bd_tx_task.c +f:drivers/dma/bestcomm/bestcomm.c +f:drivers/dma/bestcomm/fec.c +f:drivers/dma/bestcomm/gen_bd.c +f:drivers/dma/bestcomm/sram.c +f:drivers/dma/dma-axi-dmac.c +f:drivers/dma/dma-jz4780.c +f:drivers/dma/dmaengine.c +f:drivers/dma/dmaengine.h +f:drivers/dma/dmatest.c +f:drivers/dma/dw-axi-dmac/Makefile +f:drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c +f:drivers/dma/dw-axi-dmac/dw-axi-dmac.h +f:drivers/dma/dw-edma/Kconfig +f:drivers/dma/dw-edma/Makefile +f:drivers/dma/dw-edma/dw-edma-core.c +f:drivers/dma/dw-edma/dw-edma-core.h +f:drivers/dma/dw-edma/dw-edma-pcie.c +f:drivers/dma/dw-edma/dw-edma-v0-core.c +f:drivers/dma/dw-edma/dw-edma-v0-core.h +f:drivers/dma/dw-edma/dw-edma-v0-debugfs.c +f:drivers/dma/dw-edma/dw-edma-v0-debugfs.h +f:drivers/dma/dw-edma/dw-edma-v0-regs.h +f:drivers/dma/dw-edma/dw-hdma-v0-core.c +f:drivers/dma/dw-edma/dw-hdma-v0-core.h +f:drivers/dma/dw-edma/dw-hdma-v0-debugfs.c +f:drivers/dma/dw-edma/dw-hdma-v0-debugfs.h +f:drivers/dma/dw-edma/dw-hdma-v0-regs.h +f:drivers/dma/dw/Kconfig +f:drivers/dma/dw/Makefile +f:drivers/dma/dw/acpi.c +f:drivers/dma/dw/core.c +f:drivers/dma/dw/dw.c +f:drivers/dma/dw/idma32.c +f:drivers/dma/dw/internal.h +f:drivers/dma/dw/of.c +f:drivers/dma/dw/pci.c +f:drivers/dma/dw/platform.c +f:drivers/dma/dw/regs.h +f:drivers/dma/dw/rzn1-dmamux.c +f:drivers/dma/ep93xx_dma.c +f:drivers/dma/fsl-dpaa2-qdma/Kconfig +f:drivers/dma/fsl-dpaa2-qdma/Makefile +f:drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c +f:drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h +f:drivers/dma/fsl-dpaa2-qdma/dpdmai.c +f:drivers/dma/fsl-dpaa2-qdma/dpdmai.h +f:drivers/dma/fsl-edma-common.c +f:drivers/dma/fsl-edma-common.h +f:drivers/dma/fsl-edma-main.c +f:drivers/dma/fsl-edma-trace.c +f:drivers/dma/fsl-edma-trace.h +f:drivers/dma/fsl-qdma.c +f:drivers/dma/fsl_raid.c +f:drivers/dma/fsl_raid.h +f:drivers/dma/fsldma.c +f:drivers/dma/fsldma.h +f:drivers/dma/hisi_dma.c +f:drivers/dma/hsu/Kconfig +f:drivers/dma/hsu/Makefile +f:drivers/dma/hsu/hsu.c +f:drivers/dma/hsu/hsu.h +f:drivers/dma/hsu/pci.c +f:drivers/dma/idma64.c +f:drivers/dma/idma64.h +f:drivers/dma/idxd/Makefile +f:drivers/dma/idxd/bus.c +f:drivers/dma/idxd/cdev.c +f:drivers/dma/idxd/compat.c +f:drivers/dma/idxd/debugfs.c +f:drivers/dma/idxd/defaults.c +f:drivers/dma/idxd/device.c +f:drivers/dma/idxd/dma.c +f:drivers/dma/idxd/idxd.h +f:drivers/dma/idxd/init.c +f:drivers/dma/idxd/irq.c +f:drivers/dma/idxd/perfmon.c +f:drivers/dma/idxd/perfmon.h +f:drivers/dma/idxd/registers.h +f:drivers/dma/idxd/submit.c +f:drivers/dma/idxd/sysfs.c +f:drivers/dma/img-mdc-dma.c +f:drivers/dma/imx-dma.c +f:drivers/dma/imx-sdma.c +f:drivers/dma/ioat/Makefile +f:drivers/dma/ioat/dca.c +f:drivers/dma/ioat/dma.c +f:drivers/dma/ioat/dma.h +f:drivers/dma/ioat/hw.h +f:drivers/dma/ioat/init.c +f:drivers/dma/ioat/prep.c +f:drivers/dma/ioat/registers.h +f:drivers/dma/ioat/sysfs.c +f:drivers/dma/k3dma.c +f:drivers/dma/lgm/Kconfig +f:drivers/dma/lgm/Makefile +f:drivers/dma/lgm/lgm-dma.c +f:drivers/dma/loongson1-apb-dma.c +f:drivers/dma/loongson2-apb-dma.c +f:drivers/dma/lpc18xx-dmamux.c +f:drivers/dma/lpc32xx-dmamux.c +f:drivers/dma/mcf-edma-main.c +f:drivers/dma/mediatek/Kconfig +f:drivers/dma/mediatek/Makefile +f:drivers/dma/mediatek/mtk-cqdma.c +f:drivers/dma/mediatek/mtk-hsdma.c +f:drivers/dma/mediatek/mtk-uart-apdma.c +f:drivers/dma/milbeaut-hdmac.c +f:drivers/dma/milbeaut-xdmac.c +f:drivers/dma/mmp_pdma.c +f:drivers/dma/mmp_tdma.c +f:drivers/dma/moxart-dma.c +f:drivers/dma/mpc512x_dma.c +f:drivers/dma/mv_xor.c +f:drivers/dma/mv_xor.h +f:drivers/dma/mv_xor_v2.c +f:drivers/dma/mxs-dma.c +f:drivers/dma/nbpfaxi.c +f:drivers/dma/of-dma.c +f:drivers/dma/owl-dma.c +f:drivers/dma/pch_dma.c +f:drivers/dma/pl330.c +f:drivers/dma/plx_dma.c +f:drivers/dma/ppc4xx/Makefile +f:drivers/dma/ppc4xx/adma.c +f:drivers/dma/ppc4xx/adma.h +f:drivers/dma/ppc4xx/dma.h +f:drivers/dma/ppc4xx/xor.h +f:drivers/dma/pxa_dma.c +f:drivers/dma/qcom/Kconfig +f:drivers/dma/qcom/Makefile +f:drivers/dma/qcom/bam_dma.c +f:drivers/dma/qcom/gpi.c +f:drivers/dma/qcom/hidma.c +f:drivers/dma/qcom/hidma.h +f:drivers/dma/qcom/hidma_dbg.c +f:drivers/dma/qcom/hidma_ll.c +f:drivers/dma/qcom/hidma_mgmt.c +f:drivers/dma/qcom/hidma_mgmt.h +f:drivers/dma/qcom/hidma_mgmt_sys.c +f:drivers/dma/qcom/qcom_adm.c +f:drivers/dma/sa11x0-dma.c +f:drivers/dma/sf-pdma/Kconfig +f:drivers/dma/sf-pdma/Makefile +f:drivers/dma/sf-pdma/sf-pdma.c +f:drivers/dma/sf-pdma/sf-pdma.h +f:drivers/dma/sh/Kconfig +f:drivers/dma/sh/Makefile +f:drivers/dma/sh/rcar-dmac.c +f:drivers/dma/sh/rz-dmac.c +f:drivers/dma/sh/shdma-base.c +f:drivers/dma/sh/shdma.h +f:drivers/dma/sh/shdmac.c +f:drivers/dma/sh/usb-dmac.c +f:drivers/dma/sprd-dma.c +f:drivers/dma/st_fdma.c +f:drivers/dma/st_fdma.h +f:drivers/dma/ste_dma40.c +f:drivers/dma/ste_dma40.h +f:drivers/dma/ste_dma40_ll.c +f:drivers/dma/ste_dma40_ll.h +f:drivers/dma/stm32/Kconfig +f:drivers/dma/stm32/Makefile +f:drivers/dma/stm32/stm32-dma.c +f:drivers/dma/stm32/stm32-dma3.c +f:drivers/dma/stm32/stm32-dmamux.c +f:drivers/dma/stm32/stm32-mdma.c +f:drivers/dma/sun4i-dma.c +f:drivers/dma/sun6i-dma.c +f:drivers/dma/tegra186-gpc-dma.c +f:drivers/dma/tegra20-apb-dma.c +f:drivers/dma/tegra210-adma.c +f:drivers/dma/ti/Kconfig +f:drivers/dma/ti/Makefile +f:drivers/dma/ti/cppi41.c +f:drivers/dma/ti/dma-crossbar.c +f:drivers/dma/ti/edma.c +f:drivers/dma/ti/k3-psil-am62.c +f:drivers/dma/ti/k3-psil-am62a.c +f:drivers/dma/ti/k3-psil-am62p.c +f:drivers/dma/ti/k3-psil-am64.c +f:drivers/dma/ti/k3-psil-am654.c +f:drivers/dma/ti/k3-psil-j7200.c +f:drivers/dma/ti/k3-psil-j721e.c +f:drivers/dma/ti/k3-psil-j721s2.c +f:drivers/dma/ti/k3-psil-j784s4.c +f:drivers/dma/ti/k3-psil-priv.h +f:drivers/dma/ti/k3-psil.c +f:drivers/dma/ti/k3-udma-glue.c +f:drivers/dma/ti/k3-udma-private.c +f:drivers/dma/ti/k3-udma.c +f:drivers/dma/ti/k3-udma.h +f:drivers/dma/ti/omap-dma.c +f:drivers/dma/timb_dma.c +f:drivers/dma/txx9dmac.c +f:drivers/dma/txx9dmac.h +f:drivers/dma/uniphier-mdmac.c +f:drivers/dma/uniphier-xdmac.c +f:drivers/dma/virt-dma.c +f:drivers/dma/virt-dma.h +f:drivers/dma/xgene-dma.c +f:drivers/dma/xilinx/Makefile +f:drivers/dma/xilinx/xdma-regs.h +f:drivers/dma/xilinx/xdma.c +f:drivers/dma/xilinx/xilinx_dma.c +f:drivers/dma/xilinx/xilinx_dpdma.c +f:drivers/dma/xilinx/zynqmp_dma.c +f:drivers/dpll/Kconfig +f:drivers/dpll/Makefile +f:drivers/dpll/dpll_core.c +f:drivers/dpll/dpll_core.h +f:drivers/dpll/dpll_netlink.c +f:drivers/dpll/dpll_netlink.h +f:drivers/dpll/dpll_nl.c +f:drivers/dpll/dpll_nl.h +f:drivers/dpll/zl3073x/Kconfig +f:drivers/dpll/zl3073x/Makefile +f:drivers/dpll/zl3073x/core.c +f:drivers/dpll/zl3073x/core.h +f:drivers/dpll/zl3073x/devlink.c +f:drivers/dpll/zl3073x/devlink.h +f:drivers/dpll/zl3073x/dpll.c +f:drivers/dpll/zl3073x/dpll.h +f:drivers/dpll/zl3073x/i2c.c +f:drivers/dpll/zl3073x/prop.c +f:drivers/dpll/zl3073x/prop.h +f:drivers/dpll/zl3073x/regs.h +f:drivers/dpll/zl3073x/spi.c +f:drivers/edac/Kconfig +f:drivers/edac/Makefile +f:drivers/edac/al_mc_edac.c +f:drivers/edac/altera_edac.c +f:drivers/edac/altera_edac.h +f:drivers/edac/amd64_edac.c +f:drivers/edac/amd64_edac.h +f:drivers/edac/amd76x_edac.c +f:drivers/edac/armada_xp_edac.c +f:drivers/edac/aspeed_edac.c +f:drivers/edac/bluefield_edac.c +f:drivers/edac/cpc925_edac.c +f:drivers/edac/debugfs.c +f:drivers/edac/dmc520_edac.c +f:drivers/edac/e752x_edac.c +f:drivers/edac/e7xxx_edac.c +f:drivers/edac/ecs.c +f:drivers/edac/edac_device.c +f:drivers/edac/edac_device.h +f:drivers/edac/edac_device_sysfs.c +f:drivers/edac/edac_mc.c +f:drivers/edac/edac_mc.h +f:drivers/edac/edac_mc_sysfs.c +f:drivers/edac/edac_module.c +f:drivers/edac/edac_module.h +f:drivers/edac/edac_pci.c +f:drivers/edac/edac_pci.h +f:drivers/edac/edac_pci_sysfs.c +f:drivers/edac/fsl_ddr_edac.c +f:drivers/edac/fsl_ddr_edac.h +f:drivers/edac/ghes_edac.c +f:drivers/edac/highbank_l2_edac.c +f:drivers/edac/highbank_mc_edac.c +f:drivers/edac/i10nm_base.c +f:drivers/edac/i3000_edac.c +f:drivers/edac/i3200_edac.c +f:drivers/edac/i5000_edac.c +f:drivers/edac/i5100_edac.c +f:drivers/edac/i5400_edac.c +f:drivers/edac/i7300_edac.c +f:drivers/edac/i7core_edac.c +f:drivers/edac/i82443bxgx_edac.c +f:drivers/edac/i82860_edac.c +f:drivers/edac/i82875p_edac.c +f:drivers/edac/i82975x_edac.c +f:drivers/edac/ie31200_edac.c +f:drivers/edac/igen6_edac.c +f:drivers/edac/layerscape_edac.c +f:drivers/edac/loongson_edac.c +f:drivers/edac/mce_amd.c +f:drivers/edac/mce_amd.h +f:drivers/edac/mem_repair.c +f:drivers/edac/mpc85xx_edac.c +f:drivers/edac/mpc85xx_edac.h +f:drivers/edac/npcm_edac.c +f:drivers/edac/octeon_edac-l2c.c +f:drivers/edac/octeon_edac-lmc.c +f:drivers/edac/octeon_edac-pc.c +f:drivers/edac/octeon_edac-pci.c +f:drivers/edac/pasemi_edac.c +f:drivers/edac/pnd2_edac.c +f:drivers/edac/pnd2_edac.h +f:drivers/edac/qcom_edac.c +f:drivers/edac/r82600_edac.c +f:drivers/edac/sb_edac.c +f:drivers/edac/scrub.c +f:drivers/edac/sifive_edac.c +f:drivers/edac/skx_base.c +f:drivers/edac/skx_common.c +f:drivers/edac/skx_common.h +f:drivers/edac/synopsys_edac.c +f:drivers/edac/thunderx_edac.c +f:drivers/edac/ti_edac.c +f:drivers/edac/versal_edac.c +f:drivers/edac/wq.c +f:drivers/edac/x38_edac.c +f:drivers/edac/xgene_edac.c +f:drivers/edac/zynqmp_edac.c +f:drivers/eisa/.gitignore +f:drivers/eisa/Kconfig +f:drivers/eisa/Makefile +f:drivers/eisa/eisa-bus.c +f:drivers/eisa/eisa.ids +f:drivers/eisa/pci_eisa.c +f:drivers/eisa/virtual_root.c +f:drivers/extcon/Kconfig +f:drivers/extcon/Makefile +f:drivers/extcon/devres.c +f:drivers/extcon/extcon-adc-jack.c +f:drivers/extcon/extcon-axp288.c +f:drivers/extcon/extcon-fsa9480.c +f:drivers/extcon/extcon-gpio.c +f:drivers/extcon/extcon-intel-cht-wc.c +f:drivers/extcon/extcon-intel-int3496.c +f:drivers/extcon/extcon-intel-mrfld.c +f:drivers/extcon/extcon-intel.h +f:drivers/extcon/extcon-lc824206xa.c +f:drivers/extcon/extcon-max14577.c +f:drivers/extcon/extcon-max3355.c +f:drivers/extcon/extcon-max77693.c +f:drivers/extcon/extcon-max77843.c +f:drivers/extcon/extcon-max8997.c +f:drivers/extcon/extcon-palmas.c +f:drivers/extcon/extcon-ptn5150.c +f:drivers/extcon/extcon-qcom-spmi-misc.c +f:drivers/extcon/extcon-rt8973a.c +f:drivers/extcon/extcon-rt8973a.h +f:drivers/extcon/extcon-rtk-type-c.c +f:drivers/extcon/extcon-sm5502.c +f:drivers/extcon/extcon-sm5502.h +f:drivers/extcon/extcon-usb-gpio.c +f:drivers/extcon/extcon-usbc-cros-ec.c +f:drivers/extcon/extcon-usbc-tusb320.c +f:drivers/extcon/extcon.c +f:drivers/extcon/extcon.h +f:drivers/firewire/.kunitconfig +f:drivers/firewire/Kconfig +f:drivers/firewire/Makefile +f:drivers/firewire/core-card.c +f:drivers/firewire/core-cdev.c +f:drivers/firewire/core-device.c +f:drivers/firewire/core-iso.c +f:drivers/firewire/core-topology.c +f:drivers/firewire/core-trace.c +f:drivers/firewire/core-transaction.c +f:drivers/firewire/core.h +f:drivers/firewire/device-attribute-test.c +f:drivers/firewire/init_ohci1394_dma.c +f:drivers/firewire/net.c +f:drivers/firewire/nosy-user.h +f:drivers/firewire/nosy.c +f:drivers/firewire/nosy.h +f:drivers/firewire/ohci-serdes-test.c +f:drivers/firewire/ohci.c +f:drivers/firewire/ohci.h +f:drivers/firewire/packet-header-definitions.h +f:drivers/firewire/packet-serdes-test.c +f:drivers/firewire/phy-packet-definitions.h +f:drivers/firewire/sbp2.c +f:drivers/firewire/self-id-sequence-helper-test.c +f:drivers/firewire/uapi-test.c +f:drivers/firmware/Kconfig +f:drivers/firmware/Makefile +f:drivers/firmware/arm_ffa/Kconfig +f:drivers/firmware/arm_ffa/Makefile +f:drivers/firmware/arm_ffa/bus.c +f:drivers/firmware/arm_ffa/common.h +f:drivers/firmware/arm_ffa/driver.c +f:drivers/firmware/arm_ffa/smccc.c +f:drivers/firmware/arm_scmi/Kconfig +f:drivers/firmware/arm_scmi/Makefile +f:drivers/firmware/arm_scmi/base.c +f:drivers/firmware/arm_scmi/bus.c +f:drivers/firmware/arm_scmi/clock.c +f:drivers/firmware/arm_scmi/common.h +f:drivers/firmware/arm_scmi/driver.c +f:drivers/firmware/arm_scmi/msg.c +f:drivers/firmware/arm_scmi/notify.c +f:drivers/firmware/arm_scmi/notify.h +f:drivers/firmware/arm_scmi/perf.c +f:drivers/firmware/arm_scmi/pinctrl.c +f:drivers/firmware/arm_scmi/power.c +f:drivers/firmware/arm_scmi/powercap.c +f:drivers/firmware/arm_scmi/protocols.h +f:drivers/firmware/arm_scmi/quirks.c +f:drivers/firmware/arm_scmi/quirks.h +f:drivers/firmware/arm_scmi/raw_mode.c +f:drivers/firmware/arm_scmi/raw_mode.h +f:drivers/firmware/arm_scmi/reset.c +f:drivers/firmware/arm_scmi/scmi_power_control.c +f:drivers/firmware/arm_scmi/sensors.c +f:drivers/firmware/arm_scmi/shmem.c +f:drivers/firmware/arm_scmi/system.c +f:drivers/firmware/arm_scmi/transports/Kconfig +f:drivers/firmware/arm_scmi/transports/Makefile +f:drivers/firmware/arm_scmi/transports/mailbox.c +f:drivers/firmware/arm_scmi/transports/optee.c +f:drivers/firmware/arm_scmi/transports/smc.c +f:drivers/firmware/arm_scmi/transports/virtio.c +f:drivers/firmware/arm_scmi/vendors/imx/Kconfig +f:drivers/firmware/arm_scmi/vendors/imx/Makefile +f:drivers/firmware/arm_scmi/vendors/imx/imx-sm-bbm.c +f:drivers/firmware/arm_scmi/vendors/imx/imx-sm-cpu.c +f:drivers/firmware/arm_scmi/vendors/imx/imx-sm-lmm.c +f:drivers/firmware/arm_scmi/vendors/imx/imx-sm-misc.c +f:drivers/firmware/arm_scmi/vendors/imx/imx95.rst +f:drivers/firmware/arm_scmi/voltage.c +f:drivers/firmware/arm_scpi.c +f:drivers/firmware/arm_sdei.c +f:drivers/firmware/broadcom/Kconfig +f:drivers/firmware/broadcom/Makefile +f:drivers/firmware/broadcom/bcm47xx_nvram.c +f:drivers/firmware/broadcom/bcm47xx_sprom.c +f:drivers/firmware/broadcom/tee_bnxt_fw.c +f:drivers/firmware/cirrus/Kconfig +f:drivers/firmware/cirrus/Makefile +f:drivers/firmware/cirrus/cs_dsp.c +f:drivers/firmware/cirrus/test/Makefile +f:drivers/firmware/cirrus/test/cs_dsp_mock_bin.c +f:drivers/firmware/cirrus/test/cs_dsp_mock_mem_maps.c +f:drivers/firmware/cirrus/test/cs_dsp_mock_regmap.c +f:drivers/firmware/cirrus/test/cs_dsp_mock_utils.c +f:drivers/firmware/cirrus/test/cs_dsp_mock_wmfw.c +f:drivers/firmware/cirrus/test/cs_dsp_test_bin.c +f:drivers/firmware/cirrus/test/cs_dsp_test_bin_error.c +f:drivers/firmware/cirrus/test/cs_dsp_test_callbacks.c +f:drivers/firmware/cirrus/test/cs_dsp_test_control_cache.c +f:drivers/firmware/cirrus/test/cs_dsp_test_control_parse.c +f:drivers/firmware/cirrus/test/cs_dsp_test_control_rw.c +f:drivers/firmware/cirrus/test/cs_dsp_test_wmfw.c +f:drivers/firmware/cirrus/test/cs_dsp_test_wmfw_error.c +f:drivers/firmware/cirrus/test/cs_dsp_tests.c +f:drivers/firmware/dmi-id.c +f:drivers/firmware/dmi-sysfs.c +f:drivers/firmware/dmi_scan.c +f:drivers/firmware/edd.c +f:drivers/firmware/efi/Kconfig +f:drivers/firmware/efi/Makefile +f:drivers/firmware/efi/apple-properties.c +f:drivers/firmware/efi/arm-runtime.c +f:drivers/firmware/efi/capsule-loader.c +f:drivers/firmware/efi/capsule.c +f:drivers/firmware/efi/cper-arm.c +f:drivers/firmware/efi/cper-x86.c +f:drivers/firmware/efi/cper.c +f:drivers/firmware/efi/cper_cxl.c +f:drivers/firmware/efi/dev-path-parser.c +f:drivers/firmware/efi/earlycon.c +f:drivers/firmware/efi/efi-bgrt.c +f:drivers/firmware/efi/efi-init.c +f:drivers/firmware/efi/efi-pstore.c +f:drivers/firmware/efi/efi.c +f:drivers/firmware/efi/efibc.c +f:drivers/firmware/efi/embedded-firmware.c +f:drivers/firmware/efi/esrt.c +f:drivers/firmware/efi/fdtparams.c +f:drivers/firmware/efi/libstub/Makefile +f:drivers/firmware/efi/libstub/Makefile.zboot +f:drivers/firmware/efi/libstub/alignedmem.c +f:drivers/firmware/efi/libstub/arm32-stub.c +f:drivers/firmware/efi/libstub/arm64-stub.c +f:drivers/firmware/efi/libstub/arm64.c +f:drivers/firmware/efi/libstub/bitmap.c +f:drivers/firmware/efi/libstub/efi-stub-entry.c +f:drivers/firmware/efi/libstub/efi-stub-helper.c +f:drivers/firmware/efi/libstub/efi-stub.c +f:drivers/firmware/efi/libstub/efistub.h +f:drivers/firmware/efi/libstub/fdt.c +f:drivers/firmware/efi/libstub/file.c +f:drivers/firmware/efi/libstub/find.c +f:drivers/firmware/efi/libstub/gop.c +f:drivers/firmware/efi/libstub/intrinsics.c +f:drivers/firmware/efi/libstub/kaslr.c +f:drivers/firmware/efi/libstub/loongarch-stub.c +f:drivers/firmware/efi/libstub/loongarch-stub.h +f:drivers/firmware/efi/libstub/loongarch.c +f:drivers/firmware/efi/libstub/mem.c +f:drivers/firmware/efi/libstub/pci.c +f:drivers/firmware/efi/libstub/printk.c +f:drivers/firmware/efi/libstub/random.c +f:drivers/firmware/efi/libstub/randomalloc.c +f:drivers/firmware/efi/libstub/relocate.c +f:drivers/firmware/efi/libstub/riscv-stub.c +f:drivers/firmware/efi/libstub/riscv.c +f:drivers/firmware/efi/libstub/screen_info.c +f:drivers/firmware/efi/libstub/secureboot.c +f:drivers/firmware/efi/libstub/skip_spaces.c +f:drivers/firmware/efi/libstub/smbios.c +f:drivers/firmware/efi/libstub/string.c +f:drivers/firmware/efi/libstub/systable.c +f:drivers/firmware/efi/libstub/tpm.c +f:drivers/firmware/efi/libstub/unaccepted_memory.c +f:drivers/firmware/efi/libstub/vsprintf.c +f:drivers/firmware/efi/libstub/x86-5lvl.c +f:drivers/firmware/efi/libstub/x86-stub.c +f:drivers/firmware/efi/libstub/x86-stub.h +f:drivers/firmware/efi/libstub/zboot-decompress-gzip.c +f:drivers/firmware/efi/libstub/zboot-decompress-zstd.c +f:drivers/firmware/efi/libstub/zboot-header.S +f:drivers/firmware/efi/libstub/zboot.c +f:drivers/firmware/efi/libstub/zboot.lds +f:drivers/firmware/efi/memattr.c +f:drivers/firmware/efi/memmap.c +f:drivers/firmware/efi/mokvar-table.c +f:drivers/firmware/efi/rci2-table.c +f:drivers/firmware/efi/reboot.c +f:drivers/firmware/efi/riscv-runtime.c +f:drivers/firmware/efi/runtime-wrappers.c +f:drivers/firmware/efi/stmm/mm_communication.h +f:drivers/firmware/efi/stmm/tee_stmm_efi.c +f:drivers/firmware/efi/sysfb_efi.c +f:drivers/firmware/efi/test/Makefile +f:drivers/firmware/efi/test/efi_test.c +f:drivers/firmware/efi/test/efi_test.h +f:drivers/firmware/efi/tpm.c +f:drivers/firmware/efi/unaccepted_memory.c +f:drivers/firmware/efi/vars.c +f:drivers/firmware/google/Kconfig +f:drivers/firmware/google/Makefile +f:drivers/firmware/google/cbmem.c +f:drivers/firmware/google/coreboot_table.c +f:drivers/firmware/google/coreboot_table.h +f:drivers/firmware/google/framebuffer-coreboot.c +f:drivers/firmware/google/gsmi.c +f:drivers/firmware/google/memconsole-coreboot.c +f:drivers/firmware/google/memconsole-x86-legacy.c +f:drivers/firmware/google/memconsole.c +f:drivers/firmware/google/memconsole.h +f:drivers/firmware/google/vpd.c +f:drivers/firmware/google/vpd_decode.c +f:drivers/firmware/google/vpd_decode.h +f:drivers/firmware/imx/Kconfig +f:drivers/firmware/imx/Makefile +f:drivers/firmware/imx/imx-dsp.c +f:drivers/firmware/imx/imx-scu-irq.c +f:drivers/firmware/imx/imx-scu-soc.c +f:drivers/firmware/imx/imx-scu.c +f:drivers/firmware/imx/misc.c +f:drivers/firmware/imx/rm.c +f:drivers/firmware/imx/sm-cpu.c +f:drivers/firmware/imx/sm-lmm.c +f:drivers/firmware/imx/sm-misc.c +f:drivers/firmware/iscsi_ibft.c +f:drivers/firmware/iscsi_ibft_find.c +f:drivers/firmware/memmap.c +f:drivers/firmware/meson/Kconfig +f:drivers/firmware/meson/Makefile +f:drivers/firmware/meson/meson_sm.c +f:drivers/firmware/microchip/Kconfig +f:drivers/firmware/microchip/Makefile +f:drivers/firmware/microchip/mpfs-auto-update.c +f:drivers/firmware/mtk-adsp-ipc.c +f:drivers/firmware/psci/Kconfig +f:drivers/firmware/psci/Makefile +f:drivers/firmware/psci/psci.c +f:drivers/firmware/psci/psci_checker.c +f:drivers/firmware/qcom/Kconfig +f:drivers/firmware/qcom/Makefile +f:drivers/firmware/qcom/qcom_qseecom.c +f:drivers/firmware/qcom/qcom_qseecom_uefisecapp.c +f:drivers/firmware/qcom/qcom_scm-legacy.c +f:drivers/firmware/qcom/qcom_scm-smc.c +f:drivers/firmware/qcom/qcom_scm.c +f:drivers/firmware/qcom/qcom_scm.h +f:drivers/firmware/qcom/qcom_tzmem.c +f:drivers/firmware/qcom/qcom_tzmem.h +f:drivers/firmware/qemu_fw_cfg.c +f:drivers/firmware/raspberrypi.c +f:drivers/firmware/samsung/Kconfig +f:drivers/firmware/samsung/Makefile +f:drivers/firmware/samsung/exynos-acpm-pmic.c +f:drivers/firmware/samsung/exynos-acpm-pmic.h +f:drivers/firmware/samsung/exynos-acpm.c +f:drivers/firmware/samsung/exynos-acpm.h +f:drivers/firmware/smccc/Kconfig +f:drivers/firmware/smccc/Makefile +f:drivers/firmware/smccc/kvm_guest.c +f:drivers/firmware/smccc/smccc.c +f:drivers/firmware/smccc/soc_id.c +f:drivers/firmware/stratix10-rsu.c +f:drivers/firmware/stratix10-svc.c +f:drivers/firmware/sysfb.c +f:drivers/firmware/sysfb_simplefb.c +f:drivers/firmware/tegra/Kconfig +f:drivers/firmware/tegra/Makefile +f:drivers/firmware/tegra/bpmp-debugfs.c +f:drivers/firmware/tegra/bpmp-private.h +f:drivers/firmware/tegra/bpmp-tegra186.c +f:drivers/firmware/tegra/bpmp-tegra210.c +f:drivers/firmware/tegra/bpmp.c +f:drivers/firmware/tegra/ivc.c +f:drivers/firmware/thead,th1520-aon.c +f:drivers/firmware/ti_sci.c +f:drivers/firmware/ti_sci.h +f:drivers/firmware/trusted_foundations.c +f:drivers/firmware/turris-mox-rwtm.c +f:drivers/firmware/xilinx/Kconfig +f:drivers/firmware/xilinx/Makefile +f:drivers/firmware/xilinx/zynqmp-debug.c +f:drivers/firmware/xilinx/zynqmp-debug.h +f:drivers/firmware/xilinx/zynqmp.c +f:drivers/fpga/Kconfig +f:drivers/fpga/Makefile +f:drivers/fpga/altera-cvp.c +f:drivers/fpga/altera-fpga2sdram.c +f:drivers/fpga/altera-freeze-bridge.c +f:drivers/fpga/altera-hps2fpga.c +f:drivers/fpga/altera-pr-ip-core-plat.c +f:drivers/fpga/altera-pr-ip-core.c +f:drivers/fpga/altera-ps-spi.c +f:drivers/fpga/dfl-afu-dma-region.c +f:drivers/fpga/dfl-afu-error.c +f:drivers/fpga/dfl-afu-main.c +f:drivers/fpga/dfl-afu-region.c +f:drivers/fpga/dfl-afu.h +f:drivers/fpga/dfl-fme-br.c +f:drivers/fpga/dfl-fme-error.c +f:drivers/fpga/dfl-fme-main.c +f:drivers/fpga/dfl-fme-mgr.c +f:drivers/fpga/dfl-fme-perf.c +f:drivers/fpga/dfl-fme-pr.c +f:drivers/fpga/dfl-fme-pr.h +f:drivers/fpga/dfl-fme-region.c +f:drivers/fpga/dfl-fme.h +f:drivers/fpga/dfl-n3000-nios.c +f:drivers/fpga/dfl-pci.c +f:drivers/fpga/dfl.c +f:drivers/fpga/dfl.h +f:drivers/fpga/fpga-bridge.c +f:drivers/fpga/fpga-mgr.c +f:drivers/fpga/fpga-region.c +f:drivers/fpga/ice40-spi.c +f:drivers/fpga/intel-m10-bmc-sec-update.c +f:drivers/fpga/lattice-sysconfig-spi.c +f:drivers/fpga/lattice-sysconfig.c +f:drivers/fpga/lattice-sysconfig.h +f:drivers/fpga/machxo2-spi.c +f:drivers/fpga/microchip-spi.c +f:drivers/fpga/of-fpga-region.c +f:drivers/fpga/socfpga-a10.c +f:drivers/fpga/socfpga.c +f:drivers/fpga/stratix10-soc.c +f:drivers/fpga/tests/.kunitconfig +f:drivers/fpga/tests/Kconfig +f:drivers/fpga/tests/Makefile +f:drivers/fpga/tests/fpga-bridge-test.c +f:drivers/fpga/tests/fpga-mgr-test.c +f:drivers/fpga/tests/fpga-region-test.c +f:drivers/fpga/ts73xx-fpga.c +f:drivers/fpga/versal-fpga.c +f:drivers/fpga/xilinx-core.c +f:drivers/fpga/xilinx-core.h +f:drivers/fpga/xilinx-pr-decoupler.c +f:drivers/fpga/xilinx-selectmap.c +f:drivers/fpga/xilinx-spi.c +f:drivers/fpga/zynq-fpga.c +f:drivers/fpga/zynqmp-fpga.c +f:drivers/fsi/Kconfig +f:drivers/fsi/Makefile +f:drivers/fsi/cf-fsi-fw.h +f:drivers/fsi/fsi-core.c +f:drivers/fsi/fsi-master-aspeed.c +f:drivers/fsi/fsi-master-ast-cf.c +f:drivers/fsi/fsi-master-gpio.c +f:drivers/fsi/fsi-master-hub.c +f:drivers/fsi/fsi-master-i2cr.c +f:drivers/fsi/fsi-master-i2cr.h +f:drivers/fsi/fsi-master.h +f:drivers/fsi/fsi-occ.c +f:drivers/fsi/fsi-sbefifo.c +f:drivers/fsi/fsi-scom.c +f:drivers/fsi/fsi-slave.h +f:drivers/fsi/i2cr-scom.c +f:drivers/fwctl/Kconfig +f:drivers/fwctl/Makefile +f:drivers/fwctl/main.c +f:drivers/fwctl/mlx5/Makefile +f:drivers/fwctl/mlx5/main.c +f:drivers/fwctl/pds/Makefile +f:drivers/fwctl/pds/main.c +f:drivers/gnss/Kconfig +f:drivers/gnss/Makefile +f:drivers/gnss/core.c +f:drivers/gnss/mtk.c +f:drivers/gnss/serial.c +f:drivers/gnss/serial.h +f:drivers/gnss/sirf.c +f:drivers/gnss/ubx.c +f:drivers/gnss/usb.c +f:drivers/gpio/Kconfig +f:drivers/gpio/Makefile +f:drivers/gpio/TODO +f:drivers/gpio/dev-sync-probe.c +f:drivers/gpio/dev-sync-probe.h +f:drivers/gpio/gpio-104-dio-48e.c +f:drivers/gpio/gpio-104-idi-48.c +f:drivers/gpio/gpio-104-idio-16.c +f:drivers/gpio/gpio-74x164.c +f:drivers/gpio/gpio-74xx-mmio.c +f:drivers/gpio/gpio-adnp.c +f:drivers/gpio/gpio-adp5520.c +f:drivers/gpio/gpio-adp5585.c +f:drivers/gpio/gpio-aggregator.c +f:drivers/gpio/gpio-altera-a10sr.c +f:drivers/gpio/gpio-altera.c +f:drivers/gpio/gpio-amd-fch.c +f:drivers/gpio/gpio-amd8111.c +f:drivers/gpio/gpio-amdpt.c +f:drivers/gpio/gpio-arizona.c +f:drivers/gpio/gpio-aspeed-sgpio.c +f:drivers/gpio/gpio-aspeed.c +f:drivers/gpio/gpio-ath79.c +f:drivers/gpio/gpio-bcm-kona.c +f:drivers/gpio/gpio-bd71815.c +f:drivers/gpio/gpio-bd71828.c +f:drivers/gpio/gpio-bd9571mwv.c +f:drivers/gpio/gpio-blzp1600.c +f:drivers/gpio/gpio-brcmstb.c +f:drivers/gpio/gpio-bt8xx.c +f:drivers/gpio/gpio-cadence.c +f:drivers/gpio/gpio-cgbc.c +f:drivers/gpio/gpio-clps711x.c +f:drivers/gpio/gpio-creg-snps.c +f:drivers/gpio/gpio-cros-ec.c +f:drivers/gpio/gpio-crystalcove.c +f:drivers/gpio/gpio-cs5535.c +f:drivers/gpio/gpio-da9052.c +f:drivers/gpio/gpio-da9055.c +f:drivers/gpio/gpio-davinci.c +f:drivers/gpio/gpio-dln2.c +f:drivers/gpio/gpio-ds4520.c +f:drivers/gpio/gpio-dwapb.c +f:drivers/gpio/gpio-eic-sprd.c +f:drivers/gpio/gpio-elkhartlake.c +f:drivers/gpio/gpio-em.c +f:drivers/gpio/gpio-en7523.c +f:drivers/gpio/gpio-ep93xx.c +f:drivers/gpio/gpio-exar.c +f:drivers/gpio/gpio-f7188x.c +f:drivers/gpio/gpio-ftgpio010.c +f:drivers/gpio/gpio-fxl6408.c +f:drivers/gpio/gpio-ge.c +f:drivers/gpio/gpio-gpio-mm.c +f:drivers/gpio/gpio-graniterapids.c +f:drivers/gpio/gpio-grgpio.c +f:drivers/gpio/gpio-gw-pld.c +f:drivers/gpio/gpio-hisi.c +f:drivers/gpio/gpio-hlwd.c +f:drivers/gpio/gpio-htc-egpio.c +f:drivers/gpio/gpio-i8255.c +f:drivers/gpio/gpio-i8255.h +f:drivers/gpio/gpio-ich.c +f:drivers/gpio/gpio-idio-16.c +f:drivers/gpio/gpio-idio-16.h +f:drivers/gpio/gpio-idt3243x.c +f:drivers/gpio/gpio-imx-scu.c +f:drivers/gpio/gpio-it87.c +f:drivers/gpio/gpio-ixp4xx.c +f:drivers/gpio/gpio-janz-ttl.c +f:drivers/gpio/gpio-kempld.c +f:drivers/gpio/gpio-latch.c +f:drivers/gpio/gpio-ljca.c +f:drivers/gpio/gpio-logicvc.c +f:drivers/gpio/gpio-loongson-64bit.c +f:drivers/gpio/gpio-loongson.c +f:drivers/gpio/gpio-loongson1.c +f:drivers/gpio/gpio-lp3943.c +f:drivers/gpio/gpio-lp873x.c +f:drivers/gpio/gpio-lp87565.c +f:drivers/gpio/gpio-lpc18xx.c +f:drivers/gpio/gpio-lpc32xx.c +f:drivers/gpio/gpio-macsmc.c +f:drivers/gpio/gpio-madera.c +f:drivers/gpio/gpio-max3191x.c +f:drivers/gpio/gpio-max7300.c +f:drivers/gpio/gpio-max7301.c +f:drivers/gpio/gpio-max730x.c +f:drivers/gpio/gpio-max732x.c +f:drivers/gpio/gpio-max77620.c +f:drivers/gpio/gpio-max77650.c +f:drivers/gpio/gpio-max77759.c +f:drivers/gpio/gpio-mb86s7x.c +f:drivers/gpio/gpio-mc33880.c +f:drivers/gpio/gpio-menz127.c +f:drivers/gpio/gpio-merrifield.c +f:drivers/gpio/gpio-ml-ioh.c +f:drivers/gpio/gpio-mlxbf.c +f:drivers/gpio/gpio-mlxbf2.c +f:drivers/gpio/gpio-mlxbf3.c +f:drivers/gpio/gpio-mm-lantiq.c +f:drivers/gpio/gpio-mmio.c +f:drivers/gpio/gpio-mockup.c +f:drivers/gpio/gpio-moxtet.c +f:drivers/gpio/gpio-mpc5200.c +f:drivers/gpio/gpio-mpc8xxx.c +f:drivers/gpio/gpio-mpfs.c +f:drivers/gpio/gpio-mpsse.c +f:drivers/gpio/gpio-msc313.c +f:drivers/gpio/gpio-mt7621.c +f:drivers/gpio/gpio-mvebu.c +f:drivers/gpio/gpio-mxc.c +f:drivers/gpio/gpio-mxs.c +f:drivers/gpio/gpio-nomadik.c +f:drivers/gpio/gpio-npcm-sgpio.c +f:drivers/gpio/gpio-octeon.c +f:drivers/gpio/gpio-omap.c +f:drivers/gpio/gpio-palmas.c +f:drivers/gpio/gpio-pca953x.c +f:drivers/gpio/gpio-pca9570.c +f:drivers/gpio/gpio-pcf857x.c +f:drivers/gpio/gpio-pch.c +f:drivers/gpio/gpio-pci-idio-16.c +f:drivers/gpio/gpio-pcie-idio-24.c +f:drivers/gpio/gpio-pisosr.c +f:drivers/gpio/gpio-pl061.c +f:drivers/gpio/gpio-pmic-eic-sprd.c +f:drivers/gpio/gpio-pxa.c +f:drivers/gpio/gpio-raspberrypi-exp.c +f:drivers/gpio/gpio-rc5t583.c +f:drivers/gpio/gpio-rcar.c +f:drivers/gpio/gpio-rda.c +f:drivers/gpio/gpio-rdc321x.c +f:drivers/gpio/gpio-realtek-otto.c +f:drivers/gpio/gpio-reg.c +f:drivers/gpio/gpio-regmap.c +f:drivers/gpio/gpio-rockchip.c +f:drivers/gpio/gpio-rtd.c +f:drivers/gpio/gpio-sa1100.c +f:drivers/gpio/gpio-sama5d2-piobu.c +f:drivers/gpio/gpio-sch.c +f:drivers/gpio/gpio-sch311x.c +f:drivers/gpio/gpio-sifive.c +f:drivers/gpio/gpio-sim.c +f:drivers/gpio/gpio-siox.c +f:drivers/gpio/gpio-sl28cpld.c +f:drivers/gpio/gpio-sloppy-logic-analyzer.c +f:drivers/gpio/gpio-sodaville.c +f:drivers/gpio/gpio-spacemit-k1.c +f:drivers/gpio/gpio-spear-spics.c +f:drivers/gpio/gpio-sprd.c +f:drivers/gpio/gpio-stmpe.c +f:drivers/gpio/gpio-stp-xway.c +f:drivers/gpio/gpio-syscon.c +f:drivers/gpio/gpio-tangier.c +f:drivers/gpio/gpio-tangier.h +f:drivers/gpio/gpio-tb10x.c +f:drivers/gpio/gpio-tc3589x.c +f:drivers/gpio/gpio-tegra.c +f:drivers/gpio/gpio-tegra186.c +f:drivers/gpio/gpio-thunderx.c +f:drivers/gpio/gpio-timberdale.c +f:drivers/gpio/gpio-tn48m.c +f:drivers/gpio/gpio-tpic2810.c +f:drivers/gpio/gpio-tps65086.c +f:drivers/gpio/gpio-tps65218.c +f:drivers/gpio/gpio-tps65219.c +f:drivers/gpio/gpio-tps6586x.c +f:drivers/gpio/gpio-tps65910.c +f:drivers/gpio/gpio-tps65912.c +f:drivers/gpio/gpio-tps68470.c +f:drivers/gpio/gpio-tqmx86.c +f:drivers/gpio/gpio-ts4800.c +f:drivers/gpio/gpio-ts4900.c +f:drivers/gpio/gpio-ts5500.c +f:drivers/gpio/gpio-twl4030.c +f:drivers/gpio/gpio-twl6040.c +f:drivers/gpio/gpio-uniphier.c +f:drivers/gpio/gpio-vf610.c +f:drivers/gpio/gpio-viperboard.c +f:drivers/gpio/gpio-virtio.c +f:drivers/gpio/gpio-virtuser.c +f:drivers/gpio/gpio-visconti.c +f:drivers/gpio/gpio-vx855.c +f:drivers/gpio/gpio-wcd934x.c +f:drivers/gpio/gpio-wcove.c +f:drivers/gpio/gpio-winbond.c +f:drivers/gpio/gpio-wm831x.c +f:drivers/gpio/gpio-wm8350.c +f:drivers/gpio/gpio-wm8994.c +f:drivers/gpio/gpio-ws16c48.c +f:drivers/gpio/gpio-xgene-sb.c +f:drivers/gpio/gpio-xgene.c +f:drivers/gpio/gpio-xgs-iproc.c +f:drivers/gpio/gpio-xilinx.c +f:drivers/gpio/gpio-xlp.c +f:drivers/gpio/gpio-xra1403.c +f:drivers/gpio/gpio-xtensa.c +f:drivers/gpio/gpio-zevio.c +f:drivers/gpio/gpio-zynq.c +f:drivers/gpio/gpio-zynqmp-modepin.c +f:drivers/gpio/gpiolib-acpi-core.c +f:drivers/gpio/gpiolib-acpi-quirks.c +f:drivers/gpio/gpiolib-acpi.h +f:drivers/gpio/gpiolib-cdev.c +f:drivers/gpio/gpiolib-cdev.h +f:drivers/gpio/gpiolib-devres.c +f:drivers/gpio/gpiolib-legacy.c +f:drivers/gpio/gpiolib-of.c +f:drivers/gpio/gpiolib-of.h +f:drivers/gpio/gpiolib-swnode.c +f:drivers/gpio/gpiolib-swnode.h +f:drivers/gpio/gpiolib-sysfs.c +f:drivers/gpio/gpiolib-sysfs.h +f:drivers/gpio/gpiolib.c +f:drivers/gpio/gpiolib.h +f:drivers/gpu/Makefile +f:drivers/gpu/drm/Kconfig +f:drivers/gpu/drm/Kconfig.debug +f:drivers/gpu/drm/Makefile +f:drivers/gpu/drm/adp/Kconfig +f:drivers/gpu/drm/adp/Makefile +f:drivers/gpu/drm/adp/adp-mipi.c +f:drivers/gpu/drm/adp/adp_drv.c +f:drivers/gpu/drm/amd/acp/Kconfig +f:drivers/gpu/drm/amd/acp/Makefile +f:drivers/gpu/drm/amd/acp/acp_hw.c +f:drivers/gpu/drm/amd/acp/include/acp_gfx_if.h +f:drivers/gpu/drm/amd/amdgpu/Kconfig +f:drivers/gpu/drm/amd/amdgpu/Makefile +f:drivers/gpu/drm/amd/amdgpu/ObjectID.h +f:drivers/gpu/drm/amd/amdgpu/aldebaran.c +f:drivers/gpu/drm/amd/amdgpu/aldebaran.h +f:drivers/gpu/drm/amd/amdgpu/aldebaran_reg_init.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_acp.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_afmt.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_aldebaran.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_aldebaran.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v12.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_cper.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_cs.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_df.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_display.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell_mgr.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_drv.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_eeprom.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_eeprom.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_fw_attestation.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_fw_attestation.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gfxhub.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_hdp.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_hdp.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_imu.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ioc32.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ip.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ip.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_isp.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_isp.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_lsdma.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_lsdma.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_mca.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_mca.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_mes_ctx.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_mmhub.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_mmhub.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_pll.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_pll.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_pmu.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_pmu.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_rap.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_rap.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_sched.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_securedisplay.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_securedisplay.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_smuio.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_socbb.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_trace_points.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_umr.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vf_error.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vf_error.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vm_tlb_fence.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h +f:drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c +f:drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h +f:drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h +f:drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c +f:drivers/gpu/drm/amd/amdgpu/arct_reg_init.c +f:drivers/gpu/drm/amd/amdgpu/athub_v1_0.c +f:drivers/gpu/drm/amd/amdgpu/athub_v1_0.h +f:drivers/gpu/drm/amd/amdgpu/athub_v2_0.c +f:drivers/gpu/drm/amd/amdgpu/athub_v2_0.h +f:drivers/gpu/drm/amd/amdgpu/athub_v2_1.c +f:drivers/gpu/drm/amd/amdgpu/athub_v2_1.h +f:drivers/gpu/drm/amd/amdgpu/athub_v3_0.c +f:drivers/gpu/drm/amd/amdgpu/athub_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/athub_v4_1_0.c +f:drivers/gpu/drm/amd/amdgpu/athub_v4_1_0.h +f:drivers/gpu/drm/amd/amdgpu/atom.c +f:drivers/gpu/drm/amd/amdgpu/atom.h +f:drivers/gpu/drm/amd/amdgpu/atombios_crtc.c +f:drivers/gpu/drm/amd/amdgpu/atombios_crtc.h +f:drivers/gpu/drm/amd/amdgpu/atombios_dp.c +f:drivers/gpu/drm/amd/amdgpu/atombios_dp.h +f:drivers/gpu/drm/amd/amdgpu/atombios_encoders.c +f:drivers/gpu/drm/amd/amdgpu/atombios_encoders.h +f:drivers/gpu/drm/amd/amdgpu/atombios_i2c.c +f:drivers/gpu/drm/amd/amdgpu/atombios_i2c.h +f:drivers/gpu/drm/amd/amdgpu/cik.c +f:drivers/gpu/drm/amd/amdgpu/cik.h +f:drivers/gpu/drm/amd/amdgpu/cik_ih.c +f:drivers/gpu/drm/amd/amdgpu/cik_ih.h +f:drivers/gpu/drm/amd/amdgpu/cik_sdma.c +f:drivers/gpu/drm/amd/amdgpu/cik_sdma.h +f:drivers/gpu/drm/amd/amdgpu/cikd.h +f:drivers/gpu/drm/amd/amdgpu/clearstate_ci.h +f:drivers/gpu/drm/amd/amdgpu/clearstate_defs.h +f:drivers/gpu/drm/amd/amdgpu/clearstate_gfx10.h +f:drivers/gpu/drm/amd/amdgpu/clearstate_gfx11.h +f:drivers/gpu/drm/amd/amdgpu/clearstate_gfx12.h +f:drivers/gpu/drm/amd/amdgpu/clearstate_gfx9.h +f:drivers/gpu/drm/amd/amdgpu/clearstate_si.h +f:drivers/gpu/drm/amd/amdgpu/clearstate_vi.h +f:drivers/gpu/drm/amd/amdgpu/cz_ih.c +f:drivers/gpu/drm/amd/amdgpu/cz_ih.h +f:drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +f:drivers/gpu/drm/amd/amdgpu/dce_v10_0.h +f:drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +f:drivers/gpu/drm/amd/amdgpu/dce_v11_0.h +f:drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/dce_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +f:drivers/gpu/drm/amd/amdgpu/dce_v8_0.h +f:drivers/gpu/drm/amd/amdgpu/df_v1_7.c +f:drivers/gpu/drm/amd/amdgpu/df_v1_7.h +f:drivers/gpu/drm/amd/amdgpu/df_v3_6.c +f:drivers/gpu/drm/amd/amdgpu/df_v3_6.h +f:drivers/gpu/drm/amd/amdgpu/df_v4_15.c +f:drivers/gpu/drm/amd/amdgpu/df_v4_15.h +f:drivers/gpu/drm/amd/amdgpu/df_v4_3.c +f:drivers/gpu/drm/amd/amdgpu/df_v4_3.h +f:drivers/gpu/drm/amd/amdgpu/df_v4_6_2.c +f:drivers/gpu/drm/amd/amdgpu/df_v4_6_2.h +f:drivers/gpu/drm/amd/amdgpu/dimgrey_cavefish_reg_init.c +f:drivers/gpu/drm/amd/amdgpu/emu_soc.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v10_0.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v10_0_cleaner_shader.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v10_1_10_cleaner_shader.asm +f:drivers/gpu/drm/amd/amdgpu/gfx_v10_3_0_cleaner_shader.asm +f:drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v11_0.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3_cleaner_shader.asm +f:drivers/gpu/drm/amd/amdgpu/gfx_v11_0_cleaner_shader.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v12_0.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v7_0.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v8_0.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_0.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_0_cleaner_shader.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2_cleaner_shader.asm +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.h +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3_cleaner_shader.asm +f:drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3_cleaner_shader.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v11_5_0.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v11_5_0.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v12_0.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v12_0.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0_3.c +f:drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0_3.h +f:drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c +f:drivers/gpu/drm/amd/amdgpu/gmc_v10_0.h +f:drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c +f:drivers/gpu/drm/amd/amdgpu/gmc_v11_0.h +f:drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c +f:drivers/gpu/drm/amd/amdgpu/gmc_v12_0.h +f:drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/gmc_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +f:drivers/gpu/drm/amd/amdgpu/gmc_v7_0.h +f:drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +f:drivers/gpu/drm/amd/amdgpu/gmc_v8_0.h +f:drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +f:drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h +f:drivers/gpu/drm/amd/amdgpu/hdp_v4_0.c +f:drivers/gpu/drm/amd/amdgpu/hdp_v4_0.h +f:drivers/gpu/drm/amd/amdgpu/hdp_v5_0.c +f:drivers/gpu/drm/amd/amdgpu/hdp_v5_0.h +f:drivers/gpu/drm/amd/amdgpu/hdp_v5_2.c +f:drivers/gpu/drm/amd/amdgpu/hdp_v5_2.h +f:drivers/gpu/drm/amd/amdgpu/hdp_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/hdp_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/hdp_v7_0.c +f:drivers/gpu/drm/amd/amdgpu/hdp_v7_0.h +f:drivers/gpu/drm/amd/amdgpu/iceland_ih.c +f:drivers/gpu/drm/amd/amdgpu/iceland_ih.h +f:drivers/gpu/drm/amd/amdgpu/iceland_sdma_pkt_open.h +f:drivers/gpu/drm/amd/amdgpu/ih_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/ih_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/ih_v6_1.c +f:drivers/gpu/drm/amd/amdgpu/ih_v6_1.h +f:drivers/gpu/drm/amd/amdgpu/ih_v7_0.c +f:drivers/gpu/drm/amd/amdgpu/ih_v7_0.h +f:drivers/gpu/drm/amd/amdgpu/imu_v11_0.c +f:drivers/gpu/drm/amd/amdgpu/imu_v11_0.h +f:drivers/gpu/drm/amd/amdgpu/imu_v11_0_3.c +f:drivers/gpu/drm/amd/amdgpu/imu_v11_0_3.h +f:drivers/gpu/drm/amd/amdgpu/imu_v12_0.c +f:drivers/gpu/drm/amd/amdgpu/imu_v12_0.h +f:drivers/gpu/drm/amd/amdgpu/isp_v4_1_0.c +f:drivers/gpu/drm/amd/amdgpu/isp_v4_1_0.h +f:drivers/gpu/drm/amd/amdgpu/isp_v4_1_1.c +f:drivers/gpu/drm/amd/amdgpu/isp_v4_1_1.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.h +f:drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c +f:drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.h +f:drivers/gpu/drm/amd/amdgpu/lsdma_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/lsdma_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/lsdma_v7_0.c +f:drivers/gpu/drm/amd/amdgpu/lsdma_v7_0.h +f:drivers/gpu/drm/amd/amdgpu/mca_v3_0.c +f:drivers/gpu/drm/amd/amdgpu/mca_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/mes_userqueue.c +f:drivers/gpu/drm/amd/amdgpu/mes_userqueue.h +f:drivers/gpu/drm/amd/amdgpu/mes_v11_0.c +f:drivers/gpu/drm/amd/amdgpu/mes_v11_0.h +f:drivers/gpu/drm/amd/amdgpu/mes_v12_0.c +f:drivers/gpu/drm/amd/amdgpu/mes_v12_0.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v3_3.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v3_3.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v4_1_0.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v4_1_0.h +f:drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c +f:drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h +f:drivers/gpu/drm/amd/amdgpu/mmsch_v1_0.h +f:drivers/gpu/drm/amd/amdgpu/mmsch_v2_0.h +f:drivers/gpu/drm/amd/amdgpu/mmsch_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/mmsch_v4_0.h +f:drivers/gpu/drm/amd/amdgpu/mmsch_v4_0_3.h +f:drivers/gpu/drm/amd/amdgpu/mmsch_v5_0.h +f:drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c +f:drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h +f:drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c +f:drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h +f:drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c +f:drivers/gpu/drm/amd/amdgpu/mxgpu_vi.h +f:drivers/gpu/drm/amd/amdgpu/navi10_ih.c +f:drivers/gpu/drm/amd/amdgpu/navi10_ih.h +f:drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h +f:drivers/gpu/drm/amd/amdgpu/nbif_v6_3_1.c +f:drivers/gpu/drm/amd/amdgpu/nbif_v6_3_1.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v2_3.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v4_3.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v4_3.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v6_1.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_0.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_11.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_2.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_2.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_4.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_7.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_7.h +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c +f:drivers/gpu/drm/amd/amdgpu/nbio_v7_9.h +f:drivers/gpu/drm/amd/amdgpu/nv.c +f:drivers/gpu/drm/amd/amdgpu/nv.h +f:drivers/gpu/drm/amd/amdgpu/nvd.h +f:drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h +f:drivers/gpu/drm/amd/amdgpu/psp_v10_0.c +f:drivers/gpu/drm/amd/amdgpu/psp_v10_0.h +f:drivers/gpu/drm/amd/amdgpu/psp_v11_0.c +f:drivers/gpu/drm/amd/amdgpu/psp_v11_0.h +f:drivers/gpu/drm/amd/amdgpu/psp_v11_0_8.c +f:drivers/gpu/drm/amd/amdgpu/psp_v11_0_8.h +f:drivers/gpu/drm/amd/amdgpu/psp_v12_0.c +f:drivers/gpu/drm/amd/amdgpu/psp_v12_0.h +f:drivers/gpu/drm/amd/amdgpu/psp_v13_0.c +f:drivers/gpu/drm/amd/amdgpu/psp_v13_0.h +f:drivers/gpu/drm/amd/amdgpu/psp_v13_0_4.c +f:drivers/gpu/drm/amd/amdgpu/psp_v13_0_4.h +f:drivers/gpu/drm/amd/amdgpu/psp_v14_0.c +f:drivers/gpu/drm/amd/amdgpu/psp_v14_0.h +f:drivers/gpu/drm/amd/amdgpu/psp_v3_1.c +f:drivers/gpu/drm/amd/amdgpu/psp_v3_1.h +f:drivers/gpu/drm/amd/amdgpu/sdma_common.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v2_4.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v4_0.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v4_4.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v4_4.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v5_0.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v5_2.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v6_0_0_pkt_open.h +f:drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c +f:drivers/gpu/drm/amd/amdgpu/sdma_v7_0.h +f:drivers/gpu/drm/amd/amdgpu/si.c +f:drivers/gpu/drm/amd/amdgpu/si.h +f:drivers/gpu/drm/amd/amdgpu/si_dma.c +f:drivers/gpu/drm/amd/amdgpu/si_dma.h +f:drivers/gpu/drm/amd/amdgpu/si_enums.h +f:drivers/gpu/drm/amd/amdgpu/si_ih.c +f:drivers/gpu/drm/amd/amdgpu/si_ih.h +f:drivers/gpu/drm/amd/amdgpu/sid.h +f:drivers/gpu/drm/amd/amdgpu/sienna_cichlid.c +f:drivers/gpu/drm/amd/amdgpu/sienna_cichlid.h +f:drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.c +f:drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.h +f:drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.c +f:drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.h +f:drivers/gpu/drm/amd/amdgpu/smuio_v11_0.c +f:drivers/gpu/drm/amd/amdgpu/smuio_v11_0.h +f:drivers/gpu/drm/amd/amdgpu/smuio_v11_0_6.c +f:drivers/gpu/drm/amd/amdgpu/smuio_v11_0_6.h +f:drivers/gpu/drm/amd/amdgpu/smuio_v13_0.c +f:drivers/gpu/drm/amd/amdgpu/smuio_v13_0.h +f:drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.c +f:drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.h +f:drivers/gpu/drm/amd/amdgpu/smuio_v13_0_6.c +f:drivers/gpu/drm/amd/amdgpu/smuio_v13_0_6.h +f:drivers/gpu/drm/amd/amdgpu/smuio_v14_0_2.c +f:drivers/gpu/drm/amd/amdgpu/smuio_v14_0_2.h +f:drivers/gpu/drm/amd/amdgpu/smuio_v9_0.c +f:drivers/gpu/drm/amd/amdgpu/smuio_v9_0.h +f:drivers/gpu/drm/amd/amdgpu/soc15.c +f:drivers/gpu/drm/amd/amdgpu/soc15.h +f:drivers/gpu/drm/amd/amdgpu/soc15_common.h +f:drivers/gpu/drm/amd/amdgpu/soc15d.h +f:drivers/gpu/drm/amd/amdgpu/soc21.c +f:drivers/gpu/drm/amd/amdgpu/soc21.h +f:drivers/gpu/drm/amd/amdgpu/soc24.c +f:drivers/gpu/drm/amd/amdgpu/soc24.h +f:drivers/gpu/drm/amd/amdgpu/ta_rap_if.h +f:drivers/gpu/drm/amd/amdgpu/ta_ras_if.h +f:drivers/gpu/drm/amd/amdgpu/ta_secureDisplay_if.h +f:drivers/gpu/drm/amd/amdgpu/ta_xgmi_if.h +f:drivers/gpu/drm/amd/amdgpu/tonga_ih.c +f:drivers/gpu/drm/amd/amdgpu/tonga_ih.h +f:drivers/gpu/drm/amd/amdgpu/tonga_sdma_pkt_open.h +f:drivers/gpu/drm/amd/amdgpu/umc_v12_0.c +f:drivers/gpu/drm/amd/amdgpu/umc_v12_0.h +f:drivers/gpu/drm/amd/amdgpu/umc_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/umc_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/umc_v6_1.c +f:drivers/gpu/drm/amd/amdgpu/umc_v6_1.h +f:drivers/gpu/drm/amd/amdgpu/umc_v6_7.c +f:drivers/gpu/drm/amd/amdgpu/umc_v6_7.h +f:drivers/gpu/drm/amd/amdgpu/umc_v8_10.c +f:drivers/gpu/drm/amd/amdgpu/umc_v8_10.h +f:drivers/gpu/drm/amd/amdgpu/umc_v8_14.c +f:drivers/gpu/drm/amd/amdgpu/umc_v8_14.h +f:drivers/gpu/drm/amd/amdgpu/umc_v8_7.c +f:drivers/gpu/drm/amd/amdgpu/umc_v8_7.h +f:drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c +f:drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.h +f:drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c +f:drivers/gpu/drm/amd/amdgpu/uvd_v3_1.h +f:drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +f:drivers/gpu/drm/amd/amdgpu/uvd_v4_2.h +f:drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c +f:drivers/gpu/drm/amd/amdgpu/uvd_v5_0.h +f:drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +f:drivers/gpu/drm/amd/amdgpu/uvd_v6_0.h +f:drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c +f:drivers/gpu/drm/amd/amdgpu/uvd_v7_0.h +f:drivers/gpu/drm/amd/amdgpu/vce_v2_0.c +f:drivers/gpu/drm/amd/amdgpu/vce_v2_0.h +f:drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +f:drivers/gpu/drm/amd/amdgpu/vce_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/vce_v4_0.c +f:drivers/gpu/drm/amd/amdgpu/vce_v4_0.h +f:drivers/gpu/drm/amd/amdgpu/vcn_sw_ring.c +f:drivers/gpu/drm/amd/amdgpu/vcn_sw_ring.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v1_0.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v2_0.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v2_5.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v3_0.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v4_0.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.h +f:drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c +f:drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.h +f:drivers/gpu/drm/amd/amdgpu/vega10_ih.c +f:drivers/gpu/drm/amd/amdgpu/vega10_ih.h +f:drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c +f:drivers/gpu/drm/amd/amdgpu/vega10_sdma_pkt_open.h +f:drivers/gpu/drm/amd/amdgpu/vega20_ih.c +f:drivers/gpu/drm/amd/amdgpu/vega20_ih.h +f:drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c +f:drivers/gpu/drm/amd/amdgpu/vi.c +f:drivers/gpu/drm/amd/amdgpu/vi.h +f:drivers/gpu/drm/amd/amdgpu/vid.h +f:drivers/gpu/drm/amd/amdgpu/vpe_6_1_fw_if.h +f:drivers/gpu/drm/amd/amdgpu/vpe_v6_1.c +f:drivers/gpu/drm/amd/amdgpu/vpe_v6_1.h +f:drivers/gpu/drm/amd/amdkfd/Kconfig +f:drivers/gpu/drm/amd/amdkfd/Makefile +f:drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c +f:drivers/gpu/drm/amd/amdkfd/cik_int.h +f:drivers/gpu/drm/amd/amdkfd/cik_regs.h +f:drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler.h +f:drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx10.asm +f:drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx12.asm +f:drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx8.asm +f:drivers/gpu/drm/amd/amdkfd/cwsr_trap_handler_gfx9.asm +f:drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +f:drivers/gpu/drm/amd/amdkfd/kfd_crat.c +f:drivers/gpu/drm/amd/amdkfd/kfd_crat.h +f:drivers/gpu/drm/amd/amdkfd/kfd_debug.c +f:drivers/gpu/drm/amd/amdkfd/kfd_debug.h +f:drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c +f:drivers/gpu/drm/amd/amdkfd/kfd_device.c +f:drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +f:drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h +f:drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c +f:drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v10.c +f:drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v11.c +f:drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v12.c +f:drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c +f:drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_vi.c +f:drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c +f:drivers/gpu/drm/amd/amdkfd/kfd_events.c +f:drivers/gpu/drm/amd/amdkfd/kfd_events.h +f:drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c +f:drivers/gpu/drm/amd/amdkfd/kfd_int_process_v10.c +f:drivers/gpu/drm/amd/amdkfd/kfd_int_process_v11.c +f:drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c +f:drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c +f:drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c +f:drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h +f:drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +f:drivers/gpu/drm/amd/amdkfd/kfd_migrate.h +f:drivers/gpu/drm/amd/amdkfd/kfd_module.c +f:drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c +f:drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h +f:drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c +f:drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c +f:drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c +f:drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v12.c +f:drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c +f:drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c +f:drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c +f:drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c +f:drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_vi.c +f:drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers.h +f:drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h +f:drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_aldebaran.h +f:drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_vi.h +f:drivers/gpu/drm/amd/amdkfd/kfd_pm4_opcodes.h +f:drivers/gpu/drm/amd/amdkfd/kfd_priv.h +f:drivers/gpu/drm/amd/amdkfd/kfd_process.c +f:drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +f:drivers/gpu/drm/amd/amdkfd/kfd_queue.c +f:drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c +f:drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h +f:drivers/gpu/drm/amd/amdkfd/kfd_svm.c +f:drivers/gpu/drm/amd/amdkfd/kfd_svm.h +f:drivers/gpu/drm/amd/amdkfd/kfd_topology.c +f:drivers/gpu/drm/amd/amdkfd/kfd_topology.h +f:drivers/gpu/drm/amd/amdkfd/soc15_int.h +f:drivers/gpu/drm/amd/amdxcp/Makefile +f:drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c +f:drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h +f:drivers/gpu/drm/amd/display/Kconfig +f:drivers/gpu/drm/amd/display/Makefile +f:drivers/gpu/drm/amd/display/amdgpu_dm/Makefile +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq_params.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_quirks.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_replay.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_replay.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_trace.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h +f:drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c +f:drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.h +f:drivers/gpu/drm/amd/display/dc/Makefile +f:drivers/gpu/drm/amd/display/dc/basics/Makefile +f:drivers/gpu/drm/amd/display/dc/basics/bw_fixed.c +f:drivers/gpu/drm/amd/display/dc/basics/calcs_logger.h +f:drivers/gpu/drm/amd/display/dc/basics/conversion.c +f:drivers/gpu/drm/amd/display/dc/basics/conversion.h +f:drivers/gpu/drm/amd/display/dc/basics/custom_float.c +f:drivers/gpu/drm/amd/display/dc/basics/dc_common.c +f:drivers/gpu/drm/amd/display/dc/basics/dc_common.h +f:drivers/gpu/drm/amd/display/dc/basics/dce_calcs.c +f:drivers/gpu/drm/amd/display/dc/basics/fixpt31_32.c +f:drivers/gpu/drm/amd/display/dc/basics/logger.h +f:drivers/gpu/drm/amd/display/dc/basics/vector.c +f:drivers/gpu/drm/amd/display/dc/bios/Makefile +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser.c +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser.h +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser2.h +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser_common.c +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser_common.h +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.c +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.h +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser_interface.c +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser_types_internal.h +f:drivers/gpu/drm/amd/display/dc/bios/bios_parser_types_internal2.h +f:drivers/gpu/drm/amd/display/dc/bios/command_table.c +f:drivers/gpu/drm/amd/display/dc/bios/command_table.h +f:drivers/gpu/drm/amd/display/dc/bios/command_table2.c +f:drivers/gpu/drm/amd/display/dc/bios/command_table2.h +f:drivers/gpu/drm/amd/display/dc/bios/command_table_helper.c +f:drivers/gpu/drm/amd/display/dc/bios/command_table_helper.h +f:drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c +f:drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.h +f:drivers/gpu/drm/amd/display/dc/bios/command_table_helper_struct.h +f:drivers/gpu/drm/amd/display/dc/bios/dce110/command_table_helper_dce110.c +f:drivers/gpu/drm/amd/display/dc/bios/dce110/command_table_helper_dce110.h +f:drivers/gpu/drm/amd/display/dc/bios/dce112/command_table_helper2_dce112.c +f:drivers/gpu/drm/amd/display/dc/bios/dce112/command_table_helper2_dce112.h +f:drivers/gpu/drm/amd/display/dc/bios/dce112/command_table_helper_dce112.c +f:drivers/gpu/drm/amd/display/dc/bios/dce112/command_table_helper_dce112.h +f:drivers/gpu/drm/amd/display/dc/bios/dce60/command_table_helper_dce60.c +f:drivers/gpu/drm/amd/display/dc/bios/dce60/command_table_helper_dce60.h +f:drivers/gpu/drm/amd/display/dc/bios/dce80/command_table_helper_dce80.c +f:drivers/gpu/drm/amd/display/dc/bios/dce80/command_table_helper_dce80.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/Makefile +f:drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce110/dce110_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce110/dce110_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce112/dce112_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce112/dce112_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce120/dce120_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce120/dce120_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce60/dce60_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dce60/dce60_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr_clk.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr_vbios_smu.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr_vbios_smu.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv2_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv2_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn201/dcn201_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn201/dcn201_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dalsmc.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_smu11_driver_if.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30m_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30m_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30m_clk_mgr_smu_msg.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30m_clk_mgr_smu_msg.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/dcn301_smu.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/dcn301_smu.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_smu.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_smu.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_smu.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_smu.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dalsmc.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr_smu_msg.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr_smu_msg.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_smu13_driver_if.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn351_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_smu.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_smu.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dalsmc.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr_smu_msg.c +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_clk_mgr_smu_msg.h +f:drivers/gpu/drm/amd/display/dc/clk_mgr/dcn401/dcn401_smu14_driver_if.h +f:drivers/gpu/drm/amd/display/dc/core/dc.c +f:drivers/gpu/drm/amd/display/dc/core/dc_debug.c +f:drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +f:drivers/gpu/drm/amd/display/dc/core/dc_link_enc_cfg.c +f:drivers/gpu/drm/amd/display/dc/core/dc_link_exports.c +f:drivers/gpu/drm/amd/display/dc/core/dc_resource.c +f:drivers/gpu/drm/amd/display/dc/core/dc_sink.c +f:drivers/gpu/drm/amd/display/dc/core/dc_stat.c +f:drivers/gpu/drm/amd/display/dc/core/dc_state.c +f:drivers/gpu/drm/amd/display/dc/core/dc_stream.c +f:drivers/gpu/drm/amd/display/dc/core/dc_surface.c +f:drivers/gpu/drm/amd/display/dc/core/dc_vm_helper.c +f:drivers/gpu/drm/amd/display/dc/dc.h +f:drivers/gpu/drm/amd/display/dc/dc_bios_types.h +f:drivers/gpu/drm/amd/display/dc/dc_ddc_types.h +f:drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c +f:drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h +f:drivers/gpu/drm/amd/display/dc/dc_dp_types.h +f:drivers/gpu/drm/amd/display/dc/dc_dsc.h +f:drivers/gpu/drm/amd/display/dc/dc_edid_parser.c +f:drivers/gpu/drm/amd/display/dc/dc_edid_parser.h +f:drivers/gpu/drm/amd/display/dc/dc_fused_io.c +f:drivers/gpu/drm/amd/display/dc/dc_fused_io.h +f:drivers/gpu/drm/amd/display/dc/dc_hdmi_types.h +f:drivers/gpu/drm/amd/display/dc/dc_helper.c +f:drivers/gpu/drm/amd/display/dc/dc_hw_types.h +f:drivers/gpu/drm/amd/display/dc/dc_plane.h +f:drivers/gpu/drm/amd/display/dc/dc_plane_priv.h +f:drivers/gpu/drm/amd/display/dc/dc_spl_translate.c +f:drivers/gpu/drm/amd/display/dc/dc_spl_translate.h +f:drivers/gpu/drm/amd/display/dc/dc_stat.h +f:drivers/gpu/drm/amd/display/dc/dc_state.h +f:drivers/gpu/drm/amd/display/dc/dc_state_priv.h +f:drivers/gpu/drm/amd/display/dc/dc_stream.h +f:drivers/gpu/drm/amd/display/dc/dc_stream_priv.h +f:drivers/gpu/drm/amd/display/dc/dc_trace.h +f:drivers/gpu/drm/amd/display/dc/dc_types.h +f:drivers/gpu/drm/amd/display/dc/dccg/Makefile +f:drivers/gpu/drm/amd/display/dc/dccg/dcn20/dcn20_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn20/dcn20_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn201/dcn201_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn201/dcn201_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn21/dcn21_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn21/dcn21_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn30/dcn30_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn30/dcn30_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn301/dcn301_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn301/dcn301_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn302/dcn302_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn303/dcn303_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn31/dcn31_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn31/dcn31_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn314/dcn314_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn314/dcn314_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn32/dcn32_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn32/dcn32_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.h +f:drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c +f:drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.h +f:drivers/gpu/drm/amd/display/dc/dce/Makefile +f:drivers/gpu/drm/amd/display/dc/dce/dce_abm.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_abm.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_audio.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_audio.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_aux.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_aux.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_i2c.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_i2c.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_i2c_sw.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_i2c_sw.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_ipp.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_ipp.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_opp.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_opp.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_panel_cntl.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_panel_cntl.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_scl_filters.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_scl_filters_old.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/dce/dce_transform.c +f:drivers/gpu/drm/amd/display/dc/dce/dce_transform.h +f:drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c +f:drivers/gpu/drm/amd/display/dc/dce/dmub_abm.h +f:drivers/gpu/drm/amd/display/dc/dce/dmub_abm_lcd.c +f:drivers/gpu/drm/amd/display/dc/dce/dmub_abm_lcd.h +f:drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c +f:drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.h +f:drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.c +f:drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.h +f:drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c +f:drivers/gpu/drm/amd/display/dc/dce/dmub_psr.h +f:drivers/gpu/drm/amd/display/dc/dce/dmub_replay.c +f:drivers/gpu/drm/amd/display/dc/dce/dmub_replay.h +f:drivers/gpu/drm/amd/display/dc/dce110/Makefile +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.h +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.h +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_opp_csc_v.c +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_opp_regamma_v.c +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_opp_v.c +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_opp_v.h +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.c +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator.h +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator_v.c +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_timing_generator_v.h +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_transform_v.c +f:drivers/gpu/drm/amd/display/dc/dce110/dce110_transform_v.h +f:drivers/gpu/drm/amd/display/dc/dce112/Makefile +f:drivers/gpu/drm/amd/display/dc/dce112/dce112_compressor.c +f:drivers/gpu/drm/amd/display/dc/dce112/dce112_compressor.h +f:drivers/gpu/drm/amd/display/dc/dce120/Makefile +f:drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.c +f:drivers/gpu/drm/amd/display/dc/dce120/dce120_timing_generator.h +f:drivers/gpu/drm/amd/display/dc/dce60/Makefile +f:drivers/gpu/drm/amd/display/dc/dce60/dce60_timing_generator.c +f:drivers/gpu/drm/amd/display/dc/dce60/dce60_timing_generator.h +f:drivers/gpu/drm/amd/display/dc/dce80/Makefile +f:drivers/gpu/drm/amd/display/dc/dce80/dce80_timing_generator.c +f:drivers/gpu/drm/amd/display/dc/dce80/dce80_timing_generator.h +f:drivers/gpu/drm/amd/display/dc/dcn10/Makefile +f:drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c +f:drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.h +f:drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.c +f:drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dwb.h +f:drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c +f:drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.h +f:drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c +f:drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h +f:drivers/gpu/drm/amd/display/dc/dcn20/Makefile +f:drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dwb.c +f:drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dwb.h +f:drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dwb_scl.c +f:drivers/gpu/drm/amd/display/dc/dcn20/dcn20_vmid.c +f:drivers/gpu/drm/amd/display/dc/dcn20/dcn20_vmid.h +f:drivers/gpu/drm/amd/display/dc/dcn201/Makefile +f:drivers/gpu/drm/amd/display/dc/dcn201/dcn201_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dcn201/dcn201_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dcn201/dcn201_mpc.c +f:drivers/gpu/drm/amd/display/dc/dcn201/dcn201_mpc.h +f:drivers/gpu/drm/amd/display/dc/dcn201/dcn201_opp.c +f:drivers/gpu/drm/amd/display/dc/dcn201/dcn201_opp.h +f:drivers/gpu/drm/amd/display/dc/dcn21/Makefile +f:drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dcn30/Makefile +f:drivers/gpu/drm/amd/display/dc/dcn30/dcn30_afmt.c +f:drivers/gpu/drm/amd/display/dc/dcn30/dcn30_afmt.h +f:drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c +f:drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mmhubbub.c +f:drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mmhubbub.h +f:drivers/gpu/drm/amd/display/dc/dcn30/dcn30_opp.h +f:drivers/gpu/drm/amd/display/dc/dcn30/dcn30_vpg.c +f:drivers/gpu/drm/amd/display/dc/dcn30/dcn30_vpg.h +f:drivers/gpu/drm/amd/display/dc/dcn301/Makefile +f:drivers/gpu/drm/amd/display/dc/dcn301/dcn301_panel_cntl.c +f:drivers/gpu/drm/amd/display/dc/dcn301/dcn301_panel_cntl.h +f:drivers/gpu/drm/amd/display/dc/dcn31/Makefile +f:drivers/gpu/drm/amd/display/dc/dcn31/dcn31_afmt.c +f:drivers/gpu/drm/amd/display/dc/dcn31/dcn31_afmt.h +f:drivers/gpu/drm/amd/display/dc/dcn31/dcn31_apg.c +f:drivers/gpu/drm/amd/display/dc/dcn31/dcn31_apg.h +f:drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c +f:drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.h +f:drivers/gpu/drm/amd/display/dc/dcn31/dcn31_vpg.c +f:drivers/gpu/drm/amd/display/dc/dcn31/dcn31_vpg.h +f:drivers/gpu/drm/amd/display/dc/dio/Makefile +f:drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn20/dcn20_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn20/dcn20_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn20/dcn20_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn20/dcn20_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn30/dcn30_dio_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn30/dcn30_dio_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn30/dcn30_dio_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn30/dcn30_dio_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn301/dcn301_dio_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn301/dcn301_dio_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn31/dcn31_dio_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn31/dcn31_dio_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn314/dcn314_dio_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn314/dcn314_dio_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn321/dcn321_dio_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn321/dcn321_dio_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/dm_cp_psp.h +f:drivers/gpu/drm/amd/display/dc/dm_event_log.h +f:drivers/gpu/drm/amd/display/dc/dm_helpers.h +f:drivers/gpu/drm/amd/display/dc/dm_pp_smu.h +f:drivers/gpu/drm/amd/display/dc/dm_services.h +f:drivers/gpu/drm/amd/display/dc/dm_services_types.h +f:drivers/gpu/drm/amd/display/dc/dml/Makefile +f:drivers/gpu/drm/amd/display/dc/dml/calcs/dcn_calc_auto.c +f:drivers/gpu/drm/amd/display/dc/dml/calcs/dcn_calc_auto.h +f:drivers/gpu/drm/amd/display/dc/dml/calcs/dcn_calc_math.c +f:drivers/gpu/drm/amd/display/dc/dml/calcs/dcn_calcs.c +f:drivers/gpu/drm/amd/display/dc/dml/dc_features.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn10/dcn10_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn10/dcn10_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20v2.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20v2.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn21/display_mode_vba_21.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn21/display_mode_vba_21.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn21/display_rq_dlg_calc_21.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn30/dcn30_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn30/dcn30_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn30/display_rq_dlg_calc_30.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn30/display_rq_dlg_calc_30.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn302/dcn302_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn302/dcn302_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn303/dcn303_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn303/dcn303_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn31/display_rq_dlg_calc_31.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn31/display_rq_dlg_calc_31.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn314/display_mode_vba_314.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn314/display_mode_vba_314.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn314/display_rq_dlg_calc_314.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn314/display_rq_dlg_calc_314.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn32/display_rq_dlg_calc_32.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn32/display_rq_dlg_calc_32.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn321/dcn321_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn321/dcn321_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h +f:drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.c +f:drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h +f:drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h +f:drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c +f:drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.h +f:drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_helpers.c +f:drivers/gpu/drm/amd/display/dc/dml/display_rq_dlg_helpers.h +f:drivers/gpu/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.c +f:drivers/gpu/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.h +f:drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h +f:drivers/gpu/drm/amd/display/dc/dml/dml_logger.h +f:drivers/gpu/drm/amd/display/dc/dml/dsc/qp_tables.h +f:drivers/gpu/drm/amd/display/dc/dml/dsc/rc_calc_fpu.c +f:drivers/gpu/drm/amd/display/dc/dml/dsc/rc_calc_fpu.h +f:drivers/gpu/drm/amd/display/dc/dml2/Makefile +f:drivers/gpu/drm/amd/display/dc/dml2/cmntypes.h +f:drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c +f:drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.h +f:drivers/gpu/drm/amd/display/dc/dml2/display_mode_core_structs.h +f:drivers/gpu/drm/amd/display/dc/dml2/display_mode_lib_defines.h +f:drivers/gpu/drm/amd/display/dc/dml2/display_mode_util.c +f:drivers/gpu/drm/amd/display/dc/dml2/display_mode_util.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_utils.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_utils.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/bounding_boxes/dcn4_soc_bb.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/dml2_external_lib_deps.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/dml_top.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/dml_top_dchub_registers.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/dml_top_display_cfg_types.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/dml_top_policy_types.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/dml_top_soc_parameter_types.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/inc/dml_top_types.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_factory.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_factory.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_shared_types.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_utils.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_utils.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_dcn4.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_dcn4.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml2_top_interfaces.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml2_top_legacy.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml2_top_legacy.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml2_top_soc15.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml2_top_soc15.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/inc/dml2_debug.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml21/src/inc/dml2_internal_shared_types.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_dc_resource_mgmt.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_dc_resource_mgmt.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_dc_types.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_internal_types.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_utils.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_utils.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml_assert.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml_depedencies.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml_display_rq_dlg_calc.c +f:drivers/gpu/drm/amd/display/dc/dml2/dml_display_rq_dlg_calc.h +f:drivers/gpu/drm/amd/display/dc/dml2/dml_logging.h +f:drivers/gpu/drm/amd/display/dc/dpp/Makefile +f:drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp.h +f:drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_cm.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_dscl.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.h +f:drivers/gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp_cm.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn201/dcn201_dpp.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn201/dcn201_dpp.h +f:drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.h +f:drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp_cm.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn32/dcn32_dpp.h +f:drivers/gpu/drm/amd/display/dc/dpp/dcn35/dcn35_dpp.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn35/dcn35_dpp.h +f:drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp.h +f:drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_cm.c +f:drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_dscl.c +f:drivers/gpu/drm/amd/display/dc/dsc/Makefile +f:drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c +f:drivers/gpu/drm/amd/display/dc/dsc/dcn20/dcn20_dsc.c +f:drivers/gpu/drm/amd/display/dc/dsc/dcn20/dcn20_dsc.h +f:drivers/gpu/drm/amd/display/dc/dsc/dcn35/dcn35_dsc.c +f:drivers/gpu/drm/amd/display/dc/dsc/dcn35/dcn35_dsc.h +f:drivers/gpu/drm/amd/display/dc/dsc/dcn401/dcn401_dsc.c +f:drivers/gpu/drm/amd/display/dc/dsc/dcn401/dcn401_dsc.h +f:drivers/gpu/drm/amd/display/dc/dsc/dsc.h +f:drivers/gpu/drm/amd/display/dc/dsc/dscc_types.h +f:drivers/gpu/drm/amd/display/dc/dsc/rc_calc.c +f:drivers/gpu/drm/amd/display/dc/dsc/rc_calc.h +f:drivers/gpu/drm/amd/display/dc/dsc/rc_calc_dpi.c +f:drivers/gpu/drm/amd/display/dc/dwb/Makefile +f:drivers/gpu/drm/amd/display/dc/dwb/dcn30/dcn30_cm_common.h +f:drivers/gpu/drm/amd/display/dc/dwb/dcn30/dcn30_dwb.c +f:drivers/gpu/drm/amd/display/dc/dwb/dcn30/dcn30_dwb.h +f:drivers/gpu/drm/amd/display/dc/dwb/dcn30/dcn30_dwb_cm.c +f:drivers/gpu/drm/amd/display/dc/dwb/dcn35/dcn35_dwb.c +f:drivers/gpu/drm/amd/display/dc/dwb/dcn35/dcn35_dwb.h +f:drivers/gpu/drm/amd/display/dc/gpio/Makefile +f:drivers/gpu/drm/amd/display/dc/gpio/dce110/hw_factory_dce110.c +f:drivers/gpu/drm/amd/display/dc/gpio/dce110/hw_factory_dce110.h +f:drivers/gpu/drm/amd/display/dc/gpio/dce110/hw_translate_dce110.c +f:drivers/gpu/drm/amd/display/dc/gpio/dce110/hw_translate_dce110.h +f:drivers/gpu/drm/amd/display/dc/gpio/dce120/hw_factory_dce120.c +f:drivers/gpu/drm/amd/display/dc/gpio/dce120/hw_factory_dce120.h +f:drivers/gpu/drm/amd/display/dc/gpio/dce120/hw_translate_dce120.c +f:drivers/gpu/drm/amd/display/dc/gpio/dce120/hw_translate_dce120.h +f:drivers/gpu/drm/amd/display/dc/gpio/dce60/hw_factory_dce60.c +f:drivers/gpu/drm/amd/display/dc/gpio/dce60/hw_factory_dce60.h +f:drivers/gpu/drm/amd/display/dc/gpio/dce60/hw_translate_dce60.c +f:drivers/gpu/drm/amd/display/dc/gpio/dce60/hw_translate_dce60.h +f:drivers/gpu/drm/amd/display/dc/gpio/dce80/hw_factory_dce80.c +f:drivers/gpu/drm/amd/display/dc/gpio/dce80/hw_factory_dce80.h +f:drivers/gpu/drm/amd/display/dc/gpio/dce80/hw_translate_dce80.c +f:drivers/gpu/drm/amd/display/dc/gpio/dce80/hw_translate_dce80.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn10/hw_factory_dcn10.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn10/hw_factory_dcn10.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn10/hw_translate_dcn10.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn10/hw_translate_dcn10.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn20/hw_factory_dcn20.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn20/hw_factory_dcn20.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn20/hw_translate_dcn20.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn20/hw_translate_dcn20.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn21/hw_factory_dcn21.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn21/hw_factory_dcn21.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn21/hw_translate_dcn21.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn21/hw_translate_dcn21.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn30/hw_factory_dcn30.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn30/hw_factory_dcn30.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn30/hw_translate_dcn30.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn30/hw_translate_dcn30.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn315/hw_factory_dcn315.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn315/hw_factory_dcn315.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn315/hw_translate_dcn315.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn315/hw_translate_dcn315.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn32/hw_factory_dcn32.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn32/hw_factory_dcn32.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn32/hw_translate_dcn32.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn32/hw_translate_dcn32.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn401/hw_factory_dcn401.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn401/hw_factory_dcn401.h +f:drivers/gpu/drm/amd/display/dc/gpio/dcn401/hw_translate_dcn401.c +f:drivers/gpu/drm/amd/display/dc/gpio/dcn401/hw_translate_dcn401.h +f:drivers/gpu/drm/amd/display/dc/gpio/ddc_regs.h +f:drivers/gpu/drm/amd/display/dc/gpio/generic_regs.h +f:drivers/gpu/drm/amd/display/dc/gpio/gpio_base.c +f:drivers/gpu/drm/amd/display/dc/gpio/gpio_regs.h +f:drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c +f:drivers/gpu/drm/amd/display/dc/gpio/gpio_service.h +f:drivers/gpu/drm/amd/display/dc/gpio/hpd_regs.h +f:drivers/gpu/drm/amd/display/dc/gpio/hw_ddc.c +f:drivers/gpu/drm/amd/display/dc/gpio/hw_ddc.h +f:drivers/gpu/drm/amd/display/dc/gpio/hw_factory.c +f:drivers/gpu/drm/amd/display/dc/gpio/hw_factory.h +f:drivers/gpu/drm/amd/display/dc/gpio/hw_generic.c +f:drivers/gpu/drm/amd/display/dc/gpio/hw_generic.h +f:drivers/gpu/drm/amd/display/dc/gpio/hw_gpio.c +f:drivers/gpu/drm/amd/display/dc/gpio/hw_gpio.h +f:drivers/gpu/drm/amd/display/dc/gpio/hw_hpd.c +f:drivers/gpu/drm/amd/display/dc/gpio/hw_hpd.h +f:drivers/gpu/drm/amd/display/dc/gpio/hw_translate.c +f:drivers/gpu/drm/amd/display/dc/gpio/hw_translate.h +f:drivers/gpu/drm/amd/display/dc/hdcp/Makefile +f:drivers/gpu/drm/amd/display/dc/hdcp/hdcp_msg.c +f:drivers/gpu/drm/amd/display/dc/hpo/Makefile +f:drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/hpo/dcn32/dcn32_hpo_dp_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/hpo/dcn32/dcn32_hpo_dp_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/hubbub/Makefile +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn10/dcn10_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn10/dcn10_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn20/dcn20_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn20/dcn20_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn201/dcn201_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn201/dcn201_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn21/dcn21_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn21/dcn21_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn30/dcn30_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn30/dcn30_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn31/dcn31_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn31/dcn31_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn32/dcn32_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn32/dcn32_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn35/dcn35_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn35/dcn35_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn401/dcn401_hubbub.c +f:drivers/gpu/drm/amd/display/dc/hubbub/dcn401/dcn401_hubbub.h +f:drivers/gpu/drm/amd/display/dc/hubp/Makefile +f:drivers/gpu/drm/amd/display/dc/hubp/dcn10/dcn10_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn10/dcn10_hubp.h +f:drivers/gpu/drm/amd/display/dc/hubp/dcn20/dcn20_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn20/dcn20_hubp.h +f:drivers/gpu/drm/amd/display/dc/hubp/dcn201/dcn201_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn201/dcn201_hubp.h +f:drivers/gpu/drm/amd/display/dc/hubp/dcn21/dcn21_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn21/dcn21_hubp.h +f:drivers/gpu/drm/amd/display/dc/hubp/dcn30/dcn30_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn30/dcn30_hubp.h +f:drivers/gpu/drm/amd/display/dc/hubp/dcn31/dcn31_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn31/dcn31_hubp.h +f:drivers/gpu/drm/amd/display/dc/hubp/dcn32/dcn32_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn32/dcn32_hubp.h +f:drivers/gpu/drm/amd/display/dc/hubp/dcn35/dcn35_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn35/dcn35_hubp.h +f:drivers/gpu/drm/amd/display/dc/hubp/dcn401/dcn401_hubp.c +f:drivers/gpu/drm/amd/display/dc/hubp/dcn401/dcn401_hubp.h +f:drivers/gpu/drm/amd/display/dc/hwss/Makefile +f:drivers/gpu/drm/amd/display/dc/hwss/dce/dce_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dce/dce_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dce100/dce100_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dce100/dce100_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dce112/dce112_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dce112/dce112_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dce120/dce120_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dce120/dce120_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dce60/dce60_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dce60/dce60_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dce80/dce80_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dce80/dce80_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn201/dcn201_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn201/dcn201_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn201/dcn201_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn201/dcn201_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn21/dcn21_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn21/dcn21_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn21/dcn21_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn21/dcn21_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn301/dcn301_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn301/dcn301_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn301/dcn301_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn301/dcn301_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn302/dcn302_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn302/dcn302_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn302/dcn302_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn302/dcn302_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn303/dcn303_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn303/dcn303_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn303/dcn303_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn303/dcn303_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn351/Makefile +f:drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn351/dcn351_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h +f:drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_init.c +f:drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_init.h +f:drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h +f:drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer_private.h +f:drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h +f:drivers/gpu/drm/amd/display/dc/inc/clock_source.h +f:drivers/gpu/drm/amd/display/dc/inc/compressor.h +f:drivers/gpu/drm/amd/display/dc/inc/core_status.h +f:drivers/gpu/drm/amd/display/dc/inc/core_types.h +f:drivers/gpu/drm/amd/display/dc/inc/custom_float.h +f:drivers/gpu/drm/amd/display/dc/inc/dce_calcs.h +f:drivers/gpu/drm/amd/display/dc/inc/dcn_calc_math.h +f:drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/abm.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/audio.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/aux_engine.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr_internal.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/cursor_reg_cache.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/dwb.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/gpio.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/mcif_wb.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/opp.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/optc.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/panel_cntl.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/pg_cntl.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/transform.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/vmid.h +f:drivers/gpu/drm/amd/display/dc/inc/hw/vpg.h +f:drivers/gpu/drm/amd/display/dc/inc/link.h +f:drivers/gpu/drm/amd/display/dc/inc/link_enc_cfg.h +f:drivers/gpu/drm/amd/display/dc/inc/link_hwss.h +f:drivers/gpu/drm/amd/display/dc/inc/reg_helper.h +f:drivers/gpu/drm/amd/display/dc/inc/resource.h +f:drivers/gpu/drm/amd/display/dc/inc/vm_helper.h +f:drivers/gpu/drm/amd/display/dc/irq/Makefile +f:drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.c +f:drivers/gpu/drm/amd/display/dc/irq/dce110/irq_service_dce110.h +f:drivers/gpu/drm/amd/display/dc/irq/dce120/irq_service_dce120.c +f:drivers/gpu/drm/amd/display/dc/irq/dce120/irq_service_dce120.h +f:drivers/gpu/drm/amd/display/dc/irq/dce60/irq_service_dce60.c +f:drivers/gpu/drm/amd/display/dc/irq/dce60/irq_service_dce60.h +f:drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.c +f:drivers/gpu/drm/amd/display/dc/irq/dce80/irq_service_dce80.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn10/irq_service_dcn10.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn10/irq_service_dcn10.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn20/irq_service_dcn20.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn20/irq_service_dcn20.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn201/irq_service_dcn201.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn201/irq_service_dcn201.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn21/irq_service_dcn21.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn21/irq_service_dcn21.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn30/irq_service_dcn30.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn30/irq_service_dcn30.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn302/irq_service_dcn302.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn302/irq_service_dcn302.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn303/irq_service_dcn303.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn303/irq_service_dcn303.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn31/irq_service_dcn31.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn31/irq_service_dcn31.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn314/irq_service_dcn314.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn314/irq_service_dcn314.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn315/irq_service_dcn315.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn315/irq_service_dcn315.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn32/irq_service_dcn32.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn32/irq_service_dcn32.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn35/irq_service_dcn35.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn35/irq_service_dcn35.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn351/irq_service_dcn351.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn351/irq_service_dcn351.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn36/irq_service_dcn36.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn36/irq_service_dcn36.h +f:drivers/gpu/drm/amd/display/dc/irq/dcn401/irq_service_dcn401.c +f:drivers/gpu/drm/amd/display/dc/irq/dcn401/irq_service_dcn401.h +f:drivers/gpu/drm/amd/display/dc/irq/irq_service.c +f:drivers/gpu/drm/amd/display/dc/irq/irq_service.h +f:drivers/gpu/drm/amd/display/dc/irq_types.h +f:drivers/gpu/drm/amd/display/dc/link/Makefile +f:drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c +f:drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.h +f:drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_trace.c +f:drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_trace.h +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.c +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.h +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio_fixed_vs_pe_retimer.c +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio_fixed_vs_pe_retimer.h +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dpia.c +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dpia.h +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.h +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_fixed_vs_pe_retimer_dp.c +f:drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_fixed_vs_pe_retimer_dp.h +f:drivers/gpu/drm/amd/display/dc/link/link_detection.c +f:drivers/gpu/drm/amd/display/dc/link/link_detection.h +f:drivers/gpu/drm/amd/display/dc/link/link_dpms.c +f:drivers/gpu/drm/amd/display/dc/link/link_dpms.h +f:drivers/gpu/drm/amd/display/dc/link/link_factory.c +f:drivers/gpu/drm/amd/display/dc/link/link_factory.h +f:drivers/gpu/drm/amd/display/dc/link/link_hwss_hpo_frl.c +f:drivers/gpu/drm/amd/display/dc/link/link_resource.c +f:drivers/gpu/drm/amd/display/dc/link/link_resource.h +f:drivers/gpu/drm/amd/display/dc/link/link_validation.c +f:drivers/gpu/drm/amd/display/dc/link/link_validation.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_ddc.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_ddc.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia_bw.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia_bw.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_irq_handler.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_irq_handler.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_128b_132b.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_128b_132b.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_auxless.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_auxless.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_dpia.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_dpia.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_fixed_vs_pe_retimer.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_fixed_vs_pe_retimer.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dpcd.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_dpcd.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.h +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_hpd.c +f:drivers/gpu/drm/amd/display/dc/link/protocols/link_hpd.h +f:drivers/gpu/drm/amd/display/dc/mmhubbub/Makefile +f:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn20/dcn20_mmhubbub.c +f:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn20/dcn20_mmhubbub.h +f:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32/dcn32_mmhubbub.c +f:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32/dcn32_mmhubbub.h +f:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35/dcn35_mmhubbub.c +f:drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35/dcn35_mmhubbub.h +f:drivers/gpu/drm/amd/display/dc/mpc/Makefile +f:drivers/gpu/drm/amd/display/dc/mpc/dcn10/dcn10_mpc.c +f:drivers/gpu/drm/amd/display/dc/mpc/dcn10/dcn10_mpc.h +f:drivers/gpu/drm/amd/display/dc/mpc/dcn20/dcn20_mpc.c +f:drivers/gpu/drm/amd/display/dc/mpc/dcn20/dcn20_mpc.h +f:drivers/gpu/drm/amd/display/dc/mpc/dcn30/dcn30_mpc.c +f:drivers/gpu/drm/amd/display/dc/mpc/dcn30/dcn30_mpc.h +f:drivers/gpu/drm/amd/display/dc/mpc/dcn32/dcn32_mpc.c +f:drivers/gpu/drm/amd/display/dc/mpc/dcn32/dcn32_mpc.h +f:drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c +f:drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.h +f:drivers/gpu/drm/amd/display/dc/opp/Makefile +f:drivers/gpu/drm/amd/display/dc/opp/dcn10/dcn10_opp.c +f:drivers/gpu/drm/amd/display/dc/opp/dcn10/dcn10_opp.h +f:drivers/gpu/drm/amd/display/dc/opp/dcn20/dcn20_opp.c +f:drivers/gpu/drm/amd/display/dc/opp/dcn20/dcn20_opp.h +f:drivers/gpu/drm/amd/display/dc/opp/dcn35/dcn35_opp.c +f:drivers/gpu/drm/amd/display/dc/opp/dcn35/dcn35_opp.h +f:drivers/gpu/drm/amd/display/dc/optc/Makefile +f:drivers/gpu/drm/amd/display/dc/optc/dcn10/dcn10_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn10/dcn10_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn20/dcn20_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn20/dcn20_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn201/dcn201_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn201/dcn201_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn30/dcn30_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn30/dcn30_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn301/dcn301_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn301/dcn301_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn31/dcn31_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn31/dcn31_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn314/dcn314_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn314/dcn314_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn32/dcn32_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn32/dcn32_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn35/dcn35_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn35/dcn35_optc.h +f:drivers/gpu/drm/amd/display/dc/optc/dcn401/dcn401_optc.c +f:drivers/gpu/drm/amd/display/dc/optc/dcn401/dcn401_optc.h +f:drivers/gpu/drm/amd/display/dc/os_types.h +f:drivers/gpu/drm/amd/display/dc/pg/Makefile +f:drivers/gpu/drm/amd/display/dc/pg/dcn35/dcn35_pg_cntl.c +f:drivers/gpu/drm/amd/display/dc/pg/dcn35/dcn35_pg_cntl.h +f:drivers/gpu/drm/amd/display/dc/resource/Makefile +f:drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn10/dcn10_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn10/dcn10_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn201/dcn201_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn201/dcn201_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn21/dcn21_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn21/dcn21_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn301/dcn301_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn301/dcn301_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource_helpers.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn36/dcn36_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn36/dcn36_resource.h +f:drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c +f:drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.h +f:drivers/gpu/drm/amd/display/dc/sspl/Makefile +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl.c +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl.h +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_filters.c +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_filters.h +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_isharp_filters.c +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_isharp_filters.h +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_scl_easf_filters.c +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_scl_easf_filters.h +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_scl_filters.c +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_scl_filters.h +f:drivers/gpu/drm/amd/display/dc/sspl/dc_spl_types.h +f:drivers/gpu/drm/amd/display/dc/sspl/spl_custom_float.c +f:drivers/gpu/drm/amd/display/dc/sspl/spl_custom_float.h +f:drivers/gpu/drm/amd/display/dc/sspl/spl_debug.h +f:drivers/gpu/drm/amd/display/dc/sspl/spl_fixpt31_32.c +f:drivers/gpu/drm/amd/display/dc/sspl/spl_fixpt31_32.h +f:drivers/gpu/drm/amd/display/dc/sspl/spl_os_types.h +f:drivers/gpu/drm/amd/display/dc/virtual/Makefile +f:drivers/gpu/drm/amd/display/dc/virtual/virtual_link_encoder.c +f:drivers/gpu/drm/amd/display/dc/virtual/virtual_link_encoder.h +f:drivers/gpu/drm/amd/display/dc/virtual/virtual_link_hwss.c +f:drivers/gpu/drm/amd/display/dc/virtual/virtual_link_hwss.h +f:drivers/gpu/drm/amd/display/dc/virtual/virtual_stream_encoder.c +f:drivers/gpu/drm/amd/display/dc/virtual/virtual_stream_encoder.h +f:drivers/gpu/drm/amd/display/dmub/dmub_srv.h +f:drivers/gpu/drm/amd/display/dmub/dmub_srv_stat.h +f:drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h +f:drivers/gpu/drm/amd/display/dmub/inc/dmub_trace_buffer.h +f:drivers/gpu/drm/amd/display/dmub/src/Makefile +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn30.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn30.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn301.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn301.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn302.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn302.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn303.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn303.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn315.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn315.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn316.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn316.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn351.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn351.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn36.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn36.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_dcn401.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_reg.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_reg.h +f:drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +f:drivers/gpu/drm/amd/display/dmub/src/dmub_srv_stat.c +f:drivers/gpu/drm/amd/display/include/audio_types.h +f:drivers/gpu/drm/amd/display/include/bios_parser_interface.h +f:drivers/gpu/drm/amd/display/include/bios_parser_types.h +f:drivers/gpu/drm/amd/display/include/dal_asic_id.h +f:drivers/gpu/drm/amd/display/include/dal_types.h +f:drivers/gpu/drm/amd/display/include/ddc_service_types.h +f:drivers/gpu/drm/amd/display/include/dpcd_defs.h +f:drivers/gpu/drm/amd/display/include/fixed31_32.h +f:drivers/gpu/drm/amd/display/include/gpio_interface.h +f:drivers/gpu/drm/amd/display/include/gpio_service_interface.h +f:drivers/gpu/drm/amd/display/include/gpio_types.h +f:drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h +f:drivers/gpu/drm/amd/display/include/grph_object_defs.h +f:drivers/gpu/drm/amd/display/include/grph_object_id.h +f:drivers/gpu/drm/amd/display/include/hdcp_msg_types.h +f:drivers/gpu/drm/amd/display/include/irq_service_interface.h +f:drivers/gpu/drm/amd/display/include/link_service_types.h +f:drivers/gpu/drm/amd/display/include/logger_interface.h +f:drivers/gpu/drm/amd/display/include/logger_types.h +f:drivers/gpu/drm/amd/display/include/set_mode_types.h +f:drivers/gpu/drm/amd/display/include/signal_types.h +f:drivers/gpu/drm/amd/display/include/vector.h +f:drivers/gpu/drm/amd/display/modules/color/Makefile +f:drivers/gpu/drm/amd/display/modules/color/color_gamma.c +f:drivers/gpu/drm/amd/display/modules/color/color_gamma.h +f:drivers/gpu/drm/amd/display/modules/color/color_table.c +f:drivers/gpu/drm/amd/display/modules/color/color_table.h +f:drivers/gpu/drm/amd/display/modules/color/luts_1d.h +f:drivers/gpu/drm/amd/display/modules/freesync/Makefile +f:drivers/gpu/drm/amd/display/modules/freesync/freesync.c +f:drivers/gpu/drm/amd/display/modules/hdcp/Makefile +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp.h +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_execution.c +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_transition.c +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_execution.c +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp2_transition.c +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp_ddc.c +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp_log.c +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp_log.h +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c +f:drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.h +f:drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h +f:drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h +f:drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h +f:drivers/gpu/drm/amd/display/modules/inc/mod_shared.h +f:drivers/gpu/drm/amd/display/modules/inc/mod_stats.h +f:drivers/gpu/drm/amd/display/modules/inc/mod_vmid.h +f:drivers/gpu/drm/amd/display/modules/info_packet/Makefile +f:drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c +f:drivers/gpu/drm/amd/display/modules/power/Makefile +f:drivers/gpu/drm/amd/display/modules/power/power_helpers.c +f:drivers/gpu/drm/amd/display/modules/power/power_helpers.h +f:drivers/gpu/drm/amd/display/modules/vmid/vmid.c +f:drivers/gpu/drm/amd/include/aldebaran_ip_offset.h +f:drivers/gpu/drm/amd/include/amd_acpi.h +f:drivers/gpu/drm/amd/include/amd_cper.h +f:drivers/gpu/drm/amd/include/amd_pcie.h +f:drivers/gpu/drm/amd/include/amd_pcie_helpers.h +f:drivers/gpu/drm/amd/include/amd_shared.h +f:drivers/gpu/drm/amd/include/amdgpu_reg_state.h +f:drivers/gpu/drm/amd/include/arct_ip_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_1_8_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_1_8_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_2_0_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_2_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_2_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_2_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_2_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_3_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_3_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_4_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/athub/athub_4_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_3_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_3_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_4_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_4_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_5_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_5_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_5_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_5_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_5_1_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/bif/bif_5_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/clk/clk_10_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/clk/clk_10_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/clk/clk_11_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/clk/clk_11_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/clk/clk_11_0_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/clk/clk_11_0_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/clk/clk_11_5_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/clk/clk_11_5_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_10_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_10_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_10_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_d.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_6_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_6_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_8_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_8_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/dce/dce_8_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_2_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_2_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_2_0_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_2_0_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_2_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_2_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_4_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_4_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_5_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_5_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_6_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_6_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_2_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_2_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_2_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_2_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_5_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_5_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_5_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_5_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_6_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_6_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_4_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_4_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_1_7_default.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_1_7_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_1_7_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_3_6_default.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_3_6_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_3_6_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_4_15_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_4_15_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_4_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/df/df_4_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_2_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_2_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_2_0_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_2_0_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_2_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_2_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_3_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_3_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_3_0_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_3_0_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_3_1_4_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_3_1_4_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_4_2_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_4_2_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_4_2_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/dpcs/dpcs_4_2_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_5_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_5_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_12_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_12_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_2_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_2_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_6_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_6_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_7_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_7_2_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_7_2_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_7_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_8_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_8_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_8_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_8_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_8_1_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/gca/gfx_8_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_6_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_6_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_7_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_7_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_7_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_7_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_8_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_8_1_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_8_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_8_2_d.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_8_2_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/gmc/gmc_8_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_4_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_4_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_4_4_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_4_4_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_5_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_5_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_5_2_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_5_2_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_6_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_6_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_7_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/hdp/hdp_7_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/lsdma/lsdma_6_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/lsdma/lsdma_6_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/lsdma/lsdma_7_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/lsdma/lsdma_7_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_7_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_7_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_2_0_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_2_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_2_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_2_3_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_2_3_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_2_3_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_0_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_0_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_3_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_3_3_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_4_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_4_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_3_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_3_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_default.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_9_4_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_10_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_10_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_10_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_11_0_8_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_11_0_8_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_11_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_11_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_11_5_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_11_5_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_12_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_12_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_4_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_4_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_5_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_5_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_6_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_6_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_8_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_13_0_8_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_14_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_14_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_14_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_14_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_9_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/mp/mp_9_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbif/nbif_6_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbif/nbif_6_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbif/nbif_6_3_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbif/nbif_6_3_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_2_3_default.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_2_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_2_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_4_3_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_4_3_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_6_1_default.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_6_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_6_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_6_1_smn.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_0_smn.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_11_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_11_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_2_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_2_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_4_0_smn.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_4_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_4_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_7_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_7_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_9_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_9_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_1_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_2_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_2_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_2_4_d.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_2_4_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_2_4_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_3_0_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_3_0_1_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_3_0_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_3_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_3_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/oss_3_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_4_0_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_4_0_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_4_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_4_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_4_2_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_4_2_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_4_4_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_4_4_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_5_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_5_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_6_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_6_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_6_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_6_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_7_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/oss/osssys_7_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/pcie/pcie_6_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/pcie/pcie_6_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/pwr/pwr_10_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/pwr/pwr_10_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/rsmu/rsmu_0_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/rsmu/rsmu_0_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_1_default.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma0/sdma0_4_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma1/sdma1_4_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma1/sdma1_4_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma1/sdma1_4_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma1/sdma1_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma1/sdma1_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma1/sdma1_4_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma1/sdma1_4_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma2/sdma2_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma2/sdma2_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma3/sdma3_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma3/sdma3_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma4/sdma4_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma4/sdma4_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma5/sdma5_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma5/sdma5_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma6/sdma6_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma6/sdma6_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma7/sdma7_4_2_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/sdma7/sdma7_4_2_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_6_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_6_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_0_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_0_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_0_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_1_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_2_d.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_2_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_3_d.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_3_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_8_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_8_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/smu/smu_8_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_10_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_10_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_11_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_11_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_11_0_6_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_11_0_6_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_12_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_12_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_6_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_6_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_14_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_14_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_9_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_9_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_10_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_10_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_10_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_11_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_11_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_13_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_13_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_14_0_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_14_0_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_9_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_9_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/thm/thm_9_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_12_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_12_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_1_1_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_1_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_1_2_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_1_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_7_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_6_7_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_8_10_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_8_10_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_8_14_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_8_14_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_8_7_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/umc/umc_8_7_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_3_1_d.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_3_1_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_4_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_4_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_4_2_d.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_4_2_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_5_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_5_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_5_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_6_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_6_0_enum.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_6_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_7_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_7_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_1_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_2_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_2_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_3_0_d.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_3_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_4_0_default.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_4_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vce/vce_4_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_2_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_2_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_2_5_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_2_5_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_2_6_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_2_6_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_3_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_3_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_3_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_3_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_5_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_5_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_0_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/vpe/vpe_6_1_0_offset.h +f:drivers/gpu/drm/amd/include/asic_reg/vpe/vpe_6_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/wafl/wafl2_4_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/wafl/wafl2_4_0_0_smn.h +f:drivers/gpu/drm/amd/include/asic_reg/xgmi/xgmi_4_0_0_sh_mask.h +f:drivers/gpu/drm/amd/include/asic_reg/xgmi/xgmi_4_0_0_smn.h +f:drivers/gpu/drm/amd/include/asic_reg/xgmi/xgmi_6_1_0_sh_mask.h +f:drivers/gpu/drm/amd/include/atom-bits.h +f:drivers/gpu/drm/amd/include/atom-names.h +f:drivers/gpu/drm/amd/include/atom-types.h +f:drivers/gpu/drm/amd/include/atombios.h +f:drivers/gpu/drm/amd/include/atomfirmware.h +f:drivers/gpu/drm/amd/include/atomfirmwareid.h +f:drivers/gpu/drm/amd/include/beige_goby_ip_offset.h +f:drivers/gpu/drm/amd/include/cgs_common.h +f:drivers/gpu/drm/amd/include/cik_structs.h +f:drivers/gpu/drm/amd/include/cyan_skillfish_ip_offset.h +f:drivers/gpu/drm/amd/include/dimgrey_cavefish_ip_offset.h +f:drivers/gpu/drm/amd/include/discovery.h +f:drivers/gpu/drm/amd/include/displayobject.h +f:drivers/gpu/drm/amd/include/dm_pp_interface.h +f:drivers/gpu/drm/amd/include/ivsrcid/dcn/irqsrcs_dcn_1_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/gfx/irqsrcs_gfx_10_1.h +f:drivers/gpu/drm/amd/include/ivsrcid/gfx/irqsrcs_gfx_11_0_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/gfx/irqsrcs_gfx_12_0_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/gfx/irqsrcs_gfx_9_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/isp/irqsrcs_isp_4_1.h +f:drivers/gpu/drm/amd/include/ivsrcid/ivsrcid_vislands30.h +f:drivers/gpu/drm/amd/include/ivsrcid/nbio/irqsrcs_nbif_7_4.h +f:drivers/gpu/drm/amd/include/ivsrcid/sdma0/irqsrcs_sdma0_4_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/sdma0/irqsrcs_sdma0_5_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/sdma1/irqsrcs_sdma1_4_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/sdma1/irqsrcs_sdma1_5_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/sdma2/irqsrcs_sdma2_5_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/sdma3/irqsrcs_sdma3_5_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/smuio/irqsrcs_smuio_9_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/thm/irqsrcs_thm_9_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/uvd/irqsrcs_uvd_7_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/vce/irqsrcs_vce_4_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/vcn/irqsrcs_vcn_1_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/vcn/irqsrcs_vcn_2_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/vcn/irqsrcs_vcn_4_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/vcn/irqsrcs_vcn_5_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/vmc/irqsrcs_vmc_1_0.h +f:drivers/gpu/drm/amd/include/ivsrcid/vpe/irqsrcs_vpe_6_1.h +f:drivers/gpu/drm/amd/include/kgd_kfd_interface.h +f:drivers/gpu/drm/amd/include/kgd_pp_interface.h +f:drivers/gpu/drm/amd/include/mes_v11_api_def.h +f:drivers/gpu/drm/amd/include/mes_v12_api_def.h +f:drivers/gpu/drm/amd/include/navi10_enum.h +f:drivers/gpu/drm/amd/include/navi10_ip_offset.h +f:drivers/gpu/drm/amd/include/navi12_ip_offset.h +f:drivers/gpu/drm/amd/include/navi14_ip_offset.h +f:drivers/gpu/drm/amd/include/pptable.h +f:drivers/gpu/drm/amd/include/renoir_ip_offset.h +f:drivers/gpu/drm/amd/include/sienna_cichlid_ip_offset.h +f:drivers/gpu/drm/amd/include/soc15_hw_ip.h +f:drivers/gpu/drm/amd/include/soc15_ih_clientid.h +f:drivers/gpu/drm/amd/include/soc21_enum.h +f:drivers/gpu/drm/amd/include/soc24_enum.h +f:drivers/gpu/drm/amd/include/umsch_mm_4_0_api_def.h +f:drivers/gpu/drm/amd/include/v10_structs.h +f:drivers/gpu/drm/amd/include/v11_structs.h +f:drivers/gpu/drm/amd/include/v12_structs.h +f:drivers/gpu/drm/amd/include/v9_structs.h +f:drivers/gpu/drm/amd/include/vangogh_ip_offset.h +f:drivers/gpu/drm/amd/include/vega10_enum.h +f:drivers/gpu/drm/amd/include/vega10_ip_offset.h +f:drivers/gpu/drm/amd/include/vega20_ip_offset.h +f:drivers/gpu/drm/amd/include/vi_structs.h +f:drivers/gpu/drm/amd/include/yellow_carp_offset.h +f:drivers/gpu/drm/amd/pm/Makefile +f:drivers/gpu/drm/amd/pm/amdgpu_dpm.c +f:drivers/gpu/drm/amd/pm/amdgpu_dpm_internal.c +f:drivers/gpu/drm/amd/pm/amdgpu_pm.c +f:drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h +f:drivers/gpu/drm/amd/pm/inc/amdgpu_dpm_internal.h +f:drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h +f:drivers/gpu/drm/amd/pm/inc/smu_v13_0_0_pptable.h +f:drivers/gpu/drm/amd/pm/legacy-dpm/Makefile +f:drivers/gpu/drm/amd/pm/legacy-dpm/cik_dpm.h +f:drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c +f:drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.h +f:drivers/gpu/drm/amd/pm/legacy-dpm/kv_smc.c +f:drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c +f:drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.h +f:drivers/gpu/drm/amd/pm/legacy-dpm/ppsmc.h +f:drivers/gpu/drm/amd/pm/legacy-dpm/r600_dpm.h +f:drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c +f:drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.h +f:drivers/gpu/drm/amd/pm/legacy-dpm/si_smc.c +f:drivers/gpu/drm/amd/pm/legacy-dpm/sislands_smc.h +f:drivers/gpu/drm/amd/pm/powerplay/Makefile +f:drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/Makefile +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/ci_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/ci_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/common_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/common_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/fiji_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/fiji_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/hardwaremanager.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/hwmgr.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/hwmgr_ppt.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/polaris_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/polaris_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/pp_overdriver.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/pp_overdriver.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/pp_psm.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/pp_psm.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomfwctrl.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomfwctrl.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/pppcielanes.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/pppcielanes.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/pptable_v1_0.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/processpptables.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_inc.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_clockpowergating.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_clockpowergating.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_dyn_defaults.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_powertune.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_powertune.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu8_hwmgr.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu8_hwmgr.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu9_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu9_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu_helper.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu_helper.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/tonga_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/tonga_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_inc.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_powertune.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_powertune.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_pptable.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_processpptables.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_processpptables.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_inc.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_pptable.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_processpptables.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_processpptables.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_thermal.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_thermal.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_baco.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_baco.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_inc.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_powertune.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_powertune.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_pptable.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_processpptables.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_processpptables.h +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_thermal.c +f:drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_thermal.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/amd_powerplay.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/cz_ppsmc.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/fiji_ppsmc.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/hardwaremanager.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/polaris10_pwrvirus.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/power_state.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/pp_debug.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/pp_endian.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/pp_thermal.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/ppinterrupt.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/rv_ppsmc.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu10.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu10_driver_if.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu11_driver_if.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu7.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu71.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu71_discrete.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu72.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu72_discrete.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu73.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu73_discrete.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu74.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu74_discrete.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu75.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu75_discrete.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu7_common.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu7_discrete.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu7_fusion.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu7_ppsmc.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu8.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu8_fusion.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu9.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu9_driver_if.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu_ucode_xfer_cz.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smu_ucode_xfer_vi.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/tonga_ppsmc.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/vega10_ppsmc.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/vega12/smu9_driver_if.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/vega12_ppsmc.h +f:drivers/gpu/drm/amd/pm/powerplay/inc/vega20_ppsmc.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/Makefile +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/fiji_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/fiji_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/iceland_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/iceland_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/polaris10_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/polaris10_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smu10_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smu10_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smu7_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smu7_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smu8_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smu8_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smu9_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smu9_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/tonga_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/tonga_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/vega10_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/vega10_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/vega12_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/vega12_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/vega20_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/vega20_smumgr.h +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/vegam_smumgr.c +f:drivers/gpu/drm/amd/pm/powerplay/smumgr/vegam_smumgr.h +f:drivers/gpu/drm/amd/pm/swsmu/Makefile +f:drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +f:drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/aldebaran_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/arcturus_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu11_driver_if_arcturus.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu11_driver_if_cyan_skillfish.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu11_driver_if_navi10.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu11_driver_if_sienna_cichlid.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu11_driver_if_vangogh.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu12_driver_if.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_aldebaran.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_0.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_4.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_5.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_6.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_yellow_carp.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu14_driver_if_v14_0_0.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_0_7_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_0_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_5_pmfw.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_5_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_8_pmfw.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_8_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v12_0_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_12_pmfw.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_12_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_1_pmfw.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_1_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_4_pmfw.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_4_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_5_pmfw.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_5_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_7_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_pmfw.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v14_0_0_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v14_0_2_ppsmc.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_11_0_cdr_table.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0_7_pptable.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0_pptable.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v12_0.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0_7_pptable.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0_pptable.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h +f:drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0_2_pptable.h +f:drivers/gpu/drm/amd/pm/swsmu/smu11/Makefile +f:drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu11/cyan_skillfish_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu11/cyan_skillfish_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c +f:drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu12/Makefile +f:drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu12/smu_v12_0.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/Makefile +f:drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu14/Makefile +f:drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c +f:drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c +f:drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.h +f:drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c +f:drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h +f:drivers/gpu/drm/amd/pm/swsmu/smu_internal.h +f:drivers/gpu/drm/arm/Kconfig +f:drivers/gpu/drm/arm/Makefile +f:drivers/gpu/drm/arm/display/Kbuild +f:drivers/gpu/drm/arm/display/Kconfig +f:drivers/gpu/drm/arm/display/include/malidp_io.h +f:drivers/gpu/drm/arm/display/include/malidp_product.h +f:drivers/gpu/drm/arm/display/include/malidp_utils.h +f:drivers/gpu/drm/arm/display/komeda/Makefile +f:drivers/gpu/drm/arm/display/komeda/d71/d71_component.c +f:drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c +f:drivers/gpu/drm/arm/display/komeda/d71/d71_dev.h +f:drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h +f:drivers/gpu/drm/arm/display/komeda/komeda_color_mgmt.c +f:drivers/gpu/drm/arm/display/komeda/komeda_color_mgmt.h +f:drivers/gpu/drm/arm/display/komeda/komeda_crtc.c +f:drivers/gpu/drm/arm/display/komeda/komeda_dev.c +f:drivers/gpu/drm/arm/display/komeda/komeda_dev.h +f:drivers/gpu/drm/arm/display/komeda/komeda_drv.c +f:drivers/gpu/drm/arm/display/komeda/komeda_event.c +f:drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c +f:drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h +f:drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c +f:drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.h +f:drivers/gpu/drm/arm/display/komeda/komeda_kms.c +f:drivers/gpu/drm/arm/display/komeda/komeda_kms.h +f:drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c +f:drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h +f:drivers/gpu/drm/arm/display/komeda/komeda_pipeline_state.c +f:drivers/gpu/drm/arm/display/komeda/komeda_plane.c +f:drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c +f:drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c +f:drivers/gpu/drm/arm/hdlcd_crtc.c +f:drivers/gpu/drm/arm/hdlcd_drv.c +f:drivers/gpu/drm/arm/hdlcd_drv.h +f:drivers/gpu/drm/arm/hdlcd_regs.h +f:drivers/gpu/drm/arm/malidp_crtc.c +f:drivers/gpu/drm/arm/malidp_drv.c +f:drivers/gpu/drm/arm/malidp_drv.h +f:drivers/gpu/drm/arm/malidp_hw.c +f:drivers/gpu/drm/arm/malidp_hw.h +f:drivers/gpu/drm/arm/malidp_mw.c +f:drivers/gpu/drm/arm/malidp_mw.h +f:drivers/gpu/drm/arm/malidp_planes.c +f:drivers/gpu/drm/arm/malidp_regs.h +f:drivers/gpu/drm/armada/Kconfig +f:drivers/gpu/drm/armada/Makefile +f:drivers/gpu/drm/armada/armada_510.c +f:drivers/gpu/drm/armada/armada_crtc.c +f:drivers/gpu/drm/armada/armada_crtc.h +f:drivers/gpu/drm/armada/armada_debugfs.c +f:drivers/gpu/drm/armada/armada_drm.h +f:drivers/gpu/drm/armada/armada_drv.c +f:drivers/gpu/drm/armada/armada_fb.c +f:drivers/gpu/drm/armada/armada_fb.h +f:drivers/gpu/drm/armada/armada_fbdev.c +f:drivers/gpu/drm/armada/armada_gem.c +f:drivers/gpu/drm/armada/armada_gem.h +f:drivers/gpu/drm/armada/armada_hw.h +f:drivers/gpu/drm/armada/armada_ioctlP.h +f:drivers/gpu/drm/armada/armada_overlay.c +f:drivers/gpu/drm/armada/armada_plane.c +f:drivers/gpu/drm/armada/armada_plane.h +f:drivers/gpu/drm/armada/armada_trace.c +f:drivers/gpu/drm/armada/armada_trace.h +f:drivers/gpu/drm/aspeed/Kconfig +f:drivers/gpu/drm/aspeed/Makefile +f:drivers/gpu/drm/aspeed/aspeed_gfx.h +f:drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c +f:drivers/gpu/drm/aspeed/aspeed_gfx_drv.c +f:drivers/gpu/drm/aspeed/aspeed_gfx_out.c +f:drivers/gpu/drm/ast/Kconfig +f:drivers/gpu/drm/ast/Makefile +f:drivers/gpu/drm/ast/ast_2000.c +f:drivers/gpu/drm/ast/ast_2100.c +f:drivers/gpu/drm/ast/ast_2300.c +f:drivers/gpu/drm/ast/ast_2500.c +f:drivers/gpu/drm/ast/ast_2600.c +f:drivers/gpu/drm/ast/ast_cursor.c +f:drivers/gpu/drm/ast/ast_ddc.c +f:drivers/gpu/drm/ast/ast_ddc.h +f:drivers/gpu/drm/ast/ast_dp.c +f:drivers/gpu/drm/ast/ast_dp501.c +f:drivers/gpu/drm/ast/ast_drv.c +f:drivers/gpu/drm/ast/ast_drv.h +f:drivers/gpu/drm/ast/ast_main.c +f:drivers/gpu/drm/ast/ast_mm.c +f:drivers/gpu/drm/ast/ast_mode.c +f:drivers/gpu/drm/ast/ast_post.c +f:drivers/gpu/drm/ast/ast_post.h +f:drivers/gpu/drm/ast/ast_reg.h +f:drivers/gpu/drm/ast/ast_sil164.c +f:drivers/gpu/drm/ast/ast_tables.h +f:drivers/gpu/drm/ast/ast_vbios.c +f:drivers/gpu/drm/ast/ast_vbios.h +f:drivers/gpu/drm/ast/ast_vga.c +f:drivers/gpu/drm/atmel-hlcdc/Kconfig +f:drivers/gpu/drm/atmel-hlcdc/Makefile +f:drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +f:drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c +f:drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h +f:drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c +f:drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c +f:drivers/gpu/drm/bridge/Kconfig +f:drivers/gpu/drm/bridge/Makefile +f:drivers/gpu/drm/bridge/adv7511/Kconfig +f:drivers/gpu/drm/bridge/adv7511/Makefile +f:drivers/gpu/drm/bridge/adv7511/adv7511.h +f:drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +f:drivers/gpu/drm/bridge/adv7511/adv7511_cec.c +f:drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +f:drivers/gpu/drm/bridge/adv7511/adv7533.c +f:drivers/gpu/drm/bridge/analogix/Kconfig +f:drivers/gpu/drm/bridge/analogix/Makefile +f:drivers/gpu/drm/bridge/analogix/analogix-anx6345.c +f:drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c +f:drivers/gpu/drm/bridge/analogix/analogix-anx78xx.h +f:drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.c +f:drivers/gpu/drm/bridge/analogix/analogix-i2c-dptx.h +f:drivers/gpu/drm/bridge/analogix/analogix-i2c-txcommon.h +f:drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +f:drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +f:drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +f:drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h +f:drivers/gpu/drm/bridge/analogix/anx7625.c +f:drivers/gpu/drm/bridge/analogix/anx7625.h +f:drivers/gpu/drm/bridge/aux-bridge.c +f:drivers/gpu/drm/bridge/aux-hpd-bridge.c +f:drivers/gpu/drm/bridge/cadence/Kconfig +f:drivers/gpu/drm/bridge/cadence/Makefile +f:drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +f:drivers/gpu/drm/bridge/cadence/cdns-dsi-core.h +f:drivers/gpu/drm/bridge/cadence/cdns-dsi-j721e.c +f:drivers/gpu/drm/bridge/cadence/cdns-dsi-j721e.h +f:drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +f:drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h +f:drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.c +f:drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.h +f:drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-j721e.c +f:drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-j721e.h +f:drivers/gpu/drm/bridge/chipone-icn6211.c +f:drivers/gpu/drm/bridge/chrontel-ch7033.c +f:drivers/gpu/drm/bridge/cros-ec-anx7688.c +f:drivers/gpu/drm/bridge/display-connector.c +f:drivers/gpu/drm/bridge/fsl-ldb.c +f:drivers/gpu/drm/bridge/imx/Kconfig +f:drivers/gpu/drm/bridge/imx/Makefile +f:drivers/gpu/drm/bridge/imx/imx-ldb-helper.c +f:drivers/gpu/drm/bridge/imx/imx-ldb-helper.h +f:drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c +f:drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c +f:drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c +f:drivers/gpu/drm/bridge/imx/imx8qm-ldb.c +f:drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c +f:drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c +f:drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c +f:drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c +f:drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c +f:drivers/gpu/drm/bridge/ite-it6263.c +f:drivers/gpu/drm/bridge/ite-it6505.c +f:drivers/gpu/drm/bridge/ite-it66121.c +f:drivers/gpu/drm/bridge/lontium-lt8912b.c +f:drivers/gpu/drm/bridge/lontium-lt9211.c +f:drivers/gpu/drm/bridge/lontium-lt9611.c +f:drivers/gpu/drm/bridge/lontium-lt9611uxc.c +f:drivers/gpu/drm/bridge/lvds-codec.c +f:drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c +f:drivers/gpu/drm/bridge/microchip-lvds.c +f:drivers/gpu/drm/bridge/nwl-dsi.c +f:drivers/gpu/drm/bridge/nwl-dsi.h +f:drivers/gpu/drm/bridge/nxp-ptn3460.c +f:drivers/gpu/drm/bridge/panel.c +f:drivers/gpu/drm/bridge/parade-ps8622.c +f:drivers/gpu/drm/bridge/parade-ps8640.c +f:drivers/gpu/drm/bridge/samsung-dsim.c +f:drivers/gpu/drm/bridge/sii902x.c +f:drivers/gpu/drm/bridge/sii9234.c +f:drivers/gpu/drm/bridge/sil-sii8620.c +f:drivers/gpu/drm/bridge/sil-sii8620.h +f:drivers/gpu/drm/bridge/simple-bridge.c +f:drivers/gpu/drm/bridge/synopsys/Kconfig +f:drivers/gpu/drm/bridge/synopsys/Makefile +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi-audio.h +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi-gp-audio.c +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +f:drivers/gpu/drm/bridge/synopsys/dw-hdmi.h +f:drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c +f:drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi2.c +f:drivers/gpu/drm/bridge/tc358762.c +f:drivers/gpu/drm/bridge/tc358764.c +f:drivers/gpu/drm/bridge/tc358767.c +f:drivers/gpu/drm/bridge/tc358768.c +f:drivers/gpu/drm/bridge/tc358775.c +f:drivers/gpu/drm/bridge/tda998x_drv.c +f:drivers/gpu/drm/bridge/thc63lvd1024.c +f:drivers/gpu/drm/bridge/ti-dlpc3433.c +f:drivers/gpu/drm/bridge/ti-sn65dsi83.c +f:drivers/gpu/drm/bridge/ti-sn65dsi86.c +f:drivers/gpu/drm/bridge/ti-tdp158.c +f:drivers/gpu/drm/bridge/ti-tfp410.c +f:drivers/gpu/drm/bridge/ti-tpd12s015.c +f:drivers/gpu/drm/ci/arm.config +f:drivers/gpu/drm/ci/arm64.config +f:drivers/gpu/drm/ci/build-igt.sh +f:drivers/gpu/drm/ci/build.sh +f:drivers/gpu/drm/ci/build.yml +f:drivers/gpu/drm/ci/check-devicetrees.yml +f:drivers/gpu/drm/ci/check-patch.py +f:drivers/gpu/drm/ci/container.yml +f:drivers/gpu/drm/ci/dt-binding-check.sh +f:drivers/gpu/drm/ci/dtbs-check.sh +f:drivers/gpu/drm/ci/gitlab-ci.yml +f:drivers/gpu/drm/ci/igt_runner.sh +f:drivers/gpu/drm/ci/image-tags.yml +f:drivers/gpu/drm/ci/kunit.sh +f:drivers/gpu/drm/ci/kunit.yml +f:drivers/gpu/drm/ci/lava-submit.sh +f:drivers/gpu/drm/ci/setup-llvm-links.sh +f:drivers/gpu/drm/ci/static-checks.yml +f:drivers/gpu/drm/ci/test.yml +f:drivers/gpu/drm/ci/x86_64.config +f:drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt +f:drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt +f:drivers/gpu/drm/ci/xfails/amdgpu-stoney-skips.txt +f:drivers/gpu/drm/ci/xfails/i915-amly-fails.txt +f:drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt +f:drivers/gpu/drm/ci/xfails/i915-amly-skips.txt +f:drivers/gpu/drm/ci/xfails/i915-apl-fails.txt +f:drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt +f:drivers/gpu/drm/ci/xfails/i915-apl-skips.txt +f:drivers/gpu/drm/ci/xfails/i915-cml-fails.txt +f:drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt +f:drivers/gpu/drm/ci/xfails/i915-cml-skips.txt +f:drivers/gpu/drm/ci/xfails/i915-glk-fails.txt +f:drivers/gpu/drm/ci/xfails/i915-glk-flakes.txt +f:drivers/gpu/drm/ci/xfails/i915-glk-skips.txt +f:drivers/gpu/drm/ci/xfails/i915-jsl-fails.txt +f:drivers/gpu/drm/ci/xfails/i915-jsl-flakes.txt +f:drivers/gpu/drm/ci/xfails/i915-jsl-skips.txt +f:drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt +f:drivers/gpu/drm/ci/xfails/i915-kbl-flakes.txt +f:drivers/gpu/drm/ci/xfails/i915-kbl-skips.txt +f:drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt +f:drivers/gpu/drm/ci/xfails/i915-tgl-skips.txt +f:drivers/gpu/drm/ci/xfails/i915-whl-fails.txt +f:drivers/gpu/drm/ci/xfails/i915-whl-flakes.txt +f:drivers/gpu/drm/ci/xfails/i915-whl-skips.txt +f:drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt +f:drivers/gpu/drm/ci/xfails/mediatek-mt8173-flakes.txt +f:drivers/gpu/drm/ci/xfails/mediatek-mt8173-skips.txt +f:drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt +f:drivers/gpu/drm/ci/xfails/mediatek-mt8183-flakes.txt +f:drivers/gpu/drm/ci/xfails/mediatek-mt8183-skips.txt +f:drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt +f:drivers/gpu/drm/ci/xfails/meson-g12b-skips.txt +f:drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt +f:drivers/gpu/drm/ci/xfails/msm-apq8016-skips.txt +f:drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt +f:drivers/gpu/drm/ci/xfails/msm-apq8096-flakes.txt +f:drivers/gpu/drm/ci/xfails/msm-apq8096-skips.txt +f:drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt +f:drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-flakes.txt +f:drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt +f:drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt +f:drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-flakes.txt +f:drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-skips.txt +f:drivers/gpu/drm/ci/xfails/msm-sm8350-hdk-fails.txt +f:drivers/gpu/drm/ci/xfails/msm-sm8350-hdk-flakes.txt +f:drivers/gpu/drm/ci/xfails/msm-sm8350-hdk-skips.txt +f:drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt +f:drivers/gpu/drm/ci/xfails/panfrost-g12b-skips.txt +f:drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt +f:drivers/gpu/drm/ci/xfails/panfrost-mt8183-skips.txt +f:drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt +f:drivers/gpu/drm/ci/xfails/panfrost-rk3288-skips.txt +f:drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt +f:drivers/gpu/drm/ci/xfails/panfrost-rk3399-flakes.txt +f:drivers/gpu/drm/ci/xfails/panfrost-rk3399-skips.txt +f:drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt +f:drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt +f:drivers/gpu/drm/ci/xfails/rockchip-rk3288-skips.txt +f:drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt +f:drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt +f:drivers/gpu/drm/ci/xfails/rockchip-rk3399-skips.txt +f:drivers/gpu/drm/ci/xfails/virtio_gpu-none-fails.txt +f:drivers/gpu/drm/ci/xfails/virtio_gpu-none-skips.txt +f:drivers/gpu/drm/ci/xfails/vkms-none-fails.txt +f:drivers/gpu/drm/ci/xfails/vkms-none-flakes.txt +f:drivers/gpu/drm/ci/xfails/vkms-none-skips.txt +f:drivers/gpu/drm/clients/Kconfig +f:drivers/gpu/drm/clients/Makefile +f:drivers/gpu/drm/clients/drm_client_internal.h +f:drivers/gpu/drm/clients/drm_client_setup.c +f:drivers/gpu/drm/clients/drm_fbdev_client.c +f:drivers/gpu/drm/clients/drm_log.c +f:drivers/gpu/drm/display/Kconfig +f:drivers/gpu/drm/display/Makefile +f:drivers/gpu/drm/display/drm_bridge_connector.c +f:drivers/gpu/drm/display/drm_display_helper_mod.c +f:drivers/gpu/drm/display/drm_dp_aux_bus.c +f:drivers/gpu/drm/display/drm_dp_aux_dev.c +f:drivers/gpu/drm/display/drm_dp_cec.c +f:drivers/gpu/drm/display/drm_dp_dual_mode_helper.c +f:drivers/gpu/drm/display/drm_dp_helper.c +f:drivers/gpu/drm/display/drm_dp_helper_internal.h +f:drivers/gpu/drm/display/drm_dp_mst_topology.c +f:drivers/gpu/drm/display/drm_dp_mst_topology_internal.h +f:drivers/gpu/drm/display/drm_dp_tunnel.c +f:drivers/gpu/drm/display/drm_dsc_helper.c +f:drivers/gpu/drm/display/drm_hdcp_helper.c +f:drivers/gpu/drm/display/drm_hdmi_audio_helper.c +f:drivers/gpu/drm/display/drm_hdmi_cec_helper.c +f:drivers/gpu/drm/display/drm_hdmi_cec_notifier_helper.c +f:drivers/gpu/drm/display/drm_hdmi_helper.c +f:drivers/gpu/drm/display/drm_hdmi_state_helper.c +f:drivers/gpu/drm/display/drm_scdc_helper.c +f:drivers/gpu/drm/drm_atomic.c +f:drivers/gpu/drm/drm_atomic_helper.c +f:drivers/gpu/drm/drm_atomic_state_helper.c +f:drivers/gpu/drm/drm_atomic_uapi.c +f:drivers/gpu/drm/drm_auth.c +f:drivers/gpu/drm/drm_blend.c +f:drivers/gpu/drm/drm_bridge.c +f:drivers/gpu/drm/drm_bridge_helper.c +f:drivers/gpu/drm/drm_buddy.c +f:drivers/gpu/drm/drm_cache.c +f:drivers/gpu/drm/drm_client.c +f:drivers/gpu/drm/drm_client_event.c +f:drivers/gpu/drm/drm_client_modeset.c +f:drivers/gpu/drm/drm_color_mgmt.c +f:drivers/gpu/drm/drm_connector.c +f:drivers/gpu/drm/drm_crtc.c +f:drivers/gpu/drm/drm_crtc_helper.c +f:drivers/gpu/drm/drm_crtc_helper_internal.h +f:drivers/gpu/drm/drm_crtc_internal.h +f:drivers/gpu/drm/drm_damage_helper.c +f:drivers/gpu/drm/drm_debugfs.c +f:drivers/gpu/drm/drm_debugfs_crc.c +f:drivers/gpu/drm/drm_displayid.c +f:drivers/gpu/drm/drm_displayid_internal.h +f:drivers/gpu/drm/drm_draw.c +f:drivers/gpu/drm/drm_draw_internal.h +f:drivers/gpu/drm/drm_drv.c +f:drivers/gpu/drm/drm_dumb_buffers.c +f:drivers/gpu/drm/drm_edid.c +f:drivers/gpu/drm/drm_edid_load.c +f:drivers/gpu/drm/drm_eld.c +f:drivers/gpu/drm/drm_encoder.c +f:drivers/gpu/drm/drm_exec.c +f:drivers/gpu/drm/drm_fb_dma_helper.c +f:drivers/gpu/drm/drm_fb_helper.c +f:drivers/gpu/drm/drm_fbdev_dma.c +f:drivers/gpu/drm/drm_fbdev_shmem.c +f:drivers/gpu/drm/drm_fbdev_ttm.c +f:drivers/gpu/drm/drm_file.c +f:drivers/gpu/drm/drm_flip_work.c +f:drivers/gpu/drm/drm_format_helper.c +f:drivers/gpu/drm/drm_format_internal.h +f:drivers/gpu/drm/drm_fourcc.c +f:drivers/gpu/drm/drm_framebuffer.c +f:drivers/gpu/drm/drm_gem.c +f:drivers/gpu/drm/drm_gem_atomic_helper.c +f:drivers/gpu/drm/drm_gem_dma_helper.c +f:drivers/gpu/drm/drm_gem_framebuffer_helper.c +f:drivers/gpu/drm/drm_gem_shmem_helper.c +f:drivers/gpu/drm/drm_gem_ttm_helper.c +f:drivers/gpu/drm/drm_gem_vram_helper.c +f:drivers/gpu/drm/drm_gpusvm.c +f:drivers/gpu/drm/drm_gpuvm.c +f:drivers/gpu/drm/drm_internal.h +f:drivers/gpu/drm/drm_ioc32.c +f:drivers/gpu/drm/drm_ioctl.c +f:drivers/gpu/drm/drm_kms_helper_common.c +f:drivers/gpu/drm/drm_lease.c +f:drivers/gpu/drm/drm_managed.c +f:drivers/gpu/drm/drm_mipi_dbi.c +f:drivers/gpu/drm/drm_mipi_dsi.c +f:drivers/gpu/drm/drm_mm.c +f:drivers/gpu/drm/drm_mode_config.c +f:drivers/gpu/drm/drm_mode_object.c +f:drivers/gpu/drm/drm_modes.c +f:drivers/gpu/drm/drm_modeset_helper.c +f:drivers/gpu/drm/drm_modeset_lock.c +f:drivers/gpu/drm/drm_of.c +f:drivers/gpu/drm/drm_pagemap.c +f:drivers/gpu/drm/drm_panel.c +f:drivers/gpu/drm/drm_panel_backlight_quirks.c +f:drivers/gpu/drm/drm_panel_orientation_quirks.c +f:drivers/gpu/drm/drm_panic.c +f:drivers/gpu/drm/drm_panic_qr.rs +f:drivers/gpu/drm/drm_pci.c +f:drivers/gpu/drm/drm_plane.c +f:drivers/gpu/drm/drm_plane_helper.c +f:drivers/gpu/drm/drm_prime.c +f:drivers/gpu/drm/drm_print.c +f:drivers/gpu/drm/drm_privacy_screen.c +f:drivers/gpu/drm/drm_privacy_screen_x86.c +f:drivers/gpu/drm/drm_probe_helper.c +f:drivers/gpu/drm/drm_property.c +f:drivers/gpu/drm/drm_rect.c +f:drivers/gpu/drm/drm_self_refresh_helper.c +f:drivers/gpu/drm/drm_simple_kms_helper.c +f:drivers/gpu/drm/drm_suballoc.c +f:drivers/gpu/drm/drm_syncobj.c +f:drivers/gpu/drm/drm_sysfs.c +f:drivers/gpu/drm/drm_trace.h +f:drivers/gpu/drm/drm_trace_points.c +f:drivers/gpu/drm/drm_vblank.c +f:drivers/gpu/drm/drm_vblank_work.c +f:drivers/gpu/drm/drm_vma_manager.c +f:drivers/gpu/drm/drm_writeback.c +f:drivers/gpu/drm/etnaviv/Kconfig +f:drivers/gpu/drm/etnaviv/Makefile +f:drivers/gpu/drm/etnaviv/cmdstream.xml.h +f:drivers/gpu/drm/etnaviv/common.xml.h +f:drivers/gpu/drm/etnaviv/etnaviv_buffer.c +f:drivers/gpu/drm/etnaviv/etnaviv_cmd_parser.c +f:drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.c +f:drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.h +f:drivers/gpu/drm/etnaviv/etnaviv_drv.c +f:drivers/gpu/drm/etnaviv/etnaviv_drv.h +f:drivers/gpu/drm/etnaviv/etnaviv_dump.c +f:drivers/gpu/drm/etnaviv/etnaviv_dump.h +f:drivers/gpu/drm/etnaviv/etnaviv_gem.c +f:drivers/gpu/drm/etnaviv/etnaviv_gem.h +f:drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c +f:drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +f:drivers/gpu/drm/etnaviv/etnaviv_gpu.c +f:drivers/gpu/drm/etnaviv/etnaviv_gpu.h +f:drivers/gpu/drm/etnaviv/etnaviv_hwdb.c +f:drivers/gpu/drm/etnaviv/etnaviv_iommu.c +f:drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c +f:drivers/gpu/drm/etnaviv/etnaviv_mmu.c +f:drivers/gpu/drm/etnaviv/etnaviv_mmu.h +f:drivers/gpu/drm/etnaviv/etnaviv_perfmon.c +f:drivers/gpu/drm/etnaviv/etnaviv_perfmon.h +f:drivers/gpu/drm/etnaviv/etnaviv_sched.c +f:drivers/gpu/drm/etnaviv/etnaviv_sched.h +f:drivers/gpu/drm/etnaviv/state.xml.h +f:drivers/gpu/drm/etnaviv/state_3d.xml.h +f:drivers/gpu/drm/etnaviv/state_blt.xml.h +f:drivers/gpu/drm/etnaviv/state_hi.xml.h +f:drivers/gpu/drm/exynos/Kconfig +f:drivers/gpu/drm/exynos/Makefile +f:drivers/gpu/drm/exynos/exynos5433_drm_decon.c +f:drivers/gpu/drm/exynos/exynos7_drm_decon.c +f:drivers/gpu/drm/exynos/exynos_dp.c +f:drivers/gpu/drm/exynos/exynos_drm_crtc.c +f:drivers/gpu/drm/exynos/exynos_drm_crtc.h +f:drivers/gpu/drm/exynos/exynos_drm_dma.c +f:drivers/gpu/drm/exynos/exynos_drm_dpi.c +f:drivers/gpu/drm/exynos/exynos_drm_drv.c +f:drivers/gpu/drm/exynos/exynos_drm_drv.h +f:drivers/gpu/drm/exynos/exynos_drm_dsi.c +f:drivers/gpu/drm/exynos/exynos_drm_fb.c +f:drivers/gpu/drm/exynos/exynos_drm_fb.h +f:drivers/gpu/drm/exynos/exynos_drm_fbdev.c +f:drivers/gpu/drm/exynos/exynos_drm_fbdev.h +f:drivers/gpu/drm/exynos/exynos_drm_fimc.c +f:drivers/gpu/drm/exynos/exynos_drm_fimd.c +f:drivers/gpu/drm/exynos/exynos_drm_g2d.c +f:drivers/gpu/drm/exynos/exynos_drm_g2d.h +f:drivers/gpu/drm/exynos/exynos_drm_gem.c +f:drivers/gpu/drm/exynos/exynos_drm_gem.h +f:drivers/gpu/drm/exynos/exynos_drm_gsc.c +f:drivers/gpu/drm/exynos/exynos_drm_ipp.c +f:drivers/gpu/drm/exynos/exynos_drm_ipp.h +f:drivers/gpu/drm/exynos/exynos_drm_mic.c +f:drivers/gpu/drm/exynos/exynos_drm_plane.c +f:drivers/gpu/drm/exynos/exynos_drm_plane.h +f:drivers/gpu/drm/exynos/exynos_drm_rotator.c +f:drivers/gpu/drm/exynos/exynos_drm_scaler.c +f:drivers/gpu/drm/exynos/exynos_drm_vidi.c +f:drivers/gpu/drm/exynos/exynos_drm_vidi.h +f:drivers/gpu/drm/exynos/exynos_hdmi.c +f:drivers/gpu/drm/exynos/exynos_mixer.c +f:drivers/gpu/drm/exynos/regs-decon5433.h +f:drivers/gpu/drm/exynos/regs-decon7.h +f:drivers/gpu/drm/exynos/regs-fimc.h +f:drivers/gpu/drm/exynos/regs-gsc.h +f:drivers/gpu/drm/exynos/regs-hdmi.h +f:drivers/gpu/drm/exynos/regs-mixer.h +f:drivers/gpu/drm/exynos/regs-rotator.h +f:drivers/gpu/drm/exynos/regs-scaler.h +f:drivers/gpu/drm/exynos/regs-vp.h +f:drivers/gpu/drm/fsl-dcu/Kconfig +f:drivers/gpu/drm/fsl-dcu/Makefile +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.h +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_kms.c +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_output.h +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.h +f:drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c +f:drivers/gpu/drm/fsl-dcu/fsl_tcon.c +f:drivers/gpu/drm/fsl-dcu/fsl_tcon.h +f:drivers/gpu/drm/gma500/Kconfig +f:drivers/gpu/drm/gma500/Makefile +f:drivers/gpu/drm/gma500/backlight.c +f:drivers/gpu/drm/gma500/cdv_device.c +f:drivers/gpu/drm/gma500/cdv_device.h +f:drivers/gpu/drm/gma500/cdv_intel_crt.c +f:drivers/gpu/drm/gma500/cdv_intel_display.c +f:drivers/gpu/drm/gma500/cdv_intel_dp.c +f:drivers/gpu/drm/gma500/cdv_intel_hdmi.c +f:drivers/gpu/drm/gma500/cdv_intel_lvds.c +f:drivers/gpu/drm/gma500/fbdev.c +f:drivers/gpu/drm/gma500/framebuffer.c +f:drivers/gpu/drm/gma500/framebuffer.h +f:drivers/gpu/drm/gma500/gem.c +f:drivers/gpu/drm/gma500/gem.h +f:drivers/gpu/drm/gma500/gma_device.c +f:drivers/gpu/drm/gma500/gma_device.h +f:drivers/gpu/drm/gma500/gma_display.c +f:drivers/gpu/drm/gma500/gma_display.h +f:drivers/gpu/drm/gma500/gtt.c +f:drivers/gpu/drm/gma500/gtt.h +f:drivers/gpu/drm/gma500/intel_bios.c +f:drivers/gpu/drm/gma500/intel_bios.h +f:drivers/gpu/drm/gma500/intel_gmbus.c +f:drivers/gpu/drm/gma500/intel_i2c.c +f:drivers/gpu/drm/gma500/mid_bios.c +f:drivers/gpu/drm/gma500/mid_bios.h +f:drivers/gpu/drm/gma500/mmu.c +f:drivers/gpu/drm/gma500/mmu.h +f:drivers/gpu/drm/gma500/oaktrail.h +f:drivers/gpu/drm/gma500/oaktrail_crtc.c +f:drivers/gpu/drm/gma500/oaktrail_device.c +f:drivers/gpu/drm/gma500/oaktrail_hdmi.c +f:drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c +f:drivers/gpu/drm/gma500/oaktrail_lvds.c +f:drivers/gpu/drm/gma500/oaktrail_lvds_i2c.c +f:drivers/gpu/drm/gma500/opregion.c +f:drivers/gpu/drm/gma500/opregion.h +f:drivers/gpu/drm/gma500/power.c +f:drivers/gpu/drm/gma500/power.h +f:drivers/gpu/drm/gma500/psb_device.c +f:drivers/gpu/drm/gma500/psb_device.h +f:drivers/gpu/drm/gma500/psb_drv.c +f:drivers/gpu/drm/gma500/psb_drv.h +f:drivers/gpu/drm/gma500/psb_intel_display.c +f:drivers/gpu/drm/gma500/psb_intel_drv.h +f:drivers/gpu/drm/gma500/psb_intel_lvds.c +f:drivers/gpu/drm/gma500/psb_intel_modes.c +f:drivers/gpu/drm/gma500/psb_intel_reg.h +f:drivers/gpu/drm/gma500/psb_intel_sdvo.c +f:drivers/gpu/drm/gma500/psb_intel_sdvo_regs.h +f:drivers/gpu/drm/gma500/psb_irq.c +f:drivers/gpu/drm/gma500/psb_irq.h +f:drivers/gpu/drm/gma500/psb_reg.h +f:drivers/gpu/drm/gud/Kconfig +f:drivers/gpu/drm/gud/Makefile +f:drivers/gpu/drm/gud/gud_connector.c +f:drivers/gpu/drm/gud/gud_drv.c +f:drivers/gpu/drm/gud/gud_internal.h +f:drivers/gpu/drm/gud/gud_pipe.c +f:drivers/gpu/drm/hisilicon/Kconfig +f:drivers/gpu/drm/hisilicon/Makefile +f:drivers/gpu/drm/hisilicon/hibmc/Kconfig +f:drivers/gpu/drm/hisilicon/hibmc/Makefile +f:drivers/gpu/drm/hisilicon/hibmc/dp/dp_aux.c +f:drivers/gpu/drm/hisilicon/hibmc/dp/dp_comm.h +f:drivers/gpu/drm/hisilicon/hibmc/dp/dp_config.h +f:drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.c +f:drivers/gpu/drm/hisilicon/hibmc/dp/dp_hw.h +f:drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c +f:drivers/gpu/drm/hisilicon/hibmc/dp/dp_reg.h +f:drivers/gpu/drm/hisilicon/hibmc/dp/dp_serdes.c +f:drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c +f:drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_debugfs.c +f:drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c +f:drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c +f:drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h +f:drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_i2c.c +f:drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h +f:drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c +f:drivers/gpu/drm/hisilicon/kirin/Kconfig +f:drivers/gpu/drm/hisilicon/kirin/Makefile +f:drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c +f:drivers/gpu/drm/hisilicon/kirin/dw_dsi_reg.h +f:drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h +f:drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c +f:drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c +f:drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h +f:drivers/gpu/drm/hyperv/Makefile +f:drivers/gpu/drm/hyperv/hyperv_drm.h +f:drivers/gpu/drm/hyperv/hyperv_drm_drv.c +f:drivers/gpu/drm/hyperv/hyperv_drm_modeset.c +f:drivers/gpu/drm/hyperv/hyperv_drm_proto.c +f:drivers/gpu/drm/i915/.gitignore +f:drivers/gpu/drm/i915/Kconfig +f:drivers/gpu/drm/i915/Kconfig.debug +f:drivers/gpu/drm/i915/Kconfig.profile +f:drivers/gpu/drm/i915/Makefile +f:drivers/gpu/drm/i915/TODO.txt +f:drivers/gpu/drm/i915/display/bxt_dpio_phy_regs.h +f:drivers/gpu/drm/i915/display/dvo_ch7017.c +f:drivers/gpu/drm/i915/display/dvo_ch7xxx.c +f:drivers/gpu/drm/i915/display/dvo_ivch.c +f:drivers/gpu/drm/i915/display/dvo_ns2501.c +f:drivers/gpu/drm/i915/display/dvo_sil164.c +f:drivers/gpu/drm/i915/display/dvo_tfp410.c +f:drivers/gpu/drm/i915/display/g4x_dp.c +f:drivers/gpu/drm/i915/display/g4x_dp.h +f:drivers/gpu/drm/i915/display/g4x_hdmi.c +f:drivers/gpu/drm/i915/display/g4x_hdmi.h +f:drivers/gpu/drm/i915/display/hsw_ips.c +f:drivers/gpu/drm/i915/display/hsw_ips.h +f:drivers/gpu/drm/i915/display/i9xx_display_sr.c +f:drivers/gpu/drm/i915/display/i9xx_display_sr.h +f:drivers/gpu/drm/i915/display/i9xx_plane.c +f:drivers/gpu/drm/i915/display/i9xx_plane.h +f:drivers/gpu/drm/i915/display/i9xx_plane_regs.h +f:drivers/gpu/drm/i915/display/i9xx_wm.c +f:drivers/gpu/drm/i915/display/i9xx_wm.h +f:drivers/gpu/drm/i915/display/i9xx_wm_regs.h +f:drivers/gpu/drm/i915/display/icl_dsi.c +f:drivers/gpu/drm/i915/display/icl_dsi.h +f:drivers/gpu/drm/i915/display/icl_dsi_regs.h +f:drivers/gpu/drm/i915/display/intel_acpi.c +f:drivers/gpu/drm/i915/display/intel_acpi.h +f:drivers/gpu/drm/i915/display/intel_alpm.c +f:drivers/gpu/drm/i915/display/intel_alpm.h +f:drivers/gpu/drm/i915/display/intel_atomic.c +f:drivers/gpu/drm/i915/display/intel_atomic.h +f:drivers/gpu/drm/i915/display/intel_audio.c +f:drivers/gpu/drm/i915/display/intel_audio.h +f:drivers/gpu/drm/i915/display/intel_audio_regs.h +f:drivers/gpu/drm/i915/display/intel_backlight.c +f:drivers/gpu/drm/i915/display/intel_backlight.h +f:drivers/gpu/drm/i915/display/intel_backlight_regs.h +f:drivers/gpu/drm/i915/display/intel_bios.c +f:drivers/gpu/drm/i915/display/intel_bios.h +f:drivers/gpu/drm/i915/display/intel_bo.c +f:drivers/gpu/drm/i915/display/intel_bo.h +f:drivers/gpu/drm/i915/display/intel_bw.c +f:drivers/gpu/drm/i915/display/intel_bw.h +f:drivers/gpu/drm/i915/display/intel_cdclk.c +f:drivers/gpu/drm/i915/display/intel_cdclk.h +f:drivers/gpu/drm/i915/display/intel_cmtg.c +f:drivers/gpu/drm/i915/display/intel_cmtg.h +f:drivers/gpu/drm/i915/display/intel_cmtg_regs.h +f:drivers/gpu/drm/i915/display/intel_color.c +f:drivers/gpu/drm/i915/display/intel_color.h +f:drivers/gpu/drm/i915/display/intel_color_regs.h +f:drivers/gpu/drm/i915/display/intel_combo_phy.c +f:drivers/gpu/drm/i915/display/intel_combo_phy.h +f:drivers/gpu/drm/i915/display/intel_combo_phy_regs.h +f:drivers/gpu/drm/i915/display/intel_connector.c +f:drivers/gpu/drm/i915/display/intel_connector.h +f:drivers/gpu/drm/i915/display/intel_crt.c +f:drivers/gpu/drm/i915/display/intel_crt.h +f:drivers/gpu/drm/i915/display/intel_crt_regs.h +f:drivers/gpu/drm/i915/display/intel_crtc.c +f:drivers/gpu/drm/i915/display/intel_crtc.h +f:drivers/gpu/drm/i915/display/intel_crtc_state_dump.c +f:drivers/gpu/drm/i915/display/intel_crtc_state_dump.h +f:drivers/gpu/drm/i915/display/intel_cursor.c +f:drivers/gpu/drm/i915/display/intel_cursor.h +f:drivers/gpu/drm/i915/display/intel_cursor_regs.h +f:drivers/gpu/drm/i915/display/intel_cx0_phy.c +f:drivers/gpu/drm/i915/display/intel_cx0_phy.h +f:drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h +f:drivers/gpu/drm/i915/display/intel_ddi.c +f:drivers/gpu/drm/i915/display/intel_ddi.h +f:drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c +f:drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h +f:drivers/gpu/drm/i915/display/intel_de.h +f:drivers/gpu/drm/i915/display/intel_display.c +f:drivers/gpu/drm/i915/display/intel_display.h +f:drivers/gpu/drm/i915/display/intel_display_conversion.c +f:drivers/gpu/drm/i915/display/intel_display_conversion.h +f:drivers/gpu/drm/i915/display/intel_display_core.h +f:drivers/gpu/drm/i915/display/intel_display_debugfs.c +f:drivers/gpu/drm/i915/display/intel_display_debugfs.h +f:drivers/gpu/drm/i915/display/intel_display_debugfs_params.c +f:drivers/gpu/drm/i915/display/intel_display_debugfs_params.h +f:drivers/gpu/drm/i915/display/intel_display_device.c +f:drivers/gpu/drm/i915/display/intel_display_device.h +f:drivers/gpu/drm/i915/display/intel_display_driver.c +f:drivers/gpu/drm/i915/display/intel_display_driver.h +f:drivers/gpu/drm/i915/display/intel_display_irq.c +f:drivers/gpu/drm/i915/display/intel_display_irq.h +f:drivers/gpu/drm/i915/display/intel_display_limits.h +f:drivers/gpu/drm/i915/display/intel_display_params.c +f:drivers/gpu/drm/i915/display/intel_display_params.h +f:drivers/gpu/drm/i915/display/intel_display_power.c +f:drivers/gpu/drm/i915/display/intel_display_power.h +f:drivers/gpu/drm/i915/display/intel_display_power_map.c +f:drivers/gpu/drm/i915/display/intel_display_power_map.h +f:drivers/gpu/drm/i915/display/intel_display_power_well.c +f:drivers/gpu/drm/i915/display/intel_display_power_well.h +f:drivers/gpu/drm/i915/display/intel_display_reg_defs.h +f:drivers/gpu/drm/i915/display/intel_display_regs.h +f:drivers/gpu/drm/i915/display/intel_display_reset.c +f:drivers/gpu/drm/i915/display/intel_display_reset.h +f:drivers/gpu/drm/i915/display/intel_display_rpm.c +f:drivers/gpu/drm/i915/display/intel_display_rpm.h +f:drivers/gpu/drm/i915/display/intel_display_rps.c +f:drivers/gpu/drm/i915/display/intel_display_rps.h +f:drivers/gpu/drm/i915/display/intel_display_snapshot.c +f:drivers/gpu/drm/i915/display/intel_display_snapshot.h +f:drivers/gpu/drm/i915/display/intel_display_trace.c +f:drivers/gpu/drm/i915/display/intel_display_trace.h +f:drivers/gpu/drm/i915/display/intel_display_types.h +f:drivers/gpu/drm/i915/display/intel_display_wa.c +f:drivers/gpu/drm/i915/display/intel_display_wa.h +f:drivers/gpu/drm/i915/display/intel_dkl_phy.c +f:drivers/gpu/drm/i915/display/intel_dkl_phy.h +f:drivers/gpu/drm/i915/display/intel_dkl_phy_regs.h +f:drivers/gpu/drm/i915/display/intel_dmc.c +f:drivers/gpu/drm/i915/display/intel_dmc.h +f:drivers/gpu/drm/i915/display/intel_dmc_regs.h +f:drivers/gpu/drm/i915/display/intel_dmc_wl.c +f:drivers/gpu/drm/i915/display/intel_dmc_wl.h +f:drivers/gpu/drm/i915/display/intel_dp.c +f:drivers/gpu/drm/i915/display/intel_dp.h +f:drivers/gpu/drm/i915/display/intel_dp_aux.c +f:drivers/gpu/drm/i915/display/intel_dp_aux.h +f:drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c +f:drivers/gpu/drm/i915/display/intel_dp_aux_backlight.h +f:drivers/gpu/drm/i915/display/intel_dp_aux_regs.h +f:drivers/gpu/drm/i915/display/intel_dp_hdcp.c +f:drivers/gpu/drm/i915/display/intel_dp_hdcp.h +f:drivers/gpu/drm/i915/display/intel_dp_link_training.c +f:drivers/gpu/drm/i915/display/intel_dp_link_training.h +f:drivers/gpu/drm/i915/display/intel_dp_mst.c +f:drivers/gpu/drm/i915/display/intel_dp_mst.h +f:drivers/gpu/drm/i915/display/intel_dp_test.c +f:drivers/gpu/drm/i915/display/intel_dp_test.h +f:drivers/gpu/drm/i915/display/intel_dp_tunnel.c +f:drivers/gpu/drm/i915/display/intel_dp_tunnel.h +f:drivers/gpu/drm/i915/display/intel_dpio_phy.c +f:drivers/gpu/drm/i915/display/intel_dpio_phy.h +f:drivers/gpu/drm/i915/display/intel_dpll.c +f:drivers/gpu/drm/i915/display/intel_dpll.h +f:drivers/gpu/drm/i915/display/intel_dpll_mgr.c +f:drivers/gpu/drm/i915/display/intel_dpll_mgr.h +f:drivers/gpu/drm/i915/display/intel_dpt.c +f:drivers/gpu/drm/i915/display/intel_dpt.h +f:drivers/gpu/drm/i915/display/intel_dpt_common.c +f:drivers/gpu/drm/i915/display/intel_dpt_common.h +f:drivers/gpu/drm/i915/display/intel_drrs.c +f:drivers/gpu/drm/i915/display/intel_drrs.h +f:drivers/gpu/drm/i915/display/intel_dsb.c +f:drivers/gpu/drm/i915/display/intel_dsb.h +f:drivers/gpu/drm/i915/display/intel_dsb_buffer.c +f:drivers/gpu/drm/i915/display/intel_dsb_buffer.h +f:drivers/gpu/drm/i915/display/intel_dsb_regs.h +f:drivers/gpu/drm/i915/display/intel_dsi.c +f:drivers/gpu/drm/i915/display/intel_dsi.h +f:drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c +f:drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.h +f:drivers/gpu/drm/i915/display/intel_dsi_vbt.c +f:drivers/gpu/drm/i915/display/intel_dsi_vbt.h +f:drivers/gpu/drm/i915/display/intel_dvo.c +f:drivers/gpu/drm/i915/display/intel_dvo.h +f:drivers/gpu/drm/i915/display/intel_dvo_dev.h +f:drivers/gpu/drm/i915/display/intel_dvo_regs.h +f:drivers/gpu/drm/i915/display/intel_encoder.c +f:drivers/gpu/drm/i915/display/intel_encoder.h +f:drivers/gpu/drm/i915/display/intel_fb.c +f:drivers/gpu/drm/i915/display/intel_fb.h +f:drivers/gpu/drm/i915/display/intel_fb_bo.c +f:drivers/gpu/drm/i915/display/intel_fb_bo.h +f:drivers/gpu/drm/i915/display/intel_fb_pin.c +f:drivers/gpu/drm/i915/display/intel_fb_pin.h +f:drivers/gpu/drm/i915/display/intel_fbc.c +f:drivers/gpu/drm/i915/display/intel_fbc.h +f:drivers/gpu/drm/i915/display/intel_fbc_regs.h +f:drivers/gpu/drm/i915/display/intel_fbdev.c +f:drivers/gpu/drm/i915/display/intel_fbdev.h +f:drivers/gpu/drm/i915/display/intel_fbdev_fb.c +f:drivers/gpu/drm/i915/display/intel_fbdev_fb.h +f:drivers/gpu/drm/i915/display/intel_fdi.c +f:drivers/gpu/drm/i915/display/intel_fdi.h +f:drivers/gpu/drm/i915/display/intel_fdi_regs.h +f:drivers/gpu/drm/i915/display/intel_fifo_underrun.c +f:drivers/gpu/drm/i915/display/intel_fifo_underrun.h +f:drivers/gpu/drm/i915/display/intel_fixed.h +f:drivers/gpu/drm/i915/display/intel_flipq.c +f:drivers/gpu/drm/i915/display/intel_flipq.h +f:drivers/gpu/drm/i915/display/intel_frontbuffer.c +f:drivers/gpu/drm/i915/display/intel_frontbuffer.h +f:drivers/gpu/drm/i915/display/intel_global_state.c +f:drivers/gpu/drm/i915/display/intel_global_state.h +f:drivers/gpu/drm/i915/display/intel_gmbus.c +f:drivers/gpu/drm/i915/display/intel_gmbus.h +f:drivers/gpu/drm/i915/display/intel_gmbus_regs.h +f:drivers/gpu/drm/i915/display/intel_hdcp.c +f:drivers/gpu/drm/i915/display/intel_hdcp.h +f:drivers/gpu/drm/i915/display/intel_hdcp_gsc.c +f:drivers/gpu/drm/i915/display/intel_hdcp_gsc.h +f:drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c +f:drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.h +f:drivers/gpu/drm/i915/display/intel_hdcp_regs.h +f:drivers/gpu/drm/i915/display/intel_hdcp_shim.h +f:drivers/gpu/drm/i915/display/intel_hdmi.c +f:drivers/gpu/drm/i915/display/intel_hdmi.h +f:drivers/gpu/drm/i915/display/intel_hotplug.c +f:drivers/gpu/drm/i915/display/intel_hotplug.h +f:drivers/gpu/drm/i915/display/intel_hotplug_irq.c +f:drivers/gpu/drm/i915/display/intel_hotplug_irq.h +f:drivers/gpu/drm/i915/display/intel_hti.c +f:drivers/gpu/drm/i915/display/intel_hti.h +f:drivers/gpu/drm/i915/display/intel_hti_regs.h +f:drivers/gpu/drm/i915/display/intel_link_bw.c +f:drivers/gpu/drm/i915/display/intel_link_bw.h +f:drivers/gpu/drm/i915/display/intel_load_detect.c +f:drivers/gpu/drm/i915/display/intel_load_detect.h +f:drivers/gpu/drm/i915/display/intel_lpe_audio.c +f:drivers/gpu/drm/i915/display/intel_lpe_audio.h +f:drivers/gpu/drm/i915/display/intel_lspcon.c +f:drivers/gpu/drm/i915/display/intel_lspcon.h +f:drivers/gpu/drm/i915/display/intel_lvds.c +f:drivers/gpu/drm/i915/display/intel_lvds.h +f:drivers/gpu/drm/i915/display/intel_lvds_regs.h +f:drivers/gpu/drm/i915/display/intel_mg_phy_regs.h +f:drivers/gpu/drm/i915/display/intel_modeset_lock.c +f:drivers/gpu/drm/i915/display/intel_modeset_lock.h +f:drivers/gpu/drm/i915/display/intel_modeset_setup.c +f:drivers/gpu/drm/i915/display/intel_modeset_setup.h +f:drivers/gpu/drm/i915/display/intel_modeset_verify.c +f:drivers/gpu/drm/i915/display/intel_modeset_verify.h +f:drivers/gpu/drm/i915/display/intel_opregion.c +f:drivers/gpu/drm/i915/display/intel_opregion.h +f:drivers/gpu/drm/i915/display/intel_overlay.c +f:drivers/gpu/drm/i915/display/intel_overlay.h +f:drivers/gpu/drm/i915/display/intel_panel.c +f:drivers/gpu/drm/i915/display/intel_panel.h +f:drivers/gpu/drm/i915/display/intel_pch.c +f:drivers/gpu/drm/i915/display/intel_pch.h +f:drivers/gpu/drm/i915/display/intel_pch_display.c +f:drivers/gpu/drm/i915/display/intel_pch_display.h +f:drivers/gpu/drm/i915/display/intel_pch_refclk.c +f:drivers/gpu/drm/i915/display/intel_pch_refclk.h +f:drivers/gpu/drm/i915/display/intel_pfit.c +f:drivers/gpu/drm/i915/display/intel_pfit.h +f:drivers/gpu/drm/i915/display/intel_pfit_regs.h +f:drivers/gpu/drm/i915/display/intel_pipe_crc.c +f:drivers/gpu/drm/i915/display/intel_pipe_crc.h +f:drivers/gpu/drm/i915/display/intel_pipe_crc_regs.h +f:drivers/gpu/drm/i915/display/intel_plane.c +f:drivers/gpu/drm/i915/display/intel_plane.h +f:drivers/gpu/drm/i915/display/intel_plane_initial.c +f:drivers/gpu/drm/i915/display/intel_plane_initial.h +f:drivers/gpu/drm/i915/display/intel_pmdemand.c +f:drivers/gpu/drm/i915/display/intel_pmdemand.h +f:drivers/gpu/drm/i915/display/intel_pps.c +f:drivers/gpu/drm/i915/display/intel_pps.h +f:drivers/gpu/drm/i915/display/intel_pps_regs.h +f:drivers/gpu/drm/i915/display/intel_psr.c +f:drivers/gpu/drm/i915/display/intel_psr.h +f:drivers/gpu/drm/i915/display/intel_psr_regs.h +f:drivers/gpu/drm/i915/display/intel_qp_tables.c +f:drivers/gpu/drm/i915/display/intel_qp_tables.h +f:drivers/gpu/drm/i915/display/intel_quirks.c +f:drivers/gpu/drm/i915/display/intel_quirks.h +f:drivers/gpu/drm/i915/display/intel_sbi.c +f:drivers/gpu/drm/i915/display/intel_sbi.h +f:drivers/gpu/drm/i915/display/intel_sbi_regs.h +f:drivers/gpu/drm/i915/display/intel_sdvo.c +f:drivers/gpu/drm/i915/display/intel_sdvo.h +f:drivers/gpu/drm/i915/display/intel_sdvo_regs.h +f:drivers/gpu/drm/i915/display/intel_snps_hdmi_pll.c +f:drivers/gpu/drm/i915/display/intel_snps_hdmi_pll.h +f:drivers/gpu/drm/i915/display/intel_snps_phy.c +f:drivers/gpu/drm/i915/display/intel_snps_phy.h +f:drivers/gpu/drm/i915/display/intel_snps_phy_regs.h +f:drivers/gpu/drm/i915/display/intel_sprite.c +f:drivers/gpu/drm/i915/display/intel_sprite.h +f:drivers/gpu/drm/i915/display/intel_sprite_regs.h +f:drivers/gpu/drm/i915/display/intel_sprite_uapi.c +f:drivers/gpu/drm/i915/display/intel_sprite_uapi.h +f:drivers/gpu/drm/i915/display/intel_tc.c +f:drivers/gpu/drm/i915/display/intel_tc.h +f:drivers/gpu/drm/i915/display/intel_tdf.h +f:drivers/gpu/drm/i915/display/intel_tv.c +f:drivers/gpu/drm/i915/display/intel_tv.h +f:drivers/gpu/drm/i915/display/intel_tv_regs.h +f:drivers/gpu/drm/i915/display/intel_vblank.c +f:drivers/gpu/drm/i915/display/intel_vblank.h +f:drivers/gpu/drm/i915/display/intel_vbt_defs.h +f:drivers/gpu/drm/i915/display/intel_vdsc.c +f:drivers/gpu/drm/i915/display/intel_vdsc.h +f:drivers/gpu/drm/i915/display/intel_vdsc_regs.h +f:drivers/gpu/drm/i915/display/intel_vga.c +f:drivers/gpu/drm/i915/display/intel_vga.h +f:drivers/gpu/drm/i915/display/intel_vga_regs.h +f:drivers/gpu/drm/i915/display/intel_vrr.c +f:drivers/gpu/drm/i915/display/intel_vrr.h +f:drivers/gpu/drm/i915/display/intel_vrr_regs.h +f:drivers/gpu/drm/i915/display/intel_wm.c +f:drivers/gpu/drm/i915/display/intel_wm.h +f:drivers/gpu/drm/i915/display/intel_wm_types.h +f:drivers/gpu/drm/i915/display/skl_scaler.c +f:drivers/gpu/drm/i915/display/skl_scaler.h +f:drivers/gpu/drm/i915/display/skl_universal_plane.c +f:drivers/gpu/drm/i915/display/skl_universal_plane.h +f:drivers/gpu/drm/i915/display/skl_universal_plane_regs.h +f:drivers/gpu/drm/i915/display/skl_watermark.c +f:drivers/gpu/drm/i915/display/skl_watermark.h +f:drivers/gpu/drm/i915/display/skl_watermark_regs.h +f:drivers/gpu/drm/i915/display/vlv_dpio_phy_regs.h +f:drivers/gpu/drm/i915/display/vlv_dsi.c +f:drivers/gpu/drm/i915/display/vlv_dsi.h +f:drivers/gpu/drm/i915/display/vlv_dsi_pll.c +f:drivers/gpu/drm/i915/display/vlv_dsi_pll.h +f:drivers/gpu/drm/i915/display/vlv_dsi_pll_regs.h +f:drivers/gpu/drm/i915/display/vlv_dsi_regs.h +f:drivers/gpu/drm/i915/display/vlv_sideband.c +f:drivers/gpu/drm/i915/display/vlv_sideband.h +f:drivers/gpu/drm/i915/gem/i915_gem_busy.c +f:drivers/gpu/drm/i915/gem/i915_gem_clflush.c +f:drivers/gpu/drm/i915/gem/i915_gem_clflush.h +f:drivers/gpu/drm/i915/gem/i915_gem_context.c +f:drivers/gpu/drm/i915/gem/i915_gem_context.h +f:drivers/gpu/drm/i915/gem/i915_gem_context_types.h +f:drivers/gpu/drm/i915/gem/i915_gem_create.c +f:drivers/gpu/drm/i915/gem/i915_gem_create.h +f:drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c +f:drivers/gpu/drm/i915/gem/i915_gem_dmabuf.h +f:drivers/gpu/drm/i915/gem/i915_gem_domain.c +f:drivers/gpu/drm/i915/gem/i915_gem_domain.h +f:drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +f:drivers/gpu/drm/i915/gem/i915_gem_internal.c +f:drivers/gpu/drm/i915/gem/i915_gem_internal.h +f:drivers/gpu/drm/i915/gem/i915_gem_ioctls.h +f:drivers/gpu/drm/i915/gem/i915_gem_lmem.c +f:drivers/gpu/drm/i915/gem/i915_gem_lmem.h +f:drivers/gpu/drm/i915/gem/i915_gem_mman.c +f:drivers/gpu/drm/i915/gem/i915_gem_mman.h +f:drivers/gpu/drm/i915/gem/i915_gem_object.c +f:drivers/gpu/drm/i915/gem/i915_gem_object.h +f:drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h +f:drivers/gpu/drm/i915/gem/i915_gem_object_types.h +f:drivers/gpu/drm/i915/gem/i915_gem_pages.c +f:drivers/gpu/drm/i915/gem/i915_gem_phys.c +f:drivers/gpu/drm/i915/gem/i915_gem_pm.c +f:drivers/gpu/drm/i915/gem/i915_gem_pm.h +f:drivers/gpu/drm/i915/gem/i915_gem_region.c +f:drivers/gpu/drm/i915/gem/i915_gem_region.h +f:drivers/gpu/drm/i915/gem/i915_gem_shmem.c +f:drivers/gpu/drm/i915/gem/i915_gem_shrinker.c +f:drivers/gpu/drm/i915/gem/i915_gem_shrinker.h +f:drivers/gpu/drm/i915/gem/i915_gem_stolen.c +f:drivers/gpu/drm/i915/gem/i915_gem_stolen.h +f:drivers/gpu/drm/i915/gem/i915_gem_throttle.c +f:drivers/gpu/drm/i915/gem/i915_gem_tiling.c +f:drivers/gpu/drm/i915/gem/i915_gem_tiling.h +f:drivers/gpu/drm/i915/gem/i915_gem_ttm.c +f:drivers/gpu/drm/i915/gem/i915_gem_ttm.h +f:drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c +f:drivers/gpu/drm/i915/gem/i915_gem_ttm_move.h +f:drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c +f:drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.h +f:drivers/gpu/drm/i915/gem/i915_gem_userptr.c +f:drivers/gpu/drm/i915/gem/i915_gem_wait.c +f:drivers/gpu/drm/i915/gem/i915_gemfs.c +f:drivers/gpu/drm/i915/gem/i915_gemfs.h +f:drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c +f:drivers/gpu/drm/i915/gem/selftests/huge_gem_object.h +f:drivers/gpu/drm/i915/gem/selftests/huge_pages.c +f:drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c +f:drivers/gpu/drm/i915/gem/selftests/i915_gem_coherency.c +f:drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c +f:drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c +f:drivers/gpu/drm/i915/gem/selftests/i915_gem_migrate.c +f:drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c +f:drivers/gpu/drm/i915/gem/selftests/i915_gem_object.c +f:drivers/gpu/drm/i915/gem/selftests/i915_gem_phys.c +f:drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c +f:drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.h +f:drivers/gpu/drm/i915/gem/selftests/mock_context.c +f:drivers/gpu/drm/i915/gem/selftests/mock_context.h +f:drivers/gpu/drm/i915/gem/selftests/mock_dmabuf.c +f:drivers/gpu/drm/i915/gem/selftests/mock_dmabuf.h +f:drivers/gpu/drm/i915/gem/selftests/mock_gem_object.h +f:drivers/gpu/drm/i915/gt/gen2_engine_cs.c +f:drivers/gpu/drm/i915/gt/gen2_engine_cs.h +f:drivers/gpu/drm/i915/gt/gen6_engine_cs.c +f:drivers/gpu/drm/i915/gt/gen6_engine_cs.h +f:drivers/gpu/drm/i915/gt/gen6_ppgtt.c +f:drivers/gpu/drm/i915/gt/gen6_ppgtt.h +f:drivers/gpu/drm/i915/gt/gen6_renderstate.c +f:drivers/gpu/drm/i915/gt/gen7_renderclear.c +f:drivers/gpu/drm/i915/gt/gen7_renderclear.h +f:drivers/gpu/drm/i915/gt/gen7_renderstate.c +f:drivers/gpu/drm/i915/gt/gen8_engine_cs.c +f:drivers/gpu/drm/i915/gt/gen8_engine_cs.h +f:drivers/gpu/drm/i915/gt/gen8_ppgtt.c +f:drivers/gpu/drm/i915/gt/gen8_ppgtt.h +f:drivers/gpu/drm/i915/gt/gen8_renderstate.c +f:drivers/gpu/drm/i915/gt/gen9_renderstate.c +f:drivers/gpu/drm/i915/gt/hsw_clear_kernel.c +f:drivers/gpu/drm/i915/gt/intel_breadcrumbs.c +f:drivers/gpu/drm/i915/gt/intel_breadcrumbs.h +f:drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h +f:drivers/gpu/drm/i915/gt/intel_context.c +f:drivers/gpu/drm/i915/gt/intel_context.h +f:drivers/gpu/drm/i915/gt/intel_context_param.h +f:drivers/gpu/drm/i915/gt/intel_context_sseu.c +f:drivers/gpu/drm/i915/gt/intel_context_types.h +f:drivers/gpu/drm/i915/gt/intel_engine.h +f:drivers/gpu/drm/i915/gt/intel_engine_cs.c +f:drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c +f:drivers/gpu/drm/i915/gt/intel_engine_heartbeat.h +f:drivers/gpu/drm/i915/gt/intel_engine_pm.c +f:drivers/gpu/drm/i915/gt/intel_engine_pm.h +f:drivers/gpu/drm/i915/gt/intel_engine_regs.h +f:drivers/gpu/drm/i915/gt/intel_engine_stats.h +f:drivers/gpu/drm/i915/gt/intel_engine_types.h +f:drivers/gpu/drm/i915/gt/intel_engine_user.c +f:drivers/gpu/drm/i915/gt/intel_engine_user.h +f:drivers/gpu/drm/i915/gt/intel_execlists_submission.c +f:drivers/gpu/drm/i915/gt/intel_execlists_submission.h +f:drivers/gpu/drm/i915/gt/intel_ggtt.c +f:drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c +f:drivers/gpu/drm/i915/gt/intel_ggtt_fencing.h +f:drivers/gpu/drm/i915/gt/intel_ggtt_gmch.c +f:drivers/gpu/drm/i915/gt/intel_ggtt_gmch.h +f:drivers/gpu/drm/i915/gt/intel_gpu_commands.h +f:drivers/gpu/drm/i915/gt/intel_gsc.c +f:drivers/gpu/drm/i915/gt/intel_gsc.h +f:drivers/gpu/drm/i915/gt/intel_gt.c +f:drivers/gpu/drm/i915/gt/intel_gt.h +f:drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.c +f:drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.h +f:drivers/gpu/drm/i915/gt/intel_gt_buffer_pool_types.h +f:drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c +f:drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.h +f:drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c +f:drivers/gpu/drm/i915/gt/intel_gt_clock_utils.h +f:drivers/gpu/drm/i915/gt/intel_gt_debugfs.c +f:drivers/gpu/drm/i915/gt/intel_gt_debugfs.h +f:drivers/gpu/drm/i915/gt/intel_gt_defines.h +f:drivers/gpu/drm/i915/gt/intel_gt_engines_debugfs.c +f:drivers/gpu/drm/i915/gt/intel_gt_engines_debugfs.h +f:drivers/gpu/drm/i915/gt/intel_gt_irq.c +f:drivers/gpu/drm/i915/gt/intel_gt_irq.h +f:drivers/gpu/drm/i915/gt/intel_gt_mcr.c +f:drivers/gpu/drm/i915/gt/intel_gt_mcr.h +f:drivers/gpu/drm/i915/gt/intel_gt_pm.c +f:drivers/gpu/drm/i915/gt/intel_gt_pm.h +f:drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c +f:drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.h +f:drivers/gpu/drm/i915/gt/intel_gt_pm_irq.c +f:drivers/gpu/drm/i915/gt/intel_gt_pm_irq.h +f:drivers/gpu/drm/i915/gt/intel_gt_print.h +f:drivers/gpu/drm/i915/gt/intel_gt_regs.h +f:drivers/gpu/drm/i915/gt/intel_gt_requests.c +f:drivers/gpu/drm/i915/gt/intel_gt_requests.h +f:drivers/gpu/drm/i915/gt/intel_gt_sysfs.c +f:drivers/gpu/drm/i915/gt/intel_gt_sysfs.h +f:drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.c +f:drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.h +f:drivers/gpu/drm/i915/gt/intel_gt_types.h +f:drivers/gpu/drm/i915/gt/intel_gtt.c +f:drivers/gpu/drm/i915/gt/intel_gtt.h +f:drivers/gpu/drm/i915/gt/intel_hwconfig.h +f:drivers/gpu/drm/i915/gt/intel_llc.c +f:drivers/gpu/drm/i915/gt/intel_llc.h +f:drivers/gpu/drm/i915/gt/intel_llc_types.h +f:drivers/gpu/drm/i915/gt/intel_lrc.c +f:drivers/gpu/drm/i915/gt/intel_lrc.h +f:drivers/gpu/drm/i915/gt/intel_lrc_reg.h +f:drivers/gpu/drm/i915/gt/intel_migrate.c +f:drivers/gpu/drm/i915/gt/intel_migrate.h +f:drivers/gpu/drm/i915/gt/intel_migrate_types.h +f:drivers/gpu/drm/i915/gt/intel_mocs.c +f:drivers/gpu/drm/i915/gt/intel_mocs.h +f:drivers/gpu/drm/i915/gt/intel_ppgtt.c +f:drivers/gpu/drm/i915/gt/intel_rc6.c +f:drivers/gpu/drm/i915/gt/intel_rc6.h +f:drivers/gpu/drm/i915/gt/intel_rc6_types.h +f:drivers/gpu/drm/i915/gt/intel_region_lmem.c +f:drivers/gpu/drm/i915/gt/intel_region_lmem.h +f:drivers/gpu/drm/i915/gt/intel_renderstate.c +f:drivers/gpu/drm/i915/gt/intel_renderstate.h +f:drivers/gpu/drm/i915/gt/intel_reset.c +f:drivers/gpu/drm/i915/gt/intel_reset.h +f:drivers/gpu/drm/i915/gt/intel_reset_types.h +f:drivers/gpu/drm/i915/gt/intel_ring.c +f:drivers/gpu/drm/i915/gt/intel_ring.h +f:drivers/gpu/drm/i915/gt/intel_ring_submission.c +f:drivers/gpu/drm/i915/gt/intel_ring_types.h +f:drivers/gpu/drm/i915/gt/intel_rps.c +f:drivers/gpu/drm/i915/gt/intel_rps.h +f:drivers/gpu/drm/i915/gt/intel_rps_types.h +f:drivers/gpu/drm/i915/gt/intel_sa_media.c +f:drivers/gpu/drm/i915/gt/intel_sa_media.h +f:drivers/gpu/drm/i915/gt/intel_sseu.c +f:drivers/gpu/drm/i915/gt/intel_sseu.h +f:drivers/gpu/drm/i915/gt/intel_sseu_debugfs.c +f:drivers/gpu/drm/i915/gt/intel_sseu_debugfs.h +f:drivers/gpu/drm/i915/gt/intel_timeline.c +f:drivers/gpu/drm/i915/gt/intel_timeline.h +f:drivers/gpu/drm/i915/gt/intel_timeline_types.h +f:drivers/gpu/drm/i915/gt/intel_tlb.c +f:drivers/gpu/drm/i915/gt/intel_tlb.h +f:drivers/gpu/drm/i915/gt/intel_wopcm.c +f:drivers/gpu/drm/i915/gt/intel_wopcm.h +f:drivers/gpu/drm/i915/gt/intel_workarounds.c +f:drivers/gpu/drm/i915/gt/intel_workarounds.h +f:drivers/gpu/drm/i915/gt/intel_workarounds_types.h +f:drivers/gpu/drm/i915/gt/ivb_clear_kernel.c +f:drivers/gpu/drm/i915/gt/mock_engine.c +f:drivers/gpu/drm/i915/gt/mock_engine.h +f:drivers/gpu/drm/i915/gt/selftest_context.c +f:drivers/gpu/drm/i915/gt/selftest_engine.c +f:drivers/gpu/drm/i915/gt/selftest_engine.h +f:drivers/gpu/drm/i915/gt/selftest_engine_cs.c +f:drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c +f:drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.h +f:drivers/gpu/drm/i915/gt/selftest_engine_pm.c +f:drivers/gpu/drm/i915/gt/selftest_execlists.c +f:drivers/gpu/drm/i915/gt/selftest_gt_pm.c +f:drivers/gpu/drm/i915/gt/selftest_hangcheck.c +f:drivers/gpu/drm/i915/gt/selftest_llc.c +f:drivers/gpu/drm/i915/gt/selftest_llc.h +f:drivers/gpu/drm/i915/gt/selftest_lrc.c +f:drivers/gpu/drm/i915/gt/selftest_migrate.c +f:drivers/gpu/drm/i915/gt/selftest_mocs.c +f:drivers/gpu/drm/i915/gt/selftest_rc6.c +f:drivers/gpu/drm/i915/gt/selftest_rc6.h +f:drivers/gpu/drm/i915/gt/selftest_reset.c +f:drivers/gpu/drm/i915/gt/selftest_ring.c +f:drivers/gpu/drm/i915/gt/selftest_ring_submission.c +f:drivers/gpu/drm/i915/gt/selftest_rps.c +f:drivers/gpu/drm/i915/gt/selftest_rps.h +f:drivers/gpu/drm/i915/gt/selftest_slpc.c +f:drivers/gpu/drm/i915/gt/selftest_timeline.c +f:drivers/gpu/drm/i915/gt/selftest_tlb.c +f:drivers/gpu/drm/i915/gt/selftest_workarounds.c +f:drivers/gpu/drm/i915/gt/selftests/mock_timeline.c +f:drivers/gpu/drm/i915/gt/selftests/mock_timeline.h +f:drivers/gpu/drm/i915/gt/shaders/README +f:drivers/gpu/drm/i915/gt/shaders/clear_kernel/hsw.asm +f:drivers/gpu/drm/i915/gt/shaders/clear_kernel/ivb.asm +f:drivers/gpu/drm/i915/gt/shmem_utils.c +f:drivers/gpu/drm/i915/gt/shmem_utils.h +f:drivers/gpu/drm/i915/gt/st_shmem_utils.c +f:drivers/gpu/drm/i915/gt/sysfs_engines.c +f:drivers/gpu/drm/i915/gt/sysfs_engines.h +f:drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h +f:drivers/gpu/drm/i915/gt/uc/abi/guc_actions_slpc_abi.h +f:drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h +f:drivers/gpu/drm/i915/gt/uc/abi/guc_communication_mmio_abi.h +f:drivers/gpu/drm/i915/gt/uc/abi/guc_errors_abi.h +f:drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h +f:drivers/gpu/drm/i915/gt/uc/abi/guc_messages_abi.h +f:drivers/gpu/drm/i915/gt/uc/guc_capture_fwif.h +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_binary_headers.h +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.c +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.c +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.h +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.h +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_debugfs.c +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_debugfs.h +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c +f:drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_ads.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_capture.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_ct.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_fw.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_hwconfig.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_log.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_log.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_print.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_rc.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_rc.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_reg.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_slpc_types.h +f:drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c +f:drivers/gpu/drm/i915/gt/uc/intel_guc_submission.h +f:drivers/gpu/drm/i915/gt/uc/intel_huc.c +f:drivers/gpu/drm/i915/gt/uc/intel_huc.h +f:drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.c +f:drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.h +f:drivers/gpu/drm/i915/gt/uc/intel_huc_fw.c +f:drivers/gpu/drm/i915/gt/uc/intel_huc_fw.h +f:drivers/gpu/drm/i915/gt/uc/intel_huc_print.h +f:drivers/gpu/drm/i915/gt/uc/intel_uc.c +f:drivers/gpu/drm/i915/gt/uc/intel_uc.h +f:drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.c +f:drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.h +f:drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c +f:drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h +f:drivers/gpu/drm/i915/gt/uc/intel_uc_fw_abi.h +f:drivers/gpu/drm/i915/gt/uc/selftest_guc.c +f:drivers/gpu/drm/i915/gt/uc/selftest_guc_hangcheck.c +f:drivers/gpu/drm/i915/gt/uc/selftest_guc_multi_lrc.c +f:drivers/gpu/drm/i915/gvt/Makefile +f:drivers/gpu/drm/i915/gvt/aperture_gm.c +f:drivers/gpu/drm/i915/gvt/cfg_space.c +f:drivers/gpu/drm/i915/gvt/cmd_parser.c +f:drivers/gpu/drm/i915/gvt/cmd_parser.h +f:drivers/gpu/drm/i915/gvt/debug.h +f:drivers/gpu/drm/i915/gvt/debugfs.c +f:drivers/gpu/drm/i915/gvt/display.c +f:drivers/gpu/drm/i915/gvt/display.h +f:drivers/gpu/drm/i915/gvt/dmabuf.c +f:drivers/gpu/drm/i915/gvt/dmabuf.h +f:drivers/gpu/drm/i915/gvt/edid.c +f:drivers/gpu/drm/i915/gvt/edid.h +f:drivers/gpu/drm/i915/gvt/execlist.c +f:drivers/gpu/drm/i915/gvt/execlist.h +f:drivers/gpu/drm/i915/gvt/fb_decoder.c +f:drivers/gpu/drm/i915/gvt/fb_decoder.h +f:drivers/gpu/drm/i915/gvt/firmware.c +f:drivers/gpu/drm/i915/gvt/gtt.c +f:drivers/gpu/drm/i915/gvt/gtt.h +f:drivers/gpu/drm/i915/gvt/gvt.h +f:drivers/gpu/drm/i915/gvt/handlers.c +f:drivers/gpu/drm/i915/gvt/interrupt.c +f:drivers/gpu/drm/i915/gvt/interrupt.h +f:drivers/gpu/drm/i915/gvt/kvmgt.c +f:drivers/gpu/drm/i915/gvt/mmio.c +f:drivers/gpu/drm/i915/gvt/mmio.h +f:drivers/gpu/drm/i915/gvt/mmio_context.c +f:drivers/gpu/drm/i915/gvt/mmio_context.h +f:drivers/gpu/drm/i915/gvt/opregion.c +f:drivers/gpu/drm/i915/gvt/page_track.c +f:drivers/gpu/drm/i915/gvt/page_track.h +f:drivers/gpu/drm/i915/gvt/reg.h +f:drivers/gpu/drm/i915/gvt/sched_policy.c +f:drivers/gpu/drm/i915/gvt/sched_policy.h +f:drivers/gpu/drm/i915/gvt/scheduler.c +f:drivers/gpu/drm/i915/gvt/scheduler.h +f:drivers/gpu/drm/i915/gvt/trace.h +f:drivers/gpu/drm/i915/gvt/trace_points.c +f:drivers/gpu/drm/i915/gvt/vgpu.c +f:drivers/gpu/drm/i915/i915_active.c +f:drivers/gpu/drm/i915/i915_active.h +f:drivers/gpu/drm/i915/i915_active_types.h +f:drivers/gpu/drm/i915/i915_cmd_parser.c +f:drivers/gpu/drm/i915/i915_cmd_parser.h +f:drivers/gpu/drm/i915/i915_config.c +f:drivers/gpu/drm/i915/i915_config.h +f:drivers/gpu/drm/i915/i915_debugfs.c +f:drivers/gpu/drm/i915/i915_debugfs.h +f:drivers/gpu/drm/i915/i915_debugfs_params.c +f:drivers/gpu/drm/i915/i915_debugfs_params.h +f:drivers/gpu/drm/i915/i915_deps.c +f:drivers/gpu/drm/i915/i915_deps.h +f:drivers/gpu/drm/i915/i915_driver.c +f:drivers/gpu/drm/i915/i915_driver.h +f:drivers/gpu/drm/i915/i915_drm_client.c +f:drivers/gpu/drm/i915/i915_drm_client.h +f:drivers/gpu/drm/i915/i915_drv.h +f:drivers/gpu/drm/i915/i915_file_private.h +f:drivers/gpu/drm/i915/i915_gem.c +f:drivers/gpu/drm/i915/i915_gem.h +f:drivers/gpu/drm/i915/i915_gem_evict.c +f:drivers/gpu/drm/i915/i915_gem_evict.h +f:drivers/gpu/drm/i915/i915_gem_gtt.c +f:drivers/gpu/drm/i915/i915_gem_gtt.h +f:drivers/gpu/drm/i915/i915_gem_ww.c +f:drivers/gpu/drm/i915/i915_gem_ww.h +f:drivers/gpu/drm/i915/i915_getparam.c +f:drivers/gpu/drm/i915/i915_getparam.h +f:drivers/gpu/drm/i915/i915_gpu_error.c +f:drivers/gpu/drm/i915/i915_gpu_error.h +f:drivers/gpu/drm/i915/i915_gtt_view_types.h +f:drivers/gpu/drm/i915/i915_hwmon.c +f:drivers/gpu/drm/i915/i915_hwmon.h +f:drivers/gpu/drm/i915/i915_ioc32.c +f:drivers/gpu/drm/i915/i915_ioc32.h +f:drivers/gpu/drm/i915/i915_ioctl.c +f:drivers/gpu/drm/i915/i915_ioctl.h +f:drivers/gpu/drm/i915/i915_iosf_mbi.h +f:drivers/gpu/drm/i915/i915_irq.c +f:drivers/gpu/drm/i915/i915_irq.h +f:drivers/gpu/drm/i915/i915_memcpy.c +f:drivers/gpu/drm/i915/i915_memcpy.h +f:drivers/gpu/drm/i915/i915_mitigations.c +f:drivers/gpu/drm/i915/i915_mitigations.h +f:drivers/gpu/drm/i915/i915_mm.c +f:drivers/gpu/drm/i915/i915_mm.h +f:drivers/gpu/drm/i915/i915_module.c +f:drivers/gpu/drm/i915/i915_params.c +f:drivers/gpu/drm/i915/i915_params.h +f:drivers/gpu/drm/i915/i915_pci.c +f:drivers/gpu/drm/i915/i915_pci.h +f:drivers/gpu/drm/i915/i915_perf.c +f:drivers/gpu/drm/i915/i915_perf.h +f:drivers/gpu/drm/i915/i915_perf_oa_regs.h +f:drivers/gpu/drm/i915/i915_perf_types.h +f:drivers/gpu/drm/i915/i915_pmu.c +f:drivers/gpu/drm/i915/i915_pmu.h +f:drivers/gpu/drm/i915/i915_priolist_types.h +f:drivers/gpu/drm/i915/i915_pvinfo.h +f:drivers/gpu/drm/i915/i915_query.c +f:drivers/gpu/drm/i915/i915_query.h +f:drivers/gpu/drm/i915/i915_reg.h +f:drivers/gpu/drm/i915/i915_reg_defs.h +f:drivers/gpu/drm/i915/i915_request.c +f:drivers/gpu/drm/i915/i915_request.h +f:drivers/gpu/drm/i915/i915_scatterlist.c +f:drivers/gpu/drm/i915/i915_scatterlist.h +f:drivers/gpu/drm/i915/i915_scheduler.c +f:drivers/gpu/drm/i915/i915_scheduler.h +f:drivers/gpu/drm/i915/i915_scheduler_types.h +f:drivers/gpu/drm/i915/i915_selftest.h +f:drivers/gpu/drm/i915/i915_sw_fence.c +f:drivers/gpu/drm/i915/i915_sw_fence.h +f:drivers/gpu/drm/i915/i915_sw_fence_work.c +f:drivers/gpu/drm/i915/i915_sw_fence_work.h +f:drivers/gpu/drm/i915/i915_switcheroo.c +f:drivers/gpu/drm/i915/i915_switcheroo.h +f:drivers/gpu/drm/i915/i915_syncmap.c +f:drivers/gpu/drm/i915/i915_syncmap.h +f:drivers/gpu/drm/i915/i915_sysfs.c +f:drivers/gpu/drm/i915/i915_sysfs.h +f:drivers/gpu/drm/i915/i915_tasklet.h +f:drivers/gpu/drm/i915/i915_trace.h +f:drivers/gpu/drm/i915/i915_trace_points.c +f:drivers/gpu/drm/i915/i915_ttm_buddy_manager.c +f:drivers/gpu/drm/i915/i915_ttm_buddy_manager.h +f:drivers/gpu/drm/i915/i915_user_extensions.c +f:drivers/gpu/drm/i915/i915_user_extensions.h +f:drivers/gpu/drm/i915/i915_utils.c +f:drivers/gpu/drm/i915/i915_utils.h +f:drivers/gpu/drm/i915/i915_vgpu.c +f:drivers/gpu/drm/i915/i915_vgpu.h +f:drivers/gpu/drm/i915/i915_vma.c +f:drivers/gpu/drm/i915/i915_vma.h +f:drivers/gpu/drm/i915/i915_vma_resource.c +f:drivers/gpu/drm/i915/i915_vma_resource.h +f:drivers/gpu/drm/i915/i915_vma_types.h +f:drivers/gpu/drm/i915/intel_clock_gating.c +f:drivers/gpu/drm/i915/intel_clock_gating.h +f:drivers/gpu/drm/i915/intel_cpu_info.c +f:drivers/gpu/drm/i915/intel_cpu_info.h +f:drivers/gpu/drm/i915/intel_device_info.c +f:drivers/gpu/drm/i915/intel_device_info.h +f:drivers/gpu/drm/i915/intel_gvt.c +f:drivers/gpu/drm/i915/intel_gvt.h +f:drivers/gpu/drm/i915/intel_gvt_mmio_table.c +f:drivers/gpu/drm/i915/intel_mchbar_regs.h +f:drivers/gpu/drm/i915/intel_memory_region.c +f:drivers/gpu/drm/i915/intel_memory_region.h +f:drivers/gpu/drm/i915/intel_pci_config.h +f:drivers/gpu/drm/i915/intel_pcode.c +f:drivers/gpu/drm/i915/intel_pcode.h +f:drivers/gpu/drm/i915/intel_region_ttm.c +f:drivers/gpu/drm/i915/intel_region_ttm.h +f:drivers/gpu/drm/i915/intel_runtime_pm.c +f:drivers/gpu/drm/i915/intel_runtime_pm.h +f:drivers/gpu/drm/i915/intel_step.c +f:drivers/gpu/drm/i915/intel_step.h +f:drivers/gpu/drm/i915/intel_uncore.c +f:drivers/gpu/drm/i915/intel_uncore.h +f:drivers/gpu/drm/i915/intel_uncore_trace.c +f:drivers/gpu/drm/i915/intel_uncore_trace.h +f:drivers/gpu/drm/i915/intel_wakeref.c +f:drivers/gpu/drm/i915/intel_wakeref.h +f:drivers/gpu/drm/i915/pxp/intel_pxp.c +f:drivers/gpu/drm/i915/pxp/intel_pxp.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_cmd.c +f:drivers/gpu/drm/i915/pxp/intel_pxp_cmd.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_cmd_interface_42.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_cmd_interface_43.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_cmd_interface_cmn.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.c +f:drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.c +f:drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_huc.c +f:drivers/gpu/drm/i915/pxp/intel_pxp_huc.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_irq.c +f:drivers/gpu/drm/i915/pxp/intel_pxp_irq.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_pm.c +f:drivers/gpu/drm/i915/pxp/intel_pxp_pm.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_regs.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_session.c +f:drivers/gpu/drm/i915/pxp/intel_pxp_session.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_tee.c +f:drivers/gpu/drm/i915/pxp/intel_pxp_tee.h +f:drivers/gpu/drm/i915/pxp/intel_pxp_types.h +f:drivers/gpu/drm/i915/selftests/i915_active.c +f:drivers/gpu/drm/i915/selftests/i915_gem.c +f:drivers/gpu/drm/i915/selftests/i915_gem_evict.c +f:drivers/gpu/drm/i915/selftests/i915_gem_gtt.c +f:drivers/gpu/drm/i915/selftests/i915_live_selftests.h +f:drivers/gpu/drm/i915/selftests/i915_mock_selftests.h +f:drivers/gpu/drm/i915/selftests/i915_perf.c +f:drivers/gpu/drm/i915/selftests/i915_perf_selftests.h +f:drivers/gpu/drm/i915/selftests/i915_random.c +f:drivers/gpu/drm/i915/selftests/i915_random.h +f:drivers/gpu/drm/i915/selftests/i915_request.c +f:drivers/gpu/drm/i915/selftests/i915_selftest.c +f:drivers/gpu/drm/i915/selftests/i915_sw_fence.c +f:drivers/gpu/drm/i915/selftests/i915_syncmap.c +f:drivers/gpu/drm/i915/selftests/i915_vma.c +f:drivers/gpu/drm/i915/selftests/igt_atomic.c +f:drivers/gpu/drm/i915/selftests/igt_atomic.h +f:drivers/gpu/drm/i915/selftests/igt_flush_test.c +f:drivers/gpu/drm/i915/selftests/igt_flush_test.h +f:drivers/gpu/drm/i915/selftests/igt_live_test.c +f:drivers/gpu/drm/i915/selftests/igt_live_test.h +f:drivers/gpu/drm/i915/selftests/igt_mmap.c +f:drivers/gpu/drm/i915/selftests/igt_mmap.h +f:drivers/gpu/drm/i915/selftests/igt_reset.c +f:drivers/gpu/drm/i915/selftests/igt_reset.h +f:drivers/gpu/drm/i915/selftests/igt_spinner.c +f:drivers/gpu/drm/i915/selftests/igt_spinner.h +f:drivers/gpu/drm/i915/selftests/intel_memory_region.c +f:drivers/gpu/drm/i915/selftests/intel_scheduler_helpers.c +f:drivers/gpu/drm/i915/selftests/intel_scheduler_helpers.h +f:drivers/gpu/drm/i915/selftests/intel_uncore.c +f:drivers/gpu/drm/i915/selftests/lib_sw_fence.c +f:drivers/gpu/drm/i915/selftests/lib_sw_fence.h +f:drivers/gpu/drm/i915/selftests/librapl.c +f:drivers/gpu/drm/i915/selftests/librapl.h +f:drivers/gpu/drm/i915/selftests/mock_drm.h +f:drivers/gpu/drm/i915/selftests/mock_gem_device.c +f:drivers/gpu/drm/i915/selftests/mock_gem_device.h +f:drivers/gpu/drm/i915/selftests/mock_gtt.c +f:drivers/gpu/drm/i915/selftests/mock_gtt.h +f:drivers/gpu/drm/i915/selftests/mock_region.c +f:drivers/gpu/drm/i915/selftests/mock_region.h +f:drivers/gpu/drm/i915/selftests/mock_request.c +f:drivers/gpu/drm/i915/selftests/mock_request.h +f:drivers/gpu/drm/i915/selftests/mock_uncore.c +f:drivers/gpu/drm/i915/selftests/mock_uncore.h +f:drivers/gpu/drm/i915/selftests/scatterlist.c +f:drivers/gpu/drm/i915/soc/intel_dram.c +f:drivers/gpu/drm/i915/soc/intel_dram.h +f:drivers/gpu/drm/i915/soc/intel_gmch.c +f:drivers/gpu/drm/i915/soc/intel_gmch.h +f:drivers/gpu/drm/i915/soc/intel_rom.c +f:drivers/gpu/drm/i915/soc/intel_rom.h +f:drivers/gpu/drm/i915/vlv_iosf_sb.c +f:drivers/gpu/drm/i915/vlv_iosf_sb.h +f:drivers/gpu/drm/i915/vlv_iosf_sb_reg.h +f:drivers/gpu/drm/i915/vlv_suspend.c +f:drivers/gpu/drm/i915/vlv_suspend.h +f:drivers/gpu/drm/imagination/Kconfig +f:drivers/gpu/drm/imagination/Makefile +f:drivers/gpu/drm/imagination/pvr_ccb.c +f:drivers/gpu/drm/imagination/pvr_ccb.h +f:drivers/gpu/drm/imagination/pvr_cccb.c +f:drivers/gpu/drm/imagination/pvr_cccb.h +f:drivers/gpu/drm/imagination/pvr_context.c +f:drivers/gpu/drm/imagination/pvr_context.h +f:drivers/gpu/drm/imagination/pvr_debugfs.c +f:drivers/gpu/drm/imagination/pvr_debugfs.h +f:drivers/gpu/drm/imagination/pvr_device.c +f:drivers/gpu/drm/imagination/pvr_device.h +f:drivers/gpu/drm/imagination/pvr_device_info.c +f:drivers/gpu/drm/imagination/pvr_device_info.h +f:drivers/gpu/drm/imagination/pvr_drv.c +f:drivers/gpu/drm/imagination/pvr_drv.h +f:drivers/gpu/drm/imagination/pvr_free_list.c +f:drivers/gpu/drm/imagination/pvr_free_list.h +f:drivers/gpu/drm/imagination/pvr_fw.c +f:drivers/gpu/drm/imagination/pvr_fw.h +f:drivers/gpu/drm/imagination/pvr_fw_info.h +f:drivers/gpu/drm/imagination/pvr_fw_meta.c +f:drivers/gpu/drm/imagination/pvr_fw_meta.h +f:drivers/gpu/drm/imagination/pvr_fw_mips.c +f:drivers/gpu/drm/imagination/pvr_fw_mips.h +f:drivers/gpu/drm/imagination/pvr_fw_riscv.c +f:drivers/gpu/drm/imagination/pvr_fw_startstop.c +f:drivers/gpu/drm/imagination/pvr_fw_startstop.h +f:drivers/gpu/drm/imagination/pvr_fw_trace.c +f:drivers/gpu/drm/imagination/pvr_fw_trace.h +f:drivers/gpu/drm/imagination/pvr_fw_util.c +f:drivers/gpu/drm/imagination/pvr_gem.c +f:drivers/gpu/drm/imagination/pvr_gem.h +f:drivers/gpu/drm/imagination/pvr_hwrt.c +f:drivers/gpu/drm/imagination/pvr_hwrt.h +f:drivers/gpu/drm/imagination/pvr_job.c +f:drivers/gpu/drm/imagination/pvr_job.h +f:drivers/gpu/drm/imagination/pvr_mmu.c +f:drivers/gpu/drm/imagination/pvr_mmu.h +f:drivers/gpu/drm/imagination/pvr_params.c +f:drivers/gpu/drm/imagination/pvr_params.h +f:drivers/gpu/drm/imagination/pvr_power.c +f:drivers/gpu/drm/imagination/pvr_power.h +f:drivers/gpu/drm/imagination/pvr_queue.c +f:drivers/gpu/drm/imagination/pvr_queue.h +f:drivers/gpu/drm/imagination/pvr_rogue_cr_defs.h +f:drivers/gpu/drm/imagination/pvr_rogue_cr_defs_client.h +f:drivers/gpu/drm/imagination/pvr_rogue_defs.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_check.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_client.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_client_check.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_common.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_dev_info.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_resetframework.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_sf.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_shared.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_shared_check.h +f:drivers/gpu/drm/imagination/pvr_rogue_fwif_stream.h +f:drivers/gpu/drm/imagination/pvr_rogue_heap_config.h +f:drivers/gpu/drm/imagination/pvr_rogue_meta.h +f:drivers/gpu/drm/imagination/pvr_rogue_mips.h +f:drivers/gpu/drm/imagination/pvr_rogue_mips_check.h +f:drivers/gpu/drm/imagination/pvr_rogue_mmu_defs.h +f:drivers/gpu/drm/imagination/pvr_rogue_riscv.h +f:drivers/gpu/drm/imagination/pvr_stream.c +f:drivers/gpu/drm/imagination/pvr_stream.h +f:drivers/gpu/drm/imagination/pvr_stream_defs.c +f:drivers/gpu/drm/imagination/pvr_stream_defs.h +f:drivers/gpu/drm/imagination/pvr_sync.c +f:drivers/gpu/drm/imagination/pvr_sync.h +f:drivers/gpu/drm/imagination/pvr_vm.c +f:drivers/gpu/drm/imagination/pvr_vm.h +f:drivers/gpu/drm/imagination/pvr_vm_mips.c +f:drivers/gpu/drm/imagination/pvr_vm_mips.h +f:drivers/gpu/drm/imx/Kconfig +f:drivers/gpu/drm/imx/Makefile +f:drivers/gpu/drm/imx/dc/Kconfig +f:drivers/gpu/drm/imx/dc/Makefile +f:drivers/gpu/drm/imx/dc/dc-cf.c +f:drivers/gpu/drm/imx/dc/dc-crtc.c +f:drivers/gpu/drm/imx/dc/dc-de.c +f:drivers/gpu/drm/imx/dc/dc-de.h +f:drivers/gpu/drm/imx/dc/dc-drv.c +f:drivers/gpu/drm/imx/dc/dc-drv.h +f:drivers/gpu/drm/imx/dc/dc-ed.c +f:drivers/gpu/drm/imx/dc/dc-fg.c +f:drivers/gpu/drm/imx/dc/dc-fl.c +f:drivers/gpu/drm/imx/dc/dc-fu.c +f:drivers/gpu/drm/imx/dc/dc-fu.h +f:drivers/gpu/drm/imx/dc/dc-fw.c +f:drivers/gpu/drm/imx/dc/dc-ic.c +f:drivers/gpu/drm/imx/dc/dc-kms.c +f:drivers/gpu/drm/imx/dc/dc-kms.h +f:drivers/gpu/drm/imx/dc/dc-lb.c +f:drivers/gpu/drm/imx/dc/dc-pe.c +f:drivers/gpu/drm/imx/dc/dc-pe.h +f:drivers/gpu/drm/imx/dc/dc-plane.c +f:drivers/gpu/drm/imx/dc/dc-tc.c +f:drivers/gpu/drm/imx/dcss/Kconfig +f:drivers/gpu/drm/imx/dcss/Makefile +f:drivers/gpu/drm/imx/dcss/dcss-blkctl.c +f:drivers/gpu/drm/imx/dcss/dcss-crtc.c +f:drivers/gpu/drm/imx/dcss/dcss-ctxld.c +f:drivers/gpu/drm/imx/dcss/dcss-dev.c +f:drivers/gpu/drm/imx/dcss/dcss-dev.h +f:drivers/gpu/drm/imx/dcss/dcss-dpr.c +f:drivers/gpu/drm/imx/dcss/dcss-drv.c +f:drivers/gpu/drm/imx/dcss/dcss-dtg.c +f:drivers/gpu/drm/imx/dcss/dcss-kms.c +f:drivers/gpu/drm/imx/dcss/dcss-kms.h +f:drivers/gpu/drm/imx/dcss/dcss-plane.c +f:drivers/gpu/drm/imx/dcss/dcss-scaler.c +f:drivers/gpu/drm/imx/dcss/dcss-ss.c +f:drivers/gpu/drm/imx/ipuv3/Kconfig +f:drivers/gpu/drm/imx/ipuv3/Makefile +f:drivers/gpu/drm/imx/ipuv3/dw_hdmi-imx.c +f:drivers/gpu/drm/imx/ipuv3/imx-drm-core.c +f:drivers/gpu/drm/imx/ipuv3/imx-drm.h +f:drivers/gpu/drm/imx/ipuv3/imx-ldb.c +f:drivers/gpu/drm/imx/ipuv3/imx-tve.c +f:drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c +f:drivers/gpu/drm/imx/ipuv3/ipuv3-plane.c +f:drivers/gpu/drm/imx/ipuv3/ipuv3-plane.h +f:drivers/gpu/drm/imx/ipuv3/parallel-display.c +f:drivers/gpu/drm/imx/lcdc/Kconfig +f:drivers/gpu/drm/imx/lcdc/Makefile +f:drivers/gpu/drm/imx/lcdc/imx-lcdc.c +f:drivers/gpu/drm/ingenic/Kconfig +f:drivers/gpu/drm/ingenic/Makefile +f:drivers/gpu/drm/ingenic/ingenic-drm-drv.c +f:drivers/gpu/drm/ingenic/ingenic-drm.h +f:drivers/gpu/drm/ingenic/ingenic-dw-hdmi.c +f:drivers/gpu/drm/ingenic/ingenic-ipu.c +f:drivers/gpu/drm/ingenic/ingenic-ipu.h +f:drivers/gpu/drm/kmb/Kconfig +f:drivers/gpu/drm/kmb/Makefile +f:drivers/gpu/drm/kmb/kmb_crtc.c +f:drivers/gpu/drm/kmb/kmb_drv.c +f:drivers/gpu/drm/kmb/kmb_drv.h +f:drivers/gpu/drm/kmb/kmb_dsi.c +f:drivers/gpu/drm/kmb/kmb_dsi.h +f:drivers/gpu/drm/kmb/kmb_plane.c +f:drivers/gpu/drm/kmb/kmb_plane.h +f:drivers/gpu/drm/kmb/kmb_regs.h +f:drivers/gpu/drm/lib/drm_random.c +f:drivers/gpu/drm/lib/drm_random.h +f:drivers/gpu/drm/lima/Kconfig +f:drivers/gpu/drm/lima/Makefile +f:drivers/gpu/drm/lima/lima_bcast.c +f:drivers/gpu/drm/lima/lima_bcast.h +f:drivers/gpu/drm/lima/lima_ctx.c +f:drivers/gpu/drm/lima/lima_ctx.h +f:drivers/gpu/drm/lima/lima_devfreq.c +f:drivers/gpu/drm/lima/lima_devfreq.h +f:drivers/gpu/drm/lima/lima_device.c +f:drivers/gpu/drm/lima/lima_device.h +f:drivers/gpu/drm/lima/lima_dlbu.c +f:drivers/gpu/drm/lima/lima_dlbu.h +f:drivers/gpu/drm/lima/lima_drv.c +f:drivers/gpu/drm/lima/lima_drv.h +f:drivers/gpu/drm/lima/lima_dump.h +f:drivers/gpu/drm/lima/lima_gem.c +f:drivers/gpu/drm/lima/lima_gem.h +f:drivers/gpu/drm/lima/lima_gp.c +f:drivers/gpu/drm/lima/lima_gp.h +f:drivers/gpu/drm/lima/lima_l2_cache.c +f:drivers/gpu/drm/lima/lima_l2_cache.h +f:drivers/gpu/drm/lima/lima_mmu.c +f:drivers/gpu/drm/lima/lima_mmu.h +f:drivers/gpu/drm/lima/lima_pmu.c +f:drivers/gpu/drm/lima/lima_pmu.h +f:drivers/gpu/drm/lima/lima_pp.c +f:drivers/gpu/drm/lima/lima_pp.h +f:drivers/gpu/drm/lima/lima_regs.h +f:drivers/gpu/drm/lima/lima_sched.c +f:drivers/gpu/drm/lima/lima_sched.h +f:drivers/gpu/drm/lima/lima_trace.c +f:drivers/gpu/drm/lima/lima_trace.h +f:drivers/gpu/drm/lima/lima_vm.c +f:drivers/gpu/drm/lima/lima_vm.h +f:drivers/gpu/drm/logicvc/Kconfig +f:drivers/gpu/drm/logicvc/Makefile +f:drivers/gpu/drm/logicvc/logicvc_crtc.c +f:drivers/gpu/drm/logicvc/logicvc_crtc.h +f:drivers/gpu/drm/logicvc/logicvc_drm.c +f:drivers/gpu/drm/logicvc/logicvc_drm.h +f:drivers/gpu/drm/logicvc/logicvc_interface.c +f:drivers/gpu/drm/logicvc/logicvc_interface.h +f:drivers/gpu/drm/logicvc/logicvc_layer.c +f:drivers/gpu/drm/logicvc/logicvc_layer.h +f:drivers/gpu/drm/logicvc/logicvc_mode.c +f:drivers/gpu/drm/logicvc/logicvc_mode.h +f:drivers/gpu/drm/logicvc/logicvc_of.c +f:drivers/gpu/drm/logicvc/logicvc_of.h +f:drivers/gpu/drm/logicvc/logicvc_regs.h +f:drivers/gpu/drm/loongson/Kconfig +f:drivers/gpu/drm/loongson/Makefile +f:drivers/gpu/drm/loongson/loongson_device.c +f:drivers/gpu/drm/loongson/loongson_module.c +f:drivers/gpu/drm/loongson/loongson_module.h +f:drivers/gpu/drm/loongson/lsdc_benchmark.c +f:drivers/gpu/drm/loongson/lsdc_benchmark.h +f:drivers/gpu/drm/loongson/lsdc_crtc.c +f:drivers/gpu/drm/loongson/lsdc_debugfs.c +f:drivers/gpu/drm/loongson/lsdc_drv.c +f:drivers/gpu/drm/loongson/lsdc_drv.h +f:drivers/gpu/drm/loongson/lsdc_gem.c +f:drivers/gpu/drm/loongson/lsdc_gem.h +f:drivers/gpu/drm/loongson/lsdc_gfxpll.c +f:drivers/gpu/drm/loongson/lsdc_gfxpll.h +f:drivers/gpu/drm/loongson/lsdc_i2c.c +f:drivers/gpu/drm/loongson/lsdc_i2c.h +f:drivers/gpu/drm/loongson/lsdc_irq.c +f:drivers/gpu/drm/loongson/lsdc_irq.h +f:drivers/gpu/drm/loongson/lsdc_output.h +f:drivers/gpu/drm/loongson/lsdc_output_7a1000.c +f:drivers/gpu/drm/loongson/lsdc_output_7a2000.c +f:drivers/gpu/drm/loongson/lsdc_pixpll.c +f:drivers/gpu/drm/loongson/lsdc_pixpll.h +f:drivers/gpu/drm/loongson/lsdc_plane.c +f:drivers/gpu/drm/loongson/lsdc_probe.c +f:drivers/gpu/drm/loongson/lsdc_probe.h +f:drivers/gpu/drm/loongson/lsdc_regs.h +f:drivers/gpu/drm/loongson/lsdc_ttm.c +f:drivers/gpu/drm/loongson/lsdc_ttm.h +f:drivers/gpu/drm/mcde/Kconfig +f:drivers/gpu/drm/mcde/Makefile +f:drivers/gpu/drm/mcde/mcde_clk_div.c +f:drivers/gpu/drm/mcde/mcde_display.c +f:drivers/gpu/drm/mcde/mcde_display_regs.h +f:drivers/gpu/drm/mcde/mcde_drm.h +f:drivers/gpu/drm/mcde/mcde_drv.c +f:drivers/gpu/drm/mcde/mcde_dsi.c +f:drivers/gpu/drm/mcde/mcde_dsi_regs.h +f:drivers/gpu/drm/mediatek/Kconfig +f:drivers/gpu/drm/mediatek/Makefile +f:drivers/gpu/drm/mediatek/mtk_cec.c +f:drivers/gpu/drm/mediatek/mtk_cec.h +f:drivers/gpu/drm/mediatek/mtk_crtc.c +f:drivers/gpu/drm/mediatek/mtk_crtc.h +f:drivers/gpu/drm/mediatek/mtk_ddp_comp.c +f:drivers/gpu/drm/mediatek/mtk_ddp_comp.h +f:drivers/gpu/drm/mediatek/mtk_disp_aal.c +f:drivers/gpu/drm/mediatek/mtk_disp_ccorr.c +f:drivers/gpu/drm/mediatek/mtk_disp_color.c +f:drivers/gpu/drm/mediatek/mtk_disp_drv.h +f:drivers/gpu/drm/mediatek/mtk_disp_gamma.c +f:drivers/gpu/drm/mediatek/mtk_disp_merge.c +f:drivers/gpu/drm/mediatek/mtk_disp_ovl.c +f:drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c +f:drivers/gpu/drm/mediatek/mtk_disp_rdma.c +f:drivers/gpu/drm/mediatek/mtk_dp.c +f:drivers/gpu/drm/mediatek/mtk_dp_reg.h +f:drivers/gpu/drm/mediatek/mtk_dpi.c +f:drivers/gpu/drm/mediatek/mtk_dpi_regs.h +f:drivers/gpu/drm/mediatek/mtk_drm_drv.c +f:drivers/gpu/drm/mediatek/mtk_drm_drv.h +f:drivers/gpu/drm/mediatek/mtk_dsi.c +f:drivers/gpu/drm/mediatek/mtk_ethdr.c +f:drivers/gpu/drm/mediatek/mtk_ethdr.h +f:drivers/gpu/drm/mediatek/mtk_gem.c +f:drivers/gpu/drm/mediatek/mtk_gem.h +f:drivers/gpu/drm/mediatek/mtk_hdmi.c +f:drivers/gpu/drm/mediatek/mtk_hdmi_ddc.c +f:drivers/gpu/drm/mediatek/mtk_hdmi_regs.h +f:drivers/gpu/drm/mediatek/mtk_mdp_rdma.c +f:drivers/gpu/drm/mediatek/mtk_mdp_rdma.h +f:drivers/gpu/drm/mediatek/mtk_padding.c +f:drivers/gpu/drm/mediatek/mtk_plane.c +f:drivers/gpu/drm/mediatek/mtk_plane.h +f:drivers/gpu/drm/meson/Kconfig +f:drivers/gpu/drm/meson/Makefile +f:drivers/gpu/drm/meson/meson_crtc.c +f:drivers/gpu/drm/meson/meson_crtc.h +f:drivers/gpu/drm/meson/meson_drv.c +f:drivers/gpu/drm/meson/meson_drv.h +f:drivers/gpu/drm/meson/meson_dw_hdmi.c +f:drivers/gpu/drm/meson/meson_dw_hdmi.h +f:drivers/gpu/drm/meson/meson_dw_mipi_dsi.c +f:drivers/gpu/drm/meson/meson_dw_mipi_dsi.h +f:drivers/gpu/drm/meson/meson_encoder_cvbs.c +f:drivers/gpu/drm/meson/meson_encoder_cvbs.h +f:drivers/gpu/drm/meson/meson_encoder_dsi.c +f:drivers/gpu/drm/meson/meson_encoder_dsi.h +f:drivers/gpu/drm/meson/meson_encoder_hdmi.c +f:drivers/gpu/drm/meson/meson_encoder_hdmi.h +f:drivers/gpu/drm/meson/meson_osd_afbcd.c +f:drivers/gpu/drm/meson/meson_osd_afbcd.h +f:drivers/gpu/drm/meson/meson_overlay.c +f:drivers/gpu/drm/meson/meson_overlay.h +f:drivers/gpu/drm/meson/meson_plane.c +f:drivers/gpu/drm/meson/meson_plane.h +f:drivers/gpu/drm/meson/meson_rdma.c +f:drivers/gpu/drm/meson/meson_rdma.h +f:drivers/gpu/drm/meson/meson_registers.h +f:drivers/gpu/drm/meson/meson_vclk.c +f:drivers/gpu/drm/meson/meson_vclk.h +f:drivers/gpu/drm/meson/meson_venc.c +f:drivers/gpu/drm/meson/meson_venc.h +f:drivers/gpu/drm/meson/meson_viu.c +f:drivers/gpu/drm/meson/meson_viu.h +f:drivers/gpu/drm/meson/meson_vpp.c +f:drivers/gpu/drm/meson/meson_vpp.h +f:drivers/gpu/drm/mgag200/Kconfig +f:drivers/gpu/drm/mgag200/Makefile +f:drivers/gpu/drm/mgag200/mgag200_bmc.c +f:drivers/gpu/drm/mgag200/mgag200_ddc.c +f:drivers/gpu/drm/mgag200/mgag200_ddc.h +f:drivers/gpu/drm/mgag200/mgag200_drv.c +f:drivers/gpu/drm/mgag200/mgag200_drv.h +f:drivers/gpu/drm/mgag200/mgag200_g200.c +f:drivers/gpu/drm/mgag200/mgag200_g200eh.c +f:drivers/gpu/drm/mgag200/mgag200_g200eh3.c +f:drivers/gpu/drm/mgag200/mgag200_g200eh5.c +f:drivers/gpu/drm/mgag200/mgag200_g200er.c +f:drivers/gpu/drm/mgag200/mgag200_g200ev.c +f:drivers/gpu/drm/mgag200/mgag200_g200ew3.c +f:drivers/gpu/drm/mgag200/mgag200_g200se.c +f:drivers/gpu/drm/mgag200/mgag200_g200wb.c +f:drivers/gpu/drm/mgag200/mgag200_mode.c +f:drivers/gpu/drm/mgag200/mgag200_reg.h +f:drivers/gpu/drm/mgag200/mgag200_vga.c +f:drivers/gpu/drm/mgag200/mgag200_vga_bmc.c +f:drivers/gpu/drm/msm/.gitignore +f:drivers/gpu/drm/msm/Kconfig +f:drivers/gpu/drm/msm/Makefile +f:drivers/gpu/drm/msm/NOTES +f:drivers/gpu/drm/msm/adreno/a2xx_catalog.c +f:drivers/gpu/drm/msm/adreno/a2xx_gpu.c +f:drivers/gpu/drm/msm/adreno/a2xx_gpu.h +f:drivers/gpu/drm/msm/adreno/a2xx_gpummu.c +f:drivers/gpu/drm/msm/adreno/a3xx_catalog.c +f:drivers/gpu/drm/msm/adreno/a3xx_gpu.c +f:drivers/gpu/drm/msm/adreno/a3xx_gpu.h +f:drivers/gpu/drm/msm/adreno/a4xx_catalog.c +f:drivers/gpu/drm/msm/adreno/a4xx_gpu.c +f:drivers/gpu/drm/msm/adreno/a4xx_gpu.h +f:drivers/gpu/drm/msm/adreno/a5xx_catalog.c +f:drivers/gpu/drm/msm/adreno/a5xx_debugfs.c +f:drivers/gpu/drm/msm/adreno/a5xx_gpu.c +f:drivers/gpu/drm/msm/adreno/a5xx_gpu.h +f:drivers/gpu/drm/msm/adreno/a5xx_power.c +f:drivers/gpu/drm/msm/adreno/a5xx_preempt.c +f:drivers/gpu/drm/msm/adreno/a6xx_catalog.c +f:drivers/gpu/drm/msm/adreno/a6xx_gmu.c +f:drivers/gpu/drm/msm/adreno/a6xx_gmu.h +f:drivers/gpu/drm/msm/adreno/a6xx_gpu.c +f:drivers/gpu/drm/msm/adreno/a6xx_gpu.h +f:drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c +f:drivers/gpu/drm/msm/adreno/a6xx_gpu_state.h +f:drivers/gpu/drm/msm/adreno/a6xx_hfi.c +f:drivers/gpu/drm/msm/adreno/a6xx_hfi.h +f:drivers/gpu/drm/msm/adreno/a6xx_preempt.c +f:drivers/gpu/drm/msm/adreno/adreno_device.c +f:drivers/gpu/drm/msm/adreno/adreno_gen7_0_0_snapshot.h +f:drivers/gpu/drm/msm/adreno/adreno_gen7_2_0_snapshot.h +f:drivers/gpu/drm/msm/adreno/adreno_gen7_9_0_snapshot.h +f:drivers/gpu/drm/msm/adreno/adreno_gpu.c +f:drivers/gpu/drm/msm/adreno/adreno_gpu.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_10_0_sm8650.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_12_0_sm8750.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_2_sdm660.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_3_sdm630.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_1_sdm670.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_2_sm7150.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_3_sm6150.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_4_sm6125.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_4_sm6350.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_9_sm6375.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h +f:drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_formats.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_cdm.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_cdm.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_cwb.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_cwb.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.h +f:drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c +f:drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h +f:drivers/gpu/drm/msm/disp/dpu1/msm_media_info.h +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_irq.c +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c +f:drivers/gpu/drm/msm/disp/mdp4/mdp4_plane.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.h +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_ctl.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_ctl.h +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_irq.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.h +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.h +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.h +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.c +f:drivers/gpu/drm/msm/disp/mdp5/mdp5_smp.h +f:drivers/gpu/drm/msm/disp/mdp_format.c +f:drivers/gpu/drm/msm/disp/mdp_format.h +f:drivers/gpu/drm/msm/disp/mdp_kms.c +f:drivers/gpu/drm/msm/disp/mdp_kms.h +f:drivers/gpu/drm/msm/disp/msm_disp_snapshot.c +f:drivers/gpu/drm/msm/disp/msm_disp_snapshot.h +f:drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c +f:drivers/gpu/drm/msm/dp/dp_audio.c +f:drivers/gpu/drm/msm/dp/dp_audio.h +f:drivers/gpu/drm/msm/dp/dp_aux.c +f:drivers/gpu/drm/msm/dp/dp_aux.h +f:drivers/gpu/drm/msm/dp/dp_ctrl.c +f:drivers/gpu/drm/msm/dp/dp_ctrl.h +f:drivers/gpu/drm/msm/dp/dp_debug.c +f:drivers/gpu/drm/msm/dp/dp_debug.h +f:drivers/gpu/drm/msm/dp/dp_display.c +f:drivers/gpu/drm/msm/dp/dp_display.h +f:drivers/gpu/drm/msm/dp/dp_drm.c +f:drivers/gpu/drm/msm/dp/dp_drm.h +f:drivers/gpu/drm/msm/dp/dp_link.c +f:drivers/gpu/drm/msm/dp/dp_link.h +f:drivers/gpu/drm/msm/dp/dp_panel.c +f:drivers/gpu/drm/msm/dp/dp_panel.h +f:drivers/gpu/drm/msm/dp/dp_reg.h +f:drivers/gpu/drm/msm/dp/dp_utils.c +f:drivers/gpu/drm/msm/dp/dp_utils.h +f:drivers/gpu/drm/msm/dsi/dsi.c +f:drivers/gpu/drm/msm/dsi/dsi.h +f:drivers/gpu/drm/msm/dsi/dsi_cfg.c +f:drivers/gpu/drm/msm/dsi/dsi_cfg.h +f:drivers/gpu/drm/msm/dsi/dsi_host.c +f:drivers/gpu/drm/msm/dsi/dsi_manager.c +f:drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +f:drivers/gpu/drm/msm/dsi/phy/dsi_phy.h +f:drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c +f:drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c +f:drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c +f:drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm.c +f:drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm_8960.c +f:drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c +f:drivers/gpu/drm/msm/hdmi/hdmi.c +f:drivers/gpu/drm/msm/hdmi/hdmi.h +f:drivers/gpu/drm/msm/hdmi/hdmi_audio.c +f:drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +f:drivers/gpu/drm/msm/hdmi/hdmi_hdcp.c +f:drivers/gpu/drm/msm/hdmi/hdmi_hpd.c +f:drivers/gpu/drm/msm/hdmi/hdmi_i2c.c +f:drivers/gpu/drm/msm/hdmi/hdmi_phy.c +f:drivers/gpu/drm/msm/hdmi/hdmi_phy_8960.c +f:drivers/gpu/drm/msm/hdmi/hdmi_phy_8996.c +f:drivers/gpu/drm/msm/hdmi/hdmi_phy_8998.c +f:drivers/gpu/drm/msm/hdmi/hdmi_phy_8x60.c +f:drivers/gpu/drm/msm/hdmi/hdmi_phy_8x74.c +f:drivers/gpu/drm/msm/hdmi/hdmi_pll_8960.c +f:drivers/gpu/drm/msm/msm_atomic.c +f:drivers/gpu/drm/msm/msm_atomic_trace.h +f:drivers/gpu/drm/msm/msm_atomic_tracepoints.c +f:drivers/gpu/drm/msm/msm_debugfs.c +f:drivers/gpu/drm/msm/msm_debugfs.h +f:drivers/gpu/drm/msm/msm_drv.c +f:drivers/gpu/drm/msm/msm_drv.h +f:drivers/gpu/drm/msm/msm_dsc_helper.h +f:drivers/gpu/drm/msm/msm_fb.c +f:drivers/gpu/drm/msm/msm_fbdev.c +f:drivers/gpu/drm/msm/msm_fence.c +f:drivers/gpu/drm/msm/msm_fence.h +f:drivers/gpu/drm/msm/msm_gem.c +f:drivers/gpu/drm/msm/msm_gem.h +f:drivers/gpu/drm/msm/msm_gem_prime.c +f:drivers/gpu/drm/msm/msm_gem_shrinker.c +f:drivers/gpu/drm/msm/msm_gem_submit.c +f:drivers/gpu/drm/msm/msm_gem_vma.c +f:drivers/gpu/drm/msm/msm_gpu.c +f:drivers/gpu/drm/msm/msm_gpu.h +f:drivers/gpu/drm/msm/msm_gpu_devfreq.c +f:drivers/gpu/drm/msm/msm_gpu_trace.h +f:drivers/gpu/drm/msm/msm_gpu_tracepoints.c +f:drivers/gpu/drm/msm/msm_io_utils.c +f:drivers/gpu/drm/msm/msm_iommu.c +f:drivers/gpu/drm/msm/msm_kms.c +f:drivers/gpu/drm/msm/msm_kms.h +f:drivers/gpu/drm/msm/msm_mdss.c +f:drivers/gpu/drm/msm/msm_mmu.h +f:drivers/gpu/drm/msm/msm_perf.c +f:drivers/gpu/drm/msm/msm_rd.c +f:drivers/gpu/drm/msm/msm_ringbuffer.c +f:drivers/gpu/drm/msm/msm_ringbuffer.h +f:drivers/gpu/drm/msm/msm_submitqueue.c +f:drivers/gpu/drm/msm/msm_syncobj.c +f:drivers/gpu/drm/msm/msm_syncobj.h +f:drivers/gpu/drm/msm/registers/.gitignore +f:drivers/gpu/drm/msm/registers/adreno/a2xx.xml +f:drivers/gpu/drm/msm/registers/adreno/a3xx.xml +f:drivers/gpu/drm/msm/registers/adreno/a4xx.xml +f:drivers/gpu/drm/msm/registers/adreno/a5xx.xml +f:drivers/gpu/drm/msm/registers/adreno/a6xx.xml +f:drivers/gpu/drm/msm/registers/adreno/a6xx_descriptors.xml +f:drivers/gpu/drm/msm/registers/adreno/a6xx_enums.xml +f:drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml +f:drivers/gpu/drm/msm/registers/adreno/a6xx_perfcntrs.xml +f:drivers/gpu/drm/msm/registers/adreno/a7xx_enums.xml +f:drivers/gpu/drm/msm/registers/adreno/a7xx_perfcntrs.xml +f:drivers/gpu/drm/msm/registers/adreno/adreno_common.xml +f:drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml +f:drivers/gpu/drm/msm/registers/display/dsi.xml +f:drivers/gpu/drm/msm/registers/display/dsi_phy_10nm.xml +f:drivers/gpu/drm/msm/registers/display/dsi_phy_14nm.xml +f:drivers/gpu/drm/msm/registers/display/dsi_phy_20nm.xml +f:drivers/gpu/drm/msm/registers/display/dsi_phy_28nm.xml +f:drivers/gpu/drm/msm/registers/display/dsi_phy_28nm_8960.xml +f:drivers/gpu/drm/msm/registers/display/dsi_phy_7nm.xml +f:drivers/gpu/drm/msm/registers/display/edp.xml +f:drivers/gpu/drm/msm/registers/display/hdmi.xml +f:drivers/gpu/drm/msm/registers/display/mdp4.xml +f:drivers/gpu/drm/msm/registers/display/mdp5.xml +f:drivers/gpu/drm/msm/registers/display/mdp_common.xml +f:drivers/gpu/drm/msm/registers/display/mdss.xml +f:drivers/gpu/drm/msm/registers/display/msm.xml +f:drivers/gpu/drm/msm/registers/display/sfpb.xml +f:drivers/gpu/drm/msm/registers/freedreno_copyright.xml +f:drivers/gpu/drm/msm/registers/gen_header.py +f:drivers/gpu/drm/msm/registers/rules-fd.xsd +f:drivers/gpu/drm/mxsfb/Kconfig +f:drivers/gpu/drm/mxsfb/Makefile +f:drivers/gpu/drm/mxsfb/lcdif_drv.c +f:drivers/gpu/drm/mxsfb/lcdif_drv.h +f:drivers/gpu/drm/mxsfb/lcdif_kms.c +f:drivers/gpu/drm/mxsfb/lcdif_regs.h +f:drivers/gpu/drm/mxsfb/mxsfb_drv.c +f:drivers/gpu/drm/mxsfb/mxsfb_drv.h +f:drivers/gpu/drm/mxsfb/mxsfb_kms.c +f:drivers/gpu/drm/mxsfb/mxsfb_regs.h +f:drivers/gpu/drm/nouveau/Kbuild +f:drivers/gpu/drm/nouveau/Kconfig +f:drivers/gpu/drm/nouveau/dispnv04/Kbuild +f:drivers/gpu/drm/nouveau/dispnv04/arb.c +f:drivers/gpu/drm/nouveau/dispnv04/crtc.c +f:drivers/gpu/drm/nouveau/dispnv04/cursor.c +f:drivers/gpu/drm/nouveau/dispnv04/dac.c +f:drivers/gpu/drm/nouveau/dispnv04/dfp.c +f:drivers/gpu/drm/nouveau/dispnv04/disp.c +f:drivers/gpu/drm/nouveau/dispnv04/disp.h +f:drivers/gpu/drm/nouveau/dispnv04/hw.c +f:drivers/gpu/drm/nouveau/dispnv04/hw.h +f:drivers/gpu/drm/nouveau/dispnv04/i2c/Kbuild +f:drivers/gpu/drm/nouveau/dispnv04/i2c/ch7006_drv.c +f:drivers/gpu/drm/nouveau/dispnv04/i2c/ch7006_mode.c +f:drivers/gpu/drm/nouveau/dispnv04/i2c/ch7006_priv.h +f:drivers/gpu/drm/nouveau/dispnv04/i2c/sil164_drv.c +f:drivers/gpu/drm/nouveau/dispnv04/nouveau_i2c_encoder.c +f:drivers/gpu/drm/nouveau/dispnv04/nvreg.h +f:drivers/gpu/drm/nouveau/dispnv04/overlay.c +f:drivers/gpu/drm/nouveau/dispnv04/tvmodesnv17.c +f:drivers/gpu/drm/nouveau/dispnv04/tvnv04.c +f:drivers/gpu/drm/nouveau/dispnv04/tvnv17.c +f:drivers/gpu/drm/nouveau/dispnv04/tvnv17.h +f:drivers/gpu/drm/nouveau/dispnv50/Kbuild +f:drivers/gpu/drm/nouveau/dispnv50/atom.h +f:drivers/gpu/drm/nouveau/dispnv50/base.c +f:drivers/gpu/drm/nouveau/dispnv50/base.h +f:drivers/gpu/drm/nouveau/dispnv50/base507c.c +f:drivers/gpu/drm/nouveau/dispnv50/base827c.c +f:drivers/gpu/drm/nouveau/dispnv50/base907c.c +f:drivers/gpu/drm/nouveau/dispnv50/base917c.c +f:drivers/gpu/drm/nouveau/dispnv50/core.c +f:drivers/gpu/drm/nouveau/dispnv50/core.h +f:drivers/gpu/drm/nouveau/dispnv50/core507d.c +f:drivers/gpu/drm/nouveau/dispnv50/core827d.c +f:drivers/gpu/drm/nouveau/dispnv50/core907d.c +f:drivers/gpu/drm/nouveau/dispnv50/core917d.c +f:drivers/gpu/drm/nouveau/dispnv50/corec37d.c +f:drivers/gpu/drm/nouveau/dispnv50/corec57d.c +f:drivers/gpu/drm/nouveau/dispnv50/coreca7d.c +f:drivers/gpu/drm/nouveau/dispnv50/crc.c +f:drivers/gpu/drm/nouveau/dispnv50/crc.h +f:drivers/gpu/drm/nouveau/dispnv50/crc907d.c +f:drivers/gpu/drm/nouveau/dispnv50/crcc37d.c +f:drivers/gpu/drm/nouveau/dispnv50/crcc37d.h +f:drivers/gpu/drm/nouveau/dispnv50/crcc57d.c +f:drivers/gpu/drm/nouveau/dispnv50/crcca7d.c +f:drivers/gpu/drm/nouveau/dispnv50/curs.c +f:drivers/gpu/drm/nouveau/dispnv50/curs.h +f:drivers/gpu/drm/nouveau/dispnv50/curs507a.c +f:drivers/gpu/drm/nouveau/dispnv50/curs907a.c +f:drivers/gpu/drm/nouveau/dispnv50/cursc37a.c +f:drivers/gpu/drm/nouveau/dispnv50/dac507d.c +f:drivers/gpu/drm/nouveau/dispnv50/dac907d.c +f:drivers/gpu/drm/nouveau/dispnv50/disp.c +f:drivers/gpu/drm/nouveau/dispnv50/disp.h +f:drivers/gpu/drm/nouveau/dispnv50/handles.h +f:drivers/gpu/drm/nouveau/dispnv50/head.c +f:drivers/gpu/drm/nouveau/dispnv50/head.h +f:drivers/gpu/drm/nouveau/dispnv50/head507d.c +f:drivers/gpu/drm/nouveau/dispnv50/head827d.c +f:drivers/gpu/drm/nouveau/dispnv50/head907d.c +f:drivers/gpu/drm/nouveau/dispnv50/head917d.c +f:drivers/gpu/drm/nouveau/dispnv50/headc37d.c +f:drivers/gpu/drm/nouveau/dispnv50/headc57d.c +f:drivers/gpu/drm/nouveau/dispnv50/headca7d.c +f:drivers/gpu/drm/nouveau/dispnv50/lut.c +f:drivers/gpu/drm/nouveau/dispnv50/lut.h +f:drivers/gpu/drm/nouveau/dispnv50/oimm.c +f:drivers/gpu/drm/nouveau/dispnv50/oimm.h +f:drivers/gpu/drm/nouveau/dispnv50/oimm507b.c +f:drivers/gpu/drm/nouveau/dispnv50/ovly.c +f:drivers/gpu/drm/nouveau/dispnv50/ovly.h +f:drivers/gpu/drm/nouveau/dispnv50/ovly507e.c +f:drivers/gpu/drm/nouveau/dispnv50/ovly827e.c +f:drivers/gpu/drm/nouveau/dispnv50/ovly907e.c +f:drivers/gpu/drm/nouveau/dispnv50/ovly917e.c +f:drivers/gpu/drm/nouveau/dispnv50/pior507d.c +f:drivers/gpu/drm/nouveau/dispnv50/sor507d.c +f:drivers/gpu/drm/nouveau/dispnv50/sor907d.c +f:drivers/gpu/drm/nouveau/dispnv50/sorc37d.c +f:drivers/gpu/drm/nouveau/dispnv50/tile.h +f:drivers/gpu/drm/nouveau/dispnv50/wimm.c +f:drivers/gpu/drm/nouveau/dispnv50/wimm.h +f:drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c +f:drivers/gpu/drm/nouveau/dispnv50/wndw.c +f:drivers/gpu/drm/nouveau/dispnv50/wndw.h +f:drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c +f:drivers/gpu/drm/nouveau/dispnv50/wndwc57e.c +f:drivers/gpu/drm/nouveau/dispnv50/wndwc67e.c +f:drivers/gpu/drm/nouveau/dispnv50/wndwca7e.c +f:drivers/gpu/drm/nouveau/gv100_fence.c +f:drivers/gpu/drm/nouveau/include/dispnv04/i2c/ch7006.h +f:drivers/gpu/drm/nouveau/include/dispnv04/i2c/encoder_i2c.h +f:drivers/gpu/drm/nouveau/include/dispnv04/i2c/sil164.h +f:drivers/gpu/drm/nouveau/include/nvfw/acr.h +f:drivers/gpu/drm/nouveau/include/nvfw/flcn.h +f:drivers/gpu/drm/nouveau/include/nvfw/fw.h +f:drivers/gpu/drm/nouveau/include/nvfw/hs.h +f:drivers/gpu/drm/nouveau/include/nvfw/ls.h +f:drivers/gpu/drm/nouveau/include/nvfw/pmu.h +f:drivers/gpu/drm/nouveau/include/nvfw/sec2.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl0039.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl006c.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl006e.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl176e.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl206e.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl502d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl5039.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl507a.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl507c.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl507d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl507e.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl826f.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl827c.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl827d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl827e.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl837d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl887d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl902d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl9039.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl906f.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl907c.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl907d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl907e.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cl917d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/cla0b5.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clc36f.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clc37a.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clc37b.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clc37d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clc37e.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clc57d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clc57e.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clc97b.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clca7d.h +f:drivers/gpu/drm/nouveau/include/nvhw/class/clca7e.h +f:drivers/gpu/drm/nouveau/include/nvhw/drf.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gb100/dev_hshub_base.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gb10b/dev_fbhub.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gb202/dev_ce.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gb202/dev_therm.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100/dev_falcon_v4.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100/dev_fb.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100/dev_fsp_pri.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100/dev_mmu.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100/dev_riscv_pri.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100/dev_therm.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100/dev_xtl_ep_pri.h +f:drivers/gpu/drm/nouveau/include/nvhw/ref/gh100/pri_nv_xal_ep.h +f:drivers/gpu/drm/nouveau/include/nvif/chan.h +f:drivers/gpu/drm/nouveau/include/nvif/cl0002.h +f:drivers/gpu/drm/nouveau/include/nvif/cl0046.h +f:drivers/gpu/drm/nouveau/include/nvif/cl0080.h +f:drivers/gpu/drm/nouveau/include/nvif/cl9097.h +f:drivers/gpu/drm/nouveau/include/nvif/class.h +f:drivers/gpu/drm/nouveau/include/nvif/clb069.h +f:drivers/gpu/drm/nouveau/include/nvif/client.h +f:drivers/gpu/drm/nouveau/include/nvif/conn.h +f:drivers/gpu/drm/nouveau/include/nvif/device.h +f:drivers/gpu/drm/nouveau/include/nvif/disp.h +f:drivers/gpu/drm/nouveau/include/nvif/driver.h +f:drivers/gpu/drm/nouveau/include/nvif/event.h +f:drivers/gpu/drm/nouveau/include/nvif/fifo.h +f:drivers/gpu/drm/nouveau/include/nvif/head.h +f:drivers/gpu/drm/nouveau/include/nvif/if0000.h +f:drivers/gpu/drm/nouveau/include/nvif/if0001.h +f:drivers/gpu/drm/nouveau/include/nvif/if0004.h +f:drivers/gpu/drm/nouveau/include/nvif/if0005.h +f:drivers/gpu/drm/nouveau/include/nvif/if0008.h +f:drivers/gpu/drm/nouveau/include/nvif/if000a.h +f:drivers/gpu/drm/nouveau/include/nvif/if000b.h +f:drivers/gpu/drm/nouveau/include/nvif/if000c.h +f:drivers/gpu/drm/nouveau/include/nvif/if000d.h +f:drivers/gpu/drm/nouveau/include/nvif/if000e.h +f:drivers/gpu/drm/nouveau/include/nvif/if0010.h +f:drivers/gpu/drm/nouveau/include/nvif/if0011.h +f:drivers/gpu/drm/nouveau/include/nvif/if0012.h +f:drivers/gpu/drm/nouveau/include/nvif/if0013.h +f:drivers/gpu/drm/nouveau/include/nvif/if0014.h +f:drivers/gpu/drm/nouveau/include/nvif/if0020.h +f:drivers/gpu/drm/nouveau/include/nvif/if0021.h +f:drivers/gpu/drm/nouveau/include/nvif/if500b.h +f:drivers/gpu/drm/nouveau/include/nvif/if500d.h +f:drivers/gpu/drm/nouveau/include/nvif/if900b.h +f:drivers/gpu/drm/nouveau/include/nvif/if900d.h +f:drivers/gpu/drm/nouveau/include/nvif/ifb00d.h +f:drivers/gpu/drm/nouveau/include/nvif/ifc00d.h +f:drivers/gpu/drm/nouveau/include/nvif/ioctl.h +f:drivers/gpu/drm/nouveau/include/nvif/log.h +f:drivers/gpu/drm/nouveau/include/nvif/mem.h +f:drivers/gpu/drm/nouveau/include/nvif/mmu.h +f:drivers/gpu/drm/nouveau/include/nvif/object.h +f:drivers/gpu/drm/nouveau/include/nvif/os.h +f:drivers/gpu/drm/nouveau/include/nvif/outp.h +f:drivers/gpu/drm/nouveau/include/nvif/parent.h +f:drivers/gpu/drm/nouveau/include/nvif/printf.h +f:drivers/gpu/drm/nouveau/include/nvif/push.h +f:drivers/gpu/drm/nouveau/include/nvif/push006c.h +f:drivers/gpu/drm/nouveau/include/nvif/push206e.h +f:drivers/gpu/drm/nouveau/include/nvif/push507c.h +f:drivers/gpu/drm/nouveau/include/nvif/push906f.h +f:drivers/gpu/drm/nouveau/include/nvif/pushc37b.h +f:drivers/gpu/drm/nouveau/include/nvif/pushc97b.h +f:drivers/gpu/drm/nouveau/include/nvif/timer.h +f:drivers/gpu/drm/nouveau/include/nvif/unpack.h +f:drivers/gpu/drm/nouveau/include/nvif/user.h +f:drivers/gpu/drm/nouveau/include/nvif/vmm.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/client.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/debug.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/device.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/engine.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/enum.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/event.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/falcon.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/firmware.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/gpuobj.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/intr.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/ioctl.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/layout.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/memory.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/mm.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/object.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/oclass.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/oproxy.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/option.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/os.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/pci.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/ramht.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h +f:drivers/gpu/drm/nouveau/include/nvkm/core/tegra.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/bsp.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/ce.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/cipher.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/disp.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/dma.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/falcon.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/gr.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/mpeg.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/msenc.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/mspdec.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/msppp.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/msvld.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/nvdec.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/nvenc.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/sec.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/sec2.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/sw.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/vic.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/vp.h +f:drivers/gpu/drm/nouveau/include/nvkm/engine/xtensa.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/acr.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bar.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/M0203.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/M0205.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/M0209.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/P0260.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/bit.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/bmp.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/boost.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/conn.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/cstep.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/dcb.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/disp.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/dp.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/extdev.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/fan.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/gpio.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/i2c.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/iccsense.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/image.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/init.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/mxm.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/npde.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/pcir.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/pll.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/pmu.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/power_budget.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/rammap.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/therm.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/timing.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/vmap.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/volt.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/vpstate.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/xpio.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/bus.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/clk.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/devinit.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/fault.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/fsp.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/fuse.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/gpio.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/i2c.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/iccsense.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/instmem.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/ltc.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/mc.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/mxm.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/privring.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/therm.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/vfn.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/vga.h +f:drivers/gpu/drm/nouveau/include/nvkm/subdev/volt.h +f:drivers/gpu/drm/nouveau/include/nvrm/nvtypes.h +f:drivers/gpu/drm/nouveau/nouveau_abi16.c +f:drivers/gpu/drm/nouveau/nouveau_abi16.h +f:drivers/gpu/drm/nouveau/nouveau_acpi.c +f:drivers/gpu/drm/nouveau/nouveau_acpi.h +f:drivers/gpu/drm/nouveau/nouveau_backlight.c +f:drivers/gpu/drm/nouveau/nouveau_bios.c +f:drivers/gpu/drm/nouveau/nouveau_bios.h +f:drivers/gpu/drm/nouveau/nouveau_bo.c +f:drivers/gpu/drm/nouveau/nouveau_bo.h +f:drivers/gpu/drm/nouveau/nouveau_bo0039.c +f:drivers/gpu/drm/nouveau/nouveau_bo5039.c +f:drivers/gpu/drm/nouveau/nouveau_bo74c1.c +f:drivers/gpu/drm/nouveau/nouveau_bo85b5.c +f:drivers/gpu/drm/nouveau/nouveau_bo9039.c +f:drivers/gpu/drm/nouveau/nouveau_bo90b5.c +f:drivers/gpu/drm/nouveau/nouveau_boa0b5.c +f:drivers/gpu/drm/nouveau/nouveau_chan.c +f:drivers/gpu/drm/nouveau/nouveau_chan.h +f:drivers/gpu/drm/nouveau/nouveau_connector.c +f:drivers/gpu/drm/nouveau/nouveau_connector.h +f:drivers/gpu/drm/nouveau/nouveau_crtc.h +f:drivers/gpu/drm/nouveau/nouveau_debugfs.c +f:drivers/gpu/drm/nouveau/nouveau_debugfs.h +f:drivers/gpu/drm/nouveau/nouveau_display.c +f:drivers/gpu/drm/nouveau/nouveau_display.h +f:drivers/gpu/drm/nouveau/nouveau_dma.c +f:drivers/gpu/drm/nouveau/nouveau_dma.h +f:drivers/gpu/drm/nouveau/nouveau_dmem.c +f:drivers/gpu/drm/nouveau/nouveau_dmem.h +f:drivers/gpu/drm/nouveau/nouveau_dp.c +f:drivers/gpu/drm/nouveau/nouveau_drm.c +f:drivers/gpu/drm/nouveau/nouveau_drv.h +f:drivers/gpu/drm/nouveau/nouveau_encoder.h +f:drivers/gpu/drm/nouveau/nouveau_exec.c +f:drivers/gpu/drm/nouveau/nouveau_exec.h +f:drivers/gpu/drm/nouveau/nouveau_fence.c +f:drivers/gpu/drm/nouveau/nouveau_fence.h +f:drivers/gpu/drm/nouveau/nouveau_gem.c +f:drivers/gpu/drm/nouveau/nouveau_gem.h +f:drivers/gpu/drm/nouveau/nouveau_hwmon.c +f:drivers/gpu/drm/nouveau/nouveau_hwmon.h +f:drivers/gpu/drm/nouveau/nouveau_ioc32.c +f:drivers/gpu/drm/nouveau/nouveau_ioctl.h +f:drivers/gpu/drm/nouveau/nouveau_led.c +f:drivers/gpu/drm/nouveau/nouveau_led.h +f:drivers/gpu/drm/nouveau/nouveau_mem.c +f:drivers/gpu/drm/nouveau/nouveau_mem.h +f:drivers/gpu/drm/nouveau/nouveau_nvif.c +f:drivers/gpu/drm/nouveau/nouveau_platform.c +f:drivers/gpu/drm/nouveau/nouveau_platform.h +f:drivers/gpu/drm/nouveau/nouveau_prime.c +f:drivers/gpu/drm/nouveau/nouveau_reg.h +f:drivers/gpu/drm/nouveau/nouveau_sched.c +f:drivers/gpu/drm/nouveau/nouveau_sched.h +f:drivers/gpu/drm/nouveau/nouveau_sgdma.c +f:drivers/gpu/drm/nouveau/nouveau_svm.c +f:drivers/gpu/drm/nouveau/nouveau_svm.h +f:drivers/gpu/drm/nouveau/nouveau_ttm.c +f:drivers/gpu/drm/nouveau/nouveau_ttm.h +f:drivers/gpu/drm/nouveau/nouveau_uvmm.c +f:drivers/gpu/drm/nouveau/nouveau_uvmm.h +f:drivers/gpu/drm/nouveau/nouveau_vga.c +f:drivers/gpu/drm/nouveau/nouveau_vga.h +f:drivers/gpu/drm/nouveau/nouveau_vmm.c +f:drivers/gpu/drm/nouveau/nouveau_vmm.h +f:drivers/gpu/drm/nouveau/nv04_fence.c +f:drivers/gpu/drm/nouveau/nv10_fence.c +f:drivers/gpu/drm/nouveau/nv10_fence.h +f:drivers/gpu/drm/nouveau/nv17_fence.c +f:drivers/gpu/drm/nouveau/nv50_display.h +f:drivers/gpu/drm/nouveau/nv50_fence.c +f:drivers/gpu/drm/nouveau/nv84_fence.c +f:drivers/gpu/drm/nouveau/nvc0_fence.c +f:drivers/gpu/drm/nouveau/nvif/Kbuild +f:drivers/gpu/drm/nouveau/nvif/chan.c +f:drivers/gpu/drm/nouveau/nvif/chan506f.c +f:drivers/gpu/drm/nouveau/nvif/chan906f.c +f:drivers/gpu/drm/nouveau/nvif/chanc36f.c +f:drivers/gpu/drm/nouveau/nvif/client.c +f:drivers/gpu/drm/nouveau/nvif/conn.c +f:drivers/gpu/drm/nouveau/nvif/device.c +f:drivers/gpu/drm/nouveau/nvif/disp.c +f:drivers/gpu/drm/nouveau/nvif/driver.c +f:drivers/gpu/drm/nouveau/nvif/event.c +f:drivers/gpu/drm/nouveau/nvif/fifo.c +f:drivers/gpu/drm/nouveau/nvif/head.c +f:drivers/gpu/drm/nouveau/nvif/mem.c +f:drivers/gpu/drm/nouveau/nvif/mmu.c +f:drivers/gpu/drm/nouveau/nvif/object.c +f:drivers/gpu/drm/nouveau/nvif/outp.c +f:drivers/gpu/drm/nouveau/nvif/timer.c +f:drivers/gpu/drm/nouveau/nvif/user.c +f:drivers/gpu/drm/nouveau/nvif/userc361.c +f:drivers/gpu/drm/nouveau/nvif/vmm.c +f:drivers/gpu/drm/nouveau/nvkm/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/core/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/core/client.c +f:drivers/gpu/drm/nouveau/nvkm/core/engine.c +f:drivers/gpu/drm/nouveau/nvkm/core/enum.c +f:drivers/gpu/drm/nouveau/nvkm/core/event.c +f:drivers/gpu/drm/nouveau/nvkm/core/firmware.c +f:drivers/gpu/drm/nouveau/nvkm/core/gpuobj.c +f:drivers/gpu/drm/nouveau/nvkm/core/intr.c +f:drivers/gpu/drm/nouveau/nvkm/core/ioctl.c +f:drivers/gpu/drm/nouveau/nvkm/core/memory.c +f:drivers/gpu/drm/nouveau/nvkm/core/mm.c +f:drivers/gpu/drm/nouveau/nvkm/core/object.c +f:drivers/gpu/drm/nouveau/nvkm/core/oproxy.c +f:drivers/gpu/drm/nouveau/nvkm/core/option.c +f:drivers/gpu/drm/nouveau/nvkm/core/ramht.c +f:drivers/gpu/drm/nouveau/nvkm/core/subdev.c +f:drivers/gpu/drm/nouveau/nvkm/core/uevent.c +f:drivers/gpu/drm/nouveau/nvkm/engine/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/bsp/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/fuc/com.fuc +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/fuc/gf100.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/fuc/gf100.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/fuc/gt215.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/fuc/gt215.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gb202.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/ce/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/cipher/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/cipher/g84.c +f:drivers/gpu/drm/nouveau/nvkm/engine/device/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/device/acpi.c +f:drivers/gpu/drm/nouveau/nvkm/engine/device/acpi.h +f:drivers/gpu/drm/nouveau/nvkm/engine/device/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c +f:drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.h +f:drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c +f:drivers/gpu/drm/nouveau/nvkm/engine/device/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c +f:drivers/gpu/drm/nouveau/nvkm/engine/device/user.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/chan.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/chan.h +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/conn.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/conn.h +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/g84.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/g94.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gk110.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gt200.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmi.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmi.h +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/head.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/head.h +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.h +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp77.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp89.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.h +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/udisp.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/uhead.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c +f:drivers/gpu/drm/nouveau/nvkm/engine/disp/vga.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/gf119.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/user.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/user.h +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/usergf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/usergf119.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/usergv100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/usernv04.c +f:drivers/gpu/drm/nouveau/nvkm/engine/dma/usernv50.c +f:drivers/gpu/drm/nouveau/nvkm/engine/falcon.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/cgrp.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/cgrp.h +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/chid.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/chid.h +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/g98.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gb202.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk208.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/regsnv04.h +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.h +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/runq.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/runq.h +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/ucgrp.c +f:drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxga102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf108.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf110.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf117.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf119.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk20a.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm200.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm20b.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgv100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv40.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv40.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxnv50.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxtu102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/com.fuc +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpc.fuc +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgf100.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgf100.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgf117.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgf117.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk104.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk104.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk110.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk110.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk208.fuc5 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk208.fuc5.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgm107.fuc5 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgm107.fuc5.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hub.fuc +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgf100.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgf100.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgf117.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgf117.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk104.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk104.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk110.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk110.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk208.fuc5 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk208.fuc5.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgm107.fuc5 +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgm107.fuc5.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/macros.fuc +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/os.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/g84.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gf104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gf108.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gf110.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gf117.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gf119.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gm20b.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gp104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gp107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gp108.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gt200.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/mcp79.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/mcp89.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv15.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv17.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv25.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv2a.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv35.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv44.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/regs.h +f:drivers/gpu/drm/nouveau/nvkm/engine/gr/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mpeg/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/mpeg/g84.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.h +f:drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mpeg/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/msenc/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/mspdec/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/mspdec/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mspdec/g98.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mspdec/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mspdec/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mspdec/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/engine/mspdec/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/msppp/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/msppp/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msppp/g98.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msppp/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msppp/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msppp/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/msvld/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/msvld/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msvld/g98.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msvld/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msvld/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msvld/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msvld/mcp89.c +f:drivers/gpu/drm/nouveau/nvkm/engine/msvld/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/nvdec/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/nvdec/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/nvdec/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/nvdec/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/nvdec/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/nvdec/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/nvenc/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/nvenc/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/nvenc/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/engine/nvenc/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/nvenc/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sec/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/sec/fuc/g98.fuc0s +f:drivers/gpu/drm/nouveau/nvkm/engine/sec/fuc/g98.fuc0s.h +f:drivers/gpu/drm/nouveau/nvkm/engine/sec/g98.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sec2/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/sec2/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sec2/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp108.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sec2/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/sec2/r535.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sec2/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/base.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/chan.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/chan.h +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/nv10.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/nv50.h +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/nvsw.c +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/nvsw.h +f:drivers/gpu/drm/nouveau/nvkm/engine/sw/priv.h +f:drivers/gpu/drm/nouveau/nvkm/engine/vic/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/vp/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/engine/vp/g84.c +f:drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/falcon/base.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/cmdq.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/fw.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/msgq.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/priv.h +f:drivers/gpu/drm/nouveau/nvkm/falcon/qmgr.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/qmgr.h +f:drivers/gpu/drm/nouveau/nvkm/falcon/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/falcon/v1.c +f:drivers/gpu/drm/nouveau/nvkm/nvfw/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/nvfw/acr.c +f:drivers/gpu/drm/nouveau/nvkm/nvfw/flcn.c +f:drivers/gpu/drm/nouveau/nvkm/nvfw/fw.c +f:drivers/gpu/drm/nouveau/nvkm/nvfw/hs.c +f:drivers/gpu/drm/nouveau/nvkm/nvfw/ls.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm20b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp108.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/lsfw.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/acr/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/g84.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/gm20b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/bar/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/M0203.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/M0205.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/M0209.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/P0260.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/bit.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/boost.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/conn.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/cstep.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/dcb.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/disp.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/dp.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/extdev.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/fan.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/gpio.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/i2c.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/iccsense.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/image.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/mxm.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/npde.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/pcir.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/pll.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/pmu.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/power_budget.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/ramcfg.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowacpi.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowof.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowpci.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowramin.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowrom.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/therm.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/vmap.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/volt.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/vpstate.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bios/xpio.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/g94.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/hwsq.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/hwsq.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv31.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/bus/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/g84.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/gm20b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/gt215.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/mcp77.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv50.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/pll.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/pllgt215.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/pllnv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/clk/seq.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/fbmem.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/g84.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/g98.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/mcp89.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv04.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv05.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv10.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv1a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv20.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv50.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/r535.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/devinit/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fault/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fault/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fault/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fault/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fault/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fault/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fault/user.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/g84.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gb100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gb202.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr5.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf100.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf108.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gh100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk104.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk110.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm20b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/mcp77.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/mcp89.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv10.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv1a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv20.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv25.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv30.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv35.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv36.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv41.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv44.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv46.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv47.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv49.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv4e.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv50.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/r535.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramfuc.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf108.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgm107.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgp102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/rammcp77.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv10.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv1a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv20.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv40.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv40.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv41.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv44.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv49.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv4e.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramseq.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/regsnv04.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/sddr2.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/sddr3.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fb/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fsp/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/fsp/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fsp/gb100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fsp/gb202.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fsp/gh100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fsp/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/fuse/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/fuse/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fuse/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fuse/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fuse/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/fuse/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/g94.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/gf119.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/nv10.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gpio/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ad102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/gb100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/gb202.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/gh100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/ad10x.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/client.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/engine.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/engine.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/ga1xx.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/gb10x.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/gb20x.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/gh100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/gpu.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/gr.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/gr.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/handles.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/nvdec.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/nvenc.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/alloc.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/bar.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/ce.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/client.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/ctrl.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/device.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fbsr.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fifo.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gr.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvdec.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvenc.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvjpg.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/alloc.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/bar.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/ce.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/client.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/ctrl.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/device.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/disp.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/engine.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/event.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/fbsr.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/fifo.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/gr.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/gsp.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/msgfn.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/nvdec.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/nvenc.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/nvjpg.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/ofa.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/rpcfn.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/nvrm/vmm.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/ofa.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/rm.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/rpc.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/vmm.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/client.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/disp.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fbsr.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fifo.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gr.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/client.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/disp.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/engine.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/fbsr.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/fifo.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/gr.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/gsp.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/msgfn.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/ofa.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/rpcfn.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/ofa.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/rm.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rpc.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/tu1xx.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu116.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/anx9805.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxch.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxch.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxg94.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgf119.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bit.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/busgf119.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/busnv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/busnv4e.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/busnv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/g94.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gf117.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gf119.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gk110.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv4e.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/pad.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/pad.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padg94.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padgf119.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padgm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padnv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padnv4e.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padnv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/instmem/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/instmem/gh100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/instmem/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/instmem/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/ga102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/ltc/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/g84.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/g98.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv11.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv17.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv44.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mc/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/g84.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gh100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/mcp77.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/mem.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/mem.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/memgf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/memnv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/memnv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv44.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/umem.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/umem.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/uvmm.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/uvmm.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgh100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgm20b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmmcp77.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv41.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv44.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mxm/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/mxm/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mxm/mxms.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mxm/mxms.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/mxm/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/mxm/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/agp.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/agp.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/g84.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/g92.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/g94.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/gf106.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/gh100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv46.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv4c.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/arith.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/gf119.fuc4 +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/gf119.fuc4.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/gk208.fuc5 +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/gk208.fuc5.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3 +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/host.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/i2c_.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/idle.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/kernel.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/macros.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/memx.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/os.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/perf.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/fuc/test.fuc +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf119.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk110.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk208.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/pmu/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/privring/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf117.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/privring/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/privring/gp10b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/privring/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/fan.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/fannil.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/fanpwm.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/fantog.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/g84.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gf100.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gf119.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gk104.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gm107.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gm200.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gp100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/gt215.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/ic.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/nv50.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/therm/temp.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/timer/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/timer/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv04.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv41.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/timer/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/timer/regsnv04.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/top/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/top/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/top/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/vfn/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/vfn/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/vfn/ga100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/vfn/gv100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/vfn/priv.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/vfn/r535.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/vfn/tu102.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/vfn/uvfn.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/Kbuild +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/base.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/gf100.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/gf117.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk104.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk20a.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk20a.h +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/gm20b.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/gpio.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/nv40.c +f:drivers/gpu/drm/nouveau/nvkm/subdev/volt/priv.h +f:drivers/gpu/drm/nova/Kconfig +f:drivers/gpu/drm/nova/Makefile +f:drivers/gpu/drm/nova/driver.rs +f:drivers/gpu/drm/nova/file.rs +f:drivers/gpu/drm/nova/gem.rs +f:drivers/gpu/drm/nova/nova.rs +f:drivers/gpu/drm/nova/uapi.rs +f:drivers/gpu/drm/omapdrm/Kconfig +f:drivers/gpu/drm/omapdrm/Makefile +f:drivers/gpu/drm/omapdrm/TODO +f:drivers/gpu/drm/omapdrm/dss/base.c +f:drivers/gpu/drm/omapdrm/dss/dispc.c +f:drivers/gpu/drm/omapdrm/dss/dispc.h +f:drivers/gpu/drm/omapdrm/dss/dispc_coefs.c +f:drivers/gpu/drm/omapdrm/dss/dpi.c +f:drivers/gpu/drm/omapdrm/dss/dsi.c +f:drivers/gpu/drm/omapdrm/dss/dsi.h +f:drivers/gpu/drm/omapdrm/dss/dss.c +f:drivers/gpu/drm/omapdrm/dss/dss.h +f:drivers/gpu/drm/omapdrm/dss/hdmi.h +f:drivers/gpu/drm/omapdrm/dss/hdmi4.c +f:drivers/gpu/drm/omapdrm/dss/hdmi4_cec.c +f:drivers/gpu/drm/omapdrm/dss/hdmi4_cec.h +f:drivers/gpu/drm/omapdrm/dss/hdmi4_core.c +f:drivers/gpu/drm/omapdrm/dss/hdmi4_core.h +f:drivers/gpu/drm/omapdrm/dss/hdmi5.c +f:drivers/gpu/drm/omapdrm/dss/hdmi5_core.c +f:drivers/gpu/drm/omapdrm/dss/hdmi5_core.h +f:drivers/gpu/drm/omapdrm/dss/hdmi_common.c +f:drivers/gpu/drm/omapdrm/dss/hdmi_phy.c +f:drivers/gpu/drm/omapdrm/dss/hdmi_pll.c +f:drivers/gpu/drm/omapdrm/dss/hdmi_wp.c +f:drivers/gpu/drm/omapdrm/dss/omapdss.h +f:drivers/gpu/drm/omapdrm/dss/output.c +f:drivers/gpu/drm/omapdrm/dss/pll.c +f:drivers/gpu/drm/omapdrm/dss/sdi.c +f:drivers/gpu/drm/omapdrm/dss/venc.c +f:drivers/gpu/drm/omapdrm/dss/video-pll.c +f:drivers/gpu/drm/omapdrm/omap_crtc.c +f:drivers/gpu/drm/omapdrm/omap_crtc.h +f:drivers/gpu/drm/omapdrm/omap_debugfs.c +f:drivers/gpu/drm/omapdrm/omap_dmm_priv.h +f:drivers/gpu/drm/omapdrm/omap_dmm_tiler.c +f:drivers/gpu/drm/omapdrm/omap_dmm_tiler.h +f:drivers/gpu/drm/omapdrm/omap_drv.c +f:drivers/gpu/drm/omapdrm/omap_drv.h +f:drivers/gpu/drm/omapdrm/omap_encoder.c +f:drivers/gpu/drm/omapdrm/omap_encoder.h +f:drivers/gpu/drm/omapdrm/omap_fb.c +f:drivers/gpu/drm/omapdrm/omap_fb.h +f:drivers/gpu/drm/omapdrm/omap_fbdev.c +f:drivers/gpu/drm/omapdrm/omap_fbdev.h +f:drivers/gpu/drm/omapdrm/omap_gem.c +f:drivers/gpu/drm/omapdrm/omap_gem.h +f:drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c +f:drivers/gpu/drm/omapdrm/omap_irq.c +f:drivers/gpu/drm/omapdrm/omap_irq.h +f:drivers/gpu/drm/omapdrm/omap_overlay.c +f:drivers/gpu/drm/omapdrm/omap_overlay.h +f:drivers/gpu/drm/omapdrm/omap_plane.c +f:drivers/gpu/drm/omapdrm/omap_plane.h +f:drivers/gpu/drm/omapdrm/tcm-sita.c +f:drivers/gpu/drm/omapdrm/tcm.h +f:drivers/gpu/drm/panel/Kconfig +f:drivers/gpu/drm/panel/Makefile +f:drivers/gpu/drm/panel/panel-abt-y030xx067a.c +f:drivers/gpu/drm/panel/panel-arm-versatile.c +f:drivers/gpu/drm/panel/panel-asus-z00t-tm5p5-n35596.c +f:drivers/gpu/drm/panel/panel-auo-a030jtn01.c +f:drivers/gpu/drm/panel/panel-boe-bf060y8m-aj0.c +f:drivers/gpu/drm/panel/panel-boe-himax8279d.c +f:drivers/gpu/drm/panel/panel-boe-td4320.c +f:drivers/gpu/drm/panel/panel-boe-th101mb31ig002-28a.c +f:drivers/gpu/drm/panel/panel-boe-tv101wum-ll2.c +f:drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c +f:drivers/gpu/drm/panel/panel-dsi-cm.c +f:drivers/gpu/drm/panel/panel-ebbg-ft8719.c +f:drivers/gpu/drm/panel/panel-edp.c +f:drivers/gpu/drm/panel/panel-elida-kd35t133.c +f:drivers/gpu/drm/panel/panel-feixin-k101-im2ba02.c +f:drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c +f:drivers/gpu/drm/panel/panel-himax-hx8279.c +f:drivers/gpu/drm/panel/panel-himax-hx83102.c +f:drivers/gpu/drm/panel/panel-himax-hx83112a.c +f:drivers/gpu/drm/panel/panel-himax-hx83112b.c +f:drivers/gpu/drm/panel/panel-himax-hx8394.c +f:drivers/gpu/drm/panel/panel-ilitek-ili9322.c +f:drivers/gpu/drm/panel/panel-ilitek-ili9341.c +f:drivers/gpu/drm/panel/panel-ilitek-ili9805.c +f:drivers/gpu/drm/panel/panel-ilitek-ili9806e.c +f:drivers/gpu/drm/panel/panel-ilitek-ili9881c.c +f:drivers/gpu/drm/panel/panel-ilitek-ili9882t.c +f:drivers/gpu/drm/panel/panel-innolux-ej030na.c +f:drivers/gpu/drm/panel/panel-innolux-p079zca.c +f:drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c +f:drivers/gpu/drm/panel/panel-jdi-fhd-r63452.c +f:drivers/gpu/drm/panel/panel-jdi-lpm102a188a.c +f:drivers/gpu/drm/panel/panel-jdi-lt070me05000.c +f:drivers/gpu/drm/panel/panel-khadas-ts050.c +f:drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c +f:drivers/gpu/drm/panel/panel-leadtek-ltk050h3146w.c +f:drivers/gpu/drm/panel/panel-leadtek-ltk500hd1829.c +f:drivers/gpu/drm/panel/panel-lg-lb035q02.c +f:drivers/gpu/drm/panel/panel-lg-lg4573.c +f:drivers/gpu/drm/panel/panel-lg-sw43408.c +f:drivers/gpu/drm/panel/panel-lincolntech-lcd197.c +f:drivers/gpu/drm/panel/panel-lvds.c +f:drivers/gpu/drm/panel/panel-magnachip-d53e6ea8966.c +f:drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c +f:drivers/gpu/drm/panel/panel-nec-nl8048hl11.c +f:drivers/gpu/drm/panel/panel-newvision-nv3051d.c +f:drivers/gpu/drm/panel/panel-newvision-nv3052c.c +f:drivers/gpu/drm/panel/panel-novatek-nt35510.c +f:drivers/gpu/drm/panel/panel-novatek-nt35560.c +f:drivers/gpu/drm/panel/panel-novatek-nt35950.c +f:drivers/gpu/drm/panel/panel-novatek-nt36523.c +f:drivers/gpu/drm/panel/panel-novatek-nt36672a.c +f:drivers/gpu/drm/panel/panel-novatek-nt36672e.c +f:drivers/gpu/drm/panel/panel-novatek-nt37801.c +f:drivers/gpu/drm/panel/panel-novatek-nt39016.c +f:drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c +f:drivers/gpu/drm/panel/panel-orisetech-ota5601a.c +f:drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +f:drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c +f:drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c +f:drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +f:drivers/gpu/drm/panel/panel-raydium-rm67191.c +f:drivers/gpu/drm/panel/panel-raydium-rm67200.c +f:drivers/gpu/drm/panel/panel-raydium-rm68200.c +f:drivers/gpu/drm/panel/panel-raydium-rm692e5.c +f:drivers/gpu/drm/panel/panel-raydium-rm69380.c +f:drivers/gpu/drm/panel/panel-renesas-r61307.c +f:drivers/gpu/drm/panel/panel-renesas-r69328.c +f:drivers/gpu/drm/panel/panel-ronbo-rb070d30.c +f:drivers/gpu/drm/panel/panel-samsung-ams581vf01.c +f:drivers/gpu/drm/panel/panel-samsung-ams639rq08.c +f:drivers/gpu/drm/panel/panel-samsung-atna33xc20.c +f:drivers/gpu/drm/panel/panel-samsung-db7430.c +f:drivers/gpu/drm/panel/panel-samsung-ld9040.c +f:drivers/gpu/drm/panel/panel-samsung-s6d16d0.c +f:drivers/gpu/drm/panel/panel-samsung-s6d27a1.c +f:drivers/gpu/drm/panel/panel-samsung-s6d7aa0.c +f:drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c +f:drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c +f:drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c +f:drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c +f:drivers/gpu/drm/panel/panel-samsung-s6e63m0-dsi.c +f:drivers/gpu/drm/panel/panel-samsung-s6e63m0-spi.c +f:drivers/gpu/drm/panel/panel-samsung-s6e63m0.c +f:drivers/gpu/drm/panel/panel-samsung-s6e63m0.h +f:drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +f:drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams452ef01.c +f:drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c +f:drivers/gpu/drm/panel/panel-samsung-sofef00.c +f:drivers/gpu/drm/panel/panel-seiko-43wvf1g.c +f:drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c +f:drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c +f:drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c +f:drivers/gpu/drm/panel/panel-sharp-ls060t1sx01.c +f:drivers/gpu/drm/panel/panel-simple.c +f:drivers/gpu/drm/panel/panel-sitronix-st7701.c +f:drivers/gpu/drm/panel/panel-sitronix-st7703.c +f:drivers/gpu/drm/panel/panel-sitronix-st7789v.c +f:drivers/gpu/drm/panel/panel-sony-acx565akm.c +f:drivers/gpu/drm/panel/panel-sony-td4353-jdi.c +f:drivers/gpu/drm/panel/panel-sony-tulip-truly-nt35521.c +f:drivers/gpu/drm/panel/panel-startek-kd070fhfid015.c +f:drivers/gpu/drm/panel/panel-summit.c +f:drivers/gpu/drm/panel/panel-synaptics-r63353.c +f:drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c +f:drivers/gpu/drm/panel/panel-tpo-td028ttec1.c +f:drivers/gpu/drm/panel/panel-tpo-td043mtea1.c +f:drivers/gpu/drm/panel/panel-tpo-tpg110.c +f:drivers/gpu/drm/panel/panel-truly-nt35597.c +f:drivers/gpu/drm/panel/panel-visionox-g2647fb105.c +f:drivers/gpu/drm/panel/panel-visionox-r66451.c +f:drivers/gpu/drm/panel/panel-visionox-rm69299.c +f:drivers/gpu/drm/panel/panel-visionox-rm692e5.c +f:drivers/gpu/drm/panel/panel-visionox-vtdr6130.c +f:drivers/gpu/drm/panel/panel-widechips-ws2401.c +f:drivers/gpu/drm/panel/panel-xinpeng-xpp055c272.c +f:drivers/gpu/drm/panfrost/Kconfig +f:drivers/gpu/drm/panfrost/Makefile +f:drivers/gpu/drm/panfrost/TODO +f:drivers/gpu/drm/panfrost/panfrost_devfreq.c +f:drivers/gpu/drm/panfrost/panfrost_devfreq.h +f:drivers/gpu/drm/panfrost/panfrost_device.c +f:drivers/gpu/drm/panfrost/panfrost_device.h +f:drivers/gpu/drm/panfrost/panfrost_drv.c +f:drivers/gpu/drm/panfrost/panfrost_dump.c +f:drivers/gpu/drm/panfrost/panfrost_dump.h +f:drivers/gpu/drm/panfrost/panfrost_features.h +f:drivers/gpu/drm/panfrost/panfrost_gem.c +f:drivers/gpu/drm/panfrost/panfrost_gem.h +f:drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c +f:drivers/gpu/drm/panfrost/panfrost_gpu.c +f:drivers/gpu/drm/panfrost/panfrost_gpu.h +f:drivers/gpu/drm/panfrost/panfrost_issues.h +f:drivers/gpu/drm/panfrost/panfrost_job.c +f:drivers/gpu/drm/panfrost/panfrost_job.h +f:drivers/gpu/drm/panfrost/panfrost_mmu.c +f:drivers/gpu/drm/panfrost/panfrost_mmu.h +f:drivers/gpu/drm/panfrost/panfrost_perfcnt.c +f:drivers/gpu/drm/panfrost/panfrost_perfcnt.h +f:drivers/gpu/drm/panfrost/panfrost_regs.h +f:drivers/gpu/drm/panthor/Kconfig +f:drivers/gpu/drm/panthor/Makefile +f:drivers/gpu/drm/panthor/panthor_devfreq.c +f:drivers/gpu/drm/panthor/panthor_devfreq.h +f:drivers/gpu/drm/panthor/panthor_device.c +f:drivers/gpu/drm/panthor/panthor_device.h +f:drivers/gpu/drm/panthor/panthor_drv.c +f:drivers/gpu/drm/panthor/panthor_fw.c +f:drivers/gpu/drm/panthor/panthor_fw.h +f:drivers/gpu/drm/panthor/panthor_gem.c +f:drivers/gpu/drm/panthor/panthor_gem.h +f:drivers/gpu/drm/panthor/panthor_gpu.c +f:drivers/gpu/drm/panthor/panthor_gpu.h +f:drivers/gpu/drm/panthor/panthor_heap.c +f:drivers/gpu/drm/panthor/panthor_heap.h +f:drivers/gpu/drm/panthor/panthor_mmu.c +f:drivers/gpu/drm/panthor/panthor_mmu.h +f:drivers/gpu/drm/panthor/panthor_regs.h +f:drivers/gpu/drm/panthor/panthor_sched.c +f:drivers/gpu/drm/panthor/panthor_sched.h +f:drivers/gpu/drm/pl111/Kconfig +f:drivers/gpu/drm/pl111/Makefile +f:drivers/gpu/drm/pl111/pl111_debugfs.c +f:drivers/gpu/drm/pl111/pl111_display.c +f:drivers/gpu/drm/pl111/pl111_drm.h +f:drivers/gpu/drm/pl111/pl111_drv.c +f:drivers/gpu/drm/pl111/pl111_nomadik.c +f:drivers/gpu/drm/pl111/pl111_nomadik.h +f:drivers/gpu/drm/pl111/pl111_versatile.c +f:drivers/gpu/drm/pl111/pl111_versatile.h +f:drivers/gpu/drm/qxl/Kconfig +f:drivers/gpu/drm/qxl/Makefile +f:drivers/gpu/drm/qxl/qxl_cmd.c +f:drivers/gpu/drm/qxl/qxl_debugfs.c +f:drivers/gpu/drm/qxl/qxl_dev.h +f:drivers/gpu/drm/qxl/qxl_display.c +f:drivers/gpu/drm/qxl/qxl_draw.c +f:drivers/gpu/drm/qxl/qxl_drv.c +f:drivers/gpu/drm/qxl/qxl_drv.h +f:drivers/gpu/drm/qxl/qxl_dumb.c +f:drivers/gpu/drm/qxl/qxl_gem.c +f:drivers/gpu/drm/qxl/qxl_image.c +f:drivers/gpu/drm/qxl/qxl_ioctl.c +f:drivers/gpu/drm/qxl/qxl_irq.c +f:drivers/gpu/drm/qxl/qxl_kms.c +f:drivers/gpu/drm/qxl/qxl_object.c +f:drivers/gpu/drm/qxl/qxl_object.h +f:drivers/gpu/drm/qxl/qxl_prime.c +f:drivers/gpu/drm/qxl/qxl_release.c +f:drivers/gpu/drm/qxl/qxl_ttm.c +f:drivers/gpu/drm/radeon/.gitignore +f:drivers/gpu/drm/radeon/Kconfig +f:drivers/gpu/drm/radeon/Makefile +f:drivers/gpu/drm/radeon/ObjectID.h +f:drivers/gpu/drm/radeon/atom-bits.h +f:drivers/gpu/drm/radeon/atom-names.h +f:drivers/gpu/drm/radeon/atom-types.h +f:drivers/gpu/drm/radeon/atom.c +f:drivers/gpu/drm/radeon/atom.h +f:drivers/gpu/drm/radeon/atombios.h +f:drivers/gpu/drm/radeon/atombios_crtc.c +f:drivers/gpu/drm/radeon/atombios_dp.c +f:drivers/gpu/drm/radeon/atombios_encoders.c +f:drivers/gpu/drm/radeon/atombios_i2c.c +f:drivers/gpu/drm/radeon/avivod.h +f:drivers/gpu/drm/radeon/btc_dpm.c +f:drivers/gpu/drm/radeon/btc_dpm.h +f:drivers/gpu/drm/radeon/btcd.h +f:drivers/gpu/drm/radeon/cayman_blit_shaders.h +f:drivers/gpu/drm/radeon/ci_dpm.c +f:drivers/gpu/drm/radeon/ci_dpm.h +f:drivers/gpu/drm/radeon/ci_smc.c +f:drivers/gpu/drm/radeon/cik.c +f:drivers/gpu/drm/radeon/cik.h +f:drivers/gpu/drm/radeon/cik_blit_shaders.h +f:drivers/gpu/drm/radeon/cik_reg.h +f:drivers/gpu/drm/radeon/cik_sdma.c +f:drivers/gpu/drm/radeon/cikd.h +f:drivers/gpu/drm/radeon/clearstate_cayman.h +f:drivers/gpu/drm/radeon/clearstate_ci.h +f:drivers/gpu/drm/radeon/clearstate_defs.h +f:drivers/gpu/drm/radeon/clearstate_evergreen.h +f:drivers/gpu/drm/radeon/clearstate_si.h +f:drivers/gpu/drm/radeon/cypress_dpm.c +f:drivers/gpu/drm/radeon/cypress_dpm.h +f:drivers/gpu/drm/radeon/dce3_1_afmt.c +f:drivers/gpu/drm/radeon/dce6_afmt.c +f:drivers/gpu/drm/radeon/dce6_afmt.h +f:drivers/gpu/drm/radeon/evergreen.c +f:drivers/gpu/drm/radeon/evergreen.h +f:drivers/gpu/drm/radeon/evergreen_blit_shaders.h +f:drivers/gpu/drm/radeon/evergreen_cs.c +f:drivers/gpu/drm/radeon/evergreen_dma.c +f:drivers/gpu/drm/radeon/evergreen_hdmi.c +f:drivers/gpu/drm/radeon/evergreen_hdmi.h +f:drivers/gpu/drm/radeon/evergreen_reg.h +f:drivers/gpu/drm/radeon/evergreen_smc.h +f:drivers/gpu/drm/radeon/evergreend.h +f:drivers/gpu/drm/radeon/kv_dpm.c +f:drivers/gpu/drm/radeon/kv_dpm.h +f:drivers/gpu/drm/radeon/kv_smc.c +f:drivers/gpu/drm/radeon/mkregtable.c +f:drivers/gpu/drm/radeon/ni.c +f:drivers/gpu/drm/radeon/ni.h +f:drivers/gpu/drm/radeon/ni_dma.c +f:drivers/gpu/drm/radeon/ni_dpm.c +f:drivers/gpu/drm/radeon/ni_dpm.h +f:drivers/gpu/drm/radeon/ni_reg.h +f:drivers/gpu/drm/radeon/nid.h +f:drivers/gpu/drm/radeon/nislands_smc.h +f:drivers/gpu/drm/radeon/ppsmc.h +f:drivers/gpu/drm/radeon/pptable.h +f:drivers/gpu/drm/radeon/r100.c +f:drivers/gpu/drm/radeon/r100_track.h +f:drivers/gpu/drm/radeon/r100d.h +f:drivers/gpu/drm/radeon/r200.c +f:drivers/gpu/drm/radeon/r300.c +f:drivers/gpu/drm/radeon/r300_reg.h +f:drivers/gpu/drm/radeon/r300d.h +f:drivers/gpu/drm/radeon/r420.c +f:drivers/gpu/drm/radeon/r420d.h +f:drivers/gpu/drm/radeon/r500_reg.h +f:drivers/gpu/drm/radeon/r520.c +f:drivers/gpu/drm/radeon/r520d.h +f:drivers/gpu/drm/radeon/r600.c +f:drivers/gpu/drm/radeon/r600.h +f:drivers/gpu/drm/radeon/r600_cs.c +f:drivers/gpu/drm/radeon/r600_dma.c +f:drivers/gpu/drm/radeon/r600_dpm.c +f:drivers/gpu/drm/radeon/r600_dpm.h +f:drivers/gpu/drm/radeon/r600_hdmi.c +f:drivers/gpu/drm/radeon/r600_reg.h +f:drivers/gpu/drm/radeon/r600d.h +f:drivers/gpu/drm/radeon/radeon.h +f:drivers/gpu/drm/radeon/radeon_acpi.c +f:drivers/gpu/drm/radeon/radeon_acpi.h +f:drivers/gpu/drm/radeon/radeon_agp.c +f:drivers/gpu/drm/radeon/radeon_asic.c +f:drivers/gpu/drm/radeon/radeon_asic.h +f:drivers/gpu/drm/radeon/radeon_atombios.c +f:drivers/gpu/drm/radeon/radeon_atombios.h +f:drivers/gpu/drm/radeon/radeon_atpx_handler.c +f:drivers/gpu/drm/radeon/radeon_audio.c +f:drivers/gpu/drm/radeon/radeon_audio.h +f:drivers/gpu/drm/radeon/radeon_benchmark.c +f:drivers/gpu/drm/radeon/radeon_bios.c +f:drivers/gpu/drm/radeon/radeon_clocks.c +f:drivers/gpu/drm/radeon/radeon_combios.c +f:drivers/gpu/drm/radeon/radeon_connectors.c +f:drivers/gpu/drm/radeon/radeon_cs.c +f:drivers/gpu/drm/radeon/radeon_cursor.c +f:drivers/gpu/drm/radeon/radeon_device.c +f:drivers/gpu/drm/radeon/radeon_device.h +f:drivers/gpu/drm/radeon/radeon_display.c +f:drivers/gpu/drm/radeon/radeon_dp_auxch.c +f:drivers/gpu/drm/radeon/radeon_drv.c +f:drivers/gpu/drm/radeon/radeon_drv.h +f:drivers/gpu/drm/radeon/radeon_encoders.c +f:drivers/gpu/drm/radeon/radeon_family.h +f:drivers/gpu/drm/radeon/radeon_fbdev.c +f:drivers/gpu/drm/radeon/radeon_fence.c +f:drivers/gpu/drm/radeon/radeon_gart.c +f:drivers/gpu/drm/radeon/radeon_gem.c +f:drivers/gpu/drm/radeon/radeon_i2c.c +f:drivers/gpu/drm/radeon/radeon_ib.c +f:drivers/gpu/drm/radeon/radeon_irq_kms.c +f:drivers/gpu/drm/radeon/radeon_kms.c +f:drivers/gpu/drm/radeon/radeon_kms.h +f:drivers/gpu/drm/radeon/radeon_legacy_crtc.c +f:drivers/gpu/drm/radeon/radeon_legacy_encoders.c +f:drivers/gpu/drm/radeon/radeon_legacy_encoders.h +f:drivers/gpu/drm/radeon/radeon_legacy_tv.c +f:drivers/gpu/drm/radeon/radeon_mn.c +f:drivers/gpu/drm/radeon/radeon_mode.h +f:drivers/gpu/drm/radeon/radeon_object.c +f:drivers/gpu/drm/radeon/radeon_object.h +f:drivers/gpu/drm/radeon/radeon_pm.c +f:drivers/gpu/drm/radeon/radeon_pm.h +f:drivers/gpu/drm/radeon/radeon_prime.c +f:drivers/gpu/drm/radeon/radeon_prime.h +f:drivers/gpu/drm/radeon/radeon_reg.h +f:drivers/gpu/drm/radeon/radeon_ring.c +f:drivers/gpu/drm/radeon/radeon_sa.c +f:drivers/gpu/drm/radeon/radeon_semaphore.c +f:drivers/gpu/drm/radeon/radeon_sync.c +f:drivers/gpu/drm/radeon/radeon_test.c +f:drivers/gpu/drm/radeon/radeon_trace.h +f:drivers/gpu/drm/radeon/radeon_trace_points.c +f:drivers/gpu/drm/radeon/radeon_ttm.c +f:drivers/gpu/drm/radeon/radeon_ttm.h +f:drivers/gpu/drm/radeon/radeon_ucode.c +f:drivers/gpu/drm/radeon/radeon_ucode.h +f:drivers/gpu/drm/radeon/radeon_uvd.c +f:drivers/gpu/drm/radeon/radeon_vce.c +f:drivers/gpu/drm/radeon/radeon_vm.c +f:drivers/gpu/drm/radeon/reg_srcs/cayman +f:drivers/gpu/drm/radeon/reg_srcs/evergreen +f:drivers/gpu/drm/radeon/reg_srcs/r100 +f:drivers/gpu/drm/radeon/reg_srcs/r200 +f:drivers/gpu/drm/radeon/reg_srcs/r300 +f:drivers/gpu/drm/radeon/reg_srcs/r420 +f:drivers/gpu/drm/radeon/reg_srcs/r600 +f:drivers/gpu/drm/radeon/reg_srcs/rn50 +f:drivers/gpu/drm/radeon/reg_srcs/rs600 +f:drivers/gpu/drm/radeon/reg_srcs/rv515 +f:drivers/gpu/drm/radeon/rs100d.h +f:drivers/gpu/drm/radeon/rs400.c +f:drivers/gpu/drm/radeon/rs400d.h +f:drivers/gpu/drm/radeon/rs600.c +f:drivers/gpu/drm/radeon/rs600d.h +f:drivers/gpu/drm/radeon/rs690.c +f:drivers/gpu/drm/radeon/rs690d.h +f:drivers/gpu/drm/radeon/rs780_dpm.c +f:drivers/gpu/drm/radeon/rs780_dpm.h +f:drivers/gpu/drm/radeon/rs780d.h +f:drivers/gpu/drm/radeon/rv200d.h +f:drivers/gpu/drm/radeon/rv250d.h +f:drivers/gpu/drm/radeon/rv350d.h +f:drivers/gpu/drm/radeon/rv515.c +f:drivers/gpu/drm/radeon/rv515d.h +f:drivers/gpu/drm/radeon/rv6xx_dpm.c +f:drivers/gpu/drm/radeon/rv6xx_dpm.h +f:drivers/gpu/drm/radeon/rv6xxd.h +f:drivers/gpu/drm/radeon/rv730_dpm.c +f:drivers/gpu/drm/radeon/rv730d.h +f:drivers/gpu/drm/radeon/rv740_dpm.c +f:drivers/gpu/drm/radeon/rv740d.h +f:drivers/gpu/drm/radeon/rv770.c +f:drivers/gpu/drm/radeon/rv770.h +f:drivers/gpu/drm/radeon/rv770_dma.c +f:drivers/gpu/drm/radeon/rv770_dpm.c +f:drivers/gpu/drm/radeon/rv770_dpm.h +f:drivers/gpu/drm/radeon/rv770_smc.c +f:drivers/gpu/drm/radeon/rv770_smc.h +f:drivers/gpu/drm/radeon/rv770d.h +f:drivers/gpu/drm/radeon/si.c +f:drivers/gpu/drm/radeon/si.h +f:drivers/gpu/drm/radeon/si_blit_shaders.h +f:drivers/gpu/drm/radeon/si_dma.c +f:drivers/gpu/drm/radeon/si_dpm.c +f:drivers/gpu/drm/radeon/si_dpm.h +f:drivers/gpu/drm/radeon/si_reg.h +f:drivers/gpu/drm/radeon/si_smc.c +f:drivers/gpu/drm/radeon/sid.h +f:drivers/gpu/drm/radeon/sislands_smc.h +f:drivers/gpu/drm/radeon/smu7.h +f:drivers/gpu/drm/radeon/smu7_discrete.h +f:drivers/gpu/drm/radeon/smu7_fusion.h +f:drivers/gpu/drm/radeon/sumo_dpm.c +f:drivers/gpu/drm/radeon/sumo_dpm.h +f:drivers/gpu/drm/radeon/sumo_smc.c +f:drivers/gpu/drm/radeon/sumod.h +f:drivers/gpu/drm/radeon/trinity_dpm.c +f:drivers/gpu/drm/radeon/trinity_dpm.h +f:drivers/gpu/drm/radeon/trinity_smc.c +f:drivers/gpu/drm/radeon/trinityd.h +f:drivers/gpu/drm/radeon/uvd_v1_0.c +f:drivers/gpu/drm/radeon/uvd_v2_2.c +f:drivers/gpu/drm/radeon/uvd_v3_1.c +f:drivers/gpu/drm/radeon/uvd_v4_2.c +f:drivers/gpu/drm/radeon/vce.h +f:drivers/gpu/drm/radeon/vce_v1_0.c +f:drivers/gpu/drm/radeon/vce_v2_0.c +f:drivers/gpu/drm/renesas/Kconfig +f:drivers/gpu/drm/renesas/Makefile +f:drivers/gpu/drm/renesas/rcar-du/Kconfig +f:drivers/gpu/drm/renesas/rcar-du/Makefile +f:drivers/gpu/drm/renesas/rcar-du/rcar_cmm.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_cmm.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_group.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_group.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_plane.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_plane.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_regs.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_dw_hdmi.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_lvds.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_lvds.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_lvds_regs.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c +f:drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.h +f:drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi_regs.h +f:drivers/gpu/drm/renesas/rz-du/Kconfig +f:drivers/gpu/drm/renesas/rz-du/Makefile +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_crtc.c +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_crtc.h +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_kms.c +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_kms.h +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.c +f:drivers/gpu/drm/renesas/rz-du/rzg2l_du_vsp.h +f:drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c +f:drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi_regs.h +f:drivers/gpu/drm/renesas/shmobile/Kconfig +f:drivers/gpu/drm/renesas/shmobile/Makefile +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.h +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.h +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_kms.c +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_kms.h +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.h +f:drivers/gpu/drm/renesas/shmobile/shmob_drm_regs.h +f:drivers/gpu/drm/rockchip/Kconfig +f:drivers/gpu/drm/rockchip/Makefile +f:drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +f:drivers/gpu/drm/rockchip/cdn-dp-core.c +f:drivers/gpu/drm/rockchip/cdn-dp-core.h +f:drivers/gpu/drm/rockchip/cdn-dp-reg.c +f:drivers/gpu/drm/rockchip/cdn-dp-reg.h +f:drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c +f:drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c +f:drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +f:drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +f:drivers/gpu/drm/rockchip/inno_hdmi.c +f:drivers/gpu/drm/rockchip/rk3066_hdmi.c +f:drivers/gpu/drm/rockchip/rk3066_hdmi.h +f:drivers/gpu/drm/rockchip/rockchip_drm_drv.c +f:drivers/gpu/drm/rockchip/rockchip_drm_drv.h +f:drivers/gpu/drm/rockchip/rockchip_drm_fb.c +f:drivers/gpu/drm/rockchip/rockchip_drm_fb.h +f:drivers/gpu/drm/rockchip/rockchip_drm_gem.c +f:drivers/gpu/drm/rockchip/rockchip_drm_gem.h +f:drivers/gpu/drm/rockchip/rockchip_drm_vop.c +f:drivers/gpu/drm/rockchip/rockchip_drm_vop.h +f:drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +f:drivers/gpu/drm/rockchip/rockchip_drm_vop2.h +f:drivers/gpu/drm/rockchip/rockchip_lvds.c +f:drivers/gpu/drm/rockchip/rockchip_lvds.h +f:drivers/gpu/drm/rockchip/rockchip_rgb.c +f:drivers/gpu/drm/rockchip/rockchip_rgb.h +f:drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +f:drivers/gpu/drm/rockchip/rockchip_vop_reg.c +f:drivers/gpu/drm/rockchip/rockchip_vop_reg.h +f:drivers/gpu/drm/scheduler/.kunitconfig +f:drivers/gpu/drm/scheduler/Makefile +f:drivers/gpu/drm/scheduler/gpu_scheduler_trace.h +f:drivers/gpu/drm/scheduler/sched_entity.c +f:drivers/gpu/drm/scheduler/sched_fence.c +f:drivers/gpu/drm/scheduler/sched_internal.h +f:drivers/gpu/drm/scheduler/sched_main.c +f:drivers/gpu/drm/scheduler/tests/Makefile +f:drivers/gpu/drm/scheduler/tests/mock_scheduler.c +f:drivers/gpu/drm/scheduler/tests/sched_tests.h +f:drivers/gpu/drm/scheduler/tests/tests_basic.c +f:drivers/gpu/drm/sitronix/Kconfig +f:drivers/gpu/drm/sitronix/Makefile +f:drivers/gpu/drm/sitronix/st7571-i2c.c +f:drivers/gpu/drm/sitronix/st7586.c +f:drivers/gpu/drm/sitronix/st7735r.c +f:drivers/gpu/drm/solomon/Kconfig +f:drivers/gpu/drm/solomon/Makefile +f:drivers/gpu/drm/solomon/ssd130x-i2c.c +f:drivers/gpu/drm/solomon/ssd130x-spi.c +f:drivers/gpu/drm/solomon/ssd130x.c +f:drivers/gpu/drm/solomon/ssd130x.h +f:drivers/gpu/drm/sprd/Kconfig +f:drivers/gpu/drm/sprd/Makefile +f:drivers/gpu/drm/sprd/megacores_pll.c +f:drivers/gpu/drm/sprd/sprd_dpu.c +f:drivers/gpu/drm/sprd/sprd_dpu.h +f:drivers/gpu/drm/sprd/sprd_drm.c +f:drivers/gpu/drm/sprd/sprd_drm.h +f:drivers/gpu/drm/sprd/sprd_dsi.c +f:drivers/gpu/drm/sprd/sprd_dsi.h +f:drivers/gpu/drm/sti/Kconfig +f:drivers/gpu/drm/sti/Makefile +f:drivers/gpu/drm/sti/NOTES +f:drivers/gpu/drm/sti/sti_awg_utils.c +f:drivers/gpu/drm/sti/sti_awg_utils.h +f:drivers/gpu/drm/sti/sti_compositor.c +f:drivers/gpu/drm/sti/sti_compositor.h +f:drivers/gpu/drm/sti/sti_crtc.c +f:drivers/gpu/drm/sti/sti_crtc.h +f:drivers/gpu/drm/sti/sti_cursor.c +f:drivers/gpu/drm/sti/sti_cursor.h +f:drivers/gpu/drm/sti/sti_drv.c +f:drivers/gpu/drm/sti/sti_drv.h +f:drivers/gpu/drm/sti/sti_dvo.c +f:drivers/gpu/drm/sti/sti_gdp.c +f:drivers/gpu/drm/sti/sti_gdp.h +f:drivers/gpu/drm/sti/sti_hda.c +f:drivers/gpu/drm/sti/sti_hdmi.c +f:drivers/gpu/drm/sti/sti_hdmi.h +f:drivers/gpu/drm/sti/sti_hdmi_tx3g4c28phy.c +f:drivers/gpu/drm/sti/sti_hdmi_tx3g4c28phy.h +f:drivers/gpu/drm/sti/sti_hqvdp.c +f:drivers/gpu/drm/sti/sti_hqvdp_lut.h +f:drivers/gpu/drm/sti/sti_mixer.c +f:drivers/gpu/drm/sti/sti_mixer.h +f:drivers/gpu/drm/sti/sti_plane.c +f:drivers/gpu/drm/sti/sti_plane.h +f:drivers/gpu/drm/sti/sti_tvout.c +f:drivers/gpu/drm/sti/sti_vid.c +f:drivers/gpu/drm/sti/sti_vid.h +f:drivers/gpu/drm/sti/sti_vtg.c +f:drivers/gpu/drm/sti/sti_vtg.h +f:drivers/gpu/drm/stm/Kconfig +f:drivers/gpu/drm/stm/Makefile +f:drivers/gpu/drm/stm/drv.c +f:drivers/gpu/drm/stm/dw_mipi_dsi-stm.c +f:drivers/gpu/drm/stm/ltdc.c +f:drivers/gpu/drm/stm/ltdc.h +f:drivers/gpu/drm/stm/lvds.c +f:drivers/gpu/drm/sun4i/Kconfig +f:drivers/gpu/drm/sun4i/Makefile +f:drivers/gpu/drm/sun4i/sun4i_backend.c +f:drivers/gpu/drm/sun4i/sun4i_backend.h +f:drivers/gpu/drm/sun4i/sun4i_crtc.c +f:drivers/gpu/drm/sun4i/sun4i_crtc.h +f:drivers/gpu/drm/sun4i/sun4i_drv.c +f:drivers/gpu/drm/sun4i/sun4i_drv.h +f:drivers/gpu/drm/sun4i/sun4i_framebuffer.c +f:drivers/gpu/drm/sun4i/sun4i_framebuffer.h +f:drivers/gpu/drm/sun4i/sun4i_frontend.c +f:drivers/gpu/drm/sun4i/sun4i_frontend.h +f:drivers/gpu/drm/sun4i/sun4i_hdmi.h +f:drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c +f:drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c +f:drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c +f:drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c +f:drivers/gpu/drm/sun4i/sun4i_layer.c +f:drivers/gpu/drm/sun4i/sun4i_layer.h +f:drivers/gpu/drm/sun4i/sun4i_lvds.c +f:drivers/gpu/drm/sun4i/sun4i_lvds.h +f:drivers/gpu/drm/sun4i/sun4i_rgb.c +f:drivers/gpu/drm/sun4i/sun4i_rgb.h +f:drivers/gpu/drm/sun4i/sun4i_tcon.c +f:drivers/gpu/drm/sun4i/sun4i_tcon.h +f:drivers/gpu/drm/sun4i/sun4i_tcon_dclk.c +f:drivers/gpu/drm/sun4i/sun4i_tcon_dclk.h +f:drivers/gpu/drm/sun4i/sun4i_tv.c +f:drivers/gpu/drm/sun4i/sun6i_drc.c +f:drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c +f:drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h +f:drivers/gpu/drm/sun4i/sun8i_csc.c +f:drivers/gpu/drm/sun4i/sun8i_csc.h +f:drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c +f:drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h +f:drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c +f:drivers/gpu/drm/sun4i/sun8i_hdmi_phy_clk.c +f:drivers/gpu/drm/sun4i/sun8i_mixer.c +f:drivers/gpu/drm/sun4i/sun8i_mixer.h +f:drivers/gpu/drm/sun4i/sun8i_tcon_top.c +f:drivers/gpu/drm/sun4i/sun8i_tcon_top.h +f:drivers/gpu/drm/sun4i/sun8i_ui_layer.c +f:drivers/gpu/drm/sun4i/sun8i_ui_layer.h +f:drivers/gpu/drm/sun4i/sun8i_ui_scaler.c +f:drivers/gpu/drm/sun4i/sun8i_ui_scaler.h +f:drivers/gpu/drm/sun4i/sun8i_vi_layer.c +f:drivers/gpu/drm/sun4i/sun8i_vi_layer.h +f:drivers/gpu/drm/sun4i/sun8i_vi_scaler.c +f:drivers/gpu/drm/sun4i/sun8i_vi_scaler.h +f:drivers/gpu/drm/sun4i/sunxi_engine.h +f:drivers/gpu/drm/sysfb/Kconfig +f:drivers/gpu/drm/sysfb/Makefile +f:drivers/gpu/drm/sysfb/drm_sysfb.c +f:drivers/gpu/drm/sysfb/drm_sysfb_helper.h +f:drivers/gpu/drm/sysfb/drm_sysfb_modeset.c +f:drivers/gpu/drm/sysfb/drm_sysfb_screen_info.c +f:drivers/gpu/drm/sysfb/efidrm.c +f:drivers/gpu/drm/sysfb/ofdrm.c +f:drivers/gpu/drm/sysfb/simpledrm.c +f:drivers/gpu/drm/sysfb/vesadrm.c +f:drivers/gpu/drm/tegra/Kconfig +f:drivers/gpu/drm/tegra/Makefile +f:drivers/gpu/drm/tegra/dc.c +f:drivers/gpu/drm/tegra/dc.h +f:drivers/gpu/drm/tegra/dp.c +f:drivers/gpu/drm/tegra/dp.h +f:drivers/gpu/drm/tegra/dpaux.c +f:drivers/gpu/drm/tegra/dpaux.h +f:drivers/gpu/drm/tegra/drm.c +f:drivers/gpu/drm/tegra/drm.h +f:drivers/gpu/drm/tegra/dsi.c +f:drivers/gpu/drm/tegra/dsi.h +f:drivers/gpu/drm/tegra/falcon.c +f:drivers/gpu/drm/tegra/falcon.h +f:drivers/gpu/drm/tegra/fb.c +f:drivers/gpu/drm/tegra/fbdev.c +f:drivers/gpu/drm/tegra/firewall.c +f:drivers/gpu/drm/tegra/gem.c +f:drivers/gpu/drm/tegra/gem.h +f:drivers/gpu/drm/tegra/gr2d.c +f:drivers/gpu/drm/tegra/gr2d.h +f:drivers/gpu/drm/tegra/gr3d.c +f:drivers/gpu/drm/tegra/gr3d.h +f:drivers/gpu/drm/tegra/hda.c +f:drivers/gpu/drm/tegra/hda.h +f:drivers/gpu/drm/tegra/hdmi.c +f:drivers/gpu/drm/tegra/hdmi.h +f:drivers/gpu/drm/tegra/hub.c +f:drivers/gpu/drm/tegra/hub.h +f:drivers/gpu/drm/tegra/mipi-phy.c +f:drivers/gpu/drm/tegra/mipi-phy.h +f:drivers/gpu/drm/tegra/nvdec.c +f:drivers/gpu/drm/tegra/output.c +f:drivers/gpu/drm/tegra/plane.c +f:drivers/gpu/drm/tegra/plane.h +f:drivers/gpu/drm/tegra/rgb.c +f:drivers/gpu/drm/tegra/riscv.c +f:drivers/gpu/drm/tegra/riscv.h +f:drivers/gpu/drm/tegra/sor.c +f:drivers/gpu/drm/tegra/sor.h +f:drivers/gpu/drm/tegra/submit.c +f:drivers/gpu/drm/tegra/submit.h +f:drivers/gpu/drm/tegra/trace.c +f:drivers/gpu/drm/tegra/trace.h +f:drivers/gpu/drm/tegra/uapi.c +f:drivers/gpu/drm/tegra/uapi.h +f:drivers/gpu/drm/tegra/vic.c +f:drivers/gpu/drm/tegra/vic.h +f:drivers/gpu/drm/tests/.kunitconfig +f:drivers/gpu/drm/tests/Makefile +f:drivers/gpu/drm/tests/drm_atomic_state_test.c +f:drivers/gpu/drm/tests/drm_atomic_test.c +f:drivers/gpu/drm/tests/drm_bridge_test.c +f:drivers/gpu/drm/tests/drm_buddy_test.c +f:drivers/gpu/drm/tests/drm_client_modeset_test.c +f:drivers/gpu/drm/tests/drm_cmdline_parser_test.c +f:drivers/gpu/drm/tests/drm_connector_test.c +f:drivers/gpu/drm/tests/drm_damage_helper_test.c +f:drivers/gpu/drm/tests/drm_dp_mst_helper_test.c +f:drivers/gpu/drm/tests/drm_exec_test.c +f:drivers/gpu/drm/tests/drm_format_helper_test.c +f:drivers/gpu/drm/tests/drm_format_test.c +f:drivers/gpu/drm/tests/drm_framebuffer_test.c +f:drivers/gpu/drm/tests/drm_gem_shmem_test.c +f:drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +f:drivers/gpu/drm/tests/drm_kunit_edid.h +f:drivers/gpu/drm/tests/drm_kunit_helpers.c +f:drivers/gpu/drm/tests/drm_managed_test.c +f:drivers/gpu/drm/tests/drm_mm_test.c +f:drivers/gpu/drm/tests/drm_modes_test.c +f:drivers/gpu/drm/tests/drm_plane_helper_test.c +f:drivers/gpu/drm/tests/drm_probe_helper_test.c +f:drivers/gpu/drm/tests/drm_rect_test.c +f:drivers/gpu/drm/tests/drm_sysfb_modeset_test.c +f:drivers/gpu/drm/tidss/Kconfig +f:drivers/gpu/drm/tidss/Makefile +f:drivers/gpu/drm/tidss/tidss_crtc.c +f:drivers/gpu/drm/tidss/tidss_crtc.h +f:drivers/gpu/drm/tidss/tidss_dispc.c +f:drivers/gpu/drm/tidss/tidss_dispc.h +f:drivers/gpu/drm/tidss/tidss_dispc_regs.h +f:drivers/gpu/drm/tidss/tidss_drv.c +f:drivers/gpu/drm/tidss/tidss_drv.h +f:drivers/gpu/drm/tidss/tidss_encoder.c +f:drivers/gpu/drm/tidss/tidss_encoder.h +f:drivers/gpu/drm/tidss/tidss_irq.c +f:drivers/gpu/drm/tidss/tidss_irq.h +f:drivers/gpu/drm/tidss/tidss_kms.c +f:drivers/gpu/drm/tidss/tidss_kms.h +f:drivers/gpu/drm/tidss/tidss_oldi.c +f:drivers/gpu/drm/tidss/tidss_oldi.h +f:drivers/gpu/drm/tidss/tidss_plane.c +f:drivers/gpu/drm/tidss/tidss_plane.h +f:drivers/gpu/drm/tidss/tidss_scale_coefs.c +f:drivers/gpu/drm/tidss/tidss_scale_coefs.h +f:drivers/gpu/drm/tilcdc/Kconfig +f:drivers/gpu/drm/tilcdc/Makefile +f:drivers/gpu/drm/tilcdc/tilcdc_crtc.c +f:drivers/gpu/drm/tilcdc/tilcdc_drv.c +f:drivers/gpu/drm/tilcdc/tilcdc_drv.h +f:drivers/gpu/drm/tilcdc/tilcdc_external.c +f:drivers/gpu/drm/tilcdc/tilcdc_external.h +f:drivers/gpu/drm/tilcdc/tilcdc_panel.c +f:drivers/gpu/drm/tilcdc/tilcdc_panel.h +f:drivers/gpu/drm/tilcdc/tilcdc_plane.c +f:drivers/gpu/drm/tilcdc/tilcdc_regs.h +f:drivers/gpu/drm/tiny/Kconfig +f:drivers/gpu/drm/tiny/Makefile +f:drivers/gpu/drm/tiny/appletbdrm.c +f:drivers/gpu/drm/tiny/arcpgu.c +f:drivers/gpu/drm/tiny/bochs.c +f:drivers/gpu/drm/tiny/cirrus-qemu.c +f:drivers/gpu/drm/tiny/gm12u320.c +f:drivers/gpu/drm/tiny/hx8357d.c +f:drivers/gpu/drm/tiny/ili9163.c +f:drivers/gpu/drm/tiny/ili9225.c +f:drivers/gpu/drm/tiny/ili9341.c +f:drivers/gpu/drm/tiny/ili9486.c +f:drivers/gpu/drm/tiny/mi0283qt.c +f:drivers/gpu/drm/tiny/panel-mipi-dbi.c +f:drivers/gpu/drm/tiny/repaper.c +f:drivers/gpu/drm/tiny/sharp-memory.c +f:drivers/gpu/drm/ttm/Makefile +f:drivers/gpu/drm/ttm/tests/.kunitconfig +f:drivers/gpu/drm/ttm/tests/Makefile +f:drivers/gpu/drm/ttm/tests/TODO +f:drivers/gpu/drm/ttm/tests/ttm_bo_test.c +f:drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c +f:drivers/gpu/drm/ttm/tests/ttm_device_test.c +f:drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c +f:drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.h +f:drivers/gpu/drm/ttm/tests/ttm_mock_manager.c +f:drivers/gpu/drm/ttm/tests/ttm_mock_manager.h +f:drivers/gpu/drm/ttm/tests/ttm_pool_test.c +f:drivers/gpu/drm/ttm/tests/ttm_resource_test.c +f:drivers/gpu/drm/ttm/tests/ttm_tt_test.c +f:drivers/gpu/drm/ttm/ttm_agp_backend.c +f:drivers/gpu/drm/ttm/ttm_backup.c +f:drivers/gpu/drm/ttm/ttm_bo.c +f:drivers/gpu/drm/ttm/ttm_bo_internal.h +f:drivers/gpu/drm/ttm/ttm_bo_util.c +f:drivers/gpu/drm/ttm/ttm_bo_vm.c +f:drivers/gpu/drm/ttm/ttm_device.c +f:drivers/gpu/drm/ttm/ttm_execbuf_util.c +f:drivers/gpu/drm/ttm/ttm_module.c +f:drivers/gpu/drm/ttm/ttm_module.h +f:drivers/gpu/drm/ttm/ttm_pool.c +f:drivers/gpu/drm/ttm/ttm_range_manager.c +f:drivers/gpu/drm/ttm/ttm_resource.c +f:drivers/gpu/drm/ttm/ttm_sys_manager.c +f:drivers/gpu/drm/ttm/ttm_tt.c +f:drivers/gpu/drm/tve200/Kconfig +f:drivers/gpu/drm/tve200/Makefile +f:drivers/gpu/drm/tve200/tve200_display.c +f:drivers/gpu/drm/tve200/tve200_drm.h +f:drivers/gpu/drm/tve200/tve200_drv.c +f:drivers/gpu/drm/udl/Kconfig +f:drivers/gpu/drm/udl/Makefile +f:drivers/gpu/drm/udl/udl_drv.c +f:drivers/gpu/drm/udl/udl_drv.h +f:drivers/gpu/drm/udl/udl_edid.c +f:drivers/gpu/drm/udl/udl_edid.h +f:drivers/gpu/drm/udl/udl_main.c +f:drivers/gpu/drm/udl/udl_modeset.c +f:drivers/gpu/drm/udl/udl_proto.h +f:drivers/gpu/drm/udl/udl_transfer.c +f:drivers/gpu/drm/v3d/Kconfig +f:drivers/gpu/drm/v3d/Makefile +f:drivers/gpu/drm/v3d/v3d_bo.c +f:drivers/gpu/drm/v3d/v3d_debugfs.c +f:drivers/gpu/drm/v3d/v3d_drv.c +f:drivers/gpu/drm/v3d/v3d_drv.h +f:drivers/gpu/drm/v3d/v3d_fence.c +f:drivers/gpu/drm/v3d/v3d_gem.c +f:drivers/gpu/drm/v3d/v3d_gemfs.c +f:drivers/gpu/drm/v3d/v3d_irq.c +f:drivers/gpu/drm/v3d/v3d_mmu.c +f:drivers/gpu/drm/v3d/v3d_perfmon.c +f:drivers/gpu/drm/v3d/v3d_performance_counters.h +f:drivers/gpu/drm/v3d/v3d_regs.h +f:drivers/gpu/drm/v3d/v3d_sched.c +f:drivers/gpu/drm/v3d/v3d_submit.c +f:drivers/gpu/drm/v3d/v3d_sysfs.c +f:drivers/gpu/drm/v3d/v3d_trace.h +f:drivers/gpu/drm/v3d/v3d_trace_points.c +f:drivers/gpu/drm/vboxvideo/Kconfig +f:drivers/gpu/drm/vboxvideo/Makefile +f:drivers/gpu/drm/vboxvideo/hgsmi_base.c +f:drivers/gpu/drm/vboxvideo/hgsmi_ch_setup.h +f:drivers/gpu/drm/vboxvideo/hgsmi_channels.h +f:drivers/gpu/drm/vboxvideo/hgsmi_defs.h +f:drivers/gpu/drm/vboxvideo/modesetting.c +f:drivers/gpu/drm/vboxvideo/vbox_drv.c +f:drivers/gpu/drm/vboxvideo/vbox_drv.h +f:drivers/gpu/drm/vboxvideo/vbox_hgsmi.c +f:drivers/gpu/drm/vboxvideo/vbox_irq.c +f:drivers/gpu/drm/vboxvideo/vbox_main.c +f:drivers/gpu/drm/vboxvideo/vbox_mode.c +f:drivers/gpu/drm/vboxvideo/vbox_ttm.c +f:drivers/gpu/drm/vboxvideo/vboxvideo.h +f:drivers/gpu/drm/vboxvideo/vboxvideo_guest.h +f:drivers/gpu/drm/vboxvideo/vboxvideo_vbe.h +f:drivers/gpu/drm/vboxvideo/vbva_base.c +f:drivers/gpu/drm/vc4/Kconfig +f:drivers/gpu/drm/vc4/Makefile +f:drivers/gpu/drm/vc4/tests/.kunitconfig +f:drivers/gpu/drm/vc4/tests/vc4_mock.c +f:drivers/gpu/drm/vc4/tests/vc4_mock.h +f:drivers/gpu/drm/vc4/tests/vc4_mock_crtc.c +f:drivers/gpu/drm/vc4/tests/vc4_mock_output.c +f:drivers/gpu/drm/vc4/tests/vc4_mock_plane.c +f:drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c +f:drivers/gpu/drm/vc4/vc4_bo.c +f:drivers/gpu/drm/vc4/vc4_crtc.c +f:drivers/gpu/drm/vc4/vc4_debugfs.c +f:drivers/gpu/drm/vc4/vc4_dpi.c +f:drivers/gpu/drm/vc4/vc4_drv.c +f:drivers/gpu/drm/vc4/vc4_drv.h +f:drivers/gpu/drm/vc4/vc4_dsi.c +f:drivers/gpu/drm/vc4/vc4_fence.c +f:drivers/gpu/drm/vc4/vc4_gem.c +f:drivers/gpu/drm/vc4/vc4_hdmi.c +f:drivers/gpu/drm/vc4/vc4_hdmi.h +f:drivers/gpu/drm/vc4/vc4_hdmi_phy.c +f:drivers/gpu/drm/vc4/vc4_hdmi_regs.h +f:drivers/gpu/drm/vc4/vc4_hvs.c +f:drivers/gpu/drm/vc4/vc4_irq.c +f:drivers/gpu/drm/vc4/vc4_kms.c +f:drivers/gpu/drm/vc4/vc4_packet.h +f:drivers/gpu/drm/vc4/vc4_perfmon.c +f:drivers/gpu/drm/vc4/vc4_plane.c +f:drivers/gpu/drm/vc4/vc4_qpu_defines.h +f:drivers/gpu/drm/vc4/vc4_regs.h +f:drivers/gpu/drm/vc4/vc4_render_cl.c +f:drivers/gpu/drm/vc4/vc4_trace.h +f:drivers/gpu/drm/vc4/vc4_trace_points.c +f:drivers/gpu/drm/vc4/vc4_txp.c +f:drivers/gpu/drm/vc4/vc4_v3d.c +f:drivers/gpu/drm/vc4/vc4_validate.c +f:drivers/gpu/drm/vc4/vc4_validate_shaders.c +f:drivers/gpu/drm/vc4/vc4_vec.c +f:drivers/gpu/drm/vgem/Makefile +f:drivers/gpu/drm/vgem/vgem_drv.c +f:drivers/gpu/drm/vgem/vgem_drv.h +f:drivers/gpu/drm/vgem/vgem_fence.c +f:drivers/gpu/drm/virtio/Kconfig +f:drivers/gpu/drm/virtio/Makefile +f:drivers/gpu/drm/virtio/virtgpu_debugfs.c +f:drivers/gpu/drm/virtio/virtgpu_display.c +f:drivers/gpu/drm/virtio/virtgpu_drv.c +f:drivers/gpu/drm/virtio/virtgpu_drv.h +f:drivers/gpu/drm/virtio/virtgpu_fence.c +f:drivers/gpu/drm/virtio/virtgpu_gem.c +f:drivers/gpu/drm/virtio/virtgpu_ioctl.c +f:drivers/gpu/drm/virtio/virtgpu_kms.c +f:drivers/gpu/drm/virtio/virtgpu_object.c +f:drivers/gpu/drm/virtio/virtgpu_plane.c +f:drivers/gpu/drm/virtio/virtgpu_prime.c +f:drivers/gpu/drm/virtio/virtgpu_submit.c +f:drivers/gpu/drm/virtio/virtgpu_trace.h +f:drivers/gpu/drm/virtio/virtgpu_trace_points.c +f:drivers/gpu/drm/virtio/virtgpu_vq.c +f:drivers/gpu/drm/virtio/virtgpu_vram.c +f:drivers/gpu/drm/vkms/Kconfig +f:drivers/gpu/drm/vkms/Makefile +f:drivers/gpu/drm/vkms/tests/.kunitconfig +f:drivers/gpu/drm/vkms/tests/Makefile +f:drivers/gpu/drm/vkms/tests/vkms_config_test.c +f:drivers/gpu/drm/vkms/tests/vkms_format_test.c +f:drivers/gpu/drm/vkms/vkms_composer.c +f:drivers/gpu/drm/vkms/vkms_config.c +f:drivers/gpu/drm/vkms/vkms_config.h +f:drivers/gpu/drm/vkms/vkms_connector.c +f:drivers/gpu/drm/vkms/vkms_connector.h +f:drivers/gpu/drm/vkms/vkms_crtc.c +f:drivers/gpu/drm/vkms/vkms_drv.c +f:drivers/gpu/drm/vkms/vkms_drv.h +f:drivers/gpu/drm/vkms/vkms_formats.c +f:drivers/gpu/drm/vkms/vkms_formats.h +f:drivers/gpu/drm/vkms/vkms_output.c +f:drivers/gpu/drm/vkms/vkms_plane.c +f:drivers/gpu/drm/vkms/vkms_writeback.c +f:drivers/gpu/drm/vmwgfx/Kconfig +f:drivers/gpu/drm/vmwgfx/Makefile +f:drivers/gpu/drm/vmwgfx/device_include/svga3d_cmd.h +f:drivers/gpu/drm/vmwgfx/device_include/svga3d_devcaps.h +f:drivers/gpu/drm/vmwgfx/device_include/svga3d_dx.h +f:drivers/gpu/drm/vmwgfx/device_include/svga3d_limits.h +f:drivers/gpu/drm/vmwgfx/device_include/svga3d_reg.h +f:drivers/gpu/drm/vmwgfx/device_include/svga3d_surfacedefs.h +f:drivers/gpu/drm/vmwgfx/device_include/svga3d_types.h +f:drivers/gpu/drm/vmwgfx/device_include/svga_escape.h +f:drivers/gpu/drm/vmwgfx/device_include/svga_overlay.h +f:drivers/gpu/drm/vmwgfx/device_include/svga_reg.h +f:drivers/gpu/drm/vmwgfx/device_include/vm_basic_types.h +f:drivers/gpu/drm/vmwgfx/ttm_object.c +f:drivers/gpu/drm/vmwgfx/ttm_object.h +f:drivers/gpu/drm/vmwgfx/vmw_surface_cache.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_binding.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_binding.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_blit.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_bo.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_cmd.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_context.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_devcaps.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_devcaps.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_fence.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_fence.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_gem.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_irq.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_kms.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_mksstat.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_mob.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_msg.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_msg_arm64.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_msg_x86.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_prime.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_reg.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_resource_priv.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_shader.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_simple_resource.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_so.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_so.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_streamoutput.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_surface.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_system_manager.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_va.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_validation.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_validation.h +f:drivers/gpu/drm/vmwgfx/vmwgfx_vkms.c +f:drivers/gpu/drm/vmwgfx/vmwgfx_vkms.h +f:drivers/gpu/drm/xe/.gitignore +f:drivers/gpu/drm/xe/.kunitconfig +f:drivers/gpu/drm/xe/Kconfig +f:drivers/gpu/drm/xe/Kconfig.debug +f:drivers/gpu/drm/xe/Kconfig.profile +f:drivers/gpu/drm/xe/Makefile +f:drivers/gpu/drm/xe/abi/gsc_command_header_abi.h +f:drivers/gpu/drm/xe/abi/gsc_mkhi_commands_abi.h +f:drivers/gpu/drm/xe/abi/gsc_proxy_commands_abi.h +f:drivers/gpu/drm/xe/abi/gsc_pxp_commands_abi.h +f:drivers/gpu/drm/xe/abi/guc_actions_abi.h +f:drivers/gpu/drm/xe/abi/guc_actions_slpc_abi.h +f:drivers/gpu/drm/xe/abi/guc_actions_sriov_abi.h +f:drivers/gpu/drm/xe/abi/guc_capture_abi.h +f:drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h +f:drivers/gpu/drm/xe/abi/guc_communication_mmio_abi.h +f:drivers/gpu/drm/xe/abi/guc_errors_abi.h +f:drivers/gpu/drm/xe/abi/guc_klvs_abi.h +f:drivers/gpu/drm/xe/abi/guc_log_abi.h +f:drivers/gpu/drm/xe/abi/guc_messages_abi.h +f:drivers/gpu/drm/xe/abi/guc_relay_actions_abi.h +f:drivers/gpu/drm/xe/abi/guc_relay_communication_abi.h +f:drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h +f:drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h +f:drivers/gpu/drm/xe/compat-i915-headers/gt/intel_gt_types.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_active.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_active_types.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_config.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_gtt_view_types.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_irq.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_reg.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_reg_defs.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_scheduler_types.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_utils.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_vgpu.h +f:drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h +f:drivers/gpu/drm/xe/compat-i915-headers/intel_clock_gating.h +f:drivers/gpu/drm/xe/compat-i915-headers/intel_mchbar_regs.h +f:drivers/gpu/drm/xe/compat-i915-headers/intel_pci_config.h +f:drivers/gpu/drm/xe/compat-i915-headers/intel_pcode.h +f:drivers/gpu/drm/xe/compat-i915-headers/intel_step.h +f:drivers/gpu/drm/xe/compat-i915-headers/intel_uncore.h +f:drivers/gpu/drm/xe/compat-i915-headers/intel_uncore_trace.h +f:drivers/gpu/drm/xe/compat-i915-headers/intel_wakeref.h +f:drivers/gpu/drm/xe/compat-i915-headers/pxp/intel_pxp.h +f:drivers/gpu/drm/xe/compat-i915-headers/soc/intel_dram.h +f:drivers/gpu/drm/xe/compat-i915-headers/soc/intel_gmch.h +f:drivers/gpu/drm/xe/compat-i915-headers/soc/intel_rom.h +f:drivers/gpu/drm/xe/compat-i915-headers/vlv_iosf_sb.h +f:drivers/gpu/drm/xe/compat-i915-headers/vlv_iosf_sb_reg.h +f:drivers/gpu/drm/xe/display/ext/i915_irq.c +f:drivers/gpu/drm/xe/display/ext/i915_utils.c +f:drivers/gpu/drm/xe/display/intel_bo.c +f:drivers/gpu/drm/xe/display/intel_fb_bo.c +f:drivers/gpu/drm/xe/display/intel_fbdev_fb.c +f:drivers/gpu/drm/xe/display/xe_display.c +f:drivers/gpu/drm/xe/display/xe_display.h +f:drivers/gpu/drm/xe/display/xe_display_misc.c +f:drivers/gpu/drm/xe/display/xe_display_rpm.c +f:drivers/gpu/drm/xe/display/xe_display_wa.c +f:drivers/gpu/drm/xe/display/xe_dsb_buffer.c +f:drivers/gpu/drm/xe/display/xe_fb_pin.c +f:drivers/gpu/drm/xe/display/xe_hdcp_gsc.c +f:drivers/gpu/drm/xe/display/xe_plane_initial.c +f:drivers/gpu/drm/xe/display/xe_tdf.c +f:drivers/gpu/drm/xe/instructions/xe_alu_commands.h +f:drivers/gpu/drm/xe/instructions/xe_gfx_state_commands.h +f:drivers/gpu/drm/xe/instructions/xe_gfxpipe_commands.h +f:drivers/gpu/drm/xe/instructions/xe_gpu_commands.h +f:drivers/gpu/drm/xe/instructions/xe_gsc_commands.h +f:drivers/gpu/drm/xe/instructions/xe_instr_defs.h +f:drivers/gpu/drm/xe/instructions/xe_mfx_commands.h +f:drivers/gpu/drm/xe/instructions/xe_mi_commands.h +f:drivers/gpu/drm/xe/regs/xe_bars.h +f:drivers/gpu/drm/xe/regs/xe_engine_regs.h +f:drivers/gpu/drm/xe/regs/xe_eu_stall_regs.h +f:drivers/gpu/drm/xe/regs/xe_gsc_regs.h +f:drivers/gpu/drm/xe/regs/xe_gt_regs.h +f:drivers/gpu/drm/xe/regs/xe_gtt_defs.h +f:drivers/gpu/drm/xe/regs/xe_guc_regs.h +f:drivers/gpu/drm/xe/regs/xe_i2c_regs.h +f:drivers/gpu/drm/xe/regs/xe_irq_regs.h +f:drivers/gpu/drm/xe/regs/xe_lrc_layout.h +f:drivers/gpu/drm/xe/regs/xe_mchbar_regs.h +f:drivers/gpu/drm/xe/regs/xe_oa_regs.h +f:drivers/gpu/drm/xe/regs/xe_pcode_regs.h +f:drivers/gpu/drm/xe/regs/xe_pmt.h +f:drivers/gpu/drm/xe/regs/xe_pxp_regs.h +f:drivers/gpu/drm/xe/regs/xe_reg_defs.h +f:drivers/gpu/drm/xe/regs/xe_regs.h +f:drivers/gpu/drm/xe/tests/Makefile +f:drivers/gpu/drm/xe/tests/xe_args_test.c +f:drivers/gpu/drm/xe/tests/xe_bo.c +f:drivers/gpu/drm/xe/tests/xe_dma_buf.c +f:drivers/gpu/drm/xe/tests/xe_guc_buf_kunit.c +f:drivers/gpu/drm/xe/tests/xe_guc_db_mgr_test.c +f:drivers/gpu/drm/xe/tests/xe_guc_id_mgr_test.c +f:drivers/gpu/drm/xe/tests/xe_guc_relay_test.c +f:drivers/gpu/drm/xe/tests/xe_kunit_helpers.c +f:drivers/gpu/drm/xe/tests/xe_kunit_helpers.h +f:drivers/gpu/drm/xe/tests/xe_live_test_mod.c +f:drivers/gpu/drm/xe/tests/xe_lmtt_test.c +f:drivers/gpu/drm/xe/tests/xe_migrate.c +f:drivers/gpu/drm/xe/tests/xe_mocs.c +f:drivers/gpu/drm/xe/tests/xe_pci.c +f:drivers/gpu/drm/xe/tests/xe_pci_test.c +f:drivers/gpu/drm/xe/tests/xe_pci_test.h +f:drivers/gpu/drm/xe/tests/xe_rtp_test.c +f:drivers/gpu/drm/xe/tests/xe_sriov_pf_service_kunit.c +f:drivers/gpu/drm/xe/tests/xe_test.h +f:drivers/gpu/drm/xe/tests/xe_test_mod.c +f:drivers/gpu/drm/xe/tests/xe_wa_test.c +f:drivers/gpu/drm/xe/xe_args.h +f:drivers/gpu/drm/xe/xe_assert.h +f:drivers/gpu/drm/xe/xe_bb.c +f:drivers/gpu/drm/xe/xe_bb.h +f:drivers/gpu/drm/xe/xe_bb_types.h +f:drivers/gpu/drm/xe/xe_bo.c +f:drivers/gpu/drm/xe/xe_bo.h +f:drivers/gpu/drm/xe/xe_bo_doc.h +f:drivers/gpu/drm/xe/xe_bo_evict.c +f:drivers/gpu/drm/xe/xe_bo_evict.h +f:drivers/gpu/drm/xe/xe_bo_types.h +f:drivers/gpu/drm/xe/xe_configfs.c +f:drivers/gpu/drm/xe/xe_configfs.h +f:drivers/gpu/drm/xe/xe_debugfs.c +f:drivers/gpu/drm/xe/xe_debugfs.h +f:drivers/gpu/drm/xe/xe_devcoredump.c +f:drivers/gpu/drm/xe/xe_devcoredump.h +f:drivers/gpu/drm/xe/xe_devcoredump_types.h +f:drivers/gpu/drm/xe/xe_device.c +f:drivers/gpu/drm/xe/xe_device.h +f:drivers/gpu/drm/xe/xe_device_sysfs.c +f:drivers/gpu/drm/xe/xe_device_sysfs.h +f:drivers/gpu/drm/xe/xe_device_types.h +f:drivers/gpu/drm/xe/xe_device_wa_oob.rules +f:drivers/gpu/drm/xe/xe_dma_buf.c +f:drivers/gpu/drm/xe/xe_dma_buf.h +f:drivers/gpu/drm/xe/xe_drm_client.c +f:drivers/gpu/drm/xe/xe_drm_client.h +f:drivers/gpu/drm/xe/xe_drv.h +f:drivers/gpu/drm/xe/xe_eu_stall.c +f:drivers/gpu/drm/xe/xe_eu_stall.h +f:drivers/gpu/drm/xe/xe_exec.c +f:drivers/gpu/drm/xe/xe_exec.h +f:drivers/gpu/drm/xe/xe_exec_queue.c +f:drivers/gpu/drm/xe/xe_exec_queue.h +f:drivers/gpu/drm/xe/xe_exec_queue_types.h +f:drivers/gpu/drm/xe/xe_execlist.c +f:drivers/gpu/drm/xe/xe_execlist.h +f:drivers/gpu/drm/xe/xe_execlist_types.h +f:drivers/gpu/drm/xe/xe_force_wake.c +f:drivers/gpu/drm/xe/xe_force_wake.h +f:drivers/gpu/drm/xe/xe_force_wake_types.h +f:drivers/gpu/drm/xe/xe_gen_wa_oob.c +f:drivers/gpu/drm/xe/xe_ggtt.c +f:drivers/gpu/drm/xe/xe_ggtt.h +f:drivers/gpu/drm/xe/xe_ggtt_types.h +f:drivers/gpu/drm/xe/xe_gpu_scheduler.c +f:drivers/gpu/drm/xe/xe_gpu_scheduler.h +f:drivers/gpu/drm/xe/xe_gpu_scheduler_types.h +f:drivers/gpu/drm/xe/xe_gsc.c +f:drivers/gpu/drm/xe/xe_gsc.h +f:drivers/gpu/drm/xe/xe_gsc_debugfs.c +f:drivers/gpu/drm/xe/xe_gsc_debugfs.h +f:drivers/gpu/drm/xe/xe_gsc_proxy.c +f:drivers/gpu/drm/xe/xe_gsc_proxy.h +f:drivers/gpu/drm/xe/xe_gsc_submit.c +f:drivers/gpu/drm/xe/xe_gsc_submit.h +f:drivers/gpu/drm/xe/xe_gsc_types.h +f:drivers/gpu/drm/xe/xe_gt.c +f:drivers/gpu/drm/xe/xe_gt.h +f:drivers/gpu/drm/xe/xe_gt_ccs_mode.c +f:drivers/gpu/drm/xe/xe_gt_ccs_mode.h +f:drivers/gpu/drm/xe/xe_gt_clock.c +f:drivers/gpu/drm/xe/xe_gt_clock.h +f:drivers/gpu/drm/xe/xe_gt_debugfs.c +f:drivers/gpu/drm/xe/xe_gt_debugfs.h +f:drivers/gpu/drm/xe/xe_gt_freq.c +f:drivers/gpu/drm/xe/xe_gt_freq.h +f:drivers/gpu/drm/xe/xe_gt_idle.c +f:drivers/gpu/drm/xe/xe_gt_idle.h +f:drivers/gpu/drm/xe/xe_gt_idle_types.h +f:drivers/gpu/drm/xe/xe_gt_mcr.c +f:drivers/gpu/drm/xe/xe_gt_mcr.h +f:drivers/gpu/drm/xe/xe_gt_pagefault.c +f:drivers/gpu/drm/xe/xe_gt_pagefault.h +f:drivers/gpu/drm/xe/xe_gt_printk.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf.c +f:drivers/gpu/drm/xe/xe_gt_sriov_pf.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_helpers.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_monitor.c +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_monitor.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_monitor_types.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_policy.c +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_policy.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_policy_types.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_service.c +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_service.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_service_types.h +f:drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h +f:drivers/gpu/drm/xe/xe_gt_sriov_printk.h +f:drivers/gpu/drm/xe/xe_gt_sriov_vf.c +f:drivers/gpu/drm/xe/xe_gt_sriov_vf.h +f:drivers/gpu/drm/xe/xe_gt_sriov_vf_debugfs.c +f:drivers/gpu/drm/xe/xe_gt_sriov_vf_debugfs.h +f:drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h +f:drivers/gpu/drm/xe/xe_gt_stats.c +f:drivers/gpu/drm/xe/xe_gt_stats.h +f:drivers/gpu/drm/xe/xe_gt_stats_types.h +f:drivers/gpu/drm/xe/xe_gt_sysfs.c +f:drivers/gpu/drm/xe/xe_gt_sysfs.h +f:drivers/gpu/drm/xe/xe_gt_sysfs_types.h +f:drivers/gpu/drm/xe/xe_gt_throttle.c +f:drivers/gpu/drm/xe/xe_gt_throttle.h +f:drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c +f:drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h +f:drivers/gpu/drm/xe/xe_gt_tlb_invalidation_types.h +f:drivers/gpu/drm/xe/xe_gt_topology.c +f:drivers/gpu/drm/xe/xe_gt_topology.h +f:drivers/gpu/drm/xe/xe_gt_types.h +f:drivers/gpu/drm/xe/xe_guc.c +f:drivers/gpu/drm/xe/xe_guc.h +f:drivers/gpu/drm/xe/xe_guc_ads.c +f:drivers/gpu/drm/xe/xe_guc_ads.h +f:drivers/gpu/drm/xe/xe_guc_ads_types.h +f:drivers/gpu/drm/xe/xe_guc_buf.c +f:drivers/gpu/drm/xe/xe_guc_buf.h +f:drivers/gpu/drm/xe/xe_guc_buf_types.h +f:drivers/gpu/drm/xe/xe_guc_capture.c +f:drivers/gpu/drm/xe/xe_guc_capture.h +f:drivers/gpu/drm/xe/xe_guc_capture_types.h +f:drivers/gpu/drm/xe/xe_guc_ct.c +f:drivers/gpu/drm/xe/xe_guc_ct.h +f:drivers/gpu/drm/xe/xe_guc_ct_types.h +f:drivers/gpu/drm/xe/xe_guc_db_mgr.c +f:drivers/gpu/drm/xe/xe_guc_db_mgr.h +f:drivers/gpu/drm/xe/xe_guc_debugfs.c +f:drivers/gpu/drm/xe/xe_guc_debugfs.h +f:drivers/gpu/drm/xe/xe_guc_engine_activity.c +f:drivers/gpu/drm/xe/xe_guc_engine_activity.h +f:drivers/gpu/drm/xe/xe_guc_engine_activity_types.h +f:drivers/gpu/drm/xe/xe_guc_exec_queue_types.h +f:drivers/gpu/drm/xe/xe_guc_fwif.h +f:drivers/gpu/drm/xe/xe_guc_hwconfig.c +f:drivers/gpu/drm/xe/xe_guc_hwconfig.h +f:drivers/gpu/drm/xe/xe_guc_hxg_helpers.h +f:drivers/gpu/drm/xe/xe_guc_id_mgr.c +f:drivers/gpu/drm/xe/xe_guc_id_mgr.h +f:drivers/gpu/drm/xe/xe_guc_klv_helpers.c +f:drivers/gpu/drm/xe/xe_guc_klv_helpers.h +f:drivers/gpu/drm/xe/xe_guc_klv_thresholds_set.h +f:drivers/gpu/drm/xe/xe_guc_klv_thresholds_set_types.h +f:drivers/gpu/drm/xe/xe_guc_log.c +f:drivers/gpu/drm/xe/xe_guc_log.h +f:drivers/gpu/drm/xe/xe_guc_log_types.h +f:drivers/gpu/drm/xe/xe_guc_pc.c +f:drivers/gpu/drm/xe/xe_guc_pc.h +f:drivers/gpu/drm/xe/xe_guc_pc_types.h +f:drivers/gpu/drm/xe/xe_guc_relay.c +f:drivers/gpu/drm/xe/xe_guc_relay.h +f:drivers/gpu/drm/xe/xe_guc_relay_types.h +f:drivers/gpu/drm/xe/xe_guc_submit.c +f:drivers/gpu/drm/xe/xe_guc_submit.h +f:drivers/gpu/drm/xe/xe_guc_submit_types.h +f:drivers/gpu/drm/xe/xe_guc_types.h +f:drivers/gpu/drm/xe/xe_heci_gsc.c +f:drivers/gpu/drm/xe/xe_heci_gsc.h +f:drivers/gpu/drm/xe/xe_hmm.c +f:drivers/gpu/drm/xe/xe_hmm.h +f:drivers/gpu/drm/xe/xe_huc.c +f:drivers/gpu/drm/xe/xe_huc.h +f:drivers/gpu/drm/xe/xe_huc_debugfs.c +f:drivers/gpu/drm/xe/xe_huc_debugfs.h +f:drivers/gpu/drm/xe/xe_huc_types.h +f:drivers/gpu/drm/xe/xe_hw_engine.c +f:drivers/gpu/drm/xe/xe_hw_engine.h +f:drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c +f:drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h +f:drivers/gpu/drm/xe/xe_hw_engine_group.c +f:drivers/gpu/drm/xe/xe_hw_engine_group.h +f:drivers/gpu/drm/xe/xe_hw_engine_group_types.h +f:drivers/gpu/drm/xe/xe_hw_engine_types.h +f:drivers/gpu/drm/xe/xe_hw_fence.c +f:drivers/gpu/drm/xe/xe_hw_fence.h +f:drivers/gpu/drm/xe/xe_hw_fence_types.h +f:drivers/gpu/drm/xe/xe_hwmon.c +f:drivers/gpu/drm/xe/xe_hwmon.h +f:drivers/gpu/drm/xe/xe_i2c.c +f:drivers/gpu/drm/xe/xe_i2c.h +f:drivers/gpu/drm/xe/xe_irq.c +f:drivers/gpu/drm/xe/xe_irq.h +f:drivers/gpu/drm/xe/xe_lmtt.c +f:drivers/gpu/drm/xe/xe_lmtt.h +f:drivers/gpu/drm/xe/xe_lmtt_2l.c +f:drivers/gpu/drm/xe/xe_lmtt_ml.c +f:drivers/gpu/drm/xe/xe_lmtt_types.h +f:drivers/gpu/drm/xe/xe_lrc.c +f:drivers/gpu/drm/xe/xe_lrc.h +f:drivers/gpu/drm/xe/xe_lrc_types.h +f:drivers/gpu/drm/xe/xe_macros.h +f:drivers/gpu/drm/xe/xe_map.h +f:drivers/gpu/drm/xe/xe_memirq.c +f:drivers/gpu/drm/xe/xe_memirq.h +f:drivers/gpu/drm/xe/xe_memirq_types.h +f:drivers/gpu/drm/xe/xe_migrate.c +f:drivers/gpu/drm/xe/xe_migrate.h +f:drivers/gpu/drm/xe/xe_migrate_doc.h +f:drivers/gpu/drm/xe/xe_mmio.c +f:drivers/gpu/drm/xe/xe_mmio.h +f:drivers/gpu/drm/xe/xe_mocs.c +f:drivers/gpu/drm/xe/xe_mocs.h +f:drivers/gpu/drm/xe/xe_module.c +f:drivers/gpu/drm/xe/xe_module.h +f:drivers/gpu/drm/xe/xe_nvm.c +f:drivers/gpu/drm/xe/xe_nvm.h +f:drivers/gpu/drm/xe/xe_oa.c +f:drivers/gpu/drm/xe/xe_oa.h +f:drivers/gpu/drm/xe/xe_oa_types.h +f:drivers/gpu/drm/xe/xe_observation.c +f:drivers/gpu/drm/xe/xe_observation.h +f:drivers/gpu/drm/xe/xe_pat.c +f:drivers/gpu/drm/xe/xe_pat.h +f:drivers/gpu/drm/xe/xe_pci.c +f:drivers/gpu/drm/xe/xe_pci.h +f:drivers/gpu/drm/xe/xe_pci_sriov.c +f:drivers/gpu/drm/xe/xe_pci_sriov.h +f:drivers/gpu/drm/xe/xe_pci_types.h +f:drivers/gpu/drm/xe/xe_pcode.c +f:drivers/gpu/drm/xe/xe_pcode.h +f:drivers/gpu/drm/xe/xe_pcode_api.h +f:drivers/gpu/drm/xe/xe_platform_types.h +f:drivers/gpu/drm/xe/xe_pm.c +f:drivers/gpu/drm/xe/xe_pm.h +f:drivers/gpu/drm/xe/xe_pmu.c +f:drivers/gpu/drm/xe/xe_pmu.h +f:drivers/gpu/drm/xe/xe_pmu_types.h +f:drivers/gpu/drm/xe/xe_preempt_fence.c +f:drivers/gpu/drm/xe/xe_preempt_fence.h +f:drivers/gpu/drm/xe/xe_preempt_fence_types.h +f:drivers/gpu/drm/xe/xe_pt.c +f:drivers/gpu/drm/xe/xe_pt.h +f:drivers/gpu/drm/xe/xe_pt_types.h +f:drivers/gpu/drm/xe/xe_pt_walk.c +f:drivers/gpu/drm/xe/xe_pt_walk.h +f:drivers/gpu/drm/xe/xe_pxp.c +f:drivers/gpu/drm/xe/xe_pxp.h +f:drivers/gpu/drm/xe/xe_pxp_debugfs.c +f:drivers/gpu/drm/xe/xe_pxp_debugfs.h +f:drivers/gpu/drm/xe/xe_pxp_submit.c +f:drivers/gpu/drm/xe/xe_pxp_submit.h +f:drivers/gpu/drm/xe/xe_pxp_types.h +f:drivers/gpu/drm/xe/xe_query.c +f:drivers/gpu/drm/xe/xe_query.h +f:drivers/gpu/drm/xe/xe_range_fence.c +f:drivers/gpu/drm/xe/xe_range_fence.h +f:drivers/gpu/drm/xe/xe_reg_sr.c +f:drivers/gpu/drm/xe/xe_reg_sr.h +f:drivers/gpu/drm/xe/xe_reg_sr_types.h +f:drivers/gpu/drm/xe/xe_reg_whitelist.c +f:drivers/gpu/drm/xe/xe_reg_whitelist.h +f:drivers/gpu/drm/xe/xe_res_cursor.h +f:drivers/gpu/drm/xe/xe_ring_ops.c +f:drivers/gpu/drm/xe/xe_ring_ops.h +f:drivers/gpu/drm/xe/xe_ring_ops_types.h +f:drivers/gpu/drm/xe/xe_rtp.c +f:drivers/gpu/drm/xe/xe_rtp.h +f:drivers/gpu/drm/xe/xe_rtp_helpers.h +f:drivers/gpu/drm/xe/xe_rtp_types.h +f:drivers/gpu/drm/xe/xe_sa.c +f:drivers/gpu/drm/xe/xe_sa.h +f:drivers/gpu/drm/xe/xe_sa_types.h +f:drivers/gpu/drm/xe/xe_sched_job.c +f:drivers/gpu/drm/xe/xe_sched_job.h +f:drivers/gpu/drm/xe/xe_sched_job_types.h +f:drivers/gpu/drm/xe/xe_shrinker.c +f:drivers/gpu/drm/xe/xe_shrinker.h +f:drivers/gpu/drm/xe/xe_sriov.c +f:drivers/gpu/drm/xe/xe_sriov.h +f:drivers/gpu/drm/xe/xe_sriov_pf.c +f:drivers/gpu/drm/xe/xe_sriov_pf.h +f:drivers/gpu/drm/xe/xe_sriov_pf_helpers.h +f:drivers/gpu/drm/xe/xe_sriov_pf_service.c +f:drivers/gpu/drm/xe/xe_sriov_pf_service.h +f:drivers/gpu/drm/xe/xe_sriov_pf_service_types.h +f:drivers/gpu/drm/xe/xe_sriov_pf_types.h +f:drivers/gpu/drm/xe/xe_sriov_printk.h +f:drivers/gpu/drm/xe/xe_sriov_types.h +f:drivers/gpu/drm/xe/xe_sriov_vf.c +f:drivers/gpu/drm/xe/xe_sriov_vf.h +f:drivers/gpu/drm/xe/xe_sriov_vf_types.h +f:drivers/gpu/drm/xe/xe_step.c +f:drivers/gpu/drm/xe/xe_step.h +f:drivers/gpu/drm/xe/xe_step_types.h +f:drivers/gpu/drm/xe/xe_survivability_mode.c +f:drivers/gpu/drm/xe/xe_survivability_mode.h +f:drivers/gpu/drm/xe/xe_survivability_mode_types.h +f:drivers/gpu/drm/xe/xe_svm.c +f:drivers/gpu/drm/xe/xe_svm.h +f:drivers/gpu/drm/xe/xe_sync.c +f:drivers/gpu/drm/xe/xe_sync.h +f:drivers/gpu/drm/xe/xe_sync_types.h +f:drivers/gpu/drm/xe/xe_tile.c +f:drivers/gpu/drm/xe/xe_tile.h +f:drivers/gpu/drm/xe/xe_tile_sriov_vf.c +f:drivers/gpu/drm/xe/xe_tile_sriov_vf.h +f:drivers/gpu/drm/xe/xe_tile_sysfs.c +f:drivers/gpu/drm/xe/xe_tile_sysfs.h +f:drivers/gpu/drm/xe/xe_tile_sysfs_types.h +f:drivers/gpu/drm/xe/xe_trace.c +f:drivers/gpu/drm/xe/xe_trace.h +f:drivers/gpu/drm/xe/xe_trace_bo.c +f:drivers/gpu/drm/xe/xe_trace_bo.h +f:drivers/gpu/drm/xe/xe_trace_guc.c +f:drivers/gpu/drm/xe/xe_trace_guc.h +f:drivers/gpu/drm/xe/xe_trace_lrc.c +f:drivers/gpu/drm/xe/xe_trace_lrc.h +f:drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c +f:drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h +f:drivers/gpu/drm/xe/xe_ttm_sys_mgr.c +f:drivers/gpu/drm/xe/xe_ttm_sys_mgr.h +f:drivers/gpu/drm/xe/xe_ttm_vram_mgr.c +f:drivers/gpu/drm/xe/xe_ttm_vram_mgr.h +f:drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h +f:drivers/gpu/drm/xe/xe_tuning.c +f:drivers/gpu/drm/xe/xe_tuning.h +f:drivers/gpu/drm/xe/xe_uc.c +f:drivers/gpu/drm/xe/xe_uc.h +f:drivers/gpu/drm/xe/xe_uc_debugfs.c +f:drivers/gpu/drm/xe/xe_uc_debugfs.h +f:drivers/gpu/drm/xe/xe_uc_fw.c +f:drivers/gpu/drm/xe/xe_uc_fw.h +f:drivers/gpu/drm/xe/xe_uc_fw_abi.h +f:drivers/gpu/drm/xe/xe_uc_fw_types.h +f:drivers/gpu/drm/xe/xe_uc_types.h +f:drivers/gpu/drm/xe/xe_vm.c +f:drivers/gpu/drm/xe/xe_vm.h +f:drivers/gpu/drm/xe/xe_vm_doc.h +f:drivers/gpu/drm/xe/xe_vm_types.h +f:drivers/gpu/drm/xe/xe_vram.c +f:drivers/gpu/drm/xe/xe_vram.h +f:drivers/gpu/drm/xe/xe_vram_freq.c +f:drivers/gpu/drm/xe/xe_vram_freq.h +f:drivers/gpu/drm/xe/xe_vsec.c +f:drivers/gpu/drm/xe/xe_vsec.h +f:drivers/gpu/drm/xe/xe_wa.c +f:drivers/gpu/drm/xe/xe_wa.h +f:drivers/gpu/drm/xe/xe_wa_oob.rules +f:drivers/gpu/drm/xe/xe_wait_user_fence.c +f:drivers/gpu/drm/xe/xe_wait_user_fence.h +f:drivers/gpu/drm/xe/xe_wopcm.c +f:drivers/gpu/drm/xe/xe_wopcm.h +f:drivers/gpu/drm/xe/xe_wopcm_types.h +f:drivers/gpu/drm/xen/Kconfig +f:drivers/gpu/drm/xen/Makefile +f:drivers/gpu/drm/xen/xen_drm_front.c +f:drivers/gpu/drm/xen/xen_drm_front.h +f:drivers/gpu/drm/xen/xen_drm_front_cfg.c +f:drivers/gpu/drm/xen/xen_drm_front_cfg.h +f:drivers/gpu/drm/xen/xen_drm_front_conn.c +f:drivers/gpu/drm/xen/xen_drm_front_conn.h +f:drivers/gpu/drm/xen/xen_drm_front_evtchnl.c +f:drivers/gpu/drm/xen/xen_drm_front_evtchnl.h +f:drivers/gpu/drm/xen/xen_drm_front_gem.c +f:drivers/gpu/drm/xen/xen_drm_front_gem.h +f:drivers/gpu/drm/xen/xen_drm_front_kms.c +f:drivers/gpu/drm/xen/xen_drm_front_kms.h +f:drivers/gpu/drm/xlnx/Kconfig +f:drivers/gpu/drm/xlnx/Makefile +f:drivers/gpu/drm/xlnx/zynqmp_disp.c +f:drivers/gpu/drm/xlnx/zynqmp_disp.h +f:drivers/gpu/drm/xlnx/zynqmp_disp_regs.h +f:drivers/gpu/drm/xlnx/zynqmp_dp.c +f:drivers/gpu/drm/xlnx/zynqmp_dp.h +f:drivers/gpu/drm/xlnx/zynqmp_dp_audio.c +f:drivers/gpu/drm/xlnx/zynqmp_dpsub.c +f:drivers/gpu/drm/xlnx/zynqmp_dpsub.h +f:drivers/gpu/drm/xlnx/zynqmp_kms.c +f:drivers/gpu/drm/xlnx/zynqmp_kms.h +f:drivers/gpu/host1x/Kconfig +f:drivers/gpu/host1x/Makefile +f:drivers/gpu/host1x/bus.c +f:drivers/gpu/host1x/bus.h +f:drivers/gpu/host1x/cdma.c +f:drivers/gpu/host1x/cdma.h +f:drivers/gpu/host1x/channel.c +f:drivers/gpu/host1x/channel.h +f:drivers/gpu/host1x/context.c +f:drivers/gpu/host1x/context.h +f:drivers/gpu/host1x/context_bus.c +f:drivers/gpu/host1x/debug.c +f:drivers/gpu/host1x/debug.h +f:drivers/gpu/host1x/dev.c +f:drivers/gpu/host1x/dev.h +f:drivers/gpu/host1x/fence.c +f:drivers/gpu/host1x/fence.h +f:drivers/gpu/host1x/hw/cdma_hw.c +f:drivers/gpu/host1x/hw/channel_hw.c +f:drivers/gpu/host1x/hw/debug_hw.c +f:drivers/gpu/host1x/hw/debug_hw_1x01.c +f:drivers/gpu/host1x/hw/debug_hw_1x06.c +f:drivers/gpu/host1x/hw/host1x01.c +f:drivers/gpu/host1x/hw/host1x01.h +f:drivers/gpu/host1x/hw/host1x01_hardware.h +f:drivers/gpu/host1x/hw/host1x02.c +f:drivers/gpu/host1x/hw/host1x02.h +f:drivers/gpu/host1x/hw/host1x02_hardware.h +f:drivers/gpu/host1x/hw/host1x04.c +f:drivers/gpu/host1x/hw/host1x04.h +f:drivers/gpu/host1x/hw/host1x04_hardware.h +f:drivers/gpu/host1x/hw/host1x05.c +f:drivers/gpu/host1x/hw/host1x05.h +f:drivers/gpu/host1x/hw/host1x05_hardware.h +f:drivers/gpu/host1x/hw/host1x06.c +f:drivers/gpu/host1x/hw/host1x06.h +f:drivers/gpu/host1x/hw/host1x06_hardware.h +f:drivers/gpu/host1x/hw/host1x07.c +f:drivers/gpu/host1x/hw/host1x07.h +f:drivers/gpu/host1x/hw/host1x07_hardware.h +f:drivers/gpu/host1x/hw/host1x08.c +f:drivers/gpu/host1x/hw/host1x08.h +f:drivers/gpu/host1x/hw/host1x08_hardware.h +f:drivers/gpu/host1x/hw/hw_host1x01_channel.h +f:drivers/gpu/host1x/hw/hw_host1x01_sync.h +f:drivers/gpu/host1x/hw/hw_host1x01_uclass.h +f:drivers/gpu/host1x/hw/hw_host1x02_channel.h +f:drivers/gpu/host1x/hw/hw_host1x02_sync.h +f:drivers/gpu/host1x/hw/hw_host1x02_uclass.h +f:drivers/gpu/host1x/hw/hw_host1x04_channel.h +f:drivers/gpu/host1x/hw/hw_host1x04_sync.h +f:drivers/gpu/host1x/hw/hw_host1x04_uclass.h +f:drivers/gpu/host1x/hw/hw_host1x05_channel.h +f:drivers/gpu/host1x/hw/hw_host1x05_sync.h +f:drivers/gpu/host1x/hw/hw_host1x05_uclass.h +f:drivers/gpu/host1x/hw/hw_host1x06_channel.h +f:drivers/gpu/host1x/hw/hw_host1x06_hypervisor.h +f:drivers/gpu/host1x/hw/hw_host1x06_uclass.h +f:drivers/gpu/host1x/hw/hw_host1x06_vm.h +f:drivers/gpu/host1x/hw/hw_host1x07_channel.h +f:drivers/gpu/host1x/hw/hw_host1x07_hypervisor.h +f:drivers/gpu/host1x/hw/hw_host1x07_uclass.h +f:drivers/gpu/host1x/hw/hw_host1x07_vm.h +f:drivers/gpu/host1x/hw/hw_host1x08_channel.h +f:drivers/gpu/host1x/hw/hw_host1x08_common.h +f:drivers/gpu/host1x/hw/hw_host1x08_hypervisor.h +f:drivers/gpu/host1x/hw/hw_host1x08_uclass.h +f:drivers/gpu/host1x/hw/hw_host1x08_vm.h +f:drivers/gpu/host1x/hw/intr_hw.c +f:drivers/gpu/host1x/hw/opcodes.h +f:drivers/gpu/host1x/hw/syncpt_hw.c +f:drivers/gpu/host1x/intr.c +f:drivers/gpu/host1x/intr.h +f:drivers/gpu/host1x/job.c +f:drivers/gpu/host1x/job.h +f:drivers/gpu/host1x/mipi.c +f:drivers/gpu/host1x/syncpt.c +f:drivers/gpu/host1x/syncpt.h +f:drivers/gpu/ipu-v3/Kconfig +f:drivers/gpu/ipu-v3/Makefile +f:drivers/gpu/ipu-v3/ipu-common.c +f:drivers/gpu/ipu-v3/ipu-cpmem.c +f:drivers/gpu/ipu-v3/ipu-csi.c +f:drivers/gpu/ipu-v3/ipu-dc.c +f:drivers/gpu/ipu-v3/ipu-di.c +f:drivers/gpu/ipu-v3/ipu-dmfc.c +f:drivers/gpu/ipu-v3/ipu-dp.c +f:drivers/gpu/ipu-v3/ipu-ic-csc.c +f:drivers/gpu/ipu-v3/ipu-ic.c +f:drivers/gpu/ipu-v3/ipu-image-convert.c +f:drivers/gpu/ipu-v3/ipu-pre.c +f:drivers/gpu/ipu-v3/ipu-prg.c +f:drivers/gpu/ipu-v3/ipu-prv.h +f:drivers/gpu/ipu-v3/ipu-smfc.c +f:drivers/gpu/ipu-v3/ipu-vdi.c +f:drivers/gpu/nova-core/Kconfig +f:drivers/gpu/nova-core/Makefile +f:drivers/gpu/nova-core/dma.rs +f:drivers/gpu/nova-core/driver.rs +f:drivers/gpu/nova-core/falcon.rs +f:drivers/gpu/nova-core/falcon/gsp.rs +f:drivers/gpu/nova-core/falcon/hal.rs +f:drivers/gpu/nova-core/falcon/hal/ga102.rs +f:drivers/gpu/nova-core/falcon/sec2.rs +f:drivers/gpu/nova-core/fb.rs +f:drivers/gpu/nova-core/fb/hal.rs +f:drivers/gpu/nova-core/fb/hal/ga100.rs +f:drivers/gpu/nova-core/fb/hal/ga102.rs +f:drivers/gpu/nova-core/fb/hal/tu102.rs +f:drivers/gpu/nova-core/firmware.rs +f:drivers/gpu/nova-core/firmware/fwsec.rs +f:drivers/gpu/nova-core/gfw.rs +f:drivers/gpu/nova-core/gpu.rs +f:drivers/gpu/nova-core/nova_core.rs +f:drivers/gpu/nova-core/regs.rs +f:drivers/gpu/nova-core/regs/macros.rs +f:drivers/gpu/nova-core/util.rs +f:drivers/gpu/nova-core/vbios.rs +f:drivers/gpu/trace/Kconfig +f:drivers/gpu/trace/Makefile +f:drivers/gpu/trace/trace_gpu_mem.c +f:drivers/gpu/vga/Kconfig +f:drivers/gpu/vga/Makefile +f:drivers/gpu/vga/vga_switcheroo.c +f:drivers/greybus/Kconfig +f:drivers/greybus/Makefile +f:drivers/greybus/arpc.h +f:drivers/greybus/bundle.c +f:drivers/greybus/connection.c +f:drivers/greybus/control.c +f:drivers/greybus/core.c +f:drivers/greybus/debugfs.c +f:drivers/greybus/es2.c +f:drivers/greybus/gb-beagleplay.c +f:drivers/greybus/greybus_trace.h +f:drivers/greybus/hd.c +f:drivers/greybus/interface.c +f:drivers/greybus/manifest.c +f:drivers/greybus/module.c +f:drivers/greybus/operation.c +f:drivers/greybus/svc.c +f:drivers/greybus/svc_watchdog.c +f:drivers/hid/.kunitconfig +f:drivers/hid/Kconfig +f:drivers/hid/Makefile +f:drivers/hid/amd-sfh-hid/Kconfig +f:drivers/hid/amd-sfh-hid/Makefile +f:drivers/hid/amd-sfh-hid/amd_sfh_client.c +f:drivers/hid/amd-sfh-hid/amd_sfh_common.h +f:drivers/hid/amd-sfh-hid/amd_sfh_hid.c +f:drivers/hid/amd-sfh-hid/amd_sfh_hid.h +f:drivers/hid/amd-sfh-hid/amd_sfh_pcie.c +f:drivers/hid/amd-sfh-hid/amd_sfh_pcie.h +f:drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.c +f:drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_desc.h +f:drivers/hid/amd-sfh-hid/hid_descriptor/amd_sfh_hid_report_desc.h +f:drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_desc.c +f:drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c +f:drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.h +f:drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.c +f:drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_interface.h +f:drivers/hid/bpf/Kconfig +f:drivers/hid/bpf/Makefile +f:drivers/hid/bpf/hid_bpf_dispatch.c +f:drivers/hid/bpf/hid_bpf_dispatch.h +f:drivers/hid/bpf/hid_bpf_struct_ops.c +f:drivers/hid/bpf/progs/FR-TEC__Raptor-Mach-2.bpf.c +f:drivers/hid/bpf/progs/HP__Elite-Presenter.bpf.c +f:drivers/hid/bpf/progs/Huion__Dial-2.bpf.c +f:drivers/hid/bpf/progs/Huion__Inspiroy-2-S.bpf.c +f:drivers/hid/bpf/progs/Huion__Kamvas-Pro-19.bpf.c +f:drivers/hid/bpf/progs/Huion__KeydialK20.bpf.c +f:drivers/hid/bpf/progs/IOGEAR__Kaliber-MMOmentum.bpf.c +f:drivers/hid/bpf/progs/Makefile +f:drivers/hid/bpf/progs/Microsoft__Xbox-Elite-2.bpf.c +f:drivers/hid/bpf/progs/Mistel__MD770.bpf.c +f:drivers/hid/bpf/progs/README +f:drivers/hid/bpf/progs/Rapoo__M50-Plus-Silent.bpf.c +f:drivers/hid/bpf/progs/TUXEDO__Sirius-16-Gen1-and-Gen2.bpf.c +f:drivers/hid/bpf/progs/Thrustmaster__TCA-Yoke-Boeing.bpf.c +f:drivers/hid/bpf/progs/Wacom__ArtPen.bpf.c +f:drivers/hid/bpf/progs/XPPen__ACK05.bpf.c +f:drivers/hid/bpf/progs/XPPen__Artist24.bpf.c +f:drivers/hid/bpf/progs/XPPen__ArtistPro16Gen2.bpf.c +f:drivers/hid/bpf/progs/XPPen__DecoMini4.bpf.c +f:drivers/hid/bpf/progs/hid_bpf.h +f:drivers/hid/bpf/progs/hid_bpf_async.h +f:drivers/hid/bpf/progs/hid_bpf_helpers.h +f:drivers/hid/bpf/progs/hid_report_helpers.h +f:drivers/hid/hid-a4tech.c +f:drivers/hid/hid-accutouch.c +f:drivers/hid/hid-alps.c +f:drivers/hid/hid-apple.c +f:drivers/hid/hid-appleir.c +f:drivers/hid/hid-appletb-bl.c +f:drivers/hid/hid-appletb-kbd.c +f:drivers/hid/hid-asus.c +f:drivers/hid/hid-aureal.c +f:drivers/hid/hid-axff.c +f:drivers/hid/hid-belkin.c +f:drivers/hid/hid-betopff.c +f:drivers/hid/hid-bigbenff.c +f:drivers/hid/hid-cherry.c +f:drivers/hid/hid-chicony.c +f:drivers/hid/hid-cmedia.c +f:drivers/hid/hid-core.c +f:drivers/hid/hid-corsair-void.c +f:drivers/hid/hid-corsair.c +f:drivers/hid/hid-cougar.c +f:drivers/hid/hid-cp2112.c +f:drivers/hid/hid-creative-sb0540.c +f:drivers/hid/hid-cypress.c +f:drivers/hid/hid-debug.c +f:drivers/hid/hid-dr.c +f:drivers/hid/hid-elan.c +f:drivers/hid/hid-elecom.c +f:drivers/hid/hid-elo.c +f:drivers/hid/hid-emsff.c +f:drivers/hid/hid-evision.c +f:drivers/hid/hid-ezkey.c +f:drivers/hid/hid-ft260.c +f:drivers/hid/hid-gaff.c +f:drivers/hid/hid-gembird.c +f:drivers/hid/hid-generic.c +f:drivers/hid/hid-gfrm.c +f:drivers/hid/hid-glorious.c +f:drivers/hid/hid-goodix-spi.c +f:drivers/hid/hid-google-hammer.c +f:drivers/hid/hid-google-stadiaff.c +f:drivers/hid/hid-gt683r.c +f:drivers/hid/hid-gyration.c +f:drivers/hid/hid-holtek-kbd.c +f:drivers/hid/hid-holtek-mouse.c +f:drivers/hid/hid-holtekff.c +f:drivers/hid/hid-hyperv.c +f:drivers/hid/hid-icade.c +f:drivers/hid/hid-ids.h +f:drivers/hid/hid-input-test.c +f:drivers/hid/hid-input.c +f:drivers/hid/hid-ite.c +f:drivers/hid/hid-jabra.c +f:drivers/hid/hid-kensington.c +f:drivers/hid/hid-keytouch.c +f:drivers/hid/hid-kye.c +f:drivers/hid/hid-kysona.c +f:drivers/hid/hid-lcpower.c +f:drivers/hid/hid-led.c +f:drivers/hid/hid-lenovo.c +f:drivers/hid/hid-letsketch.c +f:drivers/hid/hid-lg-g15.c +f:drivers/hid/hid-lg.c +f:drivers/hid/hid-lg.h +f:drivers/hid/hid-lg2ff.c +f:drivers/hid/hid-lg3ff.c +f:drivers/hid/hid-lg4ff.c +f:drivers/hid/hid-lg4ff.h +f:drivers/hid/hid-lgff.c +f:drivers/hid/hid-logitech-dj.c +f:drivers/hid/hid-logitech-hidpp.c +f:drivers/hid/hid-macally.c +f:drivers/hid/hid-magicmouse.c +f:drivers/hid/hid-maltron.c +f:drivers/hid/hid-mcp2200.c +f:drivers/hid/hid-mcp2221.c +f:drivers/hid/hid-megaworld.c +f:drivers/hid/hid-mf.c +f:drivers/hid/hid-microsoft.c +f:drivers/hid/hid-monterey.c +f:drivers/hid/hid-multitouch.c +f:drivers/hid/hid-nintendo.c +f:drivers/hid/hid-nti.c +f:drivers/hid/hid-ntrig.c +f:drivers/hid/hid-nvidia-shield.c +f:drivers/hid/hid-ortek.c +f:drivers/hid/hid-penmount.c +f:drivers/hid/hid-petalynx.c +f:drivers/hid/hid-picolcd.h +f:drivers/hid/hid-picolcd_backlight.c +f:drivers/hid/hid-picolcd_cir.c +f:drivers/hid/hid-picolcd_core.c +f:drivers/hid/hid-picolcd_debugfs.c +f:drivers/hid/hid-picolcd_fb.c +f:drivers/hid/hid-picolcd_lcd.c +f:drivers/hid/hid-picolcd_leds.c +f:drivers/hid/hid-pl.c +f:drivers/hid/hid-plantronics.c +f:drivers/hid/hid-playstation.c +f:drivers/hid/hid-primax.c +f:drivers/hid/hid-prodikeys.c +f:drivers/hid/hid-pxrc.c +f:drivers/hid/hid-quirks.c +f:drivers/hid/hid-razer.c +f:drivers/hid/hid-redragon.c +f:drivers/hid/hid-retrode.c +f:drivers/hid/hid-rmi.c +f:drivers/hid/hid-roccat-arvo.c +f:drivers/hid/hid-roccat-arvo.h +f:drivers/hid/hid-roccat-common.c +f:drivers/hid/hid-roccat-common.h +f:drivers/hid/hid-roccat-isku.c +f:drivers/hid/hid-roccat-isku.h +f:drivers/hid/hid-roccat-kone.c +f:drivers/hid/hid-roccat-kone.h +f:drivers/hid/hid-roccat-koneplus.c +f:drivers/hid/hid-roccat-koneplus.h +f:drivers/hid/hid-roccat-konepure.c +f:drivers/hid/hid-roccat-kovaplus.c +f:drivers/hid/hid-roccat-kovaplus.h +f:drivers/hid/hid-roccat-lua.c +f:drivers/hid/hid-roccat-lua.h +f:drivers/hid/hid-roccat-pyra.c +f:drivers/hid/hid-roccat-pyra.h +f:drivers/hid/hid-roccat-ryos.c +f:drivers/hid/hid-roccat-savu.c +f:drivers/hid/hid-roccat-savu.h +f:drivers/hid/hid-roccat.c +f:drivers/hid/hid-saitek.c +f:drivers/hid/hid-samsung.c +f:drivers/hid/hid-semitek.c +f:drivers/hid/hid-sensor-custom.c +f:drivers/hid/hid-sensor-hub.c +f:drivers/hid/hid-sigmamicro.c +f:drivers/hid/hid-sjoy.c +f:drivers/hid/hid-sony.c +f:drivers/hid/hid-speedlink.c +f:drivers/hid/hid-steam.c +f:drivers/hid/hid-steelseries.c +f:drivers/hid/hid-sunplus.c +f:drivers/hid/hid-thrustmaster.c +f:drivers/hid/hid-tivo.c +f:drivers/hid/hid-tmff.c +f:drivers/hid/hid-topre.c +f:drivers/hid/hid-topseed.c +f:drivers/hid/hid-twinhan.c +f:drivers/hid/hid-u2fzero.c +f:drivers/hid/hid-uclogic-core-test.c +f:drivers/hid/hid-uclogic-core.c +f:drivers/hid/hid-uclogic-params-test.c +f:drivers/hid/hid-uclogic-params.c +f:drivers/hid/hid-uclogic-params.h +f:drivers/hid/hid-uclogic-rdesc-test.c +f:drivers/hid/hid-uclogic-rdesc.c +f:drivers/hid/hid-uclogic-rdesc.h +f:drivers/hid/hid-udraw-ps3.c +f:drivers/hid/hid-universal-pidff.c +f:drivers/hid/hid-viewsonic.c +f:drivers/hid/hid-vivaldi-common.c +f:drivers/hid/hid-vivaldi-common.h +f:drivers/hid/hid-vivaldi.c +f:drivers/hid/hid-vrc2.c +f:drivers/hid/hid-waltop.c +f:drivers/hid/hid-wiimote-core.c +f:drivers/hid/hid-wiimote-debug.c +f:drivers/hid/hid-wiimote-modules.c +f:drivers/hid/hid-wiimote.h +f:drivers/hid/hid-winwing.c +f:drivers/hid/hid-xiaomi.c +f:drivers/hid/hid-xinmo.c +f:drivers/hid/hid-zpff.c +f:drivers/hid/hid-zydacron.c +f:drivers/hid/hidraw.c +f:drivers/hid/i2c-hid/Kconfig +f:drivers/hid/i2c-hid/Makefile +f:drivers/hid/i2c-hid/i2c-hid-acpi.c +f:drivers/hid/i2c-hid/i2c-hid-core.c +f:drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c +f:drivers/hid/i2c-hid/i2c-hid-of-elan.c +f:drivers/hid/i2c-hid/i2c-hid-of-goodix.c +f:drivers/hid/i2c-hid/i2c-hid-of.c +f:drivers/hid/i2c-hid/i2c-hid.h +f:drivers/hid/intel-ish-hid/Kconfig +f:drivers/hid/intel-ish-hid/Makefile +f:drivers/hid/intel-ish-hid/ipc/hw-ish-regs.h +f:drivers/hid/intel-ish-hid/ipc/hw-ish.h +f:drivers/hid/intel-ish-hid/ipc/ipc.c +f:drivers/hid/intel-ish-hid/ipc/pci-ish.c +f:drivers/hid/intel-ish-hid/ishtp-fw-loader.c +f:drivers/hid/intel-ish-hid/ishtp-hid-client.c +f:drivers/hid/intel-ish-hid/ishtp-hid.c +f:drivers/hid/intel-ish-hid/ishtp-hid.h +f:drivers/hid/intel-ish-hid/ishtp/bus.c +f:drivers/hid/intel-ish-hid/ishtp/bus.h +f:drivers/hid/intel-ish-hid/ishtp/client-buffers.c +f:drivers/hid/intel-ish-hid/ishtp/client.c +f:drivers/hid/intel-ish-hid/ishtp/client.h +f:drivers/hid/intel-ish-hid/ishtp/dma-if.c +f:drivers/hid/intel-ish-hid/ishtp/hbm.c +f:drivers/hid/intel-ish-hid/ishtp/hbm.h +f:drivers/hid/intel-ish-hid/ishtp/init.c +f:drivers/hid/intel-ish-hid/ishtp/ishtp-dev.h +f:drivers/hid/intel-ish-hid/ishtp/loader.c +f:drivers/hid/intel-ish-hid/ishtp/loader.h +f:drivers/hid/intel-thc-hid/Kconfig +f:drivers/hid/intel-thc-hid/Makefile +f:drivers/hid/intel-thc-hid/intel-quicki2c/pci-quicki2c.c +f:drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-dev.h +f:drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-hid.c +f:drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-hid.h +f:drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-protocol.c +f:drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-protocol.h +f:drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c +f:drivers/hid/intel-thc-hid/intel-quickspi/quickspi-dev.h +f:drivers/hid/intel-thc-hid/intel-quickspi/quickspi-hid.c +f:drivers/hid/intel-thc-hid/intel-quickspi/quickspi-hid.h +f:drivers/hid/intel-thc-hid/intel-quickspi/quickspi-protocol.c +f:drivers/hid/intel-thc-hid/intel-quickspi/quickspi-protocol.h +f:drivers/hid/intel-thc-hid/intel-thc/intel-thc-dev.c +f:drivers/hid/intel-thc-hid/intel-thc/intel-thc-dev.h +f:drivers/hid/intel-thc-hid/intel-thc/intel-thc-dma.c +f:drivers/hid/intel-thc-hid/intel-thc/intel-thc-dma.h +f:drivers/hid/intel-thc-hid/intel-thc/intel-thc-hw.h +f:drivers/hid/intel-thc-hid/intel-thc/intel-thc-wot.c +f:drivers/hid/intel-thc-hid/intel-thc/intel-thc-wot.h +f:drivers/hid/surface-hid/Kconfig +f:drivers/hid/surface-hid/Makefile +f:drivers/hid/surface-hid/surface_hid.c +f:drivers/hid/surface-hid/surface_hid_core.c +f:drivers/hid/surface-hid/surface_hid_core.h +f:drivers/hid/surface-hid/surface_kbd.c +f:drivers/hid/uhid.c +f:drivers/hid/usbhid/Kconfig +f:drivers/hid/usbhid/Makefile +f:drivers/hid/usbhid/hid-core.c +f:drivers/hid/usbhid/hid-pidff.c +f:drivers/hid/usbhid/hid-pidff.h +f:drivers/hid/usbhid/hiddev.c +f:drivers/hid/usbhid/usbhid.h +f:drivers/hid/usbhid/usbkbd.c +f:drivers/hid/usbhid/usbmouse.c +f:drivers/hid/wacom.h +f:drivers/hid/wacom_sys.c +f:drivers/hid/wacom_wac.c +f:drivers/hid/wacom_wac.h +f:drivers/hsi/Kconfig +f:drivers/hsi/Makefile +f:drivers/hsi/clients/Kconfig +f:drivers/hsi/clients/Makefile +f:drivers/hsi/clients/cmt_speech.c +f:drivers/hsi/clients/hsi_char.c +f:drivers/hsi/clients/nokia-modem.c +f:drivers/hsi/clients/ssi_protocol.c +f:drivers/hsi/controllers/Kconfig +f:drivers/hsi/controllers/Makefile +f:drivers/hsi/controllers/omap_ssi.h +f:drivers/hsi/controllers/omap_ssi_core.c +f:drivers/hsi/controllers/omap_ssi_port.c +f:drivers/hsi/controllers/omap_ssi_regs.h +f:drivers/hsi/hsi_boardinfo.c +f:drivers/hsi/hsi_core.c +f:drivers/hsi/hsi_core.h +f:drivers/hte/Kconfig +f:drivers/hte/Makefile +f:drivers/hte/hte-tegra194-test.c +f:drivers/hte/hte-tegra194.c +f:drivers/hte/hte.c +f:drivers/hv/Kconfig +f:drivers/hv/Makefile +f:drivers/hv/channel.c +f:drivers/hv/channel_mgmt.c +f:drivers/hv/connection.c +f:drivers/hv/hv.c +f:drivers/hv/hv_balloon.c +f:drivers/hv/hv_common.c +f:drivers/hv/hv_debugfs.c +f:drivers/hv/hv_kvp.c +f:drivers/hv/hv_proc.c +f:drivers/hv/hv_snapshot.c +f:drivers/hv/hv_trace.c +f:drivers/hv/hv_trace.h +f:drivers/hv/hv_trace_balloon.h +f:drivers/hv/hv_util.c +f:drivers/hv/hv_utils_transport.c +f:drivers/hv/hv_utils_transport.h +f:drivers/hv/hyperv_vmbus.h +f:drivers/hv/mshv.h +f:drivers/hv/mshv_common.c +f:drivers/hv/mshv_eventfd.c +f:drivers/hv/mshv_eventfd.h +f:drivers/hv/mshv_irq.c +f:drivers/hv/mshv_portid_table.c +f:drivers/hv/mshv_root.h +f:drivers/hv/mshv_root_hv_call.c +f:drivers/hv/mshv_root_main.c +f:drivers/hv/mshv_synic.c +f:drivers/hv/ring_buffer.c +f:drivers/hv/vmbus_drv.c +f:drivers/hwmon/Kconfig +f:drivers/hwmon/Makefile +f:drivers/hwmon/abituguru.c +f:drivers/hwmon/abituguru3.c +f:drivers/hwmon/acpi_power_meter.c +f:drivers/hwmon/ad7314.c +f:drivers/hwmon/ad7414.c +f:drivers/hwmon/ad7418.c +f:drivers/hwmon/adc128d818.c +f:drivers/hwmon/adcxx.c +f:drivers/hwmon/adm1025.c +f:drivers/hwmon/adm1026.c +f:drivers/hwmon/adm1029.c +f:drivers/hwmon/adm1031.c +f:drivers/hwmon/adm1177.c +f:drivers/hwmon/adm9240.c +f:drivers/hwmon/ads7828.c +f:drivers/hwmon/ads7871.c +f:drivers/hwmon/adt7310.c +f:drivers/hwmon/adt7410.c +f:drivers/hwmon/adt7411.c +f:drivers/hwmon/adt7462.c +f:drivers/hwmon/adt7470.c +f:drivers/hwmon/adt7475.c +f:drivers/hwmon/adt7x10.c +f:drivers/hwmon/adt7x10.h +f:drivers/hwmon/aht10.c +f:drivers/hwmon/amc6821.c +f:drivers/hwmon/applesmc.c +f:drivers/hwmon/aquacomputer_d5next.c +f:drivers/hwmon/as370-hwmon.c +f:drivers/hwmon/asb100.c +f:drivers/hwmon/asc7621.c +f:drivers/hwmon/aspeed-g6-pwm-tach.c +f:drivers/hwmon/aspeed-pwm-tacho.c +f:drivers/hwmon/asus-ec-sensors.c +f:drivers/hwmon/asus_atk0110.c +f:drivers/hwmon/asus_rog_ryujin.c +f:drivers/hwmon/asus_wmi_sensors.c +f:drivers/hwmon/atxp1.c +f:drivers/hwmon/axi-fan-control.c +f:drivers/hwmon/bt1-pvt.c +f:drivers/hwmon/bt1-pvt.h +f:drivers/hwmon/cgbc-hwmon.c +f:drivers/hwmon/chipcap2.c +f:drivers/hwmon/coretemp.c +f:drivers/hwmon/corsair-cpro.c +f:drivers/hwmon/corsair-psu.c +f:drivers/hwmon/cros_ec_hwmon.c +f:drivers/hwmon/da9052-hwmon.c +f:drivers/hwmon/da9055-hwmon.c +f:drivers/hwmon/dell-smm-hwmon.c +f:drivers/hwmon/dme1737.c +f:drivers/hwmon/drivetemp.c +f:drivers/hwmon/ds1621.c +f:drivers/hwmon/ds620.c +f:drivers/hwmon/emc1403.c +f:drivers/hwmon/emc2103.c +f:drivers/hwmon/emc2305.c +f:drivers/hwmon/emc6w201.c +f:drivers/hwmon/f71805f.c +f:drivers/hwmon/f71882fg.c +f:drivers/hwmon/f75375s.c +f:drivers/hwmon/fam15h_power.c +f:drivers/hwmon/fschmd.c +f:drivers/hwmon/ftsteutates.c +f:drivers/hwmon/g760a.c +f:drivers/hwmon/g762.c +f:drivers/hwmon/gigabyte_waterforce.c +f:drivers/hwmon/gl518sm.c +f:drivers/hwmon/gl520sm.c +f:drivers/hwmon/gpio-fan.c +f:drivers/hwmon/gsc-hwmon.c +f:drivers/hwmon/gxp-fan-ctrl.c +f:drivers/hwmon/hih6130.c +f:drivers/hwmon/hp-wmi-sensors.c +f:drivers/hwmon/hs3001.c +f:drivers/hwmon/htu31.c +f:drivers/hwmon/hwmon-vid.c +f:drivers/hwmon/hwmon.c +f:drivers/hwmon/i5500_temp.c +f:drivers/hwmon/i5k_amb.c +f:drivers/hwmon/ibmaem.c +f:drivers/hwmon/ibmpex.c +f:drivers/hwmon/ibmpowernv.c +f:drivers/hwmon/iio_hwmon.c +f:drivers/hwmon/ina209.c +f:drivers/hwmon/ina238.c +f:drivers/hwmon/ina2xx.c +f:drivers/hwmon/ina3221.c +f:drivers/hwmon/intel-m10-bmc-hwmon.c +f:drivers/hwmon/isl28022.c +f:drivers/hwmon/it87.c +f:drivers/hwmon/jc42.c +f:drivers/hwmon/k10temp.c +f:drivers/hwmon/k8temp.c +f:drivers/hwmon/kbatt.c +f:drivers/hwmon/kfan.c +f:drivers/hwmon/lan966x-hwmon.c +f:drivers/hwmon/lenovo-ec-sensors.c +f:drivers/hwmon/lineage-pem.c +f:drivers/hwmon/lm63.c +f:drivers/hwmon/lm70.c +f:drivers/hwmon/lm73.c +f:drivers/hwmon/lm75.c +f:drivers/hwmon/lm75.h +f:drivers/hwmon/lm77.c +f:drivers/hwmon/lm78.c +f:drivers/hwmon/lm80.c +f:drivers/hwmon/lm83.c +f:drivers/hwmon/lm85.c +f:drivers/hwmon/lm87.c +f:drivers/hwmon/lm90.c +f:drivers/hwmon/lm92.c +f:drivers/hwmon/lm93.c +f:drivers/hwmon/lm95234.c +f:drivers/hwmon/lm95241.c +f:drivers/hwmon/lm95245.c +f:drivers/hwmon/lochnagar-hwmon.c +f:drivers/hwmon/ltc2945.c +f:drivers/hwmon/ltc2947-core.c +f:drivers/hwmon/ltc2947-i2c.c +f:drivers/hwmon/ltc2947-spi.c +f:drivers/hwmon/ltc2947.h +f:drivers/hwmon/ltc2990.c +f:drivers/hwmon/ltc2991.c +f:drivers/hwmon/ltc2992.c +f:drivers/hwmon/ltc4151.c +f:drivers/hwmon/ltc4215.c +f:drivers/hwmon/ltc4222.c +f:drivers/hwmon/ltc4245.c +f:drivers/hwmon/ltc4260.c +f:drivers/hwmon/ltc4261.c +f:drivers/hwmon/ltc4282.c +f:drivers/hwmon/ltq-cputemp.c +f:drivers/hwmon/max1111.c +f:drivers/hwmon/max127.c +f:drivers/hwmon/max16065.c +f:drivers/hwmon/max1619.c +f:drivers/hwmon/max1668.c +f:drivers/hwmon/max197.c +f:drivers/hwmon/max31722.c +f:drivers/hwmon/max31730.c +f:drivers/hwmon/max31760.c +f:drivers/hwmon/max31790.c +f:drivers/hwmon/max31827.c +f:drivers/hwmon/max6620.c +f:drivers/hwmon/max6621.c +f:drivers/hwmon/max6639.c +f:drivers/hwmon/max6650.c +f:drivers/hwmon/max6697.c +f:drivers/hwmon/max77705-hwmon.c +f:drivers/hwmon/mc13783-adc.c +f:drivers/hwmon/mc33xs2410_hwmon.c +f:drivers/hwmon/mc34vr500.c +f:drivers/hwmon/mcp3021.c +f:drivers/hwmon/menf21bmc_hwmon.c +f:drivers/hwmon/mlxreg-fan.c +f:drivers/hwmon/mr75203.c +f:drivers/hwmon/nct6683.c +f:drivers/hwmon/nct6775-core.c +f:drivers/hwmon/nct6775-i2c.c +f:drivers/hwmon/nct6775-platform.c +f:drivers/hwmon/nct6775.h +f:drivers/hwmon/nct7363.c +f:drivers/hwmon/nct7802.c +f:drivers/hwmon/nct7904.c +f:drivers/hwmon/npcm750-pwm-fan.c +f:drivers/hwmon/nsa320-hwmon.c +f:drivers/hwmon/ntc_thermistor.c +f:drivers/hwmon/nzxt-kraken2.c +f:drivers/hwmon/nzxt-kraken3.c +f:drivers/hwmon/nzxt-smart2.c +f:drivers/hwmon/occ/Kconfig +f:drivers/hwmon/occ/Makefile +f:drivers/hwmon/occ/common.c +f:drivers/hwmon/occ/common.h +f:drivers/hwmon/occ/p8_i2c.c +f:drivers/hwmon/occ/p9_sbe.c +f:drivers/hwmon/occ/sysfs.c +f:drivers/hwmon/pc87360.c +f:drivers/hwmon/pc87427.c +f:drivers/hwmon/pcf8591.c +f:drivers/hwmon/peci/Kconfig +f:drivers/hwmon/peci/Makefile +f:drivers/hwmon/peci/common.h +f:drivers/hwmon/peci/cputemp.c +f:drivers/hwmon/peci/dimmtemp.c +f:drivers/hwmon/pmbus/Kconfig +f:drivers/hwmon/pmbus/Makefile +f:drivers/hwmon/pmbus/acbel-fsg032.c +f:drivers/hwmon/pmbus/adm1266.c +f:drivers/hwmon/pmbus/adm1275.c +f:drivers/hwmon/pmbus/adp1050.c +f:drivers/hwmon/pmbus/bel-pfe.c +f:drivers/hwmon/pmbus/bpa-rs600.c +f:drivers/hwmon/pmbus/crps.c +f:drivers/hwmon/pmbus/delta-ahe50dc-fan.c +f:drivers/hwmon/pmbus/dps920ab.c +f:drivers/hwmon/pmbus/fsp-3y.c +f:drivers/hwmon/pmbus/ibm-cffps.c +f:drivers/hwmon/pmbus/ina233.c +f:drivers/hwmon/pmbus/inspur-ipsps.c +f:drivers/hwmon/pmbus/ir35221.c +f:drivers/hwmon/pmbus/ir36021.c +f:drivers/hwmon/pmbus/ir38064.c +f:drivers/hwmon/pmbus/irps5401.c +f:drivers/hwmon/pmbus/isl68137.c +f:drivers/hwmon/pmbus/lm25066.c +f:drivers/hwmon/pmbus/lt3074.c +f:drivers/hwmon/pmbus/lt7182s.c +f:drivers/hwmon/pmbus/ltc2978.c +f:drivers/hwmon/pmbus/ltc3815.c +f:drivers/hwmon/pmbus/ltc4286.c +f:drivers/hwmon/pmbus/max15301.c +f:drivers/hwmon/pmbus/max16064.c +f:drivers/hwmon/pmbus/max16601.c +f:drivers/hwmon/pmbus/max20730.c +f:drivers/hwmon/pmbus/max20751.c +f:drivers/hwmon/pmbus/max31785.c +f:drivers/hwmon/pmbus/max34440.c +f:drivers/hwmon/pmbus/max8688.c +f:drivers/hwmon/pmbus/mp2856.c +f:drivers/hwmon/pmbus/mp2888.c +f:drivers/hwmon/pmbus/mp2891.c +f:drivers/hwmon/pmbus/mp2975.c +f:drivers/hwmon/pmbus/mp2993.c +f:drivers/hwmon/pmbus/mp5023.c +f:drivers/hwmon/pmbus/mp5920.c +f:drivers/hwmon/pmbus/mp5990.c +f:drivers/hwmon/pmbus/mp9941.c +f:drivers/hwmon/pmbus/mpq7932.c +f:drivers/hwmon/pmbus/mpq8785.c +f:drivers/hwmon/pmbus/pim4328.c +f:drivers/hwmon/pmbus/pli1209bc.c +f:drivers/hwmon/pmbus/pm6764tr.c +f:drivers/hwmon/pmbus/pmbus.c +f:drivers/hwmon/pmbus/pmbus.h +f:drivers/hwmon/pmbus/pmbus_core.c +f:drivers/hwmon/pmbus/pxe1610.c +f:drivers/hwmon/pmbus/q54sj108a2.c +f:drivers/hwmon/pmbus/stpddc60.c +f:drivers/hwmon/pmbus/tda38640.c +f:drivers/hwmon/pmbus/tps25990.c +f:drivers/hwmon/pmbus/tps40422.c +f:drivers/hwmon/pmbus/tps53679.c +f:drivers/hwmon/pmbus/tps546d24.c +f:drivers/hwmon/pmbus/ucd9000.c +f:drivers/hwmon/pmbus/ucd9200.c +f:drivers/hwmon/pmbus/xdp710.c +f:drivers/hwmon/pmbus/xdpe12284.c +f:drivers/hwmon/pmbus/xdpe152c4.c +f:drivers/hwmon/pmbus/zl6100.c +f:drivers/hwmon/powerz.c +f:drivers/hwmon/powr1220.c +f:drivers/hwmon/pt5161l.c +f:drivers/hwmon/pwm-fan.c +f:drivers/hwmon/qnap-mcu-hwmon.c +f:drivers/hwmon/raspberrypi-hwmon.c +f:drivers/hwmon/sbtsi_temp.c +f:drivers/hwmon/sch5627.c +f:drivers/hwmon/sch5636.c +f:drivers/hwmon/sch56xx-common.c +f:drivers/hwmon/sch56xx-common.h +f:drivers/hwmon/scmi-hwmon.c +f:drivers/hwmon/scpi-hwmon.c +f:drivers/hwmon/sfctemp.c +f:drivers/hwmon/sg2042-mcu.c +f:drivers/hwmon/sht15.c +f:drivers/hwmon/sht21.c +f:drivers/hwmon/sht3x.c +f:drivers/hwmon/sht4x.c +f:drivers/hwmon/shtc1.c +f:drivers/hwmon/sis5595.c +f:drivers/hwmon/sl28cpld-hwmon.c +f:drivers/hwmon/smpro-hwmon.c +f:drivers/hwmon/smsc47b397.c +f:drivers/hwmon/smsc47m1.c +f:drivers/hwmon/smsc47m192.c +f:drivers/hwmon/sparx5-temp.c +f:drivers/hwmon/spd5118.c +f:drivers/hwmon/stts751.c +f:drivers/hwmon/surface_fan.c +f:drivers/hwmon/surface_temp.c +f:drivers/hwmon/sy7636a-hwmon.c +f:drivers/hwmon/tc654.c +f:drivers/hwmon/tc74.c +f:drivers/hwmon/thmc50.c +f:drivers/hwmon/tmp102.c +f:drivers/hwmon/tmp103.c +f:drivers/hwmon/tmp108.c +f:drivers/hwmon/tmp401.c +f:drivers/hwmon/tmp421.c +f:drivers/hwmon/tmp464.c +f:drivers/hwmon/tmp513.c +f:drivers/hwmon/tps23861.c +f:drivers/hwmon/ultra45_env.c +f:drivers/hwmon/vexpress-hwmon.c +f:drivers/hwmon/via-cputemp.c +f:drivers/hwmon/via686a.c +f:drivers/hwmon/vt1211.c +f:drivers/hwmon/vt8231.c +f:drivers/hwmon/w83627ehf.c +f:drivers/hwmon/w83627hf.c +f:drivers/hwmon/w83773g.c +f:drivers/hwmon/w83781d.c +f:drivers/hwmon/w83791d.c +f:drivers/hwmon/w83792d.c +f:drivers/hwmon/w83793.c +f:drivers/hwmon/w83795.c +f:drivers/hwmon/w83l785ts.c +f:drivers/hwmon/w83l786ng.c +f:drivers/hwmon/wm831x-hwmon.c +f:drivers/hwmon/wm8350-hwmon.c +f:drivers/hwmon/xgene-hwmon.c +f:drivers/hwspinlock/Kconfig +f:drivers/hwspinlock/Makefile +f:drivers/hwspinlock/hwspinlock_core.c +f:drivers/hwspinlock/hwspinlock_internal.h +f:drivers/hwspinlock/omap_hwspinlock.c +f:drivers/hwspinlock/qcom_hwspinlock.c +f:drivers/hwspinlock/sprd_hwspinlock.c +f:drivers/hwspinlock/stm32_hwspinlock.c +f:drivers/hwspinlock/sun6i_hwspinlock.c +f:drivers/hwspinlock/u8500_hsem.c +f:drivers/hwtracing/Kconfig +f:drivers/hwtracing/coresight/Kconfig +f:drivers/hwtracing/coresight/Makefile +f:drivers/hwtracing/coresight/coresight-catu.c +f:drivers/hwtracing/coresight/coresight-catu.h +f:drivers/hwtracing/coresight/coresight-cfg-afdo.c +f:drivers/hwtracing/coresight/coresight-cfg-preload.c +f:drivers/hwtracing/coresight/coresight-cfg-preload.h +f:drivers/hwtracing/coresight/coresight-cfg-pstop.c +f:drivers/hwtracing/coresight/coresight-config.c +f:drivers/hwtracing/coresight/coresight-config.h +f:drivers/hwtracing/coresight/coresight-core.c +f:drivers/hwtracing/coresight/coresight-cpu-debug.c +f:drivers/hwtracing/coresight/coresight-ctcu-core.c +f:drivers/hwtracing/coresight/coresight-ctcu.h +f:drivers/hwtracing/coresight/coresight-cti-core.c +f:drivers/hwtracing/coresight/coresight-cti-platform.c +f:drivers/hwtracing/coresight/coresight-cti-sysfs.c +f:drivers/hwtracing/coresight/coresight-cti.h +f:drivers/hwtracing/coresight/coresight-dummy.c +f:drivers/hwtracing/coresight/coresight-etb10.c +f:drivers/hwtracing/coresight/coresight-etm-cp14.c +f:drivers/hwtracing/coresight/coresight-etm-perf.c +f:drivers/hwtracing/coresight/coresight-etm-perf.h +f:drivers/hwtracing/coresight/coresight-etm.h +f:drivers/hwtracing/coresight/coresight-etm3x-core.c +f:drivers/hwtracing/coresight/coresight-etm3x-sysfs.c +f:drivers/hwtracing/coresight/coresight-etm4x-cfg.c +f:drivers/hwtracing/coresight/coresight-etm4x-cfg.h +f:drivers/hwtracing/coresight/coresight-etm4x-core.c +f:drivers/hwtracing/coresight/coresight-etm4x-sysfs.c +f:drivers/hwtracing/coresight/coresight-etm4x.h +f:drivers/hwtracing/coresight/coresight-funnel.c +f:drivers/hwtracing/coresight/coresight-kunit-tests.c +f:drivers/hwtracing/coresight/coresight-platform.c +f:drivers/hwtracing/coresight/coresight-priv.h +f:drivers/hwtracing/coresight/coresight-replicator.c +f:drivers/hwtracing/coresight/coresight-self-hosted-trace.h +f:drivers/hwtracing/coresight/coresight-stm.c +f:drivers/hwtracing/coresight/coresight-syscfg-configfs.c +f:drivers/hwtracing/coresight/coresight-syscfg-configfs.h +f:drivers/hwtracing/coresight/coresight-syscfg.c +f:drivers/hwtracing/coresight/coresight-syscfg.h +f:drivers/hwtracing/coresight/coresight-sysfs.c +f:drivers/hwtracing/coresight/coresight-tmc-core.c +f:drivers/hwtracing/coresight/coresight-tmc-etf.c +f:drivers/hwtracing/coresight/coresight-tmc-etr.c +f:drivers/hwtracing/coresight/coresight-tmc.h +f:drivers/hwtracing/coresight/coresight-tpda.c +f:drivers/hwtracing/coresight/coresight-tpda.h +f:drivers/hwtracing/coresight/coresight-tpdm.c +f:drivers/hwtracing/coresight/coresight-tpdm.h +f:drivers/hwtracing/coresight/coresight-tpiu.c +f:drivers/hwtracing/coresight/coresight-trace-id.c +f:drivers/hwtracing/coresight/coresight-trace-id.h +f:drivers/hwtracing/coresight/coresight-trbe.c +f:drivers/hwtracing/coresight/coresight-trbe.h +f:drivers/hwtracing/coresight/ultrasoc-smb.c +f:drivers/hwtracing/coresight/ultrasoc-smb.h +f:drivers/hwtracing/intel_th/Kconfig +f:drivers/hwtracing/intel_th/Makefile +f:drivers/hwtracing/intel_th/acpi.c +f:drivers/hwtracing/intel_th/core.c +f:drivers/hwtracing/intel_th/debug.c +f:drivers/hwtracing/intel_th/debug.h +f:drivers/hwtracing/intel_th/gth.c +f:drivers/hwtracing/intel_th/gth.h +f:drivers/hwtracing/intel_th/intel_th.h +f:drivers/hwtracing/intel_th/msu-sink.c +f:drivers/hwtracing/intel_th/msu.c +f:drivers/hwtracing/intel_th/msu.h +f:drivers/hwtracing/intel_th/pci.c +f:drivers/hwtracing/intel_th/pti.c +f:drivers/hwtracing/intel_th/pti.h +f:drivers/hwtracing/intel_th/sth.c +f:drivers/hwtracing/intel_th/sth.h +f:drivers/hwtracing/ptt/Kconfig +f:drivers/hwtracing/ptt/Makefile +f:drivers/hwtracing/ptt/hisi_ptt.c +f:drivers/hwtracing/ptt/hisi_ptt.h +f:drivers/hwtracing/stm/Kconfig +f:drivers/hwtracing/stm/Makefile +f:drivers/hwtracing/stm/console.c +f:drivers/hwtracing/stm/core.c +f:drivers/hwtracing/stm/dummy_stm.c +f:drivers/hwtracing/stm/ftrace.c +f:drivers/hwtracing/stm/heartbeat.c +f:drivers/hwtracing/stm/p_basic.c +f:drivers/hwtracing/stm/p_sys-t.c +f:drivers/hwtracing/stm/policy.c +f:drivers/hwtracing/stm/stm.h +f:drivers/i2c/Kconfig +f:drivers/i2c/Makefile +f:drivers/i2c/algos/Kconfig +f:drivers/i2c/algos/Makefile +f:drivers/i2c/algos/i2c-algo-bit.c +f:drivers/i2c/algos/i2c-algo-pca.c +f:drivers/i2c/algos/i2c-algo-pcf.c +f:drivers/i2c/algos/i2c-algo-pcf.h +f:drivers/i2c/busses/Kconfig +f:drivers/i2c/busses/Makefile +f:drivers/i2c/busses/i2c-acorn.c +f:drivers/i2c/busses/i2c-ali1535.c +f:drivers/i2c/busses/i2c-ali1563.c +f:drivers/i2c/busses/i2c-ali15x3.c +f:drivers/i2c/busses/i2c-altera.c +f:drivers/i2c/busses/i2c-amd-asf-plat.c +f:drivers/i2c/busses/i2c-amd-mp2-pci.c +f:drivers/i2c/busses/i2c-amd-mp2-plat.c +f:drivers/i2c/busses/i2c-amd-mp2.h +f:drivers/i2c/busses/i2c-amd756.c +f:drivers/i2c/busses/i2c-amd8111.c +f:drivers/i2c/busses/i2c-aspeed.c +f:drivers/i2c/busses/i2c-at91-core.c +f:drivers/i2c/busses/i2c-at91-master.c +f:drivers/i2c/busses/i2c-at91-slave.c +f:drivers/i2c/busses/i2c-at91.h +f:drivers/i2c/busses/i2c-au1550.c +f:drivers/i2c/busses/i2c-axxia.c +f:drivers/i2c/busses/i2c-bcm-iproc.c +f:drivers/i2c/busses/i2c-bcm-kona.c +f:drivers/i2c/busses/i2c-bcm2835.c +f:drivers/i2c/busses/i2c-brcmstb.c +f:drivers/i2c/busses/i2c-cadence.c +f:drivers/i2c/busses/i2c-cbus-gpio.c +f:drivers/i2c/busses/i2c-ccgx-ucsi.c +f:drivers/i2c/busses/i2c-ccgx-ucsi.h +f:drivers/i2c/busses/i2c-cgbc.c +f:drivers/i2c/busses/i2c-cht-wc.c +f:drivers/i2c/busses/i2c-cp2615.c +f:drivers/i2c/busses/i2c-cpm.c +f:drivers/i2c/busses/i2c-cros-ec-tunnel.c +f:drivers/i2c/busses/i2c-davinci.c +f:drivers/i2c/busses/i2c-designware-amdisp.c +f:drivers/i2c/busses/i2c-designware-amdpsp.c +f:drivers/i2c/busses/i2c-designware-baytrail.c +f:drivers/i2c/busses/i2c-designware-common.c +f:drivers/i2c/busses/i2c-designware-core.h +f:drivers/i2c/busses/i2c-designware-master.c +f:drivers/i2c/busses/i2c-designware-pcidrv.c +f:drivers/i2c/busses/i2c-designware-platdrv.c +f:drivers/i2c/busses/i2c-designware-slave.c +f:drivers/i2c/busses/i2c-digicolor.c +f:drivers/i2c/busses/i2c-diolan-u2c.c +f:drivers/i2c/busses/i2c-dln2.c +f:drivers/i2c/busses/i2c-eg20t.c +f:drivers/i2c/busses/i2c-elektor.c +f:drivers/i2c/busses/i2c-emev2.c +f:drivers/i2c/busses/i2c-exynos5.c +f:drivers/i2c/busses/i2c-fsi.c +f:drivers/i2c/busses/i2c-gpio.c +f:drivers/i2c/busses/i2c-gxp.c +f:drivers/i2c/busses/i2c-highlander.c +f:drivers/i2c/busses/i2c-hisi.c +f:drivers/i2c/busses/i2c-hix5hd2.c +f:drivers/i2c/busses/i2c-hydra.c +f:drivers/i2c/busses/i2c-i801.c +f:drivers/i2c/busses/i2c-ibm_iic.c +f:drivers/i2c/busses/i2c-ibm_iic.h +f:drivers/i2c/busses/i2c-icy.c +f:drivers/i2c/busses/i2c-img-scb.c +f:drivers/i2c/busses/i2c-imx-lpi2c.c +f:drivers/i2c/busses/i2c-imx.c +f:drivers/i2c/busses/i2c-iop3xx.c +f:drivers/i2c/busses/i2c-iop3xx.h +f:drivers/i2c/busses/i2c-isch.c +f:drivers/i2c/busses/i2c-ismt.c +f:drivers/i2c/busses/i2c-jz4780.c +f:drivers/i2c/busses/i2c-k1.c +f:drivers/i2c/busses/i2c-keba.c +f:drivers/i2c/busses/i2c-kempld.c +f:drivers/i2c/busses/i2c-ljca.c +f:drivers/i2c/busses/i2c-lpc2k.c +f:drivers/i2c/busses/i2c-ls2x.c +f:drivers/i2c/busses/i2c-mchp-pci1xxxx.c +f:drivers/i2c/busses/i2c-meson.c +f:drivers/i2c/busses/i2c-microchip-corei2c.c +f:drivers/i2c/busses/i2c-mlxbf.c +f:drivers/i2c/busses/i2c-mlxcpld.c +f:drivers/i2c/busses/i2c-mpc.c +f:drivers/i2c/busses/i2c-mt65xx.c +f:drivers/i2c/busses/i2c-mt7621.c +f:drivers/i2c/busses/i2c-mv64xxx.c +f:drivers/i2c/busses/i2c-mxs.c +f:drivers/i2c/busses/i2c-nforce2.c +f:drivers/i2c/busses/i2c-nomadik.c +f:drivers/i2c/busses/i2c-npcm7xx.c +f:drivers/i2c/busses/i2c-nvidia-gpu.c +f:drivers/i2c/busses/i2c-ocores.c +f:drivers/i2c/busses/i2c-octeon-core.c +f:drivers/i2c/busses/i2c-octeon-core.h +f:drivers/i2c/busses/i2c-octeon-platdrv.c +f:drivers/i2c/busses/i2c-omap.c +f:drivers/i2c/busses/i2c-opal.c +f:drivers/i2c/busses/i2c-owl.c +f:drivers/i2c/busses/i2c-parport.c +f:drivers/i2c/busses/i2c-pasemi-core.c +f:drivers/i2c/busses/i2c-pasemi-core.h +f:drivers/i2c/busses/i2c-pasemi-pci.c +f:drivers/i2c/busses/i2c-pasemi-platform.c +f:drivers/i2c/busses/i2c-pca-isa.c +f:drivers/i2c/busses/i2c-pca-platform.c +f:drivers/i2c/busses/i2c-piix4.c +f:drivers/i2c/busses/i2c-piix4.h +f:drivers/i2c/busses/i2c-pnx.c +f:drivers/i2c/busses/i2c-powermac.c +f:drivers/i2c/busses/i2c-pxa-pci.c +f:drivers/i2c/busses/i2c-pxa.c +f:drivers/i2c/busses/i2c-qcom-cci.c +f:drivers/i2c/busses/i2c-qcom-geni.c +f:drivers/i2c/busses/i2c-qup.c +f:drivers/i2c/busses/i2c-rcar.c +f:drivers/i2c/busses/i2c-riic.c +f:drivers/i2c/busses/i2c-rk3x.c +f:drivers/i2c/busses/i2c-robotfuzz-osif.c +f:drivers/i2c/busses/i2c-rtl9300.c +f:drivers/i2c/busses/i2c-rzv2m.c +f:drivers/i2c/busses/i2c-s3c2410.c +f:drivers/i2c/busses/i2c-scmi.c +f:drivers/i2c/busses/i2c-sh7760.c +f:drivers/i2c/busses/i2c-sh_mobile.c +f:drivers/i2c/busses/i2c-sibyte.c +f:drivers/i2c/busses/i2c-simtec.c +f:drivers/i2c/busses/i2c-sis5595.c +f:drivers/i2c/busses/i2c-sis630.c +f:drivers/i2c/busses/i2c-sis96x.c +f:drivers/i2c/busses/i2c-sprd.c +f:drivers/i2c/busses/i2c-st.c +f:drivers/i2c/busses/i2c-stm32.c +f:drivers/i2c/busses/i2c-stm32.h +f:drivers/i2c/busses/i2c-stm32f4.c +f:drivers/i2c/busses/i2c-stm32f7.c +f:drivers/i2c/busses/i2c-sun6i-p2wi.c +f:drivers/i2c/busses/i2c-synquacer.c +f:drivers/i2c/busses/i2c-taos-evm.c +f:drivers/i2c/busses/i2c-tegra-bpmp.c +f:drivers/i2c/busses/i2c-tegra.c +f:drivers/i2c/busses/i2c-thunderx-pcidrv.c +f:drivers/i2c/busses/i2c-tiny-usb.c +f:drivers/i2c/busses/i2c-uniphier-f.c +f:drivers/i2c/busses/i2c-uniphier.c +f:drivers/i2c/busses/i2c-versatile.c +f:drivers/i2c/busses/i2c-via.c +f:drivers/i2c/busses/i2c-viai2c-common.c +f:drivers/i2c/busses/i2c-viai2c-common.h +f:drivers/i2c/busses/i2c-viai2c-wmt.c +f:drivers/i2c/busses/i2c-viai2c-zhaoxin.c +f:drivers/i2c/busses/i2c-viapro.c +f:drivers/i2c/busses/i2c-viperboard.c +f:drivers/i2c/busses/i2c-virtio.c +f:drivers/i2c/busses/i2c-xgene-slimpro.c +f:drivers/i2c/busses/i2c-xiic.c +f:drivers/i2c/busses/i2c-xlp9xx.c +f:drivers/i2c/busses/scx200_acb.c +f:drivers/i2c/i2c-atr.c +f:drivers/i2c/i2c-boardinfo.c +f:drivers/i2c/i2c-core-acpi.c +f:drivers/i2c/i2c-core-base.c +f:drivers/i2c/i2c-core-of-prober.c +f:drivers/i2c/i2c-core-of.c +f:drivers/i2c/i2c-core-slave.c +f:drivers/i2c/i2c-core-smbus.c +f:drivers/i2c/i2c-core.h +f:drivers/i2c/i2c-dev.c +f:drivers/i2c/i2c-mux.c +f:drivers/i2c/i2c-slave-eeprom.c +f:drivers/i2c/i2c-slave-testunit.c +f:drivers/i2c/i2c-smbus.c +f:drivers/i2c/i2c-stub.c +f:drivers/i2c/muxes/Kconfig +f:drivers/i2c/muxes/Makefile +f:drivers/i2c/muxes/i2c-arb-gpio-challenge.c +f:drivers/i2c/muxes/i2c-demux-pinctrl.c +f:drivers/i2c/muxes/i2c-mux-gpio.c +f:drivers/i2c/muxes/i2c-mux-gpmux.c +f:drivers/i2c/muxes/i2c-mux-ltc4306.c +f:drivers/i2c/muxes/i2c-mux-mlxcpld.c +f:drivers/i2c/muxes/i2c-mux-mule.c +f:drivers/i2c/muxes/i2c-mux-pca9541.c +f:drivers/i2c/muxes/i2c-mux-pca954x.c +f:drivers/i2c/muxes/i2c-mux-pinctrl.c +f:drivers/i2c/muxes/i2c-mux-reg.c +f:drivers/i3c/Kconfig +f:drivers/i3c/Makefile +f:drivers/i3c/device.c +f:drivers/i3c/internals.h +f:drivers/i3c/master.c +f:drivers/i3c/master/Kconfig +f:drivers/i3c/master/Makefile +f:drivers/i3c/master/ast2600-i3c-master.c +f:drivers/i3c/master/dw-i3c-master.c +f:drivers/i3c/master/dw-i3c-master.h +f:drivers/i3c/master/i3c-master-cdns.c +f:drivers/i3c/master/mipi-i3c-hci/Makefile +f:drivers/i3c/master/mipi-i3c-hci/cmd.h +f:drivers/i3c/master/mipi-i3c-hci/cmd_v1.c +f:drivers/i3c/master/mipi-i3c-hci/cmd_v2.c +f:drivers/i3c/master/mipi-i3c-hci/core.c +f:drivers/i3c/master/mipi-i3c-hci/dat.h +f:drivers/i3c/master/mipi-i3c-hci/dat_v1.c +f:drivers/i3c/master/mipi-i3c-hci/dct.h +f:drivers/i3c/master/mipi-i3c-hci/dct_v1.c +f:drivers/i3c/master/mipi-i3c-hci/dma.c +f:drivers/i3c/master/mipi-i3c-hci/ext_caps.c +f:drivers/i3c/master/mipi-i3c-hci/ext_caps.h +f:drivers/i3c/master/mipi-i3c-hci/hci.h +f:drivers/i3c/master/mipi-i3c-hci/hci_quirks.c +f:drivers/i3c/master/mipi-i3c-hci/ibi.h +f:drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c +f:drivers/i3c/master/mipi-i3c-hci/pio.c +f:drivers/i3c/master/mipi-i3c-hci/xfer_mode_rate.h +f:drivers/i3c/master/svc-i3c-master.c +f:drivers/idle/Kconfig +f:drivers/idle/Makefile +f:drivers/idle/intel_idle.c +f:drivers/iio/Kconfig +f:drivers/iio/Makefile +f:drivers/iio/TODO +f:drivers/iio/accel/Kconfig +f:drivers/iio/accel/Makefile +f:drivers/iio/accel/adis16201.c +f:drivers/iio/accel/adis16209.c +f:drivers/iio/accel/adxl313.h +f:drivers/iio/accel/adxl313_core.c +f:drivers/iio/accel/adxl313_i2c.c +f:drivers/iio/accel/adxl313_spi.c +f:drivers/iio/accel/adxl345.h +f:drivers/iio/accel/adxl345_core.c +f:drivers/iio/accel/adxl345_i2c.c +f:drivers/iio/accel/adxl345_spi.c +f:drivers/iio/accel/adxl355.h +f:drivers/iio/accel/adxl355_core.c +f:drivers/iio/accel/adxl355_i2c.c +f:drivers/iio/accel/adxl355_spi.c +f:drivers/iio/accel/adxl367.c +f:drivers/iio/accel/adxl367.h +f:drivers/iio/accel/adxl367_i2c.c +f:drivers/iio/accel/adxl367_spi.c +f:drivers/iio/accel/adxl372.c +f:drivers/iio/accel/adxl372.h +f:drivers/iio/accel/adxl372_i2c.c +f:drivers/iio/accel/adxl372_spi.c +f:drivers/iio/accel/adxl380.c +f:drivers/iio/accel/adxl380.h +f:drivers/iio/accel/adxl380_i2c.c +f:drivers/iio/accel/adxl380_spi.c +f:drivers/iio/accel/bma180.c +f:drivers/iio/accel/bma220_spi.c +f:drivers/iio/accel/bma400.h +f:drivers/iio/accel/bma400_core.c +f:drivers/iio/accel/bma400_i2c.c +f:drivers/iio/accel/bma400_spi.c +f:drivers/iio/accel/bmc150-accel-core.c +f:drivers/iio/accel/bmc150-accel-i2c.c +f:drivers/iio/accel/bmc150-accel-spi.c +f:drivers/iio/accel/bmc150-accel.h +f:drivers/iio/accel/bmi088-accel-core.c +f:drivers/iio/accel/bmi088-accel-i2c.c +f:drivers/iio/accel/bmi088-accel-spi.c +f:drivers/iio/accel/bmi088-accel.h +f:drivers/iio/accel/cros_ec_accel_legacy.c +f:drivers/iio/accel/da280.c +f:drivers/iio/accel/da311.c +f:drivers/iio/accel/dmard06.c +f:drivers/iio/accel/dmard09.c +f:drivers/iio/accel/dmard10.c +f:drivers/iio/accel/fxls8962af-core.c +f:drivers/iio/accel/fxls8962af-i2c.c +f:drivers/iio/accel/fxls8962af-spi.c +f:drivers/iio/accel/fxls8962af.h +f:drivers/iio/accel/hid-sensor-accel-3d.c +f:drivers/iio/accel/kionix-kx022a-i2c.c +f:drivers/iio/accel/kionix-kx022a-spi.c +f:drivers/iio/accel/kionix-kx022a.c +f:drivers/iio/accel/kionix-kx022a.h +f:drivers/iio/accel/kxcjk-1013.c +f:drivers/iio/accel/kxsd9-i2c.c +f:drivers/iio/accel/kxsd9-spi.c +f:drivers/iio/accel/kxsd9.c +f:drivers/iio/accel/kxsd9.h +f:drivers/iio/accel/mc3230.c +f:drivers/iio/accel/mma7455.h +f:drivers/iio/accel/mma7455_core.c +f:drivers/iio/accel/mma7455_i2c.c +f:drivers/iio/accel/mma7455_spi.c +f:drivers/iio/accel/mma7660.c +f:drivers/iio/accel/mma8452.c +f:drivers/iio/accel/mma9551.c +f:drivers/iio/accel/mma9551_core.c +f:drivers/iio/accel/mma9551_core.h +f:drivers/iio/accel/mma9553.c +f:drivers/iio/accel/msa311.c +f:drivers/iio/accel/mxc4005.c +f:drivers/iio/accel/mxc6255.c +f:drivers/iio/accel/sca3000.c +f:drivers/iio/accel/sca3300.c +f:drivers/iio/accel/ssp_accel_sensor.c +f:drivers/iio/accel/st_accel.h +f:drivers/iio/accel/st_accel_buffer.c +f:drivers/iio/accel/st_accel_core.c +f:drivers/iio/accel/st_accel_i2c.c +f:drivers/iio/accel/st_accel_spi.c +f:drivers/iio/accel/stk8312.c +f:drivers/iio/accel/stk8ba50.c +f:drivers/iio/adc/Kconfig +f:drivers/iio/adc/Makefile +f:drivers/iio/adc/ab8500-gpadc.c +f:drivers/iio/adc/ad4000.c +f:drivers/iio/adc/ad4030.c +f:drivers/iio/adc/ad4080.c +f:drivers/iio/adc/ad4130.c +f:drivers/iio/adc/ad4170-4.c +f:drivers/iio/adc/ad4695.c +f:drivers/iio/adc/ad4851.c +f:drivers/iio/adc/ad7091r-base.c +f:drivers/iio/adc/ad7091r-base.h +f:drivers/iio/adc/ad7091r5.c +f:drivers/iio/adc/ad7091r8.c +f:drivers/iio/adc/ad7124.c +f:drivers/iio/adc/ad7173.c +f:drivers/iio/adc/ad7191.c +f:drivers/iio/adc/ad7192.c +f:drivers/iio/adc/ad7266.c +f:drivers/iio/adc/ad7280a.c +f:drivers/iio/adc/ad7291.c +f:drivers/iio/adc/ad7292.c +f:drivers/iio/adc/ad7298.c +f:drivers/iio/adc/ad7380.c +f:drivers/iio/adc/ad7405.c +f:drivers/iio/adc/ad7476.c +f:drivers/iio/adc/ad7606.c +f:drivers/iio/adc/ad7606.h +f:drivers/iio/adc/ad7606_bus_iface.h +f:drivers/iio/adc/ad7606_par.c +f:drivers/iio/adc/ad7606_spi.c +f:drivers/iio/adc/ad7625.c +f:drivers/iio/adc/ad7766.c +f:drivers/iio/adc/ad7768-1.c +f:drivers/iio/adc/ad7779.c +f:drivers/iio/adc/ad7780.c +f:drivers/iio/adc/ad7791.c +f:drivers/iio/adc/ad7793.c +f:drivers/iio/adc/ad7887.c +f:drivers/iio/adc/ad7923.c +f:drivers/iio/adc/ad7944.c +f:drivers/iio/adc/ad7949.c +f:drivers/iio/adc/ad799x.c +f:drivers/iio/adc/ad9467.c +f:drivers/iio/adc/ad_sigma_delta.c +f:drivers/iio/adc/adi-axi-adc.c +f:drivers/iio/adc/aspeed_adc.c +f:drivers/iio/adc/at91-sama5d2_adc.c +f:drivers/iio/adc/at91_adc.c +f:drivers/iio/adc/axp20x_adc.c +f:drivers/iio/adc/axp288_adc.c +f:drivers/iio/adc/bcm_iproc_adc.c +f:drivers/iio/adc/berlin2-adc.c +f:drivers/iio/adc/cc10001_adc.c +f:drivers/iio/adc/cpcap-adc.c +f:drivers/iio/adc/da9150-gpadc.c +f:drivers/iio/adc/dln2-adc.c +f:drivers/iio/adc/envelope-detector.c +f:drivers/iio/adc/ep93xx_adc.c +f:drivers/iio/adc/exynos_adc.c +f:drivers/iio/adc/fsl-imx25-gcq.c +f:drivers/iio/adc/gehc-pmc-adc.c +f:drivers/iio/adc/hi8435.c +f:drivers/iio/adc/hx711.c +f:drivers/iio/adc/imx7d_adc.c +f:drivers/iio/adc/imx8qxp-adc.c +f:drivers/iio/adc/imx93_adc.c +f:drivers/iio/adc/ina2xx-adc.c +f:drivers/iio/adc/industrialio-adc.c +f:drivers/iio/adc/ingenic-adc.c +f:drivers/iio/adc/intel_mrfld_adc.c +f:drivers/iio/adc/lp8788_adc.c +f:drivers/iio/adc/lpc18xx_adc.c +f:drivers/iio/adc/lpc32xx_adc.c +f:drivers/iio/adc/ltc2309.c +f:drivers/iio/adc/ltc2471.c +f:drivers/iio/adc/ltc2485.c +f:drivers/iio/adc/ltc2496.c +f:drivers/iio/adc/ltc2497-core.c +f:drivers/iio/adc/ltc2497.c +f:drivers/iio/adc/ltc2497.h +f:drivers/iio/adc/max1027.c +f:drivers/iio/adc/max11100.c +f:drivers/iio/adc/max1118.c +f:drivers/iio/adc/max11205.c +f:drivers/iio/adc/max11410.c +f:drivers/iio/adc/max1241.c +f:drivers/iio/adc/max1363.c +f:drivers/iio/adc/max34408.c +f:drivers/iio/adc/max77541-adc.c +f:drivers/iio/adc/max9611.c +f:drivers/iio/adc/mcp320x.c +f:drivers/iio/adc/mcp3422.c +f:drivers/iio/adc/mcp3564.c +f:drivers/iio/adc/mcp3911.c +f:drivers/iio/adc/men_z188_adc.c +f:drivers/iio/adc/meson_saradc.c +f:drivers/iio/adc/mp2629_adc.c +f:drivers/iio/adc/mt6359-auxadc.c +f:drivers/iio/adc/mt6360-adc.c +f:drivers/iio/adc/mt6370-adc.c +f:drivers/iio/adc/mt6577_auxadc.c +f:drivers/iio/adc/mxs-lradc-adc.c +f:drivers/iio/adc/nau7802.c +f:drivers/iio/adc/nct7201.c +f:drivers/iio/adc/npcm_adc.c +f:drivers/iio/adc/pac1921.c +f:drivers/iio/adc/pac1934.c +f:drivers/iio/adc/palmas_gpadc.c +f:drivers/iio/adc/qcom-pm8xxx-xoadc.c +f:drivers/iio/adc/qcom-spmi-adc5.c +f:drivers/iio/adc/qcom-spmi-iadc.c +f:drivers/iio/adc/qcom-spmi-rradc.c +f:drivers/iio/adc/qcom-spmi-vadc.c +f:drivers/iio/adc/qcom-vadc-common.c +f:drivers/iio/adc/rcar-gyroadc.c +f:drivers/iio/adc/rn5t618-adc.c +f:drivers/iio/adc/rockchip_saradc.c +f:drivers/iio/adc/rohm-bd79124.c +f:drivers/iio/adc/rtq6056.c +f:drivers/iio/adc/rzg2l_adc.c +f:drivers/iio/adc/sc27xx_adc.c +f:drivers/iio/adc/sd_adc_modulator.c +f:drivers/iio/adc/sophgo-cv1800b-adc.c +f:drivers/iio/adc/spear_adc.c +f:drivers/iio/adc/stm32-adc-core.c +f:drivers/iio/adc/stm32-adc-core.h +f:drivers/iio/adc/stm32-adc.c +f:drivers/iio/adc/stm32-dfsdm-adc.c +f:drivers/iio/adc/stm32-dfsdm-core.c +f:drivers/iio/adc/stm32-dfsdm.h +f:drivers/iio/adc/stmpe-adc.c +f:drivers/iio/adc/sun20i-gpadc-iio.c +f:drivers/iio/adc/sun4i-gpadc-iio.c +f:drivers/iio/adc/ti-adc081c.c +f:drivers/iio/adc/ti-adc0832.c +f:drivers/iio/adc/ti-adc084s021.c +f:drivers/iio/adc/ti-adc108s102.c +f:drivers/iio/adc/ti-adc12138.c +f:drivers/iio/adc/ti-adc128s052.c +f:drivers/iio/adc/ti-adc161s626.c +f:drivers/iio/adc/ti-ads1015.c +f:drivers/iio/adc/ti-ads1100.c +f:drivers/iio/adc/ti-ads1119.c +f:drivers/iio/adc/ti-ads124s08.c +f:drivers/iio/adc/ti-ads1298.c +f:drivers/iio/adc/ti-ads131e08.c +f:drivers/iio/adc/ti-ads7138.c +f:drivers/iio/adc/ti-ads7924.c +f:drivers/iio/adc/ti-ads7950.c +f:drivers/iio/adc/ti-ads8344.c +f:drivers/iio/adc/ti-ads8688.c +f:drivers/iio/adc/ti-lmp92064.c +f:drivers/iio/adc/ti-tlc4541.c +f:drivers/iio/adc/ti-tsc2046.c +f:drivers/iio/adc/ti_am335x_adc.c +f:drivers/iio/adc/twl4030-madc.c +f:drivers/iio/adc/twl6030-gpadc.c +f:drivers/iio/adc/vf610_adc.c +f:drivers/iio/adc/viperboard_adc.c +f:drivers/iio/adc/xilinx-ams.c +f:drivers/iio/adc/xilinx-xadc-core.c +f:drivers/iio/adc/xilinx-xadc-events.c +f:drivers/iio/adc/xilinx-xadc.h +f:drivers/iio/addac/Kconfig +f:drivers/iio/addac/Makefile +f:drivers/iio/addac/ad74115.c +f:drivers/iio/addac/ad74413r.c +f:drivers/iio/addac/stx104.c +f:drivers/iio/afe/Kconfig +f:drivers/iio/afe/Makefile +f:drivers/iio/afe/iio-rescale.c +f:drivers/iio/amplifiers/Kconfig +f:drivers/iio/amplifiers/Makefile +f:drivers/iio/amplifiers/ad8366.c +f:drivers/iio/amplifiers/ada4250.c +f:drivers/iio/amplifiers/hmc425a.c +f:drivers/iio/buffer/Kconfig +f:drivers/iio/buffer/Makefile +f:drivers/iio/buffer/industrialio-buffer-cb.c +f:drivers/iio/buffer/industrialio-buffer-dma.c +f:drivers/iio/buffer/industrialio-buffer-dmaengine.c +f:drivers/iio/buffer/industrialio-hw-consumer.c +f:drivers/iio/buffer/industrialio-triggered-buffer.c +f:drivers/iio/buffer/kfifo_buf.c +f:drivers/iio/cdc/Kconfig +f:drivers/iio/cdc/Makefile +f:drivers/iio/cdc/ad7150.c +f:drivers/iio/cdc/ad7746.c +f:drivers/iio/chemical/Kconfig +f:drivers/iio/chemical/Makefile +f:drivers/iio/chemical/ags02ma.c +f:drivers/iio/chemical/ams-iaq-core.c +f:drivers/iio/chemical/atlas-ezo-sensor.c +f:drivers/iio/chemical/atlas-sensor.c +f:drivers/iio/chemical/bme680.h +f:drivers/iio/chemical/bme680_core.c +f:drivers/iio/chemical/bme680_i2c.c +f:drivers/iio/chemical/bme680_spi.c +f:drivers/iio/chemical/ccs811.c +f:drivers/iio/chemical/ens160.h +f:drivers/iio/chemical/ens160_core.c +f:drivers/iio/chemical/ens160_i2c.c +f:drivers/iio/chemical/ens160_spi.c +f:drivers/iio/chemical/mhz19b.c +f:drivers/iio/chemical/pms7003.c +f:drivers/iio/chemical/scd30.h +f:drivers/iio/chemical/scd30_core.c +f:drivers/iio/chemical/scd30_i2c.c +f:drivers/iio/chemical/scd30_serial.c +f:drivers/iio/chemical/scd4x.c +f:drivers/iio/chemical/sen0322.c +f:drivers/iio/chemical/sgp30.c +f:drivers/iio/chemical/sgp40.c +f:drivers/iio/chemical/sps30.c +f:drivers/iio/chemical/sps30.h +f:drivers/iio/chemical/sps30_i2c.c +f:drivers/iio/chemical/sps30_serial.c +f:drivers/iio/chemical/sunrise_co2.c +f:drivers/iio/chemical/vz89x.c +f:drivers/iio/common/Kconfig +f:drivers/iio/common/Makefile +f:drivers/iio/common/cros_ec_sensors/Kconfig +f:drivers/iio/common/cros_ec_sensors/Makefile +f:drivers/iio/common/cros_ec_sensors/cros_ec_activity.c +f:drivers/iio/common/cros_ec_sensors/cros_ec_lid_angle.c +f:drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c +f:drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c +f:drivers/iio/common/cros_ec_sensors/cros_ec_sensors_trace.c +f:drivers/iio/common/cros_ec_sensors/cros_ec_sensors_trace.h +f:drivers/iio/common/hid-sensors/Kconfig +f:drivers/iio/common/hid-sensors/Makefile +f:drivers/iio/common/hid-sensors/hid-sensor-attributes.c +f:drivers/iio/common/hid-sensors/hid-sensor-trigger.c +f:drivers/iio/common/hid-sensors/hid-sensor-trigger.h +f:drivers/iio/common/inv_sensors/Kconfig +f:drivers/iio/common/inv_sensors/Makefile +f:drivers/iio/common/inv_sensors/inv_sensors_timestamp.c +f:drivers/iio/common/ms_sensors/Kconfig +f:drivers/iio/common/ms_sensors/Makefile +f:drivers/iio/common/ms_sensors/ms_sensors_i2c.c +f:drivers/iio/common/ms_sensors/ms_sensors_i2c.h +f:drivers/iio/common/scmi_sensors/Kconfig +f:drivers/iio/common/scmi_sensors/Makefile +f:drivers/iio/common/scmi_sensors/scmi_iio.c +f:drivers/iio/common/ssp_sensors/Kconfig +f:drivers/iio/common/ssp_sensors/Makefile +f:drivers/iio/common/ssp_sensors/ssp.h +f:drivers/iio/common/ssp_sensors/ssp_dev.c +f:drivers/iio/common/ssp_sensors/ssp_iio.c +f:drivers/iio/common/ssp_sensors/ssp_iio_sensor.h +f:drivers/iio/common/ssp_sensors/ssp_spi.c +f:drivers/iio/common/st_sensors/Kconfig +f:drivers/iio/common/st_sensors/Makefile +f:drivers/iio/common/st_sensors/st_sensors_buffer.c +f:drivers/iio/common/st_sensors/st_sensors_core.c +f:drivers/iio/common/st_sensors/st_sensors_core.h +f:drivers/iio/common/st_sensors/st_sensors_i2c.c +f:drivers/iio/common/st_sensors/st_sensors_spi.c +f:drivers/iio/common/st_sensors/st_sensors_trigger.c +f:drivers/iio/dac/Kconfig +f:drivers/iio/dac/Makefile +f:drivers/iio/dac/ad3530r.c +f:drivers/iio/dac/ad3552r-common.c +f:drivers/iio/dac/ad3552r-hs.c +f:drivers/iio/dac/ad3552r-hs.h +f:drivers/iio/dac/ad3552r.c +f:drivers/iio/dac/ad3552r.h +f:drivers/iio/dac/ad5064.c +f:drivers/iio/dac/ad5360.c +f:drivers/iio/dac/ad5380.c +f:drivers/iio/dac/ad5421.c +f:drivers/iio/dac/ad5446.c +f:drivers/iio/dac/ad5449.c +f:drivers/iio/dac/ad5504.c +f:drivers/iio/dac/ad5592r-base.c +f:drivers/iio/dac/ad5592r-base.h +f:drivers/iio/dac/ad5592r.c +f:drivers/iio/dac/ad5593r.c +f:drivers/iio/dac/ad5624r.h +f:drivers/iio/dac/ad5624r_spi.c +f:drivers/iio/dac/ad5686-spi.c +f:drivers/iio/dac/ad5686.c +f:drivers/iio/dac/ad5686.h +f:drivers/iio/dac/ad5696-i2c.c +f:drivers/iio/dac/ad5755.c +f:drivers/iio/dac/ad5758.c +f:drivers/iio/dac/ad5761.c +f:drivers/iio/dac/ad5764.c +f:drivers/iio/dac/ad5766.c +f:drivers/iio/dac/ad5770r.c +f:drivers/iio/dac/ad5791.c +f:drivers/iio/dac/ad7293.c +f:drivers/iio/dac/ad7303.c +f:drivers/iio/dac/ad8460.c +f:drivers/iio/dac/ad8801.c +f:drivers/iio/dac/ad9739a.c +f:drivers/iio/dac/adi-axi-dac.c +f:drivers/iio/dac/cio-dac.c +f:drivers/iio/dac/dpot-dac.c +f:drivers/iio/dac/ds4424.c +f:drivers/iio/dac/lpc18xx_dac.c +f:drivers/iio/dac/ltc1660.c +f:drivers/iio/dac/ltc2632.c +f:drivers/iio/dac/ltc2664.c +f:drivers/iio/dac/ltc2688.c +f:drivers/iio/dac/m62332.c +f:drivers/iio/dac/max517.c +f:drivers/iio/dac/max5522.c +f:drivers/iio/dac/max5821.c +f:drivers/iio/dac/mcp4725.c +f:drivers/iio/dac/mcp4728.c +f:drivers/iio/dac/mcp4821.c +f:drivers/iio/dac/mcp4922.c +f:drivers/iio/dac/rohm-bd79703.c +f:drivers/iio/dac/stm32-dac-core.c +f:drivers/iio/dac/stm32-dac-core.h +f:drivers/iio/dac/stm32-dac.c +f:drivers/iio/dac/ti-dac082s085.c +f:drivers/iio/dac/ti-dac5571.c +f:drivers/iio/dac/ti-dac7311.c +f:drivers/iio/dac/ti-dac7612.c +f:drivers/iio/dac/vf610_dac.c +f:drivers/iio/dummy/Kconfig +f:drivers/iio/dummy/Makefile +f:drivers/iio/dummy/iio_dummy_evgen.c +f:drivers/iio/dummy/iio_dummy_evgen.h +f:drivers/iio/dummy/iio_simple_dummy.c +f:drivers/iio/dummy/iio_simple_dummy.h +f:drivers/iio/dummy/iio_simple_dummy_buffer.c +f:drivers/iio/dummy/iio_simple_dummy_events.c +f:drivers/iio/filter/Kconfig +f:drivers/iio/filter/Makefile +f:drivers/iio/filter/admv8818.c +f:drivers/iio/frequency/Kconfig +f:drivers/iio/frequency/Makefile +f:drivers/iio/frequency/ad9523.c +f:drivers/iio/frequency/adf4350.c +f:drivers/iio/frequency/adf4371.c +f:drivers/iio/frequency/adf4377.c +f:drivers/iio/frequency/admfm2000.c +f:drivers/iio/frequency/admv1013.c +f:drivers/iio/frequency/admv1014.c +f:drivers/iio/frequency/admv4420.c +f:drivers/iio/frequency/adrf6780.c +f:drivers/iio/gyro/Kconfig +f:drivers/iio/gyro/Makefile +f:drivers/iio/gyro/adis16080.c +f:drivers/iio/gyro/adis16130.c +f:drivers/iio/gyro/adis16136.c +f:drivers/iio/gyro/adis16260.c +f:drivers/iio/gyro/adxrs290.c +f:drivers/iio/gyro/adxrs450.c +f:drivers/iio/gyro/bmg160.h +f:drivers/iio/gyro/bmg160_core.c +f:drivers/iio/gyro/bmg160_i2c.c +f:drivers/iio/gyro/bmg160_spi.c +f:drivers/iio/gyro/fxas21002c.h +f:drivers/iio/gyro/fxas21002c_core.c +f:drivers/iio/gyro/fxas21002c_i2c.c +f:drivers/iio/gyro/fxas21002c_spi.c +f:drivers/iio/gyro/hid-sensor-gyro-3d.c +f:drivers/iio/gyro/itg3200_buffer.c +f:drivers/iio/gyro/itg3200_core.c +f:drivers/iio/gyro/mpu3050-core.c +f:drivers/iio/gyro/mpu3050-i2c.c +f:drivers/iio/gyro/mpu3050.h +f:drivers/iio/gyro/ssp_gyro_sensor.c +f:drivers/iio/gyro/st_gyro.h +f:drivers/iio/gyro/st_gyro_buffer.c +f:drivers/iio/gyro/st_gyro_core.c +f:drivers/iio/gyro/st_gyro_i2c.c +f:drivers/iio/gyro/st_gyro_spi.c +f:drivers/iio/health/Kconfig +f:drivers/iio/health/Makefile +f:drivers/iio/health/afe4403.c +f:drivers/iio/health/afe4404.c +f:drivers/iio/health/afe440x.h +f:drivers/iio/health/max30100.c +f:drivers/iio/health/max30102.c +f:drivers/iio/humidity/Kconfig +f:drivers/iio/humidity/Makefile +f:drivers/iio/humidity/am2315.c +f:drivers/iio/humidity/dht11.c +f:drivers/iio/humidity/ens210.c +f:drivers/iio/humidity/hdc100x.c +f:drivers/iio/humidity/hdc2010.c +f:drivers/iio/humidity/hdc3020.c +f:drivers/iio/humidity/hid-sensor-humidity.c +f:drivers/iio/humidity/hts221.h +f:drivers/iio/humidity/hts221_buffer.c +f:drivers/iio/humidity/hts221_core.c +f:drivers/iio/humidity/hts221_i2c.c +f:drivers/iio/humidity/hts221_spi.c +f:drivers/iio/humidity/htu21.c +f:drivers/iio/humidity/si7005.c +f:drivers/iio/humidity/si7020.c +f:drivers/iio/iio_core.h +f:drivers/iio/iio_core_trigger.h +f:drivers/iio/imu/Kconfig +f:drivers/iio/imu/Makefile +f:drivers/iio/imu/adis.c +f:drivers/iio/imu/adis16400.c +f:drivers/iio/imu/adis16460.c +f:drivers/iio/imu/adis16475.c +f:drivers/iio/imu/adis16480.c +f:drivers/iio/imu/adis16550.c +f:drivers/iio/imu/adis_buffer.c +f:drivers/iio/imu/adis_trigger.c +f:drivers/iio/imu/bmi160/Kconfig +f:drivers/iio/imu/bmi160/Makefile +f:drivers/iio/imu/bmi160/bmi160.h +f:drivers/iio/imu/bmi160/bmi160_core.c +f:drivers/iio/imu/bmi160/bmi160_i2c.c +f:drivers/iio/imu/bmi160/bmi160_spi.c +f:drivers/iio/imu/bmi270/Kconfig +f:drivers/iio/imu/bmi270/Makefile +f:drivers/iio/imu/bmi270/bmi270.h +f:drivers/iio/imu/bmi270/bmi270_core.c +f:drivers/iio/imu/bmi270/bmi270_i2c.c +f:drivers/iio/imu/bmi270/bmi270_spi.c +f:drivers/iio/imu/bmi323/Kconfig +f:drivers/iio/imu/bmi323/Makefile +f:drivers/iio/imu/bmi323/bmi323.h +f:drivers/iio/imu/bmi323/bmi323_core.c +f:drivers/iio/imu/bmi323/bmi323_i2c.c +f:drivers/iio/imu/bmi323/bmi323_spi.c +f:drivers/iio/imu/bno055/Kconfig +f:drivers/iio/imu/bno055/Makefile +f:drivers/iio/imu/bno055/bno055.c +f:drivers/iio/imu/bno055/bno055.h +f:drivers/iio/imu/bno055/bno055_i2c.c +f:drivers/iio/imu/bno055/bno055_ser_core.c +f:drivers/iio/imu/bno055/bno055_ser_trace.c +f:drivers/iio/imu/bno055/bno055_ser_trace.h +f:drivers/iio/imu/fxos8700.h +f:drivers/iio/imu/fxos8700_core.c +f:drivers/iio/imu/fxos8700_i2c.c +f:drivers/iio/imu/fxos8700_spi.c +f:drivers/iio/imu/inv_icm42600/Kconfig +f:drivers/iio/imu/inv_icm42600/Makefile +f:drivers/iio/imu/inv_icm42600/inv_icm42600.h +f:drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c +f:drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c +f:drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h +f:drivers/iio/imu/inv_icm42600/inv_icm42600_core.c +f:drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c +f:drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c +f:drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c +f:drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c +f:drivers/iio/imu/inv_icm42600/inv_icm42600_temp.h +f:drivers/iio/imu/inv_mpu6050/Kconfig +f:drivers/iio/imu/inv_mpu6050/Makefile +f:drivers/iio/imu/inv_mpu6050/inv_mpu_acpi.c +f:drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c +f:drivers/iio/imu/inv_mpu6050/inv_mpu_aux.h +f:drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +f:drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c +f:drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h +f:drivers/iio/imu/inv_mpu6050/inv_mpu_magn.c +f:drivers/iio/imu/inv_mpu6050/inv_mpu_magn.h +f:drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c +f:drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c +f:drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c +f:drivers/iio/imu/kmx61.c +f:drivers/iio/imu/smi240.c +f:drivers/iio/imu/st_lsm6dsx/Kconfig +f:drivers/iio/imu/st_lsm6dsx/Makefile +f:drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +f:drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c +f:drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +f:drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c +f:drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i3c.c +f:drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c +f:drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c +f:drivers/iio/imu/st_lsm9ds0/Kconfig +f:drivers/iio/imu/st_lsm9ds0/Makefile +f:drivers/iio/imu/st_lsm9ds0/st_lsm9ds0.h +f:drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_core.c +f:drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_i2c.c +f:drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_spi.c +f:drivers/iio/industrialio-acpi.c +f:drivers/iio/industrialio-backend.c +f:drivers/iio/industrialio-buffer.c +f:drivers/iio/industrialio-configfs.c +f:drivers/iio/industrialio-core.c +f:drivers/iio/industrialio-event.c +f:drivers/iio/industrialio-gts-helper.c +f:drivers/iio/industrialio-sw-device.c +f:drivers/iio/industrialio-sw-trigger.c +f:drivers/iio/industrialio-trigger.c +f:drivers/iio/industrialio-triggered-event.c +f:drivers/iio/inkern.c +f:drivers/iio/light/Kconfig +f:drivers/iio/light/Makefile +f:drivers/iio/light/acpi-als.c +f:drivers/iio/light/adjd_s311.c +f:drivers/iio/light/adux1020.c +f:drivers/iio/light/al3000a.c +f:drivers/iio/light/al3010.c +f:drivers/iio/light/al3320a.c +f:drivers/iio/light/apds9160.c +f:drivers/iio/light/apds9300.c +f:drivers/iio/light/apds9306.c +f:drivers/iio/light/apds9960.c +f:drivers/iio/light/as73211.c +f:drivers/iio/light/bh1745.c +f:drivers/iio/light/bh1750.c +f:drivers/iio/light/bh1780.c +f:drivers/iio/light/cm32181.c +f:drivers/iio/light/cm3232.c +f:drivers/iio/light/cm3323.c +f:drivers/iio/light/cm3605.c +f:drivers/iio/light/cm36651.c +f:drivers/iio/light/cros_ec_light_prox.c +f:drivers/iio/light/gp2ap002.c +f:drivers/iio/light/gp2ap020a00f.c +f:drivers/iio/light/hid-sensor-als.c +f:drivers/iio/light/hid-sensor-prox.c +f:drivers/iio/light/iqs621-als.c +f:drivers/iio/light/isl29018.c +f:drivers/iio/light/isl29028.c +f:drivers/iio/light/isl29125.c +f:drivers/iio/light/isl76682.c +f:drivers/iio/light/jsa1212.c +f:drivers/iio/light/lm3533-als.c +f:drivers/iio/light/ltr390.c +f:drivers/iio/light/ltr501.c +f:drivers/iio/light/ltrf216a.c +f:drivers/iio/light/lv0104cs.c +f:drivers/iio/light/max44000.c +f:drivers/iio/light/max44009.c +f:drivers/iio/light/noa1305.c +f:drivers/iio/light/opt3001.c +f:drivers/iio/light/opt4001.c +f:drivers/iio/light/opt4060.c +f:drivers/iio/light/pa12203001.c +f:drivers/iio/light/rohm-bu27034.c +f:drivers/iio/light/rpr0521.c +f:drivers/iio/light/si1133.c +f:drivers/iio/light/si1145.c +f:drivers/iio/light/st_uvis25.h +f:drivers/iio/light/st_uvis25_core.c +f:drivers/iio/light/st_uvis25_i2c.c +f:drivers/iio/light/st_uvis25_spi.c +f:drivers/iio/light/stk3310.c +f:drivers/iio/light/tcs3414.c +f:drivers/iio/light/tcs3472.c +f:drivers/iio/light/tsl2563.c +f:drivers/iio/light/tsl2583.c +f:drivers/iio/light/tsl2591.c +f:drivers/iio/light/tsl2772.c +f:drivers/iio/light/tsl4531.c +f:drivers/iio/light/us5182d.c +f:drivers/iio/light/vcnl4000.c +f:drivers/iio/light/vcnl4035.c +f:drivers/iio/light/veml3235.c +f:drivers/iio/light/veml6030.c +f:drivers/iio/light/veml6040.c +f:drivers/iio/light/veml6070.c +f:drivers/iio/light/veml6075.c +f:drivers/iio/light/vl6180.c +f:drivers/iio/light/zopt2201.c +f:drivers/iio/magnetometer/Kconfig +f:drivers/iio/magnetometer/Makefile +f:drivers/iio/magnetometer/af8133j.c +f:drivers/iio/magnetometer/ak8974.c +f:drivers/iio/magnetometer/ak8975.c +f:drivers/iio/magnetometer/als31300.c +f:drivers/iio/magnetometer/bmc150_magn.c +f:drivers/iio/magnetometer/bmc150_magn.h +f:drivers/iio/magnetometer/bmc150_magn_i2c.c +f:drivers/iio/magnetometer/bmc150_magn_spi.c +f:drivers/iio/magnetometer/hid-sensor-magn-3d.c +f:drivers/iio/magnetometer/hmc5843.h +f:drivers/iio/magnetometer/hmc5843_core.c +f:drivers/iio/magnetometer/hmc5843_i2c.c +f:drivers/iio/magnetometer/hmc5843_spi.c +f:drivers/iio/magnetometer/mag3110.c +f:drivers/iio/magnetometer/mmc35240.c +f:drivers/iio/magnetometer/rm3100-core.c +f:drivers/iio/magnetometer/rm3100-i2c.c +f:drivers/iio/magnetometer/rm3100-spi.c +f:drivers/iio/magnetometer/rm3100.h +f:drivers/iio/magnetometer/si7210.c +f:drivers/iio/magnetometer/st_magn.h +f:drivers/iio/magnetometer/st_magn_buffer.c +f:drivers/iio/magnetometer/st_magn_core.c +f:drivers/iio/magnetometer/st_magn_i2c.c +f:drivers/iio/magnetometer/st_magn_spi.c +f:drivers/iio/magnetometer/tmag5273.c +f:drivers/iio/magnetometer/yamaha-yas530.c +f:drivers/iio/multiplexer/Kconfig +f:drivers/iio/multiplexer/Makefile +f:drivers/iio/multiplexer/iio-mux.c +f:drivers/iio/orientation/Kconfig +f:drivers/iio/orientation/Makefile +f:drivers/iio/orientation/hid-sensor-incl-3d.c +f:drivers/iio/orientation/hid-sensor-rotation.c +f:drivers/iio/position/Kconfig +f:drivers/iio/position/Makefile +f:drivers/iio/position/hid-sensor-custom-intel-hinge.c +f:drivers/iio/position/iqs624-pos.c +f:drivers/iio/potentiometer/Kconfig +f:drivers/iio/potentiometer/Makefile +f:drivers/iio/potentiometer/ad5110.c +f:drivers/iio/potentiometer/ad5272.c +f:drivers/iio/potentiometer/ds1803.c +f:drivers/iio/potentiometer/max5432.c +f:drivers/iio/potentiometer/max5481.c +f:drivers/iio/potentiometer/max5487.c +f:drivers/iio/potentiometer/mcp4018.c +f:drivers/iio/potentiometer/mcp41010.c +f:drivers/iio/potentiometer/mcp4131.c +f:drivers/iio/potentiometer/mcp4531.c +f:drivers/iio/potentiometer/tpl0102.c +f:drivers/iio/potentiometer/x9250.c +f:drivers/iio/potentiostat/Kconfig +f:drivers/iio/potentiostat/Makefile +f:drivers/iio/potentiostat/lmp91000.c +f:drivers/iio/pressure/Kconfig +f:drivers/iio/pressure/Makefile +f:drivers/iio/pressure/abp060mg.c +f:drivers/iio/pressure/bmp280-core.c +f:drivers/iio/pressure/bmp280-i2c.c +f:drivers/iio/pressure/bmp280-regmap.c +f:drivers/iio/pressure/bmp280-spi.c +f:drivers/iio/pressure/bmp280.h +f:drivers/iio/pressure/cros_ec_baro.c +f:drivers/iio/pressure/dlhl60d.c +f:drivers/iio/pressure/dps310.c +f:drivers/iio/pressure/hid-sensor-press.c +f:drivers/iio/pressure/hp03.c +f:drivers/iio/pressure/hp206c.c +f:drivers/iio/pressure/hsc030pa.c +f:drivers/iio/pressure/hsc030pa.h +f:drivers/iio/pressure/hsc030pa_i2c.c +f:drivers/iio/pressure/hsc030pa_spi.c +f:drivers/iio/pressure/icp10100.c +f:drivers/iio/pressure/mpl115.c +f:drivers/iio/pressure/mpl115.h +f:drivers/iio/pressure/mpl115_i2c.c +f:drivers/iio/pressure/mpl115_spi.c +f:drivers/iio/pressure/mpl3115.c +f:drivers/iio/pressure/mprls0025pa.c +f:drivers/iio/pressure/mprls0025pa.h +f:drivers/iio/pressure/mprls0025pa_i2c.c +f:drivers/iio/pressure/mprls0025pa_spi.c +f:drivers/iio/pressure/ms5611.h +f:drivers/iio/pressure/ms5611_core.c +f:drivers/iio/pressure/ms5611_i2c.c +f:drivers/iio/pressure/ms5611_spi.c +f:drivers/iio/pressure/ms5637.c +f:drivers/iio/pressure/rohm-bm1390.c +f:drivers/iio/pressure/sdp500.c +f:drivers/iio/pressure/st_pressure.h +f:drivers/iio/pressure/st_pressure_buffer.c +f:drivers/iio/pressure/st_pressure_core.c +f:drivers/iio/pressure/st_pressure_i2c.c +f:drivers/iio/pressure/st_pressure_spi.c +f:drivers/iio/pressure/t5403.c +f:drivers/iio/pressure/zpa2326.c +f:drivers/iio/pressure/zpa2326.h +f:drivers/iio/pressure/zpa2326_i2c.c +f:drivers/iio/pressure/zpa2326_spi.c +f:drivers/iio/proximity/Kconfig +f:drivers/iio/proximity/Makefile +f:drivers/iio/proximity/as3935.c +f:drivers/iio/proximity/aw96103.c +f:drivers/iio/proximity/cros_ec_mkbp_proximity.c +f:drivers/iio/proximity/d3323aa.c +f:drivers/iio/proximity/hx9023s.c +f:drivers/iio/proximity/irsd200.c +f:drivers/iio/proximity/isl29501.c +f:drivers/iio/proximity/mb1232.c +f:drivers/iio/proximity/ping.c +f:drivers/iio/proximity/pulsedlight-lidar-lite-v2.c +f:drivers/iio/proximity/rfd77402.c +f:drivers/iio/proximity/srf04.c +f:drivers/iio/proximity/srf08.c +f:drivers/iio/proximity/sx9310.c +f:drivers/iio/proximity/sx9324.c +f:drivers/iio/proximity/sx9360.c +f:drivers/iio/proximity/sx9500.c +f:drivers/iio/proximity/sx_common.c +f:drivers/iio/proximity/sx_common.h +f:drivers/iio/proximity/vcnl3020.c +f:drivers/iio/proximity/vl53l0x-i2c.c +f:drivers/iio/resolver/Kconfig +f:drivers/iio/resolver/Makefile +f:drivers/iio/resolver/ad2s1200.c +f:drivers/iio/resolver/ad2s1210.c +f:drivers/iio/resolver/ad2s90.c +f:drivers/iio/temperature/Kconfig +f:drivers/iio/temperature/Makefile +f:drivers/iio/temperature/hid-sensor-temperature.c +f:drivers/iio/temperature/iqs620at-temp.c +f:drivers/iio/temperature/ltc2983.c +f:drivers/iio/temperature/max30208.c +f:drivers/iio/temperature/max31856.c +f:drivers/iio/temperature/max31865.c +f:drivers/iio/temperature/maxim_thermocouple.c +f:drivers/iio/temperature/mcp9600.c +f:drivers/iio/temperature/mlx90614.c +f:drivers/iio/temperature/mlx90632.c +f:drivers/iio/temperature/mlx90635.c +f:drivers/iio/temperature/tmp006.c +f:drivers/iio/temperature/tmp007.c +f:drivers/iio/temperature/tmp117.c +f:drivers/iio/temperature/tsys01.c +f:drivers/iio/temperature/tsys02d.c +f:drivers/iio/test/Kconfig +f:drivers/iio/test/Makefile +f:drivers/iio/test/iio-test-format.c +f:drivers/iio/test/iio-test-gts.c +f:drivers/iio/test/iio-test-rescale.c +f:drivers/iio/trigger/Kconfig +f:drivers/iio/trigger/Makefile +f:drivers/iio/trigger/iio-trig-hrtimer.c +f:drivers/iio/trigger/iio-trig-interrupt.c +f:drivers/iio/trigger/iio-trig-loop.c +f:drivers/iio/trigger/iio-trig-sysfs.c +f:drivers/iio/trigger/stm32-lptimer-trigger.c +f:drivers/iio/trigger/stm32-timer-trigger.c +f:drivers/infiniband/Kconfig +f:drivers/infiniband/Makefile +f:drivers/infiniband/core/Makefile +f:drivers/infiniband/core/addr.c +f:drivers/infiniband/core/agent.c +f:drivers/infiniband/core/agent.h +f:drivers/infiniband/core/cache.c +f:drivers/infiniband/core/cgroup.c +f:drivers/infiniband/core/cm.c +f:drivers/infiniband/core/cm_msgs.h +f:drivers/infiniband/core/cm_trace.c +f:drivers/infiniband/core/cm_trace.h +f:drivers/infiniband/core/cma.c +f:drivers/infiniband/core/cma_configfs.c +f:drivers/infiniband/core/cma_priv.h +f:drivers/infiniband/core/cma_trace.c +f:drivers/infiniband/core/cma_trace.h +f:drivers/infiniband/core/core_priv.h +f:drivers/infiniband/core/counters.c +f:drivers/infiniband/core/cq.c +f:drivers/infiniband/core/device.c +f:drivers/infiniband/core/ib_core_uverbs.c +f:drivers/infiniband/core/iwcm.c +f:drivers/infiniband/core/iwcm.h +f:drivers/infiniband/core/iwpm_msg.c +f:drivers/infiniband/core/iwpm_util.c +f:drivers/infiniband/core/iwpm_util.h +f:drivers/infiniband/core/lag.c +f:drivers/infiniband/core/mad.c +f:drivers/infiniband/core/mad_priv.h +f:drivers/infiniband/core/mad_rmpp.c +f:drivers/infiniband/core/mad_rmpp.h +f:drivers/infiniband/core/mr_pool.c +f:drivers/infiniband/core/multicast.c +f:drivers/infiniband/core/netlink.c +f:drivers/infiniband/core/nldev.c +f:drivers/infiniband/core/opa_smi.h +f:drivers/infiniband/core/packer.c +f:drivers/infiniband/core/rdma_core.c +f:drivers/infiniband/core/rdma_core.h +f:drivers/infiniband/core/restrack.c +f:drivers/infiniband/core/restrack.h +f:drivers/infiniband/core/roce_gid_mgmt.c +f:drivers/infiniband/core/rw.c +f:drivers/infiniband/core/sa.h +f:drivers/infiniband/core/sa_query.c +f:drivers/infiniband/core/security.c +f:drivers/infiniband/core/smi.c +f:drivers/infiniband/core/smi.h +f:drivers/infiniband/core/sysfs.c +f:drivers/infiniband/core/trace.c +f:drivers/infiniband/core/ucaps.c +f:drivers/infiniband/core/ucma.c +f:drivers/infiniband/core/ud_header.c +f:drivers/infiniband/core/umem.c +f:drivers/infiniband/core/umem_dmabuf.c +f:drivers/infiniband/core/umem_odp.c +f:drivers/infiniband/core/user_mad.c +f:drivers/infiniband/core/uverbs.h +f:drivers/infiniband/core/uverbs_cmd.c +f:drivers/infiniband/core/uverbs_ioctl.c +f:drivers/infiniband/core/uverbs_main.c +f:drivers/infiniband/core/uverbs_marshall.c +f:drivers/infiniband/core/uverbs_std_types.c +f:drivers/infiniband/core/uverbs_std_types_async_fd.c +f:drivers/infiniband/core/uverbs_std_types_counters.c +f:drivers/infiniband/core/uverbs_std_types_cq.c +f:drivers/infiniband/core/uverbs_std_types_device.c +f:drivers/infiniband/core/uverbs_std_types_dm.c +f:drivers/infiniband/core/uverbs_std_types_dmah.c +f:drivers/infiniband/core/uverbs_std_types_flow_action.c +f:drivers/infiniband/core/uverbs_std_types_mr.c +f:drivers/infiniband/core/uverbs_std_types_qp.c +f:drivers/infiniband/core/uverbs_std_types_srq.c +f:drivers/infiniband/core/uverbs_std_types_wq.c +f:drivers/infiniband/core/uverbs_uapi.c +f:drivers/infiniband/core/verbs.c +f:drivers/infiniband/hw/Makefile +f:drivers/infiniband/hw/bnxt_re/Kconfig +f:drivers/infiniband/hw/bnxt_re/Makefile +f:drivers/infiniband/hw/bnxt_re/bnxt_re.h +f:drivers/infiniband/hw/bnxt_re/debugfs.c +f:drivers/infiniband/hw/bnxt_re/debugfs.h +f:drivers/infiniband/hw/bnxt_re/hw_counters.c +f:drivers/infiniband/hw/bnxt_re/hw_counters.h +f:drivers/infiniband/hw/bnxt_re/ib_verbs.c +f:drivers/infiniband/hw/bnxt_re/ib_verbs.h +f:drivers/infiniband/hw/bnxt_re/main.c +f:drivers/infiniband/hw/bnxt_re/qplib_fp.c +f:drivers/infiniband/hw/bnxt_re/qplib_fp.h +f:drivers/infiniband/hw/bnxt_re/qplib_rcfw.c +f:drivers/infiniband/hw/bnxt_re/qplib_rcfw.h +f:drivers/infiniband/hw/bnxt_re/qplib_res.c +f:drivers/infiniband/hw/bnxt_re/qplib_res.h +f:drivers/infiniband/hw/bnxt_re/qplib_sp.c +f:drivers/infiniband/hw/bnxt_re/qplib_sp.h +f:drivers/infiniband/hw/bnxt_re/qplib_tlv.h +f:drivers/infiniband/hw/bnxt_re/roce_hsi.h +f:drivers/infiniband/hw/cxgb4/Kconfig +f:drivers/infiniband/hw/cxgb4/Makefile +f:drivers/infiniband/hw/cxgb4/cm.c +f:drivers/infiniband/hw/cxgb4/cq.c +f:drivers/infiniband/hw/cxgb4/device.c +f:drivers/infiniband/hw/cxgb4/ev.c +f:drivers/infiniband/hw/cxgb4/id_table.c +f:drivers/infiniband/hw/cxgb4/iw_cxgb4.h +f:drivers/infiniband/hw/cxgb4/mem.c +f:drivers/infiniband/hw/cxgb4/provider.c +f:drivers/infiniband/hw/cxgb4/qp.c +f:drivers/infiniband/hw/cxgb4/resource.c +f:drivers/infiniband/hw/cxgb4/restrack.c +f:drivers/infiniband/hw/cxgb4/t4.h +f:drivers/infiniband/hw/cxgb4/t4fw_ri_api.h +f:drivers/infiniband/hw/efa/Kconfig +f:drivers/infiniband/hw/efa/Makefile +f:drivers/infiniband/hw/efa/efa.h +f:drivers/infiniband/hw/efa/efa_admin_cmds_defs.h +f:drivers/infiniband/hw/efa/efa_admin_defs.h +f:drivers/infiniband/hw/efa/efa_com.c +f:drivers/infiniband/hw/efa/efa_com.h +f:drivers/infiniband/hw/efa/efa_com_cmd.c +f:drivers/infiniband/hw/efa/efa_com_cmd.h +f:drivers/infiniband/hw/efa/efa_common_defs.h +f:drivers/infiniband/hw/efa/efa_io_defs.h +f:drivers/infiniband/hw/efa/efa_main.c +f:drivers/infiniband/hw/efa/efa_regs_defs.h +f:drivers/infiniband/hw/efa/efa_verbs.c +f:drivers/infiniband/hw/erdma/Kconfig +f:drivers/infiniband/hw/erdma/Makefile +f:drivers/infiniband/hw/erdma/erdma.h +f:drivers/infiniband/hw/erdma/erdma_cm.c +f:drivers/infiniband/hw/erdma/erdma_cm.h +f:drivers/infiniband/hw/erdma/erdma_cmdq.c +f:drivers/infiniband/hw/erdma/erdma_cq.c +f:drivers/infiniband/hw/erdma/erdma_eq.c +f:drivers/infiniband/hw/erdma/erdma_hw.h +f:drivers/infiniband/hw/erdma/erdma_main.c +f:drivers/infiniband/hw/erdma/erdma_qp.c +f:drivers/infiniband/hw/erdma/erdma_verbs.c +f:drivers/infiniband/hw/erdma/erdma_verbs.h +f:drivers/infiniband/hw/hfi1/Kconfig +f:drivers/infiniband/hw/hfi1/Makefile +f:drivers/infiniband/hw/hfi1/affinity.c +f:drivers/infiniband/hw/hfi1/affinity.h +f:drivers/infiniband/hw/hfi1/aspm.c +f:drivers/infiniband/hw/hfi1/aspm.h +f:drivers/infiniband/hw/hfi1/chip.c +f:drivers/infiniband/hw/hfi1/chip.h +f:drivers/infiniband/hw/hfi1/chip_registers.h +f:drivers/infiniband/hw/hfi1/common.h +f:drivers/infiniband/hw/hfi1/debugfs.c +f:drivers/infiniband/hw/hfi1/debugfs.h +f:drivers/infiniband/hw/hfi1/device.c +f:drivers/infiniband/hw/hfi1/device.h +f:drivers/infiniband/hw/hfi1/driver.c +f:drivers/infiniband/hw/hfi1/efivar.c +f:drivers/infiniband/hw/hfi1/efivar.h +f:drivers/infiniband/hw/hfi1/eprom.c +f:drivers/infiniband/hw/hfi1/eprom.h +f:drivers/infiniband/hw/hfi1/exp_rcv.c +f:drivers/infiniband/hw/hfi1/exp_rcv.h +f:drivers/infiniband/hw/hfi1/fault.c +f:drivers/infiniband/hw/hfi1/fault.h +f:drivers/infiniband/hw/hfi1/file_ops.c +f:drivers/infiniband/hw/hfi1/firmware.c +f:drivers/infiniband/hw/hfi1/hfi.h +f:drivers/infiniband/hw/hfi1/init.c +f:drivers/infiniband/hw/hfi1/intr.c +f:drivers/infiniband/hw/hfi1/iowait.c +f:drivers/infiniband/hw/hfi1/iowait.h +f:drivers/infiniband/hw/hfi1/ipoib.h +f:drivers/infiniband/hw/hfi1/ipoib_main.c +f:drivers/infiniband/hw/hfi1/ipoib_rx.c +f:drivers/infiniband/hw/hfi1/ipoib_tx.c +f:drivers/infiniband/hw/hfi1/mad.c +f:drivers/infiniband/hw/hfi1/mad.h +f:drivers/infiniband/hw/hfi1/mmu_rb.c +f:drivers/infiniband/hw/hfi1/mmu_rb.h +f:drivers/infiniband/hw/hfi1/msix.c +f:drivers/infiniband/hw/hfi1/msix.h +f:drivers/infiniband/hw/hfi1/netdev.h +f:drivers/infiniband/hw/hfi1/netdev_rx.c +f:drivers/infiniband/hw/hfi1/opa_compat.h +f:drivers/infiniband/hw/hfi1/opfn.c +f:drivers/infiniband/hw/hfi1/opfn.h +f:drivers/infiniband/hw/hfi1/pcie.c +f:drivers/infiniband/hw/hfi1/pin_system.c +f:drivers/infiniband/hw/hfi1/pinning.h +f:drivers/infiniband/hw/hfi1/pio.c +f:drivers/infiniband/hw/hfi1/pio.h +f:drivers/infiniband/hw/hfi1/pio_copy.c +f:drivers/infiniband/hw/hfi1/platform.c +f:drivers/infiniband/hw/hfi1/platform.h +f:drivers/infiniband/hw/hfi1/qp.c +f:drivers/infiniband/hw/hfi1/qp.h +f:drivers/infiniband/hw/hfi1/qsfp.c +f:drivers/infiniband/hw/hfi1/qsfp.h +f:drivers/infiniband/hw/hfi1/rc.c +f:drivers/infiniband/hw/hfi1/rc.h +f:drivers/infiniband/hw/hfi1/ruc.c +f:drivers/infiniband/hw/hfi1/sdma.c +f:drivers/infiniband/hw/hfi1/sdma.h +f:drivers/infiniband/hw/hfi1/sdma_txreq.h +f:drivers/infiniband/hw/hfi1/sysfs.c +f:drivers/infiniband/hw/hfi1/tid_rdma.c +f:drivers/infiniband/hw/hfi1/tid_rdma.h +f:drivers/infiniband/hw/hfi1/trace.c +f:drivers/infiniband/hw/hfi1/trace.h +f:drivers/infiniband/hw/hfi1/trace_ctxts.h +f:drivers/infiniband/hw/hfi1/trace_dbg.h +f:drivers/infiniband/hw/hfi1/trace_ibhdrs.h +f:drivers/infiniband/hw/hfi1/trace_iowait.h +f:drivers/infiniband/hw/hfi1/trace_misc.h +f:drivers/infiniband/hw/hfi1/trace_mmu.h +f:drivers/infiniband/hw/hfi1/trace_rc.h +f:drivers/infiniband/hw/hfi1/trace_rx.h +f:drivers/infiniband/hw/hfi1/trace_tid.h +f:drivers/infiniband/hw/hfi1/trace_tx.h +f:drivers/infiniband/hw/hfi1/uc.c +f:drivers/infiniband/hw/hfi1/ud.c +f:drivers/infiniband/hw/hfi1/user_exp_rcv.c +f:drivers/infiniband/hw/hfi1/user_exp_rcv.h +f:drivers/infiniband/hw/hfi1/user_pages.c +f:drivers/infiniband/hw/hfi1/user_sdma.c +f:drivers/infiniband/hw/hfi1/user_sdma.h +f:drivers/infiniband/hw/hfi1/verbs.c +f:drivers/infiniband/hw/hfi1/verbs.h +f:drivers/infiniband/hw/hfi1/verbs_txreq.c +f:drivers/infiniband/hw/hfi1/verbs_txreq.h +f:drivers/infiniband/hw/hfi1/vnic.h +f:drivers/infiniband/hw/hfi1/vnic_main.c +f:drivers/infiniband/hw/hfi1/vnic_sdma.c +f:drivers/infiniband/hw/hns/Kconfig +f:drivers/infiniband/hw/hns/Makefile +f:drivers/infiniband/hw/hns/hns_roce_ah.c +f:drivers/infiniband/hw/hns/hns_roce_alloc.c +f:drivers/infiniband/hw/hns/hns_roce_cmd.c +f:drivers/infiniband/hw/hns/hns_roce_cmd.h +f:drivers/infiniband/hw/hns/hns_roce_common.h +f:drivers/infiniband/hw/hns/hns_roce_cq.c +f:drivers/infiniband/hw/hns/hns_roce_db.c +f:drivers/infiniband/hw/hns/hns_roce_debugfs.c +f:drivers/infiniband/hw/hns/hns_roce_debugfs.h +f:drivers/infiniband/hw/hns/hns_roce_device.h +f:drivers/infiniband/hw/hns/hns_roce_hem.c +f:drivers/infiniband/hw/hns/hns_roce_hem.h +f:drivers/infiniband/hw/hns/hns_roce_hw_v2.c +f:drivers/infiniband/hw/hns/hns_roce_hw_v2.h +f:drivers/infiniband/hw/hns/hns_roce_main.c +f:drivers/infiniband/hw/hns/hns_roce_mr.c +f:drivers/infiniband/hw/hns/hns_roce_pd.c +f:drivers/infiniband/hw/hns/hns_roce_qp.c +f:drivers/infiniband/hw/hns/hns_roce_restrack.c +f:drivers/infiniband/hw/hns/hns_roce_srq.c +f:drivers/infiniband/hw/hns/hns_roce_trace.h +f:drivers/infiniband/hw/irdma/Kconfig +f:drivers/infiniband/hw/irdma/Makefile +f:drivers/infiniband/hw/irdma/cm.c +f:drivers/infiniband/hw/irdma/cm.h +f:drivers/infiniband/hw/irdma/ctrl.c +f:drivers/infiniband/hw/irdma/defs.h +f:drivers/infiniband/hw/irdma/hmc.c +f:drivers/infiniband/hw/irdma/hmc.h +f:drivers/infiniband/hw/irdma/hw.c +f:drivers/infiniband/hw/irdma/i40iw_hw.c +f:drivers/infiniband/hw/irdma/i40iw_hw.h +f:drivers/infiniband/hw/irdma/i40iw_if.c +f:drivers/infiniband/hw/irdma/icrdma_hw.c +f:drivers/infiniband/hw/irdma/icrdma_hw.h +f:drivers/infiniband/hw/irdma/irdma.h +f:drivers/infiniband/hw/irdma/main.c +f:drivers/infiniband/hw/irdma/main.h +f:drivers/infiniband/hw/irdma/osdep.h +f:drivers/infiniband/hw/irdma/pble.c +f:drivers/infiniband/hw/irdma/pble.h +f:drivers/infiniband/hw/irdma/protos.h +f:drivers/infiniband/hw/irdma/puda.c +f:drivers/infiniband/hw/irdma/puda.h +f:drivers/infiniband/hw/irdma/trace.c +f:drivers/infiniband/hw/irdma/trace.h +f:drivers/infiniband/hw/irdma/trace_cm.h +f:drivers/infiniband/hw/irdma/type.h +f:drivers/infiniband/hw/irdma/uda.c +f:drivers/infiniband/hw/irdma/uda.h +f:drivers/infiniband/hw/irdma/uda_d.h +f:drivers/infiniband/hw/irdma/uk.c +f:drivers/infiniband/hw/irdma/user.h +f:drivers/infiniband/hw/irdma/utils.c +f:drivers/infiniband/hw/irdma/verbs.c +f:drivers/infiniband/hw/irdma/verbs.h +f:drivers/infiniband/hw/irdma/ws.c +f:drivers/infiniband/hw/irdma/ws.h +f:drivers/infiniband/hw/mana/Kconfig +f:drivers/infiniband/hw/mana/Makefile +f:drivers/infiniband/hw/mana/ah.c +f:drivers/infiniband/hw/mana/counters.c +f:drivers/infiniband/hw/mana/counters.h +f:drivers/infiniband/hw/mana/cq.c +f:drivers/infiniband/hw/mana/device.c +f:drivers/infiniband/hw/mana/main.c +f:drivers/infiniband/hw/mana/mana_ib.h +f:drivers/infiniband/hw/mana/mr.c +f:drivers/infiniband/hw/mana/qp.c +f:drivers/infiniband/hw/mana/shadow_queue.h +f:drivers/infiniband/hw/mana/wq.c +f:drivers/infiniband/hw/mana/wr.c +f:drivers/infiniband/hw/mlx4/Kconfig +f:drivers/infiniband/hw/mlx4/Makefile +f:drivers/infiniband/hw/mlx4/ah.c +f:drivers/infiniband/hw/mlx4/alias_GUID.c +f:drivers/infiniband/hw/mlx4/cm.c +f:drivers/infiniband/hw/mlx4/cq.c +f:drivers/infiniband/hw/mlx4/doorbell.c +f:drivers/infiniband/hw/mlx4/mad.c +f:drivers/infiniband/hw/mlx4/main.c +f:drivers/infiniband/hw/mlx4/mcg.c +f:drivers/infiniband/hw/mlx4/mlx4_ib.h +f:drivers/infiniband/hw/mlx4/mr.c +f:drivers/infiniband/hw/mlx4/qp.c +f:drivers/infiniband/hw/mlx4/srq.c +f:drivers/infiniband/hw/mlx4/sysfs.c +f:drivers/infiniband/hw/mlx5/Kconfig +f:drivers/infiniband/hw/mlx5/Makefile +f:drivers/infiniband/hw/mlx5/ah.c +f:drivers/infiniband/hw/mlx5/cmd.c +f:drivers/infiniband/hw/mlx5/cmd.h +f:drivers/infiniband/hw/mlx5/cong.c +f:drivers/infiniband/hw/mlx5/counters.c +f:drivers/infiniband/hw/mlx5/counters.h +f:drivers/infiniband/hw/mlx5/cq.c +f:drivers/infiniband/hw/mlx5/data_direct.c +f:drivers/infiniband/hw/mlx5/data_direct.h +f:drivers/infiniband/hw/mlx5/devx.c +f:drivers/infiniband/hw/mlx5/devx.h +f:drivers/infiniband/hw/mlx5/dm.c +f:drivers/infiniband/hw/mlx5/dm.h +f:drivers/infiniband/hw/mlx5/dmah.c +f:drivers/infiniband/hw/mlx5/dmah.h +f:drivers/infiniband/hw/mlx5/doorbell.c +f:drivers/infiniband/hw/mlx5/fs.c +f:drivers/infiniband/hw/mlx5/fs.h +f:drivers/infiniband/hw/mlx5/gsi.c +f:drivers/infiniband/hw/mlx5/ib_rep.c +f:drivers/infiniband/hw/mlx5/ib_rep.h +f:drivers/infiniband/hw/mlx5/ib_virt.c +f:drivers/infiniband/hw/mlx5/macsec.c +f:drivers/infiniband/hw/mlx5/macsec.h +f:drivers/infiniband/hw/mlx5/mad.c +f:drivers/infiniband/hw/mlx5/main.c +f:drivers/infiniband/hw/mlx5/mem.c +f:drivers/infiniband/hw/mlx5/mlx5_ib.h +f:drivers/infiniband/hw/mlx5/mr.c +f:drivers/infiniband/hw/mlx5/odp.c +f:drivers/infiniband/hw/mlx5/qos.c +f:drivers/infiniband/hw/mlx5/qp.c +f:drivers/infiniband/hw/mlx5/qp.h +f:drivers/infiniband/hw/mlx5/qpc.c +f:drivers/infiniband/hw/mlx5/restrack.c +f:drivers/infiniband/hw/mlx5/restrack.h +f:drivers/infiniband/hw/mlx5/srq.c +f:drivers/infiniband/hw/mlx5/srq.h +f:drivers/infiniband/hw/mlx5/srq_cmd.c +f:drivers/infiniband/hw/mlx5/std_types.c +f:drivers/infiniband/hw/mlx5/umr.c +f:drivers/infiniband/hw/mlx5/umr.h +f:drivers/infiniband/hw/mlx5/wr.c +f:drivers/infiniband/hw/mlx5/wr.h +f:drivers/infiniband/hw/mthca/Kconfig +f:drivers/infiniband/hw/mthca/Makefile +f:drivers/infiniband/hw/mthca/mthca_allocator.c +f:drivers/infiniband/hw/mthca/mthca_av.c +f:drivers/infiniband/hw/mthca/mthca_catas.c +f:drivers/infiniband/hw/mthca/mthca_cmd.c +f:drivers/infiniband/hw/mthca/mthca_cmd.h +f:drivers/infiniband/hw/mthca/mthca_config_reg.h +f:drivers/infiniband/hw/mthca/mthca_cq.c +f:drivers/infiniband/hw/mthca/mthca_dev.h +f:drivers/infiniband/hw/mthca/mthca_doorbell.h +f:drivers/infiniband/hw/mthca/mthca_eq.c +f:drivers/infiniband/hw/mthca/mthca_mad.c +f:drivers/infiniband/hw/mthca/mthca_main.c +f:drivers/infiniband/hw/mthca/mthca_mcg.c +f:drivers/infiniband/hw/mthca/mthca_memfree.c +f:drivers/infiniband/hw/mthca/mthca_memfree.h +f:drivers/infiniband/hw/mthca/mthca_mr.c +f:drivers/infiniband/hw/mthca/mthca_pd.c +f:drivers/infiniband/hw/mthca/mthca_profile.c +f:drivers/infiniband/hw/mthca/mthca_profile.h +f:drivers/infiniband/hw/mthca/mthca_provider.c +f:drivers/infiniband/hw/mthca/mthca_provider.h +f:drivers/infiniband/hw/mthca/mthca_qp.c +f:drivers/infiniband/hw/mthca/mthca_reset.c +f:drivers/infiniband/hw/mthca/mthca_srq.c +f:drivers/infiniband/hw/mthca/mthca_uar.c +f:drivers/infiniband/hw/mthca/mthca_wqe.h +f:drivers/infiniband/hw/ocrdma/Kconfig +f:drivers/infiniband/hw/ocrdma/Makefile +f:drivers/infiniband/hw/ocrdma/ocrdma.h +f:drivers/infiniband/hw/ocrdma/ocrdma_ah.c +f:drivers/infiniband/hw/ocrdma/ocrdma_ah.h +f:drivers/infiniband/hw/ocrdma/ocrdma_hw.c +f:drivers/infiniband/hw/ocrdma/ocrdma_hw.h +f:drivers/infiniband/hw/ocrdma/ocrdma_main.c +f:drivers/infiniband/hw/ocrdma/ocrdma_sli.h +f:drivers/infiniband/hw/ocrdma/ocrdma_stats.c +f:drivers/infiniband/hw/ocrdma/ocrdma_stats.h +f:drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +f:drivers/infiniband/hw/ocrdma/ocrdma_verbs.h +f:drivers/infiniband/hw/qedr/Kconfig +f:drivers/infiniband/hw/qedr/Makefile +f:drivers/infiniband/hw/qedr/main.c +f:drivers/infiniband/hw/qedr/qedr.h +f:drivers/infiniband/hw/qedr/qedr_hsi_rdma.h +f:drivers/infiniband/hw/qedr/qedr_iw_cm.c +f:drivers/infiniband/hw/qedr/qedr_iw_cm.h +f:drivers/infiniband/hw/qedr/qedr_roce_cm.c +f:drivers/infiniband/hw/qedr/qedr_roce_cm.h +f:drivers/infiniband/hw/qedr/verbs.c +f:drivers/infiniband/hw/qedr/verbs.h +f:drivers/infiniband/hw/usnic/Kconfig +f:drivers/infiniband/hw/usnic/Makefile +f:drivers/infiniband/hw/usnic/usnic.h +f:drivers/infiniband/hw/usnic/usnic_abi.h +f:drivers/infiniband/hw/usnic/usnic_common_pkt_hdr.h +f:drivers/infiniband/hw/usnic/usnic_common_util.h +f:drivers/infiniband/hw/usnic/usnic_debugfs.c +f:drivers/infiniband/hw/usnic/usnic_debugfs.h +f:drivers/infiniband/hw/usnic/usnic_fwd.c +f:drivers/infiniband/hw/usnic/usnic_fwd.h +f:drivers/infiniband/hw/usnic/usnic_ib.h +f:drivers/infiniband/hw/usnic/usnic_ib_main.c +f:drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c +f:drivers/infiniband/hw/usnic/usnic_ib_qp_grp.h +f:drivers/infiniband/hw/usnic/usnic_ib_sysfs.c +f:drivers/infiniband/hw/usnic/usnic_ib_sysfs.h +f:drivers/infiniband/hw/usnic/usnic_ib_verbs.c +f:drivers/infiniband/hw/usnic/usnic_ib_verbs.h +f:drivers/infiniband/hw/usnic/usnic_log.h +f:drivers/infiniband/hw/usnic/usnic_transport.c +f:drivers/infiniband/hw/usnic/usnic_transport.h +f:drivers/infiniband/hw/usnic/usnic_uiom.c +f:drivers/infiniband/hw/usnic/usnic_uiom.h +f:drivers/infiniband/hw/usnic/usnic_uiom_interval_tree.c +f:drivers/infiniband/hw/usnic/usnic_uiom_interval_tree.h +f:drivers/infiniband/hw/usnic/usnic_vnic.c +f:drivers/infiniband/hw/usnic/usnic_vnic.h +f:drivers/infiniband/hw/vmw_pvrdma/Kconfig +f:drivers/infiniband/hw/vmw_pvrdma/Makefile +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma.h +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_cmd.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_doorbell.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_misc.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_mr.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_ring.h +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_srq.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c +f:drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h +f:drivers/infiniband/sw/Makefile +f:drivers/infiniband/sw/rdmavt/Kconfig +f:drivers/infiniband/sw/rdmavt/Makefile +f:drivers/infiniband/sw/rdmavt/ah.c +f:drivers/infiniband/sw/rdmavt/ah.h +f:drivers/infiniband/sw/rdmavt/cq.c +f:drivers/infiniband/sw/rdmavt/cq.h +f:drivers/infiniband/sw/rdmavt/mad.c +f:drivers/infiniband/sw/rdmavt/mad.h +f:drivers/infiniband/sw/rdmavt/mcast.c +f:drivers/infiniband/sw/rdmavt/mcast.h +f:drivers/infiniband/sw/rdmavt/mmap.c +f:drivers/infiniband/sw/rdmavt/mmap.h +f:drivers/infiniband/sw/rdmavt/mr.c +f:drivers/infiniband/sw/rdmavt/mr.h +f:drivers/infiniband/sw/rdmavt/pd.c +f:drivers/infiniband/sw/rdmavt/pd.h +f:drivers/infiniband/sw/rdmavt/qp.c +f:drivers/infiniband/sw/rdmavt/qp.h +f:drivers/infiniband/sw/rdmavt/rc.c +f:drivers/infiniband/sw/rdmavt/srq.c +f:drivers/infiniband/sw/rdmavt/srq.h +f:drivers/infiniband/sw/rdmavt/trace.c +f:drivers/infiniband/sw/rdmavt/trace.h +f:drivers/infiniband/sw/rdmavt/trace_cq.h +f:drivers/infiniband/sw/rdmavt/trace_mr.h +f:drivers/infiniband/sw/rdmavt/trace_qp.h +f:drivers/infiniband/sw/rdmavt/trace_rc.h +f:drivers/infiniband/sw/rdmavt/trace_rvt.h +f:drivers/infiniband/sw/rdmavt/trace_tx.h +f:drivers/infiniband/sw/rdmavt/vt.c +f:drivers/infiniband/sw/rdmavt/vt.h +f:drivers/infiniband/sw/rxe/Kconfig +f:drivers/infiniband/sw/rxe/Makefile +f:drivers/infiniband/sw/rxe/rxe.c +f:drivers/infiniband/sw/rxe/rxe.h +f:drivers/infiniband/sw/rxe/rxe_av.c +f:drivers/infiniband/sw/rxe/rxe_comp.c +f:drivers/infiniband/sw/rxe/rxe_cq.c +f:drivers/infiniband/sw/rxe/rxe_hdr.h +f:drivers/infiniband/sw/rxe/rxe_hw_counters.c +f:drivers/infiniband/sw/rxe/rxe_hw_counters.h +f:drivers/infiniband/sw/rxe/rxe_icrc.c +f:drivers/infiniband/sw/rxe/rxe_loc.h +f:drivers/infiniband/sw/rxe/rxe_mcast.c +f:drivers/infiniband/sw/rxe/rxe_mmap.c +f:drivers/infiniband/sw/rxe/rxe_mr.c +f:drivers/infiniband/sw/rxe/rxe_mw.c +f:drivers/infiniband/sw/rxe/rxe_net.c +f:drivers/infiniband/sw/rxe/rxe_net.h +f:drivers/infiniband/sw/rxe/rxe_odp.c +f:drivers/infiniband/sw/rxe/rxe_opcode.c +f:drivers/infiniband/sw/rxe/rxe_opcode.h +f:drivers/infiniband/sw/rxe/rxe_param.h +f:drivers/infiniband/sw/rxe/rxe_pool.c +f:drivers/infiniband/sw/rxe/rxe_pool.h +f:drivers/infiniband/sw/rxe/rxe_qp.c +f:drivers/infiniband/sw/rxe/rxe_queue.c +f:drivers/infiniband/sw/rxe/rxe_queue.h +f:drivers/infiniband/sw/rxe/rxe_recv.c +f:drivers/infiniband/sw/rxe/rxe_req.c +f:drivers/infiniband/sw/rxe/rxe_resp.c +f:drivers/infiniband/sw/rxe/rxe_srq.c +f:drivers/infiniband/sw/rxe/rxe_task.c +f:drivers/infiniband/sw/rxe/rxe_task.h +f:drivers/infiniband/sw/rxe/rxe_verbs.c +f:drivers/infiniband/sw/rxe/rxe_verbs.h +f:drivers/infiniband/sw/siw/Kconfig +f:drivers/infiniband/sw/siw/Makefile +f:drivers/infiniband/sw/siw/iwarp.h +f:drivers/infiniband/sw/siw/siw.h +f:drivers/infiniband/sw/siw/siw_cm.c +f:drivers/infiniband/sw/siw/siw_cm.h +f:drivers/infiniband/sw/siw/siw_cq.c +f:drivers/infiniband/sw/siw/siw_main.c +f:drivers/infiniband/sw/siw/siw_mem.c +f:drivers/infiniband/sw/siw/siw_mem.h +f:drivers/infiniband/sw/siw/siw_qp.c +f:drivers/infiniband/sw/siw/siw_qp_rx.c +f:drivers/infiniband/sw/siw/siw_qp_tx.c +f:drivers/infiniband/sw/siw/siw_verbs.c +f:drivers/infiniband/sw/siw/siw_verbs.h +f:drivers/infiniband/ulp/Makefile +f:drivers/infiniband/ulp/ipoib/Kconfig +f:drivers/infiniband/ulp/ipoib/Makefile +f:drivers/infiniband/ulp/ipoib/ipoib.h +f:drivers/infiniband/ulp/ipoib/ipoib_cm.c +f:drivers/infiniband/ulp/ipoib/ipoib_ethtool.c +f:drivers/infiniband/ulp/ipoib/ipoib_fs.c +f:drivers/infiniband/ulp/ipoib/ipoib_ib.c +f:drivers/infiniband/ulp/ipoib/ipoib_main.c +f:drivers/infiniband/ulp/ipoib/ipoib_multicast.c +f:drivers/infiniband/ulp/ipoib/ipoib_netlink.c +f:drivers/infiniband/ulp/ipoib/ipoib_verbs.c +f:drivers/infiniband/ulp/ipoib/ipoib_vlan.c +f:drivers/infiniband/ulp/iser/Kconfig +f:drivers/infiniband/ulp/iser/Makefile +f:drivers/infiniband/ulp/iser/iscsi_iser.c +f:drivers/infiniband/ulp/iser/iscsi_iser.h +f:drivers/infiniband/ulp/iser/iser_initiator.c +f:drivers/infiniband/ulp/iser/iser_memory.c +f:drivers/infiniband/ulp/iser/iser_verbs.c +f:drivers/infiniband/ulp/isert/Kconfig +f:drivers/infiniband/ulp/isert/Makefile +f:drivers/infiniband/ulp/isert/ib_isert.c +f:drivers/infiniband/ulp/isert/ib_isert.h +f:drivers/infiniband/ulp/opa_vnic/Kconfig +f:drivers/infiniband/ulp/opa_vnic/Makefile +f:drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.c +f:drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.h +f:drivers/infiniband/ulp/opa_vnic/opa_vnic_ethtool.c +f:drivers/infiniband/ulp/opa_vnic/opa_vnic_internal.h +f:drivers/infiniband/ulp/opa_vnic/opa_vnic_netdev.c +f:drivers/infiniband/ulp/opa_vnic/opa_vnic_vema.c +f:drivers/infiniband/ulp/opa_vnic/opa_vnic_vema_iface.c +f:drivers/infiniband/ulp/rtrs/Kconfig +f:drivers/infiniband/ulp/rtrs/Makefile +f:drivers/infiniband/ulp/rtrs/README +f:drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c +f:drivers/infiniband/ulp/rtrs/rtrs-clt-sysfs.c +f:drivers/infiniband/ulp/rtrs/rtrs-clt-trace.c +f:drivers/infiniband/ulp/rtrs/rtrs-clt-trace.h +f:drivers/infiniband/ulp/rtrs/rtrs-clt.c +f:drivers/infiniband/ulp/rtrs/rtrs-clt.h +f:drivers/infiniband/ulp/rtrs/rtrs-log.h +f:drivers/infiniband/ulp/rtrs/rtrs-pri.h +f:drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c +f:drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +f:drivers/infiniband/ulp/rtrs/rtrs-srv-trace.c +f:drivers/infiniband/ulp/rtrs/rtrs-srv-trace.h +f:drivers/infiniband/ulp/rtrs/rtrs-srv.c +f:drivers/infiniband/ulp/rtrs/rtrs-srv.h +f:drivers/infiniband/ulp/rtrs/rtrs.c +f:drivers/infiniband/ulp/rtrs/rtrs.h +f:drivers/infiniband/ulp/srp/Kbuild +f:drivers/infiniband/ulp/srp/Kconfig +f:drivers/infiniband/ulp/srp/ib_srp.c +f:drivers/infiniband/ulp/srp/ib_srp.h +f:drivers/infiniband/ulp/srpt/Kconfig +f:drivers/infiniband/ulp/srpt/Makefile +f:drivers/infiniband/ulp/srpt/ib_dm_mad.h +f:drivers/infiniband/ulp/srpt/ib_srpt.c +f:drivers/infiniband/ulp/srpt/ib_srpt.h +f:drivers/input/Kconfig +f:drivers/input/Makefile +f:drivers/input/apm-power.c +f:drivers/input/evdev.c +f:drivers/input/ff-core.c +f:drivers/input/ff-memless.c +f:drivers/input/gameport/Kconfig +f:drivers/input/gameport/Makefile +f:drivers/input/gameport/emu10k1-gp.c +f:drivers/input/gameport/fm801-gp.c +f:drivers/input/gameport/gameport.c +f:drivers/input/gameport/lightning.c +f:drivers/input/gameport/ns558.c +f:drivers/input/input-compat.c +f:drivers/input/input-compat.h +f:drivers/input/input-core-private.h +f:drivers/input/input-leds.c +f:drivers/input/input-mt.c +f:drivers/input/input-poller.c +f:drivers/input/input-poller.h +f:drivers/input/input.c +f:drivers/input/joydev.c +f:drivers/input/joystick/Kconfig +f:drivers/input/joystick/Makefile +f:drivers/input/joystick/a3d.c +f:drivers/input/joystick/adafruit-seesaw.c +f:drivers/input/joystick/adc-joystick.c +f:drivers/input/joystick/adi.c +f:drivers/input/joystick/amijoy.c +f:drivers/input/joystick/analog.c +f:drivers/input/joystick/as5011.c +f:drivers/input/joystick/cobra.c +f:drivers/input/joystick/db9.c +f:drivers/input/joystick/fsia6b.c +f:drivers/input/joystick/gamecon.c +f:drivers/input/joystick/gf2k.c +f:drivers/input/joystick/grip.c +f:drivers/input/joystick/grip_mp.c +f:drivers/input/joystick/guillemot.c +f:drivers/input/joystick/iforce/Kconfig +f:drivers/input/joystick/iforce/Makefile +f:drivers/input/joystick/iforce/iforce-ff.c +f:drivers/input/joystick/iforce/iforce-main.c +f:drivers/input/joystick/iforce/iforce-packets.c +f:drivers/input/joystick/iforce/iforce-serio.c +f:drivers/input/joystick/iforce/iforce-usb.c +f:drivers/input/joystick/iforce/iforce.h +f:drivers/input/joystick/interact.c +f:drivers/input/joystick/joydump.c +f:drivers/input/joystick/magellan.c +f:drivers/input/joystick/maplecontrol.c +f:drivers/input/joystick/n64joy.c +f:drivers/input/joystick/psxpad-spi.c +f:drivers/input/joystick/pxrc.c +f:drivers/input/joystick/qwiic-joystick.c +f:drivers/input/joystick/sensehat-joystick.c +f:drivers/input/joystick/sidewinder.c +f:drivers/input/joystick/spaceball.c +f:drivers/input/joystick/spaceorb.c +f:drivers/input/joystick/stinger.c +f:drivers/input/joystick/tmdc.c +f:drivers/input/joystick/turbografx.c +f:drivers/input/joystick/twidjoy.c +f:drivers/input/joystick/walkera0701.c +f:drivers/input/joystick/warrior.c +f:drivers/input/joystick/xpad.c +f:drivers/input/joystick/zhenhua.c +f:drivers/input/keyboard/Kconfig +f:drivers/input/keyboard/Makefile +f:drivers/input/keyboard/adc-keys.c +f:drivers/input/keyboard/adp5520-keys.c +f:drivers/input/keyboard/adp5585-keys.c +f:drivers/input/keyboard/adp5588-keys.c +f:drivers/input/keyboard/amikbd.c +f:drivers/input/keyboard/applespi.c +f:drivers/input/keyboard/applespi.h +f:drivers/input/keyboard/applespi_trace.h +f:drivers/input/keyboard/atakbd.c +f:drivers/input/keyboard/atkbd.c +f:drivers/input/keyboard/bcm-keypad.c +f:drivers/input/keyboard/cap11xx.c +f:drivers/input/keyboard/clps711x-keypad.c +f:drivers/input/keyboard/cros_ec_keyb.c +f:drivers/input/keyboard/cypress-sf.c +f:drivers/input/keyboard/dlink-dir685-touchkeys.c +f:drivers/input/keyboard/ep93xx_keypad.c +f:drivers/input/keyboard/goldfish_events.c +f:drivers/input/keyboard/gpio_keys.c +f:drivers/input/keyboard/gpio_keys_polled.c +f:drivers/input/keyboard/hil_kbd.c +f:drivers/input/keyboard/hilkbd.c +f:drivers/input/keyboard/hpps2atkbd.h +f:drivers/input/keyboard/imx-sm-bbm-key.c +f:drivers/input/keyboard/imx_keypad.c +f:drivers/input/keyboard/imx_sc_key.c +f:drivers/input/keyboard/ipaq-micro-keys.c +f:drivers/input/keyboard/iqs62x-keys.c +f:drivers/input/keyboard/jornada680_kbd.c +f:drivers/input/keyboard/jornada720_kbd.c +f:drivers/input/keyboard/lkkbd.c +f:drivers/input/keyboard/lm8323.c +f:drivers/input/keyboard/lm8333.c +f:drivers/input/keyboard/locomokbd.c +f:drivers/input/keyboard/lpc32xx-keys.c +f:drivers/input/keyboard/maple_keyb.c +f:drivers/input/keyboard/matrix_keypad.c +f:drivers/input/keyboard/max7359_keypad.c +f:drivers/input/keyboard/mpr121_touchkey.c +f:drivers/input/keyboard/mt6779-keypad.c +f:drivers/input/keyboard/mtk-pmic-keys.c +f:drivers/input/keyboard/newtonkbd.c +f:drivers/input/keyboard/nspire-keypad.c +f:drivers/input/keyboard/omap-keypad.c +f:drivers/input/keyboard/omap4-keypad.c +f:drivers/input/keyboard/opencores-kbd.c +f:drivers/input/keyboard/pinephone-keyboard.c +f:drivers/input/keyboard/pmic8xxx-keypad.c +f:drivers/input/keyboard/pxa27x_keypad.c +f:drivers/input/keyboard/qt1050.c +f:drivers/input/keyboard/qt1070.c +f:drivers/input/keyboard/qt2160.c +f:drivers/input/keyboard/samsung-keypad.c +f:drivers/input/keyboard/sh_keysc.c +f:drivers/input/keyboard/snvs_pwrkey.c +f:drivers/input/keyboard/spear-keyboard.c +f:drivers/input/keyboard/st-keyscan.c +f:drivers/input/keyboard/stmpe-keypad.c +f:drivers/input/keyboard/stowaway.c +f:drivers/input/keyboard/sun4i-lradc-keys.c +f:drivers/input/keyboard/sunkbd.c +f:drivers/input/keyboard/tc3589x-keypad.c +f:drivers/input/keyboard/tca6416-keypad.c +f:drivers/input/keyboard/tca8418_keypad.c +f:drivers/input/keyboard/tegra-kbc.c +f:drivers/input/keyboard/tm2-touchkey.c +f:drivers/input/keyboard/twl4030_keypad.c +f:drivers/input/keyboard/xtkbd.c +f:drivers/input/matrix-keymap.c +f:drivers/input/misc/88pm80x_onkey.c +f:drivers/input/misc/88pm860x_onkey.c +f:drivers/input/misc/88pm886-onkey.c +f:drivers/input/misc/Kconfig +f:drivers/input/misc/Makefile +f:drivers/input/misc/ab8500-ponkey.c +f:drivers/input/misc/ad714x-i2c.c +f:drivers/input/misc/ad714x-spi.c +f:drivers/input/misc/ad714x.c +f:drivers/input/misc/ad714x.h +f:drivers/input/misc/adxl34x-i2c.c +f:drivers/input/misc/adxl34x-spi.c +f:drivers/input/misc/adxl34x.c +f:drivers/input/misc/adxl34x.h +f:drivers/input/misc/apanel.c +f:drivers/input/misc/ariel-pwrbutton.c +f:drivers/input/misc/arizona-haptics.c +f:drivers/input/misc/atc260x-onkey.c +f:drivers/input/misc/ati_remote2.c +f:drivers/input/misc/atlas_btns.c +f:drivers/input/misc/atmel_captouch.c +f:drivers/input/misc/axp20x-pek.c +f:drivers/input/misc/bma150.c +f:drivers/input/misc/cm109.c +f:drivers/input/misc/cma3000_d0x.c +f:drivers/input/misc/cma3000_d0x.h +f:drivers/input/misc/cma3000_d0x_i2c.c +f:drivers/input/misc/cobalt_btns.c +f:drivers/input/misc/cpcap-pwrbutton.c +f:drivers/input/misc/cs40l50-vibra.c +f:drivers/input/misc/da7280.c +f:drivers/input/misc/da9052_onkey.c +f:drivers/input/misc/da9055_onkey.c +f:drivers/input/misc/da9063_onkey.c +f:drivers/input/misc/drv260x.c +f:drivers/input/misc/drv2665.c +f:drivers/input/misc/drv2667.c +f:drivers/input/misc/e3x0-button.c +f:drivers/input/misc/gpio-beeper.c +f:drivers/input/misc/gpio-vibra.c +f:drivers/input/misc/gpio_decoder.c +f:drivers/input/misc/hisi_powerkey.c +f:drivers/input/misc/hp_sdc_rtc.c +f:drivers/input/misc/ibm-panel.c +f:drivers/input/misc/ideapad_slidebar.c +f:drivers/input/misc/ims-pcu.c +f:drivers/input/misc/iqs269a.c +f:drivers/input/misc/iqs626a.c +f:drivers/input/misc/iqs7222.c +f:drivers/input/misc/keyspan_remote.c +f:drivers/input/misc/kxtj9.c +f:drivers/input/misc/m68kspkr.c +f:drivers/input/misc/max77650-onkey.c +f:drivers/input/misc/max77693-haptic.c +f:drivers/input/misc/max8925_onkey.c +f:drivers/input/misc/max8997_haptic.c +f:drivers/input/misc/mc13783-pwrbutton.c +f:drivers/input/misc/mma8450.c +f:drivers/input/misc/nxp-bbnsm-pwrkey.c +f:drivers/input/misc/palmas-pwrbutton.c +f:drivers/input/misc/pcap_keys.c +f:drivers/input/misc/pcf50633-input.c +f:drivers/input/misc/pcf8574_keypad.c +f:drivers/input/misc/pcspkr.c +f:drivers/input/misc/pm8941-pwrkey.c +f:drivers/input/misc/pm8xxx-vibrator.c +f:drivers/input/misc/pmic8xxx-pwrkey.c +f:drivers/input/misc/powermate.c +f:drivers/input/misc/pwm-beeper.c +f:drivers/input/misc/pwm-vibra.c +f:drivers/input/misc/qnap-mcu-input.c +f:drivers/input/misc/rave-sp-pwrbutton.c +f:drivers/input/misc/rb532_button.c +f:drivers/input/misc/regulator-haptic.c +f:drivers/input/misc/retu-pwrbutton.c +f:drivers/input/misc/rk805-pwrkey.c +f:drivers/input/misc/rotary_encoder.c +f:drivers/input/misc/rt5120-pwrkey.c +f:drivers/input/misc/sc27xx-vibra.c +f:drivers/input/misc/sgi_btns.c +f:drivers/input/misc/soc_button_array.c +f:drivers/input/misc/sparcspkr.c +f:drivers/input/misc/stpmic1_onkey.c +f:drivers/input/misc/tps65218-pwrbutton.c +f:drivers/input/misc/tps65219-pwrbutton.c +f:drivers/input/misc/twl4030-pwrbutton.c +f:drivers/input/misc/twl4030-vibra.c +f:drivers/input/misc/twl6040-vibra.c +f:drivers/input/misc/uinput.c +f:drivers/input/misc/wistron_btns.c +f:drivers/input/misc/wm831x-on.c +f:drivers/input/misc/xen-kbdfront.c +f:drivers/input/misc/yealink.c +f:drivers/input/misc/yealink.h +f:drivers/input/mouse/Kconfig +f:drivers/input/mouse/Makefile +f:drivers/input/mouse/alps.c +f:drivers/input/mouse/alps.h +f:drivers/input/mouse/amimouse.c +f:drivers/input/mouse/appletouch.c +f:drivers/input/mouse/atarimouse.c +f:drivers/input/mouse/bcm5974.c +f:drivers/input/mouse/byd.c +f:drivers/input/mouse/byd.h +f:drivers/input/mouse/cyapa.c +f:drivers/input/mouse/cyapa.h +f:drivers/input/mouse/cyapa_gen3.c +f:drivers/input/mouse/cyapa_gen5.c +f:drivers/input/mouse/cyapa_gen6.c +f:drivers/input/mouse/cypress_ps2.c +f:drivers/input/mouse/cypress_ps2.h +f:drivers/input/mouse/elan_i2c.h +f:drivers/input/mouse/elan_i2c_core.c +f:drivers/input/mouse/elan_i2c_i2c.c +f:drivers/input/mouse/elan_i2c_smbus.c +f:drivers/input/mouse/elantech.c +f:drivers/input/mouse/elantech.h +f:drivers/input/mouse/focaltech.c +f:drivers/input/mouse/focaltech.h +f:drivers/input/mouse/gpio_mouse.c +f:drivers/input/mouse/hgpk.c +f:drivers/input/mouse/hgpk.h +f:drivers/input/mouse/inport.c +f:drivers/input/mouse/lifebook.c +f:drivers/input/mouse/lifebook.h +f:drivers/input/mouse/logibm.c +f:drivers/input/mouse/logips2pp.c +f:drivers/input/mouse/logips2pp.h +f:drivers/input/mouse/maplemouse.c +f:drivers/input/mouse/pc110pad.c +f:drivers/input/mouse/psmouse-base.c +f:drivers/input/mouse/psmouse-smbus.c +f:drivers/input/mouse/psmouse.h +f:drivers/input/mouse/rpcmouse.c +f:drivers/input/mouse/sentelic.c +f:drivers/input/mouse/sentelic.h +f:drivers/input/mouse/sermouse.c +f:drivers/input/mouse/synaptics.c +f:drivers/input/mouse/synaptics.h +f:drivers/input/mouse/synaptics_i2c.c +f:drivers/input/mouse/synaptics_usb.c +f:drivers/input/mouse/touchkit_ps2.c +f:drivers/input/mouse/touchkit_ps2.h +f:drivers/input/mouse/trackpoint.c +f:drivers/input/mouse/trackpoint.h +f:drivers/input/mouse/vmmouse.c +f:drivers/input/mouse/vmmouse.h +f:drivers/input/mouse/vsxxxaa.c +f:drivers/input/mousedev.c +f:drivers/input/rmi4/Kconfig +f:drivers/input/rmi4/Makefile +f:drivers/input/rmi4/rmi_2d_sensor.c +f:drivers/input/rmi4/rmi_2d_sensor.h +f:drivers/input/rmi4/rmi_bus.c +f:drivers/input/rmi4/rmi_bus.h +f:drivers/input/rmi4/rmi_driver.c +f:drivers/input/rmi4/rmi_driver.h +f:drivers/input/rmi4/rmi_f01.c +f:drivers/input/rmi4/rmi_f03.c +f:drivers/input/rmi4/rmi_f11.c +f:drivers/input/rmi4/rmi_f12.c +f:drivers/input/rmi4/rmi_f30.c +f:drivers/input/rmi4/rmi_f34.c +f:drivers/input/rmi4/rmi_f34.h +f:drivers/input/rmi4/rmi_f34v7.c +f:drivers/input/rmi4/rmi_f3a.c +f:drivers/input/rmi4/rmi_f54.c +f:drivers/input/rmi4/rmi_f55.c +f:drivers/input/rmi4/rmi_i2c.c +f:drivers/input/rmi4/rmi_smbus.c +f:drivers/input/rmi4/rmi_spi.c +f:drivers/input/serio/Kconfig +f:drivers/input/serio/Makefile +f:drivers/input/serio/altera_ps2.c +f:drivers/input/serio/ambakmi.c +f:drivers/input/serio/ams_delta_serio.c +f:drivers/input/serio/apbps2.c +f:drivers/input/serio/arc_ps2.c +f:drivers/input/serio/ct82c710.c +f:drivers/input/serio/gscps2.c +f:drivers/input/serio/hil_mlc.c +f:drivers/input/serio/hp_sdc.c +f:drivers/input/serio/hp_sdc_mlc.c +f:drivers/input/serio/hyperv-keyboard.c +f:drivers/input/serio/i8042-acpipnpio.h +f:drivers/input/serio/i8042-io.h +f:drivers/input/serio/i8042-ip22io.h +f:drivers/input/serio/i8042-jazzio.h +f:drivers/input/serio/i8042-snirm.h +f:drivers/input/serio/i8042-sparcio.h +f:drivers/input/serio/i8042.c +f:drivers/input/serio/i8042.h +f:drivers/input/serio/ioc3kbd.c +f:drivers/input/serio/libps2.c +f:drivers/input/serio/maceps2.c +f:drivers/input/serio/olpc_apsp.c +f:drivers/input/serio/parkbd.c +f:drivers/input/serio/pcips2.c +f:drivers/input/serio/ps2-gpio.c +f:drivers/input/serio/ps2mult.c +f:drivers/input/serio/q40kbd.c +f:drivers/input/serio/rpckbd.c +f:drivers/input/serio/sa1111ps2.c +f:drivers/input/serio/serio.c +f:drivers/input/serio/serio_raw.c +f:drivers/input/serio/serport.c +f:drivers/input/serio/sun4i-ps2.c +f:drivers/input/serio/userio.c +f:drivers/input/serio/xilinx_ps2.c +f:drivers/input/sparse-keymap.c +f:drivers/input/tablet/Kconfig +f:drivers/input/tablet/Makefile +f:drivers/input/tablet/acecad.c +f:drivers/input/tablet/aiptek.c +f:drivers/input/tablet/hanwang.c +f:drivers/input/tablet/kbtab.c +f:drivers/input/tablet/pegasus_notetaker.c +f:drivers/input/tablet/wacom_serial4.c +f:drivers/input/tests/.kunitconfig +f:drivers/input/tests/Makefile +f:drivers/input/tests/input_test.c +f:drivers/input/touchscreen.c +f:drivers/input/touchscreen/88pm860x-ts.c +f:drivers/input/touchscreen/Kconfig +f:drivers/input/touchscreen/Makefile +f:drivers/input/touchscreen/ad7877.c +f:drivers/input/touchscreen/ad7879-i2c.c +f:drivers/input/touchscreen/ad7879-spi.c +f:drivers/input/touchscreen/ad7879.c +f:drivers/input/touchscreen/ad7879.h +f:drivers/input/touchscreen/ads7846.c +f:drivers/input/touchscreen/apple_z2.c +f:drivers/input/touchscreen/ar1021_i2c.c +f:drivers/input/touchscreen/atmel_mxt_ts.c +f:drivers/input/touchscreen/auo-pixcir-ts.c +f:drivers/input/touchscreen/bcm_iproc_tsc.c +f:drivers/input/touchscreen/bu21013_ts.c +f:drivers/input/touchscreen/bu21029_ts.c +f:drivers/input/touchscreen/chipone_icn8318.c +f:drivers/input/touchscreen/chipone_icn8505.c +f:drivers/input/touchscreen/colibri-vf50-ts.c +f:drivers/input/touchscreen/cy8ctma140.c +f:drivers/input/touchscreen/cy8ctmg110_ts.c +f:drivers/input/touchscreen/cyttsp5.c +f:drivers/input/touchscreen/cyttsp_core.c +f:drivers/input/touchscreen/cyttsp_core.h +f:drivers/input/touchscreen/cyttsp_i2c.c +f:drivers/input/touchscreen/cyttsp_spi.c +f:drivers/input/touchscreen/da9034-ts.c +f:drivers/input/touchscreen/da9052_tsi.c +f:drivers/input/touchscreen/dynapro.c +f:drivers/input/touchscreen/edt-ft5x06.c +f:drivers/input/touchscreen/eeti_ts.c +f:drivers/input/touchscreen/egalax_ts.c +f:drivers/input/touchscreen/egalax_ts_serial.c +f:drivers/input/touchscreen/ektf2127.c +f:drivers/input/touchscreen/elants_i2c.c +f:drivers/input/touchscreen/elo.c +f:drivers/input/touchscreen/exc3000.c +f:drivers/input/touchscreen/fsl-imx25-tcq.c +f:drivers/input/touchscreen/fujitsu_ts.c +f:drivers/input/touchscreen/goodix.c +f:drivers/input/touchscreen/goodix.h +f:drivers/input/touchscreen/goodix_berlin.h +f:drivers/input/touchscreen/goodix_berlin_core.c +f:drivers/input/touchscreen/goodix_berlin_i2c.c +f:drivers/input/touchscreen/goodix_berlin_spi.c +f:drivers/input/touchscreen/goodix_fwupload.c +f:drivers/input/touchscreen/gunze.c +f:drivers/input/touchscreen/hampshire.c +f:drivers/input/touchscreen/hideep.c +f:drivers/input/touchscreen/himax_hx83112b.c +f:drivers/input/touchscreen/hp680_ts_input.c +f:drivers/input/touchscreen/htcpen.c +f:drivers/input/touchscreen/hycon-hy46xx.c +f:drivers/input/touchscreen/hynitron_cstxxx.c +f:drivers/input/touchscreen/ili210x.c +f:drivers/input/touchscreen/ilitek_ts_i2c.c +f:drivers/input/touchscreen/imagis.c +f:drivers/input/touchscreen/imx6ul_tsc.c +f:drivers/input/touchscreen/inexio.c +f:drivers/input/touchscreen/ipaq-micro-ts.c +f:drivers/input/touchscreen/iqs5xx.c +f:drivers/input/touchscreen/iqs7211.c +f:drivers/input/touchscreen/jornada720_ts.c +f:drivers/input/touchscreen/lpc32xx_ts.c +f:drivers/input/touchscreen/mainstone-wm97xx.c +f:drivers/input/touchscreen/max11801_ts.c +f:drivers/input/touchscreen/mc13783_ts.c +f:drivers/input/touchscreen/melfas_mip4.c +f:drivers/input/touchscreen/migor_ts.c +f:drivers/input/touchscreen/mk712.c +f:drivers/input/touchscreen/mms114.c +f:drivers/input/touchscreen/msg2638.c +f:drivers/input/touchscreen/mtouch.c +f:drivers/input/touchscreen/mxs-lradc-ts.c +f:drivers/input/touchscreen/novatek-nvt-ts.c +f:drivers/input/touchscreen/pcap_ts.c +f:drivers/input/touchscreen/penmount.c +f:drivers/input/touchscreen/pixcir_i2c_ts.c +f:drivers/input/touchscreen/raspberrypi-ts.c +f:drivers/input/touchscreen/raydium_i2c_ts.c +f:drivers/input/touchscreen/resistive-adc-touch.c +f:drivers/input/touchscreen/rohm_bu21023.c +f:drivers/input/touchscreen/s6sy761.c +f:drivers/input/touchscreen/silead.c +f:drivers/input/touchscreen/sis_i2c.c +f:drivers/input/touchscreen/st1232.c +f:drivers/input/touchscreen/stmfts.c +f:drivers/input/touchscreen/stmpe-ts.c +f:drivers/input/touchscreen/sun4i-ts.c +f:drivers/input/touchscreen/sur40.c +f:drivers/input/touchscreen/surface3_spi.c +f:drivers/input/touchscreen/sx8654.c +f:drivers/input/touchscreen/ti_am335x_tsc.c +f:drivers/input/touchscreen/touchit213.c +f:drivers/input/touchscreen/touchright.c +f:drivers/input/touchscreen/touchwin.c +f:drivers/input/touchscreen/tps6507x-ts.c +f:drivers/input/touchscreen/ts4800-ts.c +f:drivers/input/touchscreen/tsc2004.c +f:drivers/input/touchscreen/tsc2005.c +f:drivers/input/touchscreen/tsc2007.h +f:drivers/input/touchscreen/tsc2007_core.c +f:drivers/input/touchscreen/tsc2007_iio.c +f:drivers/input/touchscreen/tsc200x-core.c +f:drivers/input/touchscreen/tsc200x-core.h +f:drivers/input/touchscreen/tsc40.c +f:drivers/input/touchscreen/usbtouchscreen.c +f:drivers/input/touchscreen/wacom_i2c.c +f:drivers/input/touchscreen/wacom_w8001.c +f:drivers/input/touchscreen/wdt87xx_i2c.c +f:drivers/input/touchscreen/wm831x-ts.c +f:drivers/input/touchscreen/wm9705.c +f:drivers/input/touchscreen/wm9712.c +f:drivers/input/touchscreen/wm9713.c +f:drivers/input/touchscreen/wm97xx-core.c +f:drivers/input/touchscreen/zet6223.c +f:drivers/input/touchscreen/zforce_ts.c +f:drivers/input/touchscreen/zinitix.c +f:drivers/input/vivaldi-fmap.c +f:drivers/interconnect/Kconfig +f:drivers/interconnect/Makefile +f:drivers/interconnect/bulk.c +f:drivers/interconnect/core.c +f:drivers/interconnect/debugfs-client.c +f:drivers/interconnect/icc-clk.c +f:drivers/interconnect/imx/Kconfig +f:drivers/interconnect/imx/Makefile +f:drivers/interconnect/imx/imx.c +f:drivers/interconnect/imx/imx.h +f:drivers/interconnect/imx/imx8mm.c +f:drivers/interconnect/imx/imx8mn.c +f:drivers/interconnect/imx/imx8mp.c +f:drivers/interconnect/imx/imx8mq.c +f:drivers/interconnect/internal.h +f:drivers/interconnect/mediatek/Kconfig +f:drivers/interconnect/mediatek/Makefile +f:drivers/interconnect/mediatek/icc-emi.c +f:drivers/interconnect/mediatek/icc-emi.h +f:drivers/interconnect/mediatek/mt8183.c +f:drivers/interconnect/mediatek/mt8195.c +f:drivers/interconnect/qcom/Kconfig +f:drivers/interconnect/qcom/Makefile +f:drivers/interconnect/qcom/bcm-voter.c +f:drivers/interconnect/qcom/bcm-voter.h +f:drivers/interconnect/qcom/icc-common.c +f:drivers/interconnect/qcom/icc-common.h +f:drivers/interconnect/qcom/icc-rpm-clocks.c +f:drivers/interconnect/qcom/icc-rpm.c +f:drivers/interconnect/qcom/icc-rpm.h +f:drivers/interconnect/qcom/icc-rpmh.c +f:drivers/interconnect/qcom/icc-rpmh.h +f:drivers/interconnect/qcom/milos.c +f:drivers/interconnect/qcom/msm8909.c +f:drivers/interconnect/qcom/msm8916.c +f:drivers/interconnect/qcom/msm8937.c +f:drivers/interconnect/qcom/msm8939.c +f:drivers/interconnect/qcom/msm8953.c +f:drivers/interconnect/qcom/msm8974.c +f:drivers/interconnect/qcom/msm8976.c +f:drivers/interconnect/qcom/msm8996.c +f:drivers/interconnect/qcom/msm8996.h +f:drivers/interconnect/qcom/osm-l3.c +f:drivers/interconnect/qcom/qcm2290.c +f:drivers/interconnect/qcom/qcs404.c +f:drivers/interconnect/qcom/qcs615.c +f:drivers/interconnect/qcom/qcs615.h +f:drivers/interconnect/qcom/qcs8300.c +f:drivers/interconnect/qcom/qcs8300.h +f:drivers/interconnect/qcom/qdu1000.c +f:drivers/interconnect/qcom/qdu1000.h +f:drivers/interconnect/qcom/sa8775p.c +f:drivers/interconnect/qcom/sar2130p.c +f:drivers/interconnect/qcom/sc7180.c +f:drivers/interconnect/qcom/sc7180.h +f:drivers/interconnect/qcom/sc7280.c +f:drivers/interconnect/qcom/sc7280.h +f:drivers/interconnect/qcom/sc8180x.c +f:drivers/interconnect/qcom/sc8180x.h +f:drivers/interconnect/qcom/sc8280xp.c +f:drivers/interconnect/qcom/sc8280xp.h +f:drivers/interconnect/qcom/sdm660.c +f:drivers/interconnect/qcom/sdm670.c +f:drivers/interconnect/qcom/sdm670.h +f:drivers/interconnect/qcom/sdm845.c +f:drivers/interconnect/qcom/sdm845.h +f:drivers/interconnect/qcom/sdx55.c +f:drivers/interconnect/qcom/sdx55.h +f:drivers/interconnect/qcom/sdx65.c +f:drivers/interconnect/qcom/sdx65.h +f:drivers/interconnect/qcom/sdx75.c +f:drivers/interconnect/qcom/sdx75.h +f:drivers/interconnect/qcom/sm6115.c +f:drivers/interconnect/qcom/sm6350.c +f:drivers/interconnect/qcom/sm6350.h +f:drivers/interconnect/qcom/sm7150.c +f:drivers/interconnect/qcom/sm7150.h +f:drivers/interconnect/qcom/sm8150.c +f:drivers/interconnect/qcom/sm8150.h +f:drivers/interconnect/qcom/sm8250.c +f:drivers/interconnect/qcom/sm8250.h +f:drivers/interconnect/qcom/sm8350.c +f:drivers/interconnect/qcom/sm8350.h +f:drivers/interconnect/qcom/sm8450.c +f:drivers/interconnect/qcom/sm8450.h +f:drivers/interconnect/qcom/sm8550.c +f:drivers/interconnect/qcom/sm8550.h +f:drivers/interconnect/qcom/sm8650.c +f:drivers/interconnect/qcom/sm8650.h +f:drivers/interconnect/qcom/sm8750.c +f:drivers/interconnect/qcom/smd-rpm.c +f:drivers/interconnect/qcom/x1e80100.c +f:drivers/interconnect/qcom/x1e80100.h +f:drivers/interconnect/samsung/Kconfig +f:drivers/interconnect/samsung/Makefile +f:drivers/interconnect/samsung/exynos.c +f:drivers/interconnect/trace.h +f:drivers/iommu/Kconfig +f:drivers/iommu/Makefile +f:drivers/iommu/amd/Kconfig +f:drivers/iommu/amd/Makefile +f:drivers/iommu/amd/amd_iommu.h +f:drivers/iommu/amd/amd_iommu_types.h +f:drivers/iommu/amd/debugfs.c +f:drivers/iommu/amd/init.c +f:drivers/iommu/amd/io_pgtable.c +f:drivers/iommu/amd/io_pgtable_v2.c +f:drivers/iommu/amd/iommu.c +f:drivers/iommu/amd/pasid.c +f:drivers/iommu/amd/ppr.c +f:drivers/iommu/amd/quirks.c +f:drivers/iommu/apple-dart.c +f:drivers/iommu/arm/Kconfig +f:drivers/iommu/arm/Makefile +f:drivers/iommu/arm/arm-smmu-v3/Makefile +f:drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c +f:drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +f:drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-test.c +f:drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +f:drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +f:drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c +f:drivers/iommu/arm/arm-smmu/Makefile +f:drivers/iommu/arm/arm-smmu/arm-smmu-impl.c +f:drivers/iommu/arm/arm-smmu/arm-smmu-nvidia.c +f:drivers/iommu/arm/arm-smmu/arm-smmu-qcom-debug.c +f:drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c +f:drivers/iommu/arm/arm-smmu/arm-smmu-qcom.h +f:drivers/iommu/arm/arm-smmu/arm-smmu.c +f:drivers/iommu/arm/arm-smmu/arm-smmu.h +f:drivers/iommu/arm/arm-smmu/qcom_iommu.c +f:drivers/iommu/dma-iommu.c +f:drivers/iommu/dma-iommu.h +f:drivers/iommu/exynos-iommu.c +f:drivers/iommu/fsl_pamu.c +f:drivers/iommu/fsl_pamu.h +f:drivers/iommu/fsl_pamu_domain.c +f:drivers/iommu/fsl_pamu_domain.h +f:drivers/iommu/hyperv-iommu.c +f:drivers/iommu/intel/Kconfig +f:drivers/iommu/intel/Makefile +f:drivers/iommu/intel/cache.c +f:drivers/iommu/intel/debugfs.c +f:drivers/iommu/intel/dmar.c +f:drivers/iommu/intel/iommu.c +f:drivers/iommu/intel/iommu.h +f:drivers/iommu/intel/irq_remapping.c +f:drivers/iommu/intel/nested.c +f:drivers/iommu/intel/pasid.c +f:drivers/iommu/intel/pasid.h +f:drivers/iommu/intel/perf.c +f:drivers/iommu/intel/perf.h +f:drivers/iommu/intel/perfmon.c +f:drivers/iommu/intel/perfmon.h +f:drivers/iommu/intel/prq.c +f:drivers/iommu/intel/svm.c +f:drivers/iommu/intel/trace.c +f:drivers/iommu/intel/trace.h +f:drivers/iommu/io-pgfault.c +f:drivers/iommu/io-pgtable-arm-v7s.c +f:drivers/iommu/io-pgtable-arm.c +f:drivers/iommu/io-pgtable-arm.h +f:drivers/iommu/io-pgtable-dart.c +f:drivers/iommu/io-pgtable.c +f:drivers/iommu/iommu-debugfs.c +f:drivers/iommu/iommu-pages.c +f:drivers/iommu/iommu-pages.h +f:drivers/iommu/iommu-priv.h +f:drivers/iommu/iommu-sva.c +f:drivers/iommu/iommu-sysfs.c +f:drivers/iommu/iommu-traces.c +f:drivers/iommu/iommu.c +f:drivers/iommu/iommufd/Kconfig +f:drivers/iommu/iommufd/Makefile +f:drivers/iommu/iommufd/device.c +f:drivers/iommu/iommufd/double_span.h +f:drivers/iommu/iommufd/driver.c +f:drivers/iommu/iommufd/eventq.c +f:drivers/iommu/iommufd/hw_pagetable.c +f:drivers/iommu/iommufd/io_pagetable.c +f:drivers/iommu/iommufd/io_pagetable.h +f:drivers/iommu/iommufd/ioas.c +f:drivers/iommu/iommufd/iommufd_private.h +f:drivers/iommu/iommufd/iommufd_test.h +f:drivers/iommu/iommufd/iova_bitmap.c +f:drivers/iommu/iommufd/main.c +f:drivers/iommu/iommufd/pages.c +f:drivers/iommu/iommufd/selftest.c +f:drivers/iommu/iommufd/vfio_compat.c +f:drivers/iommu/iommufd/viommu.c +f:drivers/iommu/iova.c +f:drivers/iommu/ipmmu-vmsa.c +f:drivers/iommu/irq_remapping.c +f:drivers/iommu/irq_remapping.h +f:drivers/iommu/msm_iommu.c +f:drivers/iommu/msm_iommu.h +f:drivers/iommu/msm_iommu_hw-8xxx.h +f:drivers/iommu/mtk_iommu.c +f:drivers/iommu/mtk_iommu_v1.c +f:drivers/iommu/of_iommu.c +f:drivers/iommu/omap-iommu-debug.c +f:drivers/iommu/omap-iommu.c +f:drivers/iommu/omap-iommu.h +f:drivers/iommu/omap-iopgtable.h +f:drivers/iommu/riscv/Kconfig +f:drivers/iommu/riscv/Makefile +f:drivers/iommu/riscv/iommu-bits.h +f:drivers/iommu/riscv/iommu-pci.c +f:drivers/iommu/riscv/iommu-platform.c +f:drivers/iommu/riscv/iommu.c +f:drivers/iommu/riscv/iommu.h +f:drivers/iommu/rockchip-iommu.c +f:drivers/iommu/s390-iommu.c +f:drivers/iommu/sprd-iommu.c +f:drivers/iommu/sun50i-iommu.c +f:drivers/iommu/tegra-smmu.c +f:drivers/iommu/virtio-iommu.c +f:drivers/ipack/Kconfig +f:drivers/ipack/Makefile +f:drivers/ipack/carriers/Kconfig +f:drivers/ipack/carriers/Makefile +f:drivers/ipack/carriers/tpci200.c +f:drivers/ipack/carriers/tpci200.h +f:drivers/ipack/devices/Kconfig +f:drivers/ipack/devices/Makefile +f:drivers/ipack/devices/ipoctal.c +f:drivers/ipack/devices/ipoctal.h +f:drivers/ipack/devices/scc2698.h +f:drivers/ipack/ipack.c +f:drivers/irqchip/Kconfig +f:drivers/irqchip/Makefile +f:drivers/irqchip/alphascale_asm9260-icoll.h +f:drivers/irqchip/exynos-combiner.c +f:drivers/irqchip/irq-aclint-sswi.c +f:drivers/irqchip/irq-al-fic.c +f:drivers/irqchip/irq-alpine-msi.c +f:drivers/irqchip/irq-apple-aic.c +f:drivers/irqchip/irq-armada-370-xp.c +f:drivers/irqchip/irq-aspeed-i2c-ic.c +f:drivers/irqchip/irq-aspeed-intc.c +f:drivers/irqchip/irq-aspeed-scu-ic.c +f:drivers/irqchip/irq-aspeed-vic.c +f:drivers/irqchip/irq-ath79-cpu.c +f:drivers/irqchip/irq-ath79-misc.c +f:drivers/irqchip/irq-atmel-aic-common.c +f:drivers/irqchip/irq-atmel-aic-common.h +f:drivers/irqchip/irq-atmel-aic.c +f:drivers/irqchip/irq-atmel-aic5.c +f:drivers/irqchip/irq-bcm2712-mip.c +f:drivers/irqchip/irq-bcm2835.c +f:drivers/irqchip/irq-bcm2836.c +f:drivers/irqchip/irq-bcm6345-l1.c +f:drivers/irqchip/irq-bcm7038-l1.c +f:drivers/irqchip/irq-bcm7120-l2.c +f:drivers/irqchip/irq-brcmstb-l2.c +f:drivers/irqchip/irq-clps711x.c +f:drivers/irqchip/irq-crossbar.c +f:drivers/irqchip/irq-csky-apb-intc.c +f:drivers/irqchip/irq-csky-mpintc.c +f:drivers/irqchip/irq-davinci-cp-intc.c +f:drivers/irqchip/irq-digicolor.c +f:drivers/irqchip/irq-dw-apb-ictl.c +f:drivers/irqchip/irq-econet-en751221.c +f:drivers/irqchip/irq-ftintc010.c +f:drivers/irqchip/irq-gic-common.c +f:drivers/irqchip/irq-gic-common.h +f:drivers/irqchip/irq-gic-its-msi-parent.c +f:drivers/irqchip/irq-gic-its-msi-parent.h +f:drivers/irqchip/irq-gic-pm.c +f:drivers/irqchip/irq-gic-realview.c +f:drivers/irqchip/irq-gic-v2m.c +f:drivers/irqchip/irq-gic-v3-its-fsl-mc-msi.c +f:drivers/irqchip/irq-gic-v3-its.c +f:drivers/irqchip/irq-gic-v3-mbi.c +f:drivers/irqchip/irq-gic-v3.c +f:drivers/irqchip/irq-gic-v4.c +f:drivers/irqchip/irq-gic-v5-irs.c +f:drivers/irqchip/irq-gic-v5-its.c +f:drivers/irqchip/irq-gic-v5-iwb.c +f:drivers/irqchip/irq-gic-v5.c +f:drivers/irqchip/irq-gic.c +f:drivers/irqchip/irq-goldfish-pic.c +f:drivers/irqchip/irq-hip04.c +f:drivers/irqchip/irq-i8259.c +f:drivers/irqchip/irq-idt3243x.c +f:drivers/irqchip/irq-imgpdc.c +f:drivers/irqchip/irq-imx-gpcv2.c +f:drivers/irqchip/irq-imx-intmux.c +f:drivers/irqchip/irq-imx-irqsteer.c +f:drivers/irqchip/irq-imx-mu-msi.c +f:drivers/irqchip/irq-ingenic-tcu.c +f:drivers/irqchip/irq-ingenic.c +f:drivers/irqchip/irq-ixp4xx.c +f:drivers/irqchip/irq-jcore-aic.c +f:drivers/irqchip/irq-keystone.c +f:drivers/irqchip/irq-lan966x-oic.c +f:drivers/irqchip/irq-loongarch-avec.c +f:drivers/irqchip/irq-loongarch-cpu.c +f:drivers/irqchip/irq-loongson-eiointc.c +f:drivers/irqchip/irq-loongson-htpic.c +f:drivers/irqchip/irq-loongson-htvec.c +f:drivers/irqchip/irq-loongson-liointc.c +f:drivers/irqchip/irq-loongson-pch-lpc.c +f:drivers/irqchip/irq-loongson-pch-msi.c +f:drivers/irqchip/irq-loongson-pch-pic.c +f:drivers/irqchip/irq-loongson.h +f:drivers/irqchip/irq-lpc32xx.c +f:drivers/irqchip/irq-ls-extirq.c +f:drivers/irqchip/irq-ls-scfg-msi.c +f:drivers/irqchip/irq-ls1x.c +f:drivers/irqchip/irq-madera.c +f:drivers/irqchip/irq-mbigen.c +f:drivers/irqchip/irq-mchp-eic.c +f:drivers/irqchip/irq-meson-gpio.c +f:drivers/irqchip/irq-mips-cpu.c +f:drivers/irqchip/irq-mips-gic.c +f:drivers/irqchip/irq-mmp.c +f:drivers/irqchip/irq-mscc-ocelot.c +f:drivers/irqchip/irq-msi-lib.c +f:drivers/irqchip/irq-mst-intc.c +f:drivers/irqchip/irq-mtk-cirq.c +f:drivers/irqchip/irq-mtk-sysirq.c +f:drivers/irqchip/irq-mvebu-gicp.c +f:drivers/irqchip/irq-mvebu-icu.c +f:drivers/irqchip/irq-mvebu-odmi.c +f:drivers/irqchip/irq-mvebu-pic.c +f:drivers/irqchip/irq-mvebu-sei.c +f:drivers/irqchip/irq-mxs.c +f:drivers/irqchip/irq-nvic.c +f:drivers/irqchip/irq-omap-intc.c +f:drivers/irqchip/irq-ompic.c +f:drivers/irqchip/irq-or1k-pic.c +f:drivers/irqchip/irq-orion.c +f:drivers/irqchip/irq-owl-sirq.c +f:drivers/irqchip/irq-partition-percpu.c +f:drivers/irqchip/irq-pic32-evic.c +f:drivers/irqchip/irq-pruss-intc.c +f:drivers/irqchip/irq-qcom-mpm.c +f:drivers/irqchip/irq-rda-intc.c +f:drivers/irqchip/irq-realtek-rtl.c +f:drivers/irqchip/irq-renesas-intc-irqpin.c +f:drivers/irqchip/irq-renesas-irqc.c +f:drivers/irqchip/irq-renesas-rza1.c +f:drivers/irqchip/irq-renesas-rzg2l.c +f:drivers/irqchip/irq-renesas-rzv2h.c +f:drivers/irqchip/irq-riscv-aplic-direct.c +f:drivers/irqchip/irq-riscv-aplic-main.c +f:drivers/irqchip/irq-riscv-aplic-main.h +f:drivers/irqchip/irq-riscv-aplic-msi.c +f:drivers/irqchip/irq-riscv-imsic-early.c +f:drivers/irqchip/irq-riscv-imsic-platform.c +f:drivers/irqchip/irq-riscv-imsic-state.c +f:drivers/irqchip/irq-riscv-imsic-state.h +f:drivers/irqchip/irq-riscv-intc.c +f:drivers/irqchip/irq-sa11x0.c +f:drivers/irqchip/irq-sg2042-msi.c +f:drivers/irqchip/irq-sifive-plic.c +f:drivers/irqchip/irq-sl28cpld.c +f:drivers/irqchip/irq-sni-exiu.c +f:drivers/irqchip/irq-sp7021-intc.c +f:drivers/irqchip/irq-st.c +f:drivers/irqchip/irq-starfive-jh8100-intc.c +f:drivers/irqchip/irq-stm32-exti.c +f:drivers/irqchip/irq-stm32mp-exti.c +f:drivers/irqchip/irq-sun4i.c +f:drivers/irqchip/irq-sun6i-r.c +f:drivers/irqchip/irq-sunxi-nmi.c +f:drivers/irqchip/irq-tb10x.c +f:drivers/irqchip/irq-tegra.c +f:drivers/irqchip/irq-ti-sci-inta.c +f:drivers/irqchip/irq-ti-sci-intr.c +f:drivers/irqchip/irq-ts4800.c +f:drivers/irqchip/irq-uniphier-aidet.c +f:drivers/irqchip/irq-versatile-fpga.c +f:drivers/irqchip/irq-vf610-mscm-ir.c +f:drivers/irqchip/irq-vic.c +f:drivers/irqchip/irq-vt8500.c +f:drivers/irqchip/irq-wpcm450-aic.c +f:drivers/irqchip/irq-xilinx-intc.c +f:drivers/irqchip/irq-xtensa-mx.c +f:drivers/irqchip/irq-xtensa-pic.c +f:drivers/irqchip/irq-zevio.c +f:drivers/irqchip/irqchip.c +f:drivers/irqchip/qcom-irq-combiner.c +f:drivers/irqchip/qcom-pdc.c +f:drivers/irqchip/spear-shirq.c +f:drivers/isdn/Kconfig +f:drivers/isdn/Makefile +f:drivers/isdn/capi/Kconfig +f:drivers/isdn/capi/Makefile +f:drivers/isdn/capi/capi.c +f:drivers/isdn/capi/capiutil.c +f:drivers/isdn/capi/kcapi.c +f:drivers/isdn/capi/kcapi.h +f:drivers/isdn/capi/kcapi_proc.c +f:drivers/isdn/hardware/Makefile +f:drivers/isdn/hardware/mISDN/Kconfig +f:drivers/isdn/hardware/mISDN/Makefile +f:drivers/isdn/hardware/mISDN/avmfritz.c +f:drivers/isdn/hardware/mISDN/hfc_multi.h +f:drivers/isdn/hardware/mISDN/hfc_multi_8xx.h +f:drivers/isdn/hardware/mISDN/hfc_pci.h +f:drivers/isdn/hardware/mISDN/hfcmulti.c +f:drivers/isdn/hardware/mISDN/hfcpci.c +f:drivers/isdn/hardware/mISDN/hfcsusb.c +f:drivers/isdn/hardware/mISDN/hfcsusb.h +f:drivers/isdn/hardware/mISDN/iohelper.h +f:drivers/isdn/hardware/mISDN/ipac.h +f:drivers/isdn/hardware/mISDN/isar.h +f:drivers/isdn/hardware/mISDN/isdnhdlc.c +f:drivers/isdn/hardware/mISDN/isdnhdlc.h +f:drivers/isdn/hardware/mISDN/mISDNinfineon.c +f:drivers/isdn/hardware/mISDN/mISDNipac.c +f:drivers/isdn/hardware/mISDN/mISDNisar.c +f:drivers/isdn/hardware/mISDN/netjet.c +f:drivers/isdn/hardware/mISDN/netjet.h +f:drivers/isdn/hardware/mISDN/speedfax.c +f:drivers/isdn/hardware/mISDN/w6692.c +f:drivers/isdn/hardware/mISDN/w6692.h +f:drivers/isdn/mISDN/Kconfig +f:drivers/isdn/mISDN/Makefile +f:drivers/isdn/mISDN/clock.c +f:drivers/isdn/mISDN/core.c +f:drivers/isdn/mISDN/core.h +f:drivers/isdn/mISDN/dsp.h +f:drivers/isdn/mISDN/dsp_audio.c +f:drivers/isdn/mISDN/dsp_biquad.h +f:drivers/isdn/mISDN/dsp_blowfish.c +f:drivers/isdn/mISDN/dsp_cmx.c +f:drivers/isdn/mISDN/dsp_core.c +f:drivers/isdn/mISDN/dsp_dtmf.c +f:drivers/isdn/mISDN/dsp_ecdis.h +f:drivers/isdn/mISDN/dsp_hwec.c +f:drivers/isdn/mISDN/dsp_hwec.h +f:drivers/isdn/mISDN/dsp_pipeline.c +f:drivers/isdn/mISDN/dsp_tones.c +f:drivers/isdn/mISDN/fsm.c +f:drivers/isdn/mISDN/fsm.h +f:drivers/isdn/mISDN/hwchannel.c +f:drivers/isdn/mISDN/l1oip.h +f:drivers/isdn/mISDN/l1oip_codec.c +f:drivers/isdn/mISDN/l1oip_core.c +f:drivers/isdn/mISDN/layer1.c +f:drivers/isdn/mISDN/layer1.h +f:drivers/isdn/mISDN/layer2.c +f:drivers/isdn/mISDN/layer2.h +f:drivers/isdn/mISDN/socket.c +f:drivers/isdn/mISDN/stack.c +f:drivers/isdn/mISDN/tei.c +f:drivers/isdn/mISDN/timerdev.c +f:drivers/leds/.kunitconfig +f:drivers/leds/Kconfig +f:drivers/leds/Makefile +f:drivers/leds/TODO +f:drivers/leds/blink/Kconfig +f:drivers/leds/blink/Makefile +f:drivers/leds/blink/leds-bcm63138.c +f:drivers/leds/blink/leds-lgm-sso.c +f:drivers/leds/flash/Kconfig +f:drivers/leds/flash/Makefile +f:drivers/leds/flash/leds-aat1290.c +f:drivers/leds/flash/leds-as3645a.c +f:drivers/leds/flash/leds-ktd2692.c +f:drivers/leds/flash/leds-lm3601x.c +f:drivers/leds/flash/leds-max77693.c +f:drivers/leds/flash/leds-mt6360.c +f:drivers/leds/flash/leds-mt6370-flash.c +f:drivers/leds/flash/leds-qcom-flash.c +f:drivers/leds/flash/leds-rt4505.c +f:drivers/leds/flash/leds-rt8515.c +f:drivers/leds/flash/leds-sgm3140.c +f:drivers/leds/flash/leds-sy7802.c +f:drivers/leds/flash/leds-tps6131x.c +f:drivers/leds/led-class-flash.c +f:drivers/leds/led-class-multicolor.c +f:drivers/leds/led-class.c +f:drivers/leds/led-core.c +f:drivers/leds/led-test.c +f:drivers/leds/led-triggers.c +f:drivers/leds/leds-88pm860x.c +f:drivers/leds/leds-acer-a500.c +f:drivers/leds/leds-adp5520.c +f:drivers/leds/leds-an30259a.c +f:drivers/leds/leds-apu.c +f:drivers/leds/leds-ariel.c +f:drivers/leds/leds-aw200xx.c +f:drivers/leds/leds-aw2013.c +f:drivers/leds/leds-bcm6328.c +f:drivers/leds/leds-bcm6358.c +f:drivers/leds/leds-bd2606mvv.c +f:drivers/leds/leds-bd2802.c +f:drivers/leds/leds-blinkm.c +f:drivers/leds/leds-cht-wcove.c +f:drivers/leds/leds-clevo-mail.c +f:drivers/leds/leds-cobalt-qube.c +f:drivers/leds/leds-cobalt-raq.c +f:drivers/leds/leds-cpcap.c +f:drivers/leds/leds-cr0014114.c +f:drivers/leds/leds-cros_ec.c +f:drivers/leds/leds-da903x.c +f:drivers/leds/leds-da9052.c +f:drivers/leds/leds-dac124s085.c +f:drivers/leds/leds-el15203000.c +f:drivers/leds/leds-expresswire.c +f:drivers/leds/leds-gpio-register.c +f:drivers/leds/leds-gpio.c +f:drivers/leds/leds-hp6xx.c +f:drivers/leds/leds-ip30.c +f:drivers/leds/leds-ipaq-micro.c +f:drivers/leds/leds-is31fl319x.c +f:drivers/leds/leds-is31fl32xx.c +f:drivers/leds/leds-lm3530.c +f:drivers/leds/leds-lm3532.c +f:drivers/leds/leds-lm3533.c +f:drivers/leds/leds-lm355x.c +f:drivers/leds/leds-lm36274.c +f:drivers/leds/leds-lm3642.c +f:drivers/leds/leds-lm3692x.c +f:drivers/leds/leds-lm3697.c +f:drivers/leds/leds-locomo.c +f:drivers/leds/leds-lp3944.c +f:drivers/leds/leds-lp3952.c +f:drivers/leds/leds-lp50xx.c +f:drivers/leds/leds-lp5521.c +f:drivers/leds/leds-lp5523.c +f:drivers/leds/leds-lp5562.c +f:drivers/leds/leds-lp5569.c +f:drivers/leds/leds-lp55xx-common.c +f:drivers/leds/leds-lp55xx-common.h +f:drivers/leds/leds-lp8501.c +f:drivers/leds/leds-lp8788.c +f:drivers/leds/leds-lp8860.c +f:drivers/leds/leds-lp8864.c +f:drivers/leds/leds-lt3593.c +f:drivers/leds/leds-max5970.c +f:drivers/leds/leds-max77650.c +f:drivers/leds/leds-max77705.c +f:drivers/leds/leds-max8997.c +f:drivers/leds/leds-mc13783.c +f:drivers/leds/leds-menf21bmc.c +f:drivers/leds/leds-mlxcpld.c +f:drivers/leds/leds-mlxreg.c +f:drivers/leds/leds-mt6323.c +f:drivers/leds/leds-net48xx.c +f:drivers/leds/leds-netxbig.c +f:drivers/leds/leds-nic78bx.c +f:drivers/leds/leds-ns2.c +f:drivers/leds/leds-ot200.c +f:drivers/leds/leds-pca9532.c +f:drivers/leds/leds-pca955x.c +f:drivers/leds/leds-pca963x.c +f:drivers/leds/leds-pca995x.c +f:drivers/leds/leds-pm8058.c +f:drivers/leds/leds-powernv.c +f:drivers/leds/leds-pwm.c +f:drivers/leds/leds-qnap-mcu.c +f:drivers/leds/leds-rb532.c +f:drivers/leds/leds-regulator.c +f:drivers/leds/leds-sc27xx-bltc.c +f:drivers/leds/leds-spi-byte.c +f:drivers/leds/leds-ss4200.c +f:drivers/leds/leds-st1202.c +f:drivers/leds/leds-sun50i-a100.c +f:drivers/leds/leds-sunfire.c +f:drivers/leds/leds-syscon.c +f:drivers/leds/leds-tca6507.c +f:drivers/leds/leds-ti-lmu-common.c +f:drivers/leds/leds-tlc591xx.c +f:drivers/leds/leds-tps6105x.c +f:drivers/leds/leds-turris-omnia.c +f:drivers/leds/leds-upboard.c +f:drivers/leds/leds-wm831x-status.c +f:drivers/leds/leds-wm8350.c +f:drivers/leds/leds-wrap.c +f:drivers/leds/leds.h +f:drivers/leds/rgb/Kconfig +f:drivers/leds/rgb/Makefile +f:drivers/leds/rgb/leds-group-multicolor.c +f:drivers/leds/rgb/leds-ktd202x.c +f:drivers/leds/rgb/leds-mt6370-rgb.c +f:drivers/leds/rgb/leds-ncp5623.c +f:drivers/leds/rgb/leds-pwm-multicolor.c +f:drivers/leds/rgb/leds-qcom-lpg.c +f:drivers/leds/simatic/Kconfig +f:drivers/leds/simatic/Makefile +f:drivers/leds/simatic/simatic-ipc-leds-gpio-apollolake.c +f:drivers/leds/simatic/simatic-ipc-leds-gpio-core.c +f:drivers/leds/simatic/simatic-ipc-leds-gpio-elkhartlake.c +f:drivers/leds/simatic/simatic-ipc-leds-gpio-f7188x.c +f:drivers/leds/simatic/simatic-ipc-leds-gpio.h +f:drivers/leds/simatic/simatic-ipc-leds.c +f:drivers/leds/trigger/Kconfig +f:drivers/leds/trigger/Makefile +f:drivers/leds/trigger/ledtrig-activity.c +f:drivers/leds/trigger/ledtrig-backlight.c +f:drivers/leds/trigger/ledtrig-camera.c +f:drivers/leds/trigger/ledtrig-cpu.c +f:drivers/leds/trigger/ledtrig-default-on.c +f:drivers/leds/trigger/ledtrig-disk.c +f:drivers/leds/trigger/ledtrig-gpio.c +f:drivers/leds/trigger/ledtrig-heartbeat.c +f:drivers/leds/trigger/ledtrig-input-events.c +f:drivers/leds/trigger/ledtrig-mtd.c +f:drivers/leds/trigger/ledtrig-netdev.c +f:drivers/leds/trigger/ledtrig-oneshot.c +f:drivers/leds/trigger/ledtrig-panic.c +f:drivers/leds/trigger/ledtrig-pattern.c +f:drivers/leds/trigger/ledtrig-timer.c +f:drivers/leds/trigger/ledtrig-transient.c +f:drivers/leds/trigger/ledtrig-tty.c +f:drivers/leds/uleds.c +f:drivers/macintosh/Kconfig +f:drivers/macintosh/Makefile +f:drivers/macintosh/adb-iop.c +f:drivers/macintosh/adb.c +f:drivers/macintosh/adbhid.c +f:drivers/macintosh/ams/Makefile +f:drivers/macintosh/ams/ams-core.c +f:drivers/macintosh/ams/ams-i2c.c +f:drivers/macintosh/ams/ams-input.c +f:drivers/macintosh/ams/ams-pmu.c +f:drivers/macintosh/ams/ams.h +f:drivers/macintosh/ans-lcd.c +f:drivers/macintosh/ans-lcd.h +f:drivers/macintosh/apm_emu.c +f:drivers/macintosh/mac_hid.c +f:drivers/macintosh/macio-adb.c +f:drivers/macintosh/macio_asic.c +f:drivers/macintosh/macio_sysfs.c +f:drivers/macintosh/mediabay.c +f:drivers/macintosh/rack-meter.c +f:drivers/macintosh/smu.c +f:drivers/macintosh/therm_adt746x.c +f:drivers/macintosh/therm_windtunnel.c +f:drivers/macintosh/via-cuda.c +f:drivers/macintosh/via-macii.c +f:drivers/macintosh/via-pmu-backlight.c +f:drivers/macintosh/via-pmu-event.c +f:drivers/macintosh/via-pmu-event.h +f:drivers/macintosh/via-pmu-led.c +f:drivers/macintosh/via-pmu.c +f:drivers/macintosh/windfarm.h +f:drivers/macintosh/windfarm_ad7417_sensor.c +f:drivers/macintosh/windfarm_core.c +f:drivers/macintosh/windfarm_cpufreq_clamp.c +f:drivers/macintosh/windfarm_fcu_controls.c +f:drivers/macintosh/windfarm_lm75_sensor.c +f:drivers/macintosh/windfarm_lm87_sensor.c +f:drivers/macintosh/windfarm_max6690_sensor.c +f:drivers/macintosh/windfarm_mpu.h +f:drivers/macintosh/windfarm_pid.c +f:drivers/macintosh/windfarm_pid.h +f:drivers/macintosh/windfarm_pm112.c +f:drivers/macintosh/windfarm_pm121.c +f:drivers/macintosh/windfarm_pm72.c +f:drivers/macintosh/windfarm_pm81.c +f:drivers/macintosh/windfarm_pm91.c +f:drivers/macintosh/windfarm_rm31.c +f:drivers/macintosh/windfarm_smu_controls.c +f:drivers/macintosh/windfarm_smu_sat.c +f:drivers/macintosh/windfarm_smu_sensors.c +f:drivers/mailbox/Kconfig +f:drivers/mailbox/Makefile +f:drivers/mailbox/arm_mhu.c +f:drivers/mailbox/arm_mhu_db.c +f:drivers/mailbox/arm_mhuv2.c +f:drivers/mailbox/arm_mhuv3.c +f:drivers/mailbox/armada-37xx-rwtm-mailbox.c +f:drivers/mailbox/bcm-flexrm-mailbox.c +f:drivers/mailbox/bcm-pdc-mailbox.c +f:drivers/mailbox/bcm2835-mailbox.c +f:drivers/mailbox/cix-mailbox.c +f:drivers/mailbox/cv1800-mailbox.c +f:drivers/mailbox/exynos-mailbox.c +f:drivers/mailbox/hi3660-mailbox.c +f:drivers/mailbox/hi6220-mailbox.c +f:drivers/mailbox/imx-mailbox.c +f:drivers/mailbox/mailbox-altera.c +f:drivers/mailbox/mailbox-mchp-ipc-sbi.c +f:drivers/mailbox/mailbox-mpfs.c +f:drivers/mailbox/mailbox-sti.c +f:drivers/mailbox/mailbox-test.c +f:drivers/mailbox/mailbox-th1520.c +f:drivers/mailbox/mailbox-xgene-slimpro.c +f:drivers/mailbox/mailbox.c +f:drivers/mailbox/mailbox.h +f:drivers/mailbox/mtk-adsp-mailbox.c +f:drivers/mailbox/mtk-cmdq-mailbox.c +f:drivers/mailbox/omap-mailbox.c +f:drivers/mailbox/pcc.c +f:drivers/mailbox/pl320-ipc.c +f:drivers/mailbox/platform_mhu.c +f:drivers/mailbox/qcom-apcs-ipc-mailbox.c +f:drivers/mailbox/qcom-cpucp-mbox.c +f:drivers/mailbox/qcom-ipcc.c +f:drivers/mailbox/rockchip-mailbox.c +f:drivers/mailbox/sprd-mailbox.c +f:drivers/mailbox/stm32-ipcc.c +f:drivers/mailbox/sun6i-msgbox.c +f:drivers/mailbox/tegra-hsp.c +f:drivers/mailbox/ti-msgmgr.c +f:drivers/mailbox/zynqmp-ipi-mailbox.c +f:drivers/mcb/Kconfig +f:drivers/mcb/Makefile +f:drivers/mcb/mcb-core.c +f:drivers/mcb/mcb-internal.h +f:drivers/mcb/mcb-lpc.c +f:drivers/mcb/mcb-parse.c +f:drivers/mcb/mcb-pci.c +f:drivers/md/Kconfig +f:drivers/md/Makefile +f:drivers/md/bcache/Kconfig +f:drivers/md/bcache/Makefile +f:drivers/md/bcache/alloc.c +f:drivers/md/bcache/bcache.h +f:drivers/md/bcache/bcache_ondisk.h +f:drivers/md/bcache/bset.c +f:drivers/md/bcache/bset.h +f:drivers/md/bcache/btree.c +f:drivers/md/bcache/btree.h +f:drivers/md/bcache/debug.c +f:drivers/md/bcache/debug.h +f:drivers/md/bcache/extents.c +f:drivers/md/bcache/extents.h +f:drivers/md/bcache/features.c +f:drivers/md/bcache/features.h +f:drivers/md/bcache/io.c +f:drivers/md/bcache/journal.c +f:drivers/md/bcache/journal.h +f:drivers/md/bcache/movinggc.c +f:drivers/md/bcache/request.c +f:drivers/md/bcache/request.h +f:drivers/md/bcache/stats.c +f:drivers/md/bcache/stats.h +f:drivers/md/bcache/super.c +f:drivers/md/bcache/sysfs.c +f:drivers/md/bcache/sysfs.h +f:drivers/md/bcache/trace.c +f:drivers/md/bcache/util.c +f:drivers/md/bcache/util.h +f:drivers/md/bcache/writeback.c +f:drivers/md/bcache/writeback.h +f:drivers/md/dm-audit.c +f:drivers/md/dm-audit.h +f:drivers/md/dm-bio-prison-v1.c +f:drivers/md/dm-bio-prison-v1.h +f:drivers/md/dm-bio-prison-v2.c +f:drivers/md/dm-bio-prison-v2.h +f:drivers/md/dm-bio-record.h +f:drivers/md/dm-bufio.c +f:drivers/md/dm-builtin.c +f:drivers/md/dm-cache-background-tracker.c +f:drivers/md/dm-cache-background-tracker.h +f:drivers/md/dm-cache-block-types.h +f:drivers/md/dm-cache-metadata.c +f:drivers/md/dm-cache-metadata.h +f:drivers/md/dm-cache-policy-internal.h +f:drivers/md/dm-cache-policy-smq.c +f:drivers/md/dm-cache-policy.c +f:drivers/md/dm-cache-policy.h +f:drivers/md/dm-cache-target.c +f:drivers/md/dm-clone-metadata.c +f:drivers/md/dm-clone-metadata.h +f:drivers/md/dm-clone-target.c +f:drivers/md/dm-core.h +f:drivers/md/dm-crypt.c +f:drivers/md/dm-delay.c +f:drivers/md/dm-dust.c +f:drivers/md/dm-ebs-target.c +f:drivers/md/dm-era-target.c +f:drivers/md/dm-exception-store.c +f:drivers/md/dm-exception-store.h +f:drivers/md/dm-flakey.c +f:drivers/md/dm-ima.c +f:drivers/md/dm-ima.h +f:drivers/md/dm-init.c +f:drivers/md/dm-integrity.c +f:drivers/md/dm-io-rewind.c +f:drivers/md/dm-io-tracker.h +f:drivers/md/dm-io.c +f:drivers/md/dm-ioctl.c +f:drivers/md/dm-kcopyd.c +f:drivers/md/dm-linear.c +f:drivers/md/dm-log-userspace-base.c +f:drivers/md/dm-log-userspace-transfer.c +f:drivers/md/dm-log-userspace-transfer.h +f:drivers/md/dm-log-writes.c +f:drivers/md/dm-log.c +f:drivers/md/dm-mpath.c +f:drivers/md/dm-mpath.h +f:drivers/md/dm-path-selector.c +f:drivers/md/dm-path-selector.h +f:drivers/md/dm-ps-historical-service-time.c +f:drivers/md/dm-ps-io-affinity.c +f:drivers/md/dm-ps-queue-length.c +f:drivers/md/dm-ps-round-robin.c +f:drivers/md/dm-ps-service-time.c +f:drivers/md/dm-raid.c +f:drivers/md/dm-raid1.c +f:drivers/md/dm-region-hash.c +f:drivers/md/dm-rq.c +f:drivers/md/dm-rq.h +f:drivers/md/dm-snap-persistent.c +f:drivers/md/dm-snap-transient.c +f:drivers/md/dm-snap.c +f:drivers/md/dm-stats.c +f:drivers/md/dm-stats.h +f:drivers/md/dm-stripe.c +f:drivers/md/dm-switch.c +f:drivers/md/dm-sysfs.c +f:drivers/md/dm-table.c +f:drivers/md/dm-target.c +f:drivers/md/dm-thin-metadata.c +f:drivers/md/dm-thin-metadata.h +f:drivers/md/dm-thin.c +f:drivers/md/dm-uevent.c +f:drivers/md/dm-uevent.h +f:drivers/md/dm-unstripe.c +f:drivers/md/dm-vdo/Kconfig +f:drivers/md/dm-vdo/Makefile +f:drivers/md/dm-vdo/action-manager.c +f:drivers/md/dm-vdo/action-manager.h +f:drivers/md/dm-vdo/admin-state.c +f:drivers/md/dm-vdo/admin-state.h +f:drivers/md/dm-vdo/block-map.c +f:drivers/md/dm-vdo/block-map.h +f:drivers/md/dm-vdo/completion.c +f:drivers/md/dm-vdo/completion.h +f:drivers/md/dm-vdo/constants.h +f:drivers/md/dm-vdo/cpu.h +f:drivers/md/dm-vdo/data-vio.c +f:drivers/md/dm-vdo/data-vio.h +f:drivers/md/dm-vdo/dedupe.c +f:drivers/md/dm-vdo/dedupe.h +f:drivers/md/dm-vdo/dm-vdo-target.c +f:drivers/md/dm-vdo/dump.c +f:drivers/md/dm-vdo/dump.h +f:drivers/md/dm-vdo/encodings.c +f:drivers/md/dm-vdo/encodings.h +f:drivers/md/dm-vdo/errors.c +f:drivers/md/dm-vdo/errors.h +f:drivers/md/dm-vdo/flush.c +f:drivers/md/dm-vdo/flush.h +f:drivers/md/dm-vdo/funnel-queue.c +f:drivers/md/dm-vdo/funnel-queue.h +f:drivers/md/dm-vdo/funnel-workqueue.c +f:drivers/md/dm-vdo/funnel-workqueue.h +f:drivers/md/dm-vdo/indexer/chapter-index.c +f:drivers/md/dm-vdo/indexer/chapter-index.h +f:drivers/md/dm-vdo/indexer/config.c +f:drivers/md/dm-vdo/indexer/config.h +f:drivers/md/dm-vdo/indexer/delta-index.c +f:drivers/md/dm-vdo/indexer/delta-index.h +f:drivers/md/dm-vdo/indexer/funnel-requestqueue.c +f:drivers/md/dm-vdo/indexer/funnel-requestqueue.h +f:drivers/md/dm-vdo/indexer/geometry.c +f:drivers/md/dm-vdo/indexer/geometry.h +f:drivers/md/dm-vdo/indexer/hash-utils.h +f:drivers/md/dm-vdo/indexer/index-layout.c +f:drivers/md/dm-vdo/indexer/index-layout.h +f:drivers/md/dm-vdo/indexer/index-page-map.c +f:drivers/md/dm-vdo/indexer/index-page-map.h +f:drivers/md/dm-vdo/indexer/index-session.c +f:drivers/md/dm-vdo/indexer/index-session.h +f:drivers/md/dm-vdo/indexer/index.c +f:drivers/md/dm-vdo/indexer/index.h +f:drivers/md/dm-vdo/indexer/indexer.h +f:drivers/md/dm-vdo/indexer/io-factory.c +f:drivers/md/dm-vdo/indexer/io-factory.h +f:drivers/md/dm-vdo/indexer/open-chapter.c +f:drivers/md/dm-vdo/indexer/open-chapter.h +f:drivers/md/dm-vdo/indexer/radix-sort.c +f:drivers/md/dm-vdo/indexer/radix-sort.h +f:drivers/md/dm-vdo/indexer/sparse-cache.c +f:drivers/md/dm-vdo/indexer/sparse-cache.h +f:drivers/md/dm-vdo/indexer/volume-index.c +f:drivers/md/dm-vdo/indexer/volume-index.h +f:drivers/md/dm-vdo/indexer/volume.c +f:drivers/md/dm-vdo/indexer/volume.h +f:drivers/md/dm-vdo/int-map.c +f:drivers/md/dm-vdo/int-map.h +f:drivers/md/dm-vdo/io-submitter.c +f:drivers/md/dm-vdo/io-submitter.h +f:drivers/md/dm-vdo/logger.c +f:drivers/md/dm-vdo/logger.h +f:drivers/md/dm-vdo/logical-zone.c +f:drivers/md/dm-vdo/logical-zone.h +f:drivers/md/dm-vdo/memory-alloc.c +f:drivers/md/dm-vdo/memory-alloc.h +f:drivers/md/dm-vdo/message-stats.c +f:drivers/md/dm-vdo/message-stats.h +f:drivers/md/dm-vdo/murmurhash3.c +f:drivers/md/dm-vdo/murmurhash3.h +f:drivers/md/dm-vdo/numeric.h +f:drivers/md/dm-vdo/packer.c +f:drivers/md/dm-vdo/packer.h +f:drivers/md/dm-vdo/permassert.c +f:drivers/md/dm-vdo/permassert.h +f:drivers/md/dm-vdo/physical-zone.c +f:drivers/md/dm-vdo/physical-zone.h +f:drivers/md/dm-vdo/priority-table.c +f:drivers/md/dm-vdo/priority-table.h +f:drivers/md/dm-vdo/recovery-journal.c +f:drivers/md/dm-vdo/recovery-journal.h +f:drivers/md/dm-vdo/repair.c +f:drivers/md/dm-vdo/repair.h +f:drivers/md/dm-vdo/slab-depot.c +f:drivers/md/dm-vdo/slab-depot.h +f:drivers/md/dm-vdo/statistics.h +f:drivers/md/dm-vdo/status-codes.c +f:drivers/md/dm-vdo/status-codes.h +f:drivers/md/dm-vdo/string-utils.c +f:drivers/md/dm-vdo/string-utils.h +f:drivers/md/dm-vdo/thread-device.c +f:drivers/md/dm-vdo/thread-device.h +f:drivers/md/dm-vdo/thread-registry.c +f:drivers/md/dm-vdo/thread-registry.h +f:drivers/md/dm-vdo/thread-utils.c +f:drivers/md/dm-vdo/thread-utils.h +f:drivers/md/dm-vdo/time-utils.h +f:drivers/md/dm-vdo/types.h +f:drivers/md/dm-vdo/vdo.c +f:drivers/md/dm-vdo/vdo.h +f:drivers/md/dm-vdo/vio.c +f:drivers/md/dm-vdo/vio.h +f:drivers/md/dm-vdo/wait-queue.c +f:drivers/md/dm-vdo/wait-queue.h +f:drivers/md/dm-verity-fec.c +f:drivers/md/dm-verity-fec.h +f:drivers/md/dm-verity-loadpin.c +f:drivers/md/dm-verity-target.c +f:drivers/md/dm-verity-verify-sig.c +f:drivers/md/dm-verity-verify-sig.h +f:drivers/md/dm-verity.h +f:drivers/md/dm-writecache.c +f:drivers/md/dm-zero.c +f:drivers/md/dm-zone.c +f:drivers/md/dm-zoned-metadata.c +f:drivers/md/dm-zoned-reclaim.c +f:drivers/md/dm-zoned-target.c +f:drivers/md/dm-zoned.h +f:drivers/md/dm.c +f:drivers/md/dm.h +f:drivers/md/md-autodetect.c +f:drivers/md/md-bitmap.c +f:drivers/md/md-bitmap.h +f:drivers/md/md-cluster.c +f:drivers/md/md-cluster.h +f:drivers/md/md-linear.c +f:drivers/md/md.c +f:drivers/md/md.h +f:drivers/md/persistent-data/Kconfig +f:drivers/md/persistent-data/Makefile +f:drivers/md/persistent-data/dm-array.c +f:drivers/md/persistent-data/dm-array.h +f:drivers/md/persistent-data/dm-bitset.c +f:drivers/md/persistent-data/dm-bitset.h +f:drivers/md/persistent-data/dm-block-manager.c +f:drivers/md/persistent-data/dm-block-manager.h +f:drivers/md/persistent-data/dm-btree-internal.h +f:drivers/md/persistent-data/dm-btree-remove.c +f:drivers/md/persistent-data/dm-btree-spine.c +f:drivers/md/persistent-data/dm-btree.c +f:drivers/md/persistent-data/dm-btree.h +f:drivers/md/persistent-data/dm-persistent-data-internal.h +f:drivers/md/persistent-data/dm-space-map-common.c +f:drivers/md/persistent-data/dm-space-map-common.h +f:drivers/md/persistent-data/dm-space-map-disk.c +f:drivers/md/persistent-data/dm-space-map-disk.h +f:drivers/md/persistent-data/dm-space-map-metadata.c +f:drivers/md/persistent-data/dm-space-map-metadata.h +f:drivers/md/persistent-data/dm-space-map.h +f:drivers/md/persistent-data/dm-transaction-manager.c +f:drivers/md/persistent-data/dm-transaction-manager.h +f:drivers/md/raid0.c +f:drivers/md/raid0.h +f:drivers/md/raid1-10.c +f:drivers/md/raid1.c +f:drivers/md/raid1.h +f:drivers/md/raid10.c +f:drivers/md/raid10.h +f:drivers/md/raid5-cache.c +f:drivers/md/raid5-log.h +f:drivers/md/raid5-ppl.c +f:drivers/md/raid5.c +f:drivers/md/raid5.h +f:drivers/media/Kconfig +f:drivers/media/Makefile +f:drivers/media/cec/Kconfig +f:drivers/media/cec/Makefile +f:drivers/media/cec/core/Makefile +f:drivers/media/cec/core/cec-adap.c +f:drivers/media/cec/core/cec-api.c +f:drivers/media/cec/core/cec-core.c +f:drivers/media/cec/core/cec-notifier.c +f:drivers/media/cec/core/cec-pin-error-inj.c +f:drivers/media/cec/core/cec-pin-priv.h +f:drivers/media/cec/core/cec-pin.c +f:drivers/media/cec/core/cec-priv.h +f:drivers/media/cec/i2c/Kconfig +f:drivers/media/cec/i2c/Makefile +f:drivers/media/cec/i2c/ch7322.c +f:drivers/media/cec/i2c/tda9950.c +f:drivers/media/cec/platform/Kconfig +f:drivers/media/cec/platform/Makefile +f:drivers/media/cec/platform/cec-gpio/Makefile +f:drivers/media/cec/platform/cec-gpio/cec-gpio.c +f:drivers/media/cec/platform/cros-ec/Makefile +f:drivers/media/cec/platform/cros-ec/cros-ec-cec.c +f:drivers/media/cec/platform/meson/Makefile +f:drivers/media/cec/platform/meson/ao-cec-g12a.c +f:drivers/media/cec/platform/meson/ao-cec.c +f:drivers/media/cec/platform/s5p/Makefile +f:drivers/media/cec/platform/s5p/exynos_hdmi_cec.h +f:drivers/media/cec/platform/s5p/exynos_hdmi_cecctrl.c +f:drivers/media/cec/platform/s5p/regs-cec.h +f:drivers/media/cec/platform/s5p/s5p_cec.c +f:drivers/media/cec/platform/s5p/s5p_cec.h +f:drivers/media/cec/platform/seco/Makefile +f:drivers/media/cec/platform/seco/seco-cec.c +f:drivers/media/cec/platform/seco/seco-cec.h +f:drivers/media/cec/platform/sti/Makefile +f:drivers/media/cec/platform/sti/stih-cec.c +f:drivers/media/cec/platform/stm32/Makefile +f:drivers/media/cec/platform/stm32/stm32-cec.c +f:drivers/media/cec/platform/tegra/Makefile +f:drivers/media/cec/platform/tegra/tegra_cec.c +f:drivers/media/cec/platform/tegra/tegra_cec.h +f:drivers/media/cec/usb/Kconfig +f:drivers/media/cec/usb/Makefile +f:drivers/media/cec/usb/extron-da-hd-4k-plus/Kconfig +f:drivers/media/cec/usb/extron-da-hd-4k-plus/Makefile +f:drivers/media/cec/usb/extron-da-hd-4k-plus/cec-splitter.c +f:drivers/media/cec/usb/extron-da-hd-4k-plus/cec-splitter.h +f:drivers/media/cec/usb/extron-da-hd-4k-plus/extron-da-hd-4k-plus.c +f:drivers/media/cec/usb/extron-da-hd-4k-plus/extron-da-hd-4k-plus.h +f:drivers/media/cec/usb/pulse8/Kconfig +f:drivers/media/cec/usb/pulse8/Makefile +f:drivers/media/cec/usb/pulse8/pulse8-cec.c +f:drivers/media/cec/usb/rainshadow/Kconfig +f:drivers/media/cec/usb/rainshadow/Makefile +f:drivers/media/cec/usb/rainshadow/rainshadow-cec.c +f:drivers/media/common/Kconfig +f:drivers/media/common/Makefile +f:drivers/media/common/b2c2/Kconfig +f:drivers/media/common/b2c2/Makefile +f:drivers/media/common/b2c2/flexcop-common.h +f:drivers/media/common/b2c2/flexcop-eeprom.c +f:drivers/media/common/b2c2/flexcop-fe-tuner.c +f:drivers/media/common/b2c2/flexcop-hw-filter.c +f:drivers/media/common/b2c2/flexcop-i2c.c +f:drivers/media/common/b2c2/flexcop-misc.c +f:drivers/media/common/b2c2/flexcop-reg.h +f:drivers/media/common/b2c2/flexcop-sram.c +f:drivers/media/common/b2c2/flexcop.c +f:drivers/media/common/b2c2/flexcop.h +f:drivers/media/common/b2c2/flexcop_ibi_value_be.h +f:drivers/media/common/b2c2/flexcop_ibi_value_le.h +f:drivers/media/common/cx2341x.c +f:drivers/media/common/cypress_firmware.c +f:drivers/media/common/cypress_firmware.h +f:drivers/media/common/saa7146/Kconfig +f:drivers/media/common/saa7146/Makefile +f:drivers/media/common/saa7146/saa7146_core.c +f:drivers/media/common/saa7146/saa7146_fops.c +f:drivers/media/common/saa7146/saa7146_hlp.c +f:drivers/media/common/saa7146/saa7146_i2c.c +f:drivers/media/common/saa7146/saa7146_vbi.c +f:drivers/media/common/saa7146/saa7146_video.c +f:drivers/media/common/siano/Kconfig +f:drivers/media/common/siano/Makefile +f:drivers/media/common/siano/sms-cards.c +f:drivers/media/common/siano/sms-cards.h +f:drivers/media/common/siano/smscoreapi.c +f:drivers/media/common/siano/smscoreapi.h +f:drivers/media/common/siano/smsdvb-debugfs.c +f:drivers/media/common/siano/smsdvb-main.c +f:drivers/media/common/siano/smsdvb.h +f:drivers/media/common/siano/smsendian.c +f:drivers/media/common/siano/smsendian.h +f:drivers/media/common/siano/smsir.c +f:drivers/media/common/siano/smsir.h +f:drivers/media/common/ttpci-eeprom.c +f:drivers/media/common/ttpci-eeprom.h +f:drivers/media/common/tveeprom.c +f:drivers/media/common/uvc.c +f:drivers/media/common/v4l2-tpg/Kconfig +f:drivers/media/common/v4l2-tpg/Makefile +f:drivers/media/common/v4l2-tpg/v4l2-tpg-colors.c +f:drivers/media/common/v4l2-tpg/v4l2-tpg-core.c +f:drivers/media/common/videobuf2/Kconfig +f:drivers/media/common/videobuf2/Makefile +f:drivers/media/common/videobuf2/frame_vector.c +f:drivers/media/common/videobuf2/vb2-trace.c +f:drivers/media/common/videobuf2/videobuf2-core.c +f:drivers/media/common/videobuf2/videobuf2-dma-contig.c +f:drivers/media/common/videobuf2/videobuf2-dma-sg.c +f:drivers/media/common/videobuf2/videobuf2-dvb.c +f:drivers/media/common/videobuf2/videobuf2-memops.c +f:drivers/media/common/videobuf2/videobuf2-v4l2.c +f:drivers/media/common/videobuf2/videobuf2-vmalloc.c +f:drivers/media/dvb-core/Kconfig +f:drivers/media/dvb-core/Makefile +f:drivers/media/dvb-core/dmxdev.c +f:drivers/media/dvb-core/dvb_ca_en50221.c +f:drivers/media/dvb-core/dvb_demux.c +f:drivers/media/dvb-core/dvb_frontend.c +f:drivers/media/dvb-core/dvb_net.c +f:drivers/media/dvb-core/dvb_ringbuffer.c +f:drivers/media/dvb-core/dvb_vb2.c +f:drivers/media/dvb-core/dvbdev.c +f:drivers/media/dvb-frontends/Kconfig +f:drivers/media/dvb-frontends/Makefile +f:drivers/media/dvb-frontends/a8293.c +f:drivers/media/dvb-frontends/a8293.h +f:drivers/media/dvb-frontends/af9013.c +f:drivers/media/dvb-frontends/af9013.h +f:drivers/media/dvb-frontends/af9013_priv.h +f:drivers/media/dvb-frontends/af9033.c +f:drivers/media/dvb-frontends/af9033.h +f:drivers/media/dvb-frontends/af9033_priv.h +f:drivers/media/dvb-frontends/as102_fe.c +f:drivers/media/dvb-frontends/as102_fe.h +f:drivers/media/dvb-frontends/as102_fe_types.h +f:drivers/media/dvb-frontends/ascot2e.c +f:drivers/media/dvb-frontends/ascot2e.h +f:drivers/media/dvb-frontends/atbm8830.c +f:drivers/media/dvb-frontends/atbm8830.h +f:drivers/media/dvb-frontends/atbm8830_priv.h +f:drivers/media/dvb-frontends/au8522.h +f:drivers/media/dvb-frontends/au8522_common.c +f:drivers/media/dvb-frontends/au8522_decoder.c +f:drivers/media/dvb-frontends/au8522_dig.c +f:drivers/media/dvb-frontends/au8522_priv.h +f:drivers/media/dvb-frontends/bcm3510.c +f:drivers/media/dvb-frontends/bcm3510.h +f:drivers/media/dvb-frontends/bcm3510_priv.h +f:drivers/media/dvb-frontends/bsbe1-d01a.h +f:drivers/media/dvb-frontends/bsbe1.h +f:drivers/media/dvb-frontends/bsru6.h +f:drivers/media/dvb-frontends/cx22700.c +f:drivers/media/dvb-frontends/cx22700.h +f:drivers/media/dvb-frontends/cx22702.c +f:drivers/media/dvb-frontends/cx22702.h +f:drivers/media/dvb-frontends/cx24110.c +f:drivers/media/dvb-frontends/cx24110.h +f:drivers/media/dvb-frontends/cx24113.c +f:drivers/media/dvb-frontends/cx24113.h +f:drivers/media/dvb-frontends/cx24116.c +f:drivers/media/dvb-frontends/cx24116.h +f:drivers/media/dvb-frontends/cx24117.c +f:drivers/media/dvb-frontends/cx24117.h +f:drivers/media/dvb-frontends/cx24120.c +f:drivers/media/dvb-frontends/cx24120.h +f:drivers/media/dvb-frontends/cx24123.c +f:drivers/media/dvb-frontends/cx24123.h +f:drivers/media/dvb-frontends/cxd2099.c +f:drivers/media/dvb-frontends/cxd2099.h +f:drivers/media/dvb-frontends/cxd2820r.h +f:drivers/media/dvb-frontends/cxd2820r_c.c +f:drivers/media/dvb-frontends/cxd2820r_core.c +f:drivers/media/dvb-frontends/cxd2820r_priv.h +f:drivers/media/dvb-frontends/cxd2820r_t.c +f:drivers/media/dvb-frontends/cxd2820r_t2.c +f:drivers/media/dvb-frontends/cxd2841er.c +f:drivers/media/dvb-frontends/cxd2841er.h +f:drivers/media/dvb-frontends/cxd2841er_priv.h +f:drivers/media/dvb-frontends/cxd2880/Kconfig +f:drivers/media/dvb-frontends/cxd2880/Makefile +f:drivers/media/dvb-frontends/cxd2880/cxd2880.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_common.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_common.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_dtv.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_dvbt.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_dvbt2.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_integ.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_integ.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_io.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_io.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_spi.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_driver_version.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_dvbt.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_dvbt.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_dvbt2.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_dvbt2.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_dvbt2_mon.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_dvbt2_mon.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_dvbt_mon.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_dvbt_mon.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_mon.c +f:drivers/media/dvb-frontends/cxd2880/cxd2880_tnrdmd_mon.h +f:drivers/media/dvb-frontends/cxd2880/cxd2880_top.c +f:drivers/media/dvb-frontends/dib0070.c +f:drivers/media/dvb-frontends/dib0070.h +f:drivers/media/dvb-frontends/dib0090.c +f:drivers/media/dvb-frontends/dib0090.h +f:drivers/media/dvb-frontends/dib3000.h +f:drivers/media/dvb-frontends/dib3000mb.c +f:drivers/media/dvb-frontends/dib3000mb_priv.h +f:drivers/media/dvb-frontends/dib3000mc.c +f:drivers/media/dvb-frontends/dib3000mc.h +f:drivers/media/dvb-frontends/dib7000m.c +f:drivers/media/dvb-frontends/dib7000m.h +f:drivers/media/dvb-frontends/dib7000p.c +f:drivers/media/dvb-frontends/dib7000p.h +f:drivers/media/dvb-frontends/dib8000.c +f:drivers/media/dvb-frontends/dib8000.h +f:drivers/media/dvb-frontends/dib9000.c +f:drivers/media/dvb-frontends/dib9000.h +f:drivers/media/dvb-frontends/dibx000_common.c +f:drivers/media/dvb-frontends/dibx000_common.h +f:drivers/media/dvb-frontends/drx39xyj/Kconfig +f:drivers/media/dvb-frontends/drx39xyj/Makefile +f:drivers/media/dvb-frontends/drx39xyj/drx39xxj.h +f:drivers/media/dvb-frontends/drx39xyj/drx_dap_fasi.h +f:drivers/media/dvb-frontends/drx39xyj/drx_driver.h +f:drivers/media/dvb-frontends/drx39xyj/drx_driver_version.h +f:drivers/media/dvb-frontends/drx39xyj/drxj.c +f:drivers/media/dvb-frontends/drx39xyj/drxj.h +f:drivers/media/dvb-frontends/drx39xyj/drxj_map.h +f:drivers/media/dvb-frontends/drxd.h +f:drivers/media/dvb-frontends/drxd_firm.c +f:drivers/media/dvb-frontends/drxd_firm.h +f:drivers/media/dvb-frontends/drxd_hard.c +f:drivers/media/dvb-frontends/drxd_map_firm.h +f:drivers/media/dvb-frontends/drxk.h +f:drivers/media/dvb-frontends/drxk_hard.c +f:drivers/media/dvb-frontends/drxk_hard.h +f:drivers/media/dvb-frontends/drxk_map.h +f:drivers/media/dvb-frontends/ds3000.c +f:drivers/media/dvb-frontends/ds3000.h +f:drivers/media/dvb-frontends/dvb-pll.c +f:drivers/media/dvb-frontends/dvb-pll.h +f:drivers/media/dvb-frontends/dvb_dummy_fe.c +f:drivers/media/dvb-frontends/dvb_dummy_fe.h +f:drivers/media/dvb-frontends/ec100.c +f:drivers/media/dvb-frontends/ec100.h +f:drivers/media/dvb-frontends/eds1547.h +f:drivers/media/dvb-frontends/gp8psk-fe.c +f:drivers/media/dvb-frontends/gp8psk-fe.h +f:drivers/media/dvb-frontends/helene.c +f:drivers/media/dvb-frontends/helene.h +f:drivers/media/dvb-frontends/horus3a.c +f:drivers/media/dvb-frontends/horus3a.h +f:drivers/media/dvb-frontends/isl6405.c +f:drivers/media/dvb-frontends/isl6405.h +f:drivers/media/dvb-frontends/isl6421.c +f:drivers/media/dvb-frontends/isl6421.h +f:drivers/media/dvb-frontends/isl6423.c +f:drivers/media/dvb-frontends/isl6423.h +f:drivers/media/dvb-frontends/itd1000.c +f:drivers/media/dvb-frontends/itd1000.h +f:drivers/media/dvb-frontends/itd1000_priv.h +f:drivers/media/dvb-frontends/ix2505v.c +f:drivers/media/dvb-frontends/ix2505v.h +f:drivers/media/dvb-frontends/l64781.c +f:drivers/media/dvb-frontends/l64781.h +f:drivers/media/dvb-frontends/lg2160.c +f:drivers/media/dvb-frontends/lg2160.h +f:drivers/media/dvb-frontends/lgdt3305.c +f:drivers/media/dvb-frontends/lgdt3305.h +f:drivers/media/dvb-frontends/lgdt3306a.c +f:drivers/media/dvb-frontends/lgdt3306a.h +f:drivers/media/dvb-frontends/lgdt330x.c +f:drivers/media/dvb-frontends/lgdt330x.h +f:drivers/media/dvb-frontends/lgdt330x_priv.h +f:drivers/media/dvb-frontends/lgs8gl5.c +f:drivers/media/dvb-frontends/lgs8gl5.h +f:drivers/media/dvb-frontends/lgs8gxx.c +f:drivers/media/dvb-frontends/lgs8gxx.h +f:drivers/media/dvb-frontends/lgs8gxx_priv.h +f:drivers/media/dvb-frontends/lnbh24.h +f:drivers/media/dvb-frontends/lnbh25.c +f:drivers/media/dvb-frontends/lnbh25.h +f:drivers/media/dvb-frontends/lnbh29.c +f:drivers/media/dvb-frontends/lnbh29.h +f:drivers/media/dvb-frontends/lnbp21.c +f:drivers/media/dvb-frontends/lnbp21.h +f:drivers/media/dvb-frontends/lnbp22.c +f:drivers/media/dvb-frontends/lnbp22.h +f:drivers/media/dvb-frontends/m88ds3103.c +f:drivers/media/dvb-frontends/m88ds3103.h +f:drivers/media/dvb-frontends/m88ds3103_priv.h +f:drivers/media/dvb-frontends/m88rs2000.c +f:drivers/media/dvb-frontends/m88rs2000.h +f:drivers/media/dvb-frontends/mb86a16.c +f:drivers/media/dvb-frontends/mb86a16.h +f:drivers/media/dvb-frontends/mb86a16_priv.h +f:drivers/media/dvb-frontends/mb86a20s.c +f:drivers/media/dvb-frontends/mb86a20s.h +f:drivers/media/dvb-frontends/mn88443x.c +f:drivers/media/dvb-frontends/mn88443x.h +f:drivers/media/dvb-frontends/mn88472.c +f:drivers/media/dvb-frontends/mn88472.h +f:drivers/media/dvb-frontends/mn88472_priv.h +f:drivers/media/dvb-frontends/mn88473.c +f:drivers/media/dvb-frontends/mn88473.h +f:drivers/media/dvb-frontends/mn88473_priv.h +f:drivers/media/dvb-frontends/mt312.c +f:drivers/media/dvb-frontends/mt312.h +f:drivers/media/dvb-frontends/mt312_priv.h +f:drivers/media/dvb-frontends/mt352.c +f:drivers/media/dvb-frontends/mt352.h +f:drivers/media/dvb-frontends/mt352_priv.h +f:drivers/media/dvb-frontends/mxl5xx.c +f:drivers/media/dvb-frontends/mxl5xx.h +f:drivers/media/dvb-frontends/mxl5xx_defs.h +f:drivers/media/dvb-frontends/mxl5xx_regs.h +f:drivers/media/dvb-frontends/mxl692.c +f:drivers/media/dvb-frontends/mxl692.h +f:drivers/media/dvb-frontends/mxl692_defs.h +f:drivers/media/dvb-frontends/nxt200x.c +f:drivers/media/dvb-frontends/nxt200x.h +f:drivers/media/dvb-frontends/nxt6000.c +f:drivers/media/dvb-frontends/nxt6000.h +f:drivers/media/dvb-frontends/nxt6000_priv.h +f:drivers/media/dvb-frontends/or51132.c +f:drivers/media/dvb-frontends/or51132.h +f:drivers/media/dvb-frontends/or51211.c +f:drivers/media/dvb-frontends/or51211.h +f:drivers/media/dvb-frontends/rtl2830.c +f:drivers/media/dvb-frontends/rtl2830.h +f:drivers/media/dvb-frontends/rtl2830_priv.h +f:drivers/media/dvb-frontends/rtl2832.c +f:drivers/media/dvb-frontends/rtl2832.h +f:drivers/media/dvb-frontends/rtl2832_priv.h +f:drivers/media/dvb-frontends/rtl2832_sdr.c +f:drivers/media/dvb-frontends/rtl2832_sdr.h +f:drivers/media/dvb-frontends/s5h1409.c +f:drivers/media/dvb-frontends/s5h1409.h +f:drivers/media/dvb-frontends/s5h1411.c +f:drivers/media/dvb-frontends/s5h1411.h +f:drivers/media/dvb-frontends/s5h1420.c +f:drivers/media/dvb-frontends/s5h1420.h +f:drivers/media/dvb-frontends/s5h1420_priv.h +f:drivers/media/dvb-frontends/s5h1432.c +f:drivers/media/dvb-frontends/s5h1432.h +f:drivers/media/dvb-frontends/s921.c +f:drivers/media/dvb-frontends/s921.h +f:drivers/media/dvb-frontends/si2165.c +f:drivers/media/dvb-frontends/si2165.h +f:drivers/media/dvb-frontends/si2165_priv.h +f:drivers/media/dvb-frontends/si2168.c +f:drivers/media/dvb-frontends/si2168.h +f:drivers/media/dvb-frontends/si2168_priv.h +f:drivers/media/dvb-frontends/si21xx.c +f:drivers/media/dvb-frontends/si21xx.h +f:drivers/media/dvb-frontends/sp2.c +f:drivers/media/dvb-frontends/sp2.h +f:drivers/media/dvb-frontends/sp2_priv.h +f:drivers/media/dvb-frontends/sp887x.c +f:drivers/media/dvb-frontends/sp887x.h +f:drivers/media/dvb-frontends/stb0899_algo.c +f:drivers/media/dvb-frontends/stb0899_cfg.h +f:drivers/media/dvb-frontends/stb0899_drv.c +f:drivers/media/dvb-frontends/stb0899_drv.h +f:drivers/media/dvb-frontends/stb0899_priv.h +f:drivers/media/dvb-frontends/stb0899_reg.h +f:drivers/media/dvb-frontends/stb6000.c +f:drivers/media/dvb-frontends/stb6000.h +f:drivers/media/dvb-frontends/stb6100.c +f:drivers/media/dvb-frontends/stb6100.h +f:drivers/media/dvb-frontends/stb6100_cfg.h +f:drivers/media/dvb-frontends/stb6100_proc.h +f:drivers/media/dvb-frontends/stv0288.c +f:drivers/media/dvb-frontends/stv0288.h +f:drivers/media/dvb-frontends/stv0297.c +f:drivers/media/dvb-frontends/stv0297.h +f:drivers/media/dvb-frontends/stv0299.c +f:drivers/media/dvb-frontends/stv0299.h +f:drivers/media/dvb-frontends/stv0367.c +f:drivers/media/dvb-frontends/stv0367.h +f:drivers/media/dvb-frontends/stv0367_defs.h +f:drivers/media/dvb-frontends/stv0367_priv.h +f:drivers/media/dvb-frontends/stv0367_regs.h +f:drivers/media/dvb-frontends/stv0900.h +f:drivers/media/dvb-frontends/stv0900_core.c +f:drivers/media/dvb-frontends/stv0900_init.h +f:drivers/media/dvb-frontends/stv0900_priv.h +f:drivers/media/dvb-frontends/stv0900_reg.h +f:drivers/media/dvb-frontends/stv0900_sw.c +f:drivers/media/dvb-frontends/stv090x.c +f:drivers/media/dvb-frontends/stv090x.h +f:drivers/media/dvb-frontends/stv090x_priv.h +f:drivers/media/dvb-frontends/stv090x_reg.h +f:drivers/media/dvb-frontends/stv0910.c +f:drivers/media/dvb-frontends/stv0910.h +f:drivers/media/dvb-frontends/stv0910_regs.h +f:drivers/media/dvb-frontends/stv6110.c +f:drivers/media/dvb-frontends/stv6110.h +f:drivers/media/dvb-frontends/stv6110x.c +f:drivers/media/dvb-frontends/stv6110x.h +f:drivers/media/dvb-frontends/stv6110x_priv.h +f:drivers/media/dvb-frontends/stv6110x_reg.h +f:drivers/media/dvb-frontends/stv6111.c +f:drivers/media/dvb-frontends/stv6111.h +f:drivers/media/dvb-frontends/tc90522.c +f:drivers/media/dvb-frontends/tc90522.h +f:drivers/media/dvb-frontends/tda10021.c +f:drivers/media/dvb-frontends/tda10023.c +f:drivers/media/dvb-frontends/tda1002x.h +f:drivers/media/dvb-frontends/tda10048.c +f:drivers/media/dvb-frontends/tda10048.h +f:drivers/media/dvb-frontends/tda1004x.c +f:drivers/media/dvb-frontends/tda1004x.h +f:drivers/media/dvb-frontends/tda10071.c +f:drivers/media/dvb-frontends/tda10071.h +f:drivers/media/dvb-frontends/tda10071_priv.h +f:drivers/media/dvb-frontends/tda10086.c +f:drivers/media/dvb-frontends/tda10086.h +f:drivers/media/dvb-frontends/tda18271c2dd.c +f:drivers/media/dvb-frontends/tda18271c2dd.h +f:drivers/media/dvb-frontends/tda18271c2dd_maps.h +f:drivers/media/dvb-frontends/tda665x.c +f:drivers/media/dvb-frontends/tda665x.h +f:drivers/media/dvb-frontends/tda8083.c +f:drivers/media/dvb-frontends/tda8083.h +f:drivers/media/dvb-frontends/tda8261.c +f:drivers/media/dvb-frontends/tda8261.h +f:drivers/media/dvb-frontends/tda8261_cfg.h +f:drivers/media/dvb-frontends/tda826x.c +f:drivers/media/dvb-frontends/tda826x.h +f:drivers/media/dvb-frontends/tdhd1.h +f:drivers/media/dvb-frontends/ts2020.c +f:drivers/media/dvb-frontends/ts2020.h +f:drivers/media/dvb-frontends/tua6100.c +f:drivers/media/dvb-frontends/tua6100.h +f:drivers/media/dvb-frontends/ves1820.c +f:drivers/media/dvb-frontends/ves1820.h +f:drivers/media/dvb-frontends/ves1x93.c +f:drivers/media/dvb-frontends/ves1x93.h +f:drivers/media/dvb-frontends/z0194a.h +f:drivers/media/dvb-frontends/zd1301_demod.c +f:drivers/media/dvb-frontends/zd1301_demod.h +f:drivers/media/dvb-frontends/zl10036.c +f:drivers/media/dvb-frontends/zl10036.h +f:drivers/media/dvb-frontends/zl10039.c +f:drivers/media/dvb-frontends/zl10039.h +f:drivers/media/dvb-frontends/zl10353.c +f:drivers/media/dvb-frontends/zl10353.h +f:drivers/media/dvb-frontends/zl10353_priv.h +f:drivers/media/firewire/Kconfig +f:drivers/media/firewire/Makefile +f:drivers/media/firewire/firedtv-avc.c +f:drivers/media/firewire/firedtv-ci.c +f:drivers/media/firewire/firedtv-dvb.c +f:drivers/media/firewire/firedtv-fe.c +f:drivers/media/firewire/firedtv-fw.c +f:drivers/media/firewire/firedtv-rc.c +f:drivers/media/firewire/firedtv.h +f:drivers/media/i2c/Kconfig +f:drivers/media/i2c/Makefile +f:drivers/media/i2c/ad5820.c +f:drivers/media/i2c/adp1653.c +f:drivers/media/i2c/adv7170.c +f:drivers/media/i2c/adv7175.c +f:drivers/media/i2c/adv7180.c +f:drivers/media/i2c/adv7183.c +f:drivers/media/i2c/adv7183_regs.h +f:drivers/media/i2c/adv7343.c +f:drivers/media/i2c/adv7343_regs.h +f:drivers/media/i2c/adv7393.c +f:drivers/media/i2c/adv7393_regs.h +f:drivers/media/i2c/adv748x/Makefile +f:drivers/media/i2c/adv748x/adv748x-afe.c +f:drivers/media/i2c/adv748x/adv748x-core.c +f:drivers/media/i2c/adv748x/adv748x-csi2.c +f:drivers/media/i2c/adv748x/adv748x-hdmi.c +f:drivers/media/i2c/adv748x/adv748x.h +f:drivers/media/i2c/adv7511-v4l2.c +f:drivers/media/i2c/adv7604.c +f:drivers/media/i2c/adv7842.c +f:drivers/media/i2c/ak7375.c +f:drivers/media/i2c/ak881x.c +f:drivers/media/i2c/alvium-csi2.c +f:drivers/media/i2c/alvium-csi2.h +f:drivers/media/i2c/aptina-pll.c +f:drivers/media/i2c/aptina-pll.h +f:drivers/media/i2c/ar0521.c +f:drivers/media/i2c/bt819.c +f:drivers/media/i2c/bt856.c +f:drivers/media/i2c/bt866.c +f:drivers/media/i2c/ccs-pll.c +f:drivers/media/i2c/ccs-pll.h +f:drivers/media/i2c/ccs/Kconfig +f:drivers/media/i2c/ccs/Makefile +f:drivers/media/i2c/ccs/ccs-core.c +f:drivers/media/i2c/ccs/ccs-data-defs.h +f:drivers/media/i2c/ccs/ccs-data.c +f:drivers/media/i2c/ccs/ccs-data.h +f:drivers/media/i2c/ccs/ccs-limits.c +f:drivers/media/i2c/ccs/ccs-limits.h +f:drivers/media/i2c/ccs/ccs-quirk.c +f:drivers/media/i2c/ccs/ccs-quirk.h +f:drivers/media/i2c/ccs/ccs-reg-access.c +f:drivers/media/i2c/ccs/ccs-reg-access.h +f:drivers/media/i2c/ccs/ccs-regs.h +f:drivers/media/i2c/ccs/ccs.h +f:drivers/media/i2c/ccs/smiapp-reg-defs.h +f:drivers/media/i2c/cs3308.c +f:drivers/media/i2c/cs5345.c +f:drivers/media/i2c/cs53l32a.c +f:drivers/media/i2c/cx25840/Kconfig +f:drivers/media/i2c/cx25840/Makefile +f:drivers/media/i2c/cx25840/cx25840-audio.c +f:drivers/media/i2c/cx25840/cx25840-core.c +f:drivers/media/i2c/cx25840/cx25840-core.h +f:drivers/media/i2c/cx25840/cx25840-firmware.c +f:drivers/media/i2c/cx25840/cx25840-ir.c +f:drivers/media/i2c/cx25840/cx25840-vbi.c +f:drivers/media/i2c/ds90ub913.c +f:drivers/media/i2c/ds90ub953.c +f:drivers/media/i2c/ds90ub953.h +f:drivers/media/i2c/ds90ub960.c +f:drivers/media/i2c/dw9714.c +f:drivers/media/i2c/dw9719.c +f:drivers/media/i2c/dw9768.c +f:drivers/media/i2c/dw9807-vcm.c +f:drivers/media/i2c/et8ek8/Kconfig +f:drivers/media/i2c/et8ek8/Makefile +f:drivers/media/i2c/et8ek8/et8ek8_driver.c +f:drivers/media/i2c/et8ek8/et8ek8_mode.c +f:drivers/media/i2c/et8ek8/et8ek8_reg.h +f:drivers/media/i2c/gc0308.c +f:drivers/media/i2c/gc05a2.c +f:drivers/media/i2c/gc08a3.c +f:drivers/media/i2c/gc2145.c +f:drivers/media/i2c/hi556.c +f:drivers/media/i2c/hi846.c +f:drivers/media/i2c/hi847.c +f:drivers/media/i2c/imx208.c +f:drivers/media/i2c/imx214.c +f:drivers/media/i2c/imx219.c +f:drivers/media/i2c/imx258.c +f:drivers/media/i2c/imx274.c +f:drivers/media/i2c/imx283.c +f:drivers/media/i2c/imx290.c +f:drivers/media/i2c/imx296.c +f:drivers/media/i2c/imx319.c +f:drivers/media/i2c/imx334.c +f:drivers/media/i2c/imx335.c +f:drivers/media/i2c/imx355.c +f:drivers/media/i2c/imx412.c +f:drivers/media/i2c/imx415.c +f:drivers/media/i2c/ir-kbd-i2c.c +f:drivers/media/i2c/isl7998x.c +f:drivers/media/i2c/ks0127.c +f:drivers/media/i2c/ks0127.h +f:drivers/media/i2c/lm3560.c +f:drivers/media/i2c/lm3646.c +f:drivers/media/i2c/lt6911uxe.c +f:drivers/media/i2c/m52790.c +f:drivers/media/i2c/max2175.c +f:drivers/media/i2c/max2175.h +f:drivers/media/i2c/max9271.c +f:drivers/media/i2c/max9271.h +f:drivers/media/i2c/max9286.c +f:drivers/media/i2c/max96714.c +f:drivers/media/i2c/max96717.c +f:drivers/media/i2c/ml86v7667.c +f:drivers/media/i2c/msp3400-driver.c +f:drivers/media/i2c/msp3400-driver.h +f:drivers/media/i2c/msp3400-kthreads.c +f:drivers/media/i2c/mt9m001.c +f:drivers/media/i2c/mt9m111.c +f:drivers/media/i2c/mt9m114.c +f:drivers/media/i2c/mt9p031.c +f:drivers/media/i2c/mt9t112.c +f:drivers/media/i2c/mt9v011.c +f:drivers/media/i2c/mt9v032.c +f:drivers/media/i2c/mt9v111.c +f:drivers/media/i2c/og01a1b.c +f:drivers/media/i2c/ov01a10.c +f:drivers/media/i2c/ov02a10.c +f:drivers/media/i2c/ov02c10.c +f:drivers/media/i2c/ov02e10.c +f:drivers/media/i2c/ov08d10.c +f:drivers/media/i2c/ov08x40.c +f:drivers/media/i2c/ov13858.c +f:drivers/media/i2c/ov13b10.c +f:drivers/media/i2c/ov2640.c +f:drivers/media/i2c/ov2659.c +f:drivers/media/i2c/ov2680.c +f:drivers/media/i2c/ov2685.c +f:drivers/media/i2c/ov2740.c +f:drivers/media/i2c/ov4689.c +f:drivers/media/i2c/ov5640.c +f:drivers/media/i2c/ov5645.c +f:drivers/media/i2c/ov5647.c +f:drivers/media/i2c/ov5648.c +f:drivers/media/i2c/ov5670.c +f:drivers/media/i2c/ov5675.c +f:drivers/media/i2c/ov5693.c +f:drivers/media/i2c/ov5695.c +f:drivers/media/i2c/ov64a40.c +f:drivers/media/i2c/ov6650.c +f:drivers/media/i2c/ov7251.c +f:drivers/media/i2c/ov7640.c +f:drivers/media/i2c/ov7670.c +f:drivers/media/i2c/ov772x.c +f:drivers/media/i2c/ov7740.c +f:drivers/media/i2c/ov8856.c +f:drivers/media/i2c/ov8858.c +f:drivers/media/i2c/ov8865.c +f:drivers/media/i2c/ov9282.c +f:drivers/media/i2c/ov9640.c +f:drivers/media/i2c/ov9640.h +f:drivers/media/i2c/ov9650.c +f:drivers/media/i2c/ov9734.c +f:drivers/media/i2c/rdacm20.c +f:drivers/media/i2c/rdacm21.c +f:drivers/media/i2c/rj54n1cb0c.c +f:drivers/media/i2c/s5c73m3/Makefile +f:drivers/media/i2c/s5c73m3/s5c73m3-core.c +f:drivers/media/i2c/s5c73m3/s5c73m3-ctrls.c +f:drivers/media/i2c/s5c73m3/s5c73m3-spi.c +f:drivers/media/i2c/s5c73m3/s5c73m3.h +f:drivers/media/i2c/s5k5baf.c +f:drivers/media/i2c/s5k6a3.c +f:drivers/media/i2c/saa6588.c +f:drivers/media/i2c/saa6752hs.c +f:drivers/media/i2c/saa7110.c +f:drivers/media/i2c/saa7115.c +f:drivers/media/i2c/saa711x_regs.h +f:drivers/media/i2c/saa7127.c +f:drivers/media/i2c/saa717x.c +f:drivers/media/i2c/saa7185.c +f:drivers/media/i2c/sony-btf-mpx.c +f:drivers/media/i2c/st-mipid02.c +f:drivers/media/i2c/tc358743.c +f:drivers/media/i2c/tc358743_regs.h +f:drivers/media/i2c/tc358746.c +f:drivers/media/i2c/tda1997x.c +f:drivers/media/i2c/tda1997x_regs.h +f:drivers/media/i2c/tda7432.c +f:drivers/media/i2c/tda9840.c +f:drivers/media/i2c/tea6415c.c +f:drivers/media/i2c/tea6415c.h +f:drivers/media/i2c/tea6420.c +f:drivers/media/i2c/tea6420.h +f:drivers/media/i2c/thp7312.c +f:drivers/media/i2c/ths7303.c +f:drivers/media/i2c/ths8200.c +f:drivers/media/i2c/ths8200_regs.h +f:drivers/media/i2c/tlv320aic23b.c +f:drivers/media/i2c/tvaudio.c +f:drivers/media/i2c/tvp514x.c +f:drivers/media/i2c/tvp514x_regs.h +f:drivers/media/i2c/tvp5150.c +f:drivers/media/i2c/tvp5150_reg.h +f:drivers/media/i2c/tvp7002.c +f:drivers/media/i2c/tvp7002_reg.h +f:drivers/media/i2c/tw2804.c +f:drivers/media/i2c/tw9900.c +f:drivers/media/i2c/tw9903.c +f:drivers/media/i2c/tw9906.c +f:drivers/media/i2c/tw9910.c +f:drivers/media/i2c/uda1342.c +f:drivers/media/i2c/upd64031a.c +f:drivers/media/i2c/upd64083.c +f:drivers/media/i2c/vd55g1.c +f:drivers/media/i2c/vd56g3.c +f:drivers/media/i2c/vgxy61.c +f:drivers/media/i2c/video-i2c.c +f:drivers/media/i2c/vp27smpx.c +f:drivers/media/i2c/vpx3220.c +f:drivers/media/i2c/wm8739.c +f:drivers/media/i2c/wm8775.c +f:drivers/media/mc/Kconfig +f:drivers/media/mc/Makefile +f:drivers/media/mc/mc-dev-allocator.c +f:drivers/media/mc/mc-device.c +f:drivers/media/mc/mc-devnode.c +f:drivers/media/mc/mc-entity.c +f:drivers/media/mc/mc-request.c +f:drivers/media/mmc/Kconfig +f:drivers/media/mmc/Makefile +f:drivers/media/mmc/siano/Kconfig +f:drivers/media/mmc/siano/Makefile +f:drivers/media/mmc/siano/smssdio.c +f:drivers/media/pci/Kconfig +f:drivers/media/pci/Makefile +f:drivers/media/pci/b2c2/Kconfig +f:drivers/media/pci/b2c2/Makefile +f:drivers/media/pci/b2c2/flexcop-dma.c +f:drivers/media/pci/b2c2/flexcop-pci.c +f:drivers/media/pci/bt8xx/Kconfig +f:drivers/media/pci/bt8xx/Makefile +f:drivers/media/pci/bt8xx/bt848.h +f:drivers/media/pci/bt8xx/bt878.c +f:drivers/media/pci/bt8xx/bt878.h +f:drivers/media/pci/bt8xx/btcx-risc.c +f:drivers/media/pci/bt8xx/btcx-risc.h +f:drivers/media/pci/bt8xx/bttv-audio-hook.c +f:drivers/media/pci/bt8xx/bttv-audio-hook.h +f:drivers/media/pci/bt8xx/bttv-cards.c +f:drivers/media/pci/bt8xx/bttv-driver.c +f:drivers/media/pci/bt8xx/bttv-gpio.c +f:drivers/media/pci/bt8xx/bttv-i2c.c +f:drivers/media/pci/bt8xx/bttv-if.c +f:drivers/media/pci/bt8xx/bttv-input.c +f:drivers/media/pci/bt8xx/bttv-risc.c +f:drivers/media/pci/bt8xx/bttv-vbi.c +f:drivers/media/pci/bt8xx/bttv.h +f:drivers/media/pci/bt8xx/bttvp.h +f:drivers/media/pci/bt8xx/dst.c +f:drivers/media/pci/bt8xx/dst_ca.c +f:drivers/media/pci/bt8xx/dst_ca.h +f:drivers/media/pci/bt8xx/dst_common.h +f:drivers/media/pci/bt8xx/dst_priv.h +f:drivers/media/pci/bt8xx/dvb-bt8xx.c +f:drivers/media/pci/bt8xx/dvb-bt8xx.h +f:drivers/media/pci/cobalt/Kconfig +f:drivers/media/pci/cobalt/Makefile +f:drivers/media/pci/cobalt/cobalt-alsa-main.c +f:drivers/media/pci/cobalt/cobalt-alsa-pcm.c +f:drivers/media/pci/cobalt/cobalt-alsa-pcm.h +f:drivers/media/pci/cobalt/cobalt-alsa.h +f:drivers/media/pci/cobalt/cobalt-cpld.c +f:drivers/media/pci/cobalt/cobalt-cpld.h +f:drivers/media/pci/cobalt/cobalt-driver.c +f:drivers/media/pci/cobalt/cobalt-driver.h +f:drivers/media/pci/cobalt/cobalt-flash.c +f:drivers/media/pci/cobalt/cobalt-flash.h +f:drivers/media/pci/cobalt/cobalt-i2c.c +f:drivers/media/pci/cobalt/cobalt-i2c.h +f:drivers/media/pci/cobalt/cobalt-irq.c +f:drivers/media/pci/cobalt/cobalt-irq.h +f:drivers/media/pci/cobalt/cobalt-omnitek.c +f:drivers/media/pci/cobalt/cobalt-omnitek.h +f:drivers/media/pci/cobalt/cobalt-v4l2.c +f:drivers/media/pci/cobalt/cobalt-v4l2.h +f:drivers/media/pci/cobalt/m00233_video_measure_memmap_package.h +f:drivers/media/pci/cobalt/m00235_fdma_packer_memmap_package.h +f:drivers/media/pci/cobalt/m00389_cvi_memmap_package.h +f:drivers/media/pci/cobalt/m00460_evcnt_memmap_package.h +f:drivers/media/pci/cobalt/m00473_freewheel_memmap_package.h +f:drivers/media/pci/cobalt/m00479_clk_loss_detector_memmap_package.h +f:drivers/media/pci/cobalt/m00514_syncgen_flow_evcnt_memmap_package.h +f:drivers/media/pci/cx18/Kconfig +f:drivers/media/pci/cx18/Makefile +f:drivers/media/pci/cx18/cx18-alsa-main.c +f:drivers/media/pci/cx18/cx18-alsa-pcm.c +f:drivers/media/pci/cx18/cx18-alsa-pcm.h +f:drivers/media/pci/cx18/cx18-alsa.h +f:drivers/media/pci/cx18/cx18-audio.c +f:drivers/media/pci/cx18/cx18-audio.h +f:drivers/media/pci/cx18/cx18-av-audio.c +f:drivers/media/pci/cx18/cx18-av-core.c +f:drivers/media/pci/cx18/cx18-av-core.h +f:drivers/media/pci/cx18/cx18-av-firmware.c +f:drivers/media/pci/cx18/cx18-av-vbi.c +f:drivers/media/pci/cx18/cx18-cards.c +f:drivers/media/pci/cx18/cx18-cards.h +f:drivers/media/pci/cx18/cx18-controls.c +f:drivers/media/pci/cx18/cx18-controls.h +f:drivers/media/pci/cx18/cx18-driver.c +f:drivers/media/pci/cx18/cx18-driver.h +f:drivers/media/pci/cx18/cx18-dvb.c +f:drivers/media/pci/cx18/cx18-dvb.h +f:drivers/media/pci/cx18/cx18-fileops.c +f:drivers/media/pci/cx18/cx18-fileops.h +f:drivers/media/pci/cx18/cx18-firmware.c +f:drivers/media/pci/cx18/cx18-firmware.h +f:drivers/media/pci/cx18/cx18-gpio.c +f:drivers/media/pci/cx18/cx18-gpio.h +f:drivers/media/pci/cx18/cx18-i2c.c +f:drivers/media/pci/cx18/cx18-i2c.h +f:drivers/media/pci/cx18/cx18-io.c +f:drivers/media/pci/cx18/cx18-io.h +f:drivers/media/pci/cx18/cx18-ioctl.c +f:drivers/media/pci/cx18/cx18-ioctl.h +f:drivers/media/pci/cx18/cx18-irq.c +f:drivers/media/pci/cx18/cx18-irq.h +f:drivers/media/pci/cx18/cx18-mailbox.c +f:drivers/media/pci/cx18/cx18-mailbox.h +f:drivers/media/pci/cx18/cx18-queue.c +f:drivers/media/pci/cx18/cx18-queue.h +f:drivers/media/pci/cx18/cx18-scb.c +f:drivers/media/pci/cx18/cx18-scb.h +f:drivers/media/pci/cx18/cx18-streams.c +f:drivers/media/pci/cx18/cx18-streams.h +f:drivers/media/pci/cx18/cx18-vbi.c +f:drivers/media/pci/cx18/cx18-vbi.h +f:drivers/media/pci/cx18/cx18-version.h +f:drivers/media/pci/cx18/cx18-video.c +f:drivers/media/pci/cx18/cx18-video.h +f:drivers/media/pci/cx18/cx23418.h +f:drivers/media/pci/cx23885/Kconfig +f:drivers/media/pci/cx23885/Makefile +f:drivers/media/pci/cx23885/altera-ci.c +f:drivers/media/pci/cx23885/altera-ci.h +f:drivers/media/pci/cx23885/cimax2.c +f:drivers/media/pci/cx23885/cimax2.h +f:drivers/media/pci/cx23885/cx23885-417.c +f:drivers/media/pci/cx23885/cx23885-alsa.c +f:drivers/media/pci/cx23885/cx23885-av.c +f:drivers/media/pci/cx23885/cx23885-av.h +f:drivers/media/pci/cx23885/cx23885-cards.c +f:drivers/media/pci/cx23885/cx23885-core.c +f:drivers/media/pci/cx23885/cx23885-dvb.c +f:drivers/media/pci/cx23885/cx23885-f300.c +f:drivers/media/pci/cx23885/cx23885-f300.h +f:drivers/media/pci/cx23885/cx23885-i2c.c +f:drivers/media/pci/cx23885/cx23885-input.c +f:drivers/media/pci/cx23885/cx23885-input.h +f:drivers/media/pci/cx23885/cx23885-ioctl.c +f:drivers/media/pci/cx23885/cx23885-ioctl.h +f:drivers/media/pci/cx23885/cx23885-ir.c +f:drivers/media/pci/cx23885/cx23885-ir.h +f:drivers/media/pci/cx23885/cx23885-reg.h +f:drivers/media/pci/cx23885/cx23885-vbi.c +f:drivers/media/pci/cx23885/cx23885-video.c +f:drivers/media/pci/cx23885/cx23885-video.h +f:drivers/media/pci/cx23885/cx23885.h +f:drivers/media/pci/cx23885/cx23888-ir.c +f:drivers/media/pci/cx23885/cx23888-ir.h +f:drivers/media/pci/cx23885/netup-eeprom.c +f:drivers/media/pci/cx23885/netup-eeprom.h +f:drivers/media/pci/cx23885/netup-init.c +f:drivers/media/pci/cx23885/netup-init.h +f:drivers/media/pci/cx25821/Kconfig +f:drivers/media/pci/cx25821/Makefile +f:drivers/media/pci/cx25821/cx25821-alsa.c +f:drivers/media/pci/cx25821/cx25821-audio.h +f:drivers/media/pci/cx25821/cx25821-biffuncs.h +f:drivers/media/pci/cx25821/cx25821-cards.c +f:drivers/media/pci/cx25821/cx25821-core.c +f:drivers/media/pci/cx25821/cx25821-gpio.c +f:drivers/media/pci/cx25821/cx25821-i2c.c +f:drivers/media/pci/cx25821/cx25821-medusa-defines.h +f:drivers/media/pci/cx25821/cx25821-medusa-reg.h +f:drivers/media/pci/cx25821/cx25821-medusa-video.c +f:drivers/media/pci/cx25821/cx25821-medusa-video.h +f:drivers/media/pci/cx25821/cx25821-reg.h +f:drivers/media/pci/cx25821/cx25821-sram.h +f:drivers/media/pci/cx25821/cx25821-video.c +f:drivers/media/pci/cx25821/cx25821-video.h +f:drivers/media/pci/cx25821/cx25821.h +f:drivers/media/pci/cx88/Kconfig +f:drivers/media/pci/cx88/Makefile +f:drivers/media/pci/cx88/cx88-alsa.c +f:drivers/media/pci/cx88/cx88-blackbird.c +f:drivers/media/pci/cx88/cx88-cards.c +f:drivers/media/pci/cx88/cx88-core.c +f:drivers/media/pci/cx88/cx88-dsp.c +f:drivers/media/pci/cx88/cx88-dvb.c +f:drivers/media/pci/cx88/cx88-i2c.c +f:drivers/media/pci/cx88/cx88-input.c +f:drivers/media/pci/cx88/cx88-mpeg.c +f:drivers/media/pci/cx88/cx88-reg.h +f:drivers/media/pci/cx88/cx88-tvaudio.c +f:drivers/media/pci/cx88/cx88-vbi.c +f:drivers/media/pci/cx88/cx88-video.c +f:drivers/media/pci/cx88/cx88-vp3054-i2c.c +f:drivers/media/pci/cx88/cx88-vp3054-i2c.h +f:drivers/media/pci/cx88/cx88.h +f:drivers/media/pci/ddbridge/Kconfig +f:drivers/media/pci/ddbridge/Makefile +f:drivers/media/pci/ddbridge/ddbridge-ci.c +f:drivers/media/pci/ddbridge/ddbridge-ci.h +f:drivers/media/pci/ddbridge/ddbridge-core.c +f:drivers/media/pci/ddbridge/ddbridge-dummy-fe.c +f:drivers/media/pci/ddbridge/ddbridge-dummy-fe.h +f:drivers/media/pci/ddbridge/ddbridge-hw.c +f:drivers/media/pci/ddbridge/ddbridge-hw.h +f:drivers/media/pci/ddbridge/ddbridge-i2c.c +f:drivers/media/pci/ddbridge/ddbridge-i2c.h +f:drivers/media/pci/ddbridge/ddbridge-io.h +f:drivers/media/pci/ddbridge/ddbridge-main.c +f:drivers/media/pci/ddbridge/ddbridge-max.c +f:drivers/media/pci/ddbridge/ddbridge-max.h +f:drivers/media/pci/ddbridge/ddbridge-mci.c +f:drivers/media/pci/ddbridge/ddbridge-mci.h +f:drivers/media/pci/ddbridge/ddbridge-regs.h +f:drivers/media/pci/ddbridge/ddbridge-sx8.c +f:drivers/media/pci/ddbridge/ddbridge.h +f:drivers/media/pci/dm1105/Kconfig +f:drivers/media/pci/dm1105/Makefile +f:drivers/media/pci/dm1105/dm1105.c +f:drivers/media/pci/dt3155/Kconfig +f:drivers/media/pci/dt3155/Makefile +f:drivers/media/pci/dt3155/dt3155.c +f:drivers/media/pci/dt3155/dt3155.h +f:drivers/media/pci/intel/Kconfig +f:drivers/media/pci/intel/Makefile +f:drivers/media/pci/intel/ipu-bridge.c +f:drivers/media/pci/intel/ipu3/Kconfig +f:drivers/media/pci/intel/ipu3/Makefile +f:drivers/media/pci/intel/ipu3/ipu3-cio2.c +f:drivers/media/pci/intel/ipu3/ipu3-cio2.h +f:drivers/media/pci/intel/ipu6/Kconfig +f:drivers/media/pci/intel/ipu6/Makefile +f:drivers/media/pci/intel/ipu6/ipu6-bus.c +f:drivers/media/pci/intel/ipu6/ipu6-bus.h +f:drivers/media/pci/intel/ipu6/ipu6-buttress.c +f:drivers/media/pci/intel/ipu6/ipu6-buttress.h +f:drivers/media/pci/intel/ipu6/ipu6-cpd.c +f:drivers/media/pci/intel/ipu6/ipu6-cpd.h +f:drivers/media/pci/intel/ipu6/ipu6-dma.c +f:drivers/media/pci/intel/ipu6/ipu6-dma.h +f:drivers/media/pci/intel/ipu6/ipu6-fw-com.c +f:drivers/media/pci/intel/ipu6/ipu6-fw-com.h +f:drivers/media/pci/intel/ipu6/ipu6-fw-isys.c +f:drivers/media/pci/intel/ipu6/ipu6-fw-isys.h +f:drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c +f:drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h +f:drivers/media/pci/intel/ipu6/ipu6-isys-dwc-phy.c +f:drivers/media/pci/intel/ipu6/ipu6-isys-jsl-phy.c +f:drivers/media/pci/intel/ipu6/ipu6-isys-mcd-phy.c +f:drivers/media/pci/intel/ipu6/ipu6-isys-queue.c +f:drivers/media/pci/intel/ipu6/ipu6-isys-queue.h +f:drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c +f:drivers/media/pci/intel/ipu6/ipu6-isys-subdev.h +f:drivers/media/pci/intel/ipu6/ipu6-isys-video.c +f:drivers/media/pci/intel/ipu6/ipu6-isys-video.h +f:drivers/media/pci/intel/ipu6/ipu6-isys.c +f:drivers/media/pci/intel/ipu6/ipu6-isys.h +f:drivers/media/pci/intel/ipu6/ipu6-mmu.c +f:drivers/media/pci/intel/ipu6/ipu6-mmu.h +f:drivers/media/pci/intel/ipu6/ipu6-platform-buttress-regs.h +f:drivers/media/pci/intel/ipu6/ipu6-platform-isys-csi2-reg.h +f:drivers/media/pci/intel/ipu6/ipu6-platform-regs.h +f:drivers/media/pci/intel/ipu6/ipu6.c +f:drivers/media/pci/intel/ipu6/ipu6.h +f:drivers/media/pci/intel/ivsc/Kconfig +f:drivers/media/pci/intel/ivsc/Makefile +f:drivers/media/pci/intel/ivsc/mei_ace.c +f:drivers/media/pci/intel/ivsc/mei_csi.c +f:drivers/media/pci/ivtv/Kconfig +f:drivers/media/pci/ivtv/Makefile +f:drivers/media/pci/ivtv/ivtv-alsa-main.c +f:drivers/media/pci/ivtv/ivtv-alsa-pcm.c +f:drivers/media/pci/ivtv/ivtv-alsa-pcm.h +f:drivers/media/pci/ivtv/ivtv-alsa.h +f:drivers/media/pci/ivtv/ivtv-cards.c +f:drivers/media/pci/ivtv/ivtv-cards.h +f:drivers/media/pci/ivtv/ivtv-controls.c +f:drivers/media/pci/ivtv/ivtv-controls.h +f:drivers/media/pci/ivtv/ivtv-driver.c +f:drivers/media/pci/ivtv/ivtv-driver.h +f:drivers/media/pci/ivtv/ivtv-fileops.c +f:drivers/media/pci/ivtv/ivtv-fileops.h +f:drivers/media/pci/ivtv/ivtv-firmware.c +f:drivers/media/pci/ivtv/ivtv-firmware.h +f:drivers/media/pci/ivtv/ivtv-gpio.c +f:drivers/media/pci/ivtv/ivtv-gpio.h +f:drivers/media/pci/ivtv/ivtv-i2c.c +f:drivers/media/pci/ivtv/ivtv-i2c.h +f:drivers/media/pci/ivtv/ivtv-ioctl.c +f:drivers/media/pci/ivtv/ivtv-ioctl.h +f:drivers/media/pci/ivtv/ivtv-irq.c +f:drivers/media/pci/ivtv/ivtv-irq.h +f:drivers/media/pci/ivtv/ivtv-mailbox.c +f:drivers/media/pci/ivtv/ivtv-mailbox.h +f:drivers/media/pci/ivtv/ivtv-queue.c +f:drivers/media/pci/ivtv/ivtv-queue.h +f:drivers/media/pci/ivtv/ivtv-routing.c +f:drivers/media/pci/ivtv/ivtv-routing.h +f:drivers/media/pci/ivtv/ivtv-streams.c +f:drivers/media/pci/ivtv/ivtv-streams.h +f:drivers/media/pci/ivtv/ivtv-udma.c +f:drivers/media/pci/ivtv/ivtv-udma.h +f:drivers/media/pci/ivtv/ivtv-vbi.c +f:drivers/media/pci/ivtv/ivtv-vbi.h +f:drivers/media/pci/ivtv/ivtv-version.h +f:drivers/media/pci/ivtv/ivtv-yuv.c +f:drivers/media/pci/ivtv/ivtv-yuv.h +f:drivers/media/pci/ivtv/ivtvfb.c +f:drivers/media/pci/mantis/Kconfig +f:drivers/media/pci/mantis/Makefile +f:drivers/media/pci/mantis/hopper_cards.c +f:drivers/media/pci/mantis/hopper_vp3028.c +f:drivers/media/pci/mantis/hopper_vp3028.h +f:drivers/media/pci/mantis/mantis_ca.c +f:drivers/media/pci/mantis/mantis_ca.h +f:drivers/media/pci/mantis/mantis_cards.c +f:drivers/media/pci/mantis/mantis_common.h +f:drivers/media/pci/mantis/mantis_dma.c +f:drivers/media/pci/mantis/mantis_dma.h +f:drivers/media/pci/mantis/mantis_dvb.c +f:drivers/media/pci/mantis/mantis_dvb.h +f:drivers/media/pci/mantis/mantis_evm.c +f:drivers/media/pci/mantis/mantis_hif.c +f:drivers/media/pci/mantis/mantis_hif.h +f:drivers/media/pci/mantis/mantis_i2c.c +f:drivers/media/pci/mantis/mantis_i2c.h +f:drivers/media/pci/mantis/mantis_input.c +f:drivers/media/pci/mantis/mantis_input.h +f:drivers/media/pci/mantis/mantis_ioc.c +f:drivers/media/pci/mantis/mantis_ioc.h +f:drivers/media/pci/mantis/mantis_link.h +f:drivers/media/pci/mantis/mantis_pci.c +f:drivers/media/pci/mantis/mantis_pci.h +f:drivers/media/pci/mantis/mantis_pcmcia.c +f:drivers/media/pci/mantis/mantis_reg.h +f:drivers/media/pci/mantis/mantis_uart.c +f:drivers/media/pci/mantis/mantis_uart.h +f:drivers/media/pci/mantis/mantis_vp1033.c +f:drivers/media/pci/mantis/mantis_vp1033.h +f:drivers/media/pci/mantis/mantis_vp1034.c +f:drivers/media/pci/mantis/mantis_vp1034.h +f:drivers/media/pci/mantis/mantis_vp1041.c +f:drivers/media/pci/mantis/mantis_vp1041.h +f:drivers/media/pci/mantis/mantis_vp2033.c +f:drivers/media/pci/mantis/mantis_vp2033.h +f:drivers/media/pci/mantis/mantis_vp2040.c +f:drivers/media/pci/mantis/mantis_vp2040.h +f:drivers/media/pci/mantis/mantis_vp3030.c +f:drivers/media/pci/mantis/mantis_vp3030.h +f:drivers/media/pci/mgb4/Kconfig +f:drivers/media/pci/mgb4/Makefile +f:drivers/media/pci/mgb4/mgb4_cmt.c +f:drivers/media/pci/mgb4/mgb4_cmt.h +f:drivers/media/pci/mgb4/mgb4_core.c +f:drivers/media/pci/mgb4/mgb4_core.h +f:drivers/media/pci/mgb4/mgb4_dma.c +f:drivers/media/pci/mgb4/mgb4_dma.h +f:drivers/media/pci/mgb4/mgb4_i2c.c +f:drivers/media/pci/mgb4/mgb4_i2c.h +f:drivers/media/pci/mgb4/mgb4_io.h +f:drivers/media/pci/mgb4/mgb4_regs.c +f:drivers/media/pci/mgb4/mgb4_regs.h +f:drivers/media/pci/mgb4/mgb4_sysfs.h +f:drivers/media/pci/mgb4/mgb4_sysfs_in.c +f:drivers/media/pci/mgb4/mgb4_sysfs_out.c +f:drivers/media/pci/mgb4/mgb4_sysfs_pci.c +f:drivers/media/pci/mgb4/mgb4_trigger.c +f:drivers/media/pci/mgb4/mgb4_trigger.h +f:drivers/media/pci/mgb4/mgb4_vin.c +f:drivers/media/pci/mgb4/mgb4_vin.h +f:drivers/media/pci/mgb4/mgb4_vout.c +f:drivers/media/pci/mgb4/mgb4_vout.h +f:drivers/media/pci/netup_unidvb/Kconfig +f:drivers/media/pci/netup_unidvb/Makefile +f:drivers/media/pci/netup_unidvb/netup_unidvb.h +f:drivers/media/pci/netup_unidvb/netup_unidvb_ci.c +f:drivers/media/pci/netup_unidvb/netup_unidvb_core.c +f:drivers/media/pci/netup_unidvb/netup_unidvb_i2c.c +f:drivers/media/pci/netup_unidvb/netup_unidvb_spi.c +f:drivers/media/pci/ngene/Kconfig +f:drivers/media/pci/ngene/Makefile +f:drivers/media/pci/ngene/ngene-cards.c +f:drivers/media/pci/ngene/ngene-core.c +f:drivers/media/pci/ngene/ngene-dvb.c +f:drivers/media/pci/ngene/ngene-i2c.c +f:drivers/media/pci/ngene/ngene.h +f:drivers/media/pci/pluto2/Kconfig +f:drivers/media/pci/pluto2/Makefile +f:drivers/media/pci/pluto2/pluto2.c +f:drivers/media/pci/pt1/Kconfig +f:drivers/media/pci/pt1/Makefile +f:drivers/media/pci/pt1/pt1.c +f:drivers/media/pci/pt3/Kconfig +f:drivers/media/pci/pt3/Makefile +f:drivers/media/pci/pt3/pt3.c +f:drivers/media/pci/pt3/pt3.h +f:drivers/media/pci/pt3/pt3_dma.c +f:drivers/media/pci/pt3/pt3_i2c.c +f:drivers/media/pci/saa7134/Kconfig +f:drivers/media/pci/saa7134/Makefile +f:drivers/media/pci/saa7134/saa7134-alsa.c +f:drivers/media/pci/saa7134/saa7134-cards.c +f:drivers/media/pci/saa7134/saa7134-core.c +f:drivers/media/pci/saa7134/saa7134-dvb.c +f:drivers/media/pci/saa7134/saa7134-empress.c +f:drivers/media/pci/saa7134/saa7134-go7007.c +f:drivers/media/pci/saa7134/saa7134-i2c.c +f:drivers/media/pci/saa7134/saa7134-input.c +f:drivers/media/pci/saa7134/saa7134-reg.h +f:drivers/media/pci/saa7134/saa7134-ts.c +f:drivers/media/pci/saa7134/saa7134-tvaudio.c +f:drivers/media/pci/saa7134/saa7134-vbi.c +f:drivers/media/pci/saa7134/saa7134-video.c +f:drivers/media/pci/saa7134/saa7134.h +f:drivers/media/pci/saa7146/Kconfig +f:drivers/media/pci/saa7146/Makefile +f:drivers/media/pci/saa7146/hexium_gemini.c +f:drivers/media/pci/saa7146/hexium_orion.c +f:drivers/media/pci/saa7146/mxb.c +f:drivers/media/pci/saa7164/Kconfig +f:drivers/media/pci/saa7164/Makefile +f:drivers/media/pci/saa7164/saa7164-api.c +f:drivers/media/pci/saa7164/saa7164-buffer.c +f:drivers/media/pci/saa7164/saa7164-bus.c +f:drivers/media/pci/saa7164/saa7164-cards.c +f:drivers/media/pci/saa7164/saa7164-cmd.c +f:drivers/media/pci/saa7164/saa7164-core.c +f:drivers/media/pci/saa7164/saa7164-dvb.c +f:drivers/media/pci/saa7164/saa7164-encoder.c +f:drivers/media/pci/saa7164/saa7164-fw.c +f:drivers/media/pci/saa7164/saa7164-i2c.c +f:drivers/media/pci/saa7164/saa7164-reg.h +f:drivers/media/pci/saa7164/saa7164-types.h +f:drivers/media/pci/saa7164/saa7164-vbi.c +f:drivers/media/pci/saa7164/saa7164.h +f:drivers/media/pci/smipcie/Kconfig +f:drivers/media/pci/smipcie/Makefile +f:drivers/media/pci/smipcie/smipcie-ir.c +f:drivers/media/pci/smipcie/smipcie-main.c +f:drivers/media/pci/smipcie/smipcie.h +f:drivers/media/pci/solo6x10/Kconfig +f:drivers/media/pci/solo6x10/Makefile +f:drivers/media/pci/solo6x10/solo6x10-core.c +f:drivers/media/pci/solo6x10/solo6x10-disp.c +f:drivers/media/pci/solo6x10/solo6x10-eeprom.c +f:drivers/media/pci/solo6x10/solo6x10-enc.c +f:drivers/media/pci/solo6x10/solo6x10-g723.c +f:drivers/media/pci/solo6x10/solo6x10-gpio.c +f:drivers/media/pci/solo6x10/solo6x10-i2c.c +f:drivers/media/pci/solo6x10/solo6x10-jpeg.h +f:drivers/media/pci/solo6x10/solo6x10-offsets.h +f:drivers/media/pci/solo6x10/solo6x10-p2m.c +f:drivers/media/pci/solo6x10/solo6x10-regs.h +f:drivers/media/pci/solo6x10/solo6x10-tw28.c +f:drivers/media/pci/solo6x10/solo6x10-tw28.h +f:drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c +f:drivers/media/pci/solo6x10/solo6x10-v4l2.c +f:drivers/media/pci/solo6x10/solo6x10.h +f:drivers/media/pci/ttpci/Kconfig +f:drivers/media/pci/ttpci/Makefile +f:drivers/media/pci/ttpci/budget-av.c +f:drivers/media/pci/ttpci/budget-ci.c +f:drivers/media/pci/ttpci/budget-core.c +f:drivers/media/pci/ttpci/budget.c +f:drivers/media/pci/ttpci/budget.h +f:drivers/media/pci/tw5864/Kconfig +f:drivers/media/pci/tw5864/Makefile +f:drivers/media/pci/tw5864/tw5864-core.c +f:drivers/media/pci/tw5864/tw5864-h264.c +f:drivers/media/pci/tw5864/tw5864-reg.h +f:drivers/media/pci/tw5864/tw5864-util.c +f:drivers/media/pci/tw5864/tw5864-video.c +f:drivers/media/pci/tw5864/tw5864.h +f:drivers/media/pci/tw68/Kconfig +f:drivers/media/pci/tw68/Makefile +f:drivers/media/pci/tw68/tw68-core.c +f:drivers/media/pci/tw68/tw68-reg.h +f:drivers/media/pci/tw68/tw68-risc.c +f:drivers/media/pci/tw68/tw68-video.c +f:drivers/media/pci/tw68/tw68.h +f:drivers/media/pci/tw686x/Kconfig +f:drivers/media/pci/tw686x/Makefile +f:drivers/media/pci/tw686x/tw686x-audio.c +f:drivers/media/pci/tw686x/tw686x-core.c +f:drivers/media/pci/tw686x/tw686x-regs.h +f:drivers/media/pci/tw686x/tw686x-video.c +f:drivers/media/pci/tw686x/tw686x.h +f:drivers/media/pci/zoran/Kconfig +f:drivers/media/pci/zoran/Makefile +f:drivers/media/pci/zoran/videocodec.c +f:drivers/media/pci/zoran/videocodec.h +f:drivers/media/pci/zoran/zoran.h +f:drivers/media/pci/zoran/zoran_card.c +f:drivers/media/pci/zoran/zoran_card.h +f:drivers/media/pci/zoran/zoran_device.c +f:drivers/media/pci/zoran/zoran_device.h +f:drivers/media/pci/zoran/zoran_driver.c +f:drivers/media/pci/zoran/zr36016.c +f:drivers/media/pci/zoran/zr36016.h +f:drivers/media/pci/zoran/zr36050.c +f:drivers/media/pci/zoran/zr36050.h +f:drivers/media/pci/zoran/zr36057.h +f:drivers/media/pci/zoran/zr36060.c +f:drivers/media/pci/zoran/zr36060.h +f:drivers/media/platform/Kconfig +f:drivers/media/platform/Makefile +f:drivers/media/platform/allegro-dvt/Kconfig +f:drivers/media/platform/allegro-dvt/Makefile +f:drivers/media/platform/allegro-dvt/allegro-core.c +f:drivers/media/platform/allegro-dvt/allegro-mail.c +f:drivers/media/platform/allegro-dvt/allegro-mail.h +f:drivers/media/platform/allegro-dvt/nal-h264.c +f:drivers/media/platform/allegro-dvt/nal-h264.h +f:drivers/media/platform/allegro-dvt/nal-hevc.c +f:drivers/media/platform/allegro-dvt/nal-hevc.h +f:drivers/media/platform/allegro-dvt/nal-rbsp.c +f:drivers/media/platform/allegro-dvt/nal-rbsp.h +f:drivers/media/platform/amlogic/Kconfig +f:drivers/media/platform/amlogic/Makefile +f:drivers/media/platform/amlogic/c3/Kconfig +f:drivers/media/platform/amlogic/c3/Makefile +f:drivers/media/platform/amlogic/c3/isp/Kconfig +f:drivers/media/platform/amlogic/c3/isp/Makefile +f:drivers/media/platform/amlogic/c3/isp/c3-isp-capture.c +f:drivers/media/platform/amlogic/c3/isp/c3-isp-common.h +f:drivers/media/platform/amlogic/c3/isp/c3-isp-core.c +f:drivers/media/platform/amlogic/c3/isp/c3-isp-dev.c +f:drivers/media/platform/amlogic/c3/isp/c3-isp-params.c +f:drivers/media/platform/amlogic/c3/isp/c3-isp-regs.h +f:drivers/media/platform/amlogic/c3/isp/c3-isp-resizer.c +f:drivers/media/platform/amlogic/c3/isp/c3-isp-stats.c +f:drivers/media/platform/amlogic/c3/mipi-adapter/Kconfig +f:drivers/media/platform/amlogic/c3/mipi-adapter/Makefile +f:drivers/media/platform/amlogic/c3/mipi-adapter/c3-mipi-adap.c +f:drivers/media/platform/amlogic/c3/mipi-csi2/Kconfig +f:drivers/media/platform/amlogic/c3/mipi-csi2/Makefile +f:drivers/media/platform/amlogic/c3/mipi-csi2/c3-mipi-csi2.c +f:drivers/media/platform/amlogic/meson-ge2d/Kconfig +f:drivers/media/platform/amlogic/meson-ge2d/Makefile +f:drivers/media/platform/amlogic/meson-ge2d/ge2d-regs.h +f:drivers/media/platform/amlogic/meson-ge2d/ge2d.c +f:drivers/media/platform/amphion/Kconfig +f:drivers/media/platform/amphion/Makefile +f:drivers/media/platform/amphion/vdec.c +f:drivers/media/platform/amphion/venc.c +f:drivers/media/platform/amphion/vpu.h +f:drivers/media/platform/amphion/vpu_cmds.c +f:drivers/media/platform/amphion/vpu_cmds.h +f:drivers/media/platform/amphion/vpu_codec.h +f:drivers/media/platform/amphion/vpu_color.c +f:drivers/media/platform/amphion/vpu_core.c +f:drivers/media/platform/amphion/vpu_core.h +f:drivers/media/platform/amphion/vpu_dbg.c +f:drivers/media/platform/amphion/vpu_defs.h +f:drivers/media/platform/amphion/vpu_drv.c +f:drivers/media/platform/amphion/vpu_helpers.c +f:drivers/media/platform/amphion/vpu_helpers.h +f:drivers/media/platform/amphion/vpu_imx8q.c +f:drivers/media/platform/amphion/vpu_imx8q.h +f:drivers/media/platform/amphion/vpu_malone.c +f:drivers/media/platform/amphion/vpu_malone.h +f:drivers/media/platform/amphion/vpu_mbox.c +f:drivers/media/platform/amphion/vpu_mbox.h +f:drivers/media/platform/amphion/vpu_msgs.c +f:drivers/media/platform/amphion/vpu_msgs.h +f:drivers/media/platform/amphion/vpu_rpc.c +f:drivers/media/platform/amphion/vpu_rpc.h +f:drivers/media/platform/amphion/vpu_v4l2.c +f:drivers/media/platform/amphion/vpu_v4l2.h +f:drivers/media/platform/amphion/vpu_windsor.c +f:drivers/media/platform/amphion/vpu_windsor.h +f:drivers/media/platform/aspeed/Kconfig +f:drivers/media/platform/aspeed/Makefile +f:drivers/media/platform/aspeed/aspeed-video.c +f:drivers/media/platform/atmel/Kconfig +f:drivers/media/platform/atmel/Makefile +f:drivers/media/platform/atmel/atmel-isi.c +f:drivers/media/platform/atmel/atmel-isi.h +f:drivers/media/platform/broadcom/Kconfig +f:drivers/media/platform/broadcom/Makefile +f:drivers/media/platform/broadcom/bcm2835-unicam-regs.h +f:drivers/media/platform/broadcom/bcm2835-unicam.c +f:drivers/media/platform/cadence/Kconfig +f:drivers/media/platform/cadence/Makefile +f:drivers/media/platform/cadence/cdns-csi2rx.c +f:drivers/media/platform/cadence/cdns-csi2tx.c +f:drivers/media/platform/chips-media/Kconfig +f:drivers/media/platform/chips-media/Makefile +f:drivers/media/platform/chips-media/coda/Kconfig +f:drivers/media/platform/chips-media/coda/Makefile +f:drivers/media/platform/chips-media/coda/coda-bit.c +f:drivers/media/platform/chips-media/coda/coda-common.c +f:drivers/media/platform/chips-media/coda/coda-gdi.c +f:drivers/media/platform/chips-media/coda/coda-h264.c +f:drivers/media/platform/chips-media/coda/coda-jpeg.c +f:drivers/media/platform/chips-media/coda/coda-mpeg2.c +f:drivers/media/platform/chips-media/coda/coda-mpeg4.c +f:drivers/media/platform/chips-media/coda/coda.h +f:drivers/media/platform/chips-media/coda/coda_regs.h +f:drivers/media/platform/chips-media/coda/imx-vdoa.c +f:drivers/media/platform/chips-media/coda/imx-vdoa.h +f:drivers/media/platform/chips-media/coda/trace.h +f:drivers/media/platform/chips-media/wave5/Kconfig +f:drivers/media/platform/chips-media/wave5/Makefile +f:drivers/media/platform/chips-media/wave5/wave5-helper.c +f:drivers/media/platform/chips-media/wave5/wave5-helper.h +f:drivers/media/platform/chips-media/wave5/wave5-hw.c +f:drivers/media/platform/chips-media/wave5/wave5-regdefine.h +f:drivers/media/platform/chips-media/wave5/wave5-vdi.c +f:drivers/media/platform/chips-media/wave5/wave5-vdi.h +f:drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c +f:drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c +f:drivers/media/platform/chips-media/wave5/wave5-vpu.c +f:drivers/media/platform/chips-media/wave5/wave5-vpu.h +f:drivers/media/platform/chips-media/wave5/wave5-vpuapi.c +f:drivers/media/platform/chips-media/wave5/wave5-vpuapi.h +f:drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h +f:drivers/media/platform/chips-media/wave5/wave5-vpuerror.h +f:drivers/media/platform/chips-media/wave5/wave5.h +f:drivers/media/platform/imagination/Kconfig +f:drivers/media/platform/imagination/Makefile +f:drivers/media/platform/imagination/e5010-core-regs.h +f:drivers/media/platform/imagination/e5010-jpeg-enc-hw.c +f:drivers/media/platform/imagination/e5010-jpeg-enc-hw.h +f:drivers/media/platform/imagination/e5010-jpeg-enc.c +f:drivers/media/platform/imagination/e5010-jpeg-enc.h +f:drivers/media/platform/imagination/e5010-mmu-regs.h +f:drivers/media/platform/intel/Kconfig +f:drivers/media/platform/intel/Makefile +f:drivers/media/platform/intel/pxa_camera.c +f:drivers/media/platform/m2m-deinterlace.c +f:drivers/media/platform/marvell/Kconfig +f:drivers/media/platform/marvell/Makefile +f:drivers/media/platform/marvell/cafe-driver.c +f:drivers/media/platform/marvell/mcam-core.c +f:drivers/media/platform/marvell/mcam-core.h +f:drivers/media/platform/marvell/mmp-driver.c +f:drivers/media/platform/mediatek/Kconfig +f:drivers/media/platform/mediatek/Makefile +f:drivers/media/platform/mediatek/jpeg/Kconfig +f:drivers/media/platform/mediatek/jpeg/Makefile +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.h +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.h +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_parse.c +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_parse.h +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_reg.h +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c +f:drivers/media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.h +f:drivers/media/platform/mediatek/mdp/Kconfig +f:drivers/media/platform/mediatek/mdp/Makefile +f:drivers/media/platform/mediatek/mdp/mtk_mdp_comp.c +f:drivers/media/platform/mediatek/mdp/mtk_mdp_comp.h +f:drivers/media/platform/mediatek/mdp/mtk_mdp_core.c +f:drivers/media/platform/mediatek/mdp/mtk_mdp_core.h +f:drivers/media/platform/mediatek/mdp/mtk_mdp_ipi.h +f:drivers/media/platform/mediatek/mdp/mtk_mdp_m2m.c +f:drivers/media/platform/mediatek/mdp/mtk_mdp_m2m.h +f:drivers/media/platform/mediatek/mdp/mtk_mdp_regs.c +f:drivers/media/platform/mediatek/mdp/mtk_mdp_regs.h +f:drivers/media/platform/mediatek/mdp/mtk_mdp_vpu.c +f:drivers/media/platform/mediatek/mdp/mtk_mdp_vpu.h +f:drivers/media/platform/mediatek/mdp3/Kconfig +f:drivers/media/platform/mediatek/mdp3/Makefile +f:drivers/media/platform/mediatek/mdp3/mdp_cfg_data.c +f:drivers/media/platform/mediatek/mdp3/mdp_reg_aal.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_ccorr.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_color.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_fg.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_hdr.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_merge.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_ovl.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_pad.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_rdma.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_rsz.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_tdshp.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_wdma.h +f:drivers/media/platform/mediatek/mdp3/mdp_reg_wrot.h +f:drivers/media/platform/mediatek/mdp3/mdp_sm_mt8183.h +f:drivers/media/platform/mediatek/mdp3/mdp_sm_mt8195.h +f:drivers/media/platform/mediatek/mdp3/mtk-img-ipi.h +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-cfg.h +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-comp.c +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-comp.h +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-m2m.c +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-m2m.h +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-regs.c +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-regs.h +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-type.h +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-vpu.c +f:drivers/media/platform/mediatek/mdp3/mtk-mdp3-vpu.h +f:drivers/media/platform/mediatek/vcodec/Kconfig +f:drivers/media/platform/mediatek/vcodec/Makefile +f:drivers/media/platform/mediatek/vcodec/common/Makefile +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_cmn_drv.h +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_dbgfs.c +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_dbgfs.h +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw.c +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw.h +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_priv.h +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_scp.c +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vpu.c +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_intr.c +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_intr.h +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.c +f:drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_util.h +f:drivers/media/platform/mediatek/vcodec/decoder/Makefile +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.h +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_hw.c +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_hw.h +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_pm.c +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_pm.h +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateful.c +f:drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_common.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_common.h +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_hevc_req_multi_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp8_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp8_req_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec_drv_base.h +f:drivers/media/platform/mediatek/vcodec/decoder/vdec_drv_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec_drv_if.h +f:drivers/media/platform/mediatek/vcodec/decoder/vdec_ipi_msg.h +f:drivers/media/platform/mediatek/vcodec/decoder/vdec_msg_queue.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec_msg_queue.h +f:drivers/media/platform/mediatek/vcodec/decoder/vdec_vpu_if.c +f:drivers/media/platform/mediatek/vcodec/decoder/vdec_vpu_if.h +f:drivers/media/platform/mediatek/vcodec/encoder/Makefile +f:drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.c +f:drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.h +f:drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc_drv.c +f:drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc_drv.h +f:drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc_pm.c +f:drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc_pm.h +f:drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c +f:drivers/media/platform/mediatek/vcodec/encoder/venc/venc_vp8_if.c +f:drivers/media/platform/mediatek/vcodec/encoder/venc_drv_base.h +f:drivers/media/platform/mediatek/vcodec/encoder/venc_drv_if.c +f:drivers/media/platform/mediatek/vcodec/encoder/venc_drv_if.h +f:drivers/media/platform/mediatek/vcodec/encoder/venc_ipi_msg.h +f:drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c +f:drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.h +f:drivers/media/platform/mediatek/vpu/Kconfig +f:drivers/media/platform/mediatek/vpu/Makefile +f:drivers/media/platform/mediatek/vpu/mtk_vpu.c +f:drivers/media/platform/mediatek/vpu/mtk_vpu.h +f:drivers/media/platform/microchip/Kconfig +f:drivers/media/platform/microchip/Makefile +f:drivers/media/platform/microchip/microchip-csi2dc.c +f:drivers/media/platform/microchip/microchip-isc-base.c +f:drivers/media/platform/microchip/microchip-isc-clk.c +f:drivers/media/platform/microchip/microchip-isc-regs.h +f:drivers/media/platform/microchip/microchip-isc-scaler.c +f:drivers/media/platform/microchip/microchip-isc.h +f:drivers/media/platform/microchip/microchip-sama5d2-isc.c +f:drivers/media/platform/microchip/microchip-sama7g5-isc.c +f:drivers/media/platform/nuvoton/Kconfig +f:drivers/media/platform/nuvoton/Makefile +f:drivers/media/platform/nuvoton/npcm-regs.h +f:drivers/media/platform/nuvoton/npcm-video.c +f:drivers/media/platform/nvidia/Kconfig +f:drivers/media/platform/nvidia/Makefile +f:drivers/media/platform/nvidia/tegra-vde/Kconfig +f:drivers/media/platform/nvidia/tegra-vde/Makefile +f:drivers/media/platform/nvidia/tegra-vde/dmabuf-cache.c +f:drivers/media/platform/nvidia/tegra-vde/h264.c +f:drivers/media/platform/nvidia/tegra-vde/iommu.c +f:drivers/media/platform/nvidia/tegra-vde/trace.h +f:drivers/media/platform/nvidia/tegra-vde/v4l2.c +f:drivers/media/platform/nvidia/tegra-vde/vde.c +f:drivers/media/platform/nvidia/tegra-vde/vde.h +f:drivers/media/platform/nxp/Kconfig +f:drivers/media/platform/nxp/Makefile +f:drivers/media/platform/nxp/dw100/Kconfig +f:drivers/media/platform/nxp/dw100/Makefile +f:drivers/media/platform/nxp/dw100/dw100.c +f:drivers/media/platform/nxp/dw100/dw100_regs.h +f:drivers/media/platform/nxp/imx-jpeg/Kconfig +f:drivers/media/platform/nxp/imx-jpeg/Makefile +f:drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c +f:drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h +f:drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +f:drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h +f:drivers/media/platform/nxp/imx-mipi-csis.c +f:drivers/media/platform/nxp/imx-pxp.c +f:drivers/media/platform/nxp/imx-pxp.h +f:drivers/media/platform/nxp/imx7-media-csi.c +f:drivers/media/platform/nxp/imx8-isi/Kconfig +f:drivers/media/platform/nxp/imx8-isi/Makefile +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-core.h +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-crossbar.c +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-debug.c +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-gasket.c +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-hw.c +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-regs.h +f:drivers/media/platform/nxp/imx8-isi/imx8-isi-video.c +f:drivers/media/platform/nxp/imx8mq-mipi-csi2.c +f:drivers/media/platform/nxp/mx2_emmaprp.c +f:drivers/media/platform/qcom/Kconfig +f:drivers/media/platform/qcom/Makefile +f:drivers/media/platform/qcom/camss/Kconfig +f:drivers/media/platform/qcom/camss/Makefile +f:drivers/media/platform/qcom/camss/camss-csid-4-1.c +f:drivers/media/platform/qcom/camss/camss-csid-4-7.c +f:drivers/media/platform/qcom/camss/camss-csid-680.c +f:drivers/media/platform/qcom/camss/camss-csid-780.c +f:drivers/media/platform/qcom/camss/camss-csid-780.h +f:drivers/media/platform/qcom/camss/camss-csid-gen1.h +f:drivers/media/platform/qcom/camss/camss-csid-gen2.c +f:drivers/media/platform/qcom/camss/camss-csid-gen2.h +f:drivers/media/platform/qcom/camss/camss-csid.c +f:drivers/media/platform/qcom/camss/camss-csid.h +f:drivers/media/platform/qcom/camss/camss-csiphy-2ph-1-0.c +f:drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c +f:drivers/media/platform/qcom/camss/camss-csiphy.c +f:drivers/media/platform/qcom/camss/camss-csiphy.h +f:drivers/media/platform/qcom/camss/camss-format.c +f:drivers/media/platform/qcom/camss/camss-format.h +f:drivers/media/platform/qcom/camss/camss-ispif.c +f:drivers/media/platform/qcom/camss/camss-ispif.h +f:drivers/media/platform/qcom/camss/camss-vfe-17x.c +f:drivers/media/platform/qcom/camss/camss-vfe-4-1.c +f:drivers/media/platform/qcom/camss/camss-vfe-4-7.c +f:drivers/media/platform/qcom/camss/camss-vfe-4-8.c +f:drivers/media/platform/qcom/camss/camss-vfe-480.c +f:drivers/media/platform/qcom/camss/camss-vfe-680.c +f:drivers/media/platform/qcom/camss/camss-vfe-780.c +f:drivers/media/platform/qcom/camss/camss-vfe-gen1.c +f:drivers/media/platform/qcom/camss/camss-vfe-gen1.h +f:drivers/media/platform/qcom/camss/camss-vfe.c +f:drivers/media/platform/qcom/camss/camss-vfe.h +f:drivers/media/platform/qcom/camss/camss-video.c +f:drivers/media/platform/qcom/camss/camss-video.h +f:drivers/media/platform/qcom/camss/camss.c +f:drivers/media/platform/qcom/camss/camss.h +f:drivers/media/platform/qcom/iris/Kconfig +f:drivers/media/platform/qcom/iris/Makefile +f:drivers/media/platform/qcom/iris/iris_buffer.c +f:drivers/media/platform/qcom/iris/iris_buffer.h +f:drivers/media/platform/qcom/iris/iris_core.c +f:drivers/media/platform/qcom/iris/iris_core.h +f:drivers/media/platform/qcom/iris/iris_ctrls.c +f:drivers/media/platform/qcom/iris/iris_ctrls.h +f:drivers/media/platform/qcom/iris/iris_firmware.c +f:drivers/media/platform/qcom/iris/iris_firmware.h +f:drivers/media/platform/qcom/iris/iris_hfi_common.c +f:drivers/media/platform/qcom/iris/iris_hfi_common.h +f:drivers/media/platform/qcom/iris/iris_hfi_gen1.h +f:drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c +f:drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h +f:drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c +f:drivers/media/platform/qcom/iris/iris_hfi_gen2.h +f:drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c +f:drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h +f:drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c +f:drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h +f:drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c +f:drivers/media/platform/qcom/iris/iris_hfi_queue.c +f:drivers/media/platform/qcom/iris/iris_hfi_queue.h +f:drivers/media/platform/qcom/iris/iris_instance.h +f:drivers/media/platform/qcom/iris/iris_platform_common.h +f:drivers/media/platform/qcom/iris/iris_platform_gen2.c +f:drivers/media/platform/qcom/iris/iris_platform_qcs8300.h +f:drivers/media/platform/qcom/iris/iris_platform_sm8250.c +f:drivers/media/platform/qcom/iris/iris_platform_sm8650.h +f:drivers/media/platform/qcom/iris/iris_power.c +f:drivers/media/platform/qcom/iris/iris_power.h +f:drivers/media/platform/qcom/iris/iris_probe.c +f:drivers/media/platform/qcom/iris/iris_resources.c +f:drivers/media/platform/qcom/iris/iris_resources.h +f:drivers/media/platform/qcom/iris/iris_state.c +f:drivers/media/platform/qcom/iris/iris_state.h +f:drivers/media/platform/qcom/iris/iris_utils.c +f:drivers/media/platform/qcom/iris/iris_utils.h +f:drivers/media/platform/qcom/iris/iris_vb2.c +f:drivers/media/platform/qcom/iris/iris_vb2.h +f:drivers/media/platform/qcom/iris/iris_vdec.c +f:drivers/media/platform/qcom/iris/iris_vdec.h +f:drivers/media/platform/qcom/iris/iris_vidc.c +f:drivers/media/platform/qcom/iris/iris_vidc.h +f:drivers/media/platform/qcom/iris/iris_vpu2.c +f:drivers/media/platform/qcom/iris/iris_vpu3x.c +f:drivers/media/platform/qcom/iris/iris_vpu_buffer.c +f:drivers/media/platform/qcom/iris/iris_vpu_buffer.h +f:drivers/media/platform/qcom/iris/iris_vpu_common.c +f:drivers/media/platform/qcom/iris/iris_vpu_common.h +f:drivers/media/platform/qcom/iris/iris_vpu_register_defines.h +f:drivers/media/platform/qcom/venus/Kconfig +f:drivers/media/platform/qcom/venus/Makefile +f:drivers/media/platform/qcom/venus/core.c +f:drivers/media/platform/qcom/venus/core.h +f:drivers/media/platform/qcom/venus/dbgfs.c +f:drivers/media/platform/qcom/venus/dbgfs.h +f:drivers/media/platform/qcom/venus/firmware.c +f:drivers/media/platform/qcom/venus/firmware.h +f:drivers/media/platform/qcom/venus/helpers.c +f:drivers/media/platform/qcom/venus/helpers.h +f:drivers/media/platform/qcom/venus/hfi.c +f:drivers/media/platform/qcom/venus/hfi.h +f:drivers/media/platform/qcom/venus/hfi_cmds.c +f:drivers/media/platform/qcom/venus/hfi_cmds.h +f:drivers/media/platform/qcom/venus/hfi_helper.h +f:drivers/media/platform/qcom/venus/hfi_msgs.c +f:drivers/media/platform/qcom/venus/hfi_msgs.h +f:drivers/media/platform/qcom/venus/hfi_parser.c +f:drivers/media/platform/qcom/venus/hfi_parser.h +f:drivers/media/platform/qcom/venus/hfi_plat_bufs.h +f:drivers/media/platform/qcom/venus/hfi_plat_bufs_v6.c +f:drivers/media/platform/qcom/venus/hfi_platform.c +f:drivers/media/platform/qcom/venus/hfi_platform.h +f:drivers/media/platform/qcom/venus/hfi_platform_v4.c +f:drivers/media/platform/qcom/venus/hfi_platform_v6.c +f:drivers/media/platform/qcom/venus/hfi_venus.c +f:drivers/media/platform/qcom/venus/hfi_venus.h +f:drivers/media/platform/qcom/venus/hfi_venus_io.h +f:drivers/media/platform/qcom/venus/pm_helpers.c +f:drivers/media/platform/qcom/venus/pm_helpers.h +f:drivers/media/platform/qcom/venus/vdec.c +f:drivers/media/platform/qcom/venus/vdec.h +f:drivers/media/platform/qcom/venus/vdec_ctrls.c +f:drivers/media/platform/qcom/venus/venc.c +f:drivers/media/platform/qcom/venus/venc.h +f:drivers/media/platform/qcom/venus/venc_ctrls.c +f:drivers/media/platform/raspberrypi/Kconfig +f:drivers/media/platform/raspberrypi/Makefile +f:drivers/media/platform/raspberrypi/pisp_be/Kconfig +f:drivers/media/platform/raspberrypi/pisp_be/Makefile +f:drivers/media/platform/raspberrypi/pisp_be/pisp_be.c +f:drivers/media/platform/raspberrypi/pisp_be/pisp_be_formats.h +f:drivers/media/platform/raspberrypi/rp1-cfe/Kconfig +f:drivers/media/platform/raspberrypi/rp1-cfe/Makefile +f:drivers/media/platform/raspberrypi/rp1-cfe/cfe-fmts.h +f:drivers/media/platform/raspberrypi/rp1-cfe/cfe-trace.h +f:drivers/media/platform/raspberrypi/rp1-cfe/cfe.c +f:drivers/media/platform/raspberrypi/rp1-cfe/cfe.h +f:drivers/media/platform/raspberrypi/rp1-cfe/csi2.c +f:drivers/media/platform/raspberrypi/rp1-cfe/csi2.h +f:drivers/media/platform/raspberrypi/rp1-cfe/dphy.c +f:drivers/media/platform/raspberrypi/rp1-cfe/dphy.h +f:drivers/media/platform/raspberrypi/rp1-cfe/pisp-fe.c +f:drivers/media/platform/raspberrypi/rp1-cfe/pisp-fe.h +f:drivers/media/platform/renesas/Kconfig +f:drivers/media/platform/renesas/Makefile +f:drivers/media/platform/renesas/rcar-csi2.c +f:drivers/media/platform/renesas/rcar-fcp.c +f:drivers/media/platform/renesas/rcar-isp/Kconfig +f:drivers/media/platform/renesas/rcar-isp/Makefile +f:drivers/media/platform/renesas/rcar-isp/csisp.c +f:drivers/media/platform/renesas/rcar-vin/Kconfig +f:drivers/media/platform/renesas/rcar-vin/Makefile +f:drivers/media/platform/renesas/rcar-vin/rcar-core.c +f:drivers/media/platform/renesas/rcar-vin/rcar-dma.c +f:drivers/media/platform/renesas/rcar-vin/rcar-v4l2.c +f:drivers/media/platform/renesas/rcar-vin/rcar-vin.h +f:drivers/media/platform/renesas/rcar_drif.c +f:drivers/media/platform/renesas/rcar_fdp1.c +f:drivers/media/platform/renesas/rcar_jpu.c +f:drivers/media/platform/renesas/renesas-ceu.c +f:drivers/media/platform/renesas/rzg2l-cru/Kconfig +f:drivers/media/platform/renesas/rzg2l-cru/Makefile +f:drivers/media/platform/renesas/rzg2l-cru/rzg2l-core.c +f:drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h +f:drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h +f:drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c +f:drivers/media/platform/renesas/rzg2l-cru/rzg2l-ip.c +f:drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +f:drivers/media/platform/renesas/sh_vou.c +f:drivers/media/platform/renesas/vsp1/Makefile +f:drivers/media/platform/renesas/vsp1/vsp1.h +f:drivers/media/platform/renesas/vsp1/vsp1_brx.c +f:drivers/media/platform/renesas/vsp1/vsp1_brx.h +f:drivers/media/platform/renesas/vsp1/vsp1_clu.c +f:drivers/media/platform/renesas/vsp1/vsp1_clu.h +f:drivers/media/platform/renesas/vsp1/vsp1_dl.c +f:drivers/media/platform/renesas/vsp1/vsp1_dl.h +f:drivers/media/platform/renesas/vsp1/vsp1_drm.c +f:drivers/media/platform/renesas/vsp1/vsp1_drm.h +f:drivers/media/platform/renesas/vsp1/vsp1_drv.c +f:drivers/media/platform/renesas/vsp1/vsp1_entity.c +f:drivers/media/platform/renesas/vsp1/vsp1_entity.h +f:drivers/media/platform/renesas/vsp1/vsp1_hgo.c +f:drivers/media/platform/renesas/vsp1/vsp1_hgo.h +f:drivers/media/platform/renesas/vsp1/vsp1_hgt.c +f:drivers/media/platform/renesas/vsp1/vsp1_hgt.h +f:drivers/media/platform/renesas/vsp1/vsp1_histo.c +f:drivers/media/platform/renesas/vsp1/vsp1_histo.h +f:drivers/media/platform/renesas/vsp1/vsp1_hsit.c +f:drivers/media/platform/renesas/vsp1/vsp1_hsit.h +f:drivers/media/platform/renesas/vsp1/vsp1_iif.c +f:drivers/media/platform/renesas/vsp1/vsp1_iif.h +f:drivers/media/platform/renesas/vsp1/vsp1_lif.c +f:drivers/media/platform/renesas/vsp1/vsp1_lif.h +f:drivers/media/platform/renesas/vsp1/vsp1_lut.c +f:drivers/media/platform/renesas/vsp1/vsp1_lut.h +f:drivers/media/platform/renesas/vsp1/vsp1_pipe.c +f:drivers/media/platform/renesas/vsp1/vsp1_pipe.h +f:drivers/media/platform/renesas/vsp1/vsp1_regs.h +f:drivers/media/platform/renesas/vsp1/vsp1_rpf.c +f:drivers/media/platform/renesas/vsp1/vsp1_rwpf.c +f:drivers/media/platform/renesas/vsp1/vsp1_rwpf.h +f:drivers/media/platform/renesas/vsp1/vsp1_sru.c +f:drivers/media/platform/renesas/vsp1/vsp1_sru.h +f:drivers/media/platform/renesas/vsp1/vsp1_uds.c +f:drivers/media/platform/renesas/vsp1/vsp1_uds.h +f:drivers/media/platform/renesas/vsp1/vsp1_uif.c +f:drivers/media/platform/renesas/vsp1/vsp1_uif.h +f:drivers/media/platform/renesas/vsp1/vsp1_video.c +f:drivers/media/platform/renesas/vsp1/vsp1_video.h +f:drivers/media/platform/renesas/vsp1/vsp1_vspx.c +f:drivers/media/platform/renesas/vsp1/vsp1_vspx.h +f:drivers/media/platform/renesas/vsp1/vsp1_wpf.c +f:drivers/media/platform/rockchip/Kconfig +f:drivers/media/platform/rockchip/Makefile +f:drivers/media/platform/rockchip/rga/Kconfig +f:drivers/media/platform/rockchip/rga/Makefile +f:drivers/media/platform/rockchip/rga/rga-buf.c +f:drivers/media/platform/rockchip/rga/rga-hw.c +f:drivers/media/platform/rockchip/rga/rga-hw.h +f:drivers/media/platform/rockchip/rga/rga.c +f:drivers/media/platform/rockchip/rga/rga.h +f:drivers/media/platform/rockchip/rkisp1/Kconfig +f:drivers/media/platform/rockchip/rkisp1/Makefile +f:drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c +f:drivers/media/platform/rockchip/rkisp1/rkisp1-common.c +f:drivers/media/platform/rockchip/rkisp1/rkisp1-common.h +f:drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c +f:drivers/media/platform/rockchip/rkisp1/rkisp1-csi.h +f:drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c +f:drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c +f:drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c +f:drivers/media/platform/rockchip/rkisp1/rkisp1-params.c +f:drivers/media/platform/rockchip/rkisp1/rkisp1-regs.h +f:drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c +f:drivers/media/platform/rockchip/rkisp1/rkisp1-stats.c +f:drivers/media/platform/rockchip/rkvdec/Kconfig +f:drivers/media/platform/rockchip/rkvdec/Makefile +f:drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c +f:drivers/media/platform/rockchip/rkvdec/rkvdec-regs.h +f:drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c +f:drivers/media/platform/rockchip/rkvdec/rkvdec.c +f:drivers/media/platform/rockchip/rkvdec/rkvdec.h +f:drivers/media/platform/samsung/Kconfig +f:drivers/media/platform/samsung/Makefile +f:drivers/media/platform/samsung/exynos-gsc/Kconfig +f:drivers/media/platform/samsung/exynos-gsc/Makefile +f:drivers/media/platform/samsung/exynos-gsc/gsc-core.c +f:drivers/media/platform/samsung/exynos-gsc/gsc-core.h +f:drivers/media/platform/samsung/exynos-gsc/gsc-m2m.c +f:drivers/media/platform/samsung/exynos-gsc/gsc-regs.c +f:drivers/media/platform/samsung/exynos-gsc/gsc-regs.h +f:drivers/media/platform/samsung/exynos4-is/Kconfig +f:drivers/media/platform/samsung/exynos4-is/Makefile +f:drivers/media/platform/samsung/exynos4-is/common.c +f:drivers/media/platform/samsung/exynos4-is/common.h +f:drivers/media/platform/samsung/exynos4-is/fimc-capture.c +f:drivers/media/platform/samsung/exynos4-is/fimc-core.c +f:drivers/media/platform/samsung/exynos4-is/fimc-core.h +f:drivers/media/platform/samsung/exynos4-is/fimc-is-command.h +f:drivers/media/platform/samsung/exynos4-is/fimc-is-errno.c +f:drivers/media/platform/samsung/exynos4-is/fimc-is-errno.h +f:drivers/media/platform/samsung/exynos4-is/fimc-is-i2c.c +f:drivers/media/platform/samsung/exynos4-is/fimc-is-i2c.h +f:drivers/media/platform/samsung/exynos4-is/fimc-is-param.c +f:drivers/media/platform/samsung/exynos4-is/fimc-is-param.h +f:drivers/media/platform/samsung/exynos4-is/fimc-is-regs.c +f:drivers/media/platform/samsung/exynos4-is/fimc-is-regs.h +f:drivers/media/platform/samsung/exynos4-is/fimc-is-sensor.c +f:drivers/media/platform/samsung/exynos4-is/fimc-is-sensor.h +f:drivers/media/platform/samsung/exynos4-is/fimc-is.c +f:drivers/media/platform/samsung/exynos4-is/fimc-is.h +f:drivers/media/platform/samsung/exynos4-is/fimc-isp-video.c +f:drivers/media/platform/samsung/exynos4-is/fimc-isp-video.h +f:drivers/media/platform/samsung/exynos4-is/fimc-isp.c +f:drivers/media/platform/samsung/exynos4-is/fimc-isp.h +f:drivers/media/platform/samsung/exynos4-is/fimc-lite-reg.c +f:drivers/media/platform/samsung/exynos4-is/fimc-lite-reg.h +f:drivers/media/platform/samsung/exynos4-is/fimc-lite.c +f:drivers/media/platform/samsung/exynos4-is/fimc-lite.h +f:drivers/media/platform/samsung/exynos4-is/fimc-m2m.c +f:drivers/media/platform/samsung/exynos4-is/fimc-reg.c +f:drivers/media/platform/samsung/exynos4-is/fimc-reg.h +f:drivers/media/platform/samsung/exynos4-is/media-dev.c +f:drivers/media/platform/samsung/exynos4-is/media-dev.h +f:drivers/media/platform/samsung/exynos4-is/mipi-csis.c +f:drivers/media/platform/samsung/exynos4-is/mipi-csis.h +f:drivers/media/platform/samsung/s3c-camif/Kconfig +f:drivers/media/platform/samsung/s3c-camif/Makefile +f:drivers/media/platform/samsung/s3c-camif/camif-capture.c +f:drivers/media/platform/samsung/s3c-camif/camif-core.c +f:drivers/media/platform/samsung/s3c-camif/camif-core.h +f:drivers/media/platform/samsung/s3c-camif/camif-regs.c +f:drivers/media/platform/samsung/s3c-camif/camif-regs.h +f:drivers/media/platform/samsung/s5p-g2d/Kconfig +f:drivers/media/platform/samsung/s5p-g2d/Makefile +f:drivers/media/platform/samsung/s5p-g2d/g2d-hw.c +f:drivers/media/platform/samsung/s5p-g2d/g2d-regs.h +f:drivers/media/platform/samsung/s5p-g2d/g2d.c +f:drivers/media/platform/samsung/s5p-g2d/g2d.h +f:drivers/media/platform/samsung/s5p-jpeg/Kconfig +f:drivers/media/platform/samsung/s5p-jpeg/Makefile +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-core.h +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-hw-exynos3250.c +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-hw-exynos3250.h +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-hw-exynos4.c +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-hw-exynos4.h +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-hw-s5p.c +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-hw-s5p.h +f:drivers/media/platform/samsung/s5p-jpeg/jpeg-regs.h +f:drivers/media/platform/samsung/s5p-mfc/Kconfig +f:drivers/media/platform/samsung/s5p-mfc/Makefile +f:drivers/media/platform/samsung/s5p-mfc/regs-mfc-v10.h +f:drivers/media/platform/samsung/s5p-mfc/regs-mfc-v12.h +f:drivers/media/platform/samsung/s5p-mfc/regs-mfc-v6.h +f:drivers/media/platform/samsung/s5p-mfc/regs-mfc-v7.h +f:drivers/media/platform/samsung/s5p-mfc/regs-mfc-v8.h +f:drivers/media/platform/samsung/s5p-mfc/regs-mfc.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_cmd.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_cmd.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_cmd_v5.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_cmd_v5.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_cmd_v6.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_cmd_v6.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_common.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_ctrl.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_ctrl.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_debug.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_dec.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_intr.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_intr.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_iommu.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v5.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v5.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.h +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_pm.c +f:drivers/media/platform/samsung/s5p-mfc/s5p_mfc_pm.h +f:drivers/media/platform/st/Kconfig +f:drivers/media/platform/st/Makefile +f:drivers/media/platform/st/sti/Kconfig +f:drivers/media/platform/st/sti/Makefile +f:drivers/media/platform/st/sti/bdisp/Kconfig +f:drivers/media/platform/st/sti/bdisp/Makefile +f:drivers/media/platform/st/sti/bdisp/bdisp-debug.c +f:drivers/media/platform/st/sti/bdisp/bdisp-filter.h +f:drivers/media/platform/st/sti/bdisp/bdisp-hw.c +f:drivers/media/platform/st/sti/bdisp/bdisp-reg.h +f:drivers/media/platform/st/sti/bdisp/bdisp-v4l2.c +f:drivers/media/platform/st/sti/bdisp/bdisp.h +f:drivers/media/platform/st/sti/c8sectpfe/Kconfig +f:drivers/media/platform/st/sti/c8sectpfe/Makefile +f:drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.c +f:drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-common.h +f:drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.c +f:drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-core.h +f:drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.c +f:drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-debugfs.h +f:drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.c +f:drivers/media/platform/st/sti/c8sectpfe/c8sectpfe-dvb.h +f:drivers/media/platform/st/sti/delta/Kconfig +f:drivers/media/platform/st/sti/delta/Makefile +f:drivers/media/platform/st/sti/delta/delta-cfg.h +f:drivers/media/platform/st/sti/delta/delta-debug.c +f:drivers/media/platform/st/sti/delta/delta-debug.h +f:drivers/media/platform/st/sti/delta/delta-ipc.c +f:drivers/media/platform/st/sti/delta/delta-ipc.h +f:drivers/media/platform/st/sti/delta/delta-mem.c +f:drivers/media/platform/st/sti/delta/delta-mem.h +f:drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c +f:drivers/media/platform/st/sti/delta/delta-mjpeg-fw.h +f:drivers/media/platform/st/sti/delta/delta-mjpeg-hdr.c +f:drivers/media/platform/st/sti/delta/delta-mjpeg.h +f:drivers/media/platform/st/sti/delta/delta-v4l2.c +f:drivers/media/platform/st/sti/delta/delta.h +f:drivers/media/platform/st/sti/hva/Kconfig +f:drivers/media/platform/st/sti/hva/Makefile +f:drivers/media/platform/st/sti/hva/hva-debugfs.c +f:drivers/media/platform/st/sti/hva/hva-h264.c +f:drivers/media/platform/st/sti/hva/hva-hw.c +f:drivers/media/platform/st/sti/hva/hva-hw.h +f:drivers/media/platform/st/sti/hva/hva-mem.c +f:drivers/media/platform/st/sti/hva/hva-mem.h +f:drivers/media/platform/st/sti/hva/hva-v4l2.c +f:drivers/media/platform/st/sti/hva/hva.h +f:drivers/media/platform/st/stm32/Kconfig +f:drivers/media/platform/st/stm32/Makefile +f:drivers/media/platform/st/stm32/dma2d/dma2d-hw.c +f:drivers/media/platform/st/stm32/dma2d/dma2d-regs.h +f:drivers/media/platform/st/stm32/dma2d/dma2d.c +f:drivers/media/platform/st/stm32/dma2d/dma2d.h +f:drivers/media/platform/st/stm32/stm32-csi.c +f:drivers/media/platform/st/stm32/stm32-dcmi.c +f:drivers/media/platform/st/stm32/stm32-dcmipp/Makefile +f:drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-bytecap.c +f:drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-byteproc.c +f:drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-common.c +f:drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-common.h +f:drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-core.c +f:drivers/media/platform/st/stm32/stm32-dcmipp/dcmipp-input.c +f:drivers/media/platform/sunxi/Kconfig +f:drivers/media/platform/sunxi/Makefile +f:drivers/media/platform/sunxi/sun4i-csi/Kconfig +f:drivers/media/platform/sunxi/sun4i-csi/Makefile +f:drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c +f:drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h +f:drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c +f:drivers/media/platform/sunxi/sun4i-csi/sun4i_v4l2.c +f:drivers/media/platform/sunxi/sun6i-csi/Kconfig +f:drivers/media/platform/sunxi/sun6i-csi/Makefile +f:drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c +f:drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h +f:drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c +f:drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.h +f:drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c +f:drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.h +f:drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_reg.h +f:drivers/media/platform/sunxi/sun6i-mipi-csi2/Kconfig +f:drivers/media/platform/sunxi/sun6i-mipi-csi2/Makefile +f:drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c +f:drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.h +f:drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2_reg.h +f:drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/Kconfig +f:drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/Makefile +f:drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_dphy.c +f:drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_dphy.h +f:drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c +f:drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.h +f:drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2_reg.h +f:drivers/media/platform/sunxi/sun8i-di/Kconfig +f:drivers/media/platform/sunxi/sun8i-di/Makefile +f:drivers/media/platform/sunxi/sun8i-di/sun8i-di.c +f:drivers/media/platform/sunxi/sun8i-di/sun8i-di.h +f:drivers/media/platform/sunxi/sun8i-rotate/Kconfig +f:drivers/media/platform/sunxi/sun8i-rotate/Makefile +f:drivers/media/platform/sunxi/sun8i-rotate/sun8i-formats.h +f:drivers/media/platform/sunxi/sun8i-rotate/sun8i-rotate.h +f:drivers/media/platform/sunxi/sun8i-rotate/sun8i_formats.c +f:drivers/media/platform/sunxi/sun8i-rotate/sun8i_rotate.c +f:drivers/media/platform/synopsys/Kconfig +f:drivers/media/platform/synopsys/Makefile +f:drivers/media/platform/synopsys/hdmirx/Kconfig +f:drivers/media/platform/synopsys/hdmirx/Makefile +f:drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c +f:drivers/media/platform/synopsys/hdmirx/snps_hdmirx.h +f:drivers/media/platform/synopsys/hdmirx/snps_hdmirx_cec.c +f:drivers/media/platform/synopsys/hdmirx/snps_hdmirx_cec.h +f:drivers/media/platform/ti/Kconfig +f:drivers/media/platform/ti/Makefile +f:drivers/media/platform/ti/am437x/Kconfig +f:drivers/media/platform/ti/am437x/Makefile +f:drivers/media/platform/ti/am437x/am437x-vpfe.c +f:drivers/media/platform/ti/am437x/am437x-vpfe.h +f:drivers/media/platform/ti/am437x/am437x-vpfe_regs.h +f:drivers/media/platform/ti/cal/Makefile +f:drivers/media/platform/ti/cal/cal-camerarx.c +f:drivers/media/platform/ti/cal/cal-video.c +f:drivers/media/platform/ti/cal/cal.c +f:drivers/media/platform/ti/cal/cal.h +f:drivers/media/platform/ti/cal/cal_regs.h +f:drivers/media/platform/ti/davinci/Kconfig +f:drivers/media/platform/ti/davinci/Makefile +f:drivers/media/platform/ti/davinci/vpif.c +f:drivers/media/platform/ti/davinci/vpif.h +f:drivers/media/platform/ti/davinci/vpif_capture.c +f:drivers/media/platform/ti/davinci/vpif_capture.h +f:drivers/media/platform/ti/davinci/vpif_display.c +f:drivers/media/platform/ti/davinci/vpif_display.h +f:drivers/media/platform/ti/j721e-csi2rx/Makefile +f:drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c +f:drivers/media/platform/ti/omap/Kconfig +f:drivers/media/platform/ti/omap/Makefile +f:drivers/media/platform/ti/omap/omap_vout.c +f:drivers/media/platform/ti/omap/omap_vout_vrfb.c +f:drivers/media/platform/ti/omap/omap_vout_vrfb.h +f:drivers/media/platform/ti/omap/omap_voutdef.h +f:drivers/media/platform/ti/omap/omap_voutlib.c +f:drivers/media/platform/ti/omap/omap_voutlib.h +f:drivers/media/platform/ti/omap3isp/Kconfig +f:drivers/media/platform/ti/omap3isp/Makefile +f:drivers/media/platform/ti/omap3isp/cfa_coef_table.h +f:drivers/media/platform/ti/omap3isp/gamma_table.h +f:drivers/media/platform/ti/omap3isp/isp.c +f:drivers/media/platform/ti/omap3isp/isp.h +f:drivers/media/platform/ti/omap3isp/ispccdc.c +f:drivers/media/platform/ti/omap3isp/ispccdc.h +f:drivers/media/platform/ti/omap3isp/ispccp2.c +f:drivers/media/platform/ti/omap3isp/ispccp2.h +f:drivers/media/platform/ti/omap3isp/ispcsi2.c +f:drivers/media/platform/ti/omap3isp/ispcsi2.h +f:drivers/media/platform/ti/omap3isp/ispcsiphy.c +f:drivers/media/platform/ti/omap3isp/ispcsiphy.h +f:drivers/media/platform/ti/omap3isp/isph3a.h +f:drivers/media/platform/ti/omap3isp/isph3a_aewb.c +f:drivers/media/platform/ti/omap3isp/isph3a_af.c +f:drivers/media/platform/ti/omap3isp/isphist.c +f:drivers/media/platform/ti/omap3isp/isphist.h +f:drivers/media/platform/ti/omap3isp/isppreview.c +f:drivers/media/platform/ti/omap3isp/isppreview.h +f:drivers/media/platform/ti/omap3isp/ispreg.h +f:drivers/media/platform/ti/omap3isp/ispresizer.c +f:drivers/media/platform/ti/omap3isp/ispresizer.h +f:drivers/media/platform/ti/omap3isp/ispstat.c +f:drivers/media/platform/ti/omap3isp/ispstat.h +f:drivers/media/platform/ti/omap3isp/ispvideo.c +f:drivers/media/platform/ti/omap3isp/ispvideo.h +f:drivers/media/platform/ti/omap3isp/luma_enhance_table.h +f:drivers/media/platform/ti/omap3isp/noise_filter_table.h +f:drivers/media/platform/ti/omap3isp/omap3isp.h +f:drivers/media/platform/ti/vpe/Makefile +f:drivers/media/platform/ti/vpe/csc.c +f:drivers/media/platform/ti/vpe/csc.h +f:drivers/media/platform/ti/vpe/sc.c +f:drivers/media/platform/ti/vpe/sc.h +f:drivers/media/platform/ti/vpe/sc_coeff.h +f:drivers/media/platform/ti/vpe/vpdma.c +f:drivers/media/platform/ti/vpe/vpdma.h +f:drivers/media/platform/ti/vpe/vpdma_priv.h +f:drivers/media/platform/ti/vpe/vpe.c +f:drivers/media/platform/ti/vpe/vpe_regs.h +f:drivers/media/platform/verisilicon/Kconfig +f:drivers/media/platform/verisilicon/Makefile +f:drivers/media/platform/verisilicon/hantro.h +f:drivers/media/platform/verisilicon/hantro_drv.c +f:drivers/media/platform/verisilicon/hantro_g1.c +f:drivers/media/platform/verisilicon/hantro_g1_h264_dec.c +f:drivers/media/platform/verisilicon/hantro_g1_mpeg2_dec.c +f:drivers/media/platform/verisilicon/hantro_g1_regs.h +f:drivers/media/platform/verisilicon/hantro_g1_vp8_dec.c +f:drivers/media/platform/verisilicon/hantro_g2.c +f:drivers/media/platform/verisilicon/hantro_g2_hevc_dec.c +f:drivers/media/platform/verisilicon/hantro_g2_regs.h +f:drivers/media/platform/verisilicon/hantro_g2_vp9_dec.c +f:drivers/media/platform/verisilicon/hantro_h1_jpeg_enc.c +f:drivers/media/platform/verisilicon/hantro_h1_regs.h +f:drivers/media/platform/verisilicon/hantro_h264.c +f:drivers/media/platform/verisilicon/hantro_hevc.c +f:drivers/media/platform/verisilicon/hantro_hw.h +f:drivers/media/platform/verisilicon/hantro_jpeg.c +f:drivers/media/platform/verisilicon/hantro_jpeg.h +f:drivers/media/platform/verisilicon/hantro_mpeg2.c +f:drivers/media/platform/verisilicon/hantro_postproc.c +f:drivers/media/platform/verisilicon/hantro_v4l2.c +f:drivers/media/platform/verisilicon/hantro_v4l2.h +f:drivers/media/platform/verisilicon/hantro_vp8.c +f:drivers/media/platform/verisilicon/hantro_vp9.c +f:drivers/media/platform/verisilicon/hantro_vp9.h +f:drivers/media/platform/verisilicon/imx8m_vpu_hw.c +f:drivers/media/platform/verisilicon/rockchip_av1_entropymode.c +f:drivers/media/platform/verisilicon/rockchip_av1_entropymode.h +f:drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c +f:drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h +f:drivers/media/platform/verisilicon/rockchip_vpu2_hw_h264_dec.c +f:drivers/media/platform/verisilicon/rockchip_vpu2_hw_jpeg_enc.c +f:drivers/media/platform/verisilicon/rockchip_vpu2_hw_mpeg2_dec.c +f:drivers/media/platform/verisilicon/rockchip_vpu2_hw_vp8_dec.c +f:drivers/media/platform/verisilicon/rockchip_vpu2_regs.h +f:drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c +f:drivers/media/platform/verisilicon/rockchip_vpu981_regs.h +f:drivers/media/platform/verisilicon/rockchip_vpu_hw.c +f:drivers/media/platform/verisilicon/sama5d4_vdec_hw.c +f:drivers/media/platform/verisilicon/stm32mp25_vpu_hw.c +f:drivers/media/platform/verisilicon/sunxi_vpu_hw.c +f:drivers/media/platform/via/Kconfig +f:drivers/media/platform/via/Makefile +f:drivers/media/platform/via/via-camera.c +f:drivers/media/platform/via/via-camera.h +f:drivers/media/platform/video-mux.c +f:drivers/media/platform/xilinx/Kconfig +f:drivers/media/platform/xilinx/Makefile +f:drivers/media/platform/xilinx/xilinx-csi2rxss.c +f:drivers/media/platform/xilinx/xilinx-dma.c +f:drivers/media/platform/xilinx/xilinx-dma.h +f:drivers/media/platform/xilinx/xilinx-tpg.c +f:drivers/media/platform/xilinx/xilinx-vip.c +f:drivers/media/platform/xilinx/xilinx-vip.h +f:drivers/media/platform/xilinx/xilinx-vipp.c +f:drivers/media/platform/xilinx/xilinx-vipp.h +f:drivers/media/platform/xilinx/xilinx-vtc.c +f:drivers/media/platform/xilinx/xilinx-vtc.h +f:drivers/media/radio/Kconfig +f:drivers/media/radio/Makefile +f:drivers/media/radio/dsbr100.c +f:drivers/media/radio/lm7000.h +f:drivers/media/radio/radio-aimslab.c +f:drivers/media/radio/radio-aztech.c +f:drivers/media/radio/radio-cadet.c +f:drivers/media/radio/radio-gemtek.c +f:drivers/media/radio/radio-isa.c +f:drivers/media/radio/radio-isa.h +f:drivers/media/radio/radio-keene.c +f:drivers/media/radio/radio-ma901.c +f:drivers/media/radio/radio-maxiradio.c +f:drivers/media/radio/radio-miropcm20.c +f:drivers/media/radio/radio-mr800.c +f:drivers/media/radio/radio-raremono.c +f:drivers/media/radio/radio-rtrack2.c +f:drivers/media/radio/radio-sf16fmi.c +f:drivers/media/radio/radio-sf16fmr2.c +f:drivers/media/radio/radio-shark.c +f:drivers/media/radio/radio-shark2.c +f:drivers/media/radio/radio-si476x.c +f:drivers/media/radio/radio-tea5764.c +f:drivers/media/radio/radio-tea5777.c +f:drivers/media/radio/radio-tea5777.h +f:drivers/media/radio/radio-terratec.c +f:drivers/media/radio/radio-timb.c +f:drivers/media/radio/radio-trust.c +f:drivers/media/radio/radio-typhoon.c +f:drivers/media/radio/radio-wl1273.c +f:drivers/media/radio/radio-zoltrix.c +f:drivers/media/radio/saa7706h.c +f:drivers/media/radio/si470x/Kconfig +f:drivers/media/radio/si470x/Makefile +f:drivers/media/radio/si470x/radio-si470x-common.c +f:drivers/media/radio/si470x/radio-si470x-i2c.c +f:drivers/media/radio/si470x/radio-si470x-usb.c +f:drivers/media/radio/si470x/radio-si470x.h +f:drivers/media/radio/si4713/Kconfig +f:drivers/media/radio/si4713/Makefile +f:drivers/media/radio/si4713/radio-platform-si4713.c +f:drivers/media/radio/si4713/radio-usb-si4713.c +f:drivers/media/radio/si4713/si4713.c +f:drivers/media/radio/si4713/si4713.h +f:drivers/media/radio/tea575x.c +f:drivers/media/radio/tef6862.c +f:drivers/media/rc/Kconfig +f:drivers/media/rc/Makefile +f:drivers/media/rc/ati_remote.c +f:drivers/media/rc/bpf-lirc.c +f:drivers/media/rc/ene_ir.c +f:drivers/media/rc/ene_ir.h +f:drivers/media/rc/fintek-cir.c +f:drivers/media/rc/fintek-cir.h +f:drivers/media/rc/gpio-ir-recv.c +f:drivers/media/rc/gpio-ir-tx.c +f:drivers/media/rc/igorplugusb.c +f:drivers/media/rc/iguanair.c +f:drivers/media/rc/img-ir/Kconfig +f:drivers/media/rc/img-ir/Makefile +f:drivers/media/rc/img-ir/img-ir-core.c +f:drivers/media/rc/img-ir/img-ir-hw.c +f:drivers/media/rc/img-ir/img-ir-hw.h +f:drivers/media/rc/img-ir/img-ir-jvc.c +f:drivers/media/rc/img-ir/img-ir-nec.c +f:drivers/media/rc/img-ir/img-ir-raw.c +f:drivers/media/rc/img-ir/img-ir-raw.h +f:drivers/media/rc/img-ir/img-ir-rc5.c +f:drivers/media/rc/img-ir/img-ir-rc6.c +f:drivers/media/rc/img-ir/img-ir-sanyo.c +f:drivers/media/rc/img-ir/img-ir-sharp.c +f:drivers/media/rc/img-ir/img-ir-sony.c +f:drivers/media/rc/img-ir/img-ir.h +f:drivers/media/rc/imon.c +f:drivers/media/rc/imon_raw.c +f:drivers/media/rc/ir-hix5hd2.c +f:drivers/media/rc/ir-imon-decoder.c +f:drivers/media/rc/ir-jvc-decoder.c +f:drivers/media/rc/ir-mce_kbd-decoder.c +f:drivers/media/rc/ir-nec-decoder.c +f:drivers/media/rc/ir-rc5-decoder.c +f:drivers/media/rc/ir-rc6-decoder.c +f:drivers/media/rc/ir-rcmm-decoder.c +f:drivers/media/rc/ir-sanyo-decoder.c +f:drivers/media/rc/ir-sharp-decoder.c +f:drivers/media/rc/ir-sony-decoder.c +f:drivers/media/rc/ir-spi.c +f:drivers/media/rc/ir-xmp-decoder.c +f:drivers/media/rc/ir_toy.c +f:drivers/media/rc/ite-cir.c +f:drivers/media/rc/ite-cir.h +f:drivers/media/rc/keymaps/Kconfig +f:drivers/media/rc/keymaps/Makefile +f:drivers/media/rc/keymaps/rc-adstech-dvb-t-pci.c +f:drivers/media/rc/keymaps/rc-alink-dtu-m.c +f:drivers/media/rc/keymaps/rc-anysee.c +f:drivers/media/rc/keymaps/rc-apac-viewcomp.c +f:drivers/media/rc/keymaps/rc-astrometa-t2hybrid.c +f:drivers/media/rc/keymaps/rc-asus-pc39.c +f:drivers/media/rc/keymaps/rc-asus-ps3-100.c +f:drivers/media/rc/keymaps/rc-ati-tv-wonder-hd-600.c +f:drivers/media/rc/keymaps/rc-ati-x10.c +f:drivers/media/rc/keymaps/rc-avermedia-a16d.c +f:drivers/media/rc/keymaps/rc-avermedia-cardbus.c +f:drivers/media/rc/keymaps/rc-avermedia-dvbt.c +f:drivers/media/rc/keymaps/rc-avermedia-m135a.c +f:drivers/media/rc/keymaps/rc-avermedia-m733a-rm-k6.c +f:drivers/media/rc/keymaps/rc-avermedia-rm-ks.c +f:drivers/media/rc/keymaps/rc-avermedia.c +f:drivers/media/rc/keymaps/rc-avertv-303.c +f:drivers/media/rc/keymaps/rc-azurewave-ad-tu700.c +f:drivers/media/rc/keymaps/rc-beelink-gs1.c +f:drivers/media/rc/keymaps/rc-beelink-mxiii.c +f:drivers/media/rc/keymaps/rc-behold-columbus.c +f:drivers/media/rc/keymaps/rc-behold.c +f:drivers/media/rc/keymaps/rc-budget-ci-old.c +f:drivers/media/rc/keymaps/rc-cec.c +f:drivers/media/rc/keymaps/rc-cinergy-1400.c +f:drivers/media/rc/keymaps/rc-cinergy.c +f:drivers/media/rc/keymaps/rc-ct-90405.c +f:drivers/media/rc/keymaps/rc-d680-dmb.c +f:drivers/media/rc/keymaps/rc-delock-61959.c +f:drivers/media/rc/keymaps/rc-dib0700-nec.c +f:drivers/media/rc/keymaps/rc-dib0700-rc5.c +f:drivers/media/rc/keymaps/rc-digitalnow-tinytwin.c +f:drivers/media/rc/keymaps/rc-digittrade.c +f:drivers/media/rc/keymaps/rc-dm1105-nec.c +f:drivers/media/rc/keymaps/rc-dntv-live-dvb-t.c +f:drivers/media/rc/keymaps/rc-dntv-live-dvbt-pro.c +f:drivers/media/rc/keymaps/rc-dreambox.c +f:drivers/media/rc/keymaps/rc-dtt200u.c +f:drivers/media/rc/keymaps/rc-dvbsky.c +f:drivers/media/rc/keymaps/rc-dvico-mce.c +f:drivers/media/rc/keymaps/rc-dvico-portable.c +f:drivers/media/rc/keymaps/rc-em-terratec.c +f:drivers/media/rc/keymaps/rc-encore-enltv-fm53.c +f:drivers/media/rc/keymaps/rc-encore-enltv.c +f:drivers/media/rc/keymaps/rc-encore-enltv2.c +f:drivers/media/rc/keymaps/rc-evga-indtube.c +f:drivers/media/rc/keymaps/rc-eztv.c +f:drivers/media/rc/keymaps/rc-flydvb.c +f:drivers/media/rc/keymaps/rc-flyvideo.c +f:drivers/media/rc/keymaps/rc-fusionhdtv-mce.c +f:drivers/media/rc/keymaps/rc-gadmei-rm008z.c +f:drivers/media/rc/keymaps/rc-geekbox.c +f:drivers/media/rc/keymaps/rc-genius-tvgo-a11mce.c +f:drivers/media/rc/keymaps/rc-gotview7135.c +f:drivers/media/rc/keymaps/rc-hauppauge.c +f:drivers/media/rc/keymaps/rc-hisi-poplar.c +f:drivers/media/rc/keymaps/rc-hisi-tv-demo.c +f:drivers/media/rc/keymaps/rc-imon-mce.c +f:drivers/media/rc/keymaps/rc-imon-pad.c +f:drivers/media/rc/keymaps/rc-imon-rsc.c +f:drivers/media/rc/keymaps/rc-iodata-bctv7e.c +f:drivers/media/rc/keymaps/rc-it913x-v1.c +f:drivers/media/rc/keymaps/rc-it913x-v2.c +f:drivers/media/rc/keymaps/rc-kaiomy.c +f:drivers/media/rc/keymaps/rc-khadas.c +f:drivers/media/rc/keymaps/rc-khamsin.c +f:drivers/media/rc/keymaps/rc-kworld-315u.c +f:drivers/media/rc/keymaps/rc-kworld-pc150u.c +f:drivers/media/rc/keymaps/rc-kworld-plus-tv-analog.c +f:drivers/media/rc/keymaps/rc-leadtek-y04g0051.c +f:drivers/media/rc/keymaps/rc-lme2510.c +f:drivers/media/rc/keymaps/rc-manli.c +f:drivers/media/rc/keymaps/rc-mecool-kii-pro.c +f:drivers/media/rc/keymaps/rc-mecool-kiii-pro.c +f:drivers/media/rc/keymaps/rc-medion-x10-digitainer.c +f:drivers/media/rc/keymaps/rc-medion-x10-or2x.c +f:drivers/media/rc/keymaps/rc-medion-x10.c +f:drivers/media/rc/keymaps/rc-minix-neo.c +f:drivers/media/rc/keymaps/rc-msi-digivox-ii.c +f:drivers/media/rc/keymaps/rc-msi-digivox-iii.c +f:drivers/media/rc/keymaps/rc-msi-tvanywhere-plus.c +f:drivers/media/rc/keymaps/rc-msi-tvanywhere.c +f:drivers/media/rc/keymaps/rc-mygica-utv3.c +f:drivers/media/rc/keymaps/rc-nebula.c +f:drivers/media/rc/keymaps/rc-nec-terratec-cinergy-xs.c +f:drivers/media/rc/keymaps/rc-norwood.c +f:drivers/media/rc/keymaps/rc-npgtech.c +f:drivers/media/rc/keymaps/rc-odroid.c +f:drivers/media/rc/keymaps/rc-pctv-sedna.c +f:drivers/media/rc/keymaps/rc-pine64.c +f:drivers/media/rc/keymaps/rc-pinnacle-color.c +f:drivers/media/rc/keymaps/rc-pinnacle-grey.c +f:drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c +f:drivers/media/rc/keymaps/rc-pixelview-002t.c +f:drivers/media/rc/keymaps/rc-pixelview-mk12.c +f:drivers/media/rc/keymaps/rc-pixelview-new.c +f:drivers/media/rc/keymaps/rc-pixelview.c +f:drivers/media/rc/keymaps/rc-powercolor-real-angel.c +f:drivers/media/rc/keymaps/rc-proteus-2309.c +f:drivers/media/rc/keymaps/rc-purpletv.c +f:drivers/media/rc/keymaps/rc-pv951.c +f:drivers/media/rc/keymaps/rc-rc6-mce.c +f:drivers/media/rc/keymaps/rc-real-audio-220-32-keys.c +f:drivers/media/rc/keymaps/rc-reddo.c +f:drivers/media/rc/keymaps/rc-siemens-gigaset-rc20.c +f:drivers/media/rc/keymaps/rc-snapstream-firefly.c +f:drivers/media/rc/keymaps/rc-streamzap.c +f:drivers/media/rc/keymaps/rc-su3000.c +f:drivers/media/rc/keymaps/rc-tanix-tx3mini.c +f:drivers/media/rc/keymaps/rc-tanix-tx5max.c +f:drivers/media/rc/keymaps/rc-tbs-nec.c +f:drivers/media/rc/keymaps/rc-technisat-ts35.c +f:drivers/media/rc/keymaps/rc-technisat-usb2.c +f:drivers/media/rc/keymaps/rc-terratec-cinergy-c-pci.c +f:drivers/media/rc/keymaps/rc-terratec-cinergy-s2-hd.c +f:drivers/media/rc/keymaps/rc-terratec-cinergy-xs.c +f:drivers/media/rc/keymaps/rc-terratec-slim-2.c +f:drivers/media/rc/keymaps/rc-terratec-slim.c +f:drivers/media/rc/keymaps/rc-tevii-nec.c +f:drivers/media/rc/keymaps/rc-tivo.c +f:drivers/media/rc/keymaps/rc-total-media-in-hand-02.c +f:drivers/media/rc/keymaps/rc-total-media-in-hand.c +f:drivers/media/rc/keymaps/rc-trekstor.c +f:drivers/media/rc/keymaps/rc-tt-1500.c +f:drivers/media/rc/keymaps/rc-twinhan-dtv-cab-ci.c +f:drivers/media/rc/keymaps/rc-twinhan1027.c +f:drivers/media/rc/keymaps/rc-vega-s9x.c +f:drivers/media/rc/keymaps/rc-videomate-m1f.c +f:drivers/media/rc/keymaps/rc-videomate-s350.c +f:drivers/media/rc/keymaps/rc-videomate-tv-pvr.c +f:drivers/media/rc/keymaps/rc-videostrong-kii-pro.c +f:drivers/media/rc/keymaps/rc-wetek-hub.c +f:drivers/media/rc/keymaps/rc-wetek-play2.c +f:drivers/media/rc/keymaps/rc-winfast-usbii-deluxe.c +f:drivers/media/rc/keymaps/rc-winfast.c +f:drivers/media/rc/keymaps/rc-x96max.c +f:drivers/media/rc/keymaps/rc-xbox-360.c +f:drivers/media/rc/keymaps/rc-xbox-dvd.c +f:drivers/media/rc/keymaps/rc-zx-irdec.c +f:drivers/media/rc/lirc_dev.c +f:drivers/media/rc/mceusb.c +f:drivers/media/rc/meson-ir-tx.c +f:drivers/media/rc/meson-ir.c +f:drivers/media/rc/mtk-cir.c +f:drivers/media/rc/nuvoton-cir.c +f:drivers/media/rc/nuvoton-cir.h +f:drivers/media/rc/pwm-ir-tx.c +f:drivers/media/rc/rc-core-priv.h +f:drivers/media/rc/rc-ir-raw.c +f:drivers/media/rc/rc-loopback.c +f:drivers/media/rc/rc-main.c +f:drivers/media/rc/redrat3.c +f:drivers/media/rc/serial_ir.c +f:drivers/media/rc/st_rc.c +f:drivers/media/rc/streamzap.c +f:drivers/media/rc/sunxi-cir.c +f:drivers/media/rc/ttusbir.c +f:drivers/media/rc/winbond-cir.c +f:drivers/media/rc/xbox_remote.c +f:drivers/media/spi/Kconfig +f:drivers/media/spi/Makefile +f:drivers/media/spi/cxd2880-spi.c +f:drivers/media/spi/gs1662.c +f:drivers/media/test-drivers/Kconfig +f:drivers/media/test-drivers/Makefile +f:drivers/media/test-drivers/vicodec/Kconfig +f:drivers/media/test-drivers/vicodec/Makefile +f:drivers/media/test-drivers/vicodec/codec-fwht.c +f:drivers/media/test-drivers/vicodec/codec-fwht.h +f:drivers/media/test-drivers/vicodec/codec-v4l2-fwht.c +f:drivers/media/test-drivers/vicodec/codec-v4l2-fwht.h +f:drivers/media/test-drivers/vicodec/vicodec-core.c +f:drivers/media/test-drivers/vidtv/Kconfig +f:drivers/media/test-drivers/vidtv/Makefile +f:drivers/media/test-drivers/vidtv/vidtv_bridge.c +f:drivers/media/test-drivers/vidtv/vidtv_bridge.h +f:drivers/media/test-drivers/vidtv/vidtv_channel.c +f:drivers/media/test-drivers/vidtv/vidtv_channel.h +f:drivers/media/test-drivers/vidtv/vidtv_common.c +f:drivers/media/test-drivers/vidtv/vidtv_common.h +f:drivers/media/test-drivers/vidtv/vidtv_demod.c +f:drivers/media/test-drivers/vidtv/vidtv_demod.h +f:drivers/media/test-drivers/vidtv/vidtv_encoder.h +f:drivers/media/test-drivers/vidtv/vidtv_mux.c +f:drivers/media/test-drivers/vidtv/vidtv_mux.h +f:drivers/media/test-drivers/vidtv/vidtv_pes.c +f:drivers/media/test-drivers/vidtv/vidtv_pes.h +f:drivers/media/test-drivers/vidtv/vidtv_psi.c +f:drivers/media/test-drivers/vidtv/vidtv_psi.h +f:drivers/media/test-drivers/vidtv/vidtv_s302m.c +f:drivers/media/test-drivers/vidtv/vidtv_s302m.h +f:drivers/media/test-drivers/vidtv/vidtv_ts.c +f:drivers/media/test-drivers/vidtv/vidtv_ts.h +f:drivers/media/test-drivers/vidtv/vidtv_tuner.c +f:drivers/media/test-drivers/vidtv/vidtv_tuner.h +f:drivers/media/test-drivers/vim2m.c +f:drivers/media/test-drivers/vimc/Kconfig +f:drivers/media/test-drivers/vimc/Makefile +f:drivers/media/test-drivers/vimc/vimc-capture.c +f:drivers/media/test-drivers/vimc/vimc-common.c +f:drivers/media/test-drivers/vimc/vimc-common.h +f:drivers/media/test-drivers/vimc/vimc-core.c +f:drivers/media/test-drivers/vimc/vimc-debayer.c +f:drivers/media/test-drivers/vimc/vimc-lens.c +f:drivers/media/test-drivers/vimc/vimc-scaler.c +f:drivers/media/test-drivers/vimc/vimc-sensor.c +f:drivers/media/test-drivers/vimc/vimc-streamer.c +f:drivers/media/test-drivers/vimc/vimc-streamer.h +f:drivers/media/test-drivers/visl/Kconfig +f:drivers/media/test-drivers/visl/Makefile +f:drivers/media/test-drivers/visl/visl-core.c +f:drivers/media/test-drivers/visl/visl-debugfs.c +f:drivers/media/test-drivers/visl/visl-debugfs.h +f:drivers/media/test-drivers/visl/visl-dec.c +f:drivers/media/test-drivers/visl/visl-dec.h +f:drivers/media/test-drivers/visl/visl-trace-av1.h +f:drivers/media/test-drivers/visl/visl-trace-fwht.h +f:drivers/media/test-drivers/visl/visl-trace-h264.h +f:drivers/media/test-drivers/visl/visl-trace-hevc.h +f:drivers/media/test-drivers/visl/visl-trace-mpeg2.h +f:drivers/media/test-drivers/visl/visl-trace-points.c +f:drivers/media/test-drivers/visl/visl-trace-vp8.h +f:drivers/media/test-drivers/visl/visl-trace-vp9.h +f:drivers/media/test-drivers/visl/visl-video.c +f:drivers/media/test-drivers/visl/visl-video.h +f:drivers/media/test-drivers/visl/visl.h +f:drivers/media/test-drivers/vivid/Kconfig +f:drivers/media/test-drivers/vivid/Makefile +f:drivers/media/test-drivers/vivid/vivid-cec.c +f:drivers/media/test-drivers/vivid/vivid-cec.h +f:drivers/media/test-drivers/vivid/vivid-core.c +f:drivers/media/test-drivers/vivid/vivid-core.h +f:drivers/media/test-drivers/vivid/vivid-ctrls.c +f:drivers/media/test-drivers/vivid/vivid-ctrls.h +f:drivers/media/test-drivers/vivid/vivid-kthread-cap.c +f:drivers/media/test-drivers/vivid/vivid-kthread-cap.h +f:drivers/media/test-drivers/vivid/vivid-kthread-out.c +f:drivers/media/test-drivers/vivid/vivid-kthread-out.h +f:drivers/media/test-drivers/vivid/vivid-kthread-touch.c +f:drivers/media/test-drivers/vivid/vivid-kthread-touch.h +f:drivers/media/test-drivers/vivid/vivid-meta-cap.c +f:drivers/media/test-drivers/vivid/vivid-meta-cap.h +f:drivers/media/test-drivers/vivid/vivid-meta-out.c +f:drivers/media/test-drivers/vivid/vivid-meta-out.h +f:drivers/media/test-drivers/vivid/vivid-osd.c +f:drivers/media/test-drivers/vivid/vivid-osd.h +f:drivers/media/test-drivers/vivid/vivid-radio-common.c +f:drivers/media/test-drivers/vivid/vivid-radio-common.h +f:drivers/media/test-drivers/vivid/vivid-radio-rx.c +f:drivers/media/test-drivers/vivid/vivid-radio-rx.h +f:drivers/media/test-drivers/vivid/vivid-radio-tx.c +f:drivers/media/test-drivers/vivid/vivid-radio-tx.h +f:drivers/media/test-drivers/vivid/vivid-rds-gen.c +f:drivers/media/test-drivers/vivid/vivid-rds-gen.h +f:drivers/media/test-drivers/vivid/vivid-sdr-cap.c +f:drivers/media/test-drivers/vivid/vivid-sdr-cap.h +f:drivers/media/test-drivers/vivid/vivid-touch-cap.c +f:drivers/media/test-drivers/vivid/vivid-touch-cap.h +f:drivers/media/test-drivers/vivid/vivid-vbi-cap.c +f:drivers/media/test-drivers/vivid/vivid-vbi-cap.h +f:drivers/media/test-drivers/vivid/vivid-vbi-gen.c +f:drivers/media/test-drivers/vivid/vivid-vbi-gen.h +f:drivers/media/test-drivers/vivid/vivid-vbi-out.c +f:drivers/media/test-drivers/vivid/vivid-vbi-out.h +f:drivers/media/test-drivers/vivid/vivid-vid-cap.c +f:drivers/media/test-drivers/vivid/vivid-vid-cap.h +f:drivers/media/test-drivers/vivid/vivid-vid-common.c +f:drivers/media/test-drivers/vivid/vivid-vid-common.h +f:drivers/media/test-drivers/vivid/vivid-vid-out.c +f:drivers/media/test-drivers/vivid/vivid-vid-out.h +f:drivers/media/tuners/Kconfig +f:drivers/media/tuners/Makefile +f:drivers/media/tuners/e4000.c +f:drivers/media/tuners/e4000.h +f:drivers/media/tuners/e4000_priv.h +f:drivers/media/tuners/fc0011.c +f:drivers/media/tuners/fc0011.h +f:drivers/media/tuners/fc0012-priv.h +f:drivers/media/tuners/fc0012.c +f:drivers/media/tuners/fc0012.h +f:drivers/media/tuners/fc0013-priv.h +f:drivers/media/tuners/fc0013.c +f:drivers/media/tuners/fc0013.h +f:drivers/media/tuners/fc001x-common.h +f:drivers/media/tuners/fc2580.c +f:drivers/media/tuners/fc2580.h +f:drivers/media/tuners/fc2580_priv.h +f:drivers/media/tuners/it913x.c +f:drivers/media/tuners/it913x.h +f:drivers/media/tuners/m88rs6000t.c +f:drivers/media/tuners/m88rs6000t.h +f:drivers/media/tuners/max2165.c +f:drivers/media/tuners/max2165.h +f:drivers/media/tuners/max2165_priv.h +f:drivers/media/tuners/mc44s803.c +f:drivers/media/tuners/mc44s803.h +f:drivers/media/tuners/mc44s803_priv.h +f:drivers/media/tuners/msi001.c +f:drivers/media/tuners/mt2060.c +f:drivers/media/tuners/mt2060.h +f:drivers/media/tuners/mt2060_priv.h +f:drivers/media/tuners/mt2063.c +f:drivers/media/tuners/mt2063.h +f:drivers/media/tuners/mt20xx.c +f:drivers/media/tuners/mt20xx.h +f:drivers/media/tuners/mt2131.c +f:drivers/media/tuners/mt2131.h +f:drivers/media/tuners/mt2131_priv.h +f:drivers/media/tuners/mt2266.c +f:drivers/media/tuners/mt2266.h +f:drivers/media/tuners/mxl301rf.c +f:drivers/media/tuners/mxl301rf.h +f:drivers/media/tuners/mxl5005s.c +f:drivers/media/tuners/mxl5005s.h +f:drivers/media/tuners/mxl5007t.c +f:drivers/media/tuners/mxl5007t.h +f:drivers/media/tuners/qm1d1b0004.c +f:drivers/media/tuners/qm1d1b0004.h +f:drivers/media/tuners/qm1d1c0042.c +f:drivers/media/tuners/qm1d1c0042.h +f:drivers/media/tuners/qt1010.c +f:drivers/media/tuners/qt1010.h +f:drivers/media/tuners/qt1010_priv.h +f:drivers/media/tuners/r820t.c +f:drivers/media/tuners/r820t.h +f:drivers/media/tuners/si2157.c +f:drivers/media/tuners/si2157.h +f:drivers/media/tuners/si2157_priv.h +f:drivers/media/tuners/tda18212.c +f:drivers/media/tuners/tda18212.h +f:drivers/media/tuners/tda18218.c +f:drivers/media/tuners/tda18218.h +f:drivers/media/tuners/tda18218_priv.h +f:drivers/media/tuners/tda18250.c +f:drivers/media/tuners/tda18250.h +f:drivers/media/tuners/tda18250_priv.h +f:drivers/media/tuners/tda18271-common.c +f:drivers/media/tuners/tda18271-fe.c +f:drivers/media/tuners/tda18271-maps.c +f:drivers/media/tuners/tda18271-priv.h +f:drivers/media/tuners/tda18271.h +f:drivers/media/tuners/tda827x.c +f:drivers/media/tuners/tda827x.h +f:drivers/media/tuners/tda8290.c +f:drivers/media/tuners/tda8290.h +f:drivers/media/tuners/tda9887.c +f:drivers/media/tuners/tda9887.h +f:drivers/media/tuners/tea5761.c +f:drivers/media/tuners/tea5761.h +f:drivers/media/tuners/tea5767.c +f:drivers/media/tuners/tea5767.h +f:drivers/media/tuners/tua9001.c +f:drivers/media/tuners/tua9001.h +f:drivers/media/tuners/tua9001_priv.h +f:drivers/media/tuners/tuner-i2c.h +f:drivers/media/tuners/tuner-simple.c +f:drivers/media/tuners/tuner-simple.h +f:drivers/media/tuners/tuner-types.c +f:drivers/media/tuners/xc2028-types.h +f:drivers/media/tuners/xc2028.c +f:drivers/media/tuners/xc2028.h +f:drivers/media/tuners/xc4000.c +f:drivers/media/tuners/xc4000.h +f:drivers/media/tuners/xc5000.c +f:drivers/media/tuners/xc5000.h +f:drivers/media/usb/Kconfig +f:drivers/media/usb/Makefile +f:drivers/media/usb/airspy/Kconfig +f:drivers/media/usb/airspy/Makefile +f:drivers/media/usb/airspy/airspy.c +f:drivers/media/usb/as102/Kconfig +f:drivers/media/usb/as102/Makefile +f:drivers/media/usb/as102/as102_drv.c +f:drivers/media/usb/as102/as102_drv.h +f:drivers/media/usb/as102/as102_fw.c +f:drivers/media/usb/as102/as102_fw.h +f:drivers/media/usb/as102/as102_usb_drv.c +f:drivers/media/usb/as102/as102_usb_drv.h +f:drivers/media/usb/as102/as10x_cmd.c +f:drivers/media/usb/as102/as10x_cmd.h +f:drivers/media/usb/as102/as10x_cmd_cfg.c +f:drivers/media/usb/as102/as10x_cmd_stream.c +f:drivers/media/usb/as102/as10x_handle.h +f:drivers/media/usb/au0828/Kconfig +f:drivers/media/usb/au0828/Makefile +f:drivers/media/usb/au0828/au0828-cards.c +f:drivers/media/usb/au0828/au0828-cards.h +f:drivers/media/usb/au0828/au0828-core.c +f:drivers/media/usb/au0828/au0828-dvb.c +f:drivers/media/usb/au0828/au0828-i2c.c +f:drivers/media/usb/au0828/au0828-input.c +f:drivers/media/usb/au0828/au0828-reg.h +f:drivers/media/usb/au0828/au0828-vbi.c +f:drivers/media/usb/au0828/au0828-video.c +f:drivers/media/usb/au0828/au0828.h +f:drivers/media/usb/b2c2/Kconfig +f:drivers/media/usb/b2c2/Makefile +f:drivers/media/usb/b2c2/flexcop-usb.c +f:drivers/media/usb/b2c2/flexcop-usb.h +f:drivers/media/usb/cx231xx/Kconfig +f:drivers/media/usb/cx231xx/Makefile +f:drivers/media/usb/cx231xx/cx231xx-417.c +f:drivers/media/usb/cx231xx/cx231xx-audio.c +f:drivers/media/usb/cx231xx/cx231xx-avcore.c +f:drivers/media/usb/cx231xx/cx231xx-cards.c +f:drivers/media/usb/cx231xx/cx231xx-conf-reg.h +f:drivers/media/usb/cx231xx/cx231xx-core.c +f:drivers/media/usb/cx231xx/cx231xx-dif.h +f:drivers/media/usb/cx231xx/cx231xx-dvb.c +f:drivers/media/usb/cx231xx/cx231xx-i2c.c +f:drivers/media/usb/cx231xx/cx231xx-input.c +f:drivers/media/usb/cx231xx/cx231xx-pcb-cfg.c +f:drivers/media/usb/cx231xx/cx231xx-pcb-cfg.h +f:drivers/media/usb/cx231xx/cx231xx-reg.h +f:drivers/media/usb/cx231xx/cx231xx-vbi.c +f:drivers/media/usb/cx231xx/cx231xx-vbi.h +f:drivers/media/usb/cx231xx/cx231xx-video.c +f:drivers/media/usb/cx231xx/cx231xx.h +f:drivers/media/usb/dvb-usb-v2/Kconfig +f:drivers/media/usb/dvb-usb-v2/Makefile +f:drivers/media/usb/dvb-usb-v2/af9015.c +f:drivers/media/usb/dvb-usb-v2/af9015.h +f:drivers/media/usb/dvb-usb-v2/af9035.c +f:drivers/media/usb/dvb-usb-v2/af9035.h +f:drivers/media/usb/dvb-usb-v2/anysee.c +f:drivers/media/usb/dvb-usb-v2/anysee.h +f:drivers/media/usb/dvb-usb-v2/au6610.c +f:drivers/media/usb/dvb-usb-v2/au6610.h +f:drivers/media/usb/dvb-usb-v2/az6007.c +f:drivers/media/usb/dvb-usb-v2/ce6230.c +f:drivers/media/usb/dvb-usb-v2/ce6230.h +f:drivers/media/usb/dvb-usb-v2/dvb_usb.h +f:drivers/media/usb/dvb-usb-v2/dvb_usb_common.h +f:drivers/media/usb/dvb-usb-v2/dvb_usb_core.c +f:drivers/media/usb/dvb-usb-v2/dvb_usb_urb.c +f:drivers/media/usb/dvb-usb-v2/dvbsky.c +f:drivers/media/usb/dvb-usb-v2/ec168.c +f:drivers/media/usb/dvb-usb-v2/ec168.h +f:drivers/media/usb/dvb-usb-v2/gl861.c +f:drivers/media/usb/dvb-usb-v2/lmedm04.c +f:drivers/media/usb/dvb-usb-v2/lmedm04.h +f:drivers/media/usb/dvb-usb-v2/mxl111sf-demod.c +f:drivers/media/usb/dvb-usb-v2/mxl111sf-demod.h +f:drivers/media/usb/dvb-usb-v2/mxl111sf-gpio.c +f:drivers/media/usb/dvb-usb-v2/mxl111sf-gpio.h +f:drivers/media/usb/dvb-usb-v2/mxl111sf-i2c.c +f:drivers/media/usb/dvb-usb-v2/mxl111sf-i2c.h +f:drivers/media/usb/dvb-usb-v2/mxl111sf-phy.c +f:drivers/media/usb/dvb-usb-v2/mxl111sf-phy.h +f:drivers/media/usb/dvb-usb-v2/mxl111sf-reg.h +f:drivers/media/usb/dvb-usb-v2/mxl111sf-tuner.c +f:drivers/media/usb/dvb-usb-v2/mxl111sf-tuner.h +f:drivers/media/usb/dvb-usb-v2/mxl111sf.c +f:drivers/media/usb/dvb-usb-v2/mxl111sf.h +f:drivers/media/usb/dvb-usb-v2/rtl28xxu.c +f:drivers/media/usb/dvb-usb-v2/rtl28xxu.h +f:drivers/media/usb/dvb-usb-v2/usb_urb.c +f:drivers/media/usb/dvb-usb-v2/zd1301.c +f:drivers/media/usb/dvb-usb/Kconfig +f:drivers/media/usb/dvb-usb/Makefile +f:drivers/media/usb/dvb-usb/a800.c +f:drivers/media/usb/dvb-usb/af9005-fe.c +f:drivers/media/usb/dvb-usb/af9005-remote.c +f:drivers/media/usb/dvb-usb/af9005-script.h +f:drivers/media/usb/dvb-usb/af9005.c +f:drivers/media/usb/dvb-usb/af9005.h +f:drivers/media/usb/dvb-usb/az6027.c +f:drivers/media/usb/dvb-usb/az6027.h +f:drivers/media/usb/dvb-usb/cinergyT2-core.c +f:drivers/media/usb/dvb-usb/cinergyT2-fe.c +f:drivers/media/usb/dvb-usb/cinergyT2.h +f:drivers/media/usb/dvb-usb/cxusb-analog.c +f:drivers/media/usb/dvb-usb/cxusb.c +f:drivers/media/usb/dvb-usb/cxusb.h +f:drivers/media/usb/dvb-usb/dib0700.h +f:drivers/media/usb/dvb-usb/dib0700_core.c +f:drivers/media/usb/dvb-usb/dib0700_devices.c +f:drivers/media/usb/dvb-usb/dib07x0.h +f:drivers/media/usb/dvb-usb/dibusb-common.c +f:drivers/media/usb/dvb-usb/dibusb-mb.c +f:drivers/media/usb/dvb-usb/dibusb-mc-common.c +f:drivers/media/usb/dvb-usb/dibusb-mc.c +f:drivers/media/usb/dvb-usb/dibusb.h +f:drivers/media/usb/dvb-usb/digitv.c +f:drivers/media/usb/dvb-usb/digitv.h +f:drivers/media/usb/dvb-usb/dtt200u-fe.c +f:drivers/media/usb/dvb-usb/dtt200u.c +f:drivers/media/usb/dvb-usb/dtt200u.h +f:drivers/media/usb/dvb-usb/dtv5100.c +f:drivers/media/usb/dvb-usb/dtv5100.h +f:drivers/media/usb/dvb-usb/dvb-usb-common.h +f:drivers/media/usb/dvb-usb/dvb-usb-dvb.c +f:drivers/media/usb/dvb-usb/dvb-usb-firmware.c +f:drivers/media/usb/dvb-usb/dvb-usb-i2c.c +f:drivers/media/usb/dvb-usb/dvb-usb-init.c +f:drivers/media/usb/dvb-usb/dvb-usb-remote.c +f:drivers/media/usb/dvb-usb/dvb-usb-urb.c +f:drivers/media/usb/dvb-usb/dvb-usb.h +f:drivers/media/usb/dvb-usb/dw2102.c +f:drivers/media/usb/dvb-usb/dw2102.h +f:drivers/media/usb/dvb-usb/gp8psk.c +f:drivers/media/usb/dvb-usb/gp8psk.h +f:drivers/media/usb/dvb-usb/m920x.c +f:drivers/media/usb/dvb-usb/m920x.h +f:drivers/media/usb/dvb-usb/nova-t-usb2.c +f:drivers/media/usb/dvb-usb/opera1.c +f:drivers/media/usb/dvb-usb/pctv452e.c +f:drivers/media/usb/dvb-usb/technisat-usb2.c +f:drivers/media/usb/dvb-usb/ttusb2.c +f:drivers/media/usb/dvb-usb/ttusb2.h +f:drivers/media/usb/dvb-usb/umt-010.c +f:drivers/media/usb/dvb-usb/usb-urb.c +f:drivers/media/usb/dvb-usb/vp702x-fe.c +f:drivers/media/usb/dvb-usb/vp702x.c +f:drivers/media/usb/dvb-usb/vp702x.h +f:drivers/media/usb/dvb-usb/vp7045-fe.c +f:drivers/media/usb/dvb-usb/vp7045.c +f:drivers/media/usb/dvb-usb/vp7045.h +f:drivers/media/usb/em28xx/Kconfig +f:drivers/media/usb/em28xx/Makefile +f:drivers/media/usb/em28xx/em28xx-audio.c +f:drivers/media/usb/em28xx/em28xx-camera.c +f:drivers/media/usb/em28xx/em28xx-cards.c +f:drivers/media/usb/em28xx/em28xx-core.c +f:drivers/media/usb/em28xx/em28xx-dvb.c +f:drivers/media/usb/em28xx/em28xx-i2c.c +f:drivers/media/usb/em28xx/em28xx-input.c +f:drivers/media/usb/em28xx/em28xx-reg.h +f:drivers/media/usb/em28xx/em28xx-v4l.h +f:drivers/media/usb/em28xx/em28xx-vbi.c +f:drivers/media/usb/em28xx/em28xx-video.c +f:drivers/media/usb/em28xx/em28xx.h +f:drivers/media/usb/go7007/Kconfig +f:drivers/media/usb/go7007/Makefile +f:drivers/media/usb/go7007/go7007-driver.c +f:drivers/media/usb/go7007/go7007-fw.c +f:drivers/media/usb/go7007/go7007-i2c.c +f:drivers/media/usb/go7007/go7007-loader.c +f:drivers/media/usb/go7007/go7007-priv.h +f:drivers/media/usb/go7007/go7007-usb.c +f:drivers/media/usb/go7007/go7007-v4l2.c +f:drivers/media/usb/go7007/s2250-board.c +f:drivers/media/usb/go7007/snd-go7007.c +f:drivers/media/usb/gspca/Kconfig +f:drivers/media/usb/gspca/Makefile +f:drivers/media/usb/gspca/autogain_functions.c +f:drivers/media/usb/gspca/benq.c +f:drivers/media/usb/gspca/conex.c +f:drivers/media/usb/gspca/cpia1.c +f:drivers/media/usb/gspca/dtcs033.c +f:drivers/media/usb/gspca/etoms.c +f:drivers/media/usb/gspca/finepix.c +f:drivers/media/usb/gspca/gl860/Kconfig +f:drivers/media/usb/gspca/gl860/Makefile +f:drivers/media/usb/gspca/gl860/gl860-mi1320.c +f:drivers/media/usb/gspca/gl860/gl860-mi2020.c +f:drivers/media/usb/gspca/gl860/gl860-ov2640.c +f:drivers/media/usb/gspca/gl860/gl860-ov9655.c +f:drivers/media/usb/gspca/gl860/gl860.c +f:drivers/media/usb/gspca/gl860/gl860.h +f:drivers/media/usb/gspca/gspca.c +f:drivers/media/usb/gspca/gspca.h +f:drivers/media/usb/gspca/jeilinj.c +f:drivers/media/usb/gspca/jl2005bcd.c +f:drivers/media/usb/gspca/jpeg.h +f:drivers/media/usb/gspca/kinect.c +f:drivers/media/usb/gspca/konica.c +f:drivers/media/usb/gspca/m5602/Kconfig +f:drivers/media/usb/gspca/m5602/Makefile +f:drivers/media/usb/gspca/m5602/m5602_bridge.h +f:drivers/media/usb/gspca/m5602/m5602_core.c +f:drivers/media/usb/gspca/m5602/m5602_mt9m111.c +f:drivers/media/usb/gspca/m5602/m5602_mt9m111.h +f:drivers/media/usb/gspca/m5602/m5602_ov7660.c +f:drivers/media/usb/gspca/m5602/m5602_ov7660.h +f:drivers/media/usb/gspca/m5602/m5602_ov9650.c +f:drivers/media/usb/gspca/m5602/m5602_ov9650.h +f:drivers/media/usb/gspca/m5602/m5602_po1030.c +f:drivers/media/usb/gspca/m5602/m5602_po1030.h +f:drivers/media/usb/gspca/m5602/m5602_s5k4aa.c +f:drivers/media/usb/gspca/m5602/m5602_s5k4aa.h +f:drivers/media/usb/gspca/m5602/m5602_s5k83a.c +f:drivers/media/usb/gspca/m5602/m5602_s5k83a.h +f:drivers/media/usb/gspca/m5602/m5602_sensor.h +f:drivers/media/usb/gspca/mars.c +f:drivers/media/usb/gspca/mr97310a.c +f:drivers/media/usb/gspca/nw80x.c +f:drivers/media/usb/gspca/ov519.c +f:drivers/media/usb/gspca/ov534.c +f:drivers/media/usb/gspca/ov534_9.c +f:drivers/media/usb/gspca/pac207.c +f:drivers/media/usb/gspca/pac7302.c +f:drivers/media/usb/gspca/pac7311.c +f:drivers/media/usb/gspca/pac_common.h +f:drivers/media/usb/gspca/se401.c +f:drivers/media/usb/gspca/se401.h +f:drivers/media/usb/gspca/sn9c2028.c +f:drivers/media/usb/gspca/sn9c2028.h +f:drivers/media/usb/gspca/sn9c20x.c +f:drivers/media/usb/gspca/sonixb.c +f:drivers/media/usb/gspca/sonixj.c +f:drivers/media/usb/gspca/spca1528.c +f:drivers/media/usb/gspca/spca500.c +f:drivers/media/usb/gspca/spca501.c +f:drivers/media/usb/gspca/spca505.c +f:drivers/media/usb/gspca/spca506.c +f:drivers/media/usb/gspca/spca508.c +f:drivers/media/usb/gspca/spca561.c +f:drivers/media/usb/gspca/sq905.c +f:drivers/media/usb/gspca/sq905c.c +f:drivers/media/usb/gspca/sq930x.c +f:drivers/media/usb/gspca/stk014.c +f:drivers/media/usb/gspca/stk1135.c +f:drivers/media/usb/gspca/stk1135.h +f:drivers/media/usb/gspca/stv0680.c +f:drivers/media/usb/gspca/stv06xx/Kconfig +f:drivers/media/usb/gspca/stv06xx/Makefile +f:drivers/media/usb/gspca/stv06xx/stv06xx.c +f:drivers/media/usb/gspca/stv06xx/stv06xx.h +f:drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.c +f:drivers/media/usb/gspca/stv06xx/stv06xx_hdcs.h +f:drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c +f:drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.h +f:drivers/media/usb/gspca/stv06xx/stv06xx_sensor.h +f:drivers/media/usb/gspca/stv06xx/stv06xx_st6422.c +f:drivers/media/usb/gspca/stv06xx/stv06xx_st6422.h +f:drivers/media/usb/gspca/stv06xx/stv06xx_vv6410.c +f:drivers/media/usb/gspca/stv06xx/stv06xx_vv6410.h +f:drivers/media/usb/gspca/sunplus.c +f:drivers/media/usb/gspca/t613.c +f:drivers/media/usb/gspca/topro.c +f:drivers/media/usb/gspca/touptek.c +f:drivers/media/usb/gspca/tv8532.c +f:drivers/media/usb/gspca/vc032x.c +f:drivers/media/usb/gspca/vicam.c +f:drivers/media/usb/gspca/w996Xcf.c +f:drivers/media/usb/gspca/xirlink_cit.c +f:drivers/media/usb/gspca/zc3xx-reg.h +f:drivers/media/usb/gspca/zc3xx.c +f:drivers/media/usb/hackrf/Kconfig +f:drivers/media/usb/hackrf/Makefile +f:drivers/media/usb/hackrf/hackrf.c +f:drivers/media/usb/hdpvr/Kconfig +f:drivers/media/usb/hdpvr/Makefile +f:drivers/media/usb/hdpvr/hdpvr-control.c +f:drivers/media/usb/hdpvr/hdpvr-core.c +f:drivers/media/usb/hdpvr/hdpvr-i2c.c +f:drivers/media/usb/hdpvr/hdpvr-video.c +f:drivers/media/usb/hdpvr/hdpvr.h +f:drivers/media/usb/msi2500/Kconfig +f:drivers/media/usb/msi2500/Makefile +f:drivers/media/usb/msi2500/msi2500.c +f:drivers/media/usb/pvrusb2/Kconfig +f:drivers/media/usb/pvrusb2/Makefile +f:drivers/media/usb/pvrusb2/pvrusb2-audio.c +f:drivers/media/usb/pvrusb2/pvrusb2-audio.h +f:drivers/media/usb/pvrusb2/pvrusb2-context.c +f:drivers/media/usb/pvrusb2/pvrusb2-context.h +f:drivers/media/usb/pvrusb2/pvrusb2-cs53l32a.c +f:drivers/media/usb/pvrusb2/pvrusb2-cs53l32a.h +f:drivers/media/usb/pvrusb2/pvrusb2-ctrl.c +f:drivers/media/usb/pvrusb2/pvrusb2-ctrl.h +f:drivers/media/usb/pvrusb2/pvrusb2-cx2584x-v4l.c +f:drivers/media/usb/pvrusb2/pvrusb2-cx2584x-v4l.h +f:drivers/media/usb/pvrusb2/pvrusb2-debug.h +f:drivers/media/usb/pvrusb2/pvrusb2-debugifc.c +f:drivers/media/usb/pvrusb2/pvrusb2-debugifc.h +f:drivers/media/usb/pvrusb2/pvrusb2-devattr.c +f:drivers/media/usb/pvrusb2/pvrusb2-devattr.h +f:drivers/media/usb/pvrusb2/pvrusb2-dvb.c +f:drivers/media/usb/pvrusb2/pvrusb2-dvb.h +f:drivers/media/usb/pvrusb2/pvrusb2-eeprom.c +f:drivers/media/usb/pvrusb2/pvrusb2-eeprom.h +f:drivers/media/usb/pvrusb2/pvrusb2-encoder.c +f:drivers/media/usb/pvrusb2/pvrusb2-encoder.h +f:drivers/media/usb/pvrusb2/pvrusb2-fx2-cmd.h +f:drivers/media/usb/pvrusb2/pvrusb2-hdw-internal.h +f:drivers/media/usb/pvrusb2/pvrusb2-hdw.c +f:drivers/media/usb/pvrusb2/pvrusb2-hdw.h +f:drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c +f:drivers/media/usb/pvrusb2/pvrusb2-i2c-core.h +f:drivers/media/usb/pvrusb2/pvrusb2-io.c +f:drivers/media/usb/pvrusb2/pvrusb2-io.h +f:drivers/media/usb/pvrusb2/pvrusb2-ioread.c +f:drivers/media/usb/pvrusb2/pvrusb2-ioread.h +f:drivers/media/usb/pvrusb2/pvrusb2-main.c +f:drivers/media/usb/pvrusb2/pvrusb2-std.c +f:drivers/media/usb/pvrusb2/pvrusb2-std.h +f:drivers/media/usb/pvrusb2/pvrusb2-sysfs.c +f:drivers/media/usb/pvrusb2/pvrusb2-sysfs.h +f:drivers/media/usb/pvrusb2/pvrusb2-util.h +f:drivers/media/usb/pvrusb2/pvrusb2-v4l2.c +f:drivers/media/usb/pvrusb2/pvrusb2-v4l2.h +f:drivers/media/usb/pvrusb2/pvrusb2-video-v4l.c +f:drivers/media/usb/pvrusb2/pvrusb2-video-v4l.h +f:drivers/media/usb/pvrusb2/pvrusb2-wm8775.c +f:drivers/media/usb/pvrusb2/pvrusb2-wm8775.h +f:drivers/media/usb/pvrusb2/pvrusb2.h +f:drivers/media/usb/pwc/Kconfig +f:drivers/media/usb/pwc/Makefile +f:drivers/media/usb/pwc/pwc-ctrl.c +f:drivers/media/usb/pwc/pwc-dec1.c +f:drivers/media/usb/pwc/pwc-dec1.h +f:drivers/media/usb/pwc/pwc-dec23.c +f:drivers/media/usb/pwc/pwc-dec23.h +f:drivers/media/usb/pwc/pwc-if.c +f:drivers/media/usb/pwc/pwc-kiara.c +f:drivers/media/usb/pwc/pwc-kiara.h +f:drivers/media/usb/pwc/pwc-misc.c +f:drivers/media/usb/pwc/pwc-nala.h +f:drivers/media/usb/pwc/pwc-timon.c +f:drivers/media/usb/pwc/pwc-timon.h +f:drivers/media/usb/pwc/pwc-uncompress.c +f:drivers/media/usb/pwc/pwc-v4l.c +f:drivers/media/usb/pwc/pwc.h +f:drivers/media/usb/s2255/Kconfig +f:drivers/media/usb/s2255/Makefile +f:drivers/media/usb/s2255/s2255drv.c +f:drivers/media/usb/siano/Kconfig +f:drivers/media/usb/siano/Makefile +f:drivers/media/usb/siano/smsusb.c +f:drivers/media/usb/stk1160/Kconfig +f:drivers/media/usb/stk1160/Makefile +f:drivers/media/usb/stk1160/stk1160-ac97.c +f:drivers/media/usb/stk1160/stk1160-core.c +f:drivers/media/usb/stk1160/stk1160-i2c.c +f:drivers/media/usb/stk1160/stk1160-reg.h +f:drivers/media/usb/stk1160/stk1160-v4l.c +f:drivers/media/usb/stk1160/stk1160-video.c +f:drivers/media/usb/stk1160/stk1160.h +f:drivers/media/usb/ttusb-budget/Kconfig +f:drivers/media/usb/ttusb-budget/Makefile +f:drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c +f:drivers/media/usb/ttusb-dec/Kconfig +f:drivers/media/usb/ttusb-dec/Makefile +f:drivers/media/usb/ttusb-dec/ttusb_dec.c +f:drivers/media/usb/ttusb-dec/ttusbdecfe.c +f:drivers/media/usb/ttusb-dec/ttusbdecfe.h +f:drivers/media/usb/usbtv/Kconfig +f:drivers/media/usb/usbtv/Makefile +f:drivers/media/usb/usbtv/usbtv-audio.c +f:drivers/media/usb/usbtv/usbtv-core.c +f:drivers/media/usb/usbtv/usbtv-video.c +f:drivers/media/usb/usbtv/usbtv.h +f:drivers/media/usb/uvc/Kconfig +f:drivers/media/usb/uvc/Makefile +f:drivers/media/usb/uvc/uvc_ctrl.c +f:drivers/media/usb/uvc/uvc_debugfs.c +f:drivers/media/usb/uvc/uvc_driver.c +f:drivers/media/usb/uvc/uvc_entity.c +f:drivers/media/usb/uvc/uvc_isight.c +f:drivers/media/usb/uvc/uvc_metadata.c +f:drivers/media/usb/uvc/uvc_queue.c +f:drivers/media/usb/uvc/uvc_status.c +f:drivers/media/usb/uvc/uvc_v4l2.c +f:drivers/media/usb/uvc/uvc_video.c +f:drivers/media/usb/uvc/uvcvideo.h +f:drivers/media/v4l2-core/Kconfig +f:drivers/media/v4l2-core/Makefile +f:drivers/media/v4l2-core/tuner-core.c +f:drivers/media/v4l2-core/v4l2-async.c +f:drivers/media/v4l2-core/v4l2-cci.c +f:drivers/media/v4l2-core/v4l2-common.c +f:drivers/media/v4l2-core/v4l2-compat-ioctl32.c +f:drivers/media/v4l2-core/v4l2-ctrls-api.c +f:drivers/media/v4l2-core/v4l2-ctrls-core.c +f:drivers/media/v4l2-core/v4l2-ctrls-defs.c +f:drivers/media/v4l2-core/v4l2-ctrls-priv.h +f:drivers/media/v4l2-core/v4l2-ctrls-request.c +f:drivers/media/v4l2-core/v4l2-dev.c +f:drivers/media/v4l2-core/v4l2-device.c +f:drivers/media/v4l2-core/v4l2-dv-timings.c +f:drivers/media/v4l2-core/v4l2-event.c +f:drivers/media/v4l2-core/v4l2-fh.c +f:drivers/media/v4l2-core/v4l2-flash-led-class.c +f:drivers/media/v4l2-core/v4l2-fwnode.c +f:drivers/media/v4l2-core/v4l2-h264.c +f:drivers/media/v4l2-core/v4l2-i2c.c +f:drivers/media/v4l2-core/v4l2-ioctl.c +f:drivers/media/v4l2-core/v4l2-jpeg.c +f:drivers/media/v4l2-core/v4l2-mc.c +f:drivers/media/v4l2-core/v4l2-mem2mem.c +f:drivers/media/v4l2-core/v4l2-spi.c +f:drivers/media/v4l2-core/v4l2-subdev-priv.h +f:drivers/media/v4l2-core/v4l2-subdev.c +f:drivers/media/v4l2-core/v4l2-trace.c +f:drivers/media/v4l2-core/v4l2-vp9.c +f:drivers/memory/.gitignore +f:drivers/memory/Kconfig +f:drivers/memory/Makefile +f:drivers/memory/atmel-ebi.c +f:drivers/memory/brcmstb_dpfe.c +f:drivers/memory/brcmstb_memc.c +f:drivers/memory/bt1-l2-ctl.c +f:drivers/memory/da8xx-ddrctl.c +f:drivers/memory/dfl-emif.c +f:drivers/memory/emif-asm-offsets.c +f:drivers/memory/emif.c +f:drivers/memory/emif.h +f:drivers/memory/fsl-corenet-cf.c +f:drivers/memory/fsl_ifc.c +f:drivers/memory/jedec_ddr.h +f:drivers/memory/jedec_ddr_data.c +f:drivers/memory/jz4780-nemc.c +f:drivers/memory/mtk-smi.c +f:drivers/memory/mvebu-devbus.c +f:drivers/memory/of_memory.c +f:drivers/memory/of_memory.h +f:drivers/memory/omap-gpmc.c +f:drivers/memory/pl172.c +f:drivers/memory/pl353-smc.c +f:drivers/memory/renesas-rpc-if-regs.h +f:drivers/memory/renesas-rpc-if.c +f:drivers/memory/renesas-xspi-if-regs.h +f:drivers/memory/samsung/Kconfig +f:drivers/memory/samsung/Makefile +f:drivers/memory/samsung/exynos-srom.c +f:drivers/memory/samsung/exynos-srom.h +f:drivers/memory/samsung/exynos5422-dmc.c +f:drivers/memory/stm32-fmc2-ebi.c +f:drivers/memory/stm32_omm.c +f:drivers/memory/tegra/Kconfig +f:drivers/memory/tegra/Makefile +f:drivers/memory/tegra/mc.c +f:drivers/memory/tegra/mc.h +f:drivers/memory/tegra/tegra114.c +f:drivers/memory/tegra/tegra124-emc.c +f:drivers/memory/tegra/tegra124.c +f:drivers/memory/tegra/tegra186-emc.c +f:drivers/memory/tegra/tegra186.c +f:drivers/memory/tegra/tegra194.c +f:drivers/memory/tegra/tegra20-emc.c +f:drivers/memory/tegra/tegra20.c +f:drivers/memory/tegra/tegra210-emc-cc-r21021.c +f:drivers/memory/tegra/tegra210-emc-core.c +f:drivers/memory/tegra/tegra210-emc-table.c +f:drivers/memory/tegra/tegra210-emc.h +f:drivers/memory/tegra/tegra210-mc.h +f:drivers/memory/tegra/tegra210.c +f:drivers/memory/tegra/tegra234.c +f:drivers/memory/tegra/tegra264-bwmgr.h +f:drivers/memory/tegra/tegra264.c +f:drivers/memory/tegra/tegra30-emc.c +f:drivers/memory/tegra/tegra30.c +f:drivers/memory/ti-aemif.c +f:drivers/memory/ti-emif-pm.c +f:drivers/memory/ti-emif-sram-pm.S +f:drivers/memstick/Kconfig +f:drivers/memstick/Makefile +f:drivers/memstick/core/Kconfig +f:drivers/memstick/core/Makefile +f:drivers/memstick/core/memstick.c +f:drivers/memstick/core/ms_block.c +f:drivers/memstick/core/ms_block.h +f:drivers/memstick/core/mspro_block.c +f:drivers/memstick/host/Kconfig +f:drivers/memstick/host/Makefile +f:drivers/memstick/host/jmb38x_ms.c +f:drivers/memstick/host/r592.c +f:drivers/memstick/host/r592.h +f:drivers/memstick/host/rtsx_usb_ms.c +f:drivers/memstick/host/tifm_ms.c +f:drivers/message/Makefile +f:drivers/message/fusion/Kconfig +f:drivers/message/fusion/Makefile +f:drivers/message/fusion/lsi/mpi.h +f:drivers/message/fusion/lsi/mpi_cnfg.h +f:drivers/message/fusion/lsi/mpi_fc.h +f:drivers/message/fusion/lsi/mpi_history.txt +f:drivers/message/fusion/lsi/mpi_init.h +f:drivers/message/fusion/lsi/mpi_ioc.h +f:drivers/message/fusion/lsi/mpi_lan.h +f:drivers/message/fusion/lsi/mpi_log_fc.h +f:drivers/message/fusion/lsi/mpi_log_sas.h +f:drivers/message/fusion/lsi/mpi_raid.h +f:drivers/message/fusion/lsi/mpi_sas.h +f:drivers/message/fusion/lsi/mpi_targ.h +f:drivers/message/fusion/lsi/mpi_tool.h +f:drivers/message/fusion/lsi/mpi_type.h +f:drivers/message/fusion/mptbase.c +f:drivers/message/fusion/mptbase.h +f:drivers/message/fusion/mptctl.c +f:drivers/message/fusion/mptctl.h +f:drivers/message/fusion/mptdebug.h +f:drivers/message/fusion/mptfc.c +f:drivers/message/fusion/mptlan.c +f:drivers/message/fusion/mptlan.h +f:drivers/message/fusion/mptsas.c +f:drivers/message/fusion/mptsas.h +f:drivers/message/fusion/mptscsih.c +f:drivers/message/fusion/mptscsih.h +f:drivers/message/fusion/mptspi.c +f:drivers/mfd/88pm800.c +f:drivers/mfd/88pm805.c +f:drivers/mfd/88pm80x.c +f:drivers/mfd/88pm860x-core.c +f:drivers/mfd/88pm860x-i2c.c +f:drivers/mfd/88pm886.c +f:drivers/mfd/Kconfig +f:drivers/mfd/Makefile +f:drivers/mfd/aat2870-core.c +f:drivers/mfd/ab8500-core.c +f:drivers/mfd/ab8500-sysctrl.c +f:drivers/mfd/abx500-core.c +f:drivers/mfd/ac100.c +f:drivers/mfd/acer-ec-a500.c +f:drivers/mfd/act8945a.c +f:drivers/mfd/adp5520.c +f:drivers/mfd/adp5585.c +f:drivers/mfd/altera-a10sr.c +f:drivers/mfd/altera-sysmgr.c +f:drivers/mfd/arizona-core.c +f:drivers/mfd/arizona-i2c.c +f:drivers/mfd/arizona-irq.c +f:drivers/mfd/arizona-spi.c +f:drivers/mfd/arizona.h +f:drivers/mfd/as3711.c +f:drivers/mfd/as3722.c +f:drivers/mfd/at91-usart.c +f:drivers/mfd/atc260x-core.c +f:drivers/mfd/atc260x-i2c.c +f:drivers/mfd/atmel-flexcom.c +f:drivers/mfd/atmel-hlcdc.c +f:drivers/mfd/atmel-smc.c +f:drivers/mfd/axp20x-i2c.c +f:drivers/mfd/axp20x-rsb.c +f:drivers/mfd/axp20x.c +f:drivers/mfd/bcm2835-pm.c +f:drivers/mfd/bcm590xx.c +f:drivers/mfd/bd9571mwv.c +f:drivers/mfd/cgbc-core.c +f:drivers/mfd/cros_ec_dev.c +f:drivers/mfd/cs40l50-core.c +f:drivers/mfd/cs40l50-i2c.c +f:drivers/mfd/cs40l50-spi.c +f:drivers/mfd/cs42l43-i2c.c +f:drivers/mfd/cs42l43-sdw.c +f:drivers/mfd/cs42l43.c +f:drivers/mfd/cs42l43.h +f:drivers/mfd/cs47l15-tables.c +f:drivers/mfd/cs47l24-tables.c +f:drivers/mfd/cs47l35-tables.c +f:drivers/mfd/cs47l85-tables.c +f:drivers/mfd/cs47l90-tables.c +f:drivers/mfd/cs47l92-tables.c +f:drivers/mfd/cs5535-mfd.c +f:drivers/mfd/da903x.c +f:drivers/mfd/da9052-core.c +f:drivers/mfd/da9052-i2c.c +f:drivers/mfd/da9052-irq.c +f:drivers/mfd/da9052-spi.c +f:drivers/mfd/da9055-core.c +f:drivers/mfd/da9055-i2c.c +f:drivers/mfd/da9062-core.c +f:drivers/mfd/da9063-core.c +f:drivers/mfd/da9063-i2c.c +f:drivers/mfd/da9063-irq.c +f:drivers/mfd/da9150-core.c +f:drivers/mfd/db8500-prcmu-regs.h +f:drivers/mfd/db8500-prcmu.c +f:drivers/mfd/dln2.c +f:drivers/mfd/ene-kb3930.c +f:drivers/mfd/exynos-lpass.c +f:drivers/mfd/ezx-pcap.c +f:drivers/mfd/fsl-imx25-tsadc.c +f:drivers/mfd/gateworks-gsc.c +f:drivers/mfd/hi6421-pmic-core.c +f:drivers/mfd/hi6421-spmi-pmic.c +f:drivers/mfd/hi655x-pmic.c +f:drivers/mfd/intel-lpss-acpi.c +f:drivers/mfd/intel-lpss-pci.c +f:drivers/mfd/intel-lpss.c +f:drivers/mfd/intel-lpss.h +f:drivers/mfd/intel-m10-bmc-core.c +f:drivers/mfd/intel-m10-bmc-pmci.c +f:drivers/mfd/intel-m10-bmc-spi.c +f:drivers/mfd/intel_pmc_bxt.c +f:drivers/mfd/intel_quark_i2c_gpio.c +f:drivers/mfd/intel_soc_pmic_bxtwc.c +f:drivers/mfd/intel_soc_pmic_chtdc_ti.c +f:drivers/mfd/intel_soc_pmic_chtwc.c +f:drivers/mfd/intel_soc_pmic_crc.c +f:drivers/mfd/intel_soc_pmic_mrfld.c +f:drivers/mfd/ioc3.c +f:drivers/mfd/ipaq-micro.c +f:drivers/mfd/iqs62x.c +f:drivers/mfd/janz-cmodio.c +f:drivers/mfd/kempld-core.c +f:drivers/mfd/khadas-mcu.c +f:drivers/mfd/lm3533-core.c +f:drivers/mfd/lm3533-ctrlbank.c +f:drivers/mfd/lochnagar-i2c.c +f:drivers/mfd/lp3943.c +f:drivers/mfd/lp873x.c +f:drivers/mfd/lp87565.c +f:drivers/mfd/lp8788-irq.c +f:drivers/mfd/lp8788.c +f:drivers/mfd/lpc_ich.c +f:drivers/mfd/lpc_sch.c +f:drivers/mfd/macsmc.c +f:drivers/mfd/madera-core.c +f:drivers/mfd/madera-i2c.c +f:drivers/mfd/madera-spi.c +f:drivers/mfd/madera.h +f:drivers/mfd/max14577.c +f:drivers/mfd/max77541.c +f:drivers/mfd/max77620.c +f:drivers/mfd/max77650.c +f:drivers/mfd/max77686.c +f:drivers/mfd/max77693.c +f:drivers/mfd/max77705.c +f:drivers/mfd/max77714.c +f:drivers/mfd/max77759.c +f:drivers/mfd/max77843.c +f:drivers/mfd/max8907.c +f:drivers/mfd/max8925-core.c +f:drivers/mfd/max8925-i2c.c +f:drivers/mfd/max8997-irq.c +f:drivers/mfd/max8997.c +f:drivers/mfd/max8998-irq.c +f:drivers/mfd/max8998.c +f:drivers/mfd/mc13xxx-core.c +f:drivers/mfd/mc13xxx-i2c.c +f:drivers/mfd/mc13xxx-spi.c +f:drivers/mfd/mc13xxx.h +f:drivers/mfd/mcp-core.c +f:drivers/mfd/mcp-sa11x0.c +f:drivers/mfd/menelaus.c +f:drivers/mfd/menf21bmc.c +f:drivers/mfd/mfd-core.c +f:drivers/mfd/motorola-cpcap.c +f:drivers/mfd/mp2629.c +f:drivers/mfd/mt6358-irq.c +f:drivers/mfd/mt6360-core.c +f:drivers/mfd/mt6370.c +f:drivers/mfd/mt6370.h +f:drivers/mfd/mt6397-core.c +f:drivers/mfd/mt6397-irq.c +f:drivers/mfd/mxs-lradc.c +f:drivers/mfd/ntxec.c +f:drivers/mfd/ocelot-core.c +f:drivers/mfd/ocelot-spi.c +f:drivers/mfd/ocelot.h +f:drivers/mfd/omap-usb-host.c +f:drivers/mfd/omap-usb-tll.c +f:drivers/mfd/omap-usb.h +f:drivers/mfd/palmas.c +f:drivers/mfd/qcom-pm8008.c +f:drivers/mfd/qcom-pm8xxx.c +f:drivers/mfd/qcom-spmi-pmic.c +f:drivers/mfd/qcom_rpm.c +f:drivers/mfd/qnap-mcu.c +f:drivers/mfd/rave-sp.c +f:drivers/mfd/rc5t583-irq.c +f:drivers/mfd/rc5t583.c +f:drivers/mfd/rdc321x-southbridge.c +f:drivers/mfd/retu-mfd.c +f:drivers/mfd/rk8xx-core.c +f:drivers/mfd/rk8xx-i2c.c +f:drivers/mfd/rk8xx-spi.c +f:drivers/mfd/rn5t618.c +f:drivers/mfd/rohm-bd71828.c +f:drivers/mfd/rohm-bd718x7.c +f:drivers/mfd/rohm-bd9576.c +f:drivers/mfd/rohm-bd96801.c +f:drivers/mfd/rsmu.h +f:drivers/mfd/rsmu_core.c +f:drivers/mfd/rsmu_i2c.c +f:drivers/mfd/rsmu_spi.c +f:drivers/mfd/rt4831.c +f:drivers/mfd/rt5033.c +f:drivers/mfd/rt5120.c +f:drivers/mfd/rz-mtu3.c +f:drivers/mfd/rz-mtu3.h +f:drivers/mfd/sec-acpm.c +f:drivers/mfd/sec-common.c +f:drivers/mfd/sec-core.h +f:drivers/mfd/sec-i2c.c +f:drivers/mfd/sec-irq.c +f:drivers/mfd/si476x-cmd.c +f:drivers/mfd/si476x-i2c.c +f:drivers/mfd/si476x-prop.c +f:drivers/mfd/simple-mfd-i2c.c +f:drivers/mfd/simple-mfd-i2c.h +f:drivers/mfd/sky81452.c +f:drivers/mfd/sm501.c +f:drivers/mfd/smpro-core.c +f:drivers/mfd/sprd-sc27xx-spi.c +f:drivers/mfd/ssbi.c +f:drivers/mfd/stm32-lptimer.c +f:drivers/mfd/stm32-timers.c +f:drivers/mfd/stmfx.c +f:drivers/mfd/stmpe-i2c.c +f:drivers/mfd/stmpe-spi.c +f:drivers/mfd/stmpe.c +f:drivers/mfd/stmpe.h +f:drivers/mfd/stpmic1.c +f:drivers/mfd/stw481x.c +f:drivers/mfd/sun4i-gpadc.c +f:drivers/mfd/sun6i-prcm.c +f:drivers/mfd/syscon.c +f:drivers/mfd/tc3589x.c +f:drivers/mfd/ti-lmu.c +f:drivers/mfd/ti_am335x_tscadc.c +f:drivers/mfd/timberdale.c +f:drivers/mfd/timberdale.h +f:drivers/mfd/tps6105x.c +f:drivers/mfd/tps65010.c +f:drivers/mfd/tps6507x.c +f:drivers/mfd/tps65086.c +f:drivers/mfd/tps65090.c +f:drivers/mfd/tps65217.c +f:drivers/mfd/tps65218.c +f:drivers/mfd/tps65219.c +f:drivers/mfd/tps6586x.c +f:drivers/mfd/tps65910.c +f:drivers/mfd/tps65911-comparator.c +f:drivers/mfd/tps65912-core.c +f:drivers/mfd/tps65912-i2c.c +f:drivers/mfd/tps65912-spi.c +f:drivers/mfd/tps6594-core.c +f:drivers/mfd/tps6594-i2c.c +f:drivers/mfd/tps6594-spi.c +f:drivers/mfd/tqmx86.c +f:drivers/mfd/twl-core.c +f:drivers/mfd/twl-core.h +f:drivers/mfd/twl4030-audio.c +f:drivers/mfd/twl4030-irq.c +f:drivers/mfd/twl4030-power.c +f:drivers/mfd/twl6030-irq.c +f:drivers/mfd/twl6040.c +f:drivers/mfd/ucb1x00-assabet.c +f:drivers/mfd/ucb1x00-core.c +f:drivers/mfd/ucb1x00-ts.c +f:drivers/mfd/upboard-fpga.c +f:drivers/mfd/vexpress-sysreg.c +f:drivers/mfd/viperboard.c +f:drivers/mfd/vx855.c +f:drivers/mfd/wcd934x.c +f:drivers/mfd/wl1273-core.c +f:drivers/mfd/wm5102-tables.c +f:drivers/mfd/wm5110-tables.c +f:drivers/mfd/wm831x-auxadc.c +f:drivers/mfd/wm831x-core.c +f:drivers/mfd/wm831x-i2c.c +f:drivers/mfd/wm831x-irq.c +f:drivers/mfd/wm831x-otp.c +f:drivers/mfd/wm831x-spi.c +f:drivers/mfd/wm8350-core.c +f:drivers/mfd/wm8350-gpio.c +f:drivers/mfd/wm8350-i2c.c +f:drivers/mfd/wm8350-irq.c +f:drivers/mfd/wm8350-regmap.c +f:drivers/mfd/wm8400-core.c +f:drivers/mfd/wm8994-core.c +f:drivers/mfd/wm8994-irq.c +f:drivers/mfd/wm8994-regmap.c +f:drivers/mfd/wm8994.h +f:drivers/mfd/wm8997-tables.c +f:drivers/mfd/wm8998-tables.c +f:drivers/mfd/wm97xx-core.c +f:drivers/misc/Kconfig +f:drivers/misc/Makefile +f:drivers/misc/ad525x_dpot-i2c.c +f:drivers/misc/ad525x_dpot-spi.c +f:drivers/misc/ad525x_dpot.c +f:drivers/misc/ad525x_dpot.h +f:drivers/misc/altera-stapl/Kconfig +f:drivers/misc/altera-stapl/Makefile +f:drivers/misc/altera-stapl/altera-comp.c +f:drivers/misc/altera-stapl/altera-exprt.h +f:drivers/misc/altera-stapl/altera-jtag.c +f:drivers/misc/altera-stapl/altera-jtag.h +f:drivers/misc/altera-stapl/altera-lpt.c +f:drivers/misc/altera-stapl/altera.c +f:drivers/misc/amd-sbi/Kconfig +f:drivers/misc/amd-sbi/Makefile +f:drivers/misc/amd-sbi/rmi-core.c +f:drivers/misc/amd-sbi/rmi-core.h +f:drivers/misc/amd-sbi/rmi-hwmon.c +f:drivers/misc/amd-sbi/rmi-i2c.c +f:drivers/misc/apds9802als.c +f:drivers/misc/apds990x.c +f:drivers/misc/atmel-ssc.c +f:drivers/misc/bcm-vk/Kconfig +f:drivers/misc/bcm-vk/Makefile +f:drivers/misc/bcm-vk/bcm_vk.h +f:drivers/misc/bcm-vk/bcm_vk_dev.c +f:drivers/misc/bcm-vk/bcm_vk_msg.c +f:drivers/misc/bcm-vk/bcm_vk_msg.h +f:drivers/misc/bcm-vk/bcm_vk_sg.c +f:drivers/misc/bcm-vk/bcm_vk_sg.h +f:drivers/misc/bcm-vk/bcm_vk_tty.c +f:drivers/misc/bh1770glc.c +f:drivers/misc/c2port/Kconfig +f:drivers/misc/c2port/Makefile +f:drivers/misc/c2port/c2port-duramar2150.c +f:drivers/misc/c2port/core.c +f:drivers/misc/cardreader/Kconfig +f:drivers/misc/cardreader/Makefile +f:drivers/misc/cardreader/alcor_pci.c +f:drivers/misc/cardreader/rtl8411.c +f:drivers/misc/cardreader/rts5209.c +f:drivers/misc/cardreader/rts5227.c +f:drivers/misc/cardreader/rts5228.c +f:drivers/misc/cardreader/rts5228.h +f:drivers/misc/cardreader/rts5229.c +f:drivers/misc/cardreader/rts5249.c +f:drivers/misc/cardreader/rts5260.c +f:drivers/misc/cardreader/rts5260.h +f:drivers/misc/cardreader/rts5261.c +f:drivers/misc/cardreader/rts5261.h +f:drivers/misc/cardreader/rts5264.c +f:drivers/misc/cardreader/rts5264.h +f:drivers/misc/cardreader/rtsx_pcr.c +f:drivers/misc/cardreader/rtsx_pcr.h +f:drivers/misc/cardreader/rtsx_usb.c +f:drivers/misc/cb710/Kconfig +f:drivers/misc/cb710/Makefile +f:drivers/misc/cb710/core.c +f:drivers/misc/cb710/debug.c +f:drivers/misc/cb710/sgbuf2.c +f:drivers/misc/cs5535-mfgpt.c +f:drivers/misc/ds1682.c +f:drivers/misc/dummy-irq.c +f:drivers/misc/dw-xdata-pcie.c +f:drivers/misc/eeprom/Kconfig +f:drivers/misc/eeprom/Makefile +f:drivers/misc/eeprom/at24.c +f:drivers/misc/eeprom/at25.c +f:drivers/misc/eeprom/digsy_mtc_eeprom.c +f:drivers/misc/eeprom/ee1004.c +f:drivers/misc/eeprom/eeprom_93cx6.c +f:drivers/misc/eeprom/eeprom_93xx46.c +f:drivers/misc/eeprom/idt_89hpesx.c +f:drivers/misc/eeprom/max6875.c +f:drivers/misc/enclosure.c +f:drivers/misc/fastrpc.c +f:drivers/misc/gehc-achc.c +f:drivers/misc/genwqe/Kconfig +f:drivers/misc/genwqe/Makefile +f:drivers/misc/genwqe/card_base.c +f:drivers/misc/genwqe/card_base.h +f:drivers/misc/genwqe/card_ddcb.c +f:drivers/misc/genwqe/card_ddcb.h +f:drivers/misc/genwqe/card_debugfs.c +f:drivers/misc/genwqe/card_dev.c +f:drivers/misc/genwqe/card_sysfs.c +f:drivers/misc/genwqe/card_utils.c +f:drivers/misc/genwqe/genwqe_driver.h +f:drivers/misc/hi6421v600-irq.c +f:drivers/misc/hisi_hikey_usb.c +f:drivers/misc/hmc6352.c +f:drivers/misc/hpilo.c +f:drivers/misc/hpilo.h +f:drivers/misc/ibmasm/Makefile +f:drivers/misc/ibmasm/command.c +f:drivers/misc/ibmasm/dot_command.c +f:drivers/misc/ibmasm/dot_command.h +f:drivers/misc/ibmasm/event.c +f:drivers/misc/ibmasm/heartbeat.c +f:drivers/misc/ibmasm/i2o.h +f:drivers/misc/ibmasm/ibmasm.h +f:drivers/misc/ibmasm/ibmasmfs.c +f:drivers/misc/ibmasm/lowlevel.c +f:drivers/misc/ibmasm/lowlevel.h +f:drivers/misc/ibmasm/module.c +f:drivers/misc/ibmasm/r_heartbeat.c +f:drivers/misc/ibmasm/remote.c +f:drivers/misc/ibmasm/remote.h +f:drivers/misc/ibmasm/uart.c +f:drivers/misc/ibmvmc.c +f:drivers/misc/ibmvmc.h +f:drivers/misc/ics932s401.c +f:drivers/misc/isl29003.c +f:drivers/misc/isl29020.c +f:drivers/misc/keba/Kconfig +f:drivers/misc/keba/Makefile +f:drivers/misc/keba/cp500.c +f:drivers/misc/keba/lan9252.c +f:drivers/misc/kgdbts.c +f:drivers/misc/lan966x_pci.c +f:drivers/misc/lan966x_pci.dtso +f:drivers/misc/lattice-ecp3-config.c +f:drivers/misc/lis3lv02d/Kconfig +f:drivers/misc/lis3lv02d/Makefile +f:drivers/misc/lis3lv02d/lis3lv02d.c +f:drivers/misc/lis3lv02d/lis3lv02d.h +f:drivers/misc/lis3lv02d/lis3lv02d_i2c.c +f:drivers/misc/lis3lv02d/lis3lv02d_spi.c +f:drivers/misc/lkdtm/Makefile +f:drivers/misc/lkdtm/bugs.c +f:drivers/misc/lkdtm/cfi.c +f:drivers/misc/lkdtm/core.c +f:drivers/misc/lkdtm/fortify.c +f:drivers/misc/lkdtm/heap.c +f:drivers/misc/lkdtm/kstack_erase.c +f:drivers/misc/lkdtm/lkdtm.h +f:drivers/misc/lkdtm/perms.c +f:drivers/misc/lkdtm/powerpc.c +f:drivers/misc/lkdtm/refcount.c +f:drivers/misc/lkdtm/rodata.c +f:drivers/misc/lkdtm/usercopy.c +f:drivers/misc/mchp_pci1xxxx/Kconfig +f:drivers/misc/mchp_pci1xxxx/Makefile +f:drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gp.c +f:drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gp.h +f:drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c +f:drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_otpe2p.c +f:drivers/misc/mei/Kconfig +f:drivers/misc/mei/Makefile +f:drivers/misc/mei/bus-fixup.c +f:drivers/misc/mei/bus.c +f:drivers/misc/mei/client.c +f:drivers/misc/mei/client.h +f:drivers/misc/mei/debugfs.c +f:drivers/misc/mei/dma-ring.c +f:drivers/misc/mei/gsc-me.c +f:drivers/misc/mei/gsc_proxy/Kconfig +f:drivers/misc/mei/gsc_proxy/Makefile +f:drivers/misc/mei/gsc_proxy/mei_gsc_proxy.c +f:drivers/misc/mei/hbm.c +f:drivers/misc/mei/hbm.h +f:drivers/misc/mei/hdcp/Kconfig +f:drivers/misc/mei/hdcp/Makefile +f:drivers/misc/mei/hdcp/mei_hdcp.c +f:drivers/misc/mei/hdcp/mei_hdcp.h +f:drivers/misc/mei/hw-me-regs.h +f:drivers/misc/mei/hw-me.c +f:drivers/misc/mei/hw-me.h +f:drivers/misc/mei/hw-txe-regs.h +f:drivers/misc/mei/hw-txe.c +f:drivers/misc/mei/hw-txe.h +f:drivers/misc/mei/hw.h +f:drivers/misc/mei/init.c +f:drivers/misc/mei/interrupt.c +f:drivers/misc/mei/main.c +f:drivers/misc/mei/mei-trace.c +f:drivers/misc/mei/mei-trace.h +f:drivers/misc/mei/mei_dev.h +f:drivers/misc/mei/mkhi.h +f:drivers/misc/mei/pci-me.c +f:drivers/misc/mei/pci-txe.c +f:drivers/misc/mei/platform-vsc.c +f:drivers/misc/mei/pxp/Kconfig +f:drivers/misc/mei/pxp/Makefile +f:drivers/misc/mei/pxp/mei_pxp.c +f:drivers/misc/mei/pxp/mei_pxp.h +f:drivers/misc/mei/vsc-fw-loader.c +f:drivers/misc/mei/vsc-tp.c +f:drivers/misc/mei/vsc-tp.h +f:drivers/misc/misc_minor_kunit.c +f:drivers/misc/mrvl_cn10k_dpi.c +f:drivers/misc/nsm.c +f:drivers/misc/ntsync.c +f:drivers/misc/ocxl/Kconfig +f:drivers/misc/ocxl/Makefile +f:drivers/misc/ocxl/afu_irq.c +f:drivers/misc/ocxl/config.c +f:drivers/misc/ocxl/context.c +f:drivers/misc/ocxl/core.c +f:drivers/misc/ocxl/file.c +f:drivers/misc/ocxl/link.c +f:drivers/misc/ocxl/main.c +f:drivers/misc/ocxl/mmio.c +f:drivers/misc/ocxl/ocxl_internal.h +f:drivers/misc/ocxl/pasid.c +f:drivers/misc/ocxl/pci.c +f:drivers/misc/ocxl/sysfs.c +f:drivers/misc/ocxl/trace.c +f:drivers/misc/ocxl/trace.h +f:drivers/misc/open-dice.c +f:drivers/misc/pch_phub.c +f:drivers/misc/pci_endpoint_test.c +f:drivers/misc/phantom.c +f:drivers/misc/pvpanic/Kconfig +f:drivers/misc/pvpanic/Makefile +f:drivers/misc/pvpanic/pvpanic-mmio.c +f:drivers/misc/pvpanic/pvpanic-pci.c +f:drivers/misc/pvpanic/pvpanic.c +f:drivers/misc/pvpanic/pvpanic.h +f:drivers/misc/qcom-coincell.c +f:drivers/misc/rp1/Kconfig +f:drivers/misc/rp1/Makefile +f:drivers/misc/rp1/rp1-pci.dtso +f:drivers/misc/rp1/rp1_pci.c +f:drivers/misc/rpmb-core.c +f:drivers/misc/sgi-gru/Makefile +f:drivers/misc/sgi-gru/gru.h +f:drivers/misc/sgi-gru/gru_instructions.h +f:drivers/misc/sgi-gru/grufault.c +f:drivers/misc/sgi-gru/grufile.c +f:drivers/misc/sgi-gru/gruhandles.c +f:drivers/misc/sgi-gru/gruhandles.h +f:drivers/misc/sgi-gru/grukdump.c +f:drivers/misc/sgi-gru/grukservices.c +f:drivers/misc/sgi-gru/grukservices.h +f:drivers/misc/sgi-gru/grulib.h +f:drivers/misc/sgi-gru/grumain.c +f:drivers/misc/sgi-gru/gruprocfs.c +f:drivers/misc/sgi-gru/grutables.h +f:drivers/misc/sgi-gru/grutlbpurge.c +f:drivers/misc/sgi-xp/Makefile +f:drivers/misc/sgi-xp/xp.h +f:drivers/misc/sgi-xp/xp_main.c +f:drivers/misc/sgi-xp/xp_uv.c +f:drivers/misc/sgi-xp/xpc.h +f:drivers/misc/sgi-xp/xpc_channel.c +f:drivers/misc/sgi-xp/xpc_main.c +f:drivers/misc/sgi-xp/xpc_partition.c +f:drivers/misc/sgi-xp/xpc_uv.c +f:drivers/misc/sgi-xp/xpnet.c +f:drivers/misc/smpro-errmon.c +f:drivers/misc/smpro-misc.c +f:drivers/misc/sram-exec.c +f:drivers/misc/sram.c +f:drivers/misc/sram.h +f:drivers/misc/ti_fpc202.c +f:drivers/misc/tifm_7xx1.c +f:drivers/misc/tifm_core.c +f:drivers/misc/tps6594-esm.c +f:drivers/misc/tps6594-pfsm.c +f:drivers/misc/tsl2550.c +f:drivers/misc/uacce/Kconfig +f:drivers/misc/uacce/Makefile +f:drivers/misc/uacce/uacce.c +f:drivers/misc/vcpu_stall_detector.c +f:drivers/misc/vmw_balloon.c +f:drivers/misc/vmw_vmci/Kconfig +f:drivers/misc/vmw_vmci/Makefile +f:drivers/misc/vmw_vmci/vmci_context.c +f:drivers/misc/vmw_vmci/vmci_context.h +f:drivers/misc/vmw_vmci/vmci_datagram.c +f:drivers/misc/vmw_vmci/vmci_datagram.h +f:drivers/misc/vmw_vmci/vmci_doorbell.c +f:drivers/misc/vmw_vmci/vmci_doorbell.h +f:drivers/misc/vmw_vmci/vmci_driver.c +f:drivers/misc/vmw_vmci/vmci_driver.h +f:drivers/misc/vmw_vmci/vmci_event.c +f:drivers/misc/vmw_vmci/vmci_event.h +f:drivers/misc/vmw_vmci/vmci_guest.c +f:drivers/misc/vmw_vmci/vmci_handle_array.c +f:drivers/misc/vmw_vmci/vmci_handle_array.h +f:drivers/misc/vmw_vmci/vmci_host.c +f:drivers/misc/vmw_vmci/vmci_queue_pair.c +f:drivers/misc/vmw_vmci/vmci_queue_pair.h +f:drivers/misc/vmw_vmci/vmci_resource.c +f:drivers/misc/vmw_vmci/vmci_resource.h +f:drivers/misc/vmw_vmci/vmci_route.c +f:drivers/misc/vmw_vmci/vmci_route.h +f:drivers/misc/xilinx_sdfec.c +f:drivers/misc/xilinx_tmr_inject.c +f:drivers/misc/xilinx_tmr_manager.c +f:drivers/mmc/Kconfig +f:drivers/mmc/Makefile +f:drivers/mmc/core/Kconfig +f:drivers/mmc/core/Makefile +f:drivers/mmc/core/block.c +f:drivers/mmc/core/block.h +f:drivers/mmc/core/bus.c +f:drivers/mmc/core/bus.h +f:drivers/mmc/core/card.h +f:drivers/mmc/core/core.c +f:drivers/mmc/core/core.h +f:drivers/mmc/core/crypto.c +f:drivers/mmc/core/crypto.h +f:drivers/mmc/core/debugfs.c +f:drivers/mmc/core/host.c +f:drivers/mmc/core/host.h +f:drivers/mmc/core/mmc.c +f:drivers/mmc/core/mmc_ops.c +f:drivers/mmc/core/mmc_ops.h +f:drivers/mmc/core/mmc_test.c +f:drivers/mmc/core/pwrseq.c +f:drivers/mmc/core/pwrseq.h +f:drivers/mmc/core/pwrseq_emmc.c +f:drivers/mmc/core/pwrseq_sd8787.c +f:drivers/mmc/core/pwrseq_simple.c +f:drivers/mmc/core/queue.c +f:drivers/mmc/core/queue.h +f:drivers/mmc/core/quirks.h +f:drivers/mmc/core/regulator.c +f:drivers/mmc/core/sd.c +f:drivers/mmc/core/sd.h +f:drivers/mmc/core/sd_ops.c +f:drivers/mmc/core/sd_ops.h +f:drivers/mmc/core/sd_uhs2.c +f:drivers/mmc/core/sdio.c +f:drivers/mmc/core/sdio_bus.c +f:drivers/mmc/core/sdio_bus.h +f:drivers/mmc/core/sdio_cis.c +f:drivers/mmc/core/sdio_cis.h +f:drivers/mmc/core/sdio_io.c +f:drivers/mmc/core/sdio_irq.c +f:drivers/mmc/core/sdio_ops.c +f:drivers/mmc/core/sdio_ops.h +f:drivers/mmc/core/sdio_uart.c +f:drivers/mmc/core/slot-gpio.c +f:drivers/mmc/core/slot-gpio.h +f:drivers/mmc/host/Kconfig +f:drivers/mmc/host/Makefile +f:drivers/mmc/host/alcor.c +f:drivers/mmc/host/atmel-mci.c +f:drivers/mmc/host/au1xmmc.c +f:drivers/mmc/host/bcm2835.c +f:drivers/mmc/host/cavium-octeon.c +f:drivers/mmc/host/cavium-thunderx.c +f:drivers/mmc/host/cavium.c +f:drivers/mmc/host/cavium.h +f:drivers/mmc/host/cb710-mmc.c +f:drivers/mmc/host/cb710-mmc.h +f:drivers/mmc/host/cqhci-core.c +f:drivers/mmc/host/cqhci-crypto.c +f:drivers/mmc/host/cqhci-crypto.h +f:drivers/mmc/host/cqhci.h +f:drivers/mmc/host/davinci_mmc.c +f:drivers/mmc/host/dw_mmc-bluefield.c +f:drivers/mmc/host/dw_mmc-exynos.c +f:drivers/mmc/host/dw_mmc-exynos.h +f:drivers/mmc/host/dw_mmc-hi3798cv200.c +f:drivers/mmc/host/dw_mmc-hi3798mv200.c +f:drivers/mmc/host/dw_mmc-k3.c +f:drivers/mmc/host/dw_mmc-pci.c +f:drivers/mmc/host/dw_mmc-pltfm.c +f:drivers/mmc/host/dw_mmc-pltfm.h +f:drivers/mmc/host/dw_mmc-rockchip.c +f:drivers/mmc/host/dw_mmc-starfive.c +f:drivers/mmc/host/dw_mmc.c +f:drivers/mmc/host/dw_mmc.h +f:drivers/mmc/host/jz4740_mmc.c +f:drivers/mmc/host/litex_mmc.c +f:drivers/mmc/host/loongson2-mmc.c +f:drivers/mmc/host/meson-gx-mmc.c +f:drivers/mmc/host/meson-mx-sdhc-clkc.c +f:drivers/mmc/host/meson-mx-sdhc-mmc.c +f:drivers/mmc/host/meson-mx-sdhc.h +f:drivers/mmc/host/meson-mx-sdio.c +f:drivers/mmc/host/mmc_hsq.c +f:drivers/mmc/host/mmc_hsq.h +f:drivers/mmc/host/mmc_spi.c +f:drivers/mmc/host/mmci.c +f:drivers/mmc/host/mmci.h +f:drivers/mmc/host/mmci_qcom_dml.c +f:drivers/mmc/host/mmci_stm32_sdmmc.c +f:drivers/mmc/host/moxart-mmc.c +f:drivers/mmc/host/mtk-sd.c +f:drivers/mmc/host/mvsdio.c +f:drivers/mmc/host/mvsdio.h +f:drivers/mmc/host/mxcmmc.c +f:drivers/mmc/host/mxs-mmc.c +f:drivers/mmc/host/of_mmc_spi.c +f:drivers/mmc/host/omap.c +f:drivers/mmc/host/omap_hsmmc.c +f:drivers/mmc/host/owl-mmc.c +f:drivers/mmc/host/pxamci.c +f:drivers/mmc/host/pxamci.h +f:drivers/mmc/host/renesas_sdhi.h +f:drivers/mmc/host/renesas_sdhi_core.c +f:drivers/mmc/host/renesas_sdhi_internal_dmac.c +f:drivers/mmc/host/renesas_sdhi_sys_dmac.c +f:drivers/mmc/host/rtsx_pci_sdmmc.c +f:drivers/mmc/host/rtsx_usb_sdmmc.c +f:drivers/mmc/host/sdhci-acpi.c +f:drivers/mmc/host/sdhci-bcm-kona.c +f:drivers/mmc/host/sdhci-brcmstb.c +f:drivers/mmc/host/sdhci-cadence.c +f:drivers/mmc/host/sdhci-cqhci.h +f:drivers/mmc/host/sdhci-dove.c +f:drivers/mmc/host/sdhci-esdhc-imx.c +f:drivers/mmc/host/sdhci-esdhc-mcf.c +f:drivers/mmc/host/sdhci-esdhc.h +f:drivers/mmc/host/sdhci-iproc.c +f:drivers/mmc/host/sdhci-milbeaut.c +f:drivers/mmc/host/sdhci-msm.c +f:drivers/mmc/host/sdhci-npcm.c +f:drivers/mmc/host/sdhci-of-arasan.c +f:drivers/mmc/host/sdhci-of-aspeed-test.c +f:drivers/mmc/host/sdhci-of-aspeed.c +f:drivers/mmc/host/sdhci-of-at91.c +f:drivers/mmc/host/sdhci-of-dwcmshc.c +f:drivers/mmc/host/sdhci-of-esdhc.c +f:drivers/mmc/host/sdhci-of-hlwd.c +f:drivers/mmc/host/sdhci-of-k1.c +f:drivers/mmc/host/sdhci-of-ma35d1.c +f:drivers/mmc/host/sdhci-of-sparx5.c +f:drivers/mmc/host/sdhci-omap.c +f:drivers/mmc/host/sdhci-pci-arasan.c +f:drivers/mmc/host/sdhci-pci-core.c +f:drivers/mmc/host/sdhci-pci-dwc-mshc.c +f:drivers/mmc/host/sdhci-pci-gli.c +f:drivers/mmc/host/sdhci-pci-o2micro.c +f:drivers/mmc/host/sdhci-pci.h +f:drivers/mmc/host/sdhci-pic32.c +f:drivers/mmc/host/sdhci-pltfm.c +f:drivers/mmc/host/sdhci-pltfm.h +f:drivers/mmc/host/sdhci-pxav2.c +f:drivers/mmc/host/sdhci-pxav3.c +f:drivers/mmc/host/sdhci-s3c.c +f:drivers/mmc/host/sdhci-spear.c +f:drivers/mmc/host/sdhci-sprd.c +f:drivers/mmc/host/sdhci-st.c +f:drivers/mmc/host/sdhci-tegra.c +f:drivers/mmc/host/sdhci-uhs2.c +f:drivers/mmc/host/sdhci-uhs2.h +f:drivers/mmc/host/sdhci-xenon-phy.c +f:drivers/mmc/host/sdhci-xenon.c +f:drivers/mmc/host/sdhci-xenon.h +f:drivers/mmc/host/sdhci.c +f:drivers/mmc/host/sdhci.h +f:drivers/mmc/host/sdhci_am654.c +f:drivers/mmc/host/sdhci_f_sdh30.c +f:drivers/mmc/host/sdhci_f_sdh30.h +f:drivers/mmc/host/sdricoh_cs.c +f:drivers/mmc/host/sh_mmcif.c +f:drivers/mmc/host/sunplus-mmc.c +f:drivers/mmc/host/sunxi-mmc.c +f:drivers/mmc/host/tifm_sd.c +f:drivers/mmc/host/tmio_mmc.h +f:drivers/mmc/host/tmio_mmc_core.c +f:drivers/mmc/host/toshsd.c +f:drivers/mmc/host/toshsd.h +f:drivers/mmc/host/uniphier-sd.c +f:drivers/mmc/host/usdhi6rol0.c +f:drivers/mmc/host/ushc.c +f:drivers/mmc/host/via-sdmmc.c +f:drivers/mmc/host/vub300.c +f:drivers/mmc/host/wbsd.c +f:drivers/mmc/host/wbsd.h +f:drivers/mmc/host/wmt-sdmmc.c +f:drivers/most/Kconfig +f:drivers/most/Makefile +f:drivers/most/configfs.c +f:drivers/most/core.c +f:drivers/most/most_cdev.c +f:drivers/most/most_snd.c +f:drivers/most/most_usb.c +f:drivers/mtd/Kconfig +f:drivers/mtd/Makefile +f:drivers/mtd/chips/Kconfig +f:drivers/mtd/chips/Makefile +f:drivers/mtd/chips/cfi_cmdset_0001.c +f:drivers/mtd/chips/cfi_cmdset_0002.c +f:drivers/mtd/chips/cfi_cmdset_0020.c +f:drivers/mtd/chips/cfi_probe.c +f:drivers/mtd/chips/cfi_util.c +f:drivers/mtd/chips/chipreg.c +f:drivers/mtd/chips/fwh_lock.h +f:drivers/mtd/chips/gen_probe.c +f:drivers/mtd/chips/jedec_probe.c +f:drivers/mtd/chips/map_absent.c +f:drivers/mtd/chips/map_ram.c +f:drivers/mtd/chips/map_rom.c +f:drivers/mtd/devices/Kconfig +f:drivers/mtd/devices/Makefile +f:drivers/mtd/devices/bcm47xxsflash.c +f:drivers/mtd/devices/bcm47xxsflash.h +f:drivers/mtd/devices/block2mtd.c +f:drivers/mtd/devices/docg3.c +f:drivers/mtd/devices/docg3.h +f:drivers/mtd/devices/mchp23k256.c +f:drivers/mtd/devices/mchp48l640.c +f:drivers/mtd/devices/ms02-nv.c +f:drivers/mtd/devices/ms02-nv.h +f:drivers/mtd/devices/mtd_dataflash.c +f:drivers/mtd/devices/mtd_intel_dg.c +f:drivers/mtd/devices/mtdram.c +f:drivers/mtd/devices/phram.c +f:drivers/mtd/devices/pmc551.c +f:drivers/mtd/devices/powernv_flash.c +f:drivers/mtd/devices/serial_flash_cmds.h +f:drivers/mtd/devices/slram.c +f:drivers/mtd/devices/spear_smi.c +f:drivers/mtd/devices/sst25l.c +f:drivers/mtd/devices/st_spi_fsm.c +f:drivers/mtd/ftl.c +f:drivers/mtd/hyperbus/Kconfig +f:drivers/mtd/hyperbus/Makefile +f:drivers/mtd/hyperbus/hbmc-am654.c +f:drivers/mtd/hyperbus/hyperbus-core.c +f:drivers/mtd/hyperbus/rpc-if.c +f:drivers/mtd/inftlcore.c +f:drivers/mtd/inftlmount.c +f:drivers/mtd/lpddr/Kconfig +f:drivers/mtd/lpddr/Makefile +f:drivers/mtd/lpddr/lpddr2_nvm.c +f:drivers/mtd/lpddr/lpddr_cmds.c +f:drivers/mtd/lpddr/qinfo_probe.c +f:drivers/mtd/maps/Kconfig +f:drivers/mtd/maps/Makefile +f:drivers/mtd/maps/amd76xrom.c +f:drivers/mtd/maps/cfi_flagadm.c +f:drivers/mtd/maps/ck804xrom.c +f:drivers/mtd/maps/dc21285.c +f:drivers/mtd/maps/esb2rom.c +f:drivers/mtd/maps/ichxrom.c +f:drivers/mtd/maps/impa7.c +f:drivers/mtd/maps/l440gx.c +f:drivers/mtd/maps/lantiq-flash.c +f:drivers/mtd/maps/map_funcs.c +f:drivers/mtd/maps/netsc520.c +f:drivers/mtd/maps/nettel.c +f:drivers/mtd/maps/pci.c +f:drivers/mtd/maps/pcmciamtd.c +f:drivers/mtd/maps/physmap-bt1-rom.c +f:drivers/mtd/maps/physmap-bt1-rom.h +f:drivers/mtd/maps/physmap-core.c +f:drivers/mtd/maps/physmap-gemini.c +f:drivers/mtd/maps/physmap-gemini.h +f:drivers/mtd/maps/physmap-ixp4xx.c +f:drivers/mtd/maps/physmap-ixp4xx.h +f:drivers/mtd/maps/physmap-versatile.c +f:drivers/mtd/maps/physmap-versatile.h +f:drivers/mtd/maps/pismo.c +f:drivers/mtd/maps/plat-ram.c +f:drivers/mtd/maps/pxa2xx-flash.c +f:drivers/mtd/maps/sa1100-flash.c +f:drivers/mtd/maps/sbc_gxx.c +f:drivers/mtd/maps/sc520cdp.c +f:drivers/mtd/maps/scb2_flash.c +f:drivers/mtd/maps/scx200_docflash.c +f:drivers/mtd/maps/solutionengine.c +f:drivers/mtd/maps/sun_uflash.c +f:drivers/mtd/maps/ts5500_flash.c +f:drivers/mtd/maps/tsunami_flash.c +f:drivers/mtd/maps/uclinux.c +f:drivers/mtd/maps/vmu-flash.c +f:drivers/mtd/mtd_blkdevs.c +f:drivers/mtd/mtdblock.c +f:drivers/mtd/mtdblock_ro.c +f:drivers/mtd/mtdchar.c +f:drivers/mtd/mtdconcat.c +f:drivers/mtd/mtdcore.c +f:drivers/mtd/mtdcore.h +f:drivers/mtd/mtdoops.c +f:drivers/mtd/mtdpart.c +f:drivers/mtd/mtdpstore.c +f:drivers/mtd/mtdsuper.c +f:drivers/mtd/mtdswap.c +f:drivers/mtd/nand/Kconfig +f:drivers/mtd/nand/Makefile +f:drivers/mtd/nand/bbt.c +f:drivers/mtd/nand/core.c +f:drivers/mtd/nand/ecc-mtk.c +f:drivers/mtd/nand/ecc-mxic.c +f:drivers/mtd/nand/ecc-sw-bch.c +f:drivers/mtd/nand/ecc-sw-hamming.c +f:drivers/mtd/nand/ecc.c +f:drivers/mtd/nand/onenand/Kconfig +f:drivers/mtd/nand/onenand/Makefile +f:drivers/mtd/nand/onenand/generic.c +f:drivers/mtd/nand/onenand/onenand_base.c +f:drivers/mtd/nand/onenand/onenand_bbt.c +f:drivers/mtd/nand/onenand/onenand_omap2.c +f:drivers/mtd/nand/onenand/onenand_samsung.c +f:drivers/mtd/nand/onenand/samsung.h +f:drivers/mtd/nand/qpic_common.c +f:drivers/mtd/nand/raw/Kconfig +f:drivers/mtd/nand/raw/Makefile +f:drivers/mtd/nand/raw/ams-delta.c +f:drivers/mtd/nand/raw/arasan-nand-controller.c +f:drivers/mtd/nand/raw/atmel/Makefile +f:drivers/mtd/nand/raw/atmel/nand-controller.c +f:drivers/mtd/nand/raw/atmel/pmecc.c +f:drivers/mtd/nand/raw/atmel/pmecc.h +f:drivers/mtd/nand/raw/au1550nd.c +f:drivers/mtd/nand/raw/bcm47xxnflash/Makefile +f:drivers/mtd/nand/raw/bcm47xxnflash/bcm47xxnflash.h +f:drivers/mtd/nand/raw/bcm47xxnflash/main.c +f:drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c +f:drivers/mtd/nand/raw/brcmnand/Kconfig +f:drivers/mtd/nand/raw/brcmnand/Makefile +f:drivers/mtd/nand/raw/brcmnand/bcm6368_nand.c +f:drivers/mtd/nand/raw/brcmnand/bcma_nand.c +f:drivers/mtd/nand/raw/brcmnand/bcmbca_nand.c +f:drivers/mtd/nand/raw/brcmnand/brcmnand.c +f:drivers/mtd/nand/raw/brcmnand/brcmnand.h +f:drivers/mtd/nand/raw/brcmnand/brcmstb_nand.c +f:drivers/mtd/nand/raw/brcmnand/iproc_nand.c +f:drivers/mtd/nand/raw/cadence-nand-controller.c +f:drivers/mtd/nand/raw/cafe_nand.c +f:drivers/mtd/nand/raw/cs553x_nand.c +f:drivers/mtd/nand/raw/davinci_nand.c +f:drivers/mtd/nand/raw/denali.c +f:drivers/mtd/nand/raw/denali.h +f:drivers/mtd/nand/raw/denali_dt.c +f:drivers/mtd/nand/raw/denali_pci.c +f:drivers/mtd/nand/raw/diskonchip.c +f:drivers/mtd/nand/raw/fsl_elbc_nand.c +f:drivers/mtd/nand/raw/fsl_ifc_nand.c +f:drivers/mtd/nand/raw/fsl_upm.c +f:drivers/mtd/nand/raw/fsmc_nand.c +f:drivers/mtd/nand/raw/gpio.c +f:drivers/mtd/nand/raw/gpmi-nand/Makefile +f:drivers/mtd/nand/raw/gpmi-nand/bch-regs.h +f:drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +f:drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h +f:drivers/mtd/nand/raw/gpmi-nand/gpmi-regs.h +f:drivers/mtd/nand/raw/hisi504_nand.c +f:drivers/mtd/nand/raw/ingenic/Kconfig +f:drivers/mtd/nand/raw/ingenic/Makefile +f:drivers/mtd/nand/raw/ingenic/ingenic_ecc.c +f:drivers/mtd/nand/raw/ingenic/ingenic_ecc.h +f:drivers/mtd/nand/raw/ingenic/ingenic_nand_drv.c +f:drivers/mtd/nand/raw/ingenic/jz4725b_bch.c +f:drivers/mtd/nand/raw/ingenic/jz4740_ecc.c +f:drivers/mtd/nand/raw/ingenic/jz4780_bch.c +f:drivers/mtd/nand/raw/intel-nand-controller.c +f:drivers/mtd/nand/raw/internals.h +f:drivers/mtd/nand/raw/loongson1-nand-controller.c +f:drivers/mtd/nand/raw/lpc32xx_mlc.c +f:drivers/mtd/nand/raw/lpc32xx_slc.c +f:drivers/mtd/nand/raw/marvell_nand.c +f:drivers/mtd/nand/raw/meson_nand.c +f:drivers/mtd/nand/raw/mpc5121_nfc.c +f:drivers/mtd/nand/raw/mtk_nand.c +f:drivers/mtd/nand/raw/mxc_nand.c +f:drivers/mtd/nand/raw/mxic_nand.c +f:drivers/mtd/nand/raw/nand_amd.c +f:drivers/mtd/nand/raw/nand_base.c +f:drivers/mtd/nand/raw/nand_bbt.c +f:drivers/mtd/nand/raw/nand_esmt.c +f:drivers/mtd/nand/raw/nand_hynix.c +f:drivers/mtd/nand/raw/nand_ids.c +f:drivers/mtd/nand/raw/nand_jedec.c +f:drivers/mtd/nand/raw/nand_legacy.c +f:drivers/mtd/nand/raw/nand_macronix.c +f:drivers/mtd/nand/raw/nand_micron.c +f:drivers/mtd/nand/raw/nand_onfi.c +f:drivers/mtd/nand/raw/nand_samsung.c +f:drivers/mtd/nand/raw/nand_sandisk.c +f:drivers/mtd/nand/raw/nand_timings.c +f:drivers/mtd/nand/raw/nand_toshiba.c +f:drivers/mtd/nand/raw/nandsim.c +f:drivers/mtd/nand/raw/ndfc.c +f:drivers/mtd/nand/raw/nuvoton-ma35d1-nand-controller.c +f:drivers/mtd/nand/raw/omap2.c +f:drivers/mtd/nand/raw/omap_elm.c +f:drivers/mtd/nand/raw/orion_nand.c +f:drivers/mtd/nand/raw/pasemi_nand.c +f:drivers/mtd/nand/raw/pl35x-nand-controller.c +f:drivers/mtd/nand/raw/plat_nand.c +f:drivers/mtd/nand/raw/qcom_nandc.c +f:drivers/mtd/nand/raw/r852.c +f:drivers/mtd/nand/raw/r852.h +f:drivers/mtd/nand/raw/renesas-nand-controller.c +f:drivers/mtd/nand/raw/rockchip-nand-controller.c +f:drivers/mtd/nand/raw/s3c2410.c +f:drivers/mtd/nand/raw/sh_flctl.c +f:drivers/mtd/nand/raw/sharpsl.c +f:drivers/mtd/nand/raw/sm_common.c +f:drivers/mtd/nand/raw/sm_common.h +f:drivers/mtd/nand/raw/socrates_nand.c +f:drivers/mtd/nand/raw/stm32_fmc2_nand.c +f:drivers/mtd/nand/raw/sunxi_nand.c +f:drivers/mtd/nand/raw/technologic-nand-controller.c +f:drivers/mtd/nand/raw/tegra_nand.c +f:drivers/mtd/nand/raw/txx9ndfmc.c +f:drivers/mtd/nand/raw/vf610_nfc.c +f:drivers/mtd/nand/raw/xway_nand.c +f:drivers/mtd/nand/spi/Kconfig +f:drivers/mtd/nand/spi/Makefile +f:drivers/mtd/nand/spi/alliancememory.c +f:drivers/mtd/nand/spi/ato.c +f:drivers/mtd/nand/spi/core.c +f:drivers/mtd/nand/spi/esmt.c +f:drivers/mtd/nand/spi/foresee.c +f:drivers/mtd/nand/spi/gigadevice.c +f:drivers/mtd/nand/spi/macronix.c +f:drivers/mtd/nand/spi/micron.c +f:drivers/mtd/nand/spi/otp.c +f:drivers/mtd/nand/spi/paragon.c +f:drivers/mtd/nand/spi/skyhigh.c +f:drivers/mtd/nand/spi/toshiba.c +f:drivers/mtd/nand/spi/winbond.c +f:drivers/mtd/nand/spi/xtx.c +f:drivers/mtd/nftlcore.c +f:drivers/mtd/nftlmount.c +f:drivers/mtd/parsers/Kconfig +f:drivers/mtd/parsers/Makefile +f:drivers/mtd/parsers/afs.c +f:drivers/mtd/parsers/bcm47xxpart.c +f:drivers/mtd/parsers/bcm63xxpart.c +f:drivers/mtd/parsers/brcm_u-boot.c +f:drivers/mtd/parsers/cmdlinepart.c +f:drivers/mtd/parsers/ofpart_bcm4908.c +f:drivers/mtd/parsers/ofpart_bcm4908.h +f:drivers/mtd/parsers/ofpart_core.c +f:drivers/mtd/parsers/ofpart_linksys_ns.c +f:drivers/mtd/parsers/ofpart_linksys_ns.h +f:drivers/mtd/parsers/parser_imagetag.c +f:drivers/mtd/parsers/parser_trx.c +f:drivers/mtd/parsers/qcomsmempart.c +f:drivers/mtd/parsers/redboot.c +f:drivers/mtd/parsers/scpart.c +f:drivers/mtd/parsers/sharpslpart.c +f:drivers/mtd/parsers/tplink_safeloader.c +f:drivers/mtd/rfd_ftl.c +f:drivers/mtd/sm_ftl.c +f:drivers/mtd/sm_ftl.h +f:drivers/mtd/spi-nor/Kconfig +f:drivers/mtd/spi-nor/Makefile +f:drivers/mtd/spi-nor/atmel.c +f:drivers/mtd/spi-nor/controllers/Kconfig +f:drivers/mtd/spi-nor/controllers/Makefile +f:drivers/mtd/spi-nor/controllers/hisi-sfc.c +f:drivers/mtd/spi-nor/controllers/nxp-spifi.c +f:drivers/mtd/spi-nor/core.c +f:drivers/mtd/spi-nor/core.h +f:drivers/mtd/spi-nor/debugfs.c +f:drivers/mtd/spi-nor/eon.c +f:drivers/mtd/spi-nor/esmt.c +f:drivers/mtd/spi-nor/everspin.c +f:drivers/mtd/spi-nor/gigadevice.c +f:drivers/mtd/spi-nor/intel.c +f:drivers/mtd/spi-nor/issi.c +f:drivers/mtd/spi-nor/macronix.c +f:drivers/mtd/spi-nor/micron-st.c +f:drivers/mtd/spi-nor/otp.c +f:drivers/mtd/spi-nor/sfdp.c +f:drivers/mtd/spi-nor/sfdp.h +f:drivers/mtd/spi-nor/spansion.c +f:drivers/mtd/spi-nor/sst.c +f:drivers/mtd/spi-nor/swp.c +f:drivers/mtd/spi-nor/sysfs.c +f:drivers/mtd/spi-nor/winbond.c +f:drivers/mtd/spi-nor/xmc.c +f:drivers/mtd/ssfdc.c +f:drivers/mtd/tests/Makefile +f:drivers/mtd/tests/mtd_nandecctest.c +f:drivers/mtd/tests/mtd_test.c +f:drivers/mtd/tests/mtd_test.h +f:drivers/mtd/tests/nandbiterrs.c +f:drivers/mtd/tests/oobtest.c +f:drivers/mtd/tests/pagetest.c +f:drivers/mtd/tests/readtest.c +f:drivers/mtd/tests/speedtest.c +f:drivers/mtd/tests/stresstest.c +f:drivers/mtd/tests/subpagetest.c +f:drivers/mtd/tests/torturetest.c +f:drivers/mtd/ubi/Kconfig +f:drivers/mtd/ubi/Makefile +f:drivers/mtd/ubi/attach.c +f:drivers/mtd/ubi/block.c +f:drivers/mtd/ubi/build.c +f:drivers/mtd/ubi/cdev.c +f:drivers/mtd/ubi/debug.c +f:drivers/mtd/ubi/debug.h +f:drivers/mtd/ubi/eba.c +f:drivers/mtd/ubi/fastmap-wl.c +f:drivers/mtd/ubi/fastmap.c +f:drivers/mtd/ubi/gluebi.c +f:drivers/mtd/ubi/io.c +f:drivers/mtd/ubi/kapi.c +f:drivers/mtd/ubi/misc.c +f:drivers/mtd/ubi/nvmem.c +f:drivers/mtd/ubi/ubi-media.h +f:drivers/mtd/ubi/ubi.h +f:drivers/mtd/ubi/upd.c +f:drivers/mtd/ubi/vmt.c +f:drivers/mtd/ubi/vtbl.c +f:drivers/mtd/ubi/wl.c +f:drivers/mtd/ubi/wl.h +f:drivers/mux/Kconfig +f:drivers/mux/Makefile +f:drivers/mux/adg792a.c +f:drivers/mux/adgs1408.c +f:drivers/mux/core.c +f:drivers/mux/gpio.c +f:drivers/mux/mmio.c +f:drivers/net/Kconfig +f:drivers/net/LICENSE.SRC +f:drivers/net/Makefile +f:drivers/net/Space.c +f:drivers/net/amt.c +f:drivers/net/arcnet/Kconfig +f:drivers/net/arcnet/Makefile +f:drivers/net/arcnet/arc-rawmode.c +f:drivers/net/arcnet/arc-rimi.c +f:drivers/net/arcnet/arcdevice.h +f:drivers/net/arcnet/arcnet.c +f:drivers/net/arcnet/capmode.c +f:drivers/net/arcnet/com20020-isa.c +f:drivers/net/arcnet/com20020-pci.c +f:drivers/net/arcnet/com20020.c +f:drivers/net/arcnet/com20020.h +f:drivers/net/arcnet/com20020_cs.c +f:drivers/net/arcnet/com9026.h +f:drivers/net/arcnet/com90io.c +f:drivers/net/arcnet/com90xx.c +f:drivers/net/arcnet/rfc1051.c +f:drivers/net/arcnet/rfc1201.c +f:drivers/net/bareudp.c +f:drivers/net/bonding/Makefile +f:drivers/net/bonding/bond_3ad.c +f:drivers/net/bonding/bond_alb.c +f:drivers/net/bonding/bond_debugfs.c +f:drivers/net/bonding/bond_main.c +f:drivers/net/bonding/bond_netlink.c +f:drivers/net/bonding/bond_options.c +f:drivers/net/bonding/bond_procfs.c +f:drivers/net/bonding/bond_sysfs.c +f:drivers/net/bonding/bond_sysfs_slave.c +f:drivers/net/bonding/bonding_priv.h +f:drivers/net/caif/Kconfig +f:drivers/net/caif/Makefile +f:drivers/net/caif/caif_serial.c +f:drivers/net/caif/caif_virtio.c +f:drivers/net/can/Kconfig +f:drivers/net/can/Makefile +f:drivers/net/can/at91_can.c +f:drivers/net/can/bxcan.c +f:drivers/net/can/c_can/Kconfig +f:drivers/net/can/c_can/Makefile +f:drivers/net/can/c_can/c_can.h +f:drivers/net/can/c_can/c_can_ethtool.c +f:drivers/net/can/c_can/c_can_main.c +f:drivers/net/can/c_can/c_can_pci.c +f:drivers/net/can/c_can/c_can_platform.c +f:drivers/net/can/can327.c +f:drivers/net/can/cc770/Kconfig +f:drivers/net/can/cc770/Makefile +f:drivers/net/can/cc770/cc770.c +f:drivers/net/can/cc770/cc770.h +f:drivers/net/can/cc770/cc770_isa.c +f:drivers/net/can/cc770/cc770_platform.c +f:drivers/net/can/ctucanfd/Kconfig +f:drivers/net/can/ctucanfd/Makefile +f:drivers/net/can/ctucanfd/ctucanfd.h +f:drivers/net/can/ctucanfd/ctucanfd_base.c +f:drivers/net/can/ctucanfd/ctucanfd_kframe.h +f:drivers/net/can/ctucanfd/ctucanfd_kregs.h +f:drivers/net/can/ctucanfd/ctucanfd_pci.c +f:drivers/net/can/ctucanfd/ctucanfd_platform.c +f:drivers/net/can/dev/Makefile +f:drivers/net/can/dev/bittiming.c +f:drivers/net/can/dev/calc_bittiming.c +f:drivers/net/can/dev/dev.c +f:drivers/net/can/dev/length.c +f:drivers/net/can/dev/netlink.c +f:drivers/net/can/dev/rx-offload.c +f:drivers/net/can/dev/skb.c +f:drivers/net/can/esd/Kconfig +f:drivers/net/can/esd/Makefile +f:drivers/net/can/esd/esd_402_pci-core.c +f:drivers/net/can/esd/esdacc.c +f:drivers/net/can/esd/esdacc.h +f:drivers/net/can/flexcan/Makefile +f:drivers/net/can/flexcan/flexcan-core.c +f:drivers/net/can/flexcan/flexcan-ethtool.c +f:drivers/net/can/flexcan/flexcan.h +f:drivers/net/can/grcan.c +f:drivers/net/can/ifi_canfd/Kconfig +f:drivers/net/can/ifi_canfd/Makefile +f:drivers/net/can/ifi_canfd/ifi_canfd.c +f:drivers/net/can/janz-ican3.c +f:drivers/net/can/kvaser_pciefd/Makefile +f:drivers/net/can/kvaser_pciefd/kvaser_pciefd.h +f:drivers/net/can/kvaser_pciefd/kvaser_pciefd_core.c +f:drivers/net/can/kvaser_pciefd/kvaser_pciefd_devlink.c +f:drivers/net/can/m_can/Kconfig +f:drivers/net/can/m_can/Makefile +f:drivers/net/can/m_can/m_can.c +f:drivers/net/can/m_can/m_can.h +f:drivers/net/can/m_can/m_can_pci.c +f:drivers/net/can/m_can/m_can_platform.c +f:drivers/net/can/m_can/tcan4x5x-core.c +f:drivers/net/can/m_can/tcan4x5x-regmap.c +f:drivers/net/can/m_can/tcan4x5x.h +f:drivers/net/can/mscan/Kconfig +f:drivers/net/can/mscan/Makefile +f:drivers/net/can/mscan/mpc5xxx_can.c +f:drivers/net/can/mscan/mscan.c +f:drivers/net/can/mscan/mscan.h +f:drivers/net/can/peak_canfd/Kconfig +f:drivers/net/can/peak_canfd/Makefile +f:drivers/net/can/peak_canfd/peak_canfd.c +f:drivers/net/can/peak_canfd/peak_canfd_user.h +f:drivers/net/can/peak_canfd/peak_pciefd_main.c +f:drivers/net/can/rcar/Kconfig +f:drivers/net/can/rcar/Makefile +f:drivers/net/can/rcar/rcar_can.c +f:drivers/net/can/rcar/rcar_canfd.c +f:drivers/net/can/rockchip/Kconfig +f:drivers/net/can/rockchip/Makefile +f:drivers/net/can/rockchip/rockchip_canfd-core.c +f:drivers/net/can/rockchip/rockchip_canfd-ethtool.c +f:drivers/net/can/rockchip/rockchip_canfd-rx.c +f:drivers/net/can/rockchip/rockchip_canfd-timestamp.c +f:drivers/net/can/rockchip/rockchip_canfd-tx.c +f:drivers/net/can/rockchip/rockchip_canfd.h +f:drivers/net/can/sja1000/Kconfig +f:drivers/net/can/sja1000/Makefile +f:drivers/net/can/sja1000/ems_pci.c +f:drivers/net/can/sja1000/ems_pcmcia.c +f:drivers/net/can/sja1000/f81601.c +f:drivers/net/can/sja1000/kvaser_pci.c +f:drivers/net/can/sja1000/peak_pci.c +f:drivers/net/can/sja1000/peak_pcmcia.c +f:drivers/net/can/sja1000/plx_pci.c +f:drivers/net/can/sja1000/sja1000.c +f:drivers/net/can/sja1000/sja1000.h +f:drivers/net/can/sja1000/sja1000_isa.c +f:drivers/net/can/sja1000/sja1000_platform.c +f:drivers/net/can/sja1000/tscan1.c +f:drivers/net/can/slcan/Makefile +f:drivers/net/can/slcan/slcan-core.c +f:drivers/net/can/slcan/slcan-ethtool.c +f:drivers/net/can/slcan/slcan.h +f:drivers/net/can/softing/Kconfig +f:drivers/net/can/softing/Makefile +f:drivers/net/can/softing/softing.h +f:drivers/net/can/softing/softing_cs.c +f:drivers/net/can/softing/softing_fw.c +f:drivers/net/can/softing/softing_main.c +f:drivers/net/can/softing/softing_platform.h +f:drivers/net/can/spi/Kconfig +f:drivers/net/can/spi/Makefile +f:drivers/net/can/spi/hi311x.c +f:drivers/net/can/spi/mcp251x.c +f:drivers/net/can/spi/mcp251xfd/Kconfig +f:drivers/net/can/spi/mcp251xfd/Makefile +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-chip-fifo.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-crc16.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-dump.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-dump.h +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.h +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-regmap.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-timestamp.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd-tx.c +f:drivers/net/can/spi/mcp251xfd/mcp251xfd.h +f:drivers/net/can/sun4i_can.c +f:drivers/net/can/ti_hecc.c +f:drivers/net/can/usb/Kconfig +f:drivers/net/can/usb/Makefile +f:drivers/net/can/usb/ems_usb.c +f:drivers/net/can/usb/esd_usb.c +f:drivers/net/can/usb/etas_es58x/Makefile +f:drivers/net/can/usb/etas_es58x/es581_4.c +f:drivers/net/can/usb/etas_es58x/es581_4.h +f:drivers/net/can/usb/etas_es58x/es58x_core.c +f:drivers/net/can/usb/etas_es58x/es58x_core.h +f:drivers/net/can/usb/etas_es58x/es58x_devlink.c +f:drivers/net/can/usb/etas_es58x/es58x_fd.c +f:drivers/net/can/usb/etas_es58x/es58x_fd.h +f:drivers/net/can/usb/f81604.c +f:drivers/net/can/usb/gs_usb.c +f:drivers/net/can/usb/kvaser_usb/Makefile +f:drivers/net/can/usb/kvaser_usb/kvaser_usb.h +f:drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c +f:drivers/net/can/usb/kvaser_usb/kvaser_usb_devlink.c +f:drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c +f:drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c +f:drivers/net/can/usb/mcba_usb.c +f:drivers/net/can/usb/peak_usb/Makefile +f:drivers/net/can/usb/peak_usb/pcan_usb.c +f:drivers/net/can/usb/peak_usb/pcan_usb_core.c +f:drivers/net/can/usb/peak_usb/pcan_usb_core.h +f:drivers/net/can/usb/peak_usb/pcan_usb_fd.c +f:drivers/net/can/usb/peak_usb/pcan_usb_pro.c +f:drivers/net/can/usb/peak_usb/pcan_usb_pro.h +f:drivers/net/can/usb/ucan.c +f:drivers/net/can/usb/usb_8dev.c +f:drivers/net/can/vcan.c +f:drivers/net/can/vxcan.c +f:drivers/net/can/xilinx_can.c +f:drivers/net/dsa/Kconfig +f:drivers/net/dsa/Makefile +f:drivers/net/dsa/b53/Kconfig +f:drivers/net/dsa/b53/Makefile +f:drivers/net/dsa/b53/b53_common.c +f:drivers/net/dsa/b53/b53_mdio.c +f:drivers/net/dsa/b53/b53_mmap.c +f:drivers/net/dsa/b53/b53_priv.h +f:drivers/net/dsa/b53/b53_regs.h +f:drivers/net/dsa/b53/b53_serdes.c +f:drivers/net/dsa/b53/b53_serdes.h +f:drivers/net/dsa/b53/b53_spi.c +f:drivers/net/dsa/b53/b53_srab.c +f:drivers/net/dsa/bcm_sf2.c +f:drivers/net/dsa/bcm_sf2.h +f:drivers/net/dsa/bcm_sf2_cfp.c +f:drivers/net/dsa/bcm_sf2_regs.h +f:drivers/net/dsa/dsa_loop.c +f:drivers/net/dsa/dsa_loop.h +f:drivers/net/dsa/dsa_loop_bdinfo.c +f:drivers/net/dsa/hirschmann/Kconfig +f:drivers/net/dsa/hirschmann/Makefile +f:drivers/net/dsa/hirschmann/hellcreek.c +f:drivers/net/dsa/hirschmann/hellcreek.h +f:drivers/net/dsa/hirschmann/hellcreek_hwtstamp.c +f:drivers/net/dsa/hirschmann/hellcreek_hwtstamp.h +f:drivers/net/dsa/hirschmann/hellcreek_ptp.c +f:drivers/net/dsa/hirschmann/hellcreek_ptp.h +f:drivers/net/dsa/lan9303-core.c +f:drivers/net/dsa/lan9303.h +f:drivers/net/dsa/lan9303_i2c.c +f:drivers/net/dsa/lan9303_mdio.c +f:drivers/net/dsa/lantiq_gswip.c +f:drivers/net/dsa/lantiq_pce.h +f:drivers/net/dsa/microchip/Kconfig +f:drivers/net/dsa/microchip/Makefile +f:drivers/net/dsa/microchip/ksz8.c +f:drivers/net/dsa/microchip/ksz8.h +f:drivers/net/dsa/microchip/ksz8863_smi.c +f:drivers/net/dsa/microchip/ksz8_reg.h +f:drivers/net/dsa/microchip/ksz9477.c +f:drivers/net/dsa/microchip/ksz9477.h +f:drivers/net/dsa/microchip/ksz9477_acl.c +f:drivers/net/dsa/microchip/ksz9477_i2c.c +f:drivers/net/dsa/microchip/ksz9477_reg.h +f:drivers/net/dsa/microchip/ksz9477_tc_flower.c +f:drivers/net/dsa/microchip/ksz_common.c +f:drivers/net/dsa/microchip/ksz_common.h +f:drivers/net/dsa/microchip/ksz_dcb.c +f:drivers/net/dsa/microchip/ksz_dcb.h +f:drivers/net/dsa/microchip/ksz_ptp.c +f:drivers/net/dsa/microchip/ksz_ptp.h +f:drivers/net/dsa/microchip/ksz_ptp_reg.h +f:drivers/net/dsa/microchip/ksz_spi.c +f:drivers/net/dsa/microchip/lan937x.h +f:drivers/net/dsa/microchip/lan937x_main.c +f:drivers/net/dsa/microchip/lan937x_reg.h +f:drivers/net/dsa/mt7530-mdio.c +f:drivers/net/dsa/mt7530-mmio.c +f:drivers/net/dsa/mt7530.c +f:drivers/net/dsa/mt7530.h +f:drivers/net/dsa/mv88e6060.c +f:drivers/net/dsa/mv88e6060.h +f:drivers/net/dsa/mv88e6xxx/Kconfig +f:drivers/net/dsa/mv88e6xxx/Makefile +f:drivers/net/dsa/mv88e6xxx/chip.c +f:drivers/net/dsa/mv88e6xxx/chip.h +f:drivers/net/dsa/mv88e6xxx/devlink.c +f:drivers/net/dsa/mv88e6xxx/devlink.h +f:drivers/net/dsa/mv88e6xxx/global1.c +f:drivers/net/dsa/mv88e6xxx/global1.h +f:drivers/net/dsa/mv88e6xxx/global1_atu.c +f:drivers/net/dsa/mv88e6xxx/global1_vtu.c +f:drivers/net/dsa/mv88e6xxx/global2.c +f:drivers/net/dsa/mv88e6xxx/global2.h +f:drivers/net/dsa/mv88e6xxx/global2_avb.c +f:drivers/net/dsa/mv88e6xxx/global2_scratch.c +f:drivers/net/dsa/mv88e6xxx/hwtstamp.c +f:drivers/net/dsa/mv88e6xxx/hwtstamp.h +f:drivers/net/dsa/mv88e6xxx/leds.c +f:drivers/net/dsa/mv88e6xxx/pcs-6185.c +f:drivers/net/dsa/mv88e6xxx/pcs-6352.c +f:drivers/net/dsa/mv88e6xxx/pcs-639x.c +f:drivers/net/dsa/mv88e6xxx/phy.c +f:drivers/net/dsa/mv88e6xxx/phy.h +f:drivers/net/dsa/mv88e6xxx/port.c +f:drivers/net/dsa/mv88e6xxx/port.h +f:drivers/net/dsa/mv88e6xxx/port_hidden.c +f:drivers/net/dsa/mv88e6xxx/ptp.c +f:drivers/net/dsa/mv88e6xxx/ptp.h +f:drivers/net/dsa/mv88e6xxx/serdes.c +f:drivers/net/dsa/mv88e6xxx/serdes.h +f:drivers/net/dsa/mv88e6xxx/smi.c +f:drivers/net/dsa/mv88e6xxx/smi.h +f:drivers/net/dsa/mv88e6xxx/switchdev.c +f:drivers/net/dsa/mv88e6xxx/switchdev.h +f:drivers/net/dsa/mv88e6xxx/trace.c +f:drivers/net/dsa/mv88e6xxx/trace.h +f:drivers/net/dsa/ocelot/Kconfig +f:drivers/net/dsa/ocelot/Makefile +f:drivers/net/dsa/ocelot/felix.c +f:drivers/net/dsa/ocelot/felix.h +f:drivers/net/dsa/ocelot/felix_vsc9959.c +f:drivers/net/dsa/ocelot/ocelot_ext.c +f:drivers/net/dsa/ocelot/seville_vsc9953.c +f:drivers/net/dsa/qca/Kconfig +f:drivers/net/dsa/qca/Makefile +f:drivers/net/dsa/qca/ar9331.c +f:drivers/net/dsa/qca/qca8k-8xxx.c +f:drivers/net/dsa/qca/qca8k-common.c +f:drivers/net/dsa/qca/qca8k-leds.c +f:drivers/net/dsa/qca/qca8k.h +f:drivers/net/dsa/qca/qca8k_leds.h +f:drivers/net/dsa/realtek/Kconfig +f:drivers/net/dsa/realtek/Makefile +f:drivers/net/dsa/realtek/realtek-mdio.c +f:drivers/net/dsa/realtek/realtek-mdio.h +f:drivers/net/dsa/realtek/realtek-smi.c +f:drivers/net/dsa/realtek/realtek-smi.h +f:drivers/net/dsa/realtek/realtek.h +f:drivers/net/dsa/realtek/rtl8365mb.c +f:drivers/net/dsa/realtek/rtl8366-core.c +f:drivers/net/dsa/realtek/rtl8366rb-leds.c +f:drivers/net/dsa/realtek/rtl8366rb.c +f:drivers/net/dsa/realtek/rtl8366rb.h +f:drivers/net/dsa/realtek/rtl83xx.c +f:drivers/net/dsa/realtek/rtl83xx.h +f:drivers/net/dsa/rzn1_a5psw.c +f:drivers/net/dsa/rzn1_a5psw.h +f:drivers/net/dsa/sja1105/Kconfig +f:drivers/net/dsa/sja1105/Makefile +f:drivers/net/dsa/sja1105/sja1105.h +f:drivers/net/dsa/sja1105/sja1105_clocking.c +f:drivers/net/dsa/sja1105/sja1105_devlink.c +f:drivers/net/dsa/sja1105/sja1105_dynamic_config.c +f:drivers/net/dsa/sja1105/sja1105_dynamic_config.h +f:drivers/net/dsa/sja1105/sja1105_ethtool.c +f:drivers/net/dsa/sja1105/sja1105_flower.c +f:drivers/net/dsa/sja1105/sja1105_main.c +f:drivers/net/dsa/sja1105/sja1105_mdio.c +f:drivers/net/dsa/sja1105/sja1105_ptp.c +f:drivers/net/dsa/sja1105/sja1105_ptp.h +f:drivers/net/dsa/sja1105/sja1105_spi.c +f:drivers/net/dsa/sja1105/sja1105_static_config.c +f:drivers/net/dsa/sja1105/sja1105_static_config.h +f:drivers/net/dsa/sja1105/sja1105_tas.c +f:drivers/net/dsa/sja1105/sja1105_tas.h +f:drivers/net/dsa/sja1105/sja1105_vl.c +f:drivers/net/dsa/sja1105/sja1105_vl.h +f:drivers/net/dsa/vitesse-vsc73xx-core.c +f:drivers/net/dsa/vitesse-vsc73xx-platform.c +f:drivers/net/dsa/vitesse-vsc73xx-spi.c +f:drivers/net/dsa/vitesse-vsc73xx.h +f:drivers/net/dsa/xrs700x/Kconfig +f:drivers/net/dsa/xrs700x/Makefile +f:drivers/net/dsa/xrs700x/xrs700x.c +f:drivers/net/dsa/xrs700x/xrs700x.h +f:drivers/net/dsa/xrs700x/xrs700x_i2c.c +f:drivers/net/dsa/xrs700x/xrs700x_mdio.c +f:drivers/net/dsa/xrs700x/xrs700x_reg.h +f:drivers/net/dummy.c +f:drivers/net/eql.c +f:drivers/net/ethernet/3com/3c509.c +f:drivers/net/ethernet/3com/3c515.c +f:drivers/net/ethernet/3com/3c574_cs.c +f:drivers/net/ethernet/3com/3c589_cs.c +f:drivers/net/ethernet/3com/3c59x.c +f:drivers/net/ethernet/3com/Kconfig +f:drivers/net/ethernet/3com/Makefile +f:drivers/net/ethernet/3com/typhoon.c +f:drivers/net/ethernet/3com/typhoon.h +f:drivers/net/ethernet/8390/8390.c +f:drivers/net/ethernet/8390/8390.h +f:drivers/net/ethernet/8390/8390p.c +f:drivers/net/ethernet/8390/Kconfig +f:drivers/net/ethernet/8390/Makefile +f:drivers/net/ethernet/8390/apne.c +f:drivers/net/ethernet/8390/ax88796.c +f:drivers/net/ethernet/8390/axnet_cs.c +f:drivers/net/ethernet/8390/etherh.c +f:drivers/net/ethernet/8390/hydra.c +f:drivers/net/ethernet/8390/lib8390.c +f:drivers/net/ethernet/8390/mac8390.c +f:drivers/net/ethernet/8390/mcf8390.c +f:drivers/net/ethernet/8390/ne.c +f:drivers/net/ethernet/8390/ne2k-pci.c +f:drivers/net/ethernet/8390/pcnet_cs.c +f:drivers/net/ethernet/8390/smc-ultra.c +f:drivers/net/ethernet/8390/stnic.c +f:drivers/net/ethernet/8390/wd.c +f:drivers/net/ethernet/8390/xsurf100.c +f:drivers/net/ethernet/8390/zorro8390.c +f:drivers/net/ethernet/Kconfig +f:drivers/net/ethernet/Makefile +f:drivers/net/ethernet/actions/Kconfig +f:drivers/net/ethernet/actions/Makefile +f:drivers/net/ethernet/actions/owl-emac.c +f:drivers/net/ethernet/actions/owl-emac.h +f:drivers/net/ethernet/adaptec/Kconfig +f:drivers/net/ethernet/adaptec/Makefile +f:drivers/net/ethernet/adaptec/starfire.c +f:drivers/net/ethernet/adi/Kconfig +f:drivers/net/ethernet/adi/Makefile +f:drivers/net/ethernet/adi/adin1110.c +f:drivers/net/ethernet/aeroflex/Kconfig +f:drivers/net/ethernet/aeroflex/Makefile +f:drivers/net/ethernet/aeroflex/greth.c +f:drivers/net/ethernet/aeroflex/greth.h +f:drivers/net/ethernet/agere/Kconfig +f:drivers/net/ethernet/agere/Makefile +f:drivers/net/ethernet/agere/et131x.c +f:drivers/net/ethernet/agere/et131x.h +f:drivers/net/ethernet/airoha/Kconfig +f:drivers/net/ethernet/airoha/Makefile +f:drivers/net/ethernet/airoha/airoha_eth.c +f:drivers/net/ethernet/airoha/airoha_eth.h +f:drivers/net/ethernet/airoha/airoha_npu.c +f:drivers/net/ethernet/airoha/airoha_npu.h +f:drivers/net/ethernet/airoha/airoha_ppe.c +f:drivers/net/ethernet/airoha/airoha_ppe_debugfs.c +f:drivers/net/ethernet/airoha/airoha_regs.h +f:drivers/net/ethernet/alacritech/Kconfig +f:drivers/net/ethernet/alacritech/Makefile +f:drivers/net/ethernet/alacritech/slic.h +f:drivers/net/ethernet/alacritech/slicoss.c +f:drivers/net/ethernet/allwinner/Kconfig +f:drivers/net/ethernet/allwinner/Makefile +f:drivers/net/ethernet/allwinner/sun4i-emac.c +f:drivers/net/ethernet/allwinner/sun4i-emac.h +f:drivers/net/ethernet/alteon/Kconfig +f:drivers/net/ethernet/alteon/Makefile +f:drivers/net/ethernet/alteon/acenic.c +f:drivers/net/ethernet/alteon/acenic.h +f:drivers/net/ethernet/altera/Kconfig +f:drivers/net/ethernet/altera/Makefile +f:drivers/net/ethernet/altera/altera_msgdma.c +f:drivers/net/ethernet/altera/altera_msgdma.h +f:drivers/net/ethernet/altera/altera_msgdmahw.h +f:drivers/net/ethernet/altera/altera_sgdma.c +f:drivers/net/ethernet/altera/altera_sgdma.h +f:drivers/net/ethernet/altera/altera_sgdmahw.h +f:drivers/net/ethernet/altera/altera_tse.h +f:drivers/net/ethernet/altera/altera_tse_ethtool.c +f:drivers/net/ethernet/altera/altera_tse_main.c +f:drivers/net/ethernet/altera/altera_utils.c +f:drivers/net/ethernet/altera/altera_utils.h +f:drivers/net/ethernet/amazon/Kconfig +f:drivers/net/ethernet/amazon/Makefile +f:drivers/net/ethernet/amazon/ena/Makefile +f:drivers/net/ethernet/amazon/ena/ena_admin_defs.h +f:drivers/net/ethernet/amazon/ena/ena_com.c +f:drivers/net/ethernet/amazon/ena/ena_com.h +f:drivers/net/ethernet/amazon/ena/ena_common_defs.h +f:drivers/net/ethernet/amazon/ena/ena_debugfs.c +f:drivers/net/ethernet/amazon/ena/ena_debugfs.h +f:drivers/net/ethernet/amazon/ena/ena_devlink.c +f:drivers/net/ethernet/amazon/ena/ena_devlink.h +f:drivers/net/ethernet/amazon/ena/ena_eth_com.c +f:drivers/net/ethernet/amazon/ena/ena_eth_com.h +f:drivers/net/ethernet/amazon/ena/ena_eth_io_defs.h +f:drivers/net/ethernet/amazon/ena/ena_ethtool.c +f:drivers/net/ethernet/amazon/ena/ena_netdev.c +f:drivers/net/ethernet/amazon/ena/ena_netdev.h +f:drivers/net/ethernet/amazon/ena/ena_pci_id_tbl.h +f:drivers/net/ethernet/amazon/ena/ena_phc.c +f:drivers/net/ethernet/amazon/ena/ena_phc.h +f:drivers/net/ethernet/amazon/ena/ena_regs_defs.h +f:drivers/net/ethernet/amazon/ena/ena_xdp.c +f:drivers/net/ethernet/amazon/ena/ena_xdp.h +f:drivers/net/ethernet/amd/7990.c +f:drivers/net/ethernet/amd/7990.h +f:drivers/net/ethernet/amd/Kconfig +f:drivers/net/ethernet/amd/Makefile +f:drivers/net/ethernet/amd/a2065.c +f:drivers/net/ethernet/amd/a2065.h +f:drivers/net/ethernet/amd/amd8111e.c +f:drivers/net/ethernet/amd/amd8111e.h +f:drivers/net/ethernet/amd/ariadne.c +f:drivers/net/ethernet/amd/ariadne.h +f:drivers/net/ethernet/amd/atarilance.c +f:drivers/net/ethernet/amd/au1000_eth.c +f:drivers/net/ethernet/amd/au1000_eth.h +f:drivers/net/ethernet/amd/declance.c +f:drivers/net/ethernet/amd/hplance.c +f:drivers/net/ethernet/amd/hplance.h +f:drivers/net/ethernet/amd/lance.c +f:drivers/net/ethernet/amd/mvme147.c +f:drivers/net/ethernet/amd/nmclan_cs.c +f:drivers/net/ethernet/amd/pcnet32.c +f:drivers/net/ethernet/amd/pds_core/Makefile +f:drivers/net/ethernet/amd/pds_core/adminq.c +f:drivers/net/ethernet/amd/pds_core/auxbus.c +f:drivers/net/ethernet/amd/pds_core/core.c +f:drivers/net/ethernet/amd/pds_core/core.h +f:drivers/net/ethernet/amd/pds_core/debugfs.c +f:drivers/net/ethernet/amd/pds_core/dev.c +f:drivers/net/ethernet/amd/pds_core/devlink.c +f:drivers/net/ethernet/amd/pds_core/fw.c +f:drivers/net/ethernet/amd/pds_core/main.c +f:drivers/net/ethernet/amd/sun3lance.c +f:drivers/net/ethernet/amd/sunlance.c +f:drivers/net/ethernet/amd/xgbe/Makefile +f:drivers/net/ethernet/amd/xgbe/xgbe-common.h +f:drivers/net/ethernet/amd/xgbe/xgbe-dcb.c +f:drivers/net/ethernet/amd/xgbe/xgbe-debugfs.c +f:drivers/net/ethernet/amd/xgbe/xgbe-desc.c +f:drivers/net/ethernet/amd/xgbe/xgbe-dev.c +f:drivers/net/ethernet/amd/xgbe/xgbe-drv.c +f:drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +f:drivers/net/ethernet/amd/xgbe/xgbe-hwtstamp.c +f:drivers/net/ethernet/amd/xgbe/xgbe-i2c.c +f:drivers/net/ethernet/amd/xgbe/xgbe-main.c +f:drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +f:drivers/net/ethernet/amd/xgbe/xgbe-pci.c +f:drivers/net/ethernet/amd/xgbe/xgbe-phy-v1.c +f:drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +f:drivers/net/ethernet/amd/xgbe/xgbe-platform.c +f:drivers/net/ethernet/amd/xgbe/xgbe-ptp.c +f:drivers/net/ethernet/amd/xgbe/xgbe-smn.h +f:drivers/net/ethernet/amd/xgbe/xgbe.h +f:drivers/net/ethernet/apm/Kconfig +f:drivers/net/ethernet/apm/Makefile +f:drivers/net/ethernet/apm/xgene-v2/Kconfig +f:drivers/net/ethernet/apm/xgene-v2/Makefile +f:drivers/net/ethernet/apm/xgene-v2/enet.c +f:drivers/net/ethernet/apm/xgene-v2/enet.h +f:drivers/net/ethernet/apm/xgene-v2/ethtool.c +f:drivers/net/ethernet/apm/xgene-v2/ethtool.h +f:drivers/net/ethernet/apm/xgene-v2/mac.c +f:drivers/net/ethernet/apm/xgene-v2/mac.h +f:drivers/net/ethernet/apm/xgene-v2/main.c +f:drivers/net/ethernet/apm/xgene-v2/main.h +f:drivers/net/ethernet/apm/xgene-v2/mdio.c +f:drivers/net/ethernet/apm/xgene-v2/ring.c +f:drivers/net/ethernet/apm/xgene-v2/ring.h +f:drivers/net/ethernet/apm/xgene/Kconfig +f:drivers/net/ethernet/apm/xgene/Makefile +f:drivers/net/ethernet/apm/xgene/xgene_enet_cle.c +f:drivers/net/ethernet/apm/xgene/xgene_enet_cle.h +f:drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c +f:drivers/net/ethernet/apm/xgene/xgene_enet_hw.c +f:drivers/net/ethernet/apm/xgene/xgene_enet_hw.h +f:drivers/net/ethernet/apm/xgene/xgene_enet_main.c +f:drivers/net/ethernet/apm/xgene/xgene_enet_main.h +f:drivers/net/ethernet/apm/xgene/xgene_enet_ring2.c +f:drivers/net/ethernet/apm/xgene/xgene_enet_ring2.h +f:drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c +f:drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.h +f:drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c +f:drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.h +f:drivers/net/ethernet/apple/Kconfig +f:drivers/net/ethernet/apple/Makefile +f:drivers/net/ethernet/apple/bmac.c +f:drivers/net/ethernet/apple/bmac.h +f:drivers/net/ethernet/apple/mace.c +f:drivers/net/ethernet/apple/mace.h +f:drivers/net/ethernet/apple/macmace.c +f:drivers/net/ethernet/aquantia/Kconfig +f:drivers/net/ethernet/aquantia/Makefile +f:drivers/net/ethernet/aquantia/atlantic/Makefile +f:drivers/net/ethernet/aquantia/atlantic/aq_cfg.h +f:drivers/net/ethernet/aquantia/atlantic/aq_common.h +f:drivers/net/ethernet/aquantia/atlantic/aq_drvinfo.c +f:drivers/net/ethernet/aquantia/atlantic/aq_drvinfo.h +f:drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c +f:drivers/net/ethernet/aquantia/atlantic/aq_ethtool.h +f:drivers/net/ethernet/aquantia/atlantic/aq_filters.c +f:drivers/net/ethernet/aquantia/atlantic/aq_filters.h +f:drivers/net/ethernet/aquantia/atlantic/aq_hw.h +f:drivers/net/ethernet/aquantia/atlantic/aq_hw_utils.c +f:drivers/net/ethernet/aquantia/atlantic/aq_hw_utils.h +f:drivers/net/ethernet/aquantia/atlantic/aq_macsec.c +f:drivers/net/ethernet/aquantia/atlantic/aq_macsec.h +f:drivers/net/ethernet/aquantia/atlantic/aq_main.c +f:drivers/net/ethernet/aquantia/atlantic/aq_main.h +f:drivers/net/ethernet/aquantia/atlantic/aq_nic.c +f:drivers/net/ethernet/aquantia/atlantic/aq_nic.h +f:drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c +f:drivers/net/ethernet/aquantia/atlantic/aq_pci_func.h +f:drivers/net/ethernet/aquantia/atlantic/aq_phy.c +f:drivers/net/ethernet/aquantia/atlantic/aq_phy.h +f:drivers/net/ethernet/aquantia/atlantic/aq_ptp.c +f:drivers/net/ethernet/aquantia/atlantic/aq_ptp.h +f:drivers/net/ethernet/aquantia/atlantic/aq_ring.c +f:drivers/net/ethernet/aquantia/atlantic/aq_ring.h +f:drivers/net/ethernet/aquantia/atlantic/aq_rss.h +f:drivers/net/ethernet/aquantia/atlantic/aq_utils.h +f:drivers/net/ethernet/aquantia/atlantic/aq_vec.c +f:drivers/net/ethernet/aquantia/atlantic/aq_vec.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0_internal.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_internal.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.c +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh_internal.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils.c +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils.h +f:drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c +f:drivers/net/ethernet/aquantia/atlantic/macsec/MSS_Egress_registers.h +f:drivers/net/ethernet/aquantia/atlantic/macsec/MSS_Ingress_registers.h +f:drivers/net/ethernet/aquantia/atlantic/macsec/macsec_api.c +f:drivers/net/ethernet/aquantia/atlantic/macsec/macsec_api.h +f:drivers/net/ethernet/aquantia/atlantic/macsec/macsec_struct.h +f:drivers/net/ethernet/arc/Kconfig +f:drivers/net/ethernet/arc/Makefile +f:drivers/net/ethernet/arc/emac.h +f:drivers/net/ethernet/arc/emac_main.c +f:drivers/net/ethernet/arc/emac_mdio.c +f:drivers/net/ethernet/arc/emac_rockchip.c +f:drivers/net/ethernet/asix/Kconfig +f:drivers/net/ethernet/asix/Makefile +f:drivers/net/ethernet/asix/ax88796c_ioctl.c +f:drivers/net/ethernet/asix/ax88796c_ioctl.h +f:drivers/net/ethernet/asix/ax88796c_main.c +f:drivers/net/ethernet/asix/ax88796c_main.h +f:drivers/net/ethernet/asix/ax88796c_spi.c +f:drivers/net/ethernet/asix/ax88796c_spi.h +f:drivers/net/ethernet/atheros/Kconfig +f:drivers/net/ethernet/atheros/Makefile +f:drivers/net/ethernet/atheros/ag71xx.c +f:drivers/net/ethernet/atheros/alx/Makefile +f:drivers/net/ethernet/atheros/alx/alx.h +f:drivers/net/ethernet/atheros/alx/ethtool.c +f:drivers/net/ethernet/atheros/alx/hw.c +f:drivers/net/ethernet/atheros/alx/hw.h +f:drivers/net/ethernet/atheros/alx/main.c +f:drivers/net/ethernet/atheros/alx/reg.h +f:drivers/net/ethernet/atheros/atl1c/Makefile +f:drivers/net/ethernet/atheros/atl1c/atl1c.h +f:drivers/net/ethernet/atheros/atl1c/atl1c_ethtool.c +f:drivers/net/ethernet/atheros/atl1c/atl1c_hw.c +f:drivers/net/ethernet/atheros/atl1c/atl1c_hw.h +f:drivers/net/ethernet/atheros/atl1c/atl1c_main.c +f:drivers/net/ethernet/atheros/atl1e/Makefile +f:drivers/net/ethernet/atheros/atl1e/atl1e.h +f:drivers/net/ethernet/atheros/atl1e/atl1e_ethtool.c +f:drivers/net/ethernet/atheros/atl1e/atl1e_hw.c +f:drivers/net/ethernet/atheros/atl1e/atl1e_hw.h +f:drivers/net/ethernet/atheros/atl1e/atl1e_main.c +f:drivers/net/ethernet/atheros/atl1e/atl1e_param.c +f:drivers/net/ethernet/atheros/atlx/Makefile +f:drivers/net/ethernet/atheros/atlx/atl1.c +f:drivers/net/ethernet/atheros/atlx/atl1.h +f:drivers/net/ethernet/atheros/atlx/atl2.c +f:drivers/net/ethernet/atheros/atlx/atl2.h +f:drivers/net/ethernet/atheros/atlx/atlx.c +f:drivers/net/ethernet/atheros/atlx/atlx.h +f:drivers/net/ethernet/broadcom/Kconfig +f:drivers/net/ethernet/broadcom/Makefile +f:drivers/net/ethernet/broadcom/asp2/Makefile +f:drivers/net/ethernet/broadcom/asp2/bcmasp.c +f:drivers/net/ethernet/broadcom/asp2/bcmasp.h +f:drivers/net/ethernet/broadcom/asp2/bcmasp_ethtool.c +f:drivers/net/ethernet/broadcom/asp2/bcmasp_intf.c +f:drivers/net/ethernet/broadcom/asp2/bcmasp_intf_defs.h +f:drivers/net/ethernet/broadcom/b44.c +f:drivers/net/ethernet/broadcom/b44.h +f:drivers/net/ethernet/broadcom/bcm4908_enet.c +f:drivers/net/ethernet/broadcom/bcm4908_enet.h +f:drivers/net/ethernet/broadcom/bcm63xx_enet.c +f:drivers/net/ethernet/broadcom/bcm63xx_enet.h +f:drivers/net/ethernet/broadcom/bcmsysport.c +f:drivers/net/ethernet/broadcom/bcmsysport.h +f:drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c +f:drivers/net/ethernet/broadcom/bgmac-bcma.c +f:drivers/net/ethernet/broadcom/bgmac-platform.c +f:drivers/net/ethernet/broadcom/bgmac.c +f:drivers/net/ethernet/broadcom/bgmac.h +f:drivers/net/ethernet/broadcom/bnge/Makefile +f:drivers/net/ethernet/broadcom/bnge/bnge.h +f:drivers/net/ethernet/broadcom/bnge/bnge_core.c +f:drivers/net/ethernet/broadcom/bnge/bnge_devlink.c +f:drivers/net/ethernet/broadcom/bnge/bnge_devlink.h +f:drivers/net/ethernet/broadcom/bnge/bnge_ethtool.c +f:drivers/net/ethernet/broadcom/bnge/bnge_ethtool.h +f:drivers/net/ethernet/broadcom/bnge/bnge_hwrm.c +f:drivers/net/ethernet/broadcom/bnge/bnge_hwrm.h +f:drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c +f:drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h +f:drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +f:drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +f:drivers/net/ethernet/broadcom/bnge/bnge_resc.c +f:drivers/net/ethernet/broadcom/bnge/bnge_resc.h +f:drivers/net/ethernet/broadcom/bnge/bnge_rmem.c +f:drivers/net/ethernet/broadcom/bnge/bnge_rmem.h +f:drivers/net/ethernet/broadcom/bnx2.c +f:drivers/net/ethernet/broadcom/bnx2.h +f:drivers/net/ethernet/broadcom/bnx2_fw.h +f:drivers/net/ethernet/broadcom/bnx2x/Makefile +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_dump.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_file_hdr.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_init.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_mfw_req.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_self_test.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c +f:drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.h +f:drivers/net/ethernet/broadcom/bnxt/Makefile +f:drivers/net/ethernet/broadcom/bnxt/bnxt.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_debugfs.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_debugfs.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_dim.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_fw_hdr.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_hwrm.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_hwrm.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_nvm_defs.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_tc.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.h +f:drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +f:drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +f:drivers/net/ethernet/broadcom/cnic.c +f:drivers/net/ethernet/broadcom/cnic.h +f:drivers/net/ethernet/broadcom/cnic_defs.h +f:drivers/net/ethernet/broadcom/cnic_if.h +f:drivers/net/ethernet/broadcom/genet/Makefile +f:drivers/net/ethernet/broadcom/genet/bcmgenet.c +f:drivers/net/ethernet/broadcom/genet/bcmgenet.h +f:drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c +f:drivers/net/ethernet/broadcom/genet/bcmmii.c +f:drivers/net/ethernet/broadcom/sb1250-mac.c +f:drivers/net/ethernet/broadcom/tg3.c +f:drivers/net/ethernet/broadcom/tg3.h +f:drivers/net/ethernet/broadcom/unimac.h +f:drivers/net/ethernet/brocade/Kconfig +f:drivers/net/ethernet/brocade/Makefile +f:drivers/net/ethernet/brocade/bna/Kconfig +f:drivers/net/ethernet/brocade/bna/Makefile +f:drivers/net/ethernet/brocade/bna/bfa_cee.c +f:drivers/net/ethernet/brocade/bna/bfa_cee.h +f:drivers/net/ethernet/brocade/bna/bfa_cs.h +f:drivers/net/ethernet/brocade/bna/bfa_defs.h +f:drivers/net/ethernet/brocade/bna/bfa_defs_cna.h +f:drivers/net/ethernet/brocade/bna/bfa_defs_mfg_comm.h +f:drivers/net/ethernet/brocade/bna/bfa_defs_status.h +f:drivers/net/ethernet/brocade/bna/bfa_ioc.c +f:drivers/net/ethernet/brocade/bna/bfa_ioc.h +f:drivers/net/ethernet/brocade/bna/bfa_ioc_ct.c +f:drivers/net/ethernet/brocade/bna/bfa_msgq.c +f:drivers/net/ethernet/brocade/bna/bfa_msgq.h +f:drivers/net/ethernet/brocade/bna/bfi.h +f:drivers/net/ethernet/brocade/bna/bfi_cna.h +f:drivers/net/ethernet/brocade/bna/bfi_enet.h +f:drivers/net/ethernet/brocade/bna/bfi_reg.h +f:drivers/net/ethernet/brocade/bna/bna.h +f:drivers/net/ethernet/brocade/bna/bna_enet.c +f:drivers/net/ethernet/brocade/bna/bna_hw_defs.h +f:drivers/net/ethernet/brocade/bna/bna_tx_rx.c +f:drivers/net/ethernet/brocade/bna/bna_types.h +f:drivers/net/ethernet/brocade/bna/bnad.c +f:drivers/net/ethernet/brocade/bna/bnad.h +f:drivers/net/ethernet/brocade/bna/bnad_debugfs.c +f:drivers/net/ethernet/brocade/bna/bnad_ethtool.c +f:drivers/net/ethernet/brocade/bna/cna.h +f:drivers/net/ethernet/brocade/bna/cna_fwimg.c +f:drivers/net/ethernet/cadence/Kconfig +f:drivers/net/ethernet/cadence/Makefile +f:drivers/net/ethernet/cadence/macb.h +f:drivers/net/ethernet/cadence/macb_main.c +f:drivers/net/ethernet/cadence/macb_pci.c +f:drivers/net/ethernet/cadence/macb_ptp.c +f:drivers/net/ethernet/calxeda/Kconfig +f:drivers/net/ethernet/calxeda/Makefile +f:drivers/net/ethernet/calxeda/xgmac.c +f:drivers/net/ethernet/cavium/Kconfig +f:drivers/net/ethernet/cavium/Makefile +f:drivers/net/ethernet/cavium/common/Makefile +f:drivers/net/ethernet/cavium/common/cavium_ptp.c +f:drivers/net/ethernet/cavium/common/cavium_ptp.h +f:drivers/net/ethernet/cavium/liquidio/Makefile +f:drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c +f:drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h +f:drivers/net/ethernet/cavium/liquidio/cn23xx_pf_regs.h +f:drivers/net/ethernet/cavium/liquidio/cn23xx_vf_device.c +f:drivers/net/ethernet/cavium/liquidio/cn23xx_vf_device.h +f:drivers/net/ethernet/cavium/liquidio/cn23xx_vf_regs.h +f:drivers/net/ethernet/cavium/liquidio/cn66xx_device.c +f:drivers/net/ethernet/cavium/liquidio/cn66xx_device.h +f:drivers/net/ethernet/cavium/liquidio/cn66xx_regs.h +f:drivers/net/ethernet/cavium/liquidio/cn68xx_device.c +f:drivers/net/ethernet/cavium/liquidio/cn68xx_device.h +f:drivers/net/ethernet/cavium/liquidio/cn68xx_regs.h +f:drivers/net/ethernet/cavium/liquidio/lio_core.c +f:drivers/net/ethernet/cavium/liquidio/lio_ethtool.c +f:drivers/net/ethernet/cavium/liquidio/lio_main.c +f:drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +f:drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c +f:drivers/net/ethernet/cavium/liquidio/lio_vf_rep.h +f:drivers/net/ethernet/cavium/liquidio/liquidio_common.h +f:drivers/net/ethernet/cavium/liquidio/liquidio_image.h +f:drivers/net/ethernet/cavium/liquidio/octeon_config.h +f:drivers/net/ethernet/cavium/liquidio/octeon_console.c +f:drivers/net/ethernet/cavium/liquidio/octeon_device.c +f:drivers/net/ethernet/cavium/liquidio/octeon_device.h +f:drivers/net/ethernet/cavium/liquidio/octeon_droq.c +f:drivers/net/ethernet/cavium/liquidio/octeon_droq.h +f:drivers/net/ethernet/cavium/liquidio/octeon_iq.h +f:drivers/net/ethernet/cavium/liquidio/octeon_mailbox.c +f:drivers/net/ethernet/cavium/liquidio/octeon_mailbox.h +f:drivers/net/ethernet/cavium/liquidio/octeon_main.h +f:drivers/net/ethernet/cavium/liquidio/octeon_mem_ops.c +f:drivers/net/ethernet/cavium/liquidio/octeon_mem_ops.h +f:drivers/net/ethernet/cavium/liquidio/octeon_network.h +f:drivers/net/ethernet/cavium/liquidio/octeon_nic.c +f:drivers/net/ethernet/cavium/liquidio/octeon_nic.h +f:drivers/net/ethernet/cavium/liquidio/request_manager.c +f:drivers/net/ethernet/cavium/liquidio/response_manager.c +f:drivers/net/ethernet/cavium/liquidio/response_manager.h +f:drivers/net/ethernet/cavium/octeon/Makefile +f:drivers/net/ethernet/cavium/octeon/octeon_mgmt.c +f:drivers/net/ethernet/cavium/thunder/Makefile +f:drivers/net/ethernet/cavium/thunder/nic.h +f:drivers/net/ethernet/cavium/thunder/nic_main.c +f:drivers/net/ethernet/cavium/thunder/nic_reg.h +f:drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c +f:drivers/net/ethernet/cavium/thunder/nicvf_main.c +f:drivers/net/ethernet/cavium/thunder/nicvf_queues.c +f:drivers/net/ethernet/cavium/thunder/nicvf_queues.h +f:drivers/net/ethernet/cavium/thunder/q_struct.h +f:drivers/net/ethernet/cavium/thunder/thunder_bgx.c +f:drivers/net/ethernet/cavium/thunder/thunder_bgx.h +f:drivers/net/ethernet/cavium/thunder/thunder_xcv.c +f:drivers/net/ethernet/chelsio/Kconfig +f:drivers/net/ethernet/chelsio/Makefile +f:drivers/net/ethernet/chelsio/cxgb/Makefile +f:drivers/net/ethernet/chelsio/cxgb/common.h +f:drivers/net/ethernet/chelsio/cxgb/cphy.h +f:drivers/net/ethernet/chelsio/cxgb/cpl5_cmd.h +f:drivers/net/ethernet/chelsio/cxgb/cxgb2.c +f:drivers/net/ethernet/chelsio/cxgb/elmer0.h +f:drivers/net/ethernet/chelsio/cxgb/espi.c +f:drivers/net/ethernet/chelsio/cxgb/espi.h +f:drivers/net/ethernet/chelsio/cxgb/fpga_defs.h +f:drivers/net/ethernet/chelsio/cxgb/gmac.h +f:drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.c +f:drivers/net/ethernet/chelsio/cxgb/mv88e1xxx.h +f:drivers/net/ethernet/chelsio/cxgb/mv88x201x.c +f:drivers/net/ethernet/chelsio/cxgb/my3126.c +f:drivers/net/ethernet/chelsio/cxgb/pm3393.c +f:drivers/net/ethernet/chelsio/cxgb/regs.h +f:drivers/net/ethernet/chelsio/cxgb/sge.c +f:drivers/net/ethernet/chelsio/cxgb/sge.h +f:drivers/net/ethernet/chelsio/cxgb/subr.c +f:drivers/net/ethernet/chelsio/cxgb/suni1x10gexp_regs.h +f:drivers/net/ethernet/chelsio/cxgb/tp.c +f:drivers/net/ethernet/chelsio/cxgb/tp.h +f:drivers/net/ethernet/chelsio/cxgb/vsc7326.c +f:drivers/net/ethernet/chelsio/cxgb/vsc7326_reg.h +f:drivers/net/ethernet/chelsio/cxgb3/Makefile +f:drivers/net/ethernet/chelsio/cxgb3/adapter.h +f:drivers/net/ethernet/chelsio/cxgb3/ael1002.c +f:drivers/net/ethernet/chelsio/cxgb3/aq100x.c +f:drivers/net/ethernet/chelsio/cxgb3/common.h +f:drivers/net/ethernet/chelsio/cxgb3/cxgb3_ctl_defs.h +f:drivers/net/ethernet/chelsio/cxgb3/cxgb3_defs.h +f:drivers/net/ethernet/chelsio/cxgb3/cxgb3_ioctl.h +f:drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +f:drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c +f:drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.h +f:drivers/net/ethernet/chelsio/cxgb3/firmware_exports.h +f:drivers/net/ethernet/chelsio/cxgb3/l2t.c +f:drivers/net/ethernet/chelsio/cxgb3/l2t.h +f:drivers/net/ethernet/chelsio/cxgb3/mc5.c +f:drivers/net/ethernet/chelsio/cxgb3/regs.h +f:drivers/net/ethernet/chelsio/cxgb3/sge.c +f:drivers/net/ethernet/chelsio/cxgb3/sge_defs.h +f:drivers/net/ethernet/chelsio/cxgb3/t3_cpl.h +f:drivers/net/ethernet/chelsio/cxgb3/t3_hw.c +f:drivers/net/ethernet/chelsio/cxgb3/t3cdev.h +f:drivers/net/ethernet/chelsio/cxgb3/version.h +f:drivers/net/ethernet/chelsio/cxgb3/vsc8211.c +f:drivers/net/ethernet/chelsio/cxgb3/xgmac.c +f:drivers/net/ethernet/chelsio/cxgb4/Makefile +f:drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c +f:drivers/net/ethernet/chelsio/cxgb4/clip_tbl.h +f:drivers/net/ethernet/chelsio/cxgb4/cudbg_common.c +f:drivers/net/ethernet/chelsio/cxgb4/cudbg_entity.h +f:drivers/net/ethernet/chelsio/cxgb4/cudbg_if.h +f:drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c +f:drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.h +f:drivers/net/ethernet/chelsio/cxgb4/cudbg_lib_common.h +f:drivers/net/ethernet/chelsio/cxgb4/cudbg_zlib.c +f:drivers/net/ethernet/chelsio/cxgb4/cudbg_zlib.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_cudbg.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_cudbg.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_fcoe.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_fcoe.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_mps.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_ptp.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_ptp.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_mqprio.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_mqprio.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32_parse.h +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_thermal.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c +f:drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h +f:drivers/net/ethernet/chelsio/cxgb4/l2t.c +f:drivers/net/ethernet/chelsio/cxgb4/l2t.h +f:drivers/net/ethernet/chelsio/cxgb4/sched.c +f:drivers/net/ethernet/chelsio/cxgb4/sched.h +f:drivers/net/ethernet/chelsio/cxgb4/sge.c +f:drivers/net/ethernet/chelsio/cxgb4/smt.c +f:drivers/net/ethernet/chelsio/cxgb4/smt.h +f:drivers/net/ethernet/chelsio/cxgb4/srq.c +f:drivers/net/ethernet/chelsio/cxgb4/srq.h +f:drivers/net/ethernet/chelsio/cxgb4/t4_chip_type.h +f:drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +f:drivers/net/ethernet/chelsio/cxgb4/t4_hw.h +f:drivers/net/ethernet/chelsio/cxgb4/t4_msg.h +f:drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h +f:drivers/net/ethernet/chelsio/cxgb4/t4_regs.h +f:drivers/net/ethernet/chelsio/cxgb4/t4_tcb.h +f:drivers/net/ethernet/chelsio/cxgb4/t4_values.h +f:drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h +f:drivers/net/ethernet/chelsio/cxgb4/t4fw_version.h +f:drivers/net/ethernet/chelsio/cxgb4vf/Makefile +f:drivers/net/ethernet/chelsio/cxgb4vf/adapter.h +f:drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c +f:drivers/net/ethernet/chelsio/cxgb4vf/sge.c +f:drivers/net/ethernet/chelsio/cxgb4vf/t4vf_common.h +f:drivers/net/ethernet/chelsio/cxgb4vf/t4vf_defs.h +f:drivers/net/ethernet/chelsio/cxgb4vf/t4vf_hw.c +f:drivers/net/ethernet/chelsio/inline_crypto/Kconfig +f:drivers/net/ethernet/chelsio/inline_crypto/Makefile +f:drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/Makefile +f:drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/chcr_ipsec.c +f:drivers/net/ethernet/chelsio/inline_crypto/ch_ipsec/chcr_ipsec.h +f:drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/Makefile +f:drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_common.h +f:drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c +f:drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.h +f:drivers/net/ethernet/chelsio/inline_crypto/chtls/Makefile +f:drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls.h +f:drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +f:drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.h +f:drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_hw.c +f:drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_io.c +f:drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_main.c +f:drivers/net/ethernet/chelsio/libcxgb/Makefile +f:drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.c +f:drivers/net/ethernet/chelsio/libcxgb/libcxgb_cm.h +f:drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.c +f:drivers/net/ethernet/chelsio/libcxgb/libcxgb_ppm.h +f:drivers/net/ethernet/cirrus/Kconfig +f:drivers/net/ethernet/cirrus/Makefile +f:drivers/net/ethernet/cirrus/cs89x0.c +f:drivers/net/ethernet/cirrus/cs89x0.h +f:drivers/net/ethernet/cirrus/ep93xx_eth.c +f:drivers/net/ethernet/cirrus/mac89x0.c +f:drivers/net/ethernet/cisco/Kconfig +f:drivers/net/ethernet/cisco/Makefile +f:drivers/net/ethernet/cisco/enic/Kconfig +f:drivers/net/ethernet/cisco/enic/Makefile +f:drivers/net/ethernet/cisco/enic/cq_desc.h +f:drivers/net/ethernet/cisco/enic/cq_enet_desc.h +f:drivers/net/ethernet/cisco/enic/enic.h +f:drivers/net/ethernet/cisco/enic/enic_api.c +f:drivers/net/ethernet/cisco/enic/enic_api.h +f:drivers/net/ethernet/cisco/enic/enic_clsf.c +f:drivers/net/ethernet/cisco/enic/enic_clsf.h +f:drivers/net/ethernet/cisco/enic/enic_dev.c +f:drivers/net/ethernet/cisco/enic/enic_dev.h +f:drivers/net/ethernet/cisco/enic/enic_ethtool.c +f:drivers/net/ethernet/cisco/enic/enic_main.c +f:drivers/net/ethernet/cisco/enic/enic_pp.c +f:drivers/net/ethernet/cisco/enic/enic_pp.h +f:drivers/net/ethernet/cisco/enic/enic_res.c +f:drivers/net/ethernet/cisco/enic/enic_res.h +f:drivers/net/ethernet/cisco/enic/enic_rq.c +f:drivers/net/ethernet/cisco/enic/enic_rq.h +f:drivers/net/ethernet/cisco/enic/enic_wq.c +f:drivers/net/ethernet/cisco/enic/enic_wq.h +f:drivers/net/ethernet/cisco/enic/rq_enet_desc.h +f:drivers/net/ethernet/cisco/enic/vnic_cq.c +f:drivers/net/ethernet/cisco/enic/vnic_cq.h +f:drivers/net/ethernet/cisco/enic/vnic_dev.c +f:drivers/net/ethernet/cisco/enic/vnic_dev.h +f:drivers/net/ethernet/cisco/enic/vnic_devcmd.h +f:drivers/net/ethernet/cisco/enic/vnic_enet.h +f:drivers/net/ethernet/cisco/enic/vnic_intr.c +f:drivers/net/ethernet/cisco/enic/vnic_intr.h +f:drivers/net/ethernet/cisco/enic/vnic_nic.h +f:drivers/net/ethernet/cisco/enic/vnic_resource.h +f:drivers/net/ethernet/cisco/enic/vnic_rq.c +f:drivers/net/ethernet/cisco/enic/vnic_rq.h +f:drivers/net/ethernet/cisco/enic/vnic_rss.h +f:drivers/net/ethernet/cisco/enic/vnic_stats.h +f:drivers/net/ethernet/cisco/enic/vnic_vic.c +f:drivers/net/ethernet/cisco/enic/vnic_vic.h +f:drivers/net/ethernet/cisco/enic/vnic_wq.c +f:drivers/net/ethernet/cisco/enic/vnic_wq.h +f:drivers/net/ethernet/cisco/enic/wq_enet_desc.h +f:drivers/net/ethernet/cortina/Kconfig +f:drivers/net/ethernet/cortina/Makefile +f:drivers/net/ethernet/cortina/gemini.c +f:drivers/net/ethernet/cortina/gemini.h +f:drivers/net/ethernet/davicom/Kconfig +f:drivers/net/ethernet/davicom/Makefile +f:drivers/net/ethernet/davicom/dm9000.c +f:drivers/net/ethernet/davicom/dm9000.h +f:drivers/net/ethernet/davicom/dm9051.c +f:drivers/net/ethernet/davicom/dm9051.h +f:drivers/net/ethernet/dec/Kconfig +f:drivers/net/ethernet/dec/Makefile +f:drivers/net/ethernet/dec/tulip/21142.c +f:drivers/net/ethernet/dec/tulip/Kconfig +f:drivers/net/ethernet/dec/tulip/Makefile +f:drivers/net/ethernet/dec/tulip/de2104x.c +f:drivers/net/ethernet/dec/tulip/dmfe.c +f:drivers/net/ethernet/dec/tulip/eeprom.c +f:drivers/net/ethernet/dec/tulip/interrupt.c +f:drivers/net/ethernet/dec/tulip/media.c +f:drivers/net/ethernet/dec/tulip/pnic.c +f:drivers/net/ethernet/dec/tulip/pnic2.c +f:drivers/net/ethernet/dec/tulip/timer.c +f:drivers/net/ethernet/dec/tulip/tulip.h +f:drivers/net/ethernet/dec/tulip/tulip_core.c +f:drivers/net/ethernet/dec/tulip/uli526x.c +f:drivers/net/ethernet/dec/tulip/winbond-840.c +f:drivers/net/ethernet/dec/tulip/xircom_cb.c +f:drivers/net/ethernet/dlink/Kconfig +f:drivers/net/ethernet/dlink/Makefile +f:drivers/net/ethernet/dlink/dl2k.c +f:drivers/net/ethernet/dlink/dl2k.h +f:drivers/net/ethernet/dnet.c +f:drivers/net/ethernet/dnet.h +f:drivers/net/ethernet/ec_bhf.c +f:drivers/net/ethernet/emulex/Kconfig +f:drivers/net/ethernet/emulex/Makefile +f:drivers/net/ethernet/emulex/benet/Kconfig +f:drivers/net/ethernet/emulex/benet/Makefile +f:drivers/net/ethernet/emulex/benet/be.h +f:drivers/net/ethernet/emulex/benet/be_cmds.c +f:drivers/net/ethernet/emulex/benet/be_cmds.h +f:drivers/net/ethernet/emulex/benet/be_ethtool.c +f:drivers/net/ethernet/emulex/benet/be_hw.h +f:drivers/net/ethernet/emulex/benet/be_main.c +f:drivers/net/ethernet/emulex/benet/be_roce.c +f:drivers/net/ethernet/emulex/benet/be_roce.h +f:drivers/net/ethernet/engleder/Kconfig +f:drivers/net/ethernet/engleder/Makefile +f:drivers/net/ethernet/engleder/tsnep.h +f:drivers/net/ethernet/engleder/tsnep_ethtool.c +f:drivers/net/ethernet/engleder/tsnep_hw.h +f:drivers/net/ethernet/engleder/tsnep_main.c +f:drivers/net/ethernet/engleder/tsnep_ptp.c +f:drivers/net/ethernet/engleder/tsnep_rxnfc.c +f:drivers/net/ethernet/engleder/tsnep_selftests.c +f:drivers/net/ethernet/engleder/tsnep_tc.c +f:drivers/net/ethernet/engleder/tsnep_xdp.c +f:drivers/net/ethernet/ethoc.c +f:drivers/net/ethernet/ezchip/Kconfig +f:drivers/net/ethernet/ezchip/Makefile +f:drivers/net/ethernet/ezchip/nps_enet.c +f:drivers/net/ethernet/ezchip/nps_enet.h +f:drivers/net/ethernet/faraday/Kconfig +f:drivers/net/ethernet/faraday/Makefile +f:drivers/net/ethernet/faraday/ftgmac100.c +f:drivers/net/ethernet/faraday/ftgmac100.h +f:drivers/net/ethernet/faraday/ftmac100.c +f:drivers/net/ethernet/faraday/ftmac100.h +f:drivers/net/ethernet/fealnx.c +f:drivers/net/ethernet/freescale/Kconfig +f:drivers/net/ethernet/freescale/Makefile +f:drivers/net/ethernet/freescale/dpaa/Kconfig +f:drivers/net/ethernet/freescale/dpaa/Makefile +f:drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +f:drivers/net/ethernet/freescale/dpaa/dpaa_eth.h +f:drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c +f:drivers/net/ethernet/freescale/dpaa/dpaa_eth_trace.h +f:drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c +f:drivers/net/ethernet/freescale/dpaa2/Kconfig +f:drivers/net/ethernet/freescale/dpaa2/Makefile +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-dcb.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-debugfs.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-debugfs.h +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-devlink.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-eth-trace.h +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.h +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-ethtool.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-flower.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.h +f:drivers/net/ethernet/freescale/dpaa2/dpaa2-xsk.c +f:drivers/net/ethernet/freescale/dpaa2/dpkg.h +f:drivers/net/ethernet/freescale/dpaa2/dpmac-cmd.h +f:drivers/net/ethernet/freescale/dpaa2/dpmac.c +f:drivers/net/ethernet/freescale/dpaa2/dpmac.h +f:drivers/net/ethernet/freescale/dpaa2/dpni-cmd.h +f:drivers/net/ethernet/freescale/dpaa2/dpni.c +f:drivers/net/ethernet/freescale/dpaa2/dpni.h +f:drivers/net/ethernet/freescale/dpaa2/dprtc-cmd.h +f:drivers/net/ethernet/freescale/dpaa2/dprtc.c +f:drivers/net/ethernet/freescale/dpaa2/dprtc.h +f:drivers/net/ethernet/freescale/dpaa2/dpsw-cmd.h +f:drivers/net/ethernet/freescale/dpaa2/dpsw.c +f:drivers/net/ethernet/freescale/dpaa2/dpsw.h +f:drivers/net/ethernet/freescale/enetc/Kconfig +f:drivers/net/ethernet/freescale/enetc/Makefile +f:drivers/net/ethernet/freescale/enetc/enetc.c +f:drivers/net/ethernet/freescale/enetc/enetc.h +f:drivers/net/ethernet/freescale/enetc/enetc4_debugfs.c +f:drivers/net/ethernet/freescale/enetc/enetc4_debugfs.h +f:drivers/net/ethernet/freescale/enetc/enetc4_hw.h +f:drivers/net/ethernet/freescale/enetc/enetc4_pf.c +f:drivers/net/ethernet/freescale/enetc/enetc_cbdr.c +f:drivers/net/ethernet/freescale/enetc/enetc_ethtool.c +f:drivers/net/ethernet/freescale/enetc/enetc_hw.h +f:drivers/net/ethernet/freescale/enetc/enetc_ierb.c +f:drivers/net/ethernet/freescale/enetc/enetc_ierb.h +f:drivers/net/ethernet/freescale/enetc/enetc_mdio.c +f:drivers/net/ethernet/freescale/enetc/enetc_msg.c +f:drivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c +f:drivers/net/ethernet/freescale/enetc/enetc_pf.c +f:drivers/net/ethernet/freescale/enetc/enetc_pf.h +f:drivers/net/ethernet/freescale/enetc/enetc_pf_common.c +f:drivers/net/ethernet/freescale/enetc/enetc_pf_common.h +f:drivers/net/ethernet/freescale/enetc/enetc_ptp.c +f:drivers/net/ethernet/freescale/enetc/enetc_qos.c +f:drivers/net/ethernet/freescale/enetc/enetc_vf.c +f:drivers/net/ethernet/freescale/enetc/netc_blk_ctrl.c +f:drivers/net/ethernet/freescale/enetc/ntmp.c +f:drivers/net/ethernet/freescale/enetc/ntmp_private.h +f:drivers/net/ethernet/freescale/fec.h +f:drivers/net/ethernet/freescale/fec_main.c +f:drivers/net/ethernet/freescale/fec_mpc52xx.c +f:drivers/net/ethernet/freescale/fec_mpc52xx.h +f:drivers/net/ethernet/freescale/fec_mpc52xx_phy.c +f:drivers/net/ethernet/freescale/fec_ptp.c +f:drivers/net/ethernet/freescale/fman/Kconfig +f:drivers/net/ethernet/freescale/fman/Makefile +f:drivers/net/ethernet/freescale/fman/fman.c +f:drivers/net/ethernet/freescale/fman/fman.h +f:drivers/net/ethernet/freescale/fman/fman_dtsec.c +f:drivers/net/ethernet/freescale/fman/fman_dtsec.h +f:drivers/net/ethernet/freescale/fman/fman_keygen.c +f:drivers/net/ethernet/freescale/fman/fman_keygen.h +f:drivers/net/ethernet/freescale/fman/fman_mac.h +f:drivers/net/ethernet/freescale/fman/fman_memac.c +f:drivers/net/ethernet/freescale/fman/fman_memac.h +f:drivers/net/ethernet/freescale/fman/fman_muram.c +f:drivers/net/ethernet/freescale/fman/fman_muram.h +f:drivers/net/ethernet/freescale/fman/fman_port.c +f:drivers/net/ethernet/freescale/fman/fman_port.h +f:drivers/net/ethernet/freescale/fman/fman_sp.c +f:drivers/net/ethernet/freescale/fman/fman_sp.h +f:drivers/net/ethernet/freescale/fman/fman_tgec.c +f:drivers/net/ethernet/freescale/fman/fman_tgec.h +f:drivers/net/ethernet/freescale/fman/mac.c +f:drivers/net/ethernet/freescale/fman/mac.h +f:drivers/net/ethernet/freescale/fs_enet/Kconfig +f:drivers/net/ethernet/freescale/fs_enet/Makefile +f:drivers/net/ethernet/freescale/fs_enet/fec.h +f:drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c +f:drivers/net/ethernet/freescale/fs_enet/fs_enet.h +f:drivers/net/ethernet/freescale/fs_enet/mac-fcc.c +f:drivers/net/ethernet/freescale/fs_enet/mac-fec.c +f:drivers/net/ethernet/freescale/fs_enet/mac-scc.c +f:drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c +f:drivers/net/ethernet/freescale/fs_enet/mii-fec.c +f:drivers/net/ethernet/freescale/fsl_pq_mdio.c +f:drivers/net/ethernet/freescale/gianfar.c +f:drivers/net/ethernet/freescale/gianfar.h +f:drivers/net/ethernet/freescale/gianfar_ethtool.c +f:drivers/net/ethernet/freescale/ucc_geth.c +f:drivers/net/ethernet/freescale/ucc_geth.h +f:drivers/net/ethernet/freescale/ucc_geth_ethtool.c +f:drivers/net/ethernet/freescale/xgmac_mdio.c +f:drivers/net/ethernet/fujitsu/Kconfig +f:drivers/net/ethernet/fujitsu/Makefile +f:drivers/net/ethernet/fujitsu/fmvj18x_cs.c +f:drivers/net/ethernet/fungible/Kconfig +f:drivers/net/ethernet/fungible/Makefile +f:drivers/net/ethernet/fungible/funcore/Makefile +f:drivers/net/ethernet/fungible/funcore/fun_dev.c +f:drivers/net/ethernet/fungible/funcore/fun_dev.h +f:drivers/net/ethernet/fungible/funcore/fun_hci.h +f:drivers/net/ethernet/fungible/funcore/fun_queue.c +f:drivers/net/ethernet/fungible/funcore/fun_queue.h +f:drivers/net/ethernet/fungible/funeth/Kconfig +f:drivers/net/ethernet/fungible/funeth/Makefile +f:drivers/net/ethernet/fungible/funeth/fun_port.h +f:drivers/net/ethernet/fungible/funeth/funeth.h +f:drivers/net/ethernet/fungible/funeth/funeth_devlink.c +f:drivers/net/ethernet/fungible/funeth/funeth_devlink.h +f:drivers/net/ethernet/fungible/funeth/funeth_ethtool.c +f:drivers/net/ethernet/fungible/funeth/funeth_ktls.c +f:drivers/net/ethernet/fungible/funeth/funeth_ktls.h +f:drivers/net/ethernet/fungible/funeth/funeth_main.c +f:drivers/net/ethernet/fungible/funeth/funeth_rx.c +f:drivers/net/ethernet/fungible/funeth/funeth_trace.h +f:drivers/net/ethernet/fungible/funeth/funeth_tx.c +f:drivers/net/ethernet/fungible/funeth/funeth_txrx.h +f:drivers/net/ethernet/google/Kconfig +f:drivers/net/ethernet/google/Makefile +f:drivers/net/ethernet/google/gve/Makefile +f:drivers/net/ethernet/google/gve/gve.h +f:drivers/net/ethernet/google/gve/gve_adminq.c +f:drivers/net/ethernet/google/gve/gve_adminq.h +f:drivers/net/ethernet/google/gve/gve_buffer_mgmt_dqo.c +f:drivers/net/ethernet/google/gve/gve_desc.h +f:drivers/net/ethernet/google/gve/gve_desc_dqo.h +f:drivers/net/ethernet/google/gve/gve_dqo.h +f:drivers/net/ethernet/google/gve/gve_ethtool.c +f:drivers/net/ethernet/google/gve/gve_flow_rule.c +f:drivers/net/ethernet/google/gve/gve_main.c +f:drivers/net/ethernet/google/gve/gve_ptp.c +f:drivers/net/ethernet/google/gve/gve_register.h +f:drivers/net/ethernet/google/gve/gve_rx.c +f:drivers/net/ethernet/google/gve/gve_rx_dqo.c +f:drivers/net/ethernet/google/gve/gve_tx.c +f:drivers/net/ethernet/google/gve/gve_tx_dqo.c +f:drivers/net/ethernet/google/gve/gve_utils.c +f:drivers/net/ethernet/google/gve/gve_utils.h +f:drivers/net/ethernet/hisilicon/Kconfig +f:drivers/net/ethernet/hisilicon/Makefile +f:drivers/net/ethernet/hisilicon/hibmcge/Makefile +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_common.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_diagnose.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_diagnose.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_err.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_err.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_ethtool.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_ethtool.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_hw.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_hw.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_irq.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_irq.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_main.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_mdio.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_mdio.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_reg.h +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_txrx.c +f:drivers/net/ethernet/hisilicon/hibmcge/hbg_txrx.h +f:drivers/net/ethernet/hisilicon/hip04_eth.c +f:drivers/net/ethernet/hisilicon/hisi_femac.c +f:drivers/net/ethernet/hisilicon/hix5hd2_gmac.c +f:drivers/net/ethernet/hisilicon/hns/Makefile +f:drivers/net/ethernet/hisilicon/hns/hnae.c +f:drivers/net/ethernet/hisilicon/hns/hnae.h +f:drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.h +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.h +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.h +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_xgmac.c +f:drivers/net/ethernet/hisilicon/hns/hns_dsaf_xgmac.h +f:drivers/net/ethernet/hisilicon/hns/hns_enet.c +f:drivers/net/ethernet/hisilicon/hns/hns_enet.h +f:drivers/net/ethernet/hisilicon/hns/hns_ethtool.c +f:drivers/net/ethernet/hisilicon/hns3/Makefile +f:drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h +f:drivers/net/ethernet/hisilicon/hns3/hnae3.c +f:drivers/net/ethernet/hisilicon/hns3/hnae3.h +f:drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c +f:drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h +f:drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_rss.c +f:drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_rss.h +f:drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_tqp_stats.c +f:drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_tqp_stats.h +f:drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c +f:drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c +f:drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h +f:drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +f:drivers/net/ethernet/hisilicon/hns3/hns3_enet.h +f:drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +f:drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.h +f:drivers/net/ethernet/hisilicon/hns3/hns3_trace.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h +f:drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_trace.h +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.h +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.h +f:drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_trace.h +f:drivers/net/ethernet/hisilicon/hns_mdio.c +f:drivers/net/ethernet/huawei/Kconfig +f:drivers/net/ethernet/huawei/Makefile +f:drivers/net/ethernet/huawei/hinic/Kconfig +f:drivers/net/ethernet/huawei/hinic/Makefile +f:drivers/net/ethernet/huawei/hinic/hinic_common.c +f:drivers/net/ethernet/huawei/hinic/hinic_common.h +f:drivers/net/ethernet/huawei/hinic/hinic_debugfs.c +f:drivers/net/ethernet/huawei/hinic/hinic_debugfs.h +f:drivers/net/ethernet/huawei/hinic/hinic_dev.h +f:drivers/net/ethernet/huawei/hinic/hinic_devlink.c +f:drivers/net/ethernet/huawei/hinic/hinic_devlink.h +f:drivers/net/ethernet/huawei/hinic/hinic_ethtool.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_csr.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_if.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_if.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_io.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_io.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_mbox.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_mbox.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_qp.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_qp.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_qp_ctxt.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_wq.c +f:drivers/net/ethernet/huawei/hinic/hinic_hw_wq.h +f:drivers/net/ethernet/huawei/hinic/hinic_hw_wqe.h +f:drivers/net/ethernet/huawei/hinic/hinic_main.c +f:drivers/net/ethernet/huawei/hinic/hinic_port.c +f:drivers/net/ethernet/huawei/hinic/hinic_port.h +f:drivers/net/ethernet/huawei/hinic/hinic_rx.c +f:drivers/net/ethernet/huawei/hinic/hinic_rx.h +f:drivers/net/ethernet/huawei/hinic/hinic_sriov.c +f:drivers/net/ethernet/huawei/hinic/hinic_sriov.h +f:drivers/net/ethernet/huawei/hinic/hinic_tx.c +f:drivers/net/ethernet/huawei/hinic/hinic_tx.h +f:drivers/net/ethernet/huawei/hinic3/Kconfig +f:drivers/net/ethernet/huawei/hinic3/Makefile +f:drivers/net/ethernet/huawei/hinic3/hinic3_common.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_common.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_hw_cfg.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_hw_cfg.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_hw_comm.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_hw_comm.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_hw_intf.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_hwdev.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_hwif.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_hwif.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_irq.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_lld.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_lld.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_main.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_mbox.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_mbox.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_mgmt.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_mgmt_interface.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_netdev_ops.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_nic_cfg.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_nic_cfg.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_nic_dev.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_queue_common.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_queue_common.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_rx.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_rx.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_tx.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_tx.h +f:drivers/net/ethernet/huawei/hinic3/hinic3_wq.c +f:drivers/net/ethernet/huawei/hinic3/hinic3_wq.h +f:drivers/net/ethernet/i825xx/82596.c +f:drivers/net/ethernet/i825xx/Kconfig +f:drivers/net/ethernet/i825xx/Makefile +f:drivers/net/ethernet/i825xx/ether1.c +f:drivers/net/ethernet/i825xx/ether1.h +f:drivers/net/ethernet/i825xx/lasi_82596.c +f:drivers/net/ethernet/i825xx/lib82596.c +f:drivers/net/ethernet/i825xx/sni_82596.c +f:drivers/net/ethernet/i825xx/sun3_82586.c +f:drivers/net/ethernet/i825xx/sun3_82586.h +f:drivers/net/ethernet/ibm/Kconfig +f:drivers/net/ethernet/ibm/Makefile +f:drivers/net/ethernet/ibm/ehea/Makefile +f:drivers/net/ethernet/ibm/ehea/ehea.h +f:drivers/net/ethernet/ibm/ehea/ehea_ethtool.c +f:drivers/net/ethernet/ibm/ehea/ehea_hw.h +f:drivers/net/ethernet/ibm/ehea/ehea_main.c +f:drivers/net/ethernet/ibm/ehea/ehea_phyp.c +f:drivers/net/ethernet/ibm/ehea/ehea_phyp.h +f:drivers/net/ethernet/ibm/ehea/ehea_qmr.c +f:drivers/net/ethernet/ibm/ehea/ehea_qmr.h +f:drivers/net/ethernet/ibm/emac/Kconfig +f:drivers/net/ethernet/ibm/emac/Makefile +f:drivers/net/ethernet/ibm/emac/core.c +f:drivers/net/ethernet/ibm/emac/core.h +f:drivers/net/ethernet/ibm/emac/debug.h +f:drivers/net/ethernet/ibm/emac/emac.h +f:drivers/net/ethernet/ibm/emac/mal.c +f:drivers/net/ethernet/ibm/emac/mal.h +f:drivers/net/ethernet/ibm/emac/phy.c +f:drivers/net/ethernet/ibm/emac/phy.h +f:drivers/net/ethernet/ibm/emac/rgmii.c +f:drivers/net/ethernet/ibm/emac/rgmii.h +f:drivers/net/ethernet/ibm/emac/tah.c +f:drivers/net/ethernet/ibm/emac/tah.h +f:drivers/net/ethernet/ibm/emac/zmii.c +f:drivers/net/ethernet/ibm/emac/zmii.h +f:drivers/net/ethernet/ibm/ibmveth.c +f:drivers/net/ethernet/ibm/ibmveth.h +f:drivers/net/ethernet/ibm/ibmvnic.c +f:drivers/net/ethernet/ibm/ibmvnic.h +f:drivers/net/ethernet/intel/Kconfig +f:drivers/net/ethernet/intel/Makefile +f:drivers/net/ethernet/intel/e100.c +f:drivers/net/ethernet/intel/e1000/Makefile +f:drivers/net/ethernet/intel/e1000/e1000.h +f:drivers/net/ethernet/intel/e1000/e1000_ethtool.c +f:drivers/net/ethernet/intel/e1000/e1000_hw.c +f:drivers/net/ethernet/intel/e1000/e1000_hw.h +f:drivers/net/ethernet/intel/e1000/e1000_main.c +f:drivers/net/ethernet/intel/e1000/e1000_osdep.h +f:drivers/net/ethernet/intel/e1000/e1000_param.c +f:drivers/net/ethernet/intel/e1000e/80003es2lan.c +f:drivers/net/ethernet/intel/e1000e/80003es2lan.h +f:drivers/net/ethernet/intel/e1000e/82571.c +f:drivers/net/ethernet/intel/e1000e/82571.h +f:drivers/net/ethernet/intel/e1000e/Makefile +f:drivers/net/ethernet/intel/e1000e/defines.h +f:drivers/net/ethernet/intel/e1000e/e1000.h +f:drivers/net/ethernet/intel/e1000e/e1000e_trace.h +f:drivers/net/ethernet/intel/e1000e/ethtool.c +f:drivers/net/ethernet/intel/e1000e/hw.h +f:drivers/net/ethernet/intel/e1000e/ich8lan.c +f:drivers/net/ethernet/intel/e1000e/ich8lan.h +f:drivers/net/ethernet/intel/e1000e/mac.c +f:drivers/net/ethernet/intel/e1000e/mac.h +f:drivers/net/ethernet/intel/e1000e/manage.c +f:drivers/net/ethernet/intel/e1000e/manage.h +f:drivers/net/ethernet/intel/e1000e/netdev.c +f:drivers/net/ethernet/intel/e1000e/nvm.c +f:drivers/net/ethernet/intel/e1000e/nvm.h +f:drivers/net/ethernet/intel/e1000e/param.c +f:drivers/net/ethernet/intel/e1000e/phy.c +f:drivers/net/ethernet/intel/e1000e/phy.h +f:drivers/net/ethernet/intel/e1000e/ptp.c +f:drivers/net/ethernet/intel/e1000e/regs.h +f:drivers/net/ethernet/intel/fm10k/Makefile +f:drivers/net/ethernet/intel/fm10k/fm10k.h +f:drivers/net/ethernet/intel/fm10k/fm10k_common.c +f:drivers/net/ethernet/intel/fm10k/fm10k_common.h +f:drivers/net/ethernet/intel/fm10k/fm10k_dcbnl.c +f:drivers/net/ethernet/intel/fm10k/fm10k_debugfs.c +f:drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c +f:drivers/net/ethernet/intel/fm10k/fm10k_iov.c +f:drivers/net/ethernet/intel/fm10k/fm10k_main.c +f:drivers/net/ethernet/intel/fm10k/fm10k_mbx.c +f:drivers/net/ethernet/intel/fm10k/fm10k_mbx.h +f:drivers/net/ethernet/intel/fm10k/fm10k_netdev.c +f:drivers/net/ethernet/intel/fm10k/fm10k_pci.c +f:drivers/net/ethernet/intel/fm10k/fm10k_pf.c +f:drivers/net/ethernet/intel/fm10k/fm10k_pf.h +f:drivers/net/ethernet/intel/fm10k/fm10k_tlv.c +f:drivers/net/ethernet/intel/fm10k/fm10k_tlv.h +f:drivers/net/ethernet/intel/fm10k/fm10k_type.h +f:drivers/net/ethernet/intel/fm10k/fm10k_vf.c +f:drivers/net/ethernet/intel/fm10k/fm10k_vf.h +f:drivers/net/ethernet/intel/i40e/Makefile +f:drivers/net/ethernet/intel/i40e/i40e.h +f:drivers/net/ethernet/intel/i40e/i40e_adminq.c +f:drivers/net/ethernet/intel/i40e/i40e_adminq.h +f:drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h +f:drivers/net/ethernet/intel/i40e/i40e_alloc.h +f:drivers/net/ethernet/intel/i40e/i40e_client.c +f:drivers/net/ethernet/intel/i40e/i40e_common.c +f:drivers/net/ethernet/intel/i40e/i40e_dcb.c +f:drivers/net/ethernet/intel/i40e/i40e_dcb.h +f:drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c +f:drivers/net/ethernet/intel/i40e/i40e_ddp.c +f:drivers/net/ethernet/intel/i40e/i40e_debug.h +f:drivers/net/ethernet/intel/i40e/i40e_debugfs.c +f:drivers/net/ethernet/intel/i40e/i40e_devids.h +f:drivers/net/ethernet/intel/i40e/i40e_devlink.c +f:drivers/net/ethernet/intel/i40e/i40e_devlink.h +f:drivers/net/ethernet/intel/i40e/i40e_diag.c +f:drivers/net/ethernet/intel/i40e/i40e_diag.h +f:drivers/net/ethernet/intel/i40e/i40e_ethtool.c +f:drivers/net/ethernet/intel/i40e/i40e_hmc.c +f:drivers/net/ethernet/intel/i40e/i40e_hmc.h +f:drivers/net/ethernet/intel/i40e/i40e_io.h +f:drivers/net/ethernet/intel/i40e/i40e_lan_hmc.c +f:drivers/net/ethernet/intel/i40e/i40e_lan_hmc.h +f:drivers/net/ethernet/intel/i40e/i40e_main.c +f:drivers/net/ethernet/intel/i40e/i40e_nvm.c +f:drivers/net/ethernet/intel/i40e/i40e_prototype.h +f:drivers/net/ethernet/intel/i40e/i40e_ptp.c +f:drivers/net/ethernet/intel/i40e/i40e_register.h +f:drivers/net/ethernet/intel/i40e/i40e_trace.h +f:drivers/net/ethernet/intel/i40e/i40e_txrx.c +f:drivers/net/ethernet/intel/i40e/i40e_txrx.h +f:drivers/net/ethernet/intel/i40e/i40e_txrx_common.h +f:drivers/net/ethernet/intel/i40e/i40e_type.h +f:drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +f:drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h +f:drivers/net/ethernet/intel/i40e/i40e_xsk.c +f:drivers/net/ethernet/intel/i40e/i40e_xsk.h +f:drivers/net/ethernet/intel/iavf/Makefile +f:drivers/net/ethernet/intel/iavf/iavf.h +f:drivers/net/ethernet/intel/iavf/iavf_adminq.c +f:drivers/net/ethernet/intel/iavf/iavf_adminq.h +f:drivers/net/ethernet/intel/iavf/iavf_adminq_cmd.h +f:drivers/net/ethernet/intel/iavf/iavf_adv_rss.c +f:drivers/net/ethernet/intel/iavf/iavf_adv_rss.h +f:drivers/net/ethernet/intel/iavf/iavf_alloc.h +f:drivers/net/ethernet/intel/iavf/iavf_common.c +f:drivers/net/ethernet/intel/iavf/iavf_devids.h +f:drivers/net/ethernet/intel/iavf/iavf_ethtool.c +f:drivers/net/ethernet/intel/iavf/iavf_fdir.c +f:drivers/net/ethernet/intel/iavf/iavf_fdir.h +f:drivers/net/ethernet/intel/iavf/iavf_main.c +f:drivers/net/ethernet/intel/iavf/iavf_osdep.h +f:drivers/net/ethernet/intel/iavf/iavf_prototype.h +f:drivers/net/ethernet/intel/iavf/iavf_ptp.c +f:drivers/net/ethernet/intel/iavf/iavf_ptp.h +f:drivers/net/ethernet/intel/iavf/iavf_register.h +f:drivers/net/ethernet/intel/iavf/iavf_status.h +f:drivers/net/ethernet/intel/iavf/iavf_trace.h +f:drivers/net/ethernet/intel/iavf/iavf_txrx.c +f:drivers/net/ethernet/intel/iavf/iavf_txrx.h +f:drivers/net/ethernet/intel/iavf/iavf_type.h +f:drivers/net/ethernet/intel/iavf/iavf_types.h +f:drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +f:drivers/net/ethernet/intel/ice/Makefile +f:drivers/net/ethernet/intel/ice/devlink/devlink.c +f:drivers/net/ethernet/intel/ice/devlink/devlink.h +f:drivers/net/ethernet/intel/ice/devlink/health.c +f:drivers/net/ethernet/intel/ice/devlink/health.h +f:drivers/net/ethernet/intel/ice/devlink/port.c +f:drivers/net/ethernet/intel/ice/devlink/port.h +f:drivers/net/ethernet/intel/ice/ice.h +f:drivers/net/ethernet/intel/ice/ice_adapter.c +f:drivers/net/ethernet/intel/ice/ice_adapter.h +f:drivers/net/ethernet/intel/ice/ice_adminq_cmd.h +f:drivers/net/ethernet/intel/ice/ice_arfs.c +f:drivers/net/ethernet/intel/ice/ice_arfs.h +f:drivers/net/ethernet/intel/ice/ice_base.c +f:drivers/net/ethernet/intel/ice/ice_base.h +f:drivers/net/ethernet/intel/ice/ice_common.c +f:drivers/net/ethernet/intel/ice/ice_common.h +f:drivers/net/ethernet/intel/ice/ice_controlq.c +f:drivers/net/ethernet/intel/ice/ice_controlq.h +f:drivers/net/ethernet/intel/ice/ice_dcb.c +f:drivers/net/ethernet/intel/ice/ice_dcb.h +f:drivers/net/ethernet/intel/ice/ice_dcb_lib.c +f:drivers/net/ethernet/intel/ice/ice_dcb_lib.h +f:drivers/net/ethernet/intel/ice/ice_dcb_nl.c +f:drivers/net/ethernet/intel/ice/ice_dcb_nl.h +f:drivers/net/ethernet/intel/ice/ice_ddp.c +f:drivers/net/ethernet/intel/ice/ice_ddp.h +f:drivers/net/ethernet/intel/ice/ice_debugfs.c +f:drivers/net/ethernet/intel/ice/ice_devids.h +f:drivers/net/ethernet/intel/ice/ice_dpll.c +f:drivers/net/ethernet/intel/ice/ice_dpll.h +f:drivers/net/ethernet/intel/ice/ice_eswitch.c +f:drivers/net/ethernet/intel/ice/ice_eswitch.h +f:drivers/net/ethernet/intel/ice/ice_eswitch_br.c +f:drivers/net/ethernet/intel/ice/ice_eswitch_br.h +f:drivers/net/ethernet/intel/ice/ice_ethtool.c +f:drivers/net/ethernet/intel/ice/ice_ethtool.h +f:drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c +f:drivers/net/ethernet/intel/ice/ice_fdir.c +f:drivers/net/ethernet/intel/ice/ice_fdir.h +f:drivers/net/ethernet/intel/ice/ice_flex_pipe.c +f:drivers/net/ethernet/intel/ice/ice_flex_pipe.h +f:drivers/net/ethernet/intel/ice/ice_flex_type.h +f:drivers/net/ethernet/intel/ice/ice_flow.c +f:drivers/net/ethernet/intel/ice/ice_flow.h +f:drivers/net/ethernet/intel/ice/ice_fltr.c +f:drivers/net/ethernet/intel/ice/ice_fltr.h +f:drivers/net/ethernet/intel/ice/ice_fw_update.c +f:drivers/net/ethernet/intel/ice/ice_fw_update.h +f:drivers/net/ethernet/intel/ice/ice_fwlog.c +f:drivers/net/ethernet/intel/ice/ice_fwlog.h +f:drivers/net/ethernet/intel/ice/ice_gnss.c +f:drivers/net/ethernet/intel/ice/ice_gnss.h +f:drivers/net/ethernet/intel/ice/ice_hw_autogen.h +f:drivers/net/ethernet/intel/ice/ice_hwmon.c +f:drivers/net/ethernet/intel/ice/ice_hwmon.h +f:drivers/net/ethernet/intel/ice/ice_idc.c +f:drivers/net/ethernet/intel/ice/ice_idc_int.h +f:drivers/net/ethernet/intel/ice/ice_irq.c +f:drivers/net/ethernet/intel/ice/ice_irq.h +f:drivers/net/ethernet/intel/ice/ice_lag.c +f:drivers/net/ethernet/intel/ice/ice_lag.h +f:drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h +f:drivers/net/ethernet/intel/ice/ice_lib.c +f:drivers/net/ethernet/intel/ice/ice_lib.h +f:drivers/net/ethernet/intel/ice/ice_main.c +f:drivers/net/ethernet/intel/ice/ice_nvm.c +f:drivers/net/ethernet/intel/ice/ice_nvm.h +f:drivers/net/ethernet/intel/ice/ice_osdep.h +f:drivers/net/ethernet/intel/ice/ice_parser.c +f:drivers/net/ethernet/intel/ice/ice_parser.h +f:drivers/net/ethernet/intel/ice/ice_parser_rt.c +f:drivers/net/ethernet/intel/ice/ice_pf_vsi_vlan_ops.c +f:drivers/net/ethernet/intel/ice/ice_pf_vsi_vlan_ops.h +f:drivers/net/ethernet/intel/ice/ice_protocol_type.h +f:drivers/net/ethernet/intel/ice/ice_ptp.c +f:drivers/net/ethernet/intel/ice/ice_ptp.h +f:drivers/net/ethernet/intel/ice/ice_ptp_consts.h +f:drivers/net/ethernet/intel/ice/ice_ptp_hw.c +f:drivers/net/ethernet/intel/ice/ice_ptp_hw.h +f:drivers/net/ethernet/intel/ice/ice_repr.c +f:drivers/net/ethernet/intel/ice/ice_repr.h +f:drivers/net/ethernet/intel/ice/ice_sbq_cmd.h +f:drivers/net/ethernet/intel/ice/ice_sched.c +f:drivers/net/ethernet/intel/ice/ice_sched.h +f:drivers/net/ethernet/intel/ice/ice_sf_eth.c +f:drivers/net/ethernet/intel/ice/ice_sf_eth.h +f:drivers/net/ethernet/intel/ice/ice_sf_vsi_vlan_ops.c +f:drivers/net/ethernet/intel/ice/ice_sf_vsi_vlan_ops.h +f:drivers/net/ethernet/intel/ice/ice_sriov.c +f:drivers/net/ethernet/intel/ice/ice_sriov.h +f:drivers/net/ethernet/intel/ice/ice_switch.c +f:drivers/net/ethernet/intel/ice/ice_switch.h +f:drivers/net/ethernet/intel/ice/ice_tc_lib.c +f:drivers/net/ethernet/intel/ice/ice_tc_lib.h +f:drivers/net/ethernet/intel/ice/ice_trace.h +f:drivers/net/ethernet/intel/ice/ice_tspll.c +f:drivers/net/ethernet/intel/ice/ice_tspll.h +f:drivers/net/ethernet/intel/ice/ice_txrx.c +f:drivers/net/ethernet/intel/ice/ice_txrx.h +f:drivers/net/ethernet/intel/ice/ice_txrx_lib.c +f:drivers/net/ethernet/intel/ice/ice_txrx_lib.h +f:drivers/net/ethernet/intel/ice/ice_type.h +f:drivers/net/ethernet/intel/ice/ice_vf_lib.c +f:drivers/net/ethernet/intel/ice/ice_vf_lib.h +f:drivers/net/ethernet/intel/ice/ice_vf_lib_private.h +f:drivers/net/ethernet/intel/ice/ice_vf_mbx.c +f:drivers/net/ethernet/intel/ice/ice_vf_mbx.h +f:drivers/net/ethernet/intel/ice/ice_vf_vsi_vlan_ops.c +f:drivers/net/ethernet/intel/ice/ice_vf_vsi_vlan_ops.h +f:drivers/net/ethernet/intel/ice/ice_virtchnl.c +f:drivers/net/ethernet/intel/ice/ice_virtchnl.h +f:drivers/net/ethernet/intel/ice/ice_virtchnl_allowlist.c +f:drivers/net/ethernet/intel/ice/ice_virtchnl_allowlist.h +f:drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c +f:drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.h +f:drivers/net/ethernet/intel/ice/ice_vlan.h +f:drivers/net/ethernet/intel/ice/ice_vlan_mode.c +f:drivers/net/ethernet/intel/ice/ice_vlan_mode.h +f:drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c +f:drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.h +f:drivers/net/ethernet/intel/ice/ice_vsi_vlan_ops.c +f:drivers/net/ethernet/intel/ice/ice_vsi_vlan_ops.h +f:drivers/net/ethernet/intel/ice/ice_xsk.c +f:drivers/net/ethernet/intel/ice/ice_xsk.h +f:drivers/net/ethernet/intel/idpf/Kconfig +f:drivers/net/ethernet/intel/idpf/Makefile +f:drivers/net/ethernet/intel/idpf/idpf.h +f:drivers/net/ethernet/intel/idpf/idpf_controlq.c +f:drivers/net/ethernet/intel/idpf/idpf_controlq.h +f:drivers/net/ethernet/intel/idpf/idpf_controlq_api.h +f:drivers/net/ethernet/intel/idpf/idpf_controlq_setup.c +f:drivers/net/ethernet/intel/idpf/idpf_dev.c +f:drivers/net/ethernet/intel/idpf/idpf_devids.h +f:drivers/net/ethernet/intel/idpf/idpf_ethtool.c +f:drivers/net/ethernet/intel/idpf/idpf_idc.c +f:drivers/net/ethernet/intel/idpf/idpf_lan_pf_regs.h +f:drivers/net/ethernet/intel/idpf/idpf_lan_txrx.h +f:drivers/net/ethernet/intel/idpf/idpf_lan_vf_regs.h +f:drivers/net/ethernet/intel/idpf/idpf_lib.c +f:drivers/net/ethernet/intel/idpf/idpf_main.c +f:drivers/net/ethernet/intel/idpf/idpf_mem.h +f:drivers/net/ethernet/intel/idpf/idpf_ptp.c +f:drivers/net/ethernet/intel/idpf/idpf_ptp.h +f:drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c +f:drivers/net/ethernet/intel/idpf/idpf_txrx.c +f:drivers/net/ethernet/intel/idpf/idpf_txrx.h +f:drivers/net/ethernet/intel/idpf/idpf_vf_dev.c +f:drivers/net/ethernet/intel/idpf/idpf_virtchnl.c +f:drivers/net/ethernet/intel/idpf/idpf_virtchnl.h +f:drivers/net/ethernet/intel/idpf/idpf_virtchnl_ptp.c +f:drivers/net/ethernet/intel/idpf/virtchnl2.h +f:drivers/net/ethernet/intel/idpf/virtchnl2_lan_desc.h +f:drivers/net/ethernet/intel/igb/Makefile +f:drivers/net/ethernet/intel/igb/e1000_82575.c +f:drivers/net/ethernet/intel/igb/e1000_82575.h +f:drivers/net/ethernet/intel/igb/e1000_defines.h +f:drivers/net/ethernet/intel/igb/e1000_hw.h +f:drivers/net/ethernet/intel/igb/e1000_i210.c +f:drivers/net/ethernet/intel/igb/e1000_i210.h +f:drivers/net/ethernet/intel/igb/e1000_mac.c +f:drivers/net/ethernet/intel/igb/e1000_mac.h +f:drivers/net/ethernet/intel/igb/e1000_mbx.c +f:drivers/net/ethernet/intel/igb/e1000_mbx.h +f:drivers/net/ethernet/intel/igb/e1000_nvm.c +f:drivers/net/ethernet/intel/igb/e1000_nvm.h +f:drivers/net/ethernet/intel/igb/e1000_phy.c +f:drivers/net/ethernet/intel/igb/e1000_phy.h +f:drivers/net/ethernet/intel/igb/e1000_regs.h +f:drivers/net/ethernet/intel/igb/igb.h +f:drivers/net/ethernet/intel/igb/igb_ethtool.c +f:drivers/net/ethernet/intel/igb/igb_hwmon.c +f:drivers/net/ethernet/intel/igb/igb_main.c +f:drivers/net/ethernet/intel/igb/igb_ptp.c +f:drivers/net/ethernet/intel/igb/igb_xsk.c +f:drivers/net/ethernet/intel/igbvf/Makefile +f:drivers/net/ethernet/intel/igbvf/defines.h +f:drivers/net/ethernet/intel/igbvf/ethtool.c +f:drivers/net/ethernet/intel/igbvf/igbvf.h +f:drivers/net/ethernet/intel/igbvf/mbx.c +f:drivers/net/ethernet/intel/igbvf/mbx.h +f:drivers/net/ethernet/intel/igbvf/netdev.c +f:drivers/net/ethernet/intel/igbvf/regs.h +f:drivers/net/ethernet/intel/igbvf/vf.c +f:drivers/net/ethernet/intel/igbvf/vf.h +f:drivers/net/ethernet/intel/igc/Makefile +f:drivers/net/ethernet/intel/igc/igc.h +f:drivers/net/ethernet/intel/igc/igc_base.c +f:drivers/net/ethernet/intel/igc/igc_base.h +f:drivers/net/ethernet/intel/igc/igc_defines.h +f:drivers/net/ethernet/intel/igc/igc_diag.c +f:drivers/net/ethernet/intel/igc/igc_diag.h +f:drivers/net/ethernet/intel/igc/igc_dump.c +f:drivers/net/ethernet/intel/igc/igc_ethtool.c +f:drivers/net/ethernet/intel/igc/igc_hw.h +f:drivers/net/ethernet/intel/igc/igc_i225.c +f:drivers/net/ethernet/intel/igc/igc_i225.h +f:drivers/net/ethernet/intel/igc/igc_leds.c +f:drivers/net/ethernet/intel/igc/igc_mac.c +f:drivers/net/ethernet/intel/igc/igc_mac.h +f:drivers/net/ethernet/intel/igc/igc_main.c +f:drivers/net/ethernet/intel/igc/igc_nvm.c +f:drivers/net/ethernet/intel/igc/igc_nvm.h +f:drivers/net/ethernet/intel/igc/igc_phy.c +f:drivers/net/ethernet/intel/igc/igc_phy.h +f:drivers/net/ethernet/intel/igc/igc_ptp.c +f:drivers/net/ethernet/intel/igc/igc_regs.h +f:drivers/net/ethernet/intel/igc/igc_tsn.c +f:drivers/net/ethernet/intel/igc/igc_tsn.h +f:drivers/net/ethernet/intel/igc/igc_xdp.c +f:drivers/net/ethernet/intel/igc/igc_xdp.h +f:drivers/net/ethernet/intel/ixgbe/Makefile +f:drivers/net/ethernet/intel/ixgbe/devlink/devlink.c +f:drivers/net/ethernet/intel/ixgbe/devlink/devlink.h +f:drivers/net/ethernet/intel/ixgbe/devlink/region.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_common.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_dcb.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_dcb.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82599.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82599.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_debugfs.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_e610.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_e610.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_model.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_sysfs.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_type_e610.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_x540.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +f:drivers/net/ethernet/intel/ixgbe/ixgbe_x550.h +f:drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c +f:drivers/net/ethernet/intel/ixgbevf/Makefile +f:drivers/net/ethernet/intel/ixgbevf/defines.h +f:drivers/net/ethernet/intel/ixgbevf/ethtool.c +f:drivers/net/ethernet/intel/ixgbevf/ipsec.c +f:drivers/net/ethernet/intel/ixgbevf/ipsec.h +f:drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +f:drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +f:drivers/net/ethernet/intel/ixgbevf/mbx.c +f:drivers/net/ethernet/intel/ixgbevf/mbx.h +f:drivers/net/ethernet/intel/ixgbevf/regs.h +f:drivers/net/ethernet/intel/ixgbevf/vf.c +f:drivers/net/ethernet/intel/ixgbevf/vf.h +f:drivers/net/ethernet/intel/libeth/Kconfig +f:drivers/net/ethernet/intel/libeth/Makefile +f:drivers/net/ethernet/intel/libeth/priv.h +f:drivers/net/ethernet/intel/libeth/rx.c +f:drivers/net/ethernet/intel/libeth/tx.c +f:drivers/net/ethernet/intel/libeth/xdp.c +f:drivers/net/ethernet/intel/libeth/xsk.c +f:drivers/net/ethernet/intel/libie/Kconfig +f:drivers/net/ethernet/intel/libie/Makefile +f:drivers/net/ethernet/intel/libie/adminq.c +f:drivers/net/ethernet/intel/libie/rx.c +f:drivers/net/ethernet/jme.c +f:drivers/net/ethernet/jme.h +f:drivers/net/ethernet/korina.c +f:drivers/net/ethernet/lantiq_etop.c +f:drivers/net/ethernet/lantiq_xrx200.c +f:drivers/net/ethernet/litex/Kconfig +f:drivers/net/ethernet/litex/Makefile +f:drivers/net/ethernet/litex/litex_liteeth.c +f:drivers/net/ethernet/marvell/Kconfig +f:drivers/net/ethernet/marvell/Makefile +f:drivers/net/ethernet/marvell/mv643xx_eth.c +f:drivers/net/ethernet/marvell/mvmdio.c +f:drivers/net/ethernet/marvell/mvneta.c +f:drivers/net/ethernet/marvell/mvneta_bm.c +f:drivers/net/ethernet/marvell/mvneta_bm.h +f:drivers/net/ethernet/marvell/mvpp2/Makefile +f:drivers/net/ethernet/marvell/mvpp2/mvpp2.h +f:drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c +f:drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.h +f:drivers/net/ethernet/marvell/mvpp2/mvpp2_debugfs.c +f:drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +f:drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c +f:drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h +f:drivers/net/ethernet/marvell/mvpp2/mvpp2_tai.c +f:drivers/net/ethernet/marvell/octeon_ep/Kconfig +f:drivers/net/ethernet/marvell/octeon_ep/Makefile +f:drivers/net/ethernet/marvell/octeon_ep/octep_cn9k_pf.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_cnxk_pf.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_config.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_cp_version.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_mbox.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_mbox.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_ethtool.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_main.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_main.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_regs_cn9k_pf.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_regs_cnxk_pf.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_rx.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_rx.h +f:drivers/net/ethernet/marvell/octeon_ep/octep_tx.c +f:drivers/net/ethernet/marvell/octeon_ep/octep_tx.h +f:drivers/net/ethernet/marvell/octeon_ep_vf/Kconfig +f:drivers/net/ethernet/marvell/octeon_ep_vf/Makefile +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_cn9k.c +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_cnxk.c +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_config.h +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_ethtool.c +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_main.c +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_main.h +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_mbox.c +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_mbox.h +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_regs_cn9k.h +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_regs_cnxk.h +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_rx.c +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_rx.h +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_tx.c +f:drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_tx.h +f:drivers/net/ethernet/marvell/octeontx2/Kconfig +f:drivers/net/ethernet/marvell/octeontx2/Makefile +f:drivers/net/ethernet/marvell/octeontx2/af/Makefile +f:drivers/net/ethernet/marvell/octeontx2/af/cgx.c +f:drivers/net/ethernet/marvell/octeontx2/af/cgx.h +f:drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h +f:drivers/net/ethernet/marvell/octeontx2/af/cn20k/api.h +f:drivers/net/ethernet/marvell/octeontx2/af/cn20k/mbox_init.c +f:drivers/net/ethernet/marvell/octeontx2/af/cn20k/reg.h +f:drivers/net/ethernet/marvell/octeontx2/af/cn20k/struct.h +f:drivers/net/ethernet/marvell/octeontx2/af/common.h +f:drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h +f:drivers/net/ethernet/marvell/octeontx2/af/mbox.c +f:drivers/net/ethernet/marvell/octeontx2/af/mbox.h +f:drivers/net/ethernet/marvell/octeontx2/af/mcs.c +f:drivers/net/ethernet/marvell/octeontx2/af/mcs.h +f:drivers/net/ethernet/marvell/octeontx2/af/mcs_cnf10kb.c +f:drivers/net/ethernet/marvell/octeontx2/af/mcs_reg.h +f:drivers/net/ethernet/marvell/octeontx2/af/mcs_rvu_if.c +f:drivers/net/ethernet/marvell/octeontx2/af/npc.h +f:drivers/net/ethernet/marvell/octeontx2/af/npc_profile.h +f:drivers/net/ethernet/marvell/octeontx2/af/ptp.c +f:drivers/net/ethernet/marvell/octeontx2/af/ptp.h +f:drivers/net/ethernet/marvell/octeontx2/af/rpm.c +f:drivers/net/ethernet/marvell/octeontx2/af/rpm.h +f:drivers/net/ethernet/marvell/octeontx2/af/rvu.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu.h +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.h +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.h +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.h +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_reg.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_reg.h +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_rep.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_sdp.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_struct.h +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_switch.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.c +f:drivers/net/ethernet/marvell/octeontx2/af/rvu_trace.h +f:drivers/net/ethernet/marvell/octeontx2/nic/Makefile +f:drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c +f:drivers/net/ethernet/marvell/octeontx2/nic/cn10k.h +f:drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c +f:drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.h +f:drivers/net/ethernet/marvell/octeontx2/nic/cn10k_macsec.c +f:drivers/net/ethernet/marvell/octeontx2/nic/cn20k.c +f:drivers/net/ethernet/marvell/octeontx2/nic/cn20k.h +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_dcbnl.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_devlink.h +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_dmac_flt.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_ptp.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_ptp.h +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_reg.h +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_struct.h +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.h +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_vf.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.c +f:drivers/net/ethernet/marvell/octeontx2/nic/otx2_xsk.h +f:drivers/net/ethernet/marvell/octeontx2/nic/qos.c +f:drivers/net/ethernet/marvell/octeontx2/nic/qos.h +f:drivers/net/ethernet/marvell/octeontx2/nic/qos_sq.c +f:drivers/net/ethernet/marvell/octeontx2/nic/rep.c +f:drivers/net/ethernet/marvell/octeontx2/nic/rep.h +f:drivers/net/ethernet/marvell/prestera/Kconfig +f:drivers/net/ethernet/marvell/prestera/Makefile +f:drivers/net/ethernet/marvell/prestera/prestera.h +f:drivers/net/ethernet/marvell/prestera/prestera_acl.c +f:drivers/net/ethernet/marvell/prestera/prestera_acl.h +f:drivers/net/ethernet/marvell/prestera/prestera_counter.c +f:drivers/net/ethernet/marvell/prestera/prestera_counter.h +f:drivers/net/ethernet/marvell/prestera/prestera_devlink.c +f:drivers/net/ethernet/marvell/prestera/prestera_devlink.h +f:drivers/net/ethernet/marvell/prestera/prestera_dsa.c +f:drivers/net/ethernet/marvell/prestera/prestera_dsa.h +f:drivers/net/ethernet/marvell/prestera/prestera_ethtool.c +f:drivers/net/ethernet/marvell/prestera/prestera_ethtool.h +f:drivers/net/ethernet/marvell/prestera/prestera_flow.c +f:drivers/net/ethernet/marvell/prestera/prestera_flow.h +f:drivers/net/ethernet/marvell/prestera/prestera_flower.c +f:drivers/net/ethernet/marvell/prestera/prestera_flower.h +f:drivers/net/ethernet/marvell/prestera/prestera_hw.c +f:drivers/net/ethernet/marvell/prestera/prestera_hw.h +f:drivers/net/ethernet/marvell/prestera/prestera_main.c +f:drivers/net/ethernet/marvell/prestera/prestera_matchall.c +f:drivers/net/ethernet/marvell/prestera/prestera_matchall.h +f:drivers/net/ethernet/marvell/prestera/prestera_pci.c +f:drivers/net/ethernet/marvell/prestera/prestera_router.c +f:drivers/net/ethernet/marvell/prestera/prestera_router_hw.c +f:drivers/net/ethernet/marvell/prestera/prestera_router_hw.h +f:drivers/net/ethernet/marvell/prestera/prestera_rxtx.c +f:drivers/net/ethernet/marvell/prestera/prestera_rxtx.h +f:drivers/net/ethernet/marvell/prestera/prestera_span.c +f:drivers/net/ethernet/marvell/prestera/prestera_span.h +f:drivers/net/ethernet/marvell/prestera/prestera_switchdev.c +f:drivers/net/ethernet/marvell/prestera/prestera_switchdev.h +f:drivers/net/ethernet/marvell/pxa168_eth.c +f:drivers/net/ethernet/marvell/skge.c +f:drivers/net/ethernet/marvell/skge.h +f:drivers/net/ethernet/marvell/sky2.c +f:drivers/net/ethernet/marvell/sky2.h +f:drivers/net/ethernet/mediatek/Kconfig +f:drivers/net/ethernet/mediatek/Makefile +f:drivers/net/ethernet/mediatek/mtk_eth_path.c +f:drivers/net/ethernet/mediatek/mtk_eth_soc.c +f:drivers/net/ethernet/mediatek/mtk_eth_soc.h +f:drivers/net/ethernet/mediatek/mtk_ppe.c +f:drivers/net/ethernet/mediatek/mtk_ppe.h +f:drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c +f:drivers/net/ethernet/mediatek/mtk_ppe_offload.c +f:drivers/net/ethernet/mediatek/mtk_ppe_regs.h +f:drivers/net/ethernet/mediatek/mtk_star_emac.c +f:drivers/net/ethernet/mediatek/mtk_wed.c +f:drivers/net/ethernet/mediatek/mtk_wed.h +f:drivers/net/ethernet/mediatek/mtk_wed_debugfs.c +f:drivers/net/ethernet/mediatek/mtk_wed_mcu.c +f:drivers/net/ethernet/mediatek/mtk_wed_ops.c +f:drivers/net/ethernet/mediatek/mtk_wed_regs.h +f:drivers/net/ethernet/mediatek/mtk_wed_wo.c +f:drivers/net/ethernet/mediatek/mtk_wed_wo.h +f:drivers/net/ethernet/mellanox/Kconfig +f:drivers/net/ethernet/mellanox/Makefile +f:drivers/net/ethernet/mellanox/mlx4/Kconfig +f:drivers/net/ethernet/mellanox/mlx4/Makefile +f:drivers/net/ethernet/mellanox/mlx4/alloc.c +f:drivers/net/ethernet/mellanox/mlx4/catas.c +f:drivers/net/ethernet/mellanox/mlx4/cmd.c +f:drivers/net/ethernet/mellanox/mlx4/cq.c +f:drivers/net/ethernet/mellanox/mlx4/crdump.c +f:drivers/net/ethernet/mellanox/mlx4/en_clock.c +f:drivers/net/ethernet/mellanox/mlx4/en_cq.c +f:drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c +f:drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +f:drivers/net/ethernet/mellanox/mlx4/en_main.c +f:drivers/net/ethernet/mellanox/mlx4/en_netdev.c +f:drivers/net/ethernet/mellanox/mlx4/en_port.c +f:drivers/net/ethernet/mellanox/mlx4/en_port.h +f:drivers/net/ethernet/mellanox/mlx4/en_resources.c +f:drivers/net/ethernet/mellanox/mlx4/en_rx.c +f:drivers/net/ethernet/mellanox/mlx4/en_selftest.c +f:drivers/net/ethernet/mellanox/mlx4/en_tx.c +f:drivers/net/ethernet/mellanox/mlx4/eq.c +f:drivers/net/ethernet/mellanox/mlx4/fw.c +f:drivers/net/ethernet/mellanox/mlx4/fw.h +f:drivers/net/ethernet/mellanox/mlx4/fw_qos.c +f:drivers/net/ethernet/mellanox/mlx4/fw_qos.h +f:drivers/net/ethernet/mellanox/mlx4/icm.c +f:drivers/net/ethernet/mellanox/mlx4/icm.h +f:drivers/net/ethernet/mellanox/mlx4/intf.c +f:drivers/net/ethernet/mellanox/mlx4/main.c +f:drivers/net/ethernet/mellanox/mlx4/mcg.c +f:drivers/net/ethernet/mellanox/mlx4/mlx4.h +f:drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +f:drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h +f:drivers/net/ethernet/mellanox/mlx4/mr.c +f:drivers/net/ethernet/mellanox/mlx4/pd.c +f:drivers/net/ethernet/mellanox/mlx4/port.c +f:drivers/net/ethernet/mellanox/mlx4/profile.c +f:drivers/net/ethernet/mellanox/mlx4/qp.c +f:drivers/net/ethernet/mellanox/mlx4/reset.c +f:drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +f:drivers/net/ethernet/mellanox/mlx4/sense.c +f:drivers/net/ethernet/mellanox/mlx4/srq.c +f:drivers/net/ethernet/mellanox/mlx5/core/Kconfig +f:drivers/net/ethernet/mellanox/mlx5/core/Makefile +f:drivers/net/ethernet/mellanox/mlx5/core/alloc.c +f:drivers/net/ethernet/mellanox/mlx5/core/cmd.c +f:drivers/net/ethernet/mellanox/mlx5/core/cq.c +f:drivers/net/ethernet/mellanox/mlx5/core/debugfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/dev.c +f:drivers/net/ethernet/mellanox/mlx5/core/devlink.c +f:drivers/net/ethernet/mellanox/mlx5/core/devlink.h +f:drivers/net/ethernet/mellanox/mlx5/core/diag/cmd_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/diag/crdump.c +f:drivers/net/ethernet/mellanox/mlx5/core/diag/en_rep_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.c +f:drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c +f:drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c +f:drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.h +f:drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/diag/reporter_vnic.c +f:drivers/net/ethernet/mellanox/mlx5/core/diag/reporter_vnic.h +f:drivers/net/ethernet/mellanox/mlx5/core/diag/rsc_dump.c +f:drivers/net/ethernet/mellanox/mlx5/core/diag/rsc_dump.h +f:drivers/net/ethernet/mellanox/mlx5/core/dpll.c +f:drivers/net/ethernet/mellanox/mlx5/core/ecpf.c +f:drivers/net/ethernet/mellanox/mlx5/core/ecpf.h +f:drivers/net/ethernet/mellanox/mlx5/core/en.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/channels.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/channels.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/dcbnl.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/devlink.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/dim.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/fs.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/fs_ethtool.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/fs_tt_redirect.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/fs_tt_redirect.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/health.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/health.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/htb.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/htb.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/hv_vhca_stats.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/hv_vhca_stats.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/mapping.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/mapping.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/mod_hdr.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/mod_hdr.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/params.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/params.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/pcie_cong_event.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/pcie_cong_event.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/port.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/port.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/ptp.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/ptp.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/qos.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/qos.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/rep/bond.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/rep/neigh.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/rep/neigh.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/rqt.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/rqt.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/rss.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/rss.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/selq.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/selq.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/accept.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/csum.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ct.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/drop.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/goto.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/mark.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/mirred.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/mirred_nic.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/mpls.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/pedit.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/pedit.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/police.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ptype.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/redirect_ingress.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/sample.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/sample.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/trap.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/tun.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan_mangle.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act_stats.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/act_stats.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs_dmfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs_hmfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/ct_fs_smfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/int_port.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/int_port.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/meter.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/post_act.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/post_act.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/post_meter.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/post_meter.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/sample.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc/sample.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_priv.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_geneve.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_gre.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_mplsoudp.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_vxlan.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tir.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/tir.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/trap.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/trap.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/xsk/rx.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.h +f:drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/fs_tcp.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_stats.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_stats.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_txrx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_txrx.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_utils.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec_stats.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_common.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_dim.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_fs.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_main.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_rep.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_stats.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_tc.h +f:drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +f:drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c +f:drivers/net/ethernet/mellanox/mlx5/core/eq.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/Makefile +f:drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_lgcy.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_ofld.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/acl/helper.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/acl/helper.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_lgcy.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_ofld.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/acl/lgcy.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ofld.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/bridge_debugfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/bridge_mcast.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/bridge_priv.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/diag/bridge_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/diag/qos_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/indir_table.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/indir_table.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +f:drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h +f:drivers/net/ethernet/mellanox/mlx5/core/esw/vporttbl.c +f:drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +f:drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +f:drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +f:drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c +f:drivers/net/ethernet/mellanox/mlx5/core/events.c +f:drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.c +f:drivers/net/ethernet/mellanox/mlx5/core/fpga/cmd.h +f:drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.c +f:drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.h +f:drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c +f:drivers/net/ethernet/mellanox/mlx5/core/fpga/core.h +f:drivers/net/ethernet/mellanox/mlx5/core/fpga/sdk.c +f:drivers/net/ethernet/mellanox/mlx5/core/fpga/sdk.h +f:drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c +f:drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h +f:drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +f:drivers/net/ethernet/mellanox/mlx5/core/fs_core.h +f:drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c +f:drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.c +f:drivers/net/ethernet/mellanox/mlx5/core/fs_ft_pool.h +f:drivers/net/ethernet/mellanox/mlx5/core/fs_pool.c +f:drivers/net/ethernet/mellanox/mlx5/core/fs_pool.h +f:drivers/net/ethernet/mellanox/mlx5/core/fw.c +f:drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c +f:drivers/net/ethernet/mellanox/mlx5/core/fw_reset.h +f:drivers/net/ethernet/mellanox/mlx5/core/health.c +f:drivers/net/ethernet/mellanox/mlx5/core/hwmon.c +f:drivers/net/ethernet/mellanox/mlx5/core/hwmon.h +f:drivers/net/ethernet/mellanox/mlx5/core/ipoib/ethtool.c +f:drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c +f:drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h +f:drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c +f:drivers/net/ethernet/mellanox/mlx5/core/irq_affinity.c +f:drivers/net/ethernet/mellanox/mlx5/core/lag/debugfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c +f:drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h +f:drivers/net/ethernet/mellanox/mlx5/core/lag/mp.c +f:drivers/net/ethernet/mellanox/mlx5/core/lag/mp.h +f:drivers/net/ethernet/mellanox/mlx5/core/lag/mpesw.c +f:drivers/net/ethernet/mellanox/mlx5/core/lag/mpesw.h +f:drivers/net/ethernet/mellanox/mlx5/core/lag/port_sel.c +f:drivers/net/ethernet/mellanox/mlx5/core/lag/port_sel.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/aso.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/aso.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/clock.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/crypto.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/crypto.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/dm.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/events.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/fs_chains.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/fs_ttc.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/fs_ttc.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/geneve.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/geneve.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/gid.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/hv.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/hv.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/hv_vhca.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/hv_vhca.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/ipsec_fs_roce.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/ipsec_fs_roce.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/macsec_fs.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/macsec_fs.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/mlx5.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/mpfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/mpfs.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/pci_vsc.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/pci_vsc.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/sd.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/sf.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/smfs.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/smfs.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/st.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/tout.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/tout.h +f:drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.c +f:drivers/net/ethernet/mellanox/mlx5/core/lib/vxlan.h +f:drivers/net/ethernet/mellanox/mlx5/core/main.c +f:drivers/net/ethernet/mellanox/mlx5/core/mcg.c +f:drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h +f:drivers/net/ethernet/mellanox/mlx5/core/mlx5_irq.h +f:drivers/net/ethernet/mellanox/mlx5/core/mr.c +f:drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +f:drivers/net/ethernet/mellanox/mlx5/core/pci_irq.c +f:drivers/net/ethernet/mellanox/mlx5/core/pci_irq.h +f:drivers/net/ethernet/mellanox/mlx5/core/pd.c +f:drivers/net/ethernet/mellanox/mlx5/core/port.c +f:drivers/net/ethernet/mellanox/mlx5/core/qos.c +f:drivers/net/ethernet/mellanox/mlx5/core/qos.h +f:drivers/net/ethernet/mellanox/mlx5/core/rdma.c +f:drivers/net/ethernet/mellanox/mlx5/core/rdma.h +f:drivers/net/ethernet/mellanox/mlx5/core/rl.c +f:drivers/net/ethernet/mellanox/mlx5/core/sf/cmd.c +f:drivers/net/ethernet/mellanox/mlx5/core/sf/dev/dev.c +f:drivers/net/ethernet/mellanox/mlx5/core/sf/dev/dev.h +f:drivers/net/ethernet/mellanox/mlx5/core/sf/dev/diag/dev_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c +f:drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c +f:drivers/net/ethernet/mellanox/mlx5/core/sf/diag/sf_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/sf/diag/vhca_tracepoint.h +f:drivers/net/ethernet/mellanox/mlx5/core/sf/hw_table.c +f:drivers/net/ethernet/mellanox/mlx5/core/sf/mlx5_ifc_vhca_event.h +f:drivers/net/ethernet/mellanox/mlx5/core/sf/priv.h +f:drivers/net/ethernet/mellanox/mlx5/core/sf/sf.h +f:drivers/net/ethernet/mellanox/mlx5/core/sf/vhca_event.c +f:drivers/net/ethernet/mellanox/mlx5/core/sf/vhca_event.h +f:drivers/net/ethernet/mellanox/mlx5/core/sriov.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/Makefile +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/Makefile +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/action.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/action.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/action_ste_pool.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/action_ste_pool.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/buddy.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/buddy.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc_complex.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc_complex.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/cmd.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/cmd.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/context.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/context.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/debug.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/debug.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/definer.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/definer.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws_pools.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws_pools.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/internal.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/matcher.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/matcher.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/pat_arg.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/pat_arg.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/pool.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/pool.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/prm.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/rule.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/rule.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/table.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/table.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/vport.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/hws/vport.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_action.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_arg.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_buddy.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_cmd.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_dbg.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_dbg.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_definer.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_fw.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_icm_pool.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_matcher.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ptrn.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_rule.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_send.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v0.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v1.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v1.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v2.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v2.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_ste_v3.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_table.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_types.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/fs_dr.c +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/fs_dr.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5_ifc_dr.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5_ifc_dr_ste_v1.h +f:drivers/net/ethernet/mellanox/mlx5/core/steering/sws/mlx5dr.h +f:drivers/net/ethernet/mellanox/mlx5/core/transobj.c +f:drivers/net/ethernet/mellanox/mlx5/core/uar.c +f:drivers/net/ethernet/mellanox/mlx5/core/vport.c +f:drivers/net/ethernet/mellanox/mlx5/core/wc.c +f:drivers/net/ethernet/mellanox/mlx5/core/wq.c +f:drivers/net/ethernet/mellanox/mlx5/core/wq.h +f:drivers/net/ethernet/mellanox/mlxbf_gige/Kconfig +f:drivers/net/ethernet/mellanox/mlxbf_gige/Makefile +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige.h +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_ethtool.c +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_intr.c +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio_bf2.h +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio_bf3.h +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_regs.h +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c +f:drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_tx.c +f:drivers/net/ethernet/mellanox/mlxfw/Kconfig +f:drivers/net/ethernet/mellanox/mlxfw/Makefile +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw.h +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2.c +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2.h +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2_file.h +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2_format.h +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2_tlv.h +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2_tlv_multi.c +f:drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2_tlv_multi.h +f:drivers/net/ethernet/mellanox/mlxsw/Kconfig +f:drivers/net/ethernet/mellanox/mlxsw/Makefile +f:drivers/net/ethernet/mellanox/mlxsw/cmd.h +f:drivers/net/ethernet/mellanox/mlxsw/core.c +f:drivers/net/ethernet/mellanox/mlxsw/core.h +f:drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c +f:drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.h +f:drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c +f:drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h +f:drivers/net/ethernet/mellanox/mlxsw/core_env.c +f:drivers/net/ethernet/mellanox/mlxsw/core_env.h +f:drivers/net/ethernet/mellanox/mlxsw/core_hwmon.c +f:drivers/net/ethernet/mellanox/mlxsw/core_linecard_dev.c +f:drivers/net/ethernet/mellanox/mlxsw/core_linecards.c +f:drivers/net/ethernet/mellanox/mlxsw/core_thermal.c +f:drivers/net/ethernet/mellanox/mlxsw/emad.h +f:drivers/net/ethernet/mellanox/mlxsw/i2c.c +f:drivers/net/ethernet/mellanox/mlxsw/i2c.h +f:drivers/net/ethernet/mellanox/mlxsw/item.h +f:drivers/net/ethernet/mellanox/mlxsw/minimal.c +f:drivers/net/ethernet/mellanox/mlxsw/pci.c +f:drivers/net/ethernet/mellanox/mlxsw/pci.h +f:drivers/net/ethernet/mellanox/mlxsw/pci_hw.h +f:drivers/net/ethernet/mellanox/mlxsw/port.h +f:drivers/net/ethernet/mellanox/mlxsw/reg.h +f:drivers/net/ethernet/mellanox/mlxsw/resources.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum1_acl_tcam.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum1_kvdl.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum1_mr_tcam.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum2_acl_tcam.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum2_kvdl.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum2_mr_tcam.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_ctcam.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_cnt.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_cnt.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_ethtool.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_flow.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_matchall.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_mr_tcam.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_mr_tcam.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_nve_vxlan.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_pgt.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_policer.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_port_range.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_span.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.h +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c +f:drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.h +f:drivers/net/ethernet/mellanox/mlxsw/trap.h +f:drivers/net/ethernet/mellanox/mlxsw/txheader.h +f:drivers/net/ethernet/meta/Kconfig +f:drivers/net/ethernet/meta/Makefile +f:drivers/net/ethernet/meta/fbnic/Makefile +f:drivers/net/ethernet/meta/fbnic/fbnic.h +f:drivers/net/ethernet/meta/fbnic/fbnic_csr.c +f:drivers/net/ethernet/meta/fbnic/fbnic_csr.h +f:drivers/net/ethernet/meta/fbnic/fbnic_debugfs.c +f:drivers/net/ethernet/meta/fbnic/fbnic_devlink.c +f:drivers/net/ethernet/meta/fbnic/fbnic_drvinfo.h +f:drivers/net/ethernet/meta/fbnic/fbnic_ethtool.c +f:drivers/net/ethernet/meta/fbnic/fbnic_fw.c +f:drivers/net/ethernet/meta/fbnic/fbnic_fw.h +f:drivers/net/ethernet/meta/fbnic/fbnic_fw_log.c +f:drivers/net/ethernet/meta/fbnic/fbnic_fw_log.h +f:drivers/net/ethernet/meta/fbnic/fbnic_hw_stats.c +f:drivers/net/ethernet/meta/fbnic/fbnic_hw_stats.h +f:drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +f:drivers/net/ethernet/meta/fbnic/fbnic_irq.c +f:drivers/net/ethernet/meta/fbnic/fbnic_mac.c +f:drivers/net/ethernet/meta/fbnic/fbnic_mac.h +f:drivers/net/ethernet/meta/fbnic/fbnic_netdev.c +f:drivers/net/ethernet/meta/fbnic/fbnic_netdev.h +f:drivers/net/ethernet/meta/fbnic/fbnic_pci.c +f:drivers/net/ethernet/meta/fbnic/fbnic_phylink.c +f:drivers/net/ethernet/meta/fbnic/fbnic_rpc.c +f:drivers/net/ethernet/meta/fbnic/fbnic_rpc.h +f:drivers/net/ethernet/meta/fbnic/fbnic_time.c +f:drivers/net/ethernet/meta/fbnic/fbnic_tlv.c +f:drivers/net/ethernet/meta/fbnic/fbnic_tlv.h +f:drivers/net/ethernet/meta/fbnic/fbnic_txrx.c +f:drivers/net/ethernet/meta/fbnic/fbnic_txrx.h +f:drivers/net/ethernet/micrel/Kconfig +f:drivers/net/ethernet/micrel/Makefile +f:drivers/net/ethernet/micrel/ks8842.c +f:drivers/net/ethernet/micrel/ks8851.h +f:drivers/net/ethernet/micrel/ks8851_common.c +f:drivers/net/ethernet/micrel/ks8851_par.c +f:drivers/net/ethernet/micrel/ks8851_spi.c +f:drivers/net/ethernet/micrel/ksz884x.c +f:drivers/net/ethernet/microchip/Kconfig +f:drivers/net/ethernet/microchip/Makefile +f:drivers/net/ethernet/microchip/enc28j60.c +f:drivers/net/ethernet/microchip/enc28j60_hw.h +f:drivers/net/ethernet/microchip/encx24j600-regmap.c +f:drivers/net/ethernet/microchip/encx24j600.c +f:drivers/net/ethernet/microchip/encx24j600_hw.h +f:drivers/net/ethernet/microchip/fdma/Kconfig +f:drivers/net/ethernet/microchip/fdma/Makefile +f:drivers/net/ethernet/microchip/fdma/fdma_api.c +f:drivers/net/ethernet/microchip/fdma/fdma_api.h +f:drivers/net/ethernet/microchip/lan743x_ethtool.c +f:drivers/net/ethernet/microchip/lan743x_ethtool.h +f:drivers/net/ethernet/microchip/lan743x_main.c +f:drivers/net/ethernet/microchip/lan743x_main.h +f:drivers/net/ethernet/microchip/lan743x_ptp.c +f:drivers/net/ethernet/microchip/lan743x_ptp.h +f:drivers/net/ethernet/microchip/lan865x/Kconfig +f:drivers/net/ethernet/microchip/lan865x/Makefile +f:drivers/net/ethernet/microchip/lan865x/lan865x.c +f:drivers/net/ethernet/microchip/lan966x/Kconfig +f:drivers/net/ethernet/microchip/lan966x/Makefile +f:drivers/net/ethernet/microchip/lan966x/lan966x_cbs.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_dcb.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_ethtool.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_ets.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_fdb.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_fdma.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_goto.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_ifh.h +f:drivers/net/ethernet/microchip/lan966x/lan966x_lag.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_mac.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_main.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_main.h +f:drivers/net/ethernet/microchip/lan966x/lan966x_mdb.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_mirror.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_mqprio.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_phylink.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_police.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_port.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_regs.h +f:drivers/net/ethernet/microchip/lan966x/lan966x_switchdev.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_taprio.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_tbf.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_tc.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_tc_flower.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_tc_matchall.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_vcap_ag_api.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_vcap_ag_api.h +f:drivers/net/ethernet/microchip/lan966x/lan966x_vcap_debugfs.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_vcap_impl.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_vlan.c +f:drivers/net/ethernet/microchip/lan966x/lan966x_xdp.c +f:drivers/net/ethernet/microchip/sparx5/Kconfig +f:drivers/net/ethernet/microchip/sparx5/Makefile +f:drivers/net/ethernet/microchip/sparx5/lan969x/lan969x.c +f:drivers/net/ethernet/microchip/sparx5/lan969x/lan969x.h +f:drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_calendar.c +f:drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_fdma.c +f:drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_regs.c +f:drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_rgmii.c +f:drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_ag_api.c +f:drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_impl.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_calendar.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_dcb.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_ethtool.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_fdma.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_main.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_main.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_main_regs.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_mirror.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_packet.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_phylink.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_police.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_pool.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_port.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_port.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_psfp.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_qos.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_qos.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_regs.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_regs.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_sdlb.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_tc.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_tc.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_tc_flower.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_tc_matchall.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_vcap_debugfs.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_vcap_debugfs.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_vcap_impl.c +f:drivers/net/ethernet/microchip/sparx5/sparx5_vcap_impl.h +f:drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c +f:drivers/net/ethernet/microchip/vcap/Kconfig +f:drivers/net/ethernet/microchip/vcap/Makefile +f:drivers/net/ethernet/microchip/vcap/vcap_ag_api.h +f:drivers/net/ethernet/microchip/vcap/vcap_api.c +f:drivers/net/ethernet/microchip/vcap/vcap_api.h +f:drivers/net/ethernet/microchip/vcap/vcap_api_client.h +f:drivers/net/ethernet/microchip/vcap/vcap_api_debugfs.c +f:drivers/net/ethernet/microchip/vcap/vcap_api_debugfs.h +f:drivers/net/ethernet/microchip/vcap/vcap_api_debugfs_kunit.c +f:drivers/net/ethernet/microchip/vcap/vcap_api_kunit.c +f:drivers/net/ethernet/microchip/vcap/vcap_api_private.h +f:drivers/net/ethernet/microchip/vcap/vcap_model_kunit.c +f:drivers/net/ethernet/microchip/vcap/vcap_model_kunit.h +f:drivers/net/ethernet/microchip/vcap/vcap_tc.c +f:drivers/net/ethernet/microchip/vcap/vcap_tc.h +f:drivers/net/ethernet/microsoft/Kconfig +f:drivers/net/ethernet/microsoft/Makefile +f:drivers/net/ethernet/microsoft/mana/Makefile +f:drivers/net/ethernet/microsoft/mana/gdma_main.c +f:drivers/net/ethernet/microsoft/mana/hw_channel.c +f:drivers/net/ethernet/microsoft/mana/mana_bpf.c +f:drivers/net/ethernet/microsoft/mana/mana_en.c +f:drivers/net/ethernet/microsoft/mana/mana_ethtool.c +f:drivers/net/ethernet/microsoft/mana/shm_channel.c +f:drivers/net/ethernet/moxa/Kconfig +f:drivers/net/ethernet/moxa/Makefile +f:drivers/net/ethernet/moxa/moxart_ether.c +f:drivers/net/ethernet/moxa/moxart_ether.h +f:drivers/net/ethernet/mscc/Kconfig +f:drivers/net/ethernet/mscc/Makefile +f:drivers/net/ethernet/mscc/ocelot.c +f:drivers/net/ethernet/mscc/ocelot.h +f:drivers/net/ethernet/mscc/ocelot_devlink.c +f:drivers/net/ethernet/mscc/ocelot_fdma.c +f:drivers/net/ethernet/mscc/ocelot_fdma.h +f:drivers/net/ethernet/mscc/ocelot_flower.c +f:drivers/net/ethernet/mscc/ocelot_io.c +f:drivers/net/ethernet/mscc/ocelot_mm.c +f:drivers/net/ethernet/mscc/ocelot_mrp.c +f:drivers/net/ethernet/mscc/ocelot_net.c +f:drivers/net/ethernet/mscc/ocelot_police.c +f:drivers/net/ethernet/mscc/ocelot_police.h +f:drivers/net/ethernet/mscc/ocelot_ptp.c +f:drivers/net/ethernet/mscc/ocelot_qs.h +f:drivers/net/ethernet/mscc/ocelot_rew.h +f:drivers/net/ethernet/mscc/ocelot_stats.c +f:drivers/net/ethernet/mscc/ocelot_vcap.c +f:drivers/net/ethernet/mscc/ocelot_vcap.h +f:drivers/net/ethernet/mscc/ocelot_vsc7514.c +f:drivers/net/ethernet/mscc/vsc7514_regs.c +f:drivers/net/ethernet/myricom/Kconfig +f:drivers/net/ethernet/myricom/Makefile +f:drivers/net/ethernet/myricom/myri10ge/Makefile +f:drivers/net/ethernet/myricom/myri10ge/myri10ge.c +f:drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp.h +f:drivers/net/ethernet/myricom/myri10ge/myri10ge_mcp_gen_header.h +f:drivers/net/ethernet/natsemi/Kconfig +f:drivers/net/ethernet/natsemi/Makefile +f:drivers/net/ethernet/natsemi/jazzsonic.c +f:drivers/net/ethernet/natsemi/macsonic.c +f:drivers/net/ethernet/natsemi/natsemi.c +f:drivers/net/ethernet/natsemi/ns83820.c +f:drivers/net/ethernet/natsemi/sonic.c +f:drivers/net/ethernet/natsemi/sonic.h +f:drivers/net/ethernet/natsemi/xtsonic.c +f:drivers/net/ethernet/neterion/Kconfig +f:drivers/net/ethernet/neterion/Makefile +f:drivers/net/ethernet/neterion/s2io-regs.h +f:drivers/net/ethernet/neterion/s2io.c +f:drivers/net/ethernet/neterion/s2io.h +f:drivers/net/ethernet/netronome/Kconfig +f:drivers/net/ethernet/netronome/Makefile +f:drivers/net/ethernet/netronome/nfp/Makefile +f:drivers/net/ethernet/netronome/nfp/abm/cls.c +f:drivers/net/ethernet/netronome/nfp/abm/ctrl.c +f:drivers/net/ethernet/netronome/nfp/abm/main.c +f:drivers/net/ethernet/netronome/nfp/abm/main.h +f:drivers/net/ethernet/netronome/nfp/abm/qdisc.c +f:drivers/net/ethernet/netronome/nfp/bpf/cmsg.c +f:drivers/net/ethernet/netronome/nfp/bpf/fw.h +f:drivers/net/ethernet/netronome/nfp/bpf/jit.c +f:drivers/net/ethernet/netronome/nfp/bpf/main.c +f:drivers/net/ethernet/netronome/nfp/bpf/main.h +f:drivers/net/ethernet/netronome/nfp/bpf/offload.c +f:drivers/net/ethernet/netronome/nfp/bpf/verifier.c +f:drivers/net/ethernet/netronome/nfp/ccm.c +f:drivers/net/ethernet/netronome/nfp/ccm.h +f:drivers/net/ethernet/netronome/nfp/ccm_mbox.c +f:drivers/net/ethernet/netronome/nfp/crypto/crypto.h +f:drivers/net/ethernet/netronome/nfp/crypto/fw.h +f:drivers/net/ethernet/netronome/nfp/crypto/ipsec.c +f:drivers/net/ethernet/netronome/nfp/crypto/tls.c +f:drivers/net/ethernet/netronome/nfp/devlink_param.c +f:drivers/net/ethernet/netronome/nfp/flower/action.c +f:drivers/net/ethernet/netronome/nfp/flower/cmsg.c +f:drivers/net/ethernet/netronome/nfp/flower/cmsg.h +f:drivers/net/ethernet/netronome/nfp/flower/conntrack.c +f:drivers/net/ethernet/netronome/nfp/flower/conntrack.h +f:drivers/net/ethernet/netronome/nfp/flower/lag_conf.c +f:drivers/net/ethernet/netronome/nfp/flower/main.c +f:drivers/net/ethernet/netronome/nfp/flower/main.h +f:drivers/net/ethernet/netronome/nfp/flower/match.c +f:drivers/net/ethernet/netronome/nfp/flower/metadata.c +f:drivers/net/ethernet/netronome/nfp/flower/offload.c +f:drivers/net/ethernet/netronome/nfp/flower/qos_conf.c +f:drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c +f:drivers/net/ethernet/netronome/nfp/nfd3/dp.c +f:drivers/net/ethernet/netronome/nfp/nfd3/ipsec.c +f:drivers/net/ethernet/netronome/nfp/nfd3/nfd3.h +f:drivers/net/ethernet/netronome/nfp/nfd3/rings.c +f:drivers/net/ethernet/netronome/nfp/nfd3/xsk.c +f:drivers/net/ethernet/netronome/nfp/nfdk/dp.c +f:drivers/net/ethernet/netronome/nfp/nfdk/ipsec.c +f:drivers/net/ethernet/netronome/nfp/nfdk/nfdk.h +f:drivers/net/ethernet/netronome/nfp/nfdk/rings.c +f:drivers/net/ethernet/netronome/nfp/nfp_abi.h +f:drivers/net/ethernet/netronome/nfp/nfp_app.c +f:drivers/net/ethernet/netronome/nfp/nfp_app.h +f:drivers/net/ethernet/netronome/nfp/nfp_app_nic.c +f:drivers/net/ethernet/netronome/nfp/nfp_asm.c +f:drivers/net/ethernet/netronome/nfp/nfp_asm.h +f:drivers/net/ethernet/netronome/nfp/nfp_devlink.c +f:drivers/net/ethernet/netronome/nfp/nfp_hwmon.c +f:drivers/net/ethernet/netronome/nfp/nfp_main.c +f:drivers/net/ethernet/netronome/nfp/nfp_main.h +f:drivers/net/ethernet/netronome/nfp/nfp_net.h +f:drivers/net/ethernet/netronome/nfp/nfp_net_common.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h +f:drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_dp.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_dp.h +f:drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_main.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_repr.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_repr.h +f:drivers/net/ethernet/netronome/nfp/nfp_net_sriov.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_sriov.h +f:drivers/net/ethernet/netronome/nfp/nfp_net_xsk.c +f:drivers/net/ethernet/netronome/nfp/nfp_net_xsk.h +f:drivers/net/ethernet/netronome/nfp/nfp_netvf_main.c +f:drivers/net/ethernet/netronome/nfp/nfp_port.c +f:drivers/net/ethernet/netronome/nfp/nfp_port.h +f:drivers/net/ethernet/netronome/nfp/nfp_shared_buf.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/crc32.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp6000/nfp6000.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp6000/nfp_xpb.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp6000_pcie.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp6000_pcie.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_arm.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cpp.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cpplib.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_hwinfo.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_mip.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_mutex.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nffw.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nffw.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_cmds.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_resource.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c +f:drivers/net/ethernet/netronome/nfp/nfpcore/nfp_target.c +f:drivers/net/ethernet/netronome/nfp/nic/dcb.c +f:drivers/net/ethernet/netronome/nfp/nic/main.c +f:drivers/net/ethernet/netronome/nfp/nic/main.h +f:drivers/net/ethernet/ni/Kconfig +f:drivers/net/ethernet/ni/Makefile +f:drivers/net/ethernet/ni/nixge.c +f:drivers/net/ethernet/nvidia/Kconfig +f:drivers/net/ethernet/nvidia/Makefile +f:drivers/net/ethernet/nvidia/forcedeth.c +f:drivers/net/ethernet/nxp/Kconfig +f:drivers/net/ethernet/nxp/Makefile +f:drivers/net/ethernet/nxp/lpc_eth.c +f:drivers/net/ethernet/oa_tc6.c +f:drivers/net/ethernet/oki-semi/Kconfig +f:drivers/net/ethernet/oki-semi/Makefile +f:drivers/net/ethernet/oki-semi/pch_gbe/Kconfig +f:drivers/net/ethernet/oki-semi/pch_gbe/Makefile +f:drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h +f:drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c +f:drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +f:drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c +f:drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c +f:drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h +f:drivers/net/ethernet/packetengines/Kconfig +f:drivers/net/ethernet/packetengines/Makefile +f:drivers/net/ethernet/packetengines/hamachi.c +f:drivers/net/ethernet/packetengines/yellowfin.c +f:drivers/net/ethernet/pasemi/Kconfig +f:drivers/net/ethernet/pasemi/Makefile +f:drivers/net/ethernet/pasemi/pasemi_mac.c +f:drivers/net/ethernet/pasemi/pasemi_mac.h +f:drivers/net/ethernet/pasemi/pasemi_mac_ethtool.c +f:drivers/net/ethernet/pensando/Kconfig +f:drivers/net/ethernet/pensando/Makefile +f:drivers/net/ethernet/pensando/ionic/Makefile +f:drivers/net/ethernet/pensando/ionic/ionic.h +f:drivers/net/ethernet/pensando/ionic/ionic_bus.h +f:drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c +f:drivers/net/ethernet/pensando/ionic/ionic_debugfs.c +f:drivers/net/ethernet/pensando/ionic/ionic_debugfs.h +f:drivers/net/ethernet/pensando/ionic/ionic_dev.c +f:drivers/net/ethernet/pensando/ionic/ionic_dev.h +f:drivers/net/ethernet/pensando/ionic/ionic_devlink.c +f:drivers/net/ethernet/pensando/ionic/ionic_devlink.h +f:drivers/net/ethernet/pensando/ionic/ionic_ethtool.c +f:drivers/net/ethernet/pensando/ionic/ionic_ethtool.h +f:drivers/net/ethernet/pensando/ionic/ionic_fw.c +f:drivers/net/ethernet/pensando/ionic/ionic_if.h +f:drivers/net/ethernet/pensando/ionic/ionic_lif.c +f:drivers/net/ethernet/pensando/ionic/ionic_lif.h +f:drivers/net/ethernet/pensando/ionic/ionic_main.c +f:drivers/net/ethernet/pensando/ionic/ionic_phc.c +f:drivers/net/ethernet/pensando/ionic/ionic_regs.h +f:drivers/net/ethernet/pensando/ionic/ionic_rx_filter.c +f:drivers/net/ethernet/pensando/ionic/ionic_rx_filter.h +f:drivers/net/ethernet/pensando/ionic/ionic_stats.c +f:drivers/net/ethernet/pensando/ionic/ionic_stats.h +f:drivers/net/ethernet/pensando/ionic/ionic_txrx.c +f:drivers/net/ethernet/pensando/ionic/ionic_txrx.h +f:drivers/net/ethernet/qlogic/Kconfig +f:drivers/net/ethernet/qlogic/Makefile +f:drivers/net/ethernet/qlogic/netxen/Makefile +f:drivers/net/ethernet/qlogic/netxen/netxen_nic.h +f:drivers/net/ethernet/qlogic/netxen/netxen_nic_ctx.c +f:drivers/net/ethernet/qlogic/netxen/netxen_nic_ethtool.c +f:drivers/net/ethernet/qlogic/netxen/netxen_nic_hdr.h +f:drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.c +f:drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.h +f:drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c +f:drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +f:drivers/net/ethernet/qlogic/qed/Makefile +f:drivers/net/ethernet/qlogic/qed/qed.h +f:drivers/net/ethernet/qlogic/qed/qed_chain.c +f:drivers/net/ethernet/qlogic/qed/qed_cxt.c +f:drivers/net/ethernet/qlogic/qed/qed_cxt.h +f:drivers/net/ethernet/qlogic/qed/qed_dbg_hsi.h +f:drivers/net/ethernet/qlogic/qed/qed_dcbx.c +f:drivers/net/ethernet/qlogic/qed/qed_dcbx.h +f:drivers/net/ethernet/qlogic/qed/qed_debug.c +f:drivers/net/ethernet/qlogic/qed/qed_debug.h +f:drivers/net/ethernet/qlogic/qed/qed_dev.c +f:drivers/net/ethernet/qlogic/qed/qed_dev_api.h +f:drivers/net/ethernet/qlogic/qed/qed_devlink.c +f:drivers/net/ethernet/qlogic/qed/qed_devlink.h +f:drivers/net/ethernet/qlogic/qed/qed_fcoe.c +f:drivers/net/ethernet/qlogic/qed/qed_fcoe.h +f:drivers/net/ethernet/qlogic/qed/qed_hsi.h +f:drivers/net/ethernet/qlogic/qed/qed_hw.c +f:drivers/net/ethernet/qlogic/qed/qed_hw.h +f:drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c +f:drivers/net/ethernet/qlogic/qed/qed_init_ops.c +f:drivers/net/ethernet/qlogic/qed/qed_init_ops.h +f:drivers/net/ethernet/qlogic/qed/qed_int.c +f:drivers/net/ethernet/qlogic/qed/qed_int.h +f:drivers/net/ethernet/qlogic/qed/qed_iro_hsi.h +f:drivers/net/ethernet/qlogic/qed/qed_iscsi.c +f:drivers/net/ethernet/qlogic/qed/qed_iscsi.h +f:drivers/net/ethernet/qlogic/qed/qed_iwarp.c +f:drivers/net/ethernet/qlogic/qed/qed_iwarp.h +f:drivers/net/ethernet/qlogic/qed/qed_l2.c +f:drivers/net/ethernet/qlogic/qed/qed_l2.h +f:drivers/net/ethernet/qlogic/qed/qed_ll2.c +f:drivers/net/ethernet/qlogic/qed/qed_ll2.h +f:drivers/net/ethernet/qlogic/qed/qed_main.c +f:drivers/net/ethernet/qlogic/qed/qed_mcp.c +f:drivers/net/ethernet/qlogic/qed/qed_mcp.h +f:drivers/net/ethernet/qlogic/qed/qed_mfw_hsi.h +f:drivers/net/ethernet/qlogic/qed/qed_mng_tlv.c +f:drivers/net/ethernet/qlogic/qed/qed_nvmetcp.c +f:drivers/net/ethernet/qlogic/qed/qed_nvmetcp.h +f:drivers/net/ethernet/qlogic/qed/qed_nvmetcp_fw_funcs.c +f:drivers/net/ethernet/qlogic/qed/qed_nvmetcp_fw_funcs.h +f:drivers/net/ethernet/qlogic/qed/qed_ooo.c +f:drivers/net/ethernet/qlogic/qed/qed_ooo.h +f:drivers/net/ethernet/qlogic/qed/qed_ptp.c +f:drivers/net/ethernet/qlogic/qed/qed_ptp.h +f:drivers/net/ethernet/qlogic/qed/qed_rdma.c +f:drivers/net/ethernet/qlogic/qed/qed_rdma.h +f:drivers/net/ethernet/qlogic/qed/qed_reg_addr.h +f:drivers/net/ethernet/qlogic/qed/qed_roce.c +f:drivers/net/ethernet/qlogic/qed/qed_roce.h +f:drivers/net/ethernet/qlogic/qed/qed_selftest.c +f:drivers/net/ethernet/qlogic/qed/qed_selftest.h +f:drivers/net/ethernet/qlogic/qed/qed_sp.h +f:drivers/net/ethernet/qlogic/qed/qed_sp_commands.c +f:drivers/net/ethernet/qlogic/qed/qed_spq.c +f:drivers/net/ethernet/qlogic/qed/qed_sriov.c +f:drivers/net/ethernet/qlogic/qed/qed_sriov.h +f:drivers/net/ethernet/qlogic/qed/qed_vf.c +f:drivers/net/ethernet/qlogic/qed/qed_vf.h +f:drivers/net/ethernet/qlogic/qede/Makefile +f:drivers/net/ethernet/qlogic/qede/qede.h +f:drivers/net/ethernet/qlogic/qede/qede_dcbnl.c +f:drivers/net/ethernet/qlogic/qede/qede_ethtool.c +f:drivers/net/ethernet/qlogic/qede/qede_filter.c +f:drivers/net/ethernet/qlogic/qede/qede_fp.c +f:drivers/net/ethernet/qlogic/qede/qede_main.c +f:drivers/net/ethernet/qlogic/qede/qede_ptp.c +f:drivers/net/ethernet/qlogic/qede/qede_ptp.h +f:drivers/net/ethernet/qlogic/qede/qede_rdma.c +f:drivers/net/ethernet/qlogic/qla3xxx.c +f:drivers/net/ethernet/qlogic/qla3xxx.h +f:drivers/net/ethernet/qlogic/qlcnic/Makefile +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.h +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov.h +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +f:drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c +f:drivers/net/ethernet/qualcomm/Kconfig +f:drivers/net/ethernet/qualcomm/Makefile +f:drivers/net/ethernet/qualcomm/emac/Makefile +f:drivers/net/ethernet/qualcomm/emac/emac-ethtool.c +f:drivers/net/ethernet/qualcomm/emac/emac-mac.c +f:drivers/net/ethernet/qualcomm/emac/emac-mac.h +f:drivers/net/ethernet/qualcomm/emac/emac-phy.c +f:drivers/net/ethernet/qualcomm/emac/emac-phy.h +f:drivers/net/ethernet/qualcomm/emac/emac-sgmii-fsm9900.c +f:drivers/net/ethernet/qualcomm/emac/emac-sgmii-qdf2400.c +f:drivers/net/ethernet/qualcomm/emac/emac-sgmii-qdf2432.c +f:drivers/net/ethernet/qualcomm/emac/emac-sgmii.c +f:drivers/net/ethernet/qualcomm/emac/emac-sgmii.h +f:drivers/net/ethernet/qualcomm/emac/emac.c +f:drivers/net/ethernet/qualcomm/emac/emac.h +f:drivers/net/ethernet/qualcomm/qca_7k.c +f:drivers/net/ethernet/qualcomm/qca_7k.h +f:drivers/net/ethernet/qualcomm/qca_7k_common.c +f:drivers/net/ethernet/qualcomm/qca_7k_common.h +f:drivers/net/ethernet/qualcomm/qca_debug.c +f:drivers/net/ethernet/qualcomm/qca_debug.h +f:drivers/net/ethernet/qualcomm/qca_spi.c +f:drivers/net/ethernet/qualcomm/qca_spi.h +f:drivers/net/ethernet/qualcomm/qca_uart.c +f:drivers/net/ethernet/qualcomm/rmnet/Kconfig +f:drivers/net/ethernet/qualcomm/rmnet/Makefile +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +f:drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h +f:drivers/net/ethernet/rdc/Kconfig +f:drivers/net/ethernet/rdc/Makefile +f:drivers/net/ethernet/rdc/r6040.c +f:drivers/net/ethernet/realtek/8139cp.c +f:drivers/net/ethernet/realtek/8139too.c +f:drivers/net/ethernet/realtek/Kconfig +f:drivers/net/ethernet/realtek/Makefile +f:drivers/net/ethernet/realtek/atp.c +f:drivers/net/ethernet/realtek/atp.h +f:drivers/net/ethernet/realtek/r8169.h +f:drivers/net/ethernet/realtek/r8169_firmware.c +f:drivers/net/ethernet/realtek/r8169_firmware.h +f:drivers/net/ethernet/realtek/r8169_leds.c +f:drivers/net/ethernet/realtek/r8169_main.c +f:drivers/net/ethernet/realtek/r8169_phy_config.c +f:drivers/net/ethernet/realtek/rtase/Makefile +f:drivers/net/ethernet/realtek/rtase/rtase.h +f:drivers/net/ethernet/realtek/rtase/rtase_main.c +f:drivers/net/ethernet/renesas/Kconfig +f:drivers/net/ethernet/renesas/Makefile +f:drivers/net/ethernet/renesas/ravb.h +f:drivers/net/ethernet/renesas/ravb_main.c +f:drivers/net/ethernet/renesas/ravb_ptp.c +f:drivers/net/ethernet/renesas/rcar_gen4_ptp.c +f:drivers/net/ethernet/renesas/rcar_gen4_ptp.h +f:drivers/net/ethernet/renesas/rswitch.c +f:drivers/net/ethernet/renesas/rswitch.h +f:drivers/net/ethernet/renesas/rtsn.c +f:drivers/net/ethernet/renesas/rtsn.h +f:drivers/net/ethernet/renesas/sh_eth.c +f:drivers/net/ethernet/renesas/sh_eth.h +f:drivers/net/ethernet/rocker/Kconfig +f:drivers/net/ethernet/rocker/Makefile +f:drivers/net/ethernet/rocker/rocker.h +f:drivers/net/ethernet/rocker/rocker_hw.h +f:drivers/net/ethernet/rocker/rocker_main.c +f:drivers/net/ethernet/rocker/rocker_ofdpa.c +f:drivers/net/ethernet/rocker/rocker_tlv.c +f:drivers/net/ethernet/rocker/rocker_tlv.h +f:drivers/net/ethernet/samsung/Kconfig +f:drivers/net/ethernet/samsung/Makefile +f:drivers/net/ethernet/samsung/sxgbe/Makefile +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.c +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_desc.h +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.c +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_dma.h +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_ethtool.c +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.c +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_mtl.h +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c +f:drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h +f:drivers/net/ethernet/seeq/Kconfig +f:drivers/net/ethernet/seeq/Makefile +f:drivers/net/ethernet/seeq/ether3.c +f:drivers/net/ethernet/seeq/ether3.h +f:drivers/net/ethernet/seeq/sgiseeq.c +f:drivers/net/ethernet/seeq/sgiseeq.h +f:drivers/net/ethernet/sfc/Kconfig +f:drivers/net/ethernet/sfc/Makefile +f:drivers/net/ethernet/sfc/bitfield.h +f:drivers/net/ethernet/sfc/ef10.c +f:drivers/net/ethernet/sfc/ef100.c +f:drivers/net/ethernet/sfc/ef100.h +f:drivers/net/ethernet/sfc/ef100_ethtool.c +f:drivers/net/ethernet/sfc/ef100_ethtool.h +f:drivers/net/ethernet/sfc/ef100_netdev.c +f:drivers/net/ethernet/sfc/ef100_netdev.h +f:drivers/net/ethernet/sfc/ef100_nic.c +f:drivers/net/ethernet/sfc/ef100_nic.h +f:drivers/net/ethernet/sfc/ef100_regs.h +f:drivers/net/ethernet/sfc/ef100_rep.c +f:drivers/net/ethernet/sfc/ef100_rep.h +f:drivers/net/ethernet/sfc/ef100_rx.c +f:drivers/net/ethernet/sfc/ef100_rx.h +f:drivers/net/ethernet/sfc/ef100_sriov.c +f:drivers/net/ethernet/sfc/ef100_sriov.h +f:drivers/net/ethernet/sfc/ef100_tx.c +f:drivers/net/ethernet/sfc/ef100_tx.h +f:drivers/net/ethernet/sfc/ef10_regs.h +f:drivers/net/ethernet/sfc/ef10_sriov.c +f:drivers/net/ethernet/sfc/ef10_sriov.h +f:drivers/net/ethernet/sfc/efx.c +f:drivers/net/ethernet/sfc/efx.h +f:drivers/net/ethernet/sfc/efx_channels.c +f:drivers/net/ethernet/sfc/efx_channels.h +f:drivers/net/ethernet/sfc/efx_common.c +f:drivers/net/ethernet/sfc/efx_common.h +f:drivers/net/ethernet/sfc/efx_devlink.c +f:drivers/net/ethernet/sfc/efx_devlink.h +f:drivers/net/ethernet/sfc/efx_reflash.c +f:drivers/net/ethernet/sfc/efx_reflash.h +f:drivers/net/ethernet/sfc/enum.h +f:drivers/net/ethernet/sfc/ethtool.c +f:drivers/net/ethernet/sfc/ethtool_common.c +f:drivers/net/ethernet/sfc/ethtool_common.h +f:drivers/net/ethernet/sfc/falcon/Kconfig +f:drivers/net/ethernet/sfc/falcon/Makefile +f:drivers/net/ethernet/sfc/falcon/bitfield.h +f:drivers/net/ethernet/sfc/falcon/efx.c +f:drivers/net/ethernet/sfc/falcon/efx.h +f:drivers/net/ethernet/sfc/falcon/enum.h +f:drivers/net/ethernet/sfc/falcon/ethtool.c +f:drivers/net/ethernet/sfc/falcon/falcon.c +f:drivers/net/ethernet/sfc/falcon/falcon_boards.c +f:drivers/net/ethernet/sfc/falcon/farch.c +f:drivers/net/ethernet/sfc/falcon/farch_regs.h +f:drivers/net/ethernet/sfc/falcon/filter.h +f:drivers/net/ethernet/sfc/falcon/io.h +f:drivers/net/ethernet/sfc/falcon/mdio_10g.c +f:drivers/net/ethernet/sfc/falcon/mdio_10g.h +f:drivers/net/ethernet/sfc/falcon/mtd.c +f:drivers/net/ethernet/sfc/falcon/net_driver.h +f:drivers/net/ethernet/sfc/falcon/nic.c +f:drivers/net/ethernet/sfc/falcon/nic.h +f:drivers/net/ethernet/sfc/falcon/phy.h +f:drivers/net/ethernet/sfc/falcon/qt202x_phy.c +f:drivers/net/ethernet/sfc/falcon/rx.c +f:drivers/net/ethernet/sfc/falcon/selftest.c +f:drivers/net/ethernet/sfc/falcon/selftest.h +f:drivers/net/ethernet/sfc/falcon/tenxpress.c +f:drivers/net/ethernet/sfc/falcon/tx.c +f:drivers/net/ethernet/sfc/falcon/tx.h +f:drivers/net/ethernet/sfc/falcon/txc43128_phy.c +f:drivers/net/ethernet/sfc/falcon/workarounds.h +f:drivers/net/ethernet/sfc/filter.h +f:drivers/net/ethernet/sfc/fw_formats.h +f:drivers/net/ethernet/sfc/io.h +f:drivers/net/ethernet/sfc/mae.c +f:drivers/net/ethernet/sfc/mae.h +f:drivers/net/ethernet/sfc/mae_counter_format.h +f:drivers/net/ethernet/sfc/mcdi.c +f:drivers/net/ethernet/sfc/mcdi.h +f:drivers/net/ethernet/sfc/mcdi_filters.c +f:drivers/net/ethernet/sfc/mcdi_filters.h +f:drivers/net/ethernet/sfc/mcdi_functions.c +f:drivers/net/ethernet/sfc/mcdi_functions.h +f:drivers/net/ethernet/sfc/mcdi_mon.c +f:drivers/net/ethernet/sfc/mcdi_pcol.h +f:drivers/net/ethernet/sfc/mcdi_pcol_mae.h +f:drivers/net/ethernet/sfc/mcdi_port.c +f:drivers/net/ethernet/sfc/mcdi_port.h +f:drivers/net/ethernet/sfc/mcdi_port_common.c +f:drivers/net/ethernet/sfc/mcdi_port_common.h +f:drivers/net/ethernet/sfc/mtd.c +f:drivers/net/ethernet/sfc/net_driver.h +f:drivers/net/ethernet/sfc/nic.c +f:drivers/net/ethernet/sfc/nic.h +f:drivers/net/ethernet/sfc/nic_common.h +f:drivers/net/ethernet/sfc/ptp.c +f:drivers/net/ethernet/sfc/ptp.h +f:drivers/net/ethernet/sfc/rx.c +f:drivers/net/ethernet/sfc/rx_common.c +f:drivers/net/ethernet/sfc/rx_common.h +f:drivers/net/ethernet/sfc/selftest.c +f:drivers/net/ethernet/sfc/selftest.h +f:drivers/net/ethernet/sfc/siena/Kconfig +f:drivers/net/ethernet/sfc/siena/Makefile +f:drivers/net/ethernet/sfc/siena/bitfield.h +f:drivers/net/ethernet/sfc/siena/efx.c +f:drivers/net/ethernet/sfc/siena/efx.h +f:drivers/net/ethernet/sfc/siena/efx_channels.c +f:drivers/net/ethernet/sfc/siena/efx_channels.h +f:drivers/net/ethernet/sfc/siena/efx_common.c +f:drivers/net/ethernet/sfc/siena/efx_common.h +f:drivers/net/ethernet/sfc/siena/enum.h +f:drivers/net/ethernet/sfc/siena/ethtool.c +f:drivers/net/ethernet/sfc/siena/ethtool_common.c +f:drivers/net/ethernet/sfc/siena/ethtool_common.h +f:drivers/net/ethernet/sfc/siena/farch.c +f:drivers/net/ethernet/sfc/siena/farch_regs.h +f:drivers/net/ethernet/sfc/siena/filter.h +f:drivers/net/ethernet/sfc/siena/io.h +f:drivers/net/ethernet/sfc/siena/mcdi.c +f:drivers/net/ethernet/sfc/siena/mcdi.h +f:drivers/net/ethernet/sfc/siena/mcdi_mon.c +f:drivers/net/ethernet/sfc/siena/mcdi_pcol.h +f:drivers/net/ethernet/sfc/siena/mcdi_port.c +f:drivers/net/ethernet/sfc/siena/mcdi_port.h +f:drivers/net/ethernet/sfc/siena/mcdi_port_common.c +f:drivers/net/ethernet/sfc/siena/mcdi_port_common.h +f:drivers/net/ethernet/sfc/siena/mtd.c +f:drivers/net/ethernet/sfc/siena/net_driver.h +f:drivers/net/ethernet/sfc/siena/nic.c +f:drivers/net/ethernet/sfc/siena/nic.h +f:drivers/net/ethernet/sfc/siena/nic_common.h +f:drivers/net/ethernet/sfc/siena/ptp.c +f:drivers/net/ethernet/sfc/siena/ptp.h +f:drivers/net/ethernet/sfc/siena/rx.c +f:drivers/net/ethernet/sfc/siena/rx_common.c +f:drivers/net/ethernet/sfc/siena/rx_common.h +f:drivers/net/ethernet/sfc/siena/selftest.c +f:drivers/net/ethernet/sfc/siena/selftest.h +f:drivers/net/ethernet/sfc/siena/siena.c +f:drivers/net/ethernet/sfc/siena/siena_sriov.c +f:drivers/net/ethernet/sfc/siena/siena_sriov.h +f:drivers/net/ethernet/sfc/siena/sriov.h +f:drivers/net/ethernet/sfc/siena/tx.c +f:drivers/net/ethernet/sfc/siena/tx.h +f:drivers/net/ethernet/sfc/siena/tx_common.c +f:drivers/net/ethernet/sfc/siena/tx_common.h +f:drivers/net/ethernet/sfc/siena/vfdi.h +f:drivers/net/ethernet/sfc/siena/workarounds.h +f:drivers/net/ethernet/sfc/sriov.c +f:drivers/net/ethernet/sfc/sriov.h +f:drivers/net/ethernet/sfc/tc.c +f:drivers/net/ethernet/sfc/tc.h +f:drivers/net/ethernet/sfc/tc_bindings.c +f:drivers/net/ethernet/sfc/tc_bindings.h +f:drivers/net/ethernet/sfc/tc_conntrack.c +f:drivers/net/ethernet/sfc/tc_conntrack.h +f:drivers/net/ethernet/sfc/tc_counters.c +f:drivers/net/ethernet/sfc/tc_counters.h +f:drivers/net/ethernet/sfc/tc_encap_actions.c +f:drivers/net/ethernet/sfc/tc_encap_actions.h +f:drivers/net/ethernet/sfc/tx.c +f:drivers/net/ethernet/sfc/tx.h +f:drivers/net/ethernet/sfc/tx_common.c +f:drivers/net/ethernet/sfc/tx_common.h +f:drivers/net/ethernet/sfc/tx_tso.c +f:drivers/net/ethernet/sfc/workarounds.h +f:drivers/net/ethernet/sgi/Kconfig +f:drivers/net/ethernet/sgi/Makefile +f:drivers/net/ethernet/sgi/ioc3-eth.c +f:drivers/net/ethernet/sgi/meth.c +f:drivers/net/ethernet/sgi/meth.h +f:drivers/net/ethernet/silan/Kconfig +f:drivers/net/ethernet/silan/Makefile +f:drivers/net/ethernet/silan/sc92031.c +f:drivers/net/ethernet/sis/Kconfig +f:drivers/net/ethernet/sis/Makefile +f:drivers/net/ethernet/sis/sis190.c +f:drivers/net/ethernet/sis/sis900.c +f:drivers/net/ethernet/sis/sis900.h +f:drivers/net/ethernet/smsc/Kconfig +f:drivers/net/ethernet/smsc/Makefile +f:drivers/net/ethernet/smsc/epic100.c +f:drivers/net/ethernet/smsc/smc9194.c +f:drivers/net/ethernet/smsc/smc9194.h +f:drivers/net/ethernet/smsc/smc91c92_cs.c +f:drivers/net/ethernet/smsc/smc91x.c +f:drivers/net/ethernet/smsc/smc91x.h +f:drivers/net/ethernet/smsc/smsc911x.c +f:drivers/net/ethernet/smsc/smsc911x.h +f:drivers/net/ethernet/smsc/smsc9420.c +f:drivers/net/ethernet/smsc/smsc9420.h +f:drivers/net/ethernet/socionext/Kconfig +f:drivers/net/ethernet/socionext/Makefile +f:drivers/net/ethernet/socionext/netsec.c +f:drivers/net/ethernet/socionext/sni_ave.c +f:drivers/net/ethernet/stmicro/Kconfig +f:drivers/net/ethernet/stmicro/Makefile +f:drivers/net/ethernet/stmicro/stmmac/Kconfig +f:drivers/net/ethernet/stmicro/stmmac/Makefile +f:drivers/net/ethernet/stmicro/stmmac/chain_mode.c +f:drivers/net/ethernet/stmicro/stmmac/common.h +f:drivers/net/ethernet/stmicro/stmmac/descs.h +f:drivers/net/ethernet/stmicro/stmmac/descs_com.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-ingenic.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-intel-plat.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-intel.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-rzn1.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-sophgo.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac100.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac1000.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac1000_dma.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac100_core.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac100_dma.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac4.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac5.c +f:drivers/net/ethernet/stmicro/stmmac/dwmac5.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h +f:drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c +f:drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +f:drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +f:drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c +f:drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +f:drivers/net/ethernet/stmicro/stmmac/dwxlgmac2.h +f:drivers/net/ethernet/stmicro/stmmac/enh_desc.c +f:drivers/net/ethernet/stmicro/stmmac/hwif.c +f:drivers/net/ethernet/stmicro/stmmac/hwif.h +f:drivers/net/ethernet/stmicro/stmmac/mmc.h +f:drivers/net/ethernet/stmicro/stmmac/mmc_core.c +f:drivers/net/ethernet/stmicro/stmmac/norm_desc.c +f:drivers/net/ethernet/stmicro/stmmac/ring_mode.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac.h +f:drivers/net/ethernet/stmicro/stmmac/stmmac_est.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_est.h +f:drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_fpe.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_fpe.h +f:drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_pcs.h +f:drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h +f:drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h +f:drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_vlan.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_vlan.h +f:drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c +f:drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.h +f:drivers/net/ethernet/sun/Kconfig +f:drivers/net/ethernet/sun/Makefile +f:drivers/net/ethernet/sun/cassini.c +f:drivers/net/ethernet/sun/cassini.h +f:drivers/net/ethernet/sun/ldmvsw.c +f:drivers/net/ethernet/sun/niu.c +f:drivers/net/ethernet/sun/niu.h +f:drivers/net/ethernet/sun/sunbmac.c +f:drivers/net/ethernet/sun/sunbmac.h +f:drivers/net/ethernet/sun/sungem.c +f:drivers/net/ethernet/sun/sungem.h +f:drivers/net/ethernet/sun/sunhme.c +f:drivers/net/ethernet/sun/sunhme.h +f:drivers/net/ethernet/sun/sunqe.c +f:drivers/net/ethernet/sun/sunqe.h +f:drivers/net/ethernet/sun/sunvnet.c +f:drivers/net/ethernet/sun/sunvnet_common.c +f:drivers/net/ethernet/sun/sunvnet_common.h +f:drivers/net/ethernet/sunplus/Kconfig +f:drivers/net/ethernet/sunplus/Makefile +f:drivers/net/ethernet/sunplus/spl2sw_define.h +f:drivers/net/ethernet/sunplus/spl2sw_desc.c +f:drivers/net/ethernet/sunplus/spl2sw_desc.h +f:drivers/net/ethernet/sunplus/spl2sw_driver.c +f:drivers/net/ethernet/sunplus/spl2sw_int.c +f:drivers/net/ethernet/sunplus/spl2sw_int.h +f:drivers/net/ethernet/sunplus/spl2sw_mac.c +f:drivers/net/ethernet/sunplus/spl2sw_mac.h +f:drivers/net/ethernet/sunplus/spl2sw_mdio.c +f:drivers/net/ethernet/sunplus/spl2sw_mdio.h +f:drivers/net/ethernet/sunplus/spl2sw_phy.c +f:drivers/net/ethernet/sunplus/spl2sw_phy.h +f:drivers/net/ethernet/sunplus/spl2sw_register.h +f:drivers/net/ethernet/synopsys/Kconfig +f:drivers/net/ethernet/synopsys/Makefile +f:drivers/net/ethernet/synopsys/dwc-xlgmac-common.c +f:drivers/net/ethernet/synopsys/dwc-xlgmac-desc.c +f:drivers/net/ethernet/synopsys/dwc-xlgmac-ethtool.c +f:drivers/net/ethernet/synopsys/dwc-xlgmac-hw.c +f:drivers/net/ethernet/synopsys/dwc-xlgmac-net.c +f:drivers/net/ethernet/synopsys/dwc-xlgmac-pci.c +f:drivers/net/ethernet/synopsys/dwc-xlgmac-reg.h +f:drivers/net/ethernet/synopsys/dwc-xlgmac.h +f:drivers/net/ethernet/tehuti/Kconfig +f:drivers/net/ethernet/tehuti/Makefile +f:drivers/net/ethernet/tehuti/tehuti.c +f:drivers/net/ethernet/tehuti/tehuti.h +f:drivers/net/ethernet/tehuti/tn40.c +f:drivers/net/ethernet/tehuti/tn40.h +f:drivers/net/ethernet/tehuti/tn40_mdio.c +f:drivers/net/ethernet/tehuti/tn40_phy.c +f:drivers/net/ethernet/tehuti/tn40_regs.h +f:drivers/net/ethernet/ti/Kconfig +f:drivers/net/ethernet/ti/Makefile +f:drivers/net/ethernet/ti/am65-cpsw-ethtool.c +f:drivers/net/ethernet/ti/am65-cpsw-nuss.c +f:drivers/net/ethernet/ti/am65-cpsw-nuss.h +f:drivers/net/ethernet/ti/am65-cpsw-qos.c +f:drivers/net/ethernet/ti/am65-cpsw-qos.h +f:drivers/net/ethernet/ti/am65-cpsw-switchdev.c +f:drivers/net/ethernet/ti/am65-cpsw-switchdev.h +f:drivers/net/ethernet/ti/am65-cpts.c +f:drivers/net/ethernet/ti/am65-cpts.h +f:drivers/net/ethernet/ti/cpsw-common.c +f:drivers/net/ethernet/ti/cpsw-phy-sel.c +f:drivers/net/ethernet/ti/cpsw.c +f:drivers/net/ethernet/ti/cpsw.h +f:drivers/net/ethernet/ti/cpsw_ale.c +f:drivers/net/ethernet/ti/cpsw_ale.h +f:drivers/net/ethernet/ti/cpsw_ethtool.c +f:drivers/net/ethernet/ti/cpsw_new.c +f:drivers/net/ethernet/ti/cpsw_priv.c +f:drivers/net/ethernet/ti/cpsw_priv.h +f:drivers/net/ethernet/ti/cpsw_sl.c +f:drivers/net/ethernet/ti/cpsw_sl.h +f:drivers/net/ethernet/ti/cpsw_switchdev.c +f:drivers/net/ethernet/ti/cpsw_switchdev.h +f:drivers/net/ethernet/ti/cpts.c +f:drivers/net/ethernet/ti/cpts.h +f:drivers/net/ethernet/ti/davinci_cpdma.c +f:drivers/net/ethernet/ti/davinci_cpdma.h +f:drivers/net/ethernet/ti/davinci_emac.c +f:drivers/net/ethernet/ti/davinci_mdio.c +f:drivers/net/ethernet/ti/icssg/icss_iep.c +f:drivers/net/ethernet/ti/icssg/icss_iep.h +f:drivers/net/ethernet/ti/icssg/icssg_classifier.c +f:drivers/net/ethernet/ti/icssg/icssg_common.c +f:drivers/net/ethernet/ti/icssg/icssg_config.c +f:drivers/net/ethernet/ti/icssg/icssg_config.h +f:drivers/net/ethernet/ti/icssg/icssg_ethtool.c +f:drivers/net/ethernet/ti/icssg/icssg_mii_cfg.c +f:drivers/net/ethernet/ti/icssg/icssg_mii_rt.h +f:drivers/net/ethernet/ti/icssg/icssg_prueth.c +f:drivers/net/ethernet/ti/icssg/icssg_prueth.h +f:drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c +f:drivers/net/ethernet/ti/icssg/icssg_queues.c +f:drivers/net/ethernet/ti/icssg/icssg_stats.c +f:drivers/net/ethernet/ti/icssg/icssg_stats.h +f:drivers/net/ethernet/ti/icssg/icssg_switch_map.h +f:drivers/net/ethernet/ti/icssg/icssg_switchdev.c +f:drivers/net/ethernet/ti/icssg/icssg_switchdev.h +f:drivers/net/ethernet/ti/k3-cppi-desc-pool.c +f:drivers/net/ethernet/ti/k3-cppi-desc-pool.h +f:drivers/net/ethernet/ti/netcp.h +f:drivers/net/ethernet/ti/netcp_core.c +f:drivers/net/ethernet/ti/netcp_ethss.c +f:drivers/net/ethernet/ti/netcp_sgmii.c +f:drivers/net/ethernet/ti/netcp_xgbepcsr.c +f:drivers/net/ethernet/ti/tlan.c +f:drivers/net/ethernet/ti/tlan.h +f:drivers/net/ethernet/toshiba/Kconfig +f:drivers/net/ethernet/toshiba/Makefile +f:drivers/net/ethernet/toshiba/ps3_gelic_net.c +f:drivers/net/ethernet/toshiba/ps3_gelic_net.h +f:drivers/net/ethernet/toshiba/ps3_gelic_wireless.c +f:drivers/net/ethernet/toshiba/ps3_gelic_wireless.h +f:drivers/net/ethernet/toshiba/tc35815.c +f:drivers/net/ethernet/tundra/Kconfig +f:drivers/net/ethernet/tundra/Makefile +f:drivers/net/ethernet/tundra/tsi108_eth.c +f:drivers/net/ethernet/tundra/tsi108_eth.h +f:drivers/net/ethernet/vertexcom/Kconfig +f:drivers/net/ethernet/vertexcom/Makefile +f:drivers/net/ethernet/vertexcom/mse102x.c +f:drivers/net/ethernet/via/Kconfig +f:drivers/net/ethernet/via/Makefile +f:drivers/net/ethernet/via/via-rhine.c +f:drivers/net/ethernet/via/via-velocity.c +f:drivers/net/ethernet/via/via-velocity.h +f:drivers/net/ethernet/wangxun/Kconfig +f:drivers/net/ethernet/wangxun/Makefile +f:drivers/net/ethernet/wangxun/libwx/Makefile +f:drivers/net/ethernet/wangxun/libwx/wx_ethtool.c +f:drivers/net/ethernet/wangxun/libwx/wx_ethtool.h +f:drivers/net/ethernet/wangxun/libwx/wx_hw.c +f:drivers/net/ethernet/wangxun/libwx/wx_hw.h +f:drivers/net/ethernet/wangxun/libwx/wx_lib.c +f:drivers/net/ethernet/wangxun/libwx/wx_lib.h +f:drivers/net/ethernet/wangxun/libwx/wx_mbx.c +f:drivers/net/ethernet/wangxun/libwx/wx_mbx.h +f:drivers/net/ethernet/wangxun/libwx/wx_ptp.c +f:drivers/net/ethernet/wangxun/libwx/wx_ptp.h +f:drivers/net/ethernet/wangxun/libwx/wx_sriov.c +f:drivers/net/ethernet/wangxun/libwx/wx_sriov.h +f:drivers/net/ethernet/wangxun/libwx/wx_type.h +f:drivers/net/ethernet/wangxun/libwx/wx_vf.c +f:drivers/net/ethernet/wangxun/libwx/wx_vf.h +f:drivers/net/ethernet/wangxun/libwx/wx_vf_common.c +f:drivers/net/ethernet/wangxun/libwx/wx_vf_common.h +f:drivers/net/ethernet/wangxun/libwx/wx_vf_lib.c +f:drivers/net/ethernet/wangxun/libwx/wx_vf_lib.h +f:drivers/net/ethernet/wangxun/ngbe/Makefile +f:drivers/net/ethernet/wangxun/ngbe/ngbe_ethtool.c +f:drivers/net/ethernet/wangxun/ngbe/ngbe_ethtool.h +f:drivers/net/ethernet/wangxun/ngbe/ngbe_hw.c +f:drivers/net/ethernet/wangxun/ngbe/ngbe_hw.h +f:drivers/net/ethernet/wangxun/ngbe/ngbe_main.c +f:drivers/net/ethernet/wangxun/ngbe/ngbe_mdio.c +f:drivers/net/ethernet/wangxun/ngbe/ngbe_mdio.h +f:drivers/net/ethernet/wangxun/ngbe/ngbe_type.h +f:drivers/net/ethernet/wangxun/ngbevf/Makefile +f:drivers/net/ethernet/wangxun/ngbevf/ngbevf_main.c +f:drivers/net/ethernet/wangxun/ngbevf/ngbevf_type.h +f:drivers/net/ethernet/wangxun/txgbe/Makefile +f:drivers/net/ethernet/wangxun/txgbe/txgbe_aml.c +f:drivers/net/ethernet/wangxun/txgbe/txgbe_aml.h +f:drivers/net/ethernet/wangxun/txgbe/txgbe_ethtool.c +f:drivers/net/ethernet/wangxun/txgbe/txgbe_ethtool.h +f:drivers/net/ethernet/wangxun/txgbe/txgbe_fdir.c +f:drivers/net/ethernet/wangxun/txgbe/txgbe_fdir.h +f:drivers/net/ethernet/wangxun/txgbe/txgbe_hw.c +f:drivers/net/ethernet/wangxun/txgbe/txgbe_hw.h +f:drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c +f:drivers/net/ethernet/wangxun/txgbe/txgbe_irq.h +f:drivers/net/ethernet/wangxun/txgbe/txgbe_main.c +f:drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c +f:drivers/net/ethernet/wangxun/txgbe/txgbe_phy.h +f:drivers/net/ethernet/wangxun/txgbe/txgbe_type.h +f:drivers/net/ethernet/wangxun/txgbevf/Makefile +f:drivers/net/ethernet/wangxun/txgbevf/txgbevf_main.c +f:drivers/net/ethernet/wangxun/txgbevf/txgbevf_type.h +f:drivers/net/ethernet/wiznet/Kconfig +f:drivers/net/ethernet/wiznet/Makefile +f:drivers/net/ethernet/wiznet/w5100-spi.c +f:drivers/net/ethernet/wiznet/w5100.c +f:drivers/net/ethernet/wiznet/w5100.h +f:drivers/net/ethernet/wiznet/w5300.c +f:drivers/net/ethernet/xilinx/Kconfig +f:drivers/net/ethernet/xilinx/Makefile +f:drivers/net/ethernet/xilinx/ll_temac.h +f:drivers/net/ethernet/xilinx/ll_temac_main.c +f:drivers/net/ethernet/xilinx/ll_temac_mdio.c +f:drivers/net/ethernet/xilinx/xilinx_axienet.h +f:drivers/net/ethernet/xilinx/xilinx_axienet_main.c +f:drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c +f:drivers/net/ethernet/xilinx/xilinx_emaclite.c +f:drivers/net/ethernet/xircom/Kconfig +f:drivers/net/ethernet/xircom/Makefile +f:drivers/net/ethernet/xircom/xirc2ps_cs.c +f:drivers/net/ethernet/xscale/Kconfig +f:drivers/net/ethernet/xscale/Makefile +f:drivers/net/ethernet/xscale/ixp46x_ts.h +f:drivers/net/ethernet/xscale/ixp4xx_eth.c +f:drivers/net/ethernet/xscale/ptp_ixp46x.c +f:drivers/net/fddi/Kconfig +f:drivers/net/fddi/Makefile +f:drivers/net/fddi/defxx.c +f:drivers/net/fddi/defxx.h +f:drivers/net/fddi/defza.c +f:drivers/net/fddi/defza.h +f:drivers/net/fddi/skfp/Makefile +f:drivers/net/fddi/skfp/cfm.c +f:drivers/net/fddi/skfp/drvfbi.c +f:drivers/net/fddi/skfp/ecm.c +f:drivers/net/fddi/skfp/ess.c +f:drivers/net/fddi/skfp/fplustm.c +f:drivers/net/fddi/skfp/h/cmtdef.h +f:drivers/net/fddi/skfp/h/fddi.h +f:drivers/net/fddi/skfp/h/fddimib.h +f:drivers/net/fddi/skfp/h/fplustm.h +f:drivers/net/fddi/skfp/h/hwmtm.h +f:drivers/net/fddi/skfp/h/mbuf.h +f:drivers/net/fddi/skfp/h/osdef1st.h +f:drivers/net/fddi/skfp/h/sba.h +f:drivers/net/fddi/skfp/h/sba_def.h +f:drivers/net/fddi/skfp/h/skfbi.h +f:drivers/net/fddi/skfp/h/skfbiinc.h +f:drivers/net/fddi/skfp/h/smc.h +f:drivers/net/fddi/skfp/h/smt.h +f:drivers/net/fddi/skfp/h/smt_p.h +f:drivers/net/fddi/skfp/h/smtstate.h +f:drivers/net/fddi/skfp/h/supern_2.h +f:drivers/net/fddi/skfp/h/targethw.h +f:drivers/net/fddi/skfp/h/targetos.h +f:drivers/net/fddi/skfp/h/types.h +f:drivers/net/fddi/skfp/hwmtm.c +f:drivers/net/fddi/skfp/hwt.c +f:drivers/net/fddi/skfp/pcmplc.c +f:drivers/net/fddi/skfp/pmf.c +f:drivers/net/fddi/skfp/queue.c +f:drivers/net/fddi/skfp/rmt.c +f:drivers/net/fddi/skfp/skfddi.c +f:drivers/net/fddi/skfp/smt.c +f:drivers/net/fddi/skfp/smtdef.c +f:drivers/net/fddi/skfp/smtinit.c +f:drivers/net/fddi/skfp/smttimer.c +f:drivers/net/fddi/skfp/srf.c +f:drivers/net/fjes/Makefile +f:drivers/net/fjes/fjes.h +f:drivers/net/fjes/fjes_debugfs.c +f:drivers/net/fjes/fjes_ethtool.c +f:drivers/net/fjes/fjes_hw.c +f:drivers/net/fjes/fjes_hw.h +f:drivers/net/fjes/fjes_main.c +f:drivers/net/fjes/fjes_regs.h +f:drivers/net/fjes/fjes_trace.c +f:drivers/net/fjes/fjes_trace.h +f:drivers/net/geneve.c +f:drivers/net/gtp.c +f:drivers/net/hamradio/6pack.c +f:drivers/net/hamradio/Kconfig +f:drivers/net/hamradio/Makefile +f:drivers/net/hamradio/baycom_epp.c +f:drivers/net/hamradio/baycom_par.c +f:drivers/net/hamradio/baycom_ser_fdx.c +f:drivers/net/hamradio/baycom_ser_hdx.c +f:drivers/net/hamradio/bpqether.c +f:drivers/net/hamradio/hdlcdrv.c +f:drivers/net/hamradio/mkiss.c +f:drivers/net/hamradio/scc.c +f:drivers/net/hamradio/yam.c +f:drivers/net/hamradio/z8530.h +f:drivers/net/hippi/Kconfig +f:drivers/net/hippi/Makefile +f:drivers/net/hippi/rrunner.c +f:drivers/net/hippi/rrunner.h +f:drivers/net/hyperv/Kconfig +f:drivers/net/hyperv/Makefile +f:drivers/net/hyperv/hyperv_net.h +f:drivers/net/hyperv/netvsc.c +f:drivers/net/hyperv/netvsc_bpf.c +f:drivers/net/hyperv/netvsc_drv.c +f:drivers/net/hyperv/netvsc_trace.c +f:drivers/net/hyperv/netvsc_trace.h +f:drivers/net/hyperv/rndis_filter.c +f:drivers/net/ieee802154/Kconfig +f:drivers/net/ieee802154/Makefile +f:drivers/net/ieee802154/adf7242.c +f:drivers/net/ieee802154/at86rf230.c +f:drivers/net/ieee802154/at86rf230.h +f:drivers/net/ieee802154/atusb.c +f:drivers/net/ieee802154/atusb.h +f:drivers/net/ieee802154/ca8210.c +f:drivers/net/ieee802154/cc2520.c +f:drivers/net/ieee802154/fakelb.c +f:drivers/net/ieee802154/mac802154_hwsim.c +f:drivers/net/ieee802154/mac802154_hwsim.h +f:drivers/net/ieee802154/mcr20a.c +f:drivers/net/ieee802154/mcr20a.h +f:drivers/net/ieee802154/mrf24j40.c +f:drivers/net/ifb.c +f:drivers/net/ipa/Kconfig +f:drivers/net/ipa/Makefile +f:drivers/net/ipa/data/ipa_data-v3.1.c +f:drivers/net/ipa/data/ipa_data-v3.5.1.c +f:drivers/net/ipa/data/ipa_data-v4.11.c +f:drivers/net/ipa/data/ipa_data-v4.2.c +f:drivers/net/ipa/data/ipa_data-v4.5.c +f:drivers/net/ipa/data/ipa_data-v4.7.c +f:drivers/net/ipa/data/ipa_data-v4.9.c +f:drivers/net/ipa/data/ipa_data-v5.0.c +f:drivers/net/ipa/data/ipa_data-v5.5.c +f:drivers/net/ipa/gsi.c +f:drivers/net/ipa/gsi.h +f:drivers/net/ipa/gsi_private.h +f:drivers/net/ipa/gsi_reg.c +f:drivers/net/ipa/gsi_reg.h +f:drivers/net/ipa/gsi_trans.c +f:drivers/net/ipa/gsi_trans.h +f:drivers/net/ipa/ipa.h +f:drivers/net/ipa/ipa_cmd.c +f:drivers/net/ipa/ipa_cmd.h +f:drivers/net/ipa/ipa_data.h +f:drivers/net/ipa/ipa_endpoint.c +f:drivers/net/ipa/ipa_endpoint.h +f:drivers/net/ipa/ipa_gsi.c +f:drivers/net/ipa/ipa_gsi.h +f:drivers/net/ipa/ipa_interrupt.c +f:drivers/net/ipa/ipa_interrupt.h +f:drivers/net/ipa/ipa_main.c +f:drivers/net/ipa/ipa_mem.c +f:drivers/net/ipa/ipa_mem.h +f:drivers/net/ipa/ipa_modem.c +f:drivers/net/ipa/ipa_modem.h +f:drivers/net/ipa/ipa_power.c +f:drivers/net/ipa/ipa_power.h +f:drivers/net/ipa/ipa_qmi.c +f:drivers/net/ipa/ipa_qmi.h +f:drivers/net/ipa/ipa_qmi_msg.c +f:drivers/net/ipa/ipa_qmi_msg.h +f:drivers/net/ipa/ipa_reg.c +f:drivers/net/ipa/ipa_reg.h +f:drivers/net/ipa/ipa_resource.c +f:drivers/net/ipa/ipa_resource.h +f:drivers/net/ipa/ipa_smp2p.c +f:drivers/net/ipa/ipa_smp2p.h +f:drivers/net/ipa/ipa_sysfs.c +f:drivers/net/ipa/ipa_sysfs.h +f:drivers/net/ipa/ipa_table.c +f:drivers/net/ipa/ipa_table.h +f:drivers/net/ipa/ipa_uc.c +f:drivers/net/ipa/ipa_uc.h +f:drivers/net/ipa/ipa_version.h +f:drivers/net/ipa/reg.h +f:drivers/net/ipa/reg/gsi_reg-v3.1.c +f:drivers/net/ipa/reg/gsi_reg-v3.5.1.c +f:drivers/net/ipa/reg/gsi_reg-v4.0.c +f:drivers/net/ipa/reg/gsi_reg-v4.11.c +f:drivers/net/ipa/reg/gsi_reg-v4.5.c +f:drivers/net/ipa/reg/gsi_reg-v4.9.c +f:drivers/net/ipa/reg/gsi_reg-v5.0.c +f:drivers/net/ipa/reg/ipa_reg-v3.1.c +f:drivers/net/ipa/reg/ipa_reg-v3.5.1.c +f:drivers/net/ipa/reg/ipa_reg-v4.11.c +f:drivers/net/ipa/reg/ipa_reg-v4.2.c +f:drivers/net/ipa/reg/ipa_reg-v4.5.c +f:drivers/net/ipa/reg/ipa_reg-v4.7.c +f:drivers/net/ipa/reg/ipa_reg-v4.9.c +f:drivers/net/ipa/reg/ipa_reg-v5.0.c +f:drivers/net/ipa/reg/ipa_reg-v5.5.c +f:drivers/net/ipvlan/Makefile +f:drivers/net/ipvlan/ipvlan.h +f:drivers/net/ipvlan/ipvlan_core.c +f:drivers/net/ipvlan/ipvlan_l3s.c +f:drivers/net/ipvlan/ipvlan_main.c +f:drivers/net/ipvlan/ipvtap.c +f:drivers/net/loopback.c +f:drivers/net/macsec.c +f:drivers/net/macvlan.c +f:drivers/net/macvtap.c +f:drivers/net/mctp/Kconfig +f:drivers/net/mctp/Makefile +f:drivers/net/mctp/mctp-i2c.c +f:drivers/net/mctp/mctp-i3c.c +f:drivers/net/mctp/mctp-serial.c +f:drivers/net/mctp/mctp-usb.c +f:drivers/net/mdio.c +f:drivers/net/mdio/Kconfig +f:drivers/net/mdio/Makefile +f:drivers/net/mdio/acpi_mdio.c +f:drivers/net/mdio/fwnode_mdio.c +f:drivers/net/mdio/mdio-airoha.c +f:drivers/net/mdio/mdio-aspeed.c +f:drivers/net/mdio/mdio-bcm-iproc.c +f:drivers/net/mdio/mdio-bcm-unimac.c +f:drivers/net/mdio/mdio-bitbang.c +f:drivers/net/mdio/mdio-cavium.c +f:drivers/net/mdio/mdio-cavium.h +f:drivers/net/mdio/mdio-gpio.c +f:drivers/net/mdio/mdio-hisi-femac.c +f:drivers/net/mdio/mdio-i2c.c +f:drivers/net/mdio/mdio-ipq4019.c +f:drivers/net/mdio/mdio-ipq8064.c +f:drivers/net/mdio/mdio-moxart.c +f:drivers/net/mdio/mdio-mscc-miim.c +f:drivers/net/mdio/mdio-mux-bcm-iproc.c +f:drivers/net/mdio/mdio-mux-bcm6368.c +f:drivers/net/mdio/mdio-mux-gpio.c +f:drivers/net/mdio/mdio-mux-meson-g12a.c +f:drivers/net/mdio/mdio-mux-meson-gxl.c +f:drivers/net/mdio/mdio-mux-mmioreg.c +f:drivers/net/mdio/mdio-mux-multiplexer.c +f:drivers/net/mdio/mdio-mux.c +f:drivers/net/mdio/mdio-mvusb.c +f:drivers/net/mdio/mdio-octeon.c +f:drivers/net/mdio/mdio-realtek-rtl9300.c +f:drivers/net/mdio/mdio-regmap.c +f:drivers/net/mdio/mdio-sun4i.c +f:drivers/net/mdio/mdio-thunder.c +f:drivers/net/mdio/mdio-xgene.c +f:drivers/net/mdio/of_mdio.c +f:drivers/net/mhi_net.c +f:drivers/net/mii.c +f:drivers/net/net_failover.c +f:drivers/net/netconsole.c +f:drivers/net/netdevsim/Makefile +f:drivers/net/netdevsim/bpf.c +f:drivers/net/netdevsim/bus.c +f:drivers/net/netdevsim/dev.c +f:drivers/net/netdevsim/ethtool.c +f:drivers/net/netdevsim/fib.c +f:drivers/net/netdevsim/health.c +f:drivers/net/netdevsim/hwstats.c +f:drivers/net/netdevsim/ipsec.c +f:drivers/net/netdevsim/macsec.c +f:drivers/net/netdevsim/netdev.c +f:drivers/net/netdevsim/netdevsim.h +f:drivers/net/netdevsim/psample.c +f:drivers/net/netdevsim/udp_tunnels.c +f:drivers/net/netkit.c +f:drivers/net/nlmon.c +f:drivers/net/ntb_netdev.c +f:drivers/net/ovpn/Makefile +f:drivers/net/ovpn/bind.c +f:drivers/net/ovpn/bind.h +f:drivers/net/ovpn/crypto.c +f:drivers/net/ovpn/crypto.h +f:drivers/net/ovpn/crypto_aead.c +f:drivers/net/ovpn/crypto_aead.h +f:drivers/net/ovpn/io.c +f:drivers/net/ovpn/io.h +f:drivers/net/ovpn/main.c +f:drivers/net/ovpn/main.h +f:drivers/net/ovpn/netlink-gen.c +f:drivers/net/ovpn/netlink-gen.h +f:drivers/net/ovpn/netlink.c +f:drivers/net/ovpn/netlink.h +f:drivers/net/ovpn/ovpnpriv.h +f:drivers/net/ovpn/peer.c +f:drivers/net/ovpn/peer.h +f:drivers/net/ovpn/pktid.c +f:drivers/net/ovpn/pktid.h +f:drivers/net/ovpn/proto.h +f:drivers/net/ovpn/skb.h +f:drivers/net/ovpn/socket.c +f:drivers/net/ovpn/socket.h +f:drivers/net/ovpn/stats.c +f:drivers/net/ovpn/stats.h +f:drivers/net/ovpn/tcp.c +f:drivers/net/ovpn/tcp.h +f:drivers/net/ovpn/udp.c +f:drivers/net/ovpn/udp.h +f:drivers/net/pcs/Kconfig +f:drivers/net/pcs/Makefile +f:drivers/net/pcs/pcs-lynx.c +f:drivers/net/pcs/pcs-mtk-lynxi.c +f:drivers/net/pcs/pcs-rzn1-miic.c +f:drivers/net/pcs/pcs-xpcs-nxp.c +f:drivers/net/pcs/pcs-xpcs-plat.c +f:drivers/net/pcs/pcs-xpcs-wx.c +f:drivers/net/pcs/pcs-xpcs.c +f:drivers/net/pcs/pcs-xpcs.h +f:drivers/net/pfcp.c +f:drivers/net/phy/Kconfig +f:drivers/net/phy/Makefile +f:drivers/net/phy/adin.c +f:drivers/net/phy/adin1100.c +f:drivers/net/phy/air_en8811h.c +f:drivers/net/phy/amd.c +f:drivers/net/phy/aquantia/Kconfig +f:drivers/net/phy/aquantia/Makefile +f:drivers/net/phy/aquantia/aquantia.h +f:drivers/net/phy/aquantia/aquantia_firmware.c +f:drivers/net/phy/aquantia/aquantia_hwmon.c +f:drivers/net/phy/aquantia/aquantia_leds.c +f:drivers/net/phy/aquantia/aquantia_main.c +f:drivers/net/phy/as21xxx.c +f:drivers/net/phy/ax88796b.c +f:drivers/net/phy/ax88796b_rust.rs +f:drivers/net/phy/bcm-cygnus.c +f:drivers/net/phy/bcm-phy-lib.c +f:drivers/net/phy/bcm-phy-lib.h +f:drivers/net/phy/bcm-phy-ptp.c +f:drivers/net/phy/bcm54140.c +f:drivers/net/phy/bcm63xx.c +f:drivers/net/phy/bcm7xxx.c +f:drivers/net/phy/bcm84881.c +f:drivers/net/phy/bcm87xx.c +f:drivers/net/phy/broadcom.c +f:drivers/net/phy/cicada.c +f:drivers/net/phy/cortina.c +f:drivers/net/phy/davicom.c +f:drivers/net/phy/dp83640.c +f:drivers/net/phy/dp83640_reg.h +f:drivers/net/phy/dp83822.c +f:drivers/net/phy/dp83848.c +f:drivers/net/phy/dp83867.c +f:drivers/net/phy/dp83869.c +f:drivers/net/phy/dp83tc811.c +f:drivers/net/phy/dp83td510.c +f:drivers/net/phy/dp83tg720.c +f:drivers/net/phy/et1011c.c +f:drivers/net/phy/fixed_phy.c +f:drivers/net/phy/icplus.c +f:drivers/net/phy/intel-xway.c +f:drivers/net/phy/linkmode.c +f:drivers/net/phy/lxt.c +f:drivers/net/phy/marvell-88q2xxx.c +f:drivers/net/phy/marvell-88x2222.c +f:drivers/net/phy/marvell.c +f:drivers/net/phy/marvell10g.c +f:drivers/net/phy/mdio-boardinfo.c +f:drivers/net/phy/mdio-boardinfo.h +f:drivers/net/phy/mdio-open-alliance.h +f:drivers/net/phy/mdio_bus.c +f:drivers/net/phy/mdio_bus_provider.c +f:drivers/net/phy/mdio_device.c +f:drivers/net/phy/mdio_devres.c +f:drivers/net/phy/mediatek/Kconfig +f:drivers/net/phy/mediatek/Makefile +f:drivers/net/phy/mediatek/mtk-2p5ge.c +f:drivers/net/phy/mediatek/mtk-ge-soc.c +f:drivers/net/phy/mediatek/mtk-ge.c +f:drivers/net/phy/mediatek/mtk-phy-lib.c +f:drivers/net/phy/mediatek/mtk.h +f:drivers/net/phy/meson-gxl.c +f:drivers/net/phy/micrel.c +f:drivers/net/phy/microchip.c +f:drivers/net/phy/microchip_rds_ptp.c +f:drivers/net/phy/microchip_rds_ptp.h +f:drivers/net/phy/microchip_t1.c +f:drivers/net/phy/microchip_t1s.c +f:drivers/net/phy/mii_timestamper.c +f:drivers/net/phy/motorcomm.c +f:drivers/net/phy/mscc/Makefile +f:drivers/net/phy/mscc/mscc.h +f:drivers/net/phy/mscc/mscc_fc_buffer.h +f:drivers/net/phy/mscc/mscc_mac.h +f:drivers/net/phy/mscc/mscc_macsec.c +f:drivers/net/phy/mscc/mscc_macsec.h +f:drivers/net/phy/mscc/mscc_main.c +f:drivers/net/phy/mscc/mscc_ptp.c +f:drivers/net/phy/mscc/mscc_ptp.h +f:drivers/net/phy/mscc/mscc_serdes.c +f:drivers/net/phy/mscc/mscc_serdes.h +f:drivers/net/phy/mxl-86110.c +f:drivers/net/phy/mxl-gpy.c +f:drivers/net/phy/national.c +f:drivers/net/phy/ncn26000.c +f:drivers/net/phy/nxp-c45-tja11xx-macsec.c +f:drivers/net/phy/nxp-c45-tja11xx.c +f:drivers/net/phy/nxp-c45-tja11xx.h +f:drivers/net/phy/nxp-cbtx.c +f:drivers/net/phy/nxp-tja11xx.c +f:drivers/net/phy/open_alliance_helpers.c +f:drivers/net/phy/open_alliance_helpers.h +f:drivers/net/phy/phy-c45.c +f:drivers/net/phy/phy-caps.h +f:drivers/net/phy/phy-core.c +f:drivers/net/phy/phy.c +f:drivers/net/phy/phy_caps.c +f:drivers/net/phy/phy_device.c +f:drivers/net/phy/phy_led_triggers.c +f:drivers/net/phy/phy_link_topology.c +f:drivers/net/phy/phy_package.c +f:drivers/net/phy/phylib-internal.h +f:drivers/net/phy/phylib.h +f:drivers/net/phy/phylink.c +f:drivers/net/phy/qcom/Kconfig +f:drivers/net/phy/qcom/Makefile +f:drivers/net/phy/qcom/at803x.c +f:drivers/net/phy/qcom/qca807x.c +f:drivers/net/phy/qcom/qca808x.c +f:drivers/net/phy/qcom/qca83xx.c +f:drivers/net/phy/qcom/qcom-phy-lib.c +f:drivers/net/phy/qcom/qcom.h +f:drivers/net/phy/qsemi.c +f:drivers/net/phy/qt2025.rs +f:drivers/net/phy/realtek/Kconfig +f:drivers/net/phy/realtek/Makefile +f:drivers/net/phy/realtek/realtek.h +f:drivers/net/phy/realtek/realtek_hwmon.c +f:drivers/net/phy/realtek/realtek_main.c +f:drivers/net/phy/rockchip.c +f:drivers/net/phy/sfp-bus.c +f:drivers/net/phy/sfp.c +f:drivers/net/phy/sfp.h +f:drivers/net/phy/smsc.c +f:drivers/net/phy/spi_ks8995.c +f:drivers/net/phy/ste10Xp.c +f:drivers/net/phy/stubs.c +f:drivers/net/phy/swphy.c +f:drivers/net/phy/swphy.h +f:drivers/net/phy/teranetics.c +f:drivers/net/phy/uPD60620.c +f:drivers/net/phy/vitesse.c +f:drivers/net/phy/xilinx_gmii2rgmii.c +f:drivers/net/plip/Kconfig +f:drivers/net/plip/Makefile +f:drivers/net/plip/plip.c +f:drivers/net/ppp/Kconfig +f:drivers/net/ppp/Makefile +f:drivers/net/ppp/bsd_comp.c +f:drivers/net/ppp/ppp_async.c +f:drivers/net/ppp/ppp_deflate.c +f:drivers/net/ppp/ppp_generic.c +f:drivers/net/ppp/ppp_mppe.c +f:drivers/net/ppp/ppp_mppe.h +f:drivers/net/ppp/ppp_synctty.c +f:drivers/net/ppp/pppoe.c +f:drivers/net/ppp/pppox.c +f:drivers/net/ppp/pptp.c +f:drivers/net/pse-pd/Kconfig +f:drivers/net/pse-pd/Makefile +f:drivers/net/pse-pd/pd692x0.c +f:drivers/net/pse-pd/pse_core.c +f:drivers/net/pse-pd/pse_regulator.c +f:drivers/net/pse-pd/tps23881.c +f:drivers/net/rionet.c +f:drivers/net/slip/Kconfig +f:drivers/net/slip/Makefile +f:drivers/net/slip/slhc.c +f:drivers/net/slip/slip.c +f:drivers/net/slip/slip.h +f:drivers/net/sungem_phy.c +f:drivers/net/tap.c +f:drivers/net/team/Kconfig +f:drivers/net/team/Makefile +f:drivers/net/team/team_core.c +f:drivers/net/team/team_mode_activebackup.c +f:drivers/net/team/team_mode_broadcast.c +f:drivers/net/team/team_mode_loadbalance.c +f:drivers/net/team/team_mode_random.c +f:drivers/net/team/team_mode_roundrobin.c +f:drivers/net/team/team_nl.c +f:drivers/net/team/team_nl.h +f:drivers/net/thunderbolt/Kconfig +f:drivers/net/thunderbolt/Makefile +f:drivers/net/thunderbolt/main.c +f:drivers/net/thunderbolt/trace.c +f:drivers/net/thunderbolt/trace.h +f:drivers/net/tun.c +f:drivers/net/tun_vnet.h +f:drivers/net/usb/Kconfig +f:drivers/net/usb/Makefile +f:drivers/net/usb/aqc111.c +f:drivers/net/usb/aqc111.h +f:drivers/net/usb/asix.h +f:drivers/net/usb/asix_common.c +f:drivers/net/usb/asix_devices.c +f:drivers/net/usb/ax88172a.c +f:drivers/net/usb/ax88179_178a.c +f:drivers/net/usb/catc.c +f:drivers/net/usb/cdc-phonet.c +f:drivers/net/usb/cdc_eem.c +f:drivers/net/usb/cdc_ether.c +f:drivers/net/usb/cdc_mbim.c +f:drivers/net/usb/cdc_ncm.c +f:drivers/net/usb/cdc_subset.c +f:drivers/net/usb/ch9200.c +f:drivers/net/usb/cx82310_eth.c +f:drivers/net/usb/dm9601.c +f:drivers/net/usb/gl620a.c +f:drivers/net/usb/hso.c +f:drivers/net/usb/huawei_cdc_ncm.c +f:drivers/net/usb/int51x1.c +f:drivers/net/usb/ipheth.c +f:drivers/net/usb/kalmia.c +f:drivers/net/usb/kaweth.c +f:drivers/net/usb/lan78xx.c +f:drivers/net/usb/lan78xx.h +f:drivers/net/usb/lg-vl600.c +f:drivers/net/usb/mcs7830.c +f:drivers/net/usb/net1080.c +f:drivers/net/usb/pegasus.c +f:drivers/net/usb/pegasus.h +f:drivers/net/usb/plusb.c +f:drivers/net/usb/qmi_wwan.c +f:drivers/net/usb/r8152.c +f:drivers/net/usb/r8153_ecm.c +f:drivers/net/usb/rndis_host.c +f:drivers/net/usb/rtl8150.c +f:drivers/net/usb/sierra_net.c +f:drivers/net/usb/smsc75xx.c +f:drivers/net/usb/smsc75xx.h +f:drivers/net/usb/smsc95xx.c +f:drivers/net/usb/smsc95xx.h +f:drivers/net/usb/sr9700.c +f:drivers/net/usb/sr9700.h +f:drivers/net/usb/sr9800.c +f:drivers/net/usb/sr9800.h +f:drivers/net/usb/usbnet.c +f:drivers/net/usb/zaurus.c +f:drivers/net/veth.c +f:drivers/net/virtio_net.c +f:drivers/net/vmxnet3/Makefile +f:drivers/net/vmxnet3/upt1_defs.h +f:drivers/net/vmxnet3/vmxnet3_defs.h +f:drivers/net/vmxnet3/vmxnet3_drv.c +f:drivers/net/vmxnet3/vmxnet3_ethtool.c +f:drivers/net/vmxnet3/vmxnet3_int.h +f:drivers/net/vmxnet3/vmxnet3_xdp.c +f:drivers/net/vmxnet3/vmxnet3_xdp.h +f:drivers/net/vrf.c +f:drivers/net/vsockmon.c +f:drivers/net/vxlan/Makefile +f:drivers/net/vxlan/vxlan_core.c +f:drivers/net/vxlan/vxlan_mdb.c +f:drivers/net/vxlan/vxlan_multicast.c +f:drivers/net/vxlan/vxlan_private.h +f:drivers/net/vxlan/vxlan_vnifilter.c +f:drivers/net/wan/.gitignore +f:drivers/net/wan/Kconfig +f:drivers/net/wan/Makefile +f:drivers/net/wan/c101.c +f:drivers/net/wan/farsync.c +f:drivers/net/wan/farsync.h +f:drivers/net/wan/framer/Kconfig +f:drivers/net/wan/framer/Makefile +f:drivers/net/wan/framer/framer-core.c +f:drivers/net/wan/framer/pef2256/Makefile +f:drivers/net/wan/framer/pef2256/pef2256-regs.h +f:drivers/net/wan/framer/pef2256/pef2256.c +f:drivers/net/wan/fsl_qmc_hdlc.c +f:drivers/net/wan/fsl_ucc_hdlc.c +f:drivers/net/wan/fsl_ucc_hdlc.h +f:drivers/net/wan/hd64570.c +f:drivers/net/wan/hd64570.h +f:drivers/net/wan/hd64572.c +f:drivers/net/wan/hd64572.h +f:drivers/net/wan/hdlc.c +f:drivers/net/wan/hdlc_cisco.c +f:drivers/net/wan/hdlc_fr.c +f:drivers/net/wan/hdlc_ppp.c +f:drivers/net/wan/hdlc_raw.c +f:drivers/net/wan/hdlc_raw_eth.c +f:drivers/net/wan/hdlc_x25.c +f:drivers/net/wan/ixp4xx_hss.c +f:drivers/net/wan/lapbether.c +f:drivers/net/wan/n2.c +f:drivers/net/wan/pc300too.c +f:drivers/net/wan/pci200syn.c +f:drivers/net/wan/slic_ds26522.c +f:drivers/net/wan/slic_ds26522.h +f:drivers/net/wan/wanxl.c +f:drivers/net/wan/wanxl.h +f:drivers/net/wan/wanxlfw.S +f:drivers/net/wan/wanxlfw.inc_shipped +f:drivers/net/wireguard/Makefile +f:drivers/net/wireguard/allowedips.c +f:drivers/net/wireguard/allowedips.h +f:drivers/net/wireguard/cookie.c +f:drivers/net/wireguard/cookie.h +f:drivers/net/wireguard/device.c +f:drivers/net/wireguard/device.h +f:drivers/net/wireguard/main.c +f:drivers/net/wireguard/messages.h +f:drivers/net/wireguard/netlink.c +f:drivers/net/wireguard/netlink.h +f:drivers/net/wireguard/noise.c +f:drivers/net/wireguard/noise.h +f:drivers/net/wireguard/peer.c +f:drivers/net/wireguard/peer.h +f:drivers/net/wireguard/peerlookup.c +f:drivers/net/wireguard/peerlookup.h +f:drivers/net/wireguard/queueing.c +f:drivers/net/wireguard/queueing.h +f:drivers/net/wireguard/ratelimiter.c +f:drivers/net/wireguard/ratelimiter.h +f:drivers/net/wireguard/receive.c +f:drivers/net/wireguard/selftest/allowedips.c +f:drivers/net/wireguard/selftest/counter.c +f:drivers/net/wireguard/selftest/ratelimiter.c +f:drivers/net/wireguard/send.c +f:drivers/net/wireguard/socket.c +f:drivers/net/wireguard/socket.h +f:drivers/net/wireguard/timers.c +f:drivers/net/wireguard/timers.h +f:drivers/net/wireguard/version.h +f:drivers/net/wireless/Kconfig +f:drivers/net/wireless/Makefile +f:drivers/net/wireless/admtek/Kconfig +f:drivers/net/wireless/admtek/Makefile +f:drivers/net/wireless/admtek/adm8211.c +f:drivers/net/wireless/admtek/adm8211.h +f:drivers/net/wireless/ath/Kconfig +f:drivers/net/wireless/ath/Makefile +f:drivers/net/wireless/ath/ar5523/Kconfig +f:drivers/net/wireless/ath/ar5523/Makefile +f:drivers/net/wireless/ath/ar5523/ar5523.c +f:drivers/net/wireless/ath/ar5523/ar5523.h +f:drivers/net/wireless/ath/ar5523/ar5523_hw.h +f:drivers/net/wireless/ath/ath.h +f:drivers/net/wireless/ath/ath10k/Kconfig +f:drivers/net/wireless/ath/ath10k/Makefile +f:drivers/net/wireless/ath/ath10k/ahb.c +f:drivers/net/wireless/ath/ath10k/ahb.h +f:drivers/net/wireless/ath/ath10k/bmi.c +f:drivers/net/wireless/ath/ath10k/bmi.h +f:drivers/net/wireless/ath/ath10k/ce.c +f:drivers/net/wireless/ath/ath10k/ce.h +f:drivers/net/wireless/ath/ath10k/core.c +f:drivers/net/wireless/ath/ath10k/core.h +f:drivers/net/wireless/ath/ath10k/coredump.c +f:drivers/net/wireless/ath/ath10k/coredump.h +f:drivers/net/wireless/ath/ath10k/debug.c +f:drivers/net/wireless/ath/ath10k/debug.h +f:drivers/net/wireless/ath/ath10k/debugfs_sta.c +f:drivers/net/wireless/ath/ath10k/hif.h +f:drivers/net/wireless/ath/ath10k/htc.c +f:drivers/net/wireless/ath/ath10k/htc.h +f:drivers/net/wireless/ath/ath10k/htt.c +f:drivers/net/wireless/ath/ath10k/htt.h +f:drivers/net/wireless/ath/ath10k/htt_rx.c +f:drivers/net/wireless/ath/ath10k/htt_tx.c +f:drivers/net/wireless/ath/ath10k/hw.c +f:drivers/net/wireless/ath/ath10k/hw.h +f:drivers/net/wireless/ath/ath10k/leds.c +f:drivers/net/wireless/ath/ath10k/leds.h +f:drivers/net/wireless/ath/ath10k/mac.c +f:drivers/net/wireless/ath/ath10k/mac.h +f:drivers/net/wireless/ath/ath10k/p2p.c +f:drivers/net/wireless/ath/ath10k/p2p.h +f:drivers/net/wireless/ath/ath10k/pci.c +f:drivers/net/wireless/ath/ath10k/pci.h +f:drivers/net/wireless/ath/ath10k/qmi.c +f:drivers/net/wireless/ath/ath10k/qmi.h +f:drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c +f:drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h +f:drivers/net/wireless/ath/ath10k/rx_desc.h +f:drivers/net/wireless/ath/ath10k/sdio.c +f:drivers/net/wireless/ath/ath10k/sdio.h +f:drivers/net/wireless/ath/ath10k/snoc.c +f:drivers/net/wireless/ath/ath10k/snoc.h +f:drivers/net/wireless/ath/ath10k/spectral.c +f:drivers/net/wireless/ath/ath10k/spectral.h +f:drivers/net/wireless/ath/ath10k/swap.c +f:drivers/net/wireless/ath/ath10k/swap.h +f:drivers/net/wireless/ath/ath10k/targaddrs.h +f:drivers/net/wireless/ath/ath10k/testmode.c +f:drivers/net/wireless/ath/ath10k/testmode.h +f:drivers/net/wireless/ath/ath10k/testmode_i.h +f:drivers/net/wireless/ath/ath10k/thermal.c +f:drivers/net/wireless/ath/ath10k/thermal.h +f:drivers/net/wireless/ath/ath10k/trace.c +f:drivers/net/wireless/ath/ath10k/trace.h +f:drivers/net/wireless/ath/ath10k/txrx.c +f:drivers/net/wireless/ath/ath10k/txrx.h +f:drivers/net/wireless/ath/ath10k/usb.c +f:drivers/net/wireless/ath/ath10k/usb.h +f:drivers/net/wireless/ath/ath10k/wmi-ops.h +f:drivers/net/wireless/ath/ath10k/wmi-tlv.c +f:drivers/net/wireless/ath/ath10k/wmi-tlv.h +f:drivers/net/wireless/ath/ath10k/wmi.c +f:drivers/net/wireless/ath/ath10k/wmi.h +f:drivers/net/wireless/ath/ath10k/wow.c +f:drivers/net/wireless/ath/ath10k/wow.h +f:drivers/net/wireless/ath/ath11k/Kconfig +f:drivers/net/wireless/ath/ath11k/Makefile +f:drivers/net/wireless/ath/ath11k/ahb.c +f:drivers/net/wireless/ath/ath11k/ahb.h +f:drivers/net/wireless/ath/ath11k/ce.c +f:drivers/net/wireless/ath/ath11k/ce.h +f:drivers/net/wireless/ath/ath11k/core.c +f:drivers/net/wireless/ath/ath11k/core.h +f:drivers/net/wireless/ath/ath11k/coredump.c +f:drivers/net/wireless/ath/ath11k/coredump.h +f:drivers/net/wireless/ath/ath11k/dbring.c +f:drivers/net/wireless/ath/ath11k/dbring.h +f:drivers/net/wireless/ath/ath11k/debug.c +f:drivers/net/wireless/ath/ath11k/debug.h +f:drivers/net/wireless/ath/ath11k/debugfs.c +f:drivers/net/wireless/ath/ath11k/debugfs.h +f:drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c +f:drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h +f:drivers/net/wireless/ath/ath11k/debugfs_sta.c +f:drivers/net/wireless/ath/ath11k/debugfs_sta.h +f:drivers/net/wireless/ath/ath11k/dp.c +f:drivers/net/wireless/ath/ath11k/dp.h +f:drivers/net/wireless/ath/ath11k/dp_rx.c +f:drivers/net/wireless/ath/ath11k/dp_rx.h +f:drivers/net/wireless/ath/ath11k/dp_tx.c +f:drivers/net/wireless/ath/ath11k/dp_tx.h +f:drivers/net/wireless/ath/ath11k/fw.c +f:drivers/net/wireless/ath/ath11k/fw.h +f:drivers/net/wireless/ath/ath11k/hal.c +f:drivers/net/wireless/ath/ath11k/hal.h +f:drivers/net/wireless/ath/ath11k/hal_desc.h +f:drivers/net/wireless/ath/ath11k/hal_rx.c +f:drivers/net/wireless/ath/ath11k/hal_rx.h +f:drivers/net/wireless/ath/ath11k/hal_tx.c +f:drivers/net/wireless/ath/ath11k/hal_tx.h +f:drivers/net/wireless/ath/ath11k/hif.h +f:drivers/net/wireless/ath/ath11k/htc.c +f:drivers/net/wireless/ath/ath11k/htc.h +f:drivers/net/wireless/ath/ath11k/hw.c +f:drivers/net/wireless/ath/ath11k/hw.h +f:drivers/net/wireless/ath/ath11k/mac.c +f:drivers/net/wireless/ath/ath11k/mac.h +f:drivers/net/wireless/ath/ath11k/mhi.c +f:drivers/net/wireless/ath/ath11k/mhi.h +f:drivers/net/wireless/ath/ath11k/p2p.c +f:drivers/net/wireless/ath/ath11k/p2p.h +f:drivers/net/wireless/ath/ath11k/pci.c +f:drivers/net/wireless/ath/ath11k/pci.h +f:drivers/net/wireless/ath/ath11k/pcic.c +f:drivers/net/wireless/ath/ath11k/pcic.h +f:drivers/net/wireless/ath/ath11k/peer.c +f:drivers/net/wireless/ath/ath11k/peer.h +f:drivers/net/wireless/ath/ath11k/qmi.c +f:drivers/net/wireless/ath/ath11k/qmi.h +f:drivers/net/wireless/ath/ath11k/reg.c +f:drivers/net/wireless/ath/ath11k/reg.h +f:drivers/net/wireless/ath/ath11k/rx_desc.h +f:drivers/net/wireless/ath/ath11k/spectral.c +f:drivers/net/wireless/ath/ath11k/spectral.h +f:drivers/net/wireless/ath/ath11k/testmode.c +f:drivers/net/wireless/ath/ath11k/testmode.h +f:drivers/net/wireless/ath/ath11k/thermal.c +f:drivers/net/wireless/ath/ath11k/thermal.h +f:drivers/net/wireless/ath/ath11k/trace.c +f:drivers/net/wireless/ath/ath11k/trace.h +f:drivers/net/wireless/ath/ath11k/wmi.c +f:drivers/net/wireless/ath/ath11k/wmi.h +f:drivers/net/wireless/ath/ath11k/wow.c +f:drivers/net/wireless/ath/ath11k/wow.h +f:drivers/net/wireless/ath/ath12k/Kconfig +f:drivers/net/wireless/ath/ath12k/Makefile +f:drivers/net/wireless/ath/ath12k/acpi.c +f:drivers/net/wireless/ath/ath12k/acpi.h +f:drivers/net/wireless/ath/ath12k/ahb.c +f:drivers/net/wireless/ath/ath12k/ahb.h +f:drivers/net/wireless/ath/ath12k/ce.c +f:drivers/net/wireless/ath/ath12k/ce.h +f:drivers/net/wireless/ath/ath12k/core.c +f:drivers/net/wireless/ath/ath12k/core.h +f:drivers/net/wireless/ath/ath12k/coredump.c +f:drivers/net/wireless/ath/ath12k/coredump.h +f:drivers/net/wireless/ath/ath12k/dbring.c +f:drivers/net/wireless/ath/ath12k/dbring.h +f:drivers/net/wireless/ath/ath12k/debug.c +f:drivers/net/wireless/ath/ath12k/debug.h +f:drivers/net/wireless/ath/ath12k/debugfs.c +f:drivers/net/wireless/ath/ath12k/debugfs.h +f:drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c +f:drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h +f:drivers/net/wireless/ath/ath12k/debugfs_sta.c +f:drivers/net/wireless/ath/ath12k/debugfs_sta.h +f:drivers/net/wireless/ath/ath12k/dp.c +f:drivers/net/wireless/ath/ath12k/dp.h +f:drivers/net/wireless/ath/ath12k/dp_mon.c +f:drivers/net/wireless/ath/ath12k/dp_mon.h +f:drivers/net/wireless/ath/ath12k/dp_rx.c +f:drivers/net/wireless/ath/ath12k/dp_rx.h +f:drivers/net/wireless/ath/ath12k/dp_tx.c +f:drivers/net/wireless/ath/ath12k/dp_tx.h +f:drivers/net/wireless/ath/ath12k/fw.c +f:drivers/net/wireless/ath/ath12k/fw.h +f:drivers/net/wireless/ath/ath12k/hal.c +f:drivers/net/wireless/ath/ath12k/hal.h +f:drivers/net/wireless/ath/ath12k/hal_desc.h +f:drivers/net/wireless/ath/ath12k/hal_rx.c +f:drivers/net/wireless/ath/ath12k/hal_rx.h +f:drivers/net/wireless/ath/ath12k/hal_tx.c +f:drivers/net/wireless/ath/ath12k/hal_tx.h +f:drivers/net/wireless/ath/ath12k/hif.h +f:drivers/net/wireless/ath/ath12k/htc.c +f:drivers/net/wireless/ath/ath12k/htc.h +f:drivers/net/wireless/ath/ath12k/hw.c +f:drivers/net/wireless/ath/ath12k/hw.h +f:drivers/net/wireless/ath/ath12k/mac.c +f:drivers/net/wireless/ath/ath12k/mac.h +f:drivers/net/wireless/ath/ath12k/mhi.c +f:drivers/net/wireless/ath/ath12k/mhi.h +f:drivers/net/wireless/ath/ath12k/p2p.c +f:drivers/net/wireless/ath/ath12k/p2p.h +f:drivers/net/wireless/ath/ath12k/pci.c +f:drivers/net/wireless/ath/ath12k/pci.h +f:drivers/net/wireless/ath/ath12k/peer.c +f:drivers/net/wireless/ath/ath12k/peer.h +f:drivers/net/wireless/ath/ath12k/qmi.c +f:drivers/net/wireless/ath/ath12k/qmi.h +f:drivers/net/wireless/ath/ath12k/reg.c +f:drivers/net/wireless/ath/ath12k/reg.h +f:drivers/net/wireless/ath/ath12k/rx_desc.h +f:drivers/net/wireless/ath/ath12k/testmode.c +f:drivers/net/wireless/ath/ath12k/testmode.h +f:drivers/net/wireless/ath/ath12k/trace.c +f:drivers/net/wireless/ath/ath12k/trace.h +f:drivers/net/wireless/ath/ath12k/wmi.c +f:drivers/net/wireless/ath/ath12k/wmi.h +f:drivers/net/wireless/ath/ath12k/wow.c +f:drivers/net/wireless/ath/ath12k/wow.h +f:drivers/net/wireless/ath/ath5k/Kconfig +f:drivers/net/wireless/ath/ath5k/Makefile +f:drivers/net/wireless/ath/ath5k/ahb.c +f:drivers/net/wireless/ath/ath5k/ani.c +f:drivers/net/wireless/ath/ath5k/ani.h +f:drivers/net/wireless/ath/ath5k/ath5k.h +f:drivers/net/wireless/ath/ath5k/attach.c +f:drivers/net/wireless/ath/ath5k/base.c +f:drivers/net/wireless/ath/ath5k/base.h +f:drivers/net/wireless/ath/ath5k/caps.c +f:drivers/net/wireless/ath/ath5k/debug.c +f:drivers/net/wireless/ath/ath5k/debug.h +f:drivers/net/wireless/ath/ath5k/desc.c +f:drivers/net/wireless/ath/ath5k/desc.h +f:drivers/net/wireless/ath/ath5k/dma.c +f:drivers/net/wireless/ath/ath5k/eeprom.c +f:drivers/net/wireless/ath/ath5k/eeprom.h +f:drivers/net/wireless/ath/ath5k/gpio.c +f:drivers/net/wireless/ath/ath5k/initvals.c +f:drivers/net/wireless/ath/ath5k/led.c +f:drivers/net/wireless/ath/ath5k/mac80211-ops.c +f:drivers/net/wireless/ath/ath5k/pci.c +f:drivers/net/wireless/ath/ath5k/pcu.c +f:drivers/net/wireless/ath/ath5k/phy.c +f:drivers/net/wireless/ath/ath5k/qcu.c +f:drivers/net/wireless/ath/ath5k/reg.h +f:drivers/net/wireless/ath/ath5k/reset.c +f:drivers/net/wireless/ath/ath5k/rfbuffer.h +f:drivers/net/wireless/ath/ath5k/rfgain.h +f:drivers/net/wireless/ath/ath5k/rfkill.c +f:drivers/net/wireless/ath/ath5k/sysfs.c +f:drivers/net/wireless/ath/ath5k/trace.h +f:drivers/net/wireless/ath/ath6kl/Kconfig +f:drivers/net/wireless/ath/ath6kl/Makefile +f:drivers/net/wireless/ath/ath6kl/bmi.c +f:drivers/net/wireless/ath/ath6kl/bmi.h +f:drivers/net/wireless/ath/ath6kl/cfg80211.c +f:drivers/net/wireless/ath/ath6kl/cfg80211.h +f:drivers/net/wireless/ath/ath6kl/common.h +f:drivers/net/wireless/ath/ath6kl/core.c +f:drivers/net/wireless/ath/ath6kl/core.h +f:drivers/net/wireless/ath/ath6kl/debug.c +f:drivers/net/wireless/ath/ath6kl/debug.h +f:drivers/net/wireless/ath/ath6kl/hif-ops.h +f:drivers/net/wireless/ath/ath6kl/hif.c +f:drivers/net/wireless/ath/ath6kl/hif.h +f:drivers/net/wireless/ath/ath6kl/htc-ops.h +f:drivers/net/wireless/ath/ath6kl/htc.h +f:drivers/net/wireless/ath/ath6kl/htc_mbox.c +f:drivers/net/wireless/ath/ath6kl/htc_pipe.c +f:drivers/net/wireless/ath/ath6kl/init.c +f:drivers/net/wireless/ath/ath6kl/main.c +f:drivers/net/wireless/ath/ath6kl/recovery.c +f:drivers/net/wireless/ath/ath6kl/sdio.c +f:drivers/net/wireless/ath/ath6kl/target.h +f:drivers/net/wireless/ath/ath6kl/testmode.c +f:drivers/net/wireless/ath/ath6kl/testmode.h +f:drivers/net/wireless/ath/ath6kl/trace.c +f:drivers/net/wireless/ath/ath6kl/trace.h +f:drivers/net/wireless/ath/ath6kl/txrx.c +f:drivers/net/wireless/ath/ath6kl/usb.c +f:drivers/net/wireless/ath/ath6kl/wmi.c +f:drivers/net/wireless/ath/ath6kl/wmi.h +f:drivers/net/wireless/ath/ath9k/Kconfig +f:drivers/net/wireless/ath/ath9k/Makefile +f:drivers/net/wireless/ath/ath9k/ahb.c +f:drivers/net/wireless/ath/ath9k/ani.c +f:drivers/net/wireless/ath/ath9k/ani.h +f:drivers/net/wireless/ath/ath9k/antenna.c +f:drivers/net/wireless/ath/ath9k/ar5008_initvals.h +f:drivers/net/wireless/ath/ath9k/ar5008_phy.c +f:drivers/net/wireless/ath/ath9k/ar9001_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9002_calib.c +f:drivers/net/wireless/ath/ath9k/ar9002_hw.c +f:drivers/net/wireless/ath/ath9k/ar9002_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9002_mac.c +f:drivers/net/wireless/ath/ath9k/ar9002_phy.c +f:drivers/net/wireless/ath/ath9k/ar9002_phy.h +f:drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9003_aic.c +f:drivers/net/wireless/ath/ath9k/ar9003_aic.h +f:drivers/net/wireless/ath/ath9k/ar9003_buffalo_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9003_calib.c +f:drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +f:drivers/net/wireless/ath/ath9k/ar9003_eeprom.h +f:drivers/net/wireless/ath/ath9k/ar9003_hw.c +f:drivers/net/wireless/ath/ath9k/ar9003_mac.c +f:drivers/net/wireless/ath/ath9k/ar9003_mac.h +f:drivers/net/wireless/ath/ath9k/ar9003_mci.c +f:drivers/net/wireless/ath/ath9k/ar9003_mci.h +f:drivers/net/wireless/ath/ath9k/ar9003_paprd.c +f:drivers/net/wireless/ath/ath9k/ar9003_phy.c +f:drivers/net/wireless/ath/ath9k/ar9003_phy.h +f:drivers/net/wireless/ath/ath9k/ar9003_rtt.c +f:drivers/net/wireless/ath/ath9k/ar9003_rtt.h +f:drivers/net/wireless/ath/ath9k/ar9003_wow.c +f:drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9340_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9462_2p1_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9485_initvals.h +f:drivers/net/wireless/ath/ath9k/ar953x_initvals.h +f:drivers/net/wireless/ath/ath9k/ar955x_1p0_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9565_1p0_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9565_1p1_initvals.h +f:drivers/net/wireless/ath/ath9k/ar956x_initvals.h +f:drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h +f:drivers/net/wireless/ath/ath9k/ath9k.h +f:drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c +f:drivers/net/wireless/ath/ath9k/beacon.c +f:drivers/net/wireless/ath/ath9k/btcoex.c +f:drivers/net/wireless/ath/ath9k/btcoex.h +f:drivers/net/wireless/ath/ath9k/calib.c +f:drivers/net/wireless/ath/ath9k/calib.h +f:drivers/net/wireless/ath/ath9k/channel.c +f:drivers/net/wireless/ath/ath9k/common-beacon.c +f:drivers/net/wireless/ath/ath9k/common-beacon.h +f:drivers/net/wireless/ath/ath9k/common-debug.c +f:drivers/net/wireless/ath/ath9k/common-debug.h +f:drivers/net/wireless/ath/ath9k/common-init.c +f:drivers/net/wireless/ath/ath9k/common-init.h +f:drivers/net/wireless/ath/ath9k/common-spectral.c +f:drivers/net/wireless/ath/ath9k/common-spectral.h +f:drivers/net/wireless/ath/ath9k/common.c +f:drivers/net/wireless/ath/ath9k/common.h +f:drivers/net/wireless/ath/ath9k/debug.c +f:drivers/net/wireless/ath/ath9k/debug.h +f:drivers/net/wireless/ath/ath9k/debug_sta.c +f:drivers/net/wireless/ath/ath9k/dfs.c +f:drivers/net/wireless/ath/ath9k/dfs.h +f:drivers/net/wireless/ath/ath9k/dfs_debug.c +f:drivers/net/wireless/ath/ath9k/dfs_debug.h +f:drivers/net/wireless/ath/ath9k/dynack.c +f:drivers/net/wireless/ath/ath9k/dynack.h +f:drivers/net/wireless/ath/ath9k/eeprom.c +f:drivers/net/wireless/ath/ath9k/eeprom.h +f:drivers/net/wireless/ath/ath9k/eeprom_4k.c +f:drivers/net/wireless/ath/ath9k/eeprom_9287.c +f:drivers/net/wireless/ath/ath9k/eeprom_def.c +f:drivers/net/wireless/ath/ath9k/gpio.c +f:drivers/net/wireless/ath/ath9k/hif_usb.c +f:drivers/net/wireless/ath/ath9k/hif_usb.h +f:drivers/net/wireless/ath/ath9k/htc.h +f:drivers/net/wireless/ath/ath9k/htc_drv_beacon.c +f:drivers/net/wireless/ath/ath9k/htc_drv_debug.c +f:drivers/net/wireless/ath/ath9k/htc_drv_gpio.c +f:drivers/net/wireless/ath/ath9k/htc_drv_init.c +f:drivers/net/wireless/ath/ath9k/htc_drv_main.c +f:drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +f:drivers/net/wireless/ath/ath9k/htc_hst.c +f:drivers/net/wireless/ath/ath9k/htc_hst.h +f:drivers/net/wireless/ath/ath9k/hw-ops.h +f:drivers/net/wireless/ath/ath9k/hw.c +f:drivers/net/wireless/ath/ath9k/hw.h +f:drivers/net/wireless/ath/ath9k/init.c +f:drivers/net/wireless/ath/ath9k/link.c +f:drivers/net/wireless/ath/ath9k/mac.c +f:drivers/net/wireless/ath/ath9k/mac.h +f:drivers/net/wireless/ath/ath9k/main.c +f:drivers/net/wireless/ath/ath9k/mci.c +f:drivers/net/wireless/ath/ath9k/mci.h +f:drivers/net/wireless/ath/ath9k/pci.c +f:drivers/net/wireless/ath/ath9k/phy.h +f:drivers/net/wireless/ath/ath9k/recv.c +f:drivers/net/wireless/ath/ath9k/reg.h +f:drivers/net/wireless/ath/ath9k/reg_aic.h +f:drivers/net/wireless/ath/ath9k/reg_mci.h +f:drivers/net/wireless/ath/ath9k/reg_wow.h +f:drivers/net/wireless/ath/ath9k/rng.c +f:drivers/net/wireless/ath/ath9k/tx99.c +f:drivers/net/wireless/ath/ath9k/wmi.c +f:drivers/net/wireless/ath/ath9k/wmi.h +f:drivers/net/wireless/ath/ath9k/wow.c +f:drivers/net/wireless/ath/ath9k/xmit.c +f:drivers/net/wireless/ath/carl9170/Kconfig +f:drivers/net/wireless/ath/carl9170/Makefile +f:drivers/net/wireless/ath/carl9170/carl9170.h +f:drivers/net/wireless/ath/carl9170/cmd.c +f:drivers/net/wireless/ath/carl9170/cmd.h +f:drivers/net/wireless/ath/carl9170/debug.c +f:drivers/net/wireless/ath/carl9170/debug.h +f:drivers/net/wireless/ath/carl9170/eeprom.h +f:drivers/net/wireless/ath/carl9170/fw.c +f:drivers/net/wireless/ath/carl9170/fwcmd.h +f:drivers/net/wireless/ath/carl9170/fwdesc.h +f:drivers/net/wireless/ath/carl9170/hw.h +f:drivers/net/wireless/ath/carl9170/led.c +f:drivers/net/wireless/ath/carl9170/mac.c +f:drivers/net/wireless/ath/carl9170/main.c +f:drivers/net/wireless/ath/carl9170/phy.c +f:drivers/net/wireless/ath/carl9170/phy.h +f:drivers/net/wireless/ath/carl9170/rx.c +f:drivers/net/wireless/ath/carl9170/tx.c +f:drivers/net/wireless/ath/carl9170/usb.c +f:drivers/net/wireless/ath/carl9170/version.h +f:drivers/net/wireless/ath/carl9170/wlan.h +f:drivers/net/wireless/ath/debug.c +f:drivers/net/wireless/ath/dfs_pattern_detector.c +f:drivers/net/wireless/ath/dfs_pattern_detector.h +f:drivers/net/wireless/ath/dfs_pri_detector.c +f:drivers/net/wireless/ath/dfs_pri_detector.h +f:drivers/net/wireless/ath/hw.c +f:drivers/net/wireless/ath/key.c +f:drivers/net/wireless/ath/main.c +f:drivers/net/wireless/ath/reg.h +f:drivers/net/wireless/ath/regd.c +f:drivers/net/wireless/ath/regd.h +f:drivers/net/wireless/ath/regd_common.h +f:drivers/net/wireless/ath/spectral_common.h +f:drivers/net/wireless/ath/testmode_i.h +f:drivers/net/wireless/ath/trace.c +f:drivers/net/wireless/ath/trace.h +f:drivers/net/wireless/ath/wcn36xx/Kconfig +f:drivers/net/wireless/ath/wcn36xx/Makefile +f:drivers/net/wireless/ath/wcn36xx/debug.c +f:drivers/net/wireless/ath/wcn36xx/debug.h +f:drivers/net/wireless/ath/wcn36xx/dxe.c +f:drivers/net/wireless/ath/wcn36xx/dxe.h +f:drivers/net/wireless/ath/wcn36xx/firmware.c +f:drivers/net/wireless/ath/wcn36xx/firmware.h +f:drivers/net/wireless/ath/wcn36xx/hal.h +f:drivers/net/wireless/ath/wcn36xx/main.c +f:drivers/net/wireless/ath/wcn36xx/pmc.c +f:drivers/net/wireless/ath/wcn36xx/pmc.h +f:drivers/net/wireless/ath/wcn36xx/smd.c +f:drivers/net/wireless/ath/wcn36xx/smd.h +f:drivers/net/wireless/ath/wcn36xx/testmode.c +f:drivers/net/wireless/ath/wcn36xx/testmode.h +f:drivers/net/wireless/ath/wcn36xx/testmode_i.h +f:drivers/net/wireless/ath/wcn36xx/txrx.c +f:drivers/net/wireless/ath/wcn36xx/txrx.h +f:drivers/net/wireless/ath/wcn36xx/wcn36xx.h +f:drivers/net/wireless/ath/wil6210/Kconfig +f:drivers/net/wireless/ath/wil6210/Makefile +f:drivers/net/wireless/ath/wil6210/boot_loader.h +f:drivers/net/wireless/ath/wil6210/cfg80211.c +f:drivers/net/wireless/ath/wil6210/debug.c +f:drivers/net/wireless/ath/wil6210/debugfs.c +f:drivers/net/wireless/ath/wil6210/ethtool.c +f:drivers/net/wireless/ath/wil6210/fw.c +f:drivers/net/wireless/ath/wil6210/fw.h +f:drivers/net/wireless/ath/wil6210/fw_inc.c +f:drivers/net/wireless/ath/wil6210/interrupt.c +f:drivers/net/wireless/ath/wil6210/main.c +f:drivers/net/wireless/ath/wil6210/netdev.c +f:drivers/net/wireless/ath/wil6210/p2p.c +f:drivers/net/wireless/ath/wil6210/pcie_bus.c +f:drivers/net/wireless/ath/wil6210/pm.c +f:drivers/net/wireless/ath/wil6210/pmc.c +f:drivers/net/wireless/ath/wil6210/pmc.h +f:drivers/net/wireless/ath/wil6210/rx_reorder.c +f:drivers/net/wireless/ath/wil6210/trace.c +f:drivers/net/wireless/ath/wil6210/trace.h +f:drivers/net/wireless/ath/wil6210/txrx.c +f:drivers/net/wireless/ath/wil6210/txrx.h +f:drivers/net/wireless/ath/wil6210/txrx_edma.c +f:drivers/net/wireless/ath/wil6210/txrx_edma.h +f:drivers/net/wireless/ath/wil6210/wil6210.h +f:drivers/net/wireless/ath/wil6210/wil_crash_dump.c +f:drivers/net/wireless/ath/wil6210/wil_platform.c +f:drivers/net/wireless/ath/wil6210/wil_platform.h +f:drivers/net/wireless/ath/wil6210/wmi.c +f:drivers/net/wireless/ath/wil6210/wmi.h +f:drivers/net/wireless/atmel/Kconfig +f:drivers/net/wireless/atmel/Makefile +f:drivers/net/wireless/atmel/at76c50x-usb.c +f:drivers/net/wireless/atmel/at76c50x-usb.h +f:drivers/net/wireless/broadcom/Kconfig +f:drivers/net/wireless/broadcom/Makefile +f:drivers/net/wireless/broadcom/b43/Kconfig +f:drivers/net/wireless/broadcom/b43/Makefile +f:drivers/net/wireless/broadcom/b43/b43.h +f:drivers/net/wireless/broadcom/b43/bus.c +f:drivers/net/wireless/broadcom/b43/bus.h +f:drivers/net/wireless/broadcom/b43/debugfs.c +f:drivers/net/wireless/broadcom/b43/debugfs.h +f:drivers/net/wireless/broadcom/b43/dma.c +f:drivers/net/wireless/broadcom/b43/dma.h +f:drivers/net/wireless/broadcom/b43/leds.c +f:drivers/net/wireless/broadcom/b43/leds.h +f:drivers/net/wireless/broadcom/b43/lo.c +f:drivers/net/wireless/broadcom/b43/lo.h +f:drivers/net/wireless/broadcom/b43/main.c +f:drivers/net/wireless/broadcom/b43/main.h +f:drivers/net/wireless/broadcom/b43/phy_a.h +f:drivers/net/wireless/broadcom/b43/phy_ac.c +f:drivers/net/wireless/broadcom/b43/phy_ac.h +f:drivers/net/wireless/broadcom/b43/phy_common.c +f:drivers/net/wireless/broadcom/b43/phy_common.h +f:drivers/net/wireless/broadcom/b43/phy_g.c +f:drivers/net/wireless/broadcom/b43/phy_g.h +f:drivers/net/wireless/broadcom/b43/phy_ht.c +f:drivers/net/wireless/broadcom/b43/phy_ht.h +f:drivers/net/wireless/broadcom/b43/phy_lcn.c +f:drivers/net/wireless/broadcom/b43/phy_lcn.h +f:drivers/net/wireless/broadcom/b43/phy_lp.c +f:drivers/net/wireless/broadcom/b43/phy_lp.h +f:drivers/net/wireless/broadcom/b43/phy_n.c +f:drivers/net/wireless/broadcom/b43/phy_n.h +f:drivers/net/wireless/broadcom/b43/pio.c +f:drivers/net/wireless/broadcom/b43/pio.h +f:drivers/net/wireless/broadcom/b43/ppr.c +f:drivers/net/wireless/broadcom/b43/ppr.h +f:drivers/net/wireless/broadcom/b43/radio_2055.c +f:drivers/net/wireless/broadcom/b43/radio_2055.h +f:drivers/net/wireless/broadcom/b43/radio_2056.c +f:drivers/net/wireless/broadcom/b43/radio_2056.h +f:drivers/net/wireless/broadcom/b43/radio_2057.c +f:drivers/net/wireless/broadcom/b43/radio_2057.h +f:drivers/net/wireless/broadcom/b43/radio_2059.c +f:drivers/net/wireless/broadcom/b43/radio_2059.h +f:drivers/net/wireless/broadcom/b43/rfkill.c +f:drivers/net/wireless/broadcom/b43/rfkill.h +f:drivers/net/wireless/broadcom/b43/sdio.c +f:drivers/net/wireless/broadcom/b43/sdio.h +f:drivers/net/wireless/broadcom/b43/sysfs.c +f:drivers/net/wireless/broadcom/b43/sysfs.h +f:drivers/net/wireless/broadcom/b43/tables.c +f:drivers/net/wireless/broadcom/b43/tables.h +f:drivers/net/wireless/broadcom/b43/tables_lpphy.c +f:drivers/net/wireless/broadcom/b43/tables_lpphy.h +f:drivers/net/wireless/broadcom/b43/tables_nphy.c +f:drivers/net/wireless/broadcom/b43/tables_nphy.h +f:drivers/net/wireless/broadcom/b43/tables_phy_ht.c +f:drivers/net/wireless/broadcom/b43/tables_phy_ht.h +f:drivers/net/wireless/broadcom/b43/tables_phy_lcn.c +f:drivers/net/wireless/broadcom/b43/tables_phy_lcn.h +f:drivers/net/wireless/broadcom/b43/wa.c +f:drivers/net/wireless/broadcom/b43/wa.h +f:drivers/net/wireless/broadcom/b43/xmit.c +f:drivers/net/wireless/broadcom/b43/xmit.h +f:drivers/net/wireless/broadcom/b43legacy/Kconfig +f:drivers/net/wireless/broadcom/b43legacy/Makefile +f:drivers/net/wireless/broadcom/b43legacy/b43legacy.h +f:drivers/net/wireless/broadcom/b43legacy/debugfs.c +f:drivers/net/wireless/broadcom/b43legacy/debugfs.h +f:drivers/net/wireless/broadcom/b43legacy/dma.c +f:drivers/net/wireless/broadcom/b43legacy/dma.h +f:drivers/net/wireless/broadcom/b43legacy/ilt.c +f:drivers/net/wireless/broadcom/b43legacy/ilt.h +f:drivers/net/wireless/broadcom/b43legacy/leds.c +f:drivers/net/wireless/broadcom/b43legacy/leds.h +f:drivers/net/wireless/broadcom/b43legacy/main.c +f:drivers/net/wireless/broadcom/b43legacy/main.h +f:drivers/net/wireless/broadcom/b43legacy/phy.c +f:drivers/net/wireless/broadcom/b43legacy/phy.h +f:drivers/net/wireless/broadcom/b43legacy/pio.c +f:drivers/net/wireless/broadcom/b43legacy/pio.h +f:drivers/net/wireless/broadcom/b43legacy/radio.c +f:drivers/net/wireless/broadcom/b43legacy/radio.h +f:drivers/net/wireless/broadcom/b43legacy/rfkill.c +f:drivers/net/wireless/broadcom/b43legacy/rfkill.h +f:drivers/net/wireless/broadcom/b43legacy/sysfs.c +f:drivers/net/wireless/broadcom/b43legacy/sysfs.h +f:drivers/net/wireless/broadcom/b43legacy/xmit.c +f:drivers/net/wireless/broadcom/b43legacy/xmit.h +f:drivers/net/wireless/broadcom/brcm80211/Kconfig +f:drivers/net/wireless/broadcom/brcm80211/Makefile +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/Makefile +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/core.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/vops.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/commonring.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/commonring.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/Makefile +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/fwil_types.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/vops.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/Makefile +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/core.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/vops.h +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/xtlv.c +f:drivers/net/wireless/broadcom/brcm80211/brcmfmac/xtlv.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/aiutils.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/aiutils.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/antsel.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/antsel.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_msg.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_tx.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_events.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_events.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/d11.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/debug.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/debug.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/dma.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/dma.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_cmn.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_hal.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_int.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_qmath.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_qmath.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_radio.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phyreg_n.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phytbl_lcn.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phytbl_lcn.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phytbl_n.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phytbl_n.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy_shim.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/pmu.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/pmu.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/pub.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/rate.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/rate.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/scb.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/types.h +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/ucode_loader.c +f:drivers/net/wireless/broadcom/brcm80211/brcmsmac/ucode_loader.h +f:drivers/net/wireless/broadcom/brcm80211/brcmutil/Makefile +f:drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c +f:drivers/net/wireless/broadcom/brcm80211/brcmutil/utils.c +f:drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h +f:drivers/net/wireless/broadcom/brcm80211/include/brcmu_d11.h +f:drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h +f:drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h +f:drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h +f:drivers/net/wireless/broadcom/brcm80211/include/defs.h +f:drivers/net/wireless/broadcom/brcm80211/include/soc.h +f:drivers/net/wireless/intel/Kconfig +f:drivers/net/wireless/intel/Makefile +f:drivers/net/wireless/intel/ipw2x00/Kconfig +f:drivers/net/wireless/intel/ipw2x00/Makefile +f:drivers/net/wireless/intel/ipw2x00/ipw.h +f:drivers/net/wireless/intel/ipw2x00/ipw2100.c +f:drivers/net/wireless/intel/ipw2x00/ipw2100.h +f:drivers/net/wireless/intel/ipw2x00/ipw2200.c +f:drivers/net/wireless/intel/ipw2x00/ipw2200.h +f:drivers/net/wireless/intel/ipw2x00/libipw.h +f:drivers/net/wireless/intel/ipw2x00/libipw_crypto.c +f:drivers/net/wireless/intel/ipw2x00/libipw_crypto_ccmp.c +f:drivers/net/wireless/intel/ipw2x00/libipw_crypto_tkip.c +f:drivers/net/wireless/intel/ipw2x00/libipw_crypto_wep.c +f:drivers/net/wireless/intel/ipw2x00/libipw_geo.c +f:drivers/net/wireless/intel/ipw2x00/libipw_module.c +f:drivers/net/wireless/intel/ipw2x00/libipw_rx.c +f:drivers/net/wireless/intel/ipw2x00/libipw_spy.c +f:drivers/net/wireless/intel/ipw2x00/libipw_tx.c +f:drivers/net/wireless/intel/ipw2x00/libipw_wx.c +f:drivers/net/wireless/intel/iwlegacy/3945-debug.c +f:drivers/net/wireless/intel/iwlegacy/3945-mac.c +f:drivers/net/wireless/intel/iwlegacy/3945-rs.c +f:drivers/net/wireless/intel/iwlegacy/3945.c +f:drivers/net/wireless/intel/iwlegacy/3945.h +f:drivers/net/wireless/intel/iwlegacy/4965-calib.c +f:drivers/net/wireless/intel/iwlegacy/4965-debug.c +f:drivers/net/wireless/intel/iwlegacy/4965-mac.c +f:drivers/net/wireless/intel/iwlegacy/4965-rs.c +f:drivers/net/wireless/intel/iwlegacy/4965.c +f:drivers/net/wireless/intel/iwlegacy/4965.h +f:drivers/net/wireless/intel/iwlegacy/Kconfig +f:drivers/net/wireless/intel/iwlegacy/Makefile +f:drivers/net/wireless/intel/iwlegacy/commands.h +f:drivers/net/wireless/intel/iwlegacy/common.c +f:drivers/net/wireless/intel/iwlegacy/common.h +f:drivers/net/wireless/intel/iwlegacy/csr.h +f:drivers/net/wireless/intel/iwlegacy/debug.c +f:drivers/net/wireless/intel/iwlegacy/iwl-spectrum.h +f:drivers/net/wireless/intel/iwlegacy/prph.h +f:drivers/net/wireless/intel/iwlwifi/Kconfig +f:drivers/net/wireless/intel/iwlwifi/Makefile +f:drivers/net/wireless/intel/iwlwifi/cfg/1000.c +f:drivers/net/wireless/intel/iwlwifi/cfg/2000.c +f:drivers/net/wireless/intel/iwlwifi/cfg/22000.c +f:drivers/net/wireless/intel/iwlwifi/cfg/5000.c +f:drivers/net/wireless/intel/iwlwifi/cfg/6000.c +f:drivers/net/wireless/intel/iwlwifi/cfg/7000.c +f:drivers/net/wireless/intel/iwlwifi/cfg/8000.c +f:drivers/net/wireless/intel/iwlwifi/cfg/9000.c +f:drivers/net/wireless/intel/iwlwifi/cfg/ax210.c +f:drivers/net/wireless/intel/iwlwifi/cfg/bz.c +f:drivers/net/wireless/intel/iwlwifi/cfg/dr.c +f:drivers/net/wireless/intel/iwlwifi/cfg/rf-fm.c +f:drivers/net/wireless/intel/iwlwifi/cfg/rf-gf.c +f:drivers/net/wireless/intel/iwlwifi/cfg/rf-hr.c +f:drivers/net/wireless/intel/iwlwifi/cfg/rf-jf.c +f:drivers/net/wireless/intel/iwlwifi/cfg/rf-pe.c +f:drivers/net/wireless/intel/iwlwifi/cfg/rf-wh.c +f:drivers/net/wireless/intel/iwlwifi/cfg/sc.c +f:drivers/net/wireless/intel/iwlwifi/dvm/Makefile +f:drivers/net/wireless/intel/iwlwifi/dvm/agn.h +f:drivers/net/wireless/intel/iwlwifi/dvm/calib.c +f:drivers/net/wireless/intel/iwlwifi/dvm/calib.h +f:drivers/net/wireless/intel/iwlwifi/dvm/commands.h +f:drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c +f:drivers/net/wireless/intel/iwlwifi/dvm/dev.h +f:drivers/net/wireless/intel/iwlwifi/dvm/devices.c +f:drivers/net/wireless/intel/iwlwifi/dvm/eeprom.c +f:drivers/net/wireless/intel/iwlwifi/dvm/led.c +f:drivers/net/wireless/intel/iwlwifi/dvm/led.h +f:drivers/net/wireless/intel/iwlwifi/dvm/lib.c +f:drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c +f:drivers/net/wireless/intel/iwlwifi/dvm/main.c +f:drivers/net/wireless/intel/iwlwifi/dvm/power.c +f:drivers/net/wireless/intel/iwlwifi/dvm/power.h +f:drivers/net/wireless/intel/iwlwifi/dvm/rs.c +f:drivers/net/wireless/intel/iwlwifi/dvm/rs.h +f:drivers/net/wireless/intel/iwlwifi/dvm/rx.c +f:drivers/net/wireless/intel/iwlwifi/dvm/rxon.c +f:drivers/net/wireless/intel/iwlwifi/dvm/scan.c +f:drivers/net/wireless/intel/iwlwifi/dvm/sta.c +f:drivers/net/wireless/intel/iwlwifi/dvm/tt.c +f:drivers/net/wireless/intel/iwlwifi/dvm/tt.h +f:drivers/net/wireless/intel/iwlwifi/dvm/tx.c +f:drivers/net/wireless/intel/iwlwifi/dvm/ucode.c +f:drivers/net/wireless/intel/iwlwifi/fw/acpi.c +f:drivers/net/wireless/intel/iwlwifi/fw/acpi.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/alive.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/binding.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/cmdhdr.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/coex.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/commands.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/config.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/context.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/d3.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/datapath.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/debug.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/dhc.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/filter.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/led.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/location.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/mac-cfg.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/mac.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/offload.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/paging.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/phy-ctxt.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/phy.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/power.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/rfi.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/rs.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/rx.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/scan.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/sf.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/sta.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/stats.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/system.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/tdls.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/tx.h +f:drivers/net/wireless/intel/iwlwifi/fw/api/txq.h +f:drivers/net/wireless/intel/iwlwifi/fw/dbg.c +f:drivers/net/wireless/intel/iwlwifi/fw/dbg.h +f:drivers/net/wireless/intel/iwlwifi/fw/debugfs.c +f:drivers/net/wireless/intel/iwlwifi/fw/debugfs.h +f:drivers/net/wireless/intel/iwlwifi/fw/dhc-utils.h +f:drivers/net/wireless/intel/iwlwifi/fw/dump.c +f:drivers/net/wireless/intel/iwlwifi/fw/error-dump.h +f:drivers/net/wireless/intel/iwlwifi/fw/file.h +f:drivers/net/wireless/intel/iwlwifi/fw/img.c +f:drivers/net/wireless/intel/iwlwifi/fw/img.h +f:drivers/net/wireless/intel/iwlwifi/fw/init.c +f:drivers/net/wireless/intel/iwlwifi/fw/notif-wait.c +f:drivers/net/wireless/intel/iwlwifi/fw/notif-wait.h +f:drivers/net/wireless/intel/iwlwifi/fw/paging.c +f:drivers/net/wireless/intel/iwlwifi/fw/pnvm.c +f:drivers/net/wireless/intel/iwlwifi/fw/pnvm.h +f:drivers/net/wireless/intel/iwlwifi/fw/regulatory.c +f:drivers/net/wireless/intel/iwlwifi/fw/regulatory.h +f:drivers/net/wireless/intel/iwlwifi/fw/rs.c +f:drivers/net/wireless/intel/iwlwifi/fw/runtime.h +f:drivers/net/wireless/intel/iwlwifi/fw/smem.c +f:drivers/net/wireless/intel/iwlwifi/fw/uefi.c +f:drivers/net/wireless/intel/iwlwifi/fw/uefi.h +f:drivers/net/wireless/intel/iwlwifi/iwl-agn-hw.h +f:drivers/net/wireless/intel/iwlwifi/iwl-config.h +f:drivers/net/wireless/intel/iwlwifi/iwl-csr.h +f:drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c +f:drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h +f:drivers/net/wireless/intel/iwlwifi/iwl-debug.c +f:drivers/net/wireless/intel/iwlwifi/iwl-debug.h +f:drivers/net/wireless/intel/iwlwifi/iwl-devtrace-data.h +f:drivers/net/wireless/intel/iwlwifi/iwl-devtrace-io.h +f:drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h +f:drivers/net/wireless/intel/iwlwifi/iwl-devtrace-msg.h +f:drivers/net/wireless/intel/iwlwifi/iwl-devtrace-ucode.h +f:drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c +f:drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h +f:drivers/net/wireless/intel/iwlwifi/iwl-drv.c +f:drivers/net/wireless/intel/iwlwifi/iwl-drv.h +f:drivers/net/wireless/intel/iwlwifi/iwl-fh.h +f:drivers/net/wireless/intel/iwlwifi/iwl-io.c +f:drivers/net/wireless/intel/iwlwifi/iwl-io.h +f:drivers/net/wireless/intel/iwlwifi/iwl-modparams.h +f:drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +f:drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h +f:drivers/net/wireless/intel/iwlwifi/iwl-nvm-utils.c +f:drivers/net/wireless/intel/iwlwifi/iwl-nvm-utils.h +f:drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h +f:drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c +f:drivers/net/wireless/intel/iwlwifi/iwl-phy-db.h +f:drivers/net/wireless/intel/iwlwifi/iwl-prph.h +f:drivers/net/wireless/intel/iwlwifi/iwl-scd.h +f:drivers/net/wireless/intel/iwlwifi/iwl-trans.c +f:drivers/net/wireless/intel/iwlwifi/iwl-trans.h +f:drivers/net/wireless/intel/iwlwifi/iwl-utils.c +f:drivers/net/wireless/intel/iwlwifi/iwl-utils.h +f:drivers/net/wireless/intel/iwlwifi/mei/Makefile +f:drivers/net/wireless/intel/iwlwifi/mei/internal.h +f:drivers/net/wireless/intel/iwlwifi/mei/iwl-mei.h +f:drivers/net/wireless/intel/iwlwifi/mei/main.c +f:drivers/net/wireless/intel/iwlwifi/mei/net.c +f:drivers/net/wireless/intel/iwlwifi/mei/sap.h +f:drivers/net/wireless/intel/iwlwifi/mei/trace-data.h +f:drivers/net/wireless/intel/iwlwifi/mei/trace.c +f:drivers/net/wireless/intel/iwlwifi/mei/trace.h +f:drivers/net/wireless/intel/iwlwifi/mld/Makefile +f:drivers/net/wireless/intel/iwlwifi/mld/agg.c +f:drivers/net/wireless/intel/iwlwifi/mld/agg.h +f:drivers/net/wireless/intel/iwlwifi/mld/ap.c +f:drivers/net/wireless/intel/iwlwifi/mld/ap.h +f:drivers/net/wireless/intel/iwlwifi/mld/coex.c +f:drivers/net/wireless/intel/iwlwifi/mld/coex.h +f:drivers/net/wireless/intel/iwlwifi/mld/constants.h +f:drivers/net/wireless/intel/iwlwifi/mld/d3.c +f:drivers/net/wireless/intel/iwlwifi/mld/d3.h +f:drivers/net/wireless/intel/iwlwifi/mld/debugfs.c +f:drivers/net/wireless/intel/iwlwifi/mld/debugfs.h +f:drivers/net/wireless/intel/iwlwifi/mld/ftm-initiator.c +f:drivers/net/wireless/intel/iwlwifi/mld/ftm-initiator.h +f:drivers/net/wireless/intel/iwlwifi/mld/fw.c +f:drivers/net/wireless/intel/iwlwifi/mld/hcmd.h +f:drivers/net/wireless/intel/iwlwifi/mld/iface.c +f:drivers/net/wireless/intel/iwlwifi/mld/iface.h +f:drivers/net/wireless/intel/iwlwifi/mld/key.c +f:drivers/net/wireless/intel/iwlwifi/mld/key.h +f:drivers/net/wireless/intel/iwlwifi/mld/led.c +f:drivers/net/wireless/intel/iwlwifi/mld/led.h +f:drivers/net/wireless/intel/iwlwifi/mld/link.c +f:drivers/net/wireless/intel/iwlwifi/mld/link.h +f:drivers/net/wireless/intel/iwlwifi/mld/low_latency.c +f:drivers/net/wireless/intel/iwlwifi/mld/low_latency.h +f:drivers/net/wireless/intel/iwlwifi/mld/mac80211.c +f:drivers/net/wireless/intel/iwlwifi/mld/mac80211.h +f:drivers/net/wireless/intel/iwlwifi/mld/mcc.c +f:drivers/net/wireless/intel/iwlwifi/mld/mcc.h +f:drivers/net/wireless/intel/iwlwifi/mld/mld.c +f:drivers/net/wireless/intel/iwlwifi/mld/mld.h +f:drivers/net/wireless/intel/iwlwifi/mld/mlo.c +f:drivers/net/wireless/intel/iwlwifi/mld/mlo.h +f:drivers/net/wireless/intel/iwlwifi/mld/notif.c +f:drivers/net/wireless/intel/iwlwifi/mld/notif.h +f:drivers/net/wireless/intel/iwlwifi/mld/phy.c +f:drivers/net/wireless/intel/iwlwifi/mld/phy.h +f:drivers/net/wireless/intel/iwlwifi/mld/power.c +f:drivers/net/wireless/intel/iwlwifi/mld/power.h +f:drivers/net/wireless/intel/iwlwifi/mld/ptp.c +f:drivers/net/wireless/intel/iwlwifi/mld/ptp.h +f:drivers/net/wireless/intel/iwlwifi/mld/regulatory.c +f:drivers/net/wireless/intel/iwlwifi/mld/regulatory.h +f:drivers/net/wireless/intel/iwlwifi/mld/roc.c +f:drivers/net/wireless/intel/iwlwifi/mld/roc.h +f:drivers/net/wireless/intel/iwlwifi/mld/rx.c +f:drivers/net/wireless/intel/iwlwifi/mld/rx.h +f:drivers/net/wireless/intel/iwlwifi/mld/scan.c +f:drivers/net/wireless/intel/iwlwifi/mld/scan.h +f:drivers/net/wireless/intel/iwlwifi/mld/session-protect.c +f:drivers/net/wireless/intel/iwlwifi/mld/session-protect.h +f:drivers/net/wireless/intel/iwlwifi/mld/sta.c +f:drivers/net/wireless/intel/iwlwifi/mld/sta.h +f:drivers/net/wireless/intel/iwlwifi/mld/stats.c +f:drivers/net/wireless/intel/iwlwifi/mld/stats.h +f:drivers/net/wireless/intel/iwlwifi/mld/tests/Makefile +f:drivers/net/wireless/intel/iwlwifi/mld/tests/agg.c +f:drivers/net/wireless/intel/iwlwifi/mld/tests/hcmd.c +f:drivers/net/wireless/intel/iwlwifi/mld/tests/link-selection.c +f:drivers/net/wireless/intel/iwlwifi/mld/tests/link.c +f:drivers/net/wireless/intel/iwlwifi/mld/tests/module.c +f:drivers/net/wireless/intel/iwlwifi/mld/tests/rx.c +f:drivers/net/wireless/intel/iwlwifi/mld/tests/utils.c +f:drivers/net/wireless/intel/iwlwifi/mld/tests/utils.h +f:drivers/net/wireless/intel/iwlwifi/mld/thermal.c +f:drivers/net/wireless/intel/iwlwifi/mld/thermal.h +f:drivers/net/wireless/intel/iwlwifi/mld/time_sync.c +f:drivers/net/wireless/intel/iwlwifi/mld/time_sync.h +f:drivers/net/wireless/intel/iwlwifi/mld/tlc.c +f:drivers/net/wireless/intel/iwlwifi/mld/tlc.h +f:drivers/net/wireless/intel/iwlwifi/mld/tx.c +f:drivers/net/wireless/intel/iwlwifi/mld/tx.h +f:drivers/net/wireless/intel/iwlwifi/mvm/Makefile +f:drivers/net/wireless/intel/iwlwifi/mvm/binding.c +f:drivers/net/wireless/intel/iwlwifi/mvm/coex.c +f:drivers/net/wireless/intel/iwlwifi/mvm/constants.h +f:drivers/net/wireless/intel/iwlwifi/mvm/d3.c +f:drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c +f:drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c +f:drivers/net/wireless/intel/iwlwifi/mvm/debugfs.h +f:drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c +f:drivers/net/wireless/intel/iwlwifi/mvm/ftm-responder.c +f:drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h +f:drivers/net/wireless/intel/iwlwifi/mvm/fw.c +f:drivers/net/wireless/intel/iwlwifi/mvm/led.c +f:drivers/net/wireless/intel/iwlwifi/mvm/link.c +f:drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c +f:drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +f:drivers/net/wireless/intel/iwlwifi/mvm/mld-key.c +f:drivers/net/wireless/intel/iwlwifi/mvm/mld-mac.c +f:drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c +f:drivers/net/wireless/intel/iwlwifi/mvm/mld-sta.c +f:drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +f:drivers/net/wireless/intel/iwlwifi/mvm/nvm.c +f:drivers/net/wireless/intel/iwlwifi/mvm/offloading.c +f:drivers/net/wireless/intel/iwlwifi/mvm/ops.c +f:drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c +f:drivers/net/wireless/intel/iwlwifi/mvm/power.c +f:drivers/net/wireless/intel/iwlwifi/mvm/ptp.c +f:drivers/net/wireless/intel/iwlwifi/mvm/quota.c +f:drivers/net/wireless/intel/iwlwifi/mvm/rfi.c +f:drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c +f:drivers/net/wireless/intel/iwlwifi/mvm/rs.c +f:drivers/net/wireless/intel/iwlwifi/mvm/rs.h +f:drivers/net/wireless/intel/iwlwifi/mvm/rx.c +f:drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +f:drivers/net/wireless/intel/iwlwifi/mvm/scan.c +f:drivers/net/wireless/intel/iwlwifi/mvm/sf.c +f:drivers/net/wireless/intel/iwlwifi/mvm/sta.c +f:drivers/net/wireless/intel/iwlwifi/mvm/sta.h +f:drivers/net/wireless/intel/iwlwifi/mvm/tdls.c +f:drivers/net/wireless/intel/iwlwifi/mvm/testmode.h +f:drivers/net/wireless/intel/iwlwifi/mvm/tests/Makefile +f:drivers/net/wireless/intel/iwlwifi/mvm/tests/hcmd.c +f:drivers/net/wireless/intel/iwlwifi/mvm/tests/links.c +f:drivers/net/wireless/intel/iwlwifi/mvm/tests/module.c +f:drivers/net/wireless/intel/iwlwifi/mvm/time-event.c +f:drivers/net/wireless/intel/iwlwifi/mvm/time-event.h +f:drivers/net/wireless/intel/iwlwifi/mvm/time-sync.c +f:drivers/net/wireless/intel/iwlwifi/mvm/time-sync.h +f:drivers/net/wireless/intel/iwlwifi/mvm/tt.c +f:drivers/net/wireless/intel/iwlwifi/mvm/tx.c +f:drivers/net/wireless/intel/iwlwifi/mvm/utils.c +f:drivers/net/wireless/intel/iwlwifi/mvm/vendor-cmd.c +f:drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-v2.c +f:drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c +f:drivers/net/wireless/intel/iwlwifi/pcie/drv.c +f:drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/internal.h +f:drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/rx.c +f:drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans-gen2.c +f:drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c +f:drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/tx-gen2.c +f:drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/tx.c +f:drivers/net/wireless/intel/iwlwifi/pcie/iwl-context-info-v2.h +f:drivers/net/wireless/intel/iwlwifi/pcie/iwl-context-info.h +f:drivers/net/wireless/intel/iwlwifi/pcie/utils.c +f:drivers/net/wireless/intel/iwlwifi/pcie/utils.h +f:drivers/net/wireless/intel/iwlwifi/tests/Makefile +f:drivers/net/wireless/intel/iwlwifi/tests/devinfo.c +f:drivers/net/wireless/intel/iwlwifi/tests/module.c +f:drivers/net/wireless/intel/iwlwifi/tests/utils.c +f:drivers/net/wireless/intersil/Kconfig +f:drivers/net/wireless/intersil/Makefile +f:drivers/net/wireless/intersil/p54/Kconfig +f:drivers/net/wireless/intersil/p54/Makefile +f:drivers/net/wireless/intersil/p54/eeprom.c +f:drivers/net/wireless/intersil/p54/eeprom.h +f:drivers/net/wireless/intersil/p54/fwio.c +f:drivers/net/wireless/intersil/p54/led.c +f:drivers/net/wireless/intersil/p54/lmac.h +f:drivers/net/wireless/intersil/p54/main.c +f:drivers/net/wireless/intersil/p54/p54.h +f:drivers/net/wireless/intersil/p54/p54pci.c +f:drivers/net/wireless/intersil/p54/p54pci.h +f:drivers/net/wireless/intersil/p54/p54spi.c +f:drivers/net/wireless/intersil/p54/p54spi.h +f:drivers/net/wireless/intersil/p54/p54spi_eeprom.h +f:drivers/net/wireless/intersil/p54/p54usb.c +f:drivers/net/wireless/intersil/p54/p54usb.h +f:drivers/net/wireless/intersil/p54/txrx.c +f:drivers/net/wireless/marvell/Kconfig +f:drivers/net/wireless/marvell/Makefile +f:drivers/net/wireless/marvell/libertas/Kconfig +f:drivers/net/wireless/marvell/libertas/LICENSE +f:drivers/net/wireless/marvell/libertas/Makefile +f:drivers/net/wireless/marvell/libertas/README +f:drivers/net/wireless/marvell/libertas/cfg.c +f:drivers/net/wireless/marvell/libertas/cfg.h +f:drivers/net/wireless/marvell/libertas/cmd.c +f:drivers/net/wireless/marvell/libertas/cmd.h +f:drivers/net/wireless/marvell/libertas/cmdresp.c +f:drivers/net/wireless/marvell/libertas/debugfs.c +f:drivers/net/wireless/marvell/libertas/debugfs.h +f:drivers/net/wireless/marvell/libertas/decl.h +f:drivers/net/wireless/marvell/libertas/defs.h +f:drivers/net/wireless/marvell/libertas/dev.h +f:drivers/net/wireless/marvell/libertas/ethtool.c +f:drivers/net/wireless/marvell/libertas/firmware.c +f:drivers/net/wireless/marvell/libertas/host.h +f:drivers/net/wireless/marvell/libertas/if_sdio.c +f:drivers/net/wireless/marvell/libertas/if_sdio.h +f:drivers/net/wireless/marvell/libertas/if_spi.c +f:drivers/net/wireless/marvell/libertas/if_spi.h +f:drivers/net/wireless/marvell/libertas/if_usb.c +f:drivers/net/wireless/marvell/libertas/if_usb.h +f:drivers/net/wireless/marvell/libertas/main.c +f:drivers/net/wireless/marvell/libertas/mesh.c +f:drivers/net/wireless/marvell/libertas/mesh.h +f:drivers/net/wireless/marvell/libertas/radiotap.h +f:drivers/net/wireless/marvell/libertas/rx.c +f:drivers/net/wireless/marvell/libertas/tx.c +f:drivers/net/wireless/marvell/libertas/types.h +f:drivers/net/wireless/marvell/libertas_tf/Kconfig +f:drivers/net/wireless/marvell/libertas_tf/Makefile +f:drivers/net/wireless/marvell/libertas_tf/cmd.c +f:drivers/net/wireless/marvell/libertas_tf/deb_defs.h +f:drivers/net/wireless/marvell/libertas_tf/if_usb.c +f:drivers/net/wireless/marvell/libertas_tf/if_usb.h +f:drivers/net/wireless/marvell/libertas_tf/libertas_tf.h +f:drivers/net/wireless/marvell/libertas_tf/main.c +f:drivers/net/wireless/marvell/mwifiex/11ac.c +f:drivers/net/wireless/marvell/mwifiex/11ac.h +f:drivers/net/wireless/marvell/mwifiex/11h.c +f:drivers/net/wireless/marvell/mwifiex/11n.c +f:drivers/net/wireless/marvell/mwifiex/11n.h +f:drivers/net/wireless/marvell/mwifiex/11n_aggr.c +f:drivers/net/wireless/marvell/mwifiex/11n_aggr.h +f:drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c +f:drivers/net/wireless/marvell/mwifiex/11n_rxreorder.h +f:drivers/net/wireless/marvell/mwifiex/Kconfig +f:drivers/net/wireless/marvell/mwifiex/Makefile +f:drivers/net/wireless/marvell/mwifiex/README +f:drivers/net/wireless/marvell/mwifiex/cfg80211.c +f:drivers/net/wireless/marvell/mwifiex/cfg80211.h +f:drivers/net/wireless/marvell/mwifiex/cfp.c +f:drivers/net/wireless/marvell/mwifiex/cmdevt.c +f:drivers/net/wireless/marvell/mwifiex/debugfs.c +f:drivers/net/wireless/marvell/mwifiex/decl.h +f:drivers/net/wireless/marvell/mwifiex/ethtool.c +f:drivers/net/wireless/marvell/mwifiex/fw.h +f:drivers/net/wireless/marvell/mwifiex/ie.c +f:drivers/net/wireless/marvell/mwifiex/init.c +f:drivers/net/wireless/marvell/mwifiex/ioctl.h +f:drivers/net/wireless/marvell/mwifiex/join.c +f:drivers/net/wireless/marvell/mwifiex/main.c +f:drivers/net/wireless/marvell/mwifiex/main.h +f:drivers/net/wireless/marvell/mwifiex/pcie.c +f:drivers/net/wireless/marvell/mwifiex/pcie.h +f:drivers/net/wireless/marvell/mwifiex/pcie_quirks.c +f:drivers/net/wireless/marvell/mwifiex/pcie_quirks.h +f:drivers/net/wireless/marvell/mwifiex/scan.c +f:drivers/net/wireless/marvell/mwifiex/sdio.c +f:drivers/net/wireless/marvell/mwifiex/sdio.h +f:drivers/net/wireless/marvell/mwifiex/sta_cmd.c +f:drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c +f:drivers/net/wireless/marvell/mwifiex/sta_event.c +f:drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +f:drivers/net/wireless/marvell/mwifiex/sta_rx.c +f:drivers/net/wireless/marvell/mwifiex/sta_tx.c +f:drivers/net/wireless/marvell/mwifiex/tdls.c +f:drivers/net/wireless/marvell/mwifiex/txrx.c +f:drivers/net/wireless/marvell/mwifiex/uap_cmd.c +f:drivers/net/wireless/marvell/mwifiex/uap_event.c +f:drivers/net/wireless/marvell/mwifiex/uap_txrx.c +f:drivers/net/wireless/marvell/mwifiex/usb.c +f:drivers/net/wireless/marvell/mwifiex/usb.h +f:drivers/net/wireless/marvell/mwifiex/util.c +f:drivers/net/wireless/marvell/mwifiex/util.h +f:drivers/net/wireless/marvell/mwifiex/wmm.c +f:drivers/net/wireless/marvell/mwifiex/wmm.h +f:drivers/net/wireless/marvell/mwl8k.c +f:drivers/net/wireless/mediatek/Kconfig +f:drivers/net/wireless/mediatek/Makefile +f:drivers/net/wireless/mediatek/mt76/Kconfig +f:drivers/net/wireless/mediatek/mt76/Makefile +f:drivers/net/wireless/mediatek/mt76/agg-rx.c +f:drivers/net/wireless/mediatek/mt76/channel.c +f:drivers/net/wireless/mediatek/mt76/debugfs.c +f:drivers/net/wireless/mediatek/mt76/dma.c +f:drivers/net/wireless/mediatek/mt76/dma.h +f:drivers/net/wireless/mediatek/mt76/eeprom.c +f:drivers/net/wireless/mediatek/mt76/mac80211.c +f:drivers/net/wireless/mediatek/mt76/mcu.c +f:drivers/net/wireless/mediatek/mt76/mmio.c +f:drivers/net/wireless/mediatek/mt76/mt76.h +f:drivers/net/wireless/mediatek/mt76/mt7603/Kconfig +f:drivers/net/wireless/mediatek/mt76/mt7603/Makefile +f:drivers/net/wireless/mediatek/mt76/mt7603/beacon.c +f:drivers/net/wireless/mediatek/mt76/mt7603/core.c +f:drivers/net/wireless/mediatek/mt76/mt7603/debugfs.c +f:drivers/net/wireless/mediatek/mt76/mt7603/dma.c +f:drivers/net/wireless/mediatek/mt76/mt7603/eeprom.c +f:drivers/net/wireless/mediatek/mt76/mt7603/eeprom.h +f:drivers/net/wireless/mediatek/mt76/mt7603/init.c +f:drivers/net/wireless/mediatek/mt76/mt7603/mac.c +f:drivers/net/wireless/mediatek/mt76/mt7603/mac.h +f:drivers/net/wireless/mediatek/mt76/mt7603/main.c +f:drivers/net/wireless/mediatek/mt76/mt7603/mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7603/mcu.h +f:drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h +f:drivers/net/wireless/mediatek/mt76/mt7603/pci.c +f:drivers/net/wireless/mediatek/mt76/mt7603/regs.h +f:drivers/net/wireless/mediatek/mt76/mt7603/soc.c +f:drivers/net/wireless/mediatek/mt76/mt7615/Kconfig +f:drivers/net/wireless/mediatek/mt76/mt7615/Makefile +f:drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c +f:drivers/net/wireless/mediatek/mt76/mt7615/dma.c +f:drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c +f:drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h +f:drivers/net/wireless/mediatek/mt76/mt7615/init.c +f:drivers/net/wireless/mediatek/mt76/mt7615/mac.c +f:drivers/net/wireless/mediatek/mt76/mt7615/mac.h +f:drivers/net/wireless/mediatek/mt76/mt7615/main.c +f:drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +f:drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +f:drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +f:drivers/net/wireless/mediatek/mt76/mt7615/mt7615_trace.h +f:drivers/net/wireless/mediatek/mt76/mt7615/pci.c +f:drivers/net/wireless/mediatek/mt76/mt7615/pci_init.c +f:drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c +f:drivers/net/wireless/mediatek/mt76/mt7615/regs.h +f:drivers/net/wireless/mediatek/mt76/mt7615/sdio.c +f:drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7615/soc.c +f:drivers/net/wireless/mediatek/mt76/mt7615/testmode.c +f:drivers/net/wireless/mediatek/mt76/mt7615/trace.c +f:drivers/net/wireless/mediatek/mt76/mt7615/usb.c +f:drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c +f:drivers/net/wireless/mediatek/mt76/mt76_connac.h +f:drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h +f:drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.c +f:drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h +f:drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c +f:drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h +f:drivers/net/wireless/mediatek/mt76/mt76x0/Kconfig +f:drivers/net/wireless/mediatek/mt76/mt76x0/Makefile +f:drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c +f:drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.h +f:drivers/net/wireless/mediatek/mt76/mt76x0/init.c +f:drivers/net/wireless/mediatek/mt76/mt76x0/initvals.h +f:drivers/net/wireless/mediatek/mt76/mt76x0/initvals_init.h +f:drivers/net/wireless/mediatek/mt76/mt76x0/initvals_phy.h +f:drivers/net/wireless/mediatek/mt76/mt76x0/main.c +f:drivers/net/wireless/mediatek/mt76/mt76x0/mcu.h +f:drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h +f:drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +f:drivers/net/wireless/mediatek/mt76/mt76x0/pci_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +f:drivers/net/wireless/mediatek/mt76/mt76x0/phy.h +f:drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +f:drivers/net/wireless/mediatek/mt76/mt76x0/usb_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt76x02.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_debugfs.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_dfs.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_dfs.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_dma.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_mac.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_mac.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_mcu.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_phy.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_phy.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_regs.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_trace.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_trace.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_usb.h +f:drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt76x02_util.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/Kconfig +f:drivers/net/wireless/mediatek/mt76/mt76x2/Makefile +f:drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.h +f:drivers/net/wireless/mediatek/mt76/mt76x2/init.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/mac.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/mac.h +f:drivers/net/wireless/mediatek/mt76/mt76x2/mcu.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/mcu.h +f:drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h +f:drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2u.h +f:drivers/net/wireless/mediatek/mt76/mt76x2/pci.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/pci_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/phy.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/usb.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/usb_mac.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/usb_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt76x2/usb_phy.c +f:drivers/net/wireless/mediatek/mt76/mt7915/Kconfig +f:drivers/net/wireless/mediatek/mt76/mt7915/Makefile +f:drivers/net/wireless/mediatek/mt76/mt7915/coredump.c +f:drivers/net/wireless/mediatek/mt76/mt7915/coredump.h +f:drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +f:drivers/net/wireless/mediatek/mt76/mt7915/dma.c +f:drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +f:drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h +f:drivers/net/wireless/mediatek/mt76/mt7915/init.c +f:drivers/net/wireless/mediatek/mt76/mt7915/mac.c +f:drivers/net/wireless/mediatek/mt76/mt7915/mac.h +f:drivers/net/wireless/mediatek/mt76/mt7915/main.c +f:drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +f:drivers/net/wireless/mediatek/mt76/mt7915/mmio.c +f:drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +f:drivers/net/wireless/mediatek/mt76/mt7915/pci.c +f:drivers/net/wireless/mediatek/mt76/mt7915/regs.h +f:drivers/net/wireless/mediatek/mt76/mt7915/soc.c +f:drivers/net/wireless/mediatek/mt76/mt7915/testmode.c +f:drivers/net/wireless/mediatek/mt76/mt7915/testmode.h +f:drivers/net/wireless/mediatek/mt76/mt7921/Kconfig +f:drivers/net/wireless/mediatek/mt76/mt7921/Makefile +f:drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c +f:drivers/net/wireless/mediatek/mt76/mt7921/init.c +f:drivers/net/wireless/mediatek/mt76/mt7921/mac.c +f:drivers/net/wireless/mediatek/mt76/mt7921/main.c +f:drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7921/mcu.h +f:drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +f:drivers/net/wireless/mediatek/mt76/mt7921/pci.c +f:drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c +f:drivers/net/wireless/mediatek/mt76/mt7921/pci_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7921/regs.h +f:drivers/net/wireless/mediatek/mt76/mt7921/sdio.c +f:drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c +f:drivers/net/wireless/mediatek/mt76/mt7921/sdio_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7921/testmode.c +f:drivers/net/wireless/mediatek/mt76/mt7921/usb.c +f:drivers/net/wireless/mediatek/mt76/mt7925/Kconfig +f:drivers/net/wireless/mediatek/mt76/mt7925/Makefile +f:drivers/net/wireless/mediatek/mt76/mt7925/debugfs.c +f:drivers/net/wireless/mediatek/mt76/mt7925/init.c +f:drivers/net/wireless/mediatek/mt76/mt7925/mac.c +f:drivers/net/wireless/mediatek/mt76/mt7925/mac.h +f:drivers/net/wireless/mediatek/mt76/mt7925/main.c +f:drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7925/mcu.h +f:drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h +f:drivers/net/wireless/mediatek/mt76/mt7925/pci.c +f:drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c +f:drivers/net/wireless/mediatek/mt76/mt7925/pci_mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7925/regs.h +f:drivers/net/wireless/mediatek/mt76/mt7925/testmode.c +f:drivers/net/wireless/mediatek/mt76/mt7925/usb.c +f:drivers/net/wireless/mediatek/mt76/mt792x.h +f:drivers/net/wireless/mediatek/mt76/mt792x_acpi_sar.c +f:drivers/net/wireless/mediatek/mt76/mt792x_acpi_sar.h +f:drivers/net/wireless/mediatek/mt76/mt792x_core.c +f:drivers/net/wireless/mediatek/mt76/mt792x_debugfs.c +f:drivers/net/wireless/mediatek/mt76/mt792x_dma.c +f:drivers/net/wireless/mediatek/mt76/mt792x_mac.c +f:drivers/net/wireless/mediatek/mt76/mt792x_regs.h +f:drivers/net/wireless/mediatek/mt76/mt792x_trace.c +f:drivers/net/wireless/mediatek/mt76/mt792x_trace.h +f:drivers/net/wireless/mediatek/mt76/mt792x_usb.c +f:drivers/net/wireless/mediatek/mt76/mt7996/Kconfig +f:drivers/net/wireless/mediatek/mt76/mt7996/Makefile +f:drivers/net/wireless/mediatek/mt76/mt7996/coredump.c +f:drivers/net/wireless/mediatek/mt76/mt7996/coredump.h +f:drivers/net/wireless/mediatek/mt76/mt7996/debugfs.c +f:drivers/net/wireless/mediatek/mt76/mt7996/dma.c +f:drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c +f:drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h +f:drivers/net/wireless/mediatek/mt76/mt7996/init.c +f:drivers/net/wireless/mediatek/mt76/mt7996/mac.c +f:drivers/net/wireless/mediatek/mt76/mt7996/mac.h +f:drivers/net/wireless/mediatek/mt76/mt7996/main.c +f:drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +f:drivers/net/wireless/mediatek/mt76/mt7996/mcu.h +f:drivers/net/wireless/mediatek/mt76/mt7996/mmio.c +f:drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h +f:drivers/net/wireless/mediatek/mt76/mt7996/pci.c +f:drivers/net/wireless/mediatek/mt76/mt7996/regs.h +f:drivers/net/wireless/mediatek/mt76/pci.c +f:drivers/net/wireless/mediatek/mt76/scan.c +f:drivers/net/wireless/mediatek/mt76/sdio.c +f:drivers/net/wireless/mediatek/mt76/sdio.h +f:drivers/net/wireless/mediatek/mt76/sdio_txrx.c +f:drivers/net/wireless/mediatek/mt76/testmode.c +f:drivers/net/wireless/mediatek/mt76/testmode.h +f:drivers/net/wireless/mediatek/mt76/trace.c +f:drivers/net/wireless/mediatek/mt76/trace.h +f:drivers/net/wireless/mediatek/mt76/tx.c +f:drivers/net/wireless/mediatek/mt76/usb.c +f:drivers/net/wireless/mediatek/mt76/usb_trace.c +f:drivers/net/wireless/mediatek/mt76/usb_trace.h +f:drivers/net/wireless/mediatek/mt76/util.c +f:drivers/net/wireless/mediatek/mt76/util.h +f:drivers/net/wireless/mediatek/mt76/wed.c +f:drivers/net/wireless/mediatek/mt7601u/Kconfig +f:drivers/net/wireless/mediatek/mt7601u/Makefile +f:drivers/net/wireless/mediatek/mt7601u/core.c +f:drivers/net/wireless/mediatek/mt7601u/debugfs.c +f:drivers/net/wireless/mediatek/mt7601u/dma.c +f:drivers/net/wireless/mediatek/mt7601u/dma.h +f:drivers/net/wireless/mediatek/mt7601u/eeprom.c +f:drivers/net/wireless/mediatek/mt7601u/eeprom.h +f:drivers/net/wireless/mediatek/mt7601u/init.c +f:drivers/net/wireless/mediatek/mt7601u/initvals.h +f:drivers/net/wireless/mediatek/mt7601u/initvals_phy.h +f:drivers/net/wireless/mediatek/mt7601u/mac.c +f:drivers/net/wireless/mediatek/mt7601u/mac.h +f:drivers/net/wireless/mediatek/mt7601u/main.c +f:drivers/net/wireless/mediatek/mt7601u/mcu.c +f:drivers/net/wireless/mediatek/mt7601u/mcu.h +f:drivers/net/wireless/mediatek/mt7601u/mt7601u.h +f:drivers/net/wireless/mediatek/mt7601u/phy.c +f:drivers/net/wireless/mediatek/mt7601u/regs.h +f:drivers/net/wireless/mediatek/mt7601u/trace.c +f:drivers/net/wireless/mediatek/mt7601u/trace.h +f:drivers/net/wireless/mediatek/mt7601u/tx.c +f:drivers/net/wireless/mediatek/mt7601u/usb.c +f:drivers/net/wireless/mediatek/mt7601u/usb.h +f:drivers/net/wireless/mediatek/mt7601u/util.c +f:drivers/net/wireless/microchip/Kconfig +f:drivers/net/wireless/microchip/Makefile +f:drivers/net/wireless/microchip/wilc1000/Kconfig +f:drivers/net/wireless/microchip/wilc1000/Makefile +f:drivers/net/wireless/microchip/wilc1000/cfg80211.c +f:drivers/net/wireless/microchip/wilc1000/cfg80211.h +f:drivers/net/wireless/microchip/wilc1000/fw.h +f:drivers/net/wireless/microchip/wilc1000/hif.c +f:drivers/net/wireless/microchip/wilc1000/hif.h +f:drivers/net/wireless/microchip/wilc1000/mon.c +f:drivers/net/wireless/microchip/wilc1000/netdev.c +f:drivers/net/wireless/microchip/wilc1000/netdev.h +f:drivers/net/wireless/microchip/wilc1000/sdio.c +f:drivers/net/wireless/microchip/wilc1000/spi.c +f:drivers/net/wireless/microchip/wilc1000/wlan.c +f:drivers/net/wireless/microchip/wilc1000/wlan.h +f:drivers/net/wireless/microchip/wilc1000/wlan_cfg.c +f:drivers/net/wireless/microchip/wilc1000/wlan_cfg.h +f:drivers/net/wireless/microchip/wilc1000/wlan_if.h +f:drivers/net/wireless/purelifi/Kconfig +f:drivers/net/wireless/purelifi/Makefile +f:drivers/net/wireless/purelifi/plfxlc/Kconfig +f:drivers/net/wireless/purelifi/plfxlc/Makefile +f:drivers/net/wireless/purelifi/plfxlc/chip.c +f:drivers/net/wireless/purelifi/plfxlc/chip.h +f:drivers/net/wireless/purelifi/plfxlc/firmware.c +f:drivers/net/wireless/purelifi/plfxlc/intf.h +f:drivers/net/wireless/purelifi/plfxlc/mac.c +f:drivers/net/wireless/purelifi/plfxlc/mac.h +f:drivers/net/wireless/purelifi/plfxlc/usb.c +f:drivers/net/wireless/purelifi/plfxlc/usb.h +f:drivers/net/wireless/quantenna/Kconfig +f:drivers/net/wireless/quantenna/Makefile +f:drivers/net/wireless/quantenna/qtnfmac/Kconfig +f:drivers/net/wireless/quantenna/qtnfmac/Makefile +f:drivers/net/wireless/quantenna/qtnfmac/bus.h +f:drivers/net/wireless/quantenna/qtnfmac/cfg80211.c +f:drivers/net/wireless/quantenna/qtnfmac/cfg80211.h +f:drivers/net/wireless/quantenna/qtnfmac/commands.c +f:drivers/net/wireless/quantenna/qtnfmac/commands.h +f:drivers/net/wireless/quantenna/qtnfmac/core.c +f:drivers/net/wireless/quantenna/qtnfmac/core.h +f:drivers/net/wireless/quantenna/qtnfmac/debug.c +f:drivers/net/wireless/quantenna/qtnfmac/debug.h +f:drivers/net/wireless/quantenna/qtnfmac/event.c +f:drivers/net/wireless/quantenna/qtnfmac/event.h +f:drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c +f:drivers/net/wireless/quantenna/qtnfmac/pcie/pcie_priv.h +f:drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie.c +f:drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie_ipc.h +f:drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie_regs.h +f:drivers/net/wireless/quantenna/qtnfmac/pcie/topaz_pcie.c +f:drivers/net/wireless/quantenna/qtnfmac/pcie/topaz_pcie_ipc.h +f:drivers/net/wireless/quantenna/qtnfmac/pcie/topaz_pcie_regs.h +f:drivers/net/wireless/quantenna/qtnfmac/qlink.h +f:drivers/net/wireless/quantenna/qtnfmac/qlink_util.c +f:drivers/net/wireless/quantenna/qtnfmac/qlink_util.h +f:drivers/net/wireless/quantenna/qtnfmac/qtn_hw_ids.h +f:drivers/net/wireless/quantenna/qtnfmac/shm_ipc.c +f:drivers/net/wireless/quantenna/qtnfmac/shm_ipc.h +f:drivers/net/wireless/quantenna/qtnfmac/shm_ipc_defs.h +f:drivers/net/wireless/quantenna/qtnfmac/switchdev.h +f:drivers/net/wireless/quantenna/qtnfmac/trans.c +f:drivers/net/wireless/quantenna/qtnfmac/trans.h +f:drivers/net/wireless/quantenna/qtnfmac/util.c +f:drivers/net/wireless/quantenna/qtnfmac/util.h +f:drivers/net/wireless/ralink/Kconfig +f:drivers/net/wireless/ralink/Makefile +f:drivers/net/wireless/ralink/rt2x00/Kconfig +f:drivers/net/wireless/ralink/rt2x00/Makefile +f:drivers/net/wireless/ralink/rt2x00/rt2400pci.c +f:drivers/net/wireless/ralink/rt2x00/rt2400pci.h +f:drivers/net/wireless/ralink/rt2x00/rt2500pci.c +f:drivers/net/wireless/ralink/rt2x00/rt2500pci.h +f:drivers/net/wireless/ralink/rt2x00/rt2500usb.c +f:drivers/net/wireless/ralink/rt2x00/rt2500usb.h +f:drivers/net/wireless/ralink/rt2x00/rt2800.h +f:drivers/net/wireless/ralink/rt2x00/rt2800lib.c +f:drivers/net/wireless/ralink/rt2x00/rt2800lib.h +f:drivers/net/wireless/ralink/rt2x00/rt2800mmio.c +f:drivers/net/wireless/ralink/rt2x00/rt2800mmio.h +f:drivers/net/wireless/ralink/rt2x00/rt2800pci.c +f:drivers/net/wireless/ralink/rt2x00/rt2800pci.h +f:drivers/net/wireless/ralink/rt2x00/rt2800soc.c +f:drivers/net/wireless/ralink/rt2x00/rt2800usb.c +f:drivers/net/wireless/ralink/rt2x00/rt2800usb.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00config.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00crypto.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00debug.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00debug.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00dump.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00firmware.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00leds.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00leds.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00lib.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00link.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00mac.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00mmio.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00mmio.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00pci.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00pci.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00queue.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00reg.h +f:drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +f:drivers/net/wireless/ralink/rt2x00/rt2x00usb.h +f:drivers/net/wireless/ralink/rt2x00/rt61pci.c +f:drivers/net/wireless/ralink/rt2x00/rt61pci.h +f:drivers/net/wireless/ralink/rt2x00/rt73usb.c +f:drivers/net/wireless/ralink/rt2x00/rt73usb.h +f:drivers/net/wireless/realtek/Kconfig +f:drivers/net/wireless/realtek/Makefile +f:drivers/net/wireless/realtek/rtl818x/Kconfig +f:drivers/net/wireless/realtek/rtl818x/Makefile +f:drivers/net/wireless/realtek/rtl818x/rtl8180/Makefile +f:drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c +f:drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.c +f:drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.h +f:drivers/net/wireless/realtek/rtl818x/rtl8180/max2820.c +f:drivers/net/wireless/realtek/rtl818x/rtl8180/max2820.h +f:drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8180.h +f:drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225.c +f:drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225.h +f:drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225se.c +f:drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225se.h +f:drivers/net/wireless/realtek/rtl818x/rtl8180/sa2400.c +f:drivers/net/wireless/realtek/rtl818x/rtl8180/sa2400.h +f:drivers/net/wireless/realtek/rtl818x/rtl8187/Makefile +f:drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c +f:drivers/net/wireless/realtek/rtl818x/rtl8187/leds.c +f:drivers/net/wireless/realtek/rtl818x/rtl8187/leds.h +f:drivers/net/wireless/realtek/rtl818x/rtl8187/rfkill.c +f:drivers/net/wireless/realtek/rtl818x/rtl8187/rfkill.h +f:drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8187.h +f:drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c +f:drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.h +f:drivers/net/wireless/realtek/rtl818x/rtl818x.h +f:drivers/net/wireless/realtek/rtl8xxxu/8188e.c +f:drivers/net/wireless/realtek/rtl8xxxu/8188f.c +f:drivers/net/wireless/realtek/rtl8xxxu/8192c.c +f:drivers/net/wireless/realtek/rtl8xxxu/8192e.c +f:drivers/net/wireless/realtek/rtl8xxxu/8192f.c +f:drivers/net/wireless/realtek/rtl8xxxu/8710b.c +f:drivers/net/wireless/realtek/rtl8xxxu/8723a.c +f:drivers/net/wireless/realtek/rtl8xxxu/8723b.c +f:drivers/net/wireless/realtek/rtl8xxxu/Kconfig +f:drivers/net/wireless/realtek/rtl8xxxu/Makefile +f:drivers/net/wireless/realtek/rtl8xxxu/core.c +f:drivers/net/wireless/realtek/rtl8xxxu/regs.h +f:drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h +f:drivers/net/wireless/realtek/rtlwifi/Kconfig +f:drivers/net/wireless/realtek/rtlwifi/Makefile +f:drivers/net/wireless/realtek/rtlwifi/base.c +f:drivers/net/wireless/realtek/rtlwifi/base.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbt_precomp.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8192e2ant.c +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8192e2ant.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b1ant.c +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b1ant.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a1ant.c +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a1ant.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822bwifionly.c +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822bwifionly.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c +f:drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h +f:drivers/net/wireless/realtek/rtlwifi/cam.c +f:drivers/net/wireless/realtek/rtlwifi/cam.h +f:drivers/net/wireless/realtek/rtlwifi/core.c +f:drivers/net/wireless/realtek/rtlwifi/core.h +f:drivers/net/wireless/realtek/rtlwifi/debug.c +f:drivers/net/wireless/realtek/rtlwifi/debug.h +f:drivers/net/wireless/realtek/rtlwifi/efuse.c +f:drivers/net/wireless/realtek/rtlwifi/efuse.h +f:drivers/net/wireless/realtek/rtlwifi/pci.c +f:drivers/net/wireless/realtek/rtlwifi/pci.h +f:drivers/net/wireless/realtek/rtlwifi/ps.c +f:drivers/net/wireless/realtek/rtlwifi/ps.h +f:drivers/net/wireless/realtek/rtlwifi/pwrseqcmd.h +f:drivers/net/wireless/realtek/rtlwifi/rc.c +f:drivers/net/wireless/realtek/rtlwifi/rc.h +f:drivers/net/wireless/realtek/rtlwifi/regd.c +f:drivers/net/wireless/realtek/rtlwifi/regd.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/fw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/fw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/pwrseq.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/pwrseq.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192c/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192c/fw_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192c/fw_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192c/main.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/mac.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/mac.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192cu/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/dm_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/dm_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/fw_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/fw_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/hw_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/hw_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/main.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/phy_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/phy_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/rf_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/rf_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/trx_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192d/trx_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/sw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/fw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/fw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192du/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/pwrseq.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/pwrseq.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/fw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/fw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/btc.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/fw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/fw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_bt_coexist.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_bt_coexist.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/pwrseq.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/pwrseq.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/pwrseq.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/pwrseq.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723com/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8723com/dm_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723com/dm_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723com/fw_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723com/fw_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8723com/main.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723com/phy_common.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8723com/phy_common.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/Makefile +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/led.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/led.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/pwrseq.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/pwrseq.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/reg.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/rf.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/rf.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/table.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/table.h +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c +f:drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h +f:drivers/net/wireless/realtek/rtlwifi/stats.c +f:drivers/net/wireless/realtek/rtlwifi/stats.h +f:drivers/net/wireless/realtek/rtlwifi/usb.c +f:drivers/net/wireless/realtek/rtlwifi/usb.h +f:drivers/net/wireless/realtek/rtlwifi/wifi.h +f:drivers/net/wireless/realtek/rtw88/Kconfig +f:drivers/net/wireless/realtek/rtw88/Makefile +f:drivers/net/wireless/realtek/rtw88/bf.c +f:drivers/net/wireless/realtek/rtw88/bf.h +f:drivers/net/wireless/realtek/rtw88/coex.c +f:drivers/net/wireless/realtek/rtw88/coex.h +f:drivers/net/wireless/realtek/rtw88/debug.c +f:drivers/net/wireless/realtek/rtw88/debug.h +f:drivers/net/wireless/realtek/rtw88/efuse.c +f:drivers/net/wireless/realtek/rtw88/efuse.h +f:drivers/net/wireless/realtek/rtw88/fw.c +f:drivers/net/wireless/realtek/rtw88/fw.h +f:drivers/net/wireless/realtek/rtw88/hci.h +f:drivers/net/wireless/realtek/rtw88/led.c +f:drivers/net/wireless/realtek/rtw88/led.h +f:drivers/net/wireless/realtek/rtw88/mac.c +f:drivers/net/wireless/realtek/rtw88/mac.h +f:drivers/net/wireless/realtek/rtw88/mac80211.c +f:drivers/net/wireless/realtek/rtw88/main.c +f:drivers/net/wireless/realtek/rtw88/main.h +f:drivers/net/wireless/realtek/rtw88/pci.c +f:drivers/net/wireless/realtek/rtw88/pci.h +f:drivers/net/wireless/realtek/rtw88/phy.c +f:drivers/net/wireless/realtek/rtw88/phy.h +f:drivers/net/wireless/realtek/rtw88/ps.c +f:drivers/net/wireless/realtek/rtw88/ps.h +f:drivers/net/wireless/realtek/rtw88/reg.h +f:drivers/net/wireless/realtek/rtw88/regd.c +f:drivers/net/wireless/realtek/rtw88/regd.h +f:drivers/net/wireless/realtek/rtw88/rtw8703b.c +f:drivers/net/wireless/realtek/rtw88/rtw8703b.h +f:drivers/net/wireless/realtek/rtw88/rtw8703b_tables.c +f:drivers/net/wireless/realtek/rtw88/rtw8703b_tables.h +f:drivers/net/wireless/realtek/rtw88/rtw8723cs.c +f:drivers/net/wireless/realtek/rtw88/rtw8723d.c +f:drivers/net/wireless/realtek/rtw88/rtw8723d.h +f:drivers/net/wireless/realtek/rtw88/rtw8723d_table.c +f:drivers/net/wireless/realtek/rtw88/rtw8723d_table.h +f:drivers/net/wireless/realtek/rtw88/rtw8723de.c +f:drivers/net/wireless/realtek/rtw88/rtw8723ds.c +f:drivers/net/wireless/realtek/rtw88/rtw8723du.c +f:drivers/net/wireless/realtek/rtw88/rtw8723x.c +f:drivers/net/wireless/realtek/rtw88/rtw8723x.h +f:drivers/net/wireless/realtek/rtw88/rtw8812a.c +f:drivers/net/wireless/realtek/rtw88/rtw8812a.h +f:drivers/net/wireless/realtek/rtw88/rtw8812a_table.c +f:drivers/net/wireless/realtek/rtw88/rtw8812a_table.h +f:drivers/net/wireless/realtek/rtw88/rtw8812au.c +f:drivers/net/wireless/realtek/rtw88/rtw8814a.c +f:drivers/net/wireless/realtek/rtw88/rtw8814a.h +f:drivers/net/wireless/realtek/rtw88/rtw8814a_table.c +f:drivers/net/wireless/realtek/rtw88/rtw8814a_table.h +f:drivers/net/wireless/realtek/rtw88/rtw8814ae.c +f:drivers/net/wireless/realtek/rtw88/rtw8814au.c +f:drivers/net/wireless/realtek/rtw88/rtw8821a.c +f:drivers/net/wireless/realtek/rtw88/rtw8821a.h +f:drivers/net/wireless/realtek/rtw88/rtw8821a_table.c +f:drivers/net/wireless/realtek/rtw88/rtw8821a_table.h +f:drivers/net/wireless/realtek/rtw88/rtw8821au.c +f:drivers/net/wireless/realtek/rtw88/rtw8821c.c +f:drivers/net/wireless/realtek/rtw88/rtw8821c.h +f:drivers/net/wireless/realtek/rtw88/rtw8821c_table.c +f:drivers/net/wireless/realtek/rtw88/rtw8821c_table.h +f:drivers/net/wireless/realtek/rtw88/rtw8821ce.c +f:drivers/net/wireless/realtek/rtw88/rtw8821cs.c +f:drivers/net/wireless/realtek/rtw88/rtw8821cu.c +f:drivers/net/wireless/realtek/rtw88/rtw8822b.c +f:drivers/net/wireless/realtek/rtw88/rtw8822b.h +f:drivers/net/wireless/realtek/rtw88/rtw8822b_table.c +f:drivers/net/wireless/realtek/rtw88/rtw8822b_table.h +f:drivers/net/wireless/realtek/rtw88/rtw8822be.c +f:drivers/net/wireless/realtek/rtw88/rtw8822bs.c +f:drivers/net/wireless/realtek/rtw88/rtw8822bu.c +f:drivers/net/wireless/realtek/rtw88/rtw8822c.c +f:drivers/net/wireless/realtek/rtw88/rtw8822c.h +f:drivers/net/wireless/realtek/rtw88/rtw8822c_table.c +f:drivers/net/wireless/realtek/rtw88/rtw8822c_table.h +f:drivers/net/wireless/realtek/rtw88/rtw8822ce.c +f:drivers/net/wireless/realtek/rtw88/rtw8822cs.c +f:drivers/net/wireless/realtek/rtw88/rtw8822cu.c +f:drivers/net/wireless/realtek/rtw88/rtw88xxa.c +f:drivers/net/wireless/realtek/rtw88/rtw88xxa.h +f:drivers/net/wireless/realtek/rtw88/rx.c +f:drivers/net/wireless/realtek/rtw88/rx.h +f:drivers/net/wireless/realtek/rtw88/sar.c +f:drivers/net/wireless/realtek/rtw88/sar.h +f:drivers/net/wireless/realtek/rtw88/sdio.c +f:drivers/net/wireless/realtek/rtw88/sdio.h +f:drivers/net/wireless/realtek/rtw88/sec.c +f:drivers/net/wireless/realtek/rtw88/sec.h +f:drivers/net/wireless/realtek/rtw88/tx.c +f:drivers/net/wireless/realtek/rtw88/tx.h +f:drivers/net/wireless/realtek/rtw88/usb.c +f:drivers/net/wireless/realtek/rtw88/usb.h +f:drivers/net/wireless/realtek/rtw88/util.c +f:drivers/net/wireless/realtek/rtw88/util.h +f:drivers/net/wireless/realtek/rtw88/wow.c +f:drivers/net/wireless/realtek/rtw88/wow.h +f:drivers/net/wireless/realtek/rtw89/Kconfig +f:drivers/net/wireless/realtek/rtw89/Makefile +f:drivers/net/wireless/realtek/rtw89/acpi.c +f:drivers/net/wireless/realtek/rtw89/acpi.h +f:drivers/net/wireless/realtek/rtw89/cam.c +f:drivers/net/wireless/realtek/rtw89/cam.h +f:drivers/net/wireless/realtek/rtw89/chan.c +f:drivers/net/wireless/realtek/rtw89/chan.h +f:drivers/net/wireless/realtek/rtw89/coex.c +f:drivers/net/wireless/realtek/rtw89/coex.h +f:drivers/net/wireless/realtek/rtw89/core.c +f:drivers/net/wireless/realtek/rtw89/core.h +f:drivers/net/wireless/realtek/rtw89/debug.c +f:drivers/net/wireless/realtek/rtw89/debug.h +f:drivers/net/wireless/realtek/rtw89/efuse.c +f:drivers/net/wireless/realtek/rtw89/efuse.h +f:drivers/net/wireless/realtek/rtw89/efuse_be.c +f:drivers/net/wireless/realtek/rtw89/fw.c +f:drivers/net/wireless/realtek/rtw89/fw.h +f:drivers/net/wireless/realtek/rtw89/mac.c +f:drivers/net/wireless/realtek/rtw89/mac.h +f:drivers/net/wireless/realtek/rtw89/mac80211.c +f:drivers/net/wireless/realtek/rtw89/mac_be.c +f:drivers/net/wireless/realtek/rtw89/pci.c +f:drivers/net/wireless/realtek/rtw89/pci.h +f:drivers/net/wireless/realtek/rtw89/pci_be.c +f:drivers/net/wireless/realtek/rtw89/phy.c +f:drivers/net/wireless/realtek/rtw89/phy.h +f:drivers/net/wireless/realtek/rtw89/phy_be.c +f:drivers/net/wireless/realtek/rtw89/ps.c +f:drivers/net/wireless/realtek/rtw89/ps.h +f:drivers/net/wireless/realtek/rtw89/reg.h +f:drivers/net/wireless/realtek/rtw89/regd.c +f:drivers/net/wireless/realtek/rtw89/rtw8851b.c +f:drivers/net/wireless/realtek/rtw89/rtw8851b.h +f:drivers/net/wireless/realtek/rtw89/rtw8851b_rfk.c +f:drivers/net/wireless/realtek/rtw89/rtw8851b_rfk.h +f:drivers/net/wireless/realtek/rtw89/rtw8851b_rfk_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8851b_rfk_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8851b_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8851b_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8851be.c +f:drivers/net/wireless/realtek/rtw89/rtw8851bu.c +f:drivers/net/wireless/realtek/rtw89/rtw8852a.c +f:drivers/net/wireless/realtek/rtw89/rtw8852a.h +f:drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c +f:drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.h +f:drivers/net/wireless/realtek/rtw89/rtw8852a_rfk_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8852a_rfk_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8852a_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8852a_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8852ae.c +f:drivers/net/wireless/realtek/rtw89/rtw8852b.c +f:drivers/net/wireless/realtek/rtw89/rtw8852b.h +f:drivers/net/wireless/realtek/rtw89/rtw8852b_common.c +f:drivers/net/wireless/realtek/rtw89/rtw8852b_common.h +f:drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c +f:drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h +f:drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8852b_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8852b_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8852be.c +f:drivers/net/wireless/realtek/rtw89/rtw8852bt.c +f:drivers/net/wireless/realtek/rtw89/rtw8852bt.h +f:drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.c +f:drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.h +f:drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8852bte.c +f:drivers/net/wireless/realtek/rtw89/rtw8852bu.c +f:drivers/net/wireless/realtek/rtw89/rtw8852c.c +f:drivers/net/wireless/realtek/rtw89/rtw8852c.h +f:drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c +f:drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.h +f:drivers/net/wireless/realtek/rtw89/rtw8852c_rfk_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8852c_rfk_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8852c_table.c +f:drivers/net/wireless/realtek/rtw89/rtw8852c_table.h +f:drivers/net/wireless/realtek/rtw89/rtw8852ce.c +f:drivers/net/wireless/realtek/rtw89/rtw8922a.c +f:drivers/net/wireless/realtek/rtw89/rtw8922a.h +f:drivers/net/wireless/realtek/rtw89/rtw8922a_rfk.c +f:drivers/net/wireless/realtek/rtw89/rtw8922a_rfk.h +f:drivers/net/wireless/realtek/rtw89/rtw8922ae.c +f:drivers/net/wireless/realtek/rtw89/sar.c +f:drivers/net/wireless/realtek/rtw89/sar.h +f:drivers/net/wireless/realtek/rtw89/ser.c +f:drivers/net/wireless/realtek/rtw89/ser.h +f:drivers/net/wireless/realtek/rtw89/txrx.h +f:drivers/net/wireless/realtek/rtw89/usb.c +f:drivers/net/wireless/realtek/rtw89/usb.h +f:drivers/net/wireless/realtek/rtw89/util.c +f:drivers/net/wireless/realtek/rtw89/util.h +f:drivers/net/wireless/realtek/rtw89/wow.c +f:drivers/net/wireless/realtek/rtw89/wow.h +f:drivers/net/wireless/rsi/Kconfig +f:drivers/net/wireless/rsi/Makefile +f:drivers/net/wireless/rsi/rsi_91x_coex.c +f:drivers/net/wireless/rsi/rsi_91x_core.c +f:drivers/net/wireless/rsi/rsi_91x_debugfs.c +f:drivers/net/wireless/rsi/rsi_91x_hal.c +f:drivers/net/wireless/rsi/rsi_91x_mac80211.c +f:drivers/net/wireless/rsi/rsi_91x_main.c +f:drivers/net/wireless/rsi/rsi_91x_mgmt.c +f:drivers/net/wireless/rsi/rsi_91x_ps.c +f:drivers/net/wireless/rsi/rsi_91x_sdio.c +f:drivers/net/wireless/rsi/rsi_91x_sdio_ops.c +f:drivers/net/wireless/rsi/rsi_91x_usb.c +f:drivers/net/wireless/rsi/rsi_91x_usb_ops.c +f:drivers/net/wireless/rsi/rsi_boot_params.h +f:drivers/net/wireless/rsi/rsi_coex.h +f:drivers/net/wireless/rsi/rsi_common.h +f:drivers/net/wireless/rsi/rsi_debugfs.h +f:drivers/net/wireless/rsi/rsi_hal.h +f:drivers/net/wireless/rsi/rsi_main.h +f:drivers/net/wireless/rsi/rsi_mgmt.h +f:drivers/net/wireless/rsi/rsi_ps.h +f:drivers/net/wireless/rsi/rsi_sdio.h +f:drivers/net/wireless/rsi/rsi_usb.h +f:drivers/net/wireless/silabs/Kconfig +f:drivers/net/wireless/silabs/Makefile +f:drivers/net/wireless/silabs/wfx/Kconfig +f:drivers/net/wireless/silabs/wfx/Makefile +f:drivers/net/wireless/silabs/wfx/bh.c +f:drivers/net/wireless/silabs/wfx/bh.h +f:drivers/net/wireless/silabs/wfx/bus.h +f:drivers/net/wireless/silabs/wfx/bus_sdio.c +f:drivers/net/wireless/silabs/wfx/bus_spi.c +f:drivers/net/wireless/silabs/wfx/data_rx.c +f:drivers/net/wireless/silabs/wfx/data_rx.h +f:drivers/net/wireless/silabs/wfx/data_tx.c +f:drivers/net/wireless/silabs/wfx/data_tx.h +f:drivers/net/wireless/silabs/wfx/debug.c +f:drivers/net/wireless/silabs/wfx/debug.h +f:drivers/net/wireless/silabs/wfx/fwio.c +f:drivers/net/wireless/silabs/wfx/fwio.h +f:drivers/net/wireless/silabs/wfx/hif_api_cmd.h +f:drivers/net/wireless/silabs/wfx/hif_api_general.h +f:drivers/net/wireless/silabs/wfx/hif_api_mib.h +f:drivers/net/wireless/silabs/wfx/hif_rx.c +f:drivers/net/wireless/silabs/wfx/hif_rx.h +f:drivers/net/wireless/silabs/wfx/hif_tx.c +f:drivers/net/wireless/silabs/wfx/hif_tx.h +f:drivers/net/wireless/silabs/wfx/hif_tx_mib.c +f:drivers/net/wireless/silabs/wfx/hif_tx_mib.h +f:drivers/net/wireless/silabs/wfx/hwio.c +f:drivers/net/wireless/silabs/wfx/hwio.h +f:drivers/net/wireless/silabs/wfx/key.c +f:drivers/net/wireless/silabs/wfx/key.h +f:drivers/net/wireless/silabs/wfx/main.c +f:drivers/net/wireless/silabs/wfx/main.h +f:drivers/net/wireless/silabs/wfx/queue.c +f:drivers/net/wireless/silabs/wfx/queue.h +f:drivers/net/wireless/silabs/wfx/scan.c +f:drivers/net/wireless/silabs/wfx/scan.h +f:drivers/net/wireless/silabs/wfx/sta.c +f:drivers/net/wireless/silabs/wfx/sta.h +f:drivers/net/wireless/silabs/wfx/traces.h +f:drivers/net/wireless/silabs/wfx/wfx.h +f:drivers/net/wireless/st/Kconfig +f:drivers/net/wireless/st/Makefile +f:drivers/net/wireless/st/cw1200/Kconfig +f:drivers/net/wireless/st/cw1200/Makefile +f:drivers/net/wireless/st/cw1200/bh.c +f:drivers/net/wireless/st/cw1200/bh.h +f:drivers/net/wireless/st/cw1200/cw1200.h +f:drivers/net/wireless/st/cw1200/cw1200_sdio.c +f:drivers/net/wireless/st/cw1200/cw1200_spi.c +f:drivers/net/wireless/st/cw1200/debug.c +f:drivers/net/wireless/st/cw1200/debug.h +f:drivers/net/wireless/st/cw1200/fwio.c +f:drivers/net/wireless/st/cw1200/fwio.h +f:drivers/net/wireless/st/cw1200/hwbus.h +f:drivers/net/wireless/st/cw1200/hwio.c +f:drivers/net/wireless/st/cw1200/hwio.h +f:drivers/net/wireless/st/cw1200/main.c +f:drivers/net/wireless/st/cw1200/pm.c +f:drivers/net/wireless/st/cw1200/pm.h +f:drivers/net/wireless/st/cw1200/queue.c +f:drivers/net/wireless/st/cw1200/queue.h +f:drivers/net/wireless/st/cw1200/scan.c +f:drivers/net/wireless/st/cw1200/scan.h +f:drivers/net/wireless/st/cw1200/sta.c +f:drivers/net/wireless/st/cw1200/sta.h +f:drivers/net/wireless/st/cw1200/txrx.c +f:drivers/net/wireless/st/cw1200/txrx.h +f:drivers/net/wireless/st/cw1200/wsm.c +f:drivers/net/wireless/st/cw1200/wsm.h +f:drivers/net/wireless/ti/Kconfig +f:drivers/net/wireless/ti/Makefile +f:drivers/net/wireless/ti/wl1251/Kconfig +f:drivers/net/wireless/ti/wl1251/Makefile +f:drivers/net/wireless/ti/wl1251/acx.c +f:drivers/net/wireless/ti/wl1251/acx.h +f:drivers/net/wireless/ti/wl1251/boot.c +f:drivers/net/wireless/ti/wl1251/boot.h +f:drivers/net/wireless/ti/wl1251/cmd.c +f:drivers/net/wireless/ti/wl1251/cmd.h +f:drivers/net/wireless/ti/wl1251/debugfs.c +f:drivers/net/wireless/ti/wl1251/debugfs.h +f:drivers/net/wireless/ti/wl1251/event.c +f:drivers/net/wireless/ti/wl1251/event.h +f:drivers/net/wireless/ti/wl1251/init.c +f:drivers/net/wireless/ti/wl1251/init.h +f:drivers/net/wireless/ti/wl1251/io.c +f:drivers/net/wireless/ti/wl1251/io.h +f:drivers/net/wireless/ti/wl1251/main.c +f:drivers/net/wireless/ti/wl1251/ps.c +f:drivers/net/wireless/ti/wl1251/ps.h +f:drivers/net/wireless/ti/wl1251/reg.h +f:drivers/net/wireless/ti/wl1251/rx.c +f:drivers/net/wireless/ti/wl1251/rx.h +f:drivers/net/wireless/ti/wl1251/sdio.c +f:drivers/net/wireless/ti/wl1251/spi.c +f:drivers/net/wireless/ti/wl1251/spi.h +f:drivers/net/wireless/ti/wl1251/tx.c +f:drivers/net/wireless/ti/wl1251/tx.h +f:drivers/net/wireless/ti/wl1251/wl1251.h +f:drivers/net/wireless/ti/wl1251/wl12xx_80211.h +f:drivers/net/wireless/ti/wl12xx/Kconfig +f:drivers/net/wireless/ti/wl12xx/Makefile +f:drivers/net/wireless/ti/wl12xx/acx.c +f:drivers/net/wireless/ti/wl12xx/acx.h +f:drivers/net/wireless/ti/wl12xx/cmd.c +f:drivers/net/wireless/ti/wl12xx/cmd.h +f:drivers/net/wireless/ti/wl12xx/conf.h +f:drivers/net/wireless/ti/wl12xx/debugfs.c +f:drivers/net/wireless/ti/wl12xx/debugfs.h +f:drivers/net/wireless/ti/wl12xx/event.c +f:drivers/net/wireless/ti/wl12xx/event.h +f:drivers/net/wireless/ti/wl12xx/main.c +f:drivers/net/wireless/ti/wl12xx/reg.h +f:drivers/net/wireless/ti/wl12xx/scan.c +f:drivers/net/wireless/ti/wl12xx/scan.h +f:drivers/net/wireless/ti/wl12xx/wl12xx.h +f:drivers/net/wireless/ti/wl18xx/Kconfig +f:drivers/net/wireless/ti/wl18xx/Makefile +f:drivers/net/wireless/ti/wl18xx/acx.c +f:drivers/net/wireless/ti/wl18xx/acx.h +f:drivers/net/wireless/ti/wl18xx/cmd.c +f:drivers/net/wireless/ti/wl18xx/cmd.h +f:drivers/net/wireless/ti/wl18xx/conf.h +f:drivers/net/wireless/ti/wl18xx/debugfs.c +f:drivers/net/wireless/ti/wl18xx/debugfs.h +f:drivers/net/wireless/ti/wl18xx/event.c +f:drivers/net/wireless/ti/wl18xx/event.h +f:drivers/net/wireless/ti/wl18xx/io.c +f:drivers/net/wireless/ti/wl18xx/io.h +f:drivers/net/wireless/ti/wl18xx/main.c +f:drivers/net/wireless/ti/wl18xx/reg.h +f:drivers/net/wireless/ti/wl18xx/scan.c +f:drivers/net/wireless/ti/wl18xx/scan.h +f:drivers/net/wireless/ti/wl18xx/tx.c +f:drivers/net/wireless/ti/wl18xx/tx.h +f:drivers/net/wireless/ti/wl18xx/wl18xx.h +f:drivers/net/wireless/ti/wlcore/Kconfig +f:drivers/net/wireless/ti/wlcore/Makefile +f:drivers/net/wireless/ti/wlcore/acx.c +f:drivers/net/wireless/ti/wlcore/acx.h +f:drivers/net/wireless/ti/wlcore/boot.c +f:drivers/net/wireless/ti/wlcore/boot.h +f:drivers/net/wireless/ti/wlcore/cmd.c +f:drivers/net/wireless/ti/wlcore/cmd.h +f:drivers/net/wireless/ti/wlcore/conf.h +f:drivers/net/wireless/ti/wlcore/debug.h +f:drivers/net/wireless/ti/wlcore/debugfs.c +f:drivers/net/wireless/ti/wlcore/debugfs.h +f:drivers/net/wireless/ti/wlcore/event.c +f:drivers/net/wireless/ti/wlcore/event.h +f:drivers/net/wireless/ti/wlcore/hw_ops.h +f:drivers/net/wireless/ti/wlcore/ini.h +f:drivers/net/wireless/ti/wlcore/init.c +f:drivers/net/wireless/ti/wlcore/init.h +f:drivers/net/wireless/ti/wlcore/io.c +f:drivers/net/wireless/ti/wlcore/io.h +f:drivers/net/wireless/ti/wlcore/main.c +f:drivers/net/wireless/ti/wlcore/ps.c +f:drivers/net/wireless/ti/wlcore/ps.h +f:drivers/net/wireless/ti/wlcore/rx.c +f:drivers/net/wireless/ti/wlcore/rx.h +f:drivers/net/wireless/ti/wlcore/scan.c +f:drivers/net/wireless/ti/wlcore/scan.h +f:drivers/net/wireless/ti/wlcore/sdio.c +f:drivers/net/wireless/ti/wlcore/spi.c +f:drivers/net/wireless/ti/wlcore/sysfs.c +f:drivers/net/wireless/ti/wlcore/sysfs.h +f:drivers/net/wireless/ti/wlcore/testmode.c +f:drivers/net/wireless/ti/wlcore/testmode.h +f:drivers/net/wireless/ti/wlcore/tx.c +f:drivers/net/wireless/ti/wlcore/tx.h +f:drivers/net/wireless/ti/wlcore/vendor_cmd.c +f:drivers/net/wireless/ti/wlcore/vendor_cmd.h +f:drivers/net/wireless/ti/wlcore/wl12xx_80211.h +f:drivers/net/wireless/ti/wlcore/wlcore.h +f:drivers/net/wireless/ti/wlcore/wlcore_i.h +f:drivers/net/wireless/virtual/Kconfig +f:drivers/net/wireless/virtual/Makefile +f:drivers/net/wireless/virtual/mac80211_hwsim.c +f:drivers/net/wireless/virtual/mac80211_hwsim.h +f:drivers/net/wireless/virtual/virt_wifi.c +f:drivers/net/wireless/zydas/Kconfig +f:drivers/net/wireless/zydas/Makefile +f:drivers/net/wireless/zydas/zd1211rw/Kconfig +f:drivers/net/wireless/zydas/zd1211rw/Makefile +f:drivers/net/wireless/zydas/zd1211rw/zd_chip.c +f:drivers/net/wireless/zydas/zd1211rw/zd_chip.h +f:drivers/net/wireless/zydas/zd1211rw/zd_def.h +f:drivers/net/wireless/zydas/zd1211rw/zd_mac.c +f:drivers/net/wireless/zydas/zd1211rw/zd_mac.h +f:drivers/net/wireless/zydas/zd1211rw/zd_rf.c +f:drivers/net/wireless/zydas/zd1211rw/zd_rf.h +f:drivers/net/wireless/zydas/zd1211rw/zd_rf_al2230.c +f:drivers/net/wireless/zydas/zd1211rw/zd_rf_al7230b.c +f:drivers/net/wireless/zydas/zd1211rw/zd_rf_rf2959.c +f:drivers/net/wireless/zydas/zd1211rw/zd_rf_uw2453.c +f:drivers/net/wireless/zydas/zd1211rw/zd_usb.c +f:drivers/net/wireless/zydas/zd1211rw/zd_usb.h +f:drivers/net/wwan/Kconfig +f:drivers/net/wwan/Makefile +f:drivers/net/wwan/iosm/Makefile +f:drivers/net/wwan/iosm/iosm_ipc_chnl_cfg.c +f:drivers/net/wwan/iosm/iosm_ipc_chnl_cfg.h +f:drivers/net/wwan/iosm/iosm_ipc_coredump.c +f:drivers/net/wwan/iosm/iosm_ipc_coredump.h +f:drivers/net/wwan/iosm/iosm_ipc_debugfs.c +f:drivers/net/wwan/iosm/iosm_ipc_debugfs.h +f:drivers/net/wwan/iosm/iosm_ipc_devlink.c +f:drivers/net/wwan/iosm/iosm_ipc_devlink.h +f:drivers/net/wwan/iosm/iosm_ipc_flash.c +f:drivers/net/wwan/iosm/iosm_ipc_flash.h +f:drivers/net/wwan/iosm/iosm_ipc_imem.c +f:drivers/net/wwan/iosm/iosm_ipc_imem.h +f:drivers/net/wwan/iosm/iosm_ipc_imem_ops.c +f:drivers/net/wwan/iosm/iosm_ipc_imem_ops.h +f:drivers/net/wwan/iosm/iosm_ipc_irq.c +f:drivers/net/wwan/iosm/iosm_ipc_irq.h +f:drivers/net/wwan/iosm/iosm_ipc_mmio.c +f:drivers/net/wwan/iosm/iosm_ipc_mmio.h +f:drivers/net/wwan/iosm/iosm_ipc_mux.c +f:drivers/net/wwan/iosm/iosm_ipc_mux.h +f:drivers/net/wwan/iosm/iosm_ipc_mux_codec.c +f:drivers/net/wwan/iosm/iosm_ipc_mux_codec.h +f:drivers/net/wwan/iosm/iosm_ipc_pcie.c +f:drivers/net/wwan/iosm/iosm_ipc_pcie.h +f:drivers/net/wwan/iosm/iosm_ipc_pm.c +f:drivers/net/wwan/iosm/iosm_ipc_pm.h +f:drivers/net/wwan/iosm/iosm_ipc_port.c +f:drivers/net/wwan/iosm/iosm_ipc_port.h +f:drivers/net/wwan/iosm/iosm_ipc_protocol.c +f:drivers/net/wwan/iosm/iosm_ipc_protocol.h +f:drivers/net/wwan/iosm/iosm_ipc_protocol_ops.c +f:drivers/net/wwan/iosm/iosm_ipc_protocol_ops.h +f:drivers/net/wwan/iosm/iosm_ipc_task_queue.c +f:drivers/net/wwan/iosm/iosm_ipc_task_queue.h +f:drivers/net/wwan/iosm/iosm_ipc_trace.c +f:drivers/net/wwan/iosm/iosm_ipc_trace.h +f:drivers/net/wwan/iosm/iosm_ipc_uevent.c +f:drivers/net/wwan/iosm/iosm_ipc_uevent.h +f:drivers/net/wwan/iosm/iosm_ipc_wwan.c +f:drivers/net/wwan/iosm/iosm_ipc_wwan.h +f:drivers/net/wwan/mhi_wwan_ctrl.c +f:drivers/net/wwan/mhi_wwan_mbim.c +f:drivers/net/wwan/qcom_bam_dmux.c +f:drivers/net/wwan/rpmsg_wwan_ctrl.c +f:drivers/net/wwan/t7xx/Makefile +f:drivers/net/wwan/t7xx/t7xx_cldma.c +f:drivers/net/wwan/t7xx/t7xx_cldma.h +f:drivers/net/wwan/t7xx/t7xx_dpmaif.c +f:drivers/net/wwan/t7xx/t7xx_dpmaif.h +f:drivers/net/wwan/t7xx/t7xx_hif_cldma.c +f:drivers/net/wwan/t7xx/t7xx_hif_cldma.h +f:drivers/net/wwan/t7xx/t7xx_hif_dpmaif.c +f:drivers/net/wwan/t7xx/t7xx_hif_dpmaif.h +f:drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c +f:drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.h +f:drivers/net/wwan/t7xx/t7xx_hif_dpmaif_tx.c +f:drivers/net/wwan/t7xx/t7xx_hif_dpmaif_tx.h +f:drivers/net/wwan/t7xx/t7xx_mhccif.c +f:drivers/net/wwan/t7xx/t7xx_mhccif.h +f:drivers/net/wwan/t7xx/t7xx_modem_ops.c +f:drivers/net/wwan/t7xx/t7xx_modem_ops.h +f:drivers/net/wwan/t7xx/t7xx_netdev.c +f:drivers/net/wwan/t7xx/t7xx_netdev.h +f:drivers/net/wwan/t7xx/t7xx_pci.c +f:drivers/net/wwan/t7xx/t7xx_pci.h +f:drivers/net/wwan/t7xx/t7xx_pcie_mac.c +f:drivers/net/wwan/t7xx/t7xx_pcie_mac.h +f:drivers/net/wwan/t7xx/t7xx_port.h +f:drivers/net/wwan/t7xx/t7xx_port_ctrl_msg.c +f:drivers/net/wwan/t7xx/t7xx_port_proxy.c +f:drivers/net/wwan/t7xx/t7xx_port_proxy.h +f:drivers/net/wwan/t7xx/t7xx_port_trace.c +f:drivers/net/wwan/t7xx/t7xx_port_wwan.c +f:drivers/net/wwan/t7xx/t7xx_reg.h +f:drivers/net/wwan/t7xx/t7xx_state_monitor.c +f:drivers/net/wwan/t7xx/t7xx_state_monitor.h +f:drivers/net/wwan/wwan_core.c +f:drivers/net/wwan/wwan_hwsim.c +f:drivers/net/xen-netback/Makefile +f:drivers/net/xen-netback/common.h +f:drivers/net/xen-netback/hash.c +f:drivers/net/xen-netback/interface.c +f:drivers/net/xen-netback/netback.c +f:drivers/net/xen-netback/rx.c +f:drivers/net/xen-netback/xenbus.c +f:drivers/net/xen-netfront.c +f:drivers/nfc/Kconfig +f:drivers/nfc/Makefile +f:drivers/nfc/fdp/Kconfig +f:drivers/nfc/fdp/Makefile +f:drivers/nfc/fdp/fdp.c +f:drivers/nfc/fdp/fdp.h +f:drivers/nfc/fdp/i2c.c +f:drivers/nfc/mei_phy.c +f:drivers/nfc/mei_phy.h +f:drivers/nfc/microread/Kconfig +f:drivers/nfc/microread/Makefile +f:drivers/nfc/microread/i2c.c +f:drivers/nfc/microread/mei.c +f:drivers/nfc/microread/microread.c +f:drivers/nfc/microread/microread.h +f:drivers/nfc/nfcmrvl/Kconfig +f:drivers/nfc/nfcmrvl/Makefile +f:drivers/nfc/nfcmrvl/fw_dnld.c +f:drivers/nfc/nfcmrvl/fw_dnld.h +f:drivers/nfc/nfcmrvl/i2c.c +f:drivers/nfc/nfcmrvl/main.c +f:drivers/nfc/nfcmrvl/nfcmrvl.h +f:drivers/nfc/nfcmrvl/spi.c +f:drivers/nfc/nfcmrvl/uart.c +f:drivers/nfc/nfcmrvl/usb.c +f:drivers/nfc/nfcsim.c +f:drivers/nfc/nxp-nci/Kconfig +f:drivers/nfc/nxp-nci/Makefile +f:drivers/nfc/nxp-nci/core.c +f:drivers/nfc/nxp-nci/firmware.c +f:drivers/nfc/nxp-nci/i2c.c +f:drivers/nfc/nxp-nci/nxp-nci.h +f:drivers/nfc/pn533/Kconfig +f:drivers/nfc/pn533/Makefile +f:drivers/nfc/pn533/i2c.c +f:drivers/nfc/pn533/pn533.c +f:drivers/nfc/pn533/pn533.h +f:drivers/nfc/pn533/uart.c +f:drivers/nfc/pn533/usb.c +f:drivers/nfc/pn544/Kconfig +f:drivers/nfc/pn544/Makefile +f:drivers/nfc/pn544/i2c.c +f:drivers/nfc/pn544/mei.c +f:drivers/nfc/pn544/pn544.c +f:drivers/nfc/pn544/pn544.h +f:drivers/nfc/port100.c +f:drivers/nfc/s3fwrn5/Kconfig +f:drivers/nfc/s3fwrn5/Makefile +f:drivers/nfc/s3fwrn5/core.c +f:drivers/nfc/s3fwrn5/firmware.c +f:drivers/nfc/s3fwrn5/firmware.h +f:drivers/nfc/s3fwrn5/i2c.c +f:drivers/nfc/s3fwrn5/nci.c +f:drivers/nfc/s3fwrn5/nci.h +f:drivers/nfc/s3fwrn5/phy_common.c +f:drivers/nfc/s3fwrn5/phy_common.h +f:drivers/nfc/s3fwrn5/s3fwrn5.h +f:drivers/nfc/s3fwrn5/uart.c +f:drivers/nfc/st-nci/Kconfig +f:drivers/nfc/st-nci/Makefile +f:drivers/nfc/st-nci/core.c +f:drivers/nfc/st-nci/i2c.c +f:drivers/nfc/st-nci/ndlc.c +f:drivers/nfc/st-nci/ndlc.h +f:drivers/nfc/st-nci/se.c +f:drivers/nfc/st-nci/spi.c +f:drivers/nfc/st-nci/st-nci.h +f:drivers/nfc/st-nci/vendor_cmds.c +f:drivers/nfc/st21nfca/Kconfig +f:drivers/nfc/st21nfca/Makefile +f:drivers/nfc/st21nfca/core.c +f:drivers/nfc/st21nfca/dep.c +f:drivers/nfc/st21nfca/i2c.c +f:drivers/nfc/st21nfca/se.c +f:drivers/nfc/st21nfca/st21nfca.h +f:drivers/nfc/st21nfca/vendor_cmds.c +f:drivers/nfc/st95hf/Kconfig +f:drivers/nfc/st95hf/Makefile +f:drivers/nfc/st95hf/core.c +f:drivers/nfc/st95hf/spi.c +f:drivers/nfc/st95hf/spi.h +f:drivers/nfc/trf7970a.c +f:drivers/nfc/virtual_ncidev.c +f:drivers/ntb/Kconfig +f:drivers/ntb/Makefile +f:drivers/ntb/core.c +f:drivers/ntb/hw/Kconfig +f:drivers/ntb/hw/Makefile +f:drivers/ntb/hw/amd/Kconfig +f:drivers/ntb/hw/amd/Makefile +f:drivers/ntb/hw/amd/ntb_hw_amd.c +f:drivers/ntb/hw/amd/ntb_hw_amd.h +f:drivers/ntb/hw/epf/Kconfig +f:drivers/ntb/hw/epf/Makefile +f:drivers/ntb/hw/epf/ntb_hw_epf.c +f:drivers/ntb/hw/idt/Kconfig +f:drivers/ntb/hw/idt/Makefile +f:drivers/ntb/hw/idt/ntb_hw_idt.c +f:drivers/ntb/hw/idt/ntb_hw_idt.h +f:drivers/ntb/hw/intel/Kconfig +f:drivers/ntb/hw/intel/Makefile +f:drivers/ntb/hw/intel/ntb_hw_gen1.c +f:drivers/ntb/hw/intel/ntb_hw_gen1.h +f:drivers/ntb/hw/intel/ntb_hw_gen3.c +f:drivers/ntb/hw/intel/ntb_hw_gen3.h +f:drivers/ntb/hw/intel/ntb_hw_gen4.c +f:drivers/ntb/hw/intel/ntb_hw_gen4.h +f:drivers/ntb/hw/intel/ntb_hw_intel.h +f:drivers/ntb/hw/mscc/Kconfig +f:drivers/ntb/hw/mscc/Makefile +f:drivers/ntb/hw/mscc/ntb_hw_switchtec.c +f:drivers/ntb/msi.c +f:drivers/ntb/ntb_transport.c +f:drivers/ntb/test/Kconfig +f:drivers/ntb/test/Makefile +f:drivers/ntb/test/ntb_msi_test.c +f:drivers/ntb/test/ntb_perf.c +f:drivers/ntb/test/ntb_pingpong.c +f:drivers/ntb/test/ntb_tool.c +f:drivers/nubus/Makefile +f:drivers/nubus/bus.c +f:drivers/nubus/nubus.c +f:drivers/nubus/proc.c +f:drivers/nvdimm/Kconfig +f:drivers/nvdimm/Makefile +f:drivers/nvdimm/badrange.c +f:drivers/nvdimm/btt.c +f:drivers/nvdimm/btt.h +f:drivers/nvdimm/btt_devs.c +f:drivers/nvdimm/bus.c +f:drivers/nvdimm/claim.c +f:drivers/nvdimm/core.c +f:drivers/nvdimm/dax_devs.c +f:drivers/nvdimm/dimm.c +f:drivers/nvdimm/dimm_devs.c +f:drivers/nvdimm/e820.c +f:drivers/nvdimm/label.c +f:drivers/nvdimm/label.h +f:drivers/nvdimm/namespace_devs.c +f:drivers/nvdimm/nd-core.h +f:drivers/nvdimm/nd.h +f:drivers/nvdimm/nd_perf.c +f:drivers/nvdimm/nd_virtio.c +f:drivers/nvdimm/of_pmem.c +f:drivers/nvdimm/pfn.h +f:drivers/nvdimm/pfn_devs.c +f:drivers/nvdimm/pmem.c +f:drivers/nvdimm/pmem.h +f:drivers/nvdimm/region.c +f:drivers/nvdimm/region_devs.c +f:drivers/nvdimm/security.c +f:drivers/nvdimm/virtio_pmem.c +f:drivers/nvdimm/virtio_pmem.h +f:drivers/nvme/Kconfig +f:drivers/nvme/Makefile +f:drivers/nvme/common/Kconfig +f:drivers/nvme/common/Makefile +f:drivers/nvme/common/auth.c +f:drivers/nvme/common/keyring.c +f:drivers/nvme/host/Kconfig +f:drivers/nvme/host/Makefile +f:drivers/nvme/host/apple.c +f:drivers/nvme/host/auth.c +f:drivers/nvme/host/constants.c +f:drivers/nvme/host/core.c +f:drivers/nvme/host/fabrics.c +f:drivers/nvme/host/fabrics.h +f:drivers/nvme/host/fault_inject.c +f:drivers/nvme/host/fc.c +f:drivers/nvme/host/fc.h +f:drivers/nvme/host/hwmon.c +f:drivers/nvme/host/ioctl.c +f:drivers/nvme/host/multipath.c +f:drivers/nvme/host/nvme.h +f:drivers/nvme/host/pci.c +f:drivers/nvme/host/pr.c +f:drivers/nvme/host/rdma.c +f:drivers/nvme/host/sysfs.c +f:drivers/nvme/host/tcp.c +f:drivers/nvme/host/trace.c +f:drivers/nvme/host/trace.h +f:drivers/nvme/host/zns.c +f:drivers/nvme/target/Kconfig +f:drivers/nvme/target/Makefile +f:drivers/nvme/target/admin-cmd.c +f:drivers/nvme/target/auth.c +f:drivers/nvme/target/configfs.c +f:drivers/nvme/target/core.c +f:drivers/nvme/target/debugfs.c +f:drivers/nvme/target/debugfs.h +f:drivers/nvme/target/discovery.c +f:drivers/nvme/target/fabrics-cmd-auth.c +f:drivers/nvme/target/fabrics-cmd.c +f:drivers/nvme/target/fc.c +f:drivers/nvme/target/fcloop.c +f:drivers/nvme/target/io-cmd-bdev.c +f:drivers/nvme/target/io-cmd-file.c +f:drivers/nvme/target/loop.c +f:drivers/nvme/target/nvmet.h +f:drivers/nvme/target/passthru.c +f:drivers/nvme/target/pci-epf.c +f:drivers/nvme/target/pr.c +f:drivers/nvme/target/rdma.c +f:drivers/nvme/target/tcp.c +f:drivers/nvme/target/trace.c +f:drivers/nvme/target/trace.h +f:drivers/nvme/target/zns.c +f:drivers/nvmem/Kconfig +f:drivers/nvmem/Makefile +f:drivers/nvmem/apple-efuses.c +f:drivers/nvmem/apple-spmi-nvmem.c +f:drivers/nvmem/bcm-ocotp.c +f:drivers/nvmem/brcm_nvram.c +f:drivers/nvmem/core.c +f:drivers/nvmem/imx-iim.c +f:drivers/nvmem/imx-ocotp-ele.c +f:drivers/nvmem/imx-ocotp-scu.c +f:drivers/nvmem/imx-ocotp.c +f:drivers/nvmem/internals.h +f:drivers/nvmem/jz4780-efuse.c +f:drivers/nvmem/lan9662-otpc.c +f:drivers/nvmem/layerscape-sfp.c +f:drivers/nvmem/layouts.c +f:drivers/nvmem/layouts/Kconfig +f:drivers/nvmem/layouts/Makefile +f:drivers/nvmem/layouts/onie-tlv.c +f:drivers/nvmem/layouts/sl28vpd.c +f:drivers/nvmem/layouts/u-boot-env.c +f:drivers/nvmem/layouts/u-boot-env.h +f:drivers/nvmem/lpc18xx_eeprom.c +f:drivers/nvmem/lpc18xx_otp.c +f:drivers/nvmem/max77759-nvmem.c +f:drivers/nvmem/meson-efuse.c +f:drivers/nvmem/meson-mx-efuse.c +f:drivers/nvmem/microchip-otpc.c +f:drivers/nvmem/mtk-efuse.c +f:drivers/nvmem/mxs-ocotp.c +f:drivers/nvmem/nintendo-otp.c +f:drivers/nvmem/qcom-spmi-sdam.c +f:drivers/nvmem/qfprom.c +f:drivers/nvmem/qoriq-efuse.c +f:drivers/nvmem/rave-sp-eeprom.c +f:drivers/nvmem/rcar-efuse.c +f:drivers/nvmem/rmem.c +f:drivers/nvmem/rockchip-efuse.c +f:drivers/nvmem/rockchip-otp.c +f:drivers/nvmem/sc27xx-efuse.c +f:drivers/nvmem/sec-qfprom.c +f:drivers/nvmem/snvs_lpgpr.c +f:drivers/nvmem/sprd-efuse.c +f:drivers/nvmem/stm32-bsec-optee-ta.c +f:drivers/nvmem/stm32-bsec-optee-ta.h +f:drivers/nvmem/stm32-romem.c +f:drivers/nvmem/sunplus-ocotp.c +f:drivers/nvmem/sunxi_sid.c +f:drivers/nvmem/u-boot-env.c +f:drivers/nvmem/uniphier-efuse.c +f:drivers/nvmem/vf610-ocotp.c +f:drivers/nvmem/zynqmp_nvmem.c +f:drivers/of/.kunitconfig +f:drivers/of/Kconfig +f:drivers/of/Makefile +f:drivers/of/address.c +f:drivers/of/base.c +f:drivers/of/cpu.c +f:drivers/of/device.c +f:drivers/of/dynamic.c +f:drivers/of/empty_root.dts +f:drivers/of/fdt.c +f:drivers/of/fdt_address.c +f:drivers/of/irq.c +f:drivers/of/kexec.c +f:drivers/of/kobj.c +f:drivers/of/kunit_overlay_test.dtso +f:drivers/of/module.c +f:drivers/of/of_kunit_helpers.c +f:drivers/of/of_numa.c +f:drivers/of/of_private.h +f:drivers/of/of_reserved_mem.c +f:drivers/of/of_test.c +f:drivers/of/overlay.c +f:drivers/of/overlay_test.c +f:drivers/of/pdt.c +f:drivers/of/platform.c +f:drivers/of/property.c +f:drivers/of/resolver.c +f:drivers/of/unittest-data/Makefile +f:drivers/of/unittest-data/overlay.dtso +f:drivers/of/unittest-data/overlay_0.dtso +f:drivers/of/unittest-data/overlay_1.dtso +f:drivers/of/unittest-data/overlay_10.dtso +f:drivers/of/unittest-data/overlay_11.dtso +f:drivers/of/unittest-data/overlay_12.dtso +f:drivers/of/unittest-data/overlay_13.dtso +f:drivers/of/unittest-data/overlay_15.dtso +f:drivers/of/unittest-data/overlay_16.dtso +f:drivers/of/unittest-data/overlay_17.dtso +f:drivers/of/unittest-data/overlay_18.dtso +f:drivers/of/unittest-data/overlay_19.dtso +f:drivers/of/unittest-data/overlay_2.dtso +f:drivers/of/unittest-data/overlay_20.dtso +f:drivers/of/unittest-data/overlay_3.dtso +f:drivers/of/unittest-data/overlay_4.dtso +f:drivers/of/unittest-data/overlay_5.dtso +f:drivers/of/unittest-data/overlay_6.dtso +f:drivers/of/unittest-data/overlay_7.dtso +f:drivers/of/unittest-data/overlay_8.dtso +f:drivers/of/unittest-data/overlay_9.dtso +f:drivers/of/unittest-data/overlay_bad_add_dup_node.dtso +f:drivers/of/unittest-data/overlay_bad_add_dup_prop.dtso +f:drivers/of/unittest-data/overlay_bad_phandle.dtso +f:drivers/of/unittest-data/overlay_bad_symbol.dtso +f:drivers/of/unittest-data/overlay_bad_unresolved.dtso +f:drivers/of/unittest-data/overlay_base.dtso +f:drivers/of/unittest-data/overlay_common.dtsi +f:drivers/of/unittest-data/overlay_gpio_01.dtso +f:drivers/of/unittest-data/overlay_gpio_02a.dtso +f:drivers/of/unittest-data/overlay_gpio_02b.dtso +f:drivers/of/unittest-data/overlay_gpio_03.dtso +f:drivers/of/unittest-data/overlay_gpio_04a.dtso +f:drivers/of/unittest-data/overlay_gpio_04b.dtso +f:drivers/of/unittest-data/overlay_pci_node.dtso +f:drivers/of/unittest-data/static_base_1.dts +f:drivers/of/unittest-data/static_base_2.dts +f:drivers/of/unittest-data/testcases.dtso +f:drivers/of/unittest-data/testcases_common.dtsi +f:drivers/of/unittest-data/tests-address.dtsi +f:drivers/of/unittest-data/tests-interrupts.dtsi +f:drivers/of/unittest-data/tests-lifecycle.dtsi +f:drivers/of/unittest-data/tests-match.dtsi +f:drivers/of/unittest-data/tests-overlay.dtsi +f:drivers/of/unittest-data/tests-phandle.dtsi +f:drivers/of/unittest-data/tests-platform.dtsi +f:drivers/of/unittest.c +f:drivers/opp/Kconfig +f:drivers/opp/Makefile +f:drivers/opp/core.c +f:drivers/opp/cpu.c +f:drivers/opp/debugfs.c +f:drivers/opp/of.c +f:drivers/opp/opp.h +f:drivers/opp/ti-opp-supply.c +f:drivers/parisc/Kconfig +f:drivers/parisc/Makefile +f:drivers/parisc/README.dino +f:drivers/parisc/asp.c +f:drivers/parisc/ccio-dma.c +f:drivers/parisc/dino.c +f:drivers/parisc/eisa.c +f:drivers/parisc/eisa_eeprom.c +f:drivers/parisc/eisa_enumerator.c +f:drivers/parisc/gsc.c +f:drivers/parisc/gsc.h +f:drivers/parisc/hppb.c +f:drivers/parisc/iommu-helpers.h +f:drivers/parisc/iommu.h +f:drivers/parisc/iosapic.c +f:drivers/parisc/iosapic_private.h +f:drivers/parisc/lasi.c +f:drivers/parisc/lba_pci.c +f:drivers/parisc/led.c +f:drivers/parisc/pdc_stable.c +f:drivers/parisc/power.c +f:drivers/parisc/sba_iommu.c +f:drivers/parisc/superio.c +f:drivers/parisc/wax.c +f:drivers/parport/BUGS-parport +f:drivers/parport/Kconfig +f:drivers/parport/Makefile +f:drivers/parport/TODO-parport +f:drivers/parport/daisy.c +f:drivers/parport/ieee1284.c +f:drivers/parport/ieee1284_ops.c +f:drivers/parport/multiface.h +f:drivers/parport/parport_amiga.c +f:drivers/parport/parport_atari.c +f:drivers/parport/parport_cs.c +f:drivers/parport/parport_gsc.c +f:drivers/parport/parport_gsc.h +f:drivers/parport/parport_ip32.c +f:drivers/parport/parport_mfc3.c +f:drivers/parport/parport_pc.c +f:drivers/parport/parport_serial.c +f:drivers/parport/parport_sunbpp.c +f:drivers/parport/probe.c +f:drivers/parport/procfs.c +f:drivers/parport/share.c +f:drivers/pci/Kconfig +f:drivers/pci/Makefile +f:drivers/pci/access.c +f:drivers/pci/ats.c +f:drivers/pci/bus.c +f:drivers/pci/controller/Kconfig +f:drivers/pci/controller/Makefile +f:drivers/pci/controller/cadence/Kconfig +f:drivers/pci/controller/cadence/Makefile +f:drivers/pci/controller/cadence/pci-j721e.c +f:drivers/pci/controller/cadence/pcie-cadence-ep.c +f:drivers/pci/controller/cadence/pcie-cadence-host.c +f:drivers/pci/controller/cadence/pcie-cadence-plat.c +f:drivers/pci/controller/cadence/pcie-cadence.c +f:drivers/pci/controller/cadence/pcie-cadence.h +f:drivers/pci/controller/dwc/Kconfig +f:drivers/pci/controller/dwc/Makefile +f:drivers/pci/controller/dwc/pci-dra7xx.c +f:drivers/pci/controller/dwc/pci-exynos.c +f:drivers/pci/controller/dwc/pci-imx6.c +f:drivers/pci/controller/dwc/pci-keystone.c +f:drivers/pci/controller/dwc/pci-layerscape-ep.c +f:drivers/pci/controller/dwc/pci-layerscape.c +f:drivers/pci/controller/dwc/pci-meson.c +f:drivers/pci/controller/dwc/pcie-al.c +f:drivers/pci/controller/dwc/pcie-amd-mdb.c +f:drivers/pci/controller/dwc/pcie-armada8k.c +f:drivers/pci/controller/dwc/pcie-artpec6.c +f:drivers/pci/controller/dwc/pcie-bt1.c +f:drivers/pci/controller/dwc/pcie-designware-debugfs.c +f:drivers/pci/controller/dwc/pcie-designware-ep.c +f:drivers/pci/controller/dwc/pcie-designware-host.c +f:drivers/pci/controller/dwc/pcie-designware-plat.c +f:drivers/pci/controller/dwc/pcie-designware.c +f:drivers/pci/controller/dwc/pcie-designware.h +f:drivers/pci/controller/dwc/pcie-dw-rockchip.c +f:drivers/pci/controller/dwc/pcie-fu740.c +f:drivers/pci/controller/dwc/pcie-hisi.c +f:drivers/pci/controller/dwc/pcie-histb.c +f:drivers/pci/controller/dwc/pcie-intel-gw.c +f:drivers/pci/controller/dwc/pcie-keembay.c +f:drivers/pci/controller/dwc/pcie-kirin.c +f:drivers/pci/controller/dwc/pcie-qcom-common.c +f:drivers/pci/controller/dwc/pcie-qcom-common.h +f:drivers/pci/controller/dwc/pcie-qcom-ep.c +f:drivers/pci/controller/dwc/pcie-qcom.c +f:drivers/pci/controller/dwc/pcie-rcar-gen4.c +f:drivers/pci/controller/dwc/pcie-spear13xx.c +f:drivers/pci/controller/dwc/pcie-tegra194-acpi.c +f:drivers/pci/controller/dwc/pcie-tegra194.c +f:drivers/pci/controller/dwc/pcie-uniphier-ep.c +f:drivers/pci/controller/dwc/pcie-uniphier.c +f:drivers/pci/controller/dwc/pcie-visconti.c +f:drivers/pci/controller/mobiveil/Kconfig +f:drivers/pci/controller/mobiveil/Makefile +f:drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c +f:drivers/pci/controller/mobiveil/pcie-mobiveil-host.c +f:drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c +f:drivers/pci/controller/mobiveil/pcie-mobiveil.c +f:drivers/pci/controller/mobiveil/pcie-mobiveil.h +f:drivers/pci/controller/pci-aardvark.c +f:drivers/pci/controller/pci-ftpci100.c +f:drivers/pci/controller/pci-host-common.c +f:drivers/pci/controller/pci-host-common.h +f:drivers/pci/controller/pci-host-generic.c +f:drivers/pci/controller/pci-hyperv-intf.c +f:drivers/pci/controller/pci-hyperv.c +f:drivers/pci/controller/pci-ixp4xx.c +f:drivers/pci/controller/pci-loongson.c +f:drivers/pci/controller/pci-mvebu.c +f:drivers/pci/controller/pci-rcar-gen2.c +f:drivers/pci/controller/pci-tegra.c +f:drivers/pci/controller/pci-thunder-ecam.c +f:drivers/pci/controller/pci-thunder-pem.c +f:drivers/pci/controller/pci-v3-semi.c +f:drivers/pci/controller/pci-versatile.c +f:drivers/pci/controller/pci-xgene-msi.c +f:drivers/pci/controller/pci-xgene.c +f:drivers/pci/controller/pcie-altera-msi.c +f:drivers/pci/controller/pcie-altera.c +f:drivers/pci/controller/pcie-apple.c +f:drivers/pci/controller/pcie-brcmstb.c +f:drivers/pci/controller/pcie-hisi-error.c +f:drivers/pci/controller/pcie-iproc-bcma.c +f:drivers/pci/controller/pcie-iproc-msi.c +f:drivers/pci/controller/pcie-iproc-platform.c +f:drivers/pci/controller/pcie-iproc.c +f:drivers/pci/controller/pcie-iproc.h +f:drivers/pci/controller/pcie-mediatek-gen3.c +f:drivers/pci/controller/pcie-mediatek.c +f:drivers/pci/controller/pcie-mt7621.c +f:drivers/pci/controller/pcie-rcar-ep.c +f:drivers/pci/controller/pcie-rcar-host.c +f:drivers/pci/controller/pcie-rcar.c +f:drivers/pci/controller/pcie-rcar.h +f:drivers/pci/controller/pcie-rockchip-ep.c +f:drivers/pci/controller/pcie-rockchip-host.c +f:drivers/pci/controller/pcie-rockchip.c +f:drivers/pci/controller/pcie-rockchip.h +f:drivers/pci/controller/pcie-xilinx-common.h +f:drivers/pci/controller/pcie-xilinx-cpm.c +f:drivers/pci/controller/pcie-xilinx-dma-pl.c +f:drivers/pci/controller/pcie-xilinx-nwl.c +f:drivers/pci/controller/pcie-xilinx.c +f:drivers/pci/controller/plda/Kconfig +f:drivers/pci/controller/plda/Makefile +f:drivers/pci/controller/plda/pcie-microchip-host.c +f:drivers/pci/controller/plda/pcie-plda-host.c +f:drivers/pci/controller/plda/pcie-plda.h +f:drivers/pci/controller/plda/pcie-starfive.c +f:drivers/pci/controller/vmd.c +f:drivers/pci/devres.c +f:drivers/pci/doe.c +f:drivers/pci/ecam.c +f:drivers/pci/endpoint/Kconfig +f:drivers/pci/endpoint/Makefile +f:drivers/pci/endpoint/functions/Kconfig +f:drivers/pci/endpoint/functions/Makefile +f:drivers/pci/endpoint/functions/pci-epf-mhi.c +f:drivers/pci/endpoint/functions/pci-epf-ntb.c +f:drivers/pci/endpoint/functions/pci-epf-test.c +f:drivers/pci/endpoint/functions/pci-epf-vntb.c +f:drivers/pci/endpoint/pci-ep-cfs.c +f:drivers/pci/endpoint/pci-epc-core.c +f:drivers/pci/endpoint/pci-epc-mem.c +f:drivers/pci/endpoint/pci-epf-core.c +f:drivers/pci/host-bridge.c +f:drivers/pci/hotplug/Kconfig +f:drivers/pci/hotplug/Makefile +f:drivers/pci/hotplug/TODO +f:drivers/pci/hotplug/acpi_pcihp.c +f:drivers/pci/hotplug/acpiphp.h +f:drivers/pci/hotplug/acpiphp_ampere_altra.c +f:drivers/pci/hotplug/acpiphp_core.c +f:drivers/pci/hotplug/acpiphp_glue.c +f:drivers/pci/hotplug/acpiphp_ibm.c +f:drivers/pci/hotplug/cpci_hotplug.h +f:drivers/pci/hotplug/cpci_hotplug_core.c +f:drivers/pci/hotplug/cpci_hotplug_pci.c +f:drivers/pci/hotplug/cpcihp_generic.c +f:drivers/pci/hotplug/cpcihp_zt5550.c +f:drivers/pci/hotplug/cpcihp_zt5550.h +f:drivers/pci/hotplug/cpqphp.h +f:drivers/pci/hotplug/cpqphp_core.c +f:drivers/pci/hotplug/cpqphp_ctrl.c +f:drivers/pci/hotplug/cpqphp_nvram.c +f:drivers/pci/hotplug/cpqphp_nvram.h +f:drivers/pci/hotplug/cpqphp_pci.c +f:drivers/pci/hotplug/cpqphp_sysfs.c +f:drivers/pci/hotplug/ibmphp.h +f:drivers/pci/hotplug/ibmphp_core.c +f:drivers/pci/hotplug/ibmphp_ebda.c +f:drivers/pci/hotplug/ibmphp_hpc.c +f:drivers/pci/hotplug/ibmphp_pci.c +f:drivers/pci/hotplug/ibmphp_res.c +f:drivers/pci/hotplug/octep_hp.c +f:drivers/pci/hotplug/pci_hotplug_core.c +f:drivers/pci/hotplug/pciehp.h +f:drivers/pci/hotplug/pciehp_core.c +f:drivers/pci/hotplug/pciehp_ctrl.c +f:drivers/pci/hotplug/pciehp_hpc.c +f:drivers/pci/hotplug/pciehp_pci.c +f:drivers/pci/hotplug/pnv_php.c +f:drivers/pci/hotplug/rpadlpar.h +f:drivers/pci/hotplug/rpadlpar_core.c +f:drivers/pci/hotplug/rpadlpar_sysfs.c +f:drivers/pci/hotplug/rpaphp.h +f:drivers/pci/hotplug/rpaphp_core.c +f:drivers/pci/hotplug/rpaphp_pci.c +f:drivers/pci/hotplug/rpaphp_slot.c +f:drivers/pci/hotplug/s390_pci_hpc.c +f:drivers/pci/hotplug/shpchp.h +f:drivers/pci/hotplug/shpchp_core.c +f:drivers/pci/hotplug/shpchp_ctrl.c +f:drivers/pci/hotplug/shpchp_hpc.c +f:drivers/pci/hotplug/shpchp_pci.c +f:drivers/pci/hotplug/shpchp_sysfs.c +f:drivers/pci/iomap.c +f:drivers/pci/iov.c +f:drivers/pci/irq.c +f:drivers/pci/mmap.c +f:drivers/pci/msi/Makefile +f:drivers/pci/msi/api.c +f:drivers/pci/msi/irqdomain.c +f:drivers/pci/msi/legacy.c +f:drivers/pci/msi/msi.c +f:drivers/pci/msi/msi.h +f:drivers/pci/msi/pcidev_msi.c +f:drivers/pci/npem.c +f:drivers/pci/of.c +f:drivers/pci/of_property.c +f:drivers/pci/p2pdma.c +f:drivers/pci/pci-acpi.c +f:drivers/pci/pci-bridge-emul.c +f:drivers/pci/pci-bridge-emul.h +f:drivers/pci/pci-driver.c +f:drivers/pci/pci-label.c +f:drivers/pci/pci-mid.c +f:drivers/pci/pci-pf-stub.c +f:drivers/pci/pci-stub.c +f:drivers/pci/pci-sysfs.c +f:drivers/pci/pci.c +f:drivers/pci/pci.h +f:drivers/pci/pcie/Kconfig +f:drivers/pci/pcie/Makefile +f:drivers/pci/pcie/aer.c +f:drivers/pci/pcie/aer_inject.c +f:drivers/pci/pcie/aspm.c +f:drivers/pci/pcie/bwctrl.c +f:drivers/pci/pcie/dpc.c +f:drivers/pci/pcie/edr.c +f:drivers/pci/pcie/err.c +f:drivers/pci/pcie/pme.c +f:drivers/pci/pcie/portdrv.c +f:drivers/pci/pcie/portdrv.h +f:drivers/pci/pcie/ptm.c +f:drivers/pci/pcie/rcec.c +f:drivers/pci/pcie/tlp.c +f:drivers/pci/probe.c +f:drivers/pci/proc.c +f:drivers/pci/pwrctrl/Kconfig +f:drivers/pci/pwrctrl/Makefile +f:drivers/pci/pwrctrl/core.c +f:drivers/pci/pwrctrl/pci-pwrctrl-pwrseq.c +f:drivers/pci/pwrctrl/slot.c +f:drivers/pci/quirks.c +f:drivers/pci/remove.c +f:drivers/pci/rom.c +f:drivers/pci/search.c +f:drivers/pci/setup-bus.c +f:drivers/pci/setup-res.c +f:drivers/pci/slot.c +f:drivers/pci/switch/Kconfig +f:drivers/pci/switch/Makefile +f:drivers/pci/switch/switchtec.c +f:drivers/pci/syscall.c +f:drivers/pci/tph.c +f:drivers/pci/vc.c +f:drivers/pci/vgaarb.c +f:drivers/pci/vpd.c +f:drivers/pci/xen-pcifront.c +f:drivers/pcmcia/Kconfig +f:drivers/pcmcia/Makefile +f:drivers/pcmcia/bcm63xx_pcmcia.c +f:drivers/pcmcia/bcm63xx_pcmcia.h +f:drivers/pcmcia/cardbus.c +f:drivers/pcmcia/cirrus.h +f:drivers/pcmcia/cistpl.c +f:drivers/pcmcia/cs.c +f:drivers/pcmcia/cs_internal.h +f:drivers/pcmcia/db1xxx_ss.c +f:drivers/pcmcia/ds.c +f:drivers/pcmcia/electra_cf.c +f:drivers/pcmcia/i82092.c +f:drivers/pcmcia/i82092aa.h +f:drivers/pcmcia/i82365.c +f:drivers/pcmcia/i82365.h +f:drivers/pcmcia/max1600.c +f:drivers/pcmcia/max1600.h +f:drivers/pcmcia/o2micro.h +f:drivers/pcmcia/omap_cf.c +f:drivers/pcmcia/pcmcia_cis.c +f:drivers/pcmcia/pcmcia_resource.c +f:drivers/pcmcia/pd6729.c +f:drivers/pcmcia/pd6729.h +f:drivers/pcmcia/pxa2xx_base.c +f:drivers/pcmcia/pxa2xx_base.h +f:drivers/pcmcia/pxa2xx_sharpsl.c +f:drivers/pcmcia/ricoh.h +f:drivers/pcmcia/rsrc_iodyn.c +f:drivers/pcmcia/rsrc_mgr.c +f:drivers/pcmcia/rsrc_nonstatic.c +f:drivers/pcmcia/sa1100_generic.c +f:drivers/pcmcia/sa1100_generic.h +f:drivers/pcmcia/sa1100_h3600.c +f:drivers/pcmcia/sa1111_generic.c +f:drivers/pcmcia/sa1111_generic.h +f:drivers/pcmcia/sa1111_jornada720.c +f:drivers/pcmcia/sa1111_neponset.c +f:drivers/pcmcia/sa11xx_base.c +f:drivers/pcmcia/sa11xx_base.h +f:drivers/pcmcia/soc_common.c +f:drivers/pcmcia/soc_common.h +f:drivers/pcmcia/socket_sysfs.c +f:drivers/pcmcia/tcic.c +f:drivers/pcmcia/tcic.h +f:drivers/pcmcia/ti113x.h +f:drivers/pcmcia/topic.h +f:drivers/pcmcia/vg468.h +f:drivers/pcmcia/xxs1500_ss.c +f:drivers/pcmcia/yenta_socket.c +f:drivers/pcmcia/yenta_socket.h +f:drivers/peci/Kconfig +f:drivers/peci/Makefile +f:drivers/peci/controller/Kconfig +f:drivers/peci/controller/Makefile +f:drivers/peci/controller/peci-aspeed.c +f:drivers/peci/controller/peci-npcm.c +f:drivers/peci/core.c +f:drivers/peci/cpu.c +f:drivers/peci/device.c +f:drivers/peci/internal.h +f:drivers/peci/request.c +f:drivers/peci/sysfs.c +f:drivers/perf/Kconfig +f:drivers/perf/Makefile +f:drivers/perf/alibaba_uncore_drw_pmu.c +f:drivers/perf/amlogic/Kconfig +f:drivers/perf/amlogic/Makefile +f:drivers/perf/amlogic/meson_ddr_pmu_core.c +f:drivers/perf/amlogic/meson_g12_ddr_pmu.c +f:drivers/perf/apple_m1_cpu_pmu.c +f:drivers/perf/arm-cci.c +f:drivers/perf/arm-ccn.c +f:drivers/perf/arm-cmn.c +f:drivers/perf/arm-ni.c +f:drivers/perf/arm_brbe.c +f:drivers/perf/arm_brbe.h +f:drivers/perf/arm_cspmu/Kconfig +f:drivers/perf/arm_cspmu/Makefile +f:drivers/perf/arm_cspmu/ampere_cspmu.c +f:drivers/perf/arm_cspmu/arm_cspmu.c +f:drivers/perf/arm_cspmu/arm_cspmu.h +f:drivers/perf/arm_cspmu/nvidia_cspmu.c +f:drivers/perf/arm_dmc620_pmu.c +f:drivers/perf/arm_dsu_pmu.c +f:drivers/perf/arm_pmu.c +f:drivers/perf/arm_pmu_acpi.c +f:drivers/perf/arm_pmu_platform.c +f:drivers/perf/arm_pmuv3.c +f:drivers/perf/arm_smmuv3_pmu.c +f:drivers/perf/arm_spe_pmu.c +f:drivers/perf/arm_v6_pmu.c +f:drivers/perf/arm_v7_pmu.c +f:drivers/perf/arm_xscale_pmu.c +f:drivers/perf/cxl_pmu.c +f:drivers/perf/dwc_pcie_pmu.c +f:drivers/perf/fsl_imx8_ddr_perf.c +f:drivers/perf/fsl_imx9_ddr_perf.c +f:drivers/perf/hisilicon/Kconfig +f:drivers/perf/hisilicon/Makefile +f:drivers/perf/hisilicon/hisi_pcie_pmu.c +f:drivers/perf/hisilicon/hisi_uncore_cpa_pmu.c +f:drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c +f:drivers/perf/hisilicon/hisi_uncore_hha_pmu.c +f:drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c +f:drivers/perf/hisilicon/hisi_uncore_pa_pmu.c +f:drivers/perf/hisilicon/hisi_uncore_pmu.c +f:drivers/perf/hisilicon/hisi_uncore_pmu.h +f:drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c +f:drivers/perf/hisilicon/hisi_uncore_uc_pmu.c +f:drivers/perf/hisilicon/hns3_pmu.c +f:drivers/perf/marvell_cn10k_ddr_pmu.c +f:drivers/perf/marvell_cn10k_tad_pmu.c +f:drivers/perf/marvell_pem_pmu.c +f:drivers/perf/qcom_l2_pmu.c +f:drivers/perf/qcom_l3_pmu.c +f:drivers/perf/riscv_pmu.c +f:drivers/perf/riscv_pmu_legacy.c +f:drivers/perf/riscv_pmu_sbi.c +f:drivers/perf/starfive_starlink_pmu.c +f:drivers/perf/thunderx2_pmu.c +f:drivers/perf/xgene_pmu.c +f:drivers/phy/Kconfig +f:drivers/phy/Makefile +f:drivers/phy/allwinner/Kconfig +f:drivers/phy/allwinner/Makefile +f:drivers/phy/allwinner/phy-sun4i-usb.c +f:drivers/phy/allwinner/phy-sun50i-usb3.c +f:drivers/phy/allwinner/phy-sun6i-mipi-dphy.c +f:drivers/phy/allwinner/phy-sun9i-usb.c +f:drivers/phy/amlogic/Kconfig +f:drivers/phy/amlogic/Makefile +f:drivers/phy/amlogic/phy-meson-axg-mipi-dphy.c +f:drivers/phy/amlogic/phy-meson-axg-mipi-pcie-analog.c +f:drivers/phy/amlogic/phy-meson-axg-pcie.c +f:drivers/phy/amlogic/phy-meson-g12a-mipi-dphy-analog.c +f:drivers/phy/amlogic/phy-meson-g12a-usb2.c +f:drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c +f:drivers/phy/amlogic/phy-meson-gxl-usb2.c +f:drivers/phy/amlogic/phy-meson8-hdmi-tx.c +f:drivers/phy/amlogic/phy-meson8b-usb2.c +f:drivers/phy/broadcom/Kconfig +f:drivers/phy/broadcom/Makefile +f:drivers/phy/broadcom/phy-bcm-cygnus-pcie.c +f:drivers/phy/broadcom/phy-bcm-kona-usb2.c +f:drivers/phy/broadcom/phy-bcm-ns-usb2.c +f:drivers/phy/broadcom/phy-bcm-ns-usb3.c +f:drivers/phy/broadcom/phy-bcm-ns2-pcie.c +f:drivers/phy/broadcom/phy-bcm-ns2-usbdrd.c +f:drivers/phy/broadcom/phy-bcm-sr-pcie.c +f:drivers/phy/broadcom/phy-bcm-sr-usb.c +f:drivers/phy/broadcom/phy-bcm63xx-usbh.c +f:drivers/phy/broadcom/phy-brcm-sata.c +f:drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c +f:drivers/phy/broadcom/phy-brcm-usb-init.c +f:drivers/phy/broadcom/phy-brcm-usb-init.h +f:drivers/phy/broadcom/phy-brcm-usb.c +f:drivers/phy/cadence/Kconfig +f:drivers/phy/cadence/Makefile +f:drivers/phy/cadence/cdns-dphy-rx.c +f:drivers/phy/cadence/cdns-dphy.c +f:drivers/phy/cadence/phy-cadence-salvo.c +f:drivers/phy/cadence/phy-cadence-sierra.c +f:drivers/phy/cadence/phy-cadence-torrent.c +f:drivers/phy/freescale/Kconfig +f:drivers/phy/freescale/Makefile +f:drivers/phy/freescale/phy-fsl-imx8-mipi-dphy.c +f:drivers/phy/freescale/phy-fsl-imx8m-pcie.c +f:drivers/phy/freescale/phy-fsl-imx8mq-usb.c +f:drivers/phy/freescale/phy-fsl-imx8qm-hsio.c +f:drivers/phy/freescale/phy-fsl-imx8qm-lvds-phy.c +f:drivers/phy/freescale/phy-fsl-lynx-28g.c +f:drivers/phy/freescale/phy-fsl-samsung-hdmi.c +f:drivers/phy/hisilicon/Kconfig +f:drivers/phy/hisilicon/Makefile +f:drivers/phy/hisilicon/phy-hi3660-usb3.c +f:drivers/phy/hisilicon/phy-hi3670-pcie.c +f:drivers/phy/hisilicon/phy-hi3670-usb3.c +f:drivers/phy/hisilicon/phy-hi6220-usb.c +f:drivers/phy/hisilicon/phy-hisi-inno-usb2.c +f:drivers/phy/hisilicon/phy-histb-combphy.c +f:drivers/phy/hisilicon/phy-hix5hd2-sata.c +f:drivers/phy/ingenic/Kconfig +f:drivers/phy/ingenic/Makefile +f:drivers/phy/ingenic/phy-ingenic-usb.c +f:drivers/phy/intel/Kconfig +f:drivers/phy/intel/Makefile +f:drivers/phy/intel/phy-intel-keembay-emmc.c +f:drivers/phy/intel/phy-intel-keembay-usb.c +f:drivers/phy/intel/phy-intel-lgm-combo.c +f:drivers/phy/intel/phy-intel-lgm-emmc.c +f:drivers/phy/lantiq/Kconfig +f:drivers/phy/lantiq/Makefile +f:drivers/phy/lantiq/phy-lantiq-rcu-usb2.c +f:drivers/phy/lantiq/phy-lantiq-vrx200-pcie.c +f:drivers/phy/marvell/Kconfig +f:drivers/phy/marvell/Makefile +f:drivers/phy/marvell/phy-armada375-usb2.c +f:drivers/phy/marvell/phy-armada38x-comphy.c +f:drivers/phy/marvell/phy-berlin-sata.c +f:drivers/phy/marvell/phy-berlin-usb.c +f:drivers/phy/marvell/phy-mmp3-hsic.c +f:drivers/phy/marvell/phy-mmp3-usb.c +f:drivers/phy/marvell/phy-mvebu-a3700-comphy.c +f:drivers/phy/marvell/phy-mvebu-a3700-utmi.c +f:drivers/phy/marvell/phy-mvebu-cp110-comphy.c +f:drivers/phy/marvell/phy-mvebu-cp110-utmi.c +f:drivers/phy/marvell/phy-mvebu-sata.c +f:drivers/phy/marvell/phy-pxa-28nm-hsic.c +f:drivers/phy/marvell/phy-pxa-28nm-usb2.c +f:drivers/phy/marvell/phy-pxa-usb.c +f:drivers/phy/mediatek/Kconfig +f:drivers/phy/mediatek/Makefile +f:drivers/phy/mediatek/phy-mtk-dp.c +f:drivers/phy/mediatek/phy-mtk-hdmi-mt2701.c +f:drivers/phy/mediatek/phy-mtk-hdmi-mt8173.c +f:drivers/phy/mediatek/phy-mtk-hdmi-mt8195.c +f:drivers/phy/mediatek/phy-mtk-hdmi-mt8195.h +f:drivers/phy/mediatek/phy-mtk-hdmi.c +f:drivers/phy/mediatek/phy-mtk-hdmi.h +f:drivers/phy/mediatek/phy-mtk-io.h +f:drivers/phy/mediatek/phy-mtk-mipi-csi-0-5-rx-reg.h +f:drivers/phy/mediatek/phy-mtk-mipi-csi-0-5.c +f:drivers/phy/mediatek/phy-mtk-mipi-dsi-mt8173.c +f:drivers/phy/mediatek/phy-mtk-mipi-dsi-mt8183.c +f:drivers/phy/mediatek/phy-mtk-mipi-dsi.c +f:drivers/phy/mediatek/phy-mtk-mipi-dsi.h +f:drivers/phy/mediatek/phy-mtk-pcie.c +f:drivers/phy/mediatek/phy-mtk-tphy.c +f:drivers/phy/mediatek/phy-mtk-ufs.c +f:drivers/phy/mediatek/phy-mtk-xfi-tphy.c +f:drivers/phy/mediatek/phy-mtk-xsphy.c +f:drivers/phy/microchip/Kconfig +f:drivers/phy/microchip/Makefile +f:drivers/phy/microchip/lan966x_serdes.c +f:drivers/phy/microchip/lan966x_serdes_regs.h +f:drivers/phy/microchip/sparx5_serdes.c +f:drivers/phy/microchip/sparx5_serdes.h +f:drivers/phy/microchip/sparx5_serdes_regs.h +f:drivers/phy/motorola/Kconfig +f:drivers/phy/motorola/Makefile +f:drivers/phy/motorola/phy-cpcap-usb.c +f:drivers/phy/motorola/phy-mapphone-mdm6600.c +f:drivers/phy/mscc/Kconfig +f:drivers/phy/mscc/Makefile +f:drivers/phy/mscc/phy-ocelot-serdes.c +f:drivers/phy/nuvoton/Kconfig +f:drivers/phy/nuvoton/Makefile +f:drivers/phy/nuvoton/phy-ma35d1-usb2.c +f:drivers/phy/phy-airoha-pcie-regs.h +f:drivers/phy/phy-airoha-pcie.c +f:drivers/phy/phy-can-transceiver.c +f:drivers/phy/phy-core-mipi-dphy.c +f:drivers/phy/phy-core.c +f:drivers/phy/phy-lgm-usb.c +f:drivers/phy/phy-lpc18xx-usb-otg.c +f:drivers/phy/phy-nxp-ptn3222.c +f:drivers/phy/phy-pistachio-usb.c +f:drivers/phy/phy-snps-eusb2.c +f:drivers/phy/phy-xgene.c +f:drivers/phy/qualcomm/Kconfig +f:drivers/phy/qualcomm/Makefile +f:drivers/phy/qualcomm/phy-ath79-usb.c +f:drivers/phy/qualcomm/phy-qcom-apq8064-sata.c +f:drivers/phy/qualcomm/phy-qcom-edp.c +f:drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c +f:drivers/phy/qualcomm/phy-qcom-ipq4019-usb.c +f:drivers/phy/qualcomm/phy-qcom-ipq806x-sata.c +f:drivers/phy/qualcomm/phy-qcom-ipq806x-usb.c +f:drivers/phy/qualcomm/phy-qcom-m31.c +f:drivers/phy/qualcomm/phy-qcom-pcie2.c +f:drivers/phy/qualcomm/phy-qcom-qmp-combo.c +f:drivers/phy/qualcomm/phy-qcom-qmp-common.h +f:drivers/phy/qualcomm/phy-qcom-qmp-dp-com-v3.h +f:drivers/phy/qualcomm/phy-qcom-qmp-dp-phy-v3.h +f:drivers/phy/qualcomm/phy-qcom-qmp-dp-phy-v4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-dp-phy-v5.h +f:drivers/phy/qualcomm/phy-qcom-qmp-dp-phy-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-dp-phy.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcie-msm8996.c +f:drivers/phy/qualcomm/phy-qcom-qmp-pcie-qhp.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcie.c +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-misc-v3.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-misc-v4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v4_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v5.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v5_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v6_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v6_30.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-sgmii.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v2.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v3.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v5.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-usb-v4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-usb-v5.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-usb-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-usb-v7.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v2.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v3.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v4_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v5.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v5_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6-n4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6_30.h +f:drivers/phy/qualcomm/phy-qcom-qmp-pcs-v7.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v3.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v5.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v7.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-ln-shrd-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-pll.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v7.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v3.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v4_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v5.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v5_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v5_5nm.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v6.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v6_20.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v6_n4.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v7.h +f:drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx.h +f:drivers/phy/qualcomm/phy-qcom-qmp-ufs.c +f:drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c +f:drivers/phy/qualcomm/phy-qcom-qmp-usb.c +f:drivers/phy/qualcomm/phy-qcom-qmp-usbc.c +f:drivers/phy/qualcomm/phy-qcom-qmp.h +f:drivers/phy/qualcomm/phy-qcom-qusb2.c +f:drivers/phy/qualcomm/phy-qcom-sgmii-eth.c +f:drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c +f:drivers/phy/qualcomm/phy-qcom-uniphy-pcie-28lp.c +f:drivers/phy/qualcomm/phy-qcom-usb-hs-28nm.c +f:drivers/phy/qualcomm/phy-qcom-usb-hs.c +f:drivers/phy/qualcomm/phy-qcom-usb-hsic.c +f:drivers/phy/qualcomm/phy-qcom-usb-ss.c +f:drivers/phy/ralink/Kconfig +f:drivers/phy/ralink/Makefile +f:drivers/phy/ralink/phy-mt7621-pci.c +f:drivers/phy/ralink/phy-ralink-usb.c +f:drivers/phy/realtek/Kconfig +f:drivers/phy/realtek/Makefile +f:drivers/phy/realtek/phy-rtk-usb2.c +f:drivers/phy/realtek/phy-rtk-usb3.c +f:drivers/phy/renesas/Kconfig +f:drivers/phy/renesas/Makefile +f:drivers/phy/renesas/phy-rcar-gen2.c +f:drivers/phy/renesas/phy-rcar-gen3-pcie.c +f:drivers/phy/renesas/phy-rcar-gen3-usb2.c +f:drivers/phy/renesas/phy-rcar-gen3-usb3.c +f:drivers/phy/renesas/r8a779f0-ether-serdes.c +f:drivers/phy/rockchip/Kconfig +f:drivers/phy/rockchip/Makefile +f:drivers/phy/rockchip/phy-rockchip-dp.c +f:drivers/phy/rockchip/phy-rockchip-dphy-rx0.c +f:drivers/phy/rockchip/phy-rockchip-emmc.c +f:drivers/phy/rockchip/phy-rockchip-inno-csidphy.c +f:drivers/phy/rockchip/phy-rockchip-inno-dsidphy.c +f:drivers/phy/rockchip/phy-rockchip-inno-hdmi.c +f:drivers/phy/rockchip/phy-rockchip-inno-usb2.c +f:drivers/phy/rockchip/phy-rockchip-naneng-combphy.c +f:drivers/phy/rockchip/phy-rockchip-pcie.c +f:drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c +f:drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +f:drivers/phy/rockchip/phy-rockchip-snps-pcie3.c +f:drivers/phy/rockchip/phy-rockchip-typec.c +f:drivers/phy/rockchip/phy-rockchip-usb.c +f:drivers/phy/rockchip/phy-rockchip-usbdp.c +f:drivers/phy/samsung/Kconfig +f:drivers/phy/samsung/Makefile +f:drivers/phy/samsung/phy-exynos-dp-video.c +f:drivers/phy/samsung/phy-exynos-mipi-video.c +f:drivers/phy/samsung/phy-exynos-pcie.c +f:drivers/phy/samsung/phy-exynos4210-usb2.c +f:drivers/phy/samsung/phy-exynos4x12-usb2.c +f:drivers/phy/samsung/phy-exynos5-usbdrd.c +f:drivers/phy/samsung/phy-exynos5250-sata.c +f:drivers/phy/samsung/phy-exynos5250-usb2.c +f:drivers/phy/samsung/phy-exynos7-ufs.c +f:drivers/phy/samsung/phy-exynosautov9-ufs.c +f:drivers/phy/samsung/phy-exynosautov920-ufs.c +f:drivers/phy/samsung/phy-fsd-ufs.c +f:drivers/phy/samsung/phy-gs101-ufs.c +f:drivers/phy/samsung/phy-s5pv210-usb2.c +f:drivers/phy/samsung/phy-samsung-ufs.c +f:drivers/phy/samsung/phy-samsung-ufs.h +f:drivers/phy/samsung/phy-samsung-usb2.c +f:drivers/phy/samsung/phy-samsung-usb2.h +f:drivers/phy/socionext/Kconfig +f:drivers/phy/socionext/Makefile +f:drivers/phy/socionext/phy-uniphier-ahci.c +f:drivers/phy/socionext/phy-uniphier-pcie.c +f:drivers/phy/socionext/phy-uniphier-usb2.c +f:drivers/phy/socionext/phy-uniphier-usb3hs.c +f:drivers/phy/socionext/phy-uniphier-usb3ss.c +f:drivers/phy/st/Kconfig +f:drivers/phy/st/Makefile +f:drivers/phy/st/phy-miphy28lp.c +f:drivers/phy/st/phy-spear1310-miphy.c +f:drivers/phy/st/phy-spear1340-miphy.c +f:drivers/phy/st/phy-stih407-usb.c +f:drivers/phy/st/phy-stm32-combophy.c +f:drivers/phy/st/phy-stm32-usbphyc.c +f:drivers/phy/starfive/Kconfig +f:drivers/phy/starfive/Makefile +f:drivers/phy/starfive/phy-jh7110-dphy-rx.c +f:drivers/phy/starfive/phy-jh7110-dphy-tx.c +f:drivers/phy/starfive/phy-jh7110-pcie.c +f:drivers/phy/starfive/phy-jh7110-usb.c +f:drivers/phy/sunplus/Kconfig +f:drivers/phy/sunplus/Makefile +f:drivers/phy/sunplus/phy-sunplus-usb2.c +f:drivers/phy/tegra/Kconfig +f:drivers/phy/tegra/Makefile +f:drivers/phy/tegra/phy-tegra194-p2u.c +f:drivers/phy/tegra/xusb-tegra124.c +f:drivers/phy/tegra/xusb-tegra186.c +f:drivers/phy/tegra/xusb-tegra210.c +f:drivers/phy/tegra/xusb.c +f:drivers/phy/tegra/xusb.h +f:drivers/phy/ti/Kconfig +f:drivers/phy/ti/Makefile +f:drivers/phy/ti/phy-am654-serdes.c +f:drivers/phy/ti/phy-da8xx-usb.c +f:drivers/phy/ti/phy-dm816x-usb.c +f:drivers/phy/ti/phy-gmii-sel.c +f:drivers/phy/ti/phy-j721e-wiz.c +f:drivers/phy/ti/phy-omap-control.c +f:drivers/phy/ti/phy-omap-usb2.c +f:drivers/phy/ti/phy-ti-pipe3.c +f:drivers/phy/ti/phy-tusb1210.c +f:drivers/phy/ti/phy-twl4030-usb.c +f:drivers/phy/xilinx/Kconfig +f:drivers/phy/xilinx/Makefile +f:drivers/phy/xilinx/phy-zynqmp.c +f:drivers/pinctrl/Kconfig +f:drivers/pinctrl/Makefile +f:drivers/pinctrl/actions/Kconfig +f:drivers/pinctrl/actions/Makefile +f:drivers/pinctrl/actions/pinctrl-owl.c +f:drivers/pinctrl/actions/pinctrl-owl.h +f:drivers/pinctrl/actions/pinctrl-s500.c +f:drivers/pinctrl/actions/pinctrl-s700.c +f:drivers/pinctrl/actions/pinctrl-s900.c +f:drivers/pinctrl/aspeed/Kconfig +f:drivers/pinctrl/aspeed/Makefile +f:drivers/pinctrl/aspeed/pinctrl-aspeed-g4.c +f:drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c +f:drivers/pinctrl/aspeed/pinctrl-aspeed-g6.c +f:drivers/pinctrl/aspeed/pinctrl-aspeed.c +f:drivers/pinctrl/aspeed/pinctrl-aspeed.h +f:drivers/pinctrl/aspeed/pinmux-aspeed.c +f:drivers/pinctrl/aspeed/pinmux-aspeed.h +f:drivers/pinctrl/bcm/Kconfig +f:drivers/pinctrl/bcm/Makefile +f:drivers/pinctrl/bcm/pinctrl-bcm281xx.c +f:drivers/pinctrl/bcm/pinctrl-bcm2835.c +f:drivers/pinctrl/bcm/pinctrl-bcm4908.c +f:drivers/pinctrl/bcm/pinctrl-bcm6318.c +f:drivers/pinctrl/bcm/pinctrl-bcm63268.c +f:drivers/pinctrl/bcm/pinctrl-bcm6328.c +f:drivers/pinctrl/bcm/pinctrl-bcm6358.c +f:drivers/pinctrl/bcm/pinctrl-bcm6362.c +f:drivers/pinctrl/bcm/pinctrl-bcm6368.c +f:drivers/pinctrl/bcm/pinctrl-bcm63xx.c +f:drivers/pinctrl/bcm/pinctrl-bcm63xx.h +f:drivers/pinctrl/bcm/pinctrl-cygnus-mux.c +f:drivers/pinctrl/bcm/pinctrl-iproc-gpio.c +f:drivers/pinctrl/bcm/pinctrl-ns.c +f:drivers/pinctrl/bcm/pinctrl-ns2-mux.c +f:drivers/pinctrl/bcm/pinctrl-nsp-gpio.c +f:drivers/pinctrl/bcm/pinctrl-nsp-mux.c +f:drivers/pinctrl/berlin/Kconfig +f:drivers/pinctrl/berlin/Makefile +f:drivers/pinctrl/berlin/berlin-bg2.c +f:drivers/pinctrl/berlin/berlin-bg2cd.c +f:drivers/pinctrl/berlin/berlin-bg2q.c +f:drivers/pinctrl/berlin/berlin-bg4ct.c +f:drivers/pinctrl/berlin/berlin.c +f:drivers/pinctrl/berlin/berlin.h +f:drivers/pinctrl/berlin/pinctrl-as370.c +f:drivers/pinctrl/cirrus/Kconfig +f:drivers/pinctrl/cirrus/Makefile +f:drivers/pinctrl/cirrus/pinctrl-cs42l43.c +f:drivers/pinctrl/cirrus/pinctrl-cs47l15.c +f:drivers/pinctrl/cirrus/pinctrl-cs47l35.c +f:drivers/pinctrl/cirrus/pinctrl-cs47l85.c +f:drivers/pinctrl/cirrus/pinctrl-cs47l90.c +f:drivers/pinctrl/cirrus/pinctrl-cs47l92.c +f:drivers/pinctrl/cirrus/pinctrl-lochnagar.c +f:drivers/pinctrl/cirrus/pinctrl-madera-core.c +f:drivers/pinctrl/cirrus/pinctrl-madera.h +f:drivers/pinctrl/core.c +f:drivers/pinctrl/core.h +f:drivers/pinctrl/devicetree.c +f:drivers/pinctrl/devicetree.h +f:drivers/pinctrl/freescale/Kconfig +f:drivers/pinctrl/freescale/Makefile +f:drivers/pinctrl/freescale/pinctrl-imx-scmi.c +f:drivers/pinctrl/freescale/pinctrl-imx.c +f:drivers/pinctrl/freescale/pinctrl-imx.h +f:drivers/pinctrl/freescale/pinctrl-imx1-core.c +f:drivers/pinctrl/freescale/pinctrl-imx1.c +f:drivers/pinctrl/freescale/pinctrl-imx1.h +f:drivers/pinctrl/freescale/pinctrl-imx23.c +f:drivers/pinctrl/freescale/pinctrl-imx25.c +f:drivers/pinctrl/freescale/pinctrl-imx27.c +f:drivers/pinctrl/freescale/pinctrl-imx28.c +f:drivers/pinctrl/freescale/pinctrl-imx35.c +f:drivers/pinctrl/freescale/pinctrl-imx50.c +f:drivers/pinctrl/freescale/pinctrl-imx51.c +f:drivers/pinctrl/freescale/pinctrl-imx53.c +f:drivers/pinctrl/freescale/pinctrl-imx6dl.c +f:drivers/pinctrl/freescale/pinctrl-imx6q.c +f:drivers/pinctrl/freescale/pinctrl-imx6sl.c +f:drivers/pinctrl/freescale/pinctrl-imx6sll.c +f:drivers/pinctrl/freescale/pinctrl-imx6sx.c +f:drivers/pinctrl/freescale/pinctrl-imx6ul.c +f:drivers/pinctrl/freescale/pinctrl-imx7d.c +f:drivers/pinctrl/freescale/pinctrl-imx7ulp.c +f:drivers/pinctrl/freescale/pinctrl-imx8dxl.c +f:drivers/pinctrl/freescale/pinctrl-imx8mm.c +f:drivers/pinctrl/freescale/pinctrl-imx8mn.c +f:drivers/pinctrl/freescale/pinctrl-imx8mp.c +f:drivers/pinctrl/freescale/pinctrl-imx8mq.c +f:drivers/pinctrl/freescale/pinctrl-imx8qm.c +f:drivers/pinctrl/freescale/pinctrl-imx8qxp.c +f:drivers/pinctrl/freescale/pinctrl-imx8ulp.c +f:drivers/pinctrl/freescale/pinctrl-imx91.c +f:drivers/pinctrl/freescale/pinctrl-imx93.c +f:drivers/pinctrl/freescale/pinctrl-imxrt1050.c +f:drivers/pinctrl/freescale/pinctrl-imxrt1170.c +f:drivers/pinctrl/freescale/pinctrl-mxs.c +f:drivers/pinctrl/freescale/pinctrl-mxs.h +f:drivers/pinctrl/freescale/pinctrl-scu.c +f:drivers/pinctrl/freescale/pinctrl-vf610.c +f:drivers/pinctrl/intel/Kconfig +f:drivers/pinctrl/intel/Kconfig.tng +f:drivers/pinctrl/intel/Makefile +f:drivers/pinctrl/intel/pinctrl-alderlake.c +f:drivers/pinctrl/intel/pinctrl-baytrail.c +f:drivers/pinctrl/intel/pinctrl-broxton.c +f:drivers/pinctrl/intel/pinctrl-cannonlake.c +f:drivers/pinctrl/intel/pinctrl-cedarfork.c +f:drivers/pinctrl/intel/pinctrl-cherryview.c +f:drivers/pinctrl/intel/pinctrl-denverton.c +f:drivers/pinctrl/intel/pinctrl-elkhartlake.c +f:drivers/pinctrl/intel/pinctrl-emmitsburg.c +f:drivers/pinctrl/intel/pinctrl-geminilake.c +f:drivers/pinctrl/intel/pinctrl-icelake.c +f:drivers/pinctrl/intel/pinctrl-intel-platform.c +f:drivers/pinctrl/intel/pinctrl-intel.c +f:drivers/pinctrl/intel/pinctrl-intel.h +f:drivers/pinctrl/intel/pinctrl-jasperlake.c +f:drivers/pinctrl/intel/pinctrl-lakefield.c +f:drivers/pinctrl/intel/pinctrl-lewisburg.c +f:drivers/pinctrl/intel/pinctrl-lynxpoint.c +f:drivers/pinctrl/intel/pinctrl-merrifield.c +f:drivers/pinctrl/intel/pinctrl-meteorlake.c +f:drivers/pinctrl/intel/pinctrl-meteorpoint.c +f:drivers/pinctrl/intel/pinctrl-moorefield.c +f:drivers/pinctrl/intel/pinctrl-sunrisepoint.c +f:drivers/pinctrl/intel/pinctrl-tangier.c +f:drivers/pinctrl/intel/pinctrl-tangier.h +f:drivers/pinctrl/intel/pinctrl-tigerlake.c +f:drivers/pinctrl/mediatek/Kconfig +f:drivers/pinctrl/mediatek/Makefile +f:drivers/pinctrl/mediatek/mtk-eint.c +f:drivers/pinctrl/mediatek/mtk-eint.h +f:drivers/pinctrl/mediatek/pinctrl-airoha.c +f:drivers/pinctrl/mediatek/pinctrl-moore.c +f:drivers/pinctrl/mediatek/pinctrl-moore.h +f:drivers/pinctrl/mediatek/pinctrl-mt2701.c +f:drivers/pinctrl/mediatek/pinctrl-mt2712.c +f:drivers/pinctrl/mediatek/pinctrl-mt6397.c +f:drivers/pinctrl/mediatek/pinctrl-mt6765.c +f:drivers/pinctrl/mediatek/pinctrl-mt6779.c +f:drivers/pinctrl/mediatek/pinctrl-mt6795.c +f:drivers/pinctrl/mediatek/pinctrl-mt6797.c +f:drivers/pinctrl/mediatek/pinctrl-mt6893.c +f:drivers/pinctrl/mediatek/pinctrl-mt7620.c +f:drivers/pinctrl/mediatek/pinctrl-mt7621.c +f:drivers/pinctrl/mediatek/pinctrl-mt7622.c +f:drivers/pinctrl/mediatek/pinctrl-mt7623.c +f:drivers/pinctrl/mediatek/pinctrl-mt7629.c +f:drivers/pinctrl/mediatek/pinctrl-mt76x8.c +f:drivers/pinctrl/mediatek/pinctrl-mt7981.c +f:drivers/pinctrl/mediatek/pinctrl-mt7986.c +f:drivers/pinctrl/mediatek/pinctrl-mt7988.c +f:drivers/pinctrl/mediatek/pinctrl-mt8127.c +f:drivers/pinctrl/mediatek/pinctrl-mt8135.c +f:drivers/pinctrl/mediatek/pinctrl-mt8167.c +f:drivers/pinctrl/mediatek/pinctrl-mt8173.c +f:drivers/pinctrl/mediatek/pinctrl-mt8183.c +f:drivers/pinctrl/mediatek/pinctrl-mt8186.c +f:drivers/pinctrl/mediatek/pinctrl-mt8188.c +f:drivers/pinctrl/mediatek/pinctrl-mt8192.c +f:drivers/pinctrl/mediatek/pinctrl-mt8195.c +f:drivers/pinctrl/mediatek/pinctrl-mt8196.c +f:drivers/pinctrl/mediatek/pinctrl-mt8365.c +f:drivers/pinctrl/mediatek/pinctrl-mt8516.c +f:drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c +f:drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-common.c +f:drivers/pinctrl/mediatek/pinctrl-mtk-common.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt2701.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt2712.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt6397.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt6765.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt6779.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt6795.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt6797.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt6893.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8127.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8135.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8167.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8173.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8183.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8186.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8188.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8192.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8195.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8196.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8365.h +f:drivers/pinctrl/mediatek/pinctrl-mtk-mt8516.h +f:drivers/pinctrl/mediatek/pinctrl-mtmips.c +f:drivers/pinctrl/mediatek/pinctrl-mtmips.h +f:drivers/pinctrl/mediatek/pinctrl-paris.c +f:drivers/pinctrl/mediatek/pinctrl-paris.h +f:drivers/pinctrl/mediatek/pinctrl-rt2880.c +f:drivers/pinctrl/mediatek/pinctrl-rt305x.c +f:drivers/pinctrl/mediatek/pinctrl-rt3883.c +f:drivers/pinctrl/meson/Kconfig +f:drivers/pinctrl/meson/Makefile +f:drivers/pinctrl/meson/pinctrl-amlogic-a4.c +f:drivers/pinctrl/meson/pinctrl-amlogic-c3.c +f:drivers/pinctrl/meson/pinctrl-amlogic-t7.c +f:drivers/pinctrl/meson/pinctrl-meson-a1.c +f:drivers/pinctrl/meson/pinctrl-meson-axg-pmx.c +f:drivers/pinctrl/meson/pinctrl-meson-axg-pmx.h +f:drivers/pinctrl/meson/pinctrl-meson-axg.c +f:drivers/pinctrl/meson/pinctrl-meson-g12a.c +f:drivers/pinctrl/meson/pinctrl-meson-gxbb.c +f:drivers/pinctrl/meson/pinctrl-meson-gxl.c +f:drivers/pinctrl/meson/pinctrl-meson-s4.c +f:drivers/pinctrl/meson/pinctrl-meson.c +f:drivers/pinctrl/meson/pinctrl-meson.h +f:drivers/pinctrl/meson/pinctrl-meson8-pmx.c +f:drivers/pinctrl/meson/pinctrl-meson8-pmx.h +f:drivers/pinctrl/meson/pinctrl-meson8.c +f:drivers/pinctrl/meson/pinctrl-meson8b.c +f:drivers/pinctrl/mvebu/Kconfig +f:drivers/pinctrl/mvebu/Makefile +f:drivers/pinctrl/mvebu/pinctrl-ac5.c +f:drivers/pinctrl/mvebu/pinctrl-armada-370.c +f:drivers/pinctrl/mvebu/pinctrl-armada-375.c +f:drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +f:drivers/pinctrl/mvebu/pinctrl-armada-38x.c +f:drivers/pinctrl/mvebu/pinctrl-armada-39x.c +f:drivers/pinctrl/mvebu/pinctrl-armada-ap806.c +f:drivers/pinctrl/mvebu/pinctrl-armada-cp110.c +f:drivers/pinctrl/mvebu/pinctrl-armada-xp.c +f:drivers/pinctrl/mvebu/pinctrl-dove.c +f:drivers/pinctrl/mvebu/pinctrl-kirkwood.c +f:drivers/pinctrl/mvebu/pinctrl-mvebu.c +f:drivers/pinctrl/mvebu/pinctrl-mvebu.h +f:drivers/pinctrl/mvebu/pinctrl-orion.c +f:drivers/pinctrl/nomadik/Kconfig +f:drivers/pinctrl/nomadik/Makefile +f:drivers/pinctrl/nomadik/pinctrl-ab8500.c +f:drivers/pinctrl/nomadik/pinctrl-ab8505.c +f:drivers/pinctrl/nomadik/pinctrl-abx500.c +f:drivers/pinctrl/nomadik/pinctrl-abx500.h +f:drivers/pinctrl/nomadik/pinctrl-nomadik-db8500.c +f:drivers/pinctrl/nomadik/pinctrl-nomadik-stn8815.c +f:drivers/pinctrl/nomadik/pinctrl-nomadik.c +f:drivers/pinctrl/nuvoton/Kconfig +f:drivers/pinctrl/nuvoton/Makefile +f:drivers/pinctrl/nuvoton/pinctrl-ma35.c +f:drivers/pinctrl/nuvoton/pinctrl-ma35.h +f:drivers/pinctrl/nuvoton/pinctrl-ma35d1.c +f:drivers/pinctrl/nuvoton/pinctrl-npcm7xx.c +f:drivers/pinctrl/nuvoton/pinctrl-npcm8xx.c +f:drivers/pinctrl/nuvoton/pinctrl-wpcm450.c +f:drivers/pinctrl/nxp/Kconfig +f:drivers/pinctrl/nxp/Makefile +f:drivers/pinctrl/nxp/pinctrl-s32.h +f:drivers/pinctrl/nxp/pinctrl-s32cc.c +f:drivers/pinctrl/nxp/pinctrl-s32g2.c +f:drivers/pinctrl/pinconf-generic.c +f:drivers/pinctrl/pinconf.c +f:drivers/pinctrl/pinconf.h +f:drivers/pinctrl/pinctrl-amd.c +f:drivers/pinctrl/pinctrl-amd.h +f:drivers/pinctrl/pinctrl-amdisp.c +f:drivers/pinctrl/pinctrl-amdisp.h +f:drivers/pinctrl/pinctrl-apple-gpio.c +f:drivers/pinctrl/pinctrl-artpec6.c +f:drivers/pinctrl/pinctrl-as3722.c +f:drivers/pinctrl/pinctrl-at91-pio4.c +f:drivers/pinctrl/pinctrl-at91.c +f:drivers/pinctrl/pinctrl-at91.h +f:drivers/pinctrl/pinctrl-aw9523.c +f:drivers/pinctrl/pinctrl-axp209.c +f:drivers/pinctrl/pinctrl-bm1880.c +f:drivers/pinctrl/pinctrl-cy8c95x0.c +f:drivers/pinctrl/pinctrl-da850-pupd.c +f:drivers/pinctrl/pinctrl-da9062.c +f:drivers/pinctrl/pinctrl-digicolor.c +f:drivers/pinctrl/pinctrl-ep93xx.c +f:drivers/pinctrl/pinctrl-equilibrium.c +f:drivers/pinctrl/pinctrl-equilibrium.h +f:drivers/pinctrl/pinctrl-eyeq5.c +f:drivers/pinctrl/pinctrl-falcon.c +f:drivers/pinctrl/pinctrl-gemini.c +f:drivers/pinctrl/pinctrl-ingenic.c +f:drivers/pinctrl/pinctrl-k210.c +f:drivers/pinctrl/pinctrl-k230.c +f:drivers/pinctrl/pinctrl-keembay.c +f:drivers/pinctrl/pinctrl-lantiq.c +f:drivers/pinctrl/pinctrl-lantiq.h +f:drivers/pinctrl/pinctrl-loongson2.c +f:drivers/pinctrl/pinctrl-lpc18xx.c +f:drivers/pinctrl/pinctrl-max77620.c +f:drivers/pinctrl/pinctrl-mcp23s08.c +f:drivers/pinctrl/pinctrl-mcp23s08.h +f:drivers/pinctrl/pinctrl-mcp23s08_i2c.c +f:drivers/pinctrl/pinctrl-mcp23s08_spi.c +f:drivers/pinctrl/pinctrl-microchip-sgpio.c +f:drivers/pinctrl/pinctrl-mlxbf3.c +f:drivers/pinctrl/pinctrl-ocelot.c +f:drivers/pinctrl/pinctrl-palmas.c +f:drivers/pinctrl/pinctrl-pef2256.c +f:drivers/pinctrl/pinctrl-pic32.c +f:drivers/pinctrl/pinctrl-pic32.h +f:drivers/pinctrl/pinctrl-pistachio.c +f:drivers/pinctrl/pinctrl-rk805.c +f:drivers/pinctrl/pinctrl-rockchip.c +f:drivers/pinctrl/pinctrl-rockchip.h +f:drivers/pinctrl/pinctrl-rp1.c +f:drivers/pinctrl/pinctrl-scmi.c +f:drivers/pinctrl/pinctrl-single.c +f:drivers/pinctrl/pinctrl-st.c +f:drivers/pinctrl/pinctrl-stmfx.c +f:drivers/pinctrl/pinctrl-sx150x.c +f:drivers/pinctrl/pinctrl-tb10x.c +f:drivers/pinctrl/pinctrl-th1520.c +f:drivers/pinctrl/pinctrl-tps6594.c +f:drivers/pinctrl/pinctrl-utils.c +f:drivers/pinctrl/pinctrl-utils.h +f:drivers/pinctrl/pinctrl-xway.c +f:drivers/pinctrl/pinctrl-zynq.c +f:drivers/pinctrl/pinctrl-zynqmp.c +f:drivers/pinctrl/pinmux.c +f:drivers/pinctrl/pinmux.h +f:drivers/pinctrl/pxa/Kconfig +f:drivers/pinctrl/pxa/Makefile +f:drivers/pinctrl/pxa/pinctrl-pxa25x.c +f:drivers/pinctrl/pxa/pinctrl-pxa27x.c +f:drivers/pinctrl/pxa/pinctrl-pxa2xx.c +f:drivers/pinctrl/pxa/pinctrl-pxa2xx.h +f:drivers/pinctrl/qcom/Kconfig +f:drivers/pinctrl/qcom/Kconfig.msm +f:drivers/pinctrl/qcom/Makefile +f:drivers/pinctrl/qcom/pinctrl-apq8064.c +f:drivers/pinctrl/qcom/pinctrl-apq8084.c +f:drivers/pinctrl/qcom/pinctrl-ipq4019.c +f:drivers/pinctrl/qcom/pinctrl-ipq5018.c +f:drivers/pinctrl/qcom/pinctrl-ipq5332.c +f:drivers/pinctrl/qcom/pinctrl-ipq5424.c +f:drivers/pinctrl/qcom/pinctrl-ipq6018.c +f:drivers/pinctrl/qcom/pinctrl-ipq8064.c +f:drivers/pinctrl/qcom/pinctrl-ipq8074.c +f:drivers/pinctrl/qcom/pinctrl-ipq9574.c +f:drivers/pinctrl/qcom/pinctrl-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-lpass-lpi.h +f:drivers/pinctrl/qcom/pinctrl-mdm9607.c +f:drivers/pinctrl/qcom/pinctrl-mdm9615.c +f:drivers/pinctrl/qcom/pinctrl-msm.c +f:drivers/pinctrl/qcom/pinctrl-msm.h +f:drivers/pinctrl/qcom/pinctrl-msm8226.c +f:drivers/pinctrl/qcom/pinctrl-msm8660.c +f:drivers/pinctrl/qcom/pinctrl-msm8909.c +f:drivers/pinctrl/qcom/pinctrl-msm8916.c +f:drivers/pinctrl/qcom/pinctrl-msm8917.c +f:drivers/pinctrl/qcom/pinctrl-msm8953.c +f:drivers/pinctrl/qcom/pinctrl-msm8960.c +f:drivers/pinctrl/qcom/pinctrl-msm8976.c +f:drivers/pinctrl/qcom/pinctrl-msm8994.c +f:drivers/pinctrl/qcom/pinctrl-msm8996.c +f:drivers/pinctrl/qcom/pinctrl-msm8998.c +f:drivers/pinctrl/qcom/pinctrl-msm8x74.c +f:drivers/pinctrl/qcom/pinctrl-qcm2290.c +f:drivers/pinctrl/qcom/pinctrl-qcs404.c +f:drivers/pinctrl/qcom/pinctrl-qcs615.c +f:drivers/pinctrl/qcom/pinctrl-qcs8300.c +f:drivers/pinctrl/qcom/pinctrl-qdf2xxx.c +f:drivers/pinctrl/qcom/pinctrl-qdu1000.c +f:drivers/pinctrl/qcom/pinctrl-sa8775p.c +f:drivers/pinctrl/qcom/pinctrl-sar2130p.c +f:drivers/pinctrl/qcom/pinctrl-sc7180.c +f:drivers/pinctrl/qcom/pinctrl-sc7280-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sc7280.c +f:drivers/pinctrl/qcom/pinctrl-sc8180x.c +f:drivers/pinctrl/qcom/pinctrl-sc8280xp-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sc8280xp.c +f:drivers/pinctrl/qcom/pinctrl-sdm660.c +f:drivers/pinctrl/qcom/pinctrl-sdm670.c +f:drivers/pinctrl/qcom/pinctrl-sdm845.c +f:drivers/pinctrl/qcom/pinctrl-sdx55.c +f:drivers/pinctrl/qcom/pinctrl-sdx65.c +f:drivers/pinctrl/qcom/pinctrl-sdx75.c +f:drivers/pinctrl/qcom/pinctrl-sm4250-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sm4450.c +f:drivers/pinctrl/qcom/pinctrl-sm6115-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sm6115.c +f:drivers/pinctrl/qcom/pinctrl-sm6125.c +f:drivers/pinctrl/qcom/pinctrl-sm6350.c +f:drivers/pinctrl/qcom/pinctrl-sm6375.c +f:drivers/pinctrl/qcom/pinctrl-sm7150.c +f:drivers/pinctrl/qcom/pinctrl-sm8150.c +f:drivers/pinctrl/qcom/pinctrl-sm8250-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sm8250.c +f:drivers/pinctrl/qcom/pinctrl-sm8350-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sm8350.c +f:drivers/pinctrl/qcom/pinctrl-sm8450-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sm8450.c +f:drivers/pinctrl/qcom/pinctrl-sm8550-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sm8550.c +f:drivers/pinctrl/qcom/pinctrl-sm8650-lpass-lpi.c +f:drivers/pinctrl/qcom/pinctrl-sm8650.c +f:drivers/pinctrl/qcom/pinctrl-sm8750.c +f:drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +f:drivers/pinctrl/qcom/pinctrl-spmi-mpp.c +f:drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c +f:drivers/pinctrl/qcom/pinctrl-ssbi-mpp.c +f:drivers/pinctrl/qcom/pinctrl-x1e80100.c +f:drivers/pinctrl/qcom/tlmm-test.c +f:drivers/pinctrl/realtek/Kconfig +f:drivers/pinctrl/realtek/Makefile +f:drivers/pinctrl/realtek/pinctrl-rtd.c +f:drivers/pinctrl/realtek/pinctrl-rtd.h +f:drivers/pinctrl/realtek/pinctrl-rtd1315e.c +f:drivers/pinctrl/realtek/pinctrl-rtd1319d.c +f:drivers/pinctrl/realtek/pinctrl-rtd1619b.c +f:drivers/pinctrl/renesas/Kconfig +f:drivers/pinctrl/renesas/Makefile +f:drivers/pinctrl/renesas/core.c +f:drivers/pinctrl/renesas/core.h +f:drivers/pinctrl/renesas/gpio.c +f:drivers/pinctrl/renesas/pfc-emev2.c +f:drivers/pinctrl/renesas/pfc-r8a73a4.c +f:drivers/pinctrl/renesas/pfc-r8a7740.c +f:drivers/pinctrl/renesas/pfc-r8a77470.c +f:drivers/pinctrl/renesas/pfc-r8a7778.c +f:drivers/pinctrl/renesas/pfc-r8a7779.c +f:drivers/pinctrl/renesas/pfc-r8a7790.c +f:drivers/pinctrl/renesas/pfc-r8a7791.c +f:drivers/pinctrl/renesas/pfc-r8a7792.c +f:drivers/pinctrl/renesas/pfc-r8a7794.c +f:drivers/pinctrl/renesas/pfc-r8a77951.c +f:drivers/pinctrl/renesas/pfc-r8a7796.c +f:drivers/pinctrl/renesas/pfc-r8a77965.c +f:drivers/pinctrl/renesas/pfc-r8a77970.c +f:drivers/pinctrl/renesas/pfc-r8a77980.c +f:drivers/pinctrl/renesas/pfc-r8a77990.c +f:drivers/pinctrl/renesas/pfc-r8a77995.c +f:drivers/pinctrl/renesas/pfc-r8a779a0.c +f:drivers/pinctrl/renesas/pfc-r8a779f0.c +f:drivers/pinctrl/renesas/pfc-r8a779g0.c +f:drivers/pinctrl/renesas/pfc-r8a779h0.c +f:drivers/pinctrl/renesas/pfc-sh7203.c +f:drivers/pinctrl/renesas/pfc-sh7264.c +f:drivers/pinctrl/renesas/pfc-sh7269.c +f:drivers/pinctrl/renesas/pfc-sh73a0.c +f:drivers/pinctrl/renesas/pfc-sh7720.c +f:drivers/pinctrl/renesas/pfc-sh7722.c +f:drivers/pinctrl/renesas/pfc-sh7723.c +f:drivers/pinctrl/renesas/pfc-sh7724.c +f:drivers/pinctrl/renesas/pfc-sh7734.c +f:drivers/pinctrl/renesas/pfc-sh7757.c +f:drivers/pinctrl/renesas/pfc-sh7785.c +f:drivers/pinctrl/renesas/pfc-sh7786.c +f:drivers/pinctrl/renesas/pfc-shx3.c +f:drivers/pinctrl/renesas/pinctrl-rza1.c +f:drivers/pinctrl/renesas/pinctrl-rza2.c +f:drivers/pinctrl/renesas/pinctrl-rzg2l.c +f:drivers/pinctrl/renesas/pinctrl-rzn1.c +f:drivers/pinctrl/renesas/pinctrl-rzv2m.c +f:drivers/pinctrl/renesas/pinctrl.c +f:drivers/pinctrl/renesas/sh_pfc.h +f:drivers/pinctrl/samsung/Kconfig +f:drivers/pinctrl/samsung/Makefile +f:drivers/pinctrl/samsung/pinctrl-exynos-arm.c +f:drivers/pinctrl/samsung/pinctrl-exynos-arm64.c +f:drivers/pinctrl/samsung/pinctrl-exynos.c +f:drivers/pinctrl/samsung/pinctrl-exynos.h +f:drivers/pinctrl/samsung/pinctrl-s3c64xx.c +f:drivers/pinctrl/samsung/pinctrl-samsung.c +f:drivers/pinctrl/samsung/pinctrl-samsung.h +f:drivers/pinctrl/sophgo/Kconfig +f:drivers/pinctrl/sophgo/Makefile +f:drivers/pinctrl/sophgo/pinctrl-cv1800b.c +f:drivers/pinctrl/sophgo/pinctrl-cv1812h.c +f:drivers/pinctrl/sophgo/pinctrl-cv18xx.c +f:drivers/pinctrl/sophgo/pinctrl-cv18xx.h +f:drivers/pinctrl/sophgo/pinctrl-sg2000.c +f:drivers/pinctrl/sophgo/pinctrl-sg2002.c +f:drivers/pinctrl/sophgo/pinctrl-sg2042-ops.c +f:drivers/pinctrl/sophgo/pinctrl-sg2042.c +f:drivers/pinctrl/sophgo/pinctrl-sg2042.h +f:drivers/pinctrl/sophgo/pinctrl-sg2044.c +f:drivers/pinctrl/sophgo/pinctrl-sophgo-common.c +f:drivers/pinctrl/sophgo/pinctrl-sophgo.h +f:drivers/pinctrl/spacemit/Kconfig +f:drivers/pinctrl/spacemit/Makefile +f:drivers/pinctrl/spacemit/pinctrl-k1.c +f:drivers/pinctrl/spacemit/pinctrl-k1.h +f:drivers/pinctrl/spear/Kconfig +f:drivers/pinctrl/spear/Makefile +f:drivers/pinctrl/spear/pinctrl-plgpio.c +f:drivers/pinctrl/spear/pinctrl-spear.c +f:drivers/pinctrl/spear/pinctrl-spear.h +f:drivers/pinctrl/spear/pinctrl-spear1310.c +f:drivers/pinctrl/spear/pinctrl-spear1340.c +f:drivers/pinctrl/spear/pinctrl-spear300.c +f:drivers/pinctrl/spear/pinctrl-spear310.c +f:drivers/pinctrl/spear/pinctrl-spear320.c +f:drivers/pinctrl/spear/pinctrl-spear3xx.c +f:drivers/pinctrl/spear/pinctrl-spear3xx.h +f:drivers/pinctrl/sprd/Kconfig +f:drivers/pinctrl/sprd/Makefile +f:drivers/pinctrl/sprd/pinctrl-sprd-sc9860.c +f:drivers/pinctrl/sprd/pinctrl-sprd.c +f:drivers/pinctrl/sprd/pinctrl-sprd.h +f:drivers/pinctrl/starfive/Kconfig +f:drivers/pinctrl/starfive/Makefile +f:drivers/pinctrl/starfive/pinctrl-starfive-jh7100.c +f:drivers/pinctrl/starfive/pinctrl-starfive-jh7110-aon.c +f:drivers/pinctrl/starfive/pinctrl-starfive-jh7110-sys.c +f:drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c +f:drivers/pinctrl/starfive/pinctrl-starfive-jh7110.h +f:drivers/pinctrl/stm32/Kconfig +f:drivers/pinctrl/stm32/Makefile +f:drivers/pinctrl/stm32/pinctrl-stm32.c +f:drivers/pinctrl/stm32/pinctrl-stm32.h +f:drivers/pinctrl/stm32/pinctrl-stm32f429.c +f:drivers/pinctrl/stm32/pinctrl-stm32f469.c +f:drivers/pinctrl/stm32/pinctrl-stm32f746.c +f:drivers/pinctrl/stm32/pinctrl-stm32f769.c +f:drivers/pinctrl/stm32/pinctrl-stm32h743.c +f:drivers/pinctrl/stm32/pinctrl-stm32mp135.c +f:drivers/pinctrl/stm32/pinctrl-stm32mp157.c +f:drivers/pinctrl/stm32/pinctrl-stm32mp257.c +f:drivers/pinctrl/sunplus/Kconfig +f:drivers/pinctrl/sunplus/Makefile +f:drivers/pinctrl/sunplus/sppctl.c +f:drivers/pinctrl/sunplus/sppctl.h +f:drivers/pinctrl/sunplus/sppctl_sp7021.c +f:drivers/pinctrl/sunxi/Kconfig +f:drivers/pinctrl/sunxi/Makefile +f:drivers/pinctrl/sunxi/pinctrl-sun20i-d1.c +f:drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-a100-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-a100.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-a64-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-a64.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-h5.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-h6-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-h616-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun50i-h616.c +f:drivers/pinctrl/sunxi/pinctrl-sun55i-a523-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun55i-a523.c +f:drivers/pinctrl/sunxi/pinctrl-sun5i.c +f:drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun6i-a31.c +f:drivers/pinctrl/sunxi/pinctrl-sun8i-a23-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c +f:drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c +f:drivers/pinctrl/sunxi/pinctrl-sun8i-a83t-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun8i-a83t.c +f:drivers/pinctrl/sunxi/pinctrl-sun8i-h3-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun8i-h3.c +f:drivers/pinctrl/sunxi/pinctrl-sun8i-v3s.c +f:drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c +f:drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c +f:drivers/pinctrl/sunxi/pinctrl-suniv-f1c100s.c +f:drivers/pinctrl/sunxi/pinctrl-sunxi-dt.c +f:drivers/pinctrl/sunxi/pinctrl-sunxi.c +f:drivers/pinctrl/sunxi/pinctrl-sunxi.h +f:drivers/pinctrl/tegra/Kconfig +f:drivers/pinctrl/tegra/Makefile +f:drivers/pinctrl/tegra/pinctrl-tegra-xusb.c +f:drivers/pinctrl/tegra/pinctrl-tegra.c +f:drivers/pinctrl/tegra/pinctrl-tegra.h +f:drivers/pinctrl/tegra/pinctrl-tegra114.c +f:drivers/pinctrl/tegra/pinctrl-tegra124.c +f:drivers/pinctrl/tegra/pinctrl-tegra194.c +f:drivers/pinctrl/tegra/pinctrl-tegra20.c +f:drivers/pinctrl/tegra/pinctrl-tegra210.c +f:drivers/pinctrl/tegra/pinctrl-tegra234.c +f:drivers/pinctrl/tegra/pinctrl-tegra30.c +f:drivers/pinctrl/ti/Kconfig +f:drivers/pinctrl/ti/Makefile +f:drivers/pinctrl/ti/pinctrl-ti-iodelay.c +f:drivers/pinctrl/uniphier/Kconfig +f:drivers/pinctrl/uniphier/Makefile +f:drivers/pinctrl/uniphier/pinctrl-uniphier-core.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-ld11.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-ld4.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-ld6b.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-nx1.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-pro4.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-pro5.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-pxs2.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-pxs3.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier-sld8.c +f:drivers/pinctrl/uniphier/pinctrl-uniphier.h +f:drivers/pinctrl/visconti/Kconfig +f:drivers/pinctrl/visconti/Makefile +f:drivers/pinctrl/visconti/pinctrl-common.c +f:drivers/pinctrl/visconti/pinctrl-common.h +f:drivers/pinctrl/visconti/pinctrl-tmpv7700.c +f:drivers/pinctrl/vt8500/Kconfig +f:drivers/pinctrl/vt8500/Makefile +f:drivers/pinctrl/vt8500/pinctrl-vt8500.c +f:drivers/pinctrl/vt8500/pinctrl-wm8505.c +f:drivers/pinctrl/vt8500/pinctrl-wm8650.c +f:drivers/pinctrl/vt8500/pinctrl-wm8750.c +f:drivers/pinctrl/vt8500/pinctrl-wm8850.c +f:drivers/pinctrl/vt8500/pinctrl-wmt.c +f:drivers/pinctrl/vt8500/pinctrl-wmt.h +f:drivers/platform/Kconfig +f:drivers/platform/Makefile +f:drivers/platform/arm64/Kconfig +f:drivers/platform/arm64/Makefile +f:drivers/platform/arm64/acer-aspire1-ec.c +f:drivers/platform/arm64/huawei-gaokun-ec.c +f:drivers/platform/arm64/lenovo-yoga-c630.c +f:drivers/platform/chrome/Kconfig +f:drivers/platform/chrome/Makefile +f:drivers/platform/chrome/chromeos_acpi.c +f:drivers/platform/chrome/chromeos_laptop.c +f:drivers/platform/chrome/chromeos_of_hw_prober.c +f:drivers/platform/chrome/chromeos_privacy_screen.c +f:drivers/platform/chrome/chromeos_pstore.c +f:drivers/platform/chrome/chromeos_tbmc.c +f:drivers/platform/chrome/cros_ec.c +f:drivers/platform/chrome/cros_ec.h +f:drivers/platform/chrome/cros_ec_chardev.c +f:drivers/platform/chrome/cros_ec_debugfs.c +f:drivers/platform/chrome/cros_ec_i2c.c +f:drivers/platform/chrome/cros_ec_ishtp.c +f:drivers/platform/chrome/cros_ec_lightbar.c +f:drivers/platform/chrome/cros_ec_lpc.c +f:drivers/platform/chrome/cros_ec_lpc_mec.c +f:drivers/platform/chrome/cros_ec_lpc_mec.h +f:drivers/platform/chrome/cros_ec_proto.c +f:drivers/platform/chrome/cros_ec_proto_test.c +f:drivers/platform/chrome/cros_ec_proto_test_util.c +f:drivers/platform/chrome/cros_ec_proto_test_util.h +f:drivers/platform/chrome/cros_ec_rpmsg.c +f:drivers/platform/chrome/cros_ec_sensorhub.c +f:drivers/platform/chrome/cros_ec_sensorhub_ring.c +f:drivers/platform/chrome/cros_ec_sensorhub_trace.h +f:drivers/platform/chrome/cros_ec_spi.c +f:drivers/platform/chrome/cros_ec_sysfs.c +f:drivers/platform/chrome/cros_ec_trace.c +f:drivers/platform/chrome/cros_ec_trace.h +f:drivers/platform/chrome/cros_ec_typec.c +f:drivers/platform/chrome/cros_ec_typec.h +f:drivers/platform/chrome/cros_ec_uart.c +f:drivers/platform/chrome/cros_ec_vbc.c +f:drivers/platform/chrome/cros_hps_i2c.c +f:drivers/platform/chrome/cros_kbd_led_backlight.c +f:drivers/platform/chrome/cros_typec_altmode.c +f:drivers/platform/chrome/cros_typec_altmode.h +f:drivers/platform/chrome/cros_typec_switch.c +f:drivers/platform/chrome/cros_typec_vdm.c +f:drivers/platform/chrome/cros_typec_vdm.h +f:drivers/platform/chrome/cros_usbpd_logger.c +f:drivers/platform/chrome/cros_usbpd_notify.c +f:drivers/platform/chrome/wilco_ec/Kconfig +f:drivers/platform/chrome/wilco_ec/Makefile +f:drivers/platform/chrome/wilco_ec/core.c +f:drivers/platform/chrome/wilco_ec/debugfs.c +f:drivers/platform/chrome/wilco_ec/event.c +f:drivers/platform/chrome/wilco_ec/keyboard_leds.c +f:drivers/platform/chrome/wilco_ec/mailbox.c +f:drivers/platform/chrome/wilco_ec/properties.c +f:drivers/platform/chrome/wilco_ec/sysfs.c +f:drivers/platform/chrome/wilco_ec/telemetry.c +f:drivers/platform/cznic/Kconfig +f:drivers/platform/cznic/Makefile +f:drivers/platform/cznic/turris-omnia-mcu-base.c +f:drivers/platform/cznic/turris-omnia-mcu-gpio.c +f:drivers/platform/cznic/turris-omnia-mcu-keyctl.c +f:drivers/platform/cznic/turris-omnia-mcu-sys-off-wakeup.c +f:drivers/platform/cznic/turris-omnia-mcu-trng.c +f:drivers/platform/cznic/turris-omnia-mcu-watchdog.c +f:drivers/platform/cznic/turris-omnia-mcu.h +f:drivers/platform/cznic/turris-signing-key.c +f:drivers/platform/goldfish/Kconfig +f:drivers/platform/goldfish/Makefile +f:drivers/platform/goldfish/goldfish_pipe.c +f:drivers/platform/goldfish/goldfish_pipe_qemu.h +f:drivers/platform/loongarch/Kconfig +f:drivers/platform/loongarch/Makefile +f:drivers/platform/loongarch/loongson-laptop.c +f:drivers/platform/mellanox/Kconfig +f:drivers/platform/mellanox/Makefile +f:drivers/platform/mellanox/mlx-platform.c +f:drivers/platform/mellanox/mlxbf-bootctl.c +f:drivers/platform/mellanox/mlxbf-bootctl.h +f:drivers/platform/mellanox/mlxbf-pmc.c +f:drivers/platform/mellanox/mlxbf-tmfifo-regs.h +f:drivers/platform/mellanox/mlxbf-tmfifo.c +f:drivers/platform/mellanox/mlxreg-dpu.c +f:drivers/platform/mellanox/mlxreg-hotplug.c +f:drivers/platform/mellanox/mlxreg-io.c +f:drivers/platform/mellanox/mlxreg-lc.c +f:drivers/platform/mellanox/nvsw-sn2201.c +f:drivers/platform/mips/Kconfig +f:drivers/platform/mips/Makefile +f:drivers/platform/mips/cpu_hwmon.c +f:drivers/platform/mips/ls2k-reset.c +f:drivers/platform/mips/rs780e-acpi.c +f:drivers/platform/olpc/Kconfig +f:drivers/platform/olpc/Makefile +f:drivers/platform/olpc/olpc-ec.c +f:drivers/platform/olpc/olpc-xo175-ec.c +f:drivers/platform/surface/Kconfig +f:drivers/platform/surface/Makefile +f:drivers/platform/surface/aggregator/Kconfig +f:drivers/platform/surface/aggregator/Makefile +f:drivers/platform/surface/aggregator/bus.c +f:drivers/platform/surface/aggregator/bus.h +f:drivers/platform/surface/aggregator/controller.c +f:drivers/platform/surface/aggregator/controller.h +f:drivers/platform/surface/aggregator/core.c +f:drivers/platform/surface/aggregator/ssh_msgb.h +f:drivers/platform/surface/aggregator/ssh_packet_layer.c +f:drivers/platform/surface/aggregator/ssh_packet_layer.h +f:drivers/platform/surface/aggregator/ssh_parser.c +f:drivers/platform/surface/aggregator/ssh_parser.h +f:drivers/platform/surface/aggregator/ssh_request_layer.c +f:drivers/platform/surface/aggregator/ssh_request_layer.h +f:drivers/platform/surface/aggregator/trace.h +f:drivers/platform/surface/surface3-wmi.c +f:drivers/platform/surface/surface3_power.c +f:drivers/platform/surface/surface_acpi_notify.c +f:drivers/platform/surface/surface_aggregator_cdev.c +f:drivers/platform/surface/surface_aggregator_hub.c +f:drivers/platform/surface/surface_aggregator_registry.c +f:drivers/platform/surface/surface_aggregator_tabletsw.c +f:drivers/platform/surface/surface_dtx.c +f:drivers/platform/surface/surface_gpe.c +f:drivers/platform/surface/surface_hotplug.c +f:drivers/platform/surface/surface_platform_profile.c +f:drivers/platform/surface/surfacepro3_button.c +f:drivers/platform/x86/Kconfig +f:drivers/platform/x86/Makefile +f:drivers/platform/x86/acer-wireless.c +f:drivers/platform/x86/acer-wmi.c +f:drivers/platform/x86/acerhdf.c +f:drivers/platform/x86/adv_swbutton.c +f:drivers/platform/x86/amd/Kconfig +f:drivers/platform/x86/amd/Makefile +f:drivers/platform/x86/amd/amd_isp4.c +f:drivers/platform/x86/amd/hfi/Kconfig +f:drivers/platform/x86/amd/hfi/Makefile +f:drivers/platform/x86/amd/hfi/hfi.c +f:drivers/platform/x86/amd/hsmp/Kconfig +f:drivers/platform/x86/amd/hsmp/Makefile +f:drivers/platform/x86/amd/hsmp/acpi.c +f:drivers/platform/x86/amd/hsmp/hsmp.c +f:drivers/platform/x86/amd/hsmp/hsmp.h +f:drivers/platform/x86/amd/hsmp/hwmon.c +f:drivers/platform/x86/amd/hsmp/plat.c +f:drivers/platform/x86/amd/pmc/Kconfig +f:drivers/platform/x86/amd/pmc/Makefile +f:drivers/platform/x86/amd/pmc/mp1_stb.c +f:drivers/platform/x86/amd/pmc/mp2_stb.c +f:drivers/platform/x86/amd/pmc/pmc-quirks.c +f:drivers/platform/x86/amd/pmc/pmc.c +f:drivers/platform/x86/amd/pmc/pmc.h +f:drivers/platform/x86/amd/pmf/Kconfig +f:drivers/platform/x86/amd/pmf/Makefile +f:drivers/platform/x86/amd/pmf/acpi.c +f:drivers/platform/x86/amd/pmf/auto-mode.c +f:drivers/platform/x86/amd/pmf/cnqf.c +f:drivers/platform/x86/amd/pmf/core.c +f:drivers/platform/x86/amd/pmf/pmf.h +f:drivers/platform/x86/amd/pmf/spc.c +f:drivers/platform/x86/amd/pmf/sps.c +f:drivers/platform/x86/amd/pmf/tee-if.c +f:drivers/platform/x86/amd/wbrf.c +f:drivers/platform/x86/amd/x3d_vcache.c +f:drivers/platform/x86/amilo-rfkill.c +f:drivers/platform/x86/apple-gmux.c +f:drivers/platform/x86/asus-laptop.c +f:drivers/platform/x86/asus-nb-wmi.c +f:drivers/platform/x86/asus-tf103c-dock.c +f:drivers/platform/x86/asus-wireless.c +f:drivers/platform/x86/asus-wmi.c +f:drivers/platform/x86/asus-wmi.h +f:drivers/platform/x86/barco-p50-gpio.c +f:drivers/platform/x86/classmate-laptop.c +f:drivers/platform/x86/compal-laptop.c +f:drivers/platform/x86/dasharo-acpi.c +f:drivers/platform/x86/dell/Kconfig +f:drivers/platform/x86/dell/Makefile +f:drivers/platform/x86/dell/alienware-wmi-base.c +f:drivers/platform/x86/dell/alienware-wmi-legacy.c +f:drivers/platform/x86/dell/alienware-wmi-wmax.c +f:drivers/platform/x86/dell/alienware-wmi.h +f:drivers/platform/x86/dell/dcdbas.c +f:drivers/platform/x86/dell/dcdbas.h +f:drivers/platform/x86/dell/dell-laptop.c +f:drivers/platform/x86/dell/dell-lis3lv02d.c +f:drivers/platform/x86/dell/dell-pc.c +f:drivers/platform/x86/dell/dell-rbtn.c +f:drivers/platform/x86/dell/dell-rbtn.h +f:drivers/platform/x86/dell/dell-smbios-base.c +f:drivers/platform/x86/dell/dell-smbios-smm.c +f:drivers/platform/x86/dell/dell-smbios-wmi.c +f:drivers/platform/x86/dell/dell-smbios.h +f:drivers/platform/x86/dell/dell-smo8800-ids.h +f:drivers/platform/x86/dell/dell-smo8800.c +f:drivers/platform/x86/dell/dell-uart-backlight.c +f:drivers/platform/x86/dell/dell-wmi-aio.c +f:drivers/platform/x86/dell/dell-wmi-base.c +f:drivers/platform/x86/dell/dell-wmi-ddv.c +f:drivers/platform/x86/dell/dell-wmi-descriptor.c +f:drivers/platform/x86/dell/dell-wmi-descriptor.h +f:drivers/platform/x86/dell/dell-wmi-led.c +f:drivers/platform/x86/dell/dell-wmi-privacy.c +f:drivers/platform/x86/dell/dell-wmi-privacy.h +f:drivers/platform/x86/dell/dell-wmi-sysman/Makefile +f:drivers/platform/x86/dell/dell-wmi-sysman/biosattr-interface.c +f:drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h +f:drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c +f:drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c +f:drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c +f:drivers/platform/x86/dell/dell-wmi-sysman/passwordattr-interface.c +f:drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c +f:drivers/platform/x86/dell/dell-wmi-sysman/sysman.c +f:drivers/platform/x86/dell/dell_rbu.c +f:drivers/platform/x86/dual_accel_detect.h +f:drivers/platform/x86/eeepc-laptop.c +f:drivers/platform/x86/eeepc-wmi.c +f:drivers/platform/x86/firmware_attributes_class.c +f:drivers/platform/x86/firmware_attributes_class.h +f:drivers/platform/x86/fujitsu-laptop.c +f:drivers/platform/x86/fujitsu-tablet.c +f:drivers/platform/x86/gigabyte-wmi.c +f:drivers/platform/x86/gpd-pocket-fan.c +f:drivers/platform/x86/hdaps.c +f:drivers/platform/x86/hp/Kconfig +f:drivers/platform/x86/hp/Makefile +f:drivers/platform/x86/hp/hp-bioscfg/Makefile +f:drivers/platform/x86/hp/hp-bioscfg/biosattr-interface.c +f:drivers/platform/x86/hp/hp-bioscfg/bioscfg.c +f:drivers/platform/x86/hp/hp-bioscfg/bioscfg.h +f:drivers/platform/x86/hp/hp-bioscfg/enum-attributes.c +f:drivers/platform/x86/hp/hp-bioscfg/int-attributes.c +f:drivers/platform/x86/hp/hp-bioscfg/order-list-attributes.c +f:drivers/platform/x86/hp/hp-bioscfg/passwdobj-attributes.c +f:drivers/platform/x86/hp/hp-bioscfg/spmobj-attributes.c +f:drivers/platform/x86/hp/hp-bioscfg/string-attributes.c +f:drivers/platform/x86/hp/hp-bioscfg/surestart-attributes.c +f:drivers/platform/x86/hp/hp-wmi.c +f:drivers/platform/x86/hp/hp_accel.c +f:drivers/platform/x86/hp/tc1100-wmi.c +f:drivers/platform/x86/huawei-wmi.c +f:drivers/platform/x86/ibm_rtl.c +f:drivers/platform/x86/inspur_platform_profile.c +f:drivers/platform/x86/intel/Kconfig +f:drivers/platform/x86/intel/Makefile +f:drivers/platform/x86/intel/atomisp2/Kconfig +f:drivers/platform/x86/intel/atomisp2/Makefile +f:drivers/platform/x86/intel/atomisp2/led.c +f:drivers/platform/x86/intel/atomisp2/pm.c +f:drivers/platform/x86/intel/bxtwc_tmu.c +f:drivers/platform/x86/intel/bytcrc_pwrsrc.c +f:drivers/platform/x86/intel/chtdc_ti_pwrbtn.c +f:drivers/platform/x86/intel/chtwc_int33fe.c +f:drivers/platform/x86/intel/crystal_cove_charger.c +f:drivers/platform/x86/intel/hid.c +f:drivers/platform/x86/intel/ifs/Kconfig +f:drivers/platform/x86/intel/ifs/Makefile +f:drivers/platform/x86/intel/ifs/core.c +f:drivers/platform/x86/intel/ifs/ifs.h +f:drivers/platform/x86/intel/ifs/load.c +f:drivers/platform/x86/intel/ifs/runtest.c +f:drivers/platform/x86/intel/ifs/sysfs.c +f:drivers/platform/x86/intel/int0002_vgpio.c +f:drivers/platform/x86/intel/int1092/Kconfig +f:drivers/platform/x86/intel/int1092/Makefile +f:drivers/platform/x86/intel/int1092/intel_sar.c +f:drivers/platform/x86/intel/int1092/intel_sar.h +f:drivers/platform/x86/intel/int3472/Kconfig +f:drivers/platform/x86/intel/int3472/Makefile +f:drivers/platform/x86/intel/int3472/clk_and_regulator.c +f:drivers/platform/x86/intel/int3472/common.c +f:drivers/platform/x86/intel/int3472/discrete.c +f:drivers/platform/x86/intel/int3472/discrete_quirks.c +f:drivers/platform/x86/intel/int3472/led.c +f:drivers/platform/x86/intel/int3472/tps68470.c +f:drivers/platform/x86/intel/int3472/tps68470.h +f:drivers/platform/x86/intel/int3472/tps68470_board_data.c +f:drivers/platform/x86/intel/ishtp_eclite.c +f:drivers/platform/x86/intel/mrfld_pwrbtn.c +f:drivers/platform/x86/intel/oaktrail.c +f:drivers/platform/x86/intel/plr_tpmi.c +f:drivers/platform/x86/intel/pmc/Kconfig +f:drivers/platform/x86/intel/pmc/Makefile +f:drivers/platform/x86/intel/pmc/adl.c +f:drivers/platform/x86/intel/pmc/arl.c +f:drivers/platform/x86/intel/pmc/cnp.c +f:drivers/platform/x86/intel/pmc/core.c +f:drivers/platform/x86/intel/pmc/core.h +f:drivers/platform/x86/intel/pmc/icl.c +f:drivers/platform/x86/intel/pmc/lnl.c +f:drivers/platform/x86/intel/pmc/mtl.c +f:drivers/platform/x86/intel/pmc/pltdrv.c +f:drivers/platform/x86/intel/pmc/ptl.c +f:drivers/platform/x86/intel/pmc/spt.c +f:drivers/platform/x86/intel/pmc/ssram_telemetry.c +f:drivers/platform/x86/intel/pmc/ssram_telemetry.h +f:drivers/platform/x86/intel/pmc/tgl.c +f:drivers/platform/x86/intel/pmt/Kconfig +f:drivers/platform/x86/intel/pmt/Makefile +f:drivers/platform/x86/intel/pmt/class.c +f:drivers/platform/x86/intel/pmt/class.h +f:drivers/platform/x86/intel/pmt/crashlog.c +f:drivers/platform/x86/intel/pmt/discovery-kunit.c +f:drivers/platform/x86/intel/pmt/discovery.c +f:drivers/platform/x86/intel/pmt/features.c +f:drivers/platform/x86/intel/pmt/telemetry.c +f:drivers/platform/x86/intel/pmt/telemetry.h +f:drivers/platform/x86/intel/punit_ipc.c +f:drivers/platform/x86/intel/rst.c +f:drivers/platform/x86/intel/sdsi.c +f:drivers/platform/x86/intel/smartconnect.c +f:drivers/platform/x86/intel/speed_select_if/Kconfig +f:drivers/platform/x86/intel/speed_select_if/Makefile +f:drivers/platform/x86/intel/speed_select_if/isst_if_common.c +f:drivers/platform/x86/intel/speed_select_if/isst_if_common.h +f:drivers/platform/x86/intel/speed_select_if/isst_if_mbox_msr.c +f:drivers/platform/x86/intel/speed_select_if/isst_if_mbox_pci.c +f:drivers/platform/x86/intel/speed_select_if/isst_if_mmio.c +f:drivers/platform/x86/intel/speed_select_if/isst_tpmi.c +f:drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c +f:drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.h +f:drivers/platform/x86/intel/telemetry/Kconfig +f:drivers/platform/x86/intel/telemetry/Makefile +f:drivers/platform/x86/intel/telemetry/core.c +f:drivers/platform/x86/intel/telemetry/debugfs.c +f:drivers/platform/x86/intel/telemetry/pltdrv.c +f:drivers/platform/x86/intel/tpmi_power_domains.c +f:drivers/platform/x86/intel/tpmi_power_domains.h +f:drivers/platform/x86/intel/turbo_max_3.c +f:drivers/platform/x86/intel/uncore-frequency/Kconfig +f:drivers/platform/x86/intel/uncore-frequency/Makefile +f:drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c +f:drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h +f:drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c +f:drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c +f:drivers/platform/x86/intel/vbtn.c +f:drivers/platform/x86/intel/vsec.c +f:drivers/platform/x86/intel/vsec_tpmi.c +f:drivers/platform/x86/intel/wmi/Kconfig +f:drivers/platform/x86/intel/wmi/Makefile +f:drivers/platform/x86/intel/wmi/sbl-fw-update.c +f:drivers/platform/x86/intel/wmi/thunderbolt.c +f:drivers/platform/x86/intel_ips.c +f:drivers/platform/x86/intel_ips.h +f:drivers/platform/x86/intel_scu_ipc.c +f:drivers/platform/x86/intel_scu_ipcutil.c +f:drivers/platform/x86/intel_scu_pcidrv.c +f:drivers/platform/x86/intel_scu_pltdrv.c +f:drivers/platform/x86/intel_scu_wdt.c +f:drivers/platform/x86/lenovo/Kconfig +f:drivers/platform/x86/lenovo/Makefile +f:drivers/platform/x86/lenovo/ideapad-laptop.c +f:drivers/platform/x86/lenovo/ideapad-laptop.h +f:drivers/platform/x86/lenovo/think-lmi.c +f:drivers/platform/x86/lenovo/think-lmi.h +f:drivers/platform/x86/lenovo/thinkpad_acpi.c +f:drivers/platform/x86/lenovo/wmi-camera.c +f:drivers/platform/x86/lenovo/wmi-capdata01.c +f:drivers/platform/x86/lenovo/wmi-capdata01.h +f:drivers/platform/x86/lenovo/wmi-events.c +f:drivers/platform/x86/lenovo/wmi-events.h +f:drivers/platform/x86/lenovo/wmi-gamezone.c +f:drivers/platform/x86/lenovo/wmi-gamezone.h +f:drivers/platform/x86/lenovo/wmi-helpers.c +f:drivers/platform/x86/lenovo/wmi-helpers.h +f:drivers/platform/x86/lenovo/wmi-hotkey-utilities.c +f:drivers/platform/x86/lenovo/wmi-other.c +f:drivers/platform/x86/lenovo/wmi-other.h +f:drivers/platform/x86/lenovo/ymc.c +f:drivers/platform/x86/lenovo/yoga-tab2-pro-1380-fastcharger.c +f:drivers/platform/x86/lenovo/yogabook.c +f:drivers/platform/x86/lg-laptop.c +f:drivers/platform/x86/meegopad_anx7428.c +f:drivers/platform/x86/meraki-mx100.c +f:drivers/platform/x86/msi-ec.c +f:drivers/platform/x86/msi-ec.h +f:drivers/platform/x86/msi-laptop.c +f:drivers/platform/x86/msi-wmi-platform.c +f:drivers/platform/x86/msi-wmi.c +f:drivers/platform/x86/mxm-wmi.c +f:drivers/platform/x86/nvidia-wmi-ec-backlight.c +f:drivers/platform/x86/oxpec.c +f:drivers/platform/x86/p2sb.c +f:drivers/platform/x86/panasonic-laptop.c +f:drivers/platform/x86/pcengines-apuv2.c +f:drivers/platform/x86/pmc_atom.c +f:drivers/platform/x86/portwell-ec.c +f:drivers/platform/x86/quickstart.c +f:drivers/platform/x86/samsung-galaxybook.c +f:drivers/platform/x86/samsung-laptop.c +f:drivers/platform/x86/samsung-q10.c +f:drivers/platform/x86/sel3350-platform.c +f:drivers/platform/x86/serdev_helpers.h +f:drivers/platform/x86/serial-multi-instantiate.c +f:drivers/platform/x86/siemens/Kconfig +f:drivers/platform/x86/siemens/Makefile +f:drivers/platform/x86/siemens/simatic-ipc-batt-apollolake.c +f:drivers/platform/x86/siemens/simatic-ipc-batt-elkhartlake.c +f:drivers/platform/x86/siemens/simatic-ipc-batt-f7188x.c +f:drivers/platform/x86/siemens/simatic-ipc-batt.c +f:drivers/platform/x86/siemens/simatic-ipc-batt.h +f:drivers/platform/x86/siemens/simatic-ipc.c +f:drivers/platform/x86/silicom-platform.c +f:drivers/platform/x86/sony-laptop.c +f:drivers/platform/x86/system76_acpi.c +f:drivers/platform/x86/topstar-laptop.c +f:drivers/platform/x86/toshiba-wmi.c +f:drivers/platform/x86/toshiba_acpi.c +f:drivers/platform/x86/toshiba_bluetooth.c +f:drivers/platform/x86/toshiba_haps.c +f:drivers/platform/x86/touchscreen_dmi.c +f:drivers/platform/x86/tuxedo/Kconfig +f:drivers/platform/x86/tuxedo/Makefile +f:drivers/platform/x86/tuxedo/nb04/Kconfig +f:drivers/platform/x86/tuxedo/nb04/Makefile +f:drivers/platform/x86/tuxedo/nb04/wmi_ab.c +f:drivers/platform/x86/tuxedo/nb04/wmi_util.c +f:drivers/platform/x86/tuxedo/nb04/wmi_util.h +f:drivers/platform/x86/uv_sysfs.c +f:drivers/platform/x86/winmate-fm07-keys.c +f:drivers/platform/x86/wireless-hotkey.c +f:drivers/platform/x86/wmi-bmof.c +f:drivers/platform/x86/wmi.c +f:drivers/platform/x86/x86-android-tablets/Kconfig +f:drivers/platform/x86/x86-android-tablets/Makefile +f:drivers/platform/x86/x86-android-tablets/asus.c +f:drivers/platform/x86/x86-android-tablets/core.c +f:drivers/platform/x86/x86-android-tablets/dmi.c +f:drivers/platform/x86/x86-android-tablets/lenovo.c +f:drivers/platform/x86/x86-android-tablets/other.c +f:drivers/platform/x86/x86-android-tablets/shared-psy-info.c +f:drivers/platform/x86/x86-android-tablets/shared-psy-info.h +f:drivers/platform/x86/x86-android-tablets/vexia_atla10_ec.c +f:drivers/platform/x86/x86-android-tablets/x86-android-tablets.h +f:drivers/platform/x86/xiaomi-wmi.c +f:drivers/platform/x86/xo1-rfkill.c +f:drivers/platform/x86/xo15-ebook.c +f:drivers/pmdomain/Kconfig +f:drivers/pmdomain/Makefile +f:drivers/pmdomain/actions/Kconfig +f:drivers/pmdomain/actions/Makefile +f:drivers/pmdomain/actions/owl-sps-helper.c +f:drivers/pmdomain/actions/owl-sps.c +f:drivers/pmdomain/amlogic/Kconfig +f:drivers/pmdomain/amlogic/Makefile +f:drivers/pmdomain/amlogic/meson-ee-pwrc.c +f:drivers/pmdomain/amlogic/meson-secure-pwrc.c +f:drivers/pmdomain/apple/Kconfig +f:drivers/pmdomain/apple/Makefile +f:drivers/pmdomain/apple/pmgr-pwrstate.c +f:drivers/pmdomain/arm/Kconfig +f:drivers/pmdomain/arm/Makefile +f:drivers/pmdomain/arm/scmi_perf_domain.c +f:drivers/pmdomain/arm/scmi_pm_domain.c +f:drivers/pmdomain/arm/scpi_pm_domain.c +f:drivers/pmdomain/bcm/Kconfig +f:drivers/pmdomain/bcm/Makefile +f:drivers/pmdomain/bcm/bcm-pmb.c +f:drivers/pmdomain/bcm/bcm2835-power.c +f:drivers/pmdomain/bcm/bcm63xx-power.c +f:drivers/pmdomain/bcm/raspberrypi-power.c +f:drivers/pmdomain/core.c +f:drivers/pmdomain/governor.c +f:drivers/pmdomain/imx/Kconfig +f:drivers/pmdomain/imx/Makefile +f:drivers/pmdomain/imx/gpc.c +f:drivers/pmdomain/imx/gpcv2.c +f:drivers/pmdomain/imx/imx8m-blk-ctrl.c +f:drivers/pmdomain/imx/imx8mp-blk-ctrl.c +f:drivers/pmdomain/imx/imx93-blk-ctrl.c +f:drivers/pmdomain/imx/imx93-pd.c +f:drivers/pmdomain/imx/scu-pd.c +f:drivers/pmdomain/mediatek/Kconfig +f:drivers/pmdomain/mediatek/Makefile +f:drivers/pmdomain/mediatek/airoha-cpu-pmdomain.c +f:drivers/pmdomain/mediatek/mt6735-pm-domains.h +f:drivers/pmdomain/mediatek/mt6795-pm-domains.h +f:drivers/pmdomain/mediatek/mt6893-pm-domains.h +f:drivers/pmdomain/mediatek/mt8167-pm-domains.h +f:drivers/pmdomain/mediatek/mt8173-pm-domains.h +f:drivers/pmdomain/mediatek/mt8183-pm-domains.h +f:drivers/pmdomain/mediatek/mt8186-pm-domains.h +f:drivers/pmdomain/mediatek/mt8188-pm-domains.h +f:drivers/pmdomain/mediatek/mt8192-pm-domains.h +f:drivers/pmdomain/mediatek/mt8195-pm-domains.h +f:drivers/pmdomain/mediatek/mt8365-pm-domains.h +f:drivers/pmdomain/mediatek/mtk-pm-domains.c +f:drivers/pmdomain/mediatek/mtk-pm-domains.h +f:drivers/pmdomain/mediatek/mtk-scpsys.c +f:drivers/pmdomain/qcom/Kconfig +f:drivers/pmdomain/qcom/Makefile +f:drivers/pmdomain/qcom/cpr.c +f:drivers/pmdomain/qcom/rpmhpd.c +f:drivers/pmdomain/qcom/rpmpd.c +f:drivers/pmdomain/renesas/Kconfig +f:drivers/pmdomain/renesas/Makefile +f:drivers/pmdomain/renesas/r8a7742-sysc.c +f:drivers/pmdomain/renesas/r8a7743-sysc.c +f:drivers/pmdomain/renesas/r8a7745-sysc.c +f:drivers/pmdomain/renesas/r8a77470-sysc.c +f:drivers/pmdomain/renesas/r8a774a1-sysc.c +f:drivers/pmdomain/renesas/r8a774b1-sysc.c +f:drivers/pmdomain/renesas/r8a774c0-sysc.c +f:drivers/pmdomain/renesas/r8a774e1-sysc.c +f:drivers/pmdomain/renesas/r8a7779-sysc.c +f:drivers/pmdomain/renesas/r8a7790-sysc.c +f:drivers/pmdomain/renesas/r8a7791-sysc.c +f:drivers/pmdomain/renesas/r8a7792-sysc.c +f:drivers/pmdomain/renesas/r8a7794-sysc.c +f:drivers/pmdomain/renesas/r8a7795-sysc.c +f:drivers/pmdomain/renesas/r8a77960-sysc.c +f:drivers/pmdomain/renesas/r8a77961-sysc.c +f:drivers/pmdomain/renesas/r8a77965-sysc.c +f:drivers/pmdomain/renesas/r8a77970-sysc.c +f:drivers/pmdomain/renesas/r8a77980-sysc.c +f:drivers/pmdomain/renesas/r8a77990-sysc.c +f:drivers/pmdomain/renesas/r8a77995-sysc.c +f:drivers/pmdomain/renesas/r8a779a0-sysc.c +f:drivers/pmdomain/renesas/r8a779f0-sysc.c +f:drivers/pmdomain/renesas/r8a779g0-sysc.c +f:drivers/pmdomain/renesas/r8a779h0-sysc.c +f:drivers/pmdomain/renesas/rcar-gen4-sysc.c +f:drivers/pmdomain/renesas/rcar-gen4-sysc.h +f:drivers/pmdomain/renesas/rcar-sysc.c +f:drivers/pmdomain/renesas/rcar-sysc.h +f:drivers/pmdomain/renesas/rmobile-sysc.c +f:drivers/pmdomain/rockchip/Kconfig +f:drivers/pmdomain/rockchip/Makefile +f:drivers/pmdomain/rockchip/pm-domains.c +f:drivers/pmdomain/samsung/Kconfig +f:drivers/pmdomain/samsung/Makefile +f:drivers/pmdomain/samsung/exynos-pm-domains.c +f:drivers/pmdomain/st/Kconfig +f:drivers/pmdomain/st/Makefile +f:drivers/pmdomain/st/ste-ux500-pm-domain.c +f:drivers/pmdomain/starfive/Kconfig +f:drivers/pmdomain/starfive/Makefile +f:drivers/pmdomain/starfive/jh71xx-pmu.c +f:drivers/pmdomain/sunxi/Kconfig +f:drivers/pmdomain/sunxi/Makefile +f:drivers/pmdomain/sunxi/sun20i-ppu.c +f:drivers/pmdomain/sunxi/sun50i-h6-prcm-ppu.c +f:drivers/pmdomain/sunxi/sun55i-pck600.c +f:drivers/pmdomain/tegra/Kconfig +f:drivers/pmdomain/tegra/Makefile +f:drivers/pmdomain/tegra/powergate-bpmp.c +f:drivers/pmdomain/thead/Kconfig +f:drivers/pmdomain/thead/Makefile +f:drivers/pmdomain/thead/th1520-pm-domains.c +f:drivers/pmdomain/ti/Kconfig +f:drivers/pmdomain/ti/Makefile +f:drivers/pmdomain/ti/omap_prm.c +f:drivers/pmdomain/ti/ti_sci_pm_domains.c +f:drivers/pmdomain/xilinx/Kconfig +f:drivers/pmdomain/xilinx/Makefile +f:drivers/pmdomain/xilinx/zynqmp-pm-domains.c +f:drivers/pnp/Kconfig +f:drivers/pnp/Makefile +f:drivers/pnp/base.h +f:drivers/pnp/card.c +f:drivers/pnp/core.c +f:drivers/pnp/driver.c +f:drivers/pnp/interface.c +f:drivers/pnp/isapnp/Kconfig +f:drivers/pnp/isapnp/Makefile +f:drivers/pnp/isapnp/compat.c +f:drivers/pnp/isapnp/core.c +f:drivers/pnp/isapnp/proc.c +f:drivers/pnp/manager.c +f:drivers/pnp/pnpacpi/Kconfig +f:drivers/pnp/pnpacpi/Makefile +f:drivers/pnp/pnpacpi/core.c +f:drivers/pnp/pnpacpi/pnpacpi.h +f:drivers/pnp/pnpacpi/rsparser.c +f:drivers/pnp/pnpbios/Kconfig +f:drivers/pnp/pnpbios/Makefile +f:drivers/pnp/pnpbios/bioscalls.c +f:drivers/pnp/pnpbios/core.c +f:drivers/pnp/pnpbios/pnpbios.h +f:drivers/pnp/pnpbios/proc.c +f:drivers/pnp/pnpbios/rsparser.c +f:drivers/pnp/quirks.c +f:drivers/pnp/resource.c +f:drivers/pnp/support.c +f:drivers/pnp/system.c +f:drivers/power/Kconfig +f:drivers/power/Makefile +f:drivers/power/reset/Kconfig +f:drivers/power/reset/Makefile +f:drivers/power/reset/arm-versatile-reboot.c +f:drivers/power/reset/as3722-poweroff.c +f:drivers/power/reset/at91-poweroff.c +f:drivers/power/reset/at91-reset.c +f:drivers/power/reset/at91-sama5d2_shdwc.c +f:drivers/power/reset/atc260x-poweroff.c +f:drivers/power/reset/axxia-reset.c +f:drivers/power/reset/brcm-kona-reset.c +f:drivers/power/reset/brcmstb-reboot.c +f:drivers/power/reset/ep93xx-restart.c +f:drivers/power/reset/gemini-poweroff.c +f:drivers/power/reset/gpio-poweroff.c +f:drivers/power/reset/gpio-restart.c +f:drivers/power/reset/hisi-reboot.c +f:drivers/power/reset/keystone-reset.c +f:drivers/power/reset/linkstation-poweroff.c +f:drivers/power/reset/ltc2952-poweroff.c +f:drivers/power/reset/macsmc-reboot.c +f:drivers/power/reset/msm-poweroff.c +f:drivers/power/reset/mt6323-poweroff.c +f:drivers/power/reset/nvmem-reboot-mode.c +f:drivers/power/reset/ocelot-reset.c +f:drivers/power/reset/odroid-go-ultra-poweroff.c +f:drivers/power/reset/piix4-poweroff.c +f:drivers/power/reset/pwr-mlxbf.c +f:drivers/power/reset/qcom-pon.c +f:drivers/power/reset/qnap-poweroff.c +f:drivers/power/reset/reboot-mode.c +f:drivers/power/reset/regulator-poweroff.c +f:drivers/power/reset/restart-poweroff.c +f:drivers/power/reset/rmobile-reset.c +f:drivers/power/reset/sc27xx-poweroff.c +f:drivers/power/reset/st-poweroff.c +f:drivers/power/reset/syscon-poweroff.c +f:drivers/power/reset/syscon-reboot-mode.c +f:drivers/power/reset/syscon-reboot.c +f:drivers/power/reset/tdx-ec-poweroff.c +f:drivers/power/reset/tps65086-restart.c +f:drivers/power/reset/vexpress-poweroff.c +f:drivers/power/reset/xgene-reboot.c +f:drivers/power/sequencing/Kconfig +f:drivers/power/sequencing/Makefile +f:drivers/power/sequencing/core.c +f:drivers/power/sequencing/pwrseq-qcom-wcn.c +f:drivers/power/sequencing/pwrseq-thead-gpu.c +f:drivers/power/supply/88pm860x_battery.c +f:drivers/power/supply/88pm860x_charger.c +f:drivers/power/supply/Kconfig +f:drivers/power/supply/Makefile +f:drivers/power/supply/ab8500-bm.h +f:drivers/power/supply/ab8500-chargalg.h +f:drivers/power/supply/ab8500_bmdata.c +f:drivers/power/supply/ab8500_btemp.c +f:drivers/power/supply/ab8500_chargalg.c +f:drivers/power/supply/ab8500_charger.c +f:drivers/power/supply/ab8500_fg.c +f:drivers/power/supply/acer_a500_battery.c +f:drivers/power/supply/act8945a_charger.c +f:drivers/power/supply/adp5061.c +f:drivers/power/supply/apm_power.c +f:drivers/power/supply/axp20x_ac_power.c +f:drivers/power/supply/axp20x_battery.c +f:drivers/power/supply/axp20x_usb_power.c +f:drivers/power/supply/axp288_charger.c +f:drivers/power/supply/axp288_fuel_gauge.c +f:drivers/power/supply/bd99954-charger.c +f:drivers/power/supply/bd99954-charger.h +f:drivers/power/supply/bq2415x_charger.c +f:drivers/power/supply/bq24190_charger.c +f:drivers/power/supply/bq24257_charger.c +f:drivers/power/supply/bq24735-charger.c +f:drivers/power/supply/bq2515x_charger.c +f:drivers/power/supply/bq256xx_charger.c +f:drivers/power/supply/bq25890_charger.c +f:drivers/power/supply/bq25980_charger.c +f:drivers/power/supply/bq25980_charger.h +f:drivers/power/supply/bq27xxx_battery.c +f:drivers/power/supply/bq27xxx_battery_hdq.c +f:drivers/power/supply/bq27xxx_battery_i2c.c +f:drivers/power/supply/chagall-battery.c +f:drivers/power/supply/charger-manager.c +f:drivers/power/supply/collie_battery.c +f:drivers/power/supply/cpcap-battery.c +f:drivers/power/supply/cpcap-charger.c +f:drivers/power/supply/cros_charge-control.c +f:drivers/power/supply/cros_peripheral_charger.c +f:drivers/power/supply/cros_usbpd-charger.c +f:drivers/power/supply/cw2015_battery.c +f:drivers/power/supply/da9030_battery.c +f:drivers/power/supply/da9052-battery.c +f:drivers/power/supply/da9150-charger.c +f:drivers/power/supply/da9150-fg.c +f:drivers/power/supply/ds2760_battery.c +f:drivers/power/supply/ds2780_battery.c +f:drivers/power/supply/ds2781_battery.c +f:drivers/power/supply/ds2782_battery.c +f:drivers/power/supply/generic-adc-battery.c +f:drivers/power/supply/goldfish_battery.c +f:drivers/power/supply/gpio-charger.c +f:drivers/power/supply/huawei-gaokun-battery.c +f:drivers/power/supply/ingenic-battery.c +f:drivers/power/supply/ip5xxx_power.c +f:drivers/power/supply/ipaq_micro_battery.c +f:drivers/power/supply/isp1704_charger.c +f:drivers/power/supply/lego_ev3_battery.c +f:drivers/power/supply/lenovo_yoga_c630_battery.c +f:drivers/power/supply/lp8727_charger.c +f:drivers/power/supply/lp8788-charger.c +f:drivers/power/supply/lt3651-charger.c +f:drivers/power/supply/ltc2941-battery-gauge.c +f:drivers/power/supply/ltc4162-l-charger.c +f:drivers/power/supply/max14577_charger.c +f:drivers/power/supply/max14656_charger_detector.c +f:drivers/power/supply/max17040_battery.c +f:drivers/power/supply/max17042_battery.c +f:drivers/power/supply/max1720x_battery.c +f:drivers/power/supply/max1721x_battery.c +f:drivers/power/supply/max77650-charger.c +f:drivers/power/supply/max77693_charger.c +f:drivers/power/supply/max77705_charger.c +f:drivers/power/supply/max77976_charger.c +f:drivers/power/supply/max8903_charger.c +f:drivers/power/supply/max8925_power.c +f:drivers/power/supply/max8971_charger.c +f:drivers/power/supply/max8997_charger.c +f:drivers/power/supply/max8998_charger.c +f:drivers/power/supply/mm8013.c +f:drivers/power/supply/mp2629_charger.c +f:drivers/power/supply/mt6360_charger.c +f:drivers/power/supply/mt6370-charger.c +f:drivers/power/supply/olpc_battery.c +f:drivers/power/supply/pm8916_bms_vm.c +f:drivers/power/supply/pm8916_lbc.c +f:drivers/power/supply/pmu_battery.c +f:drivers/power/supply/power_supply.h +f:drivers/power/supply/power_supply_core.c +f:drivers/power/supply/power_supply_hwmon.c +f:drivers/power/supply/power_supply_leds.c +f:drivers/power/supply/power_supply_sysfs.c +f:drivers/power/supply/qcom_battmgr.c +f:drivers/power/supply/qcom_smbb.c +f:drivers/power/supply/qcom_smbx.c +f:drivers/power/supply/rk817_charger.c +f:drivers/power/supply/rn5t618_power.c +f:drivers/power/supply/rt5033_battery.c +f:drivers/power/supply/rt5033_charger.c +f:drivers/power/supply/rt9455_charger.c +f:drivers/power/supply/rt9467-charger.c +f:drivers/power/supply/rt9471.c +f:drivers/power/supply/rx51_battery.c +f:drivers/power/supply/samsung-sdi-battery.c +f:drivers/power/supply/samsung-sdi-battery.h +f:drivers/power/supply/sbs-battery.c +f:drivers/power/supply/sbs-charger.c +f:drivers/power/supply/sbs-manager.c +f:drivers/power/supply/sc2731_charger.c +f:drivers/power/supply/sc27xx_fuel_gauge.c +f:drivers/power/supply/smb347-charger.c +f:drivers/power/supply/stc3117_fuel_gauge.c +f:drivers/power/supply/surface_battery.c +f:drivers/power/supply/surface_charger.c +f:drivers/power/supply/test_power.c +f:drivers/power/supply/tps65090-charger.c +f:drivers/power/supply/tps65217_charger.c +f:drivers/power/supply/twl4030_charger.c +f:drivers/power/supply/twl4030_madc_battery.c +f:drivers/power/supply/twl6030_charger.c +f:drivers/power/supply/ucs1002_power.c +f:drivers/power/supply/ug3105_battery.c +f:drivers/power/supply/wilco-charger.c +f:drivers/power/supply/wm831x_backup.c +f:drivers/power/supply/wm831x_power.c +f:drivers/power/supply/wm8350_power.c +f:drivers/power/supply/wm97xx_battery.c +f:drivers/powercap/Kconfig +f:drivers/powercap/Makefile +f:drivers/powercap/arm_scmi_powercap.c +f:drivers/powercap/dtpm.c +f:drivers/powercap/dtpm_cpu.c +f:drivers/powercap/dtpm_devfreq.c +f:drivers/powercap/dtpm_subsys.h +f:drivers/powercap/idle_inject.c +f:drivers/powercap/intel_rapl_common.c +f:drivers/powercap/intel_rapl_msr.c +f:drivers/powercap/intel_rapl_tpmi.c +f:drivers/powercap/powercap_sys.c +f:drivers/pps/Kconfig +f:drivers/pps/Makefile +f:drivers/pps/clients/Kconfig +f:drivers/pps/clients/Makefile +f:drivers/pps/clients/pps-gpio.c +f:drivers/pps/clients/pps-ktimer.c +f:drivers/pps/clients/pps-ldisc.c +f:drivers/pps/clients/pps_parport.c +f:drivers/pps/generators/Kconfig +f:drivers/pps/generators/Makefile +f:drivers/pps/generators/pps_gen-dummy.c +f:drivers/pps/generators/pps_gen.c +f:drivers/pps/generators/pps_gen_parport.c +f:drivers/pps/generators/pps_gen_tio.c +f:drivers/pps/generators/sysfs.c +f:drivers/pps/kapi.c +f:drivers/pps/kc.c +f:drivers/pps/kc.h +f:drivers/pps/pps.c +f:drivers/pps/sysfs.c +f:drivers/ps3/Makefile +f:drivers/ps3/ps3-lpm.c +f:drivers/ps3/ps3-sys-manager.c +f:drivers/ps3/ps3-vuart.c +f:drivers/ps3/ps3av.c +f:drivers/ps3/ps3av_cmd.c +f:drivers/ps3/ps3stor_lib.c +f:drivers/ps3/sys-manager-core.c +f:drivers/ps3/vuart.h +f:drivers/ptp/Kconfig +f:drivers/ptp/Makefile +f:drivers/ptp/ptp_chardev.c +f:drivers/ptp/ptp_clock.c +f:drivers/ptp/ptp_clockmatrix.c +f:drivers/ptp/ptp_clockmatrix.h +f:drivers/ptp/ptp_dfl_tod.c +f:drivers/ptp/ptp_dte.c +f:drivers/ptp/ptp_fc3.c +f:drivers/ptp/ptp_fc3.h +f:drivers/ptp/ptp_idt82p33.c +f:drivers/ptp/ptp_idt82p33.h +f:drivers/ptp/ptp_ines.c +f:drivers/ptp/ptp_kvm_arm.c +f:drivers/ptp/ptp_kvm_common.c +f:drivers/ptp/ptp_kvm_x86.c +f:drivers/ptp/ptp_mock.c +f:drivers/ptp/ptp_ocp.c +f:drivers/ptp/ptp_pch.c +f:drivers/ptp/ptp_private.h +f:drivers/ptp/ptp_qoriq.c +f:drivers/ptp/ptp_qoriq_debugfs.c +f:drivers/ptp/ptp_s390.c +f:drivers/ptp/ptp_sysfs.c +f:drivers/ptp/ptp_vclock.c +f:drivers/ptp/ptp_vmclock.c +f:drivers/ptp/ptp_vmw.c +f:drivers/pwm/Kconfig +f:drivers/pwm/Makefile +f:drivers/pwm/core.c +f:drivers/pwm/pwm-ab8500.c +f:drivers/pwm/pwm-adp5585.c +f:drivers/pwm/pwm-apple.c +f:drivers/pwm/pwm-argon-fan-hat.c +f:drivers/pwm/pwm-atmel-hlcdc.c +f:drivers/pwm/pwm-atmel-tcb.c +f:drivers/pwm/pwm-atmel.c +f:drivers/pwm/pwm-axi-pwmgen.c +f:drivers/pwm/pwm-bcm-iproc.c +f:drivers/pwm/pwm-bcm-kona.c +f:drivers/pwm/pwm-bcm2835.c +f:drivers/pwm/pwm-berlin.c +f:drivers/pwm/pwm-brcmstb.c +f:drivers/pwm/pwm-clk.c +f:drivers/pwm/pwm-clps711x.c +f:drivers/pwm/pwm-crc.c +f:drivers/pwm/pwm-cros-ec.c +f:drivers/pwm/pwm-dwc-core.c +f:drivers/pwm/pwm-dwc.c +f:drivers/pwm/pwm-dwc.h +f:drivers/pwm/pwm-ep93xx.c +f:drivers/pwm/pwm-fsl-ftm.c +f:drivers/pwm/pwm-gpio.c +f:drivers/pwm/pwm-hibvt.c +f:drivers/pwm/pwm-img.c +f:drivers/pwm/pwm-imx-tpm.c +f:drivers/pwm/pwm-imx1.c +f:drivers/pwm/pwm-imx27.c +f:drivers/pwm/pwm-intel-lgm.c +f:drivers/pwm/pwm-iqs620a.c +f:drivers/pwm/pwm-jz4740.c +f:drivers/pwm/pwm-keembay.c +f:drivers/pwm/pwm-loongson.c +f:drivers/pwm/pwm-lp3943.c +f:drivers/pwm/pwm-lpc18xx-sct.c +f:drivers/pwm/pwm-lpc32xx.c +f:drivers/pwm/pwm-lpss-pci.c +f:drivers/pwm/pwm-lpss-platform.c +f:drivers/pwm/pwm-lpss.c +f:drivers/pwm/pwm-lpss.h +f:drivers/pwm/pwm-mc33xs2410.c +f:drivers/pwm/pwm-mediatek.c +f:drivers/pwm/pwm-meson.c +f:drivers/pwm/pwm-microchip-core.c +f:drivers/pwm/pwm-mtk-disp.c +f:drivers/pwm/pwm-mxs.c +f:drivers/pwm/pwm-ntxec.c +f:drivers/pwm/pwm-omap-dmtimer.c +f:drivers/pwm/pwm-pca9685.c +f:drivers/pwm/pwm-pxa.c +f:drivers/pwm/pwm-raspberrypi-poe.c +f:drivers/pwm/pwm-rcar.c +f:drivers/pwm/pwm-renesas-tpu.c +f:drivers/pwm/pwm-rockchip.c +f:drivers/pwm/pwm-rz-mtu3.c +f:drivers/pwm/pwm-rzg2l-gpt.c +f:drivers/pwm/pwm-samsung.c +f:drivers/pwm/pwm-sifive.c +f:drivers/pwm/pwm-sl28cpld.c +f:drivers/pwm/pwm-sophgo-sg2042.c +f:drivers/pwm/pwm-spear.c +f:drivers/pwm/pwm-sprd.c +f:drivers/pwm/pwm-sti.c +f:drivers/pwm/pwm-stm32-lp.c +f:drivers/pwm/pwm-stm32.c +f:drivers/pwm/pwm-stmpe.c +f:drivers/pwm/pwm-sun4i.c +f:drivers/pwm/pwm-sunplus.c +f:drivers/pwm/pwm-tegra.c +f:drivers/pwm/pwm-tiecap.c +f:drivers/pwm/pwm-tiehrpwm.c +f:drivers/pwm/pwm-twl-led.c +f:drivers/pwm/pwm-twl.c +f:drivers/pwm/pwm-visconti.c +f:drivers/pwm/pwm-vt8500.c +f:drivers/pwm/pwm-xilinx.c +f:drivers/rapidio/Kconfig +f:drivers/rapidio/Makefile +f:drivers/rapidio/devices/Kconfig +f:drivers/rapidio/devices/Makefile +f:drivers/rapidio/devices/rio_mport_cdev.c +f:drivers/rapidio/devices/tsi721.c +f:drivers/rapidio/devices/tsi721.h +f:drivers/rapidio/devices/tsi721_dma.c +f:drivers/rapidio/rio-access.c +f:drivers/rapidio/rio-driver.c +f:drivers/rapidio/rio-scan.c +f:drivers/rapidio/rio-sysfs.c +f:drivers/rapidio/rio.c +f:drivers/rapidio/rio.h +f:drivers/rapidio/rio_cm.c +f:drivers/rapidio/switches/Kconfig +f:drivers/rapidio/switches/Makefile +f:drivers/rapidio/switches/idt_gen2.c +f:drivers/rapidio/switches/idt_gen3.c +f:drivers/rapidio/switches/idtcps.c +f:drivers/ras/Kconfig +f:drivers/ras/Makefile +f:drivers/ras/amd/atl/Kconfig +f:drivers/ras/amd/atl/Makefile +f:drivers/ras/amd/atl/access.c +f:drivers/ras/amd/atl/core.c +f:drivers/ras/amd/atl/dehash.c +f:drivers/ras/amd/atl/denormalize.c +f:drivers/ras/amd/atl/internal.h +f:drivers/ras/amd/atl/map.c +f:drivers/ras/amd/atl/prm.c +f:drivers/ras/amd/atl/reg_fields.h +f:drivers/ras/amd/atl/system.c +f:drivers/ras/amd/atl/umc.c +f:drivers/ras/amd/fmpm.c +f:drivers/ras/cec.c +f:drivers/ras/debugfs.c +f:drivers/ras/debugfs.h +f:drivers/ras/ras.c +f:drivers/regulator/88pg86x.c +f:drivers/regulator/88pm800-regulator.c +f:drivers/regulator/88pm8607.c +f:drivers/regulator/88pm886-regulator.c +f:drivers/regulator/Kconfig +f:drivers/regulator/Makefile +f:drivers/regulator/aat2870-regulator.c +f:drivers/regulator/ab8500-ext.c +f:drivers/regulator/ab8500.c +f:drivers/regulator/act8865-regulator.c +f:drivers/regulator/act8945a-regulator.c +f:drivers/regulator/ad5398.c +f:drivers/regulator/adp5055-regulator.c +f:drivers/regulator/anatop-regulator.c +f:drivers/regulator/arizona-ldo1.c +f:drivers/regulator/arizona-micsupp.c +f:drivers/regulator/as3711-regulator.c +f:drivers/regulator/as3722-regulator.c +f:drivers/regulator/atc260x-regulator.c +f:drivers/regulator/aw37503-regulator.c +f:drivers/regulator/axp20x-regulator.c +f:drivers/regulator/bcm590xx-regulator.c +f:drivers/regulator/bd71815-regulator.c +f:drivers/regulator/bd71828-regulator.c +f:drivers/regulator/bd718x7-regulator.c +f:drivers/regulator/bd9571mwv-regulator.c +f:drivers/regulator/bd9576-regulator.c +f:drivers/regulator/bd96801-regulator.c +f:drivers/regulator/core.c +f:drivers/regulator/cpcap-regulator.c +f:drivers/regulator/cros-ec-regulator.c +f:drivers/regulator/da903x-regulator.c +f:drivers/regulator/da9052-regulator.c +f:drivers/regulator/da9055-regulator.c +f:drivers/regulator/da9062-regulator.c +f:drivers/regulator/da9063-regulator.c +f:drivers/regulator/da9121-regulator.c +f:drivers/regulator/da9121-regulator.h +f:drivers/regulator/da9210-regulator.c +f:drivers/regulator/da9210-regulator.h +f:drivers/regulator/da9211-regulator.c +f:drivers/regulator/da9211-regulator.h +f:drivers/regulator/db8500-prcmu.c +f:drivers/regulator/dbx500-prcmu.c +f:drivers/regulator/dbx500-prcmu.h +f:drivers/regulator/devres.c +f:drivers/regulator/dummy.c +f:drivers/regulator/dummy.h +f:drivers/regulator/event.c +f:drivers/regulator/fan53555.c +f:drivers/regulator/fan53880.c +f:drivers/regulator/fixed-helper.c +f:drivers/regulator/fixed.c +f:drivers/regulator/gpio-regulator.c +f:drivers/regulator/helpers.c +f:drivers/regulator/hi6421-regulator.c +f:drivers/regulator/hi6421v530-regulator.c +f:drivers/regulator/hi6421v600-regulator.c +f:drivers/regulator/hi655x-regulator.c +f:drivers/regulator/internal.h +f:drivers/regulator/irq_helpers.c +f:drivers/regulator/isl6271a-regulator.c +f:drivers/regulator/isl9305.c +f:drivers/regulator/lm363x-regulator.c +f:drivers/regulator/lochnagar-regulator.c +f:drivers/regulator/lp3971.c +f:drivers/regulator/lp3972.c +f:drivers/regulator/lp872x.c +f:drivers/regulator/lp873x-regulator.c +f:drivers/regulator/lp8755.c +f:drivers/regulator/lp87565-regulator.c +f:drivers/regulator/lp8788-buck.c +f:drivers/regulator/lp8788-ldo.c +f:drivers/regulator/ltc3589.c +f:drivers/regulator/ltc3676.c +f:drivers/regulator/max14577-regulator.c +f:drivers/regulator/max1586.c +f:drivers/regulator/max20086-regulator.c +f:drivers/regulator/max20411-regulator.c +f:drivers/regulator/max5970-regulator.c +f:drivers/regulator/max77503-regulator.c +f:drivers/regulator/max77541-regulator.c +f:drivers/regulator/max77620-regulator.c +f:drivers/regulator/max77650-regulator.c +f:drivers/regulator/max77686-regulator.c +f:drivers/regulator/max77693-regulator.c +f:drivers/regulator/max77802-regulator.c +f:drivers/regulator/max77826-regulator.c +f:drivers/regulator/max77857-regulator.c +f:drivers/regulator/max8649.c +f:drivers/regulator/max8660.c +f:drivers/regulator/max8893.c +f:drivers/regulator/max8907-regulator.c +f:drivers/regulator/max8925-regulator.c +f:drivers/regulator/max8952.c +f:drivers/regulator/max8973-regulator.c +f:drivers/regulator/max8997-regulator.c +f:drivers/regulator/max8998.c +f:drivers/regulator/mc13783-regulator.c +f:drivers/regulator/mc13892-regulator.c +f:drivers/regulator/mc13xxx-regulator-core.c +f:drivers/regulator/mc13xxx.h +f:drivers/regulator/mcp16502.c +f:drivers/regulator/mp5416.c +f:drivers/regulator/mp8859.c +f:drivers/regulator/mp886x.c +f:drivers/regulator/mpq7920.c +f:drivers/regulator/mpq7920.h +f:drivers/regulator/mt6311-regulator.c +f:drivers/regulator/mt6311-regulator.h +f:drivers/regulator/mt6315-regulator.c +f:drivers/regulator/mt6323-regulator.c +f:drivers/regulator/mt6331-regulator.c +f:drivers/regulator/mt6332-regulator.c +f:drivers/regulator/mt6357-regulator.c +f:drivers/regulator/mt6358-regulator.c +f:drivers/regulator/mt6359-regulator.c +f:drivers/regulator/mt6360-regulator.c +f:drivers/regulator/mt6370-regulator.c +f:drivers/regulator/mt6380-regulator.c +f:drivers/regulator/mt6397-regulator.c +f:drivers/regulator/mtk-dvfsrc-regulator.c +f:drivers/regulator/of_regulator.c +f:drivers/regulator/palmas-regulator.c +f:drivers/regulator/pbias-regulator.c +f:drivers/regulator/pca9450-regulator.c +f:drivers/regulator/pcap-regulator.c +f:drivers/regulator/pf8x00-regulator.c +f:drivers/regulator/pf9453-regulator.c +f:drivers/regulator/pfuze100-regulator.c +f:drivers/regulator/pv88060-regulator.c +f:drivers/regulator/pv88060-regulator.h +f:drivers/regulator/pv88080-regulator.c +f:drivers/regulator/pv88080-regulator.h +f:drivers/regulator/pv88090-regulator.c +f:drivers/regulator/pv88090-regulator.h +f:drivers/regulator/pwm-regulator.c +f:drivers/regulator/qcom-labibb-regulator.c +f:drivers/regulator/qcom-pm8008-regulator.c +f:drivers/regulator/qcom-refgen-regulator.c +f:drivers/regulator/qcom-rpmh-regulator.c +f:drivers/regulator/qcom_rpm-regulator.c +f:drivers/regulator/qcom_smd-regulator.c +f:drivers/regulator/qcom_spmi-regulator.c +f:drivers/regulator/qcom_usb_vbus-regulator.c +f:drivers/regulator/raa215300.c +f:drivers/regulator/rc5t583-regulator.c +f:drivers/regulator/regnl.h +f:drivers/regulator/renesas-usb-vbus-regulator.c +f:drivers/regulator/rk808-regulator.c +f:drivers/regulator/rn5t618-regulator.c +f:drivers/regulator/rohm-regulator.c +f:drivers/regulator/rpi-panel-attiny-regulator.c +f:drivers/regulator/rpi-panel-v2-regulator.c +f:drivers/regulator/rt4801-regulator.c +f:drivers/regulator/rt4803.c +f:drivers/regulator/rt4831-regulator.c +f:drivers/regulator/rt5033-regulator.c +f:drivers/regulator/rt5120-regulator.c +f:drivers/regulator/rt5190a-regulator.c +f:drivers/regulator/rt5739.c +f:drivers/regulator/rt5759-regulator.c +f:drivers/regulator/rt6160-regulator.c +f:drivers/regulator/rt6190-regulator.c +f:drivers/regulator/rt6245-regulator.c +f:drivers/regulator/rtmv20-regulator.c +f:drivers/regulator/rtq2134-regulator.c +f:drivers/regulator/rtq2208-regulator.c +f:drivers/regulator/rtq6752-regulator.c +f:drivers/regulator/s2mpa01.c +f:drivers/regulator/s2mps11.c +f:drivers/regulator/s5m8767.c +f:drivers/regulator/sc2731-regulator.c +f:drivers/regulator/scmi-regulator.c +f:drivers/regulator/sky81452-regulator.c +f:drivers/regulator/slg51000-regulator.c +f:drivers/regulator/slg51000-regulator.h +f:drivers/regulator/stm32-booster.c +f:drivers/regulator/stm32-pwr.c +f:drivers/regulator/stm32-vrefbuf.c +f:drivers/regulator/stpmic1_regulator.c +f:drivers/regulator/stw481x-vmmc.c +f:drivers/regulator/sun20i-regulator.c +f:drivers/regulator/sy7636a-regulator.c +f:drivers/regulator/sy8106a-regulator.c +f:drivers/regulator/sy8824x.c +f:drivers/regulator/sy8827n.c +f:drivers/regulator/ti-abb-regulator.c +f:drivers/regulator/tps51632-regulator.c +f:drivers/regulator/tps6105x-regulator.c +f:drivers/regulator/tps62360-regulator.c +f:drivers/regulator/tps6286x-regulator.c +f:drivers/regulator/tps6287x-regulator.c +f:drivers/regulator/tps65023-regulator.c +f:drivers/regulator/tps6507x-regulator.c +f:drivers/regulator/tps65086-regulator.c +f:drivers/regulator/tps65090-regulator.c +f:drivers/regulator/tps65132-regulator.c +f:drivers/regulator/tps65217-regulator.c +f:drivers/regulator/tps65218-regulator.c +f:drivers/regulator/tps65219-regulator.c +f:drivers/regulator/tps6524x-regulator.c +f:drivers/regulator/tps6586x-regulator.c +f:drivers/regulator/tps65910-regulator.c +f:drivers/regulator/tps65912-regulator.c +f:drivers/regulator/tps6594-regulator.c +f:drivers/regulator/tps68470-regulator.c +f:drivers/regulator/twl-regulator.c +f:drivers/regulator/twl6030-regulator.c +f:drivers/regulator/uniphier-regulator.c +f:drivers/regulator/userspace-consumer.c +f:drivers/regulator/vctrl-regulator.c +f:drivers/regulator/vexpress-regulator.c +f:drivers/regulator/virtual.c +f:drivers/regulator/vqmmc-ipq4019-regulator.c +f:drivers/regulator/wm831x-dcdc.c +f:drivers/regulator/wm831x-isink.c +f:drivers/regulator/wm831x-ldo.c +f:drivers/regulator/wm8350-regulator.c +f:drivers/regulator/wm8400-regulator.c +f:drivers/regulator/wm8994-regulator.c +f:drivers/remoteproc/Kconfig +f:drivers/remoteproc/Makefile +f:drivers/remoteproc/da8xx_remoteproc.c +f:drivers/remoteproc/imx_dsp_rproc.c +f:drivers/remoteproc/imx_rproc.c +f:drivers/remoteproc/imx_rproc.h +f:drivers/remoteproc/ingenic_rproc.c +f:drivers/remoteproc/keystone_remoteproc.c +f:drivers/remoteproc/meson_mx_ao_arc.c +f:drivers/remoteproc/mtk_common.h +f:drivers/remoteproc/mtk_scp.c +f:drivers/remoteproc/mtk_scp_ipi.c +f:drivers/remoteproc/omap_remoteproc.c +f:drivers/remoteproc/omap_remoteproc.h +f:drivers/remoteproc/pru_rproc.c +f:drivers/remoteproc/pru_rproc.h +f:drivers/remoteproc/qcom_common.c +f:drivers/remoteproc/qcom_common.h +f:drivers/remoteproc/qcom_pil_info.c +f:drivers/remoteproc/qcom_pil_info.h +f:drivers/remoteproc/qcom_q6v5.c +f:drivers/remoteproc/qcom_q6v5.h +f:drivers/remoteproc/qcom_q6v5_adsp.c +f:drivers/remoteproc/qcom_q6v5_mss.c +f:drivers/remoteproc/qcom_q6v5_pas.c +f:drivers/remoteproc/qcom_q6v5_wcss.c +f:drivers/remoteproc/qcom_sysmon.c +f:drivers/remoteproc/qcom_wcnss.c +f:drivers/remoteproc/qcom_wcnss.h +f:drivers/remoteproc/qcom_wcnss_iris.c +f:drivers/remoteproc/rcar_rproc.c +f:drivers/remoteproc/remoteproc_cdev.c +f:drivers/remoteproc/remoteproc_core.c +f:drivers/remoteproc/remoteproc_coredump.c +f:drivers/remoteproc/remoteproc_debugfs.c +f:drivers/remoteproc/remoteproc_elf_helpers.h +f:drivers/remoteproc/remoteproc_elf_loader.c +f:drivers/remoteproc/remoteproc_internal.h +f:drivers/remoteproc/remoteproc_sysfs.c +f:drivers/remoteproc/remoteproc_virtio.c +f:drivers/remoteproc/st_remoteproc.c +f:drivers/remoteproc/st_slim_rproc.c +f:drivers/remoteproc/stm32_rproc.c +f:drivers/remoteproc/ti_k3_common.c +f:drivers/remoteproc/ti_k3_common.h +f:drivers/remoteproc/ti_k3_dsp_remoteproc.c +f:drivers/remoteproc/ti_k3_m4_remoteproc.c +f:drivers/remoteproc/ti_k3_r5_remoteproc.c +f:drivers/remoteproc/ti_sci_proc.h +f:drivers/remoteproc/wkup_m3_rproc.c +f:drivers/remoteproc/xlnx_r5_remoteproc.c +f:drivers/reset/Kconfig +f:drivers/reset/Makefile +f:drivers/reset/amlogic/Kconfig +f:drivers/reset/amlogic/Makefile +f:drivers/reset/amlogic/reset-meson-audio-arb.c +f:drivers/reset/amlogic/reset-meson-aux.c +f:drivers/reset/amlogic/reset-meson-common.c +f:drivers/reset/amlogic/reset-meson.c +f:drivers/reset/amlogic/reset-meson.h +f:drivers/reset/core.c +f:drivers/reset/hisilicon/Kconfig +f:drivers/reset/hisilicon/Makefile +f:drivers/reset/hisilicon/hi6220_reset.c +f:drivers/reset/hisilicon/reset-hi3660.c +f:drivers/reset/reset-a10sr.c +f:drivers/reset/reset-ath79.c +f:drivers/reset/reset-axs10x.c +f:drivers/reset/reset-bcm6345.c +f:drivers/reset/reset-berlin.c +f:drivers/reset/reset-brcmstb-rescal.c +f:drivers/reset/reset-brcmstb.c +f:drivers/reset/reset-eyeq.c +f:drivers/reset/reset-gpio.c +f:drivers/reset/reset-hsdk.c +f:drivers/reset/reset-imx-scu.c +f:drivers/reset/reset-imx7.c +f:drivers/reset/reset-imx8mp-audiomix.c +f:drivers/reset/reset-intel-gw.c +f:drivers/reset/reset-k210.c +f:drivers/reset/reset-k230.c +f:drivers/reset/reset-lantiq.c +f:drivers/reset/reset-lpc18xx.c +f:drivers/reset/reset-ma35d1.c +f:drivers/reset/reset-microchip-sparx5.c +f:drivers/reset/reset-mpfs.c +f:drivers/reset/reset-npcm.c +f:drivers/reset/reset-pistachio.c +f:drivers/reset/reset-qcom-aoss.c +f:drivers/reset/reset-qcom-pdc.c +f:drivers/reset/reset-raspberrypi.c +f:drivers/reset/reset-rzg2l-usbphy-ctrl.c +f:drivers/reset/reset-rzv2h-usb2phy.c +f:drivers/reset/reset-scmi.c +f:drivers/reset/reset-simple.c +f:drivers/reset/reset-socfpga.c +f:drivers/reset/reset-spacemit.c +f:drivers/reset/reset-sunplus.c +f:drivers/reset/reset-sunxi.c +f:drivers/reset/reset-th1520.c +f:drivers/reset/reset-ti-sci.c +f:drivers/reset/reset-ti-syscon.c +f:drivers/reset/reset-tn48m.c +f:drivers/reset/reset-tps380x.c +f:drivers/reset/reset-uniphier-glue.c +f:drivers/reset/reset-uniphier.c +f:drivers/reset/reset-zynq.c +f:drivers/reset/reset-zynqmp.c +f:drivers/reset/starfive/Kconfig +f:drivers/reset/starfive/Makefile +f:drivers/reset/starfive/reset-starfive-jh7100.c +f:drivers/reset/starfive/reset-starfive-jh7110.c +f:drivers/reset/starfive/reset-starfive-jh71x0.c +f:drivers/reset/starfive/reset-starfive-jh71x0.h +f:drivers/reset/sti/Kconfig +f:drivers/reset/sti/Makefile +f:drivers/reset/sti/reset-stih407.c +f:drivers/reset/sti/reset-syscfg.c +f:drivers/reset/sti/reset-syscfg.h +f:drivers/reset/tegra/Kconfig +f:drivers/reset/tegra/Makefile +f:drivers/reset/tegra/reset-bpmp.c +f:drivers/rpmsg/Kconfig +f:drivers/rpmsg/Makefile +f:drivers/rpmsg/mtk_rpmsg.c +f:drivers/rpmsg/qcom_glink_native.c +f:drivers/rpmsg/qcom_glink_native.h +f:drivers/rpmsg/qcom_glink_rpm.c +f:drivers/rpmsg/qcom_glink_smem.c +f:drivers/rpmsg/qcom_glink_ssr.c +f:drivers/rpmsg/qcom_glink_trace.h +f:drivers/rpmsg/qcom_smd.c +f:drivers/rpmsg/rpmsg_char.c +f:drivers/rpmsg/rpmsg_char.h +f:drivers/rpmsg/rpmsg_core.c +f:drivers/rpmsg/rpmsg_ctrl.c +f:drivers/rpmsg/rpmsg_internal.h +f:drivers/rpmsg/rpmsg_ns.c +f:drivers/rpmsg/virtio_rpmsg_bus.c +f:drivers/rtc/Kconfig +f:drivers/rtc/Makefile +f:drivers/rtc/class.c +f:drivers/rtc/dev.c +f:drivers/rtc/interface.c +f:drivers/rtc/lib.c +f:drivers/rtc/lib_test.c +f:drivers/rtc/nvmem.c +f:drivers/rtc/proc.c +f:drivers/rtc/rtc-88pm80x.c +f:drivers/rtc/rtc-88pm860x.c +f:drivers/rtc/rtc-88pm886.c +f:drivers/rtc/rtc-ab-b5ze-s3.c +f:drivers/rtc/rtc-ab-eoz9.c +f:drivers/rtc/rtc-ab8500.c +f:drivers/rtc/rtc-abx80x.c +f:drivers/rtc/rtc-ac100.c +f:drivers/rtc/rtc-amlogic-a4.c +f:drivers/rtc/rtc-armada38x.c +f:drivers/rtc/rtc-as3722.c +f:drivers/rtc/rtc-asm9260.c +f:drivers/rtc/rtc-aspeed.c +f:drivers/rtc/rtc-at91rm9200.c +f:drivers/rtc/rtc-at91sam9.c +f:drivers/rtc/rtc-au1xxx.c +f:drivers/rtc/rtc-bd70528.c +f:drivers/rtc/rtc-bq32k.c +f:drivers/rtc/rtc-bq4802.c +f:drivers/rtc/rtc-brcmstb-waketimer.c +f:drivers/rtc/rtc-cadence.c +f:drivers/rtc/rtc-cmos.c +f:drivers/rtc/rtc-core.h +f:drivers/rtc/rtc-cpcap.c +f:drivers/rtc/rtc-cros-ec.c +f:drivers/rtc/rtc-cv1800.c +f:drivers/rtc/rtc-da9052.c +f:drivers/rtc/rtc-da9055.c +f:drivers/rtc/rtc-da9063.c +f:drivers/rtc/rtc-digicolor.c +f:drivers/rtc/rtc-ds1216.c +f:drivers/rtc/rtc-ds1286.c +f:drivers/rtc/rtc-ds1302.c +f:drivers/rtc/rtc-ds1305.c +f:drivers/rtc/rtc-ds1307.c +f:drivers/rtc/rtc-ds1343.c +f:drivers/rtc/rtc-ds1347.c +f:drivers/rtc/rtc-ds1374.c +f:drivers/rtc/rtc-ds1390.c +f:drivers/rtc/rtc-ds1511.c +f:drivers/rtc/rtc-ds1553.c +f:drivers/rtc/rtc-ds1672.c +f:drivers/rtc/rtc-ds1685.c +f:drivers/rtc/rtc-ds1742.c +f:drivers/rtc/rtc-ds2404.c +f:drivers/rtc/rtc-ds3232.c +f:drivers/rtc/rtc-efi.c +f:drivers/rtc/rtc-em3027.c +f:drivers/rtc/rtc-ep93xx.c +f:drivers/rtc/rtc-fm3130.c +f:drivers/rtc/rtc-fsl-ftm-alarm.c +f:drivers/rtc/rtc-ftrtc010.c +f:drivers/rtc/rtc-gamecube.c +f:drivers/rtc/rtc-generic.c +f:drivers/rtc/rtc-goldfish.c +f:drivers/rtc/rtc-hid-sensor-time.c +f:drivers/rtc/rtc-hym8563.c +f:drivers/rtc/rtc-imx-sc.c +f:drivers/rtc/rtc-imx-sm-bbm.c +f:drivers/rtc/rtc-imxdi.c +f:drivers/rtc/rtc-isl12022.c +f:drivers/rtc/rtc-isl12026.c +f:drivers/rtc/rtc-isl1208.c +f:drivers/rtc/rtc-jz4740.c +f:drivers/rtc/rtc-loongson.c +f:drivers/rtc/rtc-lp8788.c +f:drivers/rtc/rtc-lpc24xx.c +f:drivers/rtc/rtc-lpc32xx.c +f:drivers/rtc/rtc-m41t80.c +f:drivers/rtc/rtc-m41t93.c +f:drivers/rtc/rtc-m41t94.c +f:drivers/rtc/rtc-m48t35.c +f:drivers/rtc/rtc-m48t59.c +f:drivers/rtc/rtc-m48t86.c +f:drivers/rtc/rtc-ma35d1.c +f:drivers/rtc/rtc-max31335.c +f:drivers/rtc/rtc-max6900.c +f:drivers/rtc/rtc-max6902.c +f:drivers/rtc/rtc-max6916.c +f:drivers/rtc/rtc-max77686.c +f:drivers/rtc/rtc-max8907.c +f:drivers/rtc/rtc-max8925.c +f:drivers/rtc/rtc-max8997.c +f:drivers/rtc/rtc-max8998.c +f:drivers/rtc/rtc-mc13xxx.c +f:drivers/rtc/rtc-mc146818-lib.c +f:drivers/rtc/rtc-mcp795.c +f:drivers/rtc/rtc-meson-vrtc.c +f:drivers/rtc/rtc-meson.c +f:drivers/rtc/rtc-moxart.c +f:drivers/rtc/rtc-mpc5121.c +f:drivers/rtc/rtc-mpfs.c +f:drivers/rtc/rtc-msc313.c +f:drivers/rtc/rtc-msm6242.c +f:drivers/rtc/rtc-mt2712.c +f:drivers/rtc/rtc-mt6397.c +f:drivers/rtc/rtc-mt7622.c +f:drivers/rtc/rtc-mv.c +f:drivers/rtc/rtc-mxc.c +f:drivers/rtc/rtc-mxc_v2.c +f:drivers/rtc/rtc-nct3018y.c +f:drivers/rtc/rtc-ntxec.c +f:drivers/rtc/rtc-nxp-bbnsm.c +f:drivers/rtc/rtc-omap.c +f:drivers/rtc/rtc-opal.c +f:drivers/rtc/rtc-optee.c +f:drivers/rtc/rtc-palmas.c +f:drivers/rtc/rtc-pcap.c +f:drivers/rtc/rtc-pcf2123.c +f:drivers/rtc/rtc-pcf2127.c +f:drivers/rtc/rtc-pcf85063.c +f:drivers/rtc/rtc-pcf8523.c +f:drivers/rtc/rtc-pcf85363.c +f:drivers/rtc/rtc-pcf8563.c +f:drivers/rtc/rtc-pcf8583.c +f:drivers/rtc/rtc-pic32.c +f:drivers/rtc/rtc-pl030.c +f:drivers/rtc/rtc-pl031.c +f:drivers/rtc/rtc-pm8xxx.c +f:drivers/rtc/rtc-ps3.c +f:drivers/rtc/rtc-pxa.c +f:drivers/rtc/rtc-r7301.c +f:drivers/rtc/rtc-r9701.c +f:drivers/rtc/rtc-rc5t583.c +f:drivers/rtc/rtc-rc5t619.c +f:drivers/rtc/rtc-renesas-rtca3.c +f:drivers/rtc/rtc-rk808.c +f:drivers/rtc/rtc-rp5c01.c +f:drivers/rtc/rtc-rs5c313.c +f:drivers/rtc/rtc-rs5c348.c +f:drivers/rtc/rtc-rs5c372.c +f:drivers/rtc/rtc-rtd119x.c +f:drivers/rtc/rtc-rv3028.c +f:drivers/rtc/rtc-rv3029c2.c +f:drivers/rtc/rtc-rv3032.c +f:drivers/rtc/rtc-rv8803.c +f:drivers/rtc/rtc-rx4581.c +f:drivers/rtc/rtc-rx6110.c +f:drivers/rtc/rtc-rx8010.c +f:drivers/rtc/rtc-rx8025.c +f:drivers/rtc/rtc-rx8111.c +f:drivers/rtc/rtc-rx8581.c +f:drivers/rtc/rtc-rzn1.c +f:drivers/rtc/rtc-s32g.c +f:drivers/rtc/rtc-s35390a.c +f:drivers/rtc/rtc-s3c.c +f:drivers/rtc/rtc-s3c.h +f:drivers/rtc/rtc-s5m.c +f:drivers/rtc/rtc-sa1100.c +f:drivers/rtc/rtc-sa1100.h +f:drivers/rtc/rtc-sc27xx.c +f:drivers/rtc/rtc-sd2405al.c +f:drivers/rtc/rtc-sd3078.c +f:drivers/rtc/rtc-sh.c +f:drivers/rtc/rtc-snvs.c +f:drivers/rtc/rtc-spear.c +f:drivers/rtc/rtc-ssd202d.c +f:drivers/rtc/rtc-st-lpc.c +f:drivers/rtc/rtc-starfire.c +f:drivers/rtc/rtc-stk17ta8.c +f:drivers/rtc/rtc-stm32.c +f:drivers/rtc/rtc-stmp3xxx.c +f:drivers/rtc/rtc-sun4v.c +f:drivers/rtc/rtc-sun6i.c +f:drivers/rtc/rtc-sunplus.c +f:drivers/rtc/rtc-sunxi.c +f:drivers/rtc/rtc-tegra.c +f:drivers/rtc/rtc-test.c +f:drivers/rtc/rtc-ti-k3.c +f:drivers/rtc/rtc-tps6586x.c +f:drivers/rtc/rtc-tps65910.c +f:drivers/rtc/rtc-tps6594.c +f:drivers/rtc/rtc-twl.c +f:drivers/rtc/rtc-vt8500.c +f:drivers/rtc/rtc-wilco-ec.c +f:drivers/rtc/rtc-wm831x.c +f:drivers/rtc/rtc-wm8350.c +f:drivers/rtc/rtc-x1205.c +f:drivers/rtc/rtc-xgene.c +f:drivers/rtc/rtc-zynqmp.c +f:drivers/rtc/sysfs.c +f:drivers/s390/Makefile +f:drivers/s390/block/Kconfig +f:drivers/s390/block/Makefile +f:drivers/s390/block/dasd.c +f:drivers/s390/block/dasd_3990_erp.c +f:drivers/s390/block/dasd_alias.c +f:drivers/s390/block/dasd_devmap.c +f:drivers/s390/block/dasd_diag.c +f:drivers/s390/block/dasd_diag.h +f:drivers/s390/block/dasd_eckd.c +f:drivers/s390/block/dasd_eckd.h +f:drivers/s390/block/dasd_eer.c +f:drivers/s390/block/dasd_erp.c +f:drivers/s390/block/dasd_fba.c +f:drivers/s390/block/dasd_fba.h +f:drivers/s390/block/dasd_genhd.c +f:drivers/s390/block/dasd_int.h +f:drivers/s390/block/dasd_ioctl.c +f:drivers/s390/block/dasd_proc.c +f:drivers/s390/block/dcssblk.c +f:drivers/s390/block/scm_blk.c +f:drivers/s390/block/scm_blk.h +f:drivers/s390/block/scm_drv.c +f:drivers/s390/char/Kconfig +f:drivers/s390/char/Makefile +f:drivers/s390/char/con3215.c +f:drivers/s390/char/con3270.c +f:drivers/s390/char/ctrlchar.c +f:drivers/s390/char/ctrlchar.h +f:drivers/s390/char/defkeymap.c +f:drivers/s390/char/defkeymap.map +f:drivers/s390/char/diag_ftp.c +f:drivers/s390/char/diag_ftp.h +f:drivers/s390/char/fs3270.c +f:drivers/s390/char/hmcdrv_cache.c +f:drivers/s390/char/hmcdrv_cache.h +f:drivers/s390/char/hmcdrv_dev.c +f:drivers/s390/char/hmcdrv_dev.h +f:drivers/s390/char/hmcdrv_ftp.c +f:drivers/s390/char/hmcdrv_ftp.h +f:drivers/s390/char/hmcdrv_mod.c +f:drivers/s390/char/keyboard.c +f:drivers/s390/char/keyboard.h +f:drivers/s390/char/monreader.c +f:drivers/s390/char/monwriter.c +f:drivers/s390/char/raw3270.c +f:drivers/s390/char/raw3270.h +f:drivers/s390/char/sclp.c +f:drivers/s390/char/sclp.h +f:drivers/s390/char/sclp_ap.c +f:drivers/s390/char/sclp_cmd.c +f:drivers/s390/char/sclp_con.c +f:drivers/s390/char/sclp_config.c +f:drivers/s390/char/sclp_cpi_sys.c +f:drivers/s390/char/sclp_cpi_sys.h +f:drivers/s390/char/sclp_ctl.c +f:drivers/s390/char/sclp_diag.h +f:drivers/s390/char/sclp_early.c +f:drivers/s390/char/sclp_early_core.c +f:drivers/s390/char/sclp_ftp.c +f:drivers/s390/char/sclp_ftp.h +f:drivers/s390/char/sclp_ocf.c +f:drivers/s390/char/sclp_pci.c +f:drivers/s390/char/sclp_quiesce.c +f:drivers/s390/char/sclp_rw.c +f:drivers/s390/char/sclp_rw.h +f:drivers/s390/char/sclp_sd.c +f:drivers/s390/char/sclp_sdias.c +f:drivers/s390/char/sclp_sdias.h +f:drivers/s390/char/sclp_tty.c +f:drivers/s390/char/sclp_tty.h +f:drivers/s390/char/sclp_vt220.c +f:drivers/s390/char/tape.h +f:drivers/s390/char/tape_34xx.c +f:drivers/s390/char/tape_3590.c +f:drivers/s390/char/tape_3590.h +f:drivers/s390/char/tape_char.c +f:drivers/s390/char/tape_class.c +f:drivers/s390/char/tape_class.h +f:drivers/s390/char/tape_core.c +f:drivers/s390/char/tape_proc.c +f:drivers/s390/char/tape_std.c +f:drivers/s390/char/tape_std.h +f:drivers/s390/char/uvdevice.c +f:drivers/s390/char/vmcp.c +f:drivers/s390/char/vmlogrdr.c +f:drivers/s390/char/vmur.c +f:drivers/s390/char/vmur.h +f:drivers/s390/char/zcore.c +f:drivers/s390/cio/Makefile +f:drivers/s390/cio/airq.c +f:drivers/s390/cio/blacklist.c +f:drivers/s390/cio/blacklist.h +f:drivers/s390/cio/ccwgroup.c +f:drivers/s390/cio/ccwreq.c +f:drivers/s390/cio/chp.c +f:drivers/s390/cio/chp.h +f:drivers/s390/cio/chsc.c +f:drivers/s390/cio/chsc.h +f:drivers/s390/cio/chsc_sch.c +f:drivers/s390/cio/chsc_sch.h +f:drivers/s390/cio/cio.c +f:drivers/s390/cio/cio.h +f:drivers/s390/cio/cio_debug.h +f:drivers/s390/cio/cio_debugfs.c +f:drivers/s390/cio/cio_inject.c +f:drivers/s390/cio/cio_inject.h +f:drivers/s390/cio/cmf.c +f:drivers/s390/cio/crw.c +f:drivers/s390/cio/css.c +f:drivers/s390/cio/css.h +f:drivers/s390/cio/device.c +f:drivers/s390/cio/device.h +f:drivers/s390/cio/device_fsm.c +f:drivers/s390/cio/device_id.c +f:drivers/s390/cio/device_ops.c +f:drivers/s390/cio/device_pgid.c +f:drivers/s390/cio/device_status.c +f:drivers/s390/cio/eadm_sch.c +f:drivers/s390/cio/eadm_sch.h +f:drivers/s390/cio/fcx.c +f:drivers/s390/cio/idset.c +f:drivers/s390/cio/idset.h +f:drivers/s390/cio/io_sch.h +f:drivers/s390/cio/ioasm.c +f:drivers/s390/cio/ioasm.h +f:drivers/s390/cio/isc.c +f:drivers/s390/cio/itcw.c +f:drivers/s390/cio/orb.h +f:drivers/s390/cio/qdio.h +f:drivers/s390/cio/qdio_debug.c +f:drivers/s390/cio/qdio_debug.h +f:drivers/s390/cio/qdio_main.c +f:drivers/s390/cio/qdio_setup.c +f:drivers/s390/cio/qdio_thinint.c +f:drivers/s390/cio/scm.c +f:drivers/s390/cio/trace.c +f:drivers/s390/cio/trace.h +f:drivers/s390/cio/vfio_ccw_async.c +f:drivers/s390/cio/vfio_ccw_chp.c +f:drivers/s390/cio/vfio_ccw_cp.c +f:drivers/s390/cio/vfio_ccw_cp.h +f:drivers/s390/cio/vfio_ccw_drv.c +f:drivers/s390/cio/vfio_ccw_fsm.c +f:drivers/s390/cio/vfio_ccw_ops.c +f:drivers/s390/cio/vfio_ccw_private.h +f:drivers/s390/cio/vfio_ccw_trace.c +f:drivers/s390/cio/vfio_ccw_trace.h +f:drivers/s390/crypto/Makefile +f:drivers/s390/crypto/ap_bus.c +f:drivers/s390/crypto/ap_bus.h +f:drivers/s390/crypto/ap_card.c +f:drivers/s390/crypto/ap_debug.h +f:drivers/s390/crypto/ap_queue.c +f:drivers/s390/crypto/pkey_api.c +f:drivers/s390/crypto/pkey_base.c +f:drivers/s390/crypto/pkey_base.h +f:drivers/s390/crypto/pkey_cca.c +f:drivers/s390/crypto/pkey_ep11.c +f:drivers/s390/crypto/pkey_pckmo.c +f:drivers/s390/crypto/pkey_sysfs.c +f:drivers/s390/crypto/pkey_uv.c +f:drivers/s390/crypto/vfio_ap_debug.h +f:drivers/s390/crypto/vfio_ap_drv.c +f:drivers/s390/crypto/vfio_ap_ops.c +f:drivers/s390/crypto/vfio_ap_private.h +f:drivers/s390/crypto/zcrypt_api.c +f:drivers/s390/crypto/zcrypt_api.h +f:drivers/s390/crypto/zcrypt_card.c +f:drivers/s390/crypto/zcrypt_cca_key.h +f:drivers/s390/crypto/zcrypt_ccamisc.c +f:drivers/s390/crypto/zcrypt_ccamisc.h +f:drivers/s390/crypto/zcrypt_cex2a.c +f:drivers/s390/crypto/zcrypt_cex2a.h +f:drivers/s390/crypto/zcrypt_cex2c.c +f:drivers/s390/crypto/zcrypt_cex2c.h +f:drivers/s390/crypto/zcrypt_cex4.c +f:drivers/s390/crypto/zcrypt_cex4.h +f:drivers/s390/crypto/zcrypt_debug.h +f:drivers/s390/crypto/zcrypt_ep11misc.c +f:drivers/s390/crypto/zcrypt_ep11misc.h +f:drivers/s390/crypto/zcrypt_error.h +f:drivers/s390/crypto/zcrypt_msgtype50.c +f:drivers/s390/crypto/zcrypt_msgtype50.h +f:drivers/s390/crypto/zcrypt_msgtype6.c +f:drivers/s390/crypto/zcrypt_msgtype6.h +f:drivers/s390/crypto/zcrypt_queue.c +f:drivers/s390/net/Kconfig +f:drivers/s390/net/Makefile +f:drivers/s390/net/ctcm_dbug.c +f:drivers/s390/net/ctcm_dbug.h +f:drivers/s390/net/ctcm_fsms.c +f:drivers/s390/net/ctcm_fsms.h +f:drivers/s390/net/ctcm_main.c +f:drivers/s390/net/ctcm_main.h +f:drivers/s390/net/ctcm_mpc.c +f:drivers/s390/net/ctcm_mpc.h +f:drivers/s390/net/ctcm_sysfs.c +f:drivers/s390/net/fsm.c +f:drivers/s390/net/fsm.h +f:drivers/s390/net/ism.h +f:drivers/s390/net/ism_drv.c +f:drivers/s390/net/qeth_core.h +f:drivers/s390/net/qeth_core_main.c +f:drivers/s390/net/qeth_core_mpc.c +f:drivers/s390/net/qeth_core_mpc.h +f:drivers/s390/net/qeth_core_sys.c +f:drivers/s390/net/qeth_ethtool.c +f:drivers/s390/net/qeth_l2.h +f:drivers/s390/net/qeth_l2_main.c +f:drivers/s390/net/qeth_l2_sys.c +f:drivers/s390/net/qeth_l3.h +f:drivers/s390/net/qeth_l3_main.c +f:drivers/s390/net/qeth_l3_sys.c +f:drivers/s390/net/smsgiucv.c +f:drivers/s390/net/smsgiucv.h +f:drivers/s390/net/smsgiucv_app.c +f:drivers/s390/scsi/Makefile +f:drivers/s390/scsi/zfcp_aux.c +f:drivers/s390/scsi/zfcp_ccw.c +f:drivers/s390/scsi/zfcp_dbf.c +f:drivers/s390/scsi/zfcp_dbf.h +f:drivers/s390/scsi/zfcp_def.h +f:drivers/s390/scsi/zfcp_diag.c +f:drivers/s390/scsi/zfcp_diag.h +f:drivers/s390/scsi/zfcp_erp.c +f:drivers/s390/scsi/zfcp_ext.h +f:drivers/s390/scsi/zfcp_fc.c +f:drivers/s390/scsi/zfcp_fc.h +f:drivers/s390/scsi/zfcp_fsf.c +f:drivers/s390/scsi/zfcp_fsf.h +f:drivers/s390/scsi/zfcp_qdio.c +f:drivers/s390/scsi/zfcp_qdio.h +f:drivers/s390/scsi/zfcp_reqlist.h +f:drivers/s390/scsi/zfcp_scsi.c +f:drivers/s390/scsi/zfcp_sysfs.c +f:drivers/s390/scsi/zfcp_unit.c +f:drivers/s390/virtio/Makefile +f:drivers/s390/virtio/virtio_ccw.c +f:drivers/sbus/Makefile +f:drivers/sbus/char/Kconfig +f:drivers/sbus/char/Makefile +f:drivers/sbus/char/bbc_envctrl.c +f:drivers/sbus/char/bbc_i2c.c +f:drivers/sbus/char/bbc_i2c.h +f:drivers/sbus/char/display7seg.c +f:drivers/sbus/char/envctrl.c +f:drivers/sbus/char/flash.c +f:drivers/sbus/char/max1617.h +f:drivers/sbus/char/openprom.c +f:drivers/sbus/char/oradax.c +f:drivers/sbus/char/uctrl.c +f:drivers/scsi/.gitignore +f:drivers/scsi/3w-9xxx.c +f:drivers/scsi/3w-9xxx.h +f:drivers/scsi/3w-sas.c +f:drivers/scsi/3w-sas.h +f:drivers/scsi/3w-xxxx.c +f:drivers/scsi/3w-xxxx.h +f:drivers/scsi/53c700.c +f:drivers/scsi/53c700.h +f:drivers/scsi/53c700.scr +f:drivers/scsi/53c700_d.h_shipped +f:drivers/scsi/BusLogic.c +f:drivers/scsi/BusLogic.h +f:drivers/scsi/FlashPoint.c +f:drivers/scsi/Kconfig +f:drivers/scsi/Makefile +f:drivers/scsi/NCR5380.c +f:drivers/scsi/NCR5380.h +f:drivers/scsi/a100u2w.c +f:drivers/scsi/a100u2w.h +f:drivers/scsi/a2091.c +f:drivers/scsi/a2091.h +f:drivers/scsi/a3000.c +f:drivers/scsi/a3000.h +f:drivers/scsi/a4000t.c +f:drivers/scsi/aacraid/Makefile +f:drivers/scsi/aacraid/aachba.c +f:drivers/scsi/aacraid/aacraid.h +f:drivers/scsi/aacraid/commctrl.c +f:drivers/scsi/aacraid/comminit.c +f:drivers/scsi/aacraid/commsup.c +f:drivers/scsi/aacraid/dpcsup.c +f:drivers/scsi/aacraid/linit.c +f:drivers/scsi/aacraid/nark.c +f:drivers/scsi/aacraid/rkt.c +f:drivers/scsi/aacraid/rx.c +f:drivers/scsi/aacraid/sa.c +f:drivers/scsi/aacraid/src.c +f:drivers/scsi/advansys.c +f:drivers/scsi/aha152x.c +f:drivers/scsi/aha152x.h +f:drivers/scsi/aha1542.c +f:drivers/scsi/aha1542.h +f:drivers/scsi/aha1740.c +f:drivers/scsi/aha1740.h +f:drivers/scsi/aic7xxx/.gitignore +f:drivers/scsi/aic7xxx/Kconfig.aic79xx +f:drivers/scsi/aic7xxx/Kconfig.aic7xxx +f:drivers/scsi/aic7xxx/Makefile +f:drivers/scsi/aic7xxx/aic7770.c +f:drivers/scsi/aic7xxx/aic7770_osm.c +f:drivers/scsi/aic7xxx/aic79xx.h +f:drivers/scsi/aic7xxx/aic79xx.reg +f:drivers/scsi/aic7xxx/aic79xx.seq +f:drivers/scsi/aic7xxx/aic79xx_core.c +f:drivers/scsi/aic7xxx/aic79xx_inline.h +f:drivers/scsi/aic7xxx/aic79xx_osm.c +f:drivers/scsi/aic7xxx/aic79xx_osm.h +f:drivers/scsi/aic7xxx/aic79xx_osm_pci.c +f:drivers/scsi/aic7xxx/aic79xx_pci.c +f:drivers/scsi/aic7xxx/aic79xx_pci.h +f:drivers/scsi/aic7xxx/aic79xx_proc.c +f:drivers/scsi/aic7xxx/aic79xx_reg.h_shipped +f:drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped +f:drivers/scsi/aic7xxx/aic79xx_seq.h_shipped +f:drivers/scsi/aic7xxx/aic7xxx.h +f:drivers/scsi/aic7xxx/aic7xxx.reg +f:drivers/scsi/aic7xxx/aic7xxx.seq +f:drivers/scsi/aic7xxx/aic7xxx_93cx6.c +f:drivers/scsi/aic7xxx/aic7xxx_93cx6.h +f:drivers/scsi/aic7xxx/aic7xxx_core.c +f:drivers/scsi/aic7xxx/aic7xxx_inline.h +f:drivers/scsi/aic7xxx/aic7xxx_osm.c +f:drivers/scsi/aic7xxx/aic7xxx_osm.h +f:drivers/scsi/aic7xxx/aic7xxx_osm_pci.c +f:drivers/scsi/aic7xxx/aic7xxx_pci.c +f:drivers/scsi/aic7xxx/aic7xxx_pci.h +f:drivers/scsi/aic7xxx/aic7xxx_proc.c +f:drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped +f:drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped +f:drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped +f:drivers/scsi/aic7xxx/aicasm/Makefile +f:drivers/scsi/aic7xxx/aicasm/aicasm.c +f:drivers/scsi/aic7xxx/aicasm/aicasm.h +f:drivers/scsi/aic7xxx/aicasm/aicasm_gram.y +f:drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h +f:drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y +f:drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l +f:drivers/scsi/aic7xxx/aicasm/aicasm_scan.l +f:drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c +f:drivers/scsi/aic7xxx/aicasm/aicasm_symbol.h +f:drivers/scsi/aic7xxx/aiclib.h +f:drivers/scsi/aic7xxx/cam.h +f:drivers/scsi/aic7xxx/queue.h +f:drivers/scsi/aic7xxx/scsi_iu.h +f:drivers/scsi/aic7xxx/scsi_message.h +f:drivers/scsi/aic94xx/Kconfig +f:drivers/scsi/aic94xx/Makefile +f:drivers/scsi/aic94xx/aic94xx.h +f:drivers/scsi/aic94xx/aic94xx_dev.c +f:drivers/scsi/aic94xx/aic94xx_dump.c +f:drivers/scsi/aic94xx/aic94xx_dump.h +f:drivers/scsi/aic94xx/aic94xx_hwi.c +f:drivers/scsi/aic94xx/aic94xx_hwi.h +f:drivers/scsi/aic94xx/aic94xx_init.c +f:drivers/scsi/aic94xx/aic94xx_reg.c +f:drivers/scsi/aic94xx/aic94xx_reg.h +f:drivers/scsi/aic94xx/aic94xx_reg_def.h +f:drivers/scsi/aic94xx/aic94xx_sas.h +f:drivers/scsi/aic94xx/aic94xx_scb.c +f:drivers/scsi/aic94xx/aic94xx_sds.c +f:drivers/scsi/aic94xx/aic94xx_sds.h +f:drivers/scsi/aic94xx/aic94xx_seq.c +f:drivers/scsi/aic94xx/aic94xx_seq.h +f:drivers/scsi/aic94xx/aic94xx_task.c +f:drivers/scsi/aic94xx/aic94xx_tmf.c +f:drivers/scsi/am53c974.c +f:drivers/scsi/arcmsr/Makefile +f:drivers/scsi/arcmsr/arcmsr.h +f:drivers/scsi/arcmsr/arcmsr_attr.c +f:drivers/scsi/arcmsr/arcmsr_hba.c +f:drivers/scsi/arm/Kconfig +f:drivers/scsi/arm/Makefile +f:drivers/scsi/arm/acornscsi-io.S +f:drivers/scsi/arm/acornscsi.c +f:drivers/scsi/arm/acornscsi.h +f:drivers/scsi/arm/arm_scsi.h +f:drivers/scsi/arm/arxescsi.c +f:drivers/scsi/arm/cumana_1.c +f:drivers/scsi/arm/cumana_2.c +f:drivers/scsi/arm/eesox.c +f:drivers/scsi/arm/fas216.c +f:drivers/scsi/arm/fas216.h +f:drivers/scsi/arm/msgqueue.c +f:drivers/scsi/arm/msgqueue.h +f:drivers/scsi/arm/oak.c +f:drivers/scsi/arm/powertec.c +f:drivers/scsi/arm/queue.c +f:drivers/scsi/arm/queue.h +f:drivers/scsi/atari_scsi.c +f:drivers/scsi/atp870u.c +f:drivers/scsi/atp870u.h +f:drivers/scsi/be2iscsi/Kconfig +f:drivers/scsi/be2iscsi/Makefile +f:drivers/scsi/be2iscsi/be.h +f:drivers/scsi/be2iscsi/be_cmds.c +f:drivers/scsi/be2iscsi/be_cmds.h +f:drivers/scsi/be2iscsi/be_iscsi.c +f:drivers/scsi/be2iscsi/be_iscsi.h +f:drivers/scsi/be2iscsi/be_main.c +f:drivers/scsi/be2iscsi/be_main.h +f:drivers/scsi/be2iscsi/be_mgmt.c +f:drivers/scsi/be2iscsi/be_mgmt.h +f:drivers/scsi/bfa/Makefile +f:drivers/scsi/bfa/bfa.h +f:drivers/scsi/bfa/bfa_core.c +f:drivers/scsi/bfa/bfa_cs.h +f:drivers/scsi/bfa/bfa_defs.h +f:drivers/scsi/bfa/bfa_defs_fcs.h +f:drivers/scsi/bfa/bfa_defs_svc.h +f:drivers/scsi/bfa/bfa_fc.h +f:drivers/scsi/bfa/bfa_fcbuild.c +f:drivers/scsi/bfa/bfa_fcbuild.h +f:drivers/scsi/bfa/bfa_fcpim.c +f:drivers/scsi/bfa/bfa_fcpim.h +f:drivers/scsi/bfa/bfa_fcs.c +f:drivers/scsi/bfa/bfa_fcs.h +f:drivers/scsi/bfa/bfa_fcs_fcpim.c +f:drivers/scsi/bfa/bfa_fcs_lport.c +f:drivers/scsi/bfa/bfa_fcs_rport.c +f:drivers/scsi/bfa/bfa_hw_cb.c +f:drivers/scsi/bfa/bfa_hw_ct.c +f:drivers/scsi/bfa/bfa_ioc.c +f:drivers/scsi/bfa/bfa_ioc.h +f:drivers/scsi/bfa/bfa_ioc_cb.c +f:drivers/scsi/bfa/bfa_ioc_ct.c +f:drivers/scsi/bfa/bfa_modules.h +f:drivers/scsi/bfa/bfa_plog.h +f:drivers/scsi/bfa/bfa_port.c +f:drivers/scsi/bfa/bfa_port.h +f:drivers/scsi/bfa/bfa_svc.c +f:drivers/scsi/bfa/bfa_svc.h +f:drivers/scsi/bfa/bfad.c +f:drivers/scsi/bfa/bfad_attr.c +f:drivers/scsi/bfa/bfad_bsg.c +f:drivers/scsi/bfa/bfad_bsg.h +f:drivers/scsi/bfa/bfad_debugfs.c +f:drivers/scsi/bfa/bfad_drv.h +f:drivers/scsi/bfa/bfad_im.c +f:drivers/scsi/bfa/bfad_im.h +f:drivers/scsi/bfa/bfi.h +f:drivers/scsi/bfa/bfi_ms.h +f:drivers/scsi/bfa/bfi_reg.h +f:drivers/scsi/bnx2fc/57xx_hsi_bnx2fc.h +f:drivers/scsi/bnx2fc/Kconfig +f:drivers/scsi/bnx2fc/Makefile +f:drivers/scsi/bnx2fc/bnx2fc.h +f:drivers/scsi/bnx2fc/bnx2fc_constants.h +f:drivers/scsi/bnx2fc/bnx2fc_debug.c +f:drivers/scsi/bnx2fc/bnx2fc_debug.h +f:drivers/scsi/bnx2fc/bnx2fc_els.c +f:drivers/scsi/bnx2fc/bnx2fc_fcoe.c +f:drivers/scsi/bnx2fc/bnx2fc_hwi.c +f:drivers/scsi/bnx2fc/bnx2fc_io.c +f:drivers/scsi/bnx2fc/bnx2fc_tgt.c +f:drivers/scsi/bnx2i/57xx_iscsi_constants.h +f:drivers/scsi/bnx2i/57xx_iscsi_hsi.h +f:drivers/scsi/bnx2i/Kconfig +f:drivers/scsi/bnx2i/Makefile +f:drivers/scsi/bnx2i/bnx2i.h +f:drivers/scsi/bnx2i/bnx2i_hwi.c +f:drivers/scsi/bnx2i/bnx2i_init.c +f:drivers/scsi/bnx2i/bnx2i_iscsi.c +f:drivers/scsi/bnx2i/bnx2i_sysfs.c +f:drivers/scsi/bvme6000_scsi.c +f:drivers/scsi/ch.c +f:drivers/scsi/constants.c +f:drivers/scsi/csiostor/Kconfig +f:drivers/scsi/csiostor/Makefile +f:drivers/scsi/csiostor/csio_attr.c +f:drivers/scsi/csiostor/csio_defs.h +f:drivers/scsi/csiostor/csio_hw.c +f:drivers/scsi/csiostor/csio_hw.h +f:drivers/scsi/csiostor/csio_hw_chip.h +f:drivers/scsi/csiostor/csio_hw_t5.c +f:drivers/scsi/csiostor/csio_init.c +f:drivers/scsi/csiostor/csio_init.h +f:drivers/scsi/csiostor/csio_isr.c +f:drivers/scsi/csiostor/csio_lnode.c +f:drivers/scsi/csiostor/csio_lnode.h +f:drivers/scsi/csiostor/csio_mb.c +f:drivers/scsi/csiostor/csio_mb.h +f:drivers/scsi/csiostor/csio_rnode.c +f:drivers/scsi/csiostor/csio_rnode.h +f:drivers/scsi/csiostor/csio_scsi.c +f:drivers/scsi/csiostor/csio_scsi.h +f:drivers/scsi/csiostor/csio_wr.c +f:drivers/scsi/csiostor/csio_wr.h +f:drivers/scsi/csiostor/t4fw_api_stor.h +f:drivers/scsi/cxgbi/Kconfig +f:drivers/scsi/cxgbi/Makefile +f:drivers/scsi/cxgbi/cxgb3i/Kbuild +f:drivers/scsi/cxgbi/cxgb3i/Kconfig +f:drivers/scsi/cxgbi/cxgb3i/cxgb3i.c +f:drivers/scsi/cxgbi/cxgb3i/cxgb3i.h +f:drivers/scsi/cxgbi/cxgb4i/Kbuild +f:drivers/scsi/cxgbi/cxgb4i/Kconfig +f:drivers/scsi/cxgbi/cxgb4i/cxgb4i.c +f:drivers/scsi/cxgbi/cxgb4i/cxgb4i.h +f:drivers/scsi/cxgbi/libcxgbi.c +f:drivers/scsi/cxgbi/libcxgbi.h +f:drivers/scsi/dc395x.c +f:drivers/scsi/dc395x.h +f:drivers/scsi/device_handler/Kconfig +f:drivers/scsi/device_handler/Makefile +f:drivers/scsi/device_handler/scsi_dh_alua.c +f:drivers/scsi/device_handler/scsi_dh_emc.c +f:drivers/scsi/device_handler/scsi_dh_hp_sw.c +f:drivers/scsi/device_handler/scsi_dh_rdac.c +f:drivers/scsi/dmx3191d.c +f:drivers/scsi/elx/Kconfig +f:drivers/scsi/elx/Makefile +f:drivers/scsi/elx/efct/efct_driver.c +f:drivers/scsi/elx/efct/efct_driver.h +f:drivers/scsi/elx/efct/efct_hw.c +f:drivers/scsi/elx/efct/efct_hw.h +f:drivers/scsi/elx/efct/efct_hw_queues.c +f:drivers/scsi/elx/efct/efct_io.c +f:drivers/scsi/elx/efct/efct_io.h +f:drivers/scsi/elx/efct/efct_lio.c +f:drivers/scsi/elx/efct/efct_lio.h +f:drivers/scsi/elx/efct/efct_scsi.c +f:drivers/scsi/elx/efct/efct_scsi.h +f:drivers/scsi/elx/efct/efct_unsol.c +f:drivers/scsi/elx/efct/efct_unsol.h +f:drivers/scsi/elx/efct/efct_xport.c +f:drivers/scsi/elx/efct/efct_xport.h +f:drivers/scsi/elx/include/efc_common.h +f:drivers/scsi/elx/libefc/efc.h +f:drivers/scsi/elx/libefc/efc_cmds.c +f:drivers/scsi/elx/libefc/efc_cmds.h +f:drivers/scsi/elx/libefc/efc_device.c +f:drivers/scsi/elx/libefc/efc_device.h +f:drivers/scsi/elx/libefc/efc_domain.c +f:drivers/scsi/elx/libefc/efc_domain.h +f:drivers/scsi/elx/libefc/efc_els.c +f:drivers/scsi/elx/libefc/efc_els.h +f:drivers/scsi/elx/libefc/efc_fabric.c +f:drivers/scsi/elx/libefc/efc_fabric.h +f:drivers/scsi/elx/libefc/efc_node.c +f:drivers/scsi/elx/libefc/efc_node.h +f:drivers/scsi/elx/libefc/efc_nport.c +f:drivers/scsi/elx/libefc/efc_nport.h +f:drivers/scsi/elx/libefc/efc_sm.c +f:drivers/scsi/elx/libefc/efc_sm.h +f:drivers/scsi/elx/libefc/efclib.c +f:drivers/scsi/elx/libefc/efclib.h +f:drivers/scsi/elx/libefc_sli/sli4.c +f:drivers/scsi/elx/libefc_sli/sli4.h +f:drivers/scsi/esas2r/Kconfig +f:drivers/scsi/esas2r/Makefile +f:drivers/scsi/esas2r/atioctl.h +f:drivers/scsi/esas2r/atvda.h +f:drivers/scsi/esas2r/esas2r.h +f:drivers/scsi/esas2r/esas2r_disc.c +f:drivers/scsi/esas2r/esas2r_flash.c +f:drivers/scsi/esas2r/esas2r_init.c +f:drivers/scsi/esas2r/esas2r_int.c +f:drivers/scsi/esas2r/esas2r_io.c +f:drivers/scsi/esas2r/esas2r_ioctl.c +f:drivers/scsi/esas2r/esas2r_log.c +f:drivers/scsi/esas2r/esas2r_log.h +f:drivers/scsi/esas2r/esas2r_main.c +f:drivers/scsi/esas2r/esas2r_targdb.c +f:drivers/scsi/esas2r/esas2r_vda.c +f:drivers/scsi/esp_scsi.c +f:drivers/scsi/esp_scsi.h +f:drivers/scsi/fcoe/Makefile +f:drivers/scsi/fcoe/fcoe.c +f:drivers/scsi/fcoe/fcoe.h +f:drivers/scsi/fcoe/fcoe_ctlr.c +f:drivers/scsi/fcoe/fcoe_sysfs.c +f:drivers/scsi/fcoe/fcoe_transport.c +f:drivers/scsi/fcoe/libfcoe.h +f:drivers/scsi/fdomain.c +f:drivers/scsi/fdomain.h +f:drivers/scsi/fdomain_isa.c +f:drivers/scsi/fdomain_pci.c +f:drivers/scsi/fnic/Makefile +f:drivers/scsi/fnic/cq_desc.h +f:drivers/scsi/fnic/cq_enet_desc.h +f:drivers/scsi/fnic/cq_exch_desc.h +f:drivers/scsi/fnic/fcpio.h +f:drivers/scsi/fnic/fdls_disc.c +f:drivers/scsi/fnic/fdls_fc.h +f:drivers/scsi/fnic/fip.c +f:drivers/scsi/fnic/fip.h +f:drivers/scsi/fnic/fnic.h +f:drivers/scsi/fnic/fnic_attrs.c +f:drivers/scsi/fnic/fnic_debugfs.c +f:drivers/scsi/fnic/fnic_fcs.c +f:drivers/scsi/fnic/fnic_fdls.h +f:drivers/scsi/fnic/fnic_io.h +f:drivers/scsi/fnic/fnic_isr.c +f:drivers/scsi/fnic/fnic_main.c +f:drivers/scsi/fnic/fnic_pci_subsys_devid.c +f:drivers/scsi/fnic/fnic_res.c +f:drivers/scsi/fnic/fnic_res.h +f:drivers/scsi/fnic/fnic_scsi.c +f:drivers/scsi/fnic/fnic_stats.h +f:drivers/scsi/fnic/fnic_trace.c +f:drivers/scsi/fnic/fnic_trace.h +f:drivers/scsi/fnic/rq_enet_desc.h +f:drivers/scsi/fnic/vnic_cq.c +f:drivers/scsi/fnic/vnic_cq.h +f:drivers/scsi/fnic/vnic_cq_copy.h +f:drivers/scsi/fnic/vnic_dev.c +f:drivers/scsi/fnic/vnic_dev.h +f:drivers/scsi/fnic/vnic_devcmd.h +f:drivers/scsi/fnic/vnic_intr.c +f:drivers/scsi/fnic/vnic_intr.h +f:drivers/scsi/fnic/vnic_nic.h +f:drivers/scsi/fnic/vnic_resource.h +f:drivers/scsi/fnic/vnic_rq.c +f:drivers/scsi/fnic/vnic_rq.h +f:drivers/scsi/fnic/vnic_scsi.h +f:drivers/scsi/fnic/vnic_stats.h +f:drivers/scsi/fnic/vnic_wq.c +f:drivers/scsi/fnic/vnic_wq.h +f:drivers/scsi/fnic/vnic_wq_copy.c +f:drivers/scsi/fnic/vnic_wq_copy.h +f:drivers/scsi/fnic/wq_enet_desc.h +f:drivers/scsi/g_NCR5380.c +f:drivers/scsi/gvp11.c +f:drivers/scsi/gvp11.h +f:drivers/scsi/hisi_sas/Kconfig +f:drivers/scsi/hisi_sas/Makefile +f:drivers/scsi/hisi_sas/hisi_sas.h +f:drivers/scsi/hisi_sas/hisi_sas_main.c +f:drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +f:drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +f:drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +f:drivers/scsi/hosts.c +f:drivers/scsi/hpsa.c +f:drivers/scsi/hpsa.h +f:drivers/scsi/hpsa_cmd.h +f:drivers/scsi/hptiop.c +f:drivers/scsi/hptiop.h +f:drivers/scsi/ibmvscsi/Makefile +f:drivers/scsi/ibmvscsi/ibmvfc.c +f:drivers/scsi/ibmvscsi/ibmvfc.h +f:drivers/scsi/ibmvscsi/ibmvscsi.c +f:drivers/scsi/ibmvscsi/ibmvscsi.h +f:drivers/scsi/ibmvscsi_tgt/Makefile +f:drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c +f:drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.h +f:drivers/scsi/ibmvscsi_tgt/libsrp.c +f:drivers/scsi/ibmvscsi_tgt/libsrp.h +f:drivers/scsi/imm.c +f:drivers/scsi/imm.h +f:drivers/scsi/initio.c +f:drivers/scsi/initio.h +f:drivers/scsi/ipr.c +f:drivers/scsi/ipr.h +f:drivers/scsi/ips.c +f:drivers/scsi/ips.h +f:drivers/scsi/isci/Makefile +f:drivers/scsi/isci/host.c +f:drivers/scsi/isci/host.h +f:drivers/scsi/isci/init.c +f:drivers/scsi/isci/isci.h +f:drivers/scsi/isci/phy.c +f:drivers/scsi/isci/phy.h +f:drivers/scsi/isci/port.c +f:drivers/scsi/isci/port.h +f:drivers/scsi/isci/port_config.c +f:drivers/scsi/isci/probe_roms.c +f:drivers/scsi/isci/probe_roms.h +f:drivers/scsi/isci/registers.h +f:drivers/scsi/isci/remote_device.c +f:drivers/scsi/isci/remote_device.h +f:drivers/scsi/isci/remote_node_context.c +f:drivers/scsi/isci/remote_node_context.h +f:drivers/scsi/isci/remote_node_table.c +f:drivers/scsi/isci/remote_node_table.h +f:drivers/scsi/isci/request.c +f:drivers/scsi/isci/request.h +f:drivers/scsi/isci/sas.h +f:drivers/scsi/isci/scu_completion_codes.h +f:drivers/scsi/isci/scu_event_codes.h +f:drivers/scsi/isci/scu_remote_node_context.h +f:drivers/scsi/isci/scu_task_context.h +f:drivers/scsi/isci/task.c +f:drivers/scsi/isci/task.h +f:drivers/scsi/isci/unsolicited_frame_control.c +f:drivers/scsi/isci/unsolicited_frame_control.h +f:drivers/scsi/iscsi_boot_sysfs.c +f:drivers/scsi/iscsi_tcp.c +f:drivers/scsi/iscsi_tcp.h +f:drivers/scsi/jazz_esp.c +f:drivers/scsi/lasi700.c +f:drivers/scsi/libfc/Makefile +f:drivers/scsi/libfc/fc_disc.c +f:drivers/scsi/libfc/fc_elsct.c +f:drivers/scsi/libfc/fc_encode.h +f:drivers/scsi/libfc/fc_exch.c +f:drivers/scsi/libfc/fc_fcp.c +f:drivers/scsi/libfc/fc_frame.c +f:drivers/scsi/libfc/fc_libfc.c +f:drivers/scsi/libfc/fc_libfc.h +f:drivers/scsi/libfc/fc_lport.c +f:drivers/scsi/libfc/fc_npiv.c +f:drivers/scsi/libfc/fc_rport.c +f:drivers/scsi/libiscsi.c +f:drivers/scsi/libiscsi_tcp.c +f:drivers/scsi/libsas/Kconfig +f:drivers/scsi/libsas/Makefile +f:drivers/scsi/libsas/sas_ata.c +f:drivers/scsi/libsas/sas_discover.c +f:drivers/scsi/libsas/sas_event.c +f:drivers/scsi/libsas/sas_expander.c +f:drivers/scsi/libsas/sas_host_smp.c +f:drivers/scsi/libsas/sas_init.c +f:drivers/scsi/libsas/sas_internal.h +f:drivers/scsi/libsas/sas_phy.c +f:drivers/scsi/libsas/sas_port.c +f:drivers/scsi/libsas/sas_scsi_host.c +f:drivers/scsi/libsas/sas_task.c +f:drivers/scsi/lpfc/Makefile +f:drivers/scsi/lpfc/lpfc.h +f:drivers/scsi/lpfc/lpfc_attr.c +f:drivers/scsi/lpfc/lpfc_attr.h +f:drivers/scsi/lpfc/lpfc_bsg.c +f:drivers/scsi/lpfc/lpfc_bsg.h +f:drivers/scsi/lpfc/lpfc_compat.h +f:drivers/scsi/lpfc/lpfc_crtn.h +f:drivers/scsi/lpfc/lpfc_ct.c +f:drivers/scsi/lpfc/lpfc_debugfs.c +f:drivers/scsi/lpfc/lpfc_debugfs.h +f:drivers/scsi/lpfc/lpfc_disc.h +f:drivers/scsi/lpfc/lpfc_els.c +f:drivers/scsi/lpfc/lpfc_hbadisc.c +f:drivers/scsi/lpfc/lpfc_hw.h +f:drivers/scsi/lpfc/lpfc_hw4.h +f:drivers/scsi/lpfc/lpfc_ids.h +f:drivers/scsi/lpfc/lpfc_init.c +f:drivers/scsi/lpfc/lpfc_logmsg.h +f:drivers/scsi/lpfc/lpfc_mbox.c +f:drivers/scsi/lpfc/lpfc_mem.c +f:drivers/scsi/lpfc/lpfc_nl.h +f:drivers/scsi/lpfc/lpfc_nportdisc.c +f:drivers/scsi/lpfc/lpfc_nvme.c +f:drivers/scsi/lpfc/lpfc_nvme.h +f:drivers/scsi/lpfc/lpfc_nvmet.c +f:drivers/scsi/lpfc/lpfc_scsi.c +f:drivers/scsi/lpfc/lpfc_scsi.h +f:drivers/scsi/lpfc/lpfc_sli.c +f:drivers/scsi/lpfc/lpfc_sli.h +f:drivers/scsi/lpfc/lpfc_sli4.h +f:drivers/scsi/lpfc/lpfc_version.h +f:drivers/scsi/lpfc/lpfc_vmid.c +f:drivers/scsi/lpfc/lpfc_vport.c +f:drivers/scsi/lpfc/lpfc_vport.h +f:drivers/scsi/mac53c94.c +f:drivers/scsi/mac53c94.h +f:drivers/scsi/mac_esp.c +f:drivers/scsi/mac_scsi.c +f:drivers/scsi/megaraid.c +f:drivers/scsi/megaraid.h +f:drivers/scsi/megaraid/Kconfig.megaraid +f:drivers/scsi/megaraid/Makefile +f:drivers/scsi/megaraid/mbox_defs.h +f:drivers/scsi/megaraid/mega_common.h +f:drivers/scsi/megaraid/megaraid_ioctl.h +f:drivers/scsi/megaraid/megaraid_mbox.c +f:drivers/scsi/megaraid/megaraid_mbox.h +f:drivers/scsi/megaraid/megaraid_mm.c +f:drivers/scsi/megaraid/megaraid_mm.h +f:drivers/scsi/megaraid/megaraid_sas.h +f:drivers/scsi/megaraid/megaraid_sas_base.c +f:drivers/scsi/megaraid/megaraid_sas_debugfs.c +f:drivers/scsi/megaraid/megaraid_sas_fp.c +f:drivers/scsi/megaraid/megaraid_sas_fusion.c +f:drivers/scsi/megaraid/megaraid_sas_fusion.h +f:drivers/scsi/mesh.c +f:drivers/scsi/mesh.h +f:drivers/scsi/mpi3mr/Kconfig +f:drivers/scsi/mpi3mr/Makefile +f:drivers/scsi/mpi3mr/mpi/mpi30_cnfg.h +f:drivers/scsi/mpi3mr/mpi/mpi30_image.h +f:drivers/scsi/mpi3mr/mpi/mpi30_init.h +f:drivers/scsi/mpi3mr/mpi/mpi30_ioc.h +f:drivers/scsi/mpi3mr/mpi/mpi30_pci.h +f:drivers/scsi/mpi3mr/mpi/mpi30_sas.h +f:drivers/scsi/mpi3mr/mpi/mpi30_tool.h +f:drivers/scsi/mpi3mr/mpi/mpi30_transport.h +f:drivers/scsi/mpi3mr/mpi3mr.h +f:drivers/scsi/mpi3mr/mpi3mr_app.c +f:drivers/scsi/mpi3mr/mpi3mr_debug.h +f:drivers/scsi/mpi3mr/mpi3mr_fw.c +f:drivers/scsi/mpi3mr/mpi3mr_os.c +f:drivers/scsi/mpi3mr/mpi3mr_transport.c +f:drivers/scsi/mpt3sas/Kconfig +f:drivers/scsi/mpt3sas/Makefile +f:drivers/scsi/mpt3sas/mpi/mpi2.h +f:drivers/scsi/mpt3sas/mpi/mpi2_cnfg.h +f:drivers/scsi/mpt3sas/mpi/mpi2_image.h +f:drivers/scsi/mpt3sas/mpi/mpi2_init.h +f:drivers/scsi/mpt3sas/mpi/mpi2_ioc.h +f:drivers/scsi/mpt3sas/mpi/mpi2_pci.h +f:drivers/scsi/mpt3sas/mpi/mpi2_raid.h +f:drivers/scsi/mpt3sas/mpi/mpi2_sas.h +f:drivers/scsi/mpt3sas/mpi/mpi2_tool.h +f:drivers/scsi/mpt3sas/mpi/mpi2_type.h +f:drivers/scsi/mpt3sas/mpt3sas_base.c +f:drivers/scsi/mpt3sas/mpt3sas_base.h +f:drivers/scsi/mpt3sas/mpt3sas_config.c +f:drivers/scsi/mpt3sas/mpt3sas_ctl.c +f:drivers/scsi/mpt3sas/mpt3sas_ctl.h +f:drivers/scsi/mpt3sas/mpt3sas_debug.h +f:drivers/scsi/mpt3sas/mpt3sas_debugfs.c +f:drivers/scsi/mpt3sas/mpt3sas_scsih.c +f:drivers/scsi/mpt3sas/mpt3sas_transport.c +f:drivers/scsi/mpt3sas/mpt3sas_trigger_diag.c +f:drivers/scsi/mpt3sas/mpt3sas_trigger_diag.h +f:drivers/scsi/mpt3sas/mpt3sas_trigger_pages.h +f:drivers/scsi/mpt3sas/mpt3sas_warpdrive.c +f:drivers/scsi/mvme147.c +f:drivers/scsi/mvme147.h +f:drivers/scsi/mvme16x_scsi.c +f:drivers/scsi/mvsas/Kconfig +f:drivers/scsi/mvsas/Makefile +f:drivers/scsi/mvsas/mv_64xx.c +f:drivers/scsi/mvsas/mv_64xx.h +f:drivers/scsi/mvsas/mv_94xx.c +f:drivers/scsi/mvsas/mv_94xx.h +f:drivers/scsi/mvsas/mv_chips.h +f:drivers/scsi/mvsas/mv_defs.h +f:drivers/scsi/mvsas/mv_init.c +f:drivers/scsi/mvsas/mv_sas.c +f:drivers/scsi/mvsas/mv_sas.h +f:drivers/scsi/mvumi.c +f:drivers/scsi/mvumi.h +f:drivers/scsi/myrb.c +f:drivers/scsi/myrb.h +f:drivers/scsi/myrs.c +f:drivers/scsi/myrs.h +f:drivers/scsi/ncr53c8xx.c +f:drivers/scsi/ncr53c8xx.h +f:drivers/scsi/nsp32.c +f:drivers/scsi/nsp32.h +f:drivers/scsi/nsp32_debug.c +f:drivers/scsi/nsp32_io.h +f:drivers/scsi/pcmcia/Kconfig +f:drivers/scsi/pcmcia/Makefile +f:drivers/scsi/pcmcia/aha152x_core.c +f:drivers/scsi/pcmcia/aha152x_stub.c +f:drivers/scsi/pcmcia/fdomain_cs.c +f:drivers/scsi/pcmcia/nsp_cs.c +f:drivers/scsi/pcmcia/nsp_cs.h +f:drivers/scsi/pcmcia/nsp_debug.c +f:drivers/scsi/pcmcia/nsp_io.h +f:drivers/scsi/pcmcia/nsp_message.c +f:drivers/scsi/pcmcia/qlogic_stub.c +f:drivers/scsi/pcmcia/sym53c500_cs.c +f:drivers/scsi/pm8001/Makefile +f:drivers/scsi/pm8001/pm8001_chips.h +f:drivers/scsi/pm8001/pm8001_ctl.c +f:drivers/scsi/pm8001/pm8001_ctl.h +f:drivers/scsi/pm8001/pm8001_defs.h +f:drivers/scsi/pm8001/pm8001_hwi.c +f:drivers/scsi/pm8001/pm8001_hwi.h +f:drivers/scsi/pm8001/pm8001_init.c +f:drivers/scsi/pm8001/pm8001_sas.c +f:drivers/scsi/pm8001/pm8001_sas.h +f:drivers/scsi/pm8001/pm80xx_hwi.c +f:drivers/scsi/pm8001/pm80xx_hwi.h +f:drivers/scsi/pm8001/pm80xx_tracepoints.c +f:drivers/scsi/pm8001/pm80xx_tracepoints.h +f:drivers/scsi/pmcraid.c +f:drivers/scsi/pmcraid.h +f:drivers/scsi/ppa.c +f:drivers/scsi/ppa.h +f:drivers/scsi/ps3rom.c +f:drivers/scsi/qedf/Kconfig +f:drivers/scsi/qedf/Makefile +f:drivers/scsi/qedf/drv_fcoe_fw_funcs.c +f:drivers/scsi/qedf/drv_fcoe_fw_funcs.h +f:drivers/scsi/qedf/drv_scsi_fw_funcs.c +f:drivers/scsi/qedf/drv_scsi_fw_funcs.h +f:drivers/scsi/qedf/qedf.h +f:drivers/scsi/qedf/qedf_attr.c +f:drivers/scsi/qedf/qedf_dbg.c +f:drivers/scsi/qedf/qedf_dbg.h +f:drivers/scsi/qedf/qedf_debugfs.c +f:drivers/scsi/qedf/qedf_els.c +f:drivers/scsi/qedf/qedf_fip.c +f:drivers/scsi/qedf/qedf_hsi.h +f:drivers/scsi/qedf/qedf_io.c +f:drivers/scsi/qedf/qedf_main.c +f:drivers/scsi/qedf/qedf_version.h +f:drivers/scsi/qedi/Kconfig +f:drivers/scsi/qedi/Makefile +f:drivers/scsi/qedi/qedi.h +f:drivers/scsi/qedi/qedi_dbg.c +f:drivers/scsi/qedi/qedi_dbg.h +f:drivers/scsi/qedi/qedi_debugfs.c +f:drivers/scsi/qedi/qedi_fw.c +f:drivers/scsi/qedi/qedi_fw_api.c +f:drivers/scsi/qedi/qedi_fw_iscsi.h +f:drivers/scsi/qedi/qedi_fw_scsi.h +f:drivers/scsi/qedi/qedi_gbl.h +f:drivers/scsi/qedi/qedi_hsi.h +f:drivers/scsi/qedi/qedi_iscsi.c +f:drivers/scsi/qedi/qedi_iscsi.h +f:drivers/scsi/qedi/qedi_main.c +f:drivers/scsi/qedi/qedi_nvm_iscsi_cfg.h +f:drivers/scsi/qedi/qedi_sysfs.c +f:drivers/scsi/qedi/qedi_version.h +f:drivers/scsi/qla1280.c +f:drivers/scsi/qla1280.h +f:drivers/scsi/qla2xxx/Kconfig +f:drivers/scsi/qla2xxx/Makefile +f:drivers/scsi/qla2xxx/qla_attr.c +f:drivers/scsi/qla2xxx/qla_bsg.c +f:drivers/scsi/qla2xxx/qla_bsg.h +f:drivers/scsi/qla2xxx/qla_dbg.c +f:drivers/scsi/qla2xxx/qla_dbg.h +f:drivers/scsi/qla2xxx/qla_def.h +f:drivers/scsi/qla2xxx/qla_devtbl.h +f:drivers/scsi/qla2xxx/qla_dfs.c +f:drivers/scsi/qla2xxx/qla_dsd.h +f:drivers/scsi/qla2xxx/qla_edif.c +f:drivers/scsi/qla2xxx/qla_edif.h +f:drivers/scsi/qla2xxx/qla_edif_bsg.h +f:drivers/scsi/qla2xxx/qla_fw.h +f:drivers/scsi/qla2xxx/qla_gbl.h +f:drivers/scsi/qla2xxx/qla_gs.c +f:drivers/scsi/qla2xxx/qla_init.c +f:drivers/scsi/qla2xxx/qla_inline.h +f:drivers/scsi/qla2xxx/qla_iocb.c +f:drivers/scsi/qla2xxx/qla_isr.c +f:drivers/scsi/qla2xxx/qla_mbx.c +f:drivers/scsi/qla2xxx/qla_mid.c +f:drivers/scsi/qla2xxx/qla_mr.c +f:drivers/scsi/qla2xxx/qla_mr.h +f:drivers/scsi/qla2xxx/qla_nvme.c +f:drivers/scsi/qla2xxx/qla_nvme.h +f:drivers/scsi/qla2xxx/qla_nx.c +f:drivers/scsi/qla2xxx/qla_nx.h +f:drivers/scsi/qla2xxx/qla_nx2.c +f:drivers/scsi/qla2xxx/qla_nx2.h +f:drivers/scsi/qla2xxx/qla_os.c +f:drivers/scsi/qla2xxx/qla_settings.h +f:drivers/scsi/qla2xxx/qla_sup.c +f:drivers/scsi/qla2xxx/qla_target.c +f:drivers/scsi/qla2xxx/qla_target.h +f:drivers/scsi/qla2xxx/qla_tmpl.c +f:drivers/scsi/qla2xxx/qla_tmpl.h +f:drivers/scsi/qla2xxx/qla_version.h +f:drivers/scsi/qla2xxx/tcm_qla2xxx.c +f:drivers/scsi/qla2xxx/tcm_qla2xxx.h +f:drivers/scsi/qla4xxx/Kconfig +f:drivers/scsi/qla4xxx/Makefile +f:drivers/scsi/qla4xxx/ql4_83xx.c +f:drivers/scsi/qla4xxx/ql4_83xx.h +f:drivers/scsi/qla4xxx/ql4_attr.c +f:drivers/scsi/qla4xxx/ql4_bsg.c +f:drivers/scsi/qla4xxx/ql4_bsg.h +f:drivers/scsi/qla4xxx/ql4_dbg.c +f:drivers/scsi/qla4xxx/ql4_dbg.h +f:drivers/scsi/qla4xxx/ql4_def.h +f:drivers/scsi/qla4xxx/ql4_fw.h +f:drivers/scsi/qla4xxx/ql4_glbl.h +f:drivers/scsi/qla4xxx/ql4_init.c +f:drivers/scsi/qla4xxx/ql4_inline.h +f:drivers/scsi/qla4xxx/ql4_iocb.c +f:drivers/scsi/qla4xxx/ql4_isr.c +f:drivers/scsi/qla4xxx/ql4_mbx.c +f:drivers/scsi/qla4xxx/ql4_nvram.c +f:drivers/scsi/qla4xxx/ql4_nvram.h +f:drivers/scsi/qla4xxx/ql4_nx.c +f:drivers/scsi/qla4xxx/ql4_nx.h +f:drivers/scsi/qla4xxx/ql4_os.c +f:drivers/scsi/qla4xxx/ql4_version.h +f:drivers/scsi/qlogicfas.c +f:drivers/scsi/qlogicfas408.c +f:drivers/scsi/qlogicfas408.h +f:drivers/scsi/qlogicpti.c +f:drivers/scsi/qlogicpti.h +f:drivers/scsi/raid_class.c +f:drivers/scsi/script_asm.pl +f:drivers/scsi/scsi.c +f:drivers/scsi/scsi_bsg.c +f:drivers/scsi/scsi_common.c +f:drivers/scsi/scsi_debug.c +f:drivers/scsi/scsi_debugfs.c +f:drivers/scsi/scsi_debugfs.h +f:drivers/scsi/scsi_devinfo.c +f:drivers/scsi/scsi_dh.c +f:drivers/scsi/scsi_error.c +f:drivers/scsi/scsi_ioctl.c +f:drivers/scsi/scsi_lib.c +f:drivers/scsi/scsi_lib_dma.c +f:drivers/scsi/scsi_lib_test.c +f:drivers/scsi/scsi_logging.c +f:drivers/scsi/scsi_logging.h +f:drivers/scsi/scsi_netlink.c +f:drivers/scsi/scsi_pm.c +f:drivers/scsi/scsi_priv.h +f:drivers/scsi/scsi_proc.c +f:drivers/scsi/scsi_proto_test.c +f:drivers/scsi/scsi_sas_internal.h +f:drivers/scsi/scsi_scan.c +f:drivers/scsi/scsi_sysctl.c +f:drivers/scsi/scsi_sysfs.c +f:drivers/scsi/scsi_trace.c +f:drivers/scsi/scsi_transport_api.h +f:drivers/scsi/scsi_transport_fc.c +f:drivers/scsi/scsi_transport_iscsi.c +f:drivers/scsi/scsi_transport_sas.c +f:drivers/scsi/scsi_transport_spi.c +f:drivers/scsi/scsi_transport_srp.c +f:drivers/scsi/scsicam.c +f:drivers/scsi/sd.c +f:drivers/scsi/sd.h +f:drivers/scsi/sd_dif.c +f:drivers/scsi/sd_trace.h +f:drivers/scsi/sd_zbc.c +f:drivers/scsi/sense_codes.h +f:drivers/scsi/ses.c +f:drivers/scsi/sg.c +f:drivers/scsi/sgiwd93.c +f:drivers/scsi/sim710.c +f:drivers/scsi/smartpqi/Kconfig +f:drivers/scsi/smartpqi/Makefile +f:drivers/scsi/smartpqi/smartpqi.h +f:drivers/scsi/smartpqi/smartpqi_init.c +f:drivers/scsi/smartpqi/smartpqi_sas_transport.c +f:drivers/scsi/smartpqi/smartpqi_sis.c +f:drivers/scsi/smartpqi/smartpqi_sis.h +f:drivers/scsi/sni_53c710.c +f:drivers/scsi/snic/Makefile +f:drivers/scsi/snic/cq_desc.h +f:drivers/scsi/snic/cq_enet_desc.h +f:drivers/scsi/snic/snic.h +f:drivers/scsi/snic/snic_attrs.c +f:drivers/scsi/snic/snic_ctl.c +f:drivers/scsi/snic/snic_debugfs.c +f:drivers/scsi/snic/snic_disc.c +f:drivers/scsi/snic/snic_disc.h +f:drivers/scsi/snic/snic_fwint.h +f:drivers/scsi/snic/snic_io.c +f:drivers/scsi/snic/snic_io.h +f:drivers/scsi/snic/snic_isr.c +f:drivers/scsi/snic/snic_main.c +f:drivers/scsi/snic/snic_res.c +f:drivers/scsi/snic/snic_res.h +f:drivers/scsi/snic/snic_scsi.c +f:drivers/scsi/snic/snic_stats.h +f:drivers/scsi/snic/snic_trc.c +f:drivers/scsi/snic/snic_trc.h +f:drivers/scsi/snic/vnic_cq.c +f:drivers/scsi/snic/vnic_cq.h +f:drivers/scsi/snic/vnic_cq_fw.h +f:drivers/scsi/snic/vnic_dev.c +f:drivers/scsi/snic/vnic_dev.h +f:drivers/scsi/snic/vnic_devcmd.h +f:drivers/scsi/snic/vnic_intr.c +f:drivers/scsi/snic/vnic_intr.h +f:drivers/scsi/snic/vnic_resource.h +f:drivers/scsi/snic/vnic_snic.h +f:drivers/scsi/snic/vnic_stats.h +f:drivers/scsi/snic/vnic_wq.c +f:drivers/scsi/snic/vnic_wq.h +f:drivers/scsi/snic/wq_enet_desc.h +f:drivers/scsi/sr.c +f:drivers/scsi/sr.h +f:drivers/scsi/sr_ioctl.c +f:drivers/scsi/sr_vendor.c +f:drivers/scsi/st.c +f:drivers/scsi/st.h +f:drivers/scsi/st_options.h +f:drivers/scsi/stex.c +f:drivers/scsi/storvsc_drv.c +f:drivers/scsi/sun3_scsi.c +f:drivers/scsi/sun3_scsi_vme.c +f:drivers/scsi/sun3x_esp.c +f:drivers/scsi/sun_esp.c +f:drivers/scsi/sym53c8xx_2/Makefile +f:drivers/scsi/sym53c8xx_2/sym53c8xx.h +f:drivers/scsi/sym53c8xx_2/sym_defs.h +f:drivers/scsi/sym53c8xx_2/sym_fw.c +f:drivers/scsi/sym53c8xx_2/sym_fw.h +f:drivers/scsi/sym53c8xx_2/sym_fw1.h +f:drivers/scsi/sym53c8xx_2/sym_fw2.h +f:drivers/scsi/sym53c8xx_2/sym_glue.c +f:drivers/scsi/sym53c8xx_2/sym_glue.h +f:drivers/scsi/sym53c8xx_2/sym_hipd.c +f:drivers/scsi/sym53c8xx_2/sym_hipd.h +f:drivers/scsi/sym53c8xx_2/sym_malloc.c +f:drivers/scsi/sym53c8xx_2/sym_misc.h +f:drivers/scsi/sym53c8xx_2/sym_nvram.c +f:drivers/scsi/sym53c8xx_2/sym_nvram.h +f:drivers/scsi/virtio_scsi.c +f:drivers/scsi/vmw_pvscsi.c +f:drivers/scsi/vmw_pvscsi.h +f:drivers/scsi/wd33c93.c +f:drivers/scsi/wd33c93.h +f:drivers/scsi/wd719x.c +f:drivers/scsi/wd719x.h +f:drivers/scsi/xen-scsifront.c +f:drivers/scsi/zalon.c +f:drivers/scsi/zorro7xx.c +f:drivers/scsi/zorro_esp.c +f:drivers/sh/Kconfig +f:drivers/sh/Makefile +f:drivers/sh/clk/Makefile +f:drivers/sh/clk/core.c +f:drivers/sh/clk/cpg.c +f:drivers/sh/intc/Kconfig +f:drivers/sh/intc/Makefile +f:drivers/sh/intc/access.c +f:drivers/sh/intc/balancing.c +f:drivers/sh/intc/chip.c +f:drivers/sh/intc/core.c +f:drivers/sh/intc/handle.c +f:drivers/sh/intc/internals.h +f:drivers/sh/intc/irqdomain.c +f:drivers/sh/intc/userimask.c +f:drivers/sh/intc/virq-debugfs.c +f:drivers/sh/intc/virq.c +f:drivers/sh/maple/Makefile +f:drivers/sh/maple/maple.c +f:drivers/sh/pm_runtime.c +f:drivers/siox/Kconfig +f:drivers/siox/Makefile +f:drivers/siox/siox-bus-gpio.c +f:drivers/siox/siox-core.c +f:drivers/siox/siox.h +f:drivers/slimbus/Kconfig +f:drivers/slimbus/Makefile +f:drivers/slimbus/core.c +f:drivers/slimbus/messaging.c +f:drivers/slimbus/qcom-ctrl.c +f:drivers/slimbus/qcom-ngd-ctrl.c +f:drivers/slimbus/sched.c +f:drivers/slimbus/slimbus.h +f:drivers/slimbus/stream.c +f:drivers/soc/Kconfig +f:drivers/soc/Makefile +f:drivers/soc/amlogic/Kconfig +f:drivers/soc/amlogic/Makefile +f:drivers/soc/amlogic/meson-canvas.c +f:drivers/soc/amlogic/meson-clk-measure.c +f:drivers/soc/amlogic/meson-gx-socinfo.c +f:drivers/soc/amlogic/meson-mx-socinfo.c +f:drivers/soc/apple/Kconfig +f:drivers/soc/apple/Makefile +f:drivers/soc/apple/mailbox.c +f:drivers/soc/apple/mailbox.h +f:drivers/soc/apple/rtkit-crashlog.c +f:drivers/soc/apple/rtkit-internal.h +f:drivers/soc/apple/rtkit.c +f:drivers/soc/apple/sart.c +f:drivers/soc/aspeed/Kconfig +f:drivers/soc/aspeed/Makefile +f:drivers/soc/aspeed/aspeed-lpc-ctrl.c +f:drivers/soc/aspeed/aspeed-lpc-snoop.c +f:drivers/soc/aspeed/aspeed-p2a-ctrl.c +f:drivers/soc/aspeed/aspeed-socinfo.c +f:drivers/soc/aspeed/aspeed-uart-routing.c +f:drivers/soc/atmel/Kconfig +f:drivers/soc/atmel/Makefile +f:drivers/soc/atmel/sfr.c +f:drivers/soc/atmel/soc.c +f:drivers/soc/atmel/soc.h +f:drivers/soc/bcm/Kconfig +f:drivers/soc/bcm/Makefile +f:drivers/soc/bcm/brcmstb/Kconfig +f:drivers/soc/bcm/brcmstb/Makefile +f:drivers/soc/bcm/brcmstb/biuctrl.c +f:drivers/soc/bcm/brcmstb/common.c +f:drivers/soc/bcm/brcmstb/pm/Makefile +f:drivers/soc/bcm/brcmstb/pm/pm-mips.c +f:drivers/soc/bcm/brcmstb/pm/pm.h +f:drivers/soc/bcm/brcmstb/pm/s2-mips.S +f:drivers/soc/bcm/brcmstb/pm/s3-mips.S +f:drivers/soc/canaan/Kconfig +f:drivers/soc/canaan/Makefile +f:drivers/soc/canaan/k210-sysctl.c +f:drivers/soc/cirrus/Kconfig +f:drivers/soc/cirrus/Makefile +f:drivers/soc/cirrus/soc-ep93xx.c +f:drivers/soc/dove/Makefile +f:drivers/soc/dove/pmu.c +f:drivers/soc/fsl/Kconfig +f:drivers/soc/fsl/Makefile +f:drivers/soc/fsl/dpaa2-console.c +f:drivers/soc/fsl/dpio/Makefile +f:drivers/soc/fsl/dpio/dpio-cmd.h +f:drivers/soc/fsl/dpio/dpio-driver.c +f:drivers/soc/fsl/dpio/dpio-service.c +f:drivers/soc/fsl/dpio/dpio.c +f:drivers/soc/fsl/dpio/dpio.h +f:drivers/soc/fsl/dpio/qbman-portal.c +f:drivers/soc/fsl/dpio/qbman-portal.h +f:drivers/soc/fsl/guts.c +f:drivers/soc/fsl/qbman/Kconfig +f:drivers/soc/fsl/qbman/Makefile +f:drivers/soc/fsl/qbman/bman.c +f:drivers/soc/fsl/qbman/bman_ccsr.c +f:drivers/soc/fsl/qbman/bman_portal.c +f:drivers/soc/fsl/qbman/bman_priv.h +f:drivers/soc/fsl/qbman/bman_test.c +f:drivers/soc/fsl/qbman/bman_test.h +f:drivers/soc/fsl/qbman/bman_test_api.c +f:drivers/soc/fsl/qbman/dpaa_sys.c +f:drivers/soc/fsl/qbman/dpaa_sys.h +f:drivers/soc/fsl/qbman/qman.c +f:drivers/soc/fsl/qbman/qman_ccsr.c +f:drivers/soc/fsl/qbman/qman_portal.c +f:drivers/soc/fsl/qbman/qman_priv.h +f:drivers/soc/fsl/qbman/qman_test.c +f:drivers/soc/fsl/qbman/qman_test.h +f:drivers/soc/fsl/qbman/qman_test_api.c +f:drivers/soc/fsl/qbman/qman_test_stash.c +f:drivers/soc/fsl/qe/Kconfig +f:drivers/soc/fsl/qe/Makefile +f:drivers/soc/fsl/qe/gpio.c +f:drivers/soc/fsl/qe/qe.c +f:drivers/soc/fsl/qe/qe_common.c +f:drivers/soc/fsl/qe/qe_ic.c +f:drivers/soc/fsl/qe/qe_io.c +f:drivers/soc/fsl/qe/qe_tdm.c +f:drivers/soc/fsl/qe/qmc.c +f:drivers/soc/fsl/qe/tsa.c +f:drivers/soc/fsl/qe/tsa.h +f:drivers/soc/fsl/qe/ucc.c +f:drivers/soc/fsl/qe/ucc_fast.c +f:drivers/soc/fsl/qe/ucc_slow.c +f:drivers/soc/fsl/qe/usb.c +f:drivers/soc/fsl/rcpm.c +f:drivers/soc/fujitsu/Kconfig +f:drivers/soc/fujitsu/Makefile +f:drivers/soc/fujitsu/a64fx-diag.c +f:drivers/soc/gemini/Makefile +f:drivers/soc/gemini/soc-gemini.c +f:drivers/soc/hisilicon/Kconfig +f:drivers/soc/hisilicon/Makefile +f:drivers/soc/hisilicon/kunpeng_hccs.c +f:drivers/soc/hisilicon/kunpeng_hccs.h +f:drivers/soc/imx/Kconfig +f:drivers/soc/imx/Makefile +f:drivers/soc/imx/imx93-src.c +f:drivers/soc/imx/soc-imx.c +f:drivers/soc/imx/soc-imx8m.c +f:drivers/soc/imx/soc-imx9.c +f:drivers/soc/ixp4xx/Kconfig +f:drivers/soc/ixp4xx/Makefile +f:drivers/soc/ixp4xx/ixp4xx-npe.c +f:drivers/soc/ixp4xx/ixp4xx-qmgr.c +f:drivers/soc/lantiq/Makefile +f:drivers/soc/lantiq/fpi-bus.c +f:drivers/soc/litex/Kconfig +f:drivers/soc/litex/Makefile +f:drivers/soc/litex/litex_soc_ctrl.c +f:drivers/soc/loongson/Kconfig +f:drivers/soc/loongson/Makefile +f:drivers/soc/loongson/loongson2_guts.c +f:drivers/soc/loongson/loongson2_pm.c +f:drivers/soc/mediatek/Kconfig +f:drivers/soc/mediatek/Makefile +f:drivers/soc/mediatek/mt8167-mmsys.h +f:drivers/soc/mediatek/mt8173-mmsys.h +f:drivers/soc/mediatek/mt8183-mmsys.h +f:drivers/soc/mediatek/mt8186-mmsys.h +f:drivers/soc/mediatek/mt8188-mmsys.h +f:drivers/soc/mediatek/mt8192-mmsys.h +f:drivers/soc/mediatek/mt8195-mmsys.h +f:drivers/soc/mediatek/mt8365-mmsys.h +f:drivers/soc/mediatek/mtk-cmdq-helper.c +f:drivers/soc/mediatek/mtk-devapc.c +f:drivers/soc/mediatek/mtk-dvfsrc.c +f:drivers/soc/mediatek/mtk-infracfg.c +f:drivers/soc/mediatek/mtk-mmsys.c +f:drivers/soc/mediatek/mtk-mmsys.h +f:drivers/soc/mediatek/mtk-mutex.c +f:drivers/soc/mediatek/mtk-pmic-wrap.c +f:drivers/soc/mediatek/mtk-regulator-coupler.c +f:drivers/soc/mediatek/mtk-socinfo.c +f:drivers/soc/mediatek/mtk-svs.c +f:drivers/soc/microchip/Kconfig +f:drivers/soc/microchip/Makefile +f:drivers/soc/microchip/mpfs-sys-controller.c +f:drivers/soc/nuvoton/Kconfig +f:drivers/soc/nuvoton/Makefile +f:drivers/soc/nuvoton/wpcm450-soc.c +f:drivers/soc/pxa/Kconfig +f:drivers/soc/pxa/Makefile +f:drivers/soc/pxa/mfp.c +f:drivers/soc/pxa/ssp.c +f:drivers/soc/qcom/Kconfig +f:drivers/soc/qcom/Makefile +f:drivers/soc/qcom/apr.c +f:drivers/soc/qcom/cmd-db.c +f:drivers/soc/qcom/icc-bwmon.c +f:drivers/soc/qcom/ice.c +f:drivers/soc/qcom/kryo-l2-accessors.c +f:drivers/soc/qcom/llcc-qcom.c +f:drivers/soc/qcom/mdt_loader.c +f:drivers/soc/qcom/ocmem.c +f:drivers/soc/qcom/pdr_interface.c +f:drivers/soc/qcom/pdr_internal.h +f:drivers/soc/qcom/pmic_glink.c +f:drivers/soc/qcom/pmic_glink_altmode.c +f:drivers/soc/qcom/pmic_pdcharger_ulog.c +f:drivers/soc/qcom/pmic_pdcharger_ulog.h +f:drivers/soc/qcom/qcom-geni-se.c +f:drivers/soc/qcom/qcom-pbs.c +f:drivers/soc/qcom/qcom_aoss.c +f:drivers/soc/qcom/qcom_gsbi.c +f:drivers/soc/qcom/qcom_pd_mapper.c +f:drivers/soc/qcom/qcom_pdr_msg.c +f:drivers/soc/qcom/qcom_stats.c +f:drivers/soc/qcom/qmi_encdec.c +f:drivers/soc/qcom/qmi_interface.c +f:drivers/soc/qcom/ramp_controller.c +f:drivers/soc/qcom/rmtfs_mem.c +f:drivers/soc/qcom/rpm-proc.c +f:drivers/soc/qcom/rpm_master_stats.c +f:drivers/soc/qcom/rpmh-internal.h +f:drivers/soc/qcom/rpmh-rsc.c +f:drivers/soc/qcom/rpmh.c +f:drivers/soc/qcom/smd-rpm.c +f:drivers/soc/qcom/smem.c +f:drivers/soc/qcom/smem_state.c +f:drivers/soc/qcom/smp2p.c +f:drivers/soc/qcom/smsm.c +f:drivers/soc/qcom/socinfo.c +f:drivers/soc/qcom/spm.c +f:drivers/soc/qcom/trace-aoss.h +f:drivers/soc/qcom/trace-rpmh.h +f:drivers/soc/qcom/trace-smp2p.h +f:drivers/soc/qcom/trace_icc-bwmon.h +f:drivers/soc/qcom/ubwc_config.c +f:drivers/soc/qcom/wcnss_ctrl.c +f:drivers/soc/renesas/Kconfig +f:drivers/soc/renesas/Makefile +f:drivers/soc/renesas/pwc-rzv2m.c +f:drivers/soc/renesas/r9a06g032-smp.c +f:drivers/soc/renesas/r9a08g045-sysc.c +f:drivers/soc/renesas/r9a09g047-sys.c +f:drivers/soc/renesas/r9a09g056-sys.c +f:drivers/soc/renesas/r9a09g057-sys.c +f:drivers/soc/renesas/rcar-rst.c +f:drivers/soc/renesas/renesas-soc.c +f:drivers/soc/renesas/rz-sysc.c +f:drivers/soc/renesas/rz-sysc.h +f:drivers/soc/rockchip/Kconfig +f:drivers/soc/rockchip/Makefile +f:drivers/soc/rockchip/dtpm.c +f:drivers/soc/rockchip/grf.c +f:drivers/soc/rockchip/io-domain.c +f:drivers/soc/samsung/Kconfig +f:drivers/soc/samsung/Makefile +f:drivers/soc/samsung/exynos-asv.c +f:drivers/soc/samsung/exynos-asv.h +f:drivers/soc/samsung/exynos-chipid.c +f:drivers/soc/samsung/exynos-pmu.c +f:drivers/soc/samsung/exynos-pmu.h +f:drivers/soc/samsung/exynos-regulator-coupler.c +f:drivers/soc/samsung/exynos-usi.c +f:drivers/soc/samsung/exynos3250-pmu.c +f:drivers/soc/samsung/exynos4-pmu.c +f:drivers/soc/samsung/exynos5250-pmu.c +f:drivers/soc/samsung/exynos5420-pmu.c +f:drivers/soc/samsung/exynos5422-asv.c +f:drivers/soc/samsung/exynos5422-asv.h +f:drivers/soc/samsung/s3c-pm-check.c +f:drivers/soc/sophgo/Kconfig +f:drivers/soc/sophgo/Makefile +f:drivers/soc/sophgo/cv1800-rtcsys.c +f:drivers/soc/sophgo/sg2044-topsys.c +f:drivers/soc/sunxi/Kconfig +f:drivers/soc/sunxi/Makefile +f:drivers/soc/sunxi/sunxi_mbus.c +f:drivers/soc/sunxi/sunxi_sram.c +f:drivers/soc/tegra/Kconfig +f:drivers/soc/tegra/Makefile +f:drivers/soc/tegra/ari-tegra186.c +f:drivers/soc/tegra/cbb/Makefile +f:drivers/soc/tegra/cbb/tegra-cbb.c +f:drivers/soc/tegra/cbb/tegra194-cbb.c +f:drivers/soc/tegra/cbb/tegra234-cbb.c +f:drivers/soc/tegra/common.c +f:drivers/soc/tegra/flowctrl.c +f:drivers/soc/tegra/fuse/Makefile +f:drivers/soc/tegra/fuse/fuse-tegra.c +f:drivers/soc/tegra/fuse/fuse-tegra20.c +f:drivers/soc/tegra/fuse/fuse-tegra30.c +f:drivers/soc/tegra/fuse/fuse.h +f:drivers/soc/tegra/fuse/speedo-tegra114.c +f:drivers/soc/tegra/fuse/speedo-tegra124.c +f:drivers/soc/tegra/fuse/speedo-tegra20.c +f:drivers/soc/tegra/fuse/speedo-tegra210.c +f:drivers/soc/tegra/fuse/speedo-tegra30.c +f:drivers/soc/tegra/fuse/tegra-apbmisc.c +f:drivers/soc/tegra/pmc.c +f:drivers/soc/tegra/regulators-tegra20.c +f:drivers/soc/tegra/regulators-tegra30.c +f:drivers/soc/ti/Kconfig +f:drivers/soc/ti/Makefile +f:drivers/soc/ti/k3-ringacc.c +f:drivers/soc/ti/k3-socinfo.c +f:drivers/soc/ti/knav_dma.c +f:drivers/soc/ti/knav_qmss.h +f:drivers/soc/ti/knav_qmss_acc.c +f:drivers/soc/ti/knav_qmss_queue.c +f:drivers/soc/ti/pm33xx.c +f:drivers/soc/ti/pruss.c +f:drivers/soc/ti/pruss.h +f:drivers/soc/ti/smartreflex.c +f:drivers/soc/ti/ti_sci_inta_msi.c +f:drivers/soc/ti/wkup_m3_ipc.c +f:drivers/soc/ux500/Kconfig +f:drivers/soc/ux500/Makefile +f:drivers/soc/ux500/ux500-soc-id.c +f:drivers/soc/versatile/Kconfig +f:drivers/soc/versatile/Makefile +f:drivers/soc/versatile/soc-integrator.c +f:drivers/soc/versatile/soc-realview.c +f:drivers/soc/vt8500/Kconfig +f:drivers/soc/vt8500/Makefile +f:drivers/soc/vt8500/wmt-socinfo.c +f:drivers/soc/xilinx/Kconfig +f:drivers/soc/xilinx/Makefile +f:drivers/soc/xilinx/xlnx_event_manager.c +f:drivers/soc/xilinx/zynqmp_power.c +f:drivers/soundwire/Kconfig +f:drivers/soundwire/Makefile +f:drivers/soundwire/amd_init.c +f:drivers/soundwire/amd_init.h +f:drivers/soundwire/amd_manager.c +f:drivers/soundwire/amd_manager.h +f:drivers/soundwire/bus.c +f:drivers/soundwire/bus.h +f:drivers/soundwire/bus_type.c +f:drivers/soundwire/cadence_master.c +f:drivers/soundwire/cadence_master.h +f:drivers/soundwire/debugfs.c +f:drivers/soundwire/dmi-quirks.c +f:drivers/soundwire/generic_bandwidth_allocation.c +f:drivers/soundwire/intel.c +f:drivers/soundwire/intel.h +f:drivers/soundwire/intel_ace2x.c +f:drivers/soundwire/intel_ace2x_debugfs.c +f:drivers/soundwire/intel_auxdevice.c +f:drivers/soundwire/intel_auxdevice.h +f:drivers/soundwire/intel_bus_common.c +f:drivers/soundwire/intel_init.c +f:drivers/soundwire/irq.c +f:drivers/soundwire/irq.h +f:drivers/soundwire/master.c +f:drivers/soundwire/mipi_disco.c +f:drivers/soundwire/qcom.c +f:drivers/soundwire/slave.c +f:drivers/soundwire/stream.c +f:drivers/soundwire/sysfs_local.h +f:drivers/soundwire/sysfs_slave.c +f:drivers/soundwire/sysfs_slave_dpn.c +f:drivers/spi/Kconfig +f:drivers/spi/Makefile +f:drivers/spi/atmel-quadspi.c +f:drivers/spi/internals.h +f:drivers/spi/spi-airoha-snfi.c +f:drivers/spi/spi-altera-core.c +f:drivers/spi/spi-altera-dfl.c +f:drivers/spi/spi-altera-platform.c +f:drivers/spi/spi-amd-pci.c +f:drivers/spi/spi-amd.c +f:drivers/spi/spi-amd.h +f:drivers/spi/spi-amlogic-spifc-a1.c +f:drivers/spi/spi-amlogic-spisg.c +f:drivers/spi/spi-apple.c +f:drivers/spi/spi-ar934x.c +f:drivers/spi/spi-armada-3700.c +f:drivers/spi/spi-aspeed-smc.c +f:drivers/spi/spi-at91-usart.c +f:drivers/spi/spi-ath79.c +f:drivers/spi/spi-atmel.c +f:drivers/spi/spi-au1550.c +f:drivers/spi/spi-axi-spi-engine.c +f:drivers/spi/spi-bcm-qspi.c +f:drivers/spi/spi-bcm-qspi.h +f:drivers/spi/spi-bcm2835.c +f:drivers/spi/spi-bcm2835aux.c +f:drivers/spi/spi-bcm63xx-hsspi.c +f:drivers/spi/spi-bcm63xx.c +f:drivers/spi/spi-bcmbca-hsspi.c +f:drivers/spi/spi-bitbang-txrx.h +f:drivers/spi/spi-bitbang.c +f:drivers/spi/spi-brcmstb-qspi.c +f:drivers/spi/spi-butterfly.c +f:drivers/spi/spi-cadence-quadspi.c +f:drivers/spi/spi-cadence-xspi.c +f:drivers/spi/spi-cadence.c +f:drivers/spi/spi-cavium-octeon.c +f:drivers/spi/spi-cavium-thunderx.c +f:drivers/spi/spi-cavium.c +f:drivers/spi/spi-cavium.h +f:drivers/spi/spi-ch341.c +f:drivers/spi/spi-clps711x.c +f:drivers/spi/spi-coldfire-qspi.c +f:drivers/spi/spi-cs42l43.c +f:drivers/spi/spi-davinci.c +f:drivers/spi/spi-dln2.c +f:drivers/spi/spi-dw-bt1.c +f:drivers/spi/spi-dw-core.c +f:drivers/spi/spi-dw-dma.c +f:drivers/spi/spi-dw-mmio.c +f:drivers/spi/spi-dw-pci.c +f:drivers/spi/spi-dw.h +f:drivers/spi/spi-ep93xx.c +f:drivers/spi/spi-falcon.c +f:drivers/spi/spi-fsi.c +f:drivers/spi/spi-fsl-cpm.c +f:drivers/spi/spi-fsl-cpm.h +f:drivers/spi/spi-fsl-dspi.c +f:drivers/spi/spi-fsl-espi.c +f:drivers/spi/spi-fsl-lib.c +f:drivers/spi/spi-fsl-lib.h +f:drivers/spi/spi-fsl-lpspi.c +f:drivers/spi/spi-fsl-qspi.c +f:drivers/spi/spi-fsl-spi.c +f:drivers/spi/spi-fsl-spi.h +f:drivers/spi/spi-geni-qcom.c +f:drivers/spi/spi-gpio.c +f:drivers/spi/spi-gxp.c +f:drivers/spi/spi-hisi-kunpeng.c +f:drivers/spi/spi-hisi-sfc-v3xx.c +f:drivers/spi/spi-img-spfi.c +f:drivers/spi/spi-imx.c +f:drivers/spi/spi-ingenic.c +f:drivers/spi/spi-intel-pci.c +f:drivers/spi/spi-intel-platform.c +f:drivers/spi/spi-intel.c +f:drivers/spi/spi-intel.h +f:drivers/spi/spi-iproc-qspi.c +f:drivers/spi/spi-jcore.c +f:drivers/spi/spi-kspi2.c +f:drivers/spi/spi-lantiq-ssc.c +f:drivers/spi/spi-ljca.c +f:drivers/spi/spi-lm70llp.c +f:drivers/spi/spi-loongson-core.c +f:drivers/spi/spi-loongson-pci.c +f:drivers/spi/spi-loongson-plat.c +f:drivers/spi/spi-loongson.h +f:drivers/spi/spi-loopback-test.c +f:drivers/spi/spi-lp8841-rtc.c +f:drivers/spi/spi-mem.c +f:drivers/spi/spi-meson-spicc.c +f:drivers/spi/spi-meson-spifc.c +f:drivers/spi/spi-microchip-core-qspi.c +f:drivers/spi/spi-microchip-core.c +f:drivers/spi/spi-mpc512x-psc.c +f:drivers/spi/spi-mpc52xx-psc.c +f:drivers/spi/spi-mpc52xx.c +f:drivers/spi/spi-mt65xx.c +f:drivers/spi/spi-mt7621.c +f:drivers/spi/spi-mtk-nor.c +f:drivers/spi/spi-mtk-snfi.c +f:drivers/spi/spi-mux.c +f:drivers/spi/spi-mxic.c +f:drivers/spi/spi-mxs.c +f:drivers/spi/spi-npcm-fiu.c +f:drivers/spi/spi-npcm-pspi.c +f:drivers/spi/spi-nxp-fspi.c +f:drivers/spi/spi-oc-tiny.c +f:drivers/spi/spi-offload-trigger-adi-util-sigma-delta.c +f:drivers/spi/spi-offload-trigger-pwm.c +f:drivers/spi/spi-offload.c +f:drivers/spi/spi-omap-uwire.c +f:drivers/spi/spi-omap2-mcspi.c +f:drivers/spi/spi-orion.c +f:drivers/spi/spi-pci1xxxx.c +f:drivers/spi/spi-pic32-sqi.c +f:drivers/spi/spi-pic32.c +f:drivers/spi/spi-pl022.c +f:drivers/spi/spi-ppc4xx.c +f:drivers/spi/spi-pxa2xx-dma.c +f:drivers/spi/spi-pxa2xx-pci.c +f:drivers/spi/spi-pxa2xx-platform.c +f:drivers/spi/spi-pxa2xx.c +f:drivers/spi/spi-pxa2xx.h +f:drivers/spi/spi-qcom-qspi.c +f:drivers/spi/spi-qpic-snand.c +f:drivers/spi/spi-qup.c +f:drivers/spi/spi-rb4xx.c +f:drivers/spi/spi-realtek-rtl-snand.c +f:drivers/spi/spi-realtek-rtl.c +f:drivers/spi/spi-rockchip-sfc.c +f:drivers/spi/spi-rockchip.c +f:drivers/spi/spi-rpc-if.c +f:drivers/spi/spi-rspi.c +f:drivers/spi/spi-rzv2h-rspi.c +f:drivers/spi/spi-rzv2m-csi.c +f:drivers/spi/spi-s3c64xx.c +f:drivers/spi/spi-sc18is602.c +f:drivers/spi/spi-sg2044-nor.c +f:drivers/spi/spi-sh-hspi.c +f:drivers/spi/spi-sh-msiof.c +f:drivers/spi/spi-sh-sci.c +f:drivers/spi/spi-sh.c +f:drivers/spi/spi-sifive.c +f:drivers/spi/spi-slave-mt27xx.c +f:drivers/spi/spi-slave-system-control.c +f:drivers/spi/spi-slave-time.c +f:drivers/spi/spi-sn-f-ospi.c +f:drivers/spi/spi-sprd-adi.c +f:drivers/spi/spi-sprd.c +f:drivers/spi/spi-st-ssc4.c +f:drivers/spi/spi-stm32-ospi.c +f:drivers/spi/spi-stm32-qspi.c +f:drivers/spi/spi-stm32.c +f:drivers/spi/spi-sun4i.c +f:drivers/spi/spi-sun6i.c +f:drivers/spi/spi-sunplus-sp7021.c +f:drivers/spi/spi-synquacer.c +f:drivers/spi/spi-tegra114.c +f:drivers/spi/spi-tegra20-sflash.c +f:drivers/spi/spi-tegra20-slink.c +f:drivers/spi/spi-tegra210-quad.c +f:drivers/spi/spi-test.h +f:drivers/spi/spi-ti-qspi.c +f:drivers/spi/spi-tle62x0.c +f:drivers/spi/spi-topcliff-pch.c +f:drivers/spi/spi-uniphier.c +f:drivers/spi/spi-wpcm-fiu.c +f:drivers/spi/spi-xcomm.c +f:drivers/spi/spi-xilinx.c +f:drivers/spi/spi-xlp.c +f:drivers/spi/spi-xtensa-xtfpga.c +f:drivers/spi/spi-zynq-qspi.c +f:drivers/spi/spi-zynqmp-gqspi.c +f:drivers/spi/spi.c +f:drivers/spi/spidev.c +f:drivers/spmi/Kconfig +f:drivers/spmi/Makefile +f:drivers/spmi/hisi-spmi-controller.c +f:drivers/spmi/spmi-apple-controller.c +f:drivers/spmi/spmi-devres.c +f:drivers/spmi/spmi-mtk-pmif.c +f:drivers/spmi/spmi-pmic-arb.c +f:drivers/spmi/spmi.c +f:drivers/ssb/Kconfig +f:drivers/ssb/Makefile +f:drivers/ssb/b43_pci_bridge.c +f:drivers/ssb/bridge_pcmcia_80211.c +f:drivers/ssb/driver_chipcommon.c +f:drivers/ssb/driver_chipcommon_pmu.c +f:drivers/ssb/driver_chipcommon_sflash.c +f:drivers/ssb/driver_extif.c +f:drivers/ssb/driver_gige.c +f:drivers/ssb/driver_gpio.c +f:drivers/ssb/driver_mipscore.c +f:drivers/ssb/driver_pcicore.c +f:drivers/ssb/embedded.c +f:drivers/ssb/host_soc.c +f:drivers/ssb/main.c +f:drivers/ssb/pci.c +f:drivers/ssb/pcihost_wrapper.c +f:drivers/ssb/pcmcia.c +f:drivers/ssb/scan.c +f:drivers/ssb/sdio.c +f:drivers/ssb/sprom.c +f:drivers/ssb/ssb_private.h +f:drivers/staging/Kconfig +f:drivers/staging/Makefile +f:drivers/staging/axis-fifo/Kconfig +f:drivers/staging/axis-fifo/Makefile +f:drivers/staging/axis-fifo/README +f:drivers/staging/axis-fifo/axis-fifo.c +f:drivers/staging/axis-fifo/axis-fifo.txt +f:drivers/staging/fbtft/Kconfig +f:drivers/staging/fbtft/Makefile +f:drivers/staging/fbtft/README +f:drivers/staging/fbtft/TODO +f:drivers/staging/fbtft/fb_agm1264k-fl.c +f:drivers/staging/fbtft/fb_bd663474.c +f:drivers/staging/fbtft/fb_hx8340bn.c +f:drivers/staging/fbtft/fb_hx8347d.c +f:drivers/staging/fbtft/fb_hx8353d.c +f:drivers/staging/fbtft/fb_hx8357d.c +f:drivers/staging/fbtft/fb_hx8357d.h +f:drivers/staging/fbtft/fb_ili9163.c +f:drivers/staging/fbtft/fb_ili9320.c +f:drivers/staging/fbtft/fb_ili9325.c +f:drivers/staging/fbtft/fb_ili9340.c +f:drivers/staging/fbtft/fb_ili9341.c +f:drivers/staging/fbtft/fb_ili9481.c +f:drivers/staging/fbtft/fb_ili9486.c +f:drivers/staging/fbtft/fb_pcd8544.c +f:drivers/staging/fbtft/fb_ra8875.c +f:drivers/staging/fbtft/fb_s6d02a1.c +f:drivers/staging/fbtft/fb_s6d1121.c +f:drivers/staging/fbtft/fb_seps525.c +f:drivers/staging/fbtft/fb_sh1106.c +f:drivers/staging/fbtft/fb_ssd1289.c +f:drivers/staging/fbtft/fb_ssd1305.c +f:drivers/staging/fbtft/fb_ssd1306.c +f:drivers/staging/fbtft/fb_ssd1325.c +f:drivers/staging/fbtft/fb_ssd1331.c +f:drivers/staging/fbtft/fb_ssd1351.c +f:drivers/staging/fbtft/fb_st7735r.c +f:drivers/staging/fbtft/fb_st7789v.c +f:drivers/staging/fbtft/fb_tinylcd.c +f:drivers/staging/fbtft/fb_tls8204.c +f:drivers/staging/fbtft/fb_uc1611.c +f:drivers/staging/fbtft/fb_uc1701.c +f:drivers/staging/fbtft/fb_upd161704.c +f:drivers/staging/fbtft/fbtft-bus.c +f:drivers/staging/fbtft/fbtft-core.c +f:drivers/staging/fbtft/fbtft-io.c +f:drivers/staging/fbtft/fbtft-sysfs.c +f:drivers/staging/fbtft/fbtft.h +f:drivers/staging/fbtft/internal.h +f:drivers/staging/gpib/Kconfig +f:drivers/staging/gpib/Makefile +f:drivers/staging/gpib/TODO +f:drivers/staging/gpib/agilent_82350b/Makefile +f:drivers/staging/gpib/agilent_82350b/agilent_82350b.c +f:drivers/staging/gpib/agilent_82350b/agilent_82350b.h +f:drivers/staging/gpib/agilent_82357a/Makefile +f:drivers/staging/gpib/agilent_82357a/agilent_82357a.c +f:drivers/staging/gpib/agilent_82357a/agilent_82357a.h +f:drivers/staging/gpib/cb7210/Makefile +f:drivers/staging/gpib/cb7210/cb7210.c +f:drivers/staging/gpib/cb7210/cb7210.h +f:drivers/staging/gpib/cec/Makefile +f:drivers/staging/gpib/cec/cec.h +f:drivers/staging/gpib/cec/cec_gpib.c +f:drivers/staging/gpib/common/Makefile +f:drivers/staging/gpib/common/gpib_os.c +f:drivers/staging/gpib/common/iblib.c +f:drivers/staging/gpib/common/ibsys.h +f:drivers/staging/gpib/eastwood/Makefile +f:drivers/staging/gpib/eastwood/fluke_gpib.c +f:drivers/staging/gpib/eastwood/fluke_gpib.h +f:drivers/staging/gpib/fmh_gpib/Makefile +f:drivers/staging/gpib/fmh_gpib/fmh_gpib.c +f:drivers/staging/gpib/fmh_gpib/fmh_gpib.h +f:drivers/staging/gpib/gpio/Makefile +f:drivers/staging/gpib/gpio/gpib_bitbang.c +f:drivers/staging/gpib/hp_82335/Makefile +f:drivers/staging/gpib/hp_82335/hp82335.c +f:drivers/staging/gpib/hp_82335/hp82335.h +f:drivers/staging/gpib/hp_82341/Makefile +f:drivers/staging/gpib/hp_82341/hp_82341.c +f:drivers/staging/gpib/hp_82341/hp_82341.h +f:drivers/staging/gpib/include/amcc5920.h +f:drivers/staging/gpib/include/amccs5933.h +f:drivers/staging/gpib/include/gpibP.h +f:drivers/staging/gpib/include/gpib_cmd.h +f:drivers/staging/gpib/include/gpib_pci_ids.h +f:drivers/staging/gpib/include/gpib_proto.h +f:drivers/staging/gpib/include/gpib_state_machines.h +f:drivers/staging/gpib/include/gpib_types.h +f:drivers/staging/gpib/include/nec7210.h +f:drivers/staging/gpib/include/nec7210_registers.h +f:drivers/staging/gpib/include/plx9050.h +f:drivers/staging/gpib/include/quancom_pci.h +f:drivers/staging/gpib/include/tms9914.h +f:drivers/staging/gpib/include/tnt4882_registers.h +f:drivers/staging/gpib/ines/Makefile +f:drivers/staging/gpib/ines/ines.h +f:drivers/staging/gpib/ines/ines_gpib.c +f:drivers/staging/gpib/lpvo_usb_gpib/Makefile +f:drivers/staging/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c +f:drivers/staging/gpib/nec7210/Makefile +f:drivers/staging/gpib/nec7210/board.h +f:drivers/staging/gpib/nec7210/nec7210.c +f:drivers/staging/gpib/ni_usb/Makefile +f:drivers/staging/gpib/ni_usb/ni_usb_gpib.c +f:drivers/staging/gpib/ni_usb/ni_usb_gpib.h +f:drivers/staging/gpib/pc2/Makefile +f:drivers/staging/gpib/pc2/pc2_gpib.c +f:drivers/staging/gpib/tms9914/Makefile +f:drivers/staging/gpib/tms9914/tms9914.c +f:drivers/staging/gpib/tnt4882/Makefile +f:drivers/staging/gpib/tnt4882/mite.c +f:drivers/staging/gpib/tnt4882/mite.h +f:drivers/staging/gpib/tnt4882/tnt4882_gpib.c +f:drivers/staging/gpib/uapi/gpib.h +f:drivers/staging/gpib/uapi/gpib_ioctl.h +f:drivers/staging/greybus/Documentation/firmware/authenticate.c +f:drivers/staging/greybus/Documentation/firmware/firmware-management +f:drivers/staging/greybus/Documentation/firmware/firmware.c +f:drivers/staging/greybus/Documentation/sysfs-bus-greybus +f:drivers/staging/greybus/Kconfig +f:drivers/staging/greybus/Makefile +f:drivers/staging/greybus/TODO +f:drivers/staging/greybus/arche-apb-ctrl.c +f:drivers/staging/greybus/arche-platform.c +f:drivers/staging/greybus/arche_platform.h +f:drivers/staging/greybus/audio_apbridgea.c +f:drivers/staging/greybus/audio_apbridgea.h +f:drivers/staging/greybus/audio_codec.c +f:drivers/staging/greybus/audio_codec.h +f:drivers/staging/greybus/audio_gb.c +f:drivers/staging/greybus/audio_helper.c +f:drivers/staging/greybus/audio_helper.h +f:drivers/staging/greybus/audio_manager.c +f:drivers/staging/greybus/audio_manager.h +f:drivers/staging/greybus/audio_manager_module.c +f:drivers/staging/greybus/audio_manager_private.h +f:drivers/staging/greybus/audio_manager_sysfs.c +f:drivers/staging/greybus/audio_module.c +f:drivers/staging/greybus/audio_topology.c +f:drivers/staging/greybus/authentication.c +f:drivers/staging/greybus/bootrom.c +f:drivers/staging/greybus/camera.c +f:drivers/staging/greybus/firmware.h +f:drivers/staging/greybus/fw-core.c +f:drivers/staging/greybus/fw-download.c +f:drivers/staging/greybus/fw-management.c +f:drivers/staging/greybus/gb-camera.h +f:drivers/staging/greybus/gbphy.c +f:drivers/staging/greybus/gbphy.h +f:drivers/staging/greybus/gpio.c +f:drivers/staging/greybus/greybus_authentication.h +f:drivers/staging/greybus/greybus_firmware.h +f:drivers/staging/greybus/hid.c +f:drivers/staging/greybus/i2c.c +f:drivers/staging/greybus/light.c +f:drivers/staging/greybus/log.c +f:drivers/staging/greybus/loopback.c +f:drivers/staging/greybus/power_supply.c +f:drivers/staging/greybus/pwm.c +f:drivers/staging/greybus/raw.c +f:drivers/staging/greybus/sdio.c +f:drivers/staging/greybus/spi.c +f:drivers/staging/greybus/spilib.c +f:drivers/staging/greybus/spilib.h +f:drivers/staging/greybus/uart.c +f:drivers/staging/greybus/usb.c +f:drivers/staging/greybus/vibrator.c +f:drivers/staging/iio/Documentation/inkernel.txt +f:drivers/staging/iio/Documentation/sysfs-bus-iio-adc-ad7280a +f:drivers/staging/iio/Documentation/sysfs-bus-iio-dds +f:drivers/staging/iio/Kconfig +f:drivers/staging/iio/Makefile +f:drivers/staging/iio/accel/Kconfig +f:drivers/staging/iio/accel/Makefile +f:drivers/staging/iio/accel/adis16203.c +f:drivers/staging/iio/adc/Kconfig +f:drivers/staging/iio/adc/Makefile +f:drivers/staging/iio/adc/ad7816.c +f:drivers/staging/iio/addac/Kconfig +f:drivers/staging/iio/addac/Makefile +f:drivers/staging/iio/addac/adt7316-i2c.c +f:drivers/staging/iio/addac/adt7316-spi.c +f:drivers/staging/iio/addac/adt7316.c +f:drivers/staging/iio/addac/adt7316.h +f:drivers/staging/iio/frequency/Kconfig +f:drivers/staging/iio/frequency/Makefile +f:drivers/staging/iio/frequency/ad9832.c +f:drivers/staging/iio/frequency/ad9832.h +f:drivers/staging/iio/frequency/ad9834.c +f:drivers/staging/iio/frequency/ad9834.h +f:drivers/staging/iio/frequency/dds.h +f:drivers/staging/iio/impedance-analyzer/Kconfig +f:drivers/staging/iio/impedance-analyzer/Makefile +f:drivers/staging/iio/impedance-analyzer/ad5933.c +f:drivers/staging/media/Kconfig +f:drivers/staging/media/Makefile +f:drivers/staging/media/atomisp/Kconfig +f:drivers/staging/media/atomisp/Makefile +f:drivers/staging/media/atomisp/TODO +f:drivers/staging/media/atomisp/i2c/Kconfig +f:drivers/staging/media/atomisp/i2c/Makefile +f:drivers/staging/media/atomisp/i2c/atomisp-gc0310.c +f:drivers/staging/media/atomisp/i2c/atomisp-gc2235.c +f:drivers/staging/media/atomisp/i2c/atomisp-ov2722.c +f:drivers/staging/media/atomisp/i2c/gc2235.h +f:drivers/staging/media/atomisp/i2c/ov2722.h +f:drivers/staging/media/atomisp/include/hmm/hmm.h +f:drivers/staging/media/atomisp/include/hmm/hmm_bo.h +f:drivers/staging/media/atomisp/include/hmm/hmm_common.h +f:drivers/staging/media/atomisp/include/linux/atomisp.h +f:drivers/staging/media/atomisp/include/linux/atomisp_gmin_platform.h +f:drivers/staging/media/atomisp/include/linux/atomisp_platform.h +f:drivers/staging/media/atomisp/include/mmu/isp_mmu.h +f:drivers/staging/media/atomisp/include/mmu/sh_mmu_mrfld.h +f:drivers/staging/media/atomisp/notes.txt +f:drivers/staging/media/atomisp/pci/atomisp-regs.h +f:drivers/staging/media/atomisp/pci/atomisp_cmd.c +f:drivers/staging/media/atomisp/pci/atomisp_cmd.h +f:drivers/staging/media/atomisp/pci/atomisp_common.h +f:drivers/staging/media/atomisp/pci/atomisp_compat.h +f:drivers/staging/media/atomisp/pci/atomisp_compat_css20.c +f:drivers/staging/media/atomisp/pci/atomisp_compat_css20.h +f:drivers/staging/media/atomisp/pci/atomisp_csi2.c +f:drivers/staging/media/atomisp/pci/atomisp_csi2.h +f:drivers/staging/media/atomisp/pci/atomisp_csi2_bridge.c +f:drivers/staging/media/atomisp/pci/atomisp_dfs_tables.h +f:drivers/staging/media/atomisp/pci/atomisp_fops.c +f:drivers/staging/media/atomisp/pci/atomisp_fops.h +f:drivers/staging/media/atomisp/pci/atomisp_gmin_platform.c +f:drivers/staging/media/atomisp/pci/atomisp_internal.h +f:drivers/staging/media/atomisp/pci/atomisp_ioctl.c +f:drivers/staging/media/atomisp/pci/atomisp_ioctl.h +f:drivers/staging/media/atomisp/pci/atomisp_subdev.c +f:drivers/staging/media/atomisp/pci/atomisp_subdev.h +f:drivers/staging/media/atomisp/pci/atomisp_tables.h +f:drivers/staging/media/atomisp/pci/atomisp_trace_event.h +f:drivers/staging/media/atomisp/pci/atomisp_v4l2.c +f:drivers/staging/media/atomisp/pci/atomisp_v4l2.h +f:drivers/staging/media/atomisp/pci/base/circbuf/interface/ia_css_circbuf.h +f:drivers/staging/media/atomisp/pci/base/circbuf/interface/ia_css_circbuf_comm.h +f:drivers/staging/media/atomisp/pci/base/circbuf/interface/ia_css_circbuf_desc.h +f:drivers/staging/media/atomisp/pci/base/circbuf/src/circbuf.c +f:drivers/staging/media/atomisp/pci/base/refcount/interface/ia_css_refcount.h +f:drivers/staging/media/atomisp/pci/base/refcount/src/refcount.c +f:drivers/staging/media/atomisp/pci/bits.h +f:drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_binarydesc.h +f:drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_stagedesc.h +f:drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_util.h +f:drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_binarydesc.c +f:drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_stagedesc.c +f:drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_util.c +f:drivers/staging/media/atomisp/pci/camera/util/interface/ia_css_util.h +f:drivers/staging/media/atomisp/pci/camera/util/src/util.c +f:drivers/staging/media/atomisp/pci/cell_params.h +f:drivers/staging/media/atomisp/pci/css_2401_system/csi_rx_global.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/csi_rx.c +f:drivers/staging/media/atomisp/pci/css_2401_system/host/csi_rx_local.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/csi_rx_private.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/ibuf_ctrl.c +f:drivers/staging/media/atomisp/pci/css_2401_system/host/ibuf_ctrl_local.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/isys_dma.c +f:drivers/staging/media/atomisp/pci/css_2401_system/host/isys_dma_private.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/isys_irq.c +f:drivers/staging/media/atomisp/pci/css_2401_system/host/isys_irq_local.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/isys_irq_private.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/isys_stream2mmio.c +f:drivers/staging/media/atomisp/pci/css_2401_system/host/isys_stream2mmio_local.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/isys_stream2mmio_private.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/pixelgen_local.h +f:drivers/staging/media/atomisp/pci/css_2401_system/host/pixelgen_private.h +f:drivers/staging/media/atomisp/pci/css_2401_system/hrt/PixelGen_SysBlock_defs.h +f:drivers/staging/media/atomisp/pci/css_2401_system/hrt/ibuf_cntrl_defs.h +f:drivers/staging/media/atomisp/pci/css_2401_system/hrt/mipi_backend_common_defs.h +f:drivers/staging/media/atomisp/pci/css_2401_system/hrt/mipi_backend_defs.h +f:drivers/staging/media/atomisp/pci/css_2401_system/hrt/rx_csi_defs.h +f:drivers/staging/media/atomisp/pci/css_2401_system/hrt/stream2mmio_defs.h +f:drivers/staging/media/atomisp/pci/css_2401_system/ibuf_ctrl_global.h +f:drivers/staging/media/atomisp/pci/css_2401_system/isys_dma_global.h +f:drivers/staging/media/atomisp/pci/css_2401_system/isys_irq_global.h +f:drivers/staging/media/atomisp/pci/css_2401_system/isys_stream2mmio_global.h +f:drivers/staging/media/atomisp/pci/css_2401_system/pixelgen_global.h +f:drivers/staging/media/atomisp/pci/css_receiver_2400_common_defs.h +f:drivers/staging/media/atomisp/pci/css_receiver_2400_defs.h +f:drivers/staging/media/atomisp/pci/css_trace.h +f:drivers/staging/media/atomisp/pci/dma_v2_defs.h +f:drivers/staging/media/atomisp/pci/gdc_v2_defs.h +f:drivers/staging/media/atomisp/pci/gp_timer_defs.h +f:drivers/staging/media/atomisp/pci/gpio_block_defs.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/debug_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/dma_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/event_fifo_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/fifo_monitor_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/gdc_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/gp_device_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/gp_timer_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/gpio_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/hmem_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/debug.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/debug_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/debug_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/dma.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/dma_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/dma_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/event_fifo.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/event_fifo_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/event_fifo_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/fifo_monitor.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/fifo_monitor_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/fifo_monitor_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gdc.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gdc_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gdc_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gp_device.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gp_device_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gp_device_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gp_timer.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gp_timer_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gp_timer_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/gpio_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/hmem.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/hmem_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/hmem_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/input_formatter.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/input_formatter_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/input_formatter_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/input_system.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/irq.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/irq_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/irq_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/isp.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/isp_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/isp_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/mmu.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/mmu_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/sp.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/sp_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/sp_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/timed_ctrl.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/timed_ctrl_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/timed_ctrl_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/vamem_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/vmem.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/vmem_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/host/vmem_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/input_formatter_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/irq_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/isp_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/mmu_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/sp_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/timed_ctrl_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/vamem_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_common/vmem_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_defs.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/assert_support.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/bitop_support.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/csi_rx.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/debug.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/device_access/device_access.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/dma.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/event_fifo.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/fifo_monitor.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/gdc_device.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/gp_device.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/gp_timer.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/hmem.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/csi_rx_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/debug_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/dma_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/event_fifo_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/fifo_monitor_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/gdc_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/gp_device_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/gp_timer_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/hmem_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/input_formatter_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/irq_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/isp_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/isys_dma_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/isys_irq_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/isys_stream2mmio_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/mmu_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/pixelgen_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/sp_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/tag_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/timed_ctrl_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/vamem_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/host/vmem_public.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/input_formatter.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/input_system.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/irq.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/isp.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/isys_irq.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/isys_stream2mmio.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/math_support.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/misc_support.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/mmu_device.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/pixelgen.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/platform_support.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/print_support.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/queue.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/resource.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/sp.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/tag.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/timed_ctrl.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/type_support.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/vamem.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_include/vmem.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_shared/host/queue_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_shared/host/queue_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_shared/host/tag.c +f:drivers/staging/media/atomisp/pci/hive_isp_css_shared/host/tag_local.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_shared/host/tag_private.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_shared/queue_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_shared/sw_event_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_shared/tag_global.h +f:drivers/staging/media/atomisp/pci/hive_isp_css_streaming_to_mipi_types_hrt.h +f:drivers/staging/media/atomisp/pci/hive_types.h +f:drivers/staging/media/atomisp/pci/hmm/hmm.c +f:drivers/staging/media/atomisp/pci/hmm/hmm_bo.c +f:drivers/staging/media/atomisp/pci/ia_css.h +f:drivers/staging/media/atomisp/pci/ia_css_3a.h +f:drivers/staging/media/atomisp/pci/ia_css_acc_types.h +f:drivers/staging/media/atomisp/pci/ia_css_buffer.h +f:drivers/staging/media/atomisp/pci/ia_css_control.h +f:drivers/staging/media/atomisp/pci/ia_css_device_access.c +f:drivers/staging/media/atomisp/pci/ia_css_device_access.h +f:drivers/staging/media/atomisp/pci/ia_css_dvs.h +f:drivers/staging/media/atomisp/pci/ia_css_env.h +f:drivers/staging/media/atomisp/pci/ia_css_err.h +f:drivers/staging/media/atomisp/pci/ia_css_event_public.h +f:drivers/staging/media/atomisp/pci/ia_css_firmware.h +f:drivers/staging/media/atomisp/pci/ia_css_frac.h +f:drivers/staging/media/atomisp/pci/ia_css_frame_format.h +f:drivers/staging/media/atomisp/pci/ia_css_frame_public.h +f:drivers/staging/media/atomisp/pci/ia_css_host_data.h +f:drivers/staging/media/atomisp/pci/ia_css_input_port.h +f:drivers/staging/media/atomisp/pci/ia_css_irq.h +f:drivers/staging/media/atomisp/pci/ia_css_isp_configs.c +f:drivers/staging/media/atomisp/pci/ia_css_isp_configs.h +f:drivers/staging/media/atomisp/pci/ia_css_isp_params.c +f:drivers/staging/media/atomisp/pci/ia_css_isp_params.h +f:drivers/staging/media/atomisp/pci/ia_css_isp_states.c +f:drivers/staging/media/atomisp/pci/ia_css_isp_states.h +f:drivers/staging/media/atomisp/pci/ia_css_metadata.h +f:drivers/staging/media/atomisp/pci/ia_css_mipi.h +f:drivers/staging/media/atomisp/pci/ia_css_mmu.h +f:drivers/staging/media/atomisp/pci/ia_css_mmu_private.h +f:drivers/staging/media/atomisp/pci/ia_css_morph.h +f:drivers/staging/media/atomisp/pci/ia_css_pipe.h +f:drivers/staging/media/atomisp/pci/ia_css_pipe_public.h +f:drivers/staging/media/atomisp/pci/ia_css_prbs.h +f:drivers/staging/media/atomisp/pci/ia_css_properties.h +f:drivers/staging/media/atomisp/pci/ia_css_shading.h +f:drivers/staging/media/atomisp/pci/ia_css_stream.h +f:drivers/staging/media/atomisp/pci/ia_css_stream_format.h +f:drivers/staging/media/atomisp/pci/ia_css_stream_public.h +f:drivers/staging/media/atomisp/pci/ia_css_timer.h +f:drivers/staging/media/atomisp/pci/ia_css_types.h +f:drivers/staging/media/atomisp/pci/ia_css_version.h +f:drivers/staging/media/atomisp/pci/ia_css_version_data.h +f:drivers/staging/media/atomisp/pci/if_defs.h +f:drivers/staging/media/atomisp/pci/input_formatter_subsystem_defs.h +f:drivers/staging/media/atomisp/pci/input_selector_defs.h +f:drivers/staging/media/atomisp/pci/input_switch_2400_defs.h +f:drivers/staging/media/atomisp/pci/input_system_ctrl_defs.h +f:drivers/staging/media/atomisp/pci/input_system_defs.h +f:drivers/staging/media/atomisp/pci/input_system_global.h +f:drivers/staging/media/atomisp/pci/input_system_local.h +f:drivers/staging/media/atomisp/pci/input_system_private.h +f:drivers/staging/media/atomisp/pci/input_system_public.h +f:drivers/staging/media/atomisp/pci/irq_controller_defs.h +f:drivers/staging/media/atomisp/pci/irq_types_hrt.h +f:drivers/staging/media/atomisp/pci/isp/kernels/aa/aa_2/ia_css_aa2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/aa/aa_2/ia_css_aa2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/aa/aa_2/ia_css_aa2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/aa/aa_2/ia_css_aa2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_1.0/ia_css_anr.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_1.0/ia_css_anr.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_1.0/ia_css_anr_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_1.0/ia_css_anr_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_2/ia_css_anr2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_2/ia_css_anr2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_2/ia_css_anr2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_2/ia_css_anr2_table.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_2/ia_css_anr2_table.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/anr/anr_2/ia_css_anr2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bh/bh_2/ia_css_bh.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/bh/bh_2/ia_css_bh.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bh/bh_2/ia_css_bh_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bh/bh_2/ia_css_bh_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bnlm/ia_css_bnlm.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/bnlm/ia_css_bnlm.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bnlm/ia_css_bnlm_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bnlm/ia_css_bnlm_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr2_2/ia_css_bnr2_2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr2_2/ia_css_bnr2_2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr2_2/ia_css_bnr2_2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr2_2/ia_css_bnr2_2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr_1.0/ia_css_bnr.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr_1.0/ia_css_bnr.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/bnr/bnr_1.0/ia_css_bnr_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_1.0/ia_css_cnr.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_1.0/ia_css_cnr.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_1.0/ia_css_cnr_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_2/ia_css_cnr2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_2/ia_css_cnr2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_2/ia_css_cnr2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/cnr/cnr_2/ia_css_cnr2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/conversion/conversion_1.0/ia_css_conversion.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/conversion/conversion_1.0/ia_css_conversion.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/conversion/conversion_1.0/ia_css_conversion_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/conversion/conversion_1.0/ia_css_conversion_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/copy_output/copy_output_1.0/ia_css_copy_output.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/copy_output/copy_output_1.0/ia_css_copy_output.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/copy_output/copy_output_1.0/ia_css_copy_output_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/crop/crop_1.0/ia_css_crop.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/crop/crop_1.0/ia_css_crop.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/crop/crop_1.0/ia_css_crop_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/crop/crop_1.0/ia_css_crop_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/csc/csc_1.0/ia_css_csc.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/csc/csc_1.0/ia_css_csc.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/csc/csc_1.0/ia_css_csc_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/csc/csc_1.0/ia_css_csc_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc1_5/ia_css_ctc1_5.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc1_5/ia_css_ctc1_5.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc1_5/ia_css_ctc1_5_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc2/ia_css_ctc2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc2/ia_css_ctc2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc2/ia_css_ctc2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc2/ia_css_ctc2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc_table.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc_table.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/de/de_1.0/ia_css_de.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/de/de_1.0/ia_css_de.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/de/de_1.0/ia_css_de_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/de/de_1.0/ia_css_de_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/de/de_2/ia_css_de2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/de/de_2/ia_css_de2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/de/de_2/ia_css_de2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/de/de_2/ia_css_de2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dp/dp_1.0/ia_css_dp.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/dp/dp_1.0/ia_css_dp.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dp/dp_1.0/ia_css_dp_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dp/dp_1.0/ia_css_dp_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dpc2/ia_css_dpc2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/dpc2/ia_css_dpc2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dpc2/ia_css_dpc2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dpc2/ia_css_dpc2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dvs/dvs_1.0/ia_css_dvs.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/dvs/dvs_1.0/ia_css_dvs.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dvs/dvs_1.0/ia_css_dvs_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/dvs/dvs_1.0/ia_css_dvs_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/eed1_8/ia_css_eed1_8.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/eed1_8/ia_css_eed1_8.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/eed1_8/ia_css_eed1_8_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/eed1_8/ia_css_eed1_8_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/fc/fc_1.0/ia_css_formats.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/fc/fc_1.0/ia_css_formats.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/fc/fc_1.0/ia_css_formats_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/fc/fc_1.0/ia_css_formats_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/fixedbds/fixedbds_1.0/ia_css_fixedbds_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/fixedbds/fixedbds_1.0/ia_css_fixedbds_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/fpn/fpn_1.0/ia_css_fpn.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/fpn/fpn_1.0/ia_css_fpn.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/fpn/fpn_1.0/ia_css_fpn_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/fpn/fpn_1.0/ia_css_fpn_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_1.0/ia_css_gc.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_1.0/ia_css_gc.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_1.0/ia_css_gc_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_1.0/ia_css_gc_table.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_1.0/ia_css_gc_table.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_1.0/ia_css_gc_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_2/ia_css_gc2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_2/ia_css_gc2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_2/ia_css_gc2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_2/ia_css_gc2_table.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_2/ia_css_gc2_table.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/gc/gc_2/ia_css_gc2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/hdr/ia_css_hdr.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/hdr/ia_css_hdr.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/hdr/ia_css_hdr_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/hdr/ia_css_hdr_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls/ia_css_bayer_io.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls/ia_css_bayer_io.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls/ia_css_bayer_io_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls/ia_css_bayer_io_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/common/ia_css_common_io_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/common/ia_css_common_io_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls/ia_css_yuv444_io.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls/ia_css_yuv444_io.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls/ia_css_yuv444_io_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls/ia_css_yuv444_io_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/iterator/iterator_1.0/ia_css_iterator.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/iterator/iterator_1.0/ia_css_iterator.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/iterator/iterator_1.0/ia_css_iterator_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc1_5/ia_css_macc1_5.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc1_5/ia_css_macc1_5.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc1_5/ia_css_macc1_5_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc1_5/ia_css_macc1_5_table.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc1_5/ia_css_macc1_5_table.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc1_5/ia_css_macc1_5_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc_1.0/ia_css_macc.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc_1.0/ia_css_macc.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc_1.0/ia_css_macc_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc_1.0/ia_css_macc_table.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc_1.0/ia_css_macc_table.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/macc/macc_1.0/ia_css_macc_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/norm/norm_1.0/ia_css_norm.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/norm/norm_1.0/ia_css_norm.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/norm/norm_1.0/ia_css_norm_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob2/ia_css_ob2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob2/ia_css_ob2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob2/ia_css_ob2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob2/ia_css_ob2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob_1.0/ia_css_ob.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob_1.0/ia_css_ob.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob_1.0/ia_css_ob_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ob/ob_1.0/ia_css_ob_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/output/output_1.0/ia_css_output.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/output/output_1.0/ia_css_output.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/output/output_1.0/ia_css_output_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/output/output_1.0/ia_css_output_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/qplane/qplane_2/ia_css_qplane.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/qplane/qplane_2/ia_css_qplane.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/qplane/qplane_2/ia_css_qplane_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/qplane/qplane_2/ia_css_qplane_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/raw/raw_1.0/ia_css_raw.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/raw/raw_1.0/ia_css_raw.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/raw/raw_1.0/ia_css_raw_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/raw/raw_1.0/ia_css_raw_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/raw_aa_binning/raw_aa_binning_1.0/ia_css_raa.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/raw_aa_binning/raw_aa_binning_1.0/ia_css_raa.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref_state.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sc/sc_1.0/ia_css_sc.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/sc/sc_1.0/ia_css_sc.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sc/sc_1.0/ia_css_sc_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sc/sc_1.0/ia_css_sc_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sdis/common/ia_css_sdis_common.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sdis/common/ia_css_sdis_common_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sdis/sdis_1.0/ia_css_sdis.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/sdis/sdis_1.0/ia_css_sdis.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sdis/sdis_1.0/ia_css_sdis_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sdis/sdis_2/ia_css_sdis2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/sdis/sdis_2/ia_css_sdis2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/sdis/sdis_2/ia_css_sdis2_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/tdf/tdf_1.0/ia_css_tdf.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/tdf/tdf_1.0/ia_css_tdf.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/tdf/tdf_1.0/ia_css_tdf_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/tdf/tdf_1.0/ia_css_tdf_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr3/ia_css_tnr3_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr_state.h +f:drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/uds/uds_1.0/ia_css_uds_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/vf/vf_1.0/ia_css_vf.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/vf/vf_1.0/ia_css_vf.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/vf/vf_1.0/ia_css_vf_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/vf/vf_1.0/ia_css_vf_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/wb/wb_1.0/ia_css_wb.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/wb/wb_1.0/ia_css_wb.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/wb/wb_1.0/ia_css_wb_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/wb/wb_1.0/ia_css_wb_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr_table.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr_table.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_3.0/ia_css_xnr3.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_3.0/ia_css_xnr3.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_3.0/ia_css_xnr3_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/xnr/xnr_3.0/ia_css_xnr3_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr_types.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_2/ia_css_ynr2.host.c +f:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_2/ia_css_ynr2.host.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_2/ia_css_ynr2_param.h +f:drivers/staging/media/atomisp/pci/isp/kernels/ynr/ynr_2/ia_css_ynr2_types.h +f:drivers/staging/media/atomisp/pci/isp/modes/interface/input_buf.isp.h +f:drivers/staging/media/atomisp/pci/isp/modes/interface/isp_types.h +f:drivers/staging/media/atomisp/pci/isp2400_input_system_global.h +f:drivers/staging/media/atomisp/pci/isp2400_input_system_local.h +f:drivers/staging/media/atomisp/pci/isp2400_input_system_private.h +f:drivers/staging/media/atomisp/pci/isp2400_input_system_public.h +f:drivers/staging/media/atomisp/pci/isp2400_support.h +f:drivers/staging/media/atomisp/pci/isp2401_input_system_global.h +f:drivers/staging/media/atomisp/pci/isp2401_input_system_local.h +f:drivers/staging/media/atomisp/pci/isp2401_input_system_private.h +f:drivers/staging/media/atomisp/pci/isp_acquisition_defs.h +f:drivers/staging/media/atomisp/pci/isp_capture_defs.h +f:drivers/staging/media/atomisp/pci/mamoiada_params.h +f:drivers/staging/media/atomisp/pci/mmu/isp_mmu.c +f:drivers/staging/media/atomisp/pci/mmu/sh_mmu_mrfld.c +f:drivers/staging/media/atomisp/pci/mmu_defs.h +f:drivers/staging/media/atomisp/pci/runtime/binary/interface/ia_css_binary.h +f:drivers/staging/media/atomisp/pci/runtime/binary/src/binary.c +f:drivers/staging/media/atomisp/pci/runtime/bufq/interface/ia_css_bufq.h +f:drivers/staging/media/atomisp/pci/runtime/bufq/interface/ia_css_bufq_comm.h +f:drivers/staging/media/atomisp/pci/runtime/bufq/src/bufq.c +f:drivers/staging/media/atomisp/pci/runtime/debug/interface/ia_css_debug.h +f:drivers/staging/media/atomisp/pci/runtime/debug/interface/ia_css_debug_internal.h +f:drivers/staging/media/atomisp/pci/runtime/debug/interface/ia_css_debug_pipe.h +f:drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c +f:drivers/staging/media/atomisp/pci/runtime/event/interface/ia_css_event.h +f:drivers/staging/media/atomisp/pci/runtime/event/src/event.c +f:drivers/staging/media/atomisp/pci/runtime/eventq/interface/ia_css_eventq.h +f:drivers/staging/media/atomisp/pci/runtime/eventq/src/eventq.c +f:drivers/staging/media/atomisp/pci/runtime/frame/interface/ia_css_frame.h +f:drivers/staging/media/atomisp/pci/runtime/frame/interface/ia_css_frame_comm.h +f:drivers/staging/media/atomisp/pci/runtime/frame/src/frame.c +f:drivers/staging/media/atomisp/pci/runtime/ifmtr/interface/ia_css_ifmtr.h +f:drivers/staging/media/atomisp/pci/runtime/ifmtr/src/ifmtr.c +f:drivers/staging/media/atomisp/pci/runtime/inputfifo/interface/ia_css_inputfifo.h +f:drivers/staging/media/atomisp/pci/runtime/inputfifo/src/inputfifo.c +f:drivers/staging/media/atomisp/pci/runtime/isp_param/interface/ia_css_isp_param.h +f:drivers/staging/media/atomisp/pci/runtime/isp_param/interface/ia_css_isp_param_types.h +f:drivers/staging/media/atomisp/pci/runtime/isp_param/src/isp_param.c +f:drivers/staging/media/atomisp/pci/runtime/isys/interface/ia_css_isys.h +f:drivers/staging/media/atomisp/pci/runtime/isys/interface/ia_css_isys_comm.h +f:drivers/staging/media/atomisp/pci/runtime/isys/src/csi_rx_rmgr.c +f:drivers/staging/media/atomisp/pci/runtime/isys/src/csi_rx_rmgr.h +f:drivers/staging/media/atomisp/pci/runtime/isys/src/ibuf_ctrl_rmgr.c +f:drivers/staging/media/atomisp/pci/runtime/isys/src/ibuf_ctrl_rmgr.h +f:drivers/staging/media/atomisp/pci/runtime/isys/src/isys_dma_rmgr.c +f:drivers/staging/media/atomisp/pci/runtime/isys/src/isys_dma_rmgr.h +f:drivers/staging/media/atomisp/pci/runtime/isys/src/isys_init.c +f:drivers/staging/media/atomisp/pci/runtime/isys/src/isys_stream2mmio_rmgr.c +f:drivers/staging/media/atomisp/pci/runtime/isys/src/isys_stream2mmio_rmgr.h +f:drivers/staging/media/atomisp/pci/runtime/isys/src/rx.c +f:drivers/staging/media/atomisp/pci/runtime/isys/src/virtual_isys.c +f:drivers/staging/media/atomisp/pci/runtime/isys/src/virtual_isys.h +f:drivers/staging/media/atomisp/pci/runtime/pipeline/interface/ia_css_pipeline.h +f:drivers/staging/media/atomisp/pci/runtime/pipeline/interface/ia_css_pipeline_common.h +f:drivers/staging/media/atomisp/pci/runtime/pipeline/src/pipeline.c +f:drivers/staging/media/atomisp/pci/runtime/queue/interface/ia_css_queue.h +f:drivers/staging/media/atomisp/pci/runtime/queue/interface/ia_css_queue_comm.h +f:drivers/staging/media/atomisp/pci/runtime/queue/src/queue.c +f:drivers/staging/media/atomisp/pci/runtime/queue/src/queue_access.c +f:drivers/staging/media/atomisp/pci/runtime/queue/src/queue_access.h +f:drivers/staging/media/atomisp/pci/runtime/rmgr/interface/ia_css_rmgr.h +f:drivers/staging/media/atomisp/pci/runtime/rmgr/interface/ia_css_rmgr_vbuf.h +f:drivers/staging/media/atomisp/pci/runtime/rmgr/src/rmgr.c +f:drivers/staging/media/atomisp/pci/runtime/rmgr/src/rmgr_vbuf.c +f:drivers/staging/media/atomisp/pci/runtime/spctrl/interface/ia_css_spctrl.h +f:drivers/staging/media/atomisp/pci/runtime/spctrl/interface/ia_css_spctrl_comm.h +f:drivers/staging/media/atomisp/pci/runtime/spctrl/src/spctrl.c +f:drivers/staging/media/atomisp/pci/runtime/tagger/interface/ia_css_tagger_common.h +f:drivers/staging/media/atomisp/pci/runtime/timer/src/timer.c +f:drivers/staging/media/atomisp/pci/scalar_processor_2400_params.h +f:drivers/staging/media/atomisp/pci/sh_css.c +f:drivers/staging/media/atomisp/pci/sh_css_defs.h +f:drivers/staging/media/atomisp/pci/sh_css_firmware.c +f:drivers/staging/media/atomisp/pci/sh_css_firmware.h +f:drivers/staging/media/atomisp/pci/sh_css_frac.h +f:drivers/staging/media/atomisp/pci/sh_css_host_data.c +f:drivers/staging/media/atomisp/pci/sh_css_hrt.c +f:drivers/staging/media/atomisp/pci/sh_css_hrt.h +f:drivers/staging/media/atomisp/pci/sh_css_internal.h +f:drivers/staging/media/atomisp/pci/sh_css_legacy.h +f:drivers/staging/media/atomisp/pci/sh_css_metrics.c +f:drivers/staging/media/atomisp/pci/sh_css_metrics.h +f:drivers/staging/media/atomisp/pci/sh_css_mipi.c +f:drivers/staging/media/atomisp/pci/sh_css_mipi.h +f:drivers/staging/media/atomisp/pci/sh_css_mmu.c +f:drivers/staging/media/atomisp/pci/sh_css_param_dvs.c +f:drivers/staging/media/atomisp/pci/sh_css_param_dvs.h +f:drivers/staging/media/atomisp/pci/sh_css_param_shading.c +f:drivers/staging/media/atomisp/pci/sh_css_param_shading.h +f:drivers/staging/media/atomisp/pci/sh_css_params.c +f:drivers/staging/media/atomisp/pci/sh_css_params.h +f:drivers/staging/media/atomisp/pci/sh_css_params_internal.h +f:drivers/staging/media/atomisp/pci/sh_css_properties.c +f:drivers/staging/media/atomisp/pci/sh_css_sp.c +f:drivers/staging/media/atomisp/pci/sh_css_sp.h +f:drivers/staging/media/atomisp/pci/sh_css_stream_format.c +f:drivers/staging/media/atomisp/pci/sh_css_stream_format.h +f:drivers/staging/media/atomisp/pci/sh_css_struct.h +f:drivers/staging/media/atomisp/pci/sh_css_uds.h +f:drivers/staging/media/atomisp/pci/sh_css_version.c +f:drivers/staging/media/atomisp/pci/str2mem_defs.h +f:drivers/staging/media/atomisp/pci/streaming_to_mipi_defs.h +f:drivers/staging/media/atomisp/pci/system_global.h +f:drivers/staging/media/atomisp/pci/system_local.c +f:drivers/staging/media/atomisp/pci/system_local.h +f:drivers/staging/media/atomisp/pci/timed_controller_defs.h +f:drivers/staging/media/atomisp/pci/version.h +f:drivers/staging/media/av7110/Kconfig +f:drivers/staging/media/av7110/Makefile +f:drivers/staging/media/av7110/av7110.c +f:drivers/staging/media/av7110/av7110.h +f:drivers/staging/media/av7110/av7110_av.c +f:drivers/staging/media/av7110/av7110_av.h +f:drivers/staging/media/av7110/av7110_ca.c +f:drivers/staging/media/av7110/av7110_ca.h +f:drivers/staging/media/av7110/av7110_hw.c +f:drivers/staging/media/av7110/av7110_hw.h +f:drivers/staging/media/av7110/av7110_ipack.c +f:drivers/staging/media/av7110/av7110_ipack.h +f:drivers/staging/media/av7110/av7110_ir.c +f:drivers/staging/media/av7110/av7110_v4l.c +f:drivers/staging/media/av7110/dvb_filter.c +f:drivers/staging/media/av7110/dvb_filter.h +f:drivers/staging/media/av7110/sp8870.c +f:drivers/staging/media/av7110/sp8870.h +f:drivers/staging/media/deprecated/atmel/Kconfig +f:drivers/staging/media/deprecated/atmel/Makefile +f:drivers/staging/media/deprecated/atmel/TODO +f:drivers/staging/media/deprecated/atmel/atmel-isc-base.c +f:drivers/staging/media/deprecated/atmel/atmel-isc-clk.c +f:drivers/staging/media/deprecated/atmel/atmel-isc-regs.h +f:drivers/staging/media/deprecated/atmel/atmel-isc.h +f:drivers/staging/media/deprecated/atmel/atmel-sama5d2-isc.c +f:drivers/staging/media/deprecated/atmel/atmel-sama7g5-isc.c +f:drivers/staging/media/imx/Kconfig +f:drivers/staging/media/imx/Makefile +f:drivers/staging/media/imx/TODO +f:drivers/staging/media/imx/imx-ic-common.c +f:drivers/staging/media/imx/imx-ic-prp.c +f:drivers/staging/media/imx/imx-ic-prpencvf.c +f:drivers/staging/media/imx/imx-ic.h +f:drivers/staging/media/imx/imx-media-capture.c +f:drivers/staging/media/imx/imx-media-csc-scaler.c +f:drivers/staging/media/imx/imx-media-csi.c +f:drivers/staging/media/imx/imx-media-dev-common.c +f:drivers/staging/media/imx/imx-media-dev.c +f:drivers/staging/media/imx/imx-media-fim.c +f:drivers/staging/media/imx/imx-media-internal-sd.c +f:drivers/staging/media/imx/imx-media-of.c +f:drivers/staging/media/imx/imx-media-utils.c +f:drivers/staging/media/imx/imx-media-vdic.c +f:drivers/staging/media/imx/imx-media.h +f:drivers/staging/media/imx/imx6-mipi-csi2.c +f:drivers/staging/media/ipu3/Kconfig +f:drivers/staging/media/ipu3/Makefile +f:drivers/staging/media/ipu3/TODO +f:drivers/staging/media/ipu3/include/uapi/intel-ipu3.h +f:drivers/staging/media/ipu3/ipu3-abi.h +f:drivers/staging/media/ipu3/ipu3-css-fw.c +f:drivers/staging/media/ipu3/ipu3-css-fw.h +f:drivers/staging/media/ipu3/ipu3-css-params.c +f:drivers/staging/media/ipu3/ipu3-css-params.h +f:drivers/staging/media/ipu3/ipu3-css-pool.c +f:drivers/staging/media/ipu3/ipu3-css-pool.h +f:drivers/staging/media/ipu3/ipu3-css.c +f:drivers/staging/media/ipu3/ipu3-css.h +f:drivers/staging/media/ipu3/ipu3-dmamap.c +f:drivers/staging/media/ipu3/ipu3-dmamap.h +f:drivers/staging/media/ipu3/ipu3-mmu.c +f:drivers/staging/media/ipu3/ipu3-mmu.h +f:drivers/staging/media/ipu3/ipu3-tables.c +f:drivers/staging/media/ipu3/ipu3-tables.h +f:drivers/staging/media/ipu3/ipu3-v4l2.c +f:drivers/staging/media/ipu3/ipu3.c +f:drivers/staging/media/ipu3/ipu3.h +f:drivers/staging/media/ipu7/Kconfig +f:drivers/staging/media/ipu7/Makefile +f:drivers/staging/media/ipu7/TODO +f:drivers/staging/media/ipu7/abi/ipu7_fw_boot_abi.h +f:drivers/staging/media/ipu7/abi/ipu7_fw_common_abi.h +f:drivers/staging/media/ipu7/abi/ipu7_fw_config_abi.h +f:drivers/staging/media/ipu7/abi/ipu7_fw_insys_config_abi.h +f:drivers/staging/media/ipu7/abi/ipu7_fw_isys_abi.h +f:drivers/staging/media/ipu7/abi/ipu7_fw_msg_abi.h +f:drivers/staging/media/ipu7/abi/ipu7_fw_psys_config_abi.h +f:drivers/staging/media/ipu7/abi/ipu7_fw_syscom_abi.h +f:drivers/staging/media/ipu7/ipu7-boot.c +f:drivers/staging/media/ipu7/ipu7-boot.h +f:drivers/staging/media/ipu7/ipu7-bus.c +f:drivers/staging/media/ipu7/ipu7-bus.h +f:drivers/staging/media/ipu7/ipu7-buttress-regs.h +f:drivers/staging/media/ipu7/ipu7-buttress.c +f:drivers/staging/media/ipu7/ipu7-buttress.h +f:drivers/staging/media/ipu7/ipu7-cpd.c +f:drivers/staging/media/ipu7/ipu7-cpd.h +f:drivers/staging/media/ipu7/ipu7-dma.c +f:drivers/staging/media/ipu7/ipu7-dma.h +f:drivers/staging/media/ipu7/ipu7-fw-isys.c +f:drivers/staging/media/ipu7/ipu7-fw-isys.h +f:drivers/staging/media/ipu7/ipu7-isys-csi-phy.c +f:drivers/staging/media/ipu7/ipu7-isys-csi-phy.h +f:drivers/staging/media/ipu7/ipu7-isys-csi2-regs.h +f:drivers/staging/media/ipu7/ipu7-isys-csi2.c +f:drivers/staging/media/ipu7/ipu7-isys-csi2.h +f:drivers/staging/media/ipu7/ipu7-isys-queue.c +f:drivers/staging/media/ipu7/ipu7-isys-queue.h +f:drivers/staging/media/ipu7/ipu7-isys-subdev.c +f:drivers/staging/media/ipu7/ipu7-isys-subdev.h +f:drivers/staging/media/ipu7/ipu7-isys-video.c +f:drivers/staging/media/ipu7/ipu7-isys-video.h +f:drivers/staging/media/ipu7/ipu7-isys.c +f:drivers/staging/media/ipu7/ipu7-isys.h +f:drivers/staging/media/ipu7/ipu7-mmu.c +f:drivers/staging/media/ipu7/ipu7-mmu.h +f:drivers/staging/media/ipu7/ipu7-platform-regs.h +f:drivers/staging/media/ipu7/ipu7-syscom.c +f:drivers/staging/media/ipu7/ipu7-syscom.h +f:drivers/staging/media/ipu7/ipu7.c +f:drivers/staging/media/ipu7/ipu7.h +f:drivers/staging/media/max96712/Kconfig +f:drivers/staging/media/max96712/Makefile +f:drivers/staging/media/max96712/max96712.c +f:drivers/staging/media/meson/vdec/Kconfig +f:drivers/staging/media/meson/vdec/Makefile +f:drivers/staging/media/meson/vdec/TODO +f:drivers/staging/media/meson/vdec/codec_h264.c +f:drivers/staging/media/meson/vdec/codec_h264.h +f:drivers/staging/media/meson/vdec/codec_hevc_common.c +f:drivers/staging/media/meson/vdec/codec_hevc_common.h +f:drivers/staging/media/meson/vdec/codec_mpeg12.c +f:drivers/staging/media/meson/vdec/codec_mpeg12.h +f:drivers/staging/media/meson/vdec/codec_vp9.c +f:drivers/staging/media/meson/vdec/codec_vp9.h +f:drivers/staging/media/meson/vdec/dos_regs.h +f:drivers/staging/media/meson/vdec/esparser.c +f:drivers/staging/media/meson/vdec/esparser.h +f:drivers/staging/media/meson/vdec/hevc_regs.h +f:drivers/staging/media/meson/vdec/vdec.c +f:drivers/staging/media/meson/vdec/vdec.h +f:drivers/staging/media/meson/vdec/vdec_1.c +f:drivers/staging/media/meson/vdec/vdec_1.h +f:drivers/staging/media/meson/vdec/vdec_helpers.c +f:drivers/staging/media/meson/vdec/vdec_helpers.h +f:drivers/staging/media/meson/vdec/vdec_hevc.c +f:drivers/staging/media/meson/vdec/vdec_hevc.h +f:drivers/staging/media/meson/vdec/vdec_platform.c +f:drivers/staging/media/meson/vdec/vdec_platform.h +f:drivers/staging/media/starfive/Kconfig +f:drivers/staging/media/starfive/Makefile +f:drivers/staging/media/starfive/camss/Kconfig +f:drivers/staging/media/starfive/camss/Makefile +f:drivers/staging/media/starfive/camss/TODO.txt +f:drivers/staging/media/starfive/camss/stf-camss.c +f:drivers/staging/media/starfive/camss/stf-camss.h +f:drivers/staging/media/starfive/camss/stf-capture.c +f:drivers/staging/media/starfive/camss/stf-capture.h +f:drivers/staging/media/starfive/camss/stf-isp-hw-ops.c +f:drivers/staging/media/starfive/camss/stf-isp.c +f:drivers/staging/media/starfive/camss/stf-isp.h +f:drivers/staging/media/starfive/camss/stf-video.c +f:drivers/staging/media/starfive/camss/stf-video.h +f:drivers/staging/media/sunxi/Kconfig +f:drivers/staging/media/sunxi/Makefile +f:drivers/staging/media/sunxi/cedrus/Kconfig +f:drivers/staging/media/sunxi/cedrus/Makefile +f:drivers/staging/media/sunxi/cedrus/TODO +f:drivers/staging/media/sunxi/cedrus/cedrus.c +f:drivers/staging/media/sunxi/cedrus/cedrus.h +f:drivers/staging/media/sunxi/cedrus/cedrus_dec.c +f:drivers/staging/media/sunxi/cedrus/cedrus_dec.h +f:drivers/staging/media/sunxi/cedrus/cedrus_h264.c +f:drivers/staging/media/sunxi/cedrus/cedrus_h265.c +f:drivers/staging/media/sunxi/cedrus/cedrus_hw.c +f:drivers/staging/media/sunxi/cedrus/cedrus_hw.h +f:drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c +f:drivers/staging/media/sunxi/cedrus/cedrus_regs.h +f:drivers/staging/media/sunxi/cedrus/cedrus_video.c +f:drivers/staging/media/sunxi/cedrus/cedrus_video.h +f:drivers/staging/media/sunxi/cedrus/cedrus_vp8.c +f:drivers/staging/media/sunxi/sun6i-isp/Kconfig +f:drivers/staging/media/sunxi/sun6i-isp/Makefile +f:drivers/staging/media/sunxi/sun6i-isp/TODO.txt +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp.c +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp.h +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.h +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.h +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.h +f:drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_reg.h +f:drivers/staging/media/sunxi/sun6i-isp/uapi/sun6i-isp-config.h +f:drivers/staging/media/tegra-video/Kconfig +f:drivers/staging/media/tegra-video/Makefile +f:drivers/staging/media/tegra-video/TODO +f:drivers/staging/media/tegra-video/csi.c +f:drivers/staging/media/tegra-video/csi.h +f:drivers/staging/media/tegra-video/tegra20.c +f:drivers/staging/media/tegra-video/tegra210.c +f:drivers/staging/media/tegra-video/vi.c +f:drivers/staging/media/tegra-video/vi.h +f:drivers/staging/media/tegra-video/video.c +f:drivers/staging/media/tegra-video/video.h +f:drivers/staging/media/tegra-video/vip.c +f:drivers/staging/media/tegra-video/vip.h +f:drivers/staging/most/Documentation/ABI/sysfs-class-most.txt +f:drivers/staging/most/Documentation/driver_usage.txt +f:drivers/staging/most/Kconfig +f:drivers/staging/most/Makefile +f:drivers/staging/most/TODO +f:drivers/staging/most/dim2/Kconfig +f:drivers/staging/most/dim2/Makefile +f:drivers/staging/most/dim2/dim2.c +f:drivers/staging/most/dim2/errors.h +f:drivers/staging/most/dim2/hal.c +f:drivers/staging/most/dim2/hal.h +f:drivers/staging/most/dim2/reg.h +f:drivers/staging/most/dim2/sysfs.h +f:drivers/staging/most/i2c/Kconfig +f:drivers/staging/most/i2c/Makefile +f:drivers/staging/most/i2c/i2c.c +f:drivers/staging/most/net/Kconfig +f:drivers/staging/most/net/Makefile +f:drivers/staging/most/net/net.c +f:drivers/staging/most/video/Kconfig +f:drivers/staging/most/video/Makefile +f:drivers/staging/most/video/video.c +f:drivers/staging/nvec/Kconfig +f:drivers/staging/nvec/Makefile +f:drivers/staging/nvec/README +f:drivers/staging/nvec/TODO +f:drivers/staging/nvec/nvec-keytable.h +f:drivers/staging/nvec/nvec.c +f:drivers/staging/nvec/nvec.h +f:drivers/staging/nvec/nvec_kbd.c +f:drivers/staging/nvec/nvec_paz00.c +f:drivers/staging/nvec/nvec_power.c +f:drivers/staging/nvec/nvec_ps2.c +f:drivers/staging/octeon/Kconfig +f:drivers/staging/octeon/Makefile +f:drivers/staging/octeon/TODO +f:drivers/staging/octeon/ethernet-defines.h +f:drivers/staging/octeon/ethernet-mdio.c +f:drivers/staging/octeon/ethernet-mdio.h +f:drivers/staging/octeon/ethernet-mem.c +f:drivers/staging/octeon/ethernet-mem.h +f:drivers/staging/octeon/ethernet-rgmii.c +f:drivers/staging/octeon/ethernet-rx.c +f:drivers/staging/octeon/ethernet-rx.h +f:drivers/staging/octeon/ethernet-sgmii.c +f:drivers/staging/octeon/ethernet-spi.c +f:drivers/staging/octeon/ethernet-tx.c +f:drivers/staging/octeon/ethernet-tx.h +f:drivers/staging/octeon/ethernet-util.h +f:drivers/staging/octeon/ethernet.c +f:drivers/staging/octeon/octeon-ethernet.h +f:drivers/staging/octeon/octeon-stubs.h +f:drivers/staging/rtl8723bs/Kconfig +f:drivers/staging/rtl8723bs/Makefile +f:drivers/staging/rtl8723bs/TODO +f:drivers/staging/rtl8723bs/core/rtw_ap.c +f:drivers/staging/rtl8723bs/core/rtw_btcoex.c +f:drivers/staging/rtl8723bs/core/rtw_cmd.c +f:drivers/staging/rtl8723bs/core/rtw_efuse.c +f:drivers/staging/rtl8723bs/core/rtw_ieee80211.c +f:drivers/staging/rtl8723bs/core/rtw_io.c +f:drivers/staging/rtl8723bs/core/rtw_ioctl_set.c +f:drivers/staging/rtl8723bs/core/rtw_mlme.c +f:drivers/staging/rtl8723bs/core/rtw_mlme_ext.c +f:drivers/staging/rtl8723bs/core/rtw_pwrctrl.c +f:drivers/staging/rtl8723bs/core/rtw_recv.c +f:drivers/staging/rtl8723bs/core/rtw_security.c +f:drivers/staging/rtl8723bs/core/rtw_sta_mgt.c +f:drivers/staging/rtl8723bs/core/rtw_wlan_util.c +f:drivers/staging/rtl8723bs/core/rtw_xmit.c +f:drivers/staging/rtl8723bs/hal/Hal8723BReg.h +f:drivers/staging/rtl8723bs/hal/HalBtc8723b1Ant.c +f:drivers/staging/rtl8723bs/hal/HalBtc8723b1Ant.h +f:drivers/staging/rtl8723bs/hal/HalBtc8723b2Ant.c +f:drivers/staging/rtl8723bs/hal/HalBtc8723b2Ant.h +f:drivers/staging/rtl8723bs/hal/HalBtcOutSrc.h +f:drivers/staging/rtl8723bs/hal/HalHWImg8723B_BB.c +f:drivers/staging/rtl8723bs/hal/HalHWImg8723B_BB.h +f:drivers/staging/rtl8723bs/hal/HalHWImg8723B_MAC.c +f:drivers/staging/rtl8723bs/hal/HalHWImg8723B_MAC.h +f:drivers/staging/rtl8723bs/hal/HalHWImg8723B_RF.c +f:drivers/staging/rtl8723bs/hal/HalHWImg8723B_RF.h +f:drivers/staging/rtl8723bs/hal/HalPhyRf.c +f:drivers/staging/rtl8723bs/hal/HalPhyRf.h +f:drivers/staging/rtl8723bs/hal/HalPhyRf_8723B.c +f:drivers/staging/rtl8723bs/hal/HalPhyRf_8723B.h +f:drivers/staging/rtl8723bs/hal/HalPwrSeqCmd.c +f:drivers/staging/rtl8723bs/hal/Mp_Precomp.h +f:drivers/staging/rtl8723bs/hal/hal_btcoex.c +f:drivers/staging/rtl8723bs/hal/hal_com.c +f:drivers/staging/rtl8723bs/hal/hal_com_phycfg.c +f:drivers/staging/rtl8723bs/hal/hal_intf.c +f:drivers/staging/rtl8723bs/hal/hal_pwr_seq.c +f:drivers/staging/rtl8723bs/hal/hal_sdio.c +f:drivers/staging/rtl8723bs/hal/odm.c +f:drivers/staging/rtl8723bs/hal/odm.h +f:drivers/staging/rtl8723bs/hal/odm_CfoTracking.c +f:drivers/staging/rtl8723bs/hal/odm_CfoTracking.h +f:drivers/staging/rtl8723bs/hal/odm_DIG.c +f:drivers/staging/rtl8723bs/hal/odm_DIG.h +f:drivers/staging/rtl8723bs/hal/odm_DynamicBBPowerSaving.c +f:drivers/staging/rtl8723bs/hal/odm_DynamicBBPowerSaving.h +f:drivers/staging/rtl8723bs/hal/odm_DynamicTxPower.c +f:drivers/staging/rtl8723bs/hal/odm_DynamicTxPower.h +f:drivers/staging/rtl8723bs/hal/odm_EdcaTurboCheck.c +f:drivers/staging/rtl8723bs/hal/odm_EdcaTurboCheck.h +f:drivers/staging/rtl8723bs/hal/odm_HWConfig.c +f:drivers/staging/rtl8723bs/hal/odm_HWConfig.h +f:drivers/staging/rtl8723bs/hal/odm_RegConfig8723B.c +f:drivers/staging/rtl8723bs/hal/odm_RegConfig8723B.h +f:drivers/staging/rtl8723bs/hal/odm_RegDefine11N.h +f:drivers/staging/rtl8723bs/hal/odm_interface.h +f:drivers/staging/rtl8723bs/hal/odm_precomp.h +f:drivers/staging/rtl8723bs/hal/odm_reg.h +f:drivers/staging/rtl8723bs/hal/odm_types.h +f:drivers/staging/rtl8723bs/hal/rtl8723b_cmd.c +f:drivers/staging/rtl8723bs/hal/rtl8723b_dm.c +f:drivers/staging/rtl8723bs/hal/rtl8723b_hal_init.c +f:drivers/staging/rtl8723bs/hal/rtl8723b_phycfg.c +f:drivers/staging/rtl8723bs/hal/rtl8723b_rf6052.c +f:drivers/staging/rtl8723bs/hal/rtl8723b_rxdesc.c +f:drivers/staging/rtl8723bs/hal/rtl8723bs_recv.c +f:drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c +f:drivers/staging/rtl8723bs/hal/sdio_halinit.c +f:drivers/staging/rtl8723bs/hal/sdio_ops.c +f:drivers/staging/rtl8723bs/include/Hal8192CPhyReg.h +f:drivers/staging/rtl8723bs/include/HalPwrSeqCmd.h +f:drivers/staging/rtl8723bs/include/HalVerDef.h +f:drivers/staging/rtl8723bs/include/basic_types.h +f:drivers/staging/rtl8723bs/include/cmd_osdep.h +f:drivers/staging/rtl8723bs/include/drv_types.h +f:drivers/staging/rtl8723bs/include/drv_types_sdio.h +f:drivers/staging/rtl8723bs/include/hal_btcoex.h +f:drivers/staging/rtl8723bs/include/hal_com.h +f:drivers/staging/rtl8723bs/include/hal_com_h2c.h +f:drivers/staging/rtl8723bs/include/hal_com_phycfg.h +f:drivers/staging/rtl8723bs/include/hal_com_reg.h +f:drivers/staging/rtl8723bs/include/hal_data.h +f:drivers/staging/rtl8723bs/include/hal_intf.h +f:drivers/staging/rtl8723bs/include/hal_pg.h +f:drivers/staging/rtl8723bs/include/hal_phy.h +f:drivers/staging/rtl8723bs/include/hal_phy_cfg.h +f:drivers/staging/rtl8723bs/include/hal_phy_reg.h +f:drivers/staging/rtl8723bs/include/hal_pwr_seq.h +f:drivers/staging/rtl8723bs/include/hal_sdio.h +f:drivers/staging/rtl8723bs/include/ieee80211.h +f:drivers/staging/rtl8723bs/include/ioctl_cfg80211.h +f:drivers/staging/rtl8723bs/include/mlme_osdep.h +f:drivers/staging/rtl8723bs/include/osdep_intf.h +f:drivers/staging/rtl8723bs/include/osdep_service.h +f:drivers/staging/rtl8723bs/include/osdep_service_linux.h +f:drivers/staging/rtl8723bs/include/recv_osdep.h +f:drivers/staging/rtl8723bs/include/rtl8192c_recv.h +f:drivers/staging/rtl8723bs/include/rtl8723b_cmd.h +f:drivers/staging/rtl8723bs/include/rtl8723b_dm.h +f:drivers/staging/rtl8723bs/include/rtl8723b_hal.h +f:drivers/staging/rtl8723bs/include/rtl8723b_recv.h +f:drivers/staging/rtl8723bs/include/rtl8723b_rf.h +f:drivers/staging/rtl8723bs/include/rtl8723b_spec.h +f:drivers/staging/rtl8723bs/include/rtl8723b_xmit.h +f:drivers/staging/rtl8723bs/include/rtw_ap.h +f:drivers/staging/rtl8723bs/include/rtw_btcoex.h +f:drivers/staging/rtl8723bs/include/rtw_byteorder.h +f:drivers/staging/rtl8723bs/include/rtw_cmd.h +f:drivers/staging/rtl8723bs/include/rtw_eeprom.h +f:drivers/staging/rtl8723bs/include/rtw_efuse.h +f:drivers/staging/rtl8723bs/include/rtw_event.h +f:drivers/staging/rtl8723bs/include/rtw_ht.h +f:drivers/staging/rtl8723bs/include/rtw_io.h +f:drivers/staging/rtl8723bs/include/rtw_ioctl_set.h +f:drivers/staging/rtl8723bs/include/rtw_mlme.h +f:drivers/staging/rtl8723bs/include/rtw_mlme_ext.h +f:drivers/staging/rtl8723bs/include/rtw_pwrctrl.h +f:drivers/staging/rtl8723bs/include/rtw_qos.h +f:drivers/staging/rtl8723bs/include/rtw_recv.h +f:drivers/staging/rtl8723bs/include/rtw_rf.h +f:drivers/staging/rtl8723bs/include/rtw_security.h +f:drivers/staging/rtl8723bs/include/rtw_version.h +f:drivers/staging/rtl8723bs/include/rtw_wifi_regd.h +f:drivers/staging/rtl8723bs/include/rtw_xmit.h +f:drivers/staging/rtl8723bs/include/sdio_hal.h +f:drivers/staging/rtl8723bs/include/sdio_ops.h +f:drivers/staging/rtl8723bs/include/sdio_ops_linux.h +f:drivers/staging/rtl8723bs/include/sta_info.h +f:drivers/staging/rtl8723bs/include/wifi.h +f:drivers/staging/rtl8723bs/include/wlan_bssdef.h +f:drivers/staging/rtl8723bs/include/xmit_osdep.h +f:drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c +f:drivers/staging/rtl8723bs/os_dep/mlme_linux.c +f:drivers/staging/rtl8723bs/os_dep/os_intfs.c +f:drivers/staging/rtl8723bs/os_dep/osdep_service.c +f:drivers/staging/rtl8723bs/os_dep/recv_linux.c +f:drivers/staging/rtl8723bs/os_dep/sdio_intf.c +f:drivers/staging/rtl8723bs/os_dep/sdio_ops_linux.c +f:drivers/staging/rtl8723bs/os_dep/wifi_regd.c +f:drivers/staging/rtl8723bs/os_dep/xmit_linux.c +f:drivers/staging/sm750fb/Kconfig +f:drivers/staging/sm750fb/Makefile +f:drivers/staging/sm750fb/TODO +f:drivers/staging/sm750fb/ddk750.h +f:drivers/staging/sm750fb/ddk750_chip.c +f:drivers/staging/sm750fb/ddk750_chip.h +f:drivers/staging/sm750fb/ddk750_display.c +f:drivers/staging/sm750fb/ddk750_display.h +f:drivers/staging/sm750fb/ddk750_mode.c +f:drivers/staging/sm750fb/ddk750_mode.h +f:drivers/staging/sm750fb/ddk750_power.c +f:drivers/staging/sm750fb/ddk750_power.h +f:drivers/staging/sm750fb/ddk750_reg.h +f:drivers/staging/sm750fb/ddk750_swi2c.c +f:drivers/staging/sm750fb/ddk750_swi2c.h +f:drivers/staging/sm750fb/readme +f:drivers/staging/sm750fb/sm750.c +f:drivers/staging/sm750fb/sm750.h +f:drivers/staging/sm750fb/sm750_accel.c +f:drivers/staging/sm750fb/sm750_accel.h +f:drivers/staging/sm750fb/sm750_cursor.c +f:drivers/staging/sm750fb/sm750_cursor.h +f:drivers/staging/sm750fb/sm750_hw.c +f:drivers/staging/vc04_services/Kconfig +f:drivers/staging/vc04_services/Makefile +f:drivers/staging/vc04_services/bcm2835-audio/Kconfig +f:drivers/staging/vc04_services/bcm2835-audio/Makefile +f:drivers/staging/vc04_services/bcm2835-audio/bcm2835-ctl.c +f:drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c +f:drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c +f:drivers/staging/vc04_services/bcm2835-audio/bcm2835.c +f:drivers/staging/vc04_services/bcm2835-audio/bcm2835.h +f:drivers/staging/vc04_services/bcm2835-audio/vc_vchi_audioserv_defs.h +f:drivers/staging/vc04_services/bcm2835-camera/Kconfig +f:drivers/staging/vc04_services/bcm2835-camera/Makefile +f:drivers/staging/vc04_services/bcm2835-camera/TODO +f:drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +f:drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.h +f:drivers/staging/vc04_services/bcm2835-camera/controls.c +f:drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h +f:drivers/staging/vc04_services/interface/TESTING +f:drivers/staging/vc04_services/interface/TODO +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.h +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_cfg.h +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c +f:drivers/staging/vc04_services/interface/vchiq_arm/vchiq_ioctl.h +f:drivers/staging/vc04_services/vchiq-mmal/Kconfig +f:drivers/staging/vc04_services/vchiq-mmal/Makefile +f:drivers/staging/vc04_services/vchiq-mmal/mmal-common.h +f:drivers/staging/vc04_services/vchiq-mmal/mmal-encodings.h +f:drivers/staging/vc04_services/vchiq-mmal/mmal-msg-common.h +f:drivers/staging/vc04_services/vchiq-mmal/mmal-msg-format.h +f:drivers/staging/vc04_services/vchiq-mmal/mmal-msg-port.h +f:drivers/staging/vc04_services/vchiq-mmal/mmal-msg.h +f:drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h +f:drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c +f:drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h +f:drivers/staging/vme_user/Kconfig +f:drivers/staging/vme_user/Makefile +f:drivers/staging/vme_user/vme.c +f:drivers/staging/vme_user/vme.h +f:drivers/staging/vme_user/vme_bridge.h +f:drivers/staging/vme_user/vme_fake.c +f:drivers/staging/vme_user/vme_tsi148.c +f:drivers/staging/vme_user/vme_tsi148.h +f:drivers/staging/vme_user/vme_user.c +f:drivers/staging/vme_user/vme_user.h +f:drivers/target/Kconfig +f:drivers/target/Makefile +f:drivers/target/iscsi/Kconfig +f:drivers/target/iscsi/Makefile +f:drivers/target/iscsi/cxgbit/Kconfig +f:drivers/target/iscsi/cxgbit/Makefile +f:drivers/target/iscsi/cxgbit/cxgbit.h +f:drivers/target/iscsi/cxgbit/cxgbit_cm.c +f:drivers/target/iscsi/cxgbit/cxgbit_ddp.c +f:drivers/target/iscsi/cxgbit/cxgbit_lro.h +f:drivers/target/iscsi/cxgbit/cxgbit_main.c +f:drivers/target/iscsi/cxgbit/cxgbit_target.c +f:drivers/target/iscsi/iscsi_target.c +f:drivers/target/iscsi/iscsi_target.h +f:drivers/target/iscsi/iscsi_target_auth.c +f:drivers/target/iscsi/iscsi_target_auth.h +f:drivers/target/iscsi/iscsi_target_configfs.c +f:drivers/target/iscsi/iscsi_target_datain_values.c +f:drivers/target/iscsi/iscsi_target_datain_values.h +f:drivers/target/iscsi/iscsi_target_device.c +f:drivers/target/iscsi/iscsi_target_device.h +f:drivers/target/iscsi/iscsi_target_erl0.c +f:drivers/target/iscsi/iscsi_target_erl0.h +f:drivers/target/iscsi/iscsi_target_erl1.c +f:drivers/target/iscsi/iscsi_target_erl1.h +f:drivers/target/iscsi/iscsi_target_erl2.c +f:drivers/target/iscsi/iscsi_target_erl2.h +f:drivers/target/iscsi/iscsi_target_login.c +f:drivers/target/iscsi/iscsi_target_login.h +f:drivers/target/iscsi/iscsi_target_nego.c +f:drivers/target/iscsi/iscsi_target_nego.h +f:drivers/target/iscsi/iscsi_target_nodeattrib.c +f:drivers/target/iscsi/iscsi_target_nodeattrib.h +f:drivers/target/iscsi/iscsi_target_parameters.c +f:drivers/target/iscsi/iscsi_target_parameters.h +f:drivers/target/iscsi/iscsi_target_seq_pdu_list.c +f:drivers/target/iscsi/iscsi_target_seq_pdu_list.h +f:drivers/target/iscsi/iscsi_target_stat.c +f:drivers/target/iscsi/iscsi_target_tmr.c +f:drivers/target/iscsi/iscsi_target_tmr.h +f:drivers/target/iscsi/iscsi_target_tpg.c +f:drivers/target/iscsi/iscsi_target_tpg.h +f:drivers/target/iscsi/iscsi_target_transport.c +f:drivers/target/iscsi/iscsi_target_util.c +f:drivers/target/iscsi/iscsi_target_util.h +f:drivers/target/loopback/Kconfig +f:drivers/target/loopback/Makefile +f:drivers/target/loopback/tcm_loop.c +f:drivers/target/loopback/tcm_loop.h +f:drivers/target/sbp/Kconfig +f:drivers/target/sbp/Makefile +f:drivers/target/sbp/sbp_target.c +f:drivers/target/sbp/sbp_target.h +f:drivers/target/target_core_alua.c +f:drivers/target/target_core_alua.h +f:drivers/target/target_core_configfs.c +f:drivers/target/target_core_device.c +f:drivers/target/target_core_fabric_configfs.c +f:drivers/target/target_core_fabric_lib.c +f:drivers/target/target_core_file.c +f:drivers/target/target_core_file.h +f:drivers/target/target_core_hba.c +f:drivers/target/target_core_iblock.c +f:drivers/target/target_core_iblock.h +f:drivers/target/target_core_internal.h +f:drivers/target/target_core_pr.c +f:drivers/target/target_core_pr.h +f:drivers/target/target_core_pscsi.c +f:drivers/target/target_core_pscsi.h +f:drivers/target/target_core_rd.c +f:drivers/target/target_core_rd.h +f:drivers/target/target_core_sbc.c +f:drivers/target/target_core_spc.c +f:drivers/target/target_core_stat.c +f:drivers/target/target_core_tmr.c +f:drivers/target/target_core_tpg.c +f:drivers/target/target_core_transport.c +f:drivers/target/target_core_ua.c +f:drivers/target/target_core_ua.h +f:drivers/target/target_core_user.c +f:drivers/target/target_core_xcopy.c +f:drivers/target/target_core_xcopy.h +f:drivers/target/tcm_fc/Kconfig +f:drivers/target/tcm_fc/Makefile +f:drivers/target/tcm_fc/tcm_fc.h +f:drivers/target/tcm_fc/tfc_cmd.c +f:drivers/target/tcm_fc/tfc_conf.c +f:drivers/target/tcm_fc/tfc_io.c +f:drivers/target/tcm_fc/tfc_sess.c +f:drivers/target/tcm_remote/Kconfig +f:drivers/target/tcm_remote/Makefile +f:drivers/target/tcm_remote/tcm_remote.c +f:drivers/target/tcm_remote/tcm_remote.h +f:drivers/tc/Makefile +f:drivers/tc/tc-driver.c +f:drivers/tc/tc.c +f:drivers/tee/Kconfig +f:drivers/tee/Makefile +f:drivers/tee/amdtee/Kconfig +f:drivers/tee/amdtee/Makefile +f:drivers/tee/amdtee/amdtee_if.h +f:drivers/tee/amdtee/amdtee_private.h +f:drivers/tee/amdtee/call.c +f:drivers/tee/amdtee/core.c +f:drivers/tee/amdtee/shm_pool.c +f:drivers/tee/optee/Kconfig +f:drivers/tee/optee/Makefile +f:drivers/tee/optee/call.c +f:drivers/tee/optee/core.c +f:drivers/tee/optee/device.c +f:drivers/tee/optee/ffa_abi.c +f:drivers/tee/optee/notif.c +f:drivers/tee/optee/optee_ffa.h +f:drivers/tee/optee/optee_msg.h +f:drivers/tee/optee/optee_private.h +f:drivers/tee/optee/optee_rpc_cmd.h +f:drivers/tee/optee/optee_smc.h +f:drivers/tee/optee/optee_trace.h +f:drivers/tee/optee/rpc.c +f:drivers/tee/optee/smc_abi.c +f:drivers/tee/optee/supp.c +f:drivers/tee/tee_core.c +f:drivers/tee/tee_private.h +f:drivers/tee/tee_shm.c +f:drivers/tee/tee_shm_pool.c +f:drivers/tee/tstee/Kconfig +f:drivers/tee/tstee/Makefile +f:drivers/tee/tstee/core.c +f:drivers/tee/tstee/tstee_private.h +f:drivers/thermal/Kconfig +f:drivers/thermal/Makefile +f:drivers/thermal/airoha_thermal.c +f:drivers/thermal/amlogic_thermal.c +f:drivers/thermal/armada_thermal.c +f:drivers/thermal/broadcom/Kconfig +f:drivers/thermal/broadcom/Makefile +f:drivers/thermal/broadcom/bcm2711_thermal.c +f:drivers/thermal/broadcom/bcm2835_thermal.c +f:drivers/thermal/broadcom/brcmstb_thermal.c +f:drivers/thermal/broadcom/ns-thermal.c +f:drivers/thermal/broadcom/sr-thermal.c +f:drivers/thermal/cpufreq_cooling.c +f:drivers/thermal/cpuidle_cooling.c +f:drivers/thermal/da9062-thermal.c +f:drivers/thermal/db8500_thermal.c +f:drivers/thermal/devfreq_cooling.c +f:drivers/thermal/dove_thermal.c +f:drivers/thermal/gov_bang_bang.c +f:drivers/thermal/gov_fair_share.c +f:drivers/thermal/gov_power_allocator.c +f:drivers/thermal/gov_step_wise.c +f:drivers/thermal/gov_user_space.c +f:drivers/thermal/hisi_thermal.c +f:drivers/thermal/imx8mm_thermal.c +f:drivers/thermal/imx_sc_thermal.c +f:drivers/thermal/imx_thermal.c +f:drivers/thermal/intel/Kconfig +f:drivers/thermal/intel/Makefile +f:drivers/thermal/intel/int340x_thermal/Kconfig +f:drivers/thermal/intel/int340x_thermal/Makefile +f:drivers/thermal/intel/int340x_thermal/acpi_thermal_rel.c +f:drivers/thermal/intel/int340x_thermal/acpi_thermal_rel.h +f:drivers/thermal/intel/int340x_thermal/int3400_thermal.c +f:drivers/thermal/intel/int340x_thermal/int3401_thermal.c +f:drivers/thermal/intel/int340x_thermal/int3402_thermal.c +f:drivers/thermal/intel/int340x_thermal/int3403_thermal.c +f:drivers/thermal/intel/int340x_thermal/int3406_thermal.c +f:drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c +f:drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.h +f:drivers/thermal/intel/int340x_thermal/platform_temperature_control.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_device.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_device.h +f:drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci_legacy.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_power_floor.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_wt_hint.c +f:drivers/thermal/intel/int340x_thermal/processor_thermal_wt_req.c +f:drivers/thermal/intel/intel_bxt_pmic_thermal.c +f:drivers/thermal/intel/intel_hfi.c +f:drivers/thermal/intel/intel_hfi.h +f:drivers/thermal/intel/intel_pch_thermal.c +f:drivers/thermal/intel/intel_powerclamp.c +f:drivers/thermal/intel/intel_quark_dts_thermal.c +f:drivers/thermal/intel/intel_soc_dts_iosf.c +f:drivers/thermal/intel/intel_soc_dts_iosf.h +f:drivers/thermal/intel/intel_soc_dts_thermal.c +f:drivers/thermal/intel/intel_tcc.c +f:drivers/thermal/intel/intel_tcc_cooling.c +f:drivers/thermal/intel/therm_throt.c +f:drivers/thermal/intel/thermal_interrupt.h +f:drivers/thermal/intel/x86_pkg_temp_thermal.c +f:drivers/thermal/k3_bandgap.c +f:drivers/thermal/k3_j72xx_bandgap.c +f:drivers/thermal/khadas_mcu_fan.c +f:drivers/thermal/kirkwood_thermal.c +f:drivers/thermal/loongson2_thermal.c +f:drivers/thermal/max77620_thermal.c +f:drivers/thermal/mediatek/Kconfig +f:drivers/thermal/mediatek/Makefile +f:drivers/thermal/mediatek/auxadc_thermal.c +f:drivers/thermal/mediatek/lvts_thermal.c +f:drivers/thermal/pcie_cooling.c +f:drivers/thermal/qcom/Kconfig +f:drivers/thermal/qcom/Makefile +f:drivers/thermal/qcom/lmh.c +f:drivers/thermal/qcom/qcom-spmi-adc-tm5.c +f:drivers/thermal/qcom/qcom-spmi-temp-alarm.c +f:drivers/thermal/qcom/tsens-8960.c +f:drivers/thermal/qcom/tsens-v0_1.c +f:drivers/thermal/qcom/tsens-v1.c +f:drivers/thermal/qcom/tsens-v2.c +f:drivers/thermal/qcom/tsens.c +f:drivers/thermal/qcom/tsens.h +f:drivers/thermal/qoriq_thermal.c +f:drivers/thermal/renesas/Kconfig +f:drivers/thermal/renesas/Makefile +f:drivers/thermal/renesas/rcar_gen3_thermal.c +f:drivers/thermal/renesas/rcar_thermal.c +f:drivers/thermal/renesas/rzg2l_thermal.c +f:drivers/thermal/rockchip_thermal.c +f:drivers/thermal/samsung/Kconfig +f:drivers/thermal/samsung/Makefile +f:drivers/thermal/samsung/exynos_tmu.c +f:drivers/thermal/spear_thermal.c +f:drivers/thermal/sprd_thermal.c +f:drivers/thermal/st/Kconfig +f:drivers/thermal/st/Makefile +f:drivers/thermal/st/st_thermal.c +f:drivers/thermal/st/st_thermal.h +f:drivers/thermal/st/st_thermal_memmap.c +f:drivers/thermal/st/stm_thermal.c +f:drivers/thermal/sun8i_thermal.c +f:drivers/thermal/tegra/Kconfig +f:drivers/thermal/tegra/Makefile +f:drivers/thermal/tegra/soctherm-fuse.c +f:drivers/thermal/tegra/soctherm.c +f:drivers/thermal/tegra/soctherm.h +f:drivers/thermal/tegra/tegra-bpmp-thermal.c +f:drivers/thermal/tegra/tegra124-soctherm.c +f:drivers/thermal/tegra/tegra132-soctherm.c +f:drivers/thermal/tegra/tegra210-soctherm.c +f:drivers/thermal/tegra/tegra30-tsensor.c +f:drivers/thermal/testing/Makefile +f:drivers/thermal/testing/command.c +f:drivers/thermal/testing/thermal_testing.h +f:drivers/thermal/testing/zone.c +f:drivers/thermal/thermal-generic-adc.c +f:drivers/thermal/thermal_core.c +f:drivers/thermal/thermal_core.h +f:drivers/thermal/thermal_debugfs.c +f:drivers/thermal/thermal_debugfs.h +f:drivers/thermal/thermal_helpers.c +f:drivers/thermal/thermal_hwmon.c +f:drivers/thermal/thermal_hwmon.h +f:drivers/thermal/thermal_mmio.c +f:drivers/thermal/thermal_netlink.c +f:drivers/thermal/thermal_netlink.h +f:drivers/thermal/thermal_of.c +f:drivers/thermal/thermal_sysfs.c +f:drivers/thermal/thermal_thresholds.c +f:drivers/thermal/thermal_thresholds.h +f:drivers/thermal/thermal_trace.h +f:drivers/thermal/thermal_trace_ipa.h +f:drivers/thermal/thermal_trip.c +f:drivers/thermal/ti-soc-thermal/Kconfig +f:drivers/thermal/ti-soc-thermal/Makefile +f:drivers/thermal/ti-soc-thermal/TODO +f:drivers/thermal/ti-soc-thermal/dra752-bandgap.h +f:drivers/thermal/ti-soc-thermal/dra752-thermal-data.c +f:drivers/thermal/ti-soc-thermal/omap3-thermal-data.c +f:drivers/thermal/ti-soc-thermal/omap4-thermal-data.c +f:drivers/thermal/ti-soc-thermal/omap4xxx-bandgap.h +f:drivers/thermal/ti-soc-thermal/omap5-thermal-data.c +f:drivers/thermal/ti-soc-thermal/omap5xxx-bandgap.h +f:drivers/thermal/ti-soc-thermal/ti-bandgap.c +f:drivers/thermal/ti-soc-thermal/ti-bandgap.h +f:drivers/thermal/ti-soc-thermal/ti-thermal-common.c +f:drivers/thermal/ti-soc-thermal/ti-thermal.h +f:drivers/thermal/uniphier_thermal.c +f:drivers/thunderbolt/Kconfig +f:drivers/thunderbolt/Makefile +f:drivers/thunderbolt/acpi.c +f:drivers/thunderbolt/cap.c +f:drivers/thunderbolt/clx.c +f:drivers/thunderbolt/ctl.c +f:drivers/thunderbolt/ctl.h +f:drivers/thunderbolt/debugfs.c +f:drivers/thunderbolt/dma_port.c +f:drivers/thunderbolt/dma_port.h +f:drivers/thunderbolt/dma_test.c +f:drivers/thunderbolt/domain.c +f:drivers/thunderbolt/eeprom.c +f:drivers/thunderbolt/icm.c +f:drivers/thunderbolt/lc.c +f:drivers/thunderbolt/nhi.c +f:drivers/thunderbolt/nhi.h +f:drivers/thunderbolt/nhi_ops.c +f:drivers/thunderbolt/nhi_regs.h +f:drivers/thunderbolt/nvm.c +f:drivers/thunderbolt/path.c +f:drivers/thunderbolt/property.c +f:drivers/thunderbolt/quirks.c +f:drivers/thunderbolt/retimer.c +f:drivers/thunderbolt/sb_regs.h +f:drivers/thunderbolt/switch.c +f:drivers/thunderbolt/tb.c +f:drivers/thunderbolt/tb.h +f:drivers/thunderbolt/tb_msgs.h +f:drivers/thunderbolt/tb_regs.h +f:drivers/thunderbolt/test.c +f:drivers/thunderbolt/tmu.c +f:drivers/thunderbolt/trace.h +f:drivers/thunderbolt/tunnel.c +f:drivers/thunderbolt/tunnel.h +f:drivers/thunderbolt/usb4.c +f:drivers/thunderbolt/usb4_port.c +f:drivers/thunderbolt/xdomain.c +f:drivers/tty/Kconfig +f:drivers/tty/Makefile +f:drivers/tty/amiserial.c +f:drivers/tty/ehv_bytechan.c +f:drivers/tty/goldfish.c +f:drivers/tty/hvc/Kconfig +f:drivers/tty/hvc/Makefile +f:drivers/tty/hvc/hvc_console.c +f:drivers/tty/hvc/hvc_console.h +f:drivers/tty/hvc/hvc_dcc.c +f:drivers/tty/hvc/hvc_irq.c +f:drivers/tty/hvc/hvc_iucv.c +f:drivers/tty/hvc/hvc_opal.c +f:drivers/tty/hvc/hvc_riscv_sbi.c +f:drivers/tty/hvc/hvc_rtas.c +f:drivers/tty/hvc/hvc_udbg.c +f:drivers/tty/hvc/hvc_vio.c +f:drivers/tty/hvc/hvc_xen.c +f:drivers/tty/hvc/hvcs.c +f:drivers/tty/hvc/hvsi.c +f:drivers/tty/hvc/hvsi_lib.c +f:drivers/tty/ipwireless/Makefile +f:drivers/tty/ipwireless/hardware.c +f:drivers/tty/ipwireless/hardware.h +f:drivers/tty/ipwireless/main.c +f:drivers/tty/ipwireless/main.h +f:drivers/tty/ipwireless/network.c +f:drivers/tty/ipwireless/network.h +f:drivers/tty/ipwireless/setup_protocol.h +f:drivers/tty/ipwireless/tty.c +f:drivers/tty/ipwireless/tty.h +f:drivers/tty/mips_ejtag_fdc.c +f:drivers/tty/moxa.c +f:drivers/tty/mxser.c +f:drivers/tty/n_gsm.c +f:drivers/tty/n_hdlc.c +f:drivers/tty/n_null.c +f:drivers/tty/n_tty.c +f:drivers/tty/nozomi.c +f:drivers/tty/pty.c +f:drivers/tty/rpmsg_tty.c +f:drivers/tty/serdev/Kconfig +f:drivers/tty/serdev/Makefile +f:drivers/tty/serdev/core.c +f:drivers/tty/serdev/serdev-ttyport.c +f:drivers/tty/serial/21285.c +f:drivers/tty/serial/8250/8250.h +f:drivers/tty/serial/8250/8250_accent.c +f:drivers/tty/serial/8250/8250_acorn.c +f:drivers/tty/serial/8250/8250_aspeed_vuart.c +f:drivers/tty/serial/8250/8250_bcm2835aux.c +f:drivers/tty/serial/8250/8250_bcm7271.c +f:drivers/tty/serial/8250/8250_boca.c +f:drivers/tty/serial/8250/8250_ce4100.c +f:drivers/tty/serial/8250/8250_core.c +f:drivers/tty/serial/8250/8250_dfl.c +f:drivers/tty/serial/8250/8250_dma.c +f:drivers/tty/serial/8250/8250_dw.c +f:drivers/tty/serial/8250/8250_dwlib.c +f:drivers/tty/serial/8250/8250_dwlib.h +f:drivers/tty/serial/8250/8250_early.c +f:drivers/tty/serial/8250/8250_em.c +f:drivers/tty/serial/8250/8250_exar.c +f:drivers/tty/serial/8250/8250_exar_st16c554.c +f:drivers/tty/serial/8250/8250_fintek.c +f:drivers/tty/serial/8250/8250_fourport.c +f:drivers/tty/serial/8250/8250_fsl.c +f:drivers/tty/serial/8250/8250_hp300.c +f:drivers/tty/serial/8250/8250_hub6.c +f:drivers/tty/serial/8250/8250_ingenic.c +f:drivers/tty/serial/8250/8250_ioc3.c +f:drivers/tty/serial/8250/8250_lpc18xx.c +f:drivers/tty/serial/8250/8250_lpss.c +f:drivers/tty/serial/8250/8250_men_mcb.c +f:drivers/tty/serial/8250/8250_mid.c +f:drivers/tty/serial/8250/8250_mtk.c +f:drivers/tty/serial/8250/8250_ni.c +f:drivers/tty/serial/8250/8250_of.c +f:drivers/tty/serial/8250/8250_omap.c +f:drivers/tty/serial/8250/8250_parisc.c +f:drivers/tty/serial/8250/8250_pci.c +f:drivers/tty/serial/8250/8250_pci1xxxx.c +f:drivers/tty/serial/8250/8250_pcilib.c +f:drivers/tty/serial/8250/8250_pcilib.h +f:drivers/tty/serial/8250/8250_pericom.c +f:drivers/tty/serial/8250/8250_platform.c +f:drivers/tty/serial/8250/8250_pnp.c +f:drivers/tty/serial/8250/8250_port.c +f:drivers/tty/serial/8250/8250_pxa.c +f:drivers/tty/serial/8250/8250_rsa.c +f:drivers/tty/serial/8250/8250_rt288x.c +f:drivers/tty/serial/8250/8250_tegra.c +f:drivers/tty/serial/8250/8250_uniphier.c +f:drivers/tty/serial/8250/Kconfig +f:drivers/tty/serial/8250/Makefile +f:drivers/tty/serial/8250/serial_cs.c +f:drivers/tty/serial/Kconfig +f:drivers/tty/serial/Makefile +f:drivers/tty/serial/altera_jtaguart.c +f:drivers/tty/serial/altera_uart.c +f:drivers/tty/serial/amba-pl010.c +f:drivers/tty/serial/amba-pl011.c +f:drivers/tty/serial/apbuart.c +f:drivers/tty/serial/apbuart.h +f:drivers/tty/serial/ar933x_uart.c +f:drivers/tty/serial/arc_uart.c +f:drivers/tty/serial/atmel_serial.c +f:drivers/tty/serial/atmel_serial.h +f:drivers/tty/serial/bcm63xx_uart.c +f:drivers/tty/serial/clps711x.c +f:drivers/tty/serial/cpm_uart.c +f:drivers/tty/serial/cpm_uart.h +f:drivers/tty/serial/digicolor-usart.c +f:drivers/tty/serial/dz.c +f:drivers/tty/serial/dz.h +f:drivers/tty/serial/earlycon-riscv-sbi.c +f:drivers/tty/serial/earlycon-semihost.c +f:drivers/tty/serial/earlycon.c +f:drivers/tty/serial/esp32_acm.c +f:drivers/tty/serial/esp32_uart.c +f:drivers/tty/serial/fsl_linflexuart.c +f:drivers/tty/serial/fsl_lpuart.c +f:drivers/tty/serial/icom.c +f:drivers/tty/serial/imx.c +f:drivers/tty/serial/imx_earlycon.c +f:drivers/tty/serial/ip22zilog.c +f:drivers/tty/serial/ip22zilog.h +f:drivers/tty/serial/jsm/Makefile +f:drivers/tty/serial/jsm/jsm.h +f:drivers/tty/serial/jsm/jsm_cls.c +f:drivers/tty/serial/jsm/jsm_driver.c +f:drivers/tty/serial/jsm/jsm_neo.c +f:drivers/tty/serial/jsm/jsm_tty.c +f:drivers/tty/serial/kgdboc.c +f:drivers/tty/serial/lantiq.c +f:drivers/tty/serial/liteuart.c +f:drivers/tty/serial/lpc32xx_hs.c +f:drivers/tty/serial/ma35d1_serial.c +f:drivers/tty/serial/max3100.c +f:drivers/tty/serial/max310x.c +f:drivers/tty/serial/mcf.c +f:drivers/tty/serial/men_z135_uart.c +f:drivers/tty/serial/meson_uart.c +f:drivers/tty/serial/milbeaut_usio.c +f:drivers/tty/serial/mpc52xx_uart.c +f:drivers/tty/serial/mps2-uart.c +f:drivers/tty/serial/msm_serial.c +f:drivers/tty/serial/mux.c +f:drivers/tty/serial/mvebu-uart.c +f:drivers/tty/serial/mxs-auart.c +f:drivers/tty/serial/omap-serial.c +f:drivers/tty/serial/owl-uart.c +f:drivers/tty/serial/pch_uart.c +f:drivers/tty/serial/pic32_uart.c +f:drivers/tty/serial/pmac_zilog.c +f:drivers/tty/serial/pmac_zilog.h +f:drivers/tty/serial/pxa.c +f:drivers/tty/serial/qcom_geni_serial.c +f:drivers/tty/serial/rda-uart.c +f:drivers/tty/serial/rp2.c +f:drivers/tty/serial/rsci.c +f:drivers/tty/serial/rsci.h +f:drivers/tty/serial/sa1100.c +f:drivers/tty/serial/samsung_tty.c +f:drivers/tty/serial/sb1250-duart.c +f:drivers/tty/serial/sc16is7xx.c +f:drivers/tty/serial/sc16is7xx.h +f:drivers/tty/serial/sc16is7xx_i2c.c +f:drivers/tty/serial/sc16is7xx_spi.c +f:drivers/tty/serial/sccnxp.c +f:drivers/tty/serial/serial-tegra.c +f:drivers/tty/serial/serial_base.h +f:drivers/tty/serial/serial_base_bus.c +f:drivers/tty/serial/serial_core.c +f:drivers/tty/serial/serial_ctrl.c +f:drivers/tty/serial/serial_mctrl_gpio.c +f:drivers/tty/serial/serial_mctrl_gpio.h +f:drivers/tty/serial/serial_port.c +f:drivers/tty/serial/serial_txx9.c +f:drivers/tty/serial/sh-sci-common.h +f:drivers/tty/serial/sh-sci.c +f:drivers/tty/serial/sh-sci.h +f:drivers/tty/serial/sifive.c +f:drivers/tty/serial/sprd_serial.c +f:drivers/tty/serial/st-asc.c +f:drivers/tty/serial/stm32-usart.c +f:drivers/tty/serial/stm32-usart.h +f:drivers/tty/serial/suncore.c +f:drivers/tty/serial/sunhv.c +f:drivers/tty/serial/sunplus-uart.c +f:drivers/tty/serial/sunsab.c +f:drivers/tty/serial/sunsab.h +f:drivers/tty/serial/sunsu.c +f:drivers/tty/serial/sunzilog.c +f:drivers/tty/serial/sunzilog.h +f:drivers/tty/serial/tegra-tcu.c +f:drivers/tty/serial/tegra-utc.c +f:drivers/tty/serial/timbuart.c +f:drivers/tty/serial/timbuart.h +f:drivers/tty/serial/uartlite.c +f:drivers/tty/serial/ucc_uart.c +f:drivers/tty/serial/vt8500_serial.c +f:drivers/tty/serial/xilinx_uartps.c +f:drivers/tty/serial/zs.c +f:drivers/tty/serial/zs.h +f:drivers/tty/synclink_gt.c +f:drivers/tty/sysrq.c +f:drivers/tty/tty.h +f:drivers/tty/tty_audit.c +f:drivers/tty/tty_baudrate.c +f:drivers/tty/tty_buffer.c +f:drivers/tty/tty_io.c +f:drivers/tty/tty_ioctl.c +f:drivers/tty/tty_jobctrl.c +f:drivers/tty/tty_ldisc.c +f:drivers/tty/tty_ldsem.c +f:drivers/tty/tty_mutex.c +f:drivers/tty/tty_port.c +f:drivers/tty/ttynull.c +f:drivers/tty/vcc.c +f:drivers/tty/vt/.gitignore +f:drivers/tty/vt/Makefile +f:drivers/tty/vt/conmakehash.c +f:drivers/tty/vt/consolemap.c +f:drivers/tty/vt/cp437.uni +f:drivers/tty/vt/defkeymap.c_shipped +f:drivers/tty/vt/defkeymap.map +f:drivers/tty/vt/gen_ucs_fallback_table.py +f:drivers/tty/vt/gen_ucs_recompose_table.py +f:drivers/tty/vt/gen_ucs_width_table.py +f:drivers/tty/vt/keyboard.c +f:drivers/tty/vt/selection.c +f:drivers/tty/vt/ucs.c +f:drivers/tty/vt/ucs_fallback_table.h_shipped +f:drivers/tty/vt/ucs_recompose_table.h_shipped +f:drivers/tty/vt/ucs_width_table.h_shipped +f:drivers/tty/vt/vc_screen.c +f:drivers/tty/vt/vt.c +f:drivers/tty/vt/vt_ioctl.c +f:drivers/ufs/Kconfig +f:drivers/ufs/Makefile +f:drivers/ufs/core/Kconfig +f:drivers/ufs/core/Makefile +f:drivers/ufs/core/ufs-debugfs.c +f:drivers/ufs/core/ufs-debugfs.h +f:drivers/ufs/core/ufs-fault-injection.c +f:drivers/ufs/core/ufs-fault-injection.h +f:drivers/ufs/core/ufs-hwmon.c +f:drivers/ufs/core/ufs-mcq.c +f:drivers/ufs/core/ufs-sysfs.c +f:drivers/ufs/core/ufs-sysfs.h +f:drivers/ufs/core/ufs_bsg.c +f:drivers/ufs/core/ufs_bsg.h +f:drivers/ufs/core/ufs_trace.h +f:drivers/ufs/core/ufshcd-crypto.c +f:drivers/ufs/core/ufshcd-crypto.h +f:drivers/ufs/core/ufshcd-priv.h +f:drivers/ufs/core/ufshcd.c +f:drivers/ufs/host/Kconfig +f:drivers/ufs/host/Makefile +f:drivers/ufs/host/cdns-pltfrm.c +f:drivers/ufs/host/tc-dwc-g210-pci.c +f:drivers/ufs/host/tc-dwc-g210-pltfrm.c +f:drivers/ufs/host/tc-dwc-g210.c +f:drivers/ufs/host/tc-dwc-g210.h +f:drivers/ufs/host/ti-j721e-ufs.c +f:drivers/ufs/host/ufs-exynos.c +f:drivers/ufs/host/ufs-exynos.h +f:drivers/ufs/host/ufs-hisi.c +f:drivers/ufs/host/ufs-hisi.h +f:drivers/ufs/host/ufs-mediatek-sip.h +f:drivers/ufs/host/ufs-mediatek-trace.h +f:drivers/ufs/host/ufs-mediatek.c +f:drivers/ufs/host/ufs-mediatek.h +f:drivers/ufs/host/ufs-qcom.c +f:drivers/ufs/host/ufs-qcom.h +f:drivers/ufs/host/ufs-renesas.c +f:drivers/ufs/host/ufs-rockchip.c +f:drivers/ufs/host/ufs-rockchip.h +f:drivers/ufs/host/ufs-sprd.c +f:drivers/ufs/host/ufs-sprd.h +f:drivers/ufs/host/ufshcd-dwc.c +f:drivers/ufs/host/ufshcd-dwc.h +f:drivers/ufs/host/ufshcd-pci.c +f:drivers/ufs/host/ufshcd-pltfrm.c +f:drivers/ufs/host/ufshcd-pltfrm.h +f:drivers/ufs/host/ufshci-dwc.h +f:drivers/uio/Kconfig +f:drivers/uio/Makefile +f:drivers/uio/uio.c +f:drivers/uio/uio_aec.c +f:drivers/uio/uio_cif.c +f:drivers/uio/uio_dfl.c +f:drivers/uio/uio_dmem_genirq.c +f:drivers/uio/uio_fsl_elbc_gpcm.c +f:drivers/uio/uio_hv_generic.c +f:drivers/uio/uio_mf624.c +f:drivers/uio/uio_netx.c +f:drivers/uio/uio_pci_generic.c +f:drivers/uio/uio_pdrv_genirq.c +f:drivers/uio/uio_sercos3.c +f:drivers/usb/Kconfig +f:drivers/usb/Makefile +f:drivers/usb/atm/Kconfig +f:drivers/usb/atm/Makefile +f:drivers/usb/atm/cxacru.c +f:drivers/usb/atm/speedtch.c +f:drivers/usb/atm/ueagle-atm.c +f:drivers/usb/atm/usbatm.c +f:drivers/usb/atm/usbatm.h +f:drivers/usb/atm/xusbatm.c +f:drivers/usb/c67x00/Makefile +f:drivers/usb/c67x00/c67x00-drv.c +f:drivers/usb/c67x00/c67x00-hcd.c +f:drivers/usb/c67x00/c67x00-hcd.h +f:drivers/usb/c67x00/c67x00-ll-hpi.c +f:drivers/usb/c67x00/c67x00-sched.c +f:drivers/usb/c67x00/c67x00.h +f:drivers/usb/cdns3/Kconfig +f:drivers/usb/cdns3/Makefile +f:drivers/usb/cdns3/cdns3-debug.h +f:drivers/usb/cdns3/cdns3-ep0.c +f:drivers/usb/cdns3/cdns3-gadget.c +f:drivers/usb/cdns3/cdns3-gadget.h +f:drivers/usb/cdns3/cdns3-imx.c +f:drivers/usb/cdns3/cdns3-pci-wrap.c +f:drivers/usb/cdns3/cdns3-plat.c +f:drivers/usb/cdns3/cdns3-starfive.c +f:drivers/usb/cdns3/cdns3-ti.c +f:drivers/usb/cdns3/cdns3-trace.c +f:drivers/usb/cdns3/cdns3-trace.h +f:drivers/usb/cdns3/cdnsp-debug.h +f:drivers/usb/cdns3/cdnsp-ep0.c +f:drivers/usb/cdns3/cdnsp-gadget.c +f:drivers/usb/cdns3/cdnsp-gadget.h +f:drivers/usb/cdns3/cdnsp-mem.c +f:drivers/usb/cdns3/cdnsp-pci.c +f:drivers/usb/cdns3/cdnsp-ring.c +f:drivers/usb/cdns3/cdnsp-trace.c +f:drivers/usb/cdns3/cdnsp-trace.h +f:drivers/usb/cdns3/core.c +f:drivers/usb/cdns3/core.h +f:drivers/usb/cdns3/drd.c +f:drivers/usb/cdns3/drd.h +f:drivers/usb/cdns3/gadget-export.h +f:drivers/usb/cdns3/host-export.h +f:drivers/usb/cdns3/host.c +f:drivers/usb/chipidea/Kconfig +f:drivers/usb/chipidea/Makefile +f:drivers/usb/chipidea/bits.h +f:drivers/usb/chipidea/ci.h +f:drivers/usb/chipidea/ci_hdrc_imx.c +f:drivers/usb/chipidea/ci_hdrc_imx.h +f:drivers/usb/chipidea/ci_hdrc_msm.c +f:drivers/usb/chipidea/ci_hdrc_npcm.c +f:drivers/usb/chipidea/ci_hdrc_pci.c +f:drivers/usb/chipidea/ci_hdrc_tegra.c +f:drivers/usb/chipidea/ci_hdrc_usb2.c +f:drivers/usb/chipidea/core.c +f:drivers/usb/chipidea/debug.c +f:drivers/usb/chipidea/host.c +f:drivers/usb/chipidea/host.h +f:drivers/usb/chipidea/otg.c +f:drivers/usb/chipidea/otg.h +f:drivers/usb/chipidea/otg_fsm.c +f:drivers/usb/chipidea/otg_fsm.h +f:drivers/usb/chipidea/trace.c +f:drivers/usb/chipidea/trace.h +f:drivers/usb/chipidea/udc.c +f:drivers/usb/chipidea/udc.h +f:drivers/usb/chipidea/ulpi.c +f:drivers/usb/chipidea/usbmisc_imx.c +f:drivers/usb/class/Kconfig +f:drivers/usb/class/Makefile +f:drivers/usb/class/cdc-acm.c +f:drivers/usb/class/cdc-acm.h +f:drivers/usb/class/cdc-wdm.c +f:drivers/usb/class/usblp.c +f:drivers/usb/class/usbtmc.c +f:drivers/usb/common/Kconfig +f:drivers/usb/common/Makefile +f:drivers/usb/common/common.c +f:drivers/usb/common/common.h +f:drivers/usb/common/debug.c +f:drivers/usb/common/led.c +f:drivers/usb/common/ulpi.c +f:drivers/usb/common/usb-conn-gpio.c +f:drivers/usb/common/usb-otg-fsm.c +f:drivers/usb/core/Kconfig +f:drivers/usb/core/Makefile +f:drivers/usb/core/buffer.c +f:drivers/usb/core/config.c +f:drivers/usb/core/devices.c +f:drivers/usb/core/devio.c +f:drivers/usb/core/driver.c +f:drivers/usb/core/endpoint.c +f:drivers/usb/core/file.c +f:drivers/usb/core/generic.c +f:drivers/usb/core/hcd-pci.c +f:drivers/usb/core/hcd.c +f:drivers/usb/core/hub.c +f:drivers/usb/core/hub.h +f:drivers/usb/core/ledtrig-usbport.c +f:drivers/usb/core/message.c +f:drivers/usb/core/notify.c +f:drivers/usb/core/of.c +f:drivers/usb/core/otg_productlist.h +f:drivers/usb/core/phy.c +f:drivers/usb/core/phy.h +f:drivers/usb/core/port.c +f:drivers/usb/core/quirks.c +f:drivers/usb/core/sysfs.c +f:drivers/usb/core/urb.c +f:drivers/usb/core/usb-acpi.c +f:drivers/usb/core/usb.c +f:drivers/usb/core/usb.h +f:drivers/usb/dwc2/Kconfig +f:drivers/usb/dwc2/Makefile +f:drivers/usb/dwc2/core.c +f:drivers/usb/dwc2/core.h +f:drivers/usb/dwc2/core_intr.c +f:drivers/usb/dwc2/debug.h +f:drivers/usb/dwc2/debugfs.c +f:drivers/usb/dwc2/drd.c +f:drivers/usb/dwc2/gadget.c +f:drivers/usb/dwc2/hcd.c +f:drivers/usb/dwc2/hcd.h +f:drivers/usb/dwc2/hcd_ddma.c +f:drivers/usb/dwc2/hcd_intr.c +f:drivers/usb/dwc2/hcd_queue.c +f:drivers/usb/dwc2/hw.h +f:drivers/usb/dwc2/params.c +f:drivers/usb/dwc2/pci.c +f:drivers/usb/dwc2/platform.c +f:drivers/usb/dwc3/Kconfig +f:drivers/usb/dwc3/Makefile +f:drivers/usb/dwc3/core.c +f:drivers/usb/dwc3/core.h +f:drivers/usb/dwc3/debug.h +f:drivers/usb/dwc3/debugfs.c +f:drivers/usb/dwc3/drd.c +f:drivers/usb/dwc3/dwc3-am62.c +f:drivers/usb/dwc3/dwc3-exynos.c +f:drivers/usb/dwc3/dwc3-haps.c +f:drivers/usb/dwc3/dwc3-imx8mp.c +f:drivers/usb/dwc3/dwc3-keystone.c +f:drivers/usb/dwc3/dwc3-meson-g12a.c +f:drivers/usb/dwc3/dwc3-octeon.c +f:drivers/usb/dwc3/dwc3-of-simple.c +f:drivers/usb/dwc3/dwc3-omap.c +f:drivers/usb/dwc3/dwc3-pci.c +f:drivers/usb/dwc3/dwc3-qcom-legacy.c +f:drivers/usb/dwc3/dwc3-qcom.c +f:drivers/usb/dwc3/dwc3-rtk.c +f:drivers/usb/dwc3/dwc3-st.c +f:drivers/usb/dwc3/dwc3-xilinx.c +f:drivers/usb/dwc3/ep0.c +f:drivers/usb/dwc3/gadget.c +f:drivers/usb/dwc3/gadget.h +f:drivers/usb/dwc3/glue.h +f:drivers/usb/dwc3/host.c +f:drivers/usb/dwc3/io.h +f:drivers/usb/dwc3/trace.c +f:drivers/usb/dwc3/trace.h +f:drivers/usb/dwc3/ulpi.c +f:drivers/usb/early/Makefile +f:drivers/usb/early/ehci-dbgp.c +f:drivers/usb/early/xhci-dbc.c +f:drivers/usb/early/xhci-dbc.h +f:drivers/usb/fotg210/Kconfig +f:drivers/usb/fotg210/Makefile +f:drivers/usb/fotg210/fotg210-core.c +f:drivers/usb/fotg210/fotg210-hcd.c +f:drivers/usb/fotg210/fotg210-hcd.h +f:drivers/usb/fotg210/fotg210-udc.c +f:drivers/usb/fotg210/fotg210-udc.h +f:drivers/usb/fotg210/fotg210.h +f:drivers/usb/gadget/Kconfig +f:drivers/usb/gadget/Makefile +f:drivers/usb/gadget/composite.c +f:drivers/usb/gadget/config.c +f:drivers/usb/gadget/configfs.c +f:drivers/usb/gadget/configfs.h +f:drivers/usb/gadget/epautoconf.c +f:drivers/usb/gadget/function/Makefile +f:drivers/usb/gadget/function/f_acm.c +f:drivers/usb/gadget/function/f_ecm.c +f:drivers/usb/gadget/function/f_eem.c +f:drivers/usb/gadget/function/f_fs.c +f:drivers/usb/gadget/function/f_hid.c +f:drivers/usb/gadget/function/f_loopback.c +f:drivers/usb/gadget/function/f_mass_storage.c +f:drivers/usb/gadget/function/f_mass_storage.h +f:drivers/usb/gadget/function/f_midi.c +f:drivers/usb/gadget/function/f_midi2.c +f:drivers/usb/gadget/function/f_ncm.c +f:drivers/usb/gadget/function/f_obex.c +f:drivers/usb/gadget/function/f_phonet.c +f:drivers/usb/gadget/function/f_printer.c +f:drivers/usb/gadget/function/f_rndis.c +f:drivers/usb/gadget/function/f_serial.c +f:drivers/usb/gadget/function/f_sourcesink.c +f:drivers/usb/gadget/function/f_subset.c +f:drivers/usb/gadget/function/f_tcm.c +f:drivers/usb/gadget/function/f_uac1.c +f:drivers/usb/gadget/function/f_uac1_legacy.c +f:drivers/usb/gadget/function/f_uac2.c +f:drivers/usb/gadget/function/f_uvc.c +f:drivers/usb/gadget/function/f_uvc.h +f:drivers/usb/gadget/function/g_zero.h +f:drivers/usb/gadget/function/ndis.h +f:drivers/usb/gadget/function/rndis.c +f:drivers/usb/gadget/function/rndis.h +f:drivers/usb/gadget/function/storage_common.c +f:drivers/usb/gadget/function/storage_common.h +f:drivers/usb/gadget/function/tcm.h +f:drivers/usb/gadget/function/u_audio.c +f:drivers/usb/gadget/function/u_audio.h +f:drivers/usb/gadget/function/u_ecm.h +f:drivers/usb/gadget/function/u_eem.h +f:drivers/usb/gadget/function/u_ether.c +f:drivers/usb/gadget/function/u_ether.h +f:drivers/usb/gadget/function/u_ether_configfs.h +f:drivers/usb/gadget/function/u_fs.h +f:drivers/usb/gadget/function/u_gether.h +f:drivers/usb/gadget/function/u_hid.h +f:drivers/usb/gadget/function/u_midi.h +f:drivers/usb/gadget/function/u_midi2.h +f:drivers/usb/gadget/function/u_ncm.h +f:drivers/usb/gadget/function/u_phonet.h +f:drivers/usb/gadget/function/u_printer.h +f:drivers/usb/gadget/function/u_rndis.h +f:drivers/usb/gadget/function/u_serial.c +f:drivers/usb/gadget/function/u_serial.h +f:drivers/usb/gadget/function/u_tcm.h +f:drivers/usb/gadget/function/u_uac1.h +f:drivers/usb/gadget/function/u_uac1_legacy.c +f:drivers/usb/gadget/function/u_uac1_legacy.h +f:drivers/usb/gadget/function/u_uac2.h +f:drivers/usb/gadget/function/u_uvc.h +f:drivers/usb/gadget/function/uac_common.h +f:drivers/usb/gadget/function/uvc.h +f:drivers/usb/gadget/function/uvc_configfs.c +f:drivers/usb/gadget/function/uvc_configfs.h +f:drivers/usb/gadget/function/uvc_queue.c +f:drivers/usb/gadget/function/uvc_queue.h +f:drivers/usb/gadget/function/uvc_trace.c +f:drivers/usb/gadget/function/uvc_trace.h +f:drivers/usb/gadget/function/uvc_v4l2.c +f:drivers/usb/gadget/function/uvc_v4l2.h +f:drivers/usb/gadget/function/uvc_video.c +f:drivers/usb/gadget/function/uvc_video.h +f:drivers/usb/gadget/functions.c +f:drivers/usb/gadget/legacy/Kconfig +f:drivers/usb/gadget/legacy/Makefile +f:drivers/usb/gadget/legacy/acm_ms.c +f:drivers/usb/gadget/legacy/audio.c +f:drivers/usb/gadget/legacy/cdc2.c +f:drivers/usb/gadget/legacy/dbgp.c +f:drivers/usb/gadget/legacy/ether.c +f:drivers/usb/gadget/legacy/g_ffs.c +f:drivers/usb/gadget/legacy/gmidi.c +f:drivers/usb/gadget/legacy/hid.c +f:drivers/usb/gadget/legacy/inode.c +f:drivers/usb/gadget/legacy/mass_storage.c +f:drivers/usb/gadget/legacy/multi.c +f:drivers/usb/gadget/legacy/ncm.c +f:drivers/usb/gadget/legacy/nokia.c +f:drivers/usb/gadget/legacy/printer.c +f:drivers/usb/gadget/legacy/raw_gadget.c +f:drivers/usb/gadget/legacy/serial.c +f:drivers/usb/gadget/legacy/tcm_usb_gadget.c +f:drivers/usb/gadget/legacy/webcam.c +f:drivers/usb/gadget/legacy/zero.c +f:drivers/usb/gadget/u_f.c +f:drivers/usb/gadget/u_os_desc.h +f:drivers/usb/gadget/udc/Kconfig +f:drivers/usb/gadget/udc/Makefile +f:drivers/usb/gadget/udc/amd5536udc.h +f:drivers/usb/gadget/udc/amd5536udc_pci.c +f:drivers/usb/gadget/udc/aspeed-vhub/Kconfig +f:drivers/usb/gadget/udc/aspeed-vhub/Makefile +f:drivers/usb/gadget/udc/aspeed-vhub/core.c +f:drivers/usb/gadget/udc/aspeed-vhub/dev.c +f:drivers/usb/gadget/udc/aspeed-vhub/ep0.c +f:drivers/usb/gadget/udc/aspeed-vhub/epn.c +f:drivers/usb/gadget/udc/aspeed-vhub/hub.c +f:drivers/usb/gadget/udc/aspeed-vhub/vhub.h +f:drivers/usb/gadget/udc/aspeed_udc.c +f:drivers/usb/gadget/udc/at91_udc.c +f:drivers/usb/gadget/udc/at91_udc.h +f:drivers/usb/gadget/udc/atmel_usba_udc.c +f:drivers/usb/gadget/udc/atmel_usba_udc.h +f:drivers/usb/gadget/udc/bcm63xx_udc.c +f:drivers/usb/gadget/udc/bdc/Kconfig +f:drivers/usb/gadget/udc/bdc/Makefile +f:drivers/usb/gadget/udc/bdc/bdc.h +f:drivers/usb/gadget/udc/bdc/bdc_cmd.c +f:drivers/usb/gadget/udc/bdc/bdc_cmd.h +f:drivers/usb/gadget/udc/bdc/bdc_core.c +f:drivers/usb/gadget/udc/bdc/bdc_dbg.c +f:drivers/usb/gadget/udc/bdc/bdc_dbg.h +f:drivers/usb/gadget/udc/bdc/bdc_ep.c +f:drivers/usb/gadget/udc/bdc/bdc_ep.h +f:drivers/usb/gadget/udc/bdc/bdc_udc.c +f:drivers/usb/gadget/udc/cdns2/Kconfig +f:drivers/usb/gadget/udc/cdns2/Makefile +f:drivers/usb/gadget/udc/cdns2/cdns2-debug.h +f:drivers/usb/gadget/udc/cdns2/cdns2-ep0.c +f:drivers/usb/gadget/udc/cdns2/cdns2-gadget.c +f:drivers/usb/gadget/udc/cdns2/cdns2-gadget.h +f:drivers/usb/gadget/udc/cdns2/cdns2-pci.c +f:drivers/usb/gadget/udc/cdns2/cdns2-trace.c +f:drivers/usb/gadget/udc/cdns2/cdns2-trace.h +f:drivers/usb/gadget/udc/core.c +f:drivers/usb/gadget/udc/dummy_hcd.c +f:drivers/usb/gadget/udc/fsl_qe_udc.c +f:drivers/usb/gadget/udc/fsl_qe_udc.h +f:drivers/usb/gadget/udc/fsl_udc_core.c +f:drivers/usb/gadget/udc/fsl_usb2_udc.h +f:drivers/usb/gadget/udc/goku_udc.c +f:drivers/usb/gadget/udc/goku_udc.h +f:drivers/usb/gadget/udc/gr_udc.c +f:drivers/usb/gadget/udc/gr_udc.h +f:drivers/usb/gadget/udc/lpc32xx_udc.c +f:drivers/usb/gadget/udc/m66592-udc.c +f:drivers/usb/gadget/udc/m66592-udc.h +f:drivers/usb/gadget/udc/max3420_udc.c +f:drivers/usb/gadget/udc/net2280.c +f:drivers/usb/gadget/udc/net2280.h +f:drivers/usb/gadget/udc/omap_udc.c +f:drivers/usb/gadget/udc/omap_udc.h +f:drivers/usb/gadget/udc/pch_udc.c +f:drivers/usb/gadget/udc/pxa25x_udc.c +f:drivers/usb/gadget/udc/pxa25x_udc.h +f:drivers/usb/gadget/udc/pxa27x_udc.c +f:drivers/usb/gadget/udc/pxa27x_udc.h +f:drivers/usb/gadget/udc/r8a66597-udc.c +f:drivers/usb/gadget/udc/r8a66597-udc.h +f:drivers/usb/gadget/udc/renesas_usb3.c +f:drivers/usb/gadget/udc/renesas_usbf.c +f:drivers/usb/gadget/udc/rzv2m_usb3drd.c +f:drivers/usb/gadget/udc/snps_udc_core.c +f:drivers/usb/gadget/udc/snps_udc_plat.c +f:drivers/usb/gadget/udc/tegra-xudc.c +f:drivers/usb/gadget/udc/trace.c +f:drivers/usb/gadget/udc/trace.h +f:drivers/usb/gadget/udc/udc-xilinx.c +f:drivers/usb/gadget/usbstring.c +f:drivers/usb/host/Kconfig +f:drivers/usb/host/Makefile +f:drivers/usb/host/bcma-hcd.c +f:drivers/usb/host/ehci-atmel.c +f:drivers/usb/host/ehci-brcm.c +f:drivers/usb/host/ehci-dbg.c +f:drivers/usb/host/ehci-exynos.c +f:drivers/usb/host/ehci-fsl.c +f:drivers/usb/host/ehci-fsl.h +f:drivers/usb/host/ehci-grlib.c +f:drivers/usb/host/ehci-hcd.c +f:drivers/usb/host/ehci-hub.c +f:drivers/usb/host/ehci-mem.c +f:drivers/usb/host/ehci-mv.c +f:drivers/usb/host/ehci-npcm7xx.c +f:drivers/usb/host/ehci-omap.c +f:drivers/usb/host/ehci-orion.c +f:drivers/usb/host/ehci-pci.c +f:drivers/usb/host/ehci-platform.c +f:drivers/usb/host/ehci-ppc-of.c +f:drivers/usb/host/ehci-ps3.c +f:drivers/usb/host/ehci-q.c +f:drivers/usb/host/ehci-sched.c +f:drivers/usb/host/ehci-sh.c +f:drivers/usb/host/ehci-spear.c +f:drivers/usb/host/ehci-st.c +f:drivers/usb/host/ehci-sysfs.c +f:drivers/usb/host/ehci-timer.c +f:drivers/usb/host/ehci-xilinx-of.c +f:drivers/usb/host/ehci.h +f:drivers/usb/host/fhci-dbg.c +f:drivers/usb/host/fhci-hcd.c +f:drivers/usb/host/fhci-hub.c +f:drivers/usb/host/fhci-mem.c +f:drivers/usb/host/fhci-q.c +f:drivers/usb/host/fhci-sched.c +f:drivers/usb/host/fhci-tds.c +f:drivers/usb/host/fhci.h +f:drivers/usb/host/fsl-mph-dr-of.c +f:drivers/usb/host/isp116x-hcd.c +f:drivers/usb/host/isp116x.h +f:drivers/usb/host/isp1362-hcd.c +f:drivers/usb/host/isp1362.h +f:drivers/usb/host/max3421-hcd.c +f:drivers/usb/host/octeon-hcd.c +f:drivers/usb/host/octeon-hcd.h +f:drivers/usb/host/ohci-at91.c +f:drivers/usb/host/ohci-da8xx.c +f:drivers/usb/host/ohci-dbg.c +f:drivers/usb/host/ohci-exynos.c +f:drivers/usb/host/ohci-hcd.c +f:drivers/usb/host/ohci-hub.c +f:drivers/usb/host/ohci-mem.c +f:drivers/usb/host/ohci-nxp.c +f:drivers/usb/host/ohci-omap.c +f:drivers/usb/host/ohci-pci.c +f:drivers/usb/host/ohci-platform.c +f:drivers/usb/host/ohci-ppc-of.c +f:drivers/usb/host/ohci-ps3.c +f:drivers/usb/host/ohci-pxa27x.c +f:drivers/usb/host/ohci-q.c +f:drivers/usb/host/ohci-s3c2410.c +f:drivers/usb/host/ohci-sa1111.c +f:drivers/usb/host/ohci-sm501.c +f:drivers/usb/host/ohci-spear.c +f:drivers/usb/host/ohci-st.c +f:drivers/usb/host/ohci.h +f:drivers/usb/host/oxu210hp-hcd.c +f:drivers/usb/host/pci-quirks.c +f:drivers/usb/host/pci-quirks.h +f:drivers/usb/host/r8a66597-hcd.c +f:drivers/usb/host/r8a66597.h +f:drivers/usb/host/sl811-hcd.c +f:drivers/usb/host/sl811.h +f:drivers/usb/host/sl811_cs.c +f:drivers/usb/host/ssb-hcd.c +f:drivers/usb/host/uhci-debug.c +f:drivers/usb/host/uhci-grlib.c +f:drivers/usb/host/uhci-hcd.c +f:drivers/usb/host/uhci-hcd.h +f:drivers/usb/host/uhci-hub.c +f:drivers/usb/host/uhci-pci.c +f:drivers/usb/host/uhci-platform.c +f:drivers/usb/host/uhci-q.c +f:drivers/usb/host/xen-hcd.c +f:drivers/usb/host/xhci-caps.h +f:drivers/usb/host/xhci-dbg.c +f:drivers/usb/host/xhci-dbgcap.c +f:drivers/usb/host/xhci-dbgcap.h +f:drivers/usb/host/xhci-dbgtty.c +f:drivers/usb/host/xhci-debugfs.c +f:drivers/usb/host/xhci-debugfs.h +f:drivers/usb/host/xhci-ext-caps.c +f:drivers/usb/host/xhci-ext-caps.h +f:drivers/usb/host/xhci-histb.c +f:drivers/usb/host/xhci-hub.c +f:drivers/usb/host/xhci-mem.c +f:drivers/usb/host/xhci-mtk-sch.c +f:drivers/usb/host/xhci-mtk.c +f:drivers/usb/host/xhci-mtk.h +f:drivers/usb/host/xhci-mvebu.c +f:drivers/usb/host/xhci-mvebu.h +f:drivers/usb/host/xhci-pci-renesas.c +f:drivers/usb/host/xhci-pci.c +f:drivers/usb/host/xhci-pci.h +f:drivers/usb/host/xhci-plat.c +f:drivers/usb/host/xhci-plat.h +f:drivers/usb/host/xhci-port.h +f:drivers/usb/host/xhci-rcar.c +f:drivers/usb/host/xhci-ring.c +f:drivers/usb/host/xhci-rzv2m.c +f:drivers/usb/host/xhci-rzv2m.h +f:drivers/usb/host/xhci-sideband.c +f:drivers/usb/host/xhci-tegra.c +f:drivers/usb/host/xhci-trace.c +f:drivers/usb/host/xhci-trace.h +f:drivers/usb/host/xhci.c +f:drivers/usb/host/xhci.h +f:drivers/usb/image/Kconfig +f:drivers/usb/image/Makefile +f:drivers/usb/image/mdc800.c +f:drivers/usb/image/microtek.c +f:drivers/usb/image/microtek.h +f:drivers/usb/isp1760/Kconfig +f:drivers/usb/isp1760/Makefile +f:drivers/usb/isp1760/isp1760-core.c +f:drivers/usb/isp1760/isp1760-core.h +f:drivers/usb/isp1760/isp1760-hcd.c +f:drivers/usb/isp1760/isp1760-hcd.h +f:drivers/usb/isp1760/isp1760-if.c +f:drivers/usb/isp1760/isp1760-regs.h +f:drivers/usb/isp1760/isp1760-udc.c +f:drivers/usb/isp1760/isp1760-udc.h +f:drivers/usb/misc/Kconfig +f:drivers/usb/misc/Makefile +f:drivers/usb/misc/adutux.c +f:drivers/usb/misc/apple-mfi-fastcharge.c +f:drivers/usb/misc/appledisplay.c +f:drivers/usb/misc/brcmstb-usb-pinmap.c +f:drivers/usb/misc/chaoskey.c +f:drivers/usb/misc/cypress_cy7c63.c +f:drivers/usb/misc/cytherm.c +f:drivers/usb/misc/ehset.c +f:drivers/usb/misc/emi26.c +f:drivers/usb/misc/emi62.c +f:drivers/usb/misc/ezusb.c +f:drivers/usb/misc/idmouse.c +f:drivers/usb/misc/iowarrior.c +f:drivers/usb/misc/isight_firmware.c +f:drivers/usb/misc/ldusb.c +f:drivers/usb/misc/legousbtower.c +f:drivers/usb/misc/lvstest.c +f:drivers/usb/misc/onboard_usb_dev.c +f:drivers/usb/misc/onboard_usb_dev.h +f:drivers/usb/misc/onboard_usb_dev_pdevs.c +f:drivers/usb/misc/qcom_eud.c +f:drivers/usb/misc/sisusbvga/Kconfig +f:drivers/usb/misc/sisusbvga/Makefile +f:drivers/usb/misc/sisusbvga/sisusb.h +f:drivers/usb/misc/sisusbvga/sisusb_struct.h +f:drivers/usb/misc/sisusbvga/sisusb_tables.h +f:drivers/usb/misc/sisusbvga/sisusbvga.c +f:drivers/usb/misc/trancevibrator.c +f:drivers/usb/misc/usb-ljca.c +f:drivers/usb/misc/usb251xb.c +f:drivers/usb/misc/usb3503.c +f:drivers/usb/misc/usb4604.c +f:drivers/usb/misc/usblcd.c +f:drivers/usb/misc/usbsevseg.c +f:drivers/usb/misc/usbtest.c +f:drivers/usb/misc/uss720.c +f:drivers/usb/misc/yurex.c +f:drivers/usb/mon/Kconfig +f:drivers/usb/mon/Makefile +f:drivers/usb/mon/mon_bin.c +f:drivers/usb/mon/mon_main.c +f:drivers/usb/mon/mon_stat.c +f:drivers/usb/mon/mon_text.c +f:drivers/usb/mon/usb_mon.h +f:drivers/usb/mtu3/Kconfig +f:drivers/usb/mtu3/Makefile +f:drivers/usb/mtu3/mtu3.h +f:drivers/usb/mtu3/mtu3_core.c +f:drivers/usb/mtu3/mtu3_debug.h +f:drivers/usb/mtu3/mtu3_debugfs.c +f:drivers/usb/mtu3/mtu3_dr.c +f:drivers/usb/mtu3/mtu3_dr.h +f:drivers/usb/mtu3/mtu3_gadget.c +f:drivers/usb/mtu3/mtu3_gadget_ep0.c +f:drivers/usb/mtu3/mtu3_host.c +f:drivers/usb/mtu3/mtu3_hw_regs.h +f:drivers/usb/mtu3/mtu3_plat.c +f:drivers/usb/mtu3/mtu3_qmu.c +f:drivers/usb/mtu3/mtu3_qmu.h +f:drivers/usb/mtu3/mtu3_trace.c +f:drivers/usb/mtu3/mtu3_trace.h +f:drivers/usb/musb/Kconfig +f:drivers/usb/musb/Makefile +f:drivers/usb/musb/cppi_dma.h +f:drivers/usb/musb/da8xx.c +f:drivers/usb/musb/jz4740.c +f:drivers/usb/musb/mediatek.c +f:drivers/usb/musb/mpfs.c +f:drivers/usb/musb/musb_core.c +f:drivers/usb/musb/musb_core.h +f:drivers/usb/musb/musb_cppi41.c +f:drivers/usb/musb/musb_debug.h +f:drivers/usb/musb/musb_debugfs.c +f:drivers/usb/musb/musb_dma.h +f:drivers/usb/musb/musb_dsps.c +f:drivers/usb/musb/musb_gadget.c +f:drivers/usb/musb/musb_gadget.h +f:drivers/usb/musb/musb_gadget_ep0.c +f:drivers/usb/musb/musb_host.c +f:drivers/usb/musb/musb_host.h +f:drivers/usb/musb/musb_io.h +f:drivers/usb/musb/musb_regs.h +f:drivers/usb/musb/musb_trace.c +f:drivers/usb/musb/musb_trace.h +f:drivers/usb/musb/musb_virthub.c +f:drivers/usb/musb/musbhsdma.c +f:drivers/usb/musb/omap2430.c +f:drivers/usb/musb/omap2430.h +f:drivers/usb/musb/sunxi.c +f:drivers/usb/musb/tusb6010.c +f:drivers/usb/musb/tusb6010.h +f:drivers/usb/musb/tusb6010_omap.c +f:drivers/usb/musb/ux500.c +f:drivers/usb/musb/ux500_dma.c +f:drivers/usb/phy/Kconfig +f:drivers/usb/phy/Makefile +f:drivers/usb/phy/of.c +f:drivers/usb/phy/phy-ab8500-usb.c +f:drivers/usb/phy/phy-am335x-control.c +f:drivers/usb/phy/phy-am335x-control.h +f:drivers/usb/phy/phy-am335x.c +f:drivers/usb/phy/phy-fsl-usb.c +f:drivers/usb/phy/phy-fsl-usb.h +f:drivers/usb/phy/phy-generic.c +f:drivers/usb/phy/phy-generic.h +f:drivers/usb/phy/phy-gpio-vbus-usb.c +f:drivers/usb/phy/phy-isp1301.c +f:drivers/usb/phy/phy-keystone.c +f:drivers/usb/phy/phy-mv-usb.h +f:drivers/usb/phy/phy-mxs-usb.c +f:drivers/usb/phy/phy-omap-otg.c +f:drivers/usb/phy/phy-tahvo.c +f:drivers/usb/phy/phy-tegra-usb.c +f:drivers/usb/phy/phy-twl6030-usb.c +f:drivers/usb/phy/phy-ulpi-viewport.c +f:drivers/usb/phy/phy-ulpi.c +f:drivers/usb/phy/phy.c +f:drivers/usb/renesas_usbhs/Kconfig +f:drivers/usb/renesas_usbhs/Makefile +f:drivers/usb/renesas_usbhs/common.c +f:drivers/usb/renesas_usbhs/common.h +f:drivers/usb/renesas_usbhs/fifo.c +f:drivers/usb/renesas_usbhs/fifo.h +f:drivers/usb/renesas_usbhs/mod.c +f:drivers/usb/renesas_usbhs/mod.h +f:drivers/usb/renesas_usbhs/mod_gadget.c +f:drivers/usb/renesas_usbhs/mod_host.c +f:drivers/usb/renesas_usbhs/pipe.c +f:drivers/usb/renesas_usbhs/pipe.h +f:drivers/usb/renesas_usbhs/rcar2.c +f:drivers/usb/renesas_usbhs/rcar2.h +f:drivers/usb/renesas_usbhs/rcar3.c +f:drivers/usb/renesas_usbhs/rcar3.h +f:drivers/usb/renesas_usbhs/rza.c +f:drivers/usb/renesas_usbhs/rza.h +f:drivers/usb/renesas_usbhs/rza2.c +f:drivers/usb/roles/Kconfig +f:drivers/usb/roles/Makefile +f:drivers/usb/roles/class.c +f:drivers/usb/roles/intel-xhci-usb-role-switch.c +f:drivers/usb/serial/Kconfig +f:drivers/usb/serial/Makefile +f:drivers/usb/serial/Makefile-keyspan_pda_fw +f:drivers/usb/serial/aircable.c +f:drivers/usb/serial/ark3116.c +f:drivers/usb/serial/belkin_sa.c +f:drivers/usb/serial/belkin_sa.h +f:drivers/usb/serial/bus.c +f:drivers/usb/serial/ch341.c +f:drivers/usb/serial/console.c +f:drivers/usb/serial/cp210x.c +f:drivers/usb/serial/cyberjack.c +f:drivers/usb/serial/cypress_m8.c +f:drivers/usb/serial/cypress_m8.h +f:drivers/usb/serial/digi_acceleport.c +f:drivers/usb/serial/empeg.c +f:drivers/usb/serial/ezusb_convert.pl +f:drivers/usb/serial/f81232.c +f:drivers/usb/serial/f81534.c +f:drivers/usb/serial/ftdi_sio.c +f:drivers/usb/serial/ftdi_sio.h +f:drivers/usb/serial/ftdi_sio_ids.h +f:drivers/usb/serial/garmin_gps.c +f:drivers/usb/serial/generic.c +f:drivers/usb/serial/io_16654.h +f:drivers/usb/serial/io_edgeport.c +f:drivers/usb/serial/io_edgeport.h +f:drivers/usb/serial/io_ionsp.h +f:drivers/usb/serial/io_ti.c +f:drivers/usb/serial/io_ti.h +f:drivers/usb/serial/io_usbvend.h +f:drivers/usb/serial/ipaq.c +f:drivers/usb/serial/ipw.c +f:drivers/usb/serial/ir-usb.c +f:drivers/usb/serial/iuu_phoenix.c +f:drivers/usb/serial/iuu_phoenix.h +f:drivers/usb/serial/keyspan.c +f:drivers/usb/serial/keyspan_pda.c +f:drivers/usb/serial/keyspan_usa26msg.h +f:drivers/usb/serial/keyspan_usa28msg.h +f:drivers/usb/serial/keyspan_usa49msg.h +f:drivers/usb/serial/keyspan_usa67msg.h +f:drivers/usb/serial/keyspan_usa90msg.h +f:drivers/usb/serial/kl5kusb105.c +f:drivers/usb/serial/kl5kusb105.h +f:drivers/usb/serial/kobil_sct.c +f:drivers/usb/serial/kobil_sct.h +f:drivers/usb/serial/mct_u232.c +f:drivers/usb/serial/mct_u232.h +f:drivers/usb/serial/metro-usb.c +f:drivers/usb/serial/mos7720.c +f:drivers/usb/serial/mos7840.c +f:drivers/usb/serial/mxuport.c +f:drivers/usb/serial/navman.c +f:drivers/usb/serial/omninet.c +f:drivers/usb/serial/opticon.c +f:drivers/usb/serial/option.c +f:drivers/usb/serial/oti6858.c +f:drivers/usb/serial/oti6858.h +f:drivers/usb/serial/pl2303.c +f:drivers/usb/serial/pl2303.h +f:drivers/usb/serial/qcaux.c +f:drivers/usb/serial/qcserial.c +f:drivers/usb/serial/quatech2.c +f:drivers/usb/serial/safe_serial.c +f:drivers/usb/serial/sierra.c +f:drivers/usb/serial/spcp8x5.c +f:drivers/usb/serial/ssu100.c +f:drivers/usb/serial/symbolserial.c +f:drivers/usb/serial/ti_usb_3410_5052.c +f:drivers/usb/serial/upd78f0730.c +f:drivers/usb/serial/usb-serial-simple.c +f:drivers/usb/serial/usb-serial.c +f:drivers/usb/serial/usb-wwan.h +f:drivers/usb/serial/usb_debug.c +f:drivers/usb/serial/usb_wwan.c +f:drivers/usb/serial/visor.c +f:drivers/usb/serial/visor.h +f:drivers/usb/serial/whiteheat.c +f:drivers/usb/serial/whiteheat.h +f:drivers/usb/serial/wishbone-serial.c +f:drivers/usb/serial/xr_serial.c +f:drivers/usb/serial/xsens_mt.c +f:drivers/usb/storage/Kconfig +f:drivers/usb/storage/Makefile +f:drivers/usb/storage/alauda.c +f:drivers/usb/storage/cypress_atacb.c +f:drivers/usb/storage/datafab.c +f:drivers/usb/storage/debug.c +f:drivers/usb/storage/debug.h +f:drivers/usb/storage/ene_ub6250.c +f:drivers/usb/storage/freecom.c +f:drivers/usb/storage/initializers.c +f:drivers/usb/storage/initializers.h +f:drivers/usb/storage/isd200.c +f:drivers/usb/storage/jumpshot.c +f:drivers/usb/storage/karma.c +f:drivers/usb/storage/onetouch.c +f:drivers/usb/storage/option_ms.c +f:drivers/usb/storage/option_ms.h +f:drivers/usb/storage/protocol.c +f:drivers/usb/storage/protocol.h +f:drivers/usb/storage/realtek_cr.c +f:drivers/usb/storage/scsiglue.c +f:drivers/usb/storage/scsiglue.h +f:drivers/usb/storage/sddr09.c +f:drivers/usb/storage/sddr55.c +f:drivers/usb/storage/shuttle_usbat.c +f:drivers/usb/storage/sierra_ms.c +f:drivers/usb/storage/sierra_ms.h +f:drivers/usb/storage/transport.c +f:drivers/usb/storage/transport.h +f:drivers/usb/storage/uas-detect.h +f:drivers/usb/storage/uas.c +f:drivers/usb/storage/unusual_alauda.h +f:drivers/usb/storage/unusual_cypress.h +f:drivers/usb/storage/unusual_datafab.h +f:drivers/usb/storage/unusual_devs.h +f:drivers/usb/storage/unusual_ene_ub6250.h +f:drivers/usb/storage/unusual_freecom.h +f:drivers/usb/storage/unusual_isd200.h +f:drivers/usb/storage/unusual_jumpshot.h +f:drivers/usb/storage/unusual_karma.h +f:drivers/usb/storage/unusual_onetouch.h +f:drivers/usb/storage/unusual_realtek.h +f:drivers/usb/storage/unusual_sddr09.h +f:drivers/usb/storage/unusual_sddr55.h +f:drivers/usb/storage/unusual_uas.h +f:drivers/usb/storage/unusual_usbat.h +f:drivers/usb/storage/usb.c +f:drivers/usb/storage/usb.h +f:drivers/usb/storage/usual-tables.c +f:drivers/usb/typec/Kconfig +f:drivers/usb/typec/Makefile +f:drivers/usb/typec/altmodes/Kconfig +f:drivers/usb/typec/altmodes/Makefile +f:drivers/usb/typec/altmodes/displayport.c +f:drivers/usb/typec/altmodes/displayport.h +f:drivers/usb/typec/altmodes/nvidia.c +f:drivers/usb/typec/altmodes/thunderbolt.c +f:drivers/usb/typec/anx7411.c +f:drivers/usb/typec/bus.c +f:drivers/usb/typec/bus.h +f:drivers/usb/typec/class.c +f:drivers/usb/typec/class.h +f:drivers/usb/typec/hd3ss3220.c +f:drivers/usb/typec/mux.c +f:drivers/usb/typec/mux.h +f:drivers/usb/typec/mux/Kconfig +f:drivers/usb/typec/mux/Makefile +f:drivers/usb/typec/mux/fsa4480.c +f:drivers/usb/typec/mux/gpio-sbu-mux.c +f:drivers/usb/typec/mux/intel_pmc_mux.c +f:drivers/usb/typec/mux/it5205.c +f:drivers/usb/typec/mux/nb7vpq904m.c +f:drivers/usb/typec/mux/pi3usb30532.c +f:drivers/usb/typec/mux/ps883x.c +f:drivers/usb/typec/mux/ptn36502.c +f:drivers/usb/typec/mux/tusb1046.c +f:drivers/usb/typec/mux/wcd939x-usbss.c +f:drivers/usb/typec/pd.c +f:drivers/usb/typec/pd.h +f:drivers/usb/typec/port-mapper.c +f:drivers/usb/typec/retimer.c +f:drivers/usb/typec/retimer.h +f:drivers/usb/typec/rt1719.c +f:drivers/usb/typec/stusb160x.c +f:drivers/usb/typec/tcpm/Kconfig +f:drivers/usb/typec/tcpm/Makefile +f:drivers/usb/typec/tcpm/fusb302.c +f:drivers/usb/typec/tcpm/fusb302_reg.h +f:drivers/usb/typec/tcpm/maxim_contaminant.c +f:drivers/usb/typec/tcpm/qcom/Makefile +f:drivers/usb/typec/tcpm/qcom/qcom_pmic_typec.c +f:drivers/usb/typec/tcpm/qcom/qcom_pmic_typec.h +f:drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_pdphy.c +f:drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_pdphy.h +f:drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_pdphy_stub.c +f:drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_port.c +f:drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_port.h +f:drivers/usb/typec/tcpm/tcpci.c +f:drivers/usb/typec/tcpm/tcpci_maxim.h +f:drivers/usb/typec/tcpm/tcpci_maxim_core.c +f:drivers/usb/typec/tcpm/tcpci_mt6360.c +f:drivers/usb/typec/tcpm/tcpci_mt6370.c +f:drivers/usb/typec/tcpm/tcpci_rt1711h.c +f:drivers/usb/typec/tcpm/tcpm.c +f:drivers/usb/typec/tcpm/wcove.c +f:drivers/usb/typec/tipd/Kconfig +f:drivers/usb/typec/tipd/Makefile +f:drivers/usb/typec/tipd/core.c +f:drivers/usb/typec/tipd/tps6598x.h +f:drivers/usb/typec/tipd/trace.c +f:drivers/usb/typec/tipd/trace.h +f:drivers/usb/typec/ucsi/Kconfig +f:drivers/usb/typec/ucsi/Makefile +f:drivers/usb/typec/ucsi/cros_ec_ucsi.c +f:drivers/usb/typec/ucsi/debugfs.c +f:drivers/usb/typec/ucsi/displayport.c +f:drivers/usb/typec/ucsi/psy.c +f:drivers/usb/typec/ucsi/trace.c +f:drivers/usb/typec/ucsi/trace.h +f:drivers/usb/typec/ucsi/ucsi.c +f:drivers/usb/typec/ucsi/ucsi.h +f:drivers/usb/typec/ucsi/ucsi_acpi.c +f:drivers/usb/typec/ucsi/ucsi_ccg.c +f:drivers/usb/typec/ucsi/ucsi_glink.c +f:drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c +f:drivers/usb/typec/ucsi/ucsi_stm32g0.c +f:drivers/usb/typec/ucsi/ucsi_yoga_c630.c +f:drivers/usb/typec/wusb3801.c +f:drivers/usb/usb-skeleton.c +f:drivers/usb/usbip/Kconfig +f:drivers/usb/usbip/Makefile +f:drivers/usb/usbip/stub.h +f:drivers/usb/usbip/stub_dev.c +f:drivers/usb/usbip/stub_main.c +f:drivers/usb/usbip/stub_rx.c +f:drivers/usb/usbip/stub_tx.c +f:drivers/usb/usbip/usbip_common.c +f:drivers/usb/usbip/usbip_common.h +f:drivers/usb/usbip/usbip_event.c +f:drivers/usb/usbip/vhci.h +f:drivers/usb/usbip/vhci_hcd.c +f:drivers/usb/usbip/vhci_rx.c +f:drivers/usb/usbip/vhci_sysfs.c +f:drivers/usb/usbip/vhci_tx.c +f:drivers/usb/usbip/vudc.h +f:drivers/usb/usbip/vudc_dev.c +f:drivers/usb/usbip/vudc_main.c +f:drivers/usb/usbip/vudc_rx.c +f:drivers/usb/usbip/vudc_sysfs.c +f:drivers/usb/usbip/vudc_transfer.c +f:drivers/usb/usbip/vudc_tx.c +f:drivers/vdpa/Kconfig +f:drivers/vdpa/Makefile +f:drivers/vdpa/alibaba/Makefile +f:drivers/vdpa/alibaba/eni_vdpa.c +f:drivers/vdpa/ifcvf/Makefile +f:drivers/vdpa/ifcvf/ifcvf_base.c +f:drivers/vdpa/ifcvf/ifcvf_base.h +f:drivers/vdpa/ifcvf/ifcvf_main.c +f:drivers/vdpa/mlx5/Makefile +f:drivers/vdpa/mlx5/core/mlx5_vdpa.h +f:drivers/vdpa/mlx5/core/mr.c +f:drivers/vdpa/mlx5/core/resources.c +f:drivers/vdpa/mlx5/net/debug.c +f:drivers/vdpa/mlx5/net/mlx5_vnet.c +f:drivers/vdpa/mlx5/net/mlx5_vnet.h +f:drivers/vdpa/octeon_ep/Makefile +f:drivers/vdpa/octeon_ep/octep_vdpa.h +f:drivers/vdpa/octeon_ep/octep_vdpa_hw.c +f:drivers/vdpa/octeon_ep/octep_vdpa_main.c +f:drivers/vdpa/pds/Makefile +f:drivers/vdpa/pds/aux_drv.c +f:drivers/vdpa/pds/aux_drv.h +f:drivers/vdpa/pds/cmds.c +f:drivers/vdpa/pds/cmds.h +f:drivers/vdpa/pds/debugfs.c +f:drivers/vdpa/pds/debugfs.h +f:drivers/vdpa/pds/vdpa_dev.c +f:drivers/vdpa/pds/vdpa_dev.h +f:drivers/vdpa/solidrun/Makefile +f:drivers/vdpa/solidrun/snet_ctrl.c +f:drivers/vdpa/solidrun/snet_hwmon.c +f:drivers/vdpa/solidrun/snet_main.c +f:drivers/vdpa/solidrun/snet_vdpa.h +f:drivers/vdpa/vdpa.c +f:drivers/vdpa/vdpa_sim/Makefile +f:drivers/vdpa/vdpa_sim/vdpa_sim.c +f:drivers/vdpa/vdpa_sim/vdpa_sim.h +f:drivers/vdpa/vdpa_sim/vdpa_sim_blk.c +f:drivers/vdpa/vdpa_sim/vdpa_sim_net.c +f:drivers/vdpa/vdpa_user/Makefile +f:drivers/vdpa/vdpa_user/iova_domain.c +f:drivers/vdpa/vdpa_user/iova_domain.h +f:drivers/vdpa/vdpa_user/vduse_dev.c +f:drivers/vdpa/virtio_pci/Makefile +f:drivers/vdpa/virtio_pci/vp_vdpa.c +f:drivers/vfio/Kconfig +f:drivers/vfio/Makefile +f:drivers/vfio/cdx/Kconfig +f:drivers/vfio/cdx/Makefile +f:drivers/vfio/cdx/intr.c +f:drivers/vfio/cdx/main.c +f:drivers/vfio/cdx/private.h +f:drivers/vfio/container.c +f:drivers/vfio/debugfs.c +f:drivers/vfio/device_cdev.c +f:drivers/vfio/fsl-mc/Kconfig +f:drivers/vfio/fsl-mc/Makefile +f:drivers/vfio/fsl-mc/vfio_fsl_mc.c +f:drivers/vfio/fsl-mc/vfio_fsl_mc_intr.c +f:drivers/vfio/fsl-mc/vfio_fsl_mc_private.h +f:drivers/vfio/group.c +f:drivers/vfio/iommufd.c +f:drivers/vfio/mdev/Kconfig +f:drivers/vfio/mdev/Makefile +f:drivers/vfio/mdev/mdev_core.c +f:drivers/vfio/mdev/mdev_driver.c +f:drivers/vfio/mdev/mdev_private.h +f:drivers/vfio/mdev/mdev_sysfs.c +f:drivers/vfio/pci/Kconfig +f:drivers/vfio/pci/Makefile +f:drivers/vfio/pci/hisilicon/Kconfig +f:drivers/vfio/pci/hisilicon/Makefile +f:drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +f:drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h +f:drivers/vfio/pci/mlx5/Kconfig +f:drivers/vfio/pci/mlx5/Makefile +f:drivers/vfio/pci/mlx5/cmd.c +f:drivers/vfio/pci/mlx5/cmd.h +f:drivers/vfio/pci/mlx5/main.c +f:drivers/vfio/pci/nvgrace-gpu/Kconfig +f:drivers/vfio/pci/nvgrace-gpu/Makefile +f:drivers/vfio/pci/nvgrace-gpu/main.c +f:drivers/vfio/pci/pds/Kconfig +f:drivers/vfio/pci/pds/Makefile +f:drivers/vfio/pci/pds/cmds.c +f:drivers/vfio/pci/pds/cmds.h +f:drivers/vfio/pci/pds/dirty.c +f:drivers/vfio/pci/pds/dirty.h +f:drivers/vfio/pci/pds/lm.c +f:drivers/vfio/pci/pds/lm.h +f:drivers/vfio/pci/pds/pci_drv.c +f:drivers/vfio/pci/pds/pci_drv.h +f:drivers/vfio/pci/pds/vfio_dev.c +f:drivers/vfio/pci/pds/vfio_dev.h +f:drivers/vfio/pci/qat/Kconfig +f:drivers/vfio/pci/qat/Makefile +f:drivers/vfio/pci/qat/main.c +f:drivers/vfio/pci/trace.h +f:drivers/vfio/pci/vfio_pci.c +f:drivers/vfio/pci/vfio_pci_config.c +f:drivers/vfio/pci/vfio_pci_core.c +f:drivers/vfio/pci/vfio_pci_igd.c +f:drivers/vfio/pci/vfio_pci_intrs.c +f:drivers/vfio/pci/vfio_pci_priv.h +f:drivers/vfio/pci/vfio_pci_rdwr.c +f:drivers/vfio/pci/vfio_pci_zdev.c +f:drivers/vfio/pci/virtio/Kconfig +f:drivers/vfio/pci/virtio/Makefile +f:drivers/vfio/pci/virtio/common.h +f:drivers/vfio/pci/virtio/legacy_io.c +f:drivers/vfio/pci/virtio/main.c +f:drivers/vfio/pci/virtio/migrate.c +f:drivers/vfio/platform/Kconfig +f:drivers/vfio/platform/Makefile +f:drivers/vfio/platform/reset/Kconfig +f:drivers/vfio/platform/reset/Makefile +f:drivers/vfio/platform/reset/vfio_platform_amdxgbe.c +f:drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c +f:drivers/vfio/platform/reset/vfio_platform_calxedaxgmac.c +f:drivers/vfio/platform/vfio_amba.c +f:drivers/vfio/platform/vfio_platform.c +f:drivers/vfio/platform/vfio_platform_common.c +f:drivers/vfio/platform/vfio_platform_irq.c +f:drivers/vfio/platform/vfio_platform_private.h +f:drivers/vfio/vfio.h +f:drivers/vfio/vfio_iommu_spapr_tce.c +f:drivers/vfio/vfio_iommu_type1.c +f:drivers/vfio/vfio_main.c +f:drivers/vfio/virqfd.c +f:drivers/vhost/Kconfig +f:drivers/vhost/Makefile +f:drivers/vhost/iotlb.c +f:drivers/vhost/net.c +f:drivers/vhost/scsi.c +f:drivers/vhost/test.c +f:drivers/vhost/test.h +f:drivers/vhost/vdpa.c +f:drivers/vhost/vhost.c +f:drivers/vhost/vhost.h +f:drivers/vhost/vringh.c +f:drivers/vhost/vsock.c +f:drivers/video/Kconfig +f:drivers/video/Makefile +f:drivers/video/aperture.c +f:drivers/video/backlight/88pm860x_bl.c +f:drivers/video/backlight/Kconfig +f:drivers/video/backlight/Makefile +f:drivers/video/backlight/aat2870_bl.c +f:drivers/video/backlight/adp5520_bl.c +f:drivers/video/backlight/adp8860_bl.c +f:drivers/video/backlight/adp8870_bl.c +f:drivers/video/backlight/ams369fg06.c +f:drivers/video/backlight/apple_bl.c +f:drivers/video/backlight/apple_dwi_bl.c +f:drivers/video/backlight/arcxcnn_bl.c +f:drivers/video/backlight/as3711_bl.c +f:drivers/video/backlight/backlight.c +f:drivers/video/backlight/bd6107.c +f:drivers/video/backlight/corgi_lcd.c +f:drivers/video/backlight/da903x_bl.c +f:drivers/video/backlight/da9052_bl.c +f:drivers/video/backlight/ep93xx_bl.c +f:drivers/video/backlight/gpio_backlight.c +f:drivers/video/backlight/hp680_bl.c +f:drivers/video/backlight/hx8357.c +f:drivers/video/backlight/ili922x.c +f:drivers/video/backlight/ili9320.c +f:drivers/video/backlight/ili9320.h +f:drivers/video/backlight/ipaq_micro_bl.c +f:drivers/video/backlight/jornada720_bl.c +f:drivers/video/backlight/jornada720_lcd.c +f:drivers/video/backlight/kb3886_bl.c +f:drivers/video/backlight/ktd253-backlight.c +f:drivers/video/backlight/ktd2801-backlight.c +f:drivers/video/backlight/ktz8866.c +f:drivers/video/backlight/l4f00242t03.c +f:drivers/video/backlight/lcd.c +f:drivers/video/backlight/led_bl.c +f:drivers/video/backlight/lm3509_bl.c +f:drivers/video/backlight/lm3533_bl.c +f:drivers/video/backlight/lm3630a_bl.c +f:drivers/video/backlight/lm3639_bl.c +f:drivers/video/backlight/lms283gf05.c +f:drivers/video/backlight/lms501kf03.c +f:drivers/video/backlight/locomolcd.c +f:drivers/video/backlight/lp855x_bl.c +f:drivers/video/backlight/lp8788_bl.c +f:drivers/video/backlight/ltv350qv.c +f:drivers/video/backlight/ltv350qv.h +f:drivers/video/backlight/lv5207lp.c +f:drivers/video/backlight/max8925_bl.c +f:drivers/video/backlight/mp3309c.c +f:drivers/video/backlight/mt6370-backlight.c +f:drivers/video/backlight/omap1_bl.c +f:drivers/video/backlight/otm3225a.c +f:drivers/video/backlight/pandora_bl.c +f:drivers/video/backlight/platform_lcd.c +f:drivers/video/backlight/pwm_bl.c +f:drivers/video/backlight/qcom-wled.c +f:drivers/video/backlight/rave-sp-backlight.c +f:drivers/video/backlight/rt4831-backlight.c +f:drivers/video/backlight/sky81452-backlight.c +f:drivers/video/backlight/tdo24m.c +f:drivers/video/backlight/tps65217_bl.c +f:drivers/video/backlight/vgg2432a4.c +f:drivers/video/backlight/wm831x_bl.c +f:drivers/video/cmdline.c +f:drivers/video/console/Kconfig +f:drivers/video/console/Makefile +f:drivers/video/console/dummycon.c +f:drivers/video/console/mdacon.c +f:drivers/video/console/newport_con.c +f:drivers/video/console/sticon.c +f:drivers/video/console/vgacon.c +f:drivers/video/display_timing.c +f:drivers/video/fbdev/68328fb.c +f:drivers/video/fbdev/Kconfig +f:drivers/video/fbdev/Makefile +f:drivers/video/fbdev/acornfb.c +f:drivers/video/fbdev/acornfb.h +f:drivers/video/fbdev/amifb.c +f:drivers/video/fbdev/arcfb.c +f:drivers/video/fbdev/arkfb.c +f:drivers/video/fbdev/asiliantfb.c +f:drivers/video/fbdev/atafb.c +f:drivers/video/fbdev/atafb.h +f:drivers/video/fbdev/atafb_iplan2p2.c +f:drivers/video/fbdev/atafb_iplan2p4.c +f:drivers/video/fbdev/atafb_iplan2p8.c +f:drivers/video/fbdev/atafb_mfb.c +f:drivers/video/fbdev/atafb_utils.h +f:drivers/video/fbdev/atmel_lcdfb.c +f:drivers/video/fbdev/aty/Makefile +f:drivers/video/fbdev/aty/ati_ids.h +f:drivers/video/fbdev/aty/aty128fb.c +f:drivers/video/fbdev/aty/atyfb.h +f:drivers/video/fbdev/aty/atyfb_base.c +f:drivers/video/fbdev/aty/mach64_accel.c +f:drivers/video/fbdev/aty/mach64_ct.c +f:drivers/video/fbdev/aty/mach64_cursor.c +f:drivers/video/fbdev/aty/mach64_gx.c +f:drivers/video/fbdev/aty/radeon_accel.c +f:drivers/video/fbdev/aty/radeon_backlight.c +f:drivers/video/fbdev/aty/radeon_base.c +f:drivers/video/fbdev/aty/radeon_i2c.c +f:drivers/video/fbdev/aty/radeon_monitor.c +f:drivers/video/fbdev/aty/radeon_pm.c +f:drivers/video/fbdev/aty/radeonfb.h +f:drivers/video/fbdev/au1100fb.c +f:drivers/video/fbdev/au1100fb.h +f:drivers/video/fbdev/au1200fb.c +f:drivers/video/fbdev/au1200fb.h +f:drivers/video/fbdev/broadsheetfb.c +f:drivers/video/fbdev/bt431.h +f:drivers/video/fbdev/bt455.h +f:drivers/video/fbdev/bw2.c +f:drivers/video/fbdev/c2p.h +f:drivers/video/fbdev/c2p_core.h +f:drivers/video/fbdev/c2p_iplan2.c +f:drivers/video/fbdev/c2p_planar.c +f:drivers/video/fbdev/carminefb.c +f:drivers/video/fbdev/carminefb.h +f:drivers/video/fbdev/carminefb_regs.h +f:drivers/video/fbdev/cg14.c +f:drivers/video/fbdev/cg3.c +f:drivers/video/fbdev/cg6.c +f:drivers/video/fbdev/chipsfb.c +f:drivers/video/fbdev/cirrusfb.c +f:drivers/video/fbdev/clps711x-fb.c +f:drivers/video/fbdev/cobalt_lcdfb.c +f:drivers/video/fbdev/controlfb.c +f:drivers/video/fbdev/controlfb.h +f:drivers/video/fbdev/core/Kconfig +f:drivers/video/fbdev/core/Makefile +f:drivers/video/fbdev/core/bitblit.c +f:drivers/video/fbdev/core/cfbcopyarea.c +f:drivers/video/fbdev/core/cfbfillrect.c +f:drivers/video/fbdev/core/cfbimgblt.c +f:drivers/video/fbdev/core/cfbmem.h +f:drivers/video/fbdev/core/fb_backlight.c +f:drivers/video/fbdev/core/fb_chrdev.c +f:drivers/video/fbdev/core/fb_cmdline.c +f:drivers/video/fbdev/core/fb_copyarea.h +f:drivers/video/fbdev/core/fb_ddc.c +f:drivers/video/fbdev/core/fb_defio.c +f:drivers/video/fbdev/core/fb_draw.h +f:drivers/video/fbdev/core/fb_fillrect.h +f:drivers/video/fbdev/core/fb_imageblit.h +f:drivers/video/fbdev/core/fb_info.c +f:drivers/video/fbdev/core/fb_internal.h +f:drivers/video/fbdev/core/fb_io_fops.c +f:drivers/video/fbdev/core/fb_logo.c +f:drivers/video/fbdev/core/fb_notify.c +f:drivers/video/fbdev/core/fb_procfs.c +f:drivers/video/fbdev/core/fb_sys_fops.c +f:drivers/video/fbdev/core/fbcmap.c +f:drivers/video/fbdev/core/fbcon.c +f:drivers/video/fbdev/core/fbcon.h +f:drivers/video/fbdev/core/fbcon_ccw.c +f:drivers/video/fbdev/core/fbcon_cw.c +f:drivers/video/fbdev/core/fbcon_rotate.c +f:drivers/video/fbdev/core/fbcon_rotate.h +f:drivers/video/fbdev/core/fbcon_ud.c +f:drivers/video/fbdev/core/fbcvt.c +f:drivers/video/fbdev/core/fbmem.c +f:drivers/video/fbdev/core/fbmon.c +f:drivers/video/fbdev/core/fbsysfs.c +f:drivers/video/fbdev/core/modedb.c +f:drivers/video/fbdev/core/softcursor.c +f:drivers/video/fbdev/core/svgalib.c +f:drivers/video/fbdev/core/syscopyarea.c +f:drivers/video/fbdev/core/sysfillrect.c +f:drivers/video/fbdev/core/sysimgblt.c +f:drivers/video/fbdev/core/sysmem.h +f:drivers/video/fbdev/core/tileblit.c +f:drivers/video/fbdev/cyber2000fb.c +f:drivers/video/fbdev/cyber2000fb.h +f:drivers/video/fbdev/dnfb.c +f:drivers/video/fbdev/edid.h +f:drivers/video/fbdev/efifb.c +f:drivers/video/fbdev/ep93xx-fb.c +f:drivers/video/fbdev/ffb.c +f:drivers/video/fbdev/fm2fb.c +f:drivers/video/fbdev/fsl-diu-fb.c +f:drivers/video/fbdev/g364fb.c +f:drivers/video/fbdev/gbefb.c +f:drivers/video/fbdev/geode/Kconfig +f:drivers/video/fbdev/geode/Makefile +f:drivers/video/fbdev/geode/display_gx.c +f:drivers/video/fbdev/geode/display_gx1.c +f:drivers/video/fbdev/geode/display_gx1.h +f:drivers/video/fbdev/geode/geodefb.h +f:drivers/video/fbdev/geode/gx1fb_core.c +f:drivers/video/fbdev/geode/gxfb.h +f:drivers/video/fbdev/geode/gxfb_core.c +f:drivers/video/fbdev/geode/lxfb.h +f:drivers/video/fbdev/geode/lxfb_core.c +f:drivers/video/fbdev/geode/lxfb_ops.c +f:drivers/video/fbdev/geode/suspend_gx.c +f:drivers/video/fbdev/geode/video_cs5530.c +f:drivers/video/fbdev/geode/video_cs5530.h +f:drivers/video/fbdev/geode/video_gx.c +f:drivers/video/fbdev/goldfishfb.c +f:drivers/video/fbdev/grvga.c +f:drivers/video/fbdev/gxt4500.c +f:drivers/video/fbdev/hecubafb.c +f:drivers/video/fbdev/hgafb.c +f:drivers/video/fbdev/hitfb.c +f:drivers/video/fbdev/hpfb.c +f:drivers/video/fbdev/hyperv_fb.c +f:drivers/video/fbdev/i740_reg.h +f:drivers/video/fbdev/i740fb.c +f:drivers/video/fbdev/i810/Makefile +f:drivers/video/fbdev/i810/i810-i2c.c +f:drivers/video/fbdev/i810/i810.h +f:drivers/video/fbdev/i810/i810_accel.c +f:drivers/video/fbdev/i810/i810_dvt.c +f:drivers/video/fbdev/i810/i810_gtf.c +f:drivers/video/fbdev/i810/i810_main.c +f:drivers/video/fbdev/i810/i810_main.h +f:drivers/video/fbdev/i810/i810_regs.h +f:drivers/video/fbdev/imsttfb.c +f:drivers/video/fbdev/imxfb.c +f:drivers/video/fbdev/kyro/Makefile +f:drivers/video/fbdev/kyro/STG4000InitDevice.c +f:drivers/video/fbdev/kyro/STG4000Interface.h +f:drivers/video/fbdev/kyro/STG4000OverlayDevice.c +f:drivers/video/fbdev/kyro/STG4000Ramdac.c +f:drivers/video/fbdev/kyro/STG4000Reg.h +f:drivers/video/fbdev/kyro/STG4000VTG.c +f:drivers/video/fbdev/kyro/fbdev.c +f:drivers/video/fbdev/leo.c +f:drivers/video/fbdev/macfb.c +f:drivers/video/fbdev/macmodes.c +f:drivers/video/fbdev/macmodes.h +f:drivers/video/fbdev/matrox/Makefile +f:drivers/video/fbdev/matrox/g450_pll.c +f:drivers/video/fbdev/matrox/g450_pll.h +f:drivers/video/fbdev/matrox/i2c-matroxfb.c +f:drivers/video/fbdev/matrox/matroxfb_DAC1064.c +f:drivers/video/fbdev/matrox/matroxfb_DAC1064.h +f:drivers/video/fbdev/matrox/matroxfb_Ti3026.c +f:drivers/video/fbdev/matrox/matroxfb_Ti3026.h +f:drivers/video/fbdev/matrox/matroxfb_accel.c +f:drivers/video/fbdev/matrox/matroxfb_accel.h +f:drivers/video/fbdev/matrox/matroxfb_base.c +f:drivers/video/fbdev/matrox/matroxfb_base.h +f:drivers/video/fbdev/matrox/matroxfb_crtc2.c +f:drivers/video/fbdev/matrox/matroxfb_crtc2.h +f:drivers/video/fbdev/matrox/matroxfb_g450.c +f:drivers/video/fbdev/matrox/matroxfb_g450.h +f:drivers/video/fbdev/matrox/matroxfb_maven.c +f:drivers/video/fbdev/matrox/matroxfb_maven.h +f:drivers/video/fbdev/matrox/matroxfb_misc.c +f:drivers/video/fbdev/matrox/matroxfb_misc.h +f:drivers/video/fbdev/maxinefb.c +f:drivers/video/fbdev/mb862xx/Makefile +f:drivers/video/fbdev/mb862xx/mb862xx-i2c.c +f:drivers/video/fbdev/mb862xx/mb862xx_reg.h +f:drivers/video/fbdev/mb862xx/mb862xxfb.h +f:drivers/video/fbdev/mb862xx/mb862xxfb_accel.c +f:drivers/video/fbdev/mb862xx/mb862xxfb_accel.h +f:drivers/video/fbdev/mb862xx/mb862xxfbdrv.c +f:drivers/video/fbdev/metronomefb.c +f:drivers/video/fbdev/mmp/Kconfig +f:drivers/video/fbdev/mmp/Makefile +f:drivers/video/fbdev/mmp/core.c +f:drivers/video/fbdev/mmp/fb/Kconfig +f:drivers/video/fbdev/mmp/fb/Makefile +f:drivers/video/fbdev/mmp/fb/mmpfb.c +f:drivers/video/fbdev/mmp/fb/mmpfb.h +f:drivers/video/fbdev/mmp/hw/Kconfig +f:drivers/video/fbdev/mmp/hw/Makefile +f:drivers/video/fbdev/mmp/hw/mmp_ctrl.c +f:drivers/video/fbdev/mmp/hw/mmp_ctrl.h +f:drivers/video/fbdev/mmp/hw/mmp_spi.c +f:drivers/video/fbdev/mmp/panel/Kconfig +f:drivers/video/fbdev/mmp/panel/Makefile +f:drivers/video/fbdev/mmp/panel/tpo_tj032md01bw.c +f:drivers/video/fbdev/n411.c +f:drivers/video/fbdev/neofb.c +f:drivers/video/fbdev/nvidia/Makefile +f:drivers/video/fbdev/nvidia/nv_accel.c +f:drivers/video/fbdev/nvidia/nv_backlight.c +f:drivers/video/fbdev/nvidia/nv_dma.h +f:drivers/video/fbdev/nvidia/nv_hw.c +f:drivers/video/fbdev/nvidia/nv_i2c.c +f:drivers/video/fbdev/nvidia/nv_local.h +f:drivers/video/fbdev/nvidia/nv_of.c +f:drivers/video/fbdev/nvidia/nv_proto.h +f:drivers/video/fbdev/nvidia/nv_setup.c +f:drivers/video/fbdev/nvidia/nv_type.h +f:drivers/video/fbdev/nvidia/nvidia.c +f:drivers/video/fbdev/ocfb.c +f:drivers/video/fbdev/offb.c +f:drivers/video/fbdev/omap/Kconfig +f:drivers/video/fbdev/omap/Makefile +f:drivers/video/fbdev/omap/hwa742.c +f:drivers/video/fbdev/omap/lcd_ams_delta.c +f:drivers/video/fbdev/omap/lcd_dma.c +f:drivers/video/fbdev/omap/lcd_dma.h +f:drivers/video/fbdev/omap/lcd_mipid.c +f:drivers/video/fbdev/omap/lcd_palmte.c +f:drivers/video/fbdev/omap/lcdc.c +f:drivers/video/fbdev/omap/lcdc.h +f:drivers/video/fbdev/omap/omapfb.h +f:drivers/video/fbdev/omap/omapfb_main.c +f:drivers/video/fbdev/omap/sossi.c +f:drivers/video/fbdev/omap2/Kconfig +f:drivers/video/fbdev/omap2/Makefile +f:drivers/video/fbdev/omap2/omapfb/Kconfig +f:drivers/video/fbdev/omap2/omapfb/Makefile +f:drivers/video/fbdev/omap2/omapfb/displays/Kconfig +f:drivers/video/fbdev/omap2/omapfb/displays/Makefile +f:drivers/video/fbdev/omap2/omapfb/displays/connector-analog-tv.c +f:drivers/video/fbdev/omap2/omapfb/displays/connector-dvi.c +f:drivers/video/fbdev/omap2/omapfb/displays/connector-hdmi.c +f:drivers/video/fbdev/omap2/omapfb/displays/encoder-opa362.c +f:drivers/video/fbdev/omap2/omapfb/displays/encoder-tfp410.c +f:drivers/video/fbdev/omap2/omapfb/displays/encoder-tpd12s015.c +f:drivers/video/fbdev/omap2/omapfb/displays/panel-dpi.c +f:drivers/video/fbdev/omap2/omapfb/displays/panel-dsi-cm.c +f:drivers/video/fbdev/omap2/omapfb/displays/panel-lgphilips-lb035q02.c +f:drivers/video/fbdev/omap2/omapfb/displays/panel-nec-nl8048hl11.c +f:drivers/video/fbdev/omap2/omapfb/displays/panel-sharp-ls037v7dw01.c +f:drivers/video/fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c +f:drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td028ttec1.c +f:drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td043mtea1.c +f:drivers/video/fbdev/omap2/omapfb/dss/Kconfig +f:drivers/video/fbdev/omap2/omapfb/dss/Makefile +f:drivers/video/fbdev/omap2/omapfb/dss/apply.c +f:drivers/video/fbdev/omap2/omapfb/dss/core.c +f:drivers/video/fbdev/omap2/omapfb/dss/dispc-compat.c +f:drivers/video/fbdev/omap2/omapfb/dss/dispc-compat.h +f:drivers/video/fbdev/omap2/omapfb/dss/dispc.c +f:drivers/video/fbdev/omap2/omapfb/dss/dispc.h +f:drivers/video/fbdev/omap2/omapfb/dss/dispc_coefs.c +f:drivers/video/fbdev/omap2/omapfb/dss/display-sysfs.c +f:drivers/video/fbdev/omap2/omapfb/dss/display.c +f:drivers/video/fbdev/omap2/omapfb/dss/dpi.c +f:drivers/video/fbdev/omap2/omapfb/dss/dsi.c +f:drivers/video/fbdev/omap2/omapfb/dss/dss-of.c +f:drivers/video/fbdev/omap2/omapfb/dss/dss.c +f:drivers/video/fbdev/omap2/omapfb/dss/dss.h +f:drivers/video/fbdev/omap2/omapfb/dss/dss_features.c +f:drivers/video/fbdev/omap2/omapfb/dss/dss_features.h +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi.h +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi4_core.c +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi4_core.h +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi5_core.c +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi5_core.h +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi_common.c +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi_phy.c +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi_pll.c +f:drivers/video/fbdev/omap2/omapfb/dss/hdmi_wp.c +f:drivers/video/fbdev/omap2/omapfb/dss/manager-sysfs.c +f:drivers/video/fbdev/omap2/omapfb/dss/manager.c +f:drivers/video/fbdev/omap2/omapfb/dss/omapdss-boot-init.c +f:drivers/video/fbdev/omap2/omapfb/dss/output.c +f:drivers/video/fbdev/omap2/omapfb/dss/overlay-sysfs.c +f:drivers/video/fbdev/omap2/omapfb/dss/overlay.c +f:drivers/video/fbdev/omap2/omapfb/dss/pll.c +f:drivers/video/fbdev/omap2/omapfb/dss/sdi.c +f:drivers/video/fbdev/omap2/omapfb/dss/venc.c +f:drivers/video/fbdev/omap2/omapfb/dss/video-pll.c +f:drivers/video/fbdev/omap2/omapfb/omapfb-ioctl.c +f:drivers/video/fbdev/omap2/omapfb/omapfb-main.c +f:drivers/video/fbdev/omap2/omapfb/omapfb-sysfs.c +f:drivers/video/fbdev/omap2/omapfb/omapfb.h +f:drivers/video/fbdev/omap2/omapfb/vrfb.c +f:drivers/video/fbdev/p9100.c +f:drivers/video/fbdev/platinumfb.c +f:drivers/video/fbdev/platinumfb.h +f:drivers/video/fbdev/pm2fb.c +f:drivers/video/fbdev/pm3fb.c +f:drivers/video/fbdev/pmag-aa-fb.c +f:drivers/video/fbdev/pmag-ba-fb.c +f:drivers/video/fbdev/pmagb-b-fb.c +f:drivers/video/fbdev/ps3fb.c +f:drivers/video/fbdev/pvr2fb.c +f:drivers/video/fbdev/pxa168fb.c +f:drivers/video/fbdev/pxa168fb.h +f:drivers/video/fbdev/pxa3xx-gcu.c +f:drivers/video/fbdev/pxa3xx-gcu.h +f:drivers/video/fbdev/pxa3xx-regs.h +f:drivers/video/fbdev/pxafb.c +f:drivers/video/fbdev/pxafb.h +f:drivers/video/fbdev/q40fb.c +f:drivers/video/fbdev/riva/Makefile +f:drivers/video/fbdev/riva/fbdev.c +f:drivers/video/fbdev/riva/nv_driver.c +f:drivers/video/fbdev/riva/nv_type.h +f:drivers/video/fbdev/riva/nvreg.h +f:drivers/video/fbdev/riva/riva_hw.c +f:drivers/video/fbdev/riva/riva_hw.h +f:drivers/video/fbdev/riva/riva_tbl.h +f:drivers/video/fbdev/riva/rivafb-i2c.c +f:drivers/video/fbdev/riva/rivafb.h +f:drivers/video/fbdev/s1d13xxxfb.c +f:drivers/video/fbdev/s3c-fb.c +f:drivers/video/fbdev/s3fb.c +f:drivers/video/fbdev/sa1100fb.c +f:drivers/video/fbdev/sa1100fb.h +f:drivers/video/fbdev/savage/Makefile +f:drivers/video/fbdev/savage/savagefb-i2c.c +f:drivers/video/fbdev/savage/savagefb.h +f:drivers/video/fbdev/savage/savagefb_accel.c +f:drivers/video/fbdev/savage/savagefb_driver.c +f:drivers/video/fbdev/sbuslib.c +f:drivers/video/fbdev/sbuslib.h +f:drivers/video/fbdev/sh7760fb.c +f:drivers/video/fbdev/sh_mobile_lcdcfb.c +f:drivers/video/fbdev/sh_mobile_lcdcfb.h +f:drivers/video/fbdev/simplefb.c +f:drivers/video/fbdev/sis/300vtbl.h +f:drivers/video/fbdev/sis/310vtbl.h +f:drivers/video/fbdev/sis/Makefile +f:drivers/video/fbdev/sis/init.c +f:drivers/video/fbdev/sis/init.h +f:drivers/video/fbdev/sis/init301.c +f:drivers/video/fbdev/sis/init301.h +f:drivers/video/fbdev/sis/initdef.h +f:drivers/video/fbdev/sis/initextlfb.c +f:drivers/video/fbdev/sis/oem300.h +f:drivers/video/fbdev/sis/oem310.h +f:drivers/video/fbdev/sis/sis.h +f:drivers/video/fbdev/sis/sis_accel.c +f:drivers/video/fbdev/sis/sis_accel.h +f:drivers/video/fbdev/sis/sis_main.c +f:drivers/video/fbdev/sis/sis_main.h +f:drivers/video/fbdev/sis/vgatypes.h +f:drivers/video/fbdev/sis/vstruct.h +f:drivers/video/fbdev/skeletonfb.c +f:drivers/video/fbdev/sm501fb.c +f:drivers/video/fbdev/sm712.h +f:drivers/video/fbdev/sm712fb.c +f:drivers/video/fbdev/smscufx.c +f:drivers/video/fbdev/ssd1307fb.c +f:drivers/video/fbdev/sstfb.c +f:drivers/video/fbdev/stifb.c +f:drivers/video/fbdev/sunxvr1000.c +f:drivers/video/fbdev/sunxvr2500.c +f:drivers/video/fbdev/sunxvr500.c +f:drivers/video/fbdev/tcx.c +f:drivers/video/fbdev/tdfxfb.c +f:drivers/video/fbdev/tgafb.c +f:drivers/video/fbdev/tridentfb.c +f:drivers/video/fbdev/udlfb.c +f:drivers/video/fbdev/uvesafb.c +f:drivers/video/fbdev/valkyriefb.c +f:drivers/video/fbdev/valkyriefb.h +f:drivers/video/fbdev/vesafb.c +f:drivers/video/fbdev/vfb.c +f:drivers/video/fbdev/vga16fb.c +f:drivers/video/fbdev/via/Makefile +f:drivers/video/fbdev/via/accel.c +f:drivers/video/fbdev/via/accel.h +f:drivers/video/fbdev/via/chip.h +f:drivers/video/fbdev/via/debug.h +f:drivers/video/fbdev/via/dvi.c +f:drivers/video/fbdev/via/dvi.h +f:drivers/video/fbdev/via/global.c +f:drivers/video/fbdev/via/global.h +f:drivers/video/fbdev/via/hw.c +f:drivers/video/fbdev/via/hw.h +f:drivers/video/fbdev/via/ioctl.c +f:drivers/video/fbdev/via/ioctl.h +f:drivers/video/fbdev/via/lcd.c +f:drivers/video/fbdev/via/lcd.h +f:drivers/video/fbdev/via/share.h +f:drivers/video/fbdev/via/tblDPASetting.c +f:drivers/video/fbdev/via/tblDPASetting.h +f:drivers/video/fbdev/via/via-core.c +f:drivers/video/fbdev/via/via-gpio.c +f:drivers/video/fbdev/via/via-gpio.h +f:drivers/video/fbdev/via/via_aux.c +f:drivers/video/fbdev/via/via_aux.h +f:drivers/video/fbdev/via/via_aux_ch7301.c +f:drivers/video/fbdev/via/via_aux_edid.c +f:drivers/video/fbdev/via/via_aux_sii164.c +f:drivers/video/fbdev/via/via_aux_vt1621.c +f:drivers/video/fbdev/via/via_aux_vt1622.c +f:drivers/video/fbdev/via/via_aux_vt1625.c +f:drivers/video/fbdev/via/via_aux_vt1631.c +f:drivers/video/fbdev/via/via_aux_vt1632.c +f:drivers/video/fbdev/via/via_aux_vt1636.c +f:drivers/video/fbdev/via/via_clock.c +f:drivers/video/fbdev/via/via_clock.h +f:drivers/video/fbdev/via/via_i2c.c +f:drivers/video/fbdev/via/via_modesetting.c +f:drivers/video/fbdev/via/via_modesetting.h +f:drivers/video/fbdev/via/via_utility.c +f:drivers/video/fbdev/via/via_utility.h +f:drivers/video/fbdev/via/viafbdev.c +f:drivers/video/fbdev/via/viafbdev.h +f:drivers/video/fbdev/via/viamode.c +f:drivers/video/fbdev/via/viamode.h +f:drivers/video/fbdev/via/vt1636.c +f:drivers/video/fbdev/via/vt1636.h +f:drivers/video/fbdev/vt8500lcdfb.c +f:drivers/video/fbdev/vt8500lcdfb.h +f:drivers/video/fbdev/vt8623fb.c +f:drivers/video/fbdev/wm8505fb.c +f:drivers/video/fbdev/wm8505fb_regs.h +f:drivers/video/fbdev/wmt_ge_rops.c +f:drivers/video/fbdev/wmt_ge_rops.h +f:drivers/video/fbdev/xen-fbfront.c +f:drivers/video/fbdev/xilinxfb.c +f:drivers/video/hdmi.c +f:drivers/video/logo/.gitignore +f:drivers/video/logo/Kconfig +f:drivers/video/logo/Makefile +f:drivers/video/logo/clut_vga16.ppm +f:drivers/video/logo/logo.c +f:drivers/video/logo/logo_dec_clut224.ppm +f:drivers/video/logo/logo_linux_clut224.ppm +f:drivers/video/logo/logo_linux_mono.pbm +f:drivers/video/logo/logo_linux_vga16.ppm +f:drivers/video/logo/logo_mac_clut224.ppm +f:drivers/video/logo/logo_parisc_clut224.ppm +f:drivers/video/logo/logo_sgi_clut224.ppm +f:drivers/video/logo/logo_spe_clut224.ppm +f:drivers/video/logo/logo_sun_clut224.ppm +f:drivers/video/logo/logo_superh_clut224.ppm +f:drivers/video/logo/logo_superh_mono.pbm +f:drivers/video/logo/logo_superh_vga16.ppm +f:drivers/video/logo/pnmtologo.c +f:drivers/video/nomodeset.c +f:drivers/video/of_display_timing.c +f:drivers/video/of_videomode.c +f:drivers/video/screen_info_generic.c +f:drivers/video/screen_info_pci.c +f:drivers/video/sticore.c +f:drivers/video/vgastate.c +f:drivers/video/videomode.c +f:drivers/virt/Kconfig +f:drivers/virt/Makefile +f:drivers/virt/acrn/Kconfig +f:drivers/virt/acrn/Makefile +f:drivers/virt/acrn/acrn_drv.h +f:drivers/virt/acrn/hsm.c +f:drivers/virt/acrn/hypercall.h +f:drivers/virt/acrn/ioeventfd.c +f:drivers/virt/acrn/ioreq.c +f:drivers/virt/acrn/irqfd.c +f:drivers/virt/acrn/mm.c +f:drivers/virt/acrn/vm.c +f:drivers/virt/coco/Kconfig +f:drivers/virt/coco/Makefile +f:drivers/virt/coco/arm-cca-guest/Kconfig +f:drivers/virt/coco/arm-cca-guest/Makefile +f:drivers/virt/coco/arm-cca-guest/arm-cca-guest.c +f:drivers/virt/coco/efi_secret/Kconfig +f:drivers/virt/coco/efi_secret/Makefile +f:drivers/virt/coco/efi_secret/efi_secret.c +f:drivers/virt/coco/guest/Kconfig +f:drivers/virt/coco/guest/Makefile +f:drivers/virt/coco/guest/report.c +f:drivers/virt/coco/guest/tsm-mr.c +f:drivers/virt/coco/pkvm-guest/Kconfig +f:drivers/virt/coco/pkvm-guest/Makefile +f:drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c +f:drivers/virt/coco/sev-guest/Kconfig +f:drivers/virt/coco/sev-guest/Makefile +f:drivers/virt/coco/sev-guest/sev-guest.c +f:drivers/virt/coco/tdx-guest/Kconfig +f:drivers/virt/coco/tdx-guest/Makefile +f:drivers/virt/coco/tdx-guest/tdx-guest.c +f:drivers/virt/fsl_hypervisor.c +f:drivers/virt/nitro_enclaves/Kconfig +f:drivers/virt/nitro_enclaves/Makefile +f:drivers/virt/nitro_enclaves/ne_misc_dev.c +f:drivers/virt/nitro_enclaves/ne_misc_dev.h +f:drivers/virt/nitro_enclaves/ne_misc_dev_test.c +f:drivers/virt/nitro_enclaves/ne_pci_dev.c +f:drivers/virt/nitro_enclaves/ne_pci_dev.h +f:drivers/virt/vboxguest/Kconfig +f:drivers/virt/vboxguest/Makefile +f:drivers/virt/vboxguest/vboxguest_core.c +f:drivers/virt/vboxguest/vboxguest_core.h +f:drivers/virt/vboxguest/vboxguest_linux.c +f:drivers/virt/vboxguest/vboxguest_utils.c +f:drivers/virt/vboxguest/vboxguest_version.h +f:drivers/virt/vboxguest/vmmdev.h +f:drivers/virt/vmgenid.c +f:drivers/virtio/Kconfig +f:drivers/virtio/Makefile +f:drivers/virtio/virtio.c +f:drivers/virtio/virtio_anchor.c +f:drivers/virtio/virtio_balloon.c +f:drivers/virtio/virtio_debug.c +f:drivers/virtio/virtio_dma_buf.c +f:drivers/virtio/virtio_input.c +f:drivers/virtio/virtio_mem.c +f:drivers/virtio/virtio_mmio.c +f:drivers/virtio/virtio_pci_admin_legacy_io.c +f:drivers/virtio/virtio_pci_common.c +f:drivers/virtio/virtio_pci_common.h +f:drivers/virtio/virtio_pci_legacy.c +f:drivers/virtio/virtio_pci_legacy_dev.c +f:drivers/virtio/virtio_pci_modern.c +f:drivers/virtio/virtio_pci_modern_dev.c +f:drivers/virtio/virtio_ring.c +f:drivers/virtio/virtio_rtc_arm.c +f:drivers/virtio/virtio_rtc_class.c +f:drivers/virtio/virtio_rtc_driver.c +f:drivers/virtio/virtio_rtc_internal.h +f:drivers/virtio/virtio_rtc_ptp.c +f:drivers/virtio/virtio_vdpa.c +f:drivers/w1/Kconfig +f:drivers/w1/Makefile +f:drivers/w1/masters/Kconfig +f:drivers/w1/masters/Makefile +f:drivers/w1/masters/amd_axi_w1.c +f:drivers/w1/masters/ds2482.c +f:drivers/w1/masters/ds2490.c +f:drivers/w1/masters/matrox_w1.c +f:drivers/w1/masters/mxc_w1.c +f:drivers/w1/masters/omap_hdq.c +f:drivers/w1/masters/sgi_w1.c +f:drivers/w1/masters/w1-gpio.c +f:drivers/w1/masters/w1-uart.c +f:drivers/w1/slaves/Kconfig +f:drivers/w1/slaves/Makefile +f:drivers/w1/slaves/w1_ds2405.c +f:drivers/w1/slaves/w1_ds2406.c +f:drivers/w1/slaves/w1_ds2408.c +f:drivers/w1/slaves/w1_ds2413.c +f:drivers/w1/slaves/w1_ds2423.c +f:drivers/w1/slaves/w1_ds2430.c +f:drivers/w1/slaves/w1_ds2431.c +f:drivers/w1/slaves/w1_ds2433.c +f:drivers/w1/slaves/w1_ds2438.c +f:drivers/w1/slaves/w1_ds250x.c +f:drivers/w1/slaves/w1_ds2780.c +f:drivers/w1/slaves/w1_ds2780.h +f:drivers/w1/slaves/w1_ds2781.c +f:drivers/w1/slaves/w1_ds2781.h +f:drivers/w1/slaves/w1_ds2805.c +f:drivers/w1/slaves/w1_ds28e04.c +f:drivers/w1/slaves/w1_ds28e17.c +f:drivers/w1/slaves/w1_smem.c +f:drivers/w1/slaves/w1_therm.c +f:drivers/w1/w1.c +f:drivers/w1/w1_family.c +f:drivers/w1/w1_int.c +f:drivers/w1/w1_internal.h +f:drivers/w1/w1_io.c +f:drivers/w1/w1_netlink.c +f:drivers/w1/w1_netlink.h +f:drivers/watchdog/Kconfig +f:drivers/watchdog/Makefile +f:drivers/watchdog/acquirewdt.c +f:drivers/watchdog/advantech_ec_wdt.c +f:drivers/watchdog/advantechwdt.c +f:drivers/watchdog/airoha_wdt.c +f:drivers/watchdog/alim1535_wdt.c +f:drivers/watchdog/alim7101_wdt.c +f:drivers/watchdog/apple_wdt.c +f:drivers/watchdog/arm_smc_wdt.c +f:drivers/watchdog/armada_37xx_wdt.c +f:drivers/watchdog/asm9260_wdt.c +f:drivers/watchdog/aspeed_wdt.c +f:drivers/watchdog/at91rm9200_wdt.c +f:drivers/watchdog/at91sam9_wdt.c +f:drivers/watchdog/at91sam9_wdt.h +f:drivers/watchdog/ath79_wdt.c +f:drivers/watchdog/bcm2835_wdt.c +f:drivers/watchdog/bcm47xx_wdt.c +f:drivers/watchdog/bcm7038_wdt.c +f:drivers/watchdog/bcm_kona_wdt.c +f:drivers/watchdog/bd9576_wdt.c +f:drivers/watchdog/bd96801_wdt.c +f:drivers/watchdog/booke_wdt.c +f:drivers/watchdog/cadence_wdt.c +f:drivers/watchdog/cgbc_wdt.c +f:drivers/watchdog/cpwd.c +f:drivers/watchdog/cros_ec_wdt.c +f:drivers/watchdog/da9052_wdt.c +f:drivers/watchdog/da9055_wdt.c +f:drivers/watchdog/da9062_wdt.c +f:drivers/watchdog/da9063_wdt.c +f:drivers/watchdog/davinci_wdt.c +f:drivers/watchdog/db8500_wdt.c +f:drivers/watchdog/diag288_wdt.c +f:drivers/watchdog/digicolor_wdt.c +f:drivers/watchdog/dw_wdt.c +f:drivers/watchdog/ebc-c384_wdt.c +f:drivers/watchdog/ep93xx_wdt.c +f:drivers/watchdog/eurotechwdt.c +f:drivers/watchdog/exar_wdt.c +f:drivers/watchdog/f71808e_wdt.c +f:drivers/watchdog/ftwdt010_wdt.c +f:drivers/watchdog/gef_wdt.c +f:drivers/watchdog/geodewdt.c +f:drivers/watchdog/gpio_wdt.c +f:drivers/watchdog/gxp-wdt.c +f:drivers/watchdog/hpwdt.c +f:drivers/watchdog/i6300esb.c +f:drivers/watchdog/iTCO_vendor.h +f:drivers/watchdog/iTCO_vendor_support.c +f:drivers/watchdog/iTCO_wdt.c +f:drivers/watchdog/ib700wdt.c +f:drivers/watchdog/ibmasr.c +f:drivers/watchdog/ie6xx_wdt.c +f:drivers/watchdog/imgpdc_wdt.c +f:drivers/watchdog/imx2_wdt.c +f:drivers/watchdog/imx7ulp_wdt.c +f:drivers/watchdog/imx_sc_wdt.c +f:drivers/watchdog/indydog.c +f:drivers/watchdog/intel-mid_wdt.c +f:drivers/watchdog/intel_oc_wdt.c +f:drivers/watchdog/it8712f_wdt.c +f:drivers/watchdog/it87_wdt.c +f:drivers/watchdog/ixp4xx_wdt.c +f:drivers/watchdog/jz4740_wdt.c +f:drivers/watchdog/keembay_wdt.c +f:drivers/watchdog/kempld_wdt.c +f:drivers/watchdog/lantiq_wdt.c +f:drivers/watchdog/lenovo_se10_wdt.c +f:drivers/watchdog/lenovo_se30_wdt.c +f:drivers/watchdog/loongson1_wdt.c +f:drivers/watchdog/lpc18xx_wdt.c +f:drivers/watchdog/m54xx_wdt.c +f:drivers/watchdog/machzwd.c +f:drivers/watchdog/marvell_gti_wdt.c +f:drivers/watchdog/max63xx_wdt.c +f:drivers/watchdog/max77620_wdt.c +f:drivers/watchdog/mei_wdt.c +f:drivers/watchdog/mena21_wdt.c +f:drivers/watchdog/menf21bmc_wdt.c +f:drivers/watchdog/menz69_wdt.c +f:drivers/watchdog/meson_gxbb_wdt.c +f:drivers/watchdog/meson_wdt.c +f:drivers/watchdog/mixcomwd.c +f:drivers/watchdog/mlx_wdt.c +f:drivers/watchdog/moxart_wdt.c +f:drivers/watchdog/mpc8xxx_wdt.c +f:drivers/watchdog/msc313e_wdt.c +f:drivers/watchdog/mt7621_wdt.c +f:drivers/watchdog/mtk_wdt.c +f:drivers/watchdog/mtx-1_wdt.c +f:drivers/watchdog/ni903x_wdt.c +f:drivers/watchdog/nic7018_wdt.c +f:drivers/watchdog/npcm_wdt.c +f:drivers/watchdog/nv_tco.c +f:drivers/watchdog/nv_tco.h +f:drivers/watchdog/octeon-wdt-main.c +f:drivers/watchdog/octeon-wdt-nmi.S +f:drivers/watchdog/of_xilinx_wdt.c +f:drivers/watchdog/omap_wdt.c +f:drivers/watchdog/omap_wdt.h +f:drivers/watchdog/orion_wdt.c +f:drivers/watchdog/pc87413_wdt.c +f:drivers/watchdog/pcwd.c +f:drivers/watchdog/pcwd_pci.c +f:drivers/watchdog/pcwd_usb.c +f:drivers/watchdog/pic32-dmt.c +f:drivers/watchdog/pic32-wdt.c +f:drivers/watchdog/pika_wdt.c +f:drivers/watchdog/pm8916_wdt.c +f:drivers/watchdog/pnx4008_wdt.c +f:drivers/watchdog/pretimeout_noop.c +f:drivers/watchdog/pretimeout_panic.c +f:drivers/watchdog/pseries-wdt.c +f:drivers/watchdog/qcom-wdt.c +f:drivers/watchdog/rave-sp-wdt.c +f:drivers/watchdog/rc32434_wdt.c +f:drivers/watchdog/rdc321x_wdt.c +f:drivers/watchdog/realtek_otto_wdt.c +f:drivers/watchdog/renesas_wdt.c +f:drivers/watchdog/retu_wdt.c +f:drivers/watchdog/riowd.c +f:drivers/watchdog/rn5t618_wdt.c +f:drivers/watchdog/rt2880_wdt.c +f:drivers/watchdog/rtd119x_wdt.c +f:drivers/watchdog/rti_wdt.c +f:drivers/watchdog/rza_wdt.c +f:drivers/watchdog/rzg2l_wdt.c +f:drivers/watchdog/rzn1_wdt.c +f:drivers/watchdog/rzv2h_wdt.c +f:drivers/watchdog/s32g_wdt.c +f:drivers/watchdog/s3c2410_wdt.c +f:drivers/watchdog/sa1100_wdt.c +f:drivers/watchdog/sama5d4_wdt.c +f:drivers/watchdog/sb_wdog.c +f:drivers/watchdog/sbc60xxwdt.c +f:drivers/watchdog/sbc7240_wdt.c +f:drivers/watchdog/sbc8360.c +f:drivers/watchdog/sbc_epx_c3.c +f:drivers/watchdog/sbc_fitpc2_wdt.c +f:drivers/watchdog/sbsa_gwdt.c +f:drivers/watchdog/sc1200wdt.c +f:drivers/watchdog/sc520_wdt.c +f:drivers/watchdog/sch311x_wdt.c +f:drivers/watchdog/scx200_wdt.c +f:drivers/watchdog/shwdt.c +f:drivers/watchdog/simatic-ipc-wdt.c +f:drivers/watchdog/sl28cpld_wdt.c +f:drivers/watchdog/smsc37b787_wdt.c +f:drivers/watchdog/softdog.c +f:drivers/watchdog/sp5100_tco.c +f:drivers/watchdog/sp5100_tco.h +f:drivers/watchdog/sp805_wdt.c +f:drivers/watchdog/sprd_wdt.c +f:drivers/watchdog/st_lpc_wdt.c +f:drivers/watchdog/starfive-wdt.c +f:drivers/watchdog/stm32_iwdg.c +f:drivers/watchdog/stmp3xxx_rtc_wdt.c +f:drivers/watchdog/stpmic1_wdt.c +f:drivers/watchdog/sun4v_wdt.c +f:drivers/watchdog/sunplus_wdt.c +f:drivers/watchdog/sunxi_wdt.c +f:drivers/watchdog/tegra_wdt.c +f:drivers/watchdog/tqmx86_wdt.c +f:drivers/watchdog/ts4800_wdt.c +f:drivers/watchdog/ts72xx_wdt.c +f:drivers/watchdog/twl4030_wdt.c +f:drivers/watchdog/txx9wdt.c +f:drivers/watchdog/uniphier_wdt.c +f:drivers/watchdog/via_wdt.c +f:drivers/watchdog/visconti_wdt.c +f:drivers/watchdog/w83627hf_wdt.c +f:drivers/watchdog/w83877f_wdt.c +f:drivers/watchdog/w83977f_wdt.c +f:drivers/watchdog/wafer5823wdt.c +f:drivers/watchdog/watchdog_core.c +f:drivers/watchdog/watchdog_core.h +f:drivers/watchdog/watchdog_dev.c +f:drivers/watchdog/watchdog_hrtimer_pretimeout.c +f:drivers/watchdog/watchdog_pretimeout.c +f:drivers/watchdog/watchdog_pretimeout.h +f:drivers/watchdog/wd501p.h +f:drivers/watchdog/wdat_wdt.c +f:drivers/watchdog/wdrtas.c +f:drivers/watchdog/wdt.c +f:drivers/watchdog/wdt285.c +f:drivers/watchdog/wdt977.c +f:drivers/watchdog/wdt_pci.c +f:drivers/watchdog/wm831x_wdt.c +f:drivers/watchdog/wm8350_wdt.c +f:drivers/watchdog/xen_wdt.c +f:drivers/watchdog/xilinx_wwdt.c +f:drivers/watchdog/ziirave_wdt.c +f:drivers/xen/Kconfig +f:drivers/xen/Makefile +f:drivers/xen/acpi.c +f:drivers/xen/arm-device.c +f:drivers/xen/balloon.c +f:drivers/xen/biomerge.c +f:drivers/xen/cpu_hotplug.c +f:drivers/xen/dbgp.c +f:drivers/xen/efi.c +f:drivers/xen/events/Makefile +f:drivers/xen/events/events_2l.c +f:drivers/xen/events/events_base.c +f:drivers/xen/events/events_fifo.c +f:drivers/xen/events/events_internal.h +f:drivers/xen/evtchn.c +f:drivers/xen/features.c +f:drivers/xen/gntalloc.c +f:drivers/xen/gntdev-common.h +f:drivers/xen/gntdev-dmabuf.c +f:drivers/xen/gntdev-dmabuf.h +f:drivers/xen/gntdev.c +f:drivers/xen/grant-dma-iommu.c +f:drivers/xen/grant-dma-ops.c +f:drivers/xen/grant-table.c +f:drivers/xen/manage.c +f:drivers/xen/mcelog.c +f:drivers/xen/mem-reservation.c +f:drivers/xen/pci.c +f:drivers/xen/pcpu.c +f:drivers/xen/platform-pci.c +f:drivers/xen/privcmd-buf.c +f:drivers/xen/privcmd.c +f:drivers/xen/privcmd.h +f:drivers/xen/pvcalls-back.c +f:drivers/xen/pvcalls-front.c +f:drivers/xen/pvcalls-front.h +f:drivers/xen/swiotlb-xen.c +f:drivers/xen/sys-hypervisor.c +f:drivers/xen/time.c +f:drivers/xen/unpopulated-alloc.c +f:drivers/xen/xen-acpi-pad.c +f:drivers/xen/xen-acpi-processor.c +f:drivers/xen/xen-balloon.c +f:drivers/xen/xen-front-pgdir-shbuf.c +f:drivers/xen/xen-pciback/Makefile +f:drivers/xen/xen-pciback/conf_space.c +f:drivers/xen/xen-pciback/conf_space.h +f:drivers/xen/xen-pciback/conf_space_capability.c +f:drivers/xen/xen-pciback/conf_space_header.c +f:drivers/xen/xen-pciback/conf_space_quirks.c +f:drivers/xen/xen-pciback/conf_space_quirks.h +f:drivers/xen/xen-pciback/passthrough.c +f:drivers/xen/xen-pciback/pci_stub.c +f:drivers/xen/xen-pciback/pciback.h +f:drivers/xen/xen-pciback/pciback_ops.c +f:drivers/xen/xen-pciback/vpci.c +f:drivers/xen/xen-pciback/xenbus.c +f:drivers/xen/xen-scsiback.c +f:drivers/xen/xenbus/Makefile +f:drivers/xen/xenbus/xenbus.h +f:drivers/xen/xenbus/xenbus_client.c +f:drivers/xen/xenbus/xenbus_comms.c +f:drivers/xen/xenbus/xenbus_dev_backend.c +f:drivers/xen/xenbus/xenbus_dev_frontend.c +f:drivers/xen/xenbus/xenbus_probe.c +f:drivers/xen/xenbus/xenbus_probe_backend.c +f:drivers/xen/xenbus/xenbus_probe_frontend.c +f:drivers/xen/xenbus/xenbus_xs.c +f:drivers/xen/xenfs/Makefile +f:drivers/xen/xenfs/super.c +f:drivers/xen/xenfs/xenfs.h +f:drivers/xen/xenfs/xenstored.c +f:drivers/xen/xenfs/xensyms.c +f:drivers/xen/xlate_mmu.c +f:drivers/zorro/.gitignore +f:drivers/zorro/Kconfig +f:drivers/zorro/Makefile +f:drivers/zorro/gen-devlist.c +f:drivers/zorro/names.c +f:drivers/zorro/proc.c +f:drivers/zorro/zorro-driver.c +f:drivers/zorro/zorro-sysfs.c +f:drivers/zorro/zorro.c +f:drivers/zorro/zorro.h +f:drivers/zorro/zorro.ids +f:fs/9p/Kconfig +f:fs/9p/Makefile +f:fs/9p/acl.c +f:fs/9p/acl.h +f:fs/9p/cache.c +f:fs/9p/cache.h +f:fs/9p/fid.c +f:fs/9p/fid.h +f:fs/9p/v9fs.c +f:fs/9p/v9fs.h +f:fs/9p/v9fs_vfs.h +f:fs/9p/vfs_addr.c +f:fs/9p/vfs_dentry.c +f:fs/9p/vfs_dir.c +f:fs/9p/vfs_file.c +f:fs/9p/vfs_inode.c +f:fs/9p/vfs_inode_dotl.c +f:fs/9p/vfs_super.c +f:fs/9p/xattr.c +f:fs/9p/xattr.h +f:fs/Kconfig +f:fs/Kconfig.binfmt +f:fs/Makefile +f:fs/adfs/Kconfig +f:fs/adfs/Makefile +f:fs/adfs/adfs.h +f:fs/adfs/dir.c +f:fs/adfs/dir_f.c +f:fs/adfs/dir_f.h +f:fs/adfs/dir_fplus.c +f:fs/adfs/dir_fplus.h +f:fs/adfs/file.c +f:fs/adfs/inode.c +f:fs/adfs/map.c +f:fs/adfs/super.c +f:fs/affs/Changes +f:fs/affs/Kconfig +f:fs/affs/Makefile +f:fs/affs/affs.h +f:fs/affs/amigaffs.c +f:fs/affs/amigaffs.h +f:fs/affs/bitmap.c +f:fs/affs/dir.c +f:fs/affs/file.c +f:fs/affs/inode.c +f:fs/affs/namei.c +f:fs/affs/super.c +f:fs/affs/symlink.c +f:fs/afs/Kconfig +f:fs/afs/Makefile +f:fs/afs/addr_list.c +f:fs/afs/addr_prefs.c +f:fs/afs/afs.h +f:fs/afs/afs_cm.h +f:fs/afs/afs_fs.h +f:fs/afs/afs_vl.h +f:fs/afs/callback.c +f:fs/afs/cell.c +f:fs/afs/cm_security.c +f:fs/afs/cmservice.c +f:fs/afs/dir.c +f:fs/afs/dir_edit.c +f:fs/afs/dir_search.c +f:fs/afs/dir_silly.c +f:fs/afs/dynroot.c +f:fs/afs/file.c +f:fs/afs/flock.c +f:fs/afs/fs_operation.c +f:fs/afs/fs_probe.c +f:fs/afs/fsclient.c +f:fs/afs/inode.c +f:fs/afs/internal.h +f:fs/afs/main.c +f:fs/afs/misc.c +f:fs/afs/mntpt.c +f:fs/afs/proc.c +f:fs/afs/protocol_afs.h +f:fs/afs/protocol_uae.h +f:fs/afs/protocol_yfs.h +f:fs/afs/rotate.c +f:fs/afs/rxrpc.c +f:fs/afs/security.c +f:fs/afs/server.c +f:fs/afs/server_list.c +f:fs/afs/super.c +f:fs/afs/validation.c +f:fs/afs/vl_alias.c +f:fs/afs/vl_list.c +f:fs/afs/vl_probe.c +f:fs/afs/vl_rotate.c +f:fs/afs/vlclient.c +f:fs/afs/volume.c +f:fs/afs/write.c +f:fs/afs/xattr.c +f:fs/afs/xdr_fs.h +f:fs/afs/yfsclient.c +f:fs/aio.c +f:fs/anon_inodes.c +f:fs/attr.c +f:fs/autofs/Kconfig +f:fs/autofs/Makefile +f:fs/autofs/autofs_i.h +f:fs/autofs/dev-ioctl.c +f:fs/autofs/expire.c +f:fs/autofs/init.c +f:fs/autofs/inode.c +f:fs/autofs/root.c +f:fs/autofs/symlink.c +f:fs/autofs/waitq.c +f:fs/backing-file.c +f:fs/bad_inode.c +f:fs/bcachefs/Kconfig +f:fs/bcachefs/Makefile +f:fs/bcachefs/acl.c +f:fs/bcachefs/acl.h +f:fs/bcachefs/alloc_background.c +f:fs/bcachefs/alloc_background.h +f:fs/bcachefs/alloc_background_format.h +f:fs/bcachefs/alloc_foreground.c +f:fs/bcachefs/alloc_foreground.h +f:fs/bcachefs/alloc_types.h +f:fs/bcachefs/async_objs.c +f:fs/bcachefs/async_objs.h +f:fs/bcachefs/async_objs_types.h +f:fs/bcachefs/backpointers.c +f:fs/bcachefs/backpointers.h +f:fs/bcachefs/bbpos.h +f:fs/bcachefs/bbpos_types.h +f:fs/bcachefs/bcachefs.h +f:fs/bcachefs/bcachefs_format.h +f:fs/bcachefs/bcachefs_ioctl.h +f:fs/bcachefs/bkey.c +f:fs/bcachefs/bkey.h +f:fs/bcachefs/bkey_buf.h +f:fs/bcachefs/bkey_cmp.h +f:fs/bcachefs/bkey_methods.c +f:fs/bcachefs/bkey_methods.h +f:fs/bcachefs/bkey_sort.c +f:fs/bcachefs/bkey_sort.h +f:fs/bcachefs/bkey_types.h +f:fs/bcachefs/bset.c +f:fs/bcachefs/bset.h +f:fs/bcachefs/btree_cache.c +f:fs/bcachefs/btree_cache.h +f:fs/bcachefs/btree_gc.c +f:fs/bcachefs/btree_gc.h +f:fs/bcachefs/btree_gc_types.h +f:fs/bcachefs/btree_io.c +f:fs/bcachefs/btree_io.h +f:fs/bcachefs/btree_iter.c +f:fs/bcachefs/btree_iter.h +f:fs/bcachefs/btree_journal_iter.c +f:fs/bcachefs/btree_journal_iter.h +f:fs/bcachefs/btree_journal_iter_types.h +f:fs/bcachefs/btree_key_cache.c +f:fs/bcachefs/btree_key_cache.h +f:fs/bcachefs/btree_key_cache_types.h +f:fs/bcachefs/btree_locking.c +f:fs/bcachefs/btree_locking.h +f:fs/bcachefs/btree_node_scan.c +f:fs/bcachefs/btree_node_scan.h +f:fs/bcachefs/btree_node_scan_types.h +f:fs/bcachefs/btree_trans_commit.c +f:fs/bcachefs/btree_types.h +f:fs/bcachefs/btree_update.c +f:fs/bcachefs/btree_update.h +f:fs/bcachefs/btree_update_interior.c +f:fs/bcachefs/btree_update_interior.h +f:fs/bcachefs/btree_write_buffer.c +f:fs/bcachefs/btree_write_buffer.h +f:fs/bcachefs/btree_write_buffer_types.h +f:fs/bcachefs/buckets.c +f:fs/bcachefs/buckets.h +f:fs/bcachefs/buckets_types.h +f:fs/bcachefs/buckets_waiting_for_journal.c +f:fs/bcachefs/buckets_waiting_for_journal.h +f:fs/bcachefs/buckets_waiting_for_journal_types.h +f:fs/bcachefs/chardev.c +f:fs/bcachefs/chardev.h +f:fs/bcachefs/checksum.c +f:fs/bcachefs/checksum.h +f:fs/bcachefs/clock.c +f:fs/bcachefs/clock.h +f:fs/bcachefs/clock_types.h +f:fs/bcachefs/compress.c +f:fs/bcachefs/compress.h +f:fs/bcachefs/darray.c +f:fs/bcachefs/darray.h +f:fs/bcachefs/data_update.c +f:fs/bcachefs/data_update.h +f:fs/bcachefs/debug.c +f:fs/bcachefs/debug.h +f:fs/bcachefs/dirent.c +f:fs/bcachefs/dirent.h +f:fs/bcachefs/dirent_format.h +f:fs/bcachefs/disk_accounting.c +f:fs/bcachefs/disk_accounting.h +f:fs/bcachefs/disk_accounting_format.h +f:fs/bcachefs/disk_accounting_types.h +f:fs/bcachefs/disk_groups.c +f:fs/bcachefs/disk_groups.h +f:fs/bcachefs/disk_groups_format.h +f:fs/bcachefs/disk_groups_types.h +f:fs/bcachefs/ec.c +f:fs/bcachefs/ec.h +f:fs/bcachefs/ec_format.h +f:fs/bcachefs/ec_types.h +f:fs/bcachefs/enumerated_ref.c +f:fs/bcachefs/enumerated_ref.h +f:fs/bcachefs/enumerated_ref_types.h +f:fs/bcachefs/errcode.c +f:fs/bcachefs/errcode.h +f:fs/bcachefs/error.c +f:fs/bcachefs/error.h +f:fs/bcachefs/extent_update.c +f:fs/bcachefs/extent_update.h +f:fs/bcachefs/extents.c +f:fs/bcachefs/extents.h +f:fs/bcachefs/extents_format.h +f:fs/bcachefs/extents_types.h +f:fs/bcachefs/eytzinger.c +f:fs/bcachefs/eytzinger.h +f:fs/bcachefs/fast_list.c +f:fs/bcachefs/fast_list.h +f:fs/bcachefs/fifo.h +f:fs/bcachefs/fs-io-buffered.c +f:fs/bcachefs/fs-io-buffered.h +f:fs/bcachefs/fs-io-direct.c +f:fs/bcachefs/fs-io-direct.h +f:fs/bcachefs/fs-io-pagecache.c +f:fs/bcachefs/fs-io-pagecache.h +f:fs/bcachefs/fs-io.c +f:fs/bcachefs/fs-io.h +f:fs/bcachefs/fs-ioctl.c +f:fs/bcachefs/fs-ioctl.h +f:fs/bcachefs/fs.c +f:fs/bcachefs/fs.h +f:fs/bcachefs/fsck.c +f:fs/bcachefs/fsck.h +f:fs/bcachefs/inode.c +f:fs/bcachefs/inode.h +f:fs/bcachefs/inode_format.h +f:fs/bcachefs/io_misc.c +f:fs/bcachefs/io_misc.h +f:fs/bcachefs/io_read.c +f:fs/bcachefs/io_read.h +f:fs/bcachefs/io_write.c +f:fs/bcachefs/io_write.h +f:fs/bcachefs/io_write_types.h +f:fs/bcachefs/journal.c +f:fs/bcachefs/journal.h +f:fs/bcachefs/journal_io.c +f:fs/bcachefs/journal_io.h +f:fs/bcachefs/journal_reclaim.c +f:fs/bcachefs/journal_reclaim.h +f:fs/bcachefs/journal_sb.c +f:fs/bcachefs/journal_sb.h +f:fs/bcachefs/journal_seq_blacklist.c +f:fs/bcachefs/journal_seq_blacklist.h +f:fs/bcachefs/journal_seq_blacklist_format.h +f:fs/bcachefs/journal_types.h +f:fs/bcachefs/keylist.c +f:fs/bcachefs/keylist.h +f:fs/bcachefs/keylist_types.h +f:fs/bcachefs/logged_ops.c +f:fs/bcachefs/logged_ops.h +f:fs/bcachefs/logged_ops_format.h +f:fs/bcachefs/lru.c +f:fs/bcachefs/lru.h +f:fs/bcachefs/lru_format.h +f:fs/bcachefs/mean_and_variance.c +f:fs/bcachefs/mean_and_variance.h +f:fs/bcachefs/mean_and_variance_test.c +f:fs/bcachefs/migrate.c +f:fs/bcachefs/migrate.h +f:fs/bcachefs/move.c +f:fs/bcachefs/move.h +f:fs/bcachefs/move_types.h +f:fs/bcachefs/movinggc.c +f:fs/bcachefs/movinggc.h +f:fs/bcachefs/namei.c +f:fs/bcachefs/namei.h +f:fs/bcachefs/nocow_locking.c +f:fs/bcachefs/nocow_locking.h +f:fs/bcachefs/nocow_locking_types.h +f:fs/bcachefs/opts.c +f:fs/bcachefs/opts.h +f:fs/bcachefs/printbuf.c +f:fs/bcachefs/printbuf.h +f:fs/bcachefs/progress.c +f:fs/bcachefs/progress.h +f:fs/bcachefs/quota.c +f:fs/bcachefs/quota.h +f:fs/bcachefs/quota_format.h +f:fs/bcachefs/quota_types.h +f:fs/bcachefs/rcu_pending.c +f:fs/bcachefs/rcu_pending.h +f:fs/bcachefs/rebalance.c +f:fs/bcachefs/rebalance.h +f:fs/bcachefs/rebalance_format.h +f:fs/bcachefs/rebalance_types.h +f:fs/bcachefs/recovery.c +f:fs/bcachefs/recovery.h +f:fs/bcachefs/recovery_passes.c +f:fs/bcachefs/recovery_passes.h +f:fs/bcachefs/recovery_passes_format.h +f:fs/bcachefs/recovery_passes_types.h +f:fs/bcachefs/reflink.c +f:fs/bcachefs/reflink.h +f:fs/bcachefs/reflink_format.h +f:fs/bcachefs/replicas.c +f:fs/bcachefs/replicas.h +f:fs/bcachefs/replicas_format.h +f:fs/bcachefs/replicas_types.h +f:fs/bcachefs/sb-clean.c +f:fs/bcachefs/sb-clean.h +f:fs/bcachefs/sb-counters.c +f:fs/bcachefs/sb-counters.h +f:fs/bcachefs/sb-counters_format.h +f:fs/bcachefs/sb-downgrade.c +f:fs/bcachefs/sb-downgrade.h +f:fs/bcachefs/sb-downgrade_format.h +f:fs/bcachefs/sb-errors.c +f:fs/bcachefs/sb-errors.h +f:fs/bcachefs/sb-errors_format.h +f:fs/bcachefs/sb-errors_types.h +f:fs/bcachefs/sb-members.c +f:fs/bcachefs/sb-members.h +f:fs/bcachefs/sb-members_format.h +f:fs/bcachefs/sb-members_types.h +f:fs/bcachefs/seqmutex.h +f:fs/bcachefs/siphash.c +f:fs/bcachefs/siphash.h +f:fs/bcachefs/six.c +f:fs/bcachefs/six.h +f:fs/bcachefs/snapshot.c +f:fs/bcachefs/snapshot.h +f:fs/bcachefs/snapshot_format.h +f:fs/bcachefs/snapshot_types.h +f:fs/bcachefs/str_hash.c +f:fs/bcachefs/str_hash.h +f:fs/bcachefs/subvolume.c +f:fs/bcachefs/subvolume.h +f:fs/bcachefs/subvolume_format.h +f:fs/bcachefs/subvolume_types.h +f:fs/bcachefs/super-io.c +f:fs/bcachefs/super-io.h +f:fs/bcachefs/super.c +f:fs/bcachefs/super.h +f:fs/bcachefs/super_types.h +f:fs/bcachefs/sysfs.c +f:fs/bcachefs/sysfs.h +f:fs/bcachefs/tests.c +f:fs/bcachefs/tests.h +f:fs/bcachefs/thread_with_file.c +f:fs/bcachefs/thread_with_file.h +f:fs/bcachefs/thread_with_file_types.h +f:fs/bcachefs/time_stats.c +f:fs/bcachefs/time_stats.h +f:fs/bcachefs/trace.c +f:fs/bcachefs/trace.h +f:fs/bcachefs/two_state_shared_lock.c +f:fs/bcachefs/two_state_shared_lock.h +f:fs/bcachefs/util.c +f:fs/bcachefs/util.h +f:fs/bcachefs/varint.c +f:fs/bcachefs/varint.h +f:fs/bcachefs/vstructs.h +f:fs/bcachefs/xattr.c +f:fs/bcachefs/xattr.h +f:fs/bcachefs/xattr_format.h +f:fs/befs/ChangeLog +f:fs/befs/Kconfig +f:fs/befs/Makefile +f:fs/befs/befs.h +f:fs/befs/befs_fs_types.h +f:fs/befs/btree.c +f:fs/befs/btree.h +f:fs/befs/datastream.c +f:fs/befs/datastream.h +f:fs/befs/debug.c +f:fs/befs/endian.h +f:fs/befs/inode.c +f:fs/befs/inode.h +f:fs/befs/io.c +f:fs/befs/io.h +f:fs/befs/linuxvfs.c +f:fs/befs/super.c +f:fs/befs/super.h +f:fs/bfs/Kconfig +f:fs/bfs/Makefile +f:fs/bfs/bfs.h +f:fs/bfs/dir.c +f:fs/bfs/file.c +f:fs/bfs/inode.c +f:fs/binfmt_elf.c +f:fs/binfmt_elf_fdpic.c +f:fs/binfmt_flat.c +f:fs/binfmt_misc.c +f:fs/binfmt_script.c +f:fs/bpf_fs_kfuncs.c +f:fs/btrfs/Kconfig +f:fs/btrfs/Makefile +f:fs/btrfs/accessors.c +f:fs/btrfs/accessors.h +f:fs/btrfs/acl.c +f:fs/btrfs/acl.h +f:fs/btrfs/async-thread.c +f:fs/btrfs/async-thread.h +f:fs/btrfs/backref.c +f:fs/btrfs/backref.h +f:fs/btrfs/bio.c +f:fs/btrfs/bio.h +f:fs/btrfs/block-group.c +f:fs/btrfs/block-group.h +f:fs/btrfs/block-rsv.c +f:fs/btrfs/block-rsv.h +f:fs/btrfs/btrfs_inode.h +f:fs/btrfs/compression.c +f:fs/btrfs/compression.h +f:fs/btrfs/ctree.c +f:fs/btrfs/ctree.h +f:fs/btrfs/defrag.c +f:fs/btrfs/defrag.h +f:fs/btrfs/delalloc-space.c +f:fs/btrfs/delalloc-space.h +f:fs/btrfs/delayed-inode.c +f:fs/btrfs/delayed-inode.h +f:fs/btrfs/delayed-ref.c +f:fs/btrfs/delayed-ref.h +f:fs/btrfs/dev-replace.c +f:fs/btrfs/dev-replace.h +f:fs/btrfs/dir-item.c +f:fs/btrfs/dir-item.h +f:fs/btrfs/direct-io.c +f:fs/btrfs/direct-io.h +f:fs/btrfs/discard.c +f:fs/btrfs/discard.h +f:fs/btrfs/disk-io.c +f:fs/btrfs/disk-io.h +f:fs/btrfs/export.c +f:fs/btrfs/export.h +f:fs/btrfs/extent-io-tree.c +f:fs/btrfs/extent-io-tree.h +f:fs/btrfs/extent-tree.c +f:fs/btrfs/extent-tree.h +f:fs/btrfs/extent_io.c +f:fs/btrfs/extent_io.h +f:fs/btrfs/extent_map.c +f:fs/btrfs/extent_map.h +f:fs/btrfs/fiemap.c +f:fs/btrfs/fiemap.h +f:fs/btrfs/file-item.c +f:fs/btrfs/file-item.h +f:fs/btrfs/file.c +f:fs/btrfs/file.h +f:fs/btrfs/free-space-cache.c +f:fs/btrfs/free-space-cache.h +f:fs/btrfs/free-space-tree.c +f:fs/btrfs/free-space-tree.h +f:fs/btrfs/fs.c +f:fs/btrfs/fs.h +f:fs/btrfs/inode-item.c +f:fs/btrfs/inode-item.h +f:fs/btrfs/inode.c +f:fs/btrfs/ioctl.c +f:fs/btrfs/ioctl.h +f:fs/btrfs/locking.c +f:fs/btrfs/locking.h +f:fs/btrfs/lru_cache.c +f:fs/btrfs/lru_cache.h +f:fs/btrfs/lzo.c +f:fs/btrfs/messages.c +f:fs/btrfs/messages.h +f:fs/btrfs/misc.h +f:fs/btrfs/ordered-data.c +f:fs/btrfs/ordered-data.h +f:fs/btrfs/orphan.c +f:fs/btrfs/orphan.h +f:fs/btrfs/print-tree.c +f:fs/btrfs/print-tree.h +f:fs/btrfs/props.c +f:fs/btrfs/props.h +f:fs/btrfs/qgroup.c +f:fs/btrfs/qgroup.h +f:fs/btrfs/raid-stripe-tree.c +f:fs/btrfs/raid-stripe-tree.h +f:fs/btrfs/raid56.c +f:fs/btrfs/raid56.h +f:fs/btrfs/ref-verify.c +f:fs/btrfs/ref-verify.h +f:fs/btrfs/reflink.c +f:fs/btrfs/reflink.h +f:fs/btrfs/relocation.c +f:fs/btrfs/relocation.h +f:fs/btrfs/root-tree.c +f:fs/btrfs/root-tree.h +f:fs/btrfs/scrub.c +f:fs/btrfs/scrub.h +f:fs/btrfs/send.c +f:fs/btrfs/send.h +f:fs/btrfs/space-info.c +f:fs/btrfs/space-info.h +f:fs/btrfs/subpage.c +f:fs/btrfs/subpage.h +f:fs/btrfs/super.c +f:fs/btrfs/super.h +f:fs/btrfs/sysfs.c +f:fs/btrfs/sysfs.h +f:fs/btrfs/tests/btrfs-tests.c +f:fs/btrfs/tests/btrfs-tests.h +f:fs/btrfs/tests/delayed-refs-tests.c +f:fs/btrfs/tests/extent-buffer-tests.c +f:fs/btrfs/tests/extent-io-tests.c +f:fs/btrfs/tests/extent-map-tests.c +f:fs/btrfs/tests/free-space-tests.c +f:fs/btrfs/tests/free-space-tree-tests.c +f:fs/btrfs/tests/inode-tests.c +f:fs/btrfs/tests/qgroup-tests.c +f:fs/btrfs/tests/raid-stripe-tree-tests.c +f:fs/btrfs/transaction.c +f:fs/btrfs/transaction.h +f:fs/btrfs/tree-checker.c +f:fs/btrfs/tree-checker.h +f:fs/btrfs/tree-log.c +f:fs/btrfs/tree-log.h +f:fs/btrfs/tree-mod-log.c +f:fs/btrfs/tree-mod-log.h +f:fs/btrfs/ulist.c +f:fs/btrfs/ulist.h +f:fs/btrfs/uuid-tree.c +f:fs/btrfs/uuid-tree.h +f:fs/btrfs/verity.c +f:fs/btrfs/verity.h +f:fs/btrfs/volumes.c +f:fs/btrfs/volumes.h +f:fs/btrfs/xattr.c +f:fs/btrfs/xattr.h +f:fs/btrfs/zlib.c +f:fs/btrfs/zoned.c +f:fs/btrfs/zoned.h +f:fs/btrfs/zstd.c +f:fs/buffer.c +f:fs/cachefiles/Kconfig +f:fs/cachefiles/Makefile +f:fs/cachefiles/cache.c +f:fs/cachefiles/daemon.c +f:fs/cachefiles/error_inject.c +f:fs/cachefiles/interface.c +f:fs/cachefiles/internal.h +f:fs/cachefiles/io.c +f:fs/cachefiles/key.c +f:fs/cachefiles/main.c +f:fs/cachefiles/namei.c +f:fs/cachefiles/ondemand.c +f:fs/cachefiles/security.c +f:fs/cachefiles/volume.c +f:fs/cachefiles/xattr.c +f:fs/ceph/Kconfig +f:fs/ceph/Makefile +f:fs/ceph/acl.c +f:fs/ceph/addr.c +f:fs/ceph/cache.c +f:fs/ceph/cache.h +f:fs/ceph/caps.c +f:fs/ceph/ceph_frag.c +f:fs/ceph/crypto.c +f:fs/ceph/crypto.h +f:fs/ceph/debugfs.c +f:fs/ceph/dir.c +f:fs/ceph/export.c +f:fs/ceph/file.c +f:fs/ceph/inode.c +f:fs/ceph/io.c +f:fs/ceph/io.h +f:fs/ceph/ioctl.c +f:fs/ceph/ioctl.h +f:fs/ceph/locks.c +f:fs/ceph/mds_client.c +f:fs/ceph/mds_client.h +f:fs/ceph/mdsmap.c +f:fs/ceph/mdsmap.h +f:fs/ceph/metric.c +f:fs/ceph/metric.h +f:fs/ceph/quota.c +f:fs/ceph/snap.c +f:fs/ceph/strings.c +f:fs/ceph/super.c +f:fs/ceph/super.h +f:fs/ceph/util.c +f:fs/ceph/xattr.c +f:fs/char_dev.c +f:fs/coda/Kconfig +f:fs/coda/Makefile +f:fs/coda/cache.c +f:fs/coda/cnode.c +f:fs/coda/coda_cache.h +f:fs/coda/coda_fs_i.h +f:fs/coda/coda_int.h +f:fs/coda/coda_linux.c +f:fs/coda/coda_linux.h +f:fs/coda/coda_psdev.h +f:fs/coda/dir.c +f:fs/coda/file.c +f:fs/coda/inode.c +f:fs/coda/pioctl.c +f:fs/coda/psdev.c +f:fs/coda/symlink.c +f:fs/coda/sysctl.c +f:fs/coda/upcall.c +f:fs/compat_binfmt_elf.c +f:fs/configfs/Kconfig +f:fs/configfs/Makefile +f:fs/configfs/configfs_internal.h +f:fs/configfs/dir.c +f:fs/configfs/file.c +f:fs/configfs/inode.c +f:fs/configfs/item.c +f:fs/configfs/mount.c +f:fs/configfs/symlink.c +f:fs/coredump.c +f:fs/cramfs/Kconfig +f:fs/cramfs/Makefile +f:fs/cramfs/README +f:fs/cramfs/inode.c +f:fs/cramfs/internal.h +f:fs/cramfs/uncompress.c +f:fs/crypto/Kconfig +f:fs/crypto/Makefile +f:fs/crypto/bio.c +f:fs/crypto/crypto.c +f:fs/crypto/fname.c +f:fs/crypto/fscrypt_private.h +f:fs/crypto/hkdf.c +f:fs/crypto/hooks.c +f:fs/crypto/inline_crypt.c +f:fs/crypto/keyring.c +f:fs/crypto/keysetup.c +f:fs/crypto/keysetup_v1.c +f:fs/crypto/policy.c +f:fs/d_path.c +f:fs/dax.c +f:fs/dcache.c +f:fs/debugfs/Makefile +f:fs/debugfs/file.c +f:fs/debugfs/inode.c +f:fs/debugfs/internal.h +f:fs/devpts/Makefile +f:fs/devpts/inode.c +f:fs/direct-io.c +f:fs/dlm/Kconfig +f:fs/dlm/Makefile +f:fs/dlm/ast.c +f:fs/dlm/ast.h +f:fs/dlm/config.c +f:fs/dlm/config.h +f:fs/dlm/debug_fs.c +f:fs/dlm/dir.c +f:fs/dlm/dir.h +f:fs/dlm/dlm_internal.h +f:fs/dlm/lock.c +f:fs/dlm/lock.h +f:fs/dlm/lockspace.c +f:fs/dlm/lockspace.h +f:fs/dlm/lowcomms.c +f:fs/dlm/lowcomms.h +f:fs/dlm/lvb_table.h +f:fs/dlm/main.c +f:fs/dlm/member.c +f:fs/dlm/member.h +f:fs/dlm/memory.c +f:fs/dlm/memory.h +f:fs/dlm/midcomms.c +f:fs/dlm/midcomms.h +f:fs/dlm/plock.c +f:fs/dlm/rcom.c +f:fs/dlm/rcom.h +f:fs/dlm/recover.c +f:fs/dlm/recover.h +f:fs/dlm/recoverd.c +f:fs/dlm/recoverd.h +f:fs/dlm/requestqueue.c +f:fs/dlm/requestqueue.h +f:fs/dlm/user.c +f:fs/dlm/user.h +f:fs/dlm/util.c +f:fs/dlm/util.h +f:fs/drop_caches.c +f:fs/ecryptfs/Kconfig +f:fs/ecryptfs/Makefile +f:fs/ecryptfs/crypto.c +f:fs/ecryptfs/debug.c +f:fs/ecryptfs/dentry.c +f:fs/ecryptfs/ecryptfs_kernel.h +f:fs/ecryptfs/file.c +f:fs/ecryptfs/inode.c +f:fs/ecryptfs/keystore.c +f:fs/ecryptfs/kthread.c +f:fs/ecryptfs/main.c +f:fs/ecryptfs/messaging.c +f:fs/ecryptfs/miscdev.c +f:fs/ecryptfs/mmap.c +f:fs/ecryptfs/read_write.c +f:fs/ecryptfs/super.c +f:fs/efivarfs/Kconfig +f:fs/efivarfs/Makefile +f:fs/efivarfs/file.c +f:fs/efivarfs/inode.c +f:fs/efivarfs/internal.h +f:fs/efivarfs/super.c +f:fs/efivarfs/vars.c +f:fs/efs/Kconfig +f:fs/efs/Makefile +f:fs/efs/dir.c +f:fs/efs/efs.h +f:fs/efs/file.c +f:fs/efs/inode.c +f:fs/efs/namei.c +f:fs/efs/super.c +f:fs/efs/symlink.c +f:fs/erofs/Kconfig +f:fs/erofs/Makefile +f:fs/erofs/compress.h +f:fs/erofs/data.c +f:fs/erofs/decompressor.c +f:fs/erofs/decompressor_crypto.c +f:fs/erofs/decompressor_deflate.c +f:fs/erofs/decompressor_lzma.c +f:fs/erofs/decompressor_zstd.c +f:fs/erofs/dir.c +f:fs/erofs/erofs_fs.h +f:fs/erofs/fileio.c +f:fs/erofs/fscache.c +f:fs/erofs/inode.c +f:fs/erofs/internal.h +f:fs/erofs/namei.c +f:fs/erofs/super.c +f:fs/erofs/sysfs.c +f:fs/erofs/xattr.c +f:fs/erofs/xattr.h +f:fs/erofs/zdata.c +f:fs/erofs/zmap.c +f:fs/erofs/zutil.c +f:fs/eventfd.c +f:fs/eventpoll.c +f:fs/exec.c +f:fs/exfat/Kconfig +f:fs/exfat/Makefile +f:fs/exfat/balloc.c +f:fs/exfat/cache.c +f:fs/exfat/dir.c +f:fs/exfat/exfat_fs.h +f:fs/exfat/exfat_raw.h +f:fs/exfat/fatent.c +f:fs/exfat/file.c +f:fs/exfat/inode.c +f:fs/exfat/misc.c +f:fs/exfat/namei.c +f:fs/exfat/nls.c +f:fs/exfat/super.c +f:fs/exportfs/Makefile +f:fs/exportfs/expfs.c +f:fs/ext2/Kconfig +f:fs/ext2/Makefile +f:fs/ext2/acl.c +f:fs/ext2/acl.h +f:fs/ext2/balloc.c +f:fs/ext2/dir.c +f:fs/ext2/ext2.h +f:fs/ext2/file.c +f:fs/ext2/ialloc.c +f:fs/ext2/inode.c +f:fs/ext2/ioctl.c +f:fs/ext2/namei.c +f:fs/ext2/super.c +f:fs/ext2/symlink.c +f:fs/ext2/trace.c +f:fs/ext2/trace.h +f:fs/ext2/xattr.c +f:fs/ext2/xattr.h +f:fs/ext2/xattr_security.c +f:fs/ext2/xattr_trusted.c +f:fs/ext2/xattr_user.c +f:fs/ext4/.kunitconfig +f:fs/ext4/Kconfig +f:fs/ext4/Makefile +f:fs/ext4/acl.c +f:fs/ext4/acl.h +f:fs/ext4/balloc.c +f:fs/ext4/bitmap.c +f:fs/ext4/block_validity.c +f:fs/ext4/crypto.c +f:fs/ext4/dir.c +f:fs/ext4/ext4.h +f:fs/ext4/ext4_extents.h +f:fs/ext4/ext4_jbd2.c +f:fs/ext4/ext4_jbd2.h +f:fs/ext4/extents.c +f:fs/ext4/extents_status.c +f:fs/ext4/extents_status.h +f:fs/ext4/fast_commit.c +f:fs/ext4/fast_commit.h +f:fs/ext4/file.c +f:fs/ext4/fsmap.c +f:fs/ext4/fsmap.h +f:fs/ext4/fsync.c +f:fs/ext4/hash.c +f:fs/ext4/ialloc.c +f:fs/ext4/indirect.c +f:fs/ext4/inline.c +f:fs/ext4/inode-test.c +f:fs/ext4/inode.c +f:fs/ext4/ioctl.c +f:fs/ext4/mballoc-test.c +f:fs/ext4/mballoc.c +f:fs/ext4/mballoc.h +f:fs/ext4/migrate.c +f:fs/ext4/mmp.c +f:fs/ext4/move_extent.c +f:fs/ext4/namei.c +f:fs/ext4/orphan.c +f:fs/ext4/page-io.c +f:fs/ext4/readpage.c +f:fs/ext4/resize.c +f:fs/ext4/super.c +f:fs/ext4/symlink.c +f:fs/ext4/sysfs.c +f:fs/ext4/truncate.h +f:fs/ext4/verity.c +f:fs/ext4/xattr.c +f:fs/ext4/xattr.h +f:fs/ext4/xattr_hurd.c +f:fs/ext4/xattr_security.c +f:fs/ext4/xattr_trusted.c +f:fs/ext4/xattr_user.c +f:fs/f2fs/Kconfig +f:fs/f2fs/Makefile +f:fs/f2fs/acl.c +f:fs/f2fs/acl.h +f:fs/f2fs/checkpoint.c +f:fs/f2fs/compress.c +f:fs/f2fs/data.c +f:fs/f2fs/debug.c +f:fs/f2fs/dir.c +f:fs/f2fs/extent_cache.c +f:fs/f2fs/f2fs.h +f:fs/f2fs/file.c +f:fs/f2fs/gc.c +f:fs/f2fs/gc.h +f:fs/f2fs/hash.c +f:fs/f2fs/inline.c +f:fs/f2fs/inode.c +f:fs/f2fs/iostat.c +f:fs/f2fs/iostat.h +f:fs/f2fs/namei.c +f:fs/f2fs/node.c +f:fs/f2fs/node.h +f:fs/f2fs/recovery.c +f:fs/f2fs/segment.c +f:fs/f2fs/segment.h +f:fs/f2fs/shrinker.c +f:fs/f2fs/super.c +f:fs/f2fs/sysfs.c +f:fs/f2fs/verity.c +f:fs/f2fs/xattr.c +f:fs/f2fs/xattr.h +f:fs/fat/.kunitconfig +f:fs/fat/Kconfig +f:fs/fat/Makefile +f:fs/fat/cache.c +f:fs/fat/dir.c +f:fs/fat/fat.h +f:fs/fat/fat_test.c +f:fs/fat/fatent.c +f:fs/fat/file.c +f:fs/fat/inode.c +f:fs/fat/misc.c +f:fs/fat/namei_msdos.c +f:fs/fat/namei_vfat.c +f:fs/fat/nfs.c +f:fs/fcntl.c +f:fs/fhandle.c +f:fs/file.c +f:fs/file_attr.c +f:fs/file_table.c +f:fs/filesystems.c +f:fs/freevxfs/Kconfig +f:fs/freevxfs/Makefile +f:fs/freevxfs/vxfs.h +f:fs/freevxfs/vxfs_bmap.c +f:fs/freevxfs/vxfs_dir.h +f:fs/freevxfs/vxfs_extern.h +f:fs/freevxfs/vxfs_fshead.c +f:fs/freevxfs/vxfs_fshead.h +f:fs/freevxfs/vxfs_immed.c +f:fs/freevxfs/vxfs_inode.c +f:fs/freevxfs/vxfs_inode.h +f:fs/freevxfs/vxfs_lookup.c +f:fs/freevxfs/vxfs_olt.c +f:fs/freevxfs/vxfs_olt.h +f:fs/freevxfs/vxfs_subr.c +f:fs/freevxfs/vxfs_super.c +f:fs/fs-writeback.c +f:fs/fs_context.c +f:fs/fs_parser.c +f:fs/fs_pin.c +f:fs/fs_struct.c +f:fs/fs_types.c +f:fs/fsopen.c +f:fs/fuse/Kconfig +f:fs/fuse/Makefile +f:fs/fuse/acl.c +f:fs/fuse/control.c +f:fs/fuse/cuse.c +f:fs/fuse/dax.c +f:fs/fuse/dev.c +f:fs/fuse/dev_uring.c +f:fs/fuse/dev_uring_i.h +f:fs/fuse/dir.c +f:fs/fuse/file.c +f:fs/fuse/fuse_dev_i.h +f:fs/fuse/fuse_i.h +f:fs/fuse/fuse_trace.h +f:fs/fuse/inode.c +f:fs/fuse/ioctl.c +f:fs/fuse/iomode.c +f:fs/fuse/passthrough.c +f:fs/fuse/readdir.c +f:fs/fuse/sysctl.c +f:fs/fuse/virtio_fs.c +f:fs/fuse/xattr.c +f:fs/gfs2/Kconfig +f:fs/gfs2/Makefile +f:fs/gfs2/acl.c +f:fs/gfs2/acl.h +f:fs/gfs2/aops.c +f:fs/gfs2/aops.h +f:fs/gfs2/bmap.c +f:fs/gfs2/bmap.h +f:fs/gfs2/dentry.c +f:fs/gfs2/dir.c +f:fs/gfs2/dir.h +f:fs/gfs2/export.c +f:fs/gfs2/file.c +f:fs/gfs2/gfs2.h +f:fs/gfs2/glock.c +f:fs/gfs2/glock.h +f:fs/gfs2/glops.c +f:fs/gfs2/glops.h +f:fs/gfs2/incore.h +f:fs/gfs2/inode.c +f:fs/gfs2/inode.h +f:fs/gfs2/lock_dlm.c +f:fs/gfs2/log.c +f:fs/gfs2/log.h +f:fs/gfs2/lops.c +f:fs/gfs2/lops.h +f:fs/gfs2/main.c +f:fs/gfs2/meta_io.c +f:fs/gfs2/meta_io.h +f:fs/gfs2/ops_fstype.c +f:fs/gfs2/quota.c +f:fs/gfs2/quota.h +f:fs/gfs2/recovery.c +f:fs/gfs2/recovery.h +f:fs/gfs2/rgrp.c +f:fs/gfs2/rgrp.h +f:fs/gfs2/super.c +f:fs/gfs2/super.h +f:fs/gfs2/sys.c +f:fs/gfs2/sys.h +f:fs/gfs2/trace_gfs2.h +f:fs/gfs2/trans.c +f:fs/gfs2/trans.h +f:fs/gfs2/util.c +f:fs/gfs2/util.h +f:fs/gfs2/xattr.c +f:fs/gfs2/xattr.h +f:fs/hfs/Kconfig +f:fs/hfs/Makefile +f:fs/hfs/attr.c +f:fs/hfs/bfind.c +f:fs/hfs/bitmap.c +f:fs/hfs/bnode.c +f:fs/hfs/brec.c +f:fs/hfs/btree.c +f:fs/hfs/btree.h +f:fs/hfs/catalog.c +f:fs/hfs/dir.c +f:fs/hfs/extent.c +f:fs/hfs/hfs.h +f:fs/hfs/hfs_fs.h +f:fs/hfs/inode.c +f:fs/hfs/mdb.c +f:fs/hfs/part_tbl.c +f:fs/hfs/string.c +f:fs/hfs/super.c +f:fs/hfs/sysdep.c +f:fs/hfs/trans.c +f:fs/hfsplus/Kconfig +f:fs/hfsplus/Makefile +f:fs/hfsplus/attributes.c +f:fs/hfsplus/bfind.c +f:fs/hfsplus/bitmap.c +f:fs/hfsplus/bnode.c +f:fs/hfsplus/brec.c +f:fs/hfsplus/btree.c +f:fs/hfsplus/catalog.c +f:fs/hfsplus/dir.c +f:fs/hfsplus/extents.c +f:fs/hfsplus/hfsplus_fs.h +f:fs/hfsplus/hfsplus_raw.h +f:fs/hfsplus/inode.c +f:fs/hfsplus/ioctl.c +f:fs/hfsplus/options.c +f:fs/hfsplus/part_tbl.c +f:fs/hfsplus/super.c +f:fs/hfsplus/tables.c +f:fs/hfsplus/unicode.c +f:fs/hfsplus/wrapper.c +f:fs/hfsplus/xattr.c +f:fs/hfsplus/xattr.h +f:fs/hfsplus/xattr_security.c +f:fs/hfsplus/xattr_trusted.c +f:fs/hfsplus/xattr_user.c +f:fs/hostfs/Makefile +f:fs/hostfs/hostfs.h +f:fs/hostfs/hostfs_kern.c +f:fs/hostfs/hostfs_user.c +f:fs/hostfs/hostfs_user_exp.c +f:fs/hpfs/Kconfig +f:fs/hpfs/Makefile +f:fs/hpfs/alloc.c +f:fs/hpfs/anode.c +f:fs/hpfs/buffer.c +f:fs/hpfs/dentry.c +f:fs/hpfs/dir.c +f:fs/hpfs/dnode.c +f:fs/hpfs/ea.c +f:fs/hpfs/file.c +f:fs/hpfs/hpfs.h +f:fs/hpfs/hpfs_fn.h +f:fs/hpfs/inode.c +f:fs/hpfs/map.c +f:fs/hpfs/name.c +f:fs/hpfs/namei.c +f:fs/hpfs/super.c +f:fs/hugetlbfs/Makefile +f:fs/hugetlbfs/inode.c +f:fs/init.c +f:fs/inode.c +f:fs/internal.h +f:fs/ioctl.c +f:fs/iomap/Makefile +f:fs/iomap/buffered-io.c +f:fs/iomap/direct-io.c +f:fs/iomap/fiemap.c +f:fs/iomap/internal.h +f:fs/iomap/ioend.c +f:fs/iomap/iter.c +f:fs/iomap/seek.c +f:fs/iomap/swapfile.c +f:fs/iomap/trace.c +f:fs/iomap/trace.h +f:fs/isofs/Kconfig +f:fs/isofs/Makefile +f:fs/isofs/compress.c +f:fs/isofs/dir.c +f:fs/isofs/export.c +f:fs/isofs/inode.c +f:fs/isofs/isofs.h +f:fs/isofs/joliet.c +f:fs/isofs/namei.c +f:fs/isofs/rock.c +f:fs/isofs/rock.h +f:fs/isofs/util.c +f:fs/isofs/zisofs.h +f:fs/jbd2/Kconfig +f:fs/jbd2/Makefile +f:fs/jbd2/checkpoint.c +f:fs/jbd2/commit.c +f:fs/jbd2/journal.c +f:fs/jbd2/recovery.c +f:fs/jbd2/revoke.c +f:fs/jbd2/transaction.c +f:fs/jffs2/Kconfig +f:fs/jffs2/LICENCE +f:fs/jffs2/Makefile +f:fs/jffs2/README.Locking +f:fs/jffs2/acl.c +f:fs/jffs2/acl.h +f:fs/jffs2/background.c +f:fs/jffs2/build.c +f:fs/jffs2/compr.c +f:fs/jffs2/compr.h +f:fs/jffs2/compr_lzo.c +f:fs/jffs2/compr_rtime.c +f:fs/jffs2/compr_rubin.c +f:fs/jffs2/compr_zlib.c +f:fs/jffs2/debug.c +f:fs/jffs2/debug.h +f:fs/jffs2/dir.c +f:fs/jffs2/erase.c +f:fs/jffs2/file.c +f:fs/jffs2/fs.c +f:fs/jffs2/gc.c +f:fs/jffs2/ioctl.c +f:fs/jffs2/jffs2_fs_i.h +f:fs/jffs2/jffs2_fs_sb.h +f:fs/jffs2/malloc.c +f:fs/jffs2/nodelist.c +f:fs/jffs2/nodelist.h +f:fs/jffs2/nodemgmt.c +f:fs/jffs2/os-linux.h +f:fs/jffs2/read.c +f:fs/jffs2/readinode.c +f:fs/jffs2/scan.c +f:fs/jffs2/security.c +f:fs/jffs2/summary.c +f:fs/jffs2/summary.h +f:fs/jffs2/super.c +f:fs/jffs2/symlink.c +f:fs/jffs2/wbuf.c +f:fs/jffs2/write.c +f:fs/jffs2/writev.c +f:fs/jffs2/xattr.c +f:fs/jffs2/xattr.h +f:fs/jffs2/xattr_trusted.c +f:fs/jffs2/xattr_user.c +f:fs/jfs/Kconfig +f:fs/jfs/Makefile +f:fs/jfs/acl.c +f:fs/jfs/file.c +f:fs/jfs/inode.c +f:fs/jfs/ioctl.c +f:fs/jfs/jfs_acl.h +f:fs/jfs/jfs_btree.h +f:fs/jfs/jfs_debug.c +f:fs/jfs/jfs_debug.h +f:fs/jfs/jfs_dinode.h +f:fs/jfs/jfs_discard.c +f:fs/jfs/jfs_discard.h +f:fs/jfs/jfs_dmap.c +f:fs/jfs/jfs_dmap.h +f:fs/jfs/jfs_dtree.c +f:fs/jfs/jfs_dtree.h +f:fs/jfs/jfs_extent.c +f:fs/jfs/jfs_extent.h +f:fs/jfs/jfs_filsys.h +f:fs/jfs/jfs_imap.c +f:fs/jfs/jfs_imap.h +f:fs/jfs/jfs_incore.h +f:fs/jfs/jfs_inode.c +f:fs/jfs/jfs_inode.h +f:fs/jfs/jfs_lock.h +f:fs/jfs/jfs_logmgr.c +f:fs/jfs/jfs_logmgr.h +f:fs/jfs/jfs_metapage.c +f:fs/jfs/jfs_metapage.h +f:fs/jfs/jfs_mount.c +f:fs/jfs/jfs_superblock.h +f:fs/jfs/jfs_txnmgr.c +f:fs/jfs/jfs_txnmgr.h +f:fs/jfs/jfs_types.h +f:fs/jfs/jfs_umount.c +f:fs/jfs/jfs_unicode.c +f:fs/jfs/jfs_unicode.h +f:fs/jfs/jfs_xattr.h +f:fs/jfs/jfs_xtree.c +f:fs/jfs/jfs_xtree.h +f:fs/jfs/namei.c +f:fs/jfs/resize.c +f:fs/jfs/super.c +f:fs/jfs/symlink.c +f:fs/jfs/xattr.c +f:fs/kernel_read_file.c +f:fs/kernfs/Kconfig +f:fs/kernfs/Makefile +f:fs/kernfs/dir.c +f:fs/kernfs/file.c +f:fs/kernfs/inode.c +f:fs/kernfs/kernfs-internal.h +f:fs/kernfs/mount.c +f:fs/kernfs/symlink.c +f:fs/libfs.c +f:fs/lockd/Makefile +f:fs/lockd/clnt4xdr.c +f:fs/lockd/clntlock.c +f:fs/lockd/clntproc.c +f:fs/lockd/clntxdr.c +f:fs/lockd/host.c +f:fs/lockd/mon.c +f:fs/lockd/netlink.c +f:fs/lockd/netlink.h +f:fs/lockd/netns.h +f:fs/lockd/procfs.c +f:fs/lockd/procfs.h +f:fs/lockd/svc.c +f:fs/lockd/svc4proc.c +f:fs/lockd/svclock.c +f:fs/lockd/svcproc.c +f:fs/lockd/svcshare.c +f:fs/lockd/svcsubs.c +f:fs/lockd/svcxdr.h +f:fs/lockd/trace.c +f:fs/lockd/trace.h +f:fs/lockd/xdr.c +f:fs/lockd/xdr4.c +f:fs/locks.c +f:fs/mbcache.c +f:fs/minix/Kconfig +f:fs/minix/Makefile +f:fs/minix/bitmap.c +f:fs/minix/dir.c +f:fs/minix/file.c +f:fs/minix/inode.c +f:fs/minix/itree_common.c +f:fs/minix/itree_v1.c +f:fs/minix/itree_v2.c +f:fs/minix/minix.h +f:fs/minix/namei.c +f:fs/mnt_idmapping.c +f:fs/mount.h +f:fs/mpage.c +f:fs/namei.c +f:fs/namespace.c +f:fs/netfs/Kconfig +f:fs/netfs/Makefile +f:fs/netfs/buffered_read.c +f:fs/netfs/buffered_write.c +f:fs/netfs/direct_read.c +f:fs/netfs/direct_write.c +f:fs/netfs/fscache_cache.c +f:fs/netfs/fscache_cookie.c +f:fs/netfs/fscache_internal.h +f:fs/netfs/fscache_io.c +f:fs/netfs/fscache_main.c +f:fs/netfs/fscache_proc.c +f:fs/netfs/fscache_stats.c +f:fs/netfs/fscache_volume.c +f:fs/netfs/internal.h +f:fs/netfs/iterator.c +f:fs/netfs/locking.c +f:fs/netfs/main.c +f:fs/netfs/misc.c +f:fs/netfs/objects.c +f:fs/netfs/read_collect.c +f:fs/netfs/read_pgpriv2.c +f:fs/netfs/read_retry.c +f:fs/netfs/read_single.c +f:fs/netfs/rolling_buffer.c +f:fs/netfs/stats.c +f:fs/netfs/write_collect.c +f:fs/netfs/write_issue.c +f:fs/netfs/write_retry.c +f:fs/nfs/Kconfig +f:fs/nfs/Makefile +f:fs/nfs/blocklayout/Makefile +f:fs/nfs/blocklayout/blocklayout.c +f:fs/nfs/blocklayout/blocklayout.h +f:fs/nfs/blocklayout/dev.c +f:fs/nfs/blocklayout/extent_tree.c +f:fs/nfs/blocklayout/rpc_pipefs.c +f:fs/nfs/cache_lib.c +f:fs/nfs/cache_lib.h +f:fs/nfs/callback.c +f:fs/nfs/callback.h +f:fs/nfs/callback_proc.c +f:fs/nfs/callback_xdr.c +f:fs/nfs/client.c +f:fs/nfs/delegation.c +f:fs/nfs/delegation.h +f:fs/nfs/dir.c +f:fs/nfs/direct.c +f:fs/nfs/dns_resolve.c +f:fs/nfs/dns_resolve.h +f:fs/nfs/export.c +f:fs/nfs/file.c +f:fs/nfs/filelayout/Makefile +f:fs/nfs/filelayout/filelayout.c +f:fs/nfs/filelayout/filelayout.h +f:fs/nfs/filelayout/filelayoutdev.c +f:fs/nfs/flexfilelayout/Makefile +f:fs/nfs/flexfilelayout/flexfilelayout.c +f:fs/nfs/flexfilelayout/flexfilelayout.h +f:fs/nfs/flexfilelayout/flexfilelayoutdev.c +f:fs/nfs/fs_context.c +f:fs/nfs/fscache.c +f:fs/nfs/fscache.h +f:fs/nfs/getroot.c +f:fs/nfs/inode.c +f:fs/nfs/internal.h +f:fs/nfs/io.c +f:fs/nfs/iostat.h +f:fs/nfs/localio.c +f:fs/nfs/mount_clnt.c +f:fs/nfs/namespace.c +f:fs/nfs/netns.h +f:fs/nfs/nfs.h +f:fs/nfs/nfs2super.c +f:fs/nfs/nfs2xdr.c +f:fs/nfs/nfs3_fs.h +f:fs/nfs/nfs3acl.c +f:fs/nfs/nfs3client.c +f:fs/nfs/nfs3proc.c +f:fs/nfs/nfs3super.c +f:fs/nfs/nfs3xdr.c +f:fs/nfs/nfs42.h +f:fs/nfs/nfs42proc.c +f:fs/nfs/nfs42xattr.c +f:fs/nfs/nfs42xdr.c +f:fs/nfs/nfs4_fs.h +f:fs/nfs/nfs4client.c +f:fs/nfs/nfs4file.c +f:fs/nfs/nfs4getroot.c +f:fs/nfs/nfs4idmap.c +f:fs/nfs/nfs4idmap.h +f:fs/nfs/nfs4namespace.c +f:fs/nfs/nfs4proc.c +f:fs/nfs/nfs4renewd.c +f:fs/nfs/nfs4session.c +f:fs/nfs/nfs4session.h +f:fs/nfs/nfs4state.c +f:fs/nfs/nfs4super.c +f:fs/nfs/nfs4sysctl.c +f:fs/nfs/nfs4trace.c +f:fs/nfs/nfs4trace.h +f:fs/nfs/nfs4xdr.c +f:fs/nfs/nfsroot.c +f:fs/nfs/nfstrace.c +f:fs/nfs/nfstrace.h +f:fs/nfs/pagelist.c +f:fs/nfs/pnfs.c +f:fs/nfs/pnfs.h +f:fs/nfs/pnfs_dev.c +f:fs/nfs/pnfs_nfs.c +f:fs/nfs/proc.c +f:fs/nfs/read.c +f:fs/nfs/super.c +f:fs/nfs/symlink.c +f:fs/nfs/sysctl.c +f:fs/nfs/sysfs.c +f:fs/nfs/sysfs.h +f:fs/nfs/unlink.c +f:fs/nfs/write.c +f:fs/nfs_common/Makefile +f:fs/nfs_common/common.c +f:fs/nfs_common/grace.c +f:fs/nfs_common/localio_trace.c +f:fs/nfs_common/localio_trace.h +f:fs/nfs_common/nfs_ssc.c +f:fs/nfs_common/nfsacl.c +f:fs/nfs_common/nfslocalio.c +f:fs/nfsd/Kconfig +f:fs/nfsd/Makefile +f:fs/nfsd/acl.h +f:fs/nfsd/auth.c +f:fs/nfsd/auth.h +f:fs/nfsd/blocklayout.c +f:fs/nfsd/blocklayoutxdr.c +f:fs/nfsd/blocklayoutxdr.h +f:fs/nfsd/cache.h +f:fs/nfsd/current_stateid.h +f:fs/nfsd/debugfs.c +f:fs/nfsd/export.c +f:fs/nfsd/export.h +f:fs/nfsd/filecache.c +f:fs/nfsd/filecache.h +f:fs/nfsd/flexfilelayout.c +f:fs/nfsd/flexfilelayoutxdr.c +f:fs/nfsd/flexfilelayoutxdr.h +f:fs/nfsd/idmap.h +f:fs/nfsd/localio.c +f:fs/nfsd/lockd.c +f:fs/nfsd/netlink.c +f:fs/nfsd/netlink.h +f:fs/nfsd/netns.h +f:fs/nfsd/nfs2acl.c +f:fs/nfsd/nfs3acl.c +f:fs/nfsd/nfs3proc.c +f:fs/nfsd/nfs3xdr.c +f:fs/nfsd/nfs4acl.c +f:fs/nfsd/nfs4callback.c +f:fs/nfsd/nfs4idmap.c +f:fs/nfsd/nfs4layouts.c +f:fs/nfsd/nfs4proc.c +f:fs/nfsd/nfs4recover.c +f:fs/nfsd/nfs4state.c +f:fs/nfsd/nfs4xdr.c +f:fs/nfsd/nfs4xdr_gen.c +f:fs/nfsd/nfs4xdr_gen.h +f:fs/nfsd/nfscache.c +f:fs/nfsd/nfsctl.c +f:fs/nfsd/nfsd.h +f:fs/nfsd/nfsfh.c +f:fs/nfsd/nfsfh.h +f:fs/nfsd/nfsproc.c +f:fs/nfsd/nfssvc.c +f:fs/nfsd/nfsxdr.c +f:fs/nfsd/pnfs.h +f:fs/nfsd/state.h +f:fs/nfsd/stats.c +f:fs/nfsd/stats.h +f:fs/nfsd/trace.c +f:fs/nfsd/trace.h +f:fs/nfsd/vfs.c +f:fs/nfsd/vfs.h +f:fs/nfsd/xdr.h +f:fs/nfsd/xdr3.h +f:fs/nfsd/xdr4.h +f:fs/nfsd/xdr4cb.h +f:fs/nilfs2/Kconfig +f:fs/nilfs2/Makefile +f:fs/nilfs2/alloc.c +f:fs/nilfs2/alloc.h +f:fs/nilfs2/bmap.c +f:fs/nilfs2/bmap.h +f:fs/nilfs2/btnode.c +f:fs/nilfs2/btnode.h +f:fs/nilfs2/btree.c +f:fs/nilfs2/btree.h +f:fs/nilfs2/cpfile.c +f:fs/nilfs2/cpfile.h +f:fs/nilfs2/dat.c +f:fs/nilfs2/dat.h +f:fs/nilfs2/dir.c +f:fs/nilfs2/direct.c +f:fs/nilfs2/direct.h +f:fs/nilfs2/export.h +f:fs/nilfs2/file.c +f:fs/nilfs2/gcinode.c +f:fs/nilfs2/ifile.c +f:fs/nilfs2/ifile.h +f:fs/nilfs2/inode.c +f:fs/nilfs2/ioctl.c +f:fs/nilfs2/mdt.c +f:fs/nilfs2/mdt.h +f:fs/nilfs2/namei.c +f:fs/nilfs2/nilfs.h +f:fs/nilfs2/page.c +f:fs/nilfs2/page.h +f:fs/nilfs2/recovery.c +f:fs/nilfs2/segbuf.c +f:fs/nilfs2/segbuf.h +f:fs/nilfs2/segment.c +f:fs/nilfs2/segment.h +f:fs/nilfs2/sufile.c +f:fs/nilfs2/sufile.h +f:fs/nilfs2/super.c +f:fs/nilfs2/sysfs.c +f:fs/nilfs2/sysfs.h +f:fs/nilfs2/the_nilfs.c +f:fs/nilfs2/the_nilfs.h +f:fs/nls/Kconfig +f:fs/nls/Makefile +f:fs/nls/mac-celtic.c +f:fs/nls/mac-centeuro.c +f:fs/nls/mac-croatian.c +f:fs/nls/mac-cyrillic.c +f:fs/nls/mac-gaelic.c +f:fs/nls/mac-greek.c +f:fs/nls/mac-iceland.c +f:fs/nls/mac-inuit.c +f:fs/nls/mac-roman.c +f:fs/nls/mac-romanian.c +f:fs/nls/mac-turkish.c +f:fs/nls/nls_ascii.c +f:fs/nls/nls_base.c +f:fs/nls/nls_cp1250.c +f:fs/nls/nls_cp1251.c +f:fs/nls/nls_cp1255.c +f:fs/nls/nls_cp437.c +f:fs/nls/nls_cp737.c +f:fs/nls/nls_cp775.c +f:fs/nls/nls_cp850.c +f:fs/nls/nls_cp852.c +f:fs/nls/nls_cp855.c +f:fs/nls/nls_cp857.c +f:fs/nls/nls_cp860.c +f:fs/nls/nls_cp861.c +f:fs/nls/nls_cp862.c +f:fs/nls/nls_cp863.c +f:fs/nls/nls_cp864.c +f:fs/nls/nls_cp865.c +f:fs/nls/nls_cp866.c +f:fs/nls/nls_cp869.c +f:fs/nls/nls_cp874.c +f:fs/nls/nls_cp932.c +f:fs/nls/nls_cp936.c +f:fs/nls/nls_cp949.c +f:fs/nls/nls_cp950.c +f:fs/nls/nls_euc-jp.c +f:fs/nls/nls_iso8859-1.c +f:fs/nls/nls_iso8859-13.c +f:fs/nls/nls_iso8859-14.c +f:fs/nls/nls_iso8859-15.c +f:fs/nls/nls_iso8859-2.c +f:fs/nls/nls_iso8859-3.c +f:fs/nls/nls_iso8859-4.c +f:fs/nls/nls_iso8859-5.c +f:fs/nls/nls_iso8859-6.c +f:fs/nls/nls_iso8859-7.c +f:fs/nls/nls_iso8859-9.c +f:fs/nls/nls_koi8-r.c +f:fs/nls/nls_koi8-ru.c +f:fs/nls/nls_koi8-u.c +f:fs/nls/nls_ucs2_data.h +f:fs/nls/nls_ucs2_utils.c +f:fs/nls/nls_ucs2_utils.h +f:fs/nls/nls_utf8.c +f:fs/notify/Kconfig +f:fs/notify/Makefile +f:fs/notify/dnotify/Kconfig +f:fs/notify/dnotify/Makefile +f:fs/notify/dnotify/dnotify.c +f:fs/notify/fanotify/Kconfig +f:fs/notify/fanotify/Makefile +f:fs/notify/fanotify/fanotify.c +f:fs/notify/fanotify/fanotify.h +f:fs/notify/fanotify/fanotify_user.c +f:fs/notify/fdinfo.c +f:fs/notify/fdinfo.h +f:fs/notify/fsnotify.c +f:fs/notify/fsnotify.h +f:fs/notify/group.c +f:fs/notify/inotify/Kconfig +f:fs/notify/inotify/Makefile +f:fs/notify/inotify/inotify.h +f:fs/notify/inotify/inotify_fsnotify.c +f:fs/notify/inotify/inotify_user.c +f:fs/notify/mark.c +f:fs/notify/notification.c +f:fs/nsfs.c +f:fs/ntfs3/Kconfig +f:fs/ntfs3/Makefile +f:fs/ntfs3/attrib.c +f:fs/ntfs3/attrlist.c +f:fs/ntfs3/bitfunc.c +f:fs/ntfs3/bitmap.c +f:fs/ntfs3/debug.h +f:fs/ntfs3/dir.c +f:fs/ntfs3/file.c +f:fs/ntfs3/frecord.c +f:fs/ntfs3/fslog.c +f:fs/ntfs3/fsntfs.c +f:fs/ntfs3/index.c +f:fs/ntfs3/inode.c +f:fs/ntfs3/lib/decompress_common.c +f:fs/ntfs3/lib/decompress_common.h +f:fs/ntfs3/lib/lib.h +f:fs/ntfs3/lib/lzx_decompress.c +f:fs/ntfs3/lib/xpress_decompress.c +f:fs/ntfs3/lznt.c +f:fs/ntfs3/namei.c +f:fs/ntfs3/ntfs.h +f:fs/ntfs3/ntfs_fs.h +f:fs/ntfs3/record.c +f:fs/ntfs3/run.c +f:fs/ntfs3/super.c +f:fs/ntfs3/upcase.c +f:fs/ntfs3/xattr.c +f:fs/ocfs2/Kconfig +f:fs/ocfs2/Makefile +f:fs/ocfs2/acl.c +f:fs/ocfs2/acl.h +f:fs/ocfs2/alloc.c +f:fs/ocfs2/alloc.h +f:fs/ocfs2/aops.c +f:fs/ocfs2/aops.h +f:fs/ocfs2/blockcheck.c +f:fs/ocfs2/blockcheck.h +f:fs/ocfs2/buffer_head_io.c +f:fs/ocfs2/buffer_head_io.h +f:fs/ocfs2/cluster/Makefile +f:fs/ocfs2/cluster/heartbeat.c +f:fs/ocfs2/cluster/heartbeat.h +f:fs/ocfs2/cluster/masklog.c +f:fs/ocfs2/cluster/masklog.h +f:fs/ocfs2/cluster/netdebug.c +f:fs/ocfs2/cluster/nodemanager.c +f:fs/ocfs2/cluster/nodemanager.h +f:fs/ocfs2/cluster/ocfs2_heartbeat.h +f:fs/ocfs2/cluster/ocfs2_nodemanager.h +f:fs/ocfs2/cluster/quorum.c +f:fs/ocfs2/cluster/quorum.h +f:fs/ocfs2/cluster/sys.c +f:fs/ocfs2/cluster/sys.h +f:fs/ocfs2/cluster/tcp.c +f:fs/ocfs2/cluster/tcp.h +f:fs/ocfs2/cluster/tcp_internal.h +f:fs/ocfs2/dcache.c +f:fs/ocfs2/dcache.h +f:fs/ocfs2/dir.c +f:fs/ocfs2/dir.h +f:fs/ocfs2/dlm/Makefile +f:fs/ocfs2/dlm/dlmapi.h +f:fs/ocfs2/dlm/dlmast.c +f:fs/ocfs2/dlm/dlmcommon.h +f:fs/ocfs2/dlm/dlmconvert.c +f:fs/ocfs2/dlm/dlmconvert.h +f:fs/ocfs2/dlm/dlmdebug.c +f:fs/ocfs2/dlm/dlmdebug.h +f:fs/ocfs2/dlm/dlmdomain.c +f:fs/ocfs2/dlm/dlmdomain.h +f:fs/ocfs2/dlm/dlmlock.c +f:fs/ocfs2/dlm/dlmmaster.c +f:fs/ocfs2/dlm/dlmrecovery.c +f:fs/ocfs2/dlm/dlmthread.c +f:fs/ocfs2/dlm/dlmunlock.c +f:fs/ocfs2/dlmfs/Makefile +f:fs/ocfs2/dlmfs/dlmfs.c +f:fs/ocfs2/dlmfs/userdlm.c +f:fs/ocfs2/dlmfs/userdlm.h +f:fs/ocfs2/dlmglue.c +f:fs/ocfs2/dlmglue.h +f:fs/ocfs2/export.c +f:fs/ocfs2/export.h +f:fs/ocfs2/extent_map.c +f:fs/ocfs2/extent_map.h +f:fs/ocfs2/file.c +f:fs/ocfs2/file.h +f:fs/ocfs2/filecheck.c +f:fs/ocfs2/filecheck.h +f:fs/ocfs2/heartbeat.c +f:fs/ocfs2/heartbeat.h +f:fs/ocfs2/inode.c +f:fs/ocfs2/inode.h +f:fs/ocfs2/ioctl.c +f:fs/ocfs2/ioctl.h +f:fs/ocfs2/journal.c +f:fs/ocfs2/journal.h +f:fs/ocfs2/localalloc.c +f:fs/ocfs2/localalloc.h +f:fs/ocfs2/locks.c +f:fs/ocfs2/locks.h +f:fs/ocfs2/mmap.c +f:fs/ocfs2/mmap.h +f:fs/ocfs2/move_extents.c +f:fs/ocfs2/move_extents.h +f:fs/ocfs2/namei.c +f:fs/ocfs2/namei.h +f:fs/ocfs2/ocfs1_fs_compat.h +f:fs/ocfs2/ocfs2.h +f:fs/ocfs2/ocfs2_fs.h +f:fs/ocfs2/ocfs2_ioctl.h +f:fs/ocfs2/ocfs2_lockid.h +f:fs/ocfs2/ocfs2_lockingver.h +f:fs/ocfs2/ocfs2_trace.h +f:fs/ocfs2/quota.h +f:fs/ocfs2/quota_global.c +f:fs/ocfs2/quota_local.c +f:fs/ocfs2/refcounttree.c +f:fs/ocfs2/refcounttree.h +f:fs/ocfs2/reservations.c +f:fs/ocfs2/reservations.h +f:fs/ocfs2/resize.c +f:fs/ocfs2/resize.h +f:fs/ocfs2/slot_map.c +f:fs/ocfs2/slot_map.h +f:fs/ocfs2/stack_o2cb.c +f:fs/ocfs2/stack_user.c +f:fs/ocfs2/stackglue.c +f:fs/ocfs2/stackglue.h +f:fs/ocfs2/suballoc.c +f:fs/ocfs2/suballoc.h +f:fs/ocfs2/super.c +f:fs/ocfs2/super.h +f:fs/ocfs2/symlink.c +f:fs/ocfs2/symlink.h +f:fs/ocfs2/sysfile.c +f:fs/ocfs2/sysfile.h +f:fs/ocfs2/uptodate.c +f:fs/ocfs2/uptodate.h +f:fs/ocfs2/xattr.c +f:fs/ocfs2/xattr.h +f:fs/omfs/Kconfig +f:fs/omfs/Makefile +f:fs/omfs/bitmap.c +f:fs/omfs/dir.c +f:fs/omfs/file.c +f:fs/omfs/inode.c +f:fs/omfs/omfs.h +f:fs/omfs/omfs_fs.h +f:fs/open.c +f:fs/openpromfs/Makefile +f:fs/openpromfs/inode.c +f:fs/orangefs/Kconfig +f:fs/orangefs/Makefile +f:fs/orangefs/acl.c +f:fs/orangefs/dcache.c +f:fs/orangefs/devorangefs-req.c +f:fs/orangefs/dir.c +f:fs/orangefs/downcall.h +f:fs/orangefs/file.c +f:fs/orangefs/inode.c +f:fs/orangefs/namei.c +f:fs/orangefs/orangefs-bufmap.c +f:fs/orangefs/orangefs-bufmap.h +f:fs/orangefs/orangefs-cache.c +f:fs/orangefs/orangefs-debug.h +f:fs/orangefs/orangefs-debugfs.c +f:fs/orangefs/orangefs-debugfs.h +f:fs/orangefs/orangefs-dev-proto.h +f:fs/orangefs/orangefs-kernel.h +f:fs/orangefs/orangefs-mod.c +f:fs/orangefs/orangefs-sysfs.c +f:fs/orangefs/orangefs-sysfs.h +f:fs/orangefs/orangefs-utils.c +f:fs/orangefs/protocol.h +f:fs/orangefs/super.c +f:fs/orangefs/symlink.c +f:fs/orangefs/upcall.h +f:fs/orangefs/waitqueue.c +f:fs/orangefs/xattr.c +f:fs/overlayfs/Kconfig +f:fs/overlayfs/Makefile +f:fs/overlayfs/copy_up.c +f:fs/overlayfs/dir.c +f:fs/overlayfs/export.c +f:fs/overlayfs/file.c +f:fs/overlayfs/inode.c +f:fs/overlayfs/namei.c +f:fs/overlayfs/overlayfs.h +f:fs/overlayfs/ovl_entry.h +f:fs/overlayfs/params.c +f:fs/overlayfs/params.h +f:fs/overlayfs/readdir.c +f:fs/overlayfs/super.c +f:fs/overlayfs/util.c +f:fs/overlayfs/xattrs.c +f:fs/pidfs.c +f:fs/pipe.c +f:fs/pnode.c +f:fs/pnode.h +f:fs/posix_acl.c +f:fs/proc/Kconfig +f:fs/proc/Makefile +f:fs/proc/array.c +f:fs/proc/base.c +f:fs/proc/bootconfig.c +f:fs/proc/cmdline.c +f:fs/proc/consoles.c +f:fs/proc/cpuinfo.c +f:fs/proc/devices.c +f:fs/proc/fd.c +f:fs/proc/fd.h +f:fs/proc/generic.c +f:fs/proc/inode.c +f:fs/proc/internal.h +f:fs/proc/interrupts.c +f:fs/proc/kcore.c +f:fs/proc/kmsg.c +f:fs/proc/loadavg.c +f:fs/proc/meminfo.c +f:fs/proc/namespaces.c +f:fs/proc/nommu.c +f:fs/proc/page.c +f:fs/proc/proc_net.c +f:fs/proc/proc_sysctl.c +f:fs/proc/proc_tty.c +f:fs/proc/root.c +f:fs/proc/self.c +f:fs/proc/softirqs.c +f:fs/proc/stat.c +f:fs/proc/task_mmu.c +f:fs/proc/task_nommu.c +f:fs/proc/thread_self.c +f:fs/proc/uptime.c +f:fs/proc/util.c +f:fs/proc/version.c +f:fs/proc/vmcore.c +f:fs/proc_namespace.c +f:fs/pstore/Kconfig +f:fs/pstore/Makefile +f:fs/pstore/blk.c +f:fs/pstore/ftrace.c +f:fs/pstore/inode.c +f:fs/pstore/internal.h +f:fs/pstore/platform.c +f:fs/pstore/pmsg.c +f:fs/pstore/ram.c +f:fs/pstore/ram_core.c +f:fs/pstore/ram_internal.h +f:fs/pstore/zone.c +f:fs/qnx4/Kconfig +f:fs/qnx4/Makefile +f:fs/qnx4/bitmap.c +f:fs/qnx4/dir.c +f:fs/qnx4/inode.c +f:fs/qnx4/namei.c +f:fs/qnx4/qnx4.h +f:fs/qnx6/Kconfig +f:fs/qnx6/Makefile +f:fs/qnx6/dir.c +f:fs/qnx6/inode.c +f:fs/qnx6/namei.c +f:fs/qnx6/qnx6.h +f:fs/qnx6/super_mmi.c +f:fs/quota/Kconfig +f:fs/quota/Makefile +f:fs/quota/compat.h +f:fs/quota/dquot.c +f:fs/quota/kqid.c +f:fs/quota/netlink.c +f:fs/quota/quota.c +f:fs/quota/quota_tree.c +f:fs/quota/quota_tree.h +f:fs/quota/quota_v1.c +f:fs/quota/quota_v2.c +f:fs/quota/quotaio_v1.h +f:fs/quota/quotaio_v2.h +f:fs/ramfs/Makefile +f:fs/ramfs/file-mmu.c +f:fs/ramfs/file-nommu.c +f:fs/ramfs/inode.c +f:fs/ramfs/internal.h +f:fs/read_write.c +f:fs/readdir.c +f:fs/remap_range.c +f:fs/resctrl/Kconfig +f:fs/resctrl/Makefile +f:fs/resctrl/ctrlmondata.c +f:fs/resctrl/internal.h +f:fs/resctrl/monitor.c +f:fs/resctrl/monitor_trace.h +f:fs/resctrl/pseudo_lock.c +f:fs/resctrl/rdtgroup.c +f:fs/romfs/Kconfig +f:fs/romfs/Makefile +f:fs/romfs/internal.h +f:fs/romfs/mmap-nommu.c +f:fs/romfs/storage.c +f:fs/romfs/super.c +f:fs/select.c +f:fs/seq_file.c +f:fs/signalfd.c +f:fs/smb/Kconfig +f:fs/smb/Makefile +f:fs/smb/client/Kconfig +f:fs/smb/client/Makefile +f:fs/smb/client/asn1.c +f:fs/smb/client/cached_dir.c +f:fs/smb/client/cached_dir.h +f:fs/smb/client/cifs_debug.c +f:fs/smb/client/cifs_debug.h +f:fs/smb/client/cifs_fs_sb.h +f:fs/smb/client/cifs_ioctl.h +f:fs/smb/client/cifs_spnego.c +f:fs/smb/client/cifs_spnego.h +f:fs/smb/client/cifs_spnego_negtokeninit.asn1 +f:fs/smb/client/cifs_swn.c +f:fs/smb/client/cifs_swn.h +f:fs/smb/client/cifs_unicode.c +f:fs/smb/client/cifs_unicode.h +f:fs/smb/client/cifsacl.c +f:fs/smb/client/cifsacl.h +f:fs/smb/client/cifsencrypt.c +f:fs/smb/client/cifsfs.c +f:fs/smb/client/cifsfs.h +f:fs/smb/client/cifsglob.h +f:fs/smb/client/cifspdu.h +f:fs/smb/client/cifsproto.h +f:fs/smb/client/cifsroot.c +f:fs/smb/client/cifssmb.c +f:fs/smb/client/compress.c +f:fs/smb/client/compress.h +f:fs/smb/client/compress/lz77.c +f:fs/smb/client/compress/lz77.h +f:fs/smb/client/connect.c +f:fs/smb/client/dfs.c +f:fs/smb/client/dfs.h +f:fs/smb/client/dfs_cache.c +f:fs/smb/client/dfs_cache.h +f:fs/smb/client/dir.c +f:fs/smb/client/dns_resolve.c +f:fs/smb/client/dns_resolve.h +f:fs/smb/client/export.c +f:fs/smb/client/file.c +f:fs/smb/client/fs_context.c +f:fs/smb/client/fs_context.h +f:fs/smb/client/fscache.c +f:fs/smb/client/fscache.h +f:fs/smb/client/inode.c +f:fs/smb/client/ioctl.c +f:fs/smb/client/link.c +f:fs/smb/client/misc.c +f:fs/smb/client/namespace.c +f:fs/smb/client/netlink.c +f:fs/smb/client/netlink.h +f:fs/smb/client/netmisc.c +f:fs/smb/client/nterr.c +f:fs/smb/client/nterr.h +f:fs/smb/client/ntlmssp.h +f:fs/smb/client/readdir.c +f:fs/smb/client/reparse.c +f:fs/smb/client/reparse.h +f:fs/smb/client/rfc1002pdu.h +f:fs/smb/client/sess.c +f:fs/smb/client/smb1ops.c +f:fs/smb/client/smb2file.c +f:fs/smb/client/smb2glob.h +f:fs/smb/client/smb2inode.c +f:fs/smb/client/smb2maperror.c +f:fs/smb/client/smb2misc.c +f:fs/smb/client/smb2ops.c +f:fs/smb/client/smb2pdu.c +f:fs/smb/client/smb2pdu.h +f:fs/smb/client/smb2proto.h +f:fs/smb/client/smb2transport.c +f:fs/smb/client/smbdirect.c +f:fs/smb/client/smbdirect.h +f:fs/smb/client/smbencrypt.c +f:fs/smb/client/smberr.h +f:fs/smb/client/trace.c +f:fs/smb/client/trace.h +f:fs/smb/client/transport.c +f:fs/smb/client/unc.c +f:fs/smb/client/winucase.c +f:fs/smb/client/xattr.c +f:fs/smb/common/Makefile +f:fs/smb/common/arc4.h +f:fs/smb/common/cifs_arc4.c +f:fs/smb/common/cifs_md4.c +f:fs/smb/common/md4.h +f:fs/smb/common/smb2pdu.h +f:fs/smb/common/smb2status.h +f:fs/smb/common/smbacl.h +f:fs/smb/common/smbdirect/smbdirect.h +f:fs/smb/common/smbdirect/smbdirect_pdu.h +f:fs/smb/common/smbdirect/smbdirect_socket.h +f:fs/smb/common/smbfsctl.h +f:fs/smb/server/Kconfig +f:fs/smb/server/Makefile +f:fs/smb/server/asn1.c +f:fs/smb/server/asn1.h +f:fs/smb/server/auth.c +f:fs/smb/server/auth.h +f:fs/smb/server/connection.c +f:fs/smb/server/connection.h +f:fs/smb/server/crypto_ctx.c +f:fs/smb/server/crypto_ctx.h +f:fs/smb/server/glob.h +f:fs/smb/server/ksmbd_netlink.h +f:fs/smb/server/ksmbd_spnego_negtokeninit.asn1 +f:fs/smb/server/ksmbd_spnego_negtokentarg.asn1 +f:fs/smb/server/ksmbd_work.c +f:fs/smb/server/ksmbd_work.h +f:fs/smb/server/mgmt/ksmbd_ida.c +f:fs/smb/server/mgmt/ksmbd_ida.h +f:fs/smb/server/mgmt/share_config.c +f:fs/smb/server/mgmt/share_config.h +f:fs/smb/server/mgmt/tree_connect.c +f:fs/smb/server/mgmt/tree_connect.h +f:fs/smb/server/mgmt/user_config.c +f:fs/smb/server/mgmt/user_config.h +f:fs/smb/server/mgmt/user_session.c +f:fs/smb/server/mgmt/user_session.h +f:fs/smb/server/misc.c +f:fs/smb/server/misc.h +f:fs/smb/server/ndr.c +f:fs/smb/server/ndr.h +f:fs/smb/server/nterr.h +f:fs/smb/server/ntlmssp.h +f:fs/smb/server/oplock.c +f:fs/smb/server/oplock.h +f:fs/smb/server/server.c +f:fs/smb/server/server.h +f:fs/smb/server/smb2misc.c +f:fs/smb/server/smb2ops.c +f:fs/smb/server/smb2pdu.c +f:fs/smb/server/smb2pdu.h +f:fs/smb/server/smb_common.c +f:fs/smb/server/smb_common.h +f:fs/smb/server/smbacl.c +f:fs/smb/server/smbacl.h +f:fs/smb/server/smbfsctl.h +f:fs/smb/server/transport_ipc.c +f:fs/smb/server/transport_ipc.h +f:fs/smb/server/transport_rdma.c +f:fs/smb/server/transport_rdma.h +f:fs/smb/server/transport_tcp.c +f:fs/smb/server/transport_tcp.h +f:fs/smb/server/unicode.c +f:fs/smb/server/unicode.h +f:fs/smb/server/vfs.c +f:fs/smb/server/vfs.h +f:fs/smb/server/vfs_cache.c +f:fs/smb/server/vfs_cache.h +f:fs/smb/server/xattr.h +f:fs/splice.c +f:fs/squashfs/Kconfig +f:fs/squashfs/Makefile +f:fs/squashfs/block.c +f:fs/squashfs/cache.c +f:fs/squashfs/decompressor.c +f:fs/squashfs/decompressor.h +f:fs/squashfs/decompressor_multi.c +f:fs/squashfs/decompressor_multi_percpu.c +f:fs/squashfs/decompressor_single.c +f:fs/squashfs/dir.c +f:fs/squashfs/export.c +f:fs/squashfs/file.c +f:fs/squashfs/file_cache.c +f:fs/squashfs/file_direct.c +f:fs/squashfs/fragment.c +f:fs/squashfs/id.c +f:fs/squashfs/inode.c +f:fs/squashfs/lz4_wrapper.c +f:fs/squashfs/lzo_wrapper.c +f:fs/squashfs/namei.c +f:fs/squashfs/page_actor.c +f:fs/squashfs/page_actor.h +f:fs/squashfs/squashfs.h +f:fs/squashfs/squashfs_fs.h +f:fs/squashfs/squashfs_fs_i.h +f:fs/squashfs/squashfs_fs_sb.h +f:fs/squashfs/super.c +f:fs/squashfs/symlink.c +f:fs/squashfs/xattr.c +f:fs/squashfs/xattr.h +f:fs/squashfs/xattr_id.c +f:fs/squashfs/xz_wrapper.c +f:fs/squashfs/zlib_wrapper.c +f:fs/squashfs/zstd_wrapper.c +f:fs/stack.c +f:fs/stat.c +f:fs/statfs.c +f:fs/super.c +f:fs/sync.c +f:fs/sysctls.c +f:fs/sysfs/Kconfig +f:fs/sysfs/Makefile +f:fs/sysfs/dir.c +f:fs/sysfs/file.c +f:fs/sysfs/group.c +f:fs/sysfs/mount.c +f:fs/sysfs/symlink.c +f:fs/sysfs/sysfs.h +f:fs/tests/binfmt_elf_kunit.c +f:fs/tests/exec_kunit.c +f:fs/timerfd.c +f:fs/tracefs/Makefile +f:fs/tracefs/event_inode.c +f:fs/tracefs/inode.c +f:fs/tracefs/internal.h +f:fs/ubifs/Kconfig +f:fs/ubifs/Makefile +f:fs/ubifs/auth.c +f:fs/ubifs/budget.c +f:fs/ubifs/commit.c +f:fs/ubifs/compress.c +f:fs/ubifs/crypto.c +f:fs/ubifs/debug.c +f:fs/ubifs/debug.h +f:fs/ubifs/dir.c +f:fs/ubifs/file.c +f:fs/ubifs/find.c +f:fs/ubifs/gc.c +f:fs/ubifs/io.c +f:fs/ubifs/ioctl.c +f:fs/ubifs/journal.c +f:fs/ubifs/key.h +f:fs/ubifs/log.c +f:fs/ubifs/lprops.c +f:fs/ubifs/lpt.c +f:fs/ubifs/lpt_commit.c +f:fs/ubifs/master.c +f:fs/ubifs/misc.c +f:fs/ubifs/misc.h +f:fs/ubifs/orphan.c +f:fs/ubifs/recovery.c +f:fs/ubifs/replay.c +f:fs/ubifs/sb.c +f:fs/ubifs/scan.c +f:fs/ubifs/shrinker.c +f:fs/ubifs/super.c +f:fs/ubifs/sysfs.c +f:fs/ubifs/tnc.c +f:fs/ubifs/tnc_commit.c +f:fs/ubifs/tnc_misc.c +f:fs/ubifs/ubifs-media.h +f:fs/ubifs/ubifs.h +f:fs/ubifs/xattr.c +f:fs/udf/Kconfig +f:fs/udf/Makefile +f:fs/udf/balloc.c +f:fs/udf/dir.c +f:fs/udf/directory.c +f:fs/udf/ecma_167.h +f:fs/udf/file.c +f:fs/udf/ialloc.c +f:fs/udf/inode.c +f:fs/udf/lowlevel.c +f:fs/udf/misc.c +f:fs/udf/namei.c +f:fs/udf/osta_udf.h +f:fs/udf/partition.c +f:fs/udf/super.c +f:fs/udf/symlink.c +f:fs/udf/truncate.c +f:fs/udf/udf_i.h +f:fs/udf/udf_sb.h +f:fs/udf/udfdecl.h +f:fs/udf/udfend.h +f:fs/udf/udftime.c +f:fs/udf/unicode.c +f:fs/ufs/Kconfig +f:fs/ufs/Makefile +f:fs/ufs/balloc.c +f:fs/ufs/cylinder.c +f:fs/ufs/dir.c +f:fs/ufs/file.c +f:fs/ufs/ialloc.c +f:fs/ufs/inode.c +f:fs/ufs/namei.c +f:fs/ufs/super.c +f:fs/ufs/swab.h +f:fs/ufs/ufs.h +f:fs/ufs/ufs_fs.h +f:fs/ufs/util.c +f:fs/ufs/util.h +f:fs/unicode/.gitignore +f:fs/unicode/Kconfig +f:fs/unicode/Makefile +f:fs/unicode/README.utf8data +f:fs/unicode/mkutf8data.c +f:fs/unicode/tests/.kunitconfig +f:fs/unicode/tests/utf8_kunit.c +f:fs/unicode/utf8-core.c +f:fs/unicode/utf8-norm.c +f:fs/unicode/utf8data.c_shipped +f:fs/unicode/utf8n.h +f:fs/userfaultfd.c +f:fs/utimes.c +f:fs/vboxsf/Kconfig +f:fs/vboxsf/Makefile +f:fs/vboxsf/dir.c +f:fs/vboxsf/file.c +f:fs/vboxsf/shfl_hostintf.h +f:fs/vboxsf/super.c +f:fs/vboxsf/utils.c +f:fs/vboxsf/vboxsf_wrappers.c +f:fs/vboxsf/vfsmod.h +f:fs/verity/Kconfig +f:fs/verity/Makefile +f:fs/verity/enable.c +f:fs/verity/fsverity_private.h +f:fs/verity/hash_algs.c +f:fs/verity/init.c +f:fs/verity/measure.c +f:fs/verity/open.c +f:fs/verity/read_metadata.c +f:fs/verity/signature.c +f:fs/verity/verify.c +f:fs/xattr.c +f:fs/xfs/Kconfig +f:fs/xfs/Makefile +f:fs/xfs/libxfs/xfs_ag.c +f:fs/xfs/libxfs/xfs_ag.h +f:fs/xfs/libxfs/xfs_ag_resv.c +f:fs/xfs/libxfs/xfs_ag_resv.h +f:fs/xfs/libxfs/xfs_alloc.c +f:fs/xfs/libxfs/xfs_alloc.h +f:fs/xfs/libxfs/xfs_alloc_btree.c +f:fs/xfs/libxfs/xfs_alloc_btree.h +f:fs/xfs/libxfs/xfs_attr.c +f:fs/xfs/libxfs/xfs_attr.h +f:fs/xfs/libxfs/xfs_attr_leaf.c +f:fs/xfs/libxfs/xfs_attr_leaf.h +f:fs/xfs/libxfs/xfs_attr_remote.c +f:fs/xfs/libxfs/xfs_attr_remote.h +f:fs/xfs/libxfs/xfs_attr_sf.h +f:fs/xfs/libxfs/xfs_bit.c +f:fs/xfs/libxfs/xfs_bit.h +f:fs/xfs/libxfs/xfs_bmap.c +f:fs/xfs/libxfs/xfs_bmap.h +f:fs/xfs/libxfs/xfs_bmap_btree.c +f:fs/xfs/libxfs/xfs_bmap_btree.h +f:fs/xfs/libxfs/xfs_btree.c +f:fs/xfs/libxfs/xfs_btree.h +f:fs/xfs/libxfs/xfs_btree_mem.c +f:fs/xfs/libxfs/xfs_btree_mem.h +f:fs/xfs/libxfs/xfs_btree_staging.c +f:fs/xfs/libxfs/xfs_btree_staging.h +f:fs/xfs/libxfs/xfs_cksum.h +f:fs/xfs/libxfs/xfs_da_btree.c +f:fs/xfs/libxfs/xfs_da_btree.h +f:fs/xfs/libxfs/xfs_da_format.h +f:fs/xfs/libxfs/xfs_defer.c +f:fs/xfs/libxfs/xfs_defer.h +f:fs/xfs/libxfs/xfs_dir2.c +f:fs/xfs/libxfs/xfs_dir2.h +f:fs/xfs/libxfs/xfs_dir2_block.c +f:fs/xfs/libxfs/xfs_dir2_data.c +f:fs/xfs/libxfs/xfs_dir2_leaf.c +f:fs/xfs/libxfs/xfs_dir2_node.c +f:fs/xfs/libxfs/xfs_dir2_priv.h +f:fs/xfs/libxfs/xfs_dir2_sf.c +f:fs/xfs/libxfs/xfs_dquot_buf.c +f:fs/xfs/libxfs/xfs_errortag.h +f:fs/xfs/libxfs/xfs_exchmaps.c +f:fs/xfs/libxfs/xfs_exchmaps.h +f:fs/xfs/libxfs/xfs_format.h +f:fs/xfs/libxfs/xfs_fs.h +f:fs/xfs/libxfs/xfs_group.c +f:fs/xfs/libxfs/xfs_group.h +f:fs/xfs/libxfs/xfs_health.h +f:fs/xfs/libxfs/xfs_ialloc.c +f:fs/xfs/libxfs/xfs_ialloc.h +f:fs/xfs/libxfs/xfs_ialloc_btree.c +f:fs/xfs/libxfs/xfs_ialloc_btree.h +f:fs/xfs/libxfs/xfs_iext_tree.c +f:fs/xfs/libxfs/xfs_inode_buf.c +f:fs/xfs/libxfs/xfs_inode_buf.h +f:fs/xfs/libxfs/xfs_inode_fork.c +f:fs/xfs/libxfs/xfs_inode_fork.h +f:fs/xfs/libxfs/xfs_inode_util.c +f:fs/xfs/libxfs/xfs_inode_util.h +f:fs/xfs/libxfs/xfs_log_format.h +f:fs/xfs/libxfs/xfs_log_recover.h +f:fs/xfs/libxfs/xfs_log_rlimit.c +f:fs/xfs/libxfs/xfs_metadir.c +f:fs/xfs/libxfs/xfs_metadir.h +f:fs/xfs/libxfs/xfs_metafile.c +f:fs/xfs/libxfs/xfs_metafile.h +f:fs/xfs/libxfs/xfs_ondisk.h +f:fs/xfs/libxfs/xfs_parent.c +f:fs/xfs/libxfs/xfs_parent.h +f:fs/xfs/libxfs/xfs_quota_defs.h +f:fs/xfs/libxfs/xfs_refcount.c +f:fs/xfs/libxfs/xfs_refcount.h +f:fs/xfs/libxfs/xfs_refcount_btree.c +f:fs/xfs/libxfs/xfs_refcount_btree.h +f:fs/xfs/libxfs/xfs_rmap.c +f:fs/xfs/libxfs/xfs_rmap.h +f:fs/xfs/libxfs/xfs_rmap_btree.c +f:fs/xfs/libxfs/xfs_rmap_btree.h +f:fs/xfs/libxfs/xfs_rtbitmap.c +f:fs/xfs/libxfs/xfs_rtbitmap.h +f:fs/xfs/libxfs/xfs_rtgroup.c +f:fs/xfs/libxfs/xfs_rtgroup.h +f:fs/xfs/libxfs/xfs_rtrefcount_btree.c +f:fs/xfs/libxfs/xfs_rtrefcount_btree.h +f:fs/xfs/libxfs/xfs_rtrmap_btree.c +f:fs/xfs/libxfs/xfs_rtrmap_btree.h +f:fs/xfs/libxfs/xfs_sb.c +f:fs/xfs/libxfs/xfs_sb.h +f:fs/xfs/libxfs/xfs_shared.h +f:fs/xfs/libxfs/xfs_symlink_remote.c +f:fs/xfs/libxfs/xfs_symlink_remote.h +f:fs/xfs/libxfs/xfs_trans_inode.c +f:fs/xfs/libxfs/xfs_trans_resv.c +f:fs/xfs/libxfs/xfs_trans_resv.h +f:fs/xfs/libxfs/xfs_trans_space.c +f:fs/xfs/libxfs/xfs_trans_space.h +f:fs/xfs/libxfs/xfs_types.c +f:fs/xfs/libxfs/xfs_types.h +f:fs/xfs/libxfs/xfs_zones.c +f:fs/xfs/libxfs/xfs_zones.h +f:fs/xfs/scrub/agb_bitmap.c +f:fs/xfs/scrub/agb_bitmap.h +f:fs/xfs/scrub/agheader.c +f:fs/xfs/scrub/agheader_repair.c +f:fs/xfs/scrub/agino_bitmap.h +f:fs/xfs/scrub/alloc.c +f:fs/xfs/scrub/alloc_repair.c +f:fs/xfs/scrub/attr.c +f:fs/xfs/scrub/attr.h +f:fs/xfs/scrub/attr_repair.c +f:fs/xfs/scrub/attr_repair.h +f:fs/xfs/scrub/bitmap.c +f:fs/xfs/scrub/bitmap.h +f:fs/xfs/scrub/bmap.c +f:fs/xfs/scrub/bmap_repair.c +f:fs/xfs/scrub/btree.c +f:fs/xfs/scrub/btree.h +f:fs/xfs/scrub/common.c +f:fs/xfs/scrub/common.h +f:fs/xfs/scrub/cow_repair.c +f:fs/xfs/scrub/dab_bitmap.h +f:fs/xfs/scrub/dabtree.c +f:fs/xfs/scrub/dabtree.h +f:fs/xfs/scrub/dir.c +f:fs/xfs/scrub/dir_repair.c +f:fs/xfs/scrub/dirtree.c +f:fs/xfs/scrub/dirtree.h +f:fs/xfs/scrub/dirtree_repair.c +f:fs/xfs/scrub/dqiterate.c +f:fs/xfs/scrub/findparent.c +f:fs/xfs/scrub/findparent.h +f:fs/xfs/scrub/fsb_bitmap.h +f:fs/xfs/scrub/fscounters.c +f:fs/xfs/scrub/fscounters.h +f:fs/xfs/scrub/fscounters_repair.c +f:fs/xfs/scrub/health.c +f:fs/xfs/scrub/health.h +f:fs/xfs/scrub/ialloc.c +f:fs/xfs/scrub/ialloc_repair.c +f:fs/xfs/scrub/ino_bitmap.h +f:fs/xfs/scrub/inode.c +f:fs/xfs/scrub/inode_repair.c +f:fs/xfs/scrub/iscan.c +f:fs/xfs/scrub/iscan.h +f:fs/xfs/scrub/listxattr.c +f:fs/xfs/scrub/listxattr.h +f:fs/xfs/scrub/metapath.c +f:fs/xfs/scrub/newbt.c +f:fs/xfs/scrub/newbt.h +f:fs/xfs/scrub/nlinks.c +f:fs/xfs/scrub/nlinks.h +f:fs/xfs/scrub/nlinks_repair.c +f:fs/xfs/scrub/off_bitmap.h +f:fs/xfs/scrub/orphanage.c +f:fs/xfs/scrub/orphanage.h +f:fs/xfs/scrub/parent.c +f:fs/xfs/scrub/parent_repair.c +f:fs/xfs/scrub/quota.c +f:fs/xfs/scrub/quota.h +f:fs/xfs/scrub/quota_repair.c +f:fs/xfs/scrub/quotacheck.c +f:fs/xfs/scrub/quotacheck.h +f:fs/xfs/scrub/quotacheck_repair.c +f:fs/xfs/scrub/rcbag.c +f:fs/xfs/scrub/rcbag.h +f:fs/xfs/scrub/rcbag_btree.c +f:fs/xfs/scrub/rcbag_btree.h +f:fs/xfs/scrub/readdir.c +f:fs/xfs/scrub/readdir.h +f:fs/xfs/scrub/reap.c +f:fs/xfs/scrub/reap.h +f:fs/xfs/scrub/refcount.c +f:fs/xfs/scrub/refcount_repair.c +f:fs/xfs/scrub/repair.c +f:fs/xfs/scrub/repair.h +f:fs/xfs/scrub/rgb_bitmap.h +f:fs/xfs/scrub/rgsuper.c +f:fs/xfs/scrub/rmap.c +f:fs/xfs/scrub/rmap_repair.c +f:fs/xfs/scrub/rtb_bitmap.h +f:fs/xfs/scrub/rtbitmap.c +f:fs/xfs/scrub/rtbitmap.h +f:fs/xfs/scrub/rtbitmap_repair.c +f:fs/xfs/scrub/rtrefcount.c +f:fs/xfs/scrub/rtrefcount_repair.c +f:fs/xfs/scrub/rtrmap.c +f:fs/xfs/scrub/rtrmap_repair.c +f:fs/xfs/scrub/rtsummary.c +f:fs/xfs/scrub/rtsummary.h +f:fs/xfs/scrub/rtsummary_repair.c +f:fs/xfs/scrub/scrub.c +f:fs/xfs/scrub/scrub.h +f:fs/xfs/scrub/stats.c +f:fs/xfs/scrub/stats.h +f:fs/xfs/scrub/symlink.c +f:fs/xfs/scrub/symlink_repair.c +f:fs/xfs/scrub/tempexch.h +f:fs/xfs/scrub/tempfile.c +f:fs/xfs/scrub/tempfile.h +f:fs/xfs/scrub/trace.c +f:fs/xfs/scrub/trace.h +f:fs/xfs/scrub/xfarray.c +f:fs/xfs/scrub/xfarray.h +f:fs/xfs/scrub/xfblob.c +f:fs/xfs/scrub/xfblob.h +f:fs/xfs/scrub/xfile.c +f:fs/xfs/scrub/xfile.h +f:fs/xfs/scrub/xfs_scrub.h +f:fs/xfs/xfs.h +f:fs/xfs/xfs_acl.c +f:fs/xfs/xfs_acl.h +f:fs/xfs/xfs_aops.c +f:fs/xfs/xfs_aops.h +f:fs/xfs/xfs_attr_inactive.c +f:fs/xfs/xfs_attr_item.c +f:fs/xfs/xfs_attr_item.h +f:fs/xfs/xfs_attr_list.c +f:fs/xfs/xfs_bio_io.c +f:fs/xfs/xfs_bmap_item.c +f:fs/xfs/xfs_bmap_item.h +f:fs/xfs/xfs_bmap_util.c +f:fs/xfs/xfs_bmap_util.h +f:fs/xfs/xfs_buf.c +f:fs/xfs/xfs_buf.h +f:fs/xfs/xfs_buf_item.c +f:fs/xfs/xfs_buf_item.h +f:fs/xfs/xfs_buf_item_recover.c +f:fs/xfs/xfs_buf_mem.c +f:fs/xfs/xfs_buf_mem.h +f:fs/xfs/xfs_dahash_test.c +f:fs/xfs/xfs_dahash_test.h +f:fs/xfs/xfs_dir2_readdir.c +f:fs/xfs/xfs_discard.c +f:fs/xfs/xfs_discard.h +f:fs/xfs/xfs_dquot.c +f:fs/xfs/xfs_dquot.h +f:fs/xfs/xfs_dquot_item.c +f:fs/xfs/xfs_dquot_item.h +f:fs/xfs/xfs_dquot_item_recover.c +f:fs/xfs/xfs_drain.c +f:fs/xfs/xfs_drain.h +f:fs/xfs/xfs_error.c +f:fs/xfs/xfs_error.h +f:fs/xfs/xfs_exchmaps_item.c +f:fs/xfs/xfs_exchmaps_item.h +f:fs/xfs/xfs_exchrange.c +f:fs/xfs/xfs_exchrange.h +f:fs/xfs/xfs_export.c +f:fs/xfs/xfs_export.h +f:fs/xfs/xfs_extent_busy.c +f:fs/xfs/xfs_extent_busy.h +f:fs/xfs/xfs_extfree_item.c +f:fs/xfs/xfs_extfree_item.h +f:fs/xfs/xfs_file.c +f:fs/xfs/xfs_file.h +f:fs/xfs/xfs_filestream.c +f:fs/xfs/xfs_filestream.h +f:fs/xfs/xfs_fsmap.c +f:fs/xfs/xfs_fsmap.h +f:fs/xfs/xfs_fsops.c +f:fs/xfs/xfs_fsops.h +f:fs/xfs/xfs_globals.c +f:fs/xfs/xfs_handle.c +f:fs/xfs/xfs_handle.h +f:fs/xfs/xfs_health.c +f:fs/xfs/xfs_hooks.c +f:fs/xfs/xfs_hooks.h +f:fs/xfs/xfs_icache.c +f:fs/xfs/xfs_icache.h +f:fs/xfs/xfs_icreate_item.c +f:fs/xfs/xfs_icreate_item.h +f:fs/xfs/xfs_inode.c +f:fs/xfs/xfs_inode.h +f:fs/xfs/xfs_inode_item.c +f:fs/xfs/xfs_inode_item.h +f:fs/xfs/xfs_inode_item_recover.c +f:fs/xfs/xfs_ioctl.c +f:fs/xfs/xfs_ioctl.h +f:fs/xfs/xfs_ioctl32.c +f:fs/xfs/xfs_ioctl32.h +f:fs/xfs/xfs_iomap.c +f:fs/xfs/xfs_iomap.h +f:fs/xfs/xfs_iops.c +f:fs/xfs/xfs_iops.h +f:fs/xfs/xfs_itable.c +f:fs/xfs/xfs_itable.h +f:fs/xfs/xfs_iunlink_item.c +f:fs/xfs/xfs_iunlink_item.h +f:fs/xfs/xfs_iwalk.c +f:fs/xfs/xfs_iwalk.h +f:fs/xfs/xfs_linux.h +f:fs/xfs/xfs_log.c +f:fs/xfs/xfs_log.h +f:fs/xfs/xfs_log_cil.c +f:fs/xfs/xfs_log_priv.h +f:fs/xfs/xfs_log_recover.c +f:fs/xfs/xfs_message.c +f:fs/xfs/xfs_message.h +f:fs/xfs/xfs_mount.c +f:fs/xfs/xfs_mount.h +f:fs/xfs/xfs_mru_cache.c +f:fs/xfs/xfs_mru_cache.h +f:fs/xfs/xfs_notify_failure.c +f:fs/xfs/xfs_notify_failure.h +f:fs/xfs/xfs_pnfs.c +f:fs/xfs/xfs_pnfs.h +f:fs/xfs/xfs_pwork.c +f:fs/xfs/xfs_pwork.h +f:fs/xfs/xfs_qm.c +f:fs/xfs/xfs_qm.h +f:fs/xfs/xfs_qm_bhv.c +f:fs/xfs/xfs_qm_syscalls.c +f:fs/xfs/xfs_quota.h +f:fs/xfs/xfs_quotaops.c +f:fs/xfs/xfs_refcount_item.c +f:fs/xfs/xfs_refcount_item.h +f:fs/xfs/xfs_reflink.c +f:fs/xfs/xfs_reflink.h +f:fs/xfs/xfs_rmap_item.c +f:fs/xfs/xfs_rmap_item.h +f:fs/xfs/xfs_rtalloc.c +f:fs/xfs/xfs_rtalloc.h +f:fs/xfs/xfs_stats.c +f:fs/xfs/xfs_stats.h +f:fs/xfs/xfs_super.c +f:fs/xfs/xfs_super.h +f:fs/xfs/xfs_symlink.c +f:fs/xfs/xfs_symlink.h +f:fs/xfs/xfs_sysctl.c +f:fs/xfs/xfs_sysctl.h +f:fs/xfs/xfs_sysfs.c +f:fs/xfs/xfs_sysfs.h +f:fs/xfs/xfs_trace.c +f:fs/xfs/xfs_trace.h +f:fs/xfs/xfs_trans.c +f:fs/xfs/xfs_trans.h +f:fs/xfs/xfs_trans_ail.c +f:fs/xfs/xfs_trans_buf.c +f:fs/xfs/xfs_trans_dquot.c +f:fs/xfs/xfs_trans_priv.h +f:fs/xfs/xfs_xattr.c +f:fs/xfs/xfs_xattr.h +f:fs/xfs/xfs_zone_alloc.c +f:fs/xfs/xfs_zone_alloc.h +f:fs/xfs/xfs_zone_gc.c +f:fs/xfs/xfs_zone_info.c +f:fs/xfs/xfs_zone_priv.h +f:fs/xfs/xfs_zone_space_resv.c +f:fs/zonefs/Kconfig +f:fs/zonefs/Makefile +f:fs/zonefs/file.c +f:fs/zonefs/super.c +f:fs/zonefs/sysfs.c +f:fs/zonefs/trace.h +f:fs/zonefs/zonefs.h +f:include/Kbuild +f:include/acpi/acbuffer.h +f:include/acpi/acconfig.h +f:include/acpi/acexcep.h +f:include/acpi/acnames.h +f:include/acpi/acoutput.h +f:include/acpi/acpi.h +f:include/acpi/acpi_bus.h +f:include/acpi/acpi_drivers.h +f:include/acpi/acpi_io.h +f:include/acpi/acpi_lpat.h +f:include/acpi/acpi_numa.h +f:include/acpi/acpiosxf.h +f:include/acpi/acpixf.h +f:include/acpi/acrestyp.h +f:include/acpi/actbl.h +f:include/acpi/actbl1.h +f:include/acpi/actbl2.h +f:include/acpi/actbl3.h +f:include/acpi/actypes.h +f:include/acpi/acuuid.h +f:include/acpi/apei.h +f:include/acpi/battery.h +f:include/acpi/button.h +f:include/acpi/cppc_acpi.h +f:include/acpi/ghes.h +f:include/acpi/hed.h +f:include/acpi/nfit.h +f:include/acpi/nhlt.h +f:include/acpi/pcc.h +f:include/acpi/platform/acenv.h +f:include/acpi/platform/acenvex.h +f:include/acpi/platform/acgcc.h +f:include/acpi/platform/acgccex.h +f:include/acpi/platform/aclinux.h +f:include/acpi/platform/aclinuxex.h +f:include/acpi/platform/aczephyr.h +f:include/acpi/proc_cap_intel.h +f:include/acpi/processor.h +f:include/acpi/reboot.h +f:include/acpi/video.h +f:include/asm-generic/Kbuild +f:include/asm-generic/access_ok.h +f:include/asm-generic/agp.h +f:include/asm-generic/archrandom.h +f:include/asm-generic/asm-offsets.h +f:include/asm-generic/asm-prototypes.h +f:include/asm-generic/atomic.h +f:include/asm-generic/atomic64.h +f:include/asm-generic/audit_change_attr.h +f:include/asm-generic/audit_dir_write.h +f:include/asm-generic/audit_read.h +f:include/asm-generic/audit_signal.h +f:include/asm-generic/audit_write.h +f:include/asm-generic/barrier.h +f:include/asm-generic/bitops.h +f:include/asm-generic/bitops/__ffs.h +f:include/asm-generic/bitops/__fls.h +f:include/asm-generic/bitops/arch_hweight.h +f:include/asm-generic/bitops/atomic.h +f:include/asm-generic/bitops/builtin-__ffs.h +f:include/asm-generic/bitops/builtin-__fls.h +f:include/asm-generic/bitops/builtin-ffs.h +f:include/asm-generic/bitops/builtin-fls.h +f:include/asm-generic/bitops/const_hweight.h +f:include/asm-generic/bitops/ext2-atomic-setbit.h +f:include/asm-generic/bitops/ext2-atomic.h +f:include/asm-generic/bitops/ffs.h +f:include/asm-generic/bitops/ffz.h +f:include/asm-generic/bitops/fls.h +f:include/asm-generic/bitops/fls64.h +f:include/asm-generic/bitops/generic-non-atomic.h +f:include/asm-generic/bitops/hweight.h +f:include/asm-generic/bitops/instrumented-atomic.h +f:include/asm-generic/bitops/instrumented-lock.h +f:include/asm-generic/bitops/instrumented-non-atomic.h +f:include/asm-generic/bitops/le.h +f:include/asm-generic/bitops/lock.h +f:include/asm-generic/bitops/non-atomic.h +f:include/asm-generic/bitops/non-instrumented-non-atomic.h +f:include/asm-generic/bitops/sched.h +f:include/asm-generic/bitsperlong.h +f:include/asm-generic/bug.h +f:include/asm-generic/cache.h +f:include/asm-generic/cacheflush.h +f:include/asm-generic/cfi.h +f:include/asm-generic/checksum.h +f:include/asm-generic/cmpxchg-local.h +f:include/asm-generic/cmpxchg.h +f:include/asm-generic/codetag.lds.h +f:include/asm-generic/compat.h +f:include/asm-generic/current.h +f:include/asm-generic/delay.h +f:include/asm-generic/device.h +f:include/asm-generic/div64.h +f:include/asm-generic/dma-mapping.h +f:include/asm-generic/dma.h +f:include/asm-generic/early_ioremap.h +f:include/asm-generic/emergency-restart.h +f:include/asm-generic/error-injection.h +f:include/asm-generic/exec.h +f:include/asm-generic/extable.h +f:include/asm-generic/fixmap.h +f:include/asm-generic/flat.h +f:include/asm-generic/fprobe.h +f:include/asm-generic/ftrace.h +f:include/asm-generic/futex.h +f:include/asm-generic/getorder.h +f:include/asm-generic/hardirq.h +f:include/asm-generic/hugetlb.h +f:include/asm-generic/hw_irq.h +f:include/asm-generic/int-ll64.h +f:include/asm-generic/io.h +f:include/asm-generic/ioctl.h +f:include/asm-generic/iomap.h +f:include/asm-generic/irq.h +f:include/asm-generic/irq_regs.h +f:include/asm-generic/irq_work.h +f:include/asm-generic/irqflags.h +f:include/asm-generic/kdebug.h +f:include/asm-generic/kmap_size.h +f:include/asm-generic/kprobes.h +f:include/asm-generic/kvm_para.h +f:include/asm-generic/kvm_types.h +f:include/asm-generic/linkage.h +f:include/asm-generic/local.h +f:include/asm-generic/local64.h +f:include/asm-generic/logic_io.h +f:include/asm-generic/mcs_spinlock.h +f:include/asm-generic/memory_model.h +f:include/asm-generic/mm_hooks.h +f:include/asm-generic/mmiowb.h +f:include/asm-generic/mmiowb_types.h +f:include/asm-generic/mmu.h +f:include/asm-generic/mmu_context.h +f:include/asm-generic/mmzone.h +f:include/asm-generic/module.h +f:include/asm-generic/module.lds.h +f:include/asm-generic/mshyperv.h +f:include/asm-generic/msi.h +f:include/asm-generic/nommu_context.h +f:include/asm-generic/numa.h +f:include/asm-generic/param.h +f:include/asm-generic/parport.h +f:include/asm-generic/pci.h +f:include/asm-generic/pci_iomap.h +f:include/asm-generic/percpu.h +f:include/asm-generic/pgalloc.h +f:include/asm-generic/pgtable-nop4d.h +f:include/asm-generic/pgtable-nopmd.h +f:include/asm-generic/pgtable-nopud.h +f:include/asm-generic/pgtable_uffd.h +f:include/asm-generic/preempt.h +f:include/asm-generic/qrwlock.h +f:include/asm-generic/qrwlock_types.h +f:include/asm-generic/qspinlock.h +f:include/asm-generic/qspinlock_types.h +f:include/asm-generic/resource.h +f:include/asm-generic/rqspinlock.h +f:include/asm-generic/runtime-const.h +f:include/asm-generic/rwonce.h +f:include/asm-generic/seccomp.h +f:include/asm-generic/sections.h +f:include/asm-generic/serial.h +f:include/asm-generic/set_memory.h +f:include/asm-generic/shmparam.h +f:include/asm-generic/signal.h +f:include/asm-generic/simd.h +f:include/asm-generic/softirq_stack.h +f:include/asm-generic/spinlock.h +f:include/asm-generic/spinlock_types.h +f:include/asm-generic/statfs.h +f:include/asm-generic/string.h +f:include/asm-generic/switch_to.h +f:include/asm-generic/syscall.h +f:include/asm-generic/syscalls.h +f:include/asm-generic/text-patching.h +f:include/asm-generic/ticket_spinlock.h +f:include/asm-generic/timex.h +f:include/asm-generic/tlb.h +f:include/asm-generic/tlbflush.h +f:include/asm-generic/topology.h +f:include/asm-generic/trace_clock.h +f:include/asm-generic/uaccess.h +f:include/asm-generic/user.h +f:include/asm-generic/vdso/vsyscall.h +f:include/asm-generic/vermagic.h +f:include/asm-generic/vga.h +f:include/asm-generic/video.h +f:include/asm-generic/vmlinux.lds.h +f:include/asm-generic/word-at-a-time.h +f:include/asm-generic/xor.h +f:include/clocksource/arm_arch_timer.h +f:include/clocksource/hyperv_timer.h +f:include/clocksource/pxa.h +f:include/clocksource/samsung_pwm.h +f:include/clocksource/timer-davinci.h +f:include/clocksource/timer-goldfish.h +f:include/clocksource/timer-riscv.h +f:include/clocksource/timer-ti-dm.h +f:include/clocksource/timer-xilinx.h +f:include/crypto/acompress.h +f:include/crypto/aead.h +f:include/crypto/aes.h +f:include/crypto/akcipher.h +f:include/crypto/algapi.h +f:include/crypto/arc4.h +f:include/crypto/aria.h +f:include/crypto/authenc.h +f:include/crypto/b128ops.h +f:include/crypto/blake2b.h +f:include/crypto/blake2s.h +f:include/crypto/blowfish.h +f:include/crypto/cast5.h +f:include/crypto/cast6.h +f:include/crypto/cast_common.h +f:include/crypto/chacha.h +f:include/crypto/chacha20poly1305.h +f:include/crypto/cryptd.h +f:include/crypto/ctr.h +f:include/crypto/curve25519.h +f:include/crypto/des.h +f:include/crypto/dh.h +f:include/crypto/drbg.h +f:include/crypto/ecc_curve.h +f:include/crypto/ecdh.h +f:include/crypto/engine.h +f:include/crypto/gcm.h +f:include/crypto/gf128mul.h +f:include/crypto/ghash.h +f:include/crypto/hash.h +f:include/crypto/hash_info.h +f:include/crypto/hkdf.h +f:include/crypto/hmac.h +f:include/crypto/if_alg.h +f:include/crypto/internal/acompress.h +f:include/crypto/internal/aead.h +f:include/crypto/internal/akcipher.h +f:include/crypto/internal/blake2b.h +f:include/crypto/internal/blake2s.h +f:include/crypto/internal/blockhash.h +f:include/crypto/internal/cipher.h +f:include/crypto/internal/des.h +f:include/crypto/internal/ecc.h +f:include/crypto/internal/engine.h +f:include/crypto/internal/geniv.h +f:include/crypto/internal/hash.h +f:include/crypto/internal/kdf_selftest.h +f:include/crypto/internal/kpp.h +f:include/crypto/internal/poly1305.h +f:include/crypto/internal/rng.h +f:include/crypto/internal/rsa.h +f:include/crypto/internal/scompress.h +f:include/crypto/internal/sig.h +f:include/crypto/internal/simd.h +f:include/crypto/internal/skcipher.h +f:include/crypto/kdf_sp800108.h +f:include/crypto/kpp.h +f:include/crypto/krb5.h +f:include/crypto/md5.h +f:include/crypto/nhpoly1305.h +f:include/crypto/null.h +f:include/crypto/padlock.h +f:include/crypto/pcrypt.h +f:include/crypto/pkcs7.h +f:include/crypto/poly1305.h +f:include/crypto/polyval.h +f:include/crypto/public_key.h +f:include/crypto/rng.h +f:include/crypto/scatterwalk.h +f:include/crypto/serpent.h +f:include/crypto/sha1.h +f:include/crypto/sha2.h +f:include/crypto/sha3.h +f:include/crypto/sig.h +f:include/crypto/skcipher.h +f:include/crypto/sm3.h +f:include/crypto/sm3_base.h +f:include/crypto/sm4.h +f:include/crypto/streebog.h +f:include/crypto/twofish.h +f:include/crypto/utils.h +f:include/crypto/xts.h +f:include/cxl/einj.h +f:include/cxl/event.h +f:include/cxl/features.h +f:include/cxl/mailbox.h +f:include/drm/Makefile +f:include/drm/amd/isp.h +f:include/drm/amd_asic_type.h +f:include/drm/bridge/analogix_dp.h +f:include/drm/bridge/aux-bridge.h +f:include/drm/bridge/dw_hdmi.h +f:include/drm/bridge/dw_hdmi_qp.h +f:include/drm/bridge/dw_mipi_dsi.h +f:include/drm/bridge/dw_mipi_dsi2.h +f:include/drm/bridge/imx.h +f:include/drm/bridge/mhl.h +f:include/drm/bridge/samsung-dsim.h +f:include/drm/clients/drm_client_setup.h +f:include/drm/display/drm_dp.h +f:include/drm/display/drm_dp_aux_bus.h +f:include/drm/display/drm_dp_dual_mode_helper.h +f:include/drm/display/drm_dp_helper.h +f:include/drm/display/drm_dp_mst_helper.h +f:include/drm/display/drm_dp_tunnel.h +f:include/drm/display/drm_dsc.h +f:include/drm/display/drm_dsc_helper.h +f:include/drm/display/drm_hdcp.h +f:include/drm/display/drm_hdcp_helper.h +f:include/drm/display/drm_hdmi_audio_helper.h +f:include/drm/display/drm_hdmi_cec_helper.h +f:include/drm/display/drm_hdmi_helper.h +f:include/drm/display/drm_hdmi_state_helper.h +f:include/drm/display/drm_scdc.h +f:include/drm/display/drm_scdc_helper.h +f:include/drm/drm_accel.h +f:include/drm/drm_atomic.h +f:include/drm/drm_atomic_helper.h +f:include/drm/drm_atomic_state_helper.h +f:include/drm/drm_atomic_uapi.h +f:include/drm/drm_audio_component.h +f:include/drm/drm_auth.h +f:include/drm/drm_blend.h +f:include/drm/drm_bridge.h +f:include/drm/drm_bridge_connector.h +f:include/drm/drm_bridge_helper.h +f:include/drm/drm_buddy.h +f:include/drm/drm_cache.h +f:include/drm/drm_client.h +f:include/drm/drm_client_event.h +f:include/drm/drm_color_mgmt.h +f:include/drm/drm_connector.h +f:include/drm/drm_crtc.h +f:include/drm/drm_crtc_helper.h +f:include/drm/drm_damage_helper.h +f:include/drm/drm_debugfs.h +f:include/drm/drm_debugfs_crc.h +f:include/drm/drm_device.h +f:include/drm/drm_drv.h +f:include/drm/drm_edid.h +f:include/drm/drm_eld.h +f:include/drm/drm_encoder.h +f:include/drm/drm_exec.h +f:include/drm/drm_fb_dma_helper.h +f:include/drm/drm_fb_helper.h +f:include/drm/drm_fbdev_dma.h +f:include/drm/drm_fbdev_shmem.h +f:include/drm/drm_fbdev_ttm.h +f:include/drm/drm_file.h +f:include/drm/drm_fixed.h +f:include/drm/drm_flip_work.h +f:include/drm/drm_format_helper.h +f:include/drm/drm_fourcc.h +f:include/drm/drm_framebuffer.h +f:include/drm/drm_gem.h +f:include/drm/drm_gem_atomic_helper.h +f:include/drm/drm_gem_dma_helper.h +f:include/drm/drm_gem_framebuffer_helper.h +f:include/drm/drm_gem_shmem_helper.h +f:include/drm/drm_gem_ttm_helper.h +f:include/drm/drm_gem_vram_helper.h +f:include/drm/drm_gpusvm.h +f:include/drm/drm_gpuvm.h +f:include/drm/drm_ioctl.h +f:include/drm/drm_kunit_helpers.h +f:include/drm/drm_lease.h +f:include/drm/drm_managed.h +f:include/drm/drm_mipi_dbi.h +f:include/drm/drm_mipi_dsi.h +f:include/drm/drm_mm.h +f:include/drm/drm_mode_config.h +f:include/drm/drm_mode_object.h +f:include/drm/drm_modes.h +f:include/drm/drm_modeset_helper.h +f:include/drm/drm_modeset_helper_vtables.h +f:include/drm/drm_modeset_lock.h +f:include/drm/drm_module.h +f:include/drm/drm_of.h +f:include/drm/drm_pagemap.h +f:include/drm/drm_panel.h +f:include/drm/drm_panic.h +f:include/drm/drm_pciids.h +f:include/drm/drm_plane.h +f:include/drm/drm_plane_helper.h +f:include/drm/drm_prime.h +f:include/drm/drm_print.h +f:include/drm/drm_privacy_screen_consumer.h +f:include/drm/drm_privacy_screen_driver.h +f:include/drm/drm_privacy_screen_machine.h +f:include/drm/drm_probe_helper.h +f:include/drm/drm_property.h +f:include/drm/drm_rect.h +f:include/drm/drm_self_refresh_helper.h +f:include/drm/drm_simple_kms_helper.h +f:include/drm/drm_suballoc.h +f:include/drm/drm_syncobj.h +f:include/drm/drm_sysfs.h +f:include/drm/drm_util.h +f:include/drm/drm_utils.h +f:include/drm/drm_vblank.h +f:include/drm/drm_vblank_work.h +f:include/drm/drm_vma_manager.h +f:include/drm/drm_writeback.h +f:include/drm/gpu_scheduler.h +f:include/drm/gud.h +f:include/drm/intel/i915_component.h +f:include/drm/intel/i915_drm.h +f:include/drm/intel/i915_gsc_proxy_mei_interface.h +f:include/drm/intel/i915_hdcp_interface.h +f:include/drm/intel/i915_pxp_tee_interface.h +f:include/drm/intel/intel-gtt.h +f:include/drm/intel/intel_lpe_audio.h +f:include/drm/intel/pciids.h +f:include/drm/spsc_queue.h +f:include/drm/task_barrier.h +f:include/drm/ttm/ttm_backup.h +f:include/drm/ttm/ttm_bo.h +f:include/drm/ttm/ttm_caching.h +f:include/drm/ttm/ttm_device.h +f:include/drm/ttm/ttm_execbuf_util.h +f:include/drm/ttm/ttm_kmap_iter.h +f:include/drm/ttm/ttm_placement.h +f:include/drm/ttm/ttm_pool.h +f:include/drm/ttm/ttm_range_manager.h +f:include/drm/ttm/ttm_resource.h +f:include/drm/ttm/ttm_tt.h +f:include/dt-bindings/arm/coresight-cti-dt.h +f:include/dt-bindings/arm/mhuv3-dt.h +f:include/dt-bindings/arm/qcom,ids.h +f:include/dt-bindings/arm/ux500_pm_domains.h +f:include/dt-bindings/ata/ahci.h +f:include/dt-bindings/bus/moxtet.h +f:include/dt-bindings/bus/ti-sysc.h +f:include/dt-bindings/clock/actions,s500-cmu.h +f:include/dt-bindings/clock/actions,s700-cmu.h +f:include/dt-bindings/clock/actions,s900-cmu.h +f:include/dt-bindings/clock/agilex-clock.h +f:include/dt-bindings/clock/alphascale,asm9260.h +f:include/dt-bindings/clock/am3.h +f:include/dt-bindings/clock/am4.h +f:include/dt-bindings/clock/amlogic,a1-peripherals-clkc.h +f:include/dt-bindings/clock/amlogic,a1-pll-clkc.h +f:include/dt-bindings/clock/amlogic,c3-peripherals-clkc.h +f:include/dt-bindings/clock/amlogic,c3-pll-clkc.h +f:include/dt-bindings/clock/amlogic,c3-scmi-clkc.h +f:include/dt-bindings/clock/amlogic,s4-peripherals-clkc.h +f:include/dt-bindings/clock/amlogic,s4-pll-clkc.h +f:include/dt-bindings/clock/aspeed,ast2700-scu.h +f:include/dt-bindings/clock/aspeed-clock.h +f:include/dt-bindings/clock/ast2600-clock.h +f:include/dt-bindings/clock/at91.h +f:include/dt-bindings/clock/ath79-clk.h +f:include/dt-bindings/clock/axg-aoclkc.h +f:include/dt-bindings/clock/axg-audio-clkc.h +f:include/dt-bindings/clock/axg-clkc.h +f:include/dt-bindings/clock/axis,artpec6-clkctrl.h +f:include/dt-bindings/clock/bcm-cygnus.h +f:include/dt-bindings/clock/bcm-ns2.h +f:include/dt-bindings/clock/bcm-nsp.h +f:include/dt-bindings/clock/bcm-sr.h +f:include/dt-bindings/clock/bcm21664.h +f:include/dt-bindings/clock/bcm281xx.h +f:include/dt-bindings/clock/bcm2835-aux.h +f:include/dt-bindings/clock/bcm2835.h +f:include/dt-bindings/clock/bcm3368-clock.h +f:include/dt-bindings/clock/bcm6318-clock.h +f:include/dt-bindings/clock/bcm63268-clock.h +f:include/dt-bindings/clock/bcm6328-clock.h +f:include/dt-bindings/clock/bcm6358-clock.h +f:include/dt-bindings/clock/bcm6362-clock.h +f:include/dt-bindings/clock/bcm6368-clock.h +f:include/dt-bindings/clock/berlin2.h +f:include/dt-bindings/clock/berlin2q.h +f:include/dt-bindings/clock/bm1880-clock.h +f:include/dt-bindings/clock/boston-clock.h +f:include/dt-bindings/clock/bt1-ccu.h +f:include/dt-bindings/clock/cirrus,cs2000-cp.h +f:include/dt-bindings/clock/cirrus,ep9301-syscon.h +f:include/dt-bindings/clock/cix,sky1.h +f:include/dt-bindings/clock/clps711x-clock.h +f:include/dt-bindings/clock/cortina,gemini-clock.h +f:include/dt-bindings/clock/dm814.h +f:include/dt-bindings/clock/dm816.h +f:include/dt-bindings/clock/dra7.h +f:include/dt-bindings/clock/en7523-clk.h +f:include/dt-bindings/clock/exynos-audss-clk.h +f:include/dt-bindings/clock/exynos3250.h +f:include/dt-bindings/clock/exynos4.h +f:include/dt-bindings/clock/exynos5250.h +f:include/dt-bindings/clock/exynos5260-clk.h +f:include/dt-bindings/clock/exynos5410.h +f:include/dt-bindings/clock/exynos5420.h +f:include/dt-bindings/clock/exynos5433.h +f:include/dt-bindings/clock/exynos7-clk.h +f:include/dt-bindings/clock/exynos7885.h +f:include/dt-bindings/clock/exynos850.h +f:include/dt-bindings/clock/fsd-clk.h +f:include/dt-bindings/clock/fsl,qoriq-clockgen.h +f:include/dt-bindings/clock/g12a-aoclkc.h +f:include/dt-bindings/clock/g12a-clkc.h +f:include/dt-bindings/clock/google,gs101.h +f:include/dt-bindings/clock/gxbb-aoclkc.h +f:include/dt-bindings/clock/gxbb-clkc.h +f:include/dt-bindings/clock/hi3516cv300-clock.h +f:include/dt-bindings/clock/hi3519-clock.h +f:include/dt-bindings/clock/hi3559av100-clock.h +f:include/dt-bindings/clock/hi3620-clock.h +f:include/dt-bindings/clock/hi3660-clock.h +f:include/dt-bindings/clock/hi3670-clock.h +f:include/dt-bindings/clock/hi6220-clock.h +f:include/dt-bindings/clock/hip04-clock.h +f:include/dt-bindings/clock/histb-clock.h +f:include/dt-bindings/clock/hix5hd2-clock.h +f:include/dt-bindings/clock/imx1-clock.h +f:include/dt-bindings/clock/imx21-clock.h +f:include/dt-bindings/clock/imx27-clock.h +f:include/dt-bindings/clock/imx5-clock.h +f:include/dt-bindings/clock/imx6qdl-clock.h +f:include/dt-bindings/clock/imx6sl-clock.h +f:include/dt-bindings/clock/imx6sll-clock.h +f:include/dt-bindings/clock/imx6sx-clock.h +f:include/dt-bindings/clock/imx6ul-clock.h +f:include/dt-bindings/clock/imx7d-clock.h +f:include/dt-bindings/clock/imx7ulp-clock.h +f:include/dt-bindings/clock/imx8-clock.h +f:include/dt-bindings/clock/imx8-lpcg.h +f:include/dt-bindings/clock/imx8mm-clock.h +f:include/dt-bindings/clock/imx8mn-clock.h +f:include/dt-bindings/clock/imx8mp-clock.h +f:include/dt-bindings/clock/imx8mq-clock.h +f:include/dt-bindings/clock/imx8ulp-clock.h +f:include/dt-bindings/clock/imx93-clock.h +f:include/dt-bindings/clock/imxrt1050-clock.h +f:include/dt-bindings/clock/ingenic,jz4725b-cgu.h +f:include/dt-bindings/clock/ingenic,jz4740-cgu.h +f:include/dt-bindings/clock/ingenic,jz4755-cgu.h +f:include/dt-bindings/clock/ingenic,jz4760-cgu.h +f:include/dt-bindings/clock/ingenic,jz4770-cgu.h +f:include/dt-bindings/clock/ingenic,jz4780-cgu.h +f:include/dt-bindings/clock/ingenic,sysost.h +f:include/dt-bindings/clock/ingenic,tcu.h +f:include/dt-bindings/clock/ingenic,x1000-cgu.h +f:include/dt-bindings/clock/ingenic,x1830-cgu.h +f:include/dt-bindings/clock/intel,agilex5-clkmgr.h +f:include/dt-bindings/clock/intel,lgm-clk.h +f:include/dt-bindings/clock/k210-clk.h +f:include/dt-bindings/clock/lochnagar.h +f:include/dt-bindings/clock/loongson,ls1x-clk.h +f:include/dt-bindings/clock/loongson,ls2k-clk.h +f:include/dt-bindings/clock/lpc18xx-ccu.h +f:include/dt-bindings/clock/lpc18xx-cgu.h +f:include/dt-bindings/clock/lpc32xx-clock.h +f:include/dt-bindings/clock/lsi,axm5516-clks.h +f:include/dt-bindings/clock/marvell,mmp2-audio.h +f:include/dt-bindings/clock/marvell,mmp2.h +f:include/dt-bindings/clock/marvell,pxa168.h +f:include/dt-bindings/clock/marvell,pxa1908.h +f:include/dt-bindings/clock/marvell,pxa1928.h +f:include/dt-bindings/clock/marvell,pxa910.h +f:include/dt-bindings/clock/maxim,max77620.h +f:include/dt-bindings/clock/maxim,max77686.h +f:include/dt-bindings/clock/maxim,max77802.h +f:include/dt-bindings/clock/maxim,max9485.h +f:include/dt-bindings/clock/mediatek,mt6735-apmixedsys.h +f:include/dt-bindings/clock/mediatek,mt6735-imgsys.h +f:include/dt-bindings/clock/mediatek,mt6735-infracfg.h +f:include/dt-bindings/clock/mediatek,mt6735-mfgcfg.h +f:include/dt-bindings/clock/mediatek,mt6735-pericfg.h +f:include/dt-bindings/clock/mediatek,mt6735-topckgen.h +f:include/dt-bindings/clock/mediatek,mt6735-vdecsys.h +f:include/dt-bindings/clock/mediatek,mt6735-vencsys.h +f:include/dt-bindings/clock/mediatek,mt6795-clk.h +f:include/dt-bindings/clock/mediatek,mt7981-clk.h +f:include/dt-bindings/clock/mediatek,mt7988-clk.h +f:include/dt-bindings/clock/mediatek,mt8188-clk.h +f:include/dt-bindings/clock/mediatek,mt8365-clk.h +f:include/dt-bindings/clock/mediatek,mtmips-sysc.h +f:include/dt-bindings/clock/meson8-ddr-clkc.h +f:include/dt-bindings/clock/meson8b-clkc.h +f:include/dt-bindings/clock/microchip,lan966x.h +f:include/dt-bindings/clock/microchip,mpfs-clock.h +f:include/dt-bindings/clock/microchip,pic32-clock.h +f:include/dt-bindings/clock/microchip,sparx5.h +f:include/dt-bindings/clock/mobileye,eyeq5-clk.h +f:include/dt-bindings/clock/mpc512x-clock.h +f:include/dt-bindings/clock/mstar-msc313-mpll.h +f:include/dt-bindings/clock/mt2701-clk.h +f:include/dt-bindings/clock/mt2712-clk.h +f:include/dt-bindings/clock/mt6765-clk.h +f:include/dt-bindings/clock/mt6779-clk.h +f:include/dt-bindings/clock/mt6797-clk.h +f:include/dt-bindings/clock/mt7621-clk.h +f:include/dt-bindings/clock/mt7622-clk.h +f:include/dt-bindings/clock/mt7629-clk.h +f:include/dt-bindings/clock/mt7986-clk.h +f:include/dt-bindings/clock/mt8135-clk.h +f:include/dt-bindings/clock/mt8167-clk.h +f:include/dt-bindings/clock/mt8173-clk.h +f:include/dt-bindings/clock/mt8183-clk.h +f:include/dt-bindings/clock/mt8186-clk.h +f:include/dt-bindings/clock/mt8192-clk.h +f:include/dt-bindings/clock/mt8195-clk.h +f:include/dt-bindings/clock/mt8516-clk.h +f:include/dt-bindings/clock/nuvoton,ma35d1-clk.h +f:include/dt-bindings/clock/nuvoton,npcm7xx-clock.h +f:include/dt-bindings/clock/nuvoton,npcm845-clk.h +f:include/dt-bindings/clock/nvidia,tegra264.h +f:include/dt-bindings/clock/nxp,imx94-clock.h +f:include/dt-bindings/clock/nxp,imx95-clock.h +f:include/dt-bindings/clock/omap4.h +f:include/dt-bindings/clock/omap5.h +f:include/dt-bindings/clock/oxsemi,ox810se.h +f:include/dt-bindings/clock/oxsemi,ox820.h +f:include/dt-bindings/clock/pistachio-clk.h +f:include/dt-bindings/clock/px30-cru.h +f:include/dt-bindings/clock/pxa-clock.h +f:include/dt-bindings/clock/qcom,apss-ipq.h +f:include/dt-bindings/clock/qcom,camcc-sc7180.h +f:include/dt-bindings/clock/qcom,camcc-sc7280.h +f:include/dt-bindings/clock/qcom,camcc-sdm845.h +f:include/dt-bindings/clock/qcom,camcc-sm8250.h +f:include/dt-bindings/clock/qcom,dispcc-qcm2290.h +f:include/dt-bindings/clock/qcom,dispcc-sc7180.h +f:include/dt-bindings/clock/qcom,dispcc-sc7280.h +f:include/dt-bindings/clock/qcom,dispcc-sc8280xp.h +f:include/dt-bindings/clock/qcom,dispcc-sdm845.h +f:include/dt-bindings/clock/qcom,dispcc-sm6125.h +f:include/dt-bindings/clock/qcom,dispcc-sm6350.h +f:include/dt-bindings/clock/qcom,dispcc-sm8250.h +f:include/dt-bindings/clock/qcom,dsi-phy-28nm.h +f:include/dt-bindings/clock/qcom,gcc-apq8084.h +f:include/dt-bindings/clock/qcom,gcc-ipq4019.h +f:include/dt-bindings/clock/qcom,gcc-ipq5018.h +f:include/dt-bindings/clock/qcom,gcc-ipq6018.h +f:include/dt-bindings/clock/qcom,gcc-ipq806x.h +f:include/dt-bindings/clock/qcom,gcc-ipq8074.h +f:include/dt-bindings/clock/qcom,gcc-mdm9607.h +f:include/dt-bindings/clock/qcom,gcc-mdm9615.h +f:include/dt-bindings/clock/qcom,gcc-msm8660.h +f:include/dt-bindings/clock/qcom,gcc-msm8909.h +f:include/dt-bindings/clock/qcom,gcc-msm8916.h +f:include/dt-bindings/clock/qcom,gcc-msm8917.h +f:include/dt-bindings/clock/qcom,gcc-msm8939.h +f:include/dt-bindings/clock/qcom,gcc-msm8953.h +f:include/dt-bindings/clock/qcom,gcc-msm8960.h +f:include/dt-bindings/clock/qcom,gcc-msm8974.h +f:include/dt-bindings/clock/qcom,gcc-msm8976.h +f:include/dt-bindings/clock/qcom,gcc-msm8994.h +f:include/dt-bindings/clock/qcom,gcc-msm8996.h +f:include/dt-bindings/clock/qcom,gcc-msm8998.h +f:include/dt-bindings/clock/qcom,gcc-qcm2290.h +f:include/dt-bindings/clock/qcom,gcc-qcs404.h +f:include/dt-bindings/clock/qcom,gcc-sc7180.h +f:include/dt-bindings/clock/qcom,gcc-sc7280.h +f:include/dt-bindings/clock/qcom,gcc-sc8180x.h +f:include/dt-bindings/clock/qcom,gcc-sc8280xp.h +f:include/dt-bindings/clock/qcom,gcc-sdm660.h +f:include/dt-bindings/clock/qcom,gcc-sdm845.h +f:include/dt-bindings/clock/qcom,gcc-sdx55.h +f:include/dt-bindings/clock/qcom,gcc-sdx65.h +f:include/dt-bindings/clock/qcom,gcc-sm6115.h +f:include/dt-bindings/clock/qcom,gcc-sm6125.h +f:include/dt-bindings/clock/qcom,gcc-sm6350.h +f:include/dt-bindings/clock/qcom,gcc-sm8150.h +f:include/dt-bindings/clock/qcom,gcc-sm8250.h +f:include/dt-bindings/clock/qcom,gcc-sm8350.h +f:include/dt-bindings/clock/qcom,gcc-sm8450.h +f:include/dt-bindings/clock/qcom,gpucc-msm8998.h +f:include/dt-bindings/clock/qcom,gpucc-sc7180.h +f:include/dt-bindings/clock/qcom,gpucc-sc7280.h +f:include/dt-bindings/clock/qcom,gpucc-sc8280xp.h +f:include/dt-bindings/clock/qcom,gpucc-sdm660.h +f:include/dt-bindings/clock/qcom,gpucc-sdm845.h +f:include/dt-bindings/clock/qcom,gpucc-sm6350.h +f:include/dt-bindings/clock/qcom,gpucc-sm8150.h +f:include/dt-bindings/clock/qcom,gpucc-sm8250.h +f:include/dt-bindings/clock/qcom,gpucc-sm8350.h +f:include/dt-bindings/clock/qcom,ipq-cmn-pll.h +f:include/dt-bindings/clock/qcom,ipq5018-cmn-pll.h +f:include/dt-bindings/clock/qcom,ipq5332-gcc.h +f:include/dt-bindings/clock/qcom,ipq5424-cmn-pll.h +f:include/dt-bindings/clock/qcom,ipq5424-gcc.h +f:include/dt-bindings/clock/qcom,ipq9574-gcc.h +f:include/dt-bindings/clock/qcom,ipq9574-nsscc.h +f:include/dt-bindings/clock/qcom,lcc-ipq806x.h +f:include/dt-bindings/clock/qcom,lcc-msm8960.h +f:include/dt-bindings/clock/qcom,lpass-sc7280.h +f:include/dt-bindings/clock/qcom,lpass-sdm845.h +f:include/dt-bindings/clock/qcom,lpassaudiocc-sc7280.h +f:include/dt-bindings/clock/qcom,lpasscorecc-sc7180.h +f:include/dt-bindings/clock/qcom,lpasscorecc-sc7280.h +f:include/dt-bindings/clock/qcom,milos-camcc.h +f:include/dt-bindings/clock/qcom,milos-dispcc.h +f:include/dt-bindings/clock/qcom,milos-gcc.h +f:include/dt-bindings/clock/qcom,milos-gpucc.h +f:include/dt-bindings/clock/qcom,milos-videocc.h +f:include/dt-bindings/clock/qcom,mmcc-apq8084.h +f:include/dt-bindings/clock/qcom,mmcc-msm8960.h +f:include/dt-bindings/clock/qcom,mmcc-msm8974.h +f:include/dt-bindings/clock/qcom,mmcc-msm8994.h +f:include/dt-bindings/clock/qcom,mmcc-msm8996.h +f:include/dt-bindings/clock/qcom,mmcc-msm8998.h +f:include/dt-bindings/clock/qcom,mmcc-sdm660.h +f:include/dt-bindings/clock/qcom,mss-sc7180.h +f:include/dt-bindings/clock/qcom,q6sstopcc-qcs404.h +f:include/dt-bindings/clock/qcom,qca8k-nsscc.h +f:include/dt-bindings/clock/qcom,qcm2290-gpucc.h +f:include/dt-bindings/clock/qcom,qcs615-camcc.h +f:include/dt-bindings/clock/qcom,qcs615-dispcc.h +f:include/dt-bindings/clock/qcom,qcs615-gcc.h +f:include/dt-bindings/clock/qcom,qcs615-gpucc.h +f:include/dt-bindings/clock/qcom,qcs615-videocc.h +f:include/dt-bindings/clock/qcom,qcs8300-camcc.h +f:include/dt-bindings/clock/qcom,qcs8300-gcc.h +f:include/dt-bindings/clock/qcom,qcs8300-gpucc.h +f:include/dt-bindings/clock/qcom,qdu1000-ecpricc.h +f:include/dt-bindings/clock/qcom,qdu1000-gcc.h +f:include/dt-bindings/clock/qcom,rpmcc.h +f:include/dt-bindings/clock/qcom,rpmh.h +f:include/dt-bindings/clock/qcom,sa8775p-camcc.h +f:include/dt-bindings/clock/qcom,sa8775p-dispcc.h +f:include/dt-bindings/clock/qcom,sa8775p-gcc.h +f:include/dt-bindings/clock/qcom,sa8775p-gpucc.h +f:include/dt-bindings/clock/qcom,sa8775p-videocc.h +f:include/dt-bindings/clock/qcom,sar2130p-gcc.h +f:include/dt-bindings/clock/qcom,sar2130p-gpucc.h +f:include/dt-bindings/clock/qcom,sc8180x-camcc.h +f:include/dt-bindings/clock/qcom,sc8280xp-camcc.h +f:include/dt-bindings/clock/qcom,sc8280xp-lpasscc.h +f:include/dt-bindings/clock/qcom,sdx75-gcc.h +f:include/dt-bindings/clock/qcom,sm4450-camcc.h +f:include/dt-bindings/clock/qcom,sm4450-dispcc.h +f:include/dt-bindings/clock/qcom,sm4450-gcc.h +f:include/dt-bindings/clock/qcom,sm4450-gpucc.h +f:include/dt-bindings/clock/qcom,sm6115-dispcc.h +f:include/dt-bindings/clock/qcom,sm6115-gpucc.h +f:include/dt-bindings/clock/qcom,sm6115-lpasscc.h +f:include/dt-bindings/clock/qcom,sm6125-gpucc.h +f:include/dt-bindings/clock/qcom,sm6350-camcc.h +f:include/dt-bindings/clock/qcom,sm6350-videocc.h +f:include/dt-bindings/clock/qcom,sm6375-dispcc.h +f:include/dt-bindings/clock/qcom,sm6375-gcc.h +f:include/dt-bindings/clock/qcom,sm6375-gpucc.h +f:include/dt-bindings/clock/qcom,sm7150-camcc.h +f:include/dt-bindings/clock/qcom,sm7150-dispcc.h +f:include/dt-bindings/clock/qcom,sm7150-gcc.h +f:include/dt-bindings/clock/qcom,sm7150-videocc.h +f:include/dt-bindings/clock/qcom,sm8150-camcc.h +f:include/dt-bindings/clock/qcom,sm8250-lpass-aoncc.h +f:include/dt-bindings/clock/qcom,sm8250-lpass-audiocc.h +f:include/dt-bindings/clock/qcom,sm8350-videocc.h +f:include/dt-bindings/clock/qcom,sm8450-camcc.h +f:include/dt-bindings/clock/qcom,sm8450-dispcc.h +f:include/dt-bindings/clock/qcom,sm8450-gpucc.h +f:include/dt-bindings/clock/qcom,sm8450-videocc.h +f:include/dt-bindings/clock/qcom,sm8550-camcc.h +f:include/dt-bindings/clock/qcom,sm8550-dispcc.h +f:include/dt-bindings/clock/qcom,sm8550-gcc.h +f:include/dt-bindings/clock/qcom,sm8550-gpucc.h +f:include/dt-bindings/clock/qcom,sm8550-tcsr.h +f:include/dt-bindings/clock/qcom,sm8650-camcc.h +f:include/dt-bindings/clock/qcom,sm8650-gcc.h +f:include/dt-bindings/clock/qcom,sm8650-gpucc.h +f:include/dt-bindings/clock/qcom,sm8650-tcsr.h +f:include/dt-bindings/clock/qcom,sm8650-videocc.h +f:include/dt-bindings/clock/qcom,sm8750-dispcc.h +f:include/dt-bindings/clock/qcom,sm8750-gcc.h +f:include/dt-bindings/clock/qcom,sm8750-tcsr.h +f:include/dt-bindings/clock/qcom,turingcc-qcs404.h +f:include/dt-bindings/clock/qcom,videocc-sc7180.h +f:include/dt-bindings/clock/qcom,videocc-sc7280.h +f:include/dt-bindings/clock/qcom,videocc-sdm845.h +f:include/dt-bindings/clock/qcom,videocc-sm8150.h +f:include/dt-bindings/clock/qcom,videocc-sm8250.h +f:include/dt-bindings/clock/qcom,x1e80100-camcc.h +f:include/dt-bindings/clock/qcom,x1e80100-dispcc.h +f:include/dt-bindings/clock/qcom,x1e80100-gcc.h +f:include/dt-bindings/clock/qcom,x1e80100-gpucc.h +f:include/dt-bindings/clock/qcom,x1e80100-tcsr.h +f:include/dt-bindings/clock/r7s72100-clock.h +f:include/dt-bindings/clock/r7s9210-cpg-mssr.h +f:include/dt-bindings/clock/r8a73a4-clock.h +f:include/dt-bindings/clock/r8a7740-clock.h +f:include/dt-bindings/clock/r8a7742-cpg-mssr.h +f:include/dt-bindings/clock/r8a7743-cpg-mssr.h +f:include/dt-bindings/clock/r8a7744-cpg-mssr.h +f:include/dt-bindings/clock/r8a7745-cpg-mssr.h +f:include/dt-bindings/clock/r8a77470-cpg-mssr.h +f:include/dt-bindings/clock/r8a774a1-cpg-mssr.h +f:include/dt-bindings/clock/r8a774b1-cpg-mssr.h +f:include/dt-bindings/clock/r8a774c0-cpg-mssr.h +f:include/dt-bindings/clock/r8a774e1-cpg-mssr.h +f:include/dt-bindings/clock/r8a7778-clock.h +f:include/dt-bindings/clock/r8a7779-clock.h +f:include/dt-bindings/clock/r8a7790-cpg-mssr.h +f:include/dt-bindings/clock/r8a7791-cpg-mssr.h +f:include/dt-bindings/clock/r8a7792-cpg-mssr.h +f:include/dt-bindings/clock/r8a7793-cpg-mssr.h +f:include/dt-bindings/clock/r8a7794-cpg-mssr.h +f:include/dt-bindings/clock/r8a7795-cpg-mssr.h +f:include/dt-bindings/clock/r8a7796-cpg-mssr.h +f:include/dt-bindings/clock/r8a77961-cpg-mssr.h +f:include/dt-bindings/clock/r8a77965-cpg-mssr.h +f:include/dt-bindings/clock/r8a77970-cpg-mssr.h +f:include/dt-bindings/clock/r8a77980-cpg-mssr.h +f:include/dt-bindings/clock/r8a77990-cpg-mssr.h +f:include/dt-bindings/clock/r8a77995-cpg-mssr.h +f:include/dt-bindings/clock/r8a779a0-cpg-mssr.h +f:include/dt-bindings/clock/r8a779f0-cpg-mssr.h +f:include/dt-bindings/clock/r8a779g0-cpg-mssr.h +f:include/dt-bindings/clock/r9a06g032-sysctrl.h +f:include/dt-bindings/clock/r9a07g043-cpg.h +f:include/dt-bindings/clock/r9a07g044-cpg.h +f:include/dt-bindings/clock/r9a07g054-cpg.h +f:include/dt-bindings/clock/r9a08g045-cpg.h +f:include/dt-bindings/clock/r9a09g011-cpg.h +f:include/dt-bindings/clock/raspberrypi,rp1-clocks.h +f:include/dt-bindings/clock/renesas,r8a779h0-cpg-mssr.h +f:include/dt-bindings/clock/renesas,r9a08g045-vbattb.h +f:include/dt-bindings/clock/renesas,r9a09g047-cpg.h +f:include/dt-bindings/clock/renesas,r9a09g056-cpg.h +f:include/dt-bindings/clock/renesas,r9a09g057-cpg.h +f:include/dt-bindings/clock/renesas,r9a09g077-cpg-mssr.h +f:include/dt-bindings/clock/renesas,r9a09g087-cpg-mssr.h +f:include/dt-bindings/clock/renesas-cpg-mssr.h +f:include/dt-bindings/clock/rk3036-cru.h +f:include/dt-bindings/clock/rk3066a-cru.h +f:include/dt-bindings/clock/rk3128-cru.h +f:include/dt-bindings/clock/rk3188-cru-common.h +f:include/dt-bindings/clock/rk3188-cru.h +f:include/dt-bindings/clock/rk3228-cru.h +f:include/dt-bindings/clock/rk3288-cru.h +f:include/dt-bindings/clock/rk3308-cru.h +f:include/dt-bindings/clock/rk3328-cru.h +f:include/dt-bindings/clock/rk3368-cru.h +f:include/dt-bindings/clock/rk3399-cru.h +f:include/dt-bindings/clock/rk3399-ddr.h +f:include/dt-bindings/clock/rk3568-cru.h +f:include/dt-bindings/clock/rockchip,rk3528-cru.h +f:include/dt-bindings/clock/rockchip,rk3562-cru.h +f:include/dt-bindings/clock/rockchip,rk3576-cru.h +f:include/dt-bindings/clock/rockchip,rk3588-cru.h +f:include/dt-bindings/clock/rockchip,rk808.h +f:include/dt-bindings/clock/rockchip,rv1126-cru.h +f:include/dt-bindings/clock/rv1108-cru.h +f:include/dt-bindings/clock/s5pv210-audss.h +f:include/dt-bindings/clock/s5pv210.h +f:include/dt-bindings/clock/samsung,exynos2200-cmu.h +f:include/dt-bindings/clock/samsung,exynos7870-cmu.h +f:include/dt-bindings/clock/samsung,exynos8895.h +f:include/dt-bindings/clock/samsung,exynos990.h +f:include/dt-bindings/clock/samsung,exynosautov9.h +f:include/dt-bindings/clock/samsung,exynosautov920.h +f:include/dt-bindings/clock/samsung,s2mps11.h +f:include/dt-bindings/clock/samsung,s3c64xx-clock.h +f:include/dt-bindings/clock/sh73a0-clock.h +f:include/dt-bindings/clock/sifive-fu540-prci.h +f:include/dt-bindings/clock/sifive-fu740-prci.h +f:include/dt-bindings/clock/sophgo,cv1800.h +f:include/dt-bindings/clock/sophgo,sg2042-clkgen.h +f:include/dt-bindings/clock/sophgo,sg2042-pll.h +f:include/dt-bindings/clock/sophgo,sg2042-rpgate.h +f:include/dt-bindings/clock/sophgo,sg2044-clk.h +f:include/dt-bindings/clock/sophgo,sg2044-pll.h +f:include/dt-bindings/clock/spacemit,k1-syscon.h +f:include/dt-bindings/clock/sprd,sc9860-clk.h +f:include/dt-bindings/clock/sprd,sc9863a-clk.h +f:include/dt-bindings/clock/sprd,ums512-clk.h +f:include/dt-bindings/clock/st,stm32mp25-rcc.h +f:include/dt-bindings/clock/starfive,jh7110-crg.h +f:include/dt-bindings/clock/starfive-jh7100-audio.h +f:include/dt-bindings/clock/starfive-jh7100.h +f:include/dt-bindings/clock/ste-ab8500.h +f:include/dt-bindings/clock/ste-db8500-clkout.h +f:include/dt-bindings/clock/stih407-clks.h +f:include/dt-bindings/clock/stih410-clks.h +f:include/dt-bindings/clock/stih418-clks.h +f:include/dt-bindings/clock/stm32fx-clock.h +f:include/dt-bindings/clock/stm32h7-clks.h +f:include/dt-bindings/clock/stm32mp1-clks.h +f:include/dt-bindings/clock/stm32mp13-clks.h +f:include/dt-bindings/clock/stratix10-clock.h +f:include/dt-bindings/clock/sun20i-d1-ccu.h +f:include/dt-bindings/clock/sun20i-d1-r-ccu.h +f:include/dt-bindings/clock/sun4i-a10-ccu.h +f:include/dt-bindings/clock/sun4i-a10-pll2.h +f:include/dt-bindings/clock/sun50i-a100-ccu.h +f:include/dt-bindings/clock/sun50i-a100-r-ccu.h +f:include/dt-bindings/clock/sun50i-a64-ccu.h +f:include/dt-bindings/clock/sun50i-h6-ccu.h +f:include/dt-bindings/clock/sun50i-h6-r-ccu.h +f:include/dt-bindings/clock/sun50i-h616-ccu.h +f:include/dt-bindings/clock/sun55i-a523-ccu.h +f:include/dt-bindings/clock/sun55i-a523-r-ccu.h +f:include/dt-bindings/clock/sun5i-ccu.h +f:include/dt-bindings/clock/sun6i-a31-ccu.h +f:include/dt-bindings/clock/sun6i-rtc.h +f:include/dt-bindings/clock/sun7i-a20-ccu.h +f:include/dt-bindings/clock/sun8i-a23-a33-ccu.h +f:include/dt-bindings/clock/sun8i-a83t-ccu.h +f:include/dt-bindings/clock/sun8i-de2.h +f:include/dt-bindings/clock/sun8i-h3-ccu.h +f:include/dt-bindings/clock/sun8i-r-ccu.h +f:include/dt-bindings/clock/sun8i-r40-ccu.h +f:include/dt-bindings/clock/sun8i-tcon-top.h +f:include/dt-bindings/clock/sun8i-v3s-ccu.h +f:include/dt-bindings/clock/sun9i-a80-ccu.h +f:include/dt-bindings/clock/sun9i-a80-de.h +f:include/dt-bindings/clock/sun9i-a80-usb.h +f:include/dt-bindings/clock/suniv-ccu-f1c100s.h +f:include/dt-bindings/clock/sunplus,sp7021-clkc.h +f:include/dt-bindings/clock/tegra114-car.h +f:include/dt-bindings/clock/tegra124-car-common.h +f:include/dt-bindings/clock/tegra124-car.h +f:include/dt-bindings/clock/tegra186-clock.h +f:include/dt-bindings/clock/tegra194-clock.h +f:include/dt-bindings/clock/tegra20-car.h +f:include/dt-bindings/clock/tegra210-car.h +f:include/dt-bindings/clock/tegra234-clock.h +f:include/dt-bindings/clock/tegra30-car.h +f:include/dt-bindings/clock/thead,th1520-clk-ap.h +f:include/dt-bindings/clock/ti-dra7-atl.h +f:include/dt-bindings/clock/toshiba,tmpv770x.h +f:include/dt-bindings/clock/versaclock.h +f:include/dt-bindings/clock/vf610-clock.h +f:include/dt-bindings/clock/xlnx-vcu.h +f:include/dt-bindings/clock/xlnx-versal-clk.h +f:include/dt-bindings/clock/xlnx-zynqmp-clk.h +f:include/dt-bindings/display/sdtv-standards.h +f:include/dt-bindings/display/tda998x.h +f:include/dt-bindings/dma/at91.h +f:include/dt-bindings/dma/axi-dmac.h +f:include/dt-bindings/dma/dw-dmac.h +f:include/dt-bindings/dma/fsl-edma.h +f:include/dt-bindings/dma/jz4775-dma.h +f:include/dt-bindings/dma/jz4780-dma.h +f:include/dt-bindings/dma/nbpfaxi.h +f:include/dt-bindings/dma/qcom-gpi.h +f:include/dt-bindings/dma/sun4i-a10.h +f:include/dt-bindings/dma/x1000-dma.h +f:include/dt-bindings/dma/x1830-dma.h +f:include/dt-bindings/dma/x2000-dma.h +f:include/dt-bindings/dma/xlnx-zynqmp-dpdma.h +f:include/dt-bindings/firmware/imx/rsrc.h +f:include/dt-bindings/firmware/qcom,scm.h +f:include/dt-bindings/gce/mediatek,mt6795-gce.h +f:include/dt-bindings/gce/mt6779-gce.h +f:include/dt-bindings/gce/mt8173-gce.h +f:include/dt-bindings/gce/mt8183-gce.h +f:include/dt-bindings/gce/mt8186-gce.h +f:include/dt-bindings/gce/mt8192-gce.h +f:include/dt-bindings/gce/mt8195-gce.h +f:include/dt-bindings/gpio/amlogic,t7-periphs-pinctrl.h +f:include/dt-bindings/gpio/amlogic-c3-gpio.h +f:include/dt-bindings/gpio/aspeed-gpio.h +f:include/dt-bindings/gpio/gpio.h +f:include/dt-bindings/gpio/meson-a1-gpio.h +f:include/dt-bindings/gpio/meson-axg-gpio.h +f:include/dt-bindings/gpio/meson-g12a-gpio.h +f:include/dt-bindings/gpio/meson-gxbb-gpio.h +f:include/dt-bindings/gpio/meson-gxl-gpio.h +f:include/dt-bindings/gpio/meson-s4-gpio.h +f:include/dt-bindings/gpio/meson8-gpio.h +f:include/dt-bindings/gpio/meson8b-gpio.h +f:include/dt-bindings/gpio/msc313-gpio.h +f:include/dt-bindings/gpio/tegra-gpio.h +f:include/dt-bindings/gpio/tegra186-gpio.h +f:include/dt-bindings/gpio/tegra194-gpio.h +f:include/dt-bindings/gpio/tegra234-gpio.h +f:include/dt-bindings/gpio/tegra241-gpio.h +f:include/dt-bindings/gpio/uniphier-gpio.h +f:include/dt-bindings/i2c/i2c.h +f:include/dt-bindings/i3c/i3c.h +f:include/dt-bindings/iio/adc/adi,ad4695.h +f:include/dt-bindings/iio/adc/adi,ad7606.h +f:include/dt-bindings/iio/adc/adi,ad7768-1.h +f:include/dt-bindings/iio/adc/at91-sama5d2_adc.h +f:include/dt-bindings/iio/adc/fsl-imx25-gcq.h +f:include/dt-bindings/iio/adc/gehc,pmc-adc.h +f:include/dt-bindings/iio/adc/ingenic,adc.h +f:include/dt-bindings/iio/adc/mediatek,mt6357-auxadc.h +f:include/dt-bindings/iio/adc/mediatek,mt6358-auxadc.h +f:include/dt-bindings/iio/adc/mediatek,mt6359-auxadc.h +f:include/dt-bindings/iio/adc/mediatek,mt6363-auxadc.h +f:include/dt-bindings/iio/adc/mediatek,mt6370_adc.h +f:include/dt-bindings/iio/adc/mediatek,mt6373-auxadc.h +f:include/dt-bindings/iio/addac/adi,ad74413r.h +f:include/dt-bindings/iio/adi,ad5592r.h +f:include/dt-bindings/iio/qcom,spmi-adc7-pm7325.h +f:include/dt-bindings/iio/qcom,spmi-adc7-pm8350.h +f:include/dt-bindings/iio/qcom,spmi-adc7-pm8350b.h +f:include/dt-bindings/iio/qcom,spmi-adc7-pmk8350.h +f:include/dt-bindings/iio/qcom,spmi-adc7-pmr735a.h +f:include/dt-bindings/iio/qcom,spmi-adc7-pmr735b.h +f:include/dt-bindings/iio/qcom,spmi-adc7-smb139x.h +f:include/dt-bindings/iio/qcom,spmi-vadc.h +f:include/dt-bindings/iio/temperature/thermocouple.h +f:include/dt-bindings/input/atmel-maxtouch.h +f:include/dt-bindings/input/cros-ec-keyboard.h +f:include/dt-bindings/input/gpio-keys.h +f:include/dt-bindings/input/input.h +f:include/dt-bindings/input/ti-drv260x.h +f:include/dt-bindings/interconnect/fsl,imx8mp.h +f:include/dt-bindings/interconnect/imx8mm.h +f:include/dt-bindings/interconnect/imx8mn.h +f:include/dt-bindings/interconnect/imx8mq.h +f:include/dt-bindings/interconnect/mediatek,mt8183.h +f:include/dt-bindings/interconnect/mediatek,mt8195.h +f:include/dt-bindings/interconnect/qcom,icc.h +f:include/dt-bindings/interconnect/qcom,ipq5332.h +f:include/dt-bindings/interconnect/qcom,ipq5424.h +f:include/dt-bindings/interconnect/qcom,ipq9574.h +f:include/dt-bindings/interconnect/qcom,milos-rpmh.h +f:include/dt-bindings/interconnect/qcom,msm8909.h +f:include/dt-bindings/interconnect/qcom,msm8916.h +f:include/dt-bindings/interconnect/qcom,msm8937.h +f:include/dt-bindings/interconnect/qcom,msm8939.h +f:include/dt-bindings/interconnect/qcom,msm8953.h +f:include/dt-bindings/interconnect/qcom,msm8974.h +f:include/dt-bindings/interconnect/qcom,msm8976.h +f:include/dt-bindings/interconnect/qcom,msm8996-cbf.h +f:include/dt-bindings/interconnect/qcom,msm8996.h +f:include/dt-bindings/interconnect/qcom,osm-l3.h +f:include/dt-bindings/interconnect/qcom,qcm2290.h +f:include/dt-bindings/interconnect/qcom,qcs404.h +f:include/dt-bindings/interconnect/qcom,qcs615-rpmh.h +f:include/dt-bindings/interconnect/qcom,qcs8300-rpmh.h +f:include/dt-bindings/interconnect/qcom,qdu1000-rpmh.h +f:include/dt-bindings/interconnect/qcom,rpm-icc.h +f:include/dt-bindings/interconnect/qcom,sa8775p-rpmh.h +f:include/dt-bindings/interconnect/qcom,sar2130p-rpmh.h +f:include/dt-bindings/interconnect/qcom,sc7180.h +f:include/dt-bindings/interconnect/qcom,sc7280.h +f:include/dt-bindings/interconnect/qcom,sc8180x.h +f:include/dt-bindings/interconnect/qcom,sc8280xp.h +f:include/dt-bindings/interconnect/qcom,sdm660.h +f:include/dt-bindings/interconnect/qcom,sdm670-rpmh.h +f:include/dt-bindings/interconnect/qcom,sdm845.h +f:include/dt-bindings/interconnect/qcom,sdx55.h +f:include/dt-bindings/interconnect/qcom,sdx65.h +f:include/dt-bindings/interconnect/qcom,sdx75.h +f:include/dt-bindings/interconnect/qcom,sm6115.h +f:include/dt-bindings/interconnect/qcom,sm6350.h +f:include/dt-bindings/interconnect/qcom,sm7150-rpmh.h +f:include/dt-bindings/interconnect/qcom,sm8150.h +f:include/dt-bindings/interconnect/qcom,sm8250.h +f:include/dt-bindings/interconnect/qcom,sm8350.h +f:include/dt-bindings/interconnect/qcom,sm8450.h +f:include/dt-bindings/interconnect/qcom,sm8550-rpmh.h +f:include/dt-bindings/interconnect/qcom,sm8650-rpmh.h +f:include/dt-bindings/interconnect/qcom,sm8750-rpmh.h +f:include/dt-bindings/interconnect/qcom,x1e80100-rpmh.h +f:include/dt-bindings/interrupt-controller/amlogic,meson-g12a-gpio-intc.h +f:include/dt-bindings/interrupt-controller/apple-aic.h +f:include/dt-bindings/interrupt-controller/arm-gic.h +f:include/dt-bindings/interrupt-controller/aspeed-scu-ic.h +f:include/dt-bindings/interrupt-controller/irq-st.h +f:include/dt-bindings/interrupt-controller/irq.h +f:include/dt-bindings/interrupt-controller/irqc-rzg2l.h +f:include/dt-bindings/interrupt-controller/mips-gic.h +f:include/dt-bindings/interrupt-controller/mvebu-icu.h +f:include/dt-bindings/leds/common.h +f:include/dt-bindings/leds/leds-lp55xx.h +f:include/dt-bindings/leds/leds-netxbig.h +f:include/dt-bindings/leds/leds-ns2.h +f:include/dt-bindings/leds/leds-pca9532.h +f:include/dt-bindings/leds/leds-pca955x.h +f:include/dt-bindings/leds/rt4831-backlight.h +f:include/dt-bindings/mailbox/mediatek,mt8188-gce.h +f:include/dt-bindings/mailbox/qcom-ipcc.h +f:include/dt-bindings/mailbox/tegra186-hsp.h +f:include/dt-bindings/media/c8sectpfe.h +f:include/dt-bindings/media/omap3-isp.h +f:include/dt-bindings/media/tda1997x.h +f:include/dt-bindings/media/tvp5150.h +f:include/dt-bindings/media/video-interfaces.h +f:include/dt-bindings/media/xilinx-vip.h +f:include/dt-bindings/memory/mediatek,mt6893-memory-port.h +f:include/dt-bindings/memory/mediatek,mt8188-memory-port.h +f:include/dt-bindings/memory/mediatek,mt8365-larb-port.h +f:include/dt-bindings/memory/mt2701-larb-port.h +f:include/dt-bindings/memory/mt2712-larb-port.h +f:include/dt-bindings/memory/mt6779-larb-port.h +f:include/dt-bindings/memory/mt6795-larb-port.h +f:include/dt-bindings/memory/mt8167-larb-port.h +f:include/dt-bindings/memory/mt8173-larb-port.h +f:include/dt-bindings/memory/mt8183-larb-port.h +f:include/dt-bindings/memory/mt8186-memory-port.h +f:include/dt-bindings/memory/mt8192-larb-port.h +f:include/dt-bindings/memory/mt8195-memory-port.h +f:include/dt-bindings/memory/mtk-memory-port.h +f:include/dt-bindings/memory/nvidia,tegra264.h +f:include/dt-bindings/memory/tegra114-mc.h +f:include/dt-bindings/memory/tegra124-mc.h +f:include/dt-bindings/memory/tegra186-mc.h +f:include/dt-bindings/memory/tegra194-mc.h +f:include/dt-bindings/memory/tegra20-mc.h +f:include/dt-bindings/memory/tegra210-mc.h +f:include/dt-bindings/memory/tegra234-mc.h +f:include/dt-bindings/memory/tegra30-mc.h +f:include/dt-bindings/mfd/arizona.h +f:include/dt-bindings/mfd/as3722.h +f:include/dt-bindings/mfd/at91-usart.h +f:include/dt-bindings/mfd/atmel-flexcom.h +f:include/dt-bindings/mfd/cros_ec.h +f:include/dt-bindings/mfd/dbx500-prcmu.h +f:include/dt-bindings/mfd/max77620.h +f:include/dt-bindings/mfd/palmas.h +f:include/dt-bindings/mfd/qcom-rpm.h +f:include/dt-bindings/mfd/st,stpmic1.h +f:include/dt-bindings/mfd/st-lpc.h +f:include/dt-bindings/mfd/stm32f4-rcc.h +f:include/dt-bindings/mfd/stm32f7-rcc.h +f:include/dt-bindings/mfd/stm32h7-rcc.h +f:include/dt-bindings/mips/lantiq_rcu_gphy.h +f:include/dt-bindings/mux/mux.h +f:include/dt-bindings/mux/ti-serdes.h +f:include/dt-bindings/net/microchip-lan78xx.h +f:include/dt-bindings/net/mscc-phy-vsc8531.h +f:include/dt-bindings/net/pcs-rzn1-miic.h +f:include/dt-bindings/net/qca-ar803x.h +f:include/dt-bindings/net/ti-dp83867.h +f:include/dt-bindings/net/ti-dp83869.h +f:include/dt-bindings/nvmem/microchip,sama7g5-otpc.h +f:include/dt-bindings/phy/phy-am654-serdes.h +f:include/dt-bindings/phy/phy-cadence.h +f:include/dt-bindings/phy/phy-imx8-pcie.h +f:include/dt-bindings/phy/phy-lan966x-serdes.h +f:include/dt-bindings/phy/phy-lantiq-vrx200-pcie.h +f:include/dt-bindings/phy/phy-ocelot-serdes.h +f:include/dt-bindings/phy/phy-pistachio-usb.h +f:include/dt-bindings/phy/phy-qcom-qmp.h +f:include/dt-bindings/phy/phy-qcom-qusb2.h +f:include/dt-bindings/phy/phy-ti.h +f:include/dt-bindings/phy/phy.h +f:include/dt-bindings/pinctrl/am33xx.h +f:include/dt-bindings/pinctrl/am43xx.h +f:include/dt-bindings/pinctrl/amlogic,pinctrl.h +f:include/dt-bindings/pinctrl/apple.h +f:include/dt-bindings/pinctrl/at91.h +f:include/dt-bindings/pinctrl/bcm2835.h +f:include/dt-bindings/pinctrl/brcm,pinctrl-stingray.h +f:include/dt-bindings/pinctrl/dm814x.h +f:include/dt-bindings/pinctrl/dra.h +f:include/dt-bindings/pinctrl/hisi.h +f:include/dt-bindings/pinctrl/k210-fpioa.h +f:include/dt-bindings/pinctrl/keystone.h +f:include/dt-bindings/pinctrl/lochnagar.h +f:include/dt-bindings/pinctrl/mediatek,mt8188-pinfunc.h +f:include/dt-bindings/pinctrl/mt6397-pinfunc.h +f:include/dt-bindings/pinctrl/mt65xx.h +f:include/dt-bindings/pinctrl/mt6779-pinfunc.h +f:include/dt-bindings/pinctrl/mt6795-pinfunc.h +f:include/dt-bindings/pinctrl/mt6797-pinfunc.h +f:include/dt-bindings/pinctrl/mt7623-pinfunc.h +f:include/dt-bindings/pinctrl/mt8135-pinfunc.h +f:include/dt-bindings/pinctrl/mt8183-pinfunc.h +f:include/dt-bindings/pinctrl/mt8186-pinfunc.h +f:include/dt-bindings/pinctrl/mt8192-pinfunc.h +f:include/dt-bindings/pinctrl/mt8195-pinfunc.h +f:include/dt-bindings/pinctrl/mt8365-pinfunc.h +f:include/dt-bindings/pinctrl/nomadik.h +f:include/dt-bindings/pinctrl/omap.h +f:include/dt-bindings/pinctrl/pads-imx8dxl.h +f:include/dt-bindings/pinctrl/pads-imx8qm.h +f:include/dt-bindings/pinctrl/pads-imx8qxp.h +f:include/dt-bindings/pinctrl/pinctrl-cv1800b.h +f:include/dt-bindings/pinctrl/pinctrl-cv1812h.h +f:include/dt-bindings/pinctrl/pinctrl-cv18xx.h +f:include/dt-bindings/pinctrl/pinctrl-sg2000.h +f:include/dt-bindings/pinctrl/pinctrl-sg2002.h +f:include/dt-bindings/pinctrl/pinctrl-sg2042.h +f:include/dt-bindings/pinctrl/pinctrl-sg2044.h +f:include/dt-bindings/pinctrl/pinctrl-starfive-jh7100.h +f:include/dt-bindings/pinctrl/pinctrl-tegra-io-pad.h +f:include/dt-bindings/pinctrl/pinctrl-tegra-xusb.h +f:include/dt-bindings/pinctrl/pinctrl-tegra.h +f:include/dt-bindings/pinctrl/pinctrl-zynq.h +f:include/dt-bindings/pinctrl/pinctrl-zynqmp.h +f:include/dt-bindings/pinctrl/qcom,pmic-gpio.h +f:include/dt-bindings/pinctrl/qcom,pmic-mpp.h +f:include/dt-bindings/pinctrl/r7s72100-pinctrl.h +f:include/dt-bindings/pinctrl/r7s9210-pinctrl.h +f:include/dt-bindings/pinctrl/renesas,r9a09g047-pinctrl.h +f:include/dt-bindings/pinctrl/renesas,r9a09g057-pinctrl.h +f:include/dt-bindings/pinctrl/rockchip.h +f:include/dt-bindings/pinctrl/rzg2l-pinctrl.h +f:include/dt-bindings/pinctrl/rzn1-pinctrl.h +f:include/dt-bindings/pinctrl/rzv2m-pinctrl.h +f:include/dt-bindings/pinctrl/sppctl-sp7021.h +f:include/dt-bindings/pinctrl/sppctl.h +f:include/dt-bindings/pinctrl/starfive,jh7110-pinctrl.h +f:include/dt-bindings/pinctrl/stm32-pinfunc.h +f:include/dt-bindings/pinctrl/sun4i-a10.h +f:include/dt-bindings/pmu/exynos_ppmu.h +f:include/dt-bindings/power/allwinner,sun20i-d1-ppu.h +f:include/dt-bindings/power/allwinner,sun55i-a523-pck-600.h +f:include/dt-bindings/power/allwinner,sun55i-a523-ppu.h +f:include/dt-bindings/power/allwinner,sun8i-v853-ppu.h +f:include/dt-bindings/power/amlogic,a4-pwrc.h +f:include/dt-bindings/power/amlogic,a5-pwrc.h +f:include/dt-bindings/power/amlogic,c3-pwrc.h +f:include/dt-bindings/power/amlogic,t7-pwrc.h +f:include/dt-bindings/power/fsl,imx93-power.h +f:include/dt-bindings/power/imx7-power.h +f:include/dt-bindings/power/imx8mm-power.h +f:include/dt-bindings/power/imx8mn-power.h +f:include/dt-bindings/power/imx8mp-power.h +f:include/dt-bindings/power/imx8mq-power.h +f:include/dt-bindings/power/imx8ulp-power.h +f:include/dt-bindings/power/marvell,mmp2.h +f:include/dt-bindings/power/mediatek,mt6735-power-controller.h +f:include/dt-bindings/power/mediatek,mt6893-power.h +f:include/dt-bindings/power/mediatek,mt8188-power.h +f:include/dt-bindings/power/mediatek,mt8365-power.h +f:include/dt-bindings/power/meson-a1-power.h +f:include/dt-bindings/power/meson-axg-power.h +f:include/dt-bindings/power/meson-g12a-power.h +f:include/dt-bindings/power/meson-gxbb-power.h +f:include/dt-bindings/power/meson-s4-power.h +f:include/dt-bindings/power/meson-sm1-power.h +f:include/dt-bindings/power/meson8-power.h +f:include/dt-bindings/power/mt2701-power.h +f:include/dt-bindings/power/mt2712-power.h +f:include/dt-bindings/power/mt6765-power.h +f:include/dt-bindings/power/mt6795-power.h +f:include/dt-bindings/power/mt6797-power.h +f:include/dt-bindings/power/mt7622-power.h +f:include/dt-bindings/power/mt7623a-power.h +f:include/dt-bindings/power/mt8167-power.h +f:include/dt-bindings/power/mt8173-power.h +f:include/dt-bindings/power/mt8183-power.h +f:include/dt-bindings/power/mt8186-power.h +f:include/dt-bindings/power/mt8192-power.h +f:include/dt-bindings/power/mt8195-power.h +f:include/dt-bindings/power/owl-s500-powergate.h +f:include/dt-bindings/power/owl-s700-powergate.h +f:include/dt-bindings/power/owl-s900-powergate.h +f:include/dt-bindings/power/px30-power.h +f:include/dt-bindings/power/qcom,rpmhpd.h +f:include/dt-bindings/power/qcom-rpmpd.h +f:include/dt-bindings/power/r8a7742-sysc.h +f:include/dt-bindings/power/r8a7743-sysc.h +f:include/dt-bindings/power/r8a7744-sysc.h +f:include/dt-bindings/power/r8a7745-sysc.h +f:include/dt-bindings/power/r8a77470-sysc.h +f:include/dt-bindings/power/r8a774a1-sysc.h +f:include/dt-bindings/power/r8a774b1-sysc.h +f:include/dt-bindings/power/r8a774c0-sysc.h +f:include/dt-bindings/power/r8a774e1-sysc.h +f:include/dt-bindings/power/r8a7779-sysc.h +f:include/dt-bindings/power/r8a7790-sysc.h +f:include/dt-bindings/power/r8a7791-sysc.h +f:include/dt-bindings/power/r8a7792-sysc.h +f:include/dt-bindings/power/r8a7793-sysc.h +f:include/dt-bindings/power/r8a7794-sysc.h +f:include/dt-bindings/power/r8a7795-sysc.h +f:include/dt-bindings/power/r8a7796-sysc.h +f:include/dt-bindings/power/r8a77961-sysc.h +f:include/dt-bindings/power/r8a77965-sysc.h +f:include/dt-bindings/power/r8a77970-sysc.h +f:include/dt-bindings/power/r8a77980-sysc.h +f:include/dt-bindings/power/r8a77990-sysc.h +f:include/dt-bindings/power/r8a77995-sysc.h +f:include/dt-bindings/power/r8a779a0-sysc.h +f:include/dt-bindings/power/r8a779f0-sysc.h +f:include/dt-bindings/power/r8a779g0-sysc.h +f:include/dt-bindings/power/raspberrypi-power.h +f:include/dt-bindings/power/renesas,r8a779h0-sysc.h +f:include/dt-bindings/power/rk3036-power.h +f:include/dt-bindings/power/rk3066-power.h +f:include/dt-bindings/power/rk3128-power.h +f:include/dt-bindings/power/rk3188-power.h +f:include/dt-bindings/power/rk3228-power.h +f:include/dt-bindings/power/rk3288-power.h +f:include/dt-bindings/power/rk3328-power.h +f:include/dt-bindings/power/rk3366-power.h +f:include/dt-bindings/power/rk3368-power.h +f:include/dt-bindings/power/rk3399-power.h +f:include/dt-bindings/power/rk3568-power.h +f:include/dt-bindings/power/rk3588-power.h +f:include/dt-bindings/power/rockchip,rk3528-power.h +f:include/dt-bindings/power/rockchip,rk3562-power.h +f:include/dt-bindings/power/rockchip,rk3576-power.h +f:include/dt-bindings/power/rockchip,rv1126-power.h +f:include/dt-bindings/power/starfive,jh7110-pmu.h +f:include/dt-bindings/power/summit,smb347-charger.h +f:include/dt-bindings/power/tegra186-powergate.h +f:include/dt-bindings/power/tegra194-powergate.h +f:include/dt-bindings/power/tegra234-powergate.h +f:include/dt-bindings/power/thead,th1520-power.h +f:include/dt-bindings/power/xlnx-zynqmp-power.h +f:include/dt-bindings/pwm/pwm.h +f:include/dt-bindings/pwm/raspberrypi,firmware-poe-pwm.h +f:include/dt-bindings/regulator/active-semi,8865-regulator.h +f:include/dt-bindings/regulator/active-semi,8945a-regulator.h +f:include/dt-bindings/regulator/dlg,da9063-regulator.h +f:include/dt-bindings/regulator/dlg,da9121-regulator.h +f:include/dt-bindings/regulator/dlg,da9211-regulator.h +f:include/dt-bindings/regulator/maxim,max77802.h +f:include/dt-bindings/regulator/mediatek,mt6360-regulator.h +f:include/dt-bindings/regulator/mediatek,mt6397-regulator.h +f:include/dt-bindings/regulator/nxp,pca9450-regulator.h +f:include/dt-bindings/regulator/qcom,rpmh-regulator.h +f:include/dt-bindings/regulator/richtek,rt5190a-regulator.h +f:include/dt-bindings/regulator/st,stm32mp13-regulator.h +f:include/dt-bindings/regulator/st,stm32mp15-regulator.h +f:include/dt-bindings/regulator/st,stm32mp25-regulator.h +f:include/dt-bindings/regulator/ti,tps62864.h +f:include/dt-bindings/reset/actions,s500-reset.h +f:include/dt-bindings/reset/actions,s700-reset.h +f:include/dt-bindings/reset/actions,s900-reset.h +f:include/dt-bindings/reset/airoha,en7581-reset.h +f:include/dt-bindings/reset/altr,rst-mgr-a10.h +f:include/dt-bindings/reset/altr,rst-mgr-a10sr.h +f:include/dt-bindings/reset/altr,rst-mgr-s10.h +f:include/dt-bindings/reset/altr,rst-mgr.h +f:include/dt-bindings/reset/amlogic,c3-reset.h +f:include/dt-bindings/reset/amlogic,meson-a1-audio-reset.h +f:include/dt-bindings/reset/amlogic,meson-a1-reset.h +f:include/dt-bindings/reset/amlogic,meson-axg-audio-arb.h +f:include/dt-bindings/reset/amlogic,meson-axg-reset.h +f:include/dt-bindings/reset/amlogic,meson-g12a-audio-reset.h +f:include/dt-bindings/reset/amlogic,meson-g12a-reset.h +f:include/dt-bindings/reset/amlogic,meson-gxbb-reset.h +f:include/dt-bindings/reset/amlogic,meson-s4-reset.h +f:include/dt-bindings/reset/amlogic,meson8b-clkc-reset.h +f:include/dt-bindings/reset/amlogic,meson8b-reset.h +f:include/dt-bindings/reset/aspeed,ast2700-scu.h +f:include/dt-bindings/reset/axg-aoclkc.h +f:include/dt-bindings/reset/bcm6318-reset.h +f:include/dt-bindings/reset/bcm63268-reset.h +f:include/dt-bindings/reset/bcm6328-reset.h +f:include/dt-bindings/reset/bcm6358-reset.h +f:include/dt-bindings/reset/bcm6362-reset.h +f:include/dt-bindings/reset/bcm6368-reset.h +f:include/dt-bindings/reset/bitmain,bm1880-reset.h +f:include/dt-bindings/reset/bt1-ccu.h +f:include/dt-bindings/reset/canaan,k230-rst.h +f:include/dt-bindings/reset/cortina,gemini-reset.h +f:include/dt-bindings/reset/delta,tn48m-reset.h +f:include/dt-bindings/reset/g12a-aoclkc.h +f:include/dt-bindings/reset/gxbb-aoclkc.h +f:include/dt-bindings/reset/hisi,hi6220-resets.h +f:include/dt-bindings/reset/imx7-reset.h +f:include/dt-bindings/reset/imx8mp-reset-audiomix.h +f:include/dt-bindings/reset/imx8mp-reset.h +f:include/dt-bindings/reset/imx8mq-reset.h +f:include/dt-bindings/reset/imx8ulp-pcc-reset.h +f:include/dt-bindings/reset/k210-rst.h +f:include/dt-bindings/reset/mediatek,mt6735-infracfg.h +f:include/dt-bindings/reset/mediatek,mt6735-mfgcfg.h +f:include/dt-bindings/reset/mediatek,mt6735-pericfg.h +f:include/dt-bindings/reset/mediatek,mt6735-vdecsys.h +f:include/dt-bindings/reset/mediatek,mt6735-wdt.h +f:include/dt-bindings/reset/mediatek,mt6795-resets.h +f:include/dt-bindings/reset/mediatek,mt7988-resets.h +f:include/dt-bindings/reset/mt2701-resets.h +f:include/dt-bindings/reset/mt2712-resets.h +f:include/dt-bindings/reset/mt7621-reset.h +f:include/dt-bindings/reset/mt7622-reset.h +f:include/dt-bindings/reset/mt7629-resets.h +f:include/dt-bindings/reset/mt7986-resets.h +f:include/dt-bindings/reset/mt8135-resets.h +f:include/dt-bindings/reset/mt8173-resets.h +f:include/dt-bindings/reset/mt8183-resets.h +f:include/dt-bindings/reset/mt8186-resets.h +f:include/dt-bindings/reset/mt8188-resets.h +f:include/dt-bindings/reset/mt8192-resets.h +f:include/dt-bindings/reset/mt8195-resets.h +f:include/dt-bindings/reset/nuvoton,ma35d1-reset.h +f:include/dt-bindings/reset/nuvoton,npcm7xx-reset.h +f:include/dt-bindings/reset/nvidia,tegra264.h +f:include/dt-bindings/reset/oxsemi,ox810se.h +f:include/dt-bindings/reset/oxsemi,ox820.h +f:include/dt-bindings/reset/pistachio-resets.h +f:include/dt-bindings/reset/qcom,gcc-apq8084.h +f:include/dt-bindings/reset/qcom,gcc-ipq5018.h +f:include/dt-bindings/reset/qcom,gcc-ipq6018.h +f:include/dt-bindings/reset/qcom,gcc-ipq806x.h +f:include/dt-bindings/reset/qcom,gcc-mdm9615.h +f:include/dt-bindings/reset/qcom,gcc-msm8660.h +f:include/dt-bindings/reset/qcom,gcc-msm8916.h +f:include/dt-bindings/reset/qcom,gcc-msm8939.h +f:include/dt-bindings/reset/qcom,gcc-msm8960.h +f:include/dt-bindings/reset/qcom,gcc-msm8974.h +f:include/dt-bindings/reset/qcom,ipq5424-gcc.h +f:include/dt-bindings/reset/qcom,ipq9574-gcc.h +f:include/dt-bindings/reset/qcom,ipq9574-nsscc.h +f:include/dt-bindings/reset/qcom,mmcc-apq8084.h +f:include/dt-bindings/reset/qcom,mmcc-msm8960.h +f:include/dt-bindings/reset/qcom,mmcc-msm8974.h +f:include/dt-bindings/reset/qcom,qca8k-nsscc.h +f:include/dt-bindings/reset/qcom,sar2130p-gpucc.h +f:include/dt-bindings/reset/qcom,sdm845-aoss.h +f:include/dt-bindings/reset/qcom,sdm845-pdc.h +f:include/dt-bindings/reset/qcom,sm8350-videocc.h +f:include/dt-bindings/reset/qcom,sm8450-gpucc.h +f:include/dt-bindings/reset/qcom,sm8650-gpucc.h +f:include/dt-bindings/reset/qcom,x1e80100-gpucc.h +f:include/dt-bindings/reset/raspberrypi,firmware-reset.h +f:include/dt-bindings/reset/realtek,rtd1195.h +f:include/dt-bindings/reset/realtek,rtd1295.h +f:include/dt-bindings/reset/rockchip,rk3528-cru.h +f:include/dt-bindings/reset/rockchip,rk3562-cru.h +f:include/dt-bindings/reset/rockchip,rk3576-cru.h +f:include/dt-bindings/reset/rockchip,rk3588-cru.h +f:include/dt-bindings/reset/sama7g5-reset.h +f:include/dt-bindings/reset/snps,hsdk-reset.h +f:include/dt-bindings/reset/sophgo,sg2042-reset.h +f:include/dt-bindings/reset/st,stm32mp25-rcc.h +f:include/dt-bindings/reset/starfive,jh7110-crg.h +f:include/dt-bindings/reset/starfive-jh7100.h +f:include/dt-bindings/reset/stericsson,db8500-prcc-reset.h +f:include/dt-bindings/reset/stih407-resets.h +f:include/dt-bindings/reset/stm32mp1-resets.h +f:include/dt-bindings/reset/stm32mp13-resets.h +f:include/dt-bindings/reset/sun20i-d1-ccu.h +f:include/dt-bindings/reset/sun20i-d1-r-ccu.h +f:include/dt-bindings/reset/sun4i-a10-ccu.h +f:include/dt-bindings/reset/sun50i-a100-ccu.h +f:include/dt-bindings/reset/sun50i-a100-r-ccu.h +f:include/dt-bindings/reset/sun50i-a64-ccu.h +f:include/dt-bindings/reset/sun50i-h6-ccu.h +f:include/dt-bindings/reset/sun50i-h6-r-ccu.h +f:include/dt-bindings/reset/sun50i-h616-ccu.h +f:include/dt-bindings/reset/sun55i-a523-ccu.h +f:include/dt-bindings/reset/sun55i-a523-r-ccu.h +f:include/dt-bindings/reset/sun5i-ccu.h +f:include/dt-bindings/reset/sun6i-a31-ccu.h +f:include/dt-bindings/reset/sun8i-a23-a33-ccu.h +f:include/dt-bindings/reset/sun8i-a83t-ccu.h +f:include/dt-bindings/reset/sun8i-de2.h +f:include/dt-bindings/reset/sun8i-h3-ccu.h +f:include/dt-bindings/reset/sun8i-r-ccu.h +f:include/dt-bindings/reset/sun8i-r40-ccu.h +f:include/dt-bindings/reset/sun8i-v3s-ccu.h +f:include/dt-bindings/reset/sun9i-a80-ccu.h +f:include/dt-bindings/reset/sun9i-a80-de.h +f:include/dt-bindings/reset/sun9i-a80-usb.h +f:include/dt-bindings/reset/suniv-ccu-f1c100s.h +f:include/dt-bindings/reset/sunplus,sp7021-reset.h +f:include/dt-bindings/reset/tegra124-car.h +f:include/dt-bindings/reset/tegra186-reset.h +f:include/dt-bindings/reset/tegra194-reset.h +f:include/dt-bindings/reset/tegra210-car.h +f:include/dt-bindings/reset/tegra234-reset.h +f:include/dt-bindings/reset/thead,th1520-reset.h +f:include/dt-bindings/reset/ti-syscon.h +f:include/dt-bindings/reset/toshiba,tmpv770x.h +f:include/dt-bindings/reset/xlnx-versal-resets.h +f:include/dt-bindings/reset/xlnx-zynqmp-resets.h +f:include/dt-bindings/soc/bcm-pmb.h +f:include/dt-bindings/soc/bcm2835-pm.h +f:include/dt-bindings/soc/bcm6318-pm.h +f:include/dt-bindings/soc/bcm63268-pm.h +f:include/dt-bindings/soc/bcm6328-pm.h +f:include/dt-bindings/soc/bcm6362-pm.h +f:include/dt-bindings/soc/cpm1-fsl,tsa.h +f:include/dt-bindings/soc/qcom,apr.h +f:include/dt-bindings/soc/qcom,gpr.h +f:include/dt-bindings/soc/qcom,gsbi.h +f:include/dt-bindings/soc/qcom,rpmh-rsc.h +f:include/dt-bindings/soc/qe-fsl,tsa.h +f:include/dt-bindings/soc/rockchip,boot-mode.h +f:include/dt-bindings/soc/rockchip,vop2.h +f:include/dt-bindings/soc/samsung,boot-mode.h +f:include/dt-bindings/soc/samsung,exynos-usi.h +f:include/dt-bindings/soc/tegra-pmc.h +f:include/dt-bindings/soc/ti,sci_pm_domain.h +f:include/dt-bindings/sound/adi,adau1977.h +f:include/dt-bindings/sound/apq8016-lpass.h +f:include/dt-bindings/sound/audio-graph.h +f:include/dt-bindings/sound/audio-jack-events.h +f:include/dt-bindings/sound/cs35l32.h +f:include/dt-bindings/sound/cs35l45.h +f:include/dt-bindings/sound/cs42l42.h +f:include/dt-bindings/sound/cs48l32.h +f:include/dt-bindings/sound/fsl-imx-audmux.h +f:include/dt-bindings/sound/madera.h +f:include/dt-bindings/sound/meson-aiu.h +f:include/dt-bindings/sound/meson-g12a-toacodec.h +f:include/dt-bindings/sound/meson-g12a-tohdmitx.h +f:include/dt-bindings/sound/microchip,pdmc.h +f:include/dt-bindings/sound/qcom,lpass.h +f:include/dt-bindings/sound/qcom,q6afe.h +f:include/dt-bindings/sound/qcom,q6asm.h +f:include/dt-bindings/sound/qcom,q6dsp-lpass-ports.h +f:include/dt-bindings/sound/qcom,wcd9335.h +f:include/dt-bindings/sound/qcom,wcd934x.h +f:include/dt-bindings/sound/rt5640.h +f:include/dt-bindings/sound/rt5651.h +f:include/dt-bindings/sound/samsung-i2s.h +f:include/dt-bindings/sound/sc7180-lpass.h +f:include/dt-bindings/sound/tas2552.h +f:include/dt-bindings/sound/tlv320adc3xxx.h +f:include/dt-bindings/sound/tlv320aic31xx.h +f:include/dt-bindings/spmi/spmi.h +f:include/dt-bindings/thermal/lm90.h +f:include/dt-bindings/thermal/mediatek,lvts-thermal.h +f:include/dt-bindings/thermal/tegra124-soctherm.h +f:include/dt-bindings/thermal/tegra186-bpmp-thermal.h +f:include/dt-bindings/thermal/tegra194-bpmp-thermal.h +f:include/dt-bindings/thermal/tegra234-bpmp-thermal.h +f:include/dt-bindings/thermal/thermal.h +f:include/dt-bindings/thermal/thermal_exynos.h +f:include/dt-bindings/usb/pd.h +f:include/dt-bindings/watchdog/aspeed-wdt.h +f:include/hyperv/hvgdk.h +f:include/hyperv/hvgdk_ext.h +f:include/hyperv/hvgdk_mini.h +f:include/hyperv/hvhdk.h +f:include/hyperv/hvhdk_mini.h +f:include/keys/asymmetric-parser.h +f:include/keys/asymmetric-subtype.h +f:include/keys/asymmetric-type.h +f:include/keys/big_key-type.h +f:include/keys/ceph-type.h +f:include/keys/dns_resolver-type.h +f:include/keys/encrypted-type.h +f:include/keys/keyring-type.h +f:include/keys/request_key_auth-type.h +f:include/keys/rxrpc-type.h +f:include/keys/system_keyring.h +f:include/keys/trusted-type.h +f:include/keys/trusted_caam.h +f:include/keys/trusted_dcp.h +f:include/keys/trusted_tee.h +f:include/keys/trusted_tpm.h +f:include/keys/user-type.h +f:include/kunit/assert.h +f:include/kunit/attributes.h +f:include/kunit/clk.h +f:include/kunit/device.h +f:include/kunit/of.h +f:include/kunit/platform_device.h +f:include/kunit/resource.h +f:include/kunit/skbuff.h +f:include/kunit/static_stub.h +f:include/kunit/test-bug.h +f:include/kunit/test.h +f:include/kunit/try-catch.h +f:include/kunit/visibility.h +f:include/kvm/arm_arch_timer.h +f:include/kvm/arm_hypercalls.h +f:include/kvm/arm_pmu.h +f:include/kvm/arm_psci.h +f:include/kvm/arm_vgic.h +f:include/kvm/iodev.h +f:include/linux/8250_pci.h +f:include/linux/acct.h +f:include/linux/acpi.h +f:include/linux/acpi_amd_wbrf.h +f:include/linux/acpi_dma.h +f:include/linux/acpi_iort.h +f:include/linux/acpi_mdio.h +f:include/linux/acpi_pmtmr.h +f:include/linux/acpi_viot.h +f:include/linux/adb.h +f:include/linux/adfs_fs.h +f:include/linux/adi-axi-common.h +f:include/linux/adreno-smmu-priv.h +f:include/linux/adxl.h +f:include/linux/aer.h +f:include/linux/agp_backend.h +f:include/linux/agpgart.h +f:include/linux/ahci-remap.h +f:include/linux/ahci_platform.h +f:include/linux/aio.h +f:include/linux/alarmtimer.h +f:include/linux/alcor_pci.h +f:include/linux/align.h +f:include/linux/alloc_tag.h +f:include/linux/altera_jtaguart.h +f:include/linux/altera_uart.h +f:include/linux/amba/bus.h +f:include/linux/amba/kmi.h +f:include/linux/amba/mmci.h +f:include/linux/amba/pl022.h +f:include/linux/amba/pl080.h +f:include/linux/amba/pl08x.h +f:include/linux/amba/serial.h +f:include/linux/amba/sp810.h +f:include/linux/amd-iommu.h +f:include/linux/amd-pmf-io.h +f:include/linux/anon_inodes.h +f:include/linux/aperture.h +f:include/linux/apm-emulation.h +f:include/linux/apm_bios.h +f:include/linux/apple-gmux.h +f:include/linux/arch_topology.h +f:include/linux/args.h +f:include/linux/arm-cci.h +f:include/linux/arm-smccc.h +f:include/linux/arm_ffa.h +f:include/linux/arm_sdei.h +f:include/linux/armada-37xx-rwtm-mailbox.h +f:include/linux/array_size.h +f:include/linux/ascii85.h +f:include/linux/asn1.h +f:include/linux/asn1_ber_bytecode.h +f:include/linux/asn1_decoder.h +f:include/linux/asn1_encoder.h +f:include/linux/assoc_array.h +f:include/linux/assoc_array_priv.h +f:include/linux/async.h +f:include/linux/async_tx.h +f:include/linux/ata.h +f:include/linux/ata_platform.h +f:include/linux/atalk.h +f:include/linux/atm.h +f:include/linux/atm_tcp.h +f:include/linux/atmdev.h +f:include/linux/atmel-isc-media.h +f:include/linux/atmel-ssc.h +f:include/linux/atmel_pdc.h +f:include/linux/atomic.h +f:include/linux/atomic/atomic-arch-fallback.h +f:include/linux/atomic/atomic-instrumented.h +f:include/linux/atomic/atomic-long.h +f:include/linux/attribute_container.h +f:include/linux/audit.h +f:include/linux/audit_arch.h +f:include/linux/auto_dev-ioctl.h +f:include/linux/auto_fs.h +f:include/linux/auxiliary_bus.h +f:include/linux/auxvec.h +f:include/linux/average.h +f:include/linux/avf/virtchnl.h +f:include/linux/backing-dev-defs.h +f:include/linux/backing-dev.h +f:include/linux/backing-file.h +f:include/linux/backlight.h +f:include/linux/badblocks.h +f:include/linux/balloon_compaction.h +f:include/linux/base64.h +f:include/linux/bcd.h +f:include/linux/bch.h +f:include/linux/bcm47xx_nvram.h +f:include/linux/bcm47xx_sprom.h +f:include/linux/bcm47xx_wdt.h +f:include/linux/bcm963xx_nvram.h +f:include/linux/bcm963xx_tag.h +f:include/linux/bcma/bcma.h +f:include/linux/bcma/bcma_driver_arm_c9.h +f:include/linux/bcma/bcma_driver_chipcommon.h +f:include/linux/bcma/bcma_driver_gmac_cmn.h +f:include/linux/bcma/bcma_driver_mips.h +f:include/linux/bcma/bcma_driver_pci.h +f:include/linux/bcma/bcma_driver_pcie2.h +f:include/linux/bcma/bcma_regs.h +f:include/linux/bcma/bcma_soc.h +f:include/linux/binfmts.h +f:include/linux/bio-integrity.h +f:include/linux/bio.h +f:include/linux/bit_spinlock.h +f:include/linux/bitfield.h +f:include/linux/bitmap-str.h +f:include/linux/bitmap.h +f:include/linux/bitops.h +f:include/linux/bitrev.h +f:include/linux/bits.h +f:include/linux/blk-cgroup.h +f:include/linux/blk-crypto-profile.h +f:include/linux/blk-crypto.h +f:include/linux/blk-integrity.h +f:include/linux/blk-mq-dma.h +f:include/linux/blk-mq.h +f:include/linux/blk-pm.h +f:include/linux/blk_types.h +f:include/linux/blkdev.h +f:include/linux/blkpg.h +f:include/linux/blktrace_api.h +f:include/linux/blockgroup_lock.h +f:include/linux/bma150.h +f:include/linux/bnxt/hsi.h +f:include/linux/bootconfig.h +f:include/linux/bootmem_info.h +f:include/linux/bottom_half.h +f:include/linux/bpf-cgroup-defs.h +f:include/linux/bpf-cgroup.h +f:include/linux/bpf-netns.h +f:include/linux/bpf.h +f:include/linux/bpf_crypto.h +f:include/linux/bpf_lirc.h +f:include/linux/bpf_local_storage.h +f:include/linux/bpf_lsm.h +f:include/linux/bpf_mem_alloc.h +f:include/linux/bpf_mprog.h +f:include/linux/bpf_trace.h +f:include/linux/bpf_types.h +f:include/linux/bpf_verifier.h +f:include/linux/bpfptr.h +f:include/linux/brcmphy.h +f:include/linux/bsearch.h +f:include/linux/bsg-lib.h +f:include/linux/bsg.h +f:include/linux/btf.h +f:include/linux/btf_ids.h +f:include/linux/btree-128.h +f:include/linux/btree-type.h +f:include/linux/btree.h +f:include/linux/btrfs.h +f:include/linux/buffer_head.h +f:include/linux/bug.h +f:include/linux/build-salt.h +f:include/linux/build_bug.h +f:include/linux/buildid.h +f:include/linux/bus/stm32_firewall_device.h +f:include/linux/bvec.h +f:include/linux/byteorder/big_endian.h +f:include/linux/byteorder/generic.h +f:include/linux/byteorder/little_endian.h +f:include/linux/c2port.h +f:include/linux/cache.h +f:include/linux/cacheflush.h +f:include/linux/cacheinfo.h +f:include/linux/call_once.h +f:include/linux/can/bittiming.h +f:include/linux/can/can-ml.h +f:include/linux/can/core.h +f:include/linux/can/dev.h +f:include/linux/can/dev/peak_canfd.h +f:include/linux/can/length.h +f:include/linux/can/platform/cc770.h +f:include/linux/can/platform/flexcan.h +f:include/linux/can/platform/sja1000.h +f:include/linux/can/rx-offload.h +f:include/linux/can/skb.h +f:include/linux/capability.h +f:include/linux/cb710.h +f:include/linux/cc_platform.h +f:include/linux/cciss_ioctl.h +f:include/linux/ccp.h +f:include/linux/cdev.h +f:include/linux/cdrom.h +f:include/linux/cdx/cdx_bus.h +f:include/linux/ceph/auth.h +f:include/linux/ceph/buffer.h +f:include/linux/ceph/ceph_debug.h +f:include/linux/ceph/ceph_features.h +f:include/linux/ceph/ceph_frag.h +f:include/linux/ceph/ceph_fs.h +f:include/linux/ceph/ceph_hash.h +f:include/linux/ceph/cls_lock_client.h +f:include/linux/ceph/debugfs.h +f:include/linux/ceph/decode.h +f:include/linux/ceph/libceph.h +f:include/linux/ceph/messenger.h +f:include/linux/ceph/mon_client.h +f:include/linux/ceph/msgpool.h +f:include/linux/ceph/msgr.h +f:include/linux/ceph/osd_client.h +f:include/linux/ceph/osdmap.h +f:include/linux/ceph/pagelist.h +f:include/linux/ceph/rados.h +f:include/linux/ceph/string_table.h +f:include/linux/ceph/striper.h +f:include/linux/ceph/types.h +f:include/linux/cfag12864b.h +f:include/linux/cfi.h +f:include/linux/cfi_types.h +f:include/linux/cgroup-defs.h +f:include/linux/cgroup.h +f:include/linux/cgroup_api.h +f:include/linux/cgroup_dmem.h +f:include/linux/cgroup_rdma.h +f:include/linux/cgroup_refcnt.h +f:include/linux/cgroup_subsys.h +f:include/linux/circ_buf.h +f:include/linux/cleanup.h +f:include/linux/clk-provider.h +f:include/linux/clk.h +f:include/linux/clk/analogbits-wrpll-cln28hpc.h +f:include/linux/clk/at91_pmc.h +f:include/linux/clk/clk-conf.h +f:include/linux/clk/davinci.h +f:include/linux/clk/imx.h +f:include/linux/clk/mxs.h +f:include/linux/clk/pxa.h +f:include/linux/clk/renesas.h +f:include/linux/clk/samsung.h +f:include/linux/clk/spear.h +f:include/linux/clk/sunxi-ng.h +f:include/linux/clk/tegra.h +f:include/linux/clk/ti.h +f:include/linux/clk/zynq.h +f:include/linux/clkdev.h +f:include/linux/clockchips.h +f:include/linux/clocksource.h +f:include/linux/clocksource_ids.h +f:include/linux/closure.h +f:include/linux/cma.h +f:include/linux/cmpxchg-emu.h +f:include/linux/cn_proc.h +f:include/linux/cnt32_to_63.h +f:include/linux/coda.h +f:include/linux/codetag.h +f:include/linux/comedi/comedi_8254.h +f:include/linux/comedi/comedi_8255.h +f:include/linux/comedi/comedi_isadma.h +f:include/linux/comedi/comedi_pci.h +f:include/linux/comedi/comedi_pcmcia.h +f:include/linux/comedi/comedi_usb.h +f:include/linux/comedi/comedidev.h +f:include/linux/comedi/comedilib.h +f:include/linux/compaction.h +f:include/linux/compat.h +f:include/linux/compiler-clang.h +f:include/linux/compiler-gcc.h +f:include/linux/compiler-version.h +f:include/linux/compiler.h +f:include/linux/compiler_attributes.h +f:include/linux/compiler_types.h +f:include/linux/completion.h +f:include/linux/component.h +f:include/linux/configfs.h +f:include/linux/connector.h +f:include/linux/console.h +f:include/linux/console_struct.h +f:include/linux/consolemap.h +f:include/linux/const.h +f:include/linux/container.h +f:include/linux/container_of.h +f:include/linux/context_tracking.h +f:include/linux/context_tracking_irq.h +f:include/linux/context_tracking_state.h +f:include/linux/cookie.h +f:include/linux/cordic.h +f:include/linux/coredump.h +f:include/linux/coresight-pmu.h +f:include/linux/coresight-stm.h +f:include/linux/coresight.h +f:include/linux/count_zeros.h +f:include/linux/counter.h +f:include/linux/cper.h +f:include/linux/cpu.h +f:include/linux/cpu_cooling.h +f:include/linux/cpu_pm.h +f:include/linux/cpu_rmap.h +f:include/linux/cpu_smt.h +f:include/linux/cpufeature.h +f:include/linux/cpufreq.h +f:include/linux/cpuhotplug.h +f:include/linux/cpuhplock.h +f:include/linux/cpuidle.h +f:include/linux/cpuidle_haltpoll.h +f:include/linux/cpumask.h +f:include/linux/cpumask_api.h +f:include/linux/cpumask_types.h +f:include/linux/cpuset.h +f:include/linux/crash_core.h +f:include/linux/crash_dump.h +f:include/linux/crash_reserve.h +f:include/linux/crc-ccitt.h +f:include/linux/crc-itu-t.h +f:include/linux/crc-t10dif.h +f:include/linux/crc16.h +f:include/linux/crc32.h +f:include/linux/crc32c.h +f:include/linux/crc32poly.h +f:include/linux/crc4.h +f:include/linux/crc64.h +f:include/linux/crc7.h +f:include/linux/crc8.h +f:include/linux/cred.h +f:include/linux/crush/crush.h +f:include/linux/crush/hash.h +f:include/linux/crush/mapper.h +f:include/linux/crypto.h +f:include/linux/cs5535.h +f:include/linux/ctype.h +f:include/linux/cuda.h +f:include/linux/damon.h +f:include/linux/dasd_mod.h +f:include/linux/davinci_emac.h +f:include/linux/dax.h +f:include/linux/dca.h +f:include/linux/dcache.h +f:include/linux/dccp.h +f:include/linux/debug_locks.h +f:include/linux/debugfs.h +f:include/linux/debugobjects.h +f:include/linux/decompress/bunzip2.h +f:include/linux/decompress/generic.h +f:include/linux/decompress/inflate.h +f:include/linux/decompress/mm.h +f:include/linux/decompress/unlz4.h +f:include/linux/decompress/unlzma.h +f:include/linux/decompress/unlzo.h +f:include/linux/decompress/unxz.h +f:include/linux/decompress/unzstd.h +f:include/linux/delay.h +f:include/linux/delayacct.h +f:include/linux/delayed_call.h +f:include/linux/dev_printk.h +f:include/linux/devcoredump.h +f:include/linux/devfreq-event.h +f:include/linux/devfreq.h +f:include/linux/devfreq_cooling.h +f:include/linux/device-mapper.h +f:include/linux/device.h +f:include/linux/device/bus.h +f:include/linux/device/class.h +f:include/linux/device/devres.h +f:include/linux/device/driver.h +f:include/linux/device/faux.h +f:include/linux/device_cgroup.h +f:include/linux/devm-helpers.h +f:include/linux/devpts_fs.h +f:include/linux/dfl.h +f:include/linux/digsig.h +f:include/linux/dim.h +f:include/linux/dio.h +f:include/linux/dirent.h +f:include/linux/dlm.h +f:include/linux/dlm_plock.h +f:include/linux/dm-bufio.h +f:include/linux/dm-dirty-log.h +f:include/linux/dm-io.h +f:include/linux/dm-kcopyd.h +f:include/linux/dm-region-hash.h +f:include/linux/dm-verity-loadpin.h +f:include/linux/dm9000.h +f:include/linux/dma-buf.h +f:include/linux/dma-direct.h +f:include/linux/dma-direction.h +f:include/linux/dma-fence-array.h +f:include/linux/dma-fence-chain.h +f:include/linux/dma-fence-unwrap.h +f:include/linux/dma-fence.h +f:include/linux/dma-heap.h +f:include/linux/dma-map-ops.h +f:include/linux/dma-mapping.h +f:include/linux/dma-resv.h +f:include/linux/dma/amd_xdma.h +f:include/linux/dma/dw.h +f:include/linux/dma/edma.h +f:include/linux/dma/hsu.h +f:include/linux/dma/idma64.h +f:include/linux/dma/imx-dma.h +f:include/linux/dma/k3-event-router.h +f:include/linux/dma/k3-psil.h +f:include/linux/dma/k3-udma-glue.h +f:include/linux/dma/mxs-dma.h +f:include/linux/dma/pxa-dma.h +f:include/linux/dma/qcom-gpi-dma.h +f:include/linux/dma/qcom_adm.h +f:include/linux/dma/qcom_bam_dma.h +f:include/linux/dma/sprd-dma.h +f:include/linux/dma/ti-cppi5.h +f:include/linux/dma/xilinx_dma.h +f:include/linux/dma/xilinx_dpdma.h +f:include/linux/dmaengine.h +f:include/linux/dmapool.h +f:include/linux/dmar.h +f:include/linux/dmi.h +f:include/linux/dnotify.h +f:include/linux/dns_resolver.h +f:include/linux/dpll.h +f:include/linux/dqblk_qtree.h +f:include/linux/dqblk_v1.h +f:include/linux/dqblk_v2.h +f:include/linux/drbd.h +f:include/linux/drbd_config.h +f:include/linux/drbd_genl.h +f:include/linux/drbd_genl_api.h +f:include/linux/drbd_limits.h +f:include/linux/ds2782_battery.h +f:include/linux/dsa/8021q.h +f:include/linux/dsa/brcm.h +f:include/linux/dsa/ksz_common.h +f:include/linux/dsa/lan9303.h +f:include/linux/dsa/loop.h +f:include/linux/dsa/mv88e6xxx.h +f:include/linux/dsa/ocelot.h +f:include/linux/dsa/sja1105.h +f:include/linux/dsa/tag_qca.h +f:include/linux/dtlk.h +f:include/linux/dtpm.h +f:include/linux/dw_apb_timer.h +f:include/linux/dynamic_debug.h +f:include/linux/dynamic_queue_limits.h +f:include/linux/earlycpio.h +f:include/linux/ecryptfs.h +f:include/linux/edac.h +f:include/linux/edd.h +f:include/linux/eeprom_93cx6.h +f:include/linux/efi-bgrt.h +f:include/linux/efi.h +f:include/linux/efi_embedded_fw.h +f:include/linux/efs_vh.h +f:include/linux/eisa.h +f:include/linux/elf-fdpic.h +f:include/linux/elf-randomize.h +f:include/linux/elf.h +f:include/linux/elfcore-compat.h +f:include/linux/elfcore.h +f:include/linux/elfnote-lto.h +f:include/linux/elfnote.h +f:include/linux/enclosure.h +f:include/linux/energy_model.h +f:include/linux/entry-common.h +f:include/linux/entry-kvm.h +f:include/linux/err.h +f:include/linux/errname.h +f:include/linux/errno.h +f:include/linux/error-injection.h +f:include/linux/errqueue.h +f:include/linux/errseq.h +f:include/linux/etherdevice.h +f:include/linux/ethtool.h +f:include/linux/ethtool_netlink.h +f:include/linux/eventfd.h +f:include/linux/eventpoll.h +f:include/linux/evm.h +f:include/linux/execmem.h +f:include/linux/export-internal.h +f:include/linux/export.h +f:include/linux/exportfs.h +f:include/linux/ext2_fs.h +f:include/linux/extable.h +f:include/linux/extcon-provider.h +f:include/linux/extcon.h +f:include/linux/extcon/extcon-adc-jack.h +f:include/linux/f2fs_fs.h +f:include/linux/f75375s.h +f:include/linux/falloc.h +f:include/linux/fanotify.h +f:include/linux/fault-inject-usercopy.h +f:include/linux/fault-inject.h +f:include/linux/fb.h +f:include/linux/fbcon.h +f:include/linux/fcdevice.h +f:include/linux/fcntl.h +f:include/linux/fd.h +f:include/linux/fddidevice.h +f:include/linux/fdtable.h +f:include/linux/fec.h +f:include/linux/fiemap.h +f:include/linux/file.h +f:include/linux/file_ref.h +f:include/linux/fileattr.h +f:include/linux/filelock.h +f:include/linux/filter.h +f:include/linux/find.h +f:include/linux/fips.h +f:include/linux/firewire.h +f:include/linux/firmware-map.h +f:include/linux/firmware.h +f:include/linux/firmware/broadcom/tee_bnxt_fw.h +f:include/linux/firmware/cirrus/cs_dsp.h +f:include/linux/firmware/cirrus/cs_dsp_test_utils.h +f:include/linux/firmware/cirrus/wmfw.h +f:include/linux/firmware/imx/dsp.h +f:include/linux/firmware/imx/ipc.h +f:include/linux/firmware/imx/s4.h +f:include/linux/firmware/imx/sci.h +f:include/linux/firmware/imx/sm.h +f:include/linux/firmware/imx/svc/misc.h +f:include/linux/firmware/imx/svc/pm.h +f:include/linux/firmware/imx/svc/rm.h +f:include/linux/firmware/intel/stratix10-smc.h +f:include/linux/firmware/intel/stratix10-svc-client.h +f:include/linux/firmware/mediatek/mtk-adsp-ipc.h +f:include/linux/firmware/meson/meson_sm.h +f:include/linux/firmware/qcom/qcom_qseecom.h +f:include/linux/firmware/qcom/qcom_scm.h +f:include/linux/firmware/qcom/qcom_tzmem.h +f:include/linux/firmware/samsung/exynos-acpm-protocol.h +f:include/linux/firmware/thead/thead,th1520-aon.h +f:include/linux/firmware/trusted_foundations.h +f:include/linux/firmware/xlnx-event-manager.h +f:include/linux/firmware/xlnx-zynqmp.h +f:include/linux/fixp-arith.h +f:include/linux/flat.h +f:include/linux/flex_proportions.h +f:include/linux/folio_queue.h +f:include/linux/font.h +f:include/linux/fortify-string.h +f:include/linux/fpga/altera-pr-ip-core.h +f:include/linux/fpga/fpga-bridge.h +f:include/linux/fpga/fpga-mgr.h +f:include/linux/fpga/fpga-region.h +f:include/linux/fprobe.h +f:include/linux/fpu.h +f:include/linux/framer/framer-provider.h +f:include/linux/framer/framer.h +f:include/linux/framer/pef2256.h +f:include/linux/freezer.h +f:include/linux/fs.h +f:include/linux/fs_api.h +f:include/linux/fs_context.h +f:include/linux/fs_parser.h +f:include/linux/fs_pin.h +f:include/linux/fs_stack.h +f:include/linux/fs_struct.h +f:include/linux/fs_types.h +f:include/linux/fscache-cache.h +f:include/linux/fscache.h +f:include/linux/fscrypt.h +f:include/linux/fsi-occ.h +f:include/linux/fsi-sbefifo.h +f:include/linux/fsi.h +f:include/linux/fsl-diu-fb.h +f:include/linux/fsl/bestcomm/ata.h +f:include/linux/fsl/bestcomm/bestcomm.h +f:include/linux/fsl/bestcomm/bestcomm_priv.h +f:include/linux/fsl/bestcomm/fec.h +f:include/linux/fsl/bestcomm/gen_bd.h +f:include/linux/fsl/bestcomm/sram.h +f:include/linux/fsl/edac.h +f:include/linux/fsl/enetc_mdio.h +f:include/linux/fsl/ftm.h +f:include/linux/fsl/guts.h +f:include/linux/fsl/mc.h +f:include/linux/fsl/netc_global.h +f:include/linux/fsl/ntmp.h +f:include/linux/fsl/ptp_qoriq.h +f:include/linux/fsl_devices.h +f:include/linux/fsl_hypervisor.h +f:include/linux/fsl_ifc.h +f:include/linux/fsldma.h +f:include/linux/fsnotify.h +f:include/linux/fsnotify_backend.h +f:include/linux/fsverity.h +f:include/linux/ftrace.h +f:include/linux/ftrace_irq.h +f:include/linux/ftrace_regs.h +f:include/linux/futex.h +f:include/linux/fw_table.h +f:include/linux/fwctl.h +f:include/linux/fwnode.h +f:include/linux/fwnode_mdio.h +f:include/linux/gameport.h +f:include/linux/gcd.h +f:include/linux/genalloc.h +f:include/linux/generic-radix-tree.h +f:include/linux/genl_magic_func.h +f:include/linux/genl_magic_struct.h +f:include/linux/getcpu.h +f:include/linux/gfp.h +f:include/linux/gfp_api.h +f:include/linux/gfp_types.h +f:include/linux/glob.h +f:include/linux/gnss.h +f:include/linux/goldfish.h +f:include/linux/gpio-pxa.h +f:include/linux/gpio.h +f:include/linux/gpio/aspeed.h +f:include/linux/gpio/consumer.h +f:include/linux/gpio/driver.h +f:include/linux/gpio/generic.h +f:include/linux/gpio/gpio-nomadik.h +f:include/linux/gpio/gpio-reg.h +f:include/linux/gpio/legacy-of-mm-gpiochip.h +f:include/linux/gpio/machine.h +f:include/linux/gpio/property.h +f:include/linux/gpio/regmap.h +f:include/linux/gpio_keys.h +f:include/linux/greybus.h +f:include/linux/greybus/bundle.h +f:include/linux/greybus/connection.h +f:include/linux/greybus/control.h +f:include/linux/greybus/greybus_id.h +f:include/linux/greybus/greybus_manifest.h +f:include/linux/greybus/greybus_protocols.h +f:include/linux/greybus/hd.h +f:include/linux/greybus/interface.h +f:include/linux/greybus/manifest.h +f:include/linux/greybus/module.h +f:include/linux/greybus/operation.h +f:include/linux/greybus/svc.h +f:include/linux/group_cpus.h +f:include/linux/habanalabs/cpucp_if.h +f:include/linux/habanalabs/hl_boot_if.h +f:include/linux/hardirq.h +f:include/linux/hash.h +f:include/linux/hashtable.h +f:include/linux/hashtable_api.h +f:include/linux/hdlc.h +f:include/linux/hdlcdrv.h +f:include/linux/hdmi.h +f:include/linux/hex.h +f:include/linux/hid-debug.h +f:include/linux/hid-over-i2c.h +f:include/linux/hid-over-spi.h +f:include/linux/hid-roccat.h +f:include/linux/hid-sensor-hub.h +f:include/linux/hid-sensor-ids.h +f:include/linux/hid.h +f:include/linux/hid_bpf.h +f:include/linux/hidden.h +f:include/linux/hiddev.h +f:include/linux/hidraw.h +f:include/linux/highmem-internal.h +f:include/linux/highmem.h +f:include/linux/highuid.h +f:include/linux/hil.h +f:include/linux/hil_mlc.h +f:include/linux/hippidevice.h +f:include/linux/hisi_acc_qm.h +f:include/linux/hmm-dma.h +f:include/linux/hmm.h +f:include/linux/host1x.h +f:include/linux/host1x_context_bus.h +f:include/linux/hp_sdc.h +f:include/linux/hpet.h +f:include/linux/hrtimer.h +f:include/linux/hrtimer_api.h +f:include/linux/hrtimer_defs.h +f:include/linux/hrtimer_types.h +f:include/linux/hsi/hsi.h +f:include/linux/hsi/ssi_protocol.h +f:include/linux/hte.h +f:include/linux/huge_mm.h +f:include/linux/hugetlb.h +f:include/linux/hugetlb_cgroup.h +f:include/linux/hugetlb_inline.h +f:include/linux/hung_task.h +f:include/linux/hw_breakpoint.h +f:include/linux/hw_random.h +f:include/linux/hwmon-sysfs.h +f:include/linux/hwmon-vid.h +f:include/linux/hwmon.h +f:include/linux/hwspinlock.h +f:include/linux/hyperv.h +f:include/linux/hypervisor.h +f:include/linux/i2c-algo-bit.h +f:include/linux/i2c-algo-pca.h +f:include/linux/i2c-algo-pcf.h +f:include/linux/i2c-atr.h +f:include/linux/i2c-dev.h +f:include/linux/i2c-mux.h +f:include/linux/i2c-of-prober.h +f:include/linux/i2c-smbus.h +f:include/linux/i2c.h +f:include/linux/i3c/ccc.h +f:include/linux/i3c/device.h +f:include/linux/i3c/master.h +f:include/linux/i8042.h +f:include/linux/i8253.h +f:include/linux/i8254.h +f:include/linux/icmp.h +f:include/linux/icmpv6.h +f:include/linux/idle_inject.h +f:include/linux/idr.h +f:include/linux/ieee80211.h +f:include/linux/ieee802154.h +f:include/linux/if_arp.h +f:include/linux/if_bridge.h +f:include/linux/if_eql.h +f:include/linux/if_ether.h +f:include/linux/if_fddi.h +f:include/linux/if_hsr.h +f:include/linux/if_link.h +f:include/linux/if_macvlan.h +f:include/linux/if_phonet.h +f:include/linux/if_pppol2tp.h +f:include/linux/if_pppox.h +f:include/linux/if_rmnet.h +f:include/linux/if_tap.h +f:include/linux/if_team.h +f:include/linux/if_tun.h +f:include/linux/if_tunnel.h +f:include/linux/if_vlan.h +f:include/linux/igmp.h +f:include/linux/ihex.h +f:include/linux/iio/accel/kxcjk_1013.h +f:include/linux/iio/adc-helpers.h +f:include/linux/iio/adc/ad_sigma_delta.h +f:include/linux/iio/adc/qcom-vadc-common.h +f:include/linux/iio/adc/stm32-dfsdm-adc.h +f:include/linux/iio/afe/rescale.h +f:include/linux/iio/backend.h +f:include/linux/iio/buffer-dma.h +f:include/linux/iio/buffer-dmaengine.h +f:include/linux/iio/buffer.h +f:include/linux/iio/buffer_impl.h +f:include/linux/iio/common/cros_ec_sensors_core.h +f:include/linux/iio/common/inv_sensors_timestamp.h +f:include/linux/iio/common/ssp_sensors.h +f:include/linux/iio/common/st_sensors.h +f:include/linux/iio/common/st_sensors_i2c.h +f:include/linux/iio/common/st_sensors_spi.h +f:include/linux/iio/configfs.h +f:include/linux/iio/consumer.h +f:include/linux/iio/dac/ad5421.h +f:include/linux/iio/dac/ad5504.h +f:include/linux/iio/dac/ad5791.h +f:include/linux/iio/dac/max517.h +f:include/linux/iio/dac/mcp4725.h +f:include/linux/iio/driver.h +f:include/linux/iio/events.h +f:include/linux/iio/frequency/ad9523.h +f:include/linux/iio/frequency/adf4350.h +f:include/linux/iio/gyro/itg3200.h +f:include/linux/iio/hw-consumer.h +f:include/linux/iio/iio-gts-helper.h +f:include/linux/iio/iio-opaque.h +f:include/linux/iio/iio.h +f:include/linux/iio/imu/adis.h +f:include/linux/iio/kfifo_buf.h +f:include/linux/iio/machine.h +f:include/linux/iio/sw_device.h +f:include/linux/iio/sw_trigger.h +f:include/linux/iio/sysfs.h +f:include/linux/iio/timer/stm32-lptim-trigger.h +f:include/linux/iio/timer/stm32-timer-trigger.h +f:include/linux/iio/trigger.h +f:include/linux/iio/trigger_consumer.h +f:include/linux/iio/triggered_buffer.h +f:include/linux/iio/triggered_event.h +f:include/linux/iio/types.h +f:include/linux/ima.h +f:include/linux/imx-media.h +f:include/linux/in.h +f:include/linux/in6.h +f:include/linux/indirect_call_wrapper.h +f:include/linux/inet.h +f:include/linux/inet_diag.h +f:include/linux/inetdevice.h +f:include/linux/init.h +f:include/linux/init_ohci1394_dma.h +f:include/linux/init_syscalls.h +f:include/linux/init_task.h +f:include/linux/initrd.h +f:include/linux/inotify.h +f:include/linux/input.h +f:include/linux/input/ad714x.h +f:include/linux/input/adp5589.h +f:include/linux/input/adxl34x.h +f:include/linux/input/as5011.h +f:include/linux/input/cma3000.h +f:include/linux/input/elan-i2c-ids.h +f:include/linux/input/kxtj9.h +f:include/linux/input/lm8333.h +f:include/linux/input/matrix_keypad.h +f:include/linux/input/mt.h +f:include/linux/input/samsung-keypad.h +f:include/linux/input/sh_keysc.h +f:include/linux/input/sparse-keymap.h +f:include/linux/input/touchscreen.h +f:include/linux/input/tps6507x-ts.h +f:include/linux/input/vivaldi-fmap.h +f:include/linux/instruction_pointer.h +f:include/linux/instrumentation.h +f:include/linux/instrumented.h +f:include/linux/int_log.h +f:include/linux/integrity.h +f:include/linux/intel-ish-client-if.h +f:include/linux/intel_dg_nvm_aux.h +f:include/linux/intel_pmt_features.h +f:include/linux/intel_rapl.h +f:include/linux/intel_tcc.h +f:include/linux/intel_th.h +f:include/linux/intel_tpmi.h +f:include/linux/intel_vsec.h +f:include/linux/interconnect-clk.h +f:include/linux/interconnect-provider.h +f:include/linux/interconnect.h +f:include/linux/interrupt.h +f:include/linux/interval_tree.h +f:include/linux/interval_tree_generic.h +f:include/linux/io-64-nonatomic-hi-lo.h +f:include/linux/io-64-nonatomic-lo-hi.h +f:include/linux/io-mapping.h +f:include/linux/io-pgtable.h +f:include/linux/io.h +f:include/linux/io_uring.h +f:include/linux/io_uring/cmd.h +f:include/linux/io_uring/net.h +f:include/linux/io_uring_types.h +f:include/linux/ioam6.h +f:include/linux/ioam6_genl.h +f:include/linux/ioam6_iptunnel.h +f:include/linux/iocontext.h +f:include/linux/iomap.h +f:include/linux/iommu-dma.h +f:include/linux/iommu-helper.h +f:include/linux/iommu.h +f:include/linux/iommufd.h +f:include/linux/iopoll.h +f:include/linux/ioport.h +f:include/linux/ioprio.h +f:include/linux/ioremap.h +f:include/linux/iosys-map.h +f:include/linux/iov_iter.h +f:include/linux/iova.h +f:include/linux/iova_bitmap.h +f:include/linux/ip.h +f:include/linux/ipack.h +f:include/linux/ipc.h +f:include/linux/ipc_namespace.h +f:include/linux/ipmi.h +f:include/linux/ipmi_smi.h +f:include/linux/ipv6.h +f:include/linux/ipv6_route.h +f:include/linux/irq-entry-common.h +f:include/linux/irq.h +f:include/linux/irq_poll.h +f:include/linux/irq_sim.h +f:include/linux/irq_work.h +f:include/linux/irqbypass.h +f:include/linux/irqchip.h +f:include/linux/irqchip/arm-gic-common.h +f:include/linux/irqchip/arm-gic-v3-prio.h +f:include/linux/irqchip/arm-gic-v3.h +f:include/linux/irqchip/arm-gic-v4.h +f:include/linux/irqchip/arm-gic-v5.h +f:include/linux/irqchip/arm-gic.h +f:include/linux/irqchip/arm-vgic-info.h +f:include/linux/irqchip/arm-vic.h +f:include/linux/irqchip/chained_irq.h +f:include/linux/irqchip/irq-bcm2836.h +f:include/linux/irqchip/irq-madera.h +f:include/linux/irqchip/irq-msi-lib.h +f:include/linux/irqchip/irq-omap-intc.h +f:include/linux/irqchip/irq-partition-percpu.h +f:include/linux/irqchip/irq-renesas-rzv2h.h +f:include/linux/irqchip/irq-sa11x0.h +f:include/linux/irqchip/riscv-aplic.h +f:include/linux/irqchip/riscv-imsic.h +f:include/linux/irqchip/xtensa-mx.h +f:include/linux/irqchip/xtensa-pic.h +f:include/linux/irqdesc.h +f:include/linux/irqdomain.h +f:include/linux/irqdomain_defs.h +f:include/linux/irqflags.h +f:include/linux/irqflags_types.h +f:include/linux/irqhandler.h +f:include/linux/irqnr.h +f:include/linux/irqreturn.h +f:include/linux/isa-dma.h +f:include/linux/isa.h +f:include/linux/isapnp.h +f:include/linux/iscsi_boot_sysfs.h +f:include/linux/iscsi_ibft.h +f:include/linux/isdn/capilli.h +f:include/linux/isdn/capiutil.h +f:include/linux/ism.h +f:include/linux/iversion.h +f:include/linux/jbd2.h +f:include/linux/jhash.h +f:include/linux/jiffies.h +f:include/linux/journal-head.h +f:include/linux/joystick.h +f:include/linux/jump_label.h +f:include/linux/jump_label_ratelimit.h +f:include/linux/jz4740-adc.h +f:include/linux/jz4780-nemc.h +f:include/linux/kallsyms.h +f:include/linux/kasan-checks.h +f:include/linux/kasan-enabled.h +f:include/linux/kasan-tags.h +f:include/linux/kasan.h +f:include/linux/kbd_diacr.h +f:include/linux/kbd_kern.h +f:include/linux/kbuild.h +f:include/linux/kconfig.h +f:include/linux/kcore.h +f:include/linux/kcov.h +f:include/linux/kcsan-checks.h +f:include/linux/kcsan.h +f:include/linux/kdb.h +f:include/linux/kdebug.h +f:include/linux/kdev_t.h +f:include/linux/kern_levels.h +f:include/linux/kernel-page-flags.h +f:include/linux/kernel.h +f:include/linux/kernel_read_file.h +f:include/linux/kernel_stat.h +f:include/linux/kernelcapi.h +f:include/linux/kernfs.h +f:include/linux/kexec.h +f:include/linux/kexec_handover.h +f:include/linux/key-type.h +f:include/linux/key.h +f:include/linux/keyboard.h +f:include/linux/keyctl.h +f:include/linux/kfence.h +f:include/linux/kfifo.h +f:include/linux/kgdb.h +f:include/linux/khugepaged.h +f:include/linux/klist.h +f:include/linux/kmemleak.h +f:include/linux/kmod.h +f:include/linux/kmsan-checks.h +f:include/linux/kmsan.h +f:include/linux/kmsan_string.h +f:include/linux/kmsan_types.h +f:include/linux/kmsg_dump.h +f:include/linux/kobj_map.h +f:include/linux/kobject.h +f:include/linux/kobject_api.h +f:include/linux/kobject_ns.h +f:include/linux/kprobes.h +f:include/linux/kref.h +f:include/linux/kref_api.h +f:include/linux/ks0108.h +f:include/linux/ks8842.h +f:include/linux/ks8851_mll.h +f:include/linux/ksm.h +f:include/linux/kstack_erase.h +f:include/linux/kstrtox.h +f:include/linux/kthread.h +f:include/linux/ktime.h +f:include/linux/ktime_api.h +f:include/linux/kvm_dirty_ring.h +f:include/linux/kvm_host.h +f:include/linux/kvm_irqfd.h +f:include/linux/kvm_para.h +f:include/linux/kvm_types.h +f:include/linux/l2tp.h +f:include/linux/lantiq.h +f:include/linux/lapb.h +f:include/linux/latencytop.h +f:include/linux/lcd.h +f:include/linux/lcm.h +f:include/linux/led-class-flash.h +f:include/linux/led-class-multicolor.h +f:include/linux/led-lm3530.h +f:include/linux/leds-bd2802.h +f:include/linux/leds-expresswire.h +f:include/linux/leds-lp3944.h +f:include/linux/leds-lp3952.h +f:include/linux/leds-pca9532.h +f:include/linux/leds-regulator.h +f:include/linux/leds-ti-lmu-common.h +f:include/linux/leds.h +f:include/linux/libata.h +f:include/linux/libfdt.h +f:include/linux/libfdt_env.h +f:include/linux/libgcc.h +f:include/linux/libnvdimm.h +f:include/linux/libps2.h +f:include/linux/license.h +f:include/linux/limits.h +f:include/linux/linear_range.h +f:include/linux/linkage.h +f:include/linux/linkmode.h +f:include/linux/linux_logo.h +f:include/linux/lis3lv02d.h +f:include/linux/list.h +f:include/linux/list_bl.h +f:include/linux/list_lru.h +f:include/linux/list_nulls.h +f:include/linux/list_sort.h +f:include/linux/litex.h +f:include/linux/livepatch.h +f:include/linux/livepatch_sched.h +f:include/linux/llc.h +f:include/linux/llist.h +f:include/linux/llist_api.h +f:include/linux/local_lock.h +f:include/linux/local_lock_internal.h +f:include/linux/lockd/bind.h +f:include/linux/lockd/debug.h +f:include/linux/lockd/lockd.h +f:include/linux/lockd/nlm.h +f:include/linux/lockd/share.h +f:include/linux/lockd/xdr.h +f:include/linux/lockd/xdr4.h +f:include/linux/lockdep.h +f:include/linux/lockdep_api.h +f:include/linux/lockdep_types.h +f:include/linux/lockref.h +f:include/linux/log2.h +f:include/linux/logic_iomem.h +f:include/linux/logic_pio.h +f:include/linux/lp.h +f:include/linux/lru_cache.h +f:include/linux/lsm/apparmor.h +f:include/linux/lsm/bpf.h +f:include/linux/lsm/selinux.h +f:include/linux/lsm/smack.h +f:include/linux/lsm_audit.h +f:include/linux/lsm_count.h +f:include/linux/lsm_hook_defs.h +f:include/linux/lsm_hooks.h +f:include/linux/lwq.h +f:include/linux/lz4.h +f:include/linux/lzo.h +f:include/linux/mISDNdsp.h +f:include/linux/mISDNhw.h +f:include/linux/mISDNif.h +f:include/linux/mailbox/arm_mhuv2_message.h +f:include/linux/mailbox/brcm-message.h +f:include/linux/mailbox/exynos-message.h +f:include/linux/mailbox/mchp-ipc.h +f:include/linux/mailbox/mtk-cmdq-mailbox.h +f:include/linux/mailbox/zynqmp-ipi-message.h +f:include/linux/mailbox_client.h +f:include/linux/mailbox_controller.h +f:include/linux/map_benchmark.h +f:include/linux/maple.h +f:include/linux/maple_tree.h +f:include/linux/marvell_phy.h +f:include/linux/math.h +f:include/linux/math64.h +f:include/linux/mbcache.h +f:include/linux/mbus.h +f:include/linux/mc146818rtc.h +f:include/linux/mc33xs2410.h +f:include/linux/mc6821.h +f:include/linux/mcb.h +f:include/linux/mdev.h +f:include/linux/mdio-bitbang.h +f:include/linux/mdio-gpio.h +f:include/linux/mdio-mux.h +f:include/linux/mdio.h +f:include/linux/mdio/mdio-i2c.h +f:include/linux/mdio/mdio-mscc-miim.h +f:include/linux/mdio/mdio-regmap.h +f:include/linux/mdio/mdio-xgene.h +f:include/linux/mei_aux.h +f:include/linux/mei_cl_bus.h +f:include/linux/mem_encrypt.h +f:include/linux/memblock.h +f:include/linux/memcontrol.h +f:include/linux/memfd.h +f:include/linux/memory-tiers.h +f:include/linux/memory.h +f:include/linux/memory/ti-aemif.h +f:include/linux/memory_hotplug.h +f:include/linux/mempolicy.h +f:include/linux/mempool.h +f:include/linux/memregion.h +f:include/linux/memremap.h +f:include/linux/memstick.h +f:include/linux/mfd/88pm80x.h +f:include/linux/mfd/88pm860x.h +f:include/linux/mfd/88pm886.h +f:include/linux/mfd/aat2870.h +f:include/linux/mfd/abx500.h +f:include/linux/mfd/abx500/ab8500-codec.h +f:include/linux/mfd/abx500/ab8500-sysctrl.h +f:include/linux/mfd/abx500/ab8500.h +f:include/linux/mfd/ac100.h +f:include/linux/mfd/adp5520.h +f:include/linux/mfd/adp5585.h +f:include/linux/mfd/altera-a10sr.h +f:include/linux/mfd/altera-sysmgr.h +f:include/linux/mfd/arizona/core.h +f:include/linux/mfd/arizona/pdata.h +f:include/linux/mfd/arizona/registers.h +f:include/linux/mfd/as3711.h +f:include/linux/mfd/as3722.h +f:include/linux/mfd/atc260x/atc2603c.h +f:include/linux/mfd/atc260x/atc2609a.h +f:include/linux/mfd/atc260x/core.h +f:include/linux/mfd/atmel-hlcdc.h +f:include/linux/mfd/axp20x.h +f:include/linux/mfd/bcm2835-pm.h +f:include/linux/mfd/bcm590xx.h +f:include/linux/mfd/bd9571mwv.h +f:include/linux/mfd/cgbc.h +f:include/linux/mfd/core.h +f:include/linux/mfd/cs40l50.h +f:include/linux/mfd/cs42l43-regs.h +f:include/linux/mfd/cs42l43.h +f:include/linux/mfd/da8xx-cfgchip.h +f:include/linux/mfd/da903x.h +f:include/linux/mfd/da9052/da9052.h +f:include/linux/mfd/da9052/pdata.h +f:include/linux/mfd/da9052/reg.h +f:include/linux/mfd/da9055/core.h +f:include/linux/mfd/da9055/pdata.h +f:include/linux/mfd/da9055/reg.h +f:include/linux/mfd/da9062/core.h +f:include/linux/mfd/da9062/registers.h +f:include/linux/mfd/da9063/core.h +f:include/linux/mfd/da9063/registers.h +f:include/linux/mfd/da9150/core.h +f:include/linux/mfd/da9150/registers.h +f:include/linux/mfd/davinci_voicecodec.h +f:include/linux/mfd/db8500-prcmu.h +f:include/linux/mfd/dbx500-prcmu.h +f:include/linux/mfd/dln2.h +f:include/linux/mfd/ezx-pcap.h +f:include/linux/mfd/gsc.h +f:include/linux/mfd/hi6421-pmic.h +f:include/linux/mfd/hi655x-pmic.h +f:include/linux/mfd/idt82p33_reg.h +f:include/linux/mfd/idt8a340_reg.h +f:include/linux/mfd/idtRC38xxx_reg.h +f:include/linux/mfd/imx25-tsadc.h +f:include/linux/mfd/ingenic-tcu.h +f:include/linux/mfd/intel-m10-bmc.h +f:include/linux/mfd/intel_pmc_bxt.h +f:include/linux/mfd/intel_soc_pmic.h +f:include/linux/mfd/intel_soc_pmic_bxtwc.h +f:include/linux/mfd/intel_soc_pmic_mrfld.h +f:include/linux/mfd/ipaq-micro.h +f:include/linux/mfd/iqs62x.h +f:include/linux/mfd/janz.h +f:include/linux/mfd/kempld.h +f:include/linux/mfd/khadas-mcu.h +f:include/linux/mfd/lm3533.h +f:include/linux/mfd/lochnagar.h +f:include/linux/mfd/lochnagar1_regs.h +f:include/linux/mfd/lochnagar2_regs.h +f:include/linux/mfd/lp3943.h +f:include/linux/mfd/lp873x.h +f:include/linux/mfd/lp87565.h +f:include/linux/mfd/lp8788-isink.h +f:include/linux/mfd/lp8788.h +f:include/linux/mfd/lpc_ich.h +f:include/linux/mfd/macsmc.h +f:include/linux/mfd/madera/core.h +f:include/linux/mfd/madera/pdata.h +f:include/linux/mfd/madera/registers.h +f:include/linux/mfd/max14577-private.h +f:include/linux/mfd/max14577.h +f:include/linux/mfd/max5970.h +f:include/linux/mfd/max77541.h +f:include/linux/mfd/max77620.h +f:include/linux/mfd/max77650.h +f:include/linux/mfd/max77686-private.h +f:include/linux/mfd/max77686.h +f:include/linux/mfd/max77693-common.h +f:include/linux/mfd/max77693-private.h +f:include/linux/mfd/max77693.h +f:include/linux/mfd/max77705-private.h +f:include/linux/mfd/max77714.h +f:include/linux/mfd/max77759.h +f:include/linux/mfd/max77843-private.h +f:include/linux/mfd/max8907.h +f:include/linux/mfd/max8925.h +f:include/linux/mfd/max8997-private.h +f:include/linux/mfd/max8997.h +f:include/linux/mfd/max8998-private.h +f:include/linux/mfd/max8998.h +f:include/linux/mfd/mc13783.h +f:include/linux/mfd/mc13892.h +f:include/linux/mfd/mc13xxx.h +f:include/linux/mfd/mcp.h +f:include/linux/mfd/menelaus.h +f:include/linux/mfd/motorola-cpcap.h +f:include/linux/mfd/mp2629.h +f:include/linux/mfd/mt6323/core.h +f:include/linux/mfd/mt6323/registers.h +f:include/linux/mfd/mt6328/core.h +f:include/linux/mfd/mt6328/registers.h +f:include/linux/mfd/mt6331/core.h +f:include/linux/mfd/mt6331/registers.h +f:include/linux/mfd/mt6332/core.h +f:include/linux/mfd/mt6332/registers.h +f:include/linux/mfd/mt6357/core.h +f:include/linux/mfd/mt6357/registers.h +f:include/linux/mfd/mt6358/core.h +f:include/linux/mfd/mt6358/registers.h +f:include/linux/mfd/mt6359/core.h +f:include/linux/mfd/mt6359/registers.h +f:include/linux/mfd/mt6359p/registers.h +f:include/linux/mfd/mt6397/core.h +f:include/linux/mfd/mt6397/registers.h +f:include/linux/mfd/mt6397/rtc.h +f:include/linux/mfd/mxs-lradc.h +f:include/linux/mfd/ntxec.h +f:include/linux/mfd/ocelot.h +f:include/linux/mfd/palmas.h +f:include/linux/mfd/qcom_rpm.h +f:include/linux/mfd/qnap-mcu.h +f:include/linux/mfd/rave-sp.h +f:include/linux/mfd/rc5t583.h +f:include/linux/mfd/rdc321x.h +f:include/linux/mfd/retu.h +f:include/linux/mfd/rk808.h +f:include/linux/mfd/rn5t618.h +f:include/linux/mfd/rohm-bd71815.h +f:include/linux/mfd/rohm-bd71828.h +f:include/linux/mfd/rohm-bd718x7.h +f:include/linux/mfd/rohm-bd957x.h +f:include/linux/mfd/rohm-bd96801.h +f:include/linux/mfd/rohm-bd96802.h +f:include/linux/mfd/rohm-generic.h +f:include/linux/mfd/rohm-shared.h +f:include/linux/mfd/rsmu.h +f:include/linux/mfd/rt5033-private.h +f:include/linux/mfd/rt5033.h +f:include/linux/mfd/rz-mtu3.h +f:include/linux/mfd/samsung/core.h +f:include/linux/mfd/samsung/irq.h +f:include/linux/mfd/samsung/rtc.h +f:include/linux/mfd/samsung/s2mpa01.h +f:include/linux/mfd/samsung/s2mpg10.h +f:include/linux/mfd/samsung/s2mps11.h +f:include/linux/mfd/samsung/s2mps13.h +f:include/linux/mfd/samsung/s2mps14.h +f:include/linux/mfd/samsung/s2mps15.h +f:include/linux/mfd/samsung/s2mpu02.h +f:include/linux/mfd/samsung/s2mpu05.h +f:include/linux/mfd/samsung/s5m8767.h +f:include/linux/mfd/sc27xx-pmic.h +f:include/linux/mfd/si476x-core.h +f:include/linux/mfd/si476x-platform.h +f:include/linux/mfd/si476x-reports.h +f:include/linux/mfd/sky81452.h +f:include/linux/mfd/stm32-lptimer.h +f:include/linux/mfd/stm32-timers.h +f:include/linux/mfd/stmfx.h +f:include/linux/mfd/stmpe.h +f:include/linux/mfd/stpmic1.h +f:include/linux/mfd/stw481x.h +f:include/linux/mfd/sun4i-gpadc.h +f:include/linux/mfd/sy7636a.h +f:include/linux/mfd/syscon.h +f:include/linux/mfd/syscon/atmel-matrix.h +f:include/linux/mfd/syscon/atmel-mc.h +f:include/linux/mfd/syscon/atmel-smc.h +f:include/linux/mfd/syscon/atmel-st.h +f:include/linux/mfd/syscon/clps711x.h +f:include/linux/mfd/syscon/imx6q-iomuxc-gpr.h +f:include/linux/mfd/syscon/imx7-iomuxc-gpr.h +f:include/linux/mfd/syscon/xlnx-vcu.h +f:include/linux/mfd/tc3589x.h +f:include/linux/mfd/ti-lmu-register.h +f:include/linux/mfd/ti-lmu.h +f:include/linux/mfd/ti_am335x_tscadc.h +f:include/linux/mfd/tps6105x.h +f:include/linux/mfd/tps65010.h +f:include/linux/mfd/tps6507x.h +f:include/linux/mfd/tps65086.h +f:include/linux/mfd/tps65090.h +f:include/linux/mfd/tps65217.h +f:include/linux/mfd/tps65218.h +f:include/linux/mfd/tps65219.h +f:include/linux/mfd/tps6586x.h +f:include/linux/mfd/tps65910.h +f:include/linux/mfd/tps65912.h +f:include/linux/mfd/tps6594.h +f:include/linux/mfd/tps68470.h +f:include/linux/mfd/twl.h +f:include/linux/mfd/twl4030-audio.h +f:include/linux/mfd/twl6040.h +f:include/linux/mfd/ucb1x00.h +f:include/linux/mfd/upboard-fpga.h +f:include/linux/mfd/viperboard.h +f:include/linux/mfd/wcd934x/registers.h +f:include/linux/mfd/wcd934x/wcd934x.h +f:include/linux/mfd/wl1273-core.h +f:include/linux/mfd/wm831x/auxadc.h +f:include/linux/mfd/wm831x/core.h +f:include/linux/mfd/wm831x/gpio.h +f:include/linux/mfd/wm831x/irq.h +f:include/linux/mfd/wm831x/otp.h +f:include/linux/mfd/wm831x/pdata.h +f:include/linux/mfd/wm831x/pmu.h +f:include/linux/mfd/wm831x/regulator.h +f:include/linux/mfd/wm831x/status.h +f:include/linux/mfd/wm831x/watchdog.h +f:include/linux/mfd/wm8350/audio.h +f:include/linux/mfd/wm8350/comparator.h +f:include/linux/mfd/wm8350/core.h +f:include/linux/mfd/wm8350/gpio.h +f:include/linux/mfd/wm8350/pmic.h +f:include/linux/mfd/wm8350/rtc.h +f:include/linux/mfd/wm8350/supply.h +f:include/linux/mfd/wm8350/wdt.h +f:include/linux/mfd/wm8400-audio.h +f:include/linux/mfd/wm8400-private.h +f:include/linux/mfd/wm8400.h +f:include/linux/mfd/wm8994/core.h +f:include/linux/mfd/wm8994/gpio.h +f:include/linux/mfd/wm8994/pdata.h +f:include/linux/mfd/wm8994/registers.h +f:include/linux/mfd/wm97xx.h +f:include/linux/mhi.h +f:include/linux/mhi_ep.h +f:include/linux/micrel_phy.h +f:include/linux/microchipphy.h +f:include/linux/migrate.h +f:include/linux/migrate_mode.h +f:include/linux/mii.h +f:include/linux/mii_timestamper.h +f:include/linux/min_heap.h +f:include/linux/minmax.h +f:include/linux/misc/keba.h +f:include/linux/misc_cgroup.h +f:include/linux/miscdevice.h +f:include/linux/mlx4/cmd.h +f:include/linux/mlx4/cq.h +f:include/linux/mlx4/device.h +f:include/linux/mlx4/doorbell.h +f:include/linux/mlx4/driver.h +f:include/linux/mlx4/qp.h +f:include/linux/mlx4/srq.h +f:include/linux/mlx5/cq.h +f:include/linux/mlx5/device.h +f:include/linux/mlx5/doorbell.h +f:include/linux/mlx5/driver.h +f:include/linux/mlx5/eq.h +f:include/linux/mlx5/eswitch.h +f:include/linux/mlx5/fs.h +f:include/linux/mlx5/fs_helpers.h +f:include/linux/mlx5/macsec.h +f:include/linux/mlx5/mlx5_ifc.h +f:include/linux/mlx5/mlx5_ifc_fpga.h +f:include/linux/mlx5/mlx5_ifc_vdpa.h +f:include/linux/mlx5/mpfs.h +f:include/linux/mlx5/port.h +f:include/linux/mlx5/qp.h +f:include/linux/mlx5/rsc_dump.h +f:include/linux/mlx5/transobj.h +f:include/linux/mlx5/vport.h +f:include/linux/mm.h +f:include/linux/mm_api.h +f:include/linux/mm_inline.h +f:include/linux/mm_types.h +f:include/linux/mm_types_task.h +f:include/linux/mman.h +f:include/linux/mmap_lock.h +f:include/linux/mmc/card.h +f:include/linux/mmc/core.h +f:include/linux/mmc/host.h +f:include/linux/mmc/mmc.h +f:include/linux/mmc/pm.h +f:include/linux/mmc/sd.h +f:include/linux/mmc/sd_uhs2.h +f:include/linux/mmc/sdio.h +f:include/linux/mmc/sdio_func.h +f:include/linux/mmc/sdio_ids.h +f:include/linux/mmc/slot-gpio.h +f:include/linux/mmdebug.h +f:include/linux/mmiotrace.h +f:include/linux/mmu_context.h +f:include/linux/mmu_notifier.h +f:include/linux/mmzone.h +f:include/linux/mnt_idmapping.h +f:include/linux/mnt_namespace.h +f:include/linux/mod_devicetable.h +f:include/linux/module.h +f:include/linux/module_signature.h +f:include/linux/module_symbol.h +f:include/linux/moduleloader.h +f:include/linux/moduleparam.h +f:include/linux/most.h +f:include/linux/mount.h +f:include/linux/moxtet.h +f:include/linux/mpage.h +f:include/linux/mpi.h +f:include/linux/mpls.h +f:include/linux/mpls_iptunnel.h +f:include/linux/mroute.h +f:include/linux/mroute6.h +f:include/linux/mroute_base.h +f:include/linux/msdos_fs.h +f:include/linux/msdos_partition.h +f:include/linux/msg.h +f:include/linux/msi.h +f:include/linux/msi_api.h +f:include/linux/mtd/bbm.h +f:include/linux/mtd/blktrans.h +f:include/linux/mtd/cfi.h +f:include/linux/mtd/cfi_endian.h +f:include/linux/mtd/concat.h +f:include/linux/mtd/doc2000.h +f:include/linux/mtd/flashchip.h +f:include/linux/mtd/ftl.h +f:include/linux/mtd/gen_probe.h +f:include/linux/mtd/hyperbus.h +f:include/linux/mtd/inftl.h +f:include/linux/mtd/jedec.h +f:include/linux/mtd/lpc32xx_mlc.h +f:include/linux/mtd/lpc32xx_slc.h +f:include/linux/mtd/map.h +f:include/linux/mtd/mtd.h +f:include/linux/mtd/mtdram.h +f:include/linux/mtd/nand-ecc-mtk.h +f:include/linux/mtd/nand-ecc-mxic.h +f:include/linux/mtd/nand-ecc-sw-bch.h +f:include/linux/mtd/nand-ecc-sw-hamming.h +f:include/linux/mtd/nand-gpio.h +f:include/linux/mtd/nand-qpic-common.h +f:include/linux/mtd/nand.h +f:include/linux/mtd/ndfc.h +f:include/linux/mtd/nftl.h +f:include/linux/mtd/onenand.h +f:include/linux/mtd/onenand_regs.h +f:include/linux/mtd/onfi.h +f:include/linux/mtd/partitions.h +f:include/linux/mtd/pfow.h +f:include/linux/mtd/physmap.h +f:include/linux/mtd/pismo.h +f:include/linux/mtd/plat-ram.h +f:include/linux/mtd/platnand.h +f:include/linux/mtd/qinfo.h +f:include/linux/mtd/rawnand.h +f:include/linux/mtd/sh_flctl.h +f:include/linux/mtd/sharpsl.h +f:include/linux/mtd/spear_smi.h +f:include/linux/mtd/spi-nor.h +f:include/linux/mtd/spinand.h +f:include/linux/mtd/super.h +f:include/linux/mtd/ubi.h +f:include/linux/mtd/xip.h +f:include/linux/mtio.h +f:include/linux/mutex.h +f:include/linux/mutex_api.h +f:include/linux/mutex_types.h +f:include/linux/mux/consumer.h +f:include/linux/mux/driver.h +f:include/linux/mv643xx_eth.h +f:include/linux/mv643xx_i2c.h +f:include/linux/mvebu-pmsu.h +f:include/linux/mxm-wmi.h +f:include/linux/namei.h +f:include/linux/nd.h +f:include/linux/ndctl.h +f:include/linux/net.h +f:include/linux/net/intel/i40e_client.h +f:include/linux/net/intel/iidc_rdma.h +f:include/linux/net/intel/iidc_rdma_ice.h +f:include/linux/net/intel/iidc_rdma_idpf.h +f:include/linux/net/intel/libie/adminq.h +f:include/linux/net/intel/libie/pctype.h +f:include/linux/net/intel/libie/rx.h +f:include/linux/net_tstamp.h +f:include/linux/netdev_features.h +f:include/linux/netdevice.h +f:include/linux/netdevice_xmit.h +f:include/linux/netfilter.h +f:include/linux/netfilter/ipset/ip_set.h +f:include/linux/netfilter/ipset/ip_set_bitmap.h +f:include/linux/netfilter/ipset/ip_set_getport.h +f:include/linux/netfilter/ipset/ip_set_hash.h +f:include/linux/netfilter/ipset/ip_set_list.h +f:include/linux/netfilter/ipset/pfxlen.h +f:include/linux/netfilter/nf_conntrack_amanda.h +f:include/linux/netfilter/nf_conntrack_common.h +f:include/linux/netfilter/nf_conntrack_ftp.h +f:include/linux/netfilter/nf_conntrack_h323.h +f:include/linux/netfilter/nf_conntrack_h323_asn1.h +f:include/linux/netfilter/nf_conntrack_h323_types.h +f:include/linux/netfilter/nf_conntrack_irc.h +f:include/linux/netfilter/nf_conntrack_pptp.h +f:include/linux/netfilter/nf_conntrack_proto_gre.h +f:include/linux/netfilter/nf_conntrack_sane.h +f:include/linux/netfilter/nf_conntrack_sctp.h +f:include/linux/netfilter/nf_conntrack_sip.h +f:include/linux/netfilter/nf_conntrack_snmp.h +f:include/linux/netfilter/nf_conntrack_tcp.h +f:include/linux/netfilter/nf_conntrack_tftp.h +f:include/linux/netfilter/nf_conntrack_zones_common.h +f:include/linux/netfilter/nfnetlink.h +f:include/linux/netfilter/nfnetlink_acct.h +f:include/linux/netfilter/nfnetlink_osf.h +f:include/linux/netfilter/x_tables.h +f:include/linux/netfilter_arp/arp_tables.h +f:include/linux/netfilter_bridge.h +f:include/linux/netfilter_bridge/ebtables.h +f:include/linux/netfilter_defs.h +f:include/linux/netfilter_ipv4.h +f:include/linux/netfilter_ipv4/ip_tables.h +f:include/linux/netfilter_ipv6.h +f:include/linux/netfilter_ipv6/ip6_tables.h +f:include/linux/netfilter_netdev.h +f:include/linux/netfs.h +f:include/linux/netlink.h +f:include/linux/netpoll.h +f:include/linux/nfs.h +f:include/linux/nfs3.h +f:include/linux/nfs4.h +f:include/linux/nfs_common.h +f:include/linux/nfs_fs.h +f:include/linux/nfs_fs_i.h +f:include/linux/nfs_fs_sb.h +f:include/linux/nfs_iostat.h +f:include/linux/nfs_page.h +f:include/linux/nfs_ssc.h +f:include/linux/nfs_xdr.h +f:include/linux/nfsacl.h +f:include/linux/nfslocalio.h +f:include/linux/nitro_enclaves.h +f:include/linux/nl802154.h +f:include/linux/nls.h +f:include/linux/nmi.h +f:include/linux/node.h +f:include/linux/nodemask.h +f:include/linux/nodemask_types.h +f:include/linux/nospec.h +f:include/linux/notifier.h +f:include/linux/ns_common.h +f:include/linux/nsc_gpio.h +f:include/linux/nsproxy.h +f:include/linux/ntb.h +f:include/linux/ntb_transport.h +f:include/linux/nubus.h +f:include/linux/numa.h +f:include/linux/numa_memblks.h +f:include/linux/nvme-auth.h +f:include/linux/nvme-fc-driver.h +f:include/linux/nvme-fc.h +f:include/linux/nvme-keyring.h +f:include/linux/nvme-rdma.h +f:include/linux/nvme-tcp.h +f:include/linux/nvme.h +f:include/linux/nvmem-consumer.h +f:include/linux/nvmem-provider.h +f:include/linux/nvram.h +f:include/linux/oa_tc6.h +f:include/linux/objagg.h +f:include/linux/objpool.h +f:include/linux/objtool.h +f:include/linux/objtool_types.h +f:include/linux/of.h +f:include/linux/of_address.h +f:include/linux/of_clk.h +f:include/linux/of_device.h +f:include/linux/of_dma.h +f:include/linux/of_fdt.h +f:include/linux/of_gpio.h +f:include/linux/of_graph.h +f:include/linux/of_iommu.h +f:include/linux/of_irq.h +f:include/linux/of_mdio.h +f:include/linux/of_net.h +f:include/linux/of_pci.h +f:include/linux/of_pdt.h +f:include/linux/of_platform.h +f:include/linux/of_reserved_mem.h +f:include/linux/oid_registry.h +f:include/linux/olpc-ec.h +f:include/linux/omap-dma.h +f:include/linux/omap-gpmc.h +f:include/linux/omap-iommu.h +f:include/linux/omap-mailbox.h +f:include/linux/omapfb.h +f:include/linux/once.h +f:include/linux/once_lite.h +f:include/linux/oom.h +f:include/linux/openvswitch.h +f:include/linux/osq_lock.h +f:include/linux/overflow.h +f:include/linux/packing.h +f:include/linux/padata.h +f:include/linux/page-flags-layout.h +f:include/linux/page-flags.h +f:include/linux/page-isolation.h +f:include/linux/page_counter.h +f:include/linux/page_ext.h +f:include/linux/page_frag_cache.h +f:include/linux/page_idle.h +f:include/linux/page_owner.h +f:include/linux/page_ref.h +f:include/linux/page_reporting.h +f:include/linux/page_table_check.h +f:include/linux/pageblock-flags.h +f:include/linux/pagemap.h +f:include/linux/pagevec.h +f:include/linux/pagewalk.h +f:include/linux/panic.h +f:include/linux/panic_notifier.h +f:include/linux/papr_scm.h +f:include/linux/parman.h +f:include/linux/parport.h +f:include/linux/parport_pc.h +f:include/linux/parser.h +f:include/linux/part_stat.h +f:include/linux/pata_arasan_cf_data.h +f:include/linux/patchkey.h +f:include/linux/path.h +f:include/linux/pch_dma.h +f:include/linux/pci-acpi.h +f:include/linux/pci-ats.h +f:include/linux/pci-bwctrl.h +f:include/linux/pci-doe.h +f:include/linux/pci-ecam.h +f:include/linux/pci-ep-cfs.h +f:include/linux/pci-epc.h +f:include/linux/pci-epf.h +f:include/linux/pci-p2pdma.h +f:include/linux/pci-pwrctrl.h +f:include/linux/pci-tph.h +f:include/linux/pci.h +f:include/linux/pci_hotplug.h +f:include/linux/pci_ids.h +f:include/linux/pcie-dwc.h +f:include/linux/pcs-lynx.h +f:include/linux/pcs-rzn1-miic.h +f:include/linux/pcs/pcs-mtk-lynxi.h +f:include/linux/pcs/pcs-xpcs.h +f:include/linux/pds/pds_adminq.h +f:include/linux/pds/pds_auxbus.h +f:include/linux/pds/pds_common.h +f:include/linux/pds/pds_core_if.h +f:include/linux/pds/pds_intr.h +f:include/linux/pe.h +f:include/linux/peci-cpu.h +f:include/linux/peci.h +f:include/linux/percpu-defs.h +f:include/linux/percpu-refcount.h +f:include/linux/percpu-rwsem.h +f:include/linux/percpu.h +f:include/linux/percpu_counter.h +f:include/linux/perf/arm_pmu.h +f:include/linux/perf/arm_pmuv3.h +f:include/linux/perf/riscv_pmu.h +f:include/linux/perf_event.h +f:include/linux/perf_event_api.h +f:include/linux/perf_regs.h +f:include/linux/personality.h +f:include/linux/pfn.h +f:include/linux/pgalloc_tag.h +f:include/linux/pgtable.h +f:include/linux/pgtable_api.h +f:include/linux/phonet.h +f:include/linux/phy.h +f:include/linux/phy/omap_control_phy.h +f:include/linux/phy/omap_usb.h +f:include/linux/phy/pcie.h +f:include/linux/phy/phy-dp.h +f:include/linux/phy/phy-hdmi.h +f:include/linux/phy/phy-lvds.h +f:include/linux/phy/phy-mipi-dphy.h +f:include/linux/phy/phy-sun4i-usb.h +f:include/linux/phy/phy.h +f:include/linux/phy/tegra/xusb.h +f:include/linux/phy/ulpi_phy.h +f:include/linux/phy_fixed.h +f:include/linux/phy_led_triggers.h +f:include/linux/phy_link_topology.h +f:include/linux/phylib_stubs.h +f:include/linux/phylink.h +f:include/linux/pid.h +f:include/linux/pid_namespace.h +f:include/linux/pid_types.h +f:include/linux/pidfs.h +f:include/linux/pim.h +f:include/linux/pinctrl/consumer.h +f:include/linux/pinctrl/devinfo.h +f:include/linux/pinctrl/machine.h +f:include/linux/pinctrl/pinconf-generic.h +f:include/linux/pinctrl/pinconf.h +f:include/linux/pinctrl/pinctrl-state.h +f:include/linux/pinctrl/pinctrl.h +f:include/linux/pinctrl/pinmux.h +f:include/linux/pipe_fs_i.h +f:include/linux/pkeys.h +f:include/linux/pl320-ipc.h +f:include/linux/platform_data/ad5761.h +f:include/linux/platform_data/ad7266.h +f:include/linux/platform_data/ad7791.h +f:include/linux/platform_data/ad7793.h +f:include/linux/platform_data/ad7887.h +f:include/linux/platform_data/adau17x1.h +f:include/linux/platform_data/adp8860.h +f:include/linux/platform_data/adp8870.h +f:include/linux/platform_data/ads7828.h +f:include/linux/platform_data/amd_qdma.h +f:include/linux/platform_data/amd_xdma.h +f:include/linux/platform_data/ams-delta-fiq.h +f:include/linux/platform_data/apds990x.h +f:include/linux/platform_data/arm-ux500-pm.h +f:include/linux/platform_data/asoc-imx-ssi.h +f:include/linux/platform_data/asoc-kirkwood.h +f:include/linux/platform_data/asoc-pxa.h +f:include/linux/platform_data/asoc-s3c.h +f:include/linux/platform_data/asoc-ti-mcbsp.h +f:include/linux/platform_data/ata-pxa.h +f:include/linux/platform_data/atmel.h +f:include/linux/platform_data/b53.h +f:include/linux/platform_data/bcm7038_wdt.h +f:include/linux/platform_data/bcmgenet.h +f:include/linux/platform_data/bd6107.h +f:include/linux/platform_data/bh1770glc.h +f:include/linux/platform_data/brcmfmac.h +f:include/linux/platform_data/brcmnand.h +f:include/linux/platform_data/clk-da8xx-cfgchip.h +f:include/linux/platform_data/clk-fch.h +f:include/linux/platform_data/cpuidle-exynos.h +f:include/linux/platform_data/cros_ec_chardev.h +f:include/linux/platform_data/cros_ec_commands.h +f:include/linux/platform_data/cros_ec_proto.h +f:include/linux/platform_data/cros_ec_sensorhub.h +f:include/linux/platform_data/cros_usbpd_notify.h +f:include/linux/platform_data/crypto-ux500.h +f:include/linux/platform_data/davinci-cpufreq.h +f:include/linux/platform_data/davinci_asp.h +f:include/linux/platform_data/dma-dw.h +f:include/linux/platform_data/dma-hsu.h +f:include/linux/platform_data/dma-iop32x.h +f:include/linux/platform_data/dma-mcf-edma.h +f:include/linux/platform_data/dma-mv_xor.h +f:include/linux/platform_data/dmtimer-omap.h +f:include/linux/platform_data/ds620.h +f:include/linux/platform_data/dsa.h +f:include/linux/platform_data/edma.h +f:include/linux/platform_data/elm.h +f:include/linux/platform_data/emc2305.h +f:include/linux/platform_data/emif_plat.h +f:include/linux/platform_data/g762.h +f:include/linux/platform_data/gpio-htc-egpio.h +f:include/linux/platform_data/gpio-omap.h +f:include/linux/platform_data/gpio/gpio-amd-fch.h +f:include/linux/platform_data/gpio_backlight.h +f:include/linux/platform_data/gpmc-omap.h +f:include/linux/platform_data/gsc_hwmon.h +f:include/linux/platform_data/hirschmann-hellcreek.h +f:include/linux/platform_data/hsmmc-omap.h +f:include/linux/platform_data/huawei-gaokun-ec.h +f:include/linux/platform_data/hwmon-s3c.h +f:include/linux/platform_data/i2c-gpio.h +f:include/linux/platform_data/i2c-imx.h +f:include/linux/platform_data/i2c-mux-gpio.h +f:include/linux/platform_data/i2c-mux-reg.h +f:include/linux/platform_data/i2c-ocores.h +f:include/linux/platform_data/i2c-omap.h +f:include/linux/platform_data/i2c-pca-platform.h +f:include/linux/platform_data/i2c-pxa.h +f:include/linux/platform_data/i2c-s3c2410.h +f:include/linux/platform_data/i2c-xiic.h +f:include/linux/platform_data/ina2xx.h +f:include/linux/platform_data/invensense_mpu6050.h +f:include/linux/platform_data/iommu-omap.h +f:include/linux/platform_data/isl9305.h +f:include/linux/platform_data/itco_wdt.h +f:include/linux/platform_data/keyboard-spear.h +f:include/linux/platform_data/keypad-omap.h +f:include/linux/platform_data/keypad-pxa27x.h +f:include/linux/platform_data/lcd-mipid.h +f:include/linux/platform_data/leds-lm355x.h +f:include/linux/platform_data/leds-lm3642.h +f:include/linux/platform_data/leds-lp55xx.h +f:include/linux/platform_data/lenovo-yoga-c630.h +f:include/linux/platform_data/lm3630a_bl.h +f:include/linux/platform_data/lm3639_bl.h +f:include/linux/platform_data/lm8323.h +f:include/linux/platform_data/lp855x.h +f:include/linux/platform_data/lp8727.h +f:include/linux/platform_data/lp8755.h +f:include/linux/platform_data/ltc4245.h +f:include/linux/platform_data/lv5207lp.h +f:include/linux/platform_data/max197.h +f:include/linux/platform_data/max3421-hcd.h +f:include/linux/platform_data/max732x.h +f:include/linux/platform_data/mdio-bcm-unimac.h +f:include/linux/platform_data/mdio-gpio.h +f:include/linux/platform_data/media/camera-pxa.h +f:include/linux/platform_data/media/mmp-camera.h +f:include/linux/platform_data/media/si4713.h +f:include/linux/platform_data/media/timb_radio.h +f:include/linux/platform_data/media/timb_video.h +f:include/linux/platform_data/mfd-mcp-sa11x0.h +f:include/linux/platform_data/microchip-ksz.h +f:include/linux/platform_data/mlxcpld.h +f:include/linux/platform_data/mlxreg.h +f:include/linux/platform_data/mmc-davinci.h +f:include/linux/platform_data/mmc-esdhc-mcf.h +f:include/linux/platform_data/mmc-mxcmmc.h +f:include/linux/platform_data/mmc-omap.h +f:include/linux/platform_data/mmc-pxamci.h +f:include/linux/platform_data/mmc-sdhci-s3c.h +f:include/linux/platform_data/mmp_dma.h +f:include/linux/platform_data/mtd-nand-omap2.h +f:include/linux/platform_data/mtd-nand-pxa3xx.h +f:include/linux/platform_data/mtd-nand-s3c2410.h +f:include/linux/platform_data/mtd-orion_nand.h +f:include/linux/platform_data/mv88e6xxx.h +f:include/linux/platform_data/mv_usb.h +f:include/linux/platform_data/net-cw1200.h +f:include/linux/platform_data/omap-twl4030.h +f:include/linux/platform_data/omap-wd-timer.h +f:include/linux/platform_data/omap1_bl.h +f:include/linux/platform_data/omapdss.h +f:include/linux/platform_data/pca953x.h +f:include/linux/platform_data/phy-da8xx-usb.h +f:include/linux/platform_data/pinctrl-single.h +f:include/linux/platform_data/pm33xx.h +f:include/linux/platform_data/pxa2xx_udc.h +f:include/linux/platform_data/pxa_sdhci.h +f:include/linux/platform_data/regulator-haptic.h +f:include/linux/platform_data/s3c-hsotg.h +f:include/linux/platform_data/sa11x0-serial.h +f:include/linux/platform_data/sc18is602.h +f:include/linux/platform_data/sdhci-pic32.h +f:include/linux/platform_data/serial-omap.h +f:include/linux/platform_data/serial-sccnxp.h +f:include/linux/platform_data/sgi-w1.h +f:include/linux/platform_data/sh_mmcif.h +f:include/linux/platform_data/shmob_drm.h +f:include/linux/platform_data/shtc1.h +f:include/linux/platform_data/si5351.h +f:include/linux/platform_data/simplefb.h +f:include/linux/platform_data/spi-davinci.h +f:include/linux/platform_data/spi-mt65xx.h +f:include/linux/platform_data/spi-omap2-mcspi.h +f:include/linux/platform_data/spi-s3c64xx.h +f:include/linux/platform_data/st_sensors_pdata.h +f:include/linux/platform_data/tda9950.h +f:include/linux/platform_data/ti-prm.h +f:include/linux/platform_data/ti-sysc.h +f:include/linux/platform_data/tmio.h +f:include/linux/platform_data/touchscreen-s3c2410.h +f:include/linux/platform_data/tps68470.h +f:include/linux/platform_data/tsc2007.h +f:include/linux/platform_data/tsl2772.h +f:include/linux/platform_data/txx9/ndfmc.h +f:include/linux/platform_data/uio_dmem_genirq.h +f:include/linux/platform_data/usb-davinci.h +f:include/linux/platform_data/usb-ehci-orion.h +f:include/linux/platform_data/usb-musb-ux500.h +f:include/linux/platform_data/usb-ohci-pxa27x.h +f:include/linux/platform_data/usb-ohci-s3c2410.h +f:include/linux/platform_data/usb-omap.h +f:include/linux/platform_data/usb-omap1.h +f:include/linux/platform_data/usb3503.h +f:include/linux/platform_data/video-ep93xx.h +f:include/linux/platform_data/video-pxafb.h +f:include/linux/platform_data/video_s3c.h +f:include/linux/platform_data/voltage-omap.h +f:include/linux/platform_data/wilco-ec.h +f:include/linux/platform_data/wiznet.h +f:include/linux/platform_data/wkup_m3.h +f:include/linux/platform_data/x86/amd-fch.h +f:include/linux/platform_data/x86/apple.h +f:include/linux/platform_data/x86/asus-wmi.h +f:include/linux/platform_data/x86/clk-lpss.h +f:include/linux/platform_data/x86/clk-pmc-atom.h +f:include/linux/platform_data/x86/int3472.h +f:include/linux/platform_data/x86/intel-mid_wdt.h +f:include/linux/platform_data/x86/intel_pmc_ipc.h +f:include/linux/platform_data/x86/intel_scu_ipc.h +f:include/linux/platform_data/x86/nvidia-wmi-ec-backlight.h +f:include/linux/platform_data/x86/p2sb.h +f:include/linux/platform_data/x86/pmc_atom.h +f:include/linux/platform_data/x86/pwm-lpss.h +f:include/linux/platform_data/x86/simatic-ipc-base.h +f:include/linux/platform_data/x86/simatic-ipc.h +f:include/linux/platform_data/x86/soc.h +f:include/linux/platform_data/x86/spi-intel.h +f:include/linux/platform_data/xilinx-ll-temac.h +f:include/linux/platform_data/xtalk-bridge.h +f:include/linux/platform_device.h +f:include/linux/platform_profile.h +f:include/linux/pldmfw.h +f:include/linux/plist.h +f:include/linux/plist_types.h +f:include/linux/pm-trace.h +f:include/linux/pm.h +f:include/linux/pm_clock.h +f:include/linux/pm_domain.h +f:include/linux/pm_opp.h +f:include/linux/pm_qos.h +f:include/linux/pm_runtime.h +f:include/linux/pm_wakeirq.h +f:include/linux/pm_wakeup.h +f:include/linux/pmbus.h +f:include/linux/pmu.h +f:include/linux/pnp.h +f:include/linux/poison.h +f:include/linux/poll.h +f:include/linux/polynomial.h +f:include/linux/posix-clock.h +f:include/linux/posix-timers.h +f:include/linux/posix-timers_types.h +f:include/linux/posix_acl.h +f:include/linux/posix_acl_xattr.h +f:include/linux/power/bq2415x_charger.h +f:include/linux/power/bq24190_charger.h +f:include/linux/power/bq24735-charger.h +f:include/linux/power/bq25890_charger.h +f:include/linux/power/bq27xxx_battery.h +f:include/linux/power/charger-manager.h +f:include/linux/power/gpio-charger.h +f:include/linux/power/jz4740-battery.h +f:include/linux/power/max17042_battery.h +f:include/linux/power/max77705_charger.h +f:include/linux/power/power_on_reason.h +f:include/linux/power/sbs-battery.h +f:include/linux/power/smartreflex.h +f:include/linux/power/twl4030_madc_battery.h +f:include/linux/power_supply.h +f:include/linux/powercap.h +f:include/linux/ppp-comp.h +f:include/linux/ppp_channel.h +f:include/linux/ppp_defs.h +f:include/linux/pps_gen_kernel.h +f:include/linux/pps_kernel.h +f:include/linux/pr.h +f:include/linux/prandom.h +f:include/linux/preempt.h +f:include/linux/prefetch.h +f:include/linux/prime_numbers.h +f:include/linux/printk.h +f:include/linux/prmt.h +f:include/linux/proc_fs.h +f:include/linux/proc_ns.h +f:include/linux/processor.h +f:include/linux/profile.h +f:include/linux/projid.h +f:include/linux/property.h +f:include/linux/pruss_driver.h +f:include/linux/psci.h +f:include/linux/pse-pd/pse.h +f:include/linux/pseudo_fs.h +f:include/linux/psi.h +f:include/linux/psi_types.h +f:include/linux/psp-platform-access.h +f:include/linux/psp-sev.h +f:include/linux/psp-tee.h +f:include/linux/psp.h +f:include/linux/pstore.h +f:include/linux/pstore_blk.h +f:include/linux/pstore_ram.h +f:include/linux/pstore_zone.h +f:include/linux/ptdump.h +f:include/linux/pti.h +f:include/linux/ptp_classify.h +f:include/linux/ptp_clock_kernel.h +f:include/linux/ptp_kvm.h +f:include/linux/ptp_mock.h +f:include/linux/ptp_pch.h +f:include/linux/ptr_ring.h +f:include/linux/ptrace.h +f:include/linux/ptrace_api.h +f:include/linux/purgatory.h +f:include/linux/pvclock_gtod.h +f:include/linux/pwm.h +f:include/linux/pwm_backlight.h +f:include/linux/pwrseq/consumer.h +f:include/linux/pwrseq/provider.h +f:include/linux/pxa168_eth.h +f:include/linux/pxa2xx_ssp.h +f:include/linux/qat/qat_mig_dev.h +f:include/linux/qed/common_hsi.h +f:include/linux/qed/eth_common.h +f:include/linux/qed/fcoe_common.h +f:include/linux/qed/iscsi_common.h +f:include/linux/qed/iwarp_common.h +f:include/linux/qed/nvmetcp_common.h +f:include/linux/qed/qed_chain.h +f:include/linux/qed/qed_eth_if.h +f:include/linux/qed/qed_fcoe_if.h +f:include/linux/qed/qed_if.h +f:include/linux/qed/qed_iov_if.h +f:include/linux/qed/qed_iscsi_if.h +f:include/linux/qed/qed_ll2_if.h +f:include/linux/qed/qed_nvmetcp_if.h +f:include/linux/qed/qed_rdma_if.h +f:include/linux/qed/qede_rdma.h +f:include/linux/qed/rdma_common.h +f:include/linux/qed/roce_common.h +f:include/linux/qed/storage_common.h +f:include/linux/qed/tcp_common.h +f:include/linux/qnx6_fs.h +f:include/linux/quota.h +f:include/linux/quotaops.h +f:include/linux/radix-tree.h +f:include/linux/raid/detect.h +f:include/linux/raid/pq.h +f:include/linux/raid/xor.h +f:include/linux/raid_class.h +f:include/linux/ramfs.h +f:include/linux/random.h +f:include/linux/randomize_kstack.h +f:include/linux/range.h +f:include/linux/ras.h +f:include/linux/ratelimit.h +f:include/linux/ratelimit_types.h +f:include/linux/rational.h +f:include/linux/rbtree.h +f:include/linux/rbtree_augmented.h +f:include/linux/rbtree_latch.h +f:include/linux/rbtree_types.h +f:include/linux/rcu_node_tree.h +f:include/linux/rcu_notifier.h +f:include/linux/rcu_segcblist.h +f:include/linux/rcu_sync.h +f:include/linux/rculist.h +f:include/linux/rculist_bl.h +f:include/linux/rculist_nulls.h +f:include/linux/rcupdate.h +f:include/linux/rcupdate_trace.h +f:include/linux/rcupdate_wait.h +f:include/linux/rcuref.h +f:include/linux/rcutiny.h +f:include/linux/rcutree.h +f:include/linux/rcuwait.h +f:include/linux/rcuwait_api.h +f:include/linux/reboot-mode.h +f:include/linux/reboot.h +f:include/linux/reciprocal_div.h +f:include/linux/ref_tracker.h +f:include/linux/refcount.h +f:include/linux/refcount_api.h +f:include/linux/refcount_types.h +f:include/linux/regmap.h +f:include/linux/regset.h +f:include/linux/regulator/act8865.h +f:include/linux/regulator/arizona-ldo1.h +f:include/linux/regulator/arizona-micsupp.h +f:include/linux/regulator/consumer.h +f:include/linux/regulator/coupler.h +f:include/linux/regulator/da9121.h +f:include/linux/regulator/da9211.h +f:include/linux/regulator/db8500-prcmu.h +f:include/linux/regulator/driver.h +f:include/linux/regulator/fan53555.h +f:include/linux/regulator/fixed.h +f:include/linux/regulator/gpio-regulator.h +f:include/linux/regulator/lp3971.h +f:include/linux/regulator/lp3972.h +f:include/linux/regulator/lp872x.h +f:include/linux/regulator/machine.h +f:include/linux/regulator/max1586.h +f:include/linux/regulator/max8649.h +f:include/linux/regulator/max8660.h +f:include/linux/regulator/max8952.h +f:include/linux/regulator/max8973-regulator.h +f:include/linux/regulator/mt6311.h +f:include/linux/regulator/mt6315-regulator.h +f:include/linux/regulator/mt6323-regulator.h +f:include/linux/regulator/mt6331-regulator.h +f:include/linux/regulator/mt6332-regulator.h +f:include/linux/regulator/mt6357-regulator.h +f:include/linux/regulator/mt6358-regulator.h +f:include/linux/regulator/mt6359-regulator.h +f:include/linux/regulator/mt6380-regulator.h +f:include/linux/regulator/mt6397-regulator.h +f:include/linux/regulator/of_regulator.h +f:include/linux/regulator/pca9450.h +f:include/linux/regulator/pfuze100.h +f:include/linux/regulator/tps51632-regulator.h +f:include/linux/regulator/tps62360.h +f:include/linux/regulator/tps6507x.h +f:include/linux/regulator/userspace-consumer.h +f:include/linux/relay.h +f:include/linux/remoteproc.h +f:include/linux/remoteproc/mtk_scp.h +f:include/linux/remoteproc/pruss.h +f:include/linux/remoteproc/qcom_rproc.h +f:include/linux/remoteproc/st_slim_rproc.h +f:include/linux/resctrl.h +f:include/linux/resctrl_types.h +f:include/linux/reset-controller.h +f:include/linux/reset.h +f:include/linux/reset/bcm63xx_pmb.h +f:include/linux/reset/reset-simple.h +f:include/linux/reset/socfpga.h +f:include/linux/reset/sunxi.h +f:include/linux/resource.h +f:include/linux/resource_ext.h +f:include/linux/restart_block.h +f:include/linux/resume_user_mode.h +f:include/linux/rethook.h +f:include/linux/rfkill.h +f:include/linux/rhashtable-types.h +f:include/linux/rhashtable.h +f:include/linux/ring_buffer.h +f:include/linux/rio.h +f:include/linux/rio_drv.h +f:include/linux/rio_ids.h +f:include/linux/rio_regs.h +f:include/linux/rmap.h +f:include/linux/rmi.h +f:include/linux/rndis.h +f:include/linux/rodata_test.h +f:include/linux/rolling_buffer.h +f:include/linux/root_dev.h +f:include/linux/rpmb.h +f:include/linux/rpmsg.h +f:include/linux/rpmsg/byteorder.h +f:include/linux/rpmsg/mtk_rpmsg.h +f:include/linux/rpmsg/ns.h +f:include/linux/rpmsg/qcom_glink.h +f:include/linux/rpmsg/qcom_smd.h +f:include/linux/rseq.h +f:include/linux/rslib.h +f:include/linux/rtc.h +f:include/linux/rtc/ds1286.h +f:include/linux/rtc/ds1307.h +f:include/linux/rtc/ds1685.h +f:include/linux/rtc/m48t59.h +f:include/linux/rtc/rtc-omap.h +f:include/linux/rtmutex.h +f:include/linux/rtnetlink.h +f:include/linux/rtsx_common.h +f:include/linux/rtsx_pci.h +f:include/linux/rtsx_usb.h +f:include/linux/rv.h +f:include/linux/rw_hint.h +f:include/linux/rwbase_rt.h +f:include/linux/rwlock.h +f:include/linux/rwlock_api_smp.h +f:include/linux/rwlock_rt.h +f:include/linux/rwlock_types.h +f:include/linux/rwsem.h +f:include/linux/sbitmap.h +f:include/linux/scatterlist.h +f:include/linux/scc.h +f:include/linux/sched.h +f:include/linux/sched/affinity.h +f:include/linux/sched/autogroup.h +f:include/linux/sched/clock.h +f:include/linux/sched/cond_resched.h +f:include/linux/sched/coredump.h +f:include/linux/sched/cpufreq.h +f:include/linux/sched/cputime.h +f:include/linux/sched/deadline.h +f:include/linux/sched/debug.h +f:include/linux/sched/ext.h +f:include/linux/sched/hotplug.h +f:include/linux/sched/idle.h +f:include/linux/sched/init.h +f:include/linux/sched/isolation.h +f:include/linux/sched/jobctl.h +f:include/linux/sched/loadavg.h +f:include/linux/sched/mm.h +f:include/linux/sched/nohz.h +f:include/linux/sched/numa_balancing.h +f:include/linux/sched/posix-timers.h +f:include/linux/sched/prio.h +f:include/linux/sched/rseq_api.h +f:include/linux/sched/rt.h +f:include/linux/sched/sd_flags.h +f:include/linux/sched/signal.h +f:include/linux/sched/smt.h +f:include/linux/sched/stat.h +f:include/linux/sched/sysctl.h +f:include/linux/sched/task.h +f:include/linux/sched/task_flags.h +f:include/linux/sched/task_stack.h +f:include/linux/sched/thread_info_api.h +f:include/linux/sched/topology.h +f:include/linux/sched/types.h +f:include/linux/sched/user.h +f:include/linux/sched/vhost_task.h +f:include/linux/sched/wake_q.h +f:include/linux/sched/xacct.h +f:include/linux/sched_clock.h +f:include/linux/scmi_imx_protocol.h +f:include/linux/scmi_protocol.h +f:include/linux/scpi_protocol.h +f:include/linux/screen_info.h +f:include/linux/scs.h +f:include/linux/sctp.h +f:include/linux/scx200.h +f:include/linux/scx200_gpio.h +f:include/linux/seccomp.h +f:include/linux/seccomp_types.h +f:include/linux/secretmem.h +f:include/linux/securebits.h +f:include/linux/security.h +f:include/linux/sed-opal-key.h +f:include/linux/sed-opal.h +f:include/linux/seg6.h +f:include/linux/seg6_genl.h +f:include/linux/seg6_hmac.h +f:include/linux/seg6_iptunnel.h +f:include/linux/seg6_local.h +f:include/linux/selection.h +f:include/linux/sem.h +f:include/linux/sem_types.h +f:include/linux/semaphore.h +f:include/linux/seq_buf.h +f:include/linux/seq_file.h +f:include/linux/seq_file_net.h +f:include/linux/seqlock.h +f:include/linux/seqlock_api.h +f:include/linux/seqlock_types.h +f:include/linux/serdev.h +f:include/linux/serial.h +f:include/linux/serial_8250.h +f:include/linux/serial_bcm63xx.h +f:include/linux/serial_core.h +f:include/linux/serial_s3c.h +f:include/linux/serial_sci.h +f:include/linux/serio.h +f:include/linux/set_memory.h +f:include/linux/sfp.h +f:include/linux/sh_clk.h +f:include/linux/sh_dma.h +f:include/linux/sh_eth.h +f:include/linux/sh_intc.h +f:include/linux/sh_timer.h +f:include/linux/shdma-base.h +f:include/linux/shm.h +f:include/linux/shmem_fs.h +f:include/linux/shrinker.h +f:include/linux/signal.h +f:include/linux/signal_types.h +f:include/linux/signalfd.h +f:include/linux/siox.h +f:include/linux/siphash.h +f:include/linux/sizes.h +f:include/linux/skb_array.h +f:include/linux/skbuff.h +f:include/linux/skbuff_ref.h +f:include/linux/skmsg.h +f:include/linux/slab.h +f:include/linux/slimbus.h +f:include/linux/sm501-regs.h +f:include/linux/sm501.h +f:include/linux/smc91x.h +f:include/linux/smp.h +f:include/linux/smp_types.h +f:include/linux/smpboot.h +f:include/linux/smsc911x.h +f:include/linux/smscphy.h +f:include/linux/soc/actions/owl-sps.h +f:include/linux/soc/amd/isp4_misc.h +f:include/linux/soc/amlogic/meson-canvas.h +f:include/linux/soc/andes/irq.h +f:include/linux/soc/apple/rtkit.h +f:include/linux/soc/apple/sart.h +f:include/linux/soc/brcmstb/brcmstb.h +f:include/linux/soc/cirrus/ep93xx.h +f:include/linux/soc/dove/pmu.h +f:include/linux/soc/ixp4xx/cpu.h +f:include/linux/soc/ixp4xx/npe.h +f:include/linux/soc/ixp4xx/qmgr.h +f:include/linux/soc/marvell/octeontx2/asm.h +f:include/linux/soc/marvell/silicons.h +f:include/linux/soc/mediatek/dvfsrc.h +f:include/linux/soc/mediatek/infracfg.h +f:include/linux/soc/mediatek/mtk-cmdq.h +f:include/linux/soc/mediatek/mtk-mmsys.h +f:include/linux/soc/mediatek/mtk-mutex.h +f:include/linux/soc/mediatek/mtk_sip_svc.h +f:include/linux/soc/mediatek/mtk_wed.h +f:include/linux/soc/mmp/cputype.h +f:include/linux/soc/nxp/lpc32xx-misc.h +f:include/linux/soc/pxa/cpu.h +f:include/linux/soc/pxa/mfp.h +f:include/linux/soc/pxa/smemc.h +f:include/linux/soc/qcom/apr.h +f:include/linux/soc/qcom/geni-se.h +f:include/linux/soc/qcom/irq.h +f:include/linux/soc/qcom/llcc-qcom.h +f:include/linux/soc/qcom/mdt_loader.h +f:include/linux/soc/qcom/pdr.h +f:include/linux/soc/qcom/pmic_glink.h +f:include/linux/soc/qcom/qcom-pbs.h +f:include/linux/soc/qcom/qcom_aoss.h +f:include/linux/soc/qcom/qmi.h +f:include/linux/soc/qcom/smd-rpm.h +f:include/linux/soc/qcom/smem.h +f:include/linux/soc/qcom/smem_state.h +f:include/linux/soc/qcom/socinfo.h +f:include/linux/soc/qcom/ubwc.h +f:include/linux/soc/qcom/wcnss_ctrl.h +f:include/linux/soc/renesas/r9a06g032-sysctrl.h +f:include/linux/soc/renesas/rcar-rst.h +f:include/linux/soc/renesas/rcar-sysc.h +f:include/linux/soc/samsung/exynos-chipid.h +f:include/linux/soc/samsung/exynos-pmu.h +f:include/linux/soc/samsung/exynos-regs-pmu.h +f:include/linux/soc/samsung/s3c-pm.h +f:include/linux/soc/sunxi/sunxi_sram.h +f:include/linux/soc/ti/k3-ringacc.h +f:include/linux/soc/ti/knav_dma.h +f:include/linux/soc/ti/knav_qmss.h +f:include/linux/soc/ti/omap1-io.h +f:include/linux/soc/ti/omap1-mux.h +f:include/linux/soc/ti/omap1-soc.h +f:include/linux/soc/ti/omap1-usb.h +f:include/linux/soc/ti/ti-msgmgr.h +f:include/linux/soc/ti/ti_sci_inta_msi.h +f:include/linux/soc/ti/ti_sci_protocol.h +f:include/linux/sock_diag.h +f:include/linux/socket.h +f:include/linux/sockptr.h +f:include/linux/softirq.h +f:include/linux/sonet.h +f:include/linux/sonypi.h +f:include/linux/sort.h +f:include/linux/sound.h +f:include/linux/soundcard.h +f:include/linux/soundwire/sdw.h +f:include/linux/soundwire/sdw_amd.h +f:include/linux/soundwire/sdw_intel.h +f:include/linux/soundwire/sdw_registers.h +f:include/linux/soundwire/sdw_type.h +f:include/linux/spi/ad7877.h +f:include/linux/spi/ads7846.h +f:include/linux/spi/altera.h +f:include/linux/spi/at73c213.h +f:include/linux/spi/corgi_lcd.h +f:include/linux/spi/ds1305.h +f:include/linux/spi/eeprom.h +f:include/linux/spi/flash.h +f:include/linux/spi/libertas_spi.h +f:include/linux/spi/max7301.h +f:include/linux/spi/mc33880.h +f:include/linux/spi/mmc_spi.h +f:include/linux/spi/mxs-spi.h +f:include/linux/spi/offload/consumer.h +f:include/linux/spi/offload/provider.h +f:include/linux/spi/offload/types.h +f:include/linux/spi/sh_hspi.h +f:include/linux/spi/sh_msiof.h +f:include/linux/spi/spi-fsl-dspi.h +f:include/linux/spi/spi-mem.h +f:include/linux/spi/spi.h +f:include/linux/spi/spi_bitbang.h +f:include/linux/spi/spi_gpio.h +f:include/linux/spi/spi_oc_tiny.h +f:include/linux/spi/tdo24m.h +f:include/linux/spi/tle62x0.h +f:include/linux/spi/xilinx_spi.h +f:include/linux/spinlock.h +f:include/linux/spinlock_api.h +f:include/linux/spinlock_api_smp.h +f:include/linux/spinlock_api_up.h +f:include/linux/spinlock_rt.h +f:include/linux/spinlock_types.h +f:include/linux/spinlock_types_raw.h +f:include/linux/spinlock_types_up.h +f:include/linux/spinlock_up.h +f:include/linux/splice.h +f:include/linux/spmi.h +f:include/linux/sprintf.h +f:include/linux/sram.h +f:include/linux/srcu.h +f:include/linux/srcutiny.h +f:include/linux/srcutree.h +f:include/linux/ssb/ssb.h +f:include/linux/ssb/ssb_driver_chipcommon.h +f:include/linux/ssb/ssb_driver_extif.h +f:include/linux/ssb/ssb_driver_gige.h +f:include/linux/ssb/ssb_driver_mips.h +f:include/linux/ssb/ssb_driver_pci.h +f:include/linux/ssb/ssb_embedded.h +f:include/linux/ssb/ssb_regs.h +f:include/linux/ssbi.h +f:include/linux/stackdepot.h +f:include/linux/stackprotector.h +f:include/linux/stacktrace.h +f:include/linux/start_kernel.h +f:include/linux/stat.h +f:include/linux/statfs.h +f:include/linux/static_call.h +f:include/linux/static_call_types.h +f:include/linux/static_key.h +f:include/linux/stdarg.h +f:include/linux/stddef.h +f:include/linux/stm.h +f:include/linux/stmmac.h +f:include/linux/stmp3xxx_rtc_wdt.h +f:include/linux/stmp_device.h +f:include/linux/stop_machine.h +f:include/linux/string.h +f:include/linux/string_choices.h +f:include/linux/string_helpers.h +f:include/linux/stringhash.h +f:include/linux/stringify.h +f:include/linux/sungem_phy.h +f:include/linux/sunrpc/addr.h +f:include/linux/sunrpc/auth.h +f:include/linux/sunrpc/auth_gss.h +f:include/linux/sunrpc/bc_xprt.h +f:include/linux/sunrpc/cache.h +f:include/linux/sunrpc/clnt.h +f:include/linux/sunrpc/debug.h +f:include/linux/sunrpc/gss_api.h +f:include/linux/sunrpc/gss_err.h +f:include/linux/sunrpc/gss_krb5.h +f:include/linux/sunrpc/metrics.h +f:include/linux/sunrpc/msg_prot.h +f:include/linux/sunrpc/rdma_rn.h +f:include/linux/sunrpc/rpc_pipe_fs.h +f:include/linux/sunrpc/rpc_rdma.h +f:include/linux/sunrpc/rpc_rdma_cid.h +f:include/linux/sunrpc/sched.h +f:include/linux/sunrpc/stats.h +f:include/linux/sunrpc/svc.h +f:include/linux/sunrpc/svc_rdma.h +f:include/linux/sunrpc/svc_rdma_pcl.h +f:include/linux/sunrpc/svc_xprt.h +f:include/linux/sunrpc/svcauth.h +f:include/linux/sunrpc/svcauth_gss.h +f:include/linux/sunrpc/svcsock.h +f:include/linux/sunrpc/timer.h +f:include/linux/sunrpc/types.h +f:include/linux/sunrpc/xdr.h +f:include/linux/sunrpc/xdrgen/_builtins.h +f:include/linux/sunrpc/xdrgen/_defs.h +f:include/linux/sunrpc/xdrgen/nfs4_1.h +f:include/linux/sunrpc/xprt.h +f:include/linux/sunrpc/xprtmultipath.h +f:include/linux/sunrpc/xprtrdma.h +f:include/linux/sunrpc/xprtsock.h +f:include/linux/sunserialcore.h +f:include/linux/sunxi-rsb.h +f:include/linux/surface_acpi_notify.h +f:include/linux/surface_aggregator/controller.h +f:include/linux/surface_aggregator/device.h +f:include/linux/surface_aggregator/serial_hub.h +f:include/linux/suspend.h +f:include/linux/svga.h +f:include/linux/sw842.h +f:include/linux/swab.h +f:include/linux/swait.h +f:include/linux/swait_api.h +f:include/linux/swap.h +f:include/linux/swap_cgroup.h +f:include/linux/swapfile.h +f:include/linux/swapops.h +f:include/linux/swiotlb.h +f:include/linux/switchtec.h +f:include/linux/sxgbe_platform.h +f:include/linux/sync_core.h +f:include/linux/sync_file.h +f:include/linux/synclink.h +f:include/linux/sys.h +f:include/linux/sys_soc.h +f:include/linux/syscall_user_dispatch.h +f:include/linux/syscall_user_dispatch_types.h +f:include/linux/syscalls.h +f:include/linux/syscalls_api.h +f:include/linux/syscore_ops.h +f:include/linux/sysctl.h +f:include/linux/sysfb.h +f:include/linux/sysfs.h +f:include/linux/syslog.h +f:include/linux/sysrq.h +f:include/linux/t10-pi.h +f:include/linux/task_io_accounting.h +f:include/linux/task_io_accounting_ops.h +f:include/linux/task_work.h +f:include/linux/taskstats_kern.h +f:include/linux/tboot.h +f:include/linux/tc.h +f:include/linux/tca6416_keypad.h +f:include/linux/tcp.h +f:include/linux/tee_core.h +f:include/linux/tee_drv.h +f:include/linux/tegra-icc.h +f:include/linux/termios_internal.h +f:include/linux/text-patching.h +f:include/linux/textsearch.h +f:include/linux/textsearch_fsm.h +f:include/linux/thermal.h +f:include/linux/thread_info.h +f:include/linux/threads.h +f:include/linux/thunderbolt.h +f:include/linux/ti-emif-sram.h +f:include/linux/ti_wilink_st.h +f:include/linux/tick.h +f:include/linux/tifm.h +f:include/linux/timb_dma.h +f:include/linux/timb_gpio.h +f:include/linux/time.h +f:include/linux/time32.h +f:include/linux/time64.h +f:include/linux/time_namespace.h +f:include/linux/timecounter.h +f:include/linux/timekeeper_internal.h +f:include/linux/timekeeping.h +f:include/linux/timer.h +f:include/linux/timer_types.h +f:include/linux/timerfd.h +f:include/linux/timeriomem-rng.h +f:include/linux/timerqueue.h +f:include/linux/timerqueue_types.h +f:include/linux/timex.h +f:include/linux/tnum.h +f:include/linux/topology.h +f:include/linux/torture.h +f:include/linux/toshiba.h +f:include/linux/tpm.h +f:include/linux/tpm_command.h +f:include/linux/tpm_eventlog.h +f:include/linux/tpm_svsm.h +f:include/linux/trace.h +f:include/linux/trace_clock.h +f:include/linux/trace_events.h +f:include/linux/trace_recursion.h +f:include/linux/trace_seq.h +f:include/linux/tracefs.h +f:include/linux/tracepoint-defs.h +f:include/linux/tracepoint.h +f:include/linux/transport_class.h +f:include/linux/ts-nbus.h +f:include/linux/tsacct_kern.h +f:include/linux/tsm-mr.h +f:include/linux/tsm.h +f:include/linux/tty.h +f:include/linux/tty_buffer.h +f:include/linux/tty_driver.h +f:include/linux/tty_flip.h +f:include/linux/tty_ldisc.h +f:include/linux/tty_port.h +f:include/linux/turris-omnia-mcu-interface.h +f:include/linux/turris-signing-key.h +f:include/linux/typecheck.h +f:include/linux/types.h +f:include/linux/u64_stats_sync.h +f:include/linux/u64_stats_sync_api.h +f:include/linux/uacce.h +f:include/linux/uaccess.h +f:include/linux/ubsan.h +f:include/linux/ucopysize.h +f:include/linux/ucs2_string.h +f:include/linux/udp.h +f:include/linux/uidgid.h +f:include/linux/uidgid_types.h +f:include/linux/uio.h +f:include/linux/uio_driver.h +f:include/linux/ulpi/driver.h +f:include/linux/ulpi/interface.h +f:include/linux/ulpi/regs.h +f:include/linux/umh.h +f:include/linux/unaligned.h +f:include/linux/unaligned/packed_struct.h +f:include/linux/unicode.h +f:include/linux/union_find.h +f:include/linux/units.h +f:include/linux/unroll.h +f:include/linux/uprobes.h +f:include/linux/usb.h +f:include/linux/usb/audio-v2.h +f:include/linux/usb/audio-v3.h +f:include/linux/usb/audio.h +f:include/linux/usb/c67x00.h +f:include/linux/usb/ccid.h +f:include/linux/usb/cdc-wdm.h +f:include/linux/usb/cdc.h +f:include/linux/usb/cdc_ncm.h +f:include/linux/usb/ch9.h +f:include/linux/usb/chipidea.h +f:include/linux/usb/composite.h +f:include/linux/usb/ehci-dbgp.h +f:include/linux/usb/ehci_def.h +f:include/linux/usb/ehci_pdriver.h +f:include/linux/usb/ezusb.h +f:include/linux/usb/func_utils.h +f:include/linux/usb/functionfs.h +f:include/linux/usb/g_hid.h +f:include/linux/usb/gadget.h +f:include/linux/usb/gadget_configfs.h +f:include/linux/usb/hcd.h +f:include/linux/usb/input.h +f:include/linux/usb/iowarrior.h +f:include/linux/usb/irda.h +f:include/linux/usb/isp116x.h +f:include/linux/usb/isp1301.h +f:include/linux/usb/isp1362.h +f:include/linux/usb/ljca.h +f:include/linux/usb/m66592.h +f:include/linux/usb/mctp-usb.h +f:include/linux/usb/midi-v2.h +f:include/linux/usb/musb-ux500.h +f:include/linux/usb/musb.h +f:include/linux/usb/net2280.h +f:include/linux/usb/of.h +f:include/linux/usb/ohci_pdriver.h +f:include/linux/usb/onboard_dev.h +f:include/linux/usb/otg-fsm.h +f:include/linux/usb/otg.h +f:include/linux/usb/pd.h +f:include/linux/usb/pd_ado.h +f:include/linux/usb/pd_bdo.h +f:include/linux/usb/pd_ext_sdb.h +f:include/linux/usb/pd_vdo.h +f:include/linux/usb/phy.h +f:include/linux/usb/phy_companion.h +f:include/linux/usb/quirks.h +f:include/linux/usb/r8152.h +f:include/linux/usb/r8a66597.h +f:include/linux/usb/renesas_usbhs.h +f:include/linux/usb/rndis_host.h +f:include/linux/usb/role.h +f:include/linux/usb/rzv2m_usb3drd.h +f:include/linux/usb/serial.h +f:include/linux/usb/sl811.h +f:include/linux/usb/storage.h +f:include/linux/usb/tcpci.h +f:include/linux/usb/tcpm.h +f:include/linux/usb/tegra_usb_phy.h +f:include/linux/usb/typec.h +f:include/linux/usb/typec_altmode.h +f:include/linux/usb/typec_dp.h +f:include/linux/usb/typec_mux.h +f:include/linux/usb/typec_retimer.h +f:include/linux/usb/typec_tbt.h +f:include/linux/usb/uas.h +f:include/linux/usb/ulpi.h +f:include/linux/usb/usb338x.h +f:include/linux/usb/usb_phy_generic.h +f:include/linux/usb/usbnet.h +f:include/linux/usb/uvc.h +f:include/linux/usb/webusb.h +f:include/linux/usb/xhci-dbgp.h +f:include/linux/usb/xhci-sideband.h +f:include/linux/usb_usual.h +f:include/linux/usbdevice_fs.h +f:include/linux/user-return-notifier.h +f:include/linux/user.h +f:include/linux/user_events.h +f:include/linux/user_namespace.h +f:include/linux/userfaultfd_k.h +f:include/linux/util_macros.h +f:include/linux/uts.h +f:include/linux/utsname.h +f:include/linux/uuid.h +f:include/linux/vbox_utils.h +f:include/linux/vdpa.h +f:include/linux/vdso_datastore.h +f:include/linux/verification.h +f:include/linux/vermagic.h +f:include/linux/vexpress.h +f:include/linux/vfio.h +f:include/linux/vfio_pci_core.h +f:include/linux/vfs.h +f:include/linux/vfsdebug.h +f:include/linux/vga_switcheroo.h +f:include/linux/vgaarb.h +f:include/linux/vhost_iotlb.h +f:include/linux/via-core.h +f:include/linux/via.h +f:include/linux/via_i2c.h +f:include/linux/videodev2.h +f:include/linux/virtio.h +f:include/linux/virtio_anchor.h +f:include/linux/virtio_byteorder.h +f:include/linux/virtio_caif.h +f:include/linux/virtio_config.h +f:include/linux/virtio_dma_buf.h +f:include/linux/virtio_features.h +f:include/linux/virtio_net.h +f:include/linux/virtio_pci_admin.h +f:include/linux/virtio_pci_legacy.h +f:include/linux/virtio_pci_modern.h +f:include/linux/virtio_ring.h +f:include/linux/virtio_vsock.h +f:include/linux/vm_event_item.h +f:include/linux/vmalloc.h +f:include/linux/vmcore_info.h +f:include/linux/vmpressure.h +f:include/linux/vmstat.h +f:include/linux/vmw_vmci_api.h +f:include/linux/vmw_vmci_defs.h +f:include/linux/vringh.h +f:include/linux/vt.h +f:include/linux/vt_buffer.h +f:include/linux/vt_kern.h +f:include/linux/vtime.h +f:include/linux/w1.h +f:include/linux/wait.h +f:include/linux/wait_api.h +f:include/linux/wait_bit.h +f:include/linux/watch_queue.h +f:include/linux/watchdog.h +f:include/linux/win_minmax.h +f:include/linux/wireless.h +f:include/linux/wkup_m3_ipc.h +f:include/linux/wm97xx.h +f:include/linux/wmi.h +f:include/linux/wordpart.h +f:include/linux/workqueue.h +f:include/linux/workqueue_api.h +f:include/linux/workqueue_types.h +f:include/linux/writeback.h +f:include/linux/ww_mutex.h +f:include/linux/wwan.h +f:include/linux/xarray.h +f:include/linux/xattr.h +f:include/linux/xxhash.h +f:include/linux/xz.h +f:include/linux/yam.h +f:include/linux/zconf.h +f:include/linux/zlib.h +f:include/linux/zorro.h +f:include/linux/zpool.h +f:include/linux/zsmalloc.h +f:include/linux/zstd.h +f:include/linux/zstd_errors.h +f:include/linux/zstd_lib.h +f:include/linux/zswap.h +f:include/linux/zutil.h +f:include/math-emu/double.h +f:include/math-emu/op-1.h +f:include/math-emu/op-2.h +f:include/math-emu/op-4.h +f:include/math-emu/op-8.h +f:include/math-emu/op-common.h +f:include/math-emu/quad.h +f:include/math-emu/single.h +f:include/math-emu/soft-fp.h +f:include/media/cec-notifier.h +f:include/media/cec-pin.h +f:include/media/cec.h +f:include/media/davinci/vpfe_types.h +f:include/media/davinci/vpif_types.h +f:include/media/demux.h +f:include/media/dmxdev.h +f:include/media/drv-intf/cx2341x.h +f:include/media/drv-intf/cx25840.h +f:include/media/drv-intf/exynos-fimc.h +f:include/media/drv-intf/msp3400.h +f:include/media/drv-intf/renesas-ceu.h +f:include/media/drv-intf/s3c_camif.h +f:include/media/drv-intf/saa7146.h +f:include/media/drv-intf/saa7146_vv.h +f:include/media/drv-intf/sh_vou.h +f:include/media/drv-intf/si476x.h +f:include/media/drv-intf/tea575x.h +f:include/media/dvb-usb-ids.h +f:include/media/dvb_ca_en50221.h +f:include/media/dvb_demux.h +f:include/media/dvb_frontend.h +f:include/media/dvb_net.h +f:include/media/dvb_ringbuffer.h +f:include/media/dvb_vb2.h +f:include/media/dvbdev.h +f:include/media/frame_vector.h +f:include/media/i2c/adp1653.h +f:include/media/i2c/adv7183.h +f:include/media/i2c/adv7343.h +f:include/media/i2c/adv7393.h +f:include/media/i2c/adv7511.h +f:include/media/i2c/adv7604.h +f:include/media/i2c/adv7842.h +f:include/media/i2c/ak881x.h +f:include/media/i2c/bt819.h +f:include/media/i2c/cs5345.h +f:include/media/i2c/cs53l32a.h +f:include/media/i2c/ds90ub9xx.h +f:include/media/i2c/ir-kbd-i2c.h +f:include/media/i2c/lm3560.h +f:include/media/i2c/lm3646.h +f:include/media/i2c/m52790.h +f:include/media/i2c/mt9t112.h +f:include/media/i2c/mt9v011.h +f:include/media/i2c/mt9v022.h +f:include/media/i2c/mt9v032.h +f:include/media/i2c/ov2659.h +f:include/media/i2c/ov7670.h +f:include/media/i2c/ov772x.h +f:include/media/i2c/rj54n1cb0c.h +f:include/media/i2c/saa6588.h +f:include/media/i2c/saa7115.h +f:include/media/i2c/saa7127.h +f:include/media/i2c/tc358743.h +f:include/media/i2c/tda1997x.h +f:include/media/i2c/ths7303.h +f:include/media/i2c/tvaudio.h +f:include/media/i2c/tvp514x.h +f:include/media/i2c/tvp7002.h +f:include/media/i2c/tw9910.h +f:include/media/i2c/uda1342.h +f:include/media/i2c/upd64031a.h +f:include/media/i2c/upd64083.h +f:include/media/i2c/wm8775.h +f:include/media/imx.h +f:include/media/ipu-bridge.h +f:include/media/ipu6-pci-table.h +f:include/media/jpeg.h +f:include/media/media-dev-allocator.h +f:include/media/media-device.h +f:include/media/media-devnode.h +f:include/media/media-entity.h +f:include/media/media-request.h +f:include/media/mipi-csi2.h +f:include/media/rc-core.h +f:include/media/rc-map.h +f:include/media/rcar-fcp.h +f:include/media/tpg/v4l2-tpg.h +f:include/media/tuner-types.h +f:include/media/tuner.h +f:include/media/tveeprom.h +f:include/media/v4l2-async.h +f:include/media/v4l2-cci.h +f:include/media/v4l2-common.h +f:include/media/v4l2-ctrls.h +f:include/media/v4l2-dev.h +f:include/media/v4l2-device.h +f:include/media/v4l2-dv-timings.h +f:include/media/v4l2-event.h +f:include/media/v4l2-fh.h +f:include/media/v4l2-flash-led-class.h +f:include/media/v4l2-fwnode.h +f:include/media/v4l2-h264.h +f:include/media/v4l2-image-sizes.h +f:include/media/v4l2-ioctl.h +f:include/media/v4l2-jpeg.h +f:include/media/v4l2-mc.h +f:include/media/v4l2-mediabus.h +f:include/media/v4l2-mem2mem.h +f:include/media/v4l2-rect.h +f:include/media/v4l2-subdev.h +f:include/media/v4l2-vp9.h +f:include/media/videobuf2-core.h +f:include/media/videobuf2-dma-contig.h +f:include/media/videobuf2-dma-sg.h +f:include/media/videobuf2-dvb.h +f:include/media/videobuf2-memops.h +f:include/media/videobuf2-v4l2.h +f:include/media/videobuf2-vmalloc.h +f:include/media/vsp1.h +f:include/memory/renesas-rpc-if.h +f:include/misc/altera.h +f:include/misc/ocxl-config.h +f:include/misc/ocxl.h +f:include/net/6lowpan.h +f:include/net/9p/9p.h +f:include/net/9p/client.h +f:include/net/9p/transport.h +f:include/net/Space.h +f:include/net/act_api.h +f:include/net/addrconf.h +f:include/net/af_ieee802154.h +f:include/net/af_rxrpc.h +f:include/net/af_unix.h +f:include/net/af_vsock.h +f:include/net/ah.h +f:include/net/aligned_data.h +f:include/net/amt.h +f:include/net/arp.h +f:include/net/atmclip.h +f:include/net/ax25.h +f:include/net/ax88796.h +f:include/net/bareudp.h +f:include/net/bluetooth/bluetooth.h +f:include/net/bluetooth/coredump.h +f:include/net/bluetooth/hci.h +f:include/net/bluetooth/hci_core.h +f:include/net/bluetooth/hci_drv.h +f:include/net/bluetooth/hci_mon.h +f:include/net/bluetooth/hci_sock.h +f:include/net/bluetooth/hci_sync.h +f:include/net/bluetooth/iso.h +f:include/net/bluetooth/l2cap.h +f:include/net/bluetooth/mgmt.h +f:include/net/bluetooth/rfcomm.h +f:include/net/bluetooth/sco.h +f:include/net/bond_3ad.h +f:include/net/bond_alb.h +f:include/net/bond_options.h +f:include/net/bonding.h +f:include/net/bpf_sk_storage.h +f:include/net/busy_poll.h +f:include/net/caif/caif_dev.h +f:include/net/caif/caif_device.h +f:include/net/caif/caif_layer.h +f:include/net/caif/cfcnfg.h +f:include/net/caif/cfctrl.h +f:include/net/caif/cffrml.h +f:include/net/caif/cfmuxl.h +f:include/net/caif/cfpkt.h +f:include/net/caif/cfserl.h +f:include/net/caif/cfsrvl.h +f:include/net/calipso.h +f:include/net/cfg80211-wext.h +f:include/net/cfg80211.h +f:include/net/cfg802154.h +f:include/net/checksum.h +f:include/net/cipso_ipv4.h +f:include/net/cls_cgroup.h +f:include/net/codel.h +f:include/net/codel_impl.h +f:include/net/codel_qdisc.h +f:include/net/compat.h +f:include/net/datalink.h +f:include/net/dcbevent.h +f:include/net/dcbnl.h +f:include/net/devlink.h +f:include/net/dropreason-core.h +f:include/net/dropreason.h +f:include/net/dsa.h +f:include/net/dsa_stubs.h +f:include/net/dscp.h +f:include/net/dsfield.h +f:include/net/dst.h +f:include/net/dst_cache.h +f:include/net/dst_metadata.h +f:include/net/dst_ops.h +f:include/net/eee.h +f:include/net/erspan.h +f:include/net/esp.h +f:include/net/espintcp.h +f:include/net/ethoc.h +f:include/net/failover.h +f:include/net/fib_notifier.h +f:include/net/fib_rules.h +f:include/net/firewire.h +f:include/net/flow.h +f:include/net/flow_dissector.h +f:include/net/flow_offload.h +f:include/net/fou.h +f:include/net/fq.h +f:include/net/fq_impl.h +f:include/net/garp.h +f:include/net/gen_stats.h +f:include/net/genetlink.h +f:include/net/geneve.h +f:include/net/gre.h +f:include/net/gro.h +f:include/net/gro_cells.h +f:include/net/gso.h +f:include/net/gtp.h +f:include/net/gue.h +f:include/net/handshake.h +f:include/net/hotdata.h +f:include/net/hwbm.h +f:include/net/icmp.h +f:include/net/ieee80211_radiotap.h +f:include/net/ieee802154_netdev.h +f:include/net/ieee8021q.h +f:include/net/if_inet6.h +f:include/net/ife.h +f:include/net/inet6_connection_sock.h +f:include/net/inet6_hashtables.h +f:include/net/inet_common.h +f:include/net/inet_connection_sock.h +f:include/net/inet_dscp.h +f:include/net/inet_ecn.h +f:include/net/inet_frag.h +f:include/net/inet_hashtables.h +f:include/net/inet_sock.h +f:include/net/inet_timewait_sock.h +f:include/net/inetpeer.h +f:include/net/ioam6.h +f:include/net/ip.h +f:include/net/ip6_checksum.h +f:include/net/ip6_fib.h +f:include/net/ip6_route.h +f:include/net/ip6_tunnel.h +f:include/net/ip_fib.h +f:include/net/ip_tunnels.h +f:include/net/ip_vs.h +f:include/net/ipcomp.h +f:include/net/ipconfig.h +f:include/net/ipv6.h +f:include/net/ipv6_frag.h +f:include/net/ipv6_stubs.h +f:include/net/iucv/af_iucv.h +f:include/net/iucv/iucv.h +f:include/net/iw_handler.h +f:include/net/kcm.h +f:include/net/l3mdev.h +f:include/net/lag.h +f:include/net/lapb.h +f:include/net/libeth/cache.h +f:include/net/libeth/rx.h +f:include/net/libeth/tx.h +f:include/net/libeth/types.h +f:include/net/libeth/xdp.h +f:include/net/libeth/xsk.h +f:include/net/llc.h +f:include/net/llc_c_ac.h +f:include/net/llc_c_ev.h +f:include/net/llc_c_st.h +f:include/net/llc_conn.h +f:include/net/llc_if.h +f:include/net/llc_pdu.h +f:include/net/llc_s_ac.h +f:include/net/llc_s_ev.h +f:include/net/llc_s_st.h +f:include/net/llc_sap.h +f:include/net/lwtunnel.h +f:include/net/mac80211.h +f:include/net/mac802154.h +f:include/net/macsec.h +f:include/net/mana/gdma.h +f:include/net/mana/hw_channel.h +f:include/net/mana/mana.h +f:include/net/mana/mana_auxiliary.h +f:include/net/mana/shm_channel.h +f:include/net/mctp.h +f:include/net/mctpdevice.h +f:include/net/mip6.h +f:include/net/mld.h +f:include/net/mpls.h +f:include/net/mpls_iptunnel.h +f:include/net/mptcp.h +f:include/net/mrp.h +f:include/net/ncsi.h +f:include/net/ndisc.h +f:include/net/neighbour.h +f:include/net/neighbour_tables.h +f:include/net/net_debug.h +f:include/net/net_failover.h +f:include/net/net_namespace.h +f:include/net/net_ratelimit.h +f:include/net/net_shaper.h +f:include/net/net_trackers.h +f:include/net/netdev_lock.h +f:include/net/netdev_netlink.h +f:include/net/netdev_queues.h +f:include/net/netdev_rx_queue.h +f:include/net/netevent.h +f:include/net/netfilter/br_netfilter.h +f:include/net/netfilter/ipv4/nf_conntrack_ipv4.h +f:include/net/netfilter/ipv4/nf_defrag_ipv4.h +f:include/net/netfilter/ipv4/nf_dup_ipv4.h +f:include/net/netfilter/ipv4/nf_reject.h +f:include/net/netfilter/ipv6/nf_conntrack_ipv6.h +f:include/net/netfilter/ipv6/nf_defrag_ipv6.h +f:include/net/netfilter/ipv6/nf_dup_ipv6.h +f:include/net/netfilter/ipv6/nf_reject.h +f:include/net/netfilter/nf_bpf_link.h +f:include/net/netfilter/nf_conntrack.h +f:include/net/netfilter/nf_conntrack_acct.h +f:include/net/netfilter/nf_conntrack_act_ct.h +f:include/net/netfilter/nf_conntrack_bpf.h +f:include/net/netfilter/nf_conntrack_bridge.h +f:include/net/netfilter/nf_conntrack_core.h +f:include/net/netfilter/nf_conntrack_count.h +f:include/net/netfilter/nf_conntrack_ecache.h +f:include/net/netfilter/nf_conntrack_expect.h +f:include/net/netfilter/nf_conntrack_extend.h +f:include/net/netfilter/nf_conntrack_helper.h +f:include/net/netfilter/nf_conntrack_l4proto.h +f:include/net/netfilter/nf_conntrack_labels.h +f:include/net/netfilter/nf_conntrack_seqadj.h +f:include/net/netfilter/nf_conntrack_synproxy.h +f:include/net/netfilter/nf_conntrack_timeout.h +f:include/net/netfilter/nf_conntrack_timestamp.h +f:include/net/netfilter/nf_conntrack_tuple.h +f:include/net/netfilter/nf_conntrack_zones.h +f:include/net/netfilter/nf_dup_netdev.h +f:include/net/netfilter/nf_flow_table.h +f:include/net/netfilter/nf_hooks_lwtunnel.h +f:include/net/netfilter/nf_log.h +f:include/net/netfilter/nf_nat.h +f:include/net/netfilter/nf_nat_helper.h +f:include/net/netfilter/nf_nat_masquerade.h +f:include/net/netfilter/nf_nat_redirect.h +f:include/net/netfilter/nf_queue.h +f:include/net/netfilter/nf_reject.h +f:include/net/netfilter/nf_socket.h +f:include/net/netfilter/nf_synproxy.h +f:include/net/netfilter/nf_tables.h +f:include/net/netfilter/nf_tables_core.h +f:include/net/netfilter/nf_tables_ipv4.h +f:include/net/netfilter/nf_tables_ipv6.h +f:include/net/netfilter/nf_tables_offload.h +f:include/net/netfilter/nf_tproxy.h +f:include/net/netfilter/nft_fib.h +f:include/net/netfilter/nft_meta.h +f:include/net/netfilter/nft_reject.h +f:include/net/netfilter/xt_rateest.h +f:include/net/netkit.h +f:include/net/netlabel.h +f:include/net/netlink.h +f:include/net/netmem.h +f:include/net/netns/bpf.h +f:include/net/netns/can.h +f:include/net/netns/conntrack.h +f:include/net/netns/core.h +f:include/net/netns/flow_table.h +f:include/net/netns/generic.h +f:include/net/netns/hash.h +f:include/net/netns/ieee802154_6lowpan.h +f:include/net/netns/ipv4.h +f:include/net/netns/ipv6.h +f:include/net/netns/mctp.h +f:include/net/netns/mib.h +f:include/net/netns/mpls.h +f:include/net/netns/netfilter.h +f:include/net/netns/nexthop.h +f:include/net/netns/nftables.h +f:include/net/netns/packet.h +f:include/net/netns/sctp.h +f:include/net/netns/smc.h +f:include/net/netns/unix.h +f:include/net/netns/xdp.h +f:include/net/netns/xfrm.h +f:include/net/netprio_cgroup.h +f:include/net/netrom.h +f:include/net/nexthop.h +f:include/net/nfc/digital.h +f:include/net/nfc/hci.h +f:include/net/nfc/llc.h +f:include/net/nfc/nci.h +f:include/net/nfc/nci_core.h +f:include/net/nfc/nfc.h +f:include/net/nl802154.h +f:include/net/nsh.h +f:include/net/page_pool/helpers.h +f:include/net/page_pool/memory_provider.h +f:include/net/page_pool/types.h +f:include/net/pfcp.h +f:include/net/phonet/gprs.h +f:include/net/phonet/pep.h +f:include/net/phonet/phonet.h +f:include/net/phonet/pn_dev.h +f:include/net/pie.h +f:include/net/ping.h +f:include/net/pkt_cls.h +f:include/net/pkt_sched.h +f:include/net/pptp.h +f:include/net/proto_memory.h +f:include/net/protocol.h +f:include/net/psample.h +f:include/net/psnap.h +f:include/net/raw.h +f:include/net/rawv6.h +f:include/net/red.h +f:include/net/regulatory.h +f:include/net/request_sock.h +f:include/net/rose.h +f:include/net/route.h +f:include/net/rpl.h +f:include/net/rps.h +f:include/net/rsi_91x.h +f:include/net/rstreason.h +f:include/net/rtnetlink.h +f:include/net/rtnh.h +f:include/net/sch_generic.h +f:include/net/scm.h +f:include/net/sctp/auth.h +f:include/net/sctp/checksum.h +f:include/net/sctp/command.h +f:include/net/sctp/constants.h +f:include/net/sctp/sctp.h +f:include/net/sctp/sm.h +f:include/net/sctp/stream_interleave.h +f:include/net/sctp/stream_sched.h +f:include/net/sctp/structs.h +f:include/net/sctp/tsnmap.h +f:include/net/sctp/ulpevent.h +f:include/net/sctp/ulpqueue.h +f:include/net/secure_seq.h +f:include/net/seg6.h +f:include/net/seg6_hmac.h +f:include/net/seg6_local.h +f:include/net/selftests.h +f:include/net/slhc_vj.h +f:include/net/smc.h +f:include/net/snmp.h +f:include/net/sock.h +f:include/net/sock_reuseport.h +f:include/net/stp.h +f:include/net/strparser.h +f:include/net/switchdev.h +f:include/net/tc_act/tc_bpf.h +f:include/net/tc_act/tc_connmark.h +f:include/net/tc_act/tc_csum.h +f:include/net/tc_act/tc_ct.h +f:include/net/tc_act/tc_ctinfo.h +f:include/net/tc_act/tc_defact.h +f:include/net/tc_act/tc_gact.h +f:include/net/tc_act/tc_gate.h +f:include/net/tc_act/tc_ife.h +f:include/net/tc_act/tc_mirred.h +f:include/net/tc_act/tc_mpls.h +f:include/net/tc_act/tc_nat.h +f:include/net/tc_act/tc_pedit.h +f:include/net/tc_act/tc_police.h +f:include/net/tc_act/tc_sample.h +f:include/net/tc_act/tc_skbedit.h +f:include/net/tc_act/tc_skbmod.h +f:include/net/tc_act/tc_tunnel_key.h +f:include/net/tc_act/tc_vlan.h +f:include/net/tc_wrapper.h +f:include/net/tcp.h +f:include/net/tcp_ao.h +f:include/net/tcp_states.h +f:include/net/tcx.h +f:include/net/timewait_sock.h +f:include/net/tipc.h +f:include/net/tls.h +f:include/net/tls_prot.h +f:include/net/tls_toe.h +f:include/net/transp_v6.h +f:include/net/tso.h +f:include/net/tun_proto.h +f:include/net/udp.h +f:include/net/udp_tunnel.h +f:include/net/udplite.h +f:include/net/vsock_addr.h +f:include/net/vxlan.h +f:include/net/wext.h +f:include/net/x25.h +f:include/net/x25device.h +f:include/net/xdp.h +f:include/net/xdp_priv.h +f:include/net/xdp_sock.h +f:include/net/xdp_sock_drv.h +f:include/net/xfrm.h +f:include/net/xsk_buff_pool.h +f:include/pcmcia/ciscode.h +f:include/pcmcia/cisreg.h +f:include/pcmcia/cistpl.h +f:include/pcmcia/device_id.h +f:include/pcmcia/ds.h +f:include/pcmcia/soc_common.h +f:include/pcmcia/ss.h +f:include/ras/ras_event.h +f:include/rdma/ib.h +f:include/rdma/ib_addr.h +f:include/rdma/ib_cache.h +f:include/rdma/ib_cm.h +f:include/rdma/ib_hdrs.h +f:include/rdma/ib_mad.h +f:include/rdma/ib_marshall.h +f:include/rdma/ib_pack.h +f:include/rdma/ib_pma.h +f:include/rdma/ib_sa.h +f:include/rdma/ib_smi.h +f:include/rdma/ib_sysfs.h +f:include/rdma/ib_ucaps.h +f:include/rdma/ib_umem.h +f:include/rdma/ib_umem_odp.h +f:include/rdma/ib_verbs.h +f:include/rdma/iba.h +f:include/rdma/ibta_vol1_c12.h +f:include/rdma/iw_cm.h +f:include/rdma/iw_portmap.h +f:include/rdma/lag.h +f:include/rdma/mr_pool.h +f:include/rdma/opa_addr.h +f:include/rdma/opa_port_info.h +f:include/rdma/opa_smi.h +f:include/rdma/opa_vnic.h +f:include/rdma/rdma_cm.h +f:include/rdma/rdma_cm_ib.h +f:include/rdma/rdma_counter.h +f:include/rdma/rdma_netlink.h +f:include/rdma/rdma_vt.h +f:include/rdma/rdmavt_cq.h +f:include/rdma/rdmavt_mr.h +f:include/rdma/rdmavt_qp.h +f:include/rdma/restrack.h +f:include/rdma/rw.h +f:include/rdma/signature.h +f:include/rdma/tid_rdma_defs.h +f:include/rdma/uverbs_ioctl.h +f:include/rdma/uverbs_named_ioctl.h +f:include/rdma/uverbs_std_types.h +f:include/rdma/uverbs_types.h +f:include/rv/automata.h +f:include/rv/da_monitor.h +f:include/rv/instrumentation.h +f:include/rv/ltl_monitor.h +f:include/scsi/fc/fc_encaps.h +f:include/scsi/fc/fc_fc2.h +f:include/scsi/fc/fc_fcoe.h +f:include/scsi/fc/fc_fcp.h +f:include/scsi/fc/fc_fip.h +f:include/scsi/fc/fc_ms.h +f:include/scsi/fc_frame.h +f:include/scsi/fcoe_sysfs.h +f:include/scsi/iscsi_if.h +f:include/scsi/iscsi_proto.h +f:include/scsi/iser.h +f:include/scsi/libfc.h +f:include/scsi/libfcoe.h +f:include/scsi/libiscsi.h +f:include/scsi/libiscsi_tcp.h +f:include/scsi/libsas.h +f:include/scsi/sas.h +f:include/scsi/sas_ata.h +f:include/scsi/scsi.h +f:include/scsi/scsi_bsg_iscsi.h +f:include/scsi/scsi_cmnd.h +f:include/scsi/scsi_common.h +f:include/scsi/scsi_dbg.h +f:include/scsi/scsi_device.h +f:include/scsi/scsi_devinfo.h +f:include/scsi/scsi_dh.h +f:include/scsi/scsi_driver.h +f:include/scsi/scsi_eh.h +f:include/scsi/scsi_host.h +f:include/scsi/scsi_ioctl.h +f:include/scsi/scsi_proto.h +f:include/scsi/scsi_status.h +f:include/scsi/scsi_tcq.h +f:include/scsi/scsi_transport.h +f:include/scsi/scsi_transport_fc.h +f:include/scsi/scsi_transport_iscsi.h +f:include/scsi/scsi_transport_sas.h +f:include/scsi/scsi_transport_spi.h +f:include/scsi/scsi_transport_srp.h +f:include/scsi/scsicam.h +f:include/scsi/sg.h +f:include/scsi/srp.h +f:include/scsi/viosrp.h +f:include/soc/amlogic/meson_ddr_pmu.h +f:include/soc/arc/arc_aux.h +f:include/soc/arc/mcip.h +f:include/soc/arc/timers.h +f:include/soc/at91/at91sam9_ddrsdr.h +f:include/soc/at91/at91sam9_sdramc.h +f:include/soc/at91/atmel-secumod.h +f:include/soc/at91/atmel-sfr.h +f:include/soc/at91/atmel_tcb.h +f:include/soc/at91/sama7-ddr.h +f:include/soc/at91/sama7-sfrbu.h +f:include/soc/bcm2835/raspberrypi-firmware.h +f:include/soc/canaan/k210-sysctl.h +f:include/soc/fsl/bman.h +f:include/soc/fsl/caam-blob.h +f:include/soc/fsl/cpm.h +f:include/soc/fsl/dcp.h +f:include/soc/fsl/dpaa2-fd.h +f:include/soc/fsl/dpaa2-global.h +f:include/soc/fsl/dpaa2-io.h +f:include/soc/fsl/qe/immap_qe.h +f:include/soc/fsl/qe/qe.h +f:include/soc/fsl/qe/qe_tdm.h +f:include/soc/fsl/qe/qmc.h +f:include/soc/fsl/qe/ucc.h +f:include/soc/fsl/qe/ucc_fast.h +f:include/soc/fsl/qe/ucc_slow.h +f:include/soc/fsl/qman.h +f:include/soc/imx/cpu.h +f:include/soc/imx/cpuidle.h +f:include/soc/imx/revision.h +f:include/soc/mediatek/smi.h +f:include/soc/microchip/mpfs.h +f:include/soc/mscc/ocelot.h +f:include/soc/mscc/ocelot_ana.h +f:include/soc/mscc/ocelot_dev.h +f:include/soc/mscc/ocelot_hsio.h +f:include/soc/mscc/ocelot_ptp.h +f:include/soc/mscc/ocelot_qsys.h +f:include/soc/mscc/ocelot_sys.h +f:include/soc/mscc/ocelot_vcap.h +f:include/soc/mscc/vsc7514_regs.h +f:include/soc/nuvoton/clock-npcm8xx.h +f:include/soc/qcom/cmd-db.h +f:include/soc/qcom/ice.h +f:include/soc/qcom/kryo-l2-accessors.h +f:include/soc/qcom/ocmem.h +f:include/soc/qcom/qcom-spmi-pmic.h +f:include/soc/qcom/rpmh.h +f:include/soc/qcom/spm.h +f:include/soc/qcom/tcs.h +f:include/soc/rockchip/pm_domains.h +f:include/soc/rockchip/rk3399_grf.h +f:include/soc/rockchip/rk3568_grf.h +f:include/soc/rockchip/rk3588_grf.h +f:include/soc/rockchip/rockchip_grf.h +f:include/soc/rockchip/rockchip_sip.h +f:include/soc/sa1100/pwer.h +f:include/soc/sifive/sifive_ccache.h +f:include/soc/spacemit/k1-syscon.h +f:include/soc/starfive/reset-starfive-jh71x0.h +f:include/soc/tegra/ahb.h +f:include/soc/tegra/bpmp-abi.h +f:include/soc/tegra/bpmp.h +f:include/soc/tegra/common.h +f:include/soc/tegra/cpuidle.h +f:include/soc/tegra/flowctrl.h +f:include/soc/tegra/fuse.h +f:include/soc/tegra/irq.h +f:include/soc/tegra/ivc.h +f:include/soc/tegra/mc.h +f:include/soc/tegra/pm.h +f:include/soc/tegra/pmc.h +f:include/soc/tegra/tegra-cbb.h +f:include/sound/ac97/codec.h +f:include/sound/ac97/compat.h +f:include/sound/ac97/controller.h +f:include/sound/ac97/regs.h +f:include/sound/ac97_codec.h +f:include/sound/aci.h +f:include/sound/acp63_chip_offset_byte.h +f:include/sound/ad1816a.h +f:include/sound/ad1843.h +f:include/sound/ak4113.h +f:include/sound/ak4114.h +f:include/sound/ak4117.h +f:include/sound/ak4531_codec.h +f:include/sound/ak4641.h +f:include/sound/ak4xxx-adda.h +f:include/sound/alc5623.h +f:include/sound/asequencer.h +f:include/sound/asound.h +f:include/sound/asoundef.h +f:include/sound/compress_driver.h +f:include/sound/control.h +f:include/sound/core.h +f:include/sound/cs-amp-lib.h +f:include/sound/cs35l33.h +f:include/sound/cs35l34.h +f:include/sound/cs35l35.h +f:include/sound/cs35l36.h +f:include/sound/cs35l41.h +f:include/sound/cs35l56.h +f:include/sound/cs4231-regs.h +f:include/sound/cs4271.h +f:include/sound/cs42l42.h +f:include/sound/cs42l43.h +f:include/sound/cs48l32.h +f:include/sound/cs48l32_registers.h +f:include/sound/cs8403.h +f:include/sound/cs8427.h +f:include/sound/da7213.h +f:include/sound/da7218.h +f:include/sound/da7219-aad.h +f:include/sound/da7219.h +f:include/sound/da9055.h +f:include/sound/designware_i2s.h +f:include/sound/dmaengine_pcm.h +f:include/sound/emu10k1.h +f:include/sound/emu10k1_synth.h +f:include/sound/emu8000.h +f:include/sound/emu8000_reg.h +f:include/sound/emux_legacy.h +f:include/sound/emux_synth.h +f:include/sound/es1688.h +f:include/sound/graph_card.h +f:include/sound/gus.h +f:include/sound/hda-mlink.h +f:include/sound/hda-sdw-bpt.h +f:include/sound/hda_chmap.h +f:include/sound/hda_codec.h +f:include/sound/hda_component.h +f:include/sound/hda_hwdep.h +f:include/sound/hda_i915.h +f:include/sound/hda_register.h +f:include/sound/hda_regmap.h +f:include/sound/hda_verbs.h +f:include/sound/hdaudio.h +f:include/sound/hdaudio_ext.h +f:include/sound/hdmi-codec.h +f:include/sound/hwdep.h +f:include/sound/i2c.h +f:include/sound/info.h +f:include/sound/initval.h +f:include/sound/intel-dsp-config.h +f:include/sound/intel-nhlt.h +f:include/sound/jack.h +f:include/sound/madera-pdata.h +f:include/sound/max9768.h +f:include/sound/max98088.h +f:include/sound/max98090.h +f:include/sound/max98095.h +f:include/sound/memalloc.h +f:include/sound/minors.h +f:include/sound/mixer_oss.h +f:include/sound/mpu401.h +f:include/sound/omap-hdmi-audio.h +f:include/sound/opl3.h +f:include/sound/opl4.h +f:include/sound/pcm-indirect.h +f:include/sound/pcm.h +f:include/sound/pcm_drm_eld.h +f:include/sound/pcm_iec958.h +f:include/sound/pcm_oss.h +f:include/sound/pcm_params.h +f:include/sound/pt2258.h +f:include/sound/pxa2xx-lib.h +f:include/sound/q6usboffload.h +f:include/sound/rawmidi.h +f:include/sound/rt1015.h +f:include/sound/rt1318.h +f:include/sound/rt286.h +f:include/sound/rt298.h +f:include/sound/rt5514.h +f:include/sound/rt5659.h +f:include/sound/rt5660.h +f:include/sound/rt5663.h +f:include/sound/rt5665.h +f:include/sound/rt5668.h +f:include/sound/rt5682.h +f:include/sound/rt5682s.h +f:include/sound/sb.h +f:include/sound/sb16_csp.h +f:include/sound/sdca.h +f:include/sound/sdca_asoc.h +f:include/sound/sdca_function.h +f:include/sound/sdca_hid.h +f:include/sound/sdca_interrupts.h +f:include/sound/sdca_regmap.h +f:include/sound/sdw.h +f:include/sound/seq_device.h +f:include/sound/seq_kernel.h +f:include/sound/seq_midi_emul.h +f:include/sound/seq_midi_event.h +f:include/sound/seq_oss.h +f:include/sound/seq_oss_legacy.h +f:include/sound/seq_virmidi.h +f:include/sound/sh_dac_audio.h +f:include/sound/sh_fsi.h +f:include/sound/simple_card.h +f:include/sound/simple_card_utils.h +f:include/sound/snd_wavefront.h +f:include/sound/soc-acpi-intel-match.h +f:include/sound/soc-acpi-intel-ssp-common.h +f:include/sound/soc-acpi.h +f:include/sound/soc-card.h +f:include/sound/soc-component.h +f:include/sound/soc-dai.h +f:include/sound/soc-dapm.h +f:include/sound/soc-dpcm.h +f:include/sound/soc-jack.h +f:include/sound/soc-link.h +f:include/sound/soc-topology.h +f:include/sound/soc-usb.h +f:include/sound/soc.h +f:include/sound/soc_sdw_utils.h +f:include/sound/sof.h +f:include/sound/sof/channel_map.h +f:include/sound/sof/control.h +f:include/sound/sof/dai-amd.h +f:include/sound/sof/dai-imx.h +f:include/sound/sof/dai-intel.h +f:include/sound/sof/dai-mediatek.h +f:include/sound/sof/dai.h +f:include/sound/sof/debug.h +f:include/sound/sof/ext_manifest.h +f:include/sound/sof/ext_manifest4.h +f:include/sound/sof/header.h +f:include/sound/sof/info.h +f:include/sound/sof/ipc4/header.h +f:include/sound/sof/pm.h +f:include/sound/sof/stream.h +f:include/sound/sof/topology.h +f:include/sound/sof/trace.h +f:include/sound/sof/xtensa.h +f:include/sound/soundfont.h +f:include/sound/spear_dma.h +f:include/sound/spear_spdif.h +f:include/sound/sta32x.h +f:include/sound/sta350.h +f:include/sound/tas2552-plat.h +f:include/sound/tas2563-tlv.h +f:include/sound/tas2770-tlv.h +f:include/sound/tas2781-comlib-i2c.h +f:include/sound/tas2781-dsp.h +f:include/sound/tas2781-tlv.h +f:include/sound/tas2781.h +f:include/sound/tas5086.h +f:include/sound/tea6330t.h +f:include/sound/timer.h +f:include/sound/tlv.h +f:include/sound/tlv320aic32x4.h +f:include/sound/tlv320dac33-plat.h +f:include/sound/uda1380.h +f:include/sound/ump.h +f:include/sound/ump_convert.h +f:include/sound/ump_msg.h +f:include/sound/util_mem.h +f:include/sound/vx_core.h +f:include/sound/wavefront.h +f:include/sound/wm0010.h +f:include/sound/wm2000.h +f:include/sound/wm2200.h +f:include/sound/wm5100.h +f:include/sound/wm8903.h +f:include/sound/wm8904.h +f:include/sound/wm8955.h +f:include/sound/wm8960.h +f:include/sound/wm8962.h +f:include/sound/wm8993.h +f:include/sound/wm8996.h +f:include/sound/wm9081.h +f:include/sound/wm9090.h +f:include/sound/wss.h +f:include/target/iscsi/iscsi_target_core.h +f:include/target/iscsi/iscsi_target_stat.h +f:include/target/iscsi/iscsi_transport.h +f:include/target/target_core_backend.h +f:include/target/target_core_base.h +f:include/target/target_core_fabric.h +f:include/trace/bpf_probe.h +f:include/trace/define_custom_trace.h +f:include/trace/define_trace.h +f:include/trace/events/9p.h +f:include/trace/events/afs.h +f:include/trace/events/alarmtimer.h +f:include/trace/events/amdxdna.h +f:include/trace/events/asoc.h +f:include/trace/events/avc.h +f:include/trace/events/bcache.h +f:include/trace/events/block.h +f:include/trace/events/bpf_test_run.h +f:include/trace/events/bridge.h +f:include/trace/events/btrfs.h +f:include/trace/events/cachefiles.h +f:include/trace/events/capability.h +f:include/trace/events/cgroup.h +f:include/trace/events/clk.h +f:include/trace/events/cma.h +f:include/trace/events/compaction.h +f:include/trace/events/context_tracking.h +f:include/trace/events/cpuhp.h +f:include/trace/events/csd.h +f:include/trace/events/damon.h +f:include/trace/events/devfreq.h +f:include/trace/events/devlink.h +f:include/trace/events/dlm.h +f:include/trace/events/dma.h +f:include/trace/events/dma_fence.h +f:include/trace/events/erofs.h +f:include/trace/events/error_report.h +f:include/trace/events/exceptions.h +f:include/trace/events/ext4.h +f:include/trace/events/f2fs.h +f:include/trace/events/fib.h +f:include/trace/events/fib6.h +f:include/trace/events/filelock.h +f:include/trace/events/filemap.h +f:include/trace/events/firewire.h +f:include/trace/events/firewire_ohci.h +f:include/trace/events/fs_dax.h +f:include/trace/events/fscache.h +f:include/trace/events/fsi.h +f:include/trace/events/fsi_master_aspeed.h +f:include/trace/events/fsi_master_ast_cf.h +f:include/trace/events/fsi_master_gpio.h +f:include/trace/events/fsi_master_i2cr.h +f:include/trace/events/gpio.h +f:include/trace/events/gpu_mem.h +f:include/trace/events/habanalabs.h +f:include/trace/events/handshake.h +f:include/trace/events/host1x.h +f:include/trace/events/huge_memory.h +f:include/trace/events/hugetlbfs.h +f:include/trace/events/hw_pressure.h +f:include/trace/events/hwmon.h +f:include/trace/events/i2c.h +f:include/trace/events/i2c_slave.h +f:include/trace/events/ib_mad.h +f:include/trace/events/ib_umad.h +f:include/trace/events/icmp.h +f:include/trace/events/initcall.h +f:include/trace/events/intel-sst.h +f:include/trace/events/intel_ifs.h +f:include/trace/events/intel_ish.h +f:include/trace/events/io_uring.h +f:include/trace/events/iocost.h +f:include/trace/events/iommu.h +f:include/trace/events/ipi.h +f:include/trace/events/irq.h +f:include/trace/events/irq_matrix.h +f:include/trace/events/iscsi.h +f:include/trace/events/jbd2.h +f:include/trace/events/kmem.h +f:include/trace/events/ksm.h +f:include/trace/events/kvm.h +f:include/trace/events/kyber.h +f:include/trace/events/libata.h +f:include/trace/events/lock.h +f:include/trace/events/maple_tree.h +f:include/trace/events/mce.h +f:include/trace/events/mctp.h +f:include/trace/events/mdio.h +f:include/trace/events/memcg.h +f:include/trace/events/migrate.h +f:include/trace/events/mlxsw.h +f:include/trace/events/mmap.h +f:include/trace/events/mmap_lock.h +f:include/trace/events/mmc.h +f:include/trace/events/mmflags.h +f:include/trace/events/module.h +f:include/trace/events/mptcp.h +f:include/trace/events/napi.h +f:include/trace/events/nbd.h +f:include/trace/events/neigh.h +f:include/trace/events/net.h +f:include/trace/events/net_probe_common.h +f:include/trace/events/netfs.h +f:include/trace/events/netlink.h +f:include/trace/events/nilfs2.h +f:include/trace/events/nmi.h +f:include/trace/events/notifier.h +f:include/trace/events/objagg.h +f:include/trace/events/oom.h +f:include/trace/events/osnoise.h +f:include/trace/events/page_isolation.h +f:include/trace/events/page_pool.h +f:include/trace/events/page_ref.h +f:include/trace/events/pagemap.h +f:include/trace/events/percpu.h +f:include/trace/events/power.h +f:include/trace/events/power_cpu_migrate.h +f:include/trace/events/preemptirq.h +f:include/trace/events/printk.h +f:include/trace/events/pwc.h +f:include/trace/events/pwm.h +f:include/trace/events/qdisc.h +f:include/trace/events/qla.h +f:include/trace/events/qrtr.h +f:include/trace/events/rcu.h +f:include/trace/events/rdma_core.h +f:include/trace/events/regulator.h +f:include/trace/events/rpcgss.h +f:include/trace/events/rpcrdma.h +f:include/trace/events/rpm.h +f:include/trace/events/rseq.h +f:include/trace/events/rtc.h +f:include/trace/events/rust_sample.h +f:include/trace/events/rwmmio.h +f:include/trace/events/rxrpc.h +f:include/trace/events/sched.h +f:include/trace/events/sched_ext.h +f:include/trace/events/scmi.h +f:include/trace/events/scsi.h +f:include/trace/events/sctp.h +f:include/trace/events/signal.h +f:include/trace/events/siox.h +f:include/trace/events/skb.h +f:include/trace/events/smbus.h +f:include/trace/events/sock.h +f:include/trace/events/sof.h +f:include/trace/events/sof_intel.h +f:include/trace/events/spi.h +f:include/trace/events/spmi.h +f:include/trace/events/sunrpc.h +f:include/trace/events/sunvnet.h +f:include/trace/events/swiotlb.h +f:include/trace/events/syscalls.h +f:include/trace/events/target.h +f:include/trace/events/task.h +f:include/trace/events/tcp.h +f:include/trace/events/tegra_apb_dma.h +f:include/trace/events/thp.h +f:include/trace/events/timer.h +f:include/trace/events/timer_migration.h +f:include/trace/events/timestamp.h +f:include/trace/events/tlb.h +f:include/trace/events/tsm_mr.h +f:include/trace/events/udp.h +f:include/trace/events/v4l2.h +f:include/trace/events/vb2.h +f:include/trace/events/vmalloc.h +f:include/trace/events/vmscan.h +f:include/trace/events/vsock_virtio_transport_common.h +f:include/trace/events/watchdog.h +f:include/trace/events/wbt.h +f:include/trace/events/workqueue.h +f:include/trace/events/writeback.h +f:include/trace/events/xdp.h +f:include/trace/events/xen.h +f:include/trace/misc/fs.h +f:include/trace/misc/nfs.h +f:include/trace/misc/rdma.h +f:include/trace/misc/sunrpc.h +f:include/trace/perf.h +f:include/trace/stages/init.h +f:include/trace/stages/stage1_struct_define.h +f:include/trace/stages/stage2_data_offsets.h +f:include/trace/stages/stage3_trace_output.h +f:include/trace/stages/stage4_event_fields.h +f:include/trace/stages/stage5_get_offsets.h +f:include/trace/stages/stage6_event_callback.h +f:include/trace/stages/stage7_class_define.h +f:include/trace/syscall.h +f:include/trace/trace_custom_events.h +f:include/trace/trace_events.h +f:include/uapi/Kbuild +f:include/uapi/asm-generic/Kbuild +f:include/uapi/asm-generic/auxvec.h +f:include/uapi/asm-generic/bitsperlong.h +f:include/uapi/asm-generic/bpf_perf_event.h +f:include/uapi/asm-generic/errno-base.h +f:include/uapi/asm-generic/errno.h +f:include/uapi/asm-generic/fcntl.h +f:include/uapi/asm-generic/hugetlb_encode.h +f:include/uapi/asm-generic/int-l64.h +f:include/uapi/asm-generic/int-ll64.h +f:include/uapi/asm-generic/ioctl.h +f:include/uapi/asm-generic/ioctls.h +f:include/uapi/asm-generic/ipcbuf.h +f:include/uapi/asm-generic/kvm_para.h +f:include/uapi/asm-generic/mman-common.h +f:include/uapi/asm-generic/mman.h +f:include/uapi/asm-generic/msgbuf.h +f:include/uapi/asm-generic/param.h +f:include/uapi/asm-generic/poll.h +f:include/uapi/asm-generic/posix_types.h +f:include/uapi/asm-generic/resource.h +f:include/uapi/asm-generic/sembuf.h +f:include/uapi/asm-generic/setup.h +f:include/uapi/asm-generic/shmbuf.h +f:include/uapi/asm-generic/siginfo.h +f:include/uapi/asm-generic/signal-defs.h +f:include/uapi/asm-generic/signal.h +f:include/uapi/asm-generic/socket.h +f:include/uapi/asm-generic/sockios.h +f:include/uapi/asm-generic/stat.h +f:include/uapi/asm-generic/statfs.h +f:include/uapi/asm-generic/swab.h +f:include/uapi/asm-generic/termbits-common.h +f:include/uapi/asm-generic/termbits.h +f:include/uapi/asm-generic/termios.h +f:include/uapi/asm-generic/types.h +f:include/uapi/asm-generic/ucontext.h +f:include/uapi/asm-generic/unistd.h +f:include/uapi/cxl/features.h +f:include/uapi/drm/amdgpu_drm.h +f:include/uapi/drm/amdxdna_accel.h +f:include/uapi/drm/armada_drm.h +f:include/uapi/drm/asahi_drm.h +f:include/uapi/drm/drm.h +f:include/uapi/drm/drm_fourcc.h +f:include/uapi/drm/drm_mode.h +f:include/uapi/drm/drm_sarea.h +f:include/uapi/drm/etnaviv_drm.h +f:include/uapi/drm/exynos_drm.h +f:include/uapi/drm/habanalabs_accel.h +f:include/uapi/drm/i915_drm.h +f:include/uapi/drm/ivpu_accel.h +f:include/uapi/drm/lima_drm.h +f:include/uapi/drm/msm_drm.h +f:include/uapi/drm/nouveau_drm.h +f:include/uapi/drm/nova_drm.h +f:include/uapi/drm/omap_drm.h +f:include/uapi/drm/panfrost_drm.h +f:include/uapi/drm/panthor_drm.h +f:include/uapi/drm/pvr_drm.h +f:include/uapi/drm/qaic_accel.h +f:include/uapi/drm/qxl_drm.h +f:include/uapi/drm/radeon_drm.h +f:include/uapi/drm/tegra_drm.h +f:include/uapi/drm/v3d_drm.h +f:include/uapi/drm/vc4_drm.h +f:include/uapi/drm/vgem_drm.h +f:include/uapi/drm/virtgpu_drm.h +f:include/uapi/drm/vmwgfx_drm.h +f:include/uapi/drm/xe_drm.h +f:include/uapi/fwctl/cxl.h +f:include/uapi/fwctl/fwctl.h +f:include/uapi/fwctl/mlx5.h +f:include/uapi/fwctl/pds.h +f:include/uapi/linux/a.out.h +f:include/uapi/linux/acct.h +f:include/uapi/linux/acrn.h +f:include/uapi/linux/adb.h +f:include/uapi/linux/adfs_fs.h +f:include/uapi/linux/affs_hardblocks.h +f:include/uapi/linux/agpgart.h +f:include/uapi/linux/aio_abi.h +f:include/uapi/linux/am437x-vpfe.h +f:include/uapi/linux/amt.h +f:include/uapi/linux/android/binder.h +f:include/uapi/linux/android/binderfs.h +f:include/uapi/linux/apm_bios.h +f:include/uapi/linux/arcfb.h +f:include/uapi/linux/arm_sdei.h +f:include/uapi/linux/aspeed-lpc-ctrl.h +f:include/uapi/linux/aspeed-p2a-ctrl.h +f:include/uapi/linux/aspeed-video.h +f:include/uapi/linux/atalk.h +f:include/uapi/linux/atm.h +f:include/uapi/linux/atm_eni.h +f:include/uapi/linux/atm_he.h +f:include/uapi/linux/atm_idt77105.h +f:include/uapi/linux/atm_nicstar.h +f:include/uapi/linux/atm_tcp.h +f:include/uapi/linux/atm_zatm.h +f:include/uapi/linux/atmapi.h +f:include/uapi/linux/atmarp.h +f:include/uapi/linux/atmbr2684.h +f:include/uapi/linux/atmclip.h +f:include/uapi/linux/atmdev.h +f:include/uapi/linux/atmioc.h +f:include/uapi/linux/atmlec.h +f:include/uapi/linux/atmmpc.h +f:include/uapi/linux/atmppp.h +f:include/uapi/linux/atmsap.h +f:include/uapi/linux/atmsvc.h +f:include/uapi/linux/audit.h +f:include/uapi/linux/auto_dev-ioctl.h +f:include/uapi/linux/auto_fs.h +f:include/uapi/linux/auto_fs4.h +f:include/uapi/linux/auxvec.h +f:include/uapi/linux/ax25.h +f:include/uapi/linux/batadv_packet.h +f:include/uapi/linux/batman_adv.h +f:include/uapi/linux/baycom.h +f:include/uapi/linux/bcm933xx_hcs.h +f:include/uapi/linux/bfs_fs.h +f:include/uapi/linux/binfmts.h +f:include/uapi/linux/bits.h +f:include/uapi/linux/blk-crypto.h +f:include/uapi/linux/blkdev.h +f:include/uapi/linux/blkpg.h +f:include/uapi/linux/blktrace_api.h +f:include/uapi/linux/blkzoned.h +f:include/uapi/linux/bpf.h +f:include/uapi/linux/bpf_common.h +f:include/uapi/linux/bpf_perf_event.h +f:include/uapi/linux/bpqether.h +f:include/uapi/linux/bsg.h +f:include/uapi/linux/bt-bmc.h +f:include/uapi/linux/btf.h +f:include/uapi/linux/btrfs.h +f:include/uapi/linux/btrfs_tree.h +f:include/uapi/linux/byteorder/big_endian.h +f:include/uapi/linux/byteorder/little_endian.h +f:include/uapi/linux/cachefiles.h +f:include/uapi/linux/caif/caif_socket.h +f:include/uapi/linux/caif/if_caif.h +f:include/uapi/linux/can.h +f:include/uapi/linux/can/bcm.h +f:include/uapi/linux/can/error.h +f:include/uapi/linux/can/gw.h +f:include/uapi/linux/can/isotp.h +f:include/uapi/linux/can/j1939.h +f:include/uapi/linux/can/netlink.h +f:include/uapi/linux/can/raw.h +f:include/uapi/linux/can/vxcan.h +f:include/uapi/linux/capability.h +f:include/uapi/linux/capi.h +f:include/uapi/linux/cciss_defs.h +f:include/uapi/linux/cciss_ioctl.h +f:include/uapi/linux/ccs.h +f:include/uapi/linux/cdrom.h +f:include/uapi/linux/cec-funcs.h +f:include/uapi/linux/cec.h +f:include/uapi/linux/cfm_bridge.h +f:include/uapi/linux/cgroupstats.h +f:include/uapi/linux/chio.h +f:include/uapi/linux/cifs/cifs_mount.h +f:include/uapi/linux/cifs/cifs_netlink.h +f:include/uapi/linux/close_range.h +f:include/uapi/linux/cn_proc.h +f:include/uapi/linux/coda.h +f:include/uapi/linux/coff.h +f:include/uapi/linux/comedi.h +f:include/uapi/linux/connector.h +f:include/uapi/linux/const.h +f:include/uapi/linux/coredump.h +f:include/uapi/linux/coresight-stm.h +f:include/uapi/linux/counter.h +f:include/uapi/linux/counter/microchip-tcb-capture.h +f:include/uapi/linux/cramfs_fs.h +f:include/uapi/linux/cryptouser.h +f:include/uapi/linux/cuda.h +f:include/uapi/linux/cxl_mem.h +f:include/uapi/linux/cyclades.h +f:include/uapi/linux/cycx_cfm.h +f:include/uapi/linux/dcbnl.h +f:include/uapi/linux/dccp.h +f:include/uapi/linux/devlink.h +f:include/uapi/linux/dlm.h +f:include/uapi/linux/dlm_device.h +f:include/uapi/linux/dlm_plock.h +f:include/uapi/linux/dlmconstants.h +f:include/uapi/linux/dm-ioctl.h +f:include/uapi/linux/dm-log-userspace.h +f:include/uapi/linux/dma-buf.h +f:include/uapi/linux/dma-heap.h +f:include/uapi/linux/dns_resolver.h +f:include/uapi/linux/dpll.h +f:include/uapi/linux/dqblk_xfs.h +f:include/uapi/linux/dvb/audio.h +f:include/uapi/linux/dvb/ca.h +f:include/uapi/linux/dvb/dmx.h +f:include/uapi/linux/dvb/frontend.h +f:include/uapi/linux/dvb/net.h +f:include/uapi/linux/dvb/osd.h +f:include/uapi/linux/dvb/version.h +f:include/uapi/linux/dvb/video.h +f:include/uapi/linux/dw100.h +f:include/uapi/linux/edd.h +f:include/uapi/linux/efs_fs_sb.h +f:include/uapi/linux/elf-em.h +f:include/uapi/linux/elf-fdpic.h +f:include/uapi/linux/elf.h +f:include/uapi/linux/errno.h +f:include/uapi/linux/errqueue.h +f:include/uapi/linux/erspan.h +f:include/uapi/linux/ethtool.h +f:include/uapi/linux/ethtool_netlink.h +f:include/uapi/linux/ethtool_netlink_generated.h +f:include/uapi/linux/eventfd.h +f:include/uapi/linux/eventpoll.h +f:include/uapi/linux/exfat.h +f:include/uapi/linux/ext4.h +f:include/uapi/linux/f2fs.h +f:include/uapi/linux/fadvise.h +f:include/uapi/linux/falloc.h +f:include/uapi/linux/fanotify.h +f:include/uapi/linux/fb.h +f:include/uapi/linux/fcntl.h +f:include/uapi/linux/fd.h +f:include/uapi/linux/fdreg.h +f:include/uapi/linux/fib_rules.h +f:include/uapi/linux/fiemap.h +f:include/uapi/linux/filter.h +f:include/uapi/linux/firewire-cdev.h +f:include/uapi/linux/firewire-constants.h +f:include/uapi/linux/fou.h +f:include/uapi/linux/fpga-dfl.h +f:include/uapi/linux/fs.h +f:include/uapi/linux/fscrypt.h +f:include/uapi/linux/fsi.h +f:include/uapi/linux/fsl_hypervisor.h +f:include/uapi/linux/fsl_mc.h +f:include/uapi/linux/fsmap.h +f:include/uapi/linux/fsverity.h +f:include/uapi/linux/fuse.h +f:include/uapi/linux/futex.h +f:include/uapi/linux/gameport.h +f:include/uapi/linux/gen_stats.h +f:include/uapi/linux/genetlink.h +f:include/uapi/linux/genwqe/genwqe_card.h +f:include/uapi/linux/gfs2_ondisk.h +f:include/uapi/linux/gpio.h +f:include/uapi/linux/gsmmux.h +f:include/uapi/linux/gtp.h +f:include/uapi/linux/handshake.h +f:include/uapi/linux/hash_info.h +f:include/uapi/linux/hdlc.h +f:include/uapi/linux/hdlc/ioctl.h +f:include/uapi/linux/hdlcdrv.h +f:include/uapi/linux/hdreg.h +f:include/uapi/linux/hid.h +f:include/uapi/linux/hiddev.h +f:include/uapi/linux/hidraw.h +f:include/uapi/linux/hpet.h +f:include/uapi/linux/hsi/cs-protocol.h +f:include/uapi/linux/hsi/hsi_char.h +f:include/uapi/linux/hsr_netlink.h +f:include/uapi/linux/hw_breakpoint.h +f:include/uapi/linux/hyperv.h +f:include/uapi/linux/i2c-dev.h +f:include/uapi/linux/i2c.h +f:include/uapi/linux/i2o-dev.h +f:include/uapi/linux/i8k.h +f:include/uapi/linux/icmp.h +f:include/uapi/linux/icmpv6.h +f:include/uapi/linux/idxd.h +f:include/uapi/linux/if.h +f:include/uapi/linux/if_addr.h +f:include/uapi/linux/if_addrlabel.h +f:include/uapi/linux/if_alg.h +f:include/uapi/linux/if_arcnet.h +f:include/uapi/linux/if_arp.h +f:include/uapi/linux/if_bonding.h +f:include/uapi/linux/if_bridge.h +f:include/uapi/linux/if_eql.h +f:include/uapi/linux/if_ether.h +f:include/uapi/linux/if_fc.h +f:include/uapi/linux/if_fddi.h +f:include/uapi/linux/if_hippi.h +f:include/uapi/linux/if_infiniband.h +f:include/uapi/linux/if_link.h +f:include/uapi/linux/if_ltalk.h +f:include/uapi/linux/if_macsec.h +f:include/uapi/linux/if_packet.h +f:include/uapi/linux/if_phonet.h +f:include/uapi/linux/if_plip.h +f:include/uapi/linux/if_ppp.h +f:include/uapi/linux/if_pppol2tp.h +f:include/uapi/linux/if_pppox.h +f:include/uapi/linux/if_slip.h +f:include/uapi/linux/if_team.h +f:include/uapi/linux/if_tun.h +f:include/uapi/linux/if_tunnel.h +f:include/uapi/linux/if_vlan.h +f:include/uapi/linux/if_x25.h +f:include/uapi/linux/if_xdp.h +f:include/uapi/linux/ife.h +f:include/uapi/linux/igmp.h +f:include/uapi/linux/iio/buffer.h +f:include/uapi/linux/iio/events.h +f:include/uapi/linux/iio/types.h +f:include/uapi/linux/ila.h +f:include/uapi/linux/in.h +f:include/uapi/linux/in6.h +f:include/uapi/linux/in_route.h +f:include/uapi/linux/inet_diag.h +f:include/uapi/linux/inotify.h +f:include/uapi/linux/input-event-codes.h +f:include/uapi/linux/input.h +f:include/uapi/linux/io_uring.h +f:include/uapi/linux/io_uring/mock_file.h +f:include/uapi/linux/ioam6.h +f:include/uapi/linux/ioam6_genl.h +f:include/uapi/linux/ioam6_iptunnel.h +f:include/uapi/linux/ioctl.h +f:include/uapi/linux/iommufd.h +f:include/uapi/linux/ioprio.h +f:include/uapi/linux/ip.h +f:include/uapi/linux/ip6_tunnel.h +f:include/uapi/linux/ip_vs.h +f:include/uapi/linux/ipc.h +f:include/uapi/linux/ipmi.h +f:include/uapi/linux/ipmi_bmc.h +f:include/uapi/linux/ipmi_msgdefs.h +f:include/uapi/linux/ipmi_ssif_bmc.h +f:include/uapi/linux/ipsec.h +f:include/uapi/linux/ipv6.h +f:include/uapi/linux/ipv6_route.h +f:include/uapi/linux/irqnr.h +f:include/uapi/linux/isdn/capicmd.h +f:include/uapi/linux/iso_fs.h +f:include/uapi/linux/isst_if.h +f:include/uapi/linux/ivtv.h +f:include/uapi/linux/ivtvfb.h +f:include/uapi/linux/jffs2.h +f:include/uapi/linux/joystick.h +f:include/uapi/linux/kcm.h +f:include/uapi/linux/kcmp.h +f:include/uapi/linux/kcov.h +f:include/uapi/linux/kd.h +f:include/uapi/linux/kdev_t.h +f:include/uapi/linux/kernel-page-flags.h +f:include/uapi/linux/kernel.h +f:include/uapi/linux/kernelcapi.h +f:include/uapi/linux/kexec.h +f:include/uapi/linux/keyboard.h +f:include/uapi/linux/keyctl.h +f:include/uapi/linux/kfd_ioctl.h +f:include/uapi/linux/kfd_sysfs.h +f:include/uapi/linux/kvm.h +f:include/uapi/linux/kvm_para.h +f:include/uapi/linux/l2tp.h +f:include/uapi/linux/landlock.h +f:include/uapi/linux/libc-compat.h +f:include/uapi/linux/limits.h +f:include/uapi/linux/lirc.h +f:include/uapi/linux/llc.h +f:include/uapi/linux/loadpin.h +f:include/uapi/linux/lockd_netlink.h +f:include/uapi/linux/loop.h +f:include/uapi/linux/lp.h +f:include/uapi/linux/lsm.h +f:include/uapi/linux/lwtunnel.h +f:include/uapi/linux/magic.h +f:include/uapi/linux/major.h +f:include/uapi/linux/map_to_14segment.h +f:include/uapi/linux/map_to_7segment.h +f:include/uapi/linux/matroxfb.h +f:include/uapi/linux/max2175.h +f:include/uapi/linux/mctp.h +f:include/uapi/linux/mdio.h +f:include/uapi/linux/media-bus-format.h +f:include/uapi/linux/media.h +f:include/uapi/linux/media/amlogic/c3-isp-config.h +f:include/uapi/linux/media/raspberrypi/pisp_be_config.h +f:include/uapi/linux/media/raspberrypi/pisp_common.h +f:include/uapi/linux/media/raspberrypi/pisp_fe_config.h +f:include/uapi/linux/media/raspberrypi/pisp_fe_statistics.h +f:include/uapi/linux/mei.h +f:include/uapi/linux/mei_uuid.h +f:include/uapi/linux/membarrier.h +f:include/uapi/linux/memfd.h +f:include/uapi/linux/mempolicy.h +f:include/uapi/linux/mii.h +f:include/uapi/linux/minix_fs.h +f:include/uapi/linux/misc/bcm_vk.h +f:include/uapi/linux/mman.h +f:include/uapi/linux/mmc/ioctl.h +f:include/uapi/linux/mmtimer.h +f:include/uapi/linux/module.h +f:include/uapi/linux/mount.h +f:include/uapi/linux/mpls.h +f:include/uapi/linux/mpls_iptunnel.h +f:include/uapi/linux/mptcp.h +f:include/uapi/linux/mptcp_pm.h +f:include/uapi/linux/mqueue.h +f:include/uapi/linux/mroute.h +f:include/uapi/linux/mroute6.h +f:include/uapi/linux/mrp_bridge.h +f:include/uapi/linux/msdos_fs.h +f:include/uapi/linux/msg.h +f:include/uapi/linux/mshv.h +f:include/uapi/linux/mtio.h +f:include/uapi/linux/nbd-netlink.h +f:include/uapi/linux/nbd.h +f:include/uapi/linux/ncsi.h +f:include/uapi/linux/ndctl.h +f:include/uapi/linux/neighbour.h +f:include/uapi/linux/net.h +f:include/uapi/linux/net_dropmon.h +f:include/uapi/linux/net_namespace.h +f:include/uapi/linux/net_shaper.h +f:include/uapi/linux/net_tstamp.h +f:include/uapi/linux/netconf.h +f:include/uapi/linux/netdev.h +f:include/uapi/linux/netdevice.h +f:include/uapi/linux/netfilter.h +f:include/uapi/linux/netfilter/ipset/ip_set.h +f:include/uapi/linux/netfilter/ipset/ip_set_bitmap.h +f:include/uapi/linux/netfilter/ipset/ip_set_hash.h +f:include/uapi/linux/netfilter/ipset/ip_set_list.h +f:include/uapi/linux/netfilter/nf_conntrack_common.h +f:include/uapi/linux/netfilter/nf_conntrack_ftp.h +f:include/uapi/linux/netfilter/nf_conntrack_sctp.h +f:include/uapi/linux/netfilter/nf_conntrack_tcp.h +f:include/uapi/linux/netfilter/nf_conntrack_tuple_common.h +f:include/uapi/linux/netfilter/nf_log.h +f:include/uapi/linux/netfilter/nf_nat.h +f:include/uapi/linux/netfilter/nf_synproxy.h +f:include/uapi/linux/netfilter/nf_tables.h +f:include/uapi/linux/netfilter/nf_tables_compat.h +f:include/uapi/linux/netfilter/nfnetlink.h +f:include/uapi/linux/netfilter/nfnetlink_acct.h +f:include/uapi/linux/netfilter/nfnetlink_compat.h +f:include/uapi/linux/netfilter/nfnetlink_conntrack.h +f:include/uapi/linux/netfilter/nfnetlink_cthelper.h +f:include/uapi/linux/netfilter/nfnetlink_cttimeout.h +f:include/uapi/linux/netfilter/nfnetlink_hook.h +f:include/uapi/linux/netfilter/nfnetlink_log.h +f:include/uapi/linux/netfilter/nfnetlink_osf.h +f:include/uapi/linux/netfilter/nfnetlink_queue.h +f:include/uapi/linux/netfilter/x_tables.h +f:include/uapi/linux/netfilter/xt_AUDIT.h +f:include/uapi/linux/netfilter/xt_CHECKSUM.h +f:include/uapi/linux/netfilter/xt_CLASSIFY.h +f:include/uapi/linux/netfilter/xt_CONNSECMARK.h +f:include/uapi/linux/netfilter/xt_CT.h +f:include/uapi/linux/netfilter/xt_HMARK.h +f:include/uapi/linux/netfilter/xt_IDLETIMER.h +f:include/uapi/linux/netfilter/xt_LED.h +f:include/uapi/linux/netfilter/xt_LOG.h +f:include/uapi/linux/netfilter/xt_NFLOG.h +f:include/uapi/linux/netfilter/xt_NFQUEUE.h +f:include/uapi/linux/netfilter/xt_SECMARK.h +f:include/uapi/linux/netfilter/xt_SYNPROXY.h +f:include/uapi/linux/netfilter/xt_TCPOPTSTRIP.h +f:include/uapi/linux/netfilter/xt_TEE.h +f:include/uapi/linux/netfilter/xt_TPROXY.h +f:include/uapi/linux/netfilter/xt_addrtype.h +f:include/uapi/linux/netfilter/xt_bpf.h +f:include/uapi/linux/netfilter/xt_cgroup.h +f:include/uapi/linux/netfilter/xt_cluster.h +f:include/uapi/linux/netfilter/xt_comment.h +f:include/uapi/linux/netfilter/xt_connbytes.h +f:include/uapi/linux/netfilter/xt_connlabel.h +f:include/uapi/linux/netfilter/xt_connlimit.h +f:include/uapi/linux/netfilter/xt_connmark.h +f:include/uapi/linux/netfilter/xt_conntrack.h +f:include/uapi/linux/netfilter/xt_cpu.h +f:include/uapi/linux/netfilter/xt_dccp.h +f:include/uapi/linux/netfilter/xt_devgroup.h +f:include/uapi/linux/netfilter/xt_dscp.h +f:include/uapi/linux/netfilter/xt_ecn.h +f:include/uapi/linux/netfilter/xt_esp.h +f:include/uapi/linux/netfilter/xt_hashlimit.h +f:include/uapi/linux/netfilter/xt_helper.h +f:include/uapi/linux/netfilter/xt_ipcomp.h +f:include/uapi/linux/netfilter/xt_iprange.h +f:include/uapi/linux/netfilter/xt_ipvs.h +f:include/uapi/linux/netfilter/xt_l2tp.h +f:include/uapi/linux/netfilter/xt_length.h +f:include/uapi/linux/netfilter/xt_limit.h +f:include/uapi/linux/netfilter/xt_mac.h +f:include/uapi/linux/netfilter/xt_mark.h +f:include/uapi/linux/netfilter/xt_multiport.h +f:include/uapi/linux/netfilter/xt_nfacct.h +f:include/uapi/linux/netfilter/xt_osf.h +f:include/uapi/linux/netfilter/xt_owner.h +f:include/uapi/linux/netfilter/xt_physdev.h +f:include/uapi/linux/netfilter/xt_pkttype.h +f:include/uapi/linux/netfilter/xt_policy.h +f:include/uapi/linux/netfilter/xt_quota.h +f:include/uapi/linux/netfilter/xt_rateest.h +f:include/uapi/linux/netfilter/xt_realm.h +f:include/uapi/linux/netfilter/xt_recent.h +f:include/uapi/linux/netfilter/xt_rpfilter.h +f:include/uapi/linux/netfilter/xt_sctp.h +f:include/uapi/linux/netfilter/xt_set.h +f:include/uapi/linux/netfilter/xt_socket.h +f:include/uapi/linux/netfilter/xt_state.h +f:include/uapi/linux/netfilter/xt_statistic.h +f:include/uapi/linux/netfilter/xt_string.h +f:include/uapi/linux/netfilter/xt_tcpmss.h +f:include/uapi/linux/netfilter/xt_tcpudp.h +f:include/uapi/linux/netfilter/xt_time.h +f:include/uapi/linux/netfilter/xt_u32.h +f:include/uapi/linux/netfilter_arp.h +f:include/uapi/linux/netfilter_arp/arp_tables.h +f:include/uapi/linux/netfilter_arp/arpt_mangle.h +f:include/uapi/linux/netfilter_bridge.h +f:include/uapi/linux/netfilter_bridge/ebt_802_3.h +f:include/uapi/linux/netfilter_bridge/ebt_among.h +f:include/uapi/linux/netfilter_bridge/ebt_arp.h +f:include/uapi/linux/netfilter_bridge/ebt_arpreply.h +f:include/uapi/linux/netfilter_bridge/ebt_ip.h +f:include/uapi/linux/netfilter_bridge/ebt_ip6.h +f:include/uapi/linux/netfilter_bridge/ebt_limit.h +f:include/uapi/linux/netfilter_bridge/ebt_log.h +f:include/uapi/linux/netfilter_bridge/ebt_mark_m.h +f:include/uapi/linux/netfilter_bridge/ebt_mark_t.h +f:include/uapi/linux/netfilter_bridge/ebt_nat.h +f:include/uapi/linux/netfilter_bridge/ebt_nflog.h +f:include/uapi/linux/netfilter_bridge/ebt_pkttype.h +f:include/uapi/linux/netfilter_bridge/ebt_redirect.h +f:include/uapi/linux/netfilter_bridge/ebt_stp.h +f:include/uapi/linux/netfilter_bridge/ebt_vlan.h +f:include/uapi/linux/netfilter_bridge/ebtables.h +f:include/uapi/linux/netfilter_ipv4.h +f:include/uapi/linux/netfilter_ipv4/ip_tables.h +f:include/uapi/linux/netfilter_ipv4/ipt_CLUSTERIP.h +f:include/uapi/linux/netfilter_ipv4/ipt_LOG.h +f:include/uapi/linux/netfilter_ipv4/ipt_REJECT.h +f:include/uapi/linux/netfilter_ipv4/ipt_ah.h +f:include/uapi/linux/netfilter_ipv4/ipt_ecn.h +f:include/uapi/linux/netfilter_ipv4/ipt_ttl.h +f:include/uapi/linux/netfilter_ipv6.h +f:include/uapi/linux/netfilter_ipv6/ip6_tables.h +f:include/uapi/linux/netfilter_ipv6/ip6t_LOG.h +f:include/uapi/linux/netfilter_ipv6/ip6t_NPT.h +f:include/uapi/linux/netfilter_ipv6/ip6t_REJECT.h +f:include/uapi/linux/netfilter_ipv6/ip6t_ah.h +f:include/uapi/linux/netfilter_ipv6/ip6t_frag.h +f:include/uapi/linux/netfilter_ipv6/ip6t_hl.h +f:include/uapi/linux/netfilter_ipv6/ip6t_ipv6header.h +f:include/uapi/linux/netfilter_ipv6/ip6t_mh.h +f:include/uapi/linux/netfilter_ipv6/ip6t_opts.h +f:include/uapi/linux/netfilter_ipv6/ip6t_rt.h +f:include/uapi/linux/netfilter_ipv6/ip6t_srh.h +f:include/uapi/linux/netlink.h +f:include/uapi/linux/netlink_diag.h +f:include/uapi/linux/netrom.h +f:include/uapi/linux/nexthop.h +f:include/uapi/linux/nfc.h +f:include/uapi/linux/nfs.h +f:include/uapi/linux/nfs2.h +f:include/uapi/linux/nfs3.h +f:include/uapi/linux/nfs4.h +f:include/uapi/linux/nfs4_mount.h +f:include/uapi/linux/nfs_fs.h +f:include/uapi/linux/nfs_idmap.h +f:include/uapi/linux/nfs_mount.h +f:include/uapi/linux/nfsacl.h +f:include/uapi/linux/nfsd/cld.h +f:include/uapi/linux/nfsd/debug.h +f:include/uapi/linux/nfsd/export.h +f:include/uapi/linux/nfsd/stats.h +f:include/uapi/linux/nfsd_netlink.h +f:include/uapi/linux/nilfs2_api.h +f:include/uapi/linux/nilfs2_ondisk.h +f:include/uapi/linux/nitro_enclaves.h +f:include/uapi/linux/nl80211-vnd-intel.h +f:include/uapi/linux/nl80211.h +f:include/uapi/linux/npcm-video.h +f:include/uapi/linux/nsfs.h +f:include/uapi/linux/nsm.h +f:include/uapi/linux/ntsync.h +f:include/uapi/linux/nubus.h +f:include/uapi/linux/nvme_ioctl.h +f:include/uapi/linux/nvram.h +f:include/uapi/linux/omap3isp.h +f:include/uapi/linux/omapfb.h +f:include/uapi/linux/oom.h +f:include/uapi/linux/openat2.h +f:include/uapi/linux/openvswitch.h +f:include/uapi/linux/ovpn.h +f:include/uapi/linux/packet_diag.h +f:include/uapi/linux/papr_pdsm.h +f:include/uapi/linux/param.h +f:include/uapi/linux/parport.h +f:include/uapi/linux/patchkey.h +f:include/uapi/linux/pci.h +f:include/uapi/linux/pci_regs.h +f:include/uapi/linux/pcitest.h +f:include/uapi/linux/perf_event.h +f:include/uapi/linux/personality.h +f:include/uapi/linux/pfkeyv2.h +f:include/uapi/linux/pfrut.h +f:include/uapi/linux/pg.h +f:include/uapi/linux/phantom.h +f:include/uapi/linux/phonet.h +f:include/uapi/linux/pidfd.h +f:include/uapi/linux/pkt_cls.h +f:include/uapi/linux/pkt_sched.h +f:include/uapi/linux/pktcdvd.h +f:include/uapi/linux/pmu.h +f:include/uapi/linux/poll.h +f:include/uapi/linux/posix_acl.h +f:include/uapi/linux/posix_acl_xattr.h +f:include/uapi/linux/posix_types.h +f:include/uapi/linux/ppdev.h +f:include/uapi/linux/ppp-comp.h +f:include/uapi/linux/ppp-ioctl.h +f:include/uapi/linux/ppp_defs.h +f:include/uapi/linux/pps.h +f:include/uapi/linux/pps_gen.h +f:include/uapi/linux/pr.h +f:include/uapi/linux/prctl.h +f:include/uapi/linux/psample.h +f:include/uapi/linux/psci.h +f:include/uapi/linux/psp-dbc.h +f:include/uapi/linux/psp-sev.h +f:include/uapi/linux/ptp_clock.h +f:include/uapi/linux/ptrace.h +f:include/uapi/linux/pwm.h +f:include/uapi/linux/qemu_fw_cfg.h +f:include/uapi/linux/qnx4_fs.h +f:include/uapi/linux/qnxtypes.h +f:include/uapi/linux/qrtr.h +f:include/uapi/linux/quota.h +f:include/uapi/linux/radeonfb.h +f:include/uapi/linux/raid/md_p.h +f:include/uapi/linux/raid/md_u.h +f:include/uapi/linux/random.h +f:include/uapi/linux/rds.h +f:include/uapi/linux/reboot.h +f:include/uapi/linux/remoteproc_cdev.h +f:include/uapi/linux/resource.h +f:include/uapi/linux/rfkill.h +f:include/uapi/linux/rio_cm_cdev.h +f:include/uapi/linux/rio_mport_cdev.h +f:include/uapi/linux/rkisp1-config.h +f:include/uapi/linux/romfs_fs.h +f:include/uapi/linux/rose.h +f:include/uapi/linux/route.h +f:include/uapi/linux/rpl.h +f:include/uapi/linux/rpl_iptunnel.h +f:include/uapi/linux/rpmsg.h +f:include/uapi/linux/rpmsg_types.h +f:include/uapi/linux/rseq.h +f:include/uapi/linux/rtc.h +f:include/uapi/linux/rtnetlink.h +f:include/uapi/linux/rxrpc.h +f:include/uapi/linux/scc.h +f:include/uapi/linux/sched.h +f:include/uapi/linux/sched/types.h +f:include/uapi/linux/scif_ioctl.h +f:include/uapi/linux/screen_info.h +f:include/uapi/linux/sctp.h +f:include/uapi/linux/seccomp.h +f:include/uapi/linux/securebits.h +f:include/uapi/linux/sed-opal.h +f:include/uapi/linux/seg6.h +f:include/uapi/linux/seg6_genl.h +f:include/uapi/linux/seg6_hmac.h +f:include/uapi/linux/seg6_iptunnel.h +f:include/uapi/linux/seg6_local.h +f:include/uapi/linux/selinux_netlink.h +f:include/uapi/linux/sem.h +f:include/uapi/linux/serial.h +f:include/uapi/linux/serial_core.h +f:include/uapi/linux/serial_reg.h +f:include/uapi/linux/serio.h +f:include/uapi/linux/sev-guest.h +f:include/uapi/linux/shm.h +f:include/uapi/linux/signal.h +f:include/uapi/linux/signalfd.h +f:include/uapi/linux/smc.h +f:include/uapi/linux/smc_diag.h +f:include/uapi/linux/smiapp.h +f:include/uapi/linux/snmp.h +f:include/uapi/linux/sock_diag.h +f:include/uapi/linux/socket.h +f:include/uapi/linux/sockios.h +f:include/uapi/linux/sonet.h +f:include/uapi/linux/sonypi.h +f:include/uapi/linux/sound.h +f:include/uapi/linux/soundcard.h +f:include/uapi/linux/spi/spi.h +f:include/uapi/linux/spi/spidev.h +f:include/uapi/linux/stat.h +f:include/uapi/linux/stddef.h +f:include/uapi/linux/stm.h +f:include/uapi/linux/string.h +f:include/uapi/linux/sunrpc/debug.h +f:include/uapi/linux/surface_aggregator/cdev.h +f:include/uapi/linux/surface_aggregator/dtx.h +f:include/uapi/linux/suspend_ioctls.h +f:include/uapi/linux/swab.h +f:include/uapi/linux/switchtec_ioctl.h +f:include/uapi/linux/sync_file.h +f:include/uapi/linux/synclink.h +f:include/uapi/linux/sysctl.h +f:include/uapi/linux/sysinfo.h +f:include/uapi/linux/target_core_user.h +f:include/uapi/linux/taskstats.h +f:include/uapi/linux/tc_act/tc_bpf.h +f:include/uapi/linux/tc_act/tc_connmark.h +f:include/uapi/linux/tc_act/tc_csum.h +f:include/uapi/linux/tc_act/tc_ct.h +f:include/uapi/linux/tc_act/tc_ctinfo.h +f:include/uapi/linux/tc_act/tc_defact.h +f:include/uapi/linux/tc_act/tc_gact.h +f:include/uapi/linux/tc_act/tc_gate.h +f:include/uapi/linux/tc_act/tc_ife.h +f:include/uapi/linux/tc_act/tc_mirred.h +f:include/uapi/linux/tc_act/tc_mpls.h +f:include/uapi/linux/tc_act/tc_nat.h +f:include/uapi/linux/tc_act/tc_pedit.h +f:include/uapi/linux/tc_act/tc_sample.h +f:include/uapi/linux/tc_act/tc_skbedit.h +f:include/uapi/linux/tc_act/tc_skbmod.h +f:include/uapi/linux/tc_act/tc_tunnel_key.h +f:include/uapi/linux/tc_act/tc_vlan.h +f:include/uapi/linux/tc_ematch/tc_em_cmp.h +f:include/uapi/linux/tc_ematch/tc_em_ipt.h +f:include/uapi/linux/tc_ematch/tc_em_meta.h +f:include/uapi/linux/tc_ematch/tc_em_nbyte.h +f:include/uapi/linux/tc_ematch/tc_em_text.h +f:include/uapi/linux/tcp.h +f:include/uapi/linux/tcp_metrics.h +f:include/uapi/linux/tdx-guest.h +f:include/uapi/linux/tee.h +f:include/uapi/linux/termios.h +f:include/uapi/linux/thermal.h +f:include/uapi/linux/thp7312.h +f:include/uapi/linux/time.h +f:include/uapi/linux/time_types.h +f:include/uapi/linux/timerfd.h +f:include/uapi/linux/times.h +f:include/uapi/linux/timex.h +f:include/uapi/linux/tiocl.h +f:include/uapi/linux/tipc.h +f:include/uapi/linux/tipc_config.h +f:include/uapi/linux/tipc_netlink.h +f:include/uapi/linux/tipc_sockets_diag.h +f:include/uapi/linux/tls.h +f:include/uapi/linux/toshiba.h +f:include/uapi/linux/tps6594_pfsm.h +f:include/uapi/linux/trace_mmap.h +f:include/uapi/linux/tty.h +f:include/uapi/linux/tty_flags.h +f:include/uapi/linux/types.h +f:include/uapi/linux/ublk_cmd.h +f:include/uapi/linux/udf_fs_i.h +f:include/uapi/linux/udmabuf.h +f:include/uapi/linux/udp.h +f:include/uapi/linux/uhid.h +f:include/uapi/linux/uinput.h +f:include/uapi/linux/uio.h +f:include/uapi/linux/uleds.h +f:include/uapi/linux/ultrasound.h +f:include/uapi/linux/um_timetravel.h +f:include/uapi/linux/un.h +f:include/uapi/linux/unistd.h +f:include/uapi/linux/unix_diag.h +f:include/uapi/linux/usb/audio.h +f:include/uapi/linux/usb/cdc-wdm.h +f:include/uapi/linux/usb/cdc.h +f:include/uapi/linux/usb/ch11.h +f:include/uapi/linux/usb/ch9.h +f:include/uapi/linux/usb/charger.h +f:include/uapi/linux/usb/functionfs.h +f:include/uapi/linux/usb/g_hid.h +f:include/uapi/linux/usb/g_printer.h +f:include/uapi/linux/usb/g_uvc.h +f:include/uapi/linux/usb/gadgetfs.h +f:include/uapi/linux/usb/midi.h +f:include/uapi/linux/usb/raw_gadget.h +f:include/uapi/linux/usb/tmc.h +f:include/uapi/linux/usb/video.h +f:include/uapi/linux/usbdevice_fs.h +f:include/uapi/linux/usbip.h +f:include/uapi/linux/user_events.h +f:include/uapi/linux/userfaultfd.h +f:include/uapi/linux/userio.h +f:include/uapi/linux/utime.h +f:include/uapi/linux/utsname.h +f:include/uapi/linux/uuid.h +f:include/uapi/linux/uvcvideo.h +f:include/uapi/linux/v4l2-common.h +f:include/uapi/linux/v4l2-controls.h +f:include/uapi/linux/v4l2-dv-timings.h +f:include/uapi/linux/v4l2-mediabus.h +f:include/uapi/linux/v4l2-subdev.h +f:include/uapi/linux/vbox_err.h +f:include/uapi/linux/vbox_vmmdev_types.h +f:include/uapi/linux/vboxguest.h +f:include/uapi/linux/vdpa.h +f:include/uapi/linux/vduse.h +f:include/uapi/linux/vesa.h +f:include/uapi/linux/veth.h +f:include/uapi/linux/vfio.h +f:include/uapi/linux/vfio_ccw.h +f:include/uapi/linux/vfio_zdev.h +f:include/uapi/linux/vhost.h +f:include/uapi/linux/vhost_types.h +f:include/uapi/linux/videodev2.h +f:include/uapi/linux/virtio_9p.h +f:include/uapi/linux/virtio_balloon.h +f:include/uapi/linux/virtio_blk.h +f:include/uapi/linux/virtio_bt.h +f:include/uapi/linux/virtio_config.h +f:include/uapi/linux/virtio_console.h +f:include/uapi/linux/virtio_crypto.h +f:include/uapi/linux/virtio_fs.h +f:include/uapi/linux/virtio_gpio.h +f:include/uapi/linux/virtio_gpu.h +f:include/uapi/linux/virtio_i2c.h +f:include/uapi/linux/virtio_ids.h +f:include/uapi/linux/virtio_input.h +f:include/uapi/linux/virtio_iommu.h +f:include/uapi/linux/virtio_mem.h +f:include/uapi/linux/virtio_mmio.h +f:include/uapi/linux/virtio_net.h +f:include/uapi/linux/virtio_pci.h +f:include/uapi/linux/virtio_pcidev.h +f:include/uapi/linux/virtio_pmem.h +f:include/uapi/linux/virtio_ring.h +f:include/uapi/linux/virtio_rng.h +f:include/uapi/linux/virtio_rtc.h +f:include/uapi/linux/virtio_scmi.h +f:include/uapi/linux/virtio_scsi.h +f:include/uapi/linux/virtio_snd.h +f:include/uapi/linux/virtio_types.h +f:include/uapi/linux/virtio_vsock.h +f:include/uapi/linux/vm_sockets.h +f:include/uapi/linux/vm_sockets_diag.h +f:include/uapi/linux/vmclock-abi.h +f:include/uapi/linux/vmcore.h +f:include/uapi/linux/vsockmon.h +f:include/uapi/linux/vt.h +f:include/uapi/linux/vtpm_proxy.h +f:include/uapi/linux/wait.h +f:include/uapi/linux/watch_queue.h +f:include/uapi/linux/watchdog.h +f:include/uapi/linux/wireguard.h +f:include/uapi/linux/wireless.h +f:include/uapi/linux/wmi.h +f:include/uapi/linux/wwan.h +f:include/uapi/linux/x25.h +f:include/uapi/linux/xattr.h +f:include/uapi/linux/xdp_diag.h +f:include/uapi/linux/xfrm.h +f:include/uapi/linux/xilinx-v4l2-controls.h +f:include/uapi/linux/zorro.h +f:include/uapi/linux/zorro_ids.h +f:include/uapi/misc/amd-apml.h +f:include/uapi/misc/fastrpc.h +f:include/uapi/misc/mrvl_cn10k_dpi.h +f:include/uapi/misc/ocxl.h +f:include/uapi/misc/pvpanic.h +f:include/uapi/misc/uacce/hisi_qm.h +f:include/uapi/misc/uacce/uacce.h +f:include/uapi/misc/xilinx_sdfec.h +f:include/uapi/mtd/inftl-user.h +f:include/uapi/mtd/mtd-abi.h +f:include/uapi/mtd/mtd-user.h +f:include/uapi/mtd/nftl-user.h +f:include/uapi/mtd/ubi-user.h +f:include/uapi/rdma/bnxt_re-abi.h +f:include/uapi/rdma/cxgb4-abi.h +f:include/uapi/rdma/efa-abi.h +f:include/uapi/rdma/erdma-abi.h +f:include/uapi/rdma/hfi/hfi1_ioctl.h +f:include/uapi/rdma/hfi/hfi1_user.h +f:include/uapi/rdma/hns-abi.h +f:include/uapi/rdma/ib_user_ioctl_cmds.h +f:include/uapi/rdma/ib_user_ioctl_verbs.h +f:include/uapi/rdma/ib_user_mad.h +f:include/uapi/rdma/ib_user_sa.h +f:include/uapi/rdma/ib_user_verbs.h +f:include/uapi/rdma/irdma-abi.h +f:include/uapi/rdma/mana-abi.h +f:include/uapi/rdma/mlx4-abi.h +f:include/uapi/rdma/mlx5-abi.h +f:include/uapi/rdma/mlx5_user_ioctl_cmds.h +f:include/uapi/rdma/mlx5_user_ioctl_verbs.h +f:include/uapi/rdma/mthca-abi.h +f:include/uapi/rdma/ocrdma-abi.h +f:include/uapi/rdma/qedr-abi.h +f:include/uapi/rdma/rdma_netlink.h +f:include/uapi/rdma/rdma_user_cm.h +f:include/uapi/rdma/rdma_user_ioctl.h +f:include/uapi/rdma/rdma_user_ioctl_cmds.h +f:include/uapi/rdma/rdma_user_rxe.h +f:include/uapi/rdma/rvt-abi.h +f:include/uapi/rdma/siw-abi.h +f:include/uapi/rdma/vmw_pvrdma-abi.h +f:include/uapi/regulator/regulator.h +f:include/uapi/scsi/fc/fc_els.h +f:include/uapi/scsi/fc/fc_fs.h +f:include/uapi/scsi/fc/fc_gs.h +f:include/uapi/scsi/fc/fc_ns.h +f:include/uapi/scsi/scsi_bsg_fc.h +f:include/uapi/scsi/scsi_bsg_mpi3mr.h +f:include/uapi/scsi/scsi_bsg_ufs.h +f:include/uapi/scsi/scsi_netlink.h +f:include/uapi/scsi/scsi_netlink_fc.h +f:include/uapi/sound/asequencer.h +f:include/uapi/sound/asoc.h +f:include/uapi/sound/asound.h +f:include/uapi/sound/asound_fm.h +f:include/uapi/sound/compress_offload.h +f:include/uapi/sound/compress_params.h +f:include/uapi/sound/emu10k1.h +f:include/uapi/sound/fcp.h +f:include/uapi/sound/firewire.h +f:include/uapi/sound/hdsp.h +f:include/uapi/sound/hdspm.h +f:include/uapi/sound/intel/avs/tokens.h +f:include/uapi/sound/sb16_csp.h +f:include/uapi/sound/scarlett2.h +f:include/uapi/sound/sfnt_info.h +f:include/uapi/sound/skl-tplg-interface.h +f:include/uapi/sound/snd_ar_tokens.h +f:include/uapi/sound/snd_sst_tokens.h +f:include/uapi/sound/sof/abi.h +f:include/uapi/sound/sof/fw.h +f:include/uapi/sound/sof/header.h +f:include/uapi/sound/sof/tokens.h +f:include/uapi/sound/tlv.h +f:include/uapi/sound/usb_stream.h +f:include/uapi/video/edid.h +f:include/uapi/video/sisfb.h +f:include/uapi/video/uvesafb.h +f:include/uapi/xen/evtchn.h +f:include/uapi/xen/gntalloc.h +f:include/uapi/xen/gntdev.h +f:include/uapi/xen/privcmd.h +f:include/ufs/ufs.h +f:include/ufs/ufs_quirks.h +f:include/ufs/ufshcd.h +f:include/ufs/ufshci.h +f:include/ufs/unipro.h +f:include/vdso/align.h +f:include/vdso/auxclock.h +f:include/vdso/bits.h +f:include/vdso/cache.h +f:include/vdso/clocksource.h +f:include/vdso/const.h +f:include/vdso/datapage.h +f:include/vdso/getrandom.h +f:include/vdso/gettime.h +f:include/vdso/helpers.h +f:include/vdso/jiffies.h +f:include/vdso/ktime.h +f:include/vdso/limits.h +f:include/vdso/math64.h +f:include/vdso/page.h +f:include/vdso/processor.h +f:include/vdso/time.h +f:include/vdso/time32.h +f:include/vdso/time64.h +f:include/vdso/unaligned.h +f:include/vdso/vsyscall.h +f:include/video/atmel_lcdc.h +f:include/video/aty128.h +f:include/video/broadsheetfb.h +f:include/video/cirrus.h +f:include/video/cmdline.h +f:include/video/cvisionppc.h +f:include/video/display_timing.h +f:include/video/edid.h +f:include/video/gbe.h +f:include/video/hecubafb.h +f:include/video/ili9320.h +f:include/video/imx-ipu-image-convert.h +f:include/video/imx-ipu-v3.h +f:include/video/kyro.h +f:include/video/mach64.h +f:include/video/maxinefb.h +f:include/video/metronomefb.h +f:include/video/mipi_display.h +f:include/video/mmp_disp.h +f:include/video/neomagic.h +f:include/video/newport.h +f:include/video/nomodeset.h +f:include/video/of_display_timing.h +f:include/video/of_videomode.h +f:include/video/omapfb_dss.h +f:include/video/omapvrfb.h +f:include/video/permedia2.h +f:include/video/pixel_format.h +f:include/video/platform_lcd.h +f:include/video/pm3fb.h +f:include/video/pmag-ba-fb.h +f:include/video/pmagb-b-fb.h +f:include/video/pxa168fb.h +f:include/video/radeon.h +f:include/video/s1d13xxxfb.h +f:include/video/sa1100fb.h +f:include/video/samsung_fimd.h +f:include/video/sh_mobile_lcdc.h +f:include/video/sisfb.h +f:include/video/sstfb.h +f:include/video/sticore.h +f:include/video/tdfx.h +f:include/video/tgafb.h +f:include/video/trident.h +f:include/video/udlfb.h +f:include/video/uvesafb.h +f:include/video/vga.h +f:include/video/videomode.h +f:include/xen/acpi.h +f:include/xen/arm/hypercall.h +f:include/xen/arm/hypervisor.h +f:include/xen/arm/interface.h +f:include/xen/arm/page.h +f:include/xen/arm/swiotlb-xen.h +f:include/xen/arm/xen-ops.h +f:include/xen/balloon.h +f:include/xen/events.h +f:include/xen/features.h +f:include/xen/grant_table.h +f:include/xen/hvc-console.h +f:include/xen/hvm.h +f:include/xen/interface/callback.h +f:include/xen/interface/elfnote.h +f:include/xen/interface/event_channel.h +f:include/xen/interface/features.h +f:include/xen/interface/grant_table.h +f:include/xen/interface/hvm/dm_op.h +f:include/xen/interface/hvm/hvm_op.h +f:include/xen/interface/hvm/hvm_vcpu.h +f:include/xen/interface/hvm/ioreq.h +f:include/xen/interface/hvm/params.h +f:include/xen/interface/hvm/start_info.h +f:include/xen/interface/io/9pfs.h +f:include/xen/interface/io/blkif.h +f:include/xen/interface/io/console.h +f:include/xen/interface/io/displif.h +f:include/xen/interface/io/fbif.h +f:include/xen/interface/io/kbdif.h +f:include/xen/interface/io/netif.h +f:include/xen/interface/io/pciif.h +f:include/xen/interface/io/protocols.h +f:include/xen/interface/io/pvcalls.h +f:include/xen/interface/io/ring.h +f:include/xen/interface/io/sndif.h +f:include/xen/interface/io/tpmif.h +f:include/xen/interface/io/usbif.h +f:include/xen/interface/io/vscsiif.h +f:include/xen/interface/io/xenbus.h +f:include/xen/interface/io/xs_wire.h +f:include/xen/interface/memory.h +f:include/xen/interface/nmi.h +f:include/xen/interface/physdev.h +f:include/xen/interface/platform.h +f:include/xen/interface/sched.h +f:include/xen/interface/vcpu.h +f:include/xen/interface/version.h +f:include/xen/interface/xen-mca.h +f:include/xen/interface/xen.h +f:include/xen/interface/xenpmu.h +f:include/xen/mem-reservation.h +f:include/xen/page.h +f:include/xen/pci.h +f:include/xen/platform_pci.h +f:include/xen/swiotlb-xen.h +f:include/xen/xen-front-pgdir-shbuf.h +f:include/xen/xen-ops.h +f:include/xen/xen.h +f:include/xen/xenbus.h +f:include/xen/xenbus_dev.h +f:init/.gitignore +f:init/.kunitconfig +f:init/Kconfig +f:init/Makefile +f:init/calibrate.c +f:init/do_mounts.c +f:init/do_mounts.h +f:init/do_mounts_initrd.c +f:init/do_mounts_rd.c +f:init/init_task.c +f:init/initramfs.c +f:init/initramfs_internal.h +f:init/initramfs_test.c +f:init/main.c +f:init/noinitramfs.c +f:init/version-timestamp.c +f:init/version.c +f:io_uring/Kconfig +f:io_uring/Makefile +f:io_uring/advise.c +f:io_uring/advise.h +f:io_uring/alloc_cache.c +f:io_uring/alloc_cache.h +f:io_uring/cancel.c +f:io_uring/cancel.h +f:io_uring/cmd_net.c +f:io_uring/epoll.c +f:io_uring/epoll.h +f:io_uring/eventfd.c +f:io_uring/eventfd.h +f:io_uring/fdinfo.c +f:io_uring/fdinfo.h +f:io_uring/filetable.c +f:io_uring/filetable.h +f:io_uring/fs.c +f:io_uring/fs.h +f:io_uring/futex.c +f:io_uring/futex.h +f:io_uring/io-wq.c +f:io_uring/io-wq.h +f:io_uring/io_uring.c +f:io_uring/io_uring.h +f:io_uring/kbuf.c +f:io_uring/kbuf.h +f:io_uring/memmap.c +f:io_uring/memmap.h +f:io_uring/mock_file.c +f:io_uring/msg_ring.c +f:io_uring/msg_ring.h +f:io_uring/napi.c +f:io_uring/napi.h +f:io_uring/net.c +f:io_uring/net.h +f:io_uring/nop.c +f:io_uring/nop.h +f:io_uring/notif.c +f:io_uring/notif.h +f:io_uring/opdef.c +f:io_uring/opdef.h +f:io_uring/openclose.c +f:io_uring/openclose.h +f:io_uring/poll.c +f:io_uring/poll.h +f:io_uring/refs.h +f:io_uring/register.c +f:io_uring/register.h +f:io_uring/rsrc.c +f:io_uring/rsrc.h +f:io_uring/rw.c +f:io_uring/rw.h +f:io_uring/slist.h +f:io_uring/splice.c +f:io_uring/splice.h +f:io_uring/sqpoll.c +f:io_uring/sqpoll.h +f:io_uring/statx.c +f:io_uring/statx.h +f:io_uring/sync.c +f:io_uring/sync.h +f:io_uring/tctx.c +f:io_uring/tctx.h +f:io_uring/timeout.c +f:io_uring/timeout.h +f:io_uring/truncate.c +f:io_uring/truncate.h +f:io_uring/uring_cmd.c +f:io_uring/uring_cmd.h +f:io_uring/waitid.c +f:io_uring/waitid.h +f:io_uring/xattr.c +f:io_uring/xattr.h +f:io_uring/zcrx.c +f:io_uring/zcrx.h +f:ipc/Makefile +f:ipc/compat.c +f:ipc/ipc_sysctl.c +f:ipc/mq_sysctl.c +f:ipc/mqueue.c +f:ipc/msg.c +f:ipc/msgutil.c +f:ipc/namespace.c +f:ipc/sem.c +f:ipc/shm.c +f:ipc/syscall.c +f:ipc/util.c +f:ipc/util.h +f:kernel/.gitignore +f:kernel/Kconfig.freezer +f:kernel/Kconfig.hz +f:kernel/Kconfig.kexec +f:kernel/Kconfig.locks +f:kernel/Kconfig.preempt +f:kernel/Makefile +f:kernel/acct.c +f:kernel/async.c +f:kernel/audit.c +f:kernel/audit.h +f:kernel/audit_fsnotify.c +f:kernel/audit_tree.c +f:kernel/audit_watch.c +f:kernel/auditfilter.c +f:kernel/auditsc.c +f:kernel/backtracetest.c +f:kernel/bounds.c +f:kernel/bpf/Kconfig +f:kernel/bpf/Makefile +f:kernel/bpf/arena.c +f:kernel/bpf/arraymap.c +f:kernel/bpf/bloom_filter.c +f:kernel/bpf/bpf_cgrp_storage.c +f:kernel/bpf/bpf_inode_storage.c +f:kernel/bpf/bpf_iter.c +f:kernel/bpf/bpf_local_storage.c +f:kernel/bpf/bpf_lru_list.c +f:kernel/bpf/bpf_lru_list.h +f:kernel/bpf/bpf_lsm.c +f:kernel/bpf/bpf_struct_ops.c +f:kernel/bpf/bpf_task_storage.c +f:kernel/bpf/btf.c +f:kernel/bpf/btf_iter.c +f:kernel/bpf/btf_relocate.c +f:kernel/bpf/cgroup.c +f:kernel/bpf/cgroup_iter.c +f:kernel/bpf/core.c +f:kernel/bpf/cpumap.c +f:kernel/bpf/cpumask.c +f:kernel/bpf/crypto.c +f:kernel/bpf/devmap.c +f:kernel/bpf/disasm.c +f:kernel/bpf/disasm.h +f:kernel/bpf/dispatcher.c +f:kernel/bpf/dmabuf_iter.c +f:kernel/bpf/hashtab.c +f:kernel/bpf/helpers.c +f:kernel/bpf/inode.c +f:kernel/bpf/kmem_cache_iter.c +f:kernel/bpf/link_iter.c +f:kernel/bpf/local_storage.c +f:kernel/bpf/log.c +f:kernel/bpf/lpm_trie.c +f:kernel/bpf/map_in_map.c +f:kernel/bpf/map_in_map.h +f:kernel/bpf/map_iter.c +f:kernel/bpf/memalloc.c +f:kernel/bpf/mmap_unlock_work.h +f:kernel/bpf/mprog.c +f:kernel/bpf/net_namespace.c +f:kernel/bpf/offload.c +f:kernel/bpf/percpu_freelist.c +f:kernel/bpf/percpu_freelist.h +f:kernel/bpf/preload/.gitignore +f:kernel/bpf/preload/Kconfig +f:kernel/bpf/preload/Makefile +f:kernel/bpf/preload/bpf_preload.h +f:kernel/bpf/preload/bpf_preload_kern.c +f:kernel/bpf/preload/iterators/.gitignore +f:kernel/bpf/preload/iterators/Makefile +f:kernel/bpf/preload/iterators/README +f:kernel/bpf/preload/iterators/iterators.bpf.c +f:kernel/bpf/preload/iterators/iterators.lskel-big-endian.h +f:kernel/bpf/preload/iterators/iterators.lskel-little-endian.h +f:kernel/bpf/prog_iter.c +f:kernel/bpf/queue_stack_maps.c +f:kernel/bpf/range_tree.c +f:kernel/bpf/range_tree.h +f:kernel/bpf/relo_core.c +f:kernel/bpf/reuseport_array.c +f:kernel/bpf/ringbuf.c +f:kernel/bpf/rqspinlock.c +f:kernel/bpf/rqspinlock.h +f:kernel/bpf/stackmap.c +f:kernel/bpf/stream.c +f:kernel/bpf/syscall.c +f:kernel/bpf/sysfs_btf.c +f:kernel/bpf/task_iter.c +f:kernel/bpf/tcx.c +f:kernel/bpf/tnum.c +f:kernel/bpf/token.c +f:kernel/bpf/trampoline.c +f:kernel/bpf/verifier.c +f:kernel/capability.c +f:kernel/cfi.c +f:kernel/cgroup/Makefile +f:kernel/cgroup/cgroup-internal.h +f:kernel/cgroup/cgroup-v1.c +f:kernel/cgroup/cgroup.c +f:kernel/cgroup/cpuset-internal.h +f:kernel/cgroup/cpuset-v1.c +f:kernel/cgroup/cpuset.c +f:kernel/cgroup/debug.c +f:kernel/cgroup/dmem.c +f:kernel/cgroup/freezer.c +f:kernel/cgroup/legacy_freezer.c +f:kernel/cgroup/misc.c +f:kernel/cgroup/namespace.c +f:kernel/cgroup/pids.c +f:kernel/cgroup/rdma.c +f:kernel/cgroup/rstat.c +f:kernel/compat.c +f:kernel/configs.c +f:kernel/configs/debug.config +f:kernel/configs/hardening.config +f:kernel/configs/kvm_guest.config +f:kernel/configs/nopm.config +f:kernel/configs/rust.config +f:kernel/configs/tiny-base.config +f:kernel/configs/tiny.config +f:kernel/configs/x86_debug.config +f:kernel/configs/xen.config +f:kernel/context_tracking.c +f:kernel/cpu.c +f:kernel/cpu_pm.c +f:kernel/crash_core.c +f:kernel/crash_dump_dm_crypt.c +f:kernel/crash_reserve.c +f:kernel/cred.c +f:kernel/debug/Makefile +f:kernel/debug/debug_core.c +f:kernel/debug/debug_core.h +f:kernel/debug/gdbstub.c +f:kernel/debug/kdb/.gitignore +f:kernel/debug/kdb/Makefile +f:kernel/debug/kdb/kdb_bp.c +f:kernel/debug/kdb/kdb_bt.c +f:kernel/debug/kdb/kdb_cmds +f:kernel/debug/kdb/kdb_debugger.c +f:kernel/debug/kdb/kdb_io.c +f:kernel/debug/kdb/kdb_keyboard.c +f:kernel/debug/kdb/kdb_main.c +f:kernel/debug/kdb/kdb_private.h +f:kernel/debug/kdb/kdb_support.c +f:kernel/delayacct.c +f:kernel/dma.c +f:kernel/dma/Kconfig +f:kernel/dma/Makefile +f:kernel/dma/coherent.c +f:kernel/dma/contiguous.c +f:kernel/dma/debug.c +f:kernel/dma/debug.h +f:kernel/dma/direct.c +f:kernel/dma/direct.h +f:kernel/dma/dummy.c +f:kernel/dma/map_benchmark.c +f:kernel/dma/mapping.c +f:kernel/dma/ops_helpers.c +f:kernel/dma/pool.c +f:kernel/dma/remap.c +f:kernel/dma/swiotlb.c +f:kernel/elfcorehdr.c +f:kernel/entry/Makefile +f:kernel/entry/common.c +f:kernel/entry/common.h +f:kernel/entry/kvm.c +f:kernel/entry/syscall-common.c +f:kernel/entry/syscall_user_dispatch.c +f:kernel/events/Makefile +f:kernel/events/callchain.c +f:kernel/events/core.c +f:kernel/events/hw_breakpoint.c +f:kernel/events/hw_breakpoint_test.c +f:kernel/events/internal.h +f:kernel/events/ring_buffer.c +f:kernel/events/uprobes.c +f:kernel/exec_domain.c +f:kernel/exit.c +f:kernel/exit.h +f:kernel/extable.c +f:kernel/fail_function.c +f:kernel/fork.c +f:kernel/freezer.c +f:kernel/futex/Makefile +f:kernel/futex/core.c +f:kernel/futex/futex.h +f:kernel/futex/pi.c +f:kernel/futex/requeue.c +f:kernel/futex/syscalls.c +f:kernel/futex/waitwake.c +f:kernel/gcov/Kconfig +f:kernel/gcov/Makefile +f:kernel/gcov/base.c +f:kernel/gcov/clang.c +f:kernel/gcov/fs.c +f:kernel/gcov/gcc_4_7.c +f:kernel/gcov/gcc_base.c +f:kernel/gcov/gcov.h +f:kernel/gen_kheaders.sh +f:kernel/groups.c +f:kernel/hung_task.c +f:kernel/iomem.c +f:kernel/irq/Kconfig +f:kernel/irq/Makefile +f:kernel/irq/affinity.c +f:kernel/irq/autoprobe.c +f:kernel/irq/chip.c +f:kernel/irq/cpuhotplug.c +f:kernel/irq/debug.h +f:kernel/irq/debugfs.c +f:kernel/irq/devres.c +f:kernel/irq/dummychip.c +f:kernel/irq/generic-chip.c +f:kernel/irq/handle.c +f:kernel/irq/internals.h +f:kernel/irq/ipi-mux.c +f:kernel/irq/ipi.c +f:kernel/irq/irq_sim.c +f:kernel/irq/irq_test.c +f:kernel/irq/irqdesc.c +f:kernel/irq/irqdomain.c +f:kernel/irq/kexec.c +f:kernel/irq/manage.c +f:kernel/irq/matrix.c +f:kernel/irq/migration.c +f:kernel/irq/msi.c +f:kernel/irq/pm.c +f:kernel/irq/proc.c +f:kernel/irq/resend.c +f:kernel/irq/settings.h +f:kernel/irq/spurious.c +f:kernel/irq/timings.c +f:kernel/irq_work.c +f:kernel/jump_label.c +f:kernel/kallsyms.c +f:kernel/kallsyms_internal.h +f:kernel/kallsyms_selftest.c +f:kernel/kallsyms_selftest.h +f:kernel/kcmp.c +f:kernel/kcov.c +f:kernel/kcsan/.kunitconfig +f:kernel/kcsan/Makefile +f:kernel/kcsan/core.c +f:kernel/kcsan/debugfs.c +f:kernel/kcsan/encoding.h +f:kernel/kcsan/kcsan.h +f:kernel/kcsan/kcsan_test.c +f:kernel/kcsan/permissive.h +f:kernel/kcsan/report.c +f:kernel/kcsan/selftest.c +f:kernel/kexec.c +f:kernel/kexec_core.c +f:kernel/kexec_elf.c +f:kernel/kexec_file.c +f:kernel/kexec_handover.c +f:kernel/kexec_internal.h +f:kernel/kheaders.c +f:kernel/kprobes.c +f:kernel/kstack_erase.c +f:kernel/ksyms_common.c +f:kernel/ksysfs.c +f:kernel/kthread.c +f:kernel/latencytop.c +f:kernel/livepatch/Kconfig +f:kernel/livepatch/Makefile +f:kernel/livepatch/core.c +f:kernel/livepatch/core.h +f:kernel/livepatch/patch.c +f:kernel/livepatch/patch.h +f:kernel/livepatch/shadow.c +f:kernel/livepatch/state.c +f:kernel/livepatch/state.h +f:kernel/livepatch/transition.c +f:kernel/livepatch/transition.h +f:kernel/locking/Makefile +f:kernel/locking/irqflag-debug.c +f:kernel/locking/lock_events.c +f:kernel/locking/lock_events.h +f:kernel/locking/lock_events_list.h +f:kernel/locking/lockdep.c +f:kernel/locking/lockdep_internals.h +f:kernel/locking/lockdep_proc.c +f:kernel/locking/lockdep_states.h +f:kernel/locking/locktorture.c +f:kernel/locking/mcs_spinlock.h +f:kernel/locking/mutex-debug.c +f:kernel/locking/mutex.c +f:kernel/locking/mutex.h +f:kernel/locking/osq_lock.c +f:kernel/locking/percpu-rwsem.c +f:kernel/locking/qrwlock.c +f:kernel/locking/qspinlock.c +f:kernel/locking/qspinlock.h +f:kernel/locking/qspinlock_paravirt.h +f:kernel/locking/qspinlock_stat.h +f:kernel/locking/rtmutex.c +f:kernel/locking/rtmutex_api.c +f:kernel/locking/rtmutex_common.h +f:kernel/locking/rwbase_rt.c +f:kernel/locking/rwsem.c +f:kernel/locking/semaphore.c +f:kernel/locking/spinlock.c +f:kernel/locking/spinlock_debug.c +f:kernel/locking/spinlock_rt.c +f:kernel/locking/test-ww_mutex.c +f:kernel/locking/ww_mutex.h +f:kernel/locking/ww_rt_mutex.c +f:kernel/module/Kconfig +f:kernel/module/Makefile +f:kernel/module/debug_kmemleak.c +f:kernel/module/decompress.c +f:kernel/module/dups.c +f:kernel/module/internal.h +f:kernel/module/kallsyms.c +f:kernel/module/kdb.c +f:kernel/module/kmod.c +f:kernel/module/livepatch.c +f:kernel/module/main.c +f:kernel/module/procfs.c +f:kernel/module/signing.c +f:kernel/module/stats.c +f:kernel/module/strict_rwx.c +f:kernel/module/sysfs.c +f:kernel/module/tracking.c +f:kernel/module/tree_lookup.c +f:kernel/module/version.c +f:kernel/module_signature.c +f:kernel/notifier.c +f:kernel/nsproxy.c +f:kernel/padata.c +f:kernel/panic.c +f:kernel/params.c +f:kernel/pid.c +f:kernel/pid_namespace.c +f:kernel/pid_sysctl.h +f:kernel/power/Kconfig +f:kernel/power/Makefile +f:kernel/power/autosleep.c +f:kernel/power/console.c +f:kernel/power/energy_model.c +f:kernel/power/hibernate.c +f:kernel/power/main.c +f:kernel/power/power.h +f:kernel/power/poweroff.c +f:kernel/power/process.c +f:kernel/power/qos.c +f:kernel/power/snapshot.c +f:kernel/power/suspend.c +f:kernel/power/suspend_test.c +f:kernel/power/swap.c +f:kernel/power/user.c +f:kernel/power/wakelock.c +f:kernel/printk/Makefile +f:kernel/printk/braille.c +f:kernel/printk/braille.h +f:kernel/printk/console_cmdline.h +f:kernel/printk/index.c +f:kernel/printk/internal.h +f:kernel/printk/nbcon.c +f:kernel/printk/printk.c +f:kernel/printk/printk_ringbuffer.c +f:kernel/printk/printk_ringbuffer.h +f:kernel/printk/printk_safe.c +f:kernel/printk/sysctl.c +f:kernel/profile.c +f:kernel/ptrace.c +f:kernel/range.c +f:kernel/rcu/Kconfig +f:kernel/rcu/Kconfig.debug +f:kernel/rcu/Makefile +f:kernel/rcu/rcu.h +f:kernel/rcu/rcu_segcblist.c +f:kernel/rcu/rcu_segcblist.h +f:kernel/rcu/rcuscale.c +f:kernel/rcu/rcutorture.c +f:kernel/rcu/refscale.c +f:kernel/rcu/srcutiny.c +f:kernel/rcu/srcutree.c +f:kernel/rcu/sync.c +f:kernel/rcu/tasks.h +f:kernel/rcu/tiny.c +f:kernel/rcu/tree.c +f:kernel/rcu/tree.h +f:kernel/rcu/tree_exp.h +f:kernel/rcu/tree_nocb.h +f:kernel/rcu/tree_plugin.h +f:kernel/rcu/tree_stall.h +f:kernel/rcu/update.c +f:kernel/reboot.c +f:kernel/regset.c +f:kernel/relay.c +f:kernel/resource.c +f:kernel/resource_kunit.c +f:kernel/rseq.c +f:kernel/scftorture.c +f:kernel/sched/Makefile +f:kernel/sched/autogroup.c +f:kernel/sched/autogroup.h +f:kernel/sched/build_policy.c +f:kernel/sched/build_utility.c +f:kernel/sched/clock.c +f:kernel/sched/completion.c +f:kernel/sched/core.c +f:kernel/sched/core_sched.c +f:kernel/sched/cpuacct.c +f:kernel/sched/cpudeadline.c +f:kernel/sched/cpudeadline.h +f:kernel/sched/cpufreq.c +f:kernel/sched/cpufreq_schedutil.c +f:kernel/sched/cpupri.c +f:kernel/sched/cpupri.h +f:kernel/sched/cputime.c +f:kernel/sched/deadline.c +f:kernel/sched/debug.c +f:kernel/sched/ext.c +f:kernel/sched/ext.h +f:kernel/sched/ext_idle.c +f:kernel/sched/ext_idle.h +f:kernel/sched/fair.c +f:kernel/sched/features.h +f:kernel/sched/idle.c +f:kernel/sched/isolation.c +f:kernel/sched/loadavg.c +f:kernel/sched/membarrier.c +f:kernel/sched/pelt.c +f:kernel/sched/pelt.h +f:kernel/sched/psi.c +f:kernel/sched/rt.c +f:kernel/sched/sched-pelt.h +f:kernel/sched/sched.h +f:kernel/sched/smp.h +f:kernel/sched/stats.c +f:kernel/sched/stats.h +f:kernel/sched/stop_task.c +f:kernel/sched/swait.c +f:kernel/sched/syscalls.c +f:kernel/sched/topology.c +f:kernel/sched/wait.c +f:kernel/sched/wait_bit.c +f:kernel/scs.c +f:kernel/seccomp.c +f:kernel/signal.c +f:kernel/smp.c +f:kernel/smpboot.c +f:kernel/smpboot.h +f:kernel/softirq.c +f:kernel/stacktrace.c +f:kernel/static_call.c +f:kernel/static_call_inline.c +f:kernel/stop_machine.c +f:kernel/sys.c +f:kernel/sys_ni.c +f:kernel/sysctl-test.c +f:kernel/sysctl.c +f:kernel/task_work.c +f:kernel/taskstats.c +f:kernel/time/Kconfig +f:kernel/time/Makefile +f:kernel/time/alarmtimer.c +f:kernel/time/clockevents.c +f:kernel/time/clocksource-wdtest.c +f:kernel/time/clocksource.c +f:kernel/time/hrtimer.c +f:kernel/time/itimer.c +f:kernel/time/jiffies.c +f:kernel/time/namespace.c +f:kernel/time/ntp.c +f:kernel/time/ntp_internal.h +f:kernel/time/posix-clock.c +f:kernel/time/posix-cpu-timers.c +f:kernel/time/posix-stubs.c +f:kernel/time/posix-timers.c +f:kernel/time/posix-timers.h +f:kernel/time/sched_clock.c +f:kernel/time/sleep_timeout.c +f:kernel/time/test_udelay.c +f:kernel/time/tick-broadcast-hrtimer.c +f:kernel/time/tick-broadcast.c +f:kernel/time/tick-common.c +f:kernel/time/tick-internal.h +f:kernel/time/tick-legacy.c +f:kernel/time/tick-oneshot.c +f:kernel/time/tick-sched.c +f:kernel/time/tick-sched.h +f:kernel/time/time.c +f:kernel/time/time_test.c +f:kernel/time/timeconst.bc +f:kernel/time/timeconv.c +f:kernel/time/timecounter.c +f:kernel/time/timekeeping.c +f:kernel/time/timekeeping.h +f:kernel/time/timekeeping_debug.c +f:kernel/time/timekeeping_internal.h +f:kernel/time/timer.c +f:kernel/time/timer_list.c +f:kernel/time/timer_migration.c +f:kernel/time/timer_migration.h +f:kernel/time/vsyscall.c +f:kernel/torture.c +f:kernel/trace/Kconfig +f:kernel/trace/Makefile +f:kernel/trace/blktrace.c +f:kernel/trace/bpf_trace.c +f:kernel/trace/bpf_trace.h +f:kernel/trace/error_report-traces.c +f:kernel/trace/fgraph.c +f:kernel/trace/fprobe.c +f:kernel/trace/ftrace.c +f:kernel/trace/ftrace_internal.h +f:kernel/trace/kprobe_event_gen_test.c +f:kernel/trace/pid_list.c +f:kernel/trace/pid_list.h +f:kernel/trace/power-traces.c +f:kernel/trace/preemptirq_delay_test.c +f:kernel/trace/rethook.c +f:kernel/trace/ring_buffer.c +f:kernel/trace/ring_buffer_benchmark.c +f:kernel/trace/rpm-traces.c +f:kernel/trace/rv/Kconfig +f:kernel/trace/rv/Makefile +f:kernel/trace/rv/monitors/nrp/Kconfig +f:kernel/trace/rv/monitors/nrp/nrp.c +f:kernel/trace/rv/monitors/nrp/nrp.h +f:kernel/trace/rv/monitors/nrp/nrp_trace.h +f:kernel/trace/rv/monitors/opid/Kconfig +f:kernel/trace/rv/monitors/opid/opid.c +f:kernel/trace/rv/monitors/opid/opid.h +f:kernel/trace/rv/monitors/opid/opid_trace.h +f:kernel/trace/rv/monitors/pagefault/Kconfig +f:kernel/trace/rv/monitors/pagefault/pagefault.c +f:kernel/trace/rv/monitors/pagefault/pagefault.h +f:kernel/trace/rv/monitors/pagefault/pagefault_trace.h +f:kernel/trace/rv/monitors/rtapp/Kconfig +f:kernel/trace/rv/monitors/rtapp/rtapp.c +f:kernel/trace/rv/monitors/rtapp/rtapp.h +f:kernel/trace/rv/monitors/sched/Kconfig +f:kernel/trace/rv/monitors/sched/sched.c +f:kernel/trace/rv/monitors/sched/sched.h +f:kernel/trace/rv/monitors/sco/Kconfig +f:kernel/trace/rv/monitors/sco/sco.c +f:kernel/trace/rv/monitors/sco/sco.h +f:kernel/trace/rv/monitors/sco/sco_trace.h +f:kernel/trace/rv/monitors/scpd/Kconfig +f:kernel/trace/rv/monitors/scpd/scpd.c +f:kernel/trace/rv/monitors/scpd/scpd.h +f:kernel/trace/rv/monitors/scpd/scpd_trace.h +f:kernel/trace/rv/monitors/sleep/Kconfig +f:kernel/trace/rv/monitors/sleep/sleep.c +f:kernel/trace/rv/monitors/sleep/sleep.h +f:kernel/trace/rv/monitors/sleep/sleep_trace.h +f:kernel/trace/rv/monitors/snep/Kconfig +f:kernel/trace/rv/monitors/snep/snep.c +f:kernel/trace/rv/monitors/snep/snep.h +f:kernel/trace/rv/monitors/snep/snep_trace.h +f:kernel/trace/rv/monitors/snroc/Kconfig +f:kernel/trace/rv/monitors/snroc/snroc.c +f:kernel/trace/rv/monitors/snroc/snroc.h +f:kernel/trace/rv/monitors/snroc/snroc_trace.h +f:kernel/trace/rv/monitors/sssw/Kconfig +f:kernel/trace/rv/monitors/sssw/sssw.c +f:kernel/trace/rv/monitors/sssw/sssw.h +f:kernel/trace/rv/monitors/sssw/sssw_trace.h +f:kernel/trace/rv/monitors/sts/Kconfig +f:kernel/trace/rv/monitors/sts/sts.c +f:kernel/trace/rv/monitors/sts/sts.h +f:kernel/trace/rv/monitors/sts/sts_trace.h +f:kernel/trace/rv/monitors/wip/Kconfig +f:kernel/trace/rv/monitors/wip/wip.c +f:kernel/trace/rv/monitors/wip/wip.h +f:kernel/trace/rv/monitors/wip/wip_trace.h +f:kernel/trace/rv/monitors/wwnr/Kconfig +f:kernel/trace/rv/monitors/wwnr/wwnr.c +f:kernel/trace/rv/monitors/wwnr/wwnr.h +f:kernel/trace/rv/monitors/wwnr/wwnr_trace.h +f:kernel/trace/rv/reactor_panic.c +f:kernel/trace/rv/reactor_printk.c +f:kernel/trace/rv/rv.c +f:kernel/trace/rv/rv.h +f:kernel/trace/rv/rv_reactors.c +f:kernel/trace/rv/rv_trace.h +f:kernel/trace/synth_event_gen_test.c +f:kernel/trace/trace.c +f:kernel/trace/trace.h +f:kernel/trace/trace_benchmark.c +f:kernel/trace/trace_benchmark.h +f:kernel/trace/trace_boot.c +f:kernel/trace/trace_branch.c +f:kernel/trace/trace_btf.c +f:kernel/trace/trace_btf.h +f:kernel/trace/trace_clock.c +f:kernel/trace/trace_dynevent.c +f:kernel/trace/trace_dynevent.h +f:kernel/trace/trace_entries.h +f:kernel/trace/trace_eprobe.c +f:kernel/trace/trace_event_perf.c +f:kernel/trace/trace_events.c +f:kernel/trace/trace_events_filter.c +f:kernel/trace/trace_events_filter_test.h +f:kernel/trace/trace_events_hist.c +f:kernel/trace/trace_events_inject.c +f:kernel/trace/trace_events_synth.c +f:kernel/trace/trace_events_trigger.c +f:kernel/trace/trace_events_user.c +f:kernel/trace/trace_export.c +f:kernel/trace/trace_fprobe.c +f:kernel/trace/trace_functions.c +f:kernel/trace/trace_functions_graph.c +f:kernel/trace/trace_hwlat.c +f:kernel/trace/trace_irqsoff.c +f:kernel/trace/trace_kdb.c +f:kernel/trace/trace_kprobe.c +f:kernel/trace/trace_kprobe_selftest.c +f:kernel/trace/trace_kprobe_selftest.h +f:kernel/trace/trace_mmiotrace.c +f:kernel/trace/trace_nop.c +f:kernel/trace/trace_osnoise.c +f:kernel/trace/trace_output.c +f:kernel/trace/trace_output.h +f:kernel/trace/trace_preemptirq.c +f:kernel/trace/trace_printk.c +f:kernel/trace/trace_probe.c +f:kernel/trace/trace_probe.h +f:kernel/trace/trace_probe_kernel.h +f:kernel/trace/trace_probe_tmpl.h +f:kernel/trace/trace_recursion_record.c +f:kernel/trace/trace_sched_switch.c +f:kernel/trace/trace_sched_wakeup.c +f:kernel/trace/trace_selftest.c +f:kernel/trace/trace_selftest_dynamic.c +f:kernel/trace/trace_seq.c +f:kernel/trace/trace_stack.c +f:kernel/trace/trace_stat.c +f:kernel/trace/trace_stat.h +f:kernel/trace/trace_synth.h +f:kernel/trace/trace_syscalls.c +f:kernel/trace/trace_uprobe.c +f:kernel/trace/tracing_map.c +f:kernel/trace/tracing_map.h +f:kernel/tracepoint.c +f:kernel/tsacct.c +f:kernel/ucount.c +f:kernel/uid16.c +f:kernel/uid16.h +f:kernel/umh.c +f:kernel/up.c +f:kernel/user-return-notifier.c +f:kernel/user.c +f:kernel/user_namespace.c +f:kernel/utsname.c +f:kernel/utsname_sysctl.c +f:kernel/vhost_task.c +f:kernel/vmcore_info.c +f:kernel/watch_queue.c +f:kernel/watchdog.c +f:kernel/watchdog_buddy.c +f:kernel/watchdog_perf.c +f:kernel/workqueue.c +f:kernel/workqueue_internal.h +f:lib/.gitignore +f:lib/842/842.h +f:lib/842/842_compress.c +f:lib/842/842_debugfs.h +f:lib/842/842_decompress.c +f:lib/842/Makefile +f:lib/Kconfig +f:lib/Kconfig.debug +f:lib/Kconfig.kasan +f:lib/Kconfig.kcsan +f:lib/Kconfig.kfence +f:lib/Kconfig.kgdb +f:lib/Kconfig.kmsan +f:lib/Kconfig.ubsan +f:lib/Makefile +f:lib/alloc_tag.c +f:lib/argv_split.c +f:lib/ashldi3.c +f:lib/ashrdi3.c +f:lib/asn1_decoder.c +f:lib/asn1_encoder.c +f:lib/assoc_array.c +f:lib/atomic64.c +f:lib/atomic64_test.c +f:lib/audit.c +f:lib/base64.c +f:lib/bcd.c +f:lib/bch.c +f:lib/bitmap-str.c +f:lib/bitmap.c +f:lib/bitrev.c +f:lib/bootconfig-data.S +f:lib/bootconfig.c +f:lib/bsearch.c +f:lib/btree.c +f:lib/bucket_locks.c +f:lib/bug.c +f:lib/build_OID_registry +f:lib/buildid.c +f:lib/bust_spinlocks.c +f:lib/check_signature.c +f:lib/checksum.c +f:lib/closure.c +f:lib/clz_ctz.c +f:lib/clz_tab.c +f:lib/cmdline.c +f:lib/cmpdi2.c +f:lib/cmpxchg-emu.c +f:lib/codetag.c +f:lib/compat_audit.c +f:lib/cpu_rmap.c +f:lib/cpumask.c +f:lib/crc/.gitignore +f:lib/crc/Kconfig +f:lib/crc/Makefile +f:lib/crc/arm/crc-t10dif-core.S +f:lib/crc/arm/crc-t10dif.h +f:lib/crc/arm/crc32-core.S +f:lib/crc/arm/crc32.h +f:lib/crc/arm64/crc-t10dif-core.S +f:lib/crc/arm64/crc-t10dif.h +f:lib/crc/arm64/crc32-core.S +f:lib/crc/arm64/crc32.h +f:lib/crc/crc-ccitt.c +f:lib/crc/crc-itu-t.c +f:lib/crc/crc-t10dif-main.c +f:lib/crc/crc16.c +f:lib/crc/crc32-main.c +f:lib/crc/crc4.c +f:lib/crc/crc64-main.c +f:lib/crc/crc7.c +f:lib/crc/crc8.c +f:lib/crc/gen_crc32table.c +f:lib/crc/gen_crc64table.c +f:lib/crc/loongarch/crc32.h +f:lib/crc/mips/crc32.h +f:lib/crc/powerpc/crc-t10dif.h +f:lib/crc/powerpc/crc-vpmsum-template.S +f:lib/crc/powerpc/crc32.h +f:lib/crc/powerpc/crc32c-vpmsum_asm.S +f:lib/crc/powerpc/crct10dif-vpmsum_asm.S +f:lib/crc/riscv/crc-clmul-consts.h +f:lib/crc/riscv/crc-clmul-template.h +f:lib/crc/riscv/crc-clmul.h +f:lib/crc/riscv/crc-t10dif.h +f:lib/crc/riscv/crc16_msb.c +f:lib/crc/riscv/crc32.h +f:lib/crc/riscv/crc32_lsb.c +f:lib/crc/riscv/crc32_msb.c +f:lib/crc/riscv/crc64.h +f:lib/crc/riscv/crc64_lsb.c +f:lib/crc/riscv/crc64_msb.c +f:lib/crc/s390/crc32-vx.h +f:lib/crc/s390/crc32.h +f:lib/crc/s390/crc32be-vx.c +f:lib/crc/s390/crc32le-vx.c +f:lib/crc/sparc/crc32.h +f:lib/crc/sparc/crc32c_asm.S +f:lib/crc/tests/Makefile +f:lib/crc/tests/crc_kunit.c +f:lib/crc/x86/crc-pclmul-consts.h +f:lib/crc/x86/crc-pclmul-template.S +f:lib/crc/x86/crc-pclmul-template.h +f:lib/crc/x86/crc-t10dif.h +f:lib/crc/x86/crc16-msb-pclmul.S +f:lib/crc/x86/crc32-pclmul.S +f:lib/crc/x86/crc32.h +f:lib/crc/x86/crc32c-3way.S +f:lib/crc/x86/crc64-pclmul.S +f:lib/crc/x86/crc64.h +f:lib/crypto/Kconfig +f:lib/crypto/Makefile +f:lib/crypto/aes.c +f:lib/crypto/aescfb.c +f:lib/crypto/aesgcm.c +f:lib/crypto/arc4.c +f:lib/crypto/arm/.gitignore +f:lib/crypto/arm/Kconfig +f:lib/crypto/arm/Makefile +f:lib/crypto/arm/blake2s-core.S +f:lib/crypto/arm/blake2s-glue.c +f:lib/crypto/arm/chacha-glue.c +f:lib/crypto/arm/chacha-neon-core.S +f:lib/crypto/arm/chacha-scalar-core.S +f:lib/crypto/arm/poly1305-armv4.pl +f:lib/crypto/arm/poly1305-glue.c +f:lib/crypto/arm/sha1-armv4-large.S +f:lib/crypto/arm/sha1-armv7-neon.S +f:lib/crypto/arm/sha1-ce-core.S +f:lib/crypto/arm/sha1.h +f:lib/crypto/arm/sha256-armv4.pl +f:lib/crypto/arm/sha256-ce.S +f:lib/crypto/arm/sha256.h +f:lib/crypto/arm/sha512-armv4.pl +f:lib/crypto/arm/sha512.h +f:lib/crypto/arm64/.gitignore +f:lib/crypto/arm64/Kconfig +f:lib/crypto/arm64/Makefile +f:lib/crypto/arm64/chacha-neon-core.S +f:lib/crypto/arm64/chacha-neon-glue.c +f:lib/crypto/arm64/poly1305-armv8.pl +f:lib/crypto/arm64/poly1305-glue.c +f:lib/crypto/arm64/sha1-ce-core.S +f:lib/crypto/arm64/sha1.h +f:lib/crypto/arm64/sha2-armv8.pl +f:lib/crypto/arm64/sha256-ce.S +f:lib/crypto/arm64/sha256.h +f:lib/crypto/arm64/sha512-ce-core.S +f:lib/crypto/arm64/sha512.h +f:lib/crypto/blake2s-generic.c +f:lib/crypto/blake2s-selftest.c +f:lib/crypto/blake2s.c +f:lib/crypto/chacha.c +f:lib/crypto/chacha20poly1305-selftest.c +f:lib/crypto/chacha20poly1305.c +f:lib/crypto/curve25519-fiat32.c +f:lib/crypto/curve25519-generic.c +f:lib/crypto/curve25519-hacl64.c +f:lib/crypto/curve25519-selftest.c +f:lib/crypto/curve25519.c +f:lib/crypto/des.c +f:lib/crypto/gf128mul.c +f:lib/crypto/hash_info.c +f:lib/crypto/libchacha.c +f:lib/crypto/memneq.c +f:lib/crypto/mips/.gitignore +f:lib/crypto/mips/Kconfig +f:lib/crypto/mips/Makefile +f:lib/crypto/mips/chacha-core.S +f:lib/crypto/mips/chacha-glue.c +f:lib/crypto/mips/poly1305-glue.c +f:lib/crypto/mips/poly1305-mips.pl +f:lib/crypto/mips/sha1.h +f:lib/crypto/mips/sha256.h +f:lib/crypto/mips/sha512.h +f:lib/crypto/mpi/Makefile +f:lib/crypto/mpi/generic_mpih-add1.c +f:lib/crypto/mpi/generic_mpih-lshift.c +f:lib/crypto/mpi/generic_mpih-mul1.c +f:lib/crypto/mpi/generic_mpih-mul2.c +f:lib/crypto/mpi/generic_mpih-mul3.c +f:lib/crypto/mpi/generic_mpih-rshift.c +f:lib/crypto/mpi/generic_mpih-sub1.c +f:lib/crypto/mpi/longlong.h +f:lib/crypto/mpi/mpi-add.c +f:lib/crypto/mpi/mpi-bit.c +f:lib/crypto/mpi/mpi-cmp.c +f:lib/crypto/mpi/mpi-div.c +f:lib/crypto/mpi/mpi-inline.h +f:lib/crypto/mpi/mpi-internal.h +f:lib/crypto/mpi/mpi-mod.c +f:lib/crypto/mpi/mpi-mul.c +f:lib/crypto/mpi/mpi-pow.c +f:lib/crypto/mpi/mpi-sub-ui.c +f:lib/crypto/mpi/mpicoder.c +f:lib/crypto/mpi/mpih-cmp.c +f:lib/crypto/mpi/mpih-div.c +f:lib/crypto/mpi/mpih-mul.c +f:lib/crypto/mpi/mpiutil.c +f:lib/crypto/poly1305-donna32.c +f:lib/crypto/poly1305-donna64.c +f:lib/crypto/poly1305-generic.c +f:lib/crypto/poly1305.c +f:lib/crypto/powerpc/Kconfig +f:lib/crypto/powerpc/Makefile +f:lib/crypto/powerpc/chacha-p10-glue.c +f:lib/crypto/powerpc/chacha-p10le-8x.S +f:lib/crypto/powerpc/poly1305-p10-glue.c +f:lib/crypto/powerpc/poly1305-p10le_64.S +f:lib/crypto/powerpc/sha1-powerpc-asm.S +f:lib/crypto/powerpc/sha1-spe-asm.S +f:lib/crypto/powerpc/sha1.h +f:lib/crypto/powerpc/sha256-spe-asm.S +f:lib/crypto/powerpc/sha256.h +f:lib/crypto/riscv/Kconfig +f:lib/crypto/riscv/Makefile +f:lib/crypto/riscv/chacha-riscv64-glue.c +f:lib/crypto/riscv/chacha-riscv64-zvkb.S +f:lib/crypto/riscv/sha256-riscv64-zvknha_or_zvknhb-zvkb.S +f:lib/crypto/riscv/sha256.h +f:lib/crypto/riscv/sha512-riscv64-zvknhb-zvkb.S +f:lib/crypto/riscv/sha512.h +f:lib/crypto/s390/Kconfig +f:lib/crypto/s390/Makefile +f:lib/crypto/s390/chacha-glue.c +f:lib/crypto/s390/chacha-s390.S +f:lib/crypto/s390/chacha-s390.h +f:lib/crypto/s390/sha1.h +f:lib/crypto/s390/sha256.h +f:lib/crypto/s390/sha512.h +f:lib/crypto/sha1.c +f:lib/crypto/sha256.c +f:lib/crypto/sha512.c +f:lib/crypto/simd.c +f:lib/crypto/sm3.c +f:lib/crypto/sparc/sha1.h +f:lib/crypto/sparc/sha1_asm.S +f:lib/crypto/sparc/sha256.h +f:lib/crypto/sparc/sha256_asm.S +f:lib/crypto/sparc/sha512.h +f:lib/crypto/sparc/sha512_asm.S +f:lib/crypto/tests/Kconfig +f:lib/crypto/tests/Makefile +f:lib/crypto/tests/hash-test-template.h +f:lib/crypto/tests/poly1305-testvecs.h +f:lib/crypto/tests/poly1305_kunit.c +f:lib/crypto/tests/sha1-testvecs.h +f:lib/crypto/tests/sha1_kunit.c +f:lib/crypto/tests/sha224-testvecs.h +f:lib/crypto/tests/sha224_kunit.c +f:lib/crypto/tests/sha256-testvecs.h +f:lib/crypto/tests/sha256_kunit.c +f:lib/crypto/tests/sha384-testvecs.h +f:lib/crypto/tests/sha384_kunit.c +f:lib/crypto/tests/sha512-testvecs.h +f:lib/crypto/tests/sha512_kunit.c +f:lib/crypto/utils.c +f:lib/crypto/x86/.gitignore +f:lib/crypto/x86/Kconfig +f:lib/crypto/x86/Makefile +f:lib/crypto/x86/blake2s-core.S +f:lib/crypto/x86/blake2s-glue.c +f:lib/crypto/x86/chacha-avx2-x86_64.S +f:lib/crypto/x86/chacha-avx512vl-x86_64.S +f:lib/crypto/x86/chacha-ssse3-x86_64.S +f:lib/crypto/x86/chacha_glue.c +f:lib/crypto/x86/poly1305-x86_64-cryptogams.pl +f:lib/crypto/x86/poly1305_glue.c +f:lib/crypto/x86/sha1-avx2-asm.S +f:lib/crypto/x86/sha1-ni-asm.S +f:lib/crypto/x86/sha1-ssse3-and-avx.S +f:lib/crypto/x86/sha1.h +f:lib/crypto/x86/sha256-avx-asm.S +f:lib/crypto/x86/sha256-avx2-asm.S +f:lib/crypto/x86/sha256-ni-asm.S +f:lib/crypto/x86/sha256-ssse3-asm.S +f:lib/crypto/x86/sha256.h +f:lib/crypto/x86/sha512-avx-asm.S +f:lib/crypto/x86/sha512-avx2-asm.S +f:lib/crypto/x86/sha512-ssse3-asm.S +f:lib/crypto/x86/sha512.h +f:lib/ctype.c +f:lib/debug_info.c +f:lib/debug_locks.c +f:lib/debugobjects.c +f:lib/dec_and_lock.c +f:lib/decompress.c +f:lib/decompress_bunzip2.c +f:lib/decompress_inflate.c +f:lib/decompress_unlz4.c +f:lib/decompress_unlzma.c +f:lib/decompress_unlzo.c +f:lib/decompress_unxz.c +f:lib/decompress_unzstd.c +f:lib/devmem_is_allowed.c +f:lib/devres.c +f:lib/dhry.h +f:lib/dhry_1.c +f:lib/dhry_2.c +f:lib/dhry_run.c +f:lib/digsig.c +f:lib/dim/Makefile +f:lib/dim/dim.c +f:lib/dim/net_dim.c +f:lib/dim/rdma_dim.c +f:lib/dump_stack.c +f:lib/dynamic_debug.c +f:lib/dynamic_queue_limits.c +f:lib/earlycpio.c +f:lib/errname.c +f:lib/error-inject.c +f:lib/errseq.c +f:lib/extable.c +f:lib/fault-inject-usercopy.c +f:lib/fault-inject.c +f:lib/fdt.c +f:lib/fdt_addresses.c +f:lib/fdt_empty_tree.c +f:lib/fdt_ro.c +f:lib/fdt_rw.c +f:lib/fdt_strerror.c +f:lib/fdt_sw.c +f:lib/fdt_wip.c +f:lib/find_bit.c +f:lib/find_bit_benchmark.c +f:lib/flex_proportions.c +f:lib/fonts/Kconfig +f:lib/fonts/Makefile +f:lib/fonts/font_10x18.c +f:lib/fonts/font_6x10.c +f:lib/fonts/font_6x11.c +f:lib/fonts/font_6x8.c +f:lib/fonts/font_7x14.c +f:lib/fonts/font_8x16.c +f:lib/fonts/font_8x8.c +f:lib/fonts/font_acorn_8x8.c +f:lib/fonts/font_mini_4x6.c +f:lib/fonts/font_pearl_8x8.c +f:lib/fonts/font_sun12x22.c +f:lib/fonts/font_sun8x16.c +f:lib/fonts/font_ter16x32.c +f:lib/fonts/fonts.c +f:lib/fw_table.c +f:lib/genalloc.c +f:lib/generic-radix-tree.c +f:lib/glob.c +f:lib/globtest.c +f:lib/group_cpus.c +f:lib/hexdump.c +f:lib/hweight.c +f:lib/idr.c +f:lib/inflate.c +f:lib/interval_tree.c +f:lib/interval_tree_test.c +f:lib/iomap.c +f:lib/iomap_copy.c +f:lib/iomem_copy.c +f:lib/iommu-helper.c +f:lib/iov_iter.c +f:lib/irq_poll.c +f:lib/irq_regs.c +f:lib/is_single_threaded.c +f:lib/kasprintf.c +f:lib/kfifo.c +f:lib/klist.c +f:lib/kobject.c +f:lib/kobject_uevent.c +f:lib/kstrtox.c +f:lib/kstrtox.h +f:lib/kunit/.kunitconfig +f:lib/kunit/Kconfig +f:lib/kunit/Makefile +f:lib/kunit/assert.c +f:lib/kunit/assert_test.c +f:lib/kunit/attributes.c +f:lib/kunit/debugfs.c +f:lib/kunit/debugfs.h +f:lib/kunit/device-impl.h +f:lib/kunit/device.c +f:lib/kunit/executor.c +f:lib/kunit/executor_test.c +f:lib/kunit/hooks-impl.h +f:lib/kunit/hooks.c +f:lib/kunit/kunit-example-test.c +f:lib/kunit/kunit-test.c +f:lib/kunit/platform-test.c +f:lib/kunit/platform.c +f:lib/kunit/resource.c +f:lib/kunit/static_stub.c +f:lib/kunit/string-stream-test.c +f:lib/kunit/string-stream.c +f:lib/kunit/string-stream.h +f:lib/kunit/test.c +f:lib/kunit/try-catch-impl.h +f:lib/kunit/try-catch.c +f:lib/kunit/user_alloc.c +f:lib/linear_ranges.c +f:lib/list_debug.c +f:lib/list_sort.c +f:lib/llist.c +f:lib/locking-selftest-hardirq.h +f:lib/locking-selftest-mutex.h +f:lib/locking-selftest-rlock-hardirq.h +f:lib/locking-selftest-rlock-softirq.h +f:lib/locking-selftest-rlock.h +f:lib/locking-selftest-rsem.h +f:lib/locking-selftest-rtmutex.h +f:lib/locking-selftest-softirq.h +f:lib/locking-selftest-spin-hardirq.h +f:lib/locking-selftest-spin-softirq.h +f:lib/locking-selftest-spin.h +f:lib/locking-selftest-wlock-hardirq.h +f:lib/locking-selftest-wlock-softirq.h +f:lib/locking-selftest-wlock.h +f:lib/locking-selftest-wsem.h +f:lib/locking-selftest.c +f:lib/lockref.c +f:lib/logic_iomem.c +f:lib/logic_pio.c +f:lib/lru_cache.c +f:lib/lshrdi3.c +f:lib/lwq.c +f:lib/lz4/Makefile +f:lib/lz4/lz4_compress.c +f:lib/lz4/lz4_decompress.c +f:lib/lz4/lz4defs.h +f:lib/lz4/lz4hc_compress.c +f:lib/lzo/Makefile +f:lib/lzo/lzo1x_compress.c +f:lib/lzo/lzo1x_compress_safe.c +f:lib/lzo/lzo1x_decompress_safe.c +f:lib/lzo/lzodefs.h +f:lib/maple_tree.c +f:lib/math/Kconfig +f:lib/math/Makefile +f:lib/math/cordic.c +f:lib/math/div64.c +f:lib/math/gcd.c +f:lib/math/int_log.c +f:lib/math/int_pow.c +f:lib/math/int_sqrt.c +f:lib/math/lcm.c +f:lib/math/prime_numbers.c +f:lib/math/prime_numbers_private.h +f:lib/math/rational.c +f:lib/math/reciprocal_div.c +f:lib/math/test_div64.c +f:lib/math/test_mul_u64_u64_div_u64.c +f:lib/math/tests/Makefile +f:lib/math/tests/gcd_kunit.c +f:lib/math/tests/int_log_kunit.c +f:lib/math/tests/int_pow_kunit.c +f:lib/math/tests/int_sqrt_kunit.c +f:lib/math/tests/prime_numbers_kunit.c +f:lib/math/tests/rational_kunit.c +f:lib/memcat_p.c +f:lib/memory-notifier-error-inject.c +f:lib/memregion.c +f:lib/memweight.c +f:lib/min_heap.c +f:lib/muldi3.c +f:lib/net_utils.c +f:lib/netdev-notifier-error-inject.c +f:lib/nlattr.c +f:lib/nmi_backtrace.c +f:lib/notifier-error-inject.c +f:lib/notifier-error-inject.h +f:lib/objagg.c +f:lib/objpool.c +f:lib/of-reconfig-notifier-error-inject.c +f:lib/oid_registry.c +f:lib/once.c +f:lib/packing.c +f:lib/packing_test.c +f:lib/parman.c +f:lib/parser.c +f:lib/percpu-refcount.c +f:lib/percpu_counter.c +f:lib/percpu_test.c +f:lib/pldmfw/Makefile +f:lib/pldmfw/pldmfw.c +f:lib/pldmfw/pldmfw_private.h +f:lib/plist.c +f:lib/pm-notifier-error-inject.c +f:lib/polynomial.c +f:lib/radix-tree.c +f:lib/radix-tree.h +f:lib/raid6/.gitignore +f:lib/raid6/Makefile +f:lib/raid6/algos.c +f:lib/raid6/altivec.uc +f:lib/raid6/avx2.c +f:lib/raid6/avx512.c +f:lib/raid6/int.uc +f:lib/raid6/loongarch.h +f:lib/raid6/loongarch_simd.c +f:lib/raid6/mktables.c +f:lib/raid6/mmx.c +f:lib/raid6/neon.c +f:lib/raid6/neon.h +f:lib/raid6/neon.uc +f:lib/raid6/recov.c +f:lib/raid6/recov_avx2.c +f:lib/raid6/recov_avx512.c +f:lib/raid6/recov_loongarch_simd.c +f:lib/raid6/recov_neon.c +f:lib/raid6/recov_neon_inner.c +f:lib/raid6/recov_rvv.c +f:lib/raid6/recov_s390xc.c +f:lib/raid6/recov_ssse3.c +f:lib/raid6/rvv.c +f:lib/raid6/rvv.h +f:lib/raid6/s390vx.uc +f:lib/raid6/sse1.c +f:lib/raid6/sse2.c +f:lib/raid6/test/.gitignore +f:lib/raid6/test/Makefile +f:lib/raid6/test/test.c +f:lib/raid6/unroll.awk +f:lib/raid6/vpermxor.uc +f:lib/raid6/x86.h +f:lib/random32.c +f:lib/ratelimit.c +f:lib/rbtree.c +f:lib/rbtree_test.c +f:lib/rcuref.c +f:lib/reed_solomon/Makefile +f:lib/reed_solomon/decode_rs.c +f:lib/reed_solomon/encode_rs.c +f:lib/reed_solomon/reed_solomon.c +f:lib/reed_solomon/test_rslib.c +f:lib/ref_tracker.c +f:lib/refcount.c +f:lib/rhashtable.c +f:lib/sbitmap.c +f:lib/scatterlist.c +f:lib/seq_buf.c +f:lib/sg_pool.c +f:lib/sg_split.c +f:lib/siphash.c +f:lib/smp_processor_id.c +f:lib/sort.c +f:lib/stackdepot.c +f:lib/stmp_device.c +f:lib/string.c +f:lib/string_helpers.c +f:lib/strncpy_from_user.c +f:lib/strnlen_user.c +f:lib/syscall.c +f:lib/test-kstrtox.c +f:lib/test_bitmap.c +f:lib/test_bitops.c +f:lib/test_bpf.c +f:lib/test_debug_virtual.c +f:lib/test_dynamic_debug.c +f:lib/test_firmware.c +f:lib/test_fortify/.gitignore +f:lib/test_fortify/Makefile +f:lib/test_fortify/read_overflow-memchr.c +f:lib/test_fortify/read_overflow-memchr_inv.c +f:lib/test_fortify/read_overflow-memcmp.c +f:lib/test_fortify/read_overflow-memscan.c +f:lib/test_fortify/read_overflow2-memcmp.c +f:lib/test_fortify/read_overflow2-memcpy.c +f:lib/test_fortify/read_overflow2-memmove.c +f:lib/test_fortify/read_overflow2_field-memcpy.c +f:lib/test_fortify/read_overflow2_field-memmove.c +f:lib/test_fortify/test_fortify.h +f:lib/test_fortify/test_fortify.sh +f:lib/test_fortify/write_overflow-memcpy.c +f:lib/test_fortify/write_overflow-memmove.c +f:lib/test_fortify/write_overflow-memset.c +f:lib/test_fortify/write_overflow-strcpy-lit.c +f:lib/test_fortify/write_overflow-strcpy.c +f:lib/test_fortify/write_overflow-strncpy-src.c +f:lib/test_fortify/write_overflow-strncpy.c +f:lib/test_fortify/write_overflow-strscpy.c +f:lib/test_fortify/write_overflow_field-memcpy.c +f:lib/test_fortify/write_overflow_field-memmove.c +f:lib/test_fortify/write_overflow_field-memset.c +f:lib/test_fpu.h +f:lib/test_fpu_glue.c +f:lib/test_fpu_impl.c +f:lib/test_free_pages.c +f:lib/test_hexdump.c +f:lib/test_hmm.c +f:lib/test_hmm_uapi.h +f:lib/test_ida.c +f:lib/test_kmod.c +f:lib/test_lockup.c +f:lib/test_maple_tree.c +f:lib/test_memcat_p.c +f:lib/test_meminit.c +f:lib/test_min_heap.c +f:lib/test_module.c +f:lib/test_objagg.c +f:lib/test_objpool.c +f:lib/test_parman.c +f:lib/test_ref_tracker.c +f:lib/test_rhashtable.c +f:lib/test_static_key_base.c +f:lib/test_static_keys.c +f:lib/test_sysctl.c +f:lib/test_ubsan.c +f:lib/test_uuid.c +f:lib/test_vmalloc.c +f:lib/test_xarray.c +f:lib/tests/Makefile +f:lib/tests/bitfield_kunit.c +f:lib/tests/blackhole_dev_kunit.c +f:lib/tests/checksum_kunit.c +f:lib/tests/cmdline_kunit.c +f:lib/tests/cpumask_kunit.c +f:lib/tests/fortify_kunit.c +f:lib/tests/hashtable_test.c +f:lib/tests/is_signed_type_kunit.c +f:lib/tests/kfifo_kunit.c +f:lib/tests/kunit_iov_iter.c +f:lib/tests/list-test.c +f:lib/tests/longest_symbol_kunit.c +f:lib/tests/memcpy_kunit.c +f:lib/tests/module/.gitignore +f:lib/tests/module/Makefile +f:lib/tests/module/gen_test_kallsyms.sh +f:lib/tests/overflow_kunit.c +f:lib/tests/printf_kunit.c +f:lib/tests/randstruct_kunit.c +f:lib/tests/scanf_kunit.c +f:lib/tests/seq_buf_kunit.c +f:lib/tests/siphash_kunit.c +f:lib/tests/slub_kunit.c +f:lib/tests/stackinit_kunit.c +f:lib/tests/string_helpers_kunit.c +f:lib/tests/string_kunit.c +f:lib/tests/test_bits.c +f:lib/tests/test_fprobe.c +f:lib/tests/test_hash.c +f:lib/tests/test_kprobes.c +f:lib/tests/test_linear_ranges.c +f:lib/tests/test_list_sort.c +f:lib/tests/test_ratelimit.c +f:lib/tests/test_sort.c +f:lib/tests/usercopy_kunit.c +f:lib/tests/util_macros_kunit.c +f:lib/textsearch.c +f:lib/timerqueue.c +f:lib/trace_readwrite.c +f:lib/ts_bm.c +f:lib/ts_fsm.c +f:lib/ts_kmp.c +f:lib/ubsan.c +f:lib/ubsan.h +f:lib/ucmpdi2.c +f:lib/ucs2_string.c +f:lib/union_find.c +f:lib/usercopy.c +f:lib/uuid.c +f:lib/vdso/Kconfig +f:lib/vdso/Makefile +f:lib/vdso/Makefile.include +f:lib/vdso/datastore.c +f:lib/vdso/getrandom.c +f:lib/vdso/gettimeofday.c +f:lib/vsprintf.c +f:lib/win_minmax.c +f:lib/xarray.c +f:lib/xxhash.c +f:lib/xz/Kconfig +f:lib/xz/Makefile +f:lib/xz/xz_crc32.c +f:lib/xz/xz_dec_bcj.c +f:lib/xz/xz_dec_lzma2.c +f:lib/xz/xz_dec_stream.c +f:lib/xz/xz_dec_syms.c +f:lib/xz/xz_dec_test.c +f:lib/xz/xz_lzma2.h +f:lib/xz/xz_private.h +f:lib/xz/xz_stream.h +f:lib/zlib_deflate/Makefile +f:lib/zlib_deflate/deflate.c +f:lib/zlib_deflate/deflate_syms.c +f:lib/zlib_deflate/deftree.c +f:lib/zlib_deflate/defutil.h +f:lib/zlib_dfltcc/Makefile +f:lib/zlib_dfltcc/dfltcc.c +f:lib/zlib_dfltcc/dfltcc.h +f:lib/zlib_dfltcc/dfltcc_deflate.c +f:lib/zlib_dfltcc/dfltcc_deflate.h +f:lib/zlib_dfltcc/dfltcc_inflate.c +f:lib/zlib_dfltcc/dfltcc_inflate.h +f:lib/zlib_dfltcc/dfltcc_util.h +f:lib/zlib_inflate/Makefile +f:lib/zlib_inflate/inffast.c +f:lib/zlib_inflate/inffast.h +f:lib/zlib_inflate/inffixed.h +f:lib/zlib_inflate/inflate.c +f:lib/zlib_inflate/inflate.h +f:lib/zlib_inflate/inflate_syms.c +f:lib/zlib_inflate/inftrees.c +f:lib/zlib_inflate/inftrees.h +f:lib/zlib_inflate/infutil.c +f:lib/zlib_inflate/infutil.h +f:lib/zstd/Makefile +f:lib/zstd/common/allocations.h +f:lib/zstd/common/bits.h +f:lib/zstd/common/bitstream.h +f:lib/zstd/common/compiler.h +f:lib/zstd/common/cpu.h +f:lib/zstd/common/debug.c +f:lib/zstd/common/debug.h +f:lib/zstd/common/entropy_common.c +f:lib/zstd/common/error_private.c +f:lib/zstd/common/error_private.h +f:lib/zstd/common/fse.h +f:lib/zstd/common/fse_decompress.c +f:lib/zstd/common/huf.h +f:lib/zstd/common/mem.h +f:lib/zstd/common/portability_macros.h +f:lib/zstd/common/zstd_common.c +f:lib/zstd/common/zstd_deps.h +f:lib/zstd/common/zstd_internal.h +f:lib/zstd/compress/clevels.h +f:lib/zstd/compress/fse_compress.c +f:lib/zstd/compress/hist.c +f:lib/zstd/compress/hist.h +f:lib/zstd/compress/huf_compress.c +f:lib/zstd/compress/zstd_compress.c +f:lib/zstd/compress/zstd_compress_internal.h +f:lib/zstd/compress/zstd_compress_literals.c +f:lib/zstd/compress/zstd_compress_literals.h +f:lib/zstd/compress/zstd_compress_sequences.c +f:lib/zstd/compress/zstd_compress_sequences.h +f:lib/zstd/compress/zstd_compress_superblock.c +f:lib/zstd/compress/zstd_compress_superblock.h +f:lib/zstd/compress/zstd_cwksp.h +f:lib/zstd/compress/zstd_double_fast.c +f:lib/zstd/compress/zstd_double_fast.h +f:lib/zstd/compress/zstd_fast.c +f:lib/zstd/compress/zstd_fast.h +f:lib/zstd/compress/zstd_lazy.c +f:lib/zstd/compress/zstd_lazy.h +f:lib/zstd/compress/zstd_ldm.c +f:lib/zstd/compress/zstd_ldm.h +f:lib/zstd/compress/zstd_ldm_geartab.h +f:lib/zstd/compress/zstd_opt.c +f:lib/zstd/compress/zstd_opt.h +f:lib/zstd/compress/zstd_preSplit.c +f:lib/zstd/compress/zstd_preSplit.h +f:lib/zstd/decompress/huf_decompress.c +f:lib/zstd/decompress/zstd_ddict.c +f:lib/zstd/decompress/zstd_ddict.h +f:lib/zstd/decompress/zstd_decompress.c +f:lib/zstd/decompress/zstd_decompress_block.c +f:lib/zstd/decompress/zstd_decompress_block.h +f:lib/zstd/decompress/zstd_decompress_internal.h +f:lib/zstd/decompress_sources.h +f:lib/zstd/zstd_common_module.c +f:lib/zstd/zstd_compress_module.c +f:lib/zstd/zstd_decompress_module.c +f:mm/Kconfig +f:mm/Kconfig.debug +f:mm/Makefile +f:mm/backing-dev.c +f:mm/balloon_compaction.c +f:mm/bootmem_info.c +f:mm/cma.c +f:mm/cma.h +f:mm/cma_debug.c +f:mm/cma_sysfs.c +f:mm/compaction.c +f:mm/damon/Kconfig +f:mm/damon/Makefile +f:mm/damon/core.c +f:mm/damon/lru_sort.c +f:mm/damon/modules-common.c +f:mm/damon/modules-common.h +f:mm/damon/ops-common.c +f:mm/damon/ops-common.h +f:mm/damon/paddr.c +f:mm/damon/reclaim.c +f:mm/damon/stat.c +f:mm/damon/sysfs-common.c +f:mm/damon/sysfs-common.h +f:mm/damon/sysfs-schemes.c +f:mm/damon/sysfs.c +f:mm/damon/tests/.kunitconfig +f:mm/damon/tests/core-kunit.h +f:mm/damon/tests/sysfs-kunit.h +f:mm/damon/tests/vaddr-kunit.h +f:mm/damon/vaddr.c +f:mm/debug.c +f:mm/debug_page_alloc.c +f:mm/debug_page_ref.c +f:mm/debug_vm_pgtable.c +f:mm/dmapool.c +f:mm/dmapool_test.c +f:mm/early_ioremap.c +f:mm/execmem.c +f:mm/fadvise.c +f:mm/fail_page_alloc.c +f:mm/failslab.c +f:mm/filemap.c +f:mm/folio-compat.c +f:mm/gup.c +f:mm/gup_test.c +f:mm/gup_test.h +f:mm/highmem.c +f:mm/hmm.c +f:mm/huge_memory.c +f:mm/hugetlb.c +f:mm/hugetlb_cgroup.c +f:mm/hugetlb_cma.c +f:mm/hugetlb_cma.h +f:mm/hugetlb_vmemmap.c +f:mm/hugetlb_vmemmap.h +f:mm/hwpoison-inject.c +f:mm/init-mm.c +f:mm/internal.h +f:mm/interval_tree.c +f:mm/io-mapping.c +f:mm/ioremap.c +f:mm/kasan/Makefile +f:mm/kasan/common.c +f:mm/kasan/generic.c +f:mm/kasan/hw_tags.c +f:mm/kasan/init.c +f:mm/kasan/kasan.h +f:mm/kasan/kasan_test_c.c +f:mm/kasan/kasan_test_rust.rs +f:mm/kasan/quarantine.c +f:mm/kasan/report.c +f:mm/kasan/report_generic.c +f:mm/kasan/report_hw_tags.c +f:mm/kasan/report_sw_tags.c +f:mm/kasan/report_tags.c +f:mm/kasan/shadow.c +f:mm/kasan/sw_tags.c +f:mm/kasan/tags.c +f:mm/kfence/.kunitconfig +f:mm/kfence/Makefile +f:mm/kfence/core.c +f:mm/kfence/kfence.h +f:mm/kfence/kfence_test.c +f:mm/kfence/report.c +f:mm/khugepaged.c +f:mm/kmemleak.c +f:mm/kmsan/Makefile +f:mm/kmsan/core.c +f:mm/kmsan/hooks.c +f:mm/kmsan/init.c +f:mm/kmsan/instrumentation.c +f:mm/kmsan/kmsan.h +f:mm/kmsan/kmsan_test.c +f:mm/kmsan/report.c +f:mm/kmsan/shadow.c +f:mm/ksm.c +f:mm/list_lru.c +f:mm/maccess.c +f:mm/madvise.c +f:mm/mapping_dirty_helpers.c +f:mm/memblock.c +f:mm/memcontrol-v1.c +f:mm/memcontrol-v1.h +f:mm/memcontrol.c +f:mm/memfd.c +f:mm/memory-failure.c +f:mm/memory-tiers.c +f:mm/memory.c +f:mm/memory_hotplug.c +f:mm/mempolicy.c +f:mm/mempool.c +f:mm/memremap.c +f:mm/memtest.c +f:mm/migrate.c +f:mm/migrate_device.c +f:mm/mincore.c +f:mm/mlock.c +f:mm/mm_init.c +f:mm/mm_slot.h +f:mm/mmap.c +f:mm/mmap_lock.c +f:mm/mmu_gather.c +f:mm/mmu_notifier.c +f:mm/mmzone.c +f:mm/mprotect.c +f:mm/mremap.c +f:mm/mseal.c +f:mm/msync.c +f:mm/nommu.c +f:mm/numa.c +f:mm/numa_emulation.c +f:mm/numa_memblks.c +f:mm/oom_kill.c +f:mm/page-writeback.c +f:mm/page_alloc.c +f:mm/page_counter.c +f:mm/page_ext.c +f:mm/page_frag_cache.c +f:mm/page_idle.c +f:mm/page_io.c +f:mm/page_isolation.c +f:mm/page_owner.c +f:mm/page_poison.c +f:mm/page_reporting.c +f:mm/page_reporting.h +f:mm/page_table_check.c +f:mm/page_vma_mapped.c +f:mm/pagewalk.c +f:mm/percpu-internal.h +f:mm/percpu-km.c +f:mm/percpu-stats.c +f:mm/percpu-vm.c +f:mm/percpu.c +f:mm/pgalloc-track.h +f:mm/pgtable-generic.c +f:mm/process_vm_access.c +f:mm/pt_reclaim.c +f:mm/ptdump.c +f:mm/readahead.c +f:mm/rmap.c +f:mm/rodata_test.c +f:mm/secretmem.c +f:mm/shmem.c +f:mm/shmem_quota.c +f:mm/show_mem.c +f:mm/shrinker.c +f:mm/shrinker_debug.c +f:mm/shuffle.c +f:mm/shuffle.h +f:mm/slab.h +f:mm/slab_common.c +f:mm/slub.c +f:mm/sparse-vmemmap.c +f:mm/sparse.c +f:mm/swap.c +f:mm/swap.h +f:mm/swap_cgroup.c +f:mm/swap_state.c +f:mm/swapfile.c +f:mm/truncate.c +f:mm/usercopy.c +f:mm/userfaultfd.c +f:mm/util.c +f:mm/vma.c +f:mm/vma.h +f:mm/vma_exec.c +f:mm/vma_init.c +f:mm/vma_internal.h +f:mm/vmalloc.c +f:mm/vmpressure.c +f:mm/vmscan.c +f:mm/vmstat.c +f:mm/workingset.c +f:mm/zpdesc.h +f:mm/zpool.c +f:mm/zsmalloc.c +f:mm/zswap.c +f:net/6lowpan/6lowpan_i.h +f:net/6lowpan/Kconfig +f:net/6lowpan/Makefile +f:net/6lowpan/core.c +f:net/6lowpan/debugfs.c +f:net/6lowpan/iphc.c +f:net/6lowpan/ndisc.c +f:net/6lowpan/nhc.c +f:net/6lowpan/nhc.h +f:net/6lowpan/nhc_dest.c +f:net/6lowpan/nhc_fragment.c +f:net/6lowpan/nhc_ghc_ext_dest.c +f:net/6lowpan/nhc_ghc_ext_frag.c +f:net/6lowpan/nhc_ghc_ext_hop.c +f:net/6lowpan/nhc_ghc_ext_route.c +f:net/6lowpan/nhc_ghc_icmpv6.c +f:net/6lowpan/nhc_ghc_udp.c +f:net/6lowpan/nhc_hop.c +f:net/6lowpan/nhc_ipv6.c +f:net/6lowpan/nhc_mobility.c +f:net/6lowpan/nhc_routing.c +f:net/6lowpan/nhc_udp.c +f:net/802/Kconfig +f:net/802/Makefile +f:net/802/fc.c +f:net/802/fddi.c +f:net/802/garp.c +f:net/802/hippi.c +f:net/802/mrp.c +f:net/802/psnap.c +f:net/802/stp.c +f:net/8021q/Kconfig +f:net/8021q/Makefile +f:net/8021q/vlan.c +f:net/8021q/vlan.h +f:net/8021q/vlan_core.c +f:net/8021q/vlan_dev.c +f:net/8021q/vlan_gvrp.c +f:net/8021q/vlan_mvrp.c +f:net/8021q/vlan_netlink.c +f:net/8021q/vlanproc.c +f:net/8021q/vlanproc.h +f:net/9p/Kconfig +f:net/9p/Makefile +f:net/9p/client.c +f:net/9p/error.c +f:net/9p/mod.c +f:net/9p/protocol.c +f:net/9p/protocol.h +f:net/9p/trans_common.c +f:net/9p/trans_common.h +f:net/9p/trans_fd.c +f:net/9p/trans_rdma.c +f:net/9p/trans_usbg.c +f:net/9p/trans_virtio.c +f:net/9p/trans_xen.c +f:net/Kconfig +f:net/Kconfig.debug +f:net/Makefile +f:net/appletalk/Kconfig +f:net/appletalk/Makefile +f:net/appletalk/aarp.c +f:net/appletalk/atalk_proc.c +f:net/appletalk/ddp.c +f:net/appletalk/sysctl_net_atalk.c +f:net/atm/Kconfig +f:net/atm/Makefile +f:net/atm/addr.c +f:net/atm/addr.h +f:net/atm/atm_misc.c +f:net/atm/atm_sysfs.c +f:net/atm/br2684.c +f:net/atm/clip.c +f:net/atm/common.c +f:net/atm/common.h +f:net/atm/ioctl.c +f:net/atm/lec.c +f:net/atm/lec.h +f:net/atm/lec_arpc.h +f:net/atm/mpc.c +f:net/atm/mpc.h +f:net/atm/mpoa_caches.c +f:net/atm/mpoa_caches.h +f:net/atm/mpoa_proc.c +f:net/atm/pppoatm.c +f:net/atm/proc.c +f:net/atm/protocols.h +f:net/atm/pvc.c +f:net/atm/raw.c +f:net/atm/resources.c +f:net/atm/resources.h +f:net/atm/signaling.c +f:net/atm/signaling.h +f:net/atm/svc.c +f:net/ax25/Kconfig +f:net/ax25/Makefile +f:net/ax25/af_ax25.c +f:net/ax25/ax25_addr.c +f:net/ax25/ax25_dev.c +f:net/ax25/ax25_ds_in.c +f:net/ax25/ax25_ds_subr.c +f:net/ax25/ax25_ds_timer.c +f:net/ax25/ax25_iface.c +f:net/ax25/ax25_in.c +f:net/ax25/ax25_ip.c +f:net/ax25/ax25_out.c +f:net/ax25/ax25_route.c +f:net/ax25/ax25_std_in.c +f:net/ax25/ax25_std_subr.c +f:net/ax25/ax25_std_timer.c +f:net/ax25/ax25_subr.c +f:net/ax25/ax25_timer.c +f:net/ax25/ax25_uid.c +f:net/ax25/sysctl_net_ax25.c +f:net/batman-adv/Kconfig +f:net/batman-adv/Makefile +f:net/batman-adv/bat_algo.c +f:net/batman-adv/bat_algo.h +f:net/batman-adv/bat_iv_ogm.c +f:net/batman-adv/bat_iv_ogm.h +f:net/batman-adv/bat_v.c +f:net/batman-adv/bat_v.h +f:net/batman-adv/bat_v_elp.c +f:net/batman-adv/bat_v_elp.h +f:net/batman-adv/bat_v_ogm.c +f:net/batman-adv/bat_v_ogm.h +f:net/batman-adv/bitarray.c +f:net/batman-adv/bitarray.h +f:net/batman-adv/bridge_loop_avoidance.c +f:net/batman-adv/bridge_loop_avoidance.h +f:net/batman-adv/distributed-arp-table.c +f:net/batman-adv/distributed-arp-table.h +f:net/batman-adv/fragmentation.c +f:net/batman-adv/fragmentation.h +f:net/batman-adv/gateway_client.c +f:net/batman-adv/gateway_client.h +f:net/batman-adv/gateway_common.c +f:net/batman-adv/gateway_common.h +f:net/batman-adv/hard-interface.c +f:net/batman-adv/hard-interface.h +f:net/batman-adv/hash.c +f:net/batman-adv/hash.h +f:net/batman-adv/log.c +f:net/batman-adv/log.h +f:net/batman-adv/main.c +f:net/batman-adv/main.h +f:net/batman-adv/mesh-interface.c +f:net/batman-adv/mesh-interface.h +f:net/batman-adv/multicast.c +f:net/batman-adv/multicast.h +f:net/batman-adv/multicast_forw.c +f:net/batman-adv/netlink.c +f:net/batman-adv/netlink.h +f:net/batman-adv/network-coding.c +f:net/batman-adv/network-coding.h +f:net/batman-adv/originator.c +f:net/batman-adv/originator.h +f:net/batman-adv/routing.c +f:net/batman-adv/routing.h +f:net/batman-adv/send.c +f:net/batman-adv/send.h +f:net/batman-adv/tp_meter.c +f:net/batman-adv/tp_meter.h +f:net/batman-adv/trace.c +f:net/batman-adv/trace.h +f:net/batman-adv/translation-table.c +f:net/batman-adv/translation-table.h +f:net/batman-adv/tvlv.c +f:net/batman-adv/tvlv.h +f:net/batman-adv/types.h +f:net/bluetooth/6lowpan.c +f:net/bluetooth/Kconfig +f:net/bluetooth/Makefile +f:net/bluetooth/af_bluetooth.c +f:net/bluetooth/aosp.c +f:net/bluetooth/aosp.h +f:net/bluetooth/bnep/Kconfig +f:net/bluetooth/bnep/Makefile +f:net/bluetooth/bnep/bnep.h +f:net/bluetooth/bnep/core.c +f:net/bluetooth/bnep/netdev.c +f:net/bluetooth/bnep/sock.c +f:net/bluetooth/cmtp/Kconfig +f:net/bluetooth/cmtp/Makefile +f:net/bluetooth/cmtp/capi.c +f:net/bluetooth/cmtp/cmtp.h +f:net/bluetooth/cmtp/core.c +f:net/bluetooth/cmtp/sock.c +f:net/bluetooth/coredump.c +f:net/bluetooth/ecdh_helper.c +f:net/bluetooth/ecdh_helper.h +f:net/bluetooth/eir.c +f:net/bluetooth/eir.h +f:net/bluetooth/hci_codec.c +f:net/bluetooth/hci_codec.h +f:net/bluetooth/hci_conn.c +f:net/bluetooth/hci_core.c +f:net/bluetooth/hci_debugfs.c +f:net/bluetooth/hci_debugfs.h +f:net/bluetooth/hci_drv.c +f:net/bluetooth/hci_event.c +f:net/bluetooth/hci_sock.c +f:net/bluetooth/hci_sync.c +f:net/bluetooth/hci_sysfs.c +f:net/bluetooth/hidp/Kconfig +f:net/bluetooth/hidp/Makefile +f:net/bluetooth/hidp/core.c +f:net/bluetooth/hidp/hidp.h +f:net/bluetooth/hidp/sock.c +f:net/bluetooth/iso.c +f:net/bluetooth/l2cap_core.c +f:net/bluetooth/l2cap_sock.c +f:net/bluetooth/leds.c +f:net/bluetooth/leds.h +f:net/bluetooth/lib.c +f:net/bluetooth/mgmt.c +f:net/bluetooth/mgmt_config.c +f:net/bluetooth/mgmt_config.h +f:net/bluetooth/mgmt_util.c +f:net/bluetooth/mgmt_util.h +f:net/bluetooth/msft.c +f:net/bluetooth/msft.h +f:net/bluetooth/rfcomm/Kconfig +f:net/bluetooth/rfcomm/Makefile +f:net/bluetooth/rfcomm/core.c +f:net/bluetooth/rfcomm/sock.c +f:net/bluetooth/rfcomm/tty.c +f:net/bluetooth/sco.c +f:net/bluetooth/selftest.c +f:net/bluetooth/selftest.h +f:net/bluetooth/smp.c +f:net/bluetooth/smp.h +f:net/bpf/Makefile +f:net/bpf/bpf_dummy_struct_ops.c +f:net/bpf/test_run.c +f:net/bridge/Kconfig +f:net/bridge/Makefile +f:net/bridge/br.c +f:net/bridge/br_arp_nd_proxy.c +f:net/bridge/br_cfm.c +f:net/bridge/br_cfm_netlink.c +f:net/bridge/br_device.c +f:net/bridge/br_fdb.c +f:net/bridge/br_forward.c +f:net/bridge/br_if.c +f:net/bridge/br_input.c +f:net/bridge/br_ioctl.c +f:net/bridge/br_mdb.c +f:net/bridge/br_mrp.c +f:net/bridge/br_mrp_netlink.c +f:net/bridge/br_mrp_switchdev.c +f:net/bridge/br_mst.c +f:net/bridge/br_multicast.c +f:net/bridge/br_multicast_eht.c +f:net/bridge/br_netfilter_hooks.c +f:net/bridge/br_netfilter_ipv6.c +f:net/bridge/br_netlink.c +f:net/bridge/br_netlink_tunnel.c +f:net/bridge/br_nf_core.c +f:net/bridge/br_private.h +f:net/bridge/br_private_cfm.h +f:net/bridge/br_private_mcast_eht.h +f:net/bridge/br_private_mrp.h +f:net/bridge/br_private_stp.h +f:net/bridge/br_private_tunnel.h +f:net/bridge/br_stp.c +f:net/bridge/br_stp_bpdu.c +f:net/bridge/br_stp_if.c +f:net/bridge/br_stp_timer.c +f:net/bridge/br_switchdev.c +f:net/bridge/br_sysfs_br.c +f:net/bridge/br_sysfs_if.c +f:net/bridge/br_vlan.c +f:net/bridge/br_vlan_options.c +f:net/bridge/br_vlan_tunnel.c +f:net/bridge/netfilter/Kconfig +f:net/bridge/netfilter/Makefile +f:net/bridge/netfilter/ebt_802_3.c +f:net/bridge/netfilter/ebt_among.c +f:net/bridge/netfilter/ebt_arp.c +f:net/bridge/netfilter/ebt_arpreply.c +f:net/bridge/netfilter/ebt_dnat.c +f:net/bridge/netfilter/ebt_ip.c +f:net/bridge/netfilter/ebt_ip6.c +f:net/bridge/netfilter/ebt_limit.c +f:net/bridge/netfilter/ebt_log.c +f:net/bridge/netfilter/ebt_mark.c +f:net/bridge/netfilter/ebt_mark_m.c +f:net/bridge/netfilter/ebt_nflog.c +f:net/bridge/netfilter/ebt_pkttype.c +f:net/bridge/netfilter/ebt_redirect.c +f:net/bridge/netfilter/ebt_snat.c +f:net/bridge/netfilter/ebt_stp.c +f:net/bridge/netfilter/ebt_vlan.c +f:net/bridge/netfilter/ebtable_broute.c +f:net/bridge/netfilter/ebtable_filter.c +f:net/bridge/netfilter/ebtable_nat.c +f:net/bridge/netfilter/ebtables.c +f:net/bridge/netfilter/nf_conntrack_bridge.c +f:net/bridge/netfilter/nft_meta_bridge.c +f:net/bridge/netfilter/nft_reject_bridge.c +f:net/caif/Kconfig +f:net/caif/Makefile +f:net/caif/caif_dev.c +f:net/caif/caif_socket.c +f:net/caif/caif_usb.c +f:net/caif/cfcnfg.c +f:net/caif/cfctrl.c +f:net/caif/cfdbgl.c +f:net/caif/cfdgml.c +f:net/caif/cffrml.c +f:net/caif/cfmuxl.c +f:net/caif/cfpkt_skbuff.c +f:net/caif/cfrfml.c +f:net/caif/cfserl.c +f:net/caif/cfsrvl.c +f:net/caif/cfutill.c +f:net/caif/cfveil.c +f:net/caif/cfvidl.c +f:net/caif/chnl_net.c +f:net/can/Kconfig +f:net/can/Makefile +f:net/can/af_can.c +f:net/can/af_can.h +f:net/can/bcm.c +f:net/can/gw.c +f:net/can/isotp.c +f:net/can/j1939/Kconfig +f:net/can/j1939/Makefile +f:net/can/j1939/address-claim.c +f:net/can/j1939/bus.c +f:net/can/j1939/j1939-priv.h +f:net/can/j1939/main.c +f:net/can/j1939/socket.c +f:net/can/j1939/transport.c +f:net/can/proc.c +f:net/can/raw.c +f:net/ceph/Kconfig +f:net/ceph/Makefile +f:net/ceph/armor.c +f:net/ceph/auth.c +f:net/ceph/auth_none.c +f:net/ceph/auth_none.h +f:net/ceph/auth_x.c +f:net/ceph/auth_x.h +f:net/ceph/auth_x_protocol.h +f:net/ceph/buffer.c +f:net/ceph/ceph_common.c +f:net/ceph/ceph_hash.c +f:net/ceph/ceph_strings.c +f:net/ceph/cls_lock_client.c +f:net/ceph/crush/crush.c +f:net/ceph/crush/crush_ln_table.h +f:net/ceph/crush/hash.c +f:net/ceph/crush/mapper.c +f:net/ceph/crypto.c +f:net/ceph/crypto.h +f:net/ceph/debugfs.c +f:net/ceph/decode.c +f:net/ceph/messenger.c +f:net/ceph/messenger_v1.c +f:net/ceph/messenger_v2.c +f:net/ceph/mon_client.c +f:net/ceph/msgpool.c +f:net/ceph/osd_client.c +f:net/ceph/osdmap.c +f:net/ceph/pagelist.c +f:net/ceph/pagevec.c +f:net/ceph/snapshot.c +f:net/ceph/string_table.c +f:net/ceph/striper.c +f:net/compat.c +f:net/core/Makefile +f:net/core/bpf_sk_storage.c +f:net/core/datagram.c +f:net/core/dev.c +f:net/core/dev.h +f:net/core/dev_addr_lists.c +f:net/core/dev_addr_lists_test.c +f:net/core/dev_api.c +f:net/core/dev_ioctl.c +f:net/core/devmem.c +f:net/core/devmem.h +f:net/core/drop_monitor.c +f:net/core/dst.c +f:net/core/dst_cache.c +f:net/core/failover.c +f:net/core/fib_notifier.c +f:net/core/fib_rules.c +f:net/core/filter.c +f:net/core/flow_dissector.c +f:net/core/flow_offload.c +f:net/core/gen_estimator.c +f:net/core/gen_stats.c +f:net/core/gro.c +f:net/core/gro_cells.c +f:net/core/gso.c +f:net/core/hotdata.c +f:net/core/hwbm.c +f:net/core/ieee8021q_helpers.c +f:net/core/link_watch.c +f:net/core/lock_debug.c +f:net/core/lwt_bpf.c +f:net/core/lwtunnel.c +f:net/core/mp_dmabuf_devmem.h +f:net/core/neighbour.c +f:net/core/net-procfs.c +f:net/core/net-sysfs.c +f:net/core/net-sysfs.h +f:net/core/net-traces.c +f:net/core/net_namespace.c +f:net/core/net_test.c +f:net/core/netclassid_cgroup.c +f:net/core/netdev-genl-gen.c +f:net/core/netdev-genl-gen.h +f:net/core/netdev-genl.c +f:net/core/netdev_rx_queue.c +f:net/core/netevent.c +f:net/core/netmem_priv.h +f:net/core/netpoll.c +f:net/core/netprio_cgroup.c +f:net/core/of_net.c +f:net/core/page_pool.c +f:net/core/page_pool_priv.h +f:net/core/page_pool_user.c +f:net/core/pktgen.c +f:net/core/ptp_classifier.c +f:net/core/request_sock.c +f:net/core/rtnetlink.c +f:net/core/scm.c +f:net/core/secure_seq.c +f:net/core/selftests.c +f:net/core/skb_fault_injection.c +f:net/core/skbuff.c +f:net/core/skmsg.c +f:net/core/sock.c +f:net/core/sock_destructor.h +f:net/core/sock_diag.c +f:net/core/sock_map.c +f:net/core/sock_reuseport.c +f:net/core/stream.c +f:net/core/sysctl_net_core.c +f:net/core/timestamping.c +f:net/core/tso.c +f:net/core/utils.c +f:net/core/xdp.c +f:net/dcb/Kconfig +f:net/dcb/Makefile +f:net/dcb/dcbevent.c +f:net/dcb/dcbnl.c +f:net/devlink/Makefile +f:net/devlink/core.c +f:net/devlink/dev.c +f:net/devlink/devl_internal.h +f:net/devlink/dpipe.c +f:net/devlink/health.c +f:net/devlink/linecard.c +f:net/devlink/netlink.c +f:net/devlink/netlink_gen.c +f:net/devlink/netlink_gen.h +f:net/devlink/param.c +f:net/devlink/port.c +f:net/devlink/rate.c +f:net/devlink/region.c +f:net/devlink/resource.c +f:net/devlink/sb.c +f:net/devlink/trap.c +f:net/devres.c +f:net/dns_resolver/Kconfig +f:net/dns_resolver/Makefile +f:net/dns_resolver/dns_key.c +f:net/dns_resolver/dns_query.c +f:net/dns_resolver/internal.h +f:net/dsa/Kconfig +f:net/dsa/Makefile +f:net/dsa/conduit.c +f:net/dsa/conduit.h +f:net/dsa/devlink.c +f:net/dsa/devlink.h +f:net/dsa/dsa.c +f:net/dsa/dsa.h +f:net/dsa/netlink.c +f:net/dsa/netlink.h +f:net/dsa/port.c +f:net/dsa/port.h +f:net/dsa/stubs.c +f:net/dsa/switch.c +f:net/dsa/switch.h +f:net/dsa/tag.c +f:net/dsa/tag.h +f:net/dsa/tag_8021q.c +f:net/dsa/tag_8021q.h +f:net/dsa/tag_ar9331.c +f:net/dsa/tag_brcm.c +f:net/dsa/tag_dsa.c +f:net/dsa/tag_gswip.c +f:net/dsa/tag_hellcreek.c +f:net/dsa/tag_ksz.c +f:net/dsa/tag_lan9303.c +f:net/dsa/tag_mtk.c +f:net/dsa/tag_none.c +f:net/dsa/tag_ocelot.c +f:net/dsa/tag_ocelot_8021q.c +f:net/dsa/tag_qca.c +f:net/dsa/tag_rtl4_a.c +f:net/dsa/tag_rtl8_4.c +f:net/dsa/tag_rzn1_a5psw.c +f:net/dsa/tag_sja1105.c +f:net/dsa/tag_trailer.c +f:net/dsa/tag_vsc73xx_8021q.c +f:net/dsa/tag_xrs700x.c +f:net/dsa/trace.c +f:net/dsa/trace.h +f:net/dsa/user.c +f:net/dsa/user.h +f:net/ethernet/Makefile +f:net/ethernet/eth.c +f:net/ethtool/Makefile +f:net/ethtool/bitset.c +f:net/ethtool/bitset.h +f:net/ethtool/cabletest.c +f:net/ethtool/channels.c +f:net/ethtool/cmis.h +f:net/ethtool/cmis_cdb.c +f:net/ethtool/cmis_fw_update.c +f:net/ethtool/coalesce.c +f:net/ethtool/common.c +f:net/ethtool/common.h +f:net/ethtool/debug.c +f:net/ethtool/eee.c +f:net/ethtool/eeprom.c +f:net/ethtool/features.c +f:net/ethtool/fec.c +f:net/ethtool/ioctl.c +f:net/ethtool/linkinfo.c +f:net/ethtool/linkmodes.c +f:net/ethtool/linkstate.c +f:net/ethtool/mm.c +f:net/ethtool/module.c +f:net/ethtool/module_fw.h +f:net/ethtool/netlink.c +f:net/ethtool/netlink.h +f:net/ethtool/pause.c +f:net/ethtool/phc_vclocks.c +f:net/ethtool/phy.c +f:net/ethtool/plca.c +f:net/ethtool/privflags.c +f:net/ethtool/pse-pd.c +f:net/ethtool/rings.c +f:net/ethtool/rss.c +f:net/ethtool/stats.c +f:net/ethtool/strset.c +f:net/ethtool/ts.h +f:net/ethtool/tsconfig.c +f:net/ethtool/tsinfo.c +f:net/ethtool/tunnels.c +f:net/ethtool/wol.c +f:net/handshake/.kunitconfig +f:net/handshake/Makefile +f:net/handshake/alert.c +f:net/handshake/genl.c +f:net/handshake/genl.h +f:net/handshake/handshake-test.c +f:net/handshake/handshake.h +f:net/handshake/netlink.c +f:net/handshake/request.c +f:net/handshake/tlshd.c +f:net/handshake/trace.c +f:net/hsr/Kconfig +f:net/hsr/Makefile +f:net/hsr/hsr_debugfs.c +f:net/hsr/hsr_device.c +f:net/hsr/hsr_device.h +f:net/hsr/hsr_forward.c +f:net/hsr/hsr_forward.h +f:net/hsr/hsr_framereg.c +f:net/hsr/hsr_framereg.h +f:net/hsr/hsr_main.c +f:net/hsr/hsr_main.h +f:net/hsr/hsr_netlink.c +f:net/hsr/hsr_netlink.h +f:net/hsr/hsr_slave.c +f:net/hsr/hsr_slave.h +f:net/hsr/prp_dup_discard_test.c +f:net/ieee802154/6lowpan/6lowpan_i.h +f:net/ieee802154/6lowpan/Kconfig +f:net/ieee802154/6lowpan/Makefile +f:net/ieee802154/6lowpan/core.c +f:net/ieee802154/6lowpan/reassembly.c +f:net/ieee802154/6lowpan/rx.c +f:net/ieee802154/6lowpan/tx.c +f:net/ieee802154/Kconfig +f:net/ieee802154/Makefile +f:net/ieee802154/core.c +f:net/ieee802154/core.h +f:net/ieee802154/header_ops.c +f:net/ieee802154/ieee802154.h +f:net/ieee802154/netlink.c +f:net/ieee802154/nl-mac.c +f:net/ieee802154/nl-phy.c +f:net/ieee802154/nl802154.c +f:net/ieee802154/nl802154.h +f:net/ieee802154/nl_policy.c +f:net/ieee802154/pan.c +f:net/ieee802154/rdev-ops.h +f:net/ieee802154/socket.c +f:net/ieee802154/sysfs.c +f:net/ieee802154/sysfs.h +f:net/ieee802154/trace.c +f:net/ieee802154/trace.h +f:net/ife/Kconfig +f:net/ife/Makefile +f:net/ife/ife.c +f:net/ipv4/Kconfig +f:net/ipv4/Makefile +f:net/ipv4/af_inet.c +f:net/ipv4/ah4.c +f:net/ipv4/arp.c +f:net/ipv4/bpf_tcp_ca.c +f:net/ipv4/cipso_ipv4.c +f:net/ipv4/datagram.c +f:net/ipv4/devinet.c +f:net/ipv4/esp4.c +f:net/ipv4/esp4_offload.c +f:net/ipv4/fib_frontend.c +f:net/ipv4/fib_lookup.h +f:net/ipv4/fib_notifier.c +f:net/ipv4/fib_rules.c +f:net/ipv4/fib_semantics.c +f:net/ipv4/fib_trie.c +f:net/ipv4/fou_bpf.c +f:net/ipv4/fou_core.c +f:net/ipv4/fou_nl.c +f:net/ipv4/fou_nl.h +f:net/ipv4/gre_demux.c +f:net/ipv4/gre_offload.c +f:net/ipv4/icmp.c +f:net/ipv4/igmp.c +f:net/ipv4/igmp_internal.h +f:net/ipv4/inet_connection_sock.c +f:net/ipv4/inet_diag.c +f:net/ipv4/inet_fragment.c +f:net/ipv4/inet_hashtables.c +f:net/ipv4/inet_timewait_sock.c +f:net/ipv4/inetpeer.c +f:net/ipv4/ip_forward.c +f:net/ipv4/ip_fragment.c +f:net/ipv4/ip_gre.c +f:net/ipv4/ip_input.c +f:net/ipv4/ip_options.c +f:net/ipv4/ip_output.c +f:net/ipv4/ip_sockglue.c +f:net/ipv4/ip_tunnel.c +f:net/ipv4/ip_tunnel_core.c +f:net/ipv4/ip_vti.c +f:net/ipv4/ipcomp.c +f:net/ipv4/ipconfig.c +f:net/ipv4/ipip.c +f:net/ipv4/ipmr.c +f:net/ipv4/ipmr_base.c +f:net/ipv4/metrics.c +f:net/ipv4/netfilter.c +f:net/ipv4/netfilter/Kconfig +f:net/ipv4/netfilter/Makefile +f:net/ipv4/netfilter/arp_tables.c +f:net/ipv4/netfilter/arpt_mangle.c +f:net/ipv4/netfilter/arptable_filter.c +f:net/ipv4/netfilter/ip_tables.c +f:net/ipv4/netfilter/ipt_ECN.c +f:net/ipv4/netfilter/ipt_REJECT.c +f:net/ipv4/netfilter/ipt_SYNPROXY.c +f:net/ipv4/netfilter/ipt_ah.c +f:net/ipv4/netfilter/ipt_rpfilter.c +f:net/ipv4/netfilter/iptable_filter.c +f:net/ipv4/netfilter/iptable_mangle.c +f:net/ipv4/netfilter/iptable_nat.c +f:net/ipv4/netfilter/iptable_raw.c +f:net/ipv4/netfilter/iptable_security.c +f:net/ipv4/netfilter/nf_defrag_ipv4.c +f:net/ipv4/netfilter/nf_dup_ipv4.c +f:net/ipv4/netfilter/nf_nat_h323.c +f:net/ipv4/netfilter/nf_nat_pptp.c +f:net/ipv4/netfilter/nf_nat_snmp_basic.asn1 +f:net/ipv4/netfilter/nf_nat_snmp_basic_main.c +f:net/ipv4/netfilter/nf_reject_ipv4.c +f:net/ipv4/netfilter/nf_socket_ipv4.c +f:net/ipv4/netfilter/nf_tproxy_ipv4.c +f:net/ipv4/netfilter/nft_dup_ipv4.c +f:net/ipv4/netfilter/nft_fib_ipv4.c +f:net/ipv4/netfilter/nft_reject_ipv4.c +f:net/ipv4/netlink.c +f:net/ipv4/nexthop.c +f:net/ipv4/ping.c +f:net/ipv4/proc.c +f:net/ipv4/protocol.c +f:net/ipv4/raw.c +f:net/ipv4/raw_diag.c +f:net/ipv4/route.c +f:net/ipv4/syncookies.c +f:net/ipv4/sysctl_net_ipv4.c +f:net/ipv4/tcp.c +f:net/ipv4/tcp_ao.c +f:net/ipv4/tcp_bbr.c +f:net/ipv4/tcp_bic.c +f:net/ipv4/tcp_bpf.c +f:net/ipv4/tcp_cdg.c +f:net/ipv4/tcp_cong.c +f:net/ipv4/tcp_cubic.c +f:net/ipv4/tcp_dctcp.c +f:net/ipv4/tcp_dctcp.h +f:net/ipv4/tcp_diag.c +f:net/ipv4/tcp_fastopen.c +f:net/ipv4/tcp_highspeed.c +f:net/ipv4/tcp_htcp.c +f:net/ipv4/tcp_hybla.c +f:net/ipv4/tcp_illinois.c +f:net/ipv4/tcp_input.c +f:net/ipv4/tcp_ipv4.c +f:net/ipv4/tcp_lp.c +f:net/ipv4/tcp_metrics.c +f:net/ipv4/tcp_minisocks.c +f:net/ipv4/tcp_nv.c +f:net/ipv4/tcp_offload.c +f:net/ipv4/tcp_output.c +f:net/ipv4/tcp_plb.c +f:net/ipv4/tcp_rate.c +f:net/ipv4/tcp_recovery.c +f:net/ipv4/tcp_scalable.c +f:net/ipv4/tcp_sigpool.c +f:net/ipv4/tcp_timer.c +f:net/ipv4/tcp_ulp.c +f:net/ipv4/tcp_vegas.c +f:net/ipv4/tcp_vegas.h +f:net/ipv4/tcp_veno.c +f:net/ipv4/tcp_westwood.c +f:net/ipv4/tcp_yeah.c +f:net/ipv4/tunnel4.c +f:net/ipv4/udp.c +f:net/ipv4/udp_bpf.c +f:net/ipv4/udp_diag.c +f:net/ipv4/udp_impl.h +f:net/ipv4/udp_offload.c +f:net/ipv4/udp_tunnel_core.c +f:net/ipv4/udp_tunnel_nic.c +f:net/ipv4/udp_tunnel_stub.c +f:net/ipv4/udplite.c +f:net/ipv4/xfrm4_input.c +f:net/ipv4/xfrm4_output.c +f:net/ipv4/xfrm4_policy.c +f:net/ipv4/xfrm4_protocol.c +f:net/ipv4/xfrm4_state.c +f:net/ipv4/xfrm4_tunnel.c +f:net/ipv6/Kconfig +f:net/ipv6/Makefile +f:net/ipv6/addrconf.c +f:net/ipv6/addrconf_core.c +f:net/ipv6/addrlabel.c +f:net/ipv6/af_inet6.c +f:net/ipv6/ah6.c +f:net/ipv6/anycast.c +f:net/ipv6/calipso.c +f:net/ipv6/datagram.c +f:net/ipv6/esp6.c +f:net/ipv6/esp6_offload.c +f:net/ipv6/exthdrs.c +f:net/ipv6/exthdrs_core.c +f:net/ipv6/exthdrs_offload.c +f:net/ipv6/fib6_notifier.c +f:net/ipv6/fib6_rules.c +f:net/ipv6/fou6.c +f:net/ipv6/icmp.c +f:net/ipv6/ila/Makefile +f:net/ipv6/ila/ila.h +f:net/ipv6/ila/ila_common.c +f:net/ipv6/ila/ila_lwt.c +f:net/ipv6/ila/ila_main.c +f:net/ipv6/ila/ila_xlat.c +f:net/ipv6/inet6_connection_sock.c +f:net/ipv6/inet6_hashtables.c +f:net/ipv6/ioam6.c +f:net/ipv6/ioam6_iptunnel.c +f:net/ipv6/ip6_checksum.c +f:net/ipv6/ip6_fib.c +f:net/ipv6/ip6_flowlabel.c +f:net/ipv6/ip6_gre.c +f:net/ipv6/ip6_icmp.c +f:net/ipv6/ip6_input.c +f:net/ipv6/ip6_offload.c +f:net/ipv6/ip6_offload.h +f:net/ipv6/ip6_output.c +f:net/ipv6/ip6_tunnel.c +f:net/ipv6/ip6_udp_tunnel.c +f:net/ipv6/ip6_vti.c +f:net/ipv6/ip6mr.c +f:net/ipv6/ipcomp6.c +f:net/ipv6/ipv6_sockglue.c +f:net/ipv6/mcast.c +f:net/ipv6/mcast_snoop.c +f:net/ipv6/mip6.c +f:net/ipv6/ndisc.c +f:net/ipv6/netfilter.c +f:net/ipv6/netfilter/Kconfig +f:net/ipv6/netfilter/Makefile +f:net/ipv6/netfilter/ip6_tables.c +f:net/ipv6/netfilter/ip6t_NPT.c +f:net/ipv6/netfilter/ip6t_REJECT.c +f:net/ipv6/netfilter/ip6t_SYNPROXY.c +f:net/ipv6/netfilter/ip6t_ah.c +f:net/ipv6/netfilter/ip6t_eui64.c +f:net/ipv6/netfilter/ip6t_frag.c +f:net/ipv6/netfilter/ip6t_hbh.c +f:net/ipv6/netfilter/ip6t_ipv6header.c +f:net/ipv6/netfilter/ip6t_mh.c +f:net/ipv6/netfilter/ip6t_rpfilter.c +f:net/ipv6/netfilter/ip6t_rt.c +f:net/ipv6/netfilter/ip6t_srh.c +f:net/ipv6/netfilter/ip6table_filter.c +f:net/ipv6/netfilter/ip6table_mangle.c +f:net/ipv6/netfilter/ip6table_nat.c +f:net/ipv6/netfilter/ip6table_raw.c +f:net/ipv6/netfilter/ip6table_security.c +f:net/ipv6/netfilter/nf_conntrack_reasm.c +f:net/ipv6/netfilter/nf_defrag_ipv6_hooks.c +f:net/ipv6/netfilter/nf_dup_ipv6.c +f:net/ipv6/netfilter/nf_reject_ipv6.c +f:net/ipv6/netfilter/nf_socket_ipv6.c +f:net/ipv6/netfilter/nf_tproxy_ipv6.c +f:net/ipv6/netfilter/nft_dup_ipv6.c +f:net/ipv6/netfilter/nft_fib_ipv6.c +f:net/ipv6/netfilter/nft_reject_ipv6.c +f:net/ipv6/output_core.c +f:net/ipv6/ping.c +f:net/ipv6/proc.c +f:net/ipv6/protocol.c +f:net/ipv6/raw.c +f:net/ipv6/reassembly.c +f:net/ipv6/route.c +f:net/ipv6/rpl.c +f:net/ipv6/rpl_iptunnel.c +f:net/ipv6/seg6.c +f:net/ipv6/seg6_hmac.c +f:net/ipv6/seg6_iptunnel.c +f:net/ipv6/seg6_local.c +f:net/ipv6/sit.c +f:net/ipv6/syncookies.c +f:net/ipv6/sysctl_net_ipv6.c +f:net/ipv6/tcp_ao.c +f:net/ipv6/tcp_ipv6.c +f:net/ipv6/tcpv6_offload.c +f:net/ipv6/tunnel6.c +f:net/ipv6/udp.c +f:net/ipv6/udp_impl.h +f:net/ipv6/udp_offload.c +f:net/ipv6/udplite.c +f:net/ipv6/xfrm6_input.c +f:net/ipv6/xfrm6_output.c +f:net/ipv6/xfrm6_policy.c +f:net/ipv6/xfrm6_protocol.c +f:net/ipv6/xfrm6_state.c +f:net/ipv6/xfrm6_tunnel.c +f:net/iucv/Kconfig +f:net/iucv/Makefile +f:net/iucv/af_iucv.c +f:net/iucv/iucv.c +f:net/kcm/Kconfig +f:net/kcm/Makefile +f:net/kcm/kcmproc.c +f:net/kcm/kcmsock.c +f:net/key/Makefile +f:net/key/af_key.c +f:net/l2tp/Kconfig +f:net/l2tp/Makefile +f:net/l2tp/l2tp_core.c +f:net/l2tp/l2tp_core.h +f:net/l2tp/l2tp_debugfs.c +f:net/l2tp/l2tp_eth.c +f:net/l2tp/l2tp_ip.c +f:net/l2tp/l2tp_ip6.c +f:net/l2tp/l2tp_netlink.c +f:net/l2tp/l2tp_ppp.c +f:net/l2tp/trace.h +f:net/l3mdev/Kconfig +f:net/l3mdev/Makefile +f:net/l3mdev/l3mdev.c +f:net/lapb/Kconfig +f:net/lapb/Makefile +f:net/lapb/lapb_iface.c +f:net/lapb/lapb_in.c +f:net/lapb/lapb_out.c +f:net/lapb/lapb_subr.c +f:net/lapb/lapb_timer.c +f:net/llc/Kconfig +f:net/llc/Makefile +f:net/llc/af_llc.c +f:net/llc/llc_c_ac.c +f:net/llc/llc_c_ev.c +f:net/llc/llc_c_st.c +f:net/llc/llc_conn.c +f:net/llc/llc_core.c +f:net/llc/llc_if.c +f:net/llc/llc_input.c +f:net/llc/llc_output.c +f:net/llc/llc_pdu.c +f:net/llc/llc_proc.c +f:net/llc/llc_s_ac.c +f:net/llc/llc_s_ev.c +f:net/llc/llc_s_st.c +f:net/llc/llc_sap.c +f:net/llc/llc_station.c +f:net/llc/sysctl_net_llc.c +f:net/mac80211/Kconfig +f:net/mac80211/Makefile +f:net/mac80211/aead_api.c +f:net/mac80211/aead_api.h +f:net/mac80211/aes_ccm.h +f:net/mac80211/aes_cmac.c +f:net/mac80211/aes_cmac.h +f:net/mac80211/aes_gcm.h +f:net/mac80211/aes_gmac.c +f:net/mac80211/aes_gmac.h +f:net/mac80211/agg-rx.c +f:net/mac80211/agg-tx.c +f:net/mac80211/airtime.c +f:net/mac80211/cfg.c +f:net/mac80211/chan.c +f:net/mac80211/debug.h +f:net/mac80211/debugfs.c +f:net/mac80211/debugfs.h +f:net/mac80211/debugfs_key.c +f:net/mac80211/debugfs_key.h +f:net/mac80211/debugfs_netdev.c +f:net/mac80211/debugfs_netdev.h +f:net/mac80211/debugfs_sta.c +f:net/mac80211/debugfs_sta.h +f:net/mac80211/driver-ops.c +f:net/mac80211/driver-ops.h +f:net/mac80211/drop.h +f:net/mac80211/eht.c +f:net/mac80211/ethtool.c +f:net/mac80211/fils_aead.c +f:net/mac80211/fils_aead.h +f:net/mac80211/he.c +f:net/mac80211/ht.c +f:net/mac80211/ibss.c +f:net/mac80211/ieee80211_i.h +f:net/mac80211/iface.c +f:net/mac80211/key.c +f:net/mac80211/key.h +f:net/mac80211/led.c +f:net/mac80211/led.h +f:net/mac80211/link.c +f:net/mac80211/main.c +f:net/mac80211/mesh.c +f:net/mac80211/mesh.h +f:net/mac80211/mesh_hwmp.c +f:net/mac80211/mesh_pathtbl.c +f:net/mac80211/mesh_plink.c +f:net/mac80211/mesh_ps.c +f:net/mac80211/mesh_sync.c +f:net/mac80211/michael.c +f:net/mac80211/michael.h +f:net/mac80211/mlme.c +f:net/mac80211/ocb.c +f:net/mac80211/offchannel.c +f:net/mac80211/parse.c +f:net/mac80211/pm.c +f:net/mac80211/rate.c +f:net/mac80211/rate.h +f:net/mac80211/rc80211_minstrel_ht.c +f:net/mac80211/rc80211_minstrel_ht.h +f:net/mac80211/rc80211_minstrel_ht_debugfs.c +f:net/mac80211/rx.c +f:net/mac80211/s1g.c +f:net/mac80211/scan.c +f:net/mac80211/spectmgmt.c +f:net/mac80211/sta_info.c +f:net/mac80211/sta_info.h +f:net/mac80211/status.c +f:net/mac80211/tdls.c +f:net/mac80211/tests/Makefile +f:net/mac80211/tests/chan-mode.c +f:net/mac80211/tests/elems.c +f:net/mac80211/tests/mfp.c +f:net/mac80211/tests/module.c +f:net/mac80211/tests/tpe.c +f:net/mac80211/tests/util.c +f:net/mac80211/tests/util.h +f:net/mac80211/tkip.c +f:net/mac80211/tkip.h +f:net/mac80211/trace.c +f:net/mac80211/trace.h +f:net/mac80211/trace_msg.h +f:net/mac80211/tx.c +f:net/mac80211/util.c +f:net/mac80211/vht.c +f:net/mac80211/wbrf.c +f:net/mac80211/wep.c +f:net/mac80211/wep.h +f:net/mac80211/wme.c +f:net/mac80211/wme.h +f:net/mac80211/wpa.c +f:net/mac80211/wpa.h +f:net/mac802154/Kconfig +f:net/mac802154/Makefile +f:net/mac802154/cfg.c +f:net/mac802154/cfg.h +f:net/mac802154/driver-ops.h +f:net/mac802154/ieee802154_i.h +f:net/mac802154/iface.c +f:net/mac802154/llsec.c +f:net/mac802154/llsec.h +f:net/mac802154/mac_cmd.c +f:net/mac802154/main.c +f:net/mac802154/mib.c +f:net/mac802154/rx.c +f:net/mac802154/scan.c +f:net/mac802154/trace.c +f:net/mac802154/trace.h +f:net/mac802154/tx.c +f:net/mac802154/util.c +f:net/mctp/Kconfig +f:net/mctp/Makefile +f:net/mctp/af_mctp.c +f:net/mctp/device.c +f:net/mctp/neigh.c +f:net/mctp/route.c +f:net/mctp/test/route-test.c +f:net/mctp/test/sock-test.c +f:net/mctp/test/utils.c +f:net/mctp/test/utils.h +f:net/mpls/Kconfig +f:net/mpls/Makefile +f:net/mpls/af_mpls.c +f:net/mpls/internal.h +f:net/mpls/mpls_gso.c +f:net/mpls/mpls_iptunnel.c +f:net/mptcp/Kconfig +f:net/mptcp/Makefile +f:net/mptcp/bpf.c +f:net/mptcp/crypto.c +f:net/mptcp/crypto_test.c +f:net/mptcp/ctrl.c +f:net/mptcp/diag.c +f:net/mptcp/fastopen.c +f:net/mptcp/mib.c +f:net/mptcp/mib.h +f:net/mptcp/mptcp_diag.c +f:net/mptcp/mptcp_pm_gen.c +f:net/mptcp/mptcp_pm_gen.h +f:net/mptcp/options.c +f:net/mptcp/pm.c +f:net/mptcp/pm_kernel.c +f:net/mptcp/pm_netlink.c +f:net/mptcp/pm_userspace.c +f:net/mptcp/protocol.c +f:net/mptcp/protocol.h +f:net/mptcp/sched.c +f:net/mptcp/sockopt.c +f:net/mptcp/subflow.c +f:net/mptcp/syncookies.c +f:net/mptcp/token.c +f:net/mptcp/token_test.c +f:net/ncsi/Kconfig +f:net/ncsi/Makefile +f:net/ncsi/internal.h +f:net/ncsi/ncsi-aen.c +f:net/ncsi/ncsi-cmd.c +f:net/ncsi/ncsi-manage.c +f:net/ncsi/ncsi-netlink.c +f:net/ncsi/ncsi-netlink.h +f:net/ncsi/ncsi-pkt.h +f:net/ncsi/ncsi-rsp.c +f:net/netfilter/Kconfig +f:net/netfilter/Makefile +f:net/netfilter/core.c +f:net/netfilter/ipset/Kconfig +f:net/netfilter/ipset/Makefile +f:net/netfilter/ipset/ip_set_bitmap_gen.h +f:net/netfilter/ipset/ip_set_bitmap_ip.c +f:net/netfilter/ipset/ip_set_bitmap_ipmac.c +f:net/netfilter/ipset/ip_set_bitmap_port.c +f:net/netfilter/ipset/ip_set_core.c +f:net/netfilter/ipset/ip_set_getport.c +f:net/netfilter/ipset/ip_set_hash_gen.h +f:net/netfilter/ipset/ip_set_hash_ip.c +f:net/netfilter/ipset/ip_set_hash_ipmac.c +f:net/netfilter/ipset/ip_set_hash_ipmark.c +f:net/netfilter/ipset/ip_set_hash_ipport.c +f:net/netfilter/ipset/ip_set_hash_ipportip.c +f:net/netfilter/ipset/ip_set_hash_ipportnet.c +f:net/netfilter/ipset/ip_set_hash_mac.c +f:net/netfilter/ipset/ip_set_hash_net.c +f:net/netfilter/ipset/ip_set_hash_netiface.c +f:net/netfilter/ipset/ip_set_hash_netnet.c +f:net/netfilter/ipset/ip_set_hash_netport.c +f:net/netfilter/ipset/ip_set_hash_netportnet.c +f:net/netfilter/ipset/ip_set_list_set.c +f:net/netfilter/ipset/pfxlen.c +f:net/netfilter/ipvs/Kconfig +f:net/netfilter/ipvs/Makefile +f:net/netfilter/ipvs/ip_vs_app.c +f:net/netfilter/ipvs/ip_vs_conn.c +f:net/netfilter/ipvs/ip_vs_core.c +f:net/netfilter/ipvs/ip_vs_ctl.c +f:net/netfilter/ipvs/ip_vs_dh.c +f:net/netfilter/ipvs/ip_vs_est.c +f:net/netfilter/ipvs/ip_vs_fo.c +f:net/netfilter/ipvs/ip_vs_ftp.c +f:net/netfilter/ipvs/ip_vs_lblc.c +f:net/netfilter/ipvs/ip_vs_lblcr.c +f:net/netfilter/ipvs/ip_vs_lc.c +f:net/netfilter/ipvs/ip_vs_mh.c +f:net/netfilter/ipvs/ip_vs_nfct.c +f:net/netfilter/ipvs/ip_vs_nq.c +f:net/netfilter/ipvs/ip_vs_ovf.c +f:net/netfilter/ipvs/ip_vs_pe.c +f:net/netfilter/ipvs/ip_vs_pe_sip.c +f:net/netfilter/ipvs/ip_vs_proto.c +f:net/netfilter/ipvs/ip_vs_proto_ah_esp.c +f:net/netfilter/ipvs/ip_vs_proto_sctp.c +f:net/netfilter/ipvs/ip_vs_proto_tcp.c +f:net/netfilter/ipvs/ip_vs_proto_udp.c +f:net/netfilter/ipvs/ip_vs_rr.c +f:net/netfilter/ipvs/ip_vs_sched.c +f:net/netfilter/ipvs/ip_vs_sed.c +f:net/netfilter/ipvs/ip_vs_sh.c +f:net/netfilter/ipvs/ip_vs_sync.c +f:net/netfilter/ipvs/ip_vs_twos.c +f:net/netfilter/ipvs/ip_vs_wlc.c +f:net/netfilter/ipvs/ip_vs_wrr.c +f:net/netfilter/ipvs/ip_vs_xmit.c +f:net/netfilter/nf_bpf_link.c +f:net/netfilter/nf_conncount.c +f:net/netfilter/nf_conntrack_acct.c +f:net/netfilter/nf_conntrack_amanda.c +f:net/netfilter/nf_conntrack_bpf.c +f:net/netfilter/nf_conntrack_broadcast.c +f:net/netfilter/nf_conntrack_core.c +f:net/netfilter/nf_conntrack_ecache.c +f:net/netfilter/nf_conntrack_expect.c +f:net/netfilter/nf_conntrack_extend.c +f:net/netfilter/nf_conntrack_ftp.c +f:net/netfilter/nf_conntrack_h323_asn1.c +f:net/netfilter/nf_conntrack_h323_main.c +f:net/netfilter/nf_conntrack_h323_types.c +f:net/netfilter/nf_conntrack_helper.c +f:net/netfilter/nf_conntrack_irc.c +f:net/netfilter/nf_conntrack_labels.c +f:net/netfilter/nf_conntrack_netbios_ns.c +f:net/netfilter/nf_conntrack_netlink.c +f:net/netfilter/nf_conntrack_ovs.c +f:net/netfilter/nf_conntrack_pptp.c +f:net/netfilter/nf_conntrack_proto.c +f:net/netfilter/nf_conntrack_proto_generic.c +f:net/netfilter/nf_conntrack_proto_gre.c +f:net/netfilter/nf_conntrack_proto_icmp.c +f:net/netfilter/nf_conntrack_proto_icmpv6.c +f:net/netfilter/nf_conntrack_proto_sctp.c +f:net/netfilter/nf_conntrack_proto_tcp.c +f:net/netfilter/nf_conntrack_proto_udp.c +f:net/netfilter/nf_conntrack_sane.c +f:net/netfilter/nf_conntrack_seqadj.c +f:net/netfilter/nf_conntrack_sip.c +f:net/netfilter/nf_conntrack_snmp.c +f:net/netfilter/nf_conntrack_standalone.c +f:net/netfilter/nf_conntrack_tftp.c +f:net/netfilter/nf_conntrack_timeout.c +f:net/netfilter/nf_conntrack_timestamp.c +f:net/netfilter/nf_dup_netdev.c +f:net/netfilter/nf_flow_table_bpf.c +f:net/netfilter/nf_flow_table_core.c +f:net/netfilter/nf_flow_table_inet.c +f:net/netfilter/nf_flow_table_ip.c +f:net/netfilter/nf_flow_table_offload.c +f:net/netfilter/nf_flow_table_procfs.c +f:net/netfilter/nf_flow_table_xdp.c +f:net/netfilter/nf_hooks_lwtunnel.c +f:net/netfilter/nf_internals.h +f:net/netfilter/nf_log.c +f:net/netfilter/nf_log_syslog.c +f:net/netfilter/nf_nat_amanda.c +f:net/netfilter/nf_nat_bpf.c +f:net/netfilter/nf_nat_core.c +f:net/netfilter/nf_nat_ftp.c +f:net/netfilter/nf_nat_helper.c +f:net/netfilter/nf_nat_irc.c +f:net/netfilter/nf_nat_masquerade.c +f:net/netfilter/nf_nat_ovs.c +f:net/netfilter/nf_nat_proto.c +f:net/netfilter/nf_nat_redirect.c +f:net/netfilter/nf_nat_sip.c +f:net/netfilter/nf_nat_tftp.c +f:net/netfilter/nf_queue.c +f:net/netfilter/nf_sockopt.c +f:net/netfilter/nf_synproxy_core.c +f:net/netfilter/nf_tables_api.c +f:net/netfilter/nf_tables_core.c +f:net/netfilter/nf_tables_offload.c +f:net/netfilter/nf_tables_trace.c +f:net/netfilter/nfnetlink.c +f:net/netfilter/nfnetlink_acct.c +f:net/netfilter/nfnetlink_cthelper.c +f:net/netfilter/nfnetlink_cttimeout.c +f:net/netfilter/nfnetlink_hook.c +f:net/netfilter/nfnetlink_log.c +f:net/netfilter/nfnetlink_osf.c +f:net/netfilter/nfnetlink_queue.c +f:net/netfilter/nft_bitwise.c +f:net/netfilter/nft_byteorder.c +f:net/netfilter/nft_chain_filter.c +f:net/netfilter/nft_chain_nat.c +f:net/netfilter/nft_chain_route.c +f:net/netfilter/nft_cmp.c +f:net/netfilter/nft_compat.c +f:net/netfilter/nft_connlimit.c +f:net/netfilter/nft_counter.c +f:net/netfilter/nft_ct.c +f:net/netfilter/nft_ct_fast.c +f:net/netfilter/nft_dup_netdev.c +f:net/netfilter/nft_dynset.c +f:net/netfilter/nft_exthdr.c +f:net/netfilter/nft_fib.c +f:net/netfilter/nft_fib_inet.c +f:net/netfilter/nft_fib_netdev.c +f:net/netfilter/nft_flow_offload.c +f:net/netfilter/nft_fwd_netdev.c +f:net/netfilter/nft_hash.c +f:net/netfilter/nft_immediate.c +f:net/netfilter/nft_inner.c +f:net/netfilter/nft_last.c +f:net/netfilter/nft_limit.c +f:net/netfilter/nft_log.c +f:net/netfilter/nft_lookup.c +f:net/netfilter/nft_masq.c +f:net/netfilter/nft_meta.c +f:net/netfilter/nft_nat.c +f:net/netfilter/nft_numgen.c +f:net/netfilter/nft_objref.c +f:net/netfilter/nft_osf.c +f:net/netfilter/nft_payload.c +f:net/netfilter/nft_queue.c +f:net/netfilter/nft_quota.c +f:net/netfilter/nft_range.c +f:net/netfilter/nft_redir.c +f:net/netfilter/nft_reject.c +f:net/netfilter/nft_reject_inet.c +f:net/netfilter/nft_reject_netdev.c +f:net/netfilter/nft_rt.c +f:net/netfilter/nft_set_bitmap.c +f:net/netfilter/nft_set_hash.c +f:net/netfilter/nft_set_pipapo.c +f:net/netfilter/nft_set_pipapo.h +f:net/netfilter/nft_set_pipapo_avx2.c +f:net/netfilter/nft_set_pipapo_avx2.h +f:net/netfilter/nft_set_rbtree.c +f:net/netfilter/nft_socket.c +f:net/netfilter/nft_synproxy.c +f:net/netfilter/nft_tproxy.c +f:net/netfilter/nft_tunnel.c +f:net/netfilter/nft_xfrm.c +f:net/netfilter/utils.c +f:net/netfilter/x_tables.c +f:net/netfilter/xt_AUDIT.c +f:net/netfilter/xt_CHECKSUM.c +f:net/netfilter/xt_CLASSIFY.c +f:net/netfilter/xt_CONNSECMARK.c +f:net/netfilter/xt_CT.c +f:net/netfilter/xt_HMARK.c +f:net/netfilter/xt_IDLETIMER.c +f:net/netfilter/xt_LED.c +f:net/netfilter/xt_LOG.c +f:net/netfilter/xt_MASQUERADE.c +f:net/netfilter/xt_NETMAP.c +f:net/netfilter/xt_NFLOG.c +f:net/netfilter/xt_NFQUEUE.c +f:net/netfilter/xt_REDIRECT.c +f:net/netfilter/xt_SECMARK.c +f:net/netfilter/xt_TCPOPTSTRIP.c +f:net/netfilter/xt_TEE.c +f:net/netfilter/xt_TPROXY.c +f:net/netfilter/xt_TRACE.c +f:net/netfilter/xt_addrtype.c +f:net/netfilter/xt_bpf.c +f:net/netfilter/xt_cgroup.c +f:net/netfilter/xt_cluster.c +f:net/netfilter/xt_comment.c +f:net/netfilter/xt_connbytes.c +f:net/netfilter/xt_connlabel.c +f:net/netfilter/xt_connlimit.c +f:net/netfilter/xt_connmark.c +f:net/netfilter/xt_conntrack.c +f:net/netfilter/xt_cpu.c +f:net/netfilter/xt_dccp.c +f:net/netfilter/xt_devgroup.c +f:net/netfilter/xt_dscp.c +f:net/netfilter/xt_ecn.c +f:net/netfilter/xt_esp.c +f:net/netfilter/xt_hashlimit.c +f:net/netfilter/xt_helper.c +f:net/netfilter/xt_hl.c +f:net/netfilter/xt_ipcomp.c +f:net/netfilter/xt_iprange.c +f:net/netfilter/xt_ipvs.c +f:net/netfilter/xt_l2tp.c +f:net/netfilter/xt_length.c +f:net/netfilter/xt_limit.c +f:net/netfilter/xt_mac.c +f:net/netfilter/xt_mark.c +f:net/netfilter/xt_multiport.c +f:net/netfilter/xt_nat.c +f:net/netfilter/xt_nfacct.c +f:net/netfilter/xt_osf.c +f:net/netfilter/xt_owner.c +f:net/netfilter/xt_physdev.c +f:net/netfilter/xt_pkttype.c +f:net/netfilter/xt_policy.c +f:net/netfilter/xt_quota.c +f:net/netfilter/xt_rateest.c +f:net/netfilter/xt_realm.c +f:net/netfilter/xt_recent.c +f:net/netfilter/xt_repldata.h +f:net/netfilter/xt_sctp.c +f:net/netfilter/xt_set.c +f:net/netfilter/xt_socket.c +f:net/netfilter/xt_state.c +f:net/netfilter/xt_statistic.c +f:net/netfilter/xt_string.c +f:net/netfilter/xt_tcpmss.c +f:net/netfilter/xt_tcpudp.c +f:net/netfilter/xt_time.c +f:net/netfilter/xt_u32.c +f:net/netlabel/Kconfig +f:net/netlabel/Makefile +f:net/netlabel/netlabel_addrlist.c +f:net/netlabel/netlabel_addrlist.h +f:net/netlabel/netlabel_calipso.c +f:net/netlabel/netlabel_calipso.h +f:net/netlabel/netlabel_cipso_v4.c +f:net/netlabel/netlabel_cipso_v4.h +f:net/netlabel/netlabel_domainhash.c +f:net/netlabel/netlabel_domainhash.h +f:net/netlabel/netlabel_kapi.c +f:net/netlabel/netlabel_mgmt.c +f:net/netlabel/netlabel_mgmt.h +f:net/netlabel/netlabel_unlabeled.c +f:net/netlabel/netlabel_unlabeled.h +f:net/netlabel/netlabel_user.c +f:net/netlabel/netlabel_user.h +f:net/netlink/Kconfig +f:net/netlink/Makefile +f:net/netlink/af_netlink.c +f:net/netlink/af_netlink.h +f:net/netlink/diag.c +f:net/netlink/genetlink.c +f:net/netlink/genetlink.h +f:net/netlink/policy.c +f:net/netrom/Makefile +f:net/netrom/af_netrom.c +f:net/netrom/nr_dev.c +f:net/netrom/nr_in.c +f:net/netrom/nr_loopback.c +f:net/netrom/nr_out.c +f:net/netrom/nr_route.c +f:net/netrom/nr_subr.c +f:net/netrom/nr_timer.c +f:net/netrom/sysctl_net_netrom.c +f:net/nfc/Kconfig +f:net/nfc/Makefile +f:net/nfc/af_nfc.c +f:net/nfc/core.c +f:net/nfc/digital.h +f:net/nfc/digital_core.c +f:net/nfc/digital_dep.c +f:net/nfc/digital_technology.c +f:net/nfc/hci/Kconfig +f:net/nfc/hci/Makefile +f:net/nfc/hci/command.c +f:net/nfc/hci/core.c +f:net/nfc/hci/hci.h +f:net/nfc/hci/hcp.c +f:net/nfc/hci/llc.c +f:net/nfc/hci/llc.h +f:net/nfc/hci/llc_nop.c +f:net/nfc/hci/llc_shdlc.c +f:net/nfc/llcp.h +f:net/nfc/llcp_commands.c +f:net/nfc/llcp_core.c +f:net/nfc/llcp_sock.c +f:net/nfc/nci/Kconfig +f:net/nfc/nci/Makefile +f:net/nfc/nci/core.c +f:net/nfc/nci/data.c +f:net/nfc/nci/hci.c +f:net/nfc/nci/lib.c +f:net/nfc/nci/ntf.c +f:net/nfc/nci/rsp.c +f:net/nfc/nci/spi.c +f:net/nfc/nci/uart.c +f:net/nfc/netlink.c +f:net/nfc/nfc.h +f:net/nfc/rawsock.c +f:net/nsh/Kconfig +f:net/nsh/Makefile +f:net/nsh/nsh.c +f:net/openvswitch/Kconfig +f:net/openvswitch/Makefile +f:net/openvswitch/actions.c +f:net/openvswitch/conntrack.c +f:net/openvswitch/conntrack.h +f:net/openvswitch/datapath.c +f:net/openvswitch/datapath.h +f:net/openvswitch/dp_notify.c +f:net/openvswitch/drop.h +f:net/openvswitch/flow.c +f:net/openvswitch/flow.h +f:net/openvswitch/flow_netlink.c +f:net/openvswitch/flow_netlink.h +f:net/openvswitch/flow_table.c +f:net/openvswitch/flow_table.h +f:net/openvswitch/meter.c +f:net/openvswitch/meter.h +f:net/openvswitch/openvswitch_trace.c +f:net/openvswitch/openvswitch_trace.h +f:net/openvswitch/vport-geneve.c +f:net/openvswitch/vport-gre.c +f:net/openvswitch/vport-internal_dev.c +f:net/openvswitch/vport-internal_dev.h +f:net/openvswitch/vport-netdev.c +f:net/openvswitch/vport-netdev.h +f:net/openvswitch/vport-vxlan.c +f:net/openvswitch/vport.c +f:net/openvswitch/vport.h +f:net/packet/Kconfig +f:net/packet/Makefile +f:net/packet/af_packet.c +f:net/packet/diag.c +f:net/packet/internal.h +f:net/phonet/Kconfig +f:net/phonet/Makefile +f:net/phonet/af_phonet.c +f:net/phonet/datagram.c +f:net/phonet/pep-gprs.c +f:net/phonet/pep.c +f:net/phonet/pn_dev.c +f:net/phonet/pn_netlink.c +f:net/phonet/socket.c +f:net/phonet/sysctl.c +f:net/psample/Kconfig +f:net/psample/Makefile +f:net/psample/psample.c +f:net/qrtr/Kconfig +f:net/qrtr/Makefile +f:net/qrtr/af_qrtr.c +f:net/qrtr/mhi.c +f:net/qrtr/ns.c +f:net/qrtr/qrtr.h +f:net/qrtr/smd.c +f:net/qrtr/tun.c +f:net/rds/Kconfig +f:net/rds/Makefile +f:net/rds/af_rds.c +f:net/rds/bind.c +f:net/rds/cong.c +f:net/rds/connection.c +f:net/rds/ib.c +f:net/rds/ib.h +f:net/rds/ib_cm.c +f:net/rds/ib_frmr.c +f:net/rds/ib_mr.h +f:net/rds/ib_rdma.c +f:net/rds/ib_recv.c +f:net/rds/ib_ring.c +f:net/rds/ib_send.c +f:net/rds/ib_stats.c +f:net/rds/ib_sysctl.c +f:net/rds/info.c +f:net/rds/info.h +f:net/rds/loop.c +f:net/rds/loop.h +f:net/rds/message.c +f:net/rds/page.c +f:net/rds/rdma.c +f:net/rds/rdma_transport.c +f:net/rds/rdma_transport.h +f:net/rds/rds.h +f:net/rds/rds_single_path.h +f:net/rds/recv.c +f:net/rds/send.c +f:net/rds/stats.c +f:net/rds/sysctl.c +f:net/rds/tcp.c +f:net/rds/tcp.h +f:net/rds/tcp_connect.c +f:net/rds/tcp_listen.c +f:net/rds/tcp_recv.c +f:net/rds/tcp_send.c +f:net/rds/tcp_stats.c +f:net/rds/threads.c +f:net/rds/transport.c +f:net/rfkill/Kconfig +f:net/rfkill/Makefile +f:net/rfkill/core.c +f:net/rfkill/input.c +f:net/rfkill/rfkill-gpio.c +f:net/rfkill/rfkill.h +f:net/rose/Makefile +f:net/rose/af_rose.c +f:net/rose/rose_dev.c +f:net/rose/rose_in.c +f:net/rose/rose_link.c +f:net/rose/rose_loopback.c +f:net/rose/rose_out.c +f:net/rose/rose_route.c +f:net/rose/rose_subr.c +f:net/rose/rose_timer.c +f:net/rose/sysctl_net_rose.c +f:net/rxrpc/Kconfig +f:net/rxrpc/Makefile +f:net/rxrpc/af_rxrpc.c +f:net/rxrpc/ar-internal.h +f:net/rxrpc/call_accept.c +f:net/rxrpc/call_event.c +f:net/rxrpc/call_object.c +f:net/rxrpc/call_state.c +f:net/rxrpc/conn_client.c +f:net/rxrpc/conn_event.c +f:net/rxrpc/conn_object.c +f:net/rxrpc/conn_service.c +f:net/rxrpc/input.c +f:net/rxrpc/input_rack.c +f:net/rxrpc/insecure.c +f:net/rxrpc/io_thread.c +f:net/rxrpc/key.c +f:net/rxrpc/local_event.c +f:net/rxrpc/local_object.c +f:net/rxrpc/misc.c +f:net/rxrpc/net_ns.c +f:net/rxrpc/oob.c +f:net/rxrpc/output.c +f:net/rxrpc/peer_event.c +f:net/rxrpc/peer_object.c +f:net/rxrpc/proc.c +f:net/rxrpc/protocol.h +f:net/rxrpc/recvmsg.c +f:net/rxrpc/rtt.c +f:net/rxrpc/rxgk.c +f:net/rxrpc/rxgk_app.c +f:net/rxrpc/rxgk_common.h +f:net/rxrpc/rxgk_kdf.c +f:net/rxrpc/rxkad.c +f:net/rxrpc/rxperf.c +f:net/rxrpc/security.c +f:net/rxrpc/sendmsg.c +f:net/rxrpc/server_key.c +f:net/rxrpc/skbuff.c +f:net/rxrpc/sysctl.c +f:net/rxrpc/txbuf.c +f:net/rxrpc/utils.c +f:net/sched/Kconfig +f:net/sched/Makefile +f:net/sched/act_api.c +f:net/sched/act_bpf.c +f:net/sched/act_connmark.c +f:net/sched/act_csum.c +f:net/sched/act_ct.c +f:net/sched/act_ctinfo.c +f:net/sched/act_gact.c +f:net/sched/act_gate.c +f:net/sched/act_ife.c +f:net/sched/act_meta_mark.c +f:net/sched/act_meta_skbprio.c +f:net/sched/act_meta_skbtcindex.c +f:net/sched/act_mirred.c +f:net/sched/act_mpls.c +f:net/sched/act_nat.c +f:net/sched/act_pedit.c +f:net/sched/act_police.c +f:net/sched/act_sample.c +f:net/sched/act_simple.c +f:net/sched/act_skbedit.c +f:net/sched/act_skbmod.c +f:net/sched/act_tunnel_key.c +f:net/sched/act_vlan.c +f:net/sched/bpf_qdisc.c +f:net/sched/cls_api.c +f:net/sched/cls_basic.c +f:net/sched/cls_bpf.c +f:net/sched/cls_cgroup.c +f:net/sched/cls_flow.c +f:net/sched/cls_flower.c +f:net/sched/cls_fw.c +f:net/sched/cls_matchall.c +f:net/sched/cls_route.c +f:net/sched/cls_u32.c +f:net/sched/em_canid.c +f:net/sched/em_cmp.c +f:net/sched/em_ipset.c +f:net/sched/em_ipt.c +f:net/sched/em_meta.c +f:net/sched/em_nbyte.c +f:net/sched/em_text.c +f:net/sched/em_u32.c +f:net/sched/ematch.c +f:net/sched/sch_api.c +f:net/sched/sch_blackhole.c +f:net/sched/sch_cake.c +f:net/sched/sch_cbs.c +f:net/sched/sch_choke.c +f:net/sched/sch_codel.c +f:net/sched/sch_drr.c +f:net/sched/sch_dualpi2.c +f:net/sched/sch_etf.c +f:net/sched/sch_ets.c +f:net/sched/sch_fifo.c +f:net/sched/sch_fq.c +f:net/sched/sch_fq_codel.c +f:net/sched/sch_fq_pie.c +f:net/sched/sch_frag.c +f:net/sched/sch_generic.c +f:net/sched/sch_gred.c +f:net/sched/sch_hfsc.c +f:net/sched/sch_hhf.c +f:net/sched/sch_htb.c +f:net/sched/sch_ingress.c +f:net/sched/sch_mq.c +f:net/sched/sch_mqprio.c +f:net/sched/sch_mqprio_lib.c +f:net/sched/sch_mqprio_lib.h +f:net/sched/sch_multiq.c +f:net/sched/sch_netem.c +f:net/sched/sch_pie.c +f:net/sched/sch_plug.c +f:net/sched/sch_prio.c +f:net/sched/sch_qfq.c +f:net/sched/sch_red.c +f:net/sched/sch_sfb.c +f:net/sched/sch_sfq.c +f:net/sched/sch_skbprio.c +f:net/sched/sch_taprio.c +f:net/sched/sch_tbf.c +f:net/sched/sch_teql.c +f:net/sctp/Kconfig +f:net/sctp/Makefile +f:net/sctp/associola.c +f:net/sctp/auth.c +f:net/sctp/bind_addr.c +f:net/sctp/chunk.c +f:net/sctp/debug.c +f:net/sctp/diag.c +f:net/sctp/endpointola.c +f:net/sctp/input.c +f:net/sctp/inqueue.c +f:net/sctp/ipv6.c +f:net/sctp/objcnt.c +f:net/sctp/offload.c +f:net/sctp/output.c +f:net/sctp/outqueue.c +f:net/sctp/primitive.c +f:net/sctp/proc.c +f:net/sctp/protocol.c +f:net/sctp/sm_make_chunk.c +f:net/sctp/sm_sideeffect.c +f:net/sctp/sm_statefuns.c +f:net/sctp/sm_statetable.c +f:net/sctp/socket.c +f:net/sctp/stream.c +f:net/sctp/stream_interleave.c +f:net/sctp/stream_sched.c +f:net/sctp/stream_sched_fc.c +f:net/sctp/stream_sched_prio.c +f:net/sctp/stream_sched_rr.c +f:net/sctp/sysctl.c +f:net/sctp/transport.c +f:net/sctp/tsnmap.c +f:net/sctp/ulpevent.c +f:net/sctp/ulpqueue.c +f:net/shaper/Makefile +f:net/shaper/shaper.c +f:net/shaper/shaper_nl_gen.c +f:net/shaper/shaper_nl_gen.h +f:net/smc/Kconfig +f:net/smc/Makefile +f:net/smc/af_smc.c +f:net/smc/smc.h +f:net/smc/smc_cdc.c +f:net/smc/smc_cdc.h +f:net/smc/smc_clc.c +f:net/smc/smc_clc.h +f:net/smc/smc_close.c +f:net/smc/smc_close.h +f:net/smc/smc_core.c +f:net/smc/smc_core.h +f:net/smc/smc_diag.c +f:net/smc/smc_ib.c +f:net/smc/smc_ib.h +f:net/smc/smc_inet.c +f:net/smc/smc_inet.h +f:net/smc/smc_ism.c +f:net/smc/smc_ism.h +f:net/smc/smc_llc.c +f:net/smc/smc_llc.h +f:net/smc/smc_loopback.c +f:net/smc/smc_loopback.h +f:net/smc/smc_netlink.c +f:net/smc/smc_netlink.h +f:net/smc/smc_netns.h +f:net/smc/smc_pnet.c +f:net/smc/smc_pnet.h +f:net/smc/smc_rx.c +f:net/smc/smc_rx.h +f:net/smc/smc_stats.c +f:net/smc/smc_stats.h +f:net/smc/smc_sysctl.c +f:net/smc/smc_sysctl.h +f:net/smc/smc_tracepoint.c +f:net/smc/smc_tracepoint.h +f:net/smc/smc_tx.c +f:net/smc/smc_tx.h +f:net/smc/smc_wr.c +f:net/smc/smc_wr.h +f:net/socket.c +f:net/strparser/Kconfig +f:net/strparser/Makefile +f:net/strparser/strparser.c +f:net/sunrpc/.kunitconfig +f:net/sunrpc/Kconfig +f:net/sunrpc/Makefile +f:net/sunrpc/addr.c +f:net/sunrpc/auth.c +f:net/sunrpc/auth_gss/Makefile +f:net/sunrpc/auth_gss/auth_gss.c +f:net/sunrpc/auth_gss/auth_gss_internal.h +f:net/sunrpc/auth_gss/gss_krb5_crypto.c +f:net/sunrpc/auth_gss/gss_krb5_internal.h +f:net/sunrpc/auth_gss/gss_krb5_keys.c +f:net/sunrpc/auth_gss/gss_krb5_mech.c +f:net/sunrpc/auth_gss/gss_krb5_seal.c +f:net/sunrpc/auth_gss/gss_krb5_test.c +f:net/sunrpc/auth_gss/gss_krb5_unseal.c +f:net/sunrpc/auth_gss/gss_krb5_wrap.c +f:net/sunrpc/auth_gss/gss_mech_switch.c +f:net/sunrpc/auth_gss/gss_rpc_upcall.c +f:net/sunrpc/auth_gss/gss_rpc_upcall.h +f:net/sunrpc/auth_gss/gss_rpc_xdr.c +f:net/sunrpc/auth_gss/gss_rpc_xdr.h +f:net/sunrpc/auth_gss/svcauth_gss.c +f:net/sunrpc/auth_gss/trace.c +f:net/sunrpc/auth_null.c +f:net/sunrpc/auth_tls.c +f:net/sunrpc/auth_unix.c +f:net/sunrpc/backchannel_rqst.c +f:net/sunrpc/cache.c +f:net/sunrpc/clnt.c +f:net/sunrpc/debugfs.c +f:net/sunrpc/fail.h +f:net/sunrpc/netns.h +f:net/sunrpc/rpc_pipe.c +f:net/sunrpc/rpcb_clnt.c +f:net/sunrpc/sched.c +f:net/sunrpc/socklib.c +f:net/sunrpc/socklib.h +f:net/sunrpc/stats.c +f:net/sunrpc/sunrpc.h +f:net/sunrpc/sunrpc_syms.c +f:net/sunrpc/svc.c +f:net/sunrpc/svc_xprt.c +f:net/sunrpc/svcauth.c +f:net/sunrpc/svcauth_unix.c +f:net/sunrpc/svcsock.c +f:net/sunrpc/sysctl.c +f:net/sunrpc/sysfs.c +f:net/sunrpc/sysfs.h +f:net/sunrpc/timer.c +f:net/sunrpc/xdr.c +f:net/sunrpc/xprt.c +f:net/sunrpc/xprtmultipath.c +f:net/sunrpc/xprtrdma/Makefile +f:net/sunrpc/xprtrdma/backchannel.c +f:net/sunrpc/xprtrdma/frwr_ops.c +f:net/sunrpc/xprtrdma/ib_client.c +f:net/sunrpc/xprtrdma/module.c +f:net/sunrpc/xprtrdma/rpc_rdma.c +f:net/sunrpc/xprtrdma/svc_rdma.c +f:net/sunrpc/xprtrdma/svc_rdma_backchannel.c +f:net/sunrpc/xprtrdma/svc_rdma_pcl.c +f:net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +f:net/sunrpc/xprtrdma/svc_rdma_rw.c +f:net/sunrpc/xprtrdma/svc_rdma_sendto.c +f:net/sunrpc/xprtrdma/svc_rdma_transport.c +f:net/sunrpc/xprtrdma/transport.c +f:net/sunrpc/xprtrdma/verbs.c +f:net/sunrpc/xprtrdma/xprt_rdma.h +f:net/sunrpc/xprtsock.c +f:net/switchdev/Kconfig +f:net/switchdev/Makefile +f:net/switchdev/switchdev.c +f:net/sysctl_net.c +f:net/tipc/Kconfig +f:net/tipc/Makefile +f:net/tipc/addr.c +f:net/tipc/addr.h +f:net/tipc/bcast.c +f:net/tipc/bcast.h +f:net/tipc/bearer.c +f:net/tipc/bearer.h +f:net/tipc/core.c +f:net/tipc/core.h +f:net/tipc/crypto.c +f:net/tipc/crypto.h +f:net/tipc/diag.c +f:net/tipc/discover.c +f:net/tipc/discover.h +f:net/tipc/eth_media.c +f:net/tipc/group.c +f:net/tipc/group.h +f:net/tipc/ib_media.c +f:net/tipc/link.c +f:net/tipc/link.h +f:net/tipc/monitor.c +f:net/tipc/monitor.h +f:net/tipc/msg.c +f:net/tipc/msg.h +f:net/tipc/name_distr.c +f:net/tipc/name_distr.h +f:net/tipc/name_table.c +f:net/tipc/name_table.h +f:net/tipc/net.c +f:net/tipc/net.h +f:net/tipc/netlink.c +f:net/tipc/netlink.h +f:net/tipc/netlink_compat.c +f:net/tipc/node.c +f:net/tipc/node.h +f:net/tipc/socket.c +f:net/tipc/socket.h +f:net/tipc/subscr.c +f:net/tipc/subscr.h +f:net/tipc/sysctl.c +f:net/tipc/topsrv.c +f:net/tipc/topsrv.h +f:net/tipc/trace.c +f:net/tipc/trace.h +f:net/tipc/udp_media.c +f:net/tipc/udp_media.h +f:net/tls/Kconfig +f:net/tls/Makefile +f:net/tls/tls.h +f:net/tls/tls_device.c +f:net/tls/tls_device_fallback.c +f:net/tls/tls_main.c +f:net/tls/tls_proc.c +f:net/tls/tls_strp.c +f:net/tls/tls_sw.c +f:net/tls/tls_toe.c +f:net/tls/trace.c +f:net/tls/trace.h +f:net/unix/Kconfig +f:net/unix/Makefile +f:net/unix/af_unix.c +f:net/unix/af_unix.h +f:net/unix/diag.c +f:net/unix/garbage.c +f:net/unix/sysctl_net_unix.c +f:net/unix/unix_bpf.c +f:net/vmw_vsock/Kconfig +f:net/vmw_vsock/Makefile +f:net/vmw_vsock/af_vsock.c +f:net/vmw_vsock/af_vsock_tap.c +f:net/vmw_vsock/diag.c +f:net/vmw_vsock/hyperv_transport.c +f:net/vmw_vsock/virtio_transport.c +f:net/vmw_vsock/virtio_transport_common.c +f:net/vmw_vsock/vmci_transport.c +f:net/vmw_vsock/vmci_transport.h +f:net/vmw_vsock/vmci_transport_notify.c +f:net/vmw_vsock/vmci_transport_notify.h +f:net/vmw_vsock/vmci_transport_notify_qstate.c +f:net/vmw_vsock/vsock_addr.c +f:net/vmw_vsock/vsock_bpf.c +f:net/vmw_vsock/vsock_loopback.c +f:net/wireless/.gitignore +f:net/wireless/Kconfig +f:net/wireless/Makefile +f:net/wireless/ap.c +f:net/wireless/certs/sforshee.hex +f:net/wireless/certs/wens.hex +f:net/wireless/chan.c +f:net/wireless/core.c +f:net/wireless/core.h +f:net/wireless/debugfs.c +f:net/wireless/debugfs.h +f:net/wireless/ethtool.c +f:net/wireless/ibss.c +f:net/wireless/mesh.c +f:net/wireless/mlme.c +f:net/wireless/nl80211.c +f:net/wireless/nl80211.h +f:net/wireless/ocb.c +f:net/wireless/of.c +f:net/wireless/pmsr.c +f:net/wireless/radiotap.c +f:net/wireless/rdev-ops.h +f:net/wireless/reg.c +f:net/wireless/reg.h +f:net/wireless/scan.c +f:net/wireless/sme.c +f:net/wireless/sysfs.c +f:net/wireless/sysfs.h +f:net/wireless/tests/Makefile +f:net/wireless/tests/chan.c +f:net/wireless/tests/fragmentation.c +f:net/wireless/tests/module.c +f:net/wireless/tests/scan.c +f:net/wireless/tests/util.c +f:net/wireless/tests/util.h +f:net/wireless/trace.c +f:net/wireless/trace.h +f:net/wireless/util.c +f:net/wireless/wext-compat.c +f:net/wireless/wext-compat.h +f:net/wireless/wext-core.c +f:net/wireless/wext-priv.c +f:net/wireless/wext-proc.c +f:net/wireless/wext-sme.c +f:net/x25/Kconfig +f:net/x25/Makefile +f:net/x25/af_x25.c +f:net/x25/sysctl_net_x25.c +f:net/x25/x25_dev.c +f:net/x25/x25_facilities.c +f:net/x25/x25_forward.c +f:net/x25/x25_in.c +f:net/x25/x25_link.c +f:net/x25/x25_out.c +f:net/x25/x25_proc.c +f:net/x25/x25_route.c +f:net/x25/x25_subr.c +f:net/x25/x25_timer.c +f:net/xdp/Kconfig +f:net/xdp/Makefile +f:net/xdp/xdp_umem.c +f:net/xdp/xdp_umem.h +f:net/xdp/xsk.c +f:net/xdp/xsk.h +f:net/xdp/xsk_buff_pool.c +f:net/xdp/xsk_diag.c +f:net/xdp/xsk_queue.c +f:net/xdp/xsk_queue.h +f:net/xdp/xskmap.c +f:net/xfrm/Kconfig +f:net/xfrm/Makefile +f:net/xfrm/espintcp.c +f:net/xfrm/trace_iptfs.h +f:net/xfrm/xfrm_algo.c +f:net/xfrm/xfrm_compat.c +f:net/xfrm/xfrm_device.c +f:net/xfrm/xfrm_hash.c +f:net/xfrm/xfrm_hash.h +f:net/xfrm/xfrm_inout.h +f:net/xfrm/xfrm_input.c +f:net/xfrm/xfrm_interface_bpf.c +f:net/xfrm/xfrm_interface_core.c +f:net/xfrm/xfrm_ipcomp.c +f:net/xfrm/xfrm_iptfs.c +f:net/xfrm/xfrm_nat_keepalive.c +f:net/xfrm/xfrm_output.c +f:net/xfrm/xfrm_policy.c +f:net/xfrm/xfrm_proc.c +f:net/xfrm/xfrm_replay.c +f:net/xfrm/xfrm_state.c +f:net/xfrm/xfrm_state_bpf.c +f:net/xfrm/xfrm_sysctl.c +f:net/xfrm/xfrm_user.c +f:rust/.gitignore +f:rust/.kunitconfig +f:rust/Makefile +f:rust/bindgen_parameters +f:rust/bindings/bindings_helper.h +f:rust/bindings/lib.rs +f:rust/build_error.rs +f:rust/compiler_builtins.rs +f:rust/exports.c +f:rust/ffi.rs +f:rust/helpers/auxiliary.c +f:rust/helpers/blk.c +f:rust/helpers/bug.c +f:rust/helpers/build_assert.c +f:rust/helpers/build_bug.c +f:rust/helpers/clk.c +f:rust/helpers/completion.c +f:rust/helpers/cpu.c +f:rust/helpers/cpufreq.c +f:rust/helpers/cpumask.c +f:rust/helpers/cred.c +f:rust/helpers/device.c +f:rust/helpers/dma.c +f:rust/helpers/drm.c +f:rust/helpers/err.c +f:rust/helpers/fs.c +f:rust/helpers/helpers.c +f:rust/helpers/io.c +f:rust/helpers/jump_label.c +f:rust/helpers/kunit.c +f:rust/helpers/mm.c +f:rust/helpers/mutex.c +f:rust/helpers/of.c +f:rust/helpers/page.c +f:rust/helpers/pci.c +f:rust/helpers/pid_namespace.c +f:rust/helpers/platform.c +f:rust/helpers/poll.c +f:rust/helpers/property.c +f:rust/helpers/rbtree.c +f:rust/helpers/rcu.c +f:rust/helpers/refcount.c +f:rust/helpers/regulator.c +f:rust/helpers/security.c +f:rust/helpers/signal.c +f:rust/helpers/slab.c +f:rust/helpers/spinlock.c +f:rust/helpers/sync.c +f:rust/helpers/task.c +f:rust/helpers/uaccess.c +f:rust/helpers/vmalloc.c +f:rust/helpers/wait.c +f:rust/helpers/workqueue.c +f:rust/helpers/xarray.c +f:rust/kernel/.gitignore +f:rust/kernel/acpi.rs +f:rust/kernel/alloc.rs +f:rust/kernel/alloc/allocator.rs +f:rust/kernel/alloc/allocator_test.rs +f:rust/kernel/alloc/kbox.rs +f:rust/kernel/alloc/kvec.rs +f:rust/kernel/alloc/kvec/errors.rs +f:rust/kernel/alloc/layout.rs +f:rust/kernel/auxiliary.rs +f:rust/kernel/block.rs +f:rust/kernel/block/mq.rs +f:rust/kernel/block/mq/gen_disk.rs +f:rust/kernel/block/mq/operations.rs +f:rust/kernel/block/mq/raw_writer.rs +f:rust/kernel/block/mq/request.rs +f:rust/kernel/block/mq/tag_set.rs +f:rust/kernel/build_assert.rs +f:rust/kernel/clk.rs +f:rust/kernel/configfs.rs +f:rust/kernel/cpu.rs +f:rust/kernel/cpufreq.rs +f:rust/kernel/cpumask.rs +f:rust/kernel/cred.rs +f:rust/kernel/device.rs +f:rust/kernel/device/property.rs +f:rust/kernel/device_id.rs +f:rust/kernel/devres.rs +f:rust/kernel/dma.rs +f:rust/kernel/driver.rs +f:rust/kernel/drm/device.rs +f:rust/kernel/drm/driver.rs +f:rust/kernel/drm/file.rs +f:rust/kernel/drm/gem/mod.rs +f:rust/kernel/drm/ioctl.rs +f:rust/kernel/drm/mod.rs +f:rust/kernel/error.rs +f:rust/kernel/faux.rs +f:rust/kernel/firmware.rs +f:rust/kernel/fs.rs +f:rust/kernel/fs/file.rs +f:rust/kernel/generated_arch_static_branch_asm.rs.S +f:rust/kernel/init.rs +f:rust/kernel/io.rs +f:rust/kernel/io/mem.rs +f:rust/kernel/io/resource.rs +f:rust/kernel/ioctl.rs +f:rust/kernel/jump_label.rs +f:rust/kernel/kunit.rs +f:rust/kernel/lib.rs +f:rust/kernel/list.rs +f:rust/kernel/list/arc.rs +f:rust/kernel/list/arc_field.rs +f:rust/kernel/list/impl_list_item_mod.rs +f:rust/kernel/miscdevice.rs +f:rust/kernel/mm.rs +f:rust/kernel/mm/mmput_async.rs +f:rust/kernel/mm/virt.rs +f:rust/kernel/net.rs +f:rust/kernel/net/phy.rs +f:rust/kernel/net/phy/reg.rs +f:rust/kernel/of.rs +f:rust/kernel/opp.rs +f:rust/kernel/page.rs +f:rust/kernel/pci.rs +f:rust/kernel/pid_namespace.rs +f:rust/kernel/platform.rs +f:rust/kernel/prelude.rs +f:rust/kernel/print.rs +f:rust/kernel/rbtree.rs +f:rust/kernel/regulator.rs +f:rust/kernel/revocable.rs +f:rust/kernel/security.rs +f:rust/kernel/seq_file.rs +f:rust/kernel/sizes.rs +f:rust/kernel/static_assert.rs +f:rust/kernel/std_vendor.rs +f:rust/kernel/str.rs +f:rust/kernel/sync.rs +f:rust/kernel/sync/arc.rs +f:rust/kernel/sync/arc/std_vendor.rs +f:rust/kernel/sync/completion.rs +f:rust/kernel/sync/condvar.rs +f:rust/kernel/sync/lock.rs +f:rust/kernel/sync/lock/global.rs +f:rust/kernel/sync/lock/mutex.rs +f:rust/kernel/sync/lock/spinlock.rs +f:rust/kernel/sync/locked_by.rs +f:rust/kernel/sync/poll.rs +f:rust/kernel/sync/rcu.rs +f:rust/kernel/task.rs +f:rust/kernel/time.rs +f:rust/kernel/time/hrtimer.rs +f:rust/kernel/time/hrtimer/arc.rs +f:rust/kernel/time/hrtimer/pin.rs +f:rust/kernel/time/hrtimer/pin_mut.rs +f:rust/kernel/time/hrtimer/tbox.rs +f:rust/kernel/tracepoint.rs +f:rust/kernel/transmute.rs +f:rust/kernel/types.rs +f:rust/kernel/uaccess.rs +f:rust/kernel/workqueue.rs +f:rust/kernel/xarray.rs +f:rust/macros/concat_idents.rs +f:rust/macros/export.rs +f:rust/macros/helpers.rs +f:rust/macros/kunit.rs +f:rust/macros/lib.rs +f:rust/macros/module.rs +f:rust/macros/paste.rs +f:rust/macros/quote.rs +f:rust/macros/vtable.rs +f:rust/pin-init/CONTRIBUTING.md +f:rust/pin-init/README.md +f:rust/pin-init/examples/big_struct_in_place.rs +f:rust/pin-init/examples/error.rs +f:rust/pin-init/examples/linked_list.rs +f:rust/pin-init/examples/mutex.rs +f:rust/pin-init/examples/pthread_mutex.rs +f:rust/pin-init/examples/static_init.rs +f:rust/pin-init/internal/src/helpers.rs +f:rust/pin-init/internal/src/lib.rs +f:rust/pin-init/internal/src/pin_data.rs +f:rust/pin-init/internal/src/pinned_drop.rs +f:rust/pin-init/internal/src/zeroable.rs +f:rust/pin-init/src/__internal.rs +f:rust/pin-init/src/alloc.rs +f:rust/pin-init/src/lib.rs +f:rust/pin-init/src/macros.rs +f:rust/uapi/lib.rs +f:rust/uapi/uapi_helper.h +f:samples/Kconfig +f:samples/Makefile +f:samples/acrn/Makefile +f:samples/acrn/guest.ld +f:samples/acrn/payload.ld +f:samples/acrn/vm-sample.c +f:samples/auxdisplay/.gitignore +f:samples/auxdisplay/Makefile +f:samples/auxdisplay/cfag12864b-example.c +f:samples/binderfs/.gitignore +f:samples/binderfs/Makefile +f:samples/binderfs/binderfs_example.c +f:samples/bpf/.gitignore +f:samples/bpf/Makefile +f:samples/bpf/Makefile.target +f:samples/bpf/README.rst +f:samples/bpf/asm_goto_workaround.h +f:samples/bpf/bpf_insn.h +f:samples/bpf/cookie_uid_helper_example.c +f:samples/bpf/cpustat_kern.c +f:samples/bpf/cpustat_user.c +f:samples/bpf/do_hbm_test.sh +f:samples/bpf/fds_example.c +f:samples/bpf/gnu/stubs.h +f:samples/bpf/hash_func01.h +f:samples/bpf/hbm.c +f:samples/bpf/hbm.h +f:samples/bpf/hbm_edt_kern.c +f:samples/bpf/hbm_kern.h +f:samples/bpf/hbm_out_kern.c +f:samples/bpf/ibumad_kern.c +f:samples/bpf/ibumad_user.c +f:samples/bpf/lathist_kern.c +f:samples/bpf/lathist_user.c +f:samples/bpf/lwt_len_hist.bpf.c +f:samples/bpf/lwt_len_hist.sh +f:samples/bpf/lwt_len_hist_user.c +f:samples/bpf/map_perf_test.bpf.c +f:samples/bpf/map_perf_test_user.c +f:samples/bpf/net_shared.h +f:samples/bpf/offwaketime.bpf.c +f:samples/bpf/offwaketime_user.c +f:samples/bpf/parse_ldabs.c +f:samples/bpf/parse_simple.c +f:samples/bpf/parse_varlen.c +f:samples/bpf/run_cookie_uid_helper_example.sh +f:samples/bpf/sampleip_kern.c +f:samples/bpf/sampleip_user.c +f:samples/bpf/sock_example.c +f:samples/bpf/sock_example.h +f:samples/bpf/sockex1_kern.c +f:samples/bpf/sockex1_user.c +f:samples/bpf/sockex2_kern.c +f:samples/bpf/sockex2_user.c +f:samples/bpf/sockex3_kern.c +f:samples/bpf/sockex3_user.c +f:samples/bpf/spintest.bpf.c +f:samples/bpf/spintest_user.c +f:samples/bpf/syscall_nrs.c +f:samples/bpf/syscall_tp_kern.c +f:samples/bpf/syscall_tp_user.c +f:samples/bpf/task_fd_query_kern.c +f:samples/bpf/task_fd_query_user.c +f:samples/bpf/tc_l2_redirect.sh +f:samples/bpf/tc_l2_redirect_kern.c +f:samples/bpf/tc_l2_redirect_user.c +f:samples/bpf/tcbpf1_kern.c +f:samples/bpf/tcp_basertt_kern.c +f:samples/bpf/tcp_bpf.readme +f:samples/bpf/tcp_bufs_kern.c +f:samples/bpf/tcp_clamp_kern.c +f:samples/bpf/tcp_cong_kern.c +f:samples/bpf/tcp_dumpstats_kern.c +f:samples/bpf/tcp_iw_kern.c +f:samples/bpf/tcp_rwnd_kern.c +f:samples/bpf/tcp_synrto_kern.c +f:samples/bpf/tcp_tos_reflect_kern.c +f:samples/bpf/test_cls_bpf.sh +f:samples/bpf/test_lru_dist.c +f:samples/bpf/test_lwt_bpf.c +f:samples/bpf/test_lwt_bpf.sh +f:samples/bpf/test_map_in_map.bpf.c +f:samples/bpf/test_map_in_map_user.c +f:samples/bpf/trace_event_kern.c +f:samples/bpf/trace_event_user.c +f:samples/bpf/trace_output.bpf.c +f:samples/bpf/trace_output_user.c +f:samples/bpf/tracex1.bpf.c +f:samples/bpf/tracex1_user.c +f:samples/bpf/tracex3.bpf.c +f:samples/bpf/tracex3_user.c +f:samples/bpf/tracex4.bpf.c +f:samples/bpf/tracex4_user.c +f:samples/bpf/tracex5.bpf.c +f:samples/bpf/tracex5_user.c +f:samples/bpf/tracex6.bpf.c +f:samples/bpf/tracex6_user.c +f:samples/bpf/xdp2skb_meta.sh +f:samples/bpf/xdp2skb_meta_kern.c +f:samples/bpf/xdp_adjust_tail_kern.c +f:samples/bpf/xdp_adjust_tail_user.c +f:samples/bpf/xdp_fwd_kern.c +f:samples/bpf/xdp_fwd_user.c +f:samples/bpf/xdp_router_ipv4.bpf.c +f:samples/bpf/xdp_router_ipv4_user.c +f:samples/bpf/xdp_sample.bpf.c +f:samples/bpf/xdp_sample.bpf.h +f:samples/bpf/xdp_sample_shared.h +f:samples/bpf/xdp_sample_user.c +f:samples/bpf/xdp_sample_user.h +f:samples/bpf/xdp_tx_iptunnel_common.h +f:samples/bpf/xdp_tx_iptunnel_kern.c +f:samples/bpf/xdp_tx_iptunnel_user.c +f:samples/cgroup/.gitignore +f:samples/cgroup/Makefile +f:samples/cgroup/cgroup_event_listener.c +f:samples/cgroup/memcg_event_listener.c +f:samples/check-exec/.gitignore +f:samples/check-exec/Makefile +f:samples/check-exec/inc.c +f:samples/check-exec/run-script-ask.sh +f:samples/check-exec/script-ask.inc +f:samples/check-exec/script-exec.inc +f:samples/check-exec/script-noexec.inc +f:samples/check-exec/set-exec.c +f:samples/configfs/Makefile +f:samples/configfs/configfs_sample.c +f:samples/connector/.gitignore +f:samples/connector/Makefile +f:samples/connector/cn_test.c +f:samples/connector/ucon.c +f:samples/coresight/Makefile +f:samples/coresight/coresight-cfg-sample.c +f:samples/damon/Kconfig +f:samples/damon/Makefile +f:samples/damon/mtier.c +f:samples/damon/prcl.c +f:samples/damon/wsse.c +f:samples/fanotify/.gitignore +f:samples/fanotify/Makefile +f:samples/fanotify/fs-monitor.c +f:samples/fprobe/Makefile +f:samples/fprobe/fprobe_example.c +f:samples/ftrace/Makefile +f:samples/ftrace/ftrace-direct-modify.c +f:samples/ftrace/ftrace-direct-multi-modify.c +f:samples/ftrace/ftrace-direct-multi.c +f:samples/ftrace/ftrace-direct-too.c +f:samples/ftrace/ftrace-direct.c +f:samples/ftrace/ftrace-ops.c +f:samples/ftrace/sample-trace-array.c +f:samples/ftrace/sample-trace-array.h +f:samples/hid/.gitignore +f:samples/hid/Makefile +f:samples/hid/Makefile.target +f:samples/hid/hid_bpf_helpers.h +f:samples/hid/hid_mouse.bpf.c +f:samples/hid/hid_mouse.c +f:samples/hid/hid_surface_dial.bpf.c +f:samples/hid/hid_surface_dial.c +f:samples/hidraw/.gitignore +f:samples/hidraw/Makefile +f:samples/hidraw/hid-example.c +f:samples/hung_task/Makefile +f:samples/hung_task/hung_task_tests.c +f:samples/hw_breakpoint/Makefile +f:samples/hw_breakpoint/data_breakpoint.c +f:samples/kdb/Makefile +f:samples/kdb/kdb_hello.c +f:samples/kfifo/Makefile +f:samples/kfifo/bytestream-example.c +f:samples/kfifo/dma-example.c +f:samples/kfifo/inttype-example.c +f:samples/kfifo/record-example.c +f:samples/kmemleak/Makefile +f:samples/kmemleak/kmemleak-test.c +f:samples/kobject/Makefile +f:samples/kobject/kobject-example.c +f:samples/kobject/kset-example.c +f:samples/kprobes/Makefile +f:samples/kprobes/kprobe_example.c +f:samples/kprobes/kretprobe_example.c +f:samples/landlock/.gitignore +f:samples/landlock/Makefile +f:samples/landlock/sandboxer.c +f:samples/livepatch/Makefile +f:samples/livepatch/livepatch-callbacks-busymod.c +f:samples/livepatch/livepatch-callbacks-demo.c +f:samples/livepatch/livepatch-callbacks-mod.c +f:samples/livepatch/livepatch-sample.c +f:samples/livepatch/livepatch-shadow-fix1.c +f:samples/livepatch/livepatch-shadow-fix2.c +f:samples/livepatch/livepatch-shadow-mod.c +f:samples/mei/.gitignore +f:samples/mei/Makefile +f:samples/mei/mei-amt-version.c +f:samples/nitro_enclaves/.gitignore +f:samples/nitro_enclaves/Makefile +f:samples/nitro_enclaves/ne_ioctl_sample.c +f:samples/pfsm/.gitignore +f:samples/pfsm/Makefile +f:samples/pfsm/pfsm-wakeup.c +f:samples/pidfd/.gitignore +f:samples/pidfd/Makefile +f:samples/pidfd/pidfd-metadata.c +f:samples/pktgen/README.rst +f:samples/pktgen/functions.sh +f:samples/pktgen/parameters.sh +f:samples/pktgen/pktgen_bench_xmit_mode_netif_receive.sh +f:samples/pktgen/pktgen_bench_xmit_mode_queue_xmit.sh +f:samples/pktgen/pktgen_sample01_simple.sh +f:samples/pktgen/pktgen_sample02_multiqueue.sh +f:samples/pktgen/pktgen_sample03_burst_single_flow.sh +f:samples/pktgen/pktgen_sample04_many_flows.sh +f:samples/pktgen/pktgen_sample05_flow_per_thread.sh +f:samples/pktgen/pktgen_sample06_numa_awared_queue_irq_affinity.sh +f:samples/qmi/Makefile +f:samples/qmi/qmi_sample_client.c +f:samples/rpmsg/Makefile +f:samples/rpmsg/rpmsg_client_sample.c +f:samples/rust/Kconfig +f:samples/rust/Makefile +f:samples/rust/hostprogs/.gitignore +f:samples/rust/hostprogs/Makefile +f:samples/rust/hostprogs/a.rs +f:samples/rust/hostprogs/b.rs +f:samples/rust/hostprogs/single.rs +f:samples/rust/rust_configfs.rs +f:samples/rust/rust_dma.rs +f:samples/rust/rust_driver_auxiliary.rs +f:samples/rust/rust_driver_faux.rs +f:samples/rust/rust_driver_pci.rs +f:samples/rust/rust_driver_platform.rs +f:samples/rust/rust_minimal.rs +f:samples/rust/rust_misc_device.rs +f:samples/rust/rust_print_events.c +f:samples/rust/rust_print_main.rs +f:samples/seccomp/.gitignore +f:samples/seccomp/Makefile +f:samples/seccomp/bpf-direct.c +f:samples/seccomp/bpf-fancy.c +f:samples/seccomp/bpf-helper.c +f:samples/seccomp/bpf-helper.h +f:samples/seccomp/dropper.c +f:samples/seccomp/user-trap.c +f:samples/timers/.gitignore +f:samples/timers/Makefile +f:samples/timers/hpet_example.c +f:samples/trace_events/Makefile +f:samples/trace_events/trace-events-sample.c +f:samples/trace_events/trace-events-sample.h +f:samples/trace_events/trace_custom_sched.c +f:samples/trace_events/trace_custom_sched.h +f:samples/trace_printk/Makefile +f:samples/trace_printk/trace-printk.c +f:samples/tsm-mr/Makefile +f:samples/tsm-mr/tsm_mr_sample.c +f:samples/uhid/.gitignore +f:samples/uhid/Makefile +f:samples/uhid/uhid-example.c +f:samples/user_events/Makefile +f:samples/user_events/example.c +f:samples/v4l/Makefile +f:samples/v4l/v4l2-pci-skeleton.c +f:samples/vfio-mdev/Makefile +f:samples/vfio-mdev/README.rst +f:samples/vfio-mdev/mbochs.c +f:samples/vfio-mdev/mdpy-defs.h +f:samples/vfio-mdev/mdpy-fb.c +f:samples/vfio-mdev/mdpy.c +f:samples/vfio-mdev/mtty.c +f:samples/vfs/.gitignore +f:samples/vfs/Makefile +f:samples/vfs/mountinfo.c +f:samples/vfs/samples-vfs.h +f:samples/vfs/test-fsmount.c +f:samples/vfs/test-list-all-mounts.c +f:samples/vfs/test-statx.c +f:samples/watch_queue/.gitignore +f:samples/watch_queue/Makefile +f:samples/watch_queue/watch_test.c +f:samples/watchdog/.gitignore +f:samples/watchdog/Makefile +f:samples/watchdog/watchdog-simple.c +f:scripts/.gitignore +f:scripts/Kbuild.include +f:scripts/Kconfig.include +f:scripts/Lindent +f:scripts/Makefile +f:scripts/Makefile.asm-headers +f:scripts/Makefile.autofdo +f:scripts/Makefile.btf +f:scripts/Makefile.build +f:scripts/Makefile.clang +f:scripts/Makefile.clean +f:scripts/Makefile.compiler +f:scripts/Makefile.debug +f:scripts/Makefile.defconf +f:scripts/Makefile.dtbinst +f:scripts/Makefile.dtbs +f:scripts/Makefile.extrawarn +f:scripts/Makefile.gcc-plugins +f:scripts/Makefile.headersinst +f:scripts/Makefile.host +f:scripts/Makefile.kasan +f:scripts/Makefile.kcov +f:scripts/Makefile.kcsan +f:scripts/Makefile.kmsan +f:scripts/Makefile.kstack_erase +f:scripts/Makefile.lib +f:scripts/Makefile.modfinal +f:scripts/Makefile.modinst +f:scripts/Makefile.modpost +f:scripts/Makefile.package +f:scripts/Makefile.propeller +f:scripts/Makefile.randstruct +f:scripts/Makefile.ubsan +f:scripts/Makefile.userprogs +f:scripts/Makefile.vdsoinst +f:scripts/Makefile.vmlinux +f:scripts/Makefile.vmlinux_o +f:scripts/as-version.sh +f:scripts/asn1_compiler.c +f:scripts/atomic/atomic-tbl.sh +f:scripts/atomic/atomics.tbl +f:scripts/atomic/fallbacks/acquire +f:scripts/atomic/fallbacks/add_negative +f:scripts/atomic/fallbacks/add_unless +f:scripts/atomic/fallbacks/andnot +f:scripts/atomic/fallbacks/cmpxchg +f:scripts/atomic/fallbacks/dec +f:scripts/atomic/fallbacks/dec_and_test +f:scripts/atomic/fallbacks/dec_if_positive +f:scripts/atomic/fallbacks/dec_unless_positive +f:scripts/atomic/fallbacks/fence +f:scripts/atomic/fallbacks/fetch_add_unless +f:scripts/atomic/fallbacks/inc +f:scripts/atomic/fallbacks/inc_and_test +f:scripts/atomic/fallbacks/inc_not_zero +f:scripts/atomic/fallbacks/inc_unless_negative +f:scripts/atomic/fallbacks/read_acquire +f:scripts/atomic/fallbacks/release +f:scripts/atomic/fallbacks/set_release +f:scripts/atomic/fallbacks/sub_and_test +f:scripts/atomic/fallbacks/try_cmpxchg +f:scripts/atomic/fallbacks/xchg +f:scripts/atomic/gen-atomic-fallback.sh +f:scripts/atomic/gen-atomic-instrumented.sh +f:scripts/atomic/gen-atomic-long.sh +f:scripts/atomic/gen-atomics.sh +f:scripts/atomic/kerneldoc/add +f:scripts/atomic/kerneldoc/add_negative +f:scripts/atomic/kerneldoc/add_unless +f:scripts/atomic/kerneldoc/and +f:scripts/atomic/kerneldoc/andnot +f:scripts/atomic/kerneldoc/cmpxchg +f:scripts/atomic/kerneldoc/dec +f:scripts/atomic/kerneldoc/dec_and_test +f:scripts/atomic/kerneldoc/dec_if_positive +f:scripts/atomic/kerneldoc/dec_unless_positive +f:scripts/atomic/kerneldoc/inc +f:scripts/atomic/kerneldoc/inc_and_test +f:scripts/atomic/kerneldoc/inc_not_zero +f:scripts/atomic/kerneldoc/inc_unless_negative +f:scripts/atomic/kerneldoc/or +f:scripts/atomic/kerneldoc/read +f:scripts/atomic/kerneldoc/set +f:scripts/atomic/kerneldoc/sub +f:scripts/atomic/kerneldoc/sub_and_test +f:scripts/atomic/kerneldoc/try_cmpxchg +f:scripts/atomic/kerneldoc/xchg +f:scripts/atomic/kerneldoc/xor +f:scripts/bash-completion/make +f:scripts/basic/.gitignore +f:scripts/basic/Makefile +f:scripts/basic/fixdep.c +f:scripts/bloat-o-meter +f:scripts/bootgraph.pl +f:scripts/bpf_doc.py +f:scripts/build-version +f:scripts/cc-can-link.sh +f:scripts/cc-version.sh +f:scripts/check-git +f:scripts/check-sysctl-docs +f:scripts/check-uapi.sh +f:scripts/check-variable-fonts.sh +f:scripts/check_extable.sh +f:scripts/checkdeclares.pl +f:scripts/checkincludes.pl +f:scripts/checkkconfigsymbols.py +f:scripts/checkpatch.pl +f:scripts/checkstack.pl +f:scripts/checksyscalls.sh +f:scripts/checktransupdate.py +f:scripts/checkversion.pl +f:scripts/clang-tools/gen_compile_commands.py +f:scripts/clang-tools/run-clang-tools.py +f:scripts/cleanfile +f:scripts/cleanpatch +f:scripts/coccicheck +f:scripts/coccinelle/api/alloc/alloc_cast.cocci +f:scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci +f:scripts/coccinelle/api/alloc/zalloc-simple.cocci +f:scripts/coccinelle/api/atomic_as_refcounter.cocci +f:scripts/coccinelle/api/check_bq27xxx_data.cocci +f:scripts/coccinelle/api/d_find_alias.cocci +f:scripts/coccinelle/api/device_attr_show.cocci +f:scripts/coccinelle/api/err_cast.cocci +f:scripts/coccinelle/api/kfree_mismatch.cocci +f:scripts/coccinelle/api/kfree_sensitive.cocci +f:scripts/coccinelle/api/kstrdup.cocci +f:scripts/coccinelle/api/kvmalloc.cocci +f:scripts/coccinelle/api/memdup.cocci +f:scripts/coccinelle/api/memdup_user.cocci +f:scripts/coccinelle/api/platform_get_irq.cocci +f:scripts/coccinelle/api/platform_no_drv_owner.cocci +f:scripts/coccinelle/api/pm_runtime.cocci +f:scripts/coccinelle/api/resource_size.cocci +f:scripts/coccinelle/api/simple_open.cocci +f:scripts/coccinelle/api/stream_open.cocci +f:scripts/coccinelle/api/string_choices.cocci +f:scripts/coccinelle/api/vma_pages.cocci +f:scripts/coccinelle/free/clk_put.cocci +f:scripts/coccinelle/free/devm_free.cocci +f:scripts/coccinelle/free/ifnulldev_put.cocci +f:scripts/coccinelle/free/ifnullfree.cocci +f:scripts/coccinelle/free/iounmap.cocci +f:scripts/coccinelle/free/kfree.cocci +f:scripts/coccinelle/free/kfreeaddr.cocci +f:scripts/coccinelle/free/pci_free_consistent.cocci +f:scripts/coccinelle/free/put_device.cocci +f:scripts/coccinelle/iterators/device_node_continue.cocci +f:scripts/coccinelle/iterators/for_each_child.cocci +f:scripts/coccinelle/iterators/itnull.cocci +f:scripts/coccinelle/iterators/list_entry_update.cocci +f:scripts/coccinelle/iterators/use_after_iter.cocci +f:scripts/coccinelle/locks/call_kern.cocci +f:scripts/coccinelle/locks/double_lock.cocci +f:scripts/coccinelle/locks/flags.cocci +f:scripts/coccinelle/locks/mini_lock.cocci +f:scripts/coccinelle/misc/add_namespace.cocci +f:scripts/coccinelle/misc/array_size.cocci +f:scripts/coccinelle/misc/array_size_dup.cocci +f:scripts/coccinelle/misc/badty.cocci +f:scripts/coccinelle/misc/boolconv.cocci +f:scripts/coccinelle/misc/cond_no_effect.cocci +f:scripts/coccinelle/misc/cstptr.cocci +f:scripts/coccinelle/misc/do_div.cocci +f:scripts/coccinelle/misc/doubleinit.cocci +f:scripts/coccinelle/misc/excluded_middle.cocci +f:scripts/coccinelle/misc/flexible_array.cocci +f:scripts/coccinelle/misc/ifcol.cocci +f:scripts/coccinelle/misc/irqf_oneshot.cocci +f:scripts/coccinelle/misc/minmax.cocci +f:scripts/coccinelle/misc/newline_in_nl_msg.cocci +f:scripts/coccinelle/misc/noderef.cocci +f:scripts/coccinelle/misc/of_table.cocci +f:scripts/coccinelle/misc/orplus.cocci +f:scripts/coccinelle/misc/returnvar.cocci +f:scripts/coccinelle/misc/secs_to_jiffies.cocci +f:scripts/coccinelle/misc/semicolon.cocci +f:scripts/coccinelle/misc/struct_size.cocci +f:scripts/coccinelle/misc/swap.cocci +f:scripts/coccinelle/misc/test_addr.cocci +f:scripts/coccinelle/misc/uninitialized_var.cocci +f:scripts/coccinelle/misc/warn.cocci +f:scripts/coccinelle/null/badzero.cocci +f:scripts/coccinelle/null/deref_null.cocci +f:scripts/coccinelle/null/eno.cocci +f:scripts/coccinelle/null/kmerr.cocci +f:scripts/coccinelle/tests/doublebitand.cocci +f:scripts/coccinelle/tests/doubletest.cocci +f:scripts/coccinelle/tests/odd_ptr_err.cocci +f:scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci +f:scripts/config +f:scripts/const_structs.checkpatch +f:scripts/crypto/gen-hash-testvecs.py +f:scripts/decode_stacktrace.sh +f:scripts/decodecode +f:scripts/depmod.sh +f:scripts/dev-needs.sh +f:scripts/diffconfig +f:scripts/documentation-file-ref-check +f:scripts/dtc/.gitignore +f:scripts/dtc/Makefile +f:scripts/dtc/checks.c +f:scripts/dtc/data.c +f:scripts/dtc/dt-extract-compatibles +f:scripts/dtc/dt_to_config +f:scripts/dtc/dtc-lexer.l +f:scripts/dtc/dtc-parser.y +f:scripts/dtc/dtc.c +f:scripts/dtc/dtc.h +f:scripts/dtc/dtx_diff +f:scripts/dtc/fdtget.c +f:scripts/dtc/fdtoverlay.c +f:scripts/dtc/fdtput.c +f:scripts/dtc/flattree.c +f:scripts/dtc/fstree.c +f:scripts/dtc/libfdt/fdt.c +f:scripts/dtc/libfdt/fdt.h +f:scripts/dtc/libfdt/fdt_addresses.c +f:scripts/dtc/libfdt/fdt_empty_tree.c +f:scripts/dtc/libfdt/fdt_overlay.c +f:scripts/dtc/libfdt/fdt_ro.c +f:scripts/dtc/libfdt/fdt_rw.c +f:scripts/dtc/libfdt/fdt_strerror.c +f:scripts/dtc/libfdt/fdt_sw.c +f:scripts/dtc/libfdt/fdt_wip.c +f:scripts/dtc/libfdt/libfdt.h +f:scripts/dtc/libfdt/libfdt_env.h +f:scripts/dtc/libfdt/libfdt_internal.h +f:scripts/dtc/livetree.c +f:scripts/dtc/of_unittest_expect +f:scripts/dtc/srcpos.c +f:scripts/dtc/srcpos.h +f:scripts/dtc/treesource.c +f:scripts/dtc/update-dtc-source.sh +f:scripts/dtc/util.c +f:scripts/dtc/util.h +f:scripts/dtc/version_gen.h +f:scripts/dtc/yamltree.c +f:scripts/dummy-tools/dummy-plugin-dir/include/plugin-version.h +f:scripts/dummy-tools/gcc +f:scripts/dummy-tools/ld +f:scripts/dummy-tools/pahole +f:scripts/extract-fwblobs +f:scripts/extract-ikconfig +f:scripts/extract-module-sig.pl +f:scripts/extract-sys-certs.pl +f:scripts/extract-vmlinux +f:scripts/extract_xc3028.pl +f:scripts/faddr2line +f:scripts/file-size.sh +f:scripts/find-unused-docs.sh +f:scripts/gcc-plugins/.gitignore +f:scripts/gcc-plugins/Kconfig +f:scripts/gcc-plugins/Makefile +f:scripts/gcc-plugins/gcc-common.h +f:scripts/gcc-plugins/gcc-generate-gimple-pass.h +f:scripts/gcc-plugins/gcc-generate-ipa-pass.h +f:scripts/gcc-plugins/gcc-generate-rtl-pass.h +f:scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h +f:scripts/gcc-plugins/latent_entropy_plugin.c +f:scripts/gcc-plugins/randomize_layout_plugin.c +f:scripts/gcc-plugins/stackleak_plugin.c +f:scripts/gdb/Makefile +f:scripts/gdb/linux/.gitignore +f:scripts/gdb/linux/Makefile +f:scripts/gdb/linux/__init__.py +f:scripts/gdb/linux/clk.py +f:scripts/gdb/linux/config.py +f:scripts/gdb/linux/constants.py.in +f:scripts/gdb/linux/cpus.py +f:scripts/gdb/linux/device.py +f:scripts/gdb/linux/dmesg.py +f:scripts/gdb/linux/genpd.py +f:scripts/gdb/linux/interrupts.py +f:scripts/gdb/linux/kasan.py +f:scripts/gdb/linux/lists.py +f:scripts/gdb/linux/mapletree.py +f:scripts/gdb/linux/mm.py +f:scripts/gdb/linux/modules.py +f:scripts/gdb/linux/page_owner.py +f:scripts/gdb/linux/pgtable.py +f:scripts/gdb/linux/proc.py +f:scripts/gdb/linux/radixtree.py +f:scripts/gdb/linux/rbtree.py +f:scripts/gdb/linux/slab.py +f:scripts/gdb/linux/stackdepot.py +f:scripts/gdb/linux/symbols.py +f:scripts/gdb/linux/tasks.py +f:scripts/gdb/linux/timerlist.py +f:scripts/gdb/linux/utils.py +f:scripts/gdb/linux/vfs.py +f:scripts/gdb/linux/vmalloc.py +f:scripts/gdb/linux/xarray.py +f:scripts/gdb/vmlinux-gdb.py +f:scripts/gen-crc-consts.py +f:scripts/gen-randstruct-seed.sh +f:scripts/gen_packed_field_checks.c +f:scripts/gendwarfksyms/.gitignore +f:scripts/gendwarfksyms/Makefile +f:scripts/gendwarfksyms/cache.c +f:scripts/gendwarfksyms/die.c +f:scripts/gendwarfksyms/dwarf.c +f:scripts/gendwarfksyms/examples/kabi.h +f:scripts/gendwarfksyms/examples/kabi_ex.c +f:scripts/gendwarfksyms/examples/kabi_ex.h +f:scripts/gendwarfksyms/examples/symbolptr.c +f:scripts/gendwarfksyms/gendwarfksyms.c +f:scripts/gendwarfksyms/gendwarfksyms.h +f:scripts/gendwarfksyms/kabi.c +f:scripts/gendwarfksyms/symbols.c +f:scripts/gendwarfksyms/types.c +f:scripts/generate_builtin_ranges.awk +f:scripts/generate_initcall_order.pl +f:scripts/generate_rust_analyzer.py +f:scripts/generate_rust_target.rs +f:scripts/genksyms/.gitignore +f:scripts/genksyms/Makefile +f:scripts/genksyms/genksyms.c +f:scripts/genksyms/genksyms.h +f:scripts/genksyms/keywords.c +f:scripts/genksyms/lex.l +f:scripts/genksyms/parse.y +f:scripts/get_abi.py +f:scripts/get_dvb_firmware +f:scripts/get_feat.pl +f:scripts/get_maintainer.pl +f:scripts/gfp-translate +f:scripts/git-resolve.sh +f:scripts/git.orderFile +f:scripts/head-object-list.txt +f:scripts/headerdep.pl +f:scripts/headers_install.sh +f:scripts/include/array_size.h +f:scripts/include/hash.h +f:scripts/include/hashtable.h +f:scripts/include/list.h +f:scripts/include/list_types.h +f:scripts/include/xalloc.h +f:scripts/insert-sys-cert.c +f:scripts/install.sh +f:scripts/integer-wrap-ignore.scl +f:scripts/ipe/Makefile +f:scripts/ipe/polgen/.gitignore +f:scripts/ipe/polgen/Makefile +f:scripts/ipe/polgen/polgen.c +f:scripts/jobserver-exec +f:scripts/kallsyms.c +f:scripts/kconfig/.gitignore +f:scripts/kconfig/Makefile +f:scripts/kconfig/conf.c +f:scripts/kconfig/confdata.c +f:scripts/kconfig/expr.c +f:scripts/kconfig/expr.h +f:scripts/kconfig/gconf-cfg.sh +f:scripts/kconfig/gconf.c +f:scripts/kconfig/gconf.glade +f:scripts/kconfig/images.c +f:scripts/kconfig/images.h +f:scripts/kconfig/internal.h +f:scripts/kconfig/lexer.l +f:scripts/kconfig/lkc.h +f:scripts/kconfig/lkc_proto.h +f:scripts/kconfig/lxdialog/BIG.FAT.WARNING +f:scripts/kconfig/lxdialog/checklist.c +f:scripts/kconfig/lxdialog/dialog.h +f:scripts/kconfig/lxdialog/inputbox.c +f:scripts/kconfig/lxdialog/menubox.c +f:scripts/kconfig/lxdialog/textbox.c +f:scripts/kconfig/lxdialog/util.c +f:scripts/kconfig/lxdialog/yesno.c +f:scripts/kconfig/mconf-cfg.sh +f:scripts/kconfig/mconf.c +f:scripts/kconfig/menu.c +f:scripts/kconfig/merge_config.sh +f:scripts/kconfig/mnconf-common.c +f:scripts/kconfig/mnconf-common.h +f:scripts/kconfig/nconf-cfg.sh +f:scripts/kconfig/nconf.c +f:scripts/kconfig/nconf.gui.c +f:scripts/kconfig/nconf.h +f:scripts/kconfig/parser.y +f:scripts/kconfig/preprocess.c +f:scripts/kconfig/preprocess.h +f:scripts/kconfig/qconf-cfg.sh +f:scripts/kconfig/qconf.cc +f:scripts/kconfig/qconf.h +f:scripts/kconfig/streamline_config.pl +f:scripts/kconfig/symbol.c +f:scripts/kconfig/tests/auto_submenu/Kconfig +f:scripts/kconfig/tests/auto_submenu/__init__.py +f:scripts/kconfig/tests/auto_submenu/expected_stdout +f:scripts/kconfig/tests/choice/Kconfig +f:scripts/kconfig/tests/choice/__init__.py +f:scripts/kconfig/tests/choice/alldef_expected_config +f:scripts/kconfig/tests/choice/allmod_expected_config +f:scripts/kconfig/tests/choice/allno_expected_config +f:scripts/kconfig/tests/choice/allyes_expected_config +f:scripts/kconfig/tests/choice/oldask0_expected_stdout +f:scripts/kconfig/tests/choice_randomize/Kconfig +f:scripts/kconfig/tests/choice_randomize/__init__.py +f:scripts/kconfig/tests/choice_randomize/expected_config0 +f:scripts/kconfig/tests/choice_randomize/expected_config1 +f:scripts/kconfig/tests/choice_randomize/expected_config2 +f:scripts/kconfig/tests/choice_randomize2/Kconfig +f:scripts/kconfig/tests/choice_randomize2/__init__.py +f:scripts/kconfig/tests/choice_randomize2/expected_config0 +f:scripts/kconfig/tests/choice_randomize2/expected_config1 +f:scripts/kconfig/tests/choice_randomize2/expected_config2 +f:scripts/kconfig/tests/conftest.py +f:scripts/kconfig/tests/err_recursive_dep/Kconfig +f:scripts/kconfig/tests/err_recursive_dep/__init__.py +f:scripts/kconfig/tests/err_recursive_dep/expected_stderr +f:scripts/kconfig/tests/err_recursive_inc/Kconfig +f:scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1 +f:scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2 +f:scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3 +f:scripts/kconfig/tests/err_recursive_inc/__init__.py +f:scripts/kconfig/tests/err_recursive_inc/expected_stderr +f:scripts/kconfig/tests/new_choice_with_dep/Kconfig +f:scripts/kconfig/tests/new_choice_with_dep/__init__.py +f:scripts/kconfig/tests/new_choice_with_dep/config +f:scripts/kconfig/tests/new_choice_with_dep/expected_stdout +f:scripts/kconfig/tests/no_write_if_dep_unmet/Kconfig +f:scripts/kconfig/tests/no_write_if_dep_unmet/__init__.py +f:scripts/kconfig/tests/no_write_if_dep_unmet/config +f:scripts/kconfig/tests/no_write_if_dep_unmet/expected_config +f:scripts/kconfig/tests/preprocess/builtin_func/Kconfig +f:scripts/kconfig/tests/preprocess/builtin_func/__init__.py +f:scripts/kconfig/tests/preprocess/builtin_func/expected_stderr +f:scripts/kconfig/tests/preprocess/builtin_func/expected_stdout +f:scripts/kconfig/tests/preprocess/circular_expansion/Kconfig +f:scripts/kconfig/tests/preprocess/circular_expansion/__init__.py +f:scripts/kconfig/tests/preprocess/circular_expansion/expected_stderr +f:scripts/kconfig/tests/preprocess/escape/Kconfig +f:scripts/kconfig/tests/preprocess/escape/__init__.py +f:scripts/kconfig/tests/preprocess/escape/expected_stderr +f:scripts/kconfig/tests/preprocess/variable/Kconfig +f:scripts/kconfig/tests/preprocess/variable/__init__.py +f:scripts/kconfig/tests/preprocess/variable/expected_stderr +f:scripts/kconfig/tests/pytest.ini +f:scripts/kconfig/util.c +f:scripts/kernel-doc.pl +f:scripts/kernel-doc.py +f:scripts/ksymoops/README +f:scripts/ld-version.sh +f:scripts/leaking_addresses.pl +f:scripts/lib/abi/abi_parser.py +f:scripts/lib/abi/abi_regex.py +f:scripts/lib/abi/helpers.py +f:scripts/lib/abi/system_symbols.py +f:scripts/lib/kdoc/kdoc_files.py +f:scripts/lib/kdoc/kdoc_item.py +f:scripts/lib/kdoc/kdoc_output.py +f:scripts/lib/kdoc/kdoc_parser.py +f:scripts/lib/kdoc/kdoc_re.py +f:scripts/link-vmlinux.sh +f:scripts/macro_checker.py +f:scripts/make_fit.py +f:scripts/makelst +f:scripts/markup_oops.pl +f:scripts/min-tool-version.sh +f:scripts/misc-check +f:scripts/mkcompile_h +f:scripts/mksysmap +f:scripts/mkuboot.sh +f:scripts/mod/.gitignore +f:scripts/mod/Makefile +f:scripts/mod/devicetable-offsets.c +f:scripts/mod/empty.c +f:scripts/mod/file2alias.c +f:scripts/mod/mk_elfconfig.c +f:scripts/mod/modpost.c +f:scripts/mod/modpost.h +f:scripts/mod/sumversion.c +f:scripts/mod/symsearch.c +f:scripts/module-common.c +f:scripts/module.lds.S +f:scripts/modules-check.sh +f:scripts/nsdeps +f:scripts/objdiff +f:scripts/objdump-func +f:scripts/orc_hash.sh +f:scripts/package/PKGBUILD +f:scripts/package/builddeb +f:scripts/package/buildtar +f:scripts/package/debian/copyright +f:scripts/package/debian/rules +f:scripts/package/gen-diff-patch +f:scripts/package/install-extmod-build +f:scripts/package/kernel.spec +f:scripts/package/mkdebian +f:scripts/package/mkspec +f:scripts/package/snapcraft.template +f:scripts/pahole-version.sh +f:scripts/parse-maintainers.pl +f:scripts/patch-kernel +f:scripts/profile2linkerlist.pl +f:scripts/prune-kernel +f:scripts/recordmcount.c +f:scripts/recordmcount.h +f:scripts/recordmcount.pl +f:scripts/relocs_check.sh +f:scripts/remove-stale-files +f:scripts/rust_is_available.sh +f:scripts/rust_is_available_bindgen_0_66.h +f:scripts/rust_is_available_bindgen_libclang.h +f:scripts/rust_is_available_bindgen_libclang_concat.h +f:scripts/rust_is_available_test.py +f:scripts/rustc-llvm-version.sh +f:scripts/rustc-version.sh +f:scripts/rustdoc_test_builder.rs +f:scripts/rustdoc_test_gen.rs +f:scripts/selinux/Makefile +f:scripts/selinux/README +f:scripts/selinux/install_policy.sh +f:scripts/selinux/mdp/.gitignore +f:scripts/selinux/mdp/Makefile +f:scripts/selinux/mdp/dbus_contexts +f:scripts/selinux/mdp/mdp.c +f:scripts/setlocalversion +f:scripts/show_delta +f:scripts/sign-file.c +f:scripts/sorttable.c +f:scripts/spdxcheck-test.sh +f:scripts/spdxcheck.py +f:scripts/spdxexclude +f:scripts/spelling.txt +f:scripts/sphinx-pre-install +f:scripts/split-man.pl +f:scripts/ssl-common.h +f:scripts/stackdelta +f:scripts/stackusage +f:scripts/subarch.include +f:scripts/syscall.tbl +f:scripts/syscallhdr.sh +f:scripts/syscallnr.sh +f:scripts/syscalltbl.sh +f:scripts/tags.sh +f:scripts/test_doc_build.py +f:scripts/tools-support-relr.sh +f:scripts/tracing/ftrace-bisect.sh +f:scripts/unifdef.c +f:scripts/ver_linux +f:scripts/verify_builtin_ranges.awk +f:scripts/xen-hypercalls.sh +f:scripts/xz_wrap.sh +f:security/Kconfig +f:security/Kconfig.hardening +f:security/Makefile +f:security/apparmor/.gitignore +f:security/apparmor/Kconfig +f:security/apparmor/Makefile +f:security/apparmor/apparmorfs.c +f:security/apparmor/audit.c +f:security/apparmor/capability.c +f:security/apparmor/crypto.c +f:security/apparmor/domain.c +f:security/apparmor/file.c +f:security/apparmor/include/apparmor.h +f:security/apparmor/include/apparmorfs.h +f:security/apparmor/include/audit.h +f:security/apparmor/include/capability.h +f:security/apparmor/include/cred.h +f:security/apparmor/include/crypto.h +f:security/apparmor/include/domain.h +f:security/apparmor/include/file.h +f:security/apparmor/include/ipc.h +f:security/apparmor/include/label.h +f:security/apparmor/include/lib.h +f:security/apparmor/include/match.h +f:security/apparmor/include/mount.h +f:security/apparmor/include/net.h +f:security/apparmor/include/path.h +f:security/apparmor/include/perms.h +f:security/apparmor/include/policy.h +f:security/apparmor/include/policy_compat.h +f:security/apparmor/include/policy_ns.h +f:security/apparmor/include/policy_unpack.h +f:security/apparmor/include/procattr.h +f:security/apparmor/include/resource.h +f:security/apparmor/include/secid.h +f:security/apparmor/include/sig_names.h +f:security/apparmor/include/task.h +f:security/apparmor/ipc.c +f:security/apparmor/label.c +f:security/apparmor/lib.c +f:security/apparmor/lsm.c +f:security/apparmor/match.c +f:security/apparmor/mount.c +f:security/apparmor/net.c +f:security/apparmor/nulldfa.in +f:security/apparmor/path.c +f:security/apparmor/policy.c +f:security/apparmor/policy_compat.c +f:security/apparmor/policy_ns.c +f:security/apparmor/policy_unpack.c +f:security/apparmor/policy_unpack_test.c +f:security/apparmor/procattr.c +f:security/apparmor/resource.c +f:security/apparmor/secid.c +f:security/apparmor/stacksplitdfa.in +f:security/apparmor/task.c +f:security/bpf/Makefile +f:security/bpf/hooks.c +f:security/commoncap.c +f:security/device_cgroup.c +f:security/inode.c +f:security/integrity/Kconfig +f:security/integrity/Makefile +f:security/integrity/digsig.c +f:security/integrity/digsig_asymmetric.c +f:security/integrity/evm/Kconfig +f:security/integrity/evm/Makefile +f:security/integrity/evm/evm.h +f:security/integrity/evm/evm_crypto.c +f:security/integrity/evm/evm_main.c +f:security/integrity/evm/evm_posix_acl.c +f:security/integrity/evm/evm_secfs.c +f:security/integrity/iint.c +f:security/integrity/ima/Kconfig +f:security/integrity/ima/Makefile +f:security/integrity/ima/ima.h +f:security/integrity/ima/ima_api.c +f:security/integrity/ima/ima_appraise.c +f:security/integrity/ima/ima_asymmetric_keys.c +f:security/integrity/ima/ima_crypto.c +f:security/integrity/ima/ima_efi.c +f:security/integrity/ima/ima_fs.c +f:security/integrity/ima/ima_iint.c +f:security/integrity/ima/ima_init.c +f:security/integrity/ima/ima_kexec.c +f:security/integrity/ima/ima_main.c +f:security/integrity/ima/ima_modsig.c +f:security/integrity/ima/ima_mok.c +f:security/integrity/ima/ima_policy.c +f:security/integrity/ima/ima_queue.c +f:security/integrity/ima/ima_queue_keys.c +f:security/integrity/ima/ima_template.c +f:security/integrity/ima/ima_template_lib.c +f:security/integrity/ima/ima_template_lib.h +f:security/integrity/integrity.h +f:security/integrity/integrity_audit.c +f:security/integrity/platform_certs/efi_parser.c +f:security/integrity/platform_certs/keyring_handler.c +f:security/integrity/platform_certs/keyring_handler.h +f:security/integrity/platform_certs/load_ipl_s390.c +f:security/integrity/platform_certs/load_powerpc.c +f:security/integrity/platform_certs/load_uefi.c +f:security/integrity/platform_certs/machine_keyring.c +f:security/integrity/platform_certs/platform_keyring.c +f:security/ipe/.gitignore +f:security/ipe/Kconfig +f:security/ipe/Makefile +f:security/ipe/audit.c +f:security/ipe/audit.h +f:security/ipe/digest.c +f:security/ipe/digest.h +f:security/ipe/eval.c +f:security/ipe/eval.h +f:security/ipe/fs.c +f:security/ipe/fs.h +f:security/ipe/hooks.c +f:security/ipe/hooks.h +f:security/ipe/ipe.c +f:security/ipe/ipe.h +f:security/ipe/policy.c +f:security/ipe/policy.h +f:security/ipe/policy_fs.c +f:security/ipe/policy_parser.c +f:security/ipe/policy_parser.h +f:security/ipe/policy_tests.c +f:security/keys/Kconfig +f:security/keys/Makefile +f:security/keys/big_key.c +f:security/keys/compat.c +f:security/keys/compat_dh.c +f:security/keys/dh.c +f:security/keys/encrypted-keys/Makefile +f:security/keys/encrypted-keys/ecryptfs_format.c +f:security/keys/encrypted-keys/ecryptfs_format.h +f:security/keys/encrypted-keys/encrypted.c +f:security/keys/encrypted-keys/encrypted.h +f:security/keys/encrypted-keys/masterkey_trusted.c +f:security/keys/gc.c +f:security/keys/internal.h +f:security/keys/key.c +f:security/keys/keyctl.c +f:security/keys/keyctl_pkey.c +f:security/keys/keyring.c +f:security/keys/permission.c +f:security/keys/persistent.c +f:security/keys/proc.c +f:security/keys/process_keys.c +f:security/keys/request_key.c +f:security/keys/request_key_auth.c +f:security/keys/sysctl.c +f:security/keys/trusted-keys/Kconfig +f:security/keys/trusted-keys/Makefile +f:security/keys/trusted-keys/tpm2key.asn1 +f:security/keys/trusted-keys/trusted_caam.c +f:security/keys/trusted-keys/trusted_core.c +f:security/keys/trusted-keys/trusted_dcp.c +f:security/keys/trusted-keys/trusted_tee.c +f:security/keys/trusted-keys/trusted_tpm1.c +f:security/keys/trusted-keys/trusted_tpm2.c +f:security/keys/user_defined.c +f:security/landlock/.kunitconfig +f:security/landlock/Kconfig +f:security/landlock/Makefile +f:security/landlock/access.h +f:security/landlock/audit.c +f:security/landlock/audit.h +f:security/landlock/common.h +f:security/landlock/cred.c +f:security/landlock/cred.h +f:security/landlock/domain.c +f:security/landlock/domain.h +f:security/landlock/errata.h +f:security/landlock/errata/abi-4.h +f:security/landlock/errata/abi-6.h +f:security/landlock/fs.c +f:security/landlock/fs.h +f:security/landlock/id.c +f:security/landlock/id.h +f:security/landlock/limits.h +f:security/landlock/net.c +f:security/landlock/net.h +f:security/landlock/object.c +f:security/landlock/object.h +f:security/landlock/ruleset.c +f:security/landlock/ruleset.h +f:security/landlock/setup.c +f:security/landlock/setup.h +f:security/landlock/syscalls.c +f:security/landlock/task.c +f:security/landlock/task.h +f:security/loadpin/Kconfig +f:security/loadpin/Makefile +f:security/loadpin/loadpin.c +f:security/lockdown/Kconfig +f:security/lockdown/Makefile +f:security/lockdown/lockdown.c +f:security/lsm_audit.c +f:security/lsm_syscalls.c +f:security/min_addr.c +f:security/safesetid/Kconfig +f:security/safesetid/Makefile +f:security/safesetid/lsm.c +f:security/safesetid/lsm.h +f:security/safesetid/securityfs.c +f:security/security.c +f:security/selinux/.gitignore +f:security/selinux/Kconfig +f:security/selinux/Makefile +f:security/selinux/avc.c +f:security/selinux/genheaders.c +f:security/selinux/hooks.c +f:security/selinux/ibpkey.c +f:security/selinux/ima.c +f:security/selinux/include/audit.h +f:security/selinux/include/avc.h +f:security/selinux/include/avc_ss.h +f:security/selinux/include/classmap.h +f:security/selinux/include/conditional.h +f:security/selinux/include/ibpkey.h +f:security/selinux/include/ima.h +f:security/selinux/include/initial_sid_to_string.h +f:security/selinux/include/netif.h +f:security/selinux/include/netlabel.h +f:security/selinux/include/netnode.h +f:security/selinux/include/netport.h +f:security/selinux/include/objsec.h +f:security/selinux/include/policycap.h +f:security/selinux/include/policycap_names.h +f:security/selinux/include/security.h +f:security/selinux/include/xfrm.h +f:security/selinux/netif.c +f:security/selinux/netlabel.c +f:security/selinux/netlink.c +f:security/selinux/netnode.c +f:security/selinux/netport.c +f:security/selinux/nlmsgtab.c +f:security/selinux/selinuxfs.c +f:security/selinux/ss/avtab.c +f:security/selinux/ss/avtab.h +f:security/selinux/ss/conditional.c +f:security/selinux/ss/conditional.h +f:security/selinux/ss/constraint.h +f:security/selinux/ss/context.c +f:security/selinux/ss/context.h +f:security/selinux/ss/ebitmap.c +f:security/selinux/ss/ebitmap.h +f:security/selinux/ss/hashtab.c +f:security/selinux/ss/hashtab.h +f:security/selinux/ss/mls.c +f:security/selinux/ss/mls.h +f:security/selinux/ss/mls_types.h +f:security/selinux/ss/policydb.c +f:security/selinux/ss/policydb.h +f:security/selinux/ss/services.c +f:security/selinux/ss/services.h +f:security/selinux/ss/sidtab.c +f:security/selinux/ss/sidtab.h +f:security/selinux/ss/symtab.c +f:security/selinux/ss/symtab.h +f:security/selinux/status.c +f:security/selinux/xfrm.c +f:security/smack/Kconfig +f:security/smack/Makefile +f:security/smack/smack.h +f:security/smack/smack_access.c +f:security/smack/smack_lsm.c +f:security/smack/smack_netfilter.c +f:security/smack/smackfs.c +f:security/tomoyo/.gitignore +f:security/tomoyo/Kconfig +f:security/tomoyo/Makefile +f:security/tomoyo/audit.c +f:security/tomoyo/common.c +f:security/tomoyo/common.h +f:security/tomoyo/condition.c +f:security/tomoyo/domain.c +f:security/tomoyo/environ.c +f:security/tomoyo/file.c +f:security/tomoyo/gc.c +f:security/tomoyo/group.c +f:security/tomoyo/load_policy.c +f:security/tomoyo/memory.c +f:security/tomoyo/mount.c +f:security/tomoyo/network.c +f:security/tomoyo/policy/exception_policy.conf.default +f:security/tomoyo/realpath.c +f:security/tomoyo/securityfs_if.c +f:security/tomoyo/tomoyo.c +f:security/tomoyo/util.c +f:security/yama/Kconfig +f:security/yama/Makefile +f:security/yama/yama_lsm.c +f:sound/Kconfig +f:sound/Makefile +f:sound/ac97/Kconfig +f:sound/ac97/Makefile +f:sound/ac97/ac97_core.h +f:sound/ac97/bus.c +f:sound/ac97/codec.c +f:sound/ac97/snd_ac97_compat.c +f:sound/ac97_bus.c +f:sound/aoa/Kconfig +f:sound/aoa/Makefile +f:sound/aoa/aoa-gpio.h +f:sound/aoa/aoa.h +f:sound/aoa/codecs/Kconfig +f:sound/aoa/codecs/Makefile +f:sound/aoa/codecs/onyx.c +f:sound/aoa/codecs/onyx.h +f:sound/aoa/codecs/tas-basstreble.h +f:sound/aoa/codecs/tas-gain-table.h +f:sound/aoa/codecs/tas.c +f:sound/aoa/codecs/tas.h +f:sound/aoa/codecs/toonie.c +f:sound/aoa/core/Makefile +f:sound/aoa/core/alsa.c +f:sound/aoa/core/alsa.h +f:sound/aoa/core/core.c +f:sound/aoa/core/gpio-feature.c +f:sound/aoa/core/gpio-pmf.c +f:sound/aoa/fabrics/Kconfig +f:sound/aoa/fabrics/Makefile +f:sound/aoa/fabrics/layout.c +f:sound/aoa/soundbus/Kconfig +f:sound/aoa/soundbus/Makefile +f:sound/aoa/soundbus/core.c +f:sound/aoa/soundbus/i2sbus/Makefile +f:sound/aoa/soundbus/i2sbus/control.c +f:sound/aoa/soundbus/i2sbus/core.c +f:sound/aoa/soundbus/i2sbus/i2sbus.h +f:sound/aoa/soundbus/i2sbus/interface.h +f:sound/aoa/soundbus/i2sbus/pcm.c +f:sound/aoa/soundbus/soundbus.h +f:sound/aoa/soundbus/sysfs.c +f:sound/arm/Kconfig +f:sound/arm/Makefile +f:sound/arm/aaci.c +f:sound/arm/aaci.h +f:sound/arm/pxa2xx-ac97-lib.c +f:sound/arm/pxa2xx-ac97-regs.h +f:sound/arm/pxa2xx-ac97.c +f:sound/arm/pxa2xx-pcm-lib.c +f:sound/atmel/Kconfig +f:sound/atmel/Makefile +f:sound/atmel/ac97c.c +f:sound/atmel/ac97c.h +f:sound/core/.kunitconfig +f:sound/core/Kconfig +f:sound/core/Makefile +f:sound/core/compress_offload.c +f:sound/core/control.c +f:sound/core/control_compat.c +f:sound/core/control_led.c +f:sound/core/ctljack.c +f:sound/core/device.c +f:sound/core/hrtimer.c +f:sound/core/hwdep.c +f:sound/core/hwdep_compat.c +f:sound/core/info.c +f:sound/core/info_oss.c +f:sound/core/init.c +f:sound/core/isadma.c +f:sound/core/jack.c +f:sound/core/memalloc.c +f:sound/core/memory.c +f:sound/core/misc.c +f:sound/core/oss/Makefile +f:sound/core/oss/copy.c +f:sound/core/oss/io.c +f:sound/core/oss/linear.c +f:sound/core/oss/mixer_oss.c +f:sound/core/oss/mulaw.c +f:sound/core/oss/pcm_oss.c +f:sound/core/oss/pcm_plugin.c +f:sound/core/oss/pcm_plugin.h +f:sound/core/oss/rate.c +f:sound/core/oss/route.c +f:sound/core/pcm.c +f:sound/core/pcm_compat.c +f:sound/core/pcm_dmaengine.c +f:sound/core/pcm_drm_eld.c +f:sound/core/pcm_iec958.c +f:sound/core/pcm_lib.c +f:sound/core/pcm_local.h +f:sound/core/pcm_memory.c +f:sound/core/pcm_misc.c +f:sound/core/pcm_native.c +f:sound/core/pcm_param_trace.h +f:sound/core/pcm_timer.c +f:sound/core/pcm_trace.h +f:sound/core/rawmidi.c +f:sound/core/rawmidi_compat.c +f:sound/core/seq/Kconfig +f:sound/core/seq/Makefile +f:sound/core/seq/oss/Makefile +f:sound/core/seq/oss/seq_oss.c +f:sound/core/seq/oss/seq_oss_device.h +f:sound/core/seq/oss/seq_oss_event.c +f:sound/core/seq/oss/seq_oss_event.h +f:sound/core/seq/oss/seq_oss_init.c +f:sound/core/seq/oss/seq_oss_ioctl.c +f:sound/core/seq/oss/seq_oss_midi.c +f:sound/core/seq/oss/seq_oss_midi.h +f:sound/core/seq/oss/seq_oss_readq.c +f:sound/core/seq/oss/seq_oss_readq.h +f:sound/core/seq/oss/seq_oss_rw.c +f:sound/core/seq/oss/seq_oss_synth.c +f:sound/core/seq/oss/seq_oss_synth.h +f:sound/core/seq/oss/seq_oss_timer.c +f:sound/core/seq/oss/seq_oss_timer.h +f:sound/core/seq/oss/seq_oss_writeq.c +f:sound/core/seq/oss/seq_oss_writeq.h +f:sound/core/seq/seq.c +f:sound/core/seq/seq_clientmgr.c +f:sound/core/seq/seq_clientmgr.h +f:sound/core/seq/seq_compat.c +f:sound/core/seq/seq_dummy.c +f:sound/core/seq/seq_fifo.c +f:sound/core/seq/seq_fifo.h +f:sound/core/seq/seq_info.c +f:sound/core/seq/seq_info.h +f:sound/core/seq/seq_lock.c +f:sound/core/seq/seq_lock.h +f:sound/core/seq/seq_memory.c +f:sound/core/seq/seq_memory.h +f:sound/core/seq/seq_midi.c +f:sound/core/seq/seq_midi_emul.c +f:sound/core/seq/seq_midi_event.c +f:sound/core/seq/seq_ports.c +f:sound/core/seq/seq_ports.h +f:sound/core/seq/seq_prioq.c +f:sound/core/seq/seq_prioq.h +f:sound/core/seq/seq_queue.c +f:sound/core/seq/seq_queue.h +f:sound/core/seq/seq_system.c +f:sound/core/seq/seq_system.h +f:sound/core/seq/seq_timer.c +f:sound/core/seq/seq_timer.h +f:sound/core/seq/seq_ump_client.c +f:sound/core/seq/seq_ump_convert.c +f:sound/core/seq/seq_ump_convert.h +f:sound/core/seq/seq_virmidi.c +f:sound/core/seq_device.c +f:sound/core/sound.c +f:sound/core/sound_kunit.c +f:sound/core/sound_oss.c +f:sound/core/timer.c +f:sound/core/timer_compat.c +f:sound/core/ump.c +f:sound/core/ump_convert.c +f:sound/core/vmaster.c +f:sound/drivers/Kconfig +f:sound/drivers/Makefile +f:sound/drivers/aloop.c +f:sound/drivers/dummy.c +f:sound/drivers/mpu401/Makefile +f:sound/drivers/mpu401/mpu401.c +f:sound/drivers/mpu401/mpu401_uart.c +f:sound/drivers/mtpav.c +f:sound/drivers/mts64.c +f:sound/drivers/opl3/Makefile +f:sound/drivers/opl3/opl3_drums.c +f:sound/drivers/opl3/opl3_lib.c +f:sound/drivers/opl3/opl3_midi.c +f:sound/drivers/opl3/opl3_oss.c +f:sound/drivers/opl3/opl3_seq.c +f:sound/drivers/opl3/opl3_synth.c +f:sound/drivers/opl3/opl3_voice.h +f:sound/drivers/opl4/Makefile +f:sound/drivers/opl4/opl4_lib.c +f:sound/drivers/opl4/opl4_local.h +f:sound/drivers/opl4/opl4_mixer.c +f:sound/drivers/opl4/opl4_proc.c +f:sound/drivers/opl4/opl4_seq.c +f:sound/drivers/opl4/opl4_synth.c +f:sound/drivers/opl4/yrw801.c +f:sound/drivers/pcmtest.c +f:sound/drivers/pcsp/Makefile +f:sound/drivers/pcsp/pcsp.c +f:sound/drivers/pcsp/pcsp.h +f:sound/drivers/pcsp/pcsp_input.c +f:sound/drivers/pcsp/pcsp_input.h +f:sound/drivers/pcsp/pcsp_lib.c +f:sound/drivers/pcsp/pcsp_mixer.c +f:sound/drivers/portman2x4.c +f:sound/drivers/serial-generic.c +f:sound/drivers/serial-u16550.c +f:sound/drivers/virmidi.c +f:sound/drivers/vx/Makefile +f:sound/drivers/vx/vx_cmd.c +f:sound/drivers/vx/vx_cmd.h +f:sound/drivers/vx/vx_core.c +f:sound/drivers/vx/vx_hwdep.c +f:sound/drivers/vx/vx_mixer.c +f:sound/drivers/vx/vx_pcm.c +f:sound/drivers/vx/vx_uer.c +f:sound/firewire/Kconfig +f:sound/firewire/Makefile +f:sound/firewire/amdtp-am824.c +f:sound/firewire/amdtp-am824.h +f:sound/firewire/amdtp-stream-trace.h +f:sound/firewire/amdtp-stream.c +f:sound/firewire/amdtp-stream.h +f:sound/firewire/bebob/Makefile +f:sound/firewire/bebob/bebob.c +f:sound/firewire/bebob/bebob.h +f:sound/firewire/bebob/bebob_command.c +f:sound/firewire/bebob/bebob_focusrite.c +f:sound/firewire/bebob/bebob_hwdep.c +f:sound/firewire/bebob/bebob_maudio.c +f:sound/firewire/bebob/bebob_midi.c +f:sound/firewire/bebob/bebob_pcm.c +f:sound/firewire/bebob/bebob_proc.c +f:sound/firewire/bebob/bebob_stream.c +f:sound/firewire/bebob/bebob_terratec.c +f:sound/firewire/bebob/bebob_yamaha_terratec.c +f:sound/firewire/cmp.c +f:sound/firewire/cmp.h +f:sound/firewire/dice/Makefile +f:sound/firewire/dice/dice-alesis.c +f:sound/firewire/dice/dice-extension.c +f:sound/firewire/dice/dice-focusrite.c +f:sound/firewire/dice/dice-harman.c +f:sound/firewire/dice/dice-hwdep.c +f:sound/firewire/dice/dice-interface.h +f:sound/firewire/dice/dice-midi.c +f:sound/firewire/dice/dice-mytek.c +f:sound/firewire/dice/dice-pcm.c +f:sound/firewire/dice/dice-presonus.c +f:sound/firewire/dice/dice-proc.c +f:sound/firewire/dice/dice-stream.c +f:sound/firewire/dice/dice-tcelectronic.c +f:sound/firewire/dice/dice-transaction.c +f:sound/firewire/dice/dice-weiss.c +f:sound/firewire/dice/dice.c +f:sound/firewire/dice/dice.h +f:sound/firewire/digi00x/Makefile +f:sound/firewire/digi00x/amdtp-dot.c +f:sound/firewire/digi00x/digi00x-hwdep.c +f:sound/firewire/digi00x/digi00x-midi.c +f:sound/firewire/digi00x/digi00x-pcm.c +f:sound/firewire/digi00x/digi00x-proc.c +f:sound/firewire/digi00x/digi00x-stream.c +f:sound/firewire/digi00x/digi00x-transaction.c +f:sound/firewire/digi00x/digi00x.c +f:sound/firewire/digi00x/digi00x.h +f:sound/firewire/fcp.c +f:sound/firewire/fcp.h +f:sound/firewire/fireface/Makefile +f:sound/firewire/fireface/amdtp-ff.c +f:sound/firewire/fireface/ff-hwdep.c +f:sound/firewire/fireface/ff-midi.c +f:sound/firewire/fireface/ff-pcm.c +f:sound/firewire/fireface/ff-proc.c +f:sound/firewire/fireface/ff-protocol-former.c +f:sound/firewire/fireface/ff-protocol-latter.c +f:sound/firewire/fireface/ff-stream.c +f:sound/firewire/fireface/ff-transaction.c +f:sound/firewire/fireface/ff.c +f:sound/firewire/fireface/ff.h +f:sound/firewire/fireworks/Makefile +f:sound/firewire/fireworks/fireworks.c +f:sound/firewire/fireworks/fireworks.h +f:sound/firewire/fireworks/fireworks_command.c +f:sound/firewire/fireworks/fireworks_hwdep.c +f:sound/firewire/fireworks/fireworks_midi.c +f:sound/firewire/fireworks/fireworks_pcm.c +f:sound/firewire/fireworks/fireworks_proc.c +f:sound/firewire/fireworks/fireworks_stream.c +f:sound/firewire/fireworks/fireworks_transaction.c +f:sound/firewire/isight.c +f:sound/firewire/iso-resources.c +f:sound/firewire/iso-resources.h +f:sound/firewire/lib.c +f:sound/firewire/lib.h +f:sound/firewire/motu/Makefile +f:sound/firewire/motu/amdtp-motu-trace.h +f:sound/firewire/motu/amdtp-motu.c +f:sound/firewire/motu/motu-command-dsp-message-parser.c +f:sound/firewire/motu/motu-hwdep.c +f:sound/firewire/motu/motu-midi.c +f:sound/firewire/motu/motu-pcm.c +f:sound/firewire/motu/motu-proc.c +f:sound/firewire/motu/motu-protocol-v1.c +f:sound/firewire/motu/motu-protocol-v2.c +f:sound/firewire/motu/motu-protocol-v3.c +f:sound/firewire/motu/motu-register-dsp-message-parser.c +f:sound/firewire/motu/motu-stream.c +f:sound/firewire/motu/motu-transaction.c +f:sound/firewire/motu/motu.c +f:sound/firewire/motu/motu.h +f:sound/firewire/oxfw/Makefile +f:sound/firewire/oxfw/oxfw-command.c +f:sound/firewire/oxfw/oxfw-hwdep.c +f:sound/firewire/oxfw/oxfw-midi.c +f:sound/firewire/oxfw/oxfw-pcm.c +f:sound/firewire/oxfw/oxfw-proc.c +f:sound/firewire/oxfw/oxfw-scs1x.c +f:sound/firewire/oxfw/oxfw-spkr.c +f:sound/firewire/oxfw/oxfw-stream.c +f:sound/firewire/oxfw/oxfw.c +f:sound/firewire/oxfw/oxfw.h +f:sound/firewire/packets-buffer.c +f:sound/firewire/packets-buffer.h +f:sound/firewire/tascam/Makefile +f:sound/firewire/tascam/amdtp-tascam.c +f:sound/firewire/tascam/tascam-hwdep.c +f:sound/firewire/tascam/tascam-midi.c +f:sound/firewire/tascam/tascam-pcm.c +f:sound/firewire/tascam/tascam-proc.c +f:sound/firewire/tascam/tascam-stream.c +f:sound/firewire/tascam/tascam-transaction.c +f:sound/firewire/tascam/tascam.c +f:sound/firewire/tascam/tascam.h +f:sound/hda/Kconfig +f:sound/hda/Makefile +f:sound/hda/codecs/Kconfig +f:sound/hda/codecs/Makefile +f:sound/hda/codecs/analog.c +f:sound/hda/codecs/ca0110.c +f:sound/hda/codecs/ca0132.c +f:sound/hda/codecs/ca0132_regs.h +f:sound/hda/codecs/cirrus/Kconfig +f:sound/hda/codecs/cirrus/Makefile +f:sound/hda/codecs/cirrus/cs420x.c +f:sound/hda/codecs/cirrus/cs421x.c +f:sound/hda/codecs/cirrus/cs8409-tables.c +f:sound/hda/codecs/cirrus/cs8409.c +f:sound/hda/codecs/cirrus/cs8409.h +f:sound/hda/codecs/cm9825.c +f:sound/hda/codecs/cmedia.c +f:sound/hda/codecs/conexant.c +f:sound/hda/codecs/generic.c +f:sound/hda/codecs/generic.h +f:sound/hda/codecs/hdmi/Kconfig +f:sound/hda/codecs/hdmi/Makefile +f:sound/hda/codecs/hdmi/atihdmi.c +f:sound/hda/codecs/hdmi/eld.c +f:sound/hda/codecs/hdmi/hdmi.c +f:sound/hda/codecs/hdmi/hdmi_local.h +f:sound/hda/codecs/hdmi/intelhdmi.c +f:sound/hda/codecs/hdmi/nvhdmi-mcp.c +f:sound/hda/codecs/hdmi/nvhdmi.c +f:sound/hda/codecs/hdmi/simplehdmi.c +f:sound/hda/codecs/hdmi/tegrahdmi.c +f:sound/hda/codecs/helpers/hp_x360.c +f:sound/hda/codecs/helpers/ideapad_hotkey_led.c +f:sound/hda/codecs/helpers/ideapad_s740.c +f:sound/hda/codecs/helpers/thinkpad.c +f:sound/hda/codecs/realtek/Kconfig +f:sound/hda/codecs/realtek/Makefile +f:sound/hda/codecs/realtek/alc260.c +f:sound/hda/codecs/realtek/alc262.c +f:sound/hda/codecs/realtek/alc268.c +f:sound/hda/codecs/realtek/alc269.c +f:sound/hda/codecs/realtek/alc662.c +f:sound/hda/codecs/realtek/alc680.c +f:sound/hda/codecs/realtek/alc861.c +f:sound/hda/codecs/realtek/alc861vd.c +f:sound/hda/codecs/realtek/alc880.c +f:sound/hda/codecs/realtek/alc882.c +f:sound/hda/codecs/realtek/realtek.c +f:sound/hda/codecs/realtek/realtek.h +f:sound/hda/codecs/senarytech.c +f:sound/hda/codecs/si3054.c +f:sound/hda/codecs/side-codecs/Kconfig +f:sound/hda/codecs/side-codecs/Makefile +f:sound/hda/codecs/side-codecs/cirrus_scodec.c +f:sound/hda/codecs/side-codecs/cirrus_scodec.h +f:sound/hda/codecs/side-codecs/cirrus_scodec_test.c +f:sound/hda/codecs/side-codecs/cs35l41_hda.c +f:sound/hda/codecs/side-codecs/cs35l41_hda.h +f:sound/hda/codecs/side-codecs/cs35l41_hda_i2c.c +f:sound/hda/codecs/side-codecs/cs35l41_hda_property.c +f:sound/hda/codecs/side-codecs/cs35l41_hda_property.h +f:sound/hda/codecs/side-codecs/cs35l41_hda_spi.c +f:sound/hda/codecs/side-codecs/cs35l56_hda.c +f:sound/hda/codecs/side-codecs/cs35l56_hda.h +f:sound/hda/codecs/side-codecs/cs35l56_hda_i2c.c +f:sound/hda/codecs/side-codecs/cs35l56_hda_spi.c +f:sound/hda/codecs/side-codecs/hda_component.c +f:sound/hda/codecs/side-codecs/hda_component.h +f:sound/hda/codecs/side-codecs/tas2781_hda.c +f:sound/hda/codecs/side-codecs/tas2781_hda.h +f:sound/hda/codecs/side-codecs/tas2781_hda_i2c.c +f:sound/hda/codecs/side-codecs/tas2781_hda_spi.c +f:sound/hda/codecs/sigmatel.c +f:sound/hda/codecs/via.c +f:sound/hda/common/Kconfig +f:sound/hda/common/Makefile +f:sound/hda/common/auto_parser.c +f:sound/hda/common/beep.c +f:sound/hda/common/bind.c +f:sound/hda/common/codec.c +f:sound/hda/common/controller.c +f:sound/hda/common/controller_trace.h +f:sound/hda/common/hda_auto_parser.h +f:sound/hda/common/hda_beep.h +f:sound/hda/common/hda_controller.h +f:sound/hda/common/hda_jack.h +f:sound/hda/common/hda_local.h +f:sound/hda/common/hwdep.c +f:sound/hda/common/jack.c +f:sound/hda/common/proc.c +f:sound/hda/common/sysfs.c +f:sound/hda/controllers/Kconfig +f:sound/hda/controllers/Makefile +f:sound/hda/controllers/acpi.c +f:sound/hda/controllers/intel.c +f:sound/hda/controllers/intel.h +f:sound/hda/controllers/intel_trace.h +f:sound/hda/controllers/tegra.c +f:sound/hda/core/Kconfig +f:sound/hda/core/Makefile +f:sound/hda/core/array.c +f:sound/hda/core/bus.c +f:sound/hda/core/component.c +f:sound/hda/core/controller.c +f:sound/hda/core/device.c +f:sound/hda/core/ext/Makefile +f:sound/hda/core/ext/bus.c +f:sound/hda/core/ext/controller.c +f:sound/hda/core/ext/stream.c +f:sound/hda/core/hda_bus_type.c +f:sound/hda/core/hdmi_chmap.c +f:sound/hda/core/i915.c +f:sound/hda/core/intel-dsp-config.c +f:sound/hda/core/intel-nhlt.c +f:sound/hda/core/intel-sdw-acpi.c +f:sound/hda/core/local.h +f:sound/hda/core/regmap.c +f:sound/hda/core/stream.c +f:sound/hda/core/sysfs.c +f:sound/hda/core/trace.c +f:sound/hda/core/trace.h +f:sound/i2c/Makefile +f:sound/i2c/cs8427.c +f:sound/i2c/i2c.c +f:sound/i2c/other/Makefile +f:sound/i2c/other/ak4113.c +f:sound/i2c/other/ak4114.c +f:sound/i2c/other/ak4117.c +f:sound/i2c/other/ak4xxx-adda.c +f:sound/i2c/other/pt2258.c +f:sound/i2c/tea6330t.c +f:sound/isa/Kconfig +f:sound/isa/Makefile +f:sound/isa/ad1816a/Makefile +f:sound/isa/ad1816a/ad1816a.c +f:sound/isa/ad1816a/ad1816a_lib.c +f:sound/isa/ad1848/Makefile +f:sound/isa/ad1848/ad1848.c +f:sound/isa/adlib.c +f:sound/isa/als100.c +f:sound/isa/azt2320.c +f:sound/isa/cmi8328.c +f:sound/isa/cmi8330.c +f:sound/isa/cs423x/Makefile +f:sound/isa/cs423x/cs4231.c +f:sound/isa/cs423x/cs4236.c +f:sound/isa/cs423x/cs4236_lib.c +f:sound/isa/es1688/Makefile +f:sound/isa/es1688/es1688.c +f:sound/isa/es1688/es1688_lib.c +f:sound/isa/es18xx.c +f:sound/isa/galaxy/Makefile +f:sound/isa/galaxy/azt1605.c +f:sound/isa/galaxy/azt2316.c +f:sound/isa/galaxy/galaxy.c +f:sound/isa/gus/Makefile +f:sound/isa/gus/gus_dma.c +f:sound/isa/gus/gus_dram.c +f:sound/isa/gus/gus_io.c +f:sound/isa/gus/gus_irq.c +f:sound/isa/gus/gus_main.c +f:sound/isa/gus/gus_mem.c +f:sound/isa/gus/gus_mem_proc.c +f:sound/isa/gus/gus_mixer.c +f:sound/isa/gus/gus_pcm.c +f:sound/isa/gus/gus_reset.c +f:sound/isa/gus/gus_tables.h +f:sound/isa/gus/gus_timer.c +f:sound/isa/gus/gus_uart.c +f:sound/isa/gus/gus_volume.c +f:sound/isa/gus/gusclassic.c +f:sound/isa/gus/gusextreme.c +f:sound/isa/gus/gusmax.c +f:sound/isa/gus/interwave-stb.c +f:sound/isa/gus/interwave.c +f:sound/isa/msnd/Makefile +f:sound/isa/msnd/msnd.c +f:sound/isa/msnd/msnd.h +f:sound/isa/msnd/msnd_classic.c +f:sound/isa/msnd/msnd_classic.h +f:sound/isa/msnd/msnd_pinnacle.c +f:sound/isa/msnd/msnd_pinnacle.h +f:sound/isa/msnd/msnd_pinnacle_mixer.c +f:sound/isa/opl3sa2.c +f:sound/isa/opti9xx/Makefile +f:sound/isa/opti9xx/miro.c +f:sound/isa/opti9xx/opti92x-ad1848.c +f:sound/isa/opti9xx/opti92x-cs4231.c +f:sound/isa/opti9xx/opti93x.c +f:sound/isa/sb/Makefile +f:sound/isa/sb/emu8000.c +f:sound/isa/sb/emu8000_callback.c +f:sound/isa/sb/emu8000_local.h +f:sound/isa/sb/emu8000_patch.c +f:sound/isa/sb/emu8000_pcm.c +f:sound/isa/sb/emu8000_synth.c +f:sound/isa/sb/jazz16.c +f:sound/isa/sb/sb16.c +f:sound/isa/sb/sb16_csp.c +f:sound/isa/sb/sb16_main.c +f:sound/isa/sb/sb8.c +f:sound/isa/sb/sb8_main.c +f:sound/isa/sb/sb8_midi.c +f:sound/isa/sb/sb_common.c +f:sound/isa/sb/sb_mixer.c +f:sound/isa/sb/sbawe.c +f:sound/isa/sc6000.c +f:sound/isa/sscape.c +f:sound/isa/wavefront/Makefile +f:sound/isa/wavefront/wavefront.c +f:sound/isa/wavefront/wavefront_fx.c +f:sound/isa/wavefront/wavefront_midi.c +f:sound/isa/wavefront/wavefront_synth.c +f:sound/isa/wss/Makefile +f:sound/isa/wss/wss_lib.c +f:sound/last.c +f:sound/mips/Kconfig +f:sound/mips/Makefile +f:sound/mips/ad1843.c +f:sound/mips/hal2.c +f:sound/mips/hal2.h +f:sound/mips/sgio2audio.c +f:sound/mips/snd-n64.c +f:sound/oss/.gitignore +f:sound/oss/dmasound/Kconfig +f:sound/oss/dmasound/Makefile +f:sound/oss/dmasound/dmasound.h +f:sound/oss/dmasound/dmasound_atari.c +f:sound/oss/dmasound/dmasound_core.c +f:sound/oss/dmasound/dmasound_paula.c +f:sound/oss/dmasound/dmasound_q40.c +f:sound/parisc/Kconfig +f:sound/parisc/Makefile +f:sound/parisc/harmony.c +f:sound/parisc/harmony.h +f:sound/pci/Kconfig +f:sound/pci/Makefile +f:sound/pci/ac97/Makefile +f:sound/pci/ac97/ac97_codec.c +f:sound/pci/ac97/ac97_id.h +f:sound/pci/ac97/ac97_local.h +f:sound/pci/ac97/ac97_patch.c +f:sound/pci/ac97/ac97_patch.h +f:sound/pci/ac97/ac97_pcm.c +f:sound/pci/ac97/ac97_proc.c +f:sound/pci/ad1889.c +f:sound/pci/ad1889.h +f:sound/pci/ak4531_codec.c +f:sound/pci/ali5451/Makefile +f:sound/pci/ali5451/ali5451.c +f:sound/pci/als300.c +f:sound/pci/als4000.c +f:sound/pci/asihpi/Makefile +f:sound/pci/asihpi/asihpi.c +f:sound/pci/asihpi/hpi.h +f:sound/pci/asihpi/hpi6000.c +f:sound/pci/asihpi/hpi6000.h +f:sound/pci/asihpi/hpi6205.c +f:sound/pci/asihpi/hpi6205.h +f:sound/pci/asihpi/hpi_internal.h +f:sound/pci/asihpi/hpi_version.h +f:sound/pci/asihpi/hpicmn.c +f:sound/pci/asihpi/hpicmn.h +f:sound/pci/asihpi/hpidebug.c +f:sound/pci/asihpi/hpidebug.h +f:sound/pci/asihpi/hpidspcd.c +f:sound/pci/asihpi/hpidspcd.h +f:sound/pci/asihpi/hpifunc.c +f:sound/pci/asihpi/hpimsginit.c +f:sound/pci/asihpi/hpimsginit.h +f:sound/pci/asihpi/hpimsgx.c +f:sound/pci/asihpi/hpimsgx.h +f:sound/pci/asihpi/hpioctl.c +f:sound/pci/asihpi/hpioctl.h +f:sound/pci/asihpi/hpios.c +f:sound/pci/asihpi/hpios.h +f:sound/pci/asihpi/hpipcida.h +f:sound/pci/atiixp.c +f:sound/pci/atiixp_modem.c +f:sound/pci/au88x0/Makefile +f:sound/pci/au88x0/au8810.c +f:sound/pci/au88x0/au8810.h +f:sound/pci/au88x0/au8820.c +f:sound/pci/au88x0/au8820.h +f:sound/pci/au88x0/au8830.c +f:sound/pci/au88x0/au8830.h +f:sound/pci/au88x0/au88x0.c +f:sound/pci/au88x0/au88x0.h +f:sound/pci/au88x0/au88x0_a3d.c +f:sound/pci/au88x0/au88x0_a3d.h +f:sound/pci/au88x0/au88x0_a3ddata.c +f:sound/pci/au88x0/au88x0_core.c +f:sound/pci/au88x0/au88x0_eq.c +f:sound/pci/au88x0/au88x0_eq.h +f:sound/pci/au88x0/au88x0_eqdata.c +f:sound/pci/au88x0/au88x0_game.c +f:sound/pci/au88x0/au88x0_mixer.c +f:sound/pci/au88x0/au88x0_mpu401.c +f:sound/pci/au88x0/au88x0_pcm.c +f:sound/pci/au88x0/au88x0_synth.c +f:sound/pci/au88x0/au88x0_wt.h +f:sound/pci/au88x0/au88x0_xtalk.c +f:sound/pci/au88x0/au88x0_xtalk.h +f:sound/pci/aw2/Makefile +f:sound/pci/aw2/aw2-alsa.c +f:sound/pci/aw2/aw2-saa7146.c +f:sound/pci/aw2/aw2-saa7146.h +f:sound/pci/aw2/aw2-tsl.c +f:sound/pci/aw2/saa7146.h +f:sound/pci/azt3328.c +f:sound/pci/azt3328.h +f:sound/pci/bt87x.c +f:sound/pci/ca0106/Makefile +f:sound/pci/ca0106/ca0106.h +f:sound/pci/ca0106/ca0106_main.c +f:sound/pci/ca0106/ca0106_mixer.c +f:sound/pci/ca0106/ca0106_proc.c +f:sound/pci/ca0106/ca_midi.c +f:sound/pci/ca0106/ca_midi.h +f:sound/pci/cmipci.c +f:sound/pci/cs4281.c +f:sound/pci/cs46xx/Makefile +f:sound/pci/cs46xx/cs46xx.c +f:sound/pci/cs46xx/cs46xx.h +f:sound/pci/cs46xx/cs46xx_dsp_scb_types.h +f:sound/pci/cs46xx/cs46xx_dsp_spos.h +f:sound/pci/cs46xx/cs46xx_dsp_task_types.h +f:sound/pci/cs46xx/cs46xx_lib.c +f:sound/pci/cs46xx/cs46xx_lib.h +f:sound/pci/cs46xx/dsp_spos.c +f:sound/pci/cs46xx/dsp_spos.h +f:sound/pci/cs46xx/dsp_spos_scb_lib.c +f:sound/pci/cs5530.c +f:sound/pci/cs5535audio/Makefile +f:sound/pci/cs5535audio/cs5535audio.c +f:sound/pci/cs5535audio/cs5535audio.h +f:sound/pci/cs5535audio/cs5535audio_olpc.c +f:sound/pci/cs5535audio/cs5535audio_pcm.c +f:sound/pci/cs5535audio/cs5535audio_pm.c +f:sound/pci/ctxfi/Makefile +f:sound/pci/ctxfi/ct20k1reg.h +f:sound/pci/ctxfi/ct20k2reg.h +f:sound/pci/ctxfi/ctamixer.c +f:sound/pci/ctxfi/ctamixer.h +f:sound/pci/ctxfi/ctatc.c +f:sound/pci/ctxfi/ctatc.h +f:sound/pci/ctxfi/ctdaio.c +f:sound/pci/ctxfi/ctdaio.h +f:sound/pci/ctxfi/cthardware.c +f:sound/pci/ctxfi/cthardware.h +f:sound/pci/ctxfi/cthw20k1.c +f:sound/pci/ctxfi/cthw20k1.h +f:sound/pci/ctxfi/cthw20k2.c +f:sound/pci/ctxfi/cthw20k2.h +f:sound/pci/ctxfi/ctimap.c +f:sound/pci/ctxfi/ctimap.h +f:sound/pci/ctxfi/ctmixer.c +f:sound/pci/ctxfi/ctmixer.h +f:sound/pci/ctxfi/ctpcm.c +f:sound/pci/ctxfi/ctpcm.h +f:sound/pci/ctxfi/ctresource.c +f:sound/pci/ctxfi/ctresource.h +f:sound/pci/ctxfi/ctsrc.c +f:sound/pci/ctxfi/ctsrc.h +f:sound/pci/ctxfi/cttimer.c +f:sound/pci/ctxfi/cttimer.h +f:sound/pci/ctxfi/ctvmem.c +f:sound/pci/ctxfi/ctvmem.h +f:sound/pci/ctxfi/xfi.c +f:sound/pci/echoaudio/Makefile +f:sound/pci/echoaudio/darla20.c +f:sound/pci/echoaudio/darla20_dsp.c +f:sound/pci/echoaudio/darla24.c +f:sound/pci/echoaudio/darla24_dsp.c +f:sound/pci/echoaudio/echo3g.c +f:sound/pci/echoaudio/echo3g_dsp.c +f:sound/pci/echoaudio/echoaudio.c +f:sound/pci/echoaudio/echoaudio.h +f:sound/pci/echoaudio/echoaudio_3g.c +f:sound/pci/echoaudio/echoaudio_dsp.c +f:sound/pci/echoaudio/echoaudio_dsp.h +f:sound/pci/echoaudio/echoaudio_gml.c +f:sound/pci/echoaudio/gina20.c +f:sound/pci/echoaudio/gina20_dsp.c +f:sound/pci/echoaudio/gina24.c +f:sound/pci/echoaudio/gina24_dsp.c +f:sound/pci/echoaudio/indigo.c +f:sound/pci/echoaudio/indigo_dsp.c +f:sound/pci/echoaudio/indigo_express_dsp.c +f:sound/pci/echoaudio/indigodj.c +f:sound/pci/echoaudio/indigodj_dsp.c +f:sound/pci/echoaudio/indigodjx.c +f:sound/pci/echoaudio/indigodjx_dsp.c +f:sound/pci/echoaudio/indigoio.c +f:sound/pci/echoaudio/indigoio_dsp.c +f:sound/pci/echoaudio/indigoiox.c +f:sound/pci/echoaudio/indigoiox_dsp.c +f:sound/pci/echoaudio/layla20.c +f:sound/pci/echoaudio/layla20_dsp.c +f:sound/pci/echoaudio/layla24.c +f:sound/pci/echoaudio/layla24_dsp.c +f:sound/pci/echoaudio/mia.c +f:sound/pci/echoaudio/mia_dsp.c +f:sound/pci/echoaudio/midi.c +f:sound/pci/echoaudio/mona.c +f:sound/pci/echoaudio/mona_dsp.c +f:sound/pci/emu10k1/Makefile +f:sound/pci/emu10k1/emu10k1.c +f:sound/pci/emu10k1/emu10k1_callback.c +f:sound/pci/emu10k1/emu10k1_main.c +f:sound/pci/emu10k1/emu10k1_patch.c +f:sound/pci/emu10k1/emu10k1_synth.c +f:sound/pci/emu10k1/emu10k1_synth_local.h +f:sound/pci/emu10k1/emu10k1x.c +f:sound/pci/emu10k1/emufx.c +f:sound/pci/emu10k1/emumixer.c +f:sound/pci/emu10k1/emumpu401.c +f:sound/pci/emu10k1/emupcm.c +f:sound/pci/emu10k1/emuproc.c +f:sound/pci/emu10k1/io.c +f:sound/pci/emu10k1/irq.c +f:sound/pci/emu10k1/memory.c +f:sound/pci/emu10k1/p16v.c +f:sound/pci/emu10k1/p16v.h +f:sound/pci/emu10k1/p17v.h +f:sound/pci/emu10k1/timer.c +f:sound/pci/emu10k1/tina2.h +f:sound/pci/emu10k1/voice.c +f:sound/pci/ens1370.c +f:sound/pci/ens1371.c +f:sound/pci/es1938.c +f:sound/pci/es1968.c +f:sound/pci/fm801.c +f:sound/pci/ice1712/Makefile +f:sound/pci/ice1712/ak4xxx.c +f:sound/pci/ice1712/amp.c +f:sound/pci/ice1712/amp.h +f:sound/pci/ice1712/aureon.c +f:sound/pci/ice1712/aureon.h +f:sound/pci/ice1712/delta.c +f:sound/pci/ice1712/delta.h +f:sound/pci/ice1712/envy24ht.h +f:sound/pci/ice1712/ews.c +f:sound/pci/ice1712/ews.h +f:sound/pci/ice1712/hoontech.c +f:sound/pci/ice1712/hoontech.h +f:sound/pci/ice1712/ice1712.c +f:sound/pci/ice1712/ice1712.h +f:sound/pci/ice1712/ice1724.c +f:sound/pci/ice1712/juli.c +f:sound/pci/ice1712/juli.h +f:sound/pci/ice1712/maya44.c +f:sound/pci/ice1712/maya44.h +f:sound/pci/ice1712/phase.c +f:sound/pci/ice1712/phase.h +f:sound/pci/ice1712/pontis.c +f:sound/pci/ice1712/pontis.h +f:sound/pci/ice1712/prodigy192.c +f:sound/pci/ice1712/prodigy192.h +f:sound/pci/ice1712/prodigy_hifi.c +f:sound/pci/ice1712/prodigy_hifi.h +f:sound/pci/ice1712/psc724.c +f:sound/pci/ice1712/psc724.h +f:sound/pci/ice1712/quartet.c +f:sound/pci/ice1712/quartet.h +f:sound/pci/ice1712/revo.c +f:sound/pci/ice1712/revo.h +f:sound/pci/ice1712/se.c +f:sound/pci/ice1712/se.h +f:sound/pci/ice1712/stac946x.h +f:sound/pci/ice1712/vt1720_mobo.c +f:sound/pci/ice1712/vt1720_mobo.h +f:sound/pci/ice1712/wm8766.c +f:sound/pci/ice1712/wm8766.h +f:sound/pci/ice1712/wm8776.c +f:sound/pci/ice1712/wm8776.h +f:sound/pci/ice1712/wtm.c +f:sound/pci/ice1712/wtm.h +f:sound/pci/intel8x0.c +f:sound/pci/intel8x0m.c +f:sound/pci/korg1212/Makefile +f:sound/pci/korg1212/korg1212.c +f:sound/pci/lola/Makefile +f:sound/pci/lola/lola.c +f:sound/pci/lola/lola.h +f:sound/pci/lola/lola_clock.c +f:sound/pci/lola/lola_mixer.c +f:sound/pci/lola/lola_pcm.c +f:sound/pci/lola/lola_proc.c +f:sound/pci/lx6464es/Makefile +f:sound/pci/lx6464es/lx6464es.c +f:sound/pci/lx6464es/lx6464es.h +f:sound/pci/lx6464es/lx_core.c +f:sound/pci/lx6464es/lx_core.h +f:sound/pci/lx6464es/lx_defs.h +f:sound/pci/maestro3.c +f:sound/pci/mixart/Makefile +f:sound/pci/mixart/mixart.c +f:sound/pci/mixart/mixart.h +f:sound/pci/mixart/mixart_core.c +f:sound/pci/mixart/mixart_core.h +f:sound/pci/mixart/mixart_hwdep.c +f:sound/pci/mixart/mixart_hwdep.h +f:sound/pci/mixart/mixart_mixer.c +f:sound/pci/mixart/mixart_mixer.h +f:sound/pci/nm256/Makefile +f:sound/pci/nm256/nm256.c +f:sound/pci/nm256/nm256_coef.c +f:sound/pci/oxygen/Makefile +f:sound/pci/oxygen/ak4396.h +f:sound/pci/oxygen/cm9780.h +f:sound/pci/oxygen/cs2000.h +f:sound/pci/oxygen/cs4245.h +f:sound/pci/oxygen/cs4362a.h +f:sound/pci/oxygen/cs4398.h +f:sound/pci/oxygen/oxygen.c +f:sound/pci/oxygen/oxygen.h +f:sound/pci/oxygen/oxygen_io.c +f:sound/pci/oxygen/oxygen_lib.c +f:sound/pci/oxygen/oxygen_mixer.c +f:sound/pci/oxygen/oxygen_pcm.c +f:sound/pci/oxygen/oxygen_regs.h +f:sound/pci/oxygen/pcm1796.h +f:sound/pci/oxygen/se6x.c +f:sound/pci/oxygen/virtuoso.c +f:sound/pci/oxygen/wm8766.h +f:sound/pci/oxygen/wm8776.h +f:sound/pci/oxygen/wm8785.h +f:sound/pci/oxygen/xonar.h +f:sound/pci/oxygen/xonar_cs43xx.c +f:sound/pci/oxygen/xonar_dg.c +f:sound/pci/oxygen/xonar_dg.h +f:sound/pci/oxygen/xonar_dg_mixer.c +f:sound/pci/oxygen/xonar_hdmi.c +f:sound/pci/oxygen/xonar_lib.c +f:sound/pci/oxygen/xonar_pcm179x.c +f:sound/pci/oxygen/xonar_wm87x6.c +f:sound/pci/pcxhr/Makefile +f:sound/pci/pcxhr/pcxhr.c +f:sound/pci/pcxhr/pcxhr.h +f:sound/pci/pcxhr/pcxhr_core.c +f:sound/pci/pcxhr/pcxhr_core.h +f:sound/pci/pcxhr/pcxhr_hwdep.c +f:sound/pci/pcxhr/pcxhr_hwdep.h +f:sound/pci/pcxhr/pcxhr_mix22.c +f:sound/pci/pcxhr/pcxhr_mix22.h +f:sound/pci/pcxhr/pcxhr_mixer.c +f:sound/pci/pcxhr/pcxhr_mixer.h +f:sound/pci/riptide/Makefile +f:sound/pci/riptide/riptide.c +f:sound/pci/rme32.c +f:sound/pci/rme96.c +f:sound/pci/rme9652/Makefile +f:sound/pci/rme9652/hdsp.c +f:sound/pci/rme9652/hdspm.c +f:sound/pci/rme9652/rme9652.c +f:sound/pci/sis7019.c +f:sound/pci/sis7019.h +f:sound/pci/sonicvibes.c +f:sound/pci/trident/Makefile +f:sound/pci/trident/trident.c +f:sound/pci/trident/trident.h +f:sound/pci/trident/trident_main.c +f:sound/pci/trident/trident_memory.c +f:sound/pci/via82xx.c +f:sound/pci/via82xx_modem.c +f:sound/pci/vx222/Makefile +f:sound/pci/vx222/vx222.c +f:sound/pci/vx222/vx222.h +f:sound/pci/vx222/vx222_ops.c +f:sound/pci/ymfpci/Makefile +f:sound/pci/ymfpci/ymfpci.c +f:sound/pci/ymfpci/ymfpci.h +f:sound/pci/ymfpci/ymfpci_main.c +f:sound/pcmcia/Kconfig +f:sound/pcmcia/Makefile +f:sound/pcmcia/pdaudiocf/Makefile +f:sound/pcmcia/pdaudiocf/pdaudiocf.c +f:sound/pcmcia/pdaudiocf/pdaudiocf.h +f:sound/pcmcia/pdaudiocf/pdaudiocf_core.c +f:sound/pcmcia/pdaudiocf/pdaudiocf_irq.c +f:sound/pcmcia/pdaudiocf/pdaudiocf_pcm.c +f:sound/pcmcia/vx/Makefile +f:sound/pcmcia/vx/vxp_mixer.c +f:sound/pcmcia/vx/vxp_ops.c +f:sound/pcmcia/vx/vxpocket.c +f:sound/pcmcia/vx/vxpocket.h +f:sound/ppc/Kconfig +f:sound/ppc/Makefile +f:sound/ppc/awacs.c +f:sound/ppc/awacs.h +f:sound/ppc/beep.c +f:sound/ppc/burgundy.c +f:sound/ppc/burgundy.h +f:sound/ppc/daca.c +f:sound/ppc/keywest.c +f:sound/ppc/pmac.c +f:sound/ppc/pmac.h +f:sound/ppc/powermac.c +f:sound/ppc/snd_ps3.c +f:sound/ppc/snd_ps3.h +f:sound/ppc/snd_ps3_reg.h +f:sound/ppc/tumbler.c +f:sound/ppc/tumbler_volume.h +f:sound/sh/Kconfig +f:sound/sh/Makefile +f:sound/sh/aica.c +f:sound/sh/aica.h +f:sound/sh/sh_dac_audio.c +f:sound/soc/Kconfig +f:sound/soc/Makefile +f:sound/soc/adi/Kconfig +f:sound/soc/adi/Makefile +f:sound/soc/adi/axi-i2s.c +f:sound/soc/adi/axi-spdif.c +f:sound/soc/amd/Kconfig +f:sound/soc/amd/Makefile +f:sound/soc/amd/acp-config.c +f:sound/soc/amd/acp-da7219-max98357a.c +f:sound/soc/amd/acp-es8336.c +f:sound/soc/amd/acp-pcm-dma.c +f:sound/soc/amd/acp-rt5645.c +f:sound/soc/amd/acp.h +f:sound/soc/amd/acp/Kconfig +f:sound/soc/amd/acp/Makefile +f:sound/soc/amd/acp/acp-i2s.c +f:sound/soc/amd/acp/acp-legacy-common.c +f:sound/soc/amd/acp/acp-legacy-mach.c +f:sound/soc/amd/acp/acp-mach-common.c +f:sound/soc/amd/acp/acp-mach.h +f:sound/soc/amd/acp/acp-pci.c +f:sound/soc/amd/acp/acp-pdm.c +f:sound/soc/amd/acp/acp-platform.c +f:sound/soc/amd/acp/acp-rembrandt.c +f:sound/soc/amd/acp/acp-renoir.c +f:sound/soc/amd/acp/acp-sdw-legacy-mach.c +f:sound/soc/amd/acp/acp-sdw-mach-common.c +f:sound/soc/amd/acp/acp-sdw-sof-mach.c +f:sound/soc/amd/acp/acp-sof-mach.c +f:sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.c +f:sound/soc/amd/acp/acp3x-es83xx/acp3x-es83xx.h +f:sound/soc/amd/acp/acp63.c +f:sound/soc/amd/acp/acp70.c +f:sound/soc/amd/acp/acp_common.h +f:sound/soc/amd/acp/amd-acp63-acpi-match.c +f:sound/soc/amd/acp/amd-acp70-acpi-match.c +f:sound/soc/amd/acp/amd-acpi-mach.c +f:sound/soc/amd/acp/amd-sdw-acpi.c +f:sound/soc/amd/acp/amd.h +f:sound/soc/amd/acp/chip_offset_byte.h +f:sound/soc/amd/acp/soc_amd_sdw_common.h +f:sound/soc/amd/acp3x-rt5682-max9836.c +f:sound/soc/amd/include/acp_2_2_d.h +f:sound/soc/amd/include/acp_2_2_enum.h +f:sound/soc/amd/include/acp_2_2_sh_mask.h +f:sound/soc/amd/mach-config.h +f:sound/soc/amd/ps/Makefile +f:sound/soc/amd/ps/acp63.h +f:sound/soc/amd/ps/pci-ps.c +f:sound/soc/amd/ps/ps-common.c +f:sound/soc/amd/ps/ps-mach.c +f:sound/soc/amd/ps/ps-pdm-dma.c +f:sound/soc/amd/ps/ps-sdw-dma.c +f:sound/soc/amd/raven/Makefile +f:sound/soc/amd/raven/acp3x-i2s.c +f:sound/soc/amd/raven/acp3x-pcm-dma.c +f:sound/soc/amd/raven/acp3x.h +f:sound/soc/amd/raven/chip_offset_byte.h +f:sound/soc/amd/raven/pci-acp3x.c +f:sound/soc/amd/renoir/Makefile +f:sound/soc/amd/renoir/acp3x-pdm-dma.c +f:sound/soc/amd/renoir/acp3x-rn.c +f:sound/soc/amd/renoir/rn-pci-acp3x.c +f:sound/soc/amd/renoir/rn_acp3x.h +f:sound/soc/amd/renoir/rn_chip_offset_byte.h +f:sound/soc/amd/rpl/Makefile +f:sound/soc/amd/rpl/rpl-pci-acp6x.c +f:sound/soc/amd/rpl/rpl_acp6x.h +f:sound/soc/amd/rpl/rpl_acp6x_chip_offset_byte.h +f:sound/soc/amd/vangogh/Makefile +f:sound/soc/amd/vangogh/acp5x-i2s.c +f:sound/soc/amd/vangogh/acp5x-mach.c +f:sound/soc/amd/vangogh/acp5x-pcm-dma.c +f:sound/soc/amd/vangogh/acp5x.h +f:sound/soc/amd/vangogh/pci-acp5x.c +f:sound/soc/amd/vangogh/vg_chip_offset_byte.h +f:sound/soc/amd/yc/Makefile +f:sound/soc/amd/yc/acp6x-mach.c +f:sound/soc/amd/yc/acp6x-pdm-dma.c +f:sound/soc/amd/yc/acp6x.h +f:sound/soc/amd/yc/acp6x_chip_offset_byte.h +f:sound/soc/amd/yc/pci-acp6x.c +f:sound/soc/apple/Kconfig +f:sound/soc/apple/Makefile +f:sound/soc/apple/mca.c +f:sound/soc/atmel/Kconfig +f:sound/soc/atmel/Makefile +f:sound/soc/atmel/atmel-classd.c +f:sound/soc/atmel/atmel-classd.h +f:sound/soc/atmel/atmel-i2s.c +f:sound/soc/atmel/atmel-pcm-dma.c +f:sound/soc/atmel/atmel-pcm-pdc.c +f:sound/soc/atmel/atmel-pcm.h +f:sound/soc/atmel/atmel-pdmic.c +f:sound/soc/atmel/atmel-pdmic.h +f:sound/soc/atmel/atmel_ssc_dai.c +f:sound/soc/atmel/atmel_ssc_dai.h +f:sound/soc/atmel/atmel_wm8904.c +f:sound/soc/atmel/mchp-i2s-mcc.c +f:sound/soc/atmel/mchp-pdmc.c +f:sound/soc/atmel/mchp-spdifrx.c +f:sound/soc/atmel/mchp-spdiftx.c +f:sound/soc/atmel/mikroe-proto.c +f:sound/soc/atmel/sam9g20_wm8731.c +f:sound/soc/atmel/sam9x5_wm8731.c +f:sound/soc/atmel/tse850-pcm5142.c +f:sound/soc/au1x/Kconfig +f:sound/soc/au1x/Makefile +f:sound/soc/au1x/ac97c.c +f:sound/soc/au1x/db1000.c +f:sound/soc/au1x/db1200.c +f:sound/soc/au1x/dbdma2.c +f:sound/soc/au1x/dma.c +f:sound/soc/au1x/i2sc.c +f:sound/soc/au1x/psc-ac97.c +f:sound/soc/au1x/psc-i2s.c +f:sound/soc/au1x/psc.h +f:sound/soc/bcm/Kconfig +f:sound/soc/bcm/Makefile +f:sound/soc/bcm/bcm2835-i2s.c +f:sound/soc/bcm/bcm63xx-i2s-whistler.c +f:sound/soc/bcm/bcm63xx-i2s.h +f:sound/soc/bcm/bcm63xx-pcm-whistler.c +f:sound/soc/bcm/cygnus-pcm.c +f:sound/soc/bcm/cygnus-ssp.c +f:sound/soc/bcm/cygnus-ssp.h +f:sound/soc/cirrus/Kconfig +f:sound/soc/cirrus/Makefile +f:sound/soc/cirrus/ep93xx-i2s.c +f:sound/soc/cirrus/ep93xx-pcm.c +f:sound/soc/cirrus/ep93xx-pcm.h +f:sound/soc/codecs/88pm860x-codec.c +f:sound/soc/codecs/88pm860x-codec.h +f:sound/soc/codecs/Kconfig +f:sound/soc/codecs/Makefile +f:sound/soc/codecs/ab8500-codec.c +f:sound/soc/codecs/ab8500-codec.h +f:sound/soc/codecs/ac97.c +f:sound/soc/codecs/ad1836.c +f:sound/soc/codecs/ad1836.h +f:sound/soc/codecs/ad193x-i2c.c +f:sound/soc/codecs/ad193x-spi.c +f:sound/soc/codecs/ad193x.c +f:sound/soc/codecs/ad193x.h +f:sound/soc/codecs/ad1980.c +f:sound/soc/codecs/ad73311.c +f:sound/soc/codecs/ad73311.h +f:sound/soc/codecs/adau-utils.c +f:sound/soc/codecs/adau-utils.h +f:sound/soc/codecs/adau1372-i2c.c +f:sound/soc/codecs/adau1372-spi.c +f:sound/soc/codecs/adau1372.c +f:sound/soc/codecs/adau1372.h +f:sound/soc/codecs/adau1373.c +f:sound/soc/codecs/adau1373.h +f:sound/soc/codecs/adau1701.c +f:sound/soc/codecs/adau1701.h +f:sound/soc/codecs/adau1761-i2c.c +f:sound/soc/codecs/adau1761-spi.c +f:sound/soc/codecs/adau1761.c +f:sound/soc/codecs/adau1761.h +f:sound/soc/codecs/adau1781-i2c.c +f:sound/soc/codecs/adau1781-spi.c +f:sound/soc/codecs/adau1781.c +f:sound/soc/codecs/adau1781.h +f:sound/soc/codecs/adau17x1.c +f:sound/soc/codecs/adau17x1.h +f:sound/soc/codecs/adau1977-i2c.c +f:sound/soc/codecs/adau1977-spi.c +f:sound/soc/codecs/adau1977.c +f:sound/soc/codecs/adau1977.h +f:sound/soc/codecs/adau7002.c +f:sound/soc/codecs/adau7118-hw.c +f:sound/soc/codecs/adau7118-i2c.c +f:sound/soc/codecs/adau7118.c +f:sound/soc/codecs/adau7118.h +f:sound/soc/codecs/adav801.c +f:sound/soc/codecs/adav803.c +f:sound/soc/codecs/adav80x.c +f:sound/soc/codecs/adav80x.h +f:sound/soc/codecs/ads117x.c +f:sound/soc/codecs/ak4104.c +f:sound/soc/codecs/ak4118.c +f:sound/soc/codecs/ak4375.c +f:sound/soc/codecs/ak4458.c +f:sound/soc/codecs/ak4458.h +f:sound/soc/codecs/ak4535.c +f:sound/soc/codecs/ak4535.h +f:sound/soc/codecs/ak4554.c +f:sound/soc/codecs/ak4613.c +f:sound/soc/codecs/ak4619.c +f:sound/soc/codecs/ak4641.c +f:sound/soc/codecs/ak4642.c +f:sound/soc/codecs/ak4671.c +f:sound/soc/codecs/ak4671.h +f:sound/soc/codecs/ak5386.c +f:sound/soc/codecs/ak5558.c +f:sound/soc/codecs/ak5558.h +f:sound/soc/codecs/alc5623.c +f:sound/soc/codecs/alc5623.h +f:sound/soc/codecs/alc5632.c +f:sound/soc/codecs/alc5632.h +f:sound/soc/codecs/arizona-jack.c +f:sound/soc/codecs/arizona.c +f:sound/soc/codecs/arizona.h +f:sound/soc/codecs/audio-iio-aux.c +f:sound/soc/codecs/aw8738.c +f:sound/soc/codecs/aw87390.c +f:sound/soc/codecs/aw87390.h +f:sound/soc/codecs/aw88081.c +f:sound/soc/codecs/aw88081.h +f:sound/soc/codecs/aw88166.c +f:sound/soc/codecs/aw88166.h +f:sound/soc/codecs/aw88261.c +f:sound/soc/codecs/aw88261.h +f:sound/soc/codecs/aw88395/aw88395.c +f:sound/soc/codecs/aw88395/aw88395.h +f:sound/soc/codecs/aw88395/aw88395_data_type.h +f:sound/soc/codecs/aw88395/aw88395_device.c +f:sound/soc/codecs/aw88395/aw88395_device.h +f:sound/soc/codecs/aw88395/aw88395_lib.c +f:sound/soc/codecs/aw88395/aw88395_lib.h +f:sound/soc/codecs/aw88395/aw88395_reg.h +f:sound/soc/codecs/aw88399.c +f:sound/soc/codecs/aw88399.h +f:sound/soc/codecs/bd28623.c +f:sound/soc/codecs/bt-sco.c +f:sound/soc/codecs/chv3-codec.c +f:sound/soc/codecs/cirrus_legacy.h +f:sound/soc/codecs/cpcap.c +f:sound/soc/codecs/cq93vc.c +f:sound/soc/codecs/cros_ec_codec.c +f:sound/soc/codecs/cs-amp-lib-test.c +f:sound/soc/codecs/cs-amp-lib.c +f:sound/soc/codecs/cs35l32.c +f:sound/soc/codecs/cs35l32.h +f:sound/soc/codecs/cs35l33.c +f:sound/soc/codecs/cs35l33.h +f:sound/soc/codecs/cs35l34.c +f:sound/soc/codecs/cs35l34.h +f:sound/soc/codecs/cs35l35.c +f:sound/soc/codecs/cs35l35.h +f:sound/soc/codecs/cs35l36.c +f:sound/soc/codecs/cs35l36.h +f:sound/soc/codecs/cs35l41-i2c.c +f:sound/soc/codecs/cs35l41-lib.c +f:sound/soc/codecs/cs35l41-spi.c +f:sound/soc/codecs/cs35l41.c +f:sound/soc/codecs/cs35l41.h +f:sound/soc/codecs/cs35l45-i2c.c +f:sound/soc/codecs/cs35l45-spi.c +f:sound/soc/codecs/cs35l45-tables.c +f:sound/soc/codecs/cs35l45.c +f:sound/soc/codecs/cs35l45.h +f:sound/soc/codecs/cs35l56-i2c.c +f:sound/soc/codecs/cs35l56-sdw.c +f:sound/soc/codecs/cs35l56-shared.c +f:sound/soc/codecs/cs35l56-spi.c +f:sound/soc/codecs/cs35l56.c +f:sound/soc/codecs/cs35l56.h +f:sound/soc/codecs/cs40l50-codec.c +f:sound/soc/codecs/cs4234.c +f:sound/soc/codecs/cs4234.h +f:sound/soc/codecs/cs4265.c +f:sound/soc/codecs/cs4265.h +f:sound/soc/codecs/cs4270.c +f:sound/soc/codecs/cs4271-i2c.c +f:sound/soc/codecs/cs4271-spi.c +f:sound/soc/codecs/cs4271.c +f:sound/soc/codecs/cs4271.h +f:sound/soc/codecs/cs42l42-i2c.c +f:sound/soc/codecs/cs42l42-sdw.c +f:sound/soc/codecs/cs42l42.c +f:sound/soc/codecs/cs42l42.h +f:sound/soc/codecs/cs42l43-jack.c +f:sound/soc/codecs/cs42l43-sdw.c +f:sound/soc/codecs/cs42l43.c +f:sound/soc/codecs/cs42l43.h +f:sound/soc/codecs/cs42l51-i2c.c +f:sound/soc/codecs/cs42l51.c +f:sound/soc/codecs/cs42l51.h +f:sound/soc/codecs/cs42l52.c +f:sound/soc/codecs/cs42l52.h +f:sound/soc/codecs/cs42l56.c +f:sound/soc/codecs/cs42l56.h +f:sound/soc/codecs/cs42l73.c +f:sound/soc/codecs/cs42l73.h +f:sound/soc/codecs/cs42l83-i2c.c +f:sound/soc/codecs/cs42l84.c +f:sound/soc/codecs/cs42l84.h +f:sound/soc/codecs/cs42xx8-i2c.c +f:sound/soc/codecs/cs42xx8.c +f:sound/soc/codecs/cs42xx8.h +f:sound/soc/codecs/cs43130.c +f:sound/soc/codecs/cs43130.h +f:sound/soc/codecs/cs4341.c +f:sound/soc/codecs/cs4349.c +f:sound/soc/codecs/cs4349.h +f:sound/soc/codecs/cs47l15.c +f:sound/soc/codecs/cs47l24.c +f:sound/soc/codecs/cs47l24.h +f:sound/soc/codecs/cs47l35.c +f:sound/soc/codecs/cs47l85.c +f:sound/soc/codecs/cs47l90.c +f:sound/soc/codecs/cs47l92.c +f:sound/soc/codecs/cs48l32-tables.c +f:sound/soc/codecs/cs48l32.c +f:sound/soc/codecs/cs48l32.h +f:sound/soc/codecs/cs530x-i2c.c +f:sound/soc/codecs/cs530x.c +f:sound/soc/codecs/cs530x.h +f:sound/soc/codecs/cs53l30.c +f:sound/soc/codecs/cs53l30.h +f:sound/soc/codecs/cx20442.c +f:sound/soc/codecs/cx20442.h +f:sound/soc/codecs/cx2072x.c +f:sound/soc/codecs/cx2072x.h +f:sound/soc/codecs/da7210.c +f:sound/soc/codecs/da7213.c +f:sound/soc/codecs/da7213.h +f:sound/soc/codecs/da7218.c +f:sound/soc/codecs/da7218.h +f:sound/soc/codecs/da7219-aad.c +f:sound/soc/codecs/da7219-aad.h +f:sound/soc/codecs/da7219.c +f:sound/soc/codecs/da7219.h +f:sound/soc/codecs/da732x.c +f:sound/soc/codecs/da732x.h +f:sound/soc/codecs/da732x_reg.h +f:sound/soc/codecs/da9055.c +f:sound/soc/codecs/dmic.c +f:sound/soc/codecs/es7134.c +f:sound/soc/codecs/es7241.c +f:sound/soc/codecs/es8311.c +f:sound/soc/codecs/es8311.h +f:sound/soc/codecs/es8316.c +f:sound/soc/codecs/es8316.h +f:sound/soc/codecs/es8323.c +f:sound/soc/codecs/es8323.h +f:sound/soc/codecs/es8326.c +f:sound/soc/codecs/es8326.h +f:sound/soc/codecs/es8328-i2c.c +f:sound/soc/codecs/es8328-spi.c +f:sound/soc/codecs/es8328.c +f:sound/soc/codecs/es8328.h +f:sound/soc/codecs/es8375.c +f:sound/soc/codecs/es8375.h +f:sound/soc/codecs/es8389.c +f:sound/soc/codecs/es8389.h +f:sound/soc/codecs/es83xx-dsm-common.c +f:sound/soc/codecs/es83xx-dsm-common.h +f:sound/soc/codecs/framer-codec.c +f:sound/soc/codecs/gtm601.c +f:sound/soc/codecs/hda-dai.c +f:sound/soc/codecs/hda.c +f:sound/soc/codecs/hda.h +f:sound/soc/codecs/hdac_hda.c +f:sound/soc/codecs/hdac_hda.h +f:sound/soc/codecs/hdac_hdmi.c +f:sound/soc/codecs/hdmi-codec.c +f:sound/soc/codecs/ics43432.c +f:sound/soc/codecs/idt821034.c +f:sound/soc/codecs/inno_rk3036.c +f:sound/soc/codecs/inno_rk3036.h +f:sound/soc/codecs/isabelle.c +f:sound/soc/codecs/isabelle.h +f:sound/soc/codecs/jz4725b.c +f:sound/soc/codecs/jz4740.c +f:sound/soc/codecs/jz4760.c +f:sound/soc/codecs/jz4770.c +f:sound/soc/codecs/lm4857.c +f:sound/soc/codecs/lm49453.c +f:sound/soc/codecs/lm49453.h +f:sound/soc/codecs/lochnagar-sc.c +f:sound/soc/codecs/lpass-macro-common.c +f:sound/soc/codecs/lpass-macro-common.h +f:sound/soc/codecs/lpass-rx-macro.c +f:sound/soc/codecs/lpass-tx-macro.c +f:sound/soc/codecs/lpass-va-macro.c +f:sound/soc/codecs/lpass-wsa-macro.c +f:sound/soc/codecs/lpass-wsa-macro.h +f:sound/soc/codecs/madera.c +f:sound/soc/codecs/madera.h +f:sound/soc/codecs/max9759.c +f:sound/soc/codecs/max9768.c +f:sound/soc/codecs/max98088.c +f:sound/soc/codecs/max98088.h +f:sound/soc/codecs/max98090.c +f:sound/soc/codecs/max98090.h +f:sound/soc/codecs/max98095.c +f:sound/soc/codecs/max98095.h +f:sound/soc/codecs/max98357a.c +f:sound/soc/codecs/max98363.c +f:sound/soc/codecs/max98363.h +f:sound/soc/codecs/max98371.c +f:sound/soc/codecs/max98371.h +f:sound/soc/codecs/max98373-i2c.c +f:sound/soc/codecs/max98373-sdw.c +f:sound/soc/codecs/max98373-sdw.h +f:sound/soc/codecs/max98373.c +f:sound/soc/codecs/max98373.h +f:sound/soc/codecs/max98388.c +f:sound/soc/codecs/max98388.h +f:sound/soc/codecs/max98390.c +f:sound/soc/codecs/max98390.h +f:sound/soc/codecs/max98396.c +f:sound/soc/codecs/max98396.h +f:sound/soc/codecs/max9850.c +f:sound/soc/codecs/max9850.h +f:sound/soc/codecs/max98504.c +f:sound/soc/codecs/max98504.h +f:sound/soc/codecs/max98520.c +f:sound/soc/codecs/max98520.h +f:sound/soc/codecs/max9860.c +f:sound/soc/codecs/max9860.h +f:sound/soc/codecs/max9867.c +f:sound/soc/codecs/max9867.h +f:sound/soc/codecs/max9877.c +f:sound/soc/codecs/max9877.h +f:sound/soc/codecs/max98925.c +f:sound/soc/codecs/max98925.h +f:sound/soc/codecs/max98926.c +f:sound/soc/codecs/max98926.h +f:sound/soc/codecs/max98927.c +f:sound/soc/codecs/max98927.h +f:sound/soc/codecs/mc13783.c +f:sound/soc/codecs/mc13783.h +f:sound/soc/codecs/ml26124.c +f:sound/soc/codecs/ml26124.h +f:sound/soc/codecs/msm8916-wcd-analog.c +f:sound/soc/codecs/msm8916-wcd-digital.c +f:sound/soc/codecs/mt6351.c +f:sound/soc/codecs/mt6351.h +f:sound/soc/codecs/mt6357.c +f:sound/soc/codecs/mt6357.h +f:sound/soc/codecs/mt6358.c +f:sound/soc/codecs/mt6358.h +f:sound/soc/codecs/mt6359-accdet.c +f:sound/soc/codecs/mt6359-accdet.h +f:sound/soc/codecs/mt6359.c +f:sound/soc/codecs/mt6359.h +f:sound/soc/codecs/mt6660.c +f:sound/soc/codecs/mt6660.h +f:sound/soc/codecs/nau8315.c +f:sound/soc/codecs/nau8325.c +f:sound/soc/codecs/nau8325.h +f:sound/soc/codecs/nau8540.c +f:sound/soc/codecs/nau8540.h +f:sound/soc/codecs/nau8810.c +f:sound/soc/codecs/nau8810.h +f:sound/soc/codecs/nau8821.c +f:sound/soc/codecs/nau8821.h +f:sound/soc/codecs/nau8822.c +f:sound/soc/codecs/nau8822.h +f:sound/soc/codecs/nau8824.c +f:sound/soc/codecs/nau8824.h +f:sound/soc/codecs/nau8825.c +f:sound/soc/codecs/nau8825.h +f:sound/soc/codecs/ntp8835.c +f:sound/soc/codecs/ntp8918.c +f:sound/soc/codecs/ntpfw.c +f:sound/soc/codecs/ntpfw.h +f:sound/soc/codecs/pcm1681.c +f:sound/soc/codecs/pcm1789-i2c.c +f:sound/soc/codecs/pcm1789.c +f:sound/soc/codecs/pcm1789.h +f:sound/soc/codecs/pcm179x-i2c.c +f:sound/soc/codecs/pcm179x-spi.c +f:sound/soc/codecs/pcm179x.c +f:sound/soc/codecs/pcm179x.h +f:sound/soc/codecs/pcm186x-i2c.c +f:sound/soc/codecs/pcm186x-spi.c +f:sound/soc/codecs/pcm186x.c +f:sound/soc/codecs/pcm186x.h +f:sound/soc/codecs/pcm3008.c +f:sound/soc/codecs/pcm3060-i2c.c +f:sound/soc/codecs/pcm3060-spi.c +f:sound/soc/codecs/pcm3060.c +f:sound/soc/codecs/pcm3060.h +f:sound/soc/codecs/pcm3168a-i2c.c +f:sound/soc/codecs/pcm3168a-spi.c +f:sound/soc/codecs/pcm3168a.c +f:sound/soc/codecs/pcm3168a.h +f:sound/soc/codecs/pcm5102a.c +f:sound/soc/codecs/pcm512x-i2c.c +f:sound/soc/codecs/pcm512x-spi.c +f:sound/soc/codecs/pcm512x.c +f:sound/soc/codecs/pcm512x.h +f:sound/soc/codecs/pcm6240.c +f:sound/soc/codecs/pcm6240.h +f:sound/soc/codecs/peb2466.c +f:sound/soc/codecs/rk3308_codec.c +f:sound/soc/codecs/rk3308_codec.h +f:sound/soc/codecs/rk3328_codec.c +f:sound/soc/codecs/rk3328_codec.h +f:sound/soc/codecs/rk817_codec.c +f:sound/soc/codecs/rl6231.c +f:sound/soc/codecs/rl6231.h +f:sound/soc/codecs/rl6347a.c +f:sound/soc/codecs/rl6347a.h +f:sound/soc/codecs/rt-sdw-common.c +f:sound/soc/codecs/rt-sdw-common.h +f:sound/soc/codecs/rt1011.c +f:sound/soc/codecs/rt1011.h +f:sound/soc/codecs/rt1015.c +f:sound/soc/codecs/rt1015.h +f:sound/soc/codecs/rt1015p.c +f:sound/soc/codecs/rt1016.c +f:sound/soc/codecs/rt1016.h +f:sound/soc/codecs/rt1017-sdca-sdw.c +f:sound/soc/codecs/rt1017-sdca-sdw.h +f:sound/soc/codecs/rt1019.c +f:sound/soc/codecs/rt1019.h +f:sound/soc/codecs/rt1305.c +f:sound/soc/codecs/rt1305.h +f:sound/soc/codecs/rt1308-sdw.c +f:sound/soc/codecs/rt1308-sdw.h +f:sound/soc/codecs/rt1308.c +f:sound/soc/codecs/rt1308.h +f:sound/soc/codecs/rt1316-sdw.c +f:sound/soc/codecs/rt1316-sdw.h +f:sound/soc/codecs/rt1318-sdw.c +f:sound/soc/codecs/rt1318-sdw.h +f:sound/soc/codecs/rt1318.c +f:sound/soc/codecs/rt1318.h +f:sound/soc/codecs/rt1320-sdw.c +f:sound/soc/codecs/rt1320-sdw.h +f:sound/soc/codecs/rt274.c +f:sound/soc/codecs/rt274.h +f:sound/soc/codecs/rt286.c +f:sound/soc/codecs/rt286.h +f:sound/soc/codecs/rt298.c +f:sound/soc/codecs/rt298.h +f:sound/soc/codecs/rt5514-spi.c +f:sound/soc/codecs/rt5514-spi.h +f:sound/soc/codecs/rt5514.c +f:sound/soc/codecs/rt5514.h +f:sound/soc/codecs/rt5616.c +f:sound/soc/codecs/rt5616.h +f:sound/soc/codecs/rt5631.c +f:sound/soc/codecs/rt5631.h +f:sound/soc/codecs/rt5640.c +f:sound/soc/codecs/rt5640.h +f:sound/soc/codecs/rt5645.c +f:sound/soc/codecs/rt5645.h +f:sound/soc/codecs/rt5651.c +f:sound/soc/codecs/rt5651.h +f:sound/soc/codecs/rt5659.c +f:sound/soc/codecs/rt5659.h +f:sound/soc/codecs/rt5660.c +f:sound/soc/codecs/rt5660.h +f:sound/soc/codecs/rt5663.c +f:sound/soc/codecs/rt5663.h +f:sound/soc/codecs/rt5665.c +f:sound/soc/codecs/rt5665.h +f:sound/soc/codecs/rt5668.c +f:sound/soc/codecs/rt5668.h +f:sound/soc/codecs/rt5670-dsp.h +f:sound/soc/codecs/rt5670.c +f:sound/soc/codecs/rt5670.h +f:sound/soc/codecs/rt5677-spi.c +f:sound/soc/codecs/rt5677-spi.h +f:sound/soc/codecs/rt5677.c +f:sound/soc/codecs/rt5677.h +f:sound/soc/codecs/rt5682-i2c.c +f:sound/soc/codecs/rt5682-sdw.c +f:sound/soc/codecs/rt5682.c +f:sound/soc/codecs/rt5682.h +f:sound/soc/codecs/rt5682s.c +f:sound/soc/codecs/rt5682s.h +f:sound/soc/codecs/rt700-sdw.c +f:sound/soc/codecs/rt700-sdw.h +f:sound/soc/codecs/rt700.c +f:sound/soc/codecs/rt700.h +f:sound/soc/codecs/rt711-sdca-sdw.c +f:sound/soc/codecs/rt711-sdca-sdw.h +f:sound/soc/codecs/rt711-sdca.c +f:sound/soc/codecs/rt711-sdca.h +f:sound/soc/codecs/rt711-sdw.c +f:sound/soc/codecs/rt711-sdw.h +f:sound/soc/codecs/rt711.c +f:sound/soc/codecs/rt711.h +f:sound/soc/codecs/rt712-sdca-dmic.c +f:sound/soc/codecs/rt712-sdca-dmic.h +f:sound/soc/codecs/rt712-sdca-sdw.c +f:sound/soc/codecs/rt712-sdca-sdw.h +f:sound/soc/codecs/rt712-sdca.c +f:sound/soc/codecs/rt712-sdca.h +f:sound/soc/codecs/rt715-sdca-sdw.c +f:sound/soc/codecs/rt715-sdca-sdw.h +f:sound/soc/codecs/rt715-sdca.c +f:sound/soc/codecs/rt715-sdca.h +f:sound/soc/codecs/rt715-sdw.c +f:sound/soc/codecs/rt715-sdw.h +f:sound/soc/codecs/rt715.c +f:sound/soc/codecs/rt715.h +f:sound/soc/codecs/rt721-sdca-sdw.c +f:sound/soc/codecs/rt721-sdca-sdw.h +f:sound/soc/codecs/rt721-sdca.c +f:sound/soc/codecs/rt721-sdca.h +f:sound/soc/codecs/rt722-sdca-sdw.c +f:sound/soc/codecs/rt722-sdca-sdw.h +f:sound/soc/codecs/rt722-sdca.c +f:sound/soc/codecs/rt722-sdca.h +f:sound/soc/codecs/rt9120.c +f:sound/soc/codecs/rt9123.c +f:sound/soc/codecs/rt9123p.c +f:sound/soc/codecs/rtq9124.c +f:sound/soc/codecs/rtq9128.c +f:sound/soc/codecs/sdw-mockup.c +f:sound/soc/codecs/sgtl5000.c +f:sound/soc/codecs/sgtl5000.h +f:sound/soc/codecs/si476x.c +f:sound/soc/codecs/sigmadsp-i2c.c +f:sound/soc/codecs/sigmadsp-regmap.c +f:sound/soc/codecs/sigmadsp.c +f:sound/soc/codecs/sigmadsp.h +f:sound/soc/codecs/simple-amplifier.c +f:sound/soc/codecs/simple-mux.c +f:sound/soc/codecs/sma1303.c +f:sound/soc/codecs/sma1303.h +f:sound/soc/codecs/sma1307.c +f:sound/soc/codecs/sma1307.h +f:sound/soc/codecs/spdif_receiver.c +f:sound/soc/codecs/spdif_transmitter.c +f:sound/soc/codecs/src4xxx-i2c.c +f:sound/soc/codecs/src4xxx.c +f:sound/soc/codecs/src4xxx.h +f:sound/soc/codecs/ssm2305.c +f:sound/soc/codecs/ssm2518.c +f:sound/soc/codecs/ssm2518.h +f:sound/soc/codecs/ssm2602-i2c.c +f:sound/soc/codecs/ssm2602-spi.c +f:sound/soc/codecs/ssm2602.c +f:sound/soc/codecs/ssm2602.h +f:sound/soc/codecs/ssm3515.c +f:sound/soc/codecs/ssm4567.c +f:sound/soc/codecs/sta32x.c +f:sound/soc/codecs/sta32x.h +f:sound/soc/codecs/sta350.c +f:sound/soc/codecs/sta350.h +f:sound/soc/codecs/sta529.c +f:sound/soc/codecs/stac9766.c +f:sound/soc/codecs/sti-sas.c +f:sound/soc/codecs/tas2552.c +f:sound/soc/codecs/tas2552.h +f:sound/soc/codecs/tas2562.c +f:sound/soc/codecs/tas2562.h +f:sound/soc/codecs/tas2764-quirks.h +f:sound/soc/codecs/tas2764.c +f:sound/soc/codecs/tas2764.h +f:sound/soc/codecs/tas2770.c +f:sound/soc/codecs/tas2770.h +f:sound/soc/codecs/tas2780.c +f:sound/soc/codecs/tas2780.h +f:sound/soc/codecs/tas2781-comlib-i2c.c +f:sound/soc/codecs/tas2781-comlib.c +f:sound/soc/codecs/tas2781-fmwlib.c +f:sound/soc/codecs/tas2781-i2c.c +f:sound/soc/codecs/tas5086.c +f:sound/soc/codecs/tas571x.c +f:sound/soc/codecs/tas571x.h +f:sound/soc/codecs/tas5720.c +f:sound/soc/codecs/tas5720.h +f:sound/soc/codecs/tas5805m.c +f:sound/soc/codecs/tas6424.c +f:sound/soc/codecs/tas6424.h +f:sound/soc/codecs/tda7419.c +f:sound/soc/codecs/tfa9879.c +f:sound/soc/codecs/tfa9879.h +f:sound/soc/codecs/tfa989x.c +f:sound/soc/codecs/tlv320adc3xxx.c +f:sound/soc/codecs/tlv320adcx140.c +f:sound/soc/codecs/tlv320adcx140.h +f:sound/soc/codecs/tlv320aic23-i2c.c +f:sound/soc/codecs/tlv320aic23-spi.c +f:sound/soc/codecs/tlv320aic23.c +f:sound/soc/codecs/tlv320aic23.h +f:sound/soc/codecs/tlv320aic26.c +f:sound/soc/codecs/tlv320aic26.h +f:sound/soc/codecs/tlv320aic31xx.c +f:sound/soc/codecs/tlv320aic31xx.h +f:sound/soc/codecs/tlv320aic32x4-clk.c +f:sound/soc/codecs/tlv320aic32x4-i2c.c +f:sound/soc/codecs/tlv320aic32x4-spi.c +f:sound/soc/codecs/tlv320aic32x4.c +f:sound/soc/codecs/tlv320aic32x4.h +f:sound/soc/codecs/tlv320aic3x-i2c.c +f:sound/soc/codecs/tlv320aic3x-spi.c +f:sound/soc/codecs/tlv320aic3x.c +f:sound/soc/codecs/tlv320aic3x.h +f:sound/soc/codecs/tlv320dac33.c +f:sound/soc/codecs/tlv320dac33.h +f:sound/soc/codecs/tpa6130a2.c +f:sound/soc/codecs/tpa6130a2.h +f:sound/soc/codecs/ts3a227e.c +f:sound/soc/codecs/ts3a227e.h +f:sound/soc/codecs/tscs42xx.c +f:sound/soc/codecs/tscs42xx.h +f:sound/soc/codecs/tscs454.c +f:sound/soc/codecs/tscs454.h +f:sound/soc/codecs/twl4030.c +f:sound/soc/codecs/twl6040.c +f:sound/soc/codecs/twl6040.h +f:sound/soc/codecs/uda1334.c +f:sound/soc/codecs/uda1342.c +f:sound/soc/codecs/uda1342.h +f:sound/soc/codecs/uda1380.c +f:sound/soc/codecs/uda1380.h +f:sound/soc/codecs/wcd-clsh-v2.c +f:sound/soc/codecs/wcd-clsh-v2.h +f:sound/soc/codecs/wcd-mbhc-v2.c +f:sound/soc/codecs/wcd-mbhc-v2.h +f:sound/soc/codecs/wcd9335.c +f:sound/soc/codecs/wcd9335.h +f:sound/soc/codecs/wcd934x.c +f:sound/soc/codecs/wcd937x-sdw.c +f:sound/soc/codecs/wcd937x.c +f:sound/soc/codecs/wcd937x.h +f:sound/soc/codecs/wcd938x-sdw.c +f:sound/soc/codecs/wcd938x.c +f:sound/soc/codecs/wcd938x.h +f:sound/soc/codecs/wcd939x-sdw.c +f:sound/soc/codecs/wcd939x.c +f:sound/soc/codecs/wcd939x.h +f:sound/soc/codecs/wl1273.c +f:sound/soc/codecs/wl1273.h +f:sound/soc/codecs/wm0010.c +f:sound/soc/codecs/wm1250-ev1.c +f:sound/soc/codecs/wm2000.c +f:sound/soc/codecs/wm2000.h +f:sound/soc/codecs/wm2200.c +f:sound/soc/codecs/wm2200.h +f:sound/soc/codecs/wm5100-tables.c +f:sound/soc/codecs/wm5100.c +f:sound/soc/codecs/wm5100.h +f:sound/soc/codecs/wm5102.c +f:sound/soc/codecs/wm5102.h +f:sound/soc/codecs/wm5110.c +f:sound/soc/codecs/wm5110.h +f:sound/soc/codecs/wm8350.c +f:sound/soc/codecs/wm8350.h +f:sound/soc/codecs/wm8400.c +f:sound/soc/codecs/wm8400.h +f:sound/soc/codecs/wm8510.c +f:sound/soc/codecs/wm8510.h +f:sound/soc/codecs/wm8523.c +f:sound/soc/codecs/wm8523.h +f:sound/soc/codecs/wm8524.c +f:sound/soc/codecs/wm8580.c +f:sound/soc/codecs/wm8580.h +f:sound/soc/codecs/wm8711.c +f:sound/soc/codecs/wm8711.h +f:sound/soc/codecs/wm8727.c +f:sound/soc/codecs/wm8728.c +f:sound/soc/codecs/wm8728.h +f:sound/soc/codecs/wm8731-i2c.c +f:sound/soc/codecs/wm8731-spi.c +f:sound/soc/codecs/wm8731.c +f:sound/soc/codecs/wm8731.h +f:sound/soc/codecs/wm8737.c +f:sound/soc/codecs/wm8737.h +f:sound/soc/codecs/wm8741.c +f:sound/soc/codecs/wm8741.h +f:sound/soc/codecs/wm8750.c +f:sound/soc/codecs/wm8750.h +f:sound/soc/codecs/wm8753.c +f:sound/soc/codecs/wm8753.h +f:sound/soc/codecs/wm8770.c +f:sound/soc/codecs/wm8770.h +f:sound/soc/codecs/wm8776.c +f:sound/soc/codecs/wm8776.h +f:sound/soc/codecs/wm8782.c +f:sound/soc/codecs/wm8804-i2c.c +f:sound/soc/codecs/wm8804-spi.c +f:sound/soc/codecs/wm8804.c +f:sound/soc/codecs/wm8804.h +f:sound/soc/codecs/wm8900.c +f:sound/soc/codecs/wm8900.h +f:sound/soc/codecs/wm8903.c +f:sound/soc/codecs/wm8903.h +f:sound/soc/codecs/wm8904.c +f:sound/soc/codecs/wm8904.h +f:sound/soc/codecs/wm8940.c +f:sound/soc/codecs/wm8940.h +f:sound/soc/codecs/wm8955.c +f:sound/soc/codecs/wm8955.h +f:sound/soc/codecs/wm8958-dsp2.c +f:sound/soc/codecs/wm8960.c +f:sound/soc/codecs/wm8960.h +f:sound/soc/codecs/wm8961.c +f:sound/soc/codecs/wm8961.h +f:sound/soc/codecs/wm8962.c +f:sound/soc/codecs/wm8962.h +f:sound/soc/codecs/wm8971.c +f:sound/soc/codecs/wm8971.h +f:sound/soc/codecs/wm8974.c +f:sound/soc/codecs/wm8974.h +f:sound/soc/codecs/wm8978.c +f:sound/soc/codecs/wm8978.h +f:sound/soc/codecs/wm8983.c +f:sound/soc/codecs/wm8983.h +f:sound/soc/codecs/wm8985.c +f:sound/soc/codecs/wm8985.h +f:sound/soc/codecs/wm8988.c +f:sound/soc/codecs/wm8988.h +f:sound/soc/codecs/wm8990.c +f:sound/soc/codecs/wm8990.h +f:sound/soc/codecs/wm8991.c +f:sound/soc/codecs/wm8991.h +f:sound/soc/codecs/wm8993.c +f:sound/soc/codecs/wm8993.h +f:sound/soc/codecs/wm8994.c +f:sound/soc/codecs/wm8994.h +f:sound/soc/codecs/wm8995.c +f:sound/soc/codecs/wm8995.h +f:sound/soc/codecs/wm8996.c +f:sound/soc/codecs/wm8996.h +f:sound/soc/codecs/wm8997.c +f:sound/soc/codecs/wm8997.h +f:sound/soc/codecs/wm8998.c +f:sound/soc/codecs/wm8998.h +f:sound/soc/codecs/wm9081.c +f:sound/soc/codecs/wm9081.h +f:sound/soc/codecs/wm9090.c +f:sound/soc/codecs/wm9090.h +f:sound/soc/codecs/wm9705.c +f:sound/soc/codecs/wm9712.c +f:sound/soc/codecs/wm9713.c +f:sound/soc/codecs/wm9713.h +f:sound/soc/codecs/wm_adsp.c +f:sound/soc/codecs/wm_adsp.h +f:sound/soc/codecs/wm_hubs.c +f:sound/soc/codecs/wm_hubs.h +f:sound/soc/codecs/wsa881x.c +f:sound/soc/codecs/wsa883x.c +f:sound/soc/codecs/wsa884x.c +f:sound/soc/codecs/zl38060.c +f:sound/soc/dwc/Kconfig +f:sound/soc/dwc/Makefile +f:sound/soc/dwc/dwc-i2s.c +f:sound/soc/dwc/dwc-pcm.c +f:sound/soc/dwc/local.h +f:sound/soc/fsl/Kconfig +f:sound/soc/fsl/Makefile +f:sound/soc/fsl/efika-audio-fabric.c +f:sound/soc/fsl/eukrea-tlv320.c +f:sound/soc/fsl/fsl-asoc-card.c +f:sound/soc/fsl/fsl_asrc.c +f:sound/soc/fsl/fsl_asrc.h +f:sound/soc/fsl/fsl_asrc_common.h +f:sound/soc/fsl/fsl_asrc_dma.c +f:sound/soc/fsl/fsl_asrc_m2m.c +f:sound/soc/fsl/fsl_aud2htx.c +f:sound/soc/fsl/fsl_aud2htx.h +f:sound/soc/fsl/fsl_audmix.c +f:sound/soc/fsl/fsl_audmix.h +f:sound/soc/fsl/fsl_dma.c +f:sound/soc/fsl/fsl_dma.h +f:sound/soc/fsl/fsl_easrc.c +f:sound/soc/fsl/fsl_easrc.h +f:sound/soc/fsl/fsl_esai.c +f:sound/soc/fsl/fsl_esai.h +f:sound/soc/fsl/fsl_micfil.c +f:sound/soc/fsl/fsl_micfil.h +f:sound/soc/fsl/fsl_mqs.c +f:sound/soc/fsl/fsl_qmc_audio.c +f:sound/soc/fsl/fsl_rpmsg.c +f:sound/soc/fsl/fsl_rpmsg.h +f:sound/soc/fsl/fsl_sai.c +f:sound/soc/fsl/fsl_sai.h +f:sound/soc/fsl/fsl_spdif.c +f:sound/soc/fsl/fsl_spdif.h +f:sound/soc/fsl/fsl_ssi.c +f:sound/soc/fsl/fsl_ssi.h +f:sound/soc/fsl/fsl_ssi_dbg.c +f:sound/soc/fsl/fsl_utils.c +f:sound/soc/fsl/fsl_utils.h +f:sound/soc/fsl/fsl_xcvr.c +f:sound/soc/fsl/fsl_xcvr.h +f:sound/soc/fsl/imx-audio-rpmsg.c +f:sound/soc/fsl/imx-audmix.c +f:sound/soc/fsl/imx-audmux.c +f:sound/soc/fsl/imx-audmux.h +f:sound/soc/fsl/imx-card.c +f:sound/soc/fsl/imx-es8328.c +f:sound/soc/fsl/imx-hdmi.c +f:sound/soc/fsl/imx-pcm-dma.c +f:sound/soc/fsl/imx-pcm-fiq.c +f:sound/soc/fsl/imx-pcm-rpmsg.c +f:sound/soc/fsl/imx-pcm-rpmsg.h +f:sound/soc/fsl/imx-pcm.h +f:sound/soc/fsl/imx-rpmsg.c +f:sound/soc/fsl/imx-sgtl5000.c +f:sound/soc/fsl/imx-ssi.h +f:sound/soc/fsl/lpc3xxx-i2s.c +f:sound/soc/fsl/lpc3xxx-i2s.h +f:sound/soc/fsl/lpc3xxx-pcm.c +f:sound/soc/fsl/mpc5200_dma.c +f:sound/soc/fsl/mpc5200_dma.h +f:sound/soc/fsl/mpc5200_psc_ac97.c +f:sound/soc/fsl/mpc5200_psc_i2s.c +f:sound/soc/fsl/p1022_ds.c +f:sound/soc/fsl/p1022_rdk.c +f:sound/soc/fsl/pcm030-audio-fabric.c +f:sound/soc/generic/Kconfig +f:sound/soc/generic/Makefile +f:sound/soc/generic/audio-graph-card.c +f:sound/soc/generic/audio-graph-card2-custom-sample.c +f:sound/soc/generic/audio-graph-card2-custom-sample1.dtsi +f:sound/soc/generic/audio-graph-card2-custom-sample2.dtsi +f:sound/soc/generic/audio-graph-card2.c +f:sound/soc/generic/simple-card-utils.c +f:sound/soc/generic/simple-card.c +f:sound/soc/generic/test-component.c +f:sound/soc/google/Kconfig +f:sound/soc/google/Makefile +f:sound/soc/google/chv3-i2s.c +f:sound/soc/hisilicon/Kconfig +f:sound/soc/hisilicon/Makefile +f:sound/soc/hisilicon/hi6210-i2s.c +f:sound/soc/hisilicon/hi6210-i2s.h +f:sound/soc/img/Kconfig +f:sound/soc/img/Makefile +f:sound/soc/img/img-i2s-in.c +f:sound/soc/img/img-i2s-out.c +f:sound/soc/img/img-parallel-out.c +f:sound/soc/img/img-spdif-in.c +f:sound/soc/img/img-spdif-out.c +f:sound/soc/img/pistachio-internal-dac.c +f:sound/soc/intel/Kconfig +f:sound/soc/intel/Makefile +f:sound/soc/intel/atom/Makefile +f:sound/soc/intel/atom/sst-atom-controls.c +f:sound/soc/intel/atom/sst-atom-controls.h +f:sound/soc/intel/atom/sst-mfld-dsp.h +f:sound/soc/intel/atom/sst-mfld-platform-compress.c +f:sound/soc/intel/atom/sst-mfld-platform-pcm.c +f:sound/soc/intel/atom/sst-mfld-platform.h +f:sound/soc/intel/atom/sst/Makefile +f:sound/soc/intel/atom/sst/sst.c +f:sound/soc/intel/atom/sst/sst.h +f:sound/soc/intel/atom/sst/sst_acpi.c +f:sound/soc/intel/atom/sst/sst_drv_interface.c +f:sound/soc/intel/atom/sst/sst_ipc.c +f:sound/soc/intel/atom/sst/sst_loader.c +f:sound/soc/intel/atom/sst/sst_pci.c +f:sound/soc/intel/atom/sst/sst_pvt.c +f:sound/soc/intel/atom/sst/sst_stream.c +f:sound/soc/intel/avs/Makefile +f:sound/soc/intel/avs/apl.c +f:sound/soc/intel/avs/avs.h +f:sound/soc/intel/avs/board_selection.c +f:sound/soc/intel/avs/boards/Kconfig +f:sound/soc/intel/avs/boards/Makefile +f:sound/soc/intel/avs/boards/da7219.c +f:sound/soc/intel/avs/boards/dmic.c +f:sound/soc/intel/avs/boards/es8336.c +f:sound/soc/intel/avs/boards/hdaudio.c +f:sound/soc/intel/avs/boards/i2s_test.c +f:sound/soc/intel/avs/boards/max98357a.c +f:sound/soc/intel/avs/boards/max98373.c +f:sound/soc/intel/avs/boards/max98927.c +f:sound/soc/intel/avs/boards/nau8825.c +f:sound/soc/intel/avs/boards/pcm3168a.c +f:sound/soc/intel/avs/boards/probe.c +f:sound/soc/intel/avs/boards/rt274.c +f:sound/soc/intel/avs/boards/rt286.c +f:sound/soc/intel/avs/boards/rt298.c +f:sound/soc/intel/avs/boards/rt5514.c +f:sound/soc/intel/avs/boards/rt5640.c +f:sound/soc/intel/avs/boards/rt5663.c +f:sound/soc/intel/avs/boards/rt5682.c +f:sound/soc/intel/avs/boards/ssm4567.c +f:sound/soc/intel/avs/cldma.c +f:sound/soc/intel/avs/cldma.h +f:sound/soc/intel/avs/cnl.c +f:sound/soc/intel/avs/control.c +f:sound/soc/intel/avs/control.h +f:sound/soc/intel/avs/core.c +f:sound/soc/intel/avs/debugfs.c +f:sound/soc/intel/avs/dsp.c +f:sound/soc/intel/avs/icl.c +f:sound/soc/intel/avs/ipc.c +f:sound/soc/intel/avs/lnl.c +f:sound/soc/intel/avs/loader.c +f:sound/soc/intel/avs/messages.c +f:sound/soc/intel/avs/messages.h +f:sound/soc/intel/avs/mtl.c +f:sound/soc/intel/avs/path.c +f:sound/soc/intel/avs/path.h +f:sound/soc/intel/avs/pcm.c +f:sound/soc/intel/avs/pcm.h +f:sound/soc/intel/avs/probes.c +f:sound/soc/intel/avs/ptl.c +f:sound/soc/intel/avs/registers.h +f:sound/soc/intel/avs/skl.c +f:sound/soc/intel/avs/sysfs.c +f:sound/soc/intel/avs/tgl.c +f:sound/soc/intel/avs/topology.c +f:sound/soc/intel/avs/topology.h +f:sound/soc/intel/avs/trace.c +f:sound/soc/intel/avs/trace.h +f:sound/soc/intel/avs/utils.c +f:sound/soc/intel/avs/utils.h +f:sound/soc/intel/boards/Kconfig +f:sound/soc/intel/boards/Makefile +f:sound/soc/intel/boards/bdw-rt5650.c +f:sound/soc/intel/boards/bdw-rt5677.c +f:sound/soc/intel/boards/bdw_rt286.c +f:sound/soc/intel/boards/bytcht_cx2072x.c +f:sound/soc/intel/boards/bytcht_da7213.c +f:sound/soc/intel/boards/bytcht_es8316.c +f:sound/soc/intel/boards/bytcht_nocodec.c +f:sound/soc/intel/boards/bytcr_rt5640.c +f:sound/soc/intel/boards/bytcr_rt5651.c +f:sound/soc/intel/boards/bytcr_wm5102.c +f:sound/soc/intel/boards/cht_bsw_max98090_ti.c +f:sound/soc/intel/boards/cht_bsw_nau8824.c +f:sound/soc/intel/boards/cht_bsw_rt5645.c +f:sound/soc/intel/boards/cht_bsw_rt5672.c +f:sound/soc/intel/boards/ehl_rt5660.c +f:sound/soc/intel/boards/hda_dsp_common.c +f:sound/soc/intel/boards/hda_dsp_common.h +f:sound/soc/intel/boards/hsw_rt5640.c +f:sound/soc/intel/boards/skl_hda_dsp_generic.c +f:sound/soc/intel/boards/sof_board_helpers.c +f:sound/soc/intel/boards/sof_board_helpers.h +f:sound/soc/intel/boards/sof_cirrus_common.c +f:sound/soc/intel/boards/sof_cirrus_common.h +f:sound/soc/intel/boards/sof_cs42l42.c +f:sound/soc/intel/boards/sof_da7219.c +f:sound/soc/intel/boards/sof_es8336.c +f:sound/soc/intel/boards/sof_hdmi_common.h +f:sound/soc/intel/boards/sof_maxim_common.c +f:sound/soc/intel/boards/sof_maxim_common.h +f:sound/soc/intel/boards/sof_nau8825.c +f:sound/soc/intel/boards/sof_nuvoton_common.c +f:sound/soc/intel/boards/sof_nuvoton_common.h +f:sound/soc/intel/boards/sof_pcm512x.c +f:sound/soc/intel/boards/sof_realtek_common.c +f:sound/soc/intel/boards/sof_realtek_common.h +f:sound/soc/intel/boards/sof_rt5682.c +f:sound/soc/intel/boards/sof_sdw.c +f:sound/soc/intel/boards/sof_sdw_common.h +f:sound/soc/intel/boards/sof_sdw_hdmi.c +f:sound/soc/intel/boards/sof_ssp_amp.c +f:sound/soc/intel/boards/sof_wm8804.c +f:sound/soc/intel/catpt/Makefile +f:sound/soc/intel/catpt/core.h +f:sound/soc/intel/catpt/device.c +f:sound/soc/intel/catpt/dsp.c +f:sound/soc/intel/catpt/ipc.c +f:sound/soc/intel/catpt/loader.c +f:sound/soc/intel/catpt/messages.c +f:sound/soc/intel/catpt/messages.h +f:sound/soc/intel/catpt/pcm.c +f:sound/soc/intel/catpt/registers.h +f:sound/soc/intel/catpt/sysfs.c +f:sound/soc/intel/catpt/trace.h +f:sound/soc/intel/common/Makefile +f:sound/soc/intel/common/soc-acpi-intel-adl-match.c +f:sound/soc/intel/common/soc-acpi-intel-arl-match.c +f:sound/soc/intel/common/soc-acpi-intel-bxt-match.c +f:sound/soc/intel/common/soc-acpi-intel-byt-match.c +f:sound/soc/intel/common/soc-acpi-intel-cfl-match.c +f:sound/soc/intel/common/soc-acpi-intel-cht-match.c +f:sound/soc/intel/common/soc-acpi-intel-cml-match.c +f:sound/soc/intel/common/soc-acpi-intel-cnl-match.c +f:sound/soc/intel/common/soc-acpi-intel-ehl-match.c +f:sound/soc/intel/common/soc-acpi-intel-glk-match.c +f:sound/soc/intel/common/soc-acpi-intel-hda-match.c +f:sound/soc/intel/common/soc-acpi-intel-hsw-bdw-match.c +f:sound/soc/intel/common/soc-acpi-intel-icl-match.c +f:sound/soc/intel/common/soc-acpi-intel-jsl-match.c +f:sound/soc/intel/common/soc-acpi-intel-kbl-match.c +f:sound/soc/intel/common/soc-acpi-intel-lnl-match.c +f:sound/soc/intel/common/soc-acpi-intel-mtl-match.c +f:sound/soc/intel/common/soc-acpi-intel-ptl-match.c +f:sound/soc/intel/common/soc-acpi-intel-rpl-match.c +f:sound/soc/intel/common/soc-acpi-intel-sdca-quirks.c +f:sound/soc/intel/common/soc-acpi-intel-sdca-quirks.h +f:sound/soc/intel/common/soc-acpi-intel-sdw-mockup-match.c +f:sound/soc/intel/common/soc-acpi-intel-sdw-mockup-match.h +f:sound/soc/intel/common/soc-acpi-intel-skl-match.c +f:sound/soc/intel/common/soc-acpi-intel-ssp-common.c +f:sound/soc/intel/common/soc-acpi-intel-tgl-match.c +f:sound/soc/intel/common/soc-intel-quirks.h +f:sound/soc/intel/common/sof-function-topology-lib.c +f:sound/soc/intel/common/sof-function-topology-lib.h +f:sound/soc/intel/keembay/Makefile +f:sound/soc/intel/keembay/kmb_platform.c +f:sound/soc/intel/keembay/kmb_platform.h +f:sound/soc/jz4740/Kconfig +f:sound/soc/jz4740/Makefile +f:sound/soc/jz4740/jz4740-i2s.c +f:sound/soc/kirkwood/Kconfig +f:sound/soc/kirkwood/Makefile +f:sound/soc/kirkwood/armada-370-db.c +f:sound/soc/kirkwood/kirkwood-dma.c +f:sound/soc/kirkwood/kirkwood-i2s.c +f:sound/soc/kirkwood/kirkwood.h +f:sound/soc/loongson/Kconfig +f:sound/soc/loongson/Makefile +f:sound/soc/loongson/loongson1_ac97.c +f:sound/soc/loongson/loongson_card.c +f:sound/soc/loongson/loongson_dma.c +f:sound/soc/loongson/loongson_dma.h +f:sound/soc/loongson/loongson_i2s.c +f:sound/soc/loongson/loongson_i2s.h +f:sound/soc/loongson/loongson_i2s_pci.c +f:sound/soc/loongson/loongson_i2s_plat.c +f:sound/soc/mediatek/Kconfig +f:sound/soc/mediatek/Makefile +f:sound/soc/mediatek/common/Makefile +f:sound/soc/mediatek/common/mtk-afe-fe-dai.c +f:sound/soc/mediatek/common/mtk-afe-fe-dai.h +f:sound/soc/mediatek/common/mtk-afe-platform-driver.c +f:sound/soc/mediatek/common/mtk-afe-platform-driver.h +f:sound/soc/mediatek/common/mtk-base-afe.h +f:sound/soc/mediatek/common/mtk-btcvsd.c +f:sound/soc/mediatek/common/mtk-dai-adda-common.c +f:sound/soc/mediatek/common/mtk-dai-adda-common.h +f:sound/soc/mediatek/common/mtk-dsp-sof-common.c +f:sound/soc/mediatek/common/mtk-dsp-sof-common.h +f:sound/soc/mediatek/common/mtk-soc-card.h +f:sound/soc/mediatek/common/mtk-soundcard-driver.c +f:sound/soc/mediatek/common/mtk-soundcard-driver.h +f:sound/soc/mediatek/mt2701/Makefile +f:sound/soc/mediatek/mt2701/mt2701-afe-clock-ctrl.c +f:sound/soc/mediatek/mt2701/mt2701-afe-clock-ctrl.h +f:sound/soc/mediatek/mt2701/mt2701-afe-common.h +f:sound/soc/mediatek/mt2701/mt2701-afe-pcm.c +f:sound/soc/mediatek/mt2701/mt2701-cs42448.c +f:sound/soc/mediatek/mt2701/mt2701-reg.h +f:sound/soc/mediatek/mt2701/mt2701-wm8960.c +f:sound/soc/mediatek/mt6797/Makefile +f:sound/soc/mediatek/mt6797/mt6797-afe-clk.c +f:sound/soc/mediatek/mt6797/mt6797-afe-clk.h +f:sound/soc/mediatek/mt6797/mt6797-afe-common.h +f:sound/soc/mediatek/mt6797/mt6797-afe-pcm.c +f:sound/soc/mediatek/mt6797/mt6797-dai-adda.c +f:sound/soc/mediatek/mt6797/mt6797-dai-hostless.c +f:sound/soc/mediatek/mt6797/mt6797-dai-pcm.c +f:sound/soc/mediatek/mt6797/mt6797-interconnection.h +f:sound/soc/mediatek/mt6797/mt6797-mt6351.c +f:sound/soc/mediatek/mt6797/mt6797-reg.h +f:sound/soc/mediatek/mt7986/Makefile +f:sound/soc/mediatek/mt7986/mt7986-afe-common.h +f:sound/soc/mediatek/mt7986/mt7986-afe-pcm.c +f:sound/soc/mediatek/mt7986/mt7986-dai-etdm.c +f:sound/soc/mediatek/mt7986/mt7986-reg.h +f:sound/soc/mediatek/mt7986/mt7986-wm8960.c +f:sound/soc/mediatek/mt8173/Makefile +f:sound/soc/mediatek/mt8173/mt8173-afe-common.h +f:sound/soc/mediatek/mt8173/mt8173-afe-pcm.c +f:sound/soc/mediatek/mt8173/mt8173-max98090.c +f:sound/soc/mediatek/mt8173/mt8173-rt5650-rt5514.c +f:sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c +f:sound/soc/mediatek/mt8173/mt8173-rt5650.c +f:sound/soc/mediatek/mt8183/Makefile +f:sound/soc/mediatek/mt8183/mt8183-afe-clk.c +f:sound/soc/mediatek/mt8183/mt8183-afe-clk.h +f:sound/soc/mediatek/mt8183/mt8183-afe-common.h +f:sound/soc/mediatek/mt8183/mt8183-afe-pcm.c +f:sound/soc/mediatek/mt8183/mt8183-da7219-max98357.c +f:sound/soc/mediatek/mt8183/mt8183-dai-adda.c +f:sound/soc/mediatek/mt8183/mt8183-dai-hostless.c +f:sound/soc/mediatek/mt8183/mt8183-dai-i2s.c +f:sound/soc/mediatek/mt8183/mt8183-dai-pcm.c +f:sound/soc/mediatek/mt8183/mt8183-dai-tdm.c +f:sound/soc/mediatek/mt8183/mt8183-interconnection.h +f:sound/soc/mediatek/mt8183/mt8183-mt6358-ts3a227-max98357.c +f:sound/soc/mediatek/mt8183/mt8183-reg.h +f:sound/soc/mediatek/mt8186/Makefile +f:sound/soc/mediatek/mt8186/mt8186-afe-clk.c +f:sound/soc/mediatek/mt8186/mt8186-afe-clk.h +f:sound/soc/mediatek/mt8186/mt8186-afe-common.h +f:sound/soc/mediatek/mt8186/mt8186-afe-control.c +f:sound/soc/mediatek/mt8186/mt8186-afe-gpio.c +f:sound/soc/mediatek/mt8186/mt8186-afe-gpio.h +f:sound/soc/mediatek/mt8186/mt8186-afe-pcm.c +f:sound/soc/mediatek/mt8186/mt8186-audsys-clk.c +f:sound/soc/mediatek/mt8186/mt8186-audsys-clk.h +f:sound/soc/mediatek/mt8186/mt8186-audsys-clkid.h +f:sound/soc/mediatek/mt8186/mt8186-dai-adda.c +f:sound/soc/mediatek/mt8186/mt8186-dai-hostless.c +f:sound/soc/mediatek/mt8186/mt8186-dai-hw-gain.c +f:sound/soc/mediatek/mt8186/mt8186-dai-i2s.c +f:sound/soc/mediatek/mt8186/mt8186-dai-pcm.c +f:sound/soc/mediatek/mt8186/mt8186-dai-src.c +f:sound/soc/mediatek/mt8186/mt8186-dai-tdm.c +f:sound/soc/mediatek/mt8186/mt8186-interconnection.h +f:sound/soc/mediatek/mt8186/mt8186-misc-control.c +f:sound/soc/mediatek/mt8186/mt8186-mt6366-common.c +f:sound/soc/mediatek/mt8186/mt8186-mt6366-common.h +f:sound/soc/mediatek/mt8186/mt8186-mt6366.c +f:sound/soc/mediatek/mt8186/mt8186-reg.h +f:sound/soc/mediatek/mt8188/Makefile +f:sound/soc/mediatek/mt8188/mt8188-afe-clk.c +f:sound/soc/mediatek/mt8188/mt8188-afe-clk.h +f:sound/soc/mediatek/mt8188/mt8188-afe-common.h +f:sound/soc/mediatek/mt8188/mt8188-afe-pcm.c +f:sound/soc/mediatek/mt8188/mt8188-audsys-clk.c +f:sound/soc/mediatek/mt8188/mt8188-audsys-clk.h +f:sound/soc/mediatek/mt8188/mt8188-audsys-clkid.h +f:sound/soc/mediatek/mt8188/mt8188-dai-adda.c +f:sound/soc/mediatek/mt8188/mt8188-dai-dmic.c +f:sound/soc/mediatek/mt8188/mt8188-dai-etdm.c +f:sound/soc/mediatek/mt8188/mt8188-dai-pcm.c +f:sound/soc/mediatek/mt8188/mt8188-mt6359.c +f:sound/soc/mediatek/mt8188/mt8188-reg.h +f:sound/soc/mediatek/mt8192/Makefile +f:sound/soc/mediatek/mt8192/mt8192-afe-clk.c +f:sound/soc/mediatek/mt8192/mt8192-afe-clk.h +f:sound/soc/mediatek/mt8192/mt8192-afe-common.h +f:sound/soc/mediatek/mt8192/mt8192-afe-control.c +f:sound/soc/mediatek/mt8192/mt8192-afe-gpio.c +f:sound/soc/mediatek/mt8192/mt8192-afe-gpio.h +f:sound/soc/mediatek/mt8192/mt8192-afe-pcm.c +f:sound/soc/mediatek/mt8192/mt8192-dai-adda.c +f:sound/soc/mediatek/mt8192/mt8192-dai-i2s.c +f:sound/soc/mediatek/mt8192/mt8192-dai-pcm.c +f:sound/soc/mediatek/mt8192/mt8192-dai-tdm.c +f:sound/soc/mediatek/mt8192/mt8192-interconnection.h +f:sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c +f:sound/soc/mediatek/mt8192/mt8192-reg.h +f:sound/soc/mediatek/mt8195/Makefile +f:sound/soc/mediatek/mt8195/mt8195-afe-clk.c +f:sound/soc/mediatek/mt8195/mt8195-afe-clk.h +f:sound/soc/mediatek/mt8195/mt8195-afe-common.h +f:sound/soc/mediatek/mt8195/mt8195-afe-pcm.c +f:sound/soc/mediatek/mt8195/mt8195-audsys-clk.c +f:sound/soc/mediatek/mt8195/mt8195-audsys-clk.h +f:sound/soc/mediatek/mt8195/mt8195-audsys-clkid.h +f:sound/soc/mediatek/mt8195/mt8195-dai-adda.c +f:sound/soc/mediatek/mt8195/mt8195-dai-etdm.c +f:sound/soc/mediatek/mt8195/mt8195-dai-pcm.c +f:sound/soc/mediatek/mt8195/mt8195-mt6359.c +f:sound/soc/mediatek/mt8195/mt8195-reg.h +f:sound/soc/mediatek/mt8365/Makefile +f:sound/soc/mediatek/mt8365/mt8365-afe-clk.c +f:sound/soc/mediatek/mt8365/mt8365-afe-clk.h +f:sound/soc/mediatek/mt8365/mt8365-afe-common.h +f:sound/soc/mediatek/mt8365/mt8365-afe-pcm.c +f:sound/soc/mediatek/mt8365/mt8365-dai-adda.c +f:sound/soc/mediatek/mt8365/mt8365-dai-dmic.c +f:sound/soc/mediatek/mt8365/mt8365-dai-i2s.c +f:sound/soc/mediatek/mt8365/mt8365-dai-pcm.c +f:sound/soc/mediatek/mt8365/mt8365-mt6357.c +f:sound/soc/mediatek/mt8365/mt8365-reg.h +f:sound/soc/meson/Kconfig +f:sound/soc/meson/Makefile +f:sound/soc/meson/aiu-acodec-ctrl.c +f:sound/soc/meson/aiu-codec-ctrl.c +f:sound/soc/meson/aiu-encoder-i2s.c +f:sound/soc/meson/aiu-encoder-spdif.c +f:sound/soc/meson/aiu-fifo-i2s.c +f:sound/soc/meson/aiu-fifo-spdif.c +f:sound/soc/meson/aiu-fifo.c +f:sound/soc/meson/aiu-fifo.h +f:sound/soc/meson/aiu.c +f:sound/soc/meson/aiu.h +f:sound/soc/meson/axg-card.c +f:sound/soc/meson/axg-fifo.c +f:sound/soc/meson/axg-fifo.h +f:sound/soc/meson/axg-frddr.c +f:sound/soc/meson/axg-pdm.c +f:sound/soc/meson/axg-spdifin.c +f:sound/soc/meson/axg-spdifout.c +f:sound/soc/meson/axg-tdm-formatter.c +f:sound/soc/meson/axg-tdm-formatter.h +f:sound/soc/meson/axg-tdm-interface.c +f:sound/soc/meson/axg-tdm.h +f:sound/soc/meson/axg-tdmin.c +f:sound/soc/meson/axg-tdmout.c +f:sound/soc/meson/axg-toddr.c +f:sound/soc/meson/g12a-toacodec.c +f:sound/soc/meson/g12a-tohdmitx.c +f:sound/soc/meson/gx-card.c +f:sound/soc/meson/meson-card-utils.c +f:sound/soc/meson/meson-card.h +f:sound/soc/meson/meson-codec-glue.c +f:sound/soc/meson/meson-codec-glue.h +f:sound/soc/meson/t9015.c +f:sound/soc/mxs/Kconfig +f:sound/soc/mxs/Makefile +f:sound/soc/mxs/mxs-pcm.c +f:sound/soc/mxs/mxs-pcm.h +f:sound/soc/mxs/mxs-saif.c +f:sound/soc/mxs/mxs-saif.h +f:sound/soc/mxs/mxs-sgtl5000.c +f:sound/soc/pxa/Kconfig +f:sound/soc/pxa/Makefile +f:sound/soc/pxa/mmp-sspa.c +f:sound/soc/pxa/mmp-sspa.h +f:sound/soc/pxa/pxa-ssp.c +f:sound/soc/pxa/pxa-ssp.h +f:sound/soc/pxa/pxa2xx-ac97.c +f:sound/soc/pxa/pxa2xx-i2s.c +f:sound/soc/pxa/pxa2xx-i2s.h +f:sound/soc/pxa/pxa2xx-pcm.c +f:sound/soc/pxa/spitz.c +f:sound/soc/qcom/Kconfig +f:sound/soc/qcom/Makefile +f:sound/soc/qcom/apq8016_sbc.c +f:sound/soc/qcom/apq8096.c +f:sound/soc/qcom/common.c +f:sound/soc/qcom/common.h +f:sound/soc/qcom/lpass-apq8016.c +f:sound/soc/qcom/lpass-cdc-dma.c +f:sound/soc/qcom/lpass-cpu.c +f:sound/soc/qcom/lpass-hdmi.c +f:sound/soc/qcom/lpass-hdmi.h +f:sound/soc/qcom/lpass-ipq806x.c +f:sound/soc/qcom/lpass-lpaif-reg.h +f:sound/soc/qcom/lpass-platform.c +f:sound/soc/qcom/lpass-sc7180.c +f:sound/soc/qcom/lpass-sc7280.c +f:sound/soc/qcom/lpass.h +f:sound/soc/qcom/qdsp6/Makefile +f:sound/soc/qcom/qdsp6/audioreach.c +f:sound/soc/qcom/qdsp6/audioreach.h +f:sound/soc/qcom/qdsp6/q6adm.c +f:sound/soc/qcom/qdsp6/q6adm.h +f:sound/soc/qcom/qdsp6/q6afe-clocks.c +f:sound/soc/qcom/qdsp6/q6afe-dai.c +f:sound/soc/qcom/qdsp6/q6afe.c +f:sound/soc/qcom/qdsp6/q6afe.h +f:sound/soc/qcom/qdsp6/q6apm-dai.c +f:sound/soc/qcom/qdsp6/q6apm-lpass-dais.c +f:sound/soc/qcom/qdsp6/q6apm.c +f:sound/soc/qcom/qdsp6/q6apm.h +f:sound/soc/qcom/qdsp6/q6asm-dai.c +f:sound/soc/qcom/qdsp6/q6asm.c +f:sound/soc/qcom/qdsp6/q6asm.h +f:sound/soc/qcom/qdsp6/q6core.c +f:sound/soc/qcom/qdsp6/q6core.h +f:sound/soc/qcom/qdsp6/q6dsp-common.c +f:sound/soc/qcom/qdsp6/q6dsp-common.h +f:sound/soc/qcom/qdsp6/q6dsp-errno.h +f:sound/soc/qcom/qdsp6/q6dsp-lpass-clocks.c +f:sound/soc/qcom/qdsp6/q6dsp-lpass-clocks.h +f:sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c +f:sound/soc/qcom/qdsp6/q6dsp-lpass-ports.h +f:sound/soc/qcom/qdsp6/q6prm-clocks.c +f:sound/soc/qcom/qdsp6/q6prm.c +f:sound/soc/qcom/qdsp6/q6prm.h +f:sound/soc/qcom/qdsp6/q6routing.c +f:sound/soc/qcom/qdsp6/q6routing.h +f:sound/soc/qcom/qdsp6/q6usb.c +f:sound/soc/qcom/qdsp6/topology.c +f:sound/soc/qcom/sc7180.c +f:sound/soc/qcom/sc7280.c +f:sound/soc/qcom/sc8280xp.c +f:sound/soc/qcom/sdm845.c +f:sound/soc/qcom/sdw.c +f:sound/soc/qcom/sdw.h +f:sound/soc/qcom/sm8250.c +f:sound/soc/qcom/storm.c +f:sound/soc/qcom/usb_offload_utils.c +f:sound/soc/qcom/usb_offload_utils.h +f:sound/soc/qcom/x1e80100.c +f:sound/soc/renesas/Kconfig +f:sound/soc/renesas/Makefile +f:sound/soc/renesas/dma-sh7760.c +f:sound/soc/renesas/fsi.c +f:sound/soc/renesas/hac.c +f:sound/soc/renesas/migor.c +f:sound/soc/renesas/rcar/Makefile +f:sound/soc/renesas/rcar/adg.c +f:sound/soc/renesas/rcar/cmd.c +f:sound/soc/renesas/rcar/core.c +f:sound/soc/renesas/rcar/ctu.c +f:sound/soc/renesas/rcar/debugfs.c +f:sound/soc/renesas/rcar/dma.c +f:sound/soc/renesas/rcar/dvc.c +f:sound/soc/renesas/rcar/gen.c +f:sound/soc/renesas/rcar/mix.c +f:sound/soc/renesas/rcar/msiof.c +f:sound/soc/renesas/rcar/rsnd.h +f:sound/soc/renesas/rcar/src.c +f:sound/soc/renesas/rcar/ssi.c +f:sound/soc/renesas/rcar/ssiu.c +f:sound/soc/renesas/rz-ssi.c +f:sound/soc/renesas/sh7760-ac97.c +f:sound/soc/renesas/siu.h +f:sound/soc/renesas/siu_dai.c +f:sound/soc/renesas/siu_pcm.c +f:sound/soc/renesas/ssi.c +f:sound/soc/rockchip/Kconfig +f:sound/soc/rockchip/Makefile +f:sound/soc/rockchip/rk3288_hdmi_analog.c +f:sound/soc/rockchip/rk3399_gru_sound.c +f:sound/soc/rockchip/rockchip_i2s.c +f:sound/soc/rockchip/rockchip_i2s.h +f:sound/soc/rockchip/rockchip_i2s_tdm.c +f:sound/soc/rockchip/rockchip_i2s_tdm.h +f:sound/soc/rockchip/rockchip_max98090.c +f:sound/soc/rockchip/rockchip_pdm.c +f:sound/soc/rockchip/rockchip_pdm.h +f:sound/soc/rockchip/rockchip_rt5645.c +f:sound/soc/rockchip/rockchip_sai.c +f:sound/soc/rockchip/rockchip_sai.h +f:sound/soc/rockchip/rockchip_spdif.c +f:sound/soc/rockchip/rockchip_spdif.h +f:sound/soc/samsung/Kconfig +f:sound/soc/samsung/Makefile +f:sound/soc/samsung/aries_wm8994.c +f:sound/soc/samsung/arndale.c +f:sound/soc/samsung/bells.c +f:sound/soc/samsung/dma.h +f:sound/soc/samsung/dmaengine.c +f:sound/soc/samsung/i2s-regs.h +f:sound/soc/samsung/i2s.c +f:sound/soc/samsung/i2s.h +f:sound/soc/samsung/idma.c +f:sound/soc/samsung/idma.h +f:sound/soc/samsung/littlemill.c +f:sound/soc/samsung/lowland.c +f:sound/soc/samsung/midas_wm1811.c +f:sound/soc/samsung/odroid.c +f:sound/soc/samsung/pcm.c +f:sound/soc/samsung/pcm.h +f:sound/soc/samsung/smdk_spdif.c +f:sound/soc/samsung/smdk_wm8994.c +f:sound/soc/samsung/smdk_wm8994pcm.c +f:sound/soc/samsung/snow.c +f:sound/soc/samsung/spdif.c +f:sound/soc/samsung/spdif.h +f:sound/soc/samsung/speyside.c +f:sound/soc/samsung/tm2_wm5110.c +f:sound/soc/samsung/tobermory.c +f:sound/soc/sdca/Kconfig +f:sound/soc/sdca/Makefile +f:sound/soc/sdca/sdca_asoc.c +f:sound/soc/sdca/sdca_device.c +f:sound/soc/sdca/sdca_functions.c +f:sound/soc/sdca/sdca_hid.c +f:sound/soc/sdca/sdca_interrupts.c +f:sound/soc/sdca/sdca_regmap.c +f:sound/soc/sdw_utils/Kconfig +f:sound/soc/sdw_utils/Makefile +f:sound/soc/sdw_utils/soc_sdw_bridge_cs35l56.c +f:sound/soc/sdw_utils/soc_sdw_cs42l42.c +f:sound/soc/sdw_utils/soc_sdw_cs42l43.c +f:sound/soc/sdw_utils/soc_sdw_cs_amp.c +f:sound/soc/sdw_utils/soc_sdw_dmic.c +f:sound/soc/sdw_utils/soc_sdw_maxim.c +f:sound/soc/sdw_utils/soc_sdw_rt5682.c +f:sound/soc/sdw_utils/soc_sdw_rt700.c +f:sound/soc/sdw_utils/soc_sdw_rt711.c +f:sound/soc/sdw_utils/soc_sdw_rt_amp.c +f:sound/soc/sdw_utils/soc_sdw_rt_amp_coeff_tables.h +f:sound/soc/sdw_utils/soc_sdw_rt_dmic.c +f:sound/soc/sdw_utils/soc_sdw_rt_mf_sdca.c +f:sound/soc/sdw_utils/soc_sdw_rt_sdca_jack_common.c +f:sound/soc/sdw_utils/soc_sdw_utils.c +f:sound/soc/soc-ac97.c +f:sound/soc/soc-acpi.c +f:sound/soc/soc-card-test.c +f:sound/soc/soc-card.c +f:sound/soc/soc-component.c +f:sound/soc/soc-compress.c +f:sound/soc/soc-core.c +f:sound/soc/soc-dai.c +f:sound/soc/soc-dapm.c +f:sound/soc/soc-devres.c +f:sound/soc/soc-generic-dmaengine-pcm.c +f:sound/soc/soc-jack.c +f:sound/soc/soc-link.c +f:sound/soc/soc-ops-test.c +f:sound/soc/soc-ops.c +f:sound/soc/soc-pcm.c +f:sound/soc/soc-topology-test.c +f:sound/soc/soc-topology.c +f:sound/soc/soc-usb.c +f:sound/soc/soc-utils-test.c +f:sound/soc/soc-utils.c +f:sound/soc/sof/Kconfig +f:sound/soc/sof/Makefile +f:sound/soc/sof/amd/Kconfig +f:sound/soc/sof/amd/Makefile +f:sound/soc/sof/amd/acp-common.c +f:sound/soc/sof/amd/acp-dsp-offset.h +f:sound/soc/sof/amd/acp-ipc.c +f:sound/soc/sof/amd/acp-loader.c +f:sound/soc/sof/amd/acp-pcm.c +f:sound/soc/sof/amd/acp-probes.c +f:sound/soc/sof/amd/acp-stream.c +f:sound/soc/sof/amd/acp-trace.c +f:sound/soc/sof/amd/acp.c +f:sound/soc/sof/amd/acp.h +f:sound/soc/sof/amd/acp63.c +f:sound/soc/sof/amd/acp70.c +f:sound/soc/sof/amd/pci-acp63.c +f:sound/soc/sof/amd/pci-acp70.c +f:sound/soc/sof/amd/pci-rmb.c +f:sound/soc/sof/amd/pci-rn.c +f:sound/soc/sof/amd/pci-vangogh.c +f:sound/soc/sof/amd/rembrandt.c +f:sound/soc/sof/amd/renoir.c +f:sound/soc/sof/amd/vangogh.c +f:sound/soc/sof/compress.c +f:sound/soc/sof/control.c +f:sound/soc/sof/core.c +f:sound/soc/sof/debug.c +f:sound/soc/sof/fw-file-profile.c +f:sound/soc/sof/imx/Kconfig +f:sound/soc/sof/imx/Makefile +f:sound/soc/sof/imx/imx-common.c +f:sound/soc/sof/imx/imx-common.h +f:sound/soc/sof/imx/imx8.c +f:sound/soc/sof/imx/imx9.c +f:sound/soc/sof/intel/Kconfig +f:sound/soc/sof/intel/Makefile +f:sound/soc/sof/intel/apl.c +f:sound/soc/sof/intel/atom.c +f:sound/soc/sof/intel/atom.h +f:sound/soc/sof/intel/bdw.c +f:sound/soc/sof/intel/byt.c +f:sound/soc/sof/intel/cnl.c +f:sound/soc/sof/intel/ext_manifest.h +f:sound/soc/sof/intel/hda-bus.c +f:sound/soc/sof/intel/hda-codec.c +f:sound/soc/sof/intel/hda-common-ops.c +f:sound/soc/sof/intel/hda-ctrl.c +f:sound/soc/sof/intel/hda-dai-ops.c +f:sound/soc/sof/intel/hda-dai.c +f:sound/soc/sof/intel/hda-dsp.c +f:sound/soc/sof/intel/hda-ipc.c +f:sound/soc/sof/intel/hda-ipc.h +f:sound/soc/sof/intel/hda-loader-skl.c +f:sound/soc/sof/intel/hda-loader.c +f:sound/soc/sof/intel/hda-mlink.c +f:sound/soc/sof/intel/hda-pcm.c +f:sound/soc/sof/intel/hda-probes.c +f:sound/soc/sof/intel/hda-sdw-bpt.c +f:sound/soc/sof/intel/hda-stream.c +f:sound/soc/sof/intel/hda-trace.c +f:sound/soc/sof/intel/hda.c +f:sound/soc/sof/intel/hda.h +f:sound/soc/sof/intel/icl.c +f:sound/soc/sof/intel/lnl.c +f:sound/soc/sof/intel/lnl.h +f:sound/soc/sof/intel/mtl.c +f:sound/soc/sof/intel/mtl.h +f:sound/soc/sof/intel/pci-apl.c +f:sound/soc/sof/intel/pci-cnl.c +f:sound/soc/sof/intel/pci-icl.c +f:sound/soc/sof/intel/pci-lnl.c +f:sound/soc/sof/intel/pci-mtl.c +f:sound/soc/sof/intel/pci-ptl.c +f:sound/soc/sof/intel/pci-skl.c +f:sound/soc/sof/intel/pci-tgl.c +f:sound/soc/sof/intel/pci-tng.c +f:sound/soc/sof/intel/ptl.c +f:sound/soc/sof/intel/ptl.h +f:sound/soc/sof/intel/shim.h +f:sound/soc/sof/intel/skl.c +f:sound/soc/sof/intel/telemetry.c +f:sound/soc/sof/intel/telemetry.h +f:sound/soc/sof/intel/tgl.c +f:sound/soc/sof/intel/tracepoints.c +f:sound/soc/sof/iomem-utils.c +f:sound/soc/sof/ipc.c +f:sound/soc/sof/ipc3-control.c +f:sound/soc/sof/ipc3-dtrace.c +f:sound/soc/sof/ipc3-loader.c +f:sound/soc/sof/ipc3-pcm.c +f:sound/soc/sof/ipc3-priv.h +f:sound/soc/sof/ipc3-topology.c +f:sound/soc/sof/ipc3.c +f:sound/soc/sof/ipc4-control.c +f:sound/soc/sof/ipc4-fw-reg.h +f:sound/soc/sof/ipc4-loader.c +f:sound/soc/sof/ipc4-mtrace.c +f:sound/soc/sof/ipc4-pcm.c +f:sound/soc/sof/ipc4-priv.h +f:sound/soc/sof/ipc4-telemetry.c +f:sound/soc/sof/ipc4-telemetry.h +f:sound/soc/sof/ipc4-topology.c +f:sound/soc/sof/ipc4-topology.h +f:sound/soc/sof/ipc4.c +f:sound/soc/sof/loader.c +f:sound/soc/sof/mediatek/Kconfig +f:sound/soc/sof/mediatek/Makefile +f:sound/soc/sof/mediatek/adsp_helper.h +f:sound/soc/sof/mediatek/mt8186/Makefile +f:sound/soc/sof/mediatek/mt8186/mt8186-clk.c +f:sound/soc/sof/mediatek/mt8186/mt8186-clk.h +f:sound/soc/sof/mediatek/mt8186/mt8186-loader.c +f:sound/soc/sof/mediatek/mt8186/mt8186.c +f:sound/soc/sof/mediatek/mt8186/mt8186.h +f:sound/soc/sof/mediatek/mt8195/Makefile +f:sound/soc/sof/mediatek/mt8195/mt8195-clk.c +f:sound/soc/sof/mediatek/mt8195/mt8195-clk.h +f:sound/soc/sof/mediatek/mt8195/mt8195-loader.c +f:sound/soc/sof/mediatek/mt8195/mt8195.c +f:sound/soc/sof/mediatek/mt8195/mt8195.h +f:sound/soc/sof/mediatek/mtk-adsp-common.c +f:sound/soc/sof/mediatek/mtk-adsp-common.h +f:sound/soc/sof/nocodec.c +f:sound/soc/sof/ops.c +f:sound/soc/sof/ops.h +f:sound/soc/sof/pcm.c +f:sound/soc/sof/pm.c +f:sound/soc/sof/sof-acpi-dev.c +f:sound/soc/sof/sof-acpi-dev.h +f:sound/soc/sof/sof-audio.c +f:sound/soc/sof/sof-audio.h +f:sound/soc/sof/sof-client-ipc-flood-test.c +f:sound/soc/sof/sof-client-ipc-kernel-injector.c +f:sound/soc/sof/sof-client-ipc-msg-injector.c +f:sound/soc/sof/sof-client-probes-ipc3.c +f:sound/soc/sof/sof-client-probes-ipc4.c +f:sound/soc/sof/sof-client-probes.c +f:sound/soc/sof/sof-client-probes.h +f:sound/soc/sof/sof-client.c +f:sound/soc/sof/sof-client.h +f:sound/soc/sof/sof-of-dev.c +f:sound/soc/sof/sof-of-dev.h +f:sound/soc/sof/sof-pci-dev.c +f:sound/soc/sof/sof-pci-dev.h +f:sound/soc/sof/sof-priv.h +f:sound/soc/sof/sof-utils.c +f:sound/soc/sof/sof-utils.h +f:sound/soc/sof/stream-ipc.c +f:sound/soc/sof/topology.c +f:sound/soc/sof/trace.c +f:sound/soc/sof/xtensa/Kconfig +f:sound/soc/sof/xtensa/Makefile +f:sound/soc/sof/xtensa/core.c +f:sound/soc/spear/Kconfig +f:sound/soc/spear/Makefile +f:sound/soc/spear/spdif_in.c +f:sound/soc/spear/spdif_in_regs.h +f:sound/soc/spear/spdif_out.c +f:sound/soc/spear/spdif_out_regs.h +f:sound/soc/spear/spear_pcm.c +f:sound/soc/spear/spear_pcm.h +f:sound/soc/sprd/Kconfig +f:sound/soc/sprd/Makefile +f:sound/soc/sprd/sprd-mcdt.c +f:sound/soc/sprd/sprd-mcdt.h +f:sound/soc/sprd/sprd-pcm-compress.c +f:sound/soc/sprd/sprd-pcm-dma.c +f:sound/soc/sprd/sprd-pcm-dma.h +f:sound/soc/starfive/Kconfig +f:sound/soc/starfive/Makefile +f:sound/soc/starfive/jh7110_pwmdac.c +f:sound/soc/starfive/jh7110_tdm.c +f:sound/soc/sti/Kconfig +f:sound/soc/sti/Makefile +f:sound/soc/sti/sti_uniperif.c +f:sound/soc/sti/uniperif.h +f:sound/soc/sti/uniperif_player.c +f:sound/soc/sti/uniperif_reader.c +f:sound/soc/stm/Kconfig +f:sound/soc/stm/Makefile +f:sound/soc/stm/stm32_adfsdm.c +f:sound/soc/stm/stm32_i2s.c +f:sound/soc/stm/stm32_sai.c +f:sound/soc/stm/stm32_sai.h +f:sound/soc/stm/stm32_sai_sub.c +f:sound/soc/stm/stm32_spdifrx.c +f:sound/soc/sunxi/Kconfig +f:sound/soc/sunxi/Makefile +f:sound/soc/sunxi/sun4i-codec.c +f:sound/soc/sunxi/sun4i-i2s.c +f:sound/soc/sunxi/sun4i-spdif.c +f:sound/soc/sunxi/sun50i-codec-analog.c +f:sound/soc/sunxi/sun50i-dmic.c +f:sound/soc/sunxi/sun8i-adda-pr-regmap.c +f:sound/soc/sunxi/sun8i-adda-pr-regmap.h +f:sound/soc/sunxi/sun8i-codec-analog.c +f:sound/soc/sunxi/sun8i-codec.c +f:sound/soc/tegra/Kconfig +f:sound/soc/tegra/Makefile +f:sound/soc/tegra/tegra186_asrc.c +f:sound/soc/tegra/tegra186_asrc.h +f:sound/soc/tegra/tegra186_dspk.c +f:sound/soc/tegra/tegra186_dspk.h +f:sound/soc/tegra/tegra20_ac97.c +f:sound/soc/tegra/tegra20_ac97.h +f:sound/soc/tegra/tegra20_das.c +f:sound/soc/tegra/tegra20_i2s.c +f:sound/soc/tegra/tegra20_i2s.h +f:sound/soc/tegra/tegra20_spdif.c +f:sound/soc/tegra/tegra20_spdif.h +f:sound/soc/tegra/tegra210_admaif.c +f:sound/soc/tegra/tegra210_admaif.h +f:sound/soc/tegra/tegra210_adx.c +f:sound/soc/tegra/tegra210_adx.h +f:sound/soc/tegra/tegra210_ahub.c +f:sound/soc/tegra/tegra210_ahub.h +f:sound/soc/tegra/tegra210_amx.c +f:sound/soc/tegra/tegra210_amx.h +f:sound/soc/tegra/tegra210_dmic.c +f:sound/soc/tegra/tegra210_dmic.h +f:sound/soc/tegra/tegra210_i2s.c +f:sound/soc/tegra/tegra210_i2s.h +f:sound/soc/tegra/tegra210_mbdrc.c +f:sound/soc/tegra/tegra210_mbdrc.h +f:sound/soc/tegra/tegra210_mixer.c +f:sound/soc/tegra/tegra210_mixer.h +f:sound/soc/tegra/tegra210_mvc.c +f:sound/soc/tegra/tegra210_mvc.h +f:sound/soc/tegra/tegra210_ope.c +f:sound/soc/tegra/tegra210_ope.h +f:sound/soc/tegra/tegra210_peq.c +f:sound/soc/tegra/tegra210_peq.h +f:sound/soc/tegra/tegra210_sfc.c +f:sound/soc/tegra/tegra210_sfc.h +f:sound/soc/tegra/tegra30_ahub.c +f:sound/soc/tegra/tegra30_ahub.h +f:sound/soc/tegra/tegra30_i2s.c +f:sound/soc/tegra/tegra30_i2s.h +f:sound/soc/tegra/tegra_asoc_machine.c +f:sound/soc/tegra/tegra_asoc_machine.h +f:sound/soc/tegra/tegra_audio_graph_card.c +f:sound/soc/tegra/tegra_cif.h +f:sound/soc/tegra/tegra_isomgr_bw.c +f:sound/soc/tegra/tegra_isomgr_bw.h +f:sound/soc/tegra/tegra_pcm.c +f:sound/soc/tegra/tegra_pcm.h +f:sound/soc/tegra/tegra_wm8903.c +f:sound/soc/ti/Kconfig +f:sound/soc/ti/Makefile +f:sound/soc/ti/ams-delta.c +f:sound/soc/ti/davinci-evm.c +f:sound/soc/ti/davinci-i2s.c +f:sound/soc/ti/davinci-i2s.h +f:sound/soc/ti/davinci-mcasp.c +f:sound/soc/ti/davinci-mcasp.h +f:sound/soc/ti/edma-pcm.c +f:sound/soc/ti/edma-pcm.h +f:sound/soc/ti/j721e-evm.c +f:sound/soc/ti/n810.c +f:sound/soc/ti/omap-abe-twl6040.c +f:sound/soc/ti/omap-dmic.c +f:sound/soc/ti/omap-dmic.h +f:sound/soc/ti/omap-hdmi.c +f:sound/soc/ti/omap-mcbsp-priv.h +f:sound/soc/ti/omap-mcbsp-st.c +f:sound/soc/ti/omap-mcbsp.c +f:sound/soc/ti/omap-mcbsp.h +f:sound/soc/ti/omap-mcpdm.c +f:sound/soc/ti/omap-mcpdm.h +f:sound/soc/ti/omap-twl4030.c +f:sound/soc/ti/omap3pandora.c +f:sound/soc/ti/osk5912.c +f:sound/soc/ti/rx51.c +f:sound/soc/ti/sdma-pcm.c +f:sound/soc/ti/sdma-pcm.h +f:sound/soc/ti/udma-pcm.c +f:sound/soc/ti/udma-pcm.h +f:sound/soc/uniphier/Kconfig +f:sound/soc/uniphier/Makefile +f:sound/soc/uniphier/aio-compress.c +f:sound/soc/uniphier/aio-core.c +f:sound/soc/uniphier/aio-cpu.c +f:sound/soc/uniphier/aio-dma.c +f:sound/soc/uniphier/aio-ld11.c +f:sound/soc/uniphier/aio-pxs2.c +f:sound/soc/uniphier/aio-reg.h +f:sound/soc/uniphier/aio.h +f:sound/soc/uniphier/evea.c +f:sound/soc/ux500/Kconfig +f:sound/soc/ux500/Makefile +f:sound/soc/ux500/mop500.c +f:sound/soc/ux500/mop500_ab8500.c +f:sound/soc/ux500/mop500_ab8500.h +f:sound/soc/ux500/ux500_msp_dai.c +f:sound/soc/ux500/ux500_msp_dai.h +f:sound/soc/ux500/ux500_msp_i2s.c +f:sound/soc/ux500/ux500_msp_i2s.h +f:sound/soc/ux500/ux500_pcm.c +f:sound/soc/ux500/ux500_pcm.h +f:sound/soc/xilinx/Kconfig +f:sound/soc/xilinx/Makefile +f:sound/soc/xilinx/xlnx_formatter_pcm.c +f:sound/soc/xilinx/xlnx_i2s.c +f:sound/soc/xilinx/xlnx_spdif.c +f:sound/soc/xtensa/Kconfig +f:sound/soc/xtensa/Makefile +f:sound/soc/xtensa/xtfpga-i2s.c +f:sound/sound_core.c +f:sound/sparc/Kconfig +f:sound/sparc/Makefile +f:sound/sparc/amd7930.c +f:sound/sparc/cs4231.c +f:sound/sparc/dbri.c +f:sound/spi/Kconfig +f:sound/spi/Makefile +f:sound/spi/at73c213.c +f:sound/spi/at73c213.h +f:sound/synth/Kconfig +f:sound/synth/Makefile +f:sound/synth/emux/Makefile +f:sound/synth/emux/emux.c +f:sound/synth/emux/emux_effect.c +f:sound/synth/emux/emux_hwdep.c +f:sound/synth/emux/emux_nrpn.c +f:sound/synth/emux/emux_oss.c +f:sound/synth/emux/emux_proc.c +f:sound/synth/emux/emux_seq.c +f:sound/synth/emux/emux_synth.c +f:sound/synth/emux/emux_voice.h +f:sound/synth/emux/soundfont.c +f:sound/synth/util_mem.c +f:sound/usb/6fire/Makefile +f:sound/usb/6fire/chip.c +f:sound/usb/6fire/chip.h +f:sound/usb/6fire/comm.c +f:sound/usb/6fire/comm.h +f:sound/usb/6fire/common.h +f:sound/usb/6fire/control.c +f:sound/usb/6fire/control.h +f:sound/usb/6fire/firmware.c +f:sound/usb/6fire/firmware.h +f:sound/usb/6fire/midi.c +f:sound/usb/6fire/midi.h +f:sound/usb/6fire/pcm.c +f:sound/usb/6fire/pcm.h +f:sound/usb/Kconfig +f:sound/usb/Makefile +f:sound/usb/bcd2000/Makefile +f:sound/usb/bcd2000/bcd2000.c +f:sound/usb/caiaq/Makefile +f:sound/usb/caiaq/audio.c +f:sound/usb/caiaq/audio.h +f:sound/usb/caiaq/control.c +f:sound/usb/caiaq/control.h +f:sound/usb/caiaq/device.c +f:sound/usb/caiaq/device.h +f:sound/usb/caiaq/input.c +f:sound/usb/caiaq/input.h +f:sound/usb/caiaq/midi.c +f:sound/usb/caiaq/midi.h +f:sound/usb/card.c +f:sound/usb/card.h +f:sound/usb/clock.c +f:sound/usb/clock.h +f:sound/usb/endpoint.c +f:sound/usb/endpoint.h +f:sound/usb/fcp.c +f:sound/usb/fcp.h +f:sound/usb/format.c +f:sound/usb/format.h +f:sound/usb/helper.c +f:sound/usb/helper.h +f:sound/usb/hiface/Makefile +f:sound/usb/hiface/chip.c +f:sound/usb/hiface/chip.h +f:sound/usb/hiface/pcm.c +f:sound/usb/hiface/pcm.h +f:sound/usb/implicit.c +f:sound/usb/implicit.h +f:sound/usb/line6/Kconfig +f:sound/usb/line6/Makefile +f:sound/usb/line6/capture.c +f:sound/usb/line6/capture.h +f:sound/usb/line6/driver.c +f:sound/usb/line6/driver.h +f:sound/usb/line6/midi.c +f:sound/usb/line6/midi.h +f:sound/usb/line6/midibuf.c +f:sound/usb/line6/midibuf.h +f:sound/usb/line6/pcm.c +f:sound/usb/line6/pcm.h +f:sound/usb/line6/playback.c +f:sound/usb/line6/playback.h +f:sound/usb/line6/pod.c +f:sound/usb/line6/podhd.c +f:sound/usb/line6/toneport.c +f:sound/usb/line6/variax.c +f:sound/usb/media.c +f:sound/usb/media.h +f:sound/usb/midi.c +f:sound/usb/midi.h +f:sound/usb/midi2.c +f:sound/usb/midi2.h +f:sound/usb/misc/Makefile +f:sound/usb/misc/ua101.c +f:sound/usb/mixer.c +f:sound/usb/mixer.h +f:sound/usb/mixer_maps.c +f:sound/usb/mixer_quirks.c +f:sound/usb/mixer_quirks.h +f:sound/usb/mixer_s1810c.c +f:sound/usb/mixer_s1810c.h +f:sound/usb/mixer_scarlett.c +f:sound/usb/mixer_scarlett.h +f:sound/usb/mixer_scarlett2.c +f:sound/usb/mixer_scarlett2.h +f:sound/usb/mixer_us16x08.c +f:sound/usb/mixer_us16x08.h +f:sound/usb/pcm.c +f:sound/usb/pcm.h +f:sound/usb/power.c +f:sound/usb/power.h +f:sound/usb/proc.c +f:sound/usb/proc.h +f:sound/usb/qcom/Makefile +f:sound/usb/qcom/mixer_usb_offload.c +f:sound/usb/qcom/mixer_usb_offload.h +f:sound/usb/qcom/qc_audio_offload.c +f:sound/usb/qcom/usb_audio_qmi_v01.c +f:sound/usb/qcom/usb_audio_qmi_v01.h +f:sound/usb/quirks-table.h +f:sound/usb/quirks.c +f:sound/usb/quirks.h +f:sound/usb/stream.c +f:sound/usb/stream.h +f:sound/usb/usbaudio.h +f:sound/usb/usx2y/Makefile +f:sound/usb/usx2y/us122l.c +f:sound/usb/usx2y/us122l.h +f:sound/usb/usx2y/usX2Yhwdep.c +f:sound/usb/usx2y/usX2Yhwdep.h +f:sound/usb/usx2y/usb_stream.c +f:sound/usb/usx2y/usb_stream.h +f:sound/usb/usx2y/usbus428ctldefs.h +f:sound/usb/usx2y/usbusx2y.c +f:sound/usb/usx2y/usbusx2y.h +f:sound/usb/usx2y/usbusx2yaudio.c +f:sound/usb/usx2y/usx2y.h +f:sound/usb/usx2y/usx2yhwdeppcm.c +f:sound/usb/usx2y/usx2yhwdeppcm.h +f:sound/usb/validate.c +f:sound/virtio/Kconfig +f:sound/virtio/Makefile +f:sound/virtio/virtio_card.c +f:sound/virtio/virtio_card.h +f:sound/virtio/virtio_chmap.c +f:sound/virtio/virtio_ctl_msg.c +f:sound/virtio/virtio_ctl_msg.h +f:sound/virtio/virtio_jack.c +f:sound/virtio/virtio_kctl.c +f:sound/virtio/virtio_pcm.c +f:sound/virtio/virtio_pcm.h +f:sound/virtio/virtio_pcm_msg.c +f:sound/virtio/virtio_pcm_ops.c +f:sound/x86/Kconfig +f:sound/x86/Makefile +f:sound/x86/intel_hdmi_audio.c +f:sound/x86/intel_hdmi_audio.h +f:sound/x86/intel_hdmi_lpe_audio.h +f:sound/xen/Kconfig +f:sound/xen/Makefile +f:sound/xen/xen_snd_front.c +f:sound/xen/xen_snd_front.h +f:sound/xen/xen_snd_front_alsa.c +f:sound/xen/xen_snd_front_alsa.h +f:sound/xen/xen_snd_front_cfg.c +f:sound/xen/xen_snd_front_cfg.h +f:sound/xen/xen_snd_front_evtchnl.c +f:sound/xen/xen_snd_front_evtchnl.h +f:tools/Makefile +f:tools/accounting/.gitignore +f:tools/accounting/Makefile +f:tools/accounting/getdelays.c +f:tools/accounting/procacct.c +f:tools/arch/alpha/include/asm/barrier.h +f:tools/arch/alpha/include/uapi/asm/bitsperlong.h +f:tools/arch/alpha/include/uapi/asm/errno.h +f:tools/arch/alpha/include/uapi/asm/mman.h +f:tools/arch/arc/include/uapi/asm/mman.h +f:tools/arch/arc/include/uapi/asm/unistd.h +f:tools/arch/arm/include/asm/barrier.h +f:tools/arch/arm/include/uapi/asm/kvm.h +f:tools/arch/arm/include/uapi/asm/mman.h +f:tools/arch/arm/include/uapi/asm/perf_regs.h +f:tools/arch/arm64/include/.gitignore +f:tools/arch/arm64/include/asm/barrier.h +f:tools/arch/arm64/include/asm/brk-imm.h +f:tools/arch/arm64/include/asm/cputype.h +f:tools/arch/arm64/include/asm/esr.h +f:tools/arch/arm64/include/asm/gpr-num.h +f:tools/arch/arm64/include/asm/sysreg.h +f:tools/arch/arm64/include/uapi/asm/bitsperlong.h +f:tools/arch/arm64/include/uapi/asm/kvm.h +f:tools/arch/arm64/include/uapi/asm/mman.h +f:tools/arch/arm64/include/uapi/asm/perf_regs.h +f:tools/arch/arm64/include/uapi/asm/unistd.h +f:tools/arch/arm64/tools/Makefile +f:tools/arch/csky/include/uapi/asm/perf_regs.h +f:tools/arch/hexagon/include/uapi/asm/mman.h +f:tools/arch/hexagon/include/uapi/asm/unistd.h +f:tools/arch/loongarch/include/asm/inst.h +f:tools/arch/loongarch/include/asm/orc_types.h +f:tools/arch/loongarch/include/uapi/asm/perf_regs.h +f:tools/arch/loongarch/include/uapi/asm/unistd.h +f:tools/arch/microblaze/include/uapi/asm/mman.h +f:tools/arch/mips/include/asm/barrier.h +f:tools/arch/mips/include/asm/errno.h +f:tools/arch/mips/include/uapi/asm/bitsperlong.h +f:tools/arch/mips/include/uapi/asm/errno.h +f:tools/arch/mips/include/uapi/asm/kvm.h +f:tools/arch/mips/include/uapi/asm/mman.h +f:tools/arch/mips/include/uapi/asm/perf_regs.h +f:tools/arch/parisc/include/uapi/asm/bitsperlong.h +f:tools/arch/parisc/include/uapi/asm/errno.h +f:tools/arch/parisc/include/uapi/asm/mman.h +f:tools/arch/powerpc/include/asm/barrier.h +f:tools/arch/powerpc/include/uapi/asm/bitsperlong.h +f:tools/arch/powerpc/include/uapi/asm/errno.h +f:tools/arch/powerpc/include/uapi/asm/kvm.h +f:tools/arch/powerpc/include/uapi/asm/mman.h +f:tools/arch/powerpc/include/uapi/asm/perf_regs.h +f:tools/arch/riscv/include/asm/barrier.h +f:tools/arch/riscv/include/asm/csr.h +f:tools/arch/riscv/include/asm/fence.h +f:tools/arch/riscv/include/asm/vdso/processor.h +f:tools/arch/riscv/include/uapi/asm/bitsperlong.h +f:tools/arch/riscv/include/uapi/asm/perf_regs.h +f:tools/arch/riscv/include/uapi/asm/unistd.h +f:tools/arch/s390/include/asm/barrier.h +f:tools/arch/s390/include/uapi/asm/bitsperlong.h +f:tools/arch/s390/include/uapi/asm/kvm.h +f:tools/arch/s390/include/uapi/asm/kvm_perf.h +f:tools/arch/s390/include/uapi/asm/mman.h +f:tools/arch/s390/include/uapi/asm/perf_regs.h +f:tools/arch/s390/include/uapi/asm/sie.h +f:tools/arch/sh/include/asm/barrier.h +f:tools/arch/sh/include/uapi/asm/mman.h +f:tools/arch/sparc/include/asm/barrier.h +f:tools/arch/sparc/include/asm/barrier_32.h +f:tools/arch/sparc/include/asm/barrier_64.h +f:tools/arch/sparc/include/uapi/asm/bitsperlong.h +f:tools/arch/sparc/include/uapi/asm/errno.h +f:tools/arch/sparc/include/uapi/asm/mman.h +f:tools/arch/x86/dell-uart-backlight-emulator/.gitignore +f:tools/arch/x86/dell-uart-backlight-emulator/Makefile +f:tools/arch/x86/dell-uart-backlight-emulator/README +f:tools/arch/x86/dell-uart-backlight-emulator/dell-uart-backlight-emulator.c +f:tools/arch/x86/include/asm/amd/ibs.h +f:tools/arch/x86/include/asm/asm.h +f:tools/arch/x86/include/asm/atomic.h +f:tools/arch/x86/include/asm/barrier.h +f:tools/arch/x86/include/asm/cmpxchg.h +f:tools/arch/x86/include/asm/cpufeatures.h +f:tools/arch/x86/include/asm/emulate_prefix.h +f:tools/arch/x86/include/asm/inat.h +f:tools/arch/x86/include/asm/inat_types.h +f:tools/arch/x86/include/asm/insn.h +f:tools/arch/x86/include/asm/msr-index.h +f:tools/arch/x86/include/asm/nops.h +f:tools/arch/x86/include/asm/orc_types.h +f:tools/arch/x86/include/asm/pvclock-abi.h +f:tools/arch/x86/include/asm/pvclock.h +f:tools/arch/x86/include/asm/rmwcc.h +f:tools/arch/x86/include/uapi/asm/bitsperlong.h +f:tools/arch/x86/include/uapi/asm/errno.h +f:tools/arch/x86/include/uapi/asm/kvm.h +f:tools/arch/x86/include/uapi/asm/kvm_perf.h +f:tools/arch/x86/include/uapi/asm/mman.h +f:tools/arch/x86/include/uapi/asm/perf_regs.h +f:tools/arch/x86/include/uapi/asm/svm.h +f:tools/arch/x86/include/uapi/asm/unistd.h +f:tools/arch/x86/include/uapi/asm/unistd_32.h +f:tools/arch/x86/include/uapi/asm/unistd_64.h +f:tools/arch/x86/include/uapi/asm/vmx.h +f:tools/arch/x86/intel_sdsi/Makefile +f:tools/arch/x86/intel_sdsi/intel_sdsi.c +f:tools/arch/x86/kcpuid/.gitignore +f:tools/arch/x86/kcpuid/Makefile +f:tools/arch/x86/kcpuid/cpuid.csv +f:tools/arch/x86/kcpuid/kcpuid.c +f:tools/arch/x86/lib/inat.c +f:tools/arch/x86/lib/insn.c +f:tools/arch/x86/lib/memcpy_64.S +f:tools/arch/x86/lib/memset_64.S +f:tools/arch/x86/lib/x86-opcode-map.txt +f:tools/arch/x86/tools/gen-insn-attr-x86.awk +f:tools/arch/xtensa/include/asm/barrier.h +f:tools/arch/xtensa/include/uapi/asm/mman.h +f:tools/bootconfig/.gitignore +f:tools/bootconfig/Makefile +f:tools/bootconfig/include/linux/bootconfig.h +f:tools/bootconfig/main.c +f:tools/bootconfig/samples/bad-array-space-comment.bconf +f:tools/bootconfig/samples/bad-array.bconf +f:tools/bootconfig/samples/bad-dotword.bconf +f:tools/bootconfig/samples/bad-empty.bconf +f:tools/bootconfig/samples/bad-keyerror.bconf +f:tools/bootconfig/samples/bad-longkey.bconf +f:tools/bootconfig/samples/bad-manywords.bconf +f:tools/bootconfig/samples/bad-no-keyword.bconf +f:tools/bootconfig/samples/bad-nonprintable.bconf +f:tools/bootconfig/samples/bad-samekey.bconf +f:tools/bootconfig/samples/bad-spaceword.bconf +f:tools/bootconfig/samples/bad-tree.bconf +f:tools/bootconfig/samples/bad-value.bconf +f:tools/bootconfig/samples/escaped.bconf +f:tools/bootconfig/samples/good-array-space-comment.bconf +f:tools/bootconfig/samples/good-comment-after-value.bconf +f:tools/bootconfig/samples/good-mixed-append.bconf +f:tools/bootconfig/samples/good-mixed-kv1.bconf +f:tools/bootconfig/samples/good-mixed-kv2.bconf +f:tools/bootconfig/samples/good-mixed-kv3.bconf +f:tools/bootconfig/samples/good-mixed-override.bconf +f:tools/bootconfig/samples/good-override.bconf +f:tools/bootconfig/samples/good-printables.bconf +f:tools/bootconfig/samples/good-simple.bconf +f:tools/bootconfig/samples/good-single.bconf +f:tools/bootconfig/samples/good-space-after-value.bconf +f:tools/bootconfig/samples/good-tree.bconf +f:tools/bootconfig/scripts/bconf2ftrace.sh +f:tools/bootconfig/scripts/ftrace.sh +f:tools/bootconfig/scripts/ftrace2bconf.sh +f:tools/bootconfig/scripts/xbc.sh +f:tools/bootconfig/test-bootconfig.sh +f:tools/bpf/.gitignore +f:tools/bpf/Makefile +f:tools/bpf/bpf_asm.c +f:tools/bpf/bpf_dbg.c +f:tools/bpf/bpf_exp.l +f:tools/bpf/bpf_exp.y +f:tools/bpf/bpf_jit_disasm.c +f:tools/bpf/bpftool/.gitignore +f:tools/bpf/bpftool/Documentation/Makefile +f:tools/bpf/bpftool/Documentation/bpftool-btf.rst +f:tools/bpf/bpftool/Documentation/bpftool-cgroup.rst +f:tools/bpf/bpftool/Documentation/bpftool-feature.rst +f:tools/bpf/bpftool/Documentation/bpftool-gen.rst +f:tools/bpf/bpftool/Documentation/bpftool-iter.rst +f:tools/bpf/bpftool/Documentation/bpftool-link.rst +f:tools/bpf/bpftool/Documentation/bpftool-map.rst +f:tools/bpf/bpftool/Documentation/bpftool-net.rst +f:tools/bpf/bpftool/Documentation/bpftool-perf.rst +f:tools/bpf/bpftool/Documentation/bpftool-prog.rst +f:tools/bpf/bpftool/Documentation/bpftool-struct_ops.rst +f:tools/bpf/bpftool/Documentation/bpftool.rst +f:tools/bpf/bpftool/Documentation/common_options.rst +f:tools/bpf/bpftool/Documentation/substitutions.rst +f:tools/bpf/bpftool/Makefile +f:tools/bpf/bpftool/bash-completion/bpftool +f:tools/bpf/bpftool/btf.c +f:tools/bpf/bpftool/btf_dumper.c +f:tools/bpf/bpftool/cfg.c +f:tools/bpf/bpftool/cfg.h +f:tools/bpf/bpftool/cgroup.c +f:tools/bpf/bpftool/common.c +f:tools/bpf/bpftool/feature.c +f:tools/bpf/bpftool/gen.c +f:tools/bpf/bpftool/iter.c +f:tools/bpf/bpftool/jit_disasm.c +f:tools/bpf/bpftool/json_writer.c +f:tools/bpf/bpftool/json_writer.h +f:tools/bpf/bpftool/link.c +f:tools/bpf/bpftool/main.c +f:tools/bpf/bpftool/main.h +f:tools/bpf/bpftool/map.c +f:tools/bpf/bpftool/map_perf_ring.c +f:tools/bpf/bpftool/net.c +f:tools/bpf/bpftool/netlink_dumper.c +f:tools/bpf/bpftool/netlink_dumper.h +f:tools/bpf/bpftool/perf.c +f:tools/bpf/bpftool/pids.c +f:tools/bpf/bpftool/prog.c +f:tools/bpf/bpftool/skeleton/pid_iter.bpf.c +f:tools/bpf/bpftool/skeleton/pid_iter.h +f:tools/bpf/bpftool/skeleton/profiler.bpf.c +f:tools/bpf/bpftool/struct_ops.c +f:tools/bpf/bpftool/tracelog.c +f:tools/bpf/bpftool/xlated_dumper.c +f:tools/bpf/bpftool/xlated_dumper.h +f:tools/bpf/resolve_btfids/.gitignore +f:tools/bpf/resolve_btfids/Build +f:tools/bpf/resolve_btfids/Makefile +f:tools/bpf/resolve_btfids/main.c +f:tools/bpf/runqslower/.gitignore +f:tools/bpf/runqslower/Makefile +f:tools/bpf/runqslower/runqslower.bpf.c +f:tools/bpf/runqslower/runqslower.c +f:tools/bpf/runqslower/runqslower.h +f:tools/build/.gitignore +f:tools/build/Build.include +f:tools/build/Documentation/Build.txt +f:tools/build/Makefile +f:tools/build/Makefile.build +f:tools/build/Makefile.feature +f:tools/build/Makefile.include +f:tools/build/feature/.gitignore +f:tools/build/feature/Makefile +f:tools/build/feature/test-all.c +f:tools/build/feature/test-backtrace.c +f:tools/build/feature/test-bionic.c +f:tools/build/feature/test-bpf.c +f:tools/build/feature/test-clang-bpf-co-re.c +f:tools/build/feature/test-compile.c +f:tools/build/feature/test-cplus-demangle.c +f:tools/build/feature/test-cxa-demangle.cpp +f:tools/build/feature/test-disassembler-four-args.c +f:tools/build/feature/test-disassembler-init-styled.c +f:tools/build/feature/test-eventfd.c +f:tools/build/feature/test-file-handle.c +f:tools/build/feature/test-fortify-source.c +f:tools/build/feature/test-get_cpuid.c +f:tools/build/feature/test-get_current_dir_name.c +f:tools/build/feature/test-gettid.c +f:tools/build/feature/test-glibc.c +f:tools/build/feature/test-gtk2-infobar.c +f:tools/build/feature/test-gtk2.c +f:tools/build/feature/test-hello.c +f:tools/build/feature/test-jvmti-cmlr.c +f:tools/build/feature/test-jvmti.c +f:tools/build/feature/test-libaio.c +f:tools/build/feature/test-libbabeltrace.c +f:tools/build/feature/test-libbfd-buildid.c +f:tools/build/feature/test-libbfd.c +f:tools/build/feature/test-libbpf.c +f:tools/build/feature/test-libcap.c +f:tools/build/feature/test-libcapstone.c +f:tools/build/feature/test-libcpupower.c +f:tools/build/feature/test-libcrypto.c +f:tools/build/feature/test-libdebuginfod.c +f:tools/build/feature/test-libdw.c +f:tools/build/feature/test-libelf-gelf_getnote.c +f:tools/build/feature/test-libelf-getphdrnum.c +f:tools/build/feature/test-libelf-getshdrstrndx.c +f:tools/build/feature/test-libelf-zstd.c +f:tools/build/feature/test-libelf.c +f:tools/build/feature/test-libnuma.c +f:tools/build/feature/test-libopencsd.c +f:tools/build/feature/test-libperl.c +f:tools/build/feature/test-libpfm4.c +f:tools/build/feature/test-libpython.c +f:tools/build/feature/test-libslang-include-subdir.c +f:tools/build/feature/test-libslang.c +f:tools/build/feature/test-libtraceevent.c +f:tools/build/feature/test-libtracefs.c +f:tools/build/feature/test-libunwind-aarch64.c +f:tools/build/feature/test-libunwind-arm.c +f:tools/build/feature/test-libunwind-debug-frame-aarch64.c +f:tools/build/feature/test-libunwind-debug-frame-arm.c +f:tools/build/feature/test-libunwind-debug-frame.c +f:tools/build/feature/test-libunwind-x86.c +f:tools/build/feature/test-libunwind-x86_64.c +f:tools/build/feature/test-libunwind.c +f:tools/build/feature/test-libzstd.c +f:tools/build/feature/test-llvm-perf.cpp +f:tools/build/feature/test-llvm.cpp +f:tools/build/feature/test-lzma.c +f:tools/build/feature/test-numa_num_possible_cpus.c +f:tools/build/feature/test-pthread-attr-setaffinity-np.c +f:tools/build/feature/test-pthread-barrier.c +f:tools/build/feature/test-reallocarray.c +f:tools/build/feature/test-scandirat.c +f:tools/build/feature/test-sched_getcpu.c +f:tools/build/feature/test-sdt.c +f:tools/build/feature/test-setns.c +f:tools/build/feature/test-stackprotector-all.c +f:tools/build/feature/test-timerfd.c +f:tools/build/feature/test-zlib.c +f:tools/build/fixdep.c +f:tools/build/tests/ex/Build +f:tools/build/tests/ex/Makefile +f:tools/build/tests/ex/a.c +f:tools/build/tests/ex/arch/Build +f:tools/build/tests/ex/arch/e.c +f:tools/build/tests/ex/arch/f.c +f:tools/build/tests/ex/b.c +f:tools/build/tests/ex/c.c +f:tools/build/tests/ex/d.c +f:tools/build/tests/ex/empty/Build +f:tools/build/tests/ex/empty2/README +f:tools/build/tests/ex/ex.c +f:tools/build/tests/ex/inc.c +f:tools/build/tests/run.sh +f:tools/certs/print-cert-tbs-hash.sh +f:tools/cgroup/.gitignore +f:tools/cgroup/iocost_coef_gen.py +f:tools/cgroup/iocost_monitor.py +f:tools/cgroup/memcg_shrinker.py +f:tools/cgroup/memcg_slabinfo.py +f:tools/counter/.gitignore +f:tools/counter/Build +f:tools/counter/Makefile +f:tools/counter/counter_example.c +f:tools/counter/counter_watch_events.c +f:tools/crypto/ccp/.gitignore +f:tools/crypto/ccp/Makefile +f:tools/crypto/ccp/dbc.c +f:tools/crypto/ccp/dbc.py +f:tools/crypto/ccp/dbc_cli.py +f:tools/crypto/ccp/test_dbc.py +f:tools/crypto/tcrypt/tcrypt_speed_compare.py +f:tools/debugging/Makefile +f:tools/debugging/kernel-chktaint +f:tools/firewire/Makefile +f:tools/firewire/decode-fcp.c +f:tools/firewire/list.h +f:tools/firewire/nosy-dump.c +f:tools/firewire/nosy-dump.h +f:tools/firmware/Makefile +f:tools/firmware/ihex2fw.c +f:tools/gpio/.gitignore +f:tools/gpio/Build +f:tools/gpio/Makefile +f:tools/gpio/gpio-event-mon.c +f:tools/gpio/gpio-hammer.c +f:tools/gpio/gpio-sloppy-logic-analyzer.sh +f:tools/gpio/gpio-utils.c +f:tools/gpio/gpio-utils.h +f:tools/gpio/gpio-watch.c +f:tools/gpio/lsgpio.c +f:tools/hv/.gitignore +f:tools/hv/Build +f:tools/hv/Makefile +f:tools/hv/hv_fcopy_uio_daemon.c +f:tools/hv/hv_get_dhcp_info.sh +f:tools/hv/hv_get_dns_info.sh +f:tools/hv/hv_kvp_daemon.c +f:tools/hv/hv_set_ifconfig.sh +f:tools/hv/hv_vss_daemon.c +f:tools/hv/lsvmbus +f:tools/hv/vmbus_bufring.c +f:tools/hv/vmbus_bufring.h +f:tools/hv/vmbus_testing +f:tools/iio/.gitignore +f:tools/iio/Build +f:tools/iio/Makefile +f:tools/iio/iio_event_monitor.c +f:tools/iio/iio_generic_buffer.c +f:tools/iio/iio_utils.c +f:tools/iio/iio_utils.h +f:tools/iio/lsiio.c +f:tools/include/asm-generic/atomic-gcc.h +f:tools/include/asm-generic/barrier.h +f:tools/include/asm-generic/bitops.h +f:tools/include/asm-generic/bitops/__ffs.h +f:tools/include/asm-generic/bitops/__ffz.h +f:tools/include/asm-generic/bitops/__fls.h +f:tools/include/asm-generic/bitops/arch_hweight.h +f:tools/include/asm-generic/bitops/atomic.h +f:tools/include/asm-generic/bitops/const_hweight.h +f:tools/include/asm-generic/bitops/fls.h +f:tools/include/asm-generic/bitops/fls64.h +f:tools/include/asm-generic/bitops/hweight.h +f:tools/include/asm-generic/bitops/non-atomic.h +f:tools/include/asm-generic/bitsperlong.h +f:tools/include/asm-generic/hugetlb_encode.h +f:tools/include/asm/alternative.h +f:tools/include/asm/atomic.h +f:tools/include/asm/barrier.h +f:tools/include/asm/bug.h +f:tools/include/asm/export.h +f:tools/include/asm/rwonce.h +f:tools/include/asm/sections.h +f:tools/include/asm/timex.h +f:tools/include/generated/asm-offsets.h +f:tools/include/generated/asm/cpucap-defs.h +f:tools/include/generated/asm/sysreg-defs.h +f:tools/include/io_uring/mini_liburing.h +f:tools/include/linux/align.h +f:tools/include/linux/arm-smccc.h +f:tools/include/linux/atomic.h +f:tools/include/linux/bitfield.h +f:tools/include/linux/bitmap.h +f:tools/include/linux/bitops.h +f:tools/include/linux/bits.h +f:tools/include/linux/btf_ids.h +f:tools/include/linux/bug.h +f:tools/include/linux/build_bug.h +f:tools/include/linux/cache.h +f:tools/include/linux/cfi_types.h +f:tools/include/linux/compiler-gcc.h +f:tools/include/linux/compiler.h +f:tools/include/linux/compiler_types.h +f:tools/include/linux/const.h +f:tools/include/linux/container_of.h +f:tools/include/linux/coresight-pmu.h +f:tools/include/linux/ctype.h +f:tools/include/linux/debugfs.h +f:tools/include/linux/delay.h +f:tools/include/linux/err.h +f:tools/include/linux/export.h +f:tools/include/linux/filter.h +f:tools/include/linux/find.h +f:tools/include/linux/ftrace.h +f:tools/include/linux/gfp.h +f:tools/include/linux/gfp_types.h +f:tools/include/linux/hash.h +f:tools/include/linux/hashtable.h +f:tools/include/linux/init.h +f:tools/include/linux/interrupt.h +f:tools/include/linux/interval_tree_generic.h +f:tools/include/linux/io.h +f:tools/include/linux/jhash.h +f:tools/include/linux/kallsyms.h +f:tools/include/linux/kasan-tags.h +f:tools/include/linux/kconfig.h +f:tools/include/linux/kern_levels.h +f:tools/include/linux/kernel.h +f:tools/include/linux/linkage.h +f:tools/include/linux/list.h +f:tools/include/linux/list_sort.h +f:tools/include/linux/log2.h +f:tools/include/linux/math.h +f:tools/include/linux/math64.h +f:tools/include/linux/mm.h +f:tools/include/linux/module.h +f:tools/include/linux/moduleparam.h +f:tools/include/linux/mutex.h +f:tools/include/linux/nmi.h +f:tools/include/linux/numa.h +f:tools/include/linux/objtool_types.h +f:tools/include/linux/overflow.h +f:tools/include/linux/panic.h +f:tools/include/linux/pfn.h +f:tools/include/linux/poison.h +f:tools/include/linux/prandom.h +f:tools/include/linux/rbtree.h +f:tools/include/linux/rbtree_augmented.h +f:tools/include/linux/rcu.h +f:tools/include/linux/refcount.h +f:tools/include/linux/ring_buffer.h +f:tools/include/linux/rwsem.h +f:tools/include/linux/sched/clock.h +f:tools/include/linux/sched/mm.h +f:tools/include/linux/sched/task.h +f:tools/include/linux/seq_file.h +f:tools/include/linux/sizes.h +f:tools/include/linux/slab.h +f:tools/include/linux/spinlock.h +f:tools/include/linux/static_call_types.h +f:tools/include/linux/string.h +f:tools/include/linux/stringify.h +f:tools/include/linux/time64.h +f:tools/include/linux/types.h +f:tools/include/linux/unaligned.h +f:tools/include/linux/unaligned/packed_struct.h +f:tools/include/linux/zalloc.h +f:tools/include/nolibc/.gitignore +f:tools/include/nolibc/Makefile +f:tools/include/nolibc/arch-arm.h +f:tools/include/nolibc/arch-arm64.h +f:tools/include/nolibc/arch-loongarch.h +f:tools/include/nolibc/arch-m68k.h +f:tools/include/nolibc/arch-mips.h +f:tools/include/nolibc/arch-powerpc.h +f:tools/include/nolibc/arch-riscv.h +f:tools/include/nolibc/arch-s390.h +f:tools/include/nolibc/arch-sh.h +f:tools/include/nolibc/arch-sparc.h +f:tools/include/nolibc/arch-x86.h +f:tools/include/nolibc/arch.h +f:tools/include/nolibc/compiler.h +f:tools/include/nolibc/crt.h +f:tools/include/nolibc/ctype.h +f:tools/include/nolibc/dirent.h +f:tools/include/nolibc/elf.h +f:tools/include/nolibc/errno.h +f:tools/include/nolibc/fcntl.h +f:tools/include/nolibc/getopt.h +f:tools/include/nolibc/limits.h +f:tools/include/nolibc/math.h +f:tools/include/nolibc/nolibc.h +f:tools/include/nolibc/poll.h +f:tools/include/nolibc/sched.h +f:tools/include/nolibc/signal.h +f:tools/include/nolibc/stackprotector.h +f:tools/include/nolibc/std.h +f:tools/include/nolibc/stdarg.h +f:tools/include/nolibc/stdbool.h +f:tools/include/nolibc/stddef.h +f:tools/include/nolibc/stdint.h +f:tools/include/nolibc/stdio.h +f:tools/include/nolibc/stdlib.h +f:tools/include/nolibc/string.h +f:tools/include/nolibc/sys.h +f:tools/include/nolibc/sys/auxv.h +f:tools/include/nolibc/sys/ioctl.h +f:tools/include/nolibc/sys/mman.h +f:tools/include/nolibc/sys/mount.h +f:tools/include/nolibc/sys/prctl.h +f:tools/include/nolibc/sys/random.h +f:tools/include/nolibc/sys/reboot.h +f:tools/include/nolibc/sys/resource.h +f:tools/include/nolibc/sys/stat.h +f:tools/include/nolibc/sys/syscall.h +f:tools/include/nolibc/sys/sysmacros.h +f:tools/include/nolibc/sys/time.h +f:tools/include/nolibc/sys/timerfd.h +f:tools/include/nolibc/sys/types.h +f:tools/include/nolibc/sys/utsname.h +f:tools/include/nolibc/sys/wait.h +f:tools/include/nolibc/time.h +f:tools/include/nolibc/types.h +f:tools/include/nolibc/unistd.h +f:tools/include/perf/arm_pmuv3.h +f:tools/include/tools/be_byteshift.h +f:tools/include/tools/config.h +f:tools/include/tools/dis-asm-compat.h +f:tools/include/tools/endian.h +f:tools/include/tools/le_byteshift.h +f:tools/include/tools/libc_compat.h +f:tools/include/trace/events/lock.h +f:tools/include/uapi/README +f:tools/include/uapi/asm-generic/bitsperlong.h +f:tools/include/uapi/asm-generic/bpf_perf_event.h +f:tools/include/uapi/asm-generic/errno-base.h +f:tools/include/uapi/asm-generic/errno.h +f:tools/include/uapi/asm-generic/ioctls.h +f:tools/include/uapi/asm-generic/mman-common-tools.h +f:tools/include/uapi/asm-generic/mman-common.h +f:tools/include/uapi/asm-generic/mman.h +f:tools/include/uapi/asm-generic/socket.h +f:tools/include/uapi/asm-generic/unistd.h +f:tools/include/uapi/asm/bitsperlong.h +f:tools/include/uapi/asm/bpf_perf_event.h +f:tools/include/uapi/asm/errno.h +f:tools/include/uapi/drm/drm.h +f:tools/include/uapi/drm/i915_drm.h +f:tools/include/uapi/linux/bits.h +f:tools/include/uapi/linux/bpf.h +f:tools/include/uapi/linux/bpf_common.h +f:tools/include/uapi/linux/bpf_perf_event.h +f:tools/include/uapi/linux/btf.h +f:tools/include/uapi/linux/const.h +f:tools/include/uapi/linux/coredump.h +f:tools/include/uapi/linux/elf.h +f:tools/include/uapi/linux/erspan.h +f:tools/include/uapi/linux/fadvise.h +f:tools/include/uapi/linux/fanotify.h +f:tools/include/uapi/linux/filter.h +f:tools/include/uapi/linux/fs.h +f:tools/include/uapi/linux/fscrypt.h +f:tools/include/uapi/linux/hw_breakpoint.h +f:tools/include/uapi/linux/if_link.h +f:tools/include/uapi/linux/if_tun.h +f:tools/include/uapi/linux/if_xdp.h +f:tools/include/uapi/linux/in.h +f:tools/include/uapi/linux/io_uring.h +f:tools/include/uapi/linux/kcmp.h +f:tools/include/uapi/linux/kvm.h +f:tools/include/uapi/linux/memfd.h +f:tools/include/uapi/linux/mman.h +f:tools/include/uapi/linux/mount.h +f:tools/include/uapi/linux/netdev.h +f:tools/include/uapi/linux/netlink.h +f:tools/include/uapi/linux/nsfs.h +f:tools/include/uapi/linux/perf_event.h +f:tools/include/uapi/linux/pkt_cls.h +f:tools/include/uapi/linux/pkt_sched.h +f:tools/include/uapi/linux/prctl.h +f:tools/include/uapi/linux/seccomp.h +f:tools/include/uapi/linux/seg6.h +f:tools/include/uapi/linux/seg6_local.h +f:tools/include/uapi/linux/stat.h +f:tools/include/uapi/linux/stddef.h +f:tools/include/uapi/linux/tc_act/tc_bpf.h +f:tools/include/uapi/linux/tcp.h +f:tools/include/uapi/linux/tls.h +f:tools/include/uapi/linux/types.h +f:tools/include/uapi/linux/userfaultfd.h +f:tools/include/vdso/bits.h +f:tools/include/vdso/const.h +f:tools/include/vdso/unaligned.h +f:tools/kvm/kvm_stat/Makefile +f:tools/kvm/kvm_stat/kvm_stat +f:tools/kvm/kvm_stat/kvm_stat.service +f:tools/kvm/kvm_stat/kvm_stat.txt +f:tools/laptop/dslm/.gitignore +f:tools/laptop/dslm/Makefile +f:tools/laptop/dslm/dslm.c +f:tools/laptop/freefall/Makefile +f:tools/laptop/freefall/freefall.c +f:tools/leds/.gitignore +f:tools/leds/Makefile +f:tools/leds/get_led_device_info.sh +f:tools/leds/led_hw_brightness_mon.c +f:tools/leds/uledmon.c +f:tools/lib/api/Build +f:tools/lib/api/Makefile +f:tools/lib/api/cpu.c +f:tools/lib/api/cpu.h +f:tools/lib/api/debug-internal.h +f:tools/lib/api/debug.c +f:tools/lib/api/debug.h +f:tools/lib/api/fd/Build +f:tools/lib/api/fd/array.c +f:tools/lib/api/fd/array.h +f:tools/lib/api/fs/Build +f:tools/lib/api/fs/cgroup.c +f:tools/lib/api/fs/fs.c +f:tools/lib/api/fs/fs.h +f:tools/lib/api/fs/tracing_path.c +f:tools/lib/api/fs/tracing_path.h +f:tools/lib/api/io.h +f:tools/lib/api/io_dir.h +f:tools/lib/argv_split.c +f:tools/lib/bitmap.c +f:tools/lib/bpf/.gitignore +f:tools/lib/bpf/Build +f:tools/lib/bpf/Makefile +f:tools/lib/bpf/bpf.c +f:tools/lib/bpf/bpf.h +f:tools/lib/bpf/bpf_core_read.h +f:tools/lib/bpf/bpf_endian.h +f:tools/lib/bpf/bpf_gen_internal.h +f:tools/lib/bpf/bpf_helpers.h +f:tools/lib/bpf/bpf_prog_linfo.c +f:tools/lib/bpf/bpf_tracing.h +f:tools/lib/bpf/btf.c +f:tools/lib/bpf/btf.h +f:tools/lib/bpf/btf_dump.c +f:tools/lib/bpf/btf_iter.c +f:tools/lib/bpf/btf_relocate.c +f:tools/lib/bpf/elf.c +f:tools/lib/bpf/features.c +f:tools/lib/bpf/gen_loader.c +f:tools/lib/bpf/hashmap.c +f:tools/lib/bpf/hashmap.h +f:tools/lib/bpf/libbpf.c +f:tools/lib/bpf/libbpf.h +f:tools/lib/bpf/libbpf.map +f:tools/lib/bpf/libbpf.pc.template +f:tools/lib/bpf/libbpf_common.h +f:tools/lib/bpf/libbpf_errno.c +f:tools/lib/bpf/libbpf_internal.h +f:tools/lib/bpf/libbpf_legacy.h +f:tools/lib/bpf/libbpf_probes.c +f:tools/lib/bpf/libbpf_version.h +f:tools/lib/bpf/linker.c +f:tools/lib/bpf/netlink.c +f:tools/lib/bpf/nlattr.c +f:tools/lib/bpf/nlattr.h +f:tools/lib/bpf/relo_core.c +f:tools/lib/bpf/relo_core.h +f:tools/lib/bpf/ringbuf.c +f:tools/lib/bpf/skel_internal.h +f:tools/lib/bpf/str_error.c +f:tools/lib/bpf/str_error.h +f:tools/lib/bpf/strset.c +f:tools/lib/bpf/strset.h +f:tools/lib/bpf/usdt.bpf.h +f:tools/lib/bpf/usdt.c +f:tools/lib/bpf/zip.c +f:tools/lib/bpf/zip.h +f:tools/lib/cmdline.c +f:tools/lib/ctype.c +f:tools/lib/find_bit.c +f:tools/lib/hweight.c +f:tools/lib/list_sort.c +f:tools/lib/perf/.gitignore +f:tools/lib/perf/Build +f:tools/lib/perf/Documentation/Makefile +f:tools/lib/perf/Documentation/asciidoc.conf +f:tools/lib/perf/Documentation/examples/counting.c +f:tools/lib/perf/Documentation/examples/sampling.c +f:tools/lib/perf/Documentation/libperf-counting.txt +f:tools/lib/perf/Documentation/libperf-sampling.txt +f:tools/lib/perf/Documentation/libperf.txt +f:tools/lib/perf/Documentation/manpage-1.72.xsl +f:tools/lib/perf/Documentation/manpage-base.xsl +f:tools/lib/perf/Documentation/manpage-bold-literal.xsl +f:tools/lib/perf/Documentation/manpage-normal.xsl +f:tools/lib/perf/Documentation/manpage-suppress-sp.xsl +f:tools/lib/perf/Makefile +f:tools/lib/perf/core.c +f:tools/lib/perf/cpumap.c +f:tools/lib/perf/evlist.c +f:tools/lib/perf/evsel.c +f:tools/lib/perf/include/internal/cpumap.h +f:tools/lib/perf/include/internal/evlist.h +f:tools/lib/perf/include/internal/evsel.h +f:tools/lib/perf/include/internal/lib.h +f:tools/lib/perf/include/internal/mmap.h +f:tools/lib/perf/include/internal/rc_check.h +f:tools/lib/perf/include/internal/tests.h +f:tools/lib/perf/include/internal/threadmap.h +f:tools/lib/perf/include/internal/xyarray.h +f:tools/lib/perf/include/perf/bpf_perf.h +f:tools/lib/perf/include/perf/core.h +f:tools/lib/perf/include/perf/cpumap.h +f:tools/lib/perf/include/perf/event.h +f:tools/lib/perf/include/perf/evlist.h +f:tools/lib/perf/include/perf/evsel.h +f:tools/lib/perf/include/perf/mmap.h +f:tools/lib/perf/include/perf/threadmap.h +f:tools/lib/perf/internal.h +f:tools/lib/perf/lib.c +f:tools/lib/perf/libperf.map +f:tools/lib/perf/libperf.pc.template +f:tools/lib/perf/mmap.c +f:tools/lib/perf/tests/Build +f:tools/lib/perf/tests/main.c +f:tools/lib/perf/tests/test-cpumap.c +f:tools/lib/perf/tests/test-evlist.c +f:tools/lib/perf/tests/test-evsel.c +f:tools/lib/perf/tests/test-threadmap.c +f:tools/lib/perf/tests/tests.h +f:tools/lib/perf/threadmap.c +f:tools/lib/perf/xyarray.c +f:tools/lib/rbtree.c +f:tools/lib/slab.c +f:tools/lib/str_error_r.c +f:tools/lib/string.c +f:tools/lib/subcmd/Build +f:tools/lib/subcmd/Makefile +f:tools/lib/subcmd/exec-cmd.c +f:tools/lib/subcmd/exec-cmd.h +f:tools/lib/subcmd/help.c +f:tools/lib/subcmd/help.h +f:tools/lib/subcmd/pager.c +f:tools/lib/subcmd/pager.h +f:tools/lib/subcmd/parse-options.c +f:tools/lib/subcmd/parse-options.h +f:tools/lib/subcmd/run-command.c +f:tools/lib/subcmd/run-command.h +f:tools/lib/subcmd/sigchain.c +f:tools/lib/subcmd/sigchain.h +f:tools/lib/subcmd/subcmd-config.c +f:tools/lib/subcmd/subcmd-config.h +f:tools/lib/subcmd/subcmd-util.h +f:tools/lib/symbol/Build +f:tools/lib/symbol/Makefile +f:tools/lib/symbol/kallsyms.c +f:tools/lib/symbol/kallsyms.h +f:tools/lib/thermal/.gitignore +f:tools/lib/thermal/Build +f:tools/lib/thermal/Makefile +f:tools/lib/thermal/commands.c +f:tools/lib/thermal/events.c +f:tools/lib/thermal/include/thermal.h +f:tools/lib/thermal/libthermal.map +f:tools/lib/thermal/libthermal.pc.template +f:tools/lib/thermal/sampling.c +f:tools/lib/thermal/thermal.c +f:tools/lib/thermal/thermal_nl.c +f:tools/lib/thermal/thermal_nl.h +f:tools/lib/vsprintf.c +f:tools/lib/zalloc.c +f:tools/memory-model/.gitignore +f:tools/memory-model/Documentation/README +f:tools/memory-model/Documentation/access-marking.txt +f:tools/memory-model/Documentation/cheatsheet.txt +f:tools/memory-model/Documentation/control-dependencies.txt +f:tools/memory-model/Documentation/explanation.txt +f:tools/memory-model/Documentation/glossary.txt +f:tools/memory-model/Documentation/herd-representation.txt +f:tools/memory-model/Documentation/litmus-tests.txt +f:tools/memory-model/Documentation/locking.txt +f:tools/memory-model/Documentation/ordering.txt +f:tools/memory-model/Documentation/recipes.txt +f:tools/memory-model/Documentation/references.txt +f:tools/memory-model/Documentation/simple.txt +f:tools/memory-model/README +f:tools/memory-model/linux-kernel.bell +f:tools/memory-model/linux-kernel.cat +f:tools/memory-model/linux-kernel.cfg +f:tools/memory-model/linux-kernel.def +f:tools/memory-model/litmus-tests/.gitignore +f:tools/memory-model/litmus-tests/CoRR+poonceonce+Once.litmus +f:tools/memory-model/litmus-tests/CoRW+poonceonce+Once.litmus +f:tools/memory-model/litmus-tests/CoWR+poonceonce+Once.litmus +f:tools/memory-model/litmus-tests/CoWW+poonceonce.litmus +f:tools/memory-model/litmus-tests/IRIW+fencembonceonces+OnceOnce.litmus +f:tools/memory-model/litmus-tests/IRIW+poonceonces+OnceOnce.litmus +f:tools/memory-model/litmus-tests/ISA2+pooncelock+pooncelock+pombonce.litmus +f:tools/memory-model/litmus-tests/ISA2+poonceonces.litmus +f:tools/memory-model/litmus-tests/ISA2+pooncerelease+poacquirerelease+poacquireonce.litmus +f:tools/memory-model/litmus-tests/LB+fencembonceonce+ctrlonceonce.litmus +f:tools/memory-model/litmus-tests/LB+poacquireonce+pooncerelease.litmus +f:tools/memory-model/litmus-tests/LB+poonceonces.litmus +f:tools/memory-model/litmus-tests/LB+unlocklockonceonce+poacquireonce.litmus +f:tools/memory-model/litmus-tests/MP+fencewmbonceonce+fencermbonceonce.litmus +f:tools/memory-model/litmus-tests/MP+onceassign+derefonce.litmus +f:tools/memory-model/litmus-tests/MP+polockmbonce+poacquiresilsil.litmus +f:tools/memory-model/litmus-tests/MP+polockonce+poacquiresilsil.litmus +f:tools/memory-model/litmus-tests/MP+polocks.litmus +f:tools/memory-model/litmus-tests/MP+poonceonces.litmus +f:tools/memory-model/litmus-tests/MP+pooncerelease+poacquireonce.litmus +f:tools/memory-model/litmus-tests/MP+porevlocks.litmus +f:tools/memory-model/litmus-tests/MP+unlocklockonceonce+fencermbonceonce.litmus +f:tools/memory-model/litmus-tests/R+fencembonceonces.litmus +f:tools/memory-model/litmus-tests/R+poonceonces.litmus +f:tools/memory-model/litmus-tests/README +f:tools/memory-model/litmus-tests/S+fencewmbonceonce+poacquireonce.litmus +f:tools/memory-model/litmus-tests/S+poonceonces.litmus +f:tools/memory-model/litmus-tests/SB+fencembonceonces.litmus +f:tools/memory-model/litmus-tests/SB+poonceonces.litmus +f:tools/memory-model/litmus-tests/SB+rfionceonce-poonceonces.litmus +f:tools/memory-model/litmus-tests/WRC+poonceonces+Once.litmus +f:tools/memory-model/litmus-tests/WRC+pooncerelease+fencermbonceonce+Once.litmus +f:tools/memory-model/litmus-tests/Z6.0+pooncelock+pooncelock+pombonce.litmus +f:tools/memory-model/litmus-tests/Z6.0+pooncerelease+poacquirerelease+fencembonceonce.litmus +f:tools/memory-model/litmus-tests/dep+plain.litmus +f:tools/memory-model/lock.cat +f:tools/memory-model/scripts/README +f:tools/memory-model/scripts/checkalllitmus.sh +f:tools/memory-model/scripts/checkghlitmus.sh +f:tools/memory-model/scripts/checklitmus.sh +f:tools/memory-model/scripts/checklitmushist.sh +f:tools/memory-model/scripts/checktheselitmus.sh +f:tools/memory-model/scripts/cmplitmushist.sh +f:tools/memory-model/scripts/hwfnseg.sh +f:tools/memory-model/scripts/initlitmushist.sh +f:tools/memory-model/scripts/judgelitmus.sh +f:tools/memory-model/scripts/newlitmushist.sh +f:tools/memory-model/scripts/parseargs.sh +f:tools/memory-model/scripts/runlitmus.sh +f:tools/memory-model/scripts/runlitmushist.sh +f:tools/memory-model/scripts/simpletest.sh +f:tools/mm/.gitignore +f:tools/mm/Makefile +f:tools/mm/page-types.c +f:tools/mm/page_owner_sort.c +f:tools/mm/show_page_info.py +f:tools/mm/slabinfo-gnuplot.sh +f:tools/mm/slabinfo.c +f:tools/mm/thp_swap_allocator_test.c +f:tools/mm/thpmaps +f:tools/net/sunrpc/extract.sh +f:tools/net/sunrpc/xdrgen/.gitignore +f:tools/net/sunrpc/xdrgen/README +f:tools/net/sunrpc/xdrgen/__init__.py +f:tools/net/sunrpc/xdrgen/generators/__init__.py +f:tools/net/sunrpc/xdrgen/generators/constant.py +f:tools/net/sunrpc/xdrgen/generators/enum.py +f:tools/net/sunrpc/xdrgen/generators/header_bottom.py +f:tools/net/sunrpc/xdrgen/generators/header_top.py +f:tools/net/sunrpc/xdrgen/generators/pointer.py +f:tools/net/sunrpc/xdrgen/generators/program.py +f:tools/net/sunrpc/xdrgen/generators/source_top.py +f:tools/net/sunrpc/xdrgen/generators/struct.py +f:tools/net/sunrpc/xdrgen/generators/typedef.py +f:tools/net/sunrpc/xdrgen/generators/union.py +f:tools/net/sunrpc/xdrgen/grammars/xdr.lark +f:tools/net/sunrpc/xdrgen/subcmds/__init__.py +f:tools/net/sunrpc/xdrgen/subcmds/declarations.py +f:tools/net/sunrpc/xdrgen/subcmds/definitions.py +f:tools/net/sunrpc/xdrgen/subcmds/lint.py +f:tools/net/sunrpc/xdrgen/subcmds/source.py +f:tools/net/sunrpc/xdrgen/templates/C/constants/definition.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/declaration/enum.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/decoder/enum.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/decoder/enum_be.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/definition/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/definition/close_be.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/definition/enumerator.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/definition/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/encoder/enum.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/encoder/enum_be.j2 +f:tools/net/sunrpc/xdrgen/templates/C/enum/maxsize/enum.j2 +f:tools/net/sunrpc/xdrgen/templates/C/header_bottom/declaration/header.j2 +f:tools/net/sunrpc/xdrgen/templates/C/header_bottom/definition/header.j2 +f:tools/net/sunrpc/xdrgen/templates/C/header_top/declaration/header.j2 +f:tools/net/sunrpc/xdrgen/templates/C/header_top/definition/header.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/declaration/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/optional_data.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/decoder/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/optional_data.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/definition/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/optional_data.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/pointer/maxsize/pointer.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/declaration/argument.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/declaration/result.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/decoder/argument.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/decoder/result.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/definition/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/definition/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/definition/procedure.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/encoder/argument.j2 +f:tools/net/sunrpc/xdrgen/templates/C/program/encoder/result.j2 +f:tools/net/sunrpc/xdrgen/templates/C/source_top/client.j2 +f:tools/net/sunrpc/xdrgen/templates/C/source_top/server.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/declaration/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/optional_data.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/decoder/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/optional_data.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/definition/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/optional_data.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/encoder/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/struct/maxsize/struct.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/declaration/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/declaration/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/declaration/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/declaration/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/declaration/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/declaration/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/decoder/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/decoder/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/decoder/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/decoder/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/decoder/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/decoder/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/definition/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/definition/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/definition/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/definition/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/definition/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/definition/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/encoder/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/encoder/fixed_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/encoder/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/encoder/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/encoder/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/encoder/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/fixed_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/break.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/case_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/case_spec_be.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/default_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/optional_data.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/string.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/switch_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/variable_length_array.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/variable_length_opaque.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/decoder/void.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/definition/case_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/definition/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/definition/default_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/definition/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/definition/switch_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/basic.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/break.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/case_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/case_spec_be.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/close.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/default_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/open.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/switch_spec.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/encoder/void.j2 +f:tools/net/sunrpc/xdrgen/templates/C/union/maxsize/union.j2 +f:tools/net/sunrpc/xdrgen/tests/test.x +f:tools/net/sunrpc/xdrgen/xdr_ast.py +f:tools/net/sunrpc/xdrgen/xdr_parse.py +f:tools/net/sunrpc/xdrgen/xdrgen +f:tools/net/ynl/Makefile +f:tools/net/ynl/Makefile.deps +f:tools/net/ynl/generated/.gitignore +f:tools/net/ynl/generated/Makefile +f:tools/net/ynl/lib/.gitignore +f:tools/net/ynl/lib/Makefile +f:tools/net/ynl/lib/ynl-priv.h +f:tools/net/ynl/lib/ynl.c +f:tools/net/ynl/lib/ynl.h +f:tools/net/ynl/pyproject.toml +f:tools/net/ynl/pyynl/.gitignore +f:tools/net/ynl/pyynl/__init__.py +f:tools/net/ynl/pyynl/cli.py +f:tools/net/ynl/pyynl/ethtool.py +f:tools/net/ynl/pyynl/lib/__init__.py +f:tools/net/ynl/pyynl/lib/nlspec.py +f:tools/net/ynl/pyynl/lib/ynl.py +f:tools/net/ynl/pyynl/ynl_gen_c.py +f:tools/net/ynl/pyynl/ynl_gen_rst.py +f:tools/net/ynl/requirements.txt +f:tools/net/ynl/samples/.gitignore +f:tools/net/ynl/samples/Makefile +f:tools/net/ynl/samples/devlink.c +f:tools/net/ynl/samples/ethtool.c +f:tools/net/ynl/samples/netdev.c +f:tools/net/ynl/samples/ovs.c +f:tools/net/ynl/samples/page-pool.c +f:tools/net/ynl/samples/rt-addr.c +f:tools/net/ynl/samples/rt-link.c +f:tools/net/ynl/samples/rt-route.c +f:tools/net/ynl/samples/tc.c +f:tools/net/ynl/ynl-regen.sh +f:tools/objtool/.gitignore +f:tools/objtool/Build +f:tools/objtool/Documentation/objtool.txt +f:tools/objtool/Makefile +f:tools/objtool/arch/loongarch/Build +f:tools/objtool/arch/loongarch/decode.c +f:tools/objtool/arch/loongarch/include/arch/cfi_regs.h +f:tools/objtool/arch/loongarch/include/arch/elf.h +f:tools/objtool/arch/loongarch/include/arch/special.h +f:tools/objtool/arch/loongarch/orc.c +f:tools/objtool/arch/loongarch/special.c +f:tools/objtool/arch/powerpc/Build +f:tools/objtool/arch/powerpc/decode.c +f:tools/objtool/arch/powerpc/include/arch/cfi_regs.h +f:tools/objtool/arch/powerpc/include/arch/elf.h +f:tools/objtool/arch/powerpc/include/arch/special.h +f:tools/objtool/arch/powerpc/special.c +f:tools/objtool/arch/x86/Build +f:tools/objtool/arch/x86/decode.c +f:tools/objtool/arch/x86/include/arch/cfi_regs.h +f:tools/objtool/arch/x86/include/arch/elf.h +f:tools/objtool/arch/x86/include/arch/special.h +f:tools/objtool/arch/x86/orc.c +f:tools/objtool/arch/x86/special.c +f:tools/objtool/builtin-check.c +f:tools/objtool/check.c +f:tools/objtool/elf.c +f:tools/objtool/include/objtool/arch.h +f:tools/objtool/include/objtool/builtin.h +f:tools/objtool/include/objtool/cfi.h +f:tools/objtool/include/objtool/check.h +f:tools/objtool/include/objtool/elf.h +f:tools/objtool/include/objtool/endianness.h +f:tools/objtool/include/objtool/objtool.h +f:tools/objtool/include/objtool/orc.h +f:tools/objtool/include/objtool/special.h +f:tools/objtool/include/objtool/warn.h +f:tools/objtool/noreturns.h +f:tools/objtool/objtool.c +f:tools/objtool/orc_dump.c +f:tools/objtool/orc_gen.c +f:tools/objtool/special.c +f:tools/objtool/sync-check.sh +f:tools/objtool/weak.c +f:tools/pcmcia/.gitignore +f:tools/pcmcia/Makefile +f:tools/pcmcia/crc32hash.c +f:tools/perf/.gitignore +f:tools/perf/Build +f:tools/perf/CREDITS +f:tools/perf/Documentation/Build.txt +f:tools/perf/Documentation/Makefile +f:tools/perf/Documentation/android.txt +f:tools/perf/Documentation/arm-coresight.txt +f:tools/perf/Documentation/asciidoc.conf +f:tools/perf/Documentation/asciidoctor-extensions.rb +f:tools/perf/Documentation/build-docdep.perl +f:tools/perf/Documentation/build-xed.txt +f:tools/perf/Documentation/callchain-overhead-calculation.txt +f:tools/perf/Documentation/cat-texi.perl +f:tools/perf/Documentation/cpu-and-latency-overheads.txt +f:tools/perf/Documentation/db-export.txt +f:tools/perf/Documentation/examples.txt +f:tools/perf/Documentation/guest-files.txt +f:tools/perf/Documentation/guestmount.txt +f:tools/perf/Documentation/intel-bts.txt +f:tools/perf/Documentation/intel-hybrid.txt +f:tools/perf/Documentation/intel-pt.txt +f:tools/perf/Documentation/itrace.txt +f:tools/perf/Documentation/jit-interface.txt +f:tools/perf/Documentation/jitdump-specification.txt +f:tools/perf/Documentation/manpage-1.72.xsl +f:tools/perf/Documentation/manpage-base.xsl +f:tools/perf/Documentation/manpage-bold-literal.xsl +f:tools/perf/Documentation/manpage-normal.xsl +f:tools/perf/Documentation/manpage-suppress-sp.xsl +f:tools/perf/Documentation/perf-amd-ibs.txt +f:tools/perf/Documentation/perf-annotate.txt +f:tools/perf/Documentation/perf-archive.txt +f:tools/perf/Documentation/perf-arm-spe.txt +f:tools/perf/Documentation/perf-bench.txt +f:tools/perf/Documentation/perf-buildid-cache.txt +f:tools/perf/Documentation/perf-buildid-list.txt +f:tools/perf/Documentation/perf-c2c.txt +f:tools/perf/Documentation/perf-check.txt +f:tools/perf/Documentation/perf-config.txt +f:tools/perf/Documentation/perf-daemon.txt +f:tools/perf/Documentation/perf-data.txt +f:tools/perf/Documentation/perf-diff.txt +f:tools/perf/Documentation/perf-dlfilter.txt +f:tools/perf/Documentation/perf-evlist.txt +f:tools/perf/Documentation/perf-ftrace.txt +f:tools/perf/Documentation/perf-help.txt +f:tools/perf/Documentation/perf-inject.txt +f:tools/perf/Documentation/perf-intel-pt.txt +f:tools/perf/Documentation/perf-iostat.txt +f:tools/perf/Documentation/perf-kallsyms.txt +f:tools/perf/Documentation/perf-kmem.txt +f:tools/perf/Documentation/perf-kvm.txt +f:tools/perf/Documentation/perf-kwork.txt +f:tools/perf/Documentation/perf-list.txt +f:tools/perf/Documentation/perf-lock.txt +f:tools/perf/Documentation/perf-mem.txt +f:tools/perf/Documentation/perf-probe.txt +f:tools/perf/Documentation/perf-record.txt +f:tools/perf/Documentation/perf-report.txt +f:tools/perf/Documentation/perf-sched.txt +f:tools/perf/Documentation/perf-script-perl.txt +f:tools/perf/Documentation/perf-script-python.txt +f:tools/perf/Documentation/perf-script.txt +f:tools/perf/Documentation/perf-stat.txt +f:tools/perf/Documentation/perf-test.txt +f:tools/perf/Documentation/perf-timechart.txt +f:tools/perf/Documentation/perf-top.txt +f:tools/perf/Documentation/perf-trace.txt +f:tools/perf/Documentation/perf-version.txt +f:tools/perf/Documentation/perf.data-directory-format.txt +f:tools/perf/Documentation/perf.data-file-format.txt +f:tools/perf/Documentation/perf.txt +f:tools/perf/Documentation/perfconfig.example +f:tools/perf/Documentation/security.txt +f:tools/perf/Documentation/tips.txt +f:tools/perf/Documentation/topdown.txt +f:tools/perf/MANIFEST +f:tools/perf/Makefile +f:tools/perf/Makefile.config +f:tools/perf/Makefile.perf +f:tools/perf/arch/Build +f:tools/perf/arch/alpha/Build +f:tools/perf/arch/alpha/entry/syscalls/syscall.tbl +f:tools/perf/arch/arc/annotate/instructions.c +f:tools/perf/arch/arm/Build +f:tools/perf/arch/arm/Makefile +f:tools/perf/arch/arm/annotate/instructions.c +f:tools/perf/arch/arm/entry/syscalls/syscall.tbl +f:tools/perf/arch/arm/include/arch-tests.h +f:tools/perf/arch/arm/include/dwarf-regs-table.h +f:tools/perf/arch/arm/include/perf_regs.h +f:tools/perf/arch/arm/tests/Build +f:tools/perf/arch/arm/tests/arch-tests.c +f:tools/perf/arch/arm/tests/dwarf-unwind.c +f:tools/perf/arch/arm/tests/regs_load.S +f:tools/perf/arch/arm/tests/vectors-page.c +f:tools/perf/arch/arm/util/Build +f:tools/perf/arch/arm/util/auxtrace.c +f:tools/perf/arch/arm/util/cs-etm.c +f:tools/perf/arch/arm/util/cs-etm.h +f:tools/perf/arch/arm/util/perf_regs.c +f:tools/perf/arch/arm/util/pmu.c +f:tools/perf/arch/arm/util/unwind-libdw.c +f:tools/perf/arch/arm/util/unwind-libunwind.c +f:tools/perf/arch/arm64/Build +f:tools/perf/arch/arm64/Makefile +f:tools/perf/arch/arm64/annotate/instructions.c +f:tools/perf/arch/arm64/entry/syscalls/syscall_32.tbl +f:tools/perf/arch/arm64/include/arch-tests.h +f:tools/perf/arch/arm64/include/dwarf-regs-table.h +f:tools/perf/arch/arm64/include/perf_regs.h +f:tools/perf/arch/arm64/tests/Build +f:tools/perf/arch/arm64/tests/arch-tests.c +f:tools/perf/arch/arm64/tests/cpuid-match.c +f:tools/perf/arch/arm64/tests/dwarf-unwind.c +f:tools/perf/arch/arm64/tests/regs_load.S +f:tools/perf/arch/arm64/util/Build +f:tools/perf/arch/arm64/util/arm-spe.c +f:tools/perf/arch/arm64/util/arm64_exception_types.h +f:tools/perf/arch/arm64/util/header.c +f:tools/perf/arch/arm64/util/hisi-ptt.c +f:tools/perf/arch/arm64/util/kvm-stat.c +f:tools/perf/arch/arm64/util/machine.c +f:tools/perf/arch/arm64/util/mem-events.c +f:tools/perf/arch/arm64/util/mem-events.h +f:tools/perf/arch/arm64/util/perf_regs.c +f:tools/perf/arch/arm64/util/pmu.c +f:tools/perf/arch/arm64/util/tsc.c +f:tools/perf/arch/arm64/util/unwind-libdw.c +f:tools/perf/arch/arm64/util/unwind-libunwind.c +f:tools/perf/arch/common.c +f:tools/perf/arch/common.h +f:tools/perf/arch/csky/Build +f:tools/perf/arch/csky/annotate/instructions.c +f:tools/perf/arch/csky/include/perf_regs.h +f:tools/perf/arch/csky/util/Build +f:tools/perf/arch/csky/util/perf_regs.c +f:tools/perf/arch/csky/util/unwind-libdw.c +f:tools/perf/arch/loongarch/Build +f:tools/perf/arch/loongarch/Makefile +f:tools/perf/arch/loongarch/annotate/instructions.c +f:tools/perf/arch/loongarch/include/dwarf-regs-table.h +f:tools/perf/arch/loongarch/include/perf_regs.h +f:tools/perf/arch/loongarch/util/Build +f:tools/perf/arch/loongarch/util/header.c +f:tools/perf/arch/loongarch/util/kvm-stat.c +f:tools/perf/arch/loongarch/util/perf_regs.c +f:tools/perf/arch/loongarch/util/unwind-libdw.c +f:tools/perf/arch/loongarch/util/unwind-libunwind.c +f:tools/perf/arch/mips/Build +f:tools/perf/arch/mips/annotate/instructions.c +f:tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl +f:tools/perf/arch/mips/include/dwarf-regs-table.h +f:tools/perf/arch/mips/include/perf_regs.h +f:tools/perf/arch/mips/util/Build +f:tools/perf/arch/mips/util/perf_regs.c +f:tools/perf/arch/mips/util/unwind-libunwind.c +f:tools/perf/arch/parisc/Build +f:tools/perf/arch/parisc/entry/syscalls/syscall.tbl +f:tools/perf/arch/powerpc/Build +f:tools/perf/arch/powerpc/Makefile +f:tools/perf/arch/powerpc/annotate/instructions.c +f:tools/perf/arch/powerpc/entry/syscalls/syscall.tbl +f:tools/perf/arch/powerpc/include/arch-tests.h +f:tools/perf/arch/powerpc/include/dwarf-regs-table.h +f:tools/perf/arch/powerpc/include/perf_regs.h +f:tools/perf/arch/powerpc/tests/Build +f:tools/perf/arch/powerpc/tests/arch-tests.c +f:tools/perf/arch/powerpc/tests/dwarf-unwind.c +f:tools/perf/arch/powerpc/tests/regs_load.S +f:tools/perf/arch/powerpc/util/Build +f:tools/perf/arch/powerpc/util/book3s_hcalls.h +f:tools/perf/arch/powerpc/util/book3s_hv_exits.h +f:tools/perf/arch/powerpc/util/event.c +f:tools/perf/arch/powerpc/util/evsel.c +f:tools/perf/arch/powerpc/util/header.c +f:tools/perf/arch/powerpc/util/kvm-stat.c +f:tools/perf/arch/powerpc/util/mem-events.c +f:tools/perf/arch/powerpc/util/mem-events.h +f:tools/perf/arch/powerpc/util/perf_regs.c +f:tools/perf/arch/powerpc/util/pmu.c +f:tools/perf/arch/powerpc/util/skip-callchain-idx.c +f:tools/perf/arch/powerpc/util/sym-handling.c +f:tools/perf/arch/powerpc/util/unwind-libdw.c +f:tools/perf/arch/powerpc/util/unwind-libunwind.c +f:tools/perf/arch/powerpc/util/utils_header.h +f:tools/perf/arch/riscv/Build +f:tools/perf/arch/riscv/Makefile +f:tools/perf/arch/riscv/include/dwarf-regs-table.h +f:tools/perf/arch/riscv/include/perf_regs.h +f:tools/perf/arch/riscv/util/Build +f:tools/perf/arch/riscv/util/header.c +f:tools/perf/arch/riscv/util/kvm-stat.c +f:tools/perf/arch/riscv/util/perf_regs.c +f:tools/perf/arch/riscv/util/riscv_trap_types.h +f:tools/perf/arch/riscv/util/unwind-libdw.c +f:tools/perf/arch/riscv64/annotate/instructions.c +f:tools/perf/arch/s390/Build +f:tools/perf/arch/s390/Makefile +f:tools/perf/arch/s390/annotate/instructions.c +f:tools/perf/arch/s390/entry/syscalls/syscall.tbl +f:tools/perf/arch/s390/include/dwarf-regs-table.h +f:tools/perf/arch/s390/include/perf_regs.h +f:tools/perf/arch/s390/util/Build +f:tools/perf/arch/s390/util/auxtrace.c +f:tools/perf/arch/s390/util/header.c +f:tools/perf/arch/s390/util/kvm-stat.c +f:tools/perf/arch/s390/util/machine.c +f:tools/perf/arch/s390/util/perf_regs.c +f:tools/perf/arch/s390/util/pmu.c +f:tools/perf/arch/s390/util/unwind-libdw.c +f:tools/perf/arch/sh/entry/syscalls/syscall.tbl +f:tools/perf/arch/sh/include/dwarf-regs-table.h +f:tools/perf/arch/sparc/Makefile +f:tools/perf/arch/sparc/annotate/instructions.c +f:tools/perf/arch/sparc/entry/syscalls/syscall.tbl +f:tools/perf/arch/sparc/include/dwarf-regs-table.h +f:tools/perf/arch/x86/Build +f:tools/perf/arch/x86/Makefile +f:tools/perf/arch/x86/annotate/instructions.c +f:tools/perf/arch/x86/entry/syscalls/syscall_32.tbl +f:tools/perf/arch/x86/entry/syscalls/syscall_64.tbl +f:tools/perf/arch/x86/include/arch-tests.h +f:tools/perf/arch/x86/include/dwarf-regs-table.h +f:tools/perf/arch/x86/include/perf_regs.h +f:tools/perf/arch/x86/tests/Build +f:tools/perf/arch/x86/tests/amd-ibs-period.c +f:tools/perf/arch/x86/tests/amd-ibs-via-core-pmu.c +f:tools/perf/arch/x86/tests/arch-tests.c +f:tools/perf/arch/x86/tests/bp-modify.c +f:tools/perf/arch/x86/tests/dwarf-unwind.c +f:tools/perf/arch/x86/tests/gen-insn-x86-dat.awk +f:tools/perf/arch/x86/tests/gen-insn-x86-dat.sh +f:tools/perf/arch/x86/tests/hybrid.c +f:tools/perf/arch/x86/tests/insn-x86-dat-32.c +f:tools/perf/arch/x86/tests/insn-x86-dat-64.c +f:tools/perf/arch/x86/tests/insn-x86-dat-src.c +f:tools/perf/arch/x86/tests/insn-x86.c +f:tools/perf/arch/x86/tests/intel-pt-test.c +f:tools/perf/arch/x86/tests/regs_load.S +f:tools/perf/arch/x86/tests/sample-parsing.c +f:tools/perf/arch/x86/util/Build +f:tools/perf/arch/x86/util/archinsn.c +f:tools/perf/arch/x86/util/auxtrace.c +f:tools/perf/arch/x86/util/cpuid.h +f:tools/perf/arch/x86/util/event.c +f:tools/perf/arch/x86/util/evlist.c +f:tools/perf/arch/x86/util/evsel.c +f:tools/perf/arch/x86/util/evsel.h +f:tools/perf/arch/x86/util/header.c +f:tools/perf/arch/x86/util/intel-bts.c +f:tools/perf/arch/x86/util/intel-pt.c +f:tools/perf/arch/x86/util/iostat.c +f:tools/perf/arch/x86/util/kvm-stat.c +f:tools/perf/arch/x86/util/machine.c +f:tools/perf/arch/x86/util/mem-events.c +f:tools/perf/arch/x86/util/mem-events.h +f:tools/perf/arch/x86/util/perf_regs.c +f:tools/perf/arch/x86/util/pmu.c +f:tools/perf/arch/x86/util/topdown.c +f:tools/perf/arch/x86/util/topdown.h +f:tools/perf/arch/x86/util/tsc.c +f:tools/perf/arch/x86/util/unwind-libdw.c +f:tools/perf/arch/x86/util/unwind-libunwind.c +f:tools/perf/arch/xtensa/entry/syscalls/syscall.tbl +f:tools/perf/arch/xtensa/include/dwarf-regs-table.h +f:tools/perf/bench/Build +f:tools/perf/bench/bench.h +f:tools/perf/bench/breakpoint.c +f:tools/perf/bench/epoll-ctl.c +f:tools/perf/bench/epoll-wait.c +f:tools/perf/bench/evlist-open-close.c +f:tools/perf/bench/find-bit-bench.c +f:tools/perf/bench/futex-hash.c +f:tools/perf/bench/futex-lock-pi.c +f:tools/perf/bench/futex-requeue.c +f:tools/perf/bench/futex-wake-parallel.c +f:tools/perf/bench/futex-wake.c +f:tools/perf/bench/futex.c +f:tools/perf/bench/futex.h +f:tools/perf/bench/inject-buildid.c +f:tools/perf/bench/kallsyms-parse.c +f:tools/perf/bench/mem-functions.c +f:tools/perf/bench/mem-memcpy-arch.h +f:tools/perf/bench/mem-memcpy-x86-64-asm-def.h +f:tools/perf/bench/mem-memcpy-x86-64-asm.S +f:tools/perf/bench/mem-memset-arch.h +f:tools/perf/bench/mem-memset-x86-64-asm-def.h +f:tools/perf/bench/mem-memset-x86-64-asm.S +f:tools/perf/bench/numa.c +f:tools/perf/bench/pmu-scan.c +f:tools/perf/bench/sched-messaging.c +f:tools/perf/bench/sched-pipe.c +f:tools/perf/bench/sched-seccomp-notify.c +f:tools/perf/bench/synthesize.c +f:tools/perf/bench/syscall.c +f:tools/perf/bench/uprobe.c +f:tools/perf/builtin-annotate.c +f:tools/perf/builtin-bench.c +f:tools/perf/builtin-buildid-cache.c +f:tools/perf/builtin-buildid-list.c +f:tools/perf/builtin-c2c.c +f:tools/perf/builtin-check.c +f:tools/perf/builtin-config.c +f:tools/perf/builtin-daemon.c +f:tools/perf/builtin-data.c +f:tools/perf/builtin-diff.c +f:tools/perf/builtin-evlist.c +f:tools/perf/builtin-ftrace.c +f:tools/perf/builtin-help.c +f:tools/perf/builtin-inject.c +f:tools/perf/builtin-kallsyms.c +f:tools/perf/builtin-kmem.c +f:tools/perf/builtin-kvm.c +f:tools/perf/builtin-kwork.c +f:tools/perf/builtin-list.c +f:tools/perf/builtin-lock.c +f:tools/perf/builtin-mem.c +f:tools/perf/builtin-probe.c +f:tools/perf/builtin-record.c +f:tools/perf/builtin-report.c +f:tools/perf/builtin-sched.c +f:tools/perf/builtin-script.c +f:tools/perf/builtin-stat.c +f:tools/perf/builtin-timechart.c +f:tools/perf/builtin-top.c +f:tools/perf/builtin-trace.c +f:tools/perf/builtin-version.c +f:tools/perf/builtin.h +f:tools/perf/check-header_ignore_hunks/lib/list_sort.c +f:tools/perf/check-headers.sh +f:tools/perf/command-list.txt +f:tools/perf/design.txt +f:tools/perf/dlfilters/dlfilter-show-cycles.c +f:tools/perf/dlfilters/dlfilter-test-api-v0.c +f:tools/perf/dlfilters/dlfilter-test-api-v2.c +f:tools/perf/include/perf/perf_dlfilter.h +f:tools/perf/jvmti/Build +f:tools/perf/jvmti/jvmti_agent.c +f:tools/perf/jvmti/jvmti_agent.h +f:tools/perf/jvmti/libjvmti.c +f:tools/perf/perf-archive.sh +f:tools/perf/perf-completion.sh +f:tools/perf/perf-iostat.sh +f:tools/perf/perf-read-vdso.c +f:tools/perf/perf-sys.h +f:tools/perf/perf.c +f:tools/perf/perf.h +f:tools/perf/pmu-events/Build +f:tools/perf/pmu-events/README +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/branch.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/bus.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/cache.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/core-imp-def.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/exception.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/instruction.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/intrinsic.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/memory.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/metrics.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/pipeline.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereone/spe.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/branch.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/bus.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/cache.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/core-imp-def.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/exception.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/instruction.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/intrinsic.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/memory.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/metrics.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/mmu.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/pipeline.json +f:tools/perf/pmu-events/arch/arm64/ampere/ampereonex/spe.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/branch.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/bus.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/cache.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/clock.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/exception.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/instruction.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/intrinsic.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/memory.json +f:tools/perf/pmu-events/arch/arm64/ampere/emag/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json +f:tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a34/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a34/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a34/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a34/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a34/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a34/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a35/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a35/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a35/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a35/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a35/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a35/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/pmu.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a510/trace.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a53/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a53/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a53/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a53/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a53/other.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a53/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a55/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a55/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a55/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a55/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a55/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a55/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a55/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/dpu.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/ifu.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a65-e1/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a710/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a710/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a710/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a710/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a710/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a710/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a710/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a710/trace.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/etm.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/mmu.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a73/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/etm.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/mmu.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a75/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a76/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a76/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a76/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a76/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a76/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a76/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a76/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a77/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a77/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a77/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a77/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a77/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a77/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a77/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a78/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a78/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a78/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a78/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a78/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a78/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-a78/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x1/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x1/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x1/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x1/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x1/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x1/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x1/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x2/branch.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x2/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x2/cache.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x2/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x2/instruction.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x2/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x2/pipeline.json +f:tools/perf/pmu-events/arch/arm64/arm/cortex-x2/trace.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/general.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/l1d_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/l1i_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/l2_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/l3_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/ll_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/metrics.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/retired.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/spe.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/spec_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/stall.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n1/tlb.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/fp_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/general.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/l1d_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/l1i_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/l2_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/l3_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/ll_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/metrics.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/retired.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/spe.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/spec_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/stall.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/sve.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/tlb.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n2-v2/trace.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/fp_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/general.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/l1d_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/l1i_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/l2_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/l3_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/ll_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/metrics.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/retired.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/spe.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/spec_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/stall.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/sve.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/tlb.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-n3/trace.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/fp_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/general.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/l1d_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/l1i_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/l2_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/l3_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/ll_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/metrics.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/retired.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/spe.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/spec_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/stall.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/sve.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v1/tlb.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/brbe.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/bus.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/exception.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/fp_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/general.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/l1d_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/l1i_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/l2_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/ll_cache.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/memory.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/metrics.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/retired.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/spe.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/spec_operation.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/stall.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/sve.json +f:tools/perf/pmu-events/arch/arm64/arm/neoverse-v3/tlb.json +f:tools/perf/pmu-events/arch/arm64/cavium/thunderx2/core-imp-def.json +f:tools/perf/pmu-events/arch/arm64/common-and-microarch.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/ddrc.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx8mn/sys/ddrc.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx8mn/sys/metrics.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx8mp/sys/ddrc.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx8mp/sys/metrics.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx8mq/sys/ddrc.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx8mq/sys/metrics.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx91/sys/ddrc.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx91/sys/metrics.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx93/sys/ddrc.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx93/sys/metrics.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx95/sys/ddrc.json +f:tools/perf/pmu-events/arch/arm64/freescale/imx95/sys/metrics.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/branch.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/bus.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/cache.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/cycle.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/exception.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/instruction.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/memory.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/other.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/pipeline.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/a64fx/sve.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/core-imp-def.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/cycle_accounting.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/energy.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/exception.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/fp_operation.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/gcycle.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/general.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/hwpf.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/l1d_cache.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/l1i_cache.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/l2_cache.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/l3_cache.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/ll_cache.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/memory.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/pipeline.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/pmu.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/retired.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/spec_operation.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/stall.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/sve.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/tlb.json +f:tools/perf/pmu-events/arch/arm64/fujitsu/monaka/trace.json +f:tools/perf/pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json +f:tools/perf/pmu-events/arch/arm64/hisilicon/hip08/metrics.json +f:tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json +f:tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-hha.json +f:tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-l3c.json +f:tools/perf/pmu-events/arch/arm64/hisilicon/hip09/sys/uncore-cpa.json +f:tools/perf/pmu-events/arch/arm64/mapfile.csv +f:tools/perf/pmu-events/arch/arm64/recommended.json +f:tools/perf/pmu-events/arch/arm64/sbsa.json +f:tools/perf/pmu-events/arch/arm64/thead/yitian710/sys/ali_drw.json +f:tools/perf/pmu-events/arch/arm64/thead/yitian710/sys/metrics.json +f:tools/perf/pmu-events/arch/common/common/tool.json +f:tools/perf/pmu-events/arch/nds32/mapfile.csv +f:tools/perf/pmu-events/arch/nds32/n13/atcpmu.json +f:tools/perf/pmu-events/arch/powerpc/compat/generic-events.json +f:tools/perf/pmu-events/arch/powerpc/mapfile.csv +f:tools/perf/pmu-events/arch/powerpc/power10/cache.json +f:tools/perf/pmu-events/arch/powerpc/power10/datasource.json +f:tools/perf/pmu-events/arch/powerpc/power10/floating_point.json +f:tools/perf/pmu-events/arch/powerpc/power10/frontend.json +f:tools/perf/pmu-events/arch/powerpc/power10/locks.json +f:tools/perf/pmu-events/arch/powerpc/power10/marked.json +f:tools/perf/pmu-events/arch/powerpc/power10/memory.json +f:tools/perf/pmu-events/arch/powerpc/power10/metrics.json +f:tools/perf/pmu-events/arch/powerpc/power10/nest_metrics.json +f:tools/perf/pmu-events/arch/powerpc/power10/others.json +f:tools/perf/pmu-events/arch/powerpc/power10/pipeline.json +f:tools/perf/pmu-events/arch/powerpc/power10/pmc.json +f:tools/perf/pmu-events/arch/powerpc/power10/translation.json +f:tools/perf/pmu-events/arch/powerpc/power8/cache.json +f:tools/perf/pmu-events/arch/powerpc/power8/floating-point.json +f:tools/perf/pmu-events/arch/powerpc/power8/frontend.json +f:tools/perf/pmu-events/arch/powerpc/power8/marked.json +f:tools/perf/pmu-events/arch/powerpc/power8/memory.json +f:tools/perf/pmu-events/arch/powerpc/power8/metrics.json +f:tools/perf/pmu-events/arch/powerpc/power8/other.json +f:tools/perf/pmu-events/arch/powerpc/power8/pipeline.json +f:tools/perf/pmu-events/arch/powerpc/power8/pmc.json +f:tools/perf/pmu-events/arch/powerpc/power8/translation.json +f:tools/perf/pmu-events/arch/powerpc/power9/cache.json +f:tools/perf/pmu-events/arch/powerpc/power9/floating-point.json +f:tools/perf/pmu-events/arch/powerpc/power9/frontend.json +f:tools/perf/pmu-events/arch/powerpc/power9/marked.json +f:tools/perf/pmu-events/arch/powerpc/power9/memory.json +f:tools/perf/pmu-events/arch/powerpc/power9/metrics.json +f:tools/perf/pmu-events/arch/powerpc/power9/nest_metrics.json +f:tools/perf/pmu-events/arch/powerpc/power9/other.json +f:tools/perf/pmu-events/arch/powerpc/power9/pipeline.json +f:tools/perf/pmu-events/arch/powerpc/power9/pmc.json +f:tools/perf/pmu-events/arch/powerpc/power9/translation.json +f:tools/perf/pmu-events/arch/riscv/andes/ax45/firmware.json +f:tools/perf/pmu-events/arch/riscv/andes/ax45/instructions.json +f:tools/perf/pmu-events/arch/riscv/andes/ax45/memory.json +f:tools/perf/pmu-events/arch/riscv/andes/ax45/microarch.json +f:tools/perf/pmu-events/arch/riscv/mapfile.csv +f:tools/perf/pmu-events/arch/riscv/riscv-sbi-firmware.json +f:tools/perf/pmu-events/arch/riscv/sifive/bullet-07/cycle-and-instruction-count.json +f:tools/perf/pmu-events/arch/riscv/sifive/bullet-07/microarch.json +f:tools/perf/pmu-events/arch/riscv/sifive/bullet-07/watchpoint.json +f:tools/perf/pmu-events/arch/riscv/sifive/bullet-0d/microarch.json +f:tools/perf/pmu-events/arch/riscv/sifive/bullet/firmware.json +f:tools/perf/pmu-events/arch/riscv/sifive/bullet/instruction.json +f:tools/perf/pmu-events/arch/riscv/sifive/bullet/memory.json +f:tools/perf/pmu-events/arch/riscv/sifive/bullet/microarch.json +f:tools/perf/pmu-events/arch/riscv/sifive/p550/memory.json +f:tools/perf/pmu-events/arch/riscv/sifive/p650/memory.json +f:tools/perf/pmu-events/arch/riscv/sifive/p650/microarch.json +f:tools/perf/pmu-events/arch/riscv/starfive/dubhe-80/common.json +f:tools/perf/pmu-events/arch/riscv/starfive/dubhe-80/firmware.json +f:tools/perf/pmu-events/arch/riscv/thead/c900-legacy/cache.json +f:tools/perf/pmu-events/arch/riscv/thead/c900-legacy/firmware.json +f:tools/perf/pmu-events/arch/riscv/thead/c900-legacy/instruction.json +f:tools/perf/pmu-events/arch/riscv/thead/c900-legacy/microarch.json +f:tools/perf/pmu-events/arch/s390/cf_z10/basic.json +f:tools/perf/pmu-events/arch/s390/cf_z10/crypto.json +f:tools/perf/pmu-events/arch/s390/cf_z10/extended.json +f:tools/perf/pmu-events/arch/s390/cf_z13/basic.json +f:tools/perf/pmu-events/arch/s390/cf_z13/crypto.json +f:tools/perf/pmu-events/arch/s390/cf_z13/extended.json +f:tools/perf/pmu-events/arch/s390/cf_z13/transaction.json +f:tools/perf/pmu-events/arch/s390/cf_z14/basic.json +f:tools/perf/pmu-events/arch/s390/cf_z14/crypto.json +f:tools/perf/pmu-events/arch/s390/cf_z14/extended.json +f:tools/perf/pmu-events/arch/s390/cf_z14/transaction.json +f:tools/perf/pmu-events/arch/s390/cf_z15/basic.json +f:tools/perf/pmu-events/arch/s390/cf_z15/crypto6.json +f:tools/perf/pmu-events/arch/s390/cf_z15/extended.json +f:tools/perf/pmu-events/arch/s390/cf_z15/transaction.json +f:tools/perf/pmu-events/arch/s390/cf_z16/basic.json +f:tools/perf/pmu-events/arch/s390/cf_z16/crypto6.json +f:tools/perf/pmu-events/arch/s390/cf_z16/extended.json +f:tools/perf/pmu-events/arch/s390/cf_z16/pai_crypto.json +f:tools/perf/pmu-events/arch/s390/cf_z16/pai_ext.json +f:tools/perf/pmu-events/arch/s390/cf_z16/transaction.json +f:tools/perf/pmu-events/arch/s390/cf_z196/basic.json +f:tools/perf/pmu-events/arch/s390/cf_z196/crypto.json +f:tools/perf/pmu-events/arch/s390/cf_z196/extended.json +f:tools/perf/pmu-events/arch/s390/cf_zec12/basic.json +f:tools/perf/pmu-events/arch/s390/cf_zec12/crypto.json +f:tools/perf/pmu-events/arch/s390/cf_zec12/extended.json +f:tools/perf/pmu-events/arch/s390/cf_zec12/transaction.json +f:tools/perf/pmu-events/arch/s390/mapfile.csv +f:tools/perf/pmu-events/arch/test/arch-std-events.json +f:tools/perf/pmu-events/arch/test/test_soc/cpu/branch.json +f:tools/perf/pmu-events/arch/test/test_soc/cpu/cache.json +f:tools/perf/pmu-events/arch/test/test_soc/cpu/metrics.json +f:tools/perf/pmu-events/arch/test/test_soc/cpu/other.json +f:tools/perf/pmu-events/arch/test/test_soc/cpu/uncore.json +f:tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json +f:tools/perf/pmu-events/arch/x86/alderlake/adl-metrics.json +f:tools/perf/pmu-events/arch/x86/alderlake/cache.json +f:tools/perf/pmu-events/arch/x86/alderlake/floating-point.json +f:tools/perf/pmu-events/arch/x86/alderlake/frontend.json +f:tools/perf/pmu-events/arch/x86/alderlake/memory.json +f:tools/perf/pmu-events/arch/x86/alderlake/metricgroups.json +f:tools/perf/pmu-events/arch/x86/alderlake/other.json +f:tools/perf/pmu-events/arch/x86/alderlake/pipeline.json +f:tools/perf/pmu-events/arch/x86/alderlake/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/alderlake/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/alderlake/uncore-other.json +f:tools/perf/pmu-events/arch/x86/alderlake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/alderlaken/adln-metrics.json +f:tools/perf/pmu-events/arch/x86/alderlaken/cache.json +f:tools/perf/pmu-events/arch/x86/alderlaken/floating-point.json +f:tools/perf/pmu-events/arch/x86/alderlaken/frontend.json +f:tools/perf/pmu-events/arch/x86/alderlaken/memory.json +f:tools/perf/pmu-events/arch/x86/alderlaken/metricgroups.json +f:tools/perf/pmu-events/arch/x86/alderlaken/other.json +f:tools/perf/pmu-events/arch/x86/alderlaken/pipeline.json +f:tools/perf/pmu-events/arch/x86/alderlaken/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/alderlaken/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/alderlaken/uncore-other.json +f:tools/perf/pmu-events/arch/x86/alderlaken/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/amdzen1/branch.json +f:tools/perf/pmu-events/arch/x86/amdzen1/cache.json +f:tools/perf/pmu-events/arch/x86/amdzen1/core.json +f:tools/perf/pmu-events/arch/x86/amdzen1/data-fabric.json +f:tools/perf/pmu-events/arch/x86/amdzen1/floating-point.json +f:tools/perf/pmu-events/arch/x86/amdzen1/memory.json +f:tools/perf/pmu-events/arch/x86/amdzen1/other.json +f:tools/perf/pmu-events/arch/x86/amdzen1/recommended.json +f:tools/perf/pmu-events/arch/x86/amdzen2/branch.json +f:tools/perf/pmu-events/arch/x86/amdzen2/cache.json +f:tools/perf/pmu-events/arch/x86/amdzen2/core.json +f:tools/perf/pmu-events/arch/x86/amdzen2/data-fabric.json +f:tools/perf/pmu-events/arch/x86/amdzen2/floating-point.json +f:tools/perf/pmu-events/arch/x86/amdzen2/memory.json +f:tools/perf/pmu-events/arch/x86/amdzen2/other.json +f:tools/perf/pmu-events/arch/x86/amdzen2/recommended.json +f:tools/perf/pmu-events/arch/x86/amdzen3/branch.json +f:tools/perf/pmu-events/arch/x86/amdzen3/cache.json +f:tools/perf/pmu-events/arch/x86/amdzen3/core.json +f:tools/perf/pmu-events/arch/x86/amdzen3/data-fabric.json +f:tools/perf/pmu-events/arch/x86/amdzen3/floating-point.json +f:tools/perf/pmu-events/arch/x86/amdzen3/memory.json +f:tools/perf/pmu-events/arch/x86/amdzen3/other.json +f:tools/perf/pmu-events/arch/x86/amdzen3/recommended.json +f:tools/perf/pmu-events/arch/x86/amdzen4/branch.json +f:tools/perf/pmu-events/arch/x86/amdzen4/cache.json +f:tools/perf/pmu-events/arch/x86/amdzen4/core.json +f:tools/perf/pmu-events/arch/x86/amdzen4/data-fabric.json +f:tools/perf/pmu-events/arch/x86/amdzen4/floating-point.json +f:tools/perf/pmu-events/arch/x86/amdzen4/memory-controller.json +f:tools/perf/pmu-events/arch/x86/amdzen4/memory.json +f:tools/perf/pmu-events/arch/x86/amdzen4/other.json +f:tools/perf/pmu-events/arch/x86/amdzen4/pipeline.json +f:tools/perf/pmu-events/arch/x86/amdzen4/recommended.json +f:tools/perf/pmu-events/arch/x86/amdzen5/branch-prediction.json +f:tools/perf/pmu-events/arch/x86/amdzen5/data-fabric.json +f:tools/perf/pmu-events/arch/x86/amdzen5/decode.json +f:tools/perf/pmu-events/arch/x86/amdzen5/execution.json +f:tools/perf/pmu-events/arch/x86/amdzen5/floating-point.json +f:tools/perf/pmu-events/arch/x86/amdzen5/inst-cache.json +f:tools/perf/pmu-events/arch/x86/amdzen5/l2-cache.json +f:tools/perf/pmu-events/arch/x86/amdzen5/l3-cache.json +f:tools/perf/pmu-events/arch/x86/amdzen5/load-store.json +f:tools/perf/pmu-events/arch/x86/amdzen5/memory-controller.json +f:tools/perf/pmu-events/arch/x86/amdzen5/pipeline.json +f:tools/perf/pmu-events/arch/x86/amdzen5/recommended.json +f:tools/perf/pmu-events/arch/x86/arrowlake/arl-metrics.json +f:tools/perf/pmu-events/arch/x86/arrowlake/cache.json +f:tools/perf/pmu-events/arch/x86/arrowlake/floating-point.json +f:tools/perf/pmu-events/arch/x86/arrowlake/frontend.json +f:tools/perf/pmu-events/arch/x86/arrowlake/memory.json +f:tools/perf/pmu-events/arch/x86/arrowlake/metricgroups.json +f:tools/perf/pmu-events/arch/x86/arrowlake/other.json +f:tools/perf/pmu-events/arch/x86/arrowlake/pipeline.json +f:tools/perf/pmu-events/arch/x86/arrowlake/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/arrowlake/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/arrowlake/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/arrowlake/uncore-other.json +f:tools/perf/pmu-events/arch/x86/arrowlake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/bonnell/cache.json +f:tools/perf/pmu-events/arch/x86/bonnell/counter.json +f:tools/perf/pmu-events/arch/x86/bonnell/floating-point.json +f:tools/perf/pmu-events/arch/x86/bonnell/frontend.json +f:tools/perf/pmu-events/arch/x86/bonnell/memory.json +f:tools/perf/pmu-events/arch/x86/bonnell/other.json +f:tools/perf/pmu-events/arch/x86/bonnell/pipeline.json +f:tools/perf/pmu-events/arch/x86/bonnell/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/broadwell/bdw-metrics.json +f:tools/perf/pmu-events/arch/x86/broadwell/cache.json +f:tools/perf/pmu-events/arch/x86/broadwell/counter.json +f:tools/perf/pmu-events/arch/x86/broadwell/floating-point.json +f:tools/perf/pmu-events/arch/x86/broadwell/frontend.json +f:tools/perf/pmu-events/arch/x86/broadwell/memory.json +f:tools/perf/pmu-events/arch/x86/broadwell/metricgroups.json +f:tools/perf/pmu-events/arch/x86/broadwell/other.json +f:tools/perf/pmu-events/arch/x86/broadwell/pipeline.json +f:tools/perf/pmu-events/arch/x86/broadwell/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/broadwell/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/broadwell/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/broadwellde/bdwde-metrics.json +f:tools/perf/pmu-events/arch/x86/broadwellde/cache.json +f:tools/perf/pmu-events/arch/x86/broadwellde/counter.json +f:tools/perf/pmu-events/arch/x86/broadwellde/floating-point.json +f:tools/perf/pmu-events/arch/x86/broadwellde/frontend.json +f:tools/perf/pmu-events/arch/x86/broadwellde/memory.json +f:tools/perf/pmu-events/arch/x86/broadwellde/metricgroups.json +f:tools/perf/pmu-events/arch/x86/broadwellde/other.json +f:tools/perf/pmu-events/arch/x86/broadwellde/pipeline.json +f:tools/perf/pmu-events/arch/x86/broadwellde/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/broadwellde/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/broadwellde/uncore-io.json +f:tools/perf/pmu-events/arch/x86/broadwellde/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/broadwellde/uncore-power.json +f:tools/perf/pmu-events/arch/x86/broadwellde/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/broadwellx/bdx-metrics.json +f:tools/perf/pmu-events/arch/x86/broadwellx/cache.json +f:tools/perf/pmu-events/arch/x86/broadwellx/counter.json +f:tools/perf/pmu-events/arch/x86/broadwellx/floating-point.json +f:tools/perf/pmu-events/arch/x86/broadwellx/frontend.json +f:tools/perf/pmu-events/arch/x86/broadwellx/memory.json +f:tools/perf/pmu-events/arch/x86/broadwellx/metricgroups.json +f:tools/perf/pmu-events/arch/x86/broadwellx/other.json +f:tools/perf/pmu-events/arch/x86/broadwellx/pipeline.json +f:tools/perf/pmu-events/arch/x86/broadwellx/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/broadwellx/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/broadwellx/uncore-io.json +f:tools/perf/pmu-events/arch/x86/broadwellx/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/broadwellx/uncore-power.json +f:tools/perf/pmu-events/arch/x86/broadwellx/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/cache.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/clx-metrics.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/counter.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/floating-point.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/frontend.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/memory.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/metricgroups.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/other.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/pipeline.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/uncore-io.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/uncore-power.json +f:tools/perf/pmu-events/arch/x86/cascadelakex/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/clearwaterforest/cache.json +f:tools/perf/pmu-events/arch/x86/clearwaterforest/counter.json +f:tools/perf/pmu-events/arch/x86/clearwaterforest/frontend.json +f:tools/perf/pmu-events/arch/x86/clearwaterforest/memory.json +f:tools/perf/pmu-events/arch/x86/clearwaterforest/pipeline.json +f:tools/perf/pmu-events/arch/x86/clearwaterforest/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/cache.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/counter.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/ehl-metrics.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/floating-point.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/frontend.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/memory.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/other.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/pipeline.json +f:tools/perf/pmu-events/arch/x86/elkhartlake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/cache.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/counter.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/emr-metrics.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/floating-point.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/frontend.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/memory.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/metricgroups.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/other.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/pipeline.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-cxl.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-io.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/uncore-power.json +f:tools/perf/pmu-events/arch/x86/emeraldrapids/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/goldmont/cache.json +f:tools/perf/pmu-events/arch/x86/goldmont/counter.json +f:tools/perf/pmu-events/arch/x86/goldmont/floating-point.json +f:tools/perf/pmu-events/arch/x86/goldmont/frontend.json +f:tools/perf/pmu-events/arch/x86/goldmont/memory.json +f:tools/perf/pmu-events/arch/x86/goldmont/other.json +f:tools/perf/pmu-events/arch/x86/goldmont/pipeline.json +f:tools/perf/pmu-events/arch/x86/goldmont/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/goldmontplus/cache.json +f:tools/perf/pmu-events/arch/x86/goldmontplus/counter.json +f:tools/perf/pmu-events/arch/x86/goldmontplus/floating-point.json +f:tools/perf/pmu-events/arch/x86/goldmontplus/frontend.json +f:tools/perf/pmu-events/arch/x86/goldmontplus/memory.json +f:tools/perf/pmu-events/arch/x86/goldmontplus/other.json +f:tools/perf/pmu-events/arch/x86/goldmontplus/pipeline.json +f:tools/perf/pmu-events/arch/x86/goldmontplus/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/grandridge/cache.json +f:tools/perf/pmu-events/arch/x86/grandridge/counter.json +f:tools/perf/pmu-events/arch/x86/grandridge/floating-point.json +f:tools/perf/pmu-events/arch/x86/grandridge/frontend.json +f:tools/perf/pmu-events/arch/x86/grandridge/grr-metrics.json +f:tools/perf/pmu-events/arch/x86/grandridge/memory.json +f:tools/perf/pmu-events/arch/x86/grandridge/metricgroups.json +f:tools/perf/pmu-events/arch/x86/grandridge/other.json +f:tools/perf/pmu-events/arch/x86/grandridge/pipeline.json +f:tools/perf/pmu-events/arch/x86/grandridge/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/grandridge/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/grandridge/uncore-io.json +f:tools/perf/pmu-events/arch/x86/grandridge/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/grandridge/uncore-power.json +f:tools/perf/pmu-events/arch/x86/grandridge/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/graniterapids/cache.json +f:tools/perf/pmu-events/arch/x86/graniterapids/counter.json +f:tools/perf/pmu-events/arch/x86/graniterapids/floating-point.json +f:tools/perf/pmu-events/arch/x86/graniterapids/frontend.json +f:tools/perf/pmu-events/arch/x86/graniterapids/gnr-metrics.json +f:tools/perf/pmu-events/arch/x86/graniterapids/memory.json +f:tools/perf/pmu-events/arch/x86/graniterapids/metricgroups.json +f:tools/perf/pmu-events/arch/x86/graniterapids/other.json +f:tools/perf/pmu-events/arch/x86/graniterapids/pipeline.json +f:tools/perf/pmu-events/arch/x86/graniterapids/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/graniterapids/uncore-cxl.json +f:tools/perf/pmu-events/arch/x86/graniterapids/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/graniterapids/uncore-io.json +f:tools/perf/pmu-events/arch/x86/graniterapids/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/graniterapids/uncore-power.json +f:tools/perf/pmu-events/arch/x86/graniterapids/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/haswell/cache.json +f:tools/perf/pmu-events/arch/x86/haswell/counter.json +f:tools/perf/pmu-events/arch/x86/haswell/floating-point.json +f:tools/perf/pmu-events/arch/x86/haswell/frontend.json +f:tools/perf/pmu-events/arch/x86/haswell/hsw-metrics.json +f:tools/perf/pmu-events/arch/x86/haswell/memory.json +f:tools/perf/pmu-events/arch/x86/haswell/metricgroups.json +f:tools/perf/pmu-events/arch/x86/haswell/other.json +f:tools/perf/pmu-events/arch/x86/haswell/pipeline.json +f:tools/perf/pmu-events/arch/x86/haswell/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/haswell/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/haswell/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/haswellx/cache.json +f:tools/perf/pmu-events/arch/x86/haswellx/counter.json +f:tools/perf/pmu-events/arch/x86/haswellx/floating-point.json +f:tools/perf/pmu-events/arch/x86/haswellx/frontend.json +f:tools/perf/pmu-events/arch/x86/haswellx/hsx-metrics.json +f:tools/perf/pmu-events/arch/x86/haswellx/memory.json +f:tools/perf/pmu-events/arch/x86/haswellx/metricgroups.json +f:tools/perf/pmu-events/arch/x86/haswellx/other.json +f:tools/perf/pmu-events/arch/x86/haswellx/pipeline.json +f:tools/perf/pmu-events/arch/x86/haswellx/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/haswellx/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/haswellx/uncore-io.json +f:tools/perf/pmu-events/arch/x86/haswellx/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/haswellx/uncore-power.json +f:tools/perf/pmu-events/arch/x86/haswellx/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/icelake/cache.json +f:tools/perf/pmu-events/arch/x86/icelake/counter.json +f:tools/perf/pmu-events/arch/x86/icelake/floating-point.json +f:tools/perf/pmu-events/arch/x86/icelake/frontend.json +f:tools/perf/pmu-events/arch/x86/icelake/icl-metrics.json +f:tools/perf/pmu-events/arch/x86/icelake/memory.json +f:tools/perf/pmu-events/arch/x86/icelake/metricgroups.json +f:tools/perf/pmu-events/arch/x86/icelake/other.json +f:tools/perf/pmu-events/arch/x86/icelake/pipeline.json +f:tools/perf/pmu-events/arch/x86/icelake/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/icelake/uncore-other.json +f:tools/perf/pmu-events/arch/x86/icelake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/icelakex/cache.json +f:tools/perf/pmu-events/arch/x86/icelakex/counter.json +f:tools/perf/pmu-events/arch/x86/icelakex/floating-point.json +f:tools/perf/pmu-events/arch/x86/icelakex/frontend.json +f:tools/perf/pmu-events/arch/x86/icelakex/icx-metrics.json +f:tools/perf/pmu-events/arch/x86/icelakex/memory.json +f:tools/perf/pmu-events/arch/x86/icelakex/metricgroups.json +f:tools/perf/pmu-events/arch/x86/icelakex/other.json +f:tools/perf/pmu-events/arch/x86/icelakex/pipeline.json +f:tools/perf/pmu-events/arch/x86/icelakex/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/icelakex/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/icelakex/uncore-io.json +f:tools/perf/pmu-events/arch/x86/icelakex/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/icelakex/uncore-power.json +f:tools/perf/pmu-events/arch/x86/icelakex/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/ivybridge/cache.json +f:tools/perf/pmu-events/arch/x86/ivybridge/counter.json +f:tools/perf/pmu-events/arch/x86/ivybridge/floating-point.json +f:tools/perf/pmu-events/arch/x86/ivybridge/frontend.json +f:tools/perf/pmu-events/arch/x86/ivybridge/ivb-metrics.json +f:tools/perf/pmu-events/arch/x86/ivybridge/memory.json +f:tools/perf/pmu-events/arch/x86/ivybridge/metricgroups.json +f:tools/perf/pmu-events/arch/x86/ivybridge/other.json +f:tools/perf/pmu-events/arch/x86/ivybridge/pipeline.json +f:tools/perf/pmu-events/arch/x86/ivybridge/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/ivybridge/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/ivybridge/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/ivytown/cache.json +f:tools/perf/pmu-events/arch/x86/ivytown/counter.json +f:tools/perf/pmu-events/arch/x86/ivytown/floating-point.json +f:tools/perf/pmu-events/arch/x86/ivytown/frontend.json +f:tools/perf/pmu-events/arch/x86/ivytown/ivt-metrics.json +f:tools/perf/pmu-events/arch/x86/ivytown/memory.json +f:tools/perf/pmu-events/arch/x86/ivytown/metricgroups.json +f:tools/perf/pmu-events/arch/x86/ivytown/other.json +f:tools/perf/pmu-events/arch/x86/ivytown/pipeline.json +f:tools/perf/pmu-events/arch/x86/ivytown/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/ivytown/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/ivytown/uncore-io.json +f:tools/perf/pmu-events/arch/x86/ivytown/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/ivytown/uncore-power.json +f:tools/perf/pmu-events/arch/x86/ivytown/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/jaketown/cache.json +f:tools/perf/pmu-events/arch/x86/jaketown/counter.json +f:tools/perf/pmu-events/arch/x86/jaketown/floating-point.json +f:tools/perf/pmu-events/arch/x86/jaketown/frontend.json +f:tools/perf/pmu-events/arch/x86/jaketown/jkt-metrics.json +f:tools/perf/pmu-events/arch/x86/jaketown/memory.json +f:tools/perf/pmu-events/arch/x86/jaketown/metricgroups.json +f:tools/perf/pmu-events/arch/x86/jaketown/other.json +f:tools/perf/pmu-events/arch/x86/jaketown/pipeline.json +f:tools/perf/pmu-events/arch/x86/jaketown/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/jaketown/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/jaketown/uncore-io.json +f:tools/perf/pmu-events/arch/x86/jaketown/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/jaketown/uncore-power.json +f:tools/perf/pmu-events/arch/x86/jaketown/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/knightslanding/cache.json +f:tools/perf/pmu-events/arch/x86/knightslanding/counter.json +f:tools/perf/pmu-events/arch/x86/knightslanding/floating-point.json +f:tools/perf/pmu-events/arch/x86/knightslanding/frontend.json +f:tools/perf/pmu-events/arch/x86/knightslanding/memory.json +f:tools/perf/pmu-events/arch/x86/knightslanding/pipeline.json +f:tools/perf/pmu-events/arch/x86/knightslanding/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/knightslanding/uncore-io.json +f:tools/perf/pmu-events/arch/x86/knightslanding/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/knightslanding/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/lunarlake/cache.json +f:tools/perf/pmu-events/arch/x86/lunarlake/floating-point.json +f:tools/perf/pmu-events/arch/x86/lunarlake/frontend.json +f:tools/perf/pmu-events/arch/x86/lunarlake/lnl-metrics.json +f:tools/perf/pmu-events/arch/x86/lunarlake/memory.json +f:tools/perf/pmu-events/arch/x86/lunarlake/metricgroups.json +f:tools/perf/pmu-events/arch/x86/lunarlake/other.json +f:tools/perf/pmu-events/arch/x86/lunarlake/pipeline.json +f:tools/perf/pmu-events/arch/x86/lunarlake/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/lunarlake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/mapfile.csv +f:tools/perf/pmu-events/arch/x86/meteorlake/cache.json +f:tools/perf/pmu-events/arch/x86/meteorlake/floating-point.json +f:tools/perf/pmu-events/arch/x86/meteorlake/frontend.json +f:tools/perf/pmu-events/arch/x86/meteorlake/memory.json +f:tools/perf/pmu-events/arch/x86/meteorlake/metricgroups.json +f:tools/perf/pmu-events/arch/x86/meteorlake/mtl-metrics.json +f:tools/perf/pmu-events/arch/x86/meteorlake/other.json +f:tools/perf/pmu-events/arch/x86/meteorlake/pipeline.json +f:tools/perf/pmu-events/arch/x86/meteorlake/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/meteorlake/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/meteorlake/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/meteorlake/uncore-other.json +f:tools/perf/pmu-events/arch/x86/meteorlake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/nehalemep/cache.json +f:tools/perf/pmu-events/arch/x86/nehalemep/counter.json +f:tools/perf/pmu-events/arch/x86/nehalemep/floating-point.json +f:tools/perf/pmu-events/arch/x86/nehalemep/frontend.json +f:tools/perf/pmu-events/arch/x86/nehalemep/memory.json +f:tools/perf/pmu-events/arch/x86/nehalemep/other.json +f:tools/perf/pmu-events/arch/x86/nehalemep/pipeline.json +f:tools/perf/pmu-events/arch/x86/nehalemep/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/nehalemex/cache.json +f:tools/perf/pmu-events/arch/x86/nehalemex/counter.json +f:tools/perf/pmu-events/arch/x86/nehalemex/floating-point.json +f:tools/perf/pmu-events/arch/x86/nehalemex/frontend.json +f:tools/perf/pmu-events/arch/x86/nehalemex/memory.json +f:tools/perf/pmu-events/arch/x86/nehalemex/other.json +f:tools/perf/pmu-events/arch/x86/nehalemex/pipeline.json +f:tools/perf/pmu-events/arch/x86/nehalemex/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/rocketlake/cache.json +f:tools/perf/pmu-events/arch/x86/rocketlake/counter.json +f:tools/perf/pmu-events/arch/x86/rocketlake/floating-point.json +f:tools/perf/pmu-events/arch/x86/rocketlake/frontend.json +f:tools/perf/pmu-events/arch/x86/rocketlake/memory.json +f:tools/perf/pmu-events/arch/x86/rocketlake/metricgroups.json +f:tools/perf/pmu-events/arch/x86/rocketlake/other.json +f:tools/perf/pmu-events/arch/x86/rocketlake/pipeline.json +f:tools/perf/pmu-events/arch/x86/rocketlake/rkl-metrics.json +f:tools/perf/pmu-events/arch/x86/rocketlake/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/rocketlake/uncore-other.json +f:tools/perf/pmu-events/arch/x86/rocketlake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/sandybridge/cache.json +f:tools/perf/pmu-events/arch/x86/sandybridge/counter.json +f:tools/perf/pmu-events/arch/x86/sandybridge/floating-point.json +f:tools/perf/pmu-events/arch/x86/sandybridge/frontend.json +f:tools/perf/pmu-events/arch/x86/sandybridge/memory.json +f:tools/perf/pmu-events/arch/x86/sandybridge/metricgroups.json +f:tools/perf/pmu-events/arch/x86/sandybridge/other.json +f:tools/perf/pmu-events/arch/x86/sandybridge/pipeline.json +f:tools/perf/pmu-events/arch/x86/sandybridge/snb-metrics.json +f:tools/perf/pmu-events/arch/x86/sandybridge/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/sandybridge/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/sandybridge/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/cache.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/counter.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/floating-point.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/frontend.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/memory.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/metricgroups.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/other.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/pipeline.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/spr-metrics.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/uncore-cxl.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/uncore-io.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/uncore-power.json +f:tools/perf/pmu-events/arch/x86/sapphirerapids/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/sierraforest/cache.json +f:tools/perf/pmu-events/arch/x86/sierraforest/counter.json +f:tools/perf/pmu-events/arch/x86/sierraforest/floating-point.json +f:tools/perf/pmu-events/arch/x86/sierraforest/frontend.json +f:tools/perf/pmu-events/arch/x86/sierraforest/memory.json +f:tools/perf/pmu-events/arch/x86/sierraforest/metricgroups.json +f:tools/perf/pmu-events/arch/x86/sierraforest/other.json +f:tools/perf/pmu-events/arch/x86/sierraforest/pipeline.json +f:tools/perf/pmu-events/arch/x86/sierraforest/srf-metrics.json +f:tools/perf/pmu-events/arch/x86/sierraforest/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/sierraforest/uncore-cxl.json +f:tools/perf/pmu-events/arch/x86/sierraforest/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/sierraforest/uncore-io.json +f:tools/perf/pmu-events/arch/x86/sierraforest/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/sierraforest/uncore-power.json +f:tools/perf/pmu-events/arch/x86/sierraforest/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/silvermont/cache.json +f:tools/perf/pmu-events/arch/x86/silvermont/counter.json +f:tools/perf/pmu-events/arch/x86/silvermont/floating-point.json +f:tools/perf/pmu-events/arch/x86/silvermont/frontend.json +f:tools/perf/pmu-events/arch/x86/silvermont/memory.json +f:tools/perf/pmu-events/arch/x86/silvermont/other.json +f:tools/perf/pmu-events/arch/x86/silvermont/pipeline.json +f:tools/perf/pmu-events/arch/x86/silvermont/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/skylake/cache.json +f:tools/perf/pmu-events/arch/x86/skylake/counter.json +f:tools/perf/pmu-events/arch/x86/skylake/floating-point.json +f:tools/perf/pmu-events/arch/x86/skylake/frontend.json +f:tools/perf/pmu-events/arch/x86/skylake/memory.json +f:tools/perf/pmu-events/arch/x86/skylake/metricgroups.json +f:tools/perf/pmu-events/arch/x86/skylake/other.json +f:tools/perf/pmu-events/arch/x86/skylake/pipeline.json +f:tools/perf/pmu-events/arch/x86/skylake/skl-metrics.json +f:tools/perf/pmu-events/arch/x86/skylake/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/skylake/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/skylake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/skylakex/cache.json +f:tools/perf/pmu-events/arch/x86/skylakex/counter.json +f:tools/perf/pmu-events/arch/x86/skylakex/floating-point.json +f:tools/perf/pmu-events/arch/x86/skylakex/frontend.json +f:tools/perf/pmu-events/arch/x86/skylakex/memory.json +f:tools/perf/pmu-events/arch/x86/skylakex/metricgroups.json +f:tools/perf/pmu-events/arch/x86/skylakex/other.json +f:tools/perf/pmu-events/arch/x86/skylakex/pipeline.json +f:tools/perf/pmu-events/arch/x86/skylakex/skx-metrics.json +f:tools/perf/pmu-events/arch/x86/skylakex/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/skylakex/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/skylakex/uncore-io.json +f:tools/perf/pmu-events/arch/x86/skylakex/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/skylakex/uncore-power.json +f:tools/perf/pmu-events/arch/x86/skylakex/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/snowridgex/cache.json +f:tools/perf/pmu-events/arch/x86/snowridgex/counter.json +f:tools/perf/pmu-events/arch/x86/snowridgex/floating-point.json +f:tools/perf/pmu-events/arch/x86/snowridgex/frontend.json +f:tools/perf/pmu-events/arch/x86/snowridgex/memory.json +f:tools/perf/pmu-events/arch/x86/snowridgex/other.json +f:tools/perf/pmu-events/arch/x86/snowridgex/pipeline.json +f:tools/perf/pmu-events/arch/x86/snowridgex/uncore-cache.json +f:tools/perf/pmu-events/arch/x86/snowridgex/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/snowridgex/uncore-io.json +f:tools/perf/pmu-events/arch/x86/snowridgex/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/snowridgex/uncore-power.json +f:tools/perf/pmu-events/arch/x86/snowridgex/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/tigerlake/cache.json +f:tools/perf/pmu-events/arch/x86/tigerlake/counter.json +f:tools/perf/pmu-events/arch/x86/tigerlake/floating-point.json +f:tools/perf/pmu-events/arch/x86/tigerlake/frontend.json +f:tools/perf/pmu-events/arch/x86/tigerlake/memory.json +f:tools/perf/pmu-events/arch/x86/tigerlake/metricgroups.json +f:tools/perf/pmu-events/arch/x86/tigerlake/other.json +f:tools/perf/pmu-events/arch/x86/tigerlake/pipeline.json +f:tools/perf/pmu-events/arch/x86/tigerlake/tgl-metrics.json +f:tools/perf/pmu-events/arch/x86/tigerlake/uncore-interconnect.json +f:tools/perf/pmu-events/arch/x86/tigerlake/uncore-memory.json +f:tools/perf/pmu-events/arch/x86/tigerlake/uncore-other.json +f:tools/perf/pmu-events/arch/x86/tigerlake/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/westmereep-dp/cache.json +f:tools/perf/pmu-events/arch/x86/westmereep-dp/counter.json +f:tools/perf/pmu-events/arch/x86/westmereep-dp/floating-point.json +f:tools/perf/pmu-events/arch/x86/westmereep-dp/frontend.json +f:tools/perf/pmu-events/arch/x86/westmereep-dp/memory.json +f:tools/perf/pmu-events/arch/x86/westmereep-dp/other.json +f:tools/perf/pmu-events/arch/x86/westmereep-dp/pipeline.json +f:tools/perf/pmu-events/arch/x86/westmereep-dp/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/westmereep-sp/cache.json +f:tools/perf/pmu-events/arch/x86/westmereep-sp/counter.json +f:tools/perf/pmu-events/arch/x86/westmereep-sp/floating-point.json +f:tools/perf/pmu-events/arch/x86/westmereep-sp/frontend.json +f:tools/perf/pmu-events/arch/x86/westmereep-sp/memory.json +f:tools/perf/pmu-events/arch/x86/westmereep-sp/other.json +f:tools/perf/pmu-events/arch/x86/westmereep-sp/pipeline.json +f:tools/perf/pmu-events/arch/x86/westmereep-sp/virtual-memory.json +f:tools/perf/pmu-events/arch/x86/westmereex/cache.json +f:tools/perf/pmu-events/arch/x86/westmereex/counter.json +f:tools/perf/pmu-events/arch/x86/westmereex/floating-point.json +f:tools/perf/pmu-events/arch/x86/westmereex/frontend.json +f:tools/perf/pmu-events/arch/x86/westmereex/memory.json +f:tools/perf/pmu-events/arch/x86/westmereex/other.json +f:tools/perf/pmu-events/arch/x86/westmereex/pipeline.json +f:tools/perf/pmu-events/arch/x86/westmereex/virtual-memory.json +f:tools/perf/pmu-events/empty-pmu-events.c +f:tools/perf/pmu-events/jevents.py +f:tools/perf/pmu-events/metric.py +f:tools/perf/pmu-events/metric_test.py +f:tools/perf/pmu-events/models.py +f:tools/perf/pmu-events/pmu-events.h +f:tools/perf/python/counting.py +f:tools/perf/python/tracepoint.py +f:tools/perf/python/twatch.py +f:tools/perf/scripts/Build +f:tools/perf/scripts/perl/Perf-Trace-Util/Build +f:tools/perf/scripts/perl/Perf-Trace-Util/Context.c +f:tools/perf/scripts/perl/Perf-Trace-Util/Context.xs +f:tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL +f:tools/perf/scripts/perl/Perf-Trace-Util/README +f:tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm +f:tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm +f:tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm +f:tools/perf/scripts/perl/Perf-Trace-Util/typemap +f:tools/perf/scripts/perl/bin/check-perf-trace-record +f:tools/perf/scripts/perl/bin/failed-syscalls-record +f:tools/perf/scripts/perl/bin/failed-syscalls-report +f:tools/perf/scripts/perl/bin/rw-by-file-record +f:tools/perf/scripts/perl/bin/rw-by-file-report +f:tools/perf/scripts/perl/bin/rw-by-pid-record +f:tools/perf/scripts/perl/bin/rw-by-pid-report +f:tools/perf/scripts/perl/bin/rwtop-record +f:tools/perf/scripts/perl/bin/rwtop-report +f:tools/perf/scripts/perl/bin/wakeup-latency-record +f:tools/perf/scripts/perl/bin/wakeup-latency-report +f:tools/perf/scripts/perl/check-perf-trace.pl +f:tools/perf/scripts/perl/failed-syscalls.pl +f:tools/perf/scripts/perl/rw-by-file.pl +f:tools/perf/scripts/perl/rw-by-pid.pl +f:tools/perf/scripts/perl/rwtop.pl +f:tools/perf/scripts/perl/wakeup-latency.pl +f:tools/perf/scripts/python/Perf-Trace-Util/Build +f:tools/perf/scripts/python/Perf-Trace-Util/Context.c +f:tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py +f:tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py +f:tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py +f:tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py +f:tools/perf/scripts/python/arm-cs-trace-disasm.py +f:tools/perf/scripts/python/bin/compaction-times-record +f:tools/perf/scripts/python/bin/compaction-times-report +f:tools/perf/scripts/python/bin/event_analyzing_sample-record +f:tools/perf/scripts/python/bin/event_analyzing_sample-report +f:tools/perf/scripts/python/bin/export-to-postgresql-record +f:tools/perf/scripts/python/bin/export-to-postgresql-report +f:tools/perf/scripts/python/bin/export-to-sqlite-record +f:tools/perf/scripts/python/bin/export-to-sqlite-report +f:tools/perf/scripts/python/bin/failed-syscalls-by-pid-record +f:tools/perf/scripts/python/bin/failed-syscalls-by-pid-report +f:tools/perf/scripts/python/bin/flamegraph-record +f:tools/perf/scripts/python/bin/flamegraph-report +f:tools/perf/scripts/python/bin/futex-contention-record +f:tools/perf/scripts/python/bin/futex-contention-report +f:tools/perf/scripts/python/bin/gecko-record +f:tools/perf/scripts/python/bin/gecko-report +f:tools/perf/scripts/python/bin/intel-pt-events-record +f:tools/perf/scripts/python/bin/intel-pt-events-report +f:tools/perf/scripts/python/bin/mem-phys-addr-record +f:tools/perf/scripts/python/bin/mem-phys-addr-report +f:tools/perf/scripts/python/bin/net_dropmonitor-record +f:tools/perf/scripts/python/bin/net_dropmonitor-report +f:tools/perf/scripts/python/bin/netdev-times-record +f:tools/perf/scripts/python/bin/netdev-times-report +f:tools/perf/scripts/python/bin/powerpc-hcalls-record +f:tools/perf/scripts/python/bin/powerpc-hcalls-report +f:tools/perf/scripts/python/bin/sched-migration-record +f:tools/perf/scripts/python/bin/sched-migration-report +f:tools/perf/scripts/python/bin/sctop-record +f:tools/perf/scripts/python/bin/sctop-report +f:tools/perf/scripts/python/bin/stackcollapse-record +f:tools/perf/scripts/python/bin/stackcollapse-report +f:tools/perf/scripts/python/bin/syscall-counts-by-pid-record +f:tools/perf/scripts/python/bin/syscall-counts-by-pid-report +f:tools/perf/scripts/python/bin/syscall-counts-record +f:tools/perf/scripts/python/bin/syscall-counts-report +f:tools/perf/scripts/python/bin/task-analyzer-record +f:tools/perf/scripts/python/bin/task-analyzer-report +f:tools/perf/scripts/python/check-perf-trace.py +f:tools/perf/scripts/python/compaction-times.py +f:tools/perf/scripts/python/event_analyzing_sample.py +f:tools/perf/scripts/python/export-to-postgresql.py +f:tools/perf/scripts/python/export-to-sqlite.py +f:tools/perf/scripts/python/exported-sql-viewer.py +f:tools/perf/scripts/python/failed-syscalls-by-pid.py +f:tools/perf/scripts/python/flamegraph.py +f:tools/perf/scripts/python/futex-contention.py +f:tools/perf/scripts/python/gecko.py +f:tools/perf/scripts/python/intel-pt-events.py +f:tools/perf/scripts/python/libxed.py +f:tools/perf/scripts/python/mem-phys-addr.py +f:tools/perf/scripts/python/net_dropmonitor.py +f:tools/perf/scripts/python/netdev-times.py +f:tools/perf/scripts/python/parallel-perf.py +f:tools/perf/scripts/python/powerpc-hcalls.py +f:tools/perf/scripts/python/sched-migration.py +f:tools/perf/scripts/python/sctop.py +f:tools/perf/scripts/python/stackcollapse.py +f:tools/perf/scripts/python/stat-cpi.py +f:tools/perf/scripts/python/syscall-counts-by-pid.py +f:tools/perf/scripts/python/syscall-counts.py +f:tools/perf/scripts/python/task-analyzer.py +f:tools/perf/tests/Build +f:tools/perf/tests/api-io.c +f:tools/perf/tests/backward-ring-buffer.c +f:tools/perf/tests/bitmap.c +f:tools/perf/tests/bp_account.c +f:tools/perf/tests/bp_signal.c +f:tools/perf/tests/bp_signal_overflow.c +f:tools/perf/tests/builtin-test.c +f:tools/perf/tests/code-reading.c +f:tools/perf/tests/config-fragments/README +f:tools/perf/tests/config-fragments/arm64 +f:tools/perf/tests/config-fragments/config +f:tools/perf/tests/cpumap.c +f:tools/perf/tests/demangle-java-test.c +f:tools/perf/tests/demangle-ocaml-test.c +f:tools/perf/tests/demangle-rust-v0-test.c +f:tools/perf/tests/dlfilter-test.c +f:tools/perf/tests/dso-data.c +f:tools/perf/tests/dwarf-unwind.c +f:tools/perf/tests/event-times.c +f:tools/perf/tests/event_groups.c +f:tools/perf/tests/event_update.c +f:tools/perf/tests/evsel-roundtrip-name.c +f:tools/perf/tests/evsel-tp-sched.c +f:tools/perf/tests/expand-cgroup.c +f:tools/perf/tests/expr.c +f:tools/perf/tests/fdarray.c +f:tools/perf/tests/genelf.c +f:tools/perf/tests/hists_common.c +f:tools/perf/tests/hists_common.h +f:tools/perf/tests/hists_cumulate.c +f:tools/perf/tests/hists_filter.c +f:tools/perf/tests/hists_link.c +f:tools/perf/tests/hists_output.c +f:tools/perf/tests/hwmon_pmu.c +f:tools/perf/tests/is_printable_array.c +f:tools/perf/tests/keep-tracking.c +f:tools/perf/tests/kmod-path.c +f:tools/perf/tests/make +f:tools/perf/tests/maps.c +f:tools/perf/tests/mem.c +f:tools/perf/tests/mem2node.c +f:tools/perf/tests/mmap-basic.c +f:tools/perf/tests/mmap-thread-lookup.c +f:tools/perf/tests/openat-syscall-all-cpus.c +f:tools/perf/tests/openat-syscall-tp-fields.c +f:tools/perf/tests/openat-syscall.c +f:tools/perf/tests/parse-events.c +f:tools/perf/tests/parse-metric.c +f:tools/perf/tests/parse-no-sample-id-all.c +f:tools/perf/tests/pe-file-parsing.c +f:tools/perf/tests/pe-file.c +f:tools/perf/tests/pe-file.exe +f:tools/perf/tests/pe-file.exe.debug +f:tools/perf/tests/perf-hooks.c +f:tools/perf/tests/perf-record.c +f:tools/perf/tests/perf-targz-src-pkg +f:tools/perf/tests/perf-time-to-tsc.c +f:tools/perf/tests/pfm.c +f:tools/perf/tests/pmu-events.c +f:tools/perf/tests/pmu.c +f:tools/perf/tests/python-use.c +f:tools/perf/tests/sample-parsing.c +f:tools/perf/tests/sdt.c +f:tools/perf/tests/shell/amd-ibs-swfilt.sh +f:tools/perf/tests/shell/annotate.sh +f:tools/perf/tests/shell/attr.sh +f:tools/perf/tests/shell/attr/README +f:tools/perf/tests/shell/attr/base-record +f:tools/perf/tests/shell/attr/base-record-spe +f:tools/perf/tests/shell/attr/base-stat +f:tools/perf/tests/shell/attr/system-wide-dummy +f:tools/perf/tests/shell/attr/test-record-C0 +f:tools/perf/tests/shell/attr/test-record-basic +f:tools/perf/tests/shell/attr/test-record-branch-any +f:tools/perf/tests/shell/attr/test-record-branch-filter-any +f:tools/perf/tests/shell/attr/test-record-branch-filter-any_call +f:tools/perf/tests/shell/attr/test-record-branch-filter-any_ret +f:tools/perf/tests/shell/attr/test-record-branch-filter-hv +f:tools/perf/tests/shell/attr/test-record-branch-filter-ind_call +f:tools/perf/tests/shell/attr/test-record-branch-filter-k +f:tools/perf/tests/shell/attr/test-record-branch-filter-u +f:tools/perf/tests/shell/attr/test-record-count +f:tools/perf/tests/shell/attr/test-record-data +f:tools/perf/tests/shell/attr/test-record-dummy-C0 +f:tools/perf/tests/shell/attr/test-record-freq +f:tools/perf/tests/shell/attr/test-record-graph-default +f:tools/perf/tests/shell/attr/test-record-graph-default-aarch64 +f:tools/perf/tests/shell/attr/test-record-graph-dwarf +f:tools/perf/tests/shell/attr/test-record-graph-fp +f:tools/perf/tests/shell/attr/test-record-graph-fp-aarch64 +f:tools/perf/tests/shell/attr/test-record-group-sampling +f:tools/perf/tests/shell/attr/test-record-group-sampling1 +f:tools/perf/tests/shell/attr/test-record-group-sampling2 +f:tools/perf/tests/shell/attr/test-record-group1 +f:tools/perf/tests/shell/attr/test-record-group2 +f:tools/perf/tests/shell/attr/test-record-group3 +f:tools/perf/tests/shell/attr/test-record-no-buffering +f:tools/perf/tests/shell/attr/test-record-no-inherit +f:tools/perf/tests/shell/attr/test-record-no-samples +f:tools/perf/tests/shell/attr/test-record-period +f:tools/perf/tests/shell/attr/test-record-pfm-period +f:tools/perf/tests/shell/attr/test-record-raw +f:tools/perf/tests/shell/attr/test-record-spe-period +f:tools/perf/tests/shell/attr/test-record-spe-period-term +f:tools/perf/tests/shell/attr/test-record-spe-physical-address +f:tools/perf/tests/shell/attr/test-record-user-regs-no-sve-aarch64 +f:tools/perf/tests/shell/attr/test-record-user-regs-old-sve-aarch64 +f:tools/perf/tests/shell/attr/test-record-user-regs-sve-aarch64 +f:tools/perf/tests/shell/attr/test-stat-C0 +f:tools/perf/tests/shell/attr/test-stat-basic +f:tools/perf/tests/shell/attr/test-stat-default +f:tools/perf/tests/shell/attr/test-stat-detailed-1 +f:tools/perf/tests/shell/attr/test-stat-detailed-2 +f:tools/perf/tests/shell/attr/test-stat-detailed-3 +f:tools/perf/tests/shell/attr/test-stat-group1 +f:tools/perf/tests/shell/attr/test-stat-no-inherit +f:tools/perf/tests/shell/base_probe/test_adding_blacklisted.sh +f:tools/perf/tests/shell/base_probe/test_adding_kernel.sh +f:tools/perf/tests/shell/base_probe/test_basic.sh +f:tools/perf/tests/shell/base_probe/test_invalid_options.sh +f:tools/perf/tests/shell/base_probe/test_line_semantics.sh +f:tools/perf/tests/shell/base_report/setup.sh +f:tools/perf/tests/shell/base_report/stderr-whitelist.txt +f:tools/perf/tests/shell/base_report/test_basic.sh +f:tools/perf/tests/shell/buildid.sh +f:tools/perf/tests/shell/common/check_all_lines_matched.pl +f:tools/perf/tests/shell/common/check_all_patterns_found.pl +f:tools/perf/tests/shell/common/check_errors_whitelisted.pl +f:tools/perf/tests/shell/common/check_no_patterns_found.pl +f:tools/perf/tests/shell/common/init.sh +f:tools/perf/tests/shell/common/patterns.sh +f:tools/perf/tests/shell/common/settings.sh +f:tools/perf/tests/shell/coresight/Makefile +f:tools/perf/tests/shell/coresight/Makefile.miniconfig +f:tools/perf/tests/shell/coresight/asm_pure_loop.sh +f:tools/perf/tests/shell/coresight/asm_pure_loop/.gitignore +f:tools/perf/tests/shell/coresight/asm_pure_loop/Makefile +f:tools/perf/tests/shell/coresight/asm_pure_loop/asm_pure_loop.S +f:tools/perf/tests/shell/coresight/memcpy_thread/.gitignore +f:tools/perf/tests/shell/coresight/memcpy_thread/Makefile +f:tools/perf/tests/shell/coresight/memcpy_thread/memcpy_thread.c +f:tools/perf/tests/shell/coresight/memcpy_thread_16k_10.sh +f:tools/perf/tests/shell/coresight/thread_loop/.gitignore +f:tools/perf/tests/shell/coresight/thread_loop/Makefile +f:tools/perf/tests/shell/coresight/thread_loop/thread_loop.c +f:tools/perf/tests/shell/coresight/thread_loop_check_tid_10.sh +f:tools/perf/tests/shell/coresight/thread_loop_check_tid_2.sh +f:tools/perf/tests/shell/coresight/unroll_loop_thread/.gitignore +f:tools/perf/tests/shell/coresight/unroll_loop_thread/Makefile +f:tools/perf/tests/shell/coresight/unroll_loop_thread/unroll_loop_thread.c +f:tools/perf/tests/shell/coresight/unroll_loop_thread_10.sh +f:tools/perf/tests/shell/daemon.sh +f:tools/perf/tests/shell/diff.sh +f:tools/perf/tests/shell/ftrace.sh +f:tools/perf/tests/shell/lib/attr.py +f:tools/perf/tests/shell/lib/coresight.sh +f:tools/perf/tests/shell/lib/perf_has_symbol.sh +f:tools/perf/tests/shell/lib/perf_json_output_lint.py +f:tools/perf/tests/shell/lib/perf_metric_validation.py +f:tools/perf/tests/shell/lib/perf_metric_validation_rules.json +f:tools/perf/tests/shell/lib/probe.sh +f:tools/perf/tests/shell/lib/probe_vfs_getname.sh +f:tools/perf/tests/shell/lib/setup_python.sh +f:tools/perf/tests/shell/lib/stat_output.sh +f:tools/perf/tests/shell/lib/waiting.sh +f:tools/perf/tests/shell/list.sh +f:tools/perf/tests/shell/lock_contention.sh +f:tools/perf/tests/shell/perf-report-hierarchy.sh +f:tools/perf/tests/shell/perftool-testsuite_probe.sh +f:tools/perf/tests/shell/perftool-testsuite_report.sh +f:tools/perf/tests/shell/pipe_test.sh +f:tools/perf/tests/shell/probe_vfs_getname.sh +f:tools/perf/tests/shell/record+probe_libc_inet_pton.sh +f:tools/perf/tests/shell/record+script_probe_vfs_getname.sh +f:tools/perf/tests/shell/record+zstd_comp_decomp.sh +f:tools/perf/tests/shell/record.sh +f:tools/perf/tests/shell/record_bpf_filter.sh +f:tools/perf/tests/shell/record_lbr.sh +f:tools/perf/tests/shell/record_offcpu.sh +f:tools/perf/tests/shell/record_sideband.sh +f:tools/perf/tests/shell/script.sh +f:tools/perf/tests/shell/stat+csv_output.sh +f:tools/perf/tests/shell/stat+csv_summary.sh +f:tools/perf/tests/shell/stat+event_uniquifying.sh +f:tools/perf/tests/shell/stat+json_output.sh +f:tools/perf/tests/shell/stat+shadow_stat.sh +f:tools/perf/tests/shell/stat+std_output.sh +f:tools/perf/tests/shell/stat.sh +f:tools/perf/tests/shell/stat_all_metricgroups.sh +f:tools/perf/tests/shell/stat_all_metrics.sh +f:tools/perf/tests/shell/stat_all_pfm.sh +f:tools/perf/tests/shell/stat_all_pmu.sh +f:tools/perf/tests/shell/stat_bpf_counters.sh +f:tools/perf/tests/shell/stat_bpf_counters_cgrp.sh +f:tools/perf/tests/shell/stat_metrics_values.sh +f:tools/perf/tests/shell/test_arm_callgraph_fp.sh +f:tools/perf/tests/shell/test_arm_coresight.sh +f:tools/perf/tests/shell/test_arm_coresight_disasm.sh +f:tools/perf/tests/shell/test_arm_spe.sh +f:tools/perf/tests/shell/test_arm_spe_fork.sh +f:tools/perf/tests/shell/test_brstack.sh +f:tools/perf/tests/shell/test_data_symbol.sh +f:tools/perf/tests/shell/test_intel_pt.sh +f:tools/perf/tests/shell/test_java_symbol.sh +f:tools/perf/tests/shell/test_perf_data_converter_json.sh +f:tools/perf/tests/shell/test_stat_intel_tpebs.sh +f:tools/perf/tests/shell/test_task_analyzer.sh +f:tools/perf/tests/shell/test_uprobe_from_different_cu.sh +f:tools/perf/tests/shell/trace+probe_vfs_getname.sh +f:tools/perf/tests/shell/trace_btf_enum.sh +f:tools/perf/tests/shell/trace_btf_general.sh +f:tools/perf/tests/shell/trace_exit_race.sh +f:tools/perf/tests/shell/trace_record_replay.sh +f:tools/perf/tests/shell/trace_summary.sh +f:tools/perf/tests/sigtrap.c +f:tools/perf/tests/stat.c +f:tools/perf/tests/sw-clock.c +f:tools/perf/tests/switch-tracking.c +f:tools/perf/tests/symbols.c +f:tools/perf/tests/task-exit.c +f:tools/perf/tests/tests-scripts.c +f:tools/perf/tests/tests-scripts.h +f:tools/perf/tests/tests.h +f:tools/perf/tests/thread-map.c +f:tools/perf/tests/thread-maps-share.c +f:tools/perf/tests/time-utils-test.c +f:tools/perf/tests/tool_pmu.c +f:tools/perf/tests/topology.c +f:tools/perf/tests/unit_number__scnprintf.c +f:tools/perf/tests/util.c +f:tools/perf/tests/vmlinux-kallsyms.c +f:tools/perf/tests/workloads/Build +f:tools/perf/tests/workloads/brstack.c +f:tools/perf/tests/workloads/datasym.c +f:tools/perf/tests/workloads/landlock.c +f:tools/perf/tests/workloads/leafloop.c +f:tools/perf/tests/workloads/noploop.c +f:tools/perf/tests/workloads/sqrtloop.c +f:tools/perf/tests/workloads/thloop.c +f:tools/perf/tests/wp.c +f:tools/perf/trace/beauty/Build +f:tools/perf/trace/beauty/arch/x86/include/asm/irq_vectors.h +f:tools/perf/trace/beauty/arch/x86/include/uapi/asm/prctl.h +f:tools/perf/trace/beauty/arch_errno_names.c +f:tools/perf/trace/beauty/arch_errno_names.sh +f:tools/perf/trace/beauty/arch_prctl.c +f:tools/perf/trace/beauty/beauty.h +f:tools/perf/trace/beauty/clone.c +f:tools/perf/trace/beauty/clone.sh +f:tools/perf/trace/beauty/drm_ioctl.sh +f:tools/perf/trace/beauty/eventfd.c +f:tools/perf/trace/beauty/fadvise.sh +f:tools/perf/trace/beauty/fcntl.c +f:tools/perf/trace/beauty/flock.c +f:tools/perf/trace/beauty/fs_at_flags.c +f:tools/perf/trace/beauty/fs_at_flags.sh +f:tools/perf/trace/beauty/fsconfig.sh +f:tools/perf/trace/beauty/fsmount.c +f:tools/perf/trace/beauty/fsmount.sh +f:tools/perf/trace/beauty/fspick.c +f:tools/perf/trace/beauty/fspick.sh +f:tools/perf/trace/beauty/futex_op.c +f:tools/perf/trace/beauty/futex_val3.c +f:tools/perf/trace/beauty/include/linux/socket.h +f:tools/perf/trace/beauty/include/uapi/linux/fcntl.h +f:tools/perf/trace/beauty/include/uapi/linux/fs.h +f:tools/perf/trace/beauty/include/uapi/linux/mount.h +f:tools/perf/trace/beauty/include/uapi/linux/prctl.h +f:tools/perf/trace/beauty/include/uapi/linux/sched.h +f:tools/perf/trace/beauty/include/uapi/linux/stat.h +f:tools/perf/trace/beauty/include/uapi/linux/usbdevice_fs.h +f:tools/perf/trace/beauty/include/uapi/linux/vhost.h +f:tools/perf/trace/beauty/include/uapi/sound/asound.h +f:tools/perf/trace/beauty/ioctl.c +f:tools/perf/trace/beauty/kcmp.c +f:tools/perf/trace/beauty/kcmp_type.sh +f:tools/perf/trace/beauty/kvm_ioctl.sh +f:tools/perf/trace/beauty/madvise_behavior.sh +f:tools/perf/trace/beauty/mmap.c +f:tools/perf/trace/beauty/mmap_flags.sh +f:tools/perf/trace/beauty/mmap_prot.sh +f:tools/perf/trace/beauty/mode_t.c +f:tools/perf/trace/beauty/mount_flags.c +f:tools/perf/trace/beauty/mount_flags.sh +f:tools/perf/trace/beauty/move_mount.c +f:tools/perf/trace/beauty/move_mount_flags.sh +f:tools/perf/trace/beauty/mremap_flags.sh +f:tools/perf/trace/beauty/msg_flags.c +f:tools/perf/trace/beauty/open_flags.c +f:tools/perf/trace/beauty/perf_event_open.c +f:tools/perf/trace/beauty/perf_ioctl.sh +f:tools/perf/trace/beauty/pid.c +f:tools/perf/trace/beauty/pkey_alloc.c +f:tools/perf/trace/beauty/pkey_alloc_access_rights.sh +f:tools/perf/trace/beauty/prctl.c +f:tools/perf/trace/beauty/prctl_option.sh +f:tools/perf/trace/beauty/rename_flags.sh +f:tools/perf/trace/beauty/renameat.c +f:tools/perf/trace/beauty/sched_policy.c +f:tools/perf/trace/beauty/seccomp.c +f:tools/perf/trace/beauty/signum.c +f:tools/perf/trace/beauty/sndrv_ctl_ioctl.sh +f:tools/perf/trace/beauty/sndrv_pcm_ioctl.sh +f:tools/perf/trace/beauty/sockaddr.c +f:tools/perf/trace/beauty/sockaddr.sh +f:tools/perf/trace/beauty/socket.c +f:tools/perf/trace/beauty/socket.sh +f:tools/perf/trace/beauty/socket_type.c +f:tools/perf/trace/beauty/statx.c +f:tools/perf/trace/beauty/statx_mask.sh +f:tools/perf/trace/beauty/sync_file_range.c +f:tools/perf/trace/beauty/sync_file_range.sh +f:tools/perf/trace/beauty/syscalltbl.sh +f:tools/perf/trace/beauty/timespec.c +f:tools/perf/trace/beauty/tracepoints/Build +f:tools/perf/trace/beauty/tracepoints/x86_irq_vectors.c +f:tools/perf/trace/beauty/tracepoints/x86_irq_vectors.sh +f:tools/perf/trace/beauty/tracepoints/x86_msr.c +f:tools/perf/trace/beauty/tracepoints/x86_msr.sh +f:tools/perf/trace/beauty/usbdevfs_ioctl.sh +f:tools/perf/trace/beauty/vhost_virtio_ioctl.sh +f:tools/perf/trace/beauty/waitid_options.c +f:tools/perf/trace/beauty/x86_arch_prctl.sh +f:tools/perf/trace/strace/groups/file +f:tools/perf/trace/strace/groups/string +f:tools/perf/ui/Build +f:tools/perf/ui/browser.c +f:tools/perf/ui/browser.h +f:tools/perf/ui/browsers/Build +f:tools/perf/ui/browsers/annotate-data.c +f:tools/perf/ui/browsers/annotate.c +f:tools/perf/ui/browsers/header.c +f:tools/perf/ui/browsers/hists.c +f:tools/perf/ui/browsers/hists.h +f:tools/perf/ui/browsers/map.c +f:tools/perf/ui/browsers/map.h +f:tools/perf/ui/browsers/res_sample.c +f:tools/perf/ui/browsers/scripts.c +f:tools/perf/ui/gtk/Build +f:tools/perf/ui/gtk/annotate.c +f:tools/perf/ui/gtk/browser.c +f:tools/perf/ui/gtk/gtk.h +f:tools/perf/ui/gtk/helpline.c +f:tools/perf/ui/gtk/hists.c +f:tools/perf/ui/gtk/progress.c +f:tools/perf/ui/gtk/setup.c +f:tools/perf/ui/gtk/util.c +f:tools/perf/ui/helpline.c +f:tools/perf/ui/helpline.h +f:tools/perf/ui/hist.c +f:tools/perf/ui/keysyms.c +f:tools/perf/ui/keysyms.h +f:tools/perf/ui/libslang.h +f:tools/perf/ui/progress.c +f:tools/perf/ui/progress.h +f:tools/perf/ui/setup.c +f:tools/perf/ui/stdio/hist.c +f:tools/perf/ui/tui/Build +f:tools/perf/ui/tui/helpline.c +f:tools/perf/ui/tui/progress.c +f:tools/perf/ui/tui/setup.c +f:tools/perf/ui/tui/tui.h +f:tools/perf/ui/tui/util.c +f:tools/perf/ui/ui.h +f:tools/perf/ui/util.c +f:tools/perf/ui/util.h +f:tools/perf/util/Build +f:tools/perf/util/PERF-VERSION-GEN +f:tools/perf/util/addr_location.c +f:tools/perf/util/addr_location.h +f:tools/perf/util/affinity.c +f:tools/perf/util/affinity.h +f:tools/perf/util/amd-sample-raw.c +f:tools/perf/util/annotate-data.c +f:tools/perf/util/annotate-data.h +f:tools/perf/util/annotate.c +f:tools/perf/util/annotate.h +f:tools/perf/util/archinsn.h +f:tools/perf/util/arm-spe-decoder/Build +f:tools/perf/util/arm-spe-decoder/arm-spe-decoder.c +f:tools/perf/util/arm-spe-decoder/arm-spe-decoder.h +f:tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.c +f:tools/perf/util/arm-spe-decoder/arm-spe-pkt-decoder.h +f:tools/perf/util/arm-spe.c +f:tools/perf/util/arm-spe.h +f:tools/perf/util/arm64-frame-pointer-unwind-support.c +f:tools/perf/util/arm64-frame-pointer-unwind-support.h +f:tools/perf/util/auxtrace.c +f:tools/perf/util/auxtrace.h +f:tools/perf/util/block-info.c +f:tools/perf/util/block-info.h +f:tools/perf/util/block-range.c +f:tools/perf/util/block-range.h +f:tools/perf/util/bpf-event.c +f:tools/perf/util/bpf-event.h +f:tools/perf/util/bpf-filter.c +f:tools/perf/util/bpf-filter.h +f:tools/perf/util/bpf-filter.l +f:tools/perf/util/bpf-filter.y +f:tools/perf/util/bpf-trace-summary.c +f:tools/perf/util/bpf-utils.c +f:tools/perf/util/bpf-utils.h +f:tools/perf/util/bpf_counter.c +f:tools/perf/util/bpf_counter.h +f:tools/perf/util/bpf_counter_cgroup.c +f:tools/perf/util/bpf_ftrace.c +f:tools/perf/util/bpf_kwork.c +f:tools/perf/util/bpf_kwork_top.c +f:tools/perf/util/bpf_lock_contention.c +f:tools/perf/util/bpf_map.c +f:tools/perf/util/bpf_map.h +f:tools/perf/util/bpf_off_cpu.c +f:tools/perf/util/bpf_skel/.gitignore +f:tools/perf/util/bpf_skel/augmented_raw_syscalls.bpf.c +f:tools/perf/util/bpf_skel/bench_uprobe.bpf.c +f:tools/perf/util/bpf_skel/bperf_cgroup.bpf.c +f:tools/perf/util/bpf_skel/bperf_follower.bpf.c +f:tools/perf/util/bpf_skel/bperf_leader.bpf.c +f:tools/perf/util/bpf_skel/bperf_u.h +f:tools/perf/util/bpf_skel/bpf_prog_profiler.bpf.c +f:tools/perf/util/bpf_skel/func_latency.bpf.c +f:tools/perf/util/bpf_skel/kwork_top.bpf.c +f:tools/perf/util/bpf_skel/kwork_trace.bpf.c +f:tools/perf/util/bpf_skel/lock_contention.bpf.c +f:tools/perf/util/bpf_skel/lock_data.h +f:tools/perf/util/bpf_skel/off_cpu.bpf.c +f:tools/perf/util/bpf_skel/sample-filter.h +f:tools/perf/util/bpf_skel/sample_filter.bpf.c +f:tools/perf/util/bpf_skel/syscall_summary.bpf.c +f:tools/perf/util/bpf_skel/syscall_summary.h +f:tools/perf/util/bpf_skel/vmlinux/.gitignore +f:tools/perf/util/bpf_skel/vmlinux/vmlinux.h +f:tools/perf/util/branch.c +f:tools/perf/util/branch.h +f:tools/perf/util/btf.c +f:tools/perf/util/btf.h +f:tools/perf/util/build-id.c +f:tools/perf/util/build-id.h +f:tools/perf/util/cache.h +f:tools/perf/util/cacheline.c +f:tools/perf/util/cacheline.h +f:tools/perf/util/call-path.c +f:tools/perf/util/call-path.h +f:tools/perf/util/callchain.c +f:tools/perf/util/callchain.h +f:tools/perf/util/cap.c +f:tools/perf/util/cap.h +f:tools/perf/util/cgroup.c +f:tools/perf/util/cgroup.h +f:tools/perf/util/clockid.c +f:tools/perf/util/clockid.h +f:tools/perf/util/cloexec.c +f:tools/perf/util/cloexec.h +f:tools/perf/util/color.c +f:tools/perf/util/color.h +f:tools/perf/util/color_config.c +f:tools/perf/util/comm.c +f:tools/perf/util/comm.h +f:tools/perf/util/compress.h +f:tools/perf/util/config.c +f:tools/perf/util/config.h +f:tools/perf/util/copyfile.c +f:tools/perf/util/copyfile.h +f:tools/perf/util/counts.c +f:tools/perf/util/counts.h +f:tools/perf/util/cpu-set-sched.h +f:tools/perf/util/cpumap.c +f:tools/perf/util/cpumap.h +f:tools/perf/util/cputopo.c +f:tools/perf/util/cputopo.h +f:tools/perf/util/cs-etm-base.c +f:tools/perf/util/cs-etm-decoder/Build +f:tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +f:tools/perf/util/cs-etm-decoder/cs-etm-decoder.h +f:tools/perf/util/cs-etm.c +f:tools/perf/util/cs-etm.h +f:tools/perf/util/data-convert-bt.c +f:tools/perf/util/data-convert-json.c +f:tools/perf/util/data-convert.h +f:tools/perf/util/data.c +f:tools/perf/util/data.h +f:tools/perf/util/db-export.c +f:tools/perf/util/db-export.h +f:tools/perf/util/debug.c +f:tools/perf/util/debug.h +f:tools/perf/util/debuginfo.c +f:tools/perf/util/debuginfo.h +f:tools/perf/util/demangle-cxx.cpp +f:tools/perf/util/demangle-cxx.h +f:tools/perf/util/demangle-java.c +f:tools/perf/util/demangle-java.h +f:tools/perf/util/demangle-ocaml.c +f:tools/perf/util/demangle-ocaml.h +f:tools/perf/util/demangle-rust-v0.c +f:tools/perf/util/demangle-rust-v0.h +f:tools/perf/util/disasm.c +f:tools/perf/util/disasm.h +f:tools/perf/util/disasm_bpf.c +f:tools/perf/util/disasm_bpf.h +f:tools/perf/util/dlfilter.c +f:tools/perf/util/dlfilter.h +f:tools/perf/util/dso.c +f:tools/perf/util/dso.h +f:tools/perf/util/dsos.c +f:tools/perf/util/dsos.h +f:tools/perf/util/dump-insn.c +f:tools/perf/util/dump-insn.h +f:tools/perf/util/dwarf-aux.c +f:tools/perf/util/dwarf-aux.h +f:tools/perf/util/dwarf-regs-csky.c +f:tools/perf/util/dwarf-regs-powerpc.c +f:tools/perf/util/dwarf-regs-x86.c +f:tools/perf/util/dwarf-regs.c +f:tools/perf/util/env.c +f:tools/perf/util/env.h +f:tools/perf/util/event.c +f:tools/perf/util/event.h +f:tools/perf/util/events_stats.h +f:tools/perf/util/evlist.c +f:tools/perf/util/evlist.h +f:tools/perf/util/evsel.c +f:tools/perf/util/evsel.h +f:tools/perf/util/evsel_config.h +f:tools/perf/util/evsel_fprintf.c +f:tools/perf/util/evsel_fprintf.h +f:tools/perf/util/evswitch.c +f:tools/perf/util/evswitch.h +f:tools/perf/util/expr.c +f:tools/perf/util/expr.h +f:tools/perf/util/expr.l +f:tools/perf/util/expr.y +f:tools/perf/util/find-map.c +f:tools/perf/util/fncache.c +f:tools/perf/util/fncache.h +f:tools/perf/util/ftrace.h +f:tools/perf/util/genelf.c +f:tools/perf/util/genelf.h +f:tools/perf/util/genelf_debug.c +f:tools/perf/util/generate-cmdlist.sh +f:tools/perf/util/get_current_dir_name.c +f:tools/perf/util/get_current_dir_name.h +f:tools/perf/util/hashmap.c +f:tools/perf/util/hashmap.h +f:tools/perf/util/header.c +f:tools/perf/util/header.h +f:tools/perf/util/help-unknown-cmd.c +f:tools/perf/util/help-unknown-cmd.h +f:tools/perf/util/hisi-ptt-decoder/Build +f:tools/perf/util/hisi-ptt-decoder/hisi-ptt-pkt-decoder.c +f:tools/perf/util/hisi-ptt-decoder/hisi-ptt-pkt-decoder.h +f:tools/perf/util/hisi-ptt.c +f:tools/perf/util/hisi-ptt.h +f:tools/perf/util/hist.c +f:tools/perf/util/hist.h +f:tools/perf/util/hwmon_pmu.c +f:tools/perf/util/hwmon_pmu.h +f:tools/perf/util/include/asm/asm-offsets.h +f:tools/perf/util/include/asm/cpufeature.h +f:tools/perf/util/include/asm/dwarf2.h +f:tools/perf/util/include/asm/swab.h +f:tools/perf/util/include/asm/system.h +f:tools/perf/util/include/asm/uaccess.h +f:tools/perf/util/include/dwarf-regs.h +f:tools/perf/util/include/linux/linkage.h +f:tools/perf/util/intel-bts.c +f:tools/perf/util/intel-bts.h +f:tools/perf/util/intel-pt-decoder/Build +f:tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +f:tools/perf/util/intel-pt-decoder/intel-pt-decoder.h +f:tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.c +f:tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.h +f:tools/perf/util/intel-pt-decoder/intel-pt-log.c +f:tools/perf/util/intel-pt-decoder/intel-pt-log.h +f:tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c +f:tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.h +f:tools/perf/util/intel-pt.c +f:tools/perf/util/intel-pt.h +f:tools/perf/util/intel-tpebs.c +f:tools/perf/util/intel-tpebs.h +f:tools/perf/util/intlist.c +f:tools/perf/util/intlist.h +f:tools/perf/util/iostat.c +f:tools/perf/util/iostat.h +f:tools/perf/util/jit.h +f:tools/perf/util/jitdump.c +f:tools/perf/util/jitdump.h +f:tools/perf/util/kvm-stat.c +f:tools/perf/util/kvm-stat.h +f:tools/perf/util/kwork.h +f:tools/perf/util/levenshtein.c +f:tools/perf/util/levenshtein.h +f:tools/perf/util/libunwind/arm64.c +f:tools/perf/util/libunwind/x86_32.c +f:tools/perf/util/llvm-c-helpers.cpp +f:tools/perf/util/llvm-c-helpers.h +f:tools/perf/util/lock-contention.c +f:tools/perf/util/lock-contention.h +f:tools/perf/util/lzma.c +f:tools/perf/util/machine.c +f:tools/perf/util/machine.h +f:tools/perf/util/map.c +f:tools/perf/util/map.h +f:tools/perf/util/map_symbol.c +f:tools/perf/util/map_symbol.h +f:tools/perf/util/maps.c +f:tools/perf/util/maps.h +f:tools/perf/util/mem-events.c +f:tools/perf/util/mem-events.h +f:tools/perf/util/mem-info.c +f:tools/perf/util/mem-info.h +f:tools/perf/util/mem2node.c +f:tools/perf/util/mem2node.h +f:tools/perf/util/memswap.c +f:tools/perf/util/memswap.h +f:tools/perf/util/metricgroup.c +f:tools/perf/util/metricgroup.h +f:tools/perf/util/mmap.c +f:tools/perf/util/mmap.h +f:tools/perf/util/mutex.c +f:tools/perf/util/mutex.h +f:tools/perf/util/namespaces.c +f:tools/perf/util/namespaces.h +f:tools/perf/util/off_cpu.h +f:tools/perf/util/ordered-events.c +f:tools/perf/util/ordered-events.h +f:tools/perf/util/parse-branch-options.c +f:tools/perf/util/parse-branch-options.h +f:tools/perf/util/parse-events.c +f:tools/perf/util/parse-events.h +f:tools/perf/util/parse-events.l +f:tools/perf/util/parse-events.y +f:tools/perf/util/parse-regs-options.c +f:tools/perf/util/parse-regs-options.h +f:tools/perf/util/parse-sublevel-options.c +f:tools/perf/util/parse-sublevel-options.h +f:tools/perf/util/path.c +f:tools/perf/util/path.h +f:tools/perf/util/perf-hooks-list.h +f:tools/perf/util/perf-hooks.c +f:tools/perf/util/perf-hooks.h +f:tools/perf/util/perf-regs-arch/Build +f:tools/perf/util/perf-regs-arch/perf_regs_aarch64.c +f:tools/perf/util/perf-regs-arch/perf_regs_arm.c +f:tools/perf/util/perf-regs-arch/perf_regs_csky.c +f:tools/perf/util/perf-regs-arch/perf_regs_loongarch.c +f:tools/perf/util/perf-regs-arch/perf_regs_mips.c +f:tools/perf/util/perf-regs-arch/perf_regs_powerpc.c +f:tools/perf/util/perf-regs-arch/perf_regs_riscv.c +f:tools/perf/util/perf-regs-arch/perf_regs_s390.c +f:tools/perf/util/perf-regs-arch/perf_regs_x86.c +f:tools/perf/util/perf_api_probe.c +f:tools/perf/util/perf_api_probe.h +f:tools/perf/util/perf_event_attr_fprintf.c +f:tools/perf/util/perf_regs.c +f:tools/perf/util/perf_regs.h +f:tools/perf/util/pfm.c +f:tools/perf/util/pfm.h +f:tools/perf/util/pmu.c +f:tools/perf/util/pmu.h +f:tools/perf/util/pmu.l +f:tools/perf/util/pmu.y +f:tools/perf/util/pmus.c +f:tools/perf/util/pmus.h +f:tools/perf/util/print-events.c +f:tools/perf/util/print-events.h +f:tools/perf/util/print_binary.c +f:tools/perf/util/print_binary.h +f:tools/perf/util/print_insn.c +f:tools/perf/util/print_insn.h +f:tools/perf/util/probe-event.c +f:tools/perf/util/probe-event.h +f:tools/perf/util/probe-file.c +f:tools/perf/util/probe-file.h +f:tools/perf/util/probe-finder.c +f:tools/perf/util/probe-finder.h +f:tools/perf/util/pstack.c +f:tools/perf/util/pstack.h +f:tools/perf/util/python.c +f:tools/perf/util/rblist.c +f:tools/perf/util/rblist.h +f:tools/perf/util/record.c +f:tools/perf/util/record.h +f:tools/perf/util/rlimit.c +f:tools/perf/util/rlimit.h +f:tools/perf/util/rwsem.c +f:tools/perf/util/rwsem.h +f:tools/perf/util/s390-cpumcf-kernel.h +f:tools/perf/util/s390-cpumsf-kernel.h +f:tools/perf/util/s390-cpumsf.c +f:tools/perf/util/s390-cpumsf.h +f:tools/perf/util/s390-sample-raw.c +f:tools/perf/util/sample-raw.c +f:tools/perf/util/sample-raw.h +f:tools/perf/util/sample.c +f:tools/perf/util/sample.h +f:tools/perf/util/scripting-engines/Build +f:tools/perf/util/scripting-engines/trace-event-perl.c +f:tools/perf/util/scripting-engines/trace-event-python.c +f:tools/perf/util/session.c +f:tools/perf/util/session.h +f:tools/perf/util/setns.c +f:tools/perf/util/setup.py +f:tools/perf/util/sharded_mutex.c +f:tools/perf/util/sharded_mutex.h +f:tools/perf/util/sideband_evlist.c +f:tools/perf/util/smt.c +f:tools/perf/util/smt.h +f:tools/perf/util/sort.c +f:tools/perf/util/sort.h +f:tools/perf/util/spark.c +f:tools/perf/util/spark.h +f:tools/perf/util/srccode.c +f:tools/perf/util/srccode.h +f:tools/perf/util/srcline.c +f:tools/perf/util/srcline.h +f:tools/perf/util/stat-display.c +f:tools/perf/util/stat-shadow.c +f:tools/perf/util/stat.c +f:tools/perf/util/stat.h +f:tools/perf/util/strbuf.c +f:tools/perf/util/strbuf.h +f:tools/perf/util/stream.c +f:tools/perf/util/stream.h +f:tools/perf/util/strfilter.c +f:tools/perf/util/strfilter.h +f:tools/perf/util/string.c +f:tools/perf/util/string2.h +f:tools/perf/util/strlist.c +f:tools/perf/util/strlist.h +f:tools/perf/util/svghelper.c +f:tools/perf/util/svghelper.h +f:tools/perf/util/symbol-elf.c +f:tools/perf/util/symbol-minimal.c +f:tools/perf/util/symbol.c +f:tools/perf/util/symbol.h +f:tools/perf/util/symbol_conf.h +f:tools/perf/util/symbol_fprintf.c +f:tools/perf/util/symsrc.h +f:tools/perf/util/synthetic-events.c +f:tools/perf/util/synthetic-events.h +f:tools/perf/util/syscalltbl.c +f:tools/perf/util/syscalltbl.h +f:tools/perf/util/target.c +f:tools/perf/util/target.h +f:tools/perf/util/term.c +f:tools/perf/util/term.h +f:tools/perf/util/thread-stack.c +f:tools/perf/util/thread-stack.h +f:tools/perf/util/thread.c +f:tools/perf/util/thread.h +f:tools/perf/util/thread_map.c +f:tools/perf/util/thread_map.h +f:tools/perf/util/threads.c +f:tools/perf/util/threads.h +f:tools/perf/util/time-utils.c +f:tools/perf/util/time-utils.h +f:tools/perf/util/tool.c +f:tools/perf/util/tool.h +f:tools/perf/util/tool_pmu.c +f:tools/perf/util/tool_pmu.h +f:tools/perf/util/top.c +f:tools/perf/util/top.h +f:tools/perf/util/topdown.c +f:tools/perf/util/topdown.h +f:tools/perf/util/trace-event-info.c +f:tools/perf/util/trace-event-parse.c +f:tools/perf/util/trace-event-read.c +f:tools/perf/util/trace-event-scripting.c +f:tools/perf/util/trace-event.c +f:tools/perf/util/trace-event.h +f:tools/perf/util/trace.h +f:tools/perf/util/trace_augment.h +f:tools/perf/util/tracepoint.c +f:tools/perf/util/tracepoint.h +f:tools/perf/util/trigger.h +f:tools/perf/util/tsc.c +f:tools/perf/util/tsc.h +f:tools/perf/util/units.c +f:tools/perf/util/units.h +f:tools/perf/util/unwind-libdw.c +f:tools/perf/util/unwind-libdw.h +f:tools/perf/util/unwind-libunwind-local.c +f:tools/perf/util/unwind-libunwind.c +f:tools/perf/util/unwind.h +f:tools/perf/util/usage.c +f:tools/perf/util/util.c +f:tools/perf/util/util.h +f:tools/perf/util/values.c +f:tools/perf/util/values.h +f:tools/perf/util/vdso.c +f:tools/perf/util/vdso.h +f:tools/perf/util/zlib.c +f:tools/perf/util/zstd.c +f:tools/power/acpi/.gitignore +f:tools/power/acpi/Makefile +f:tools/power/acpi/Makefile.config +f:tools/power/acpi/Makefile.rules +f:tools/power/acpi/common/cmfsize.c +f:tools/power/acpi/common/getopt.c +f:tools/power/acpi/man/acpidump.8 +f:tools/power/acpi/man/pfrut.8 +f:tools/power/acpi/os_specific/service_layers/oslinuxtbl.c +f:tools/power/acpi/os_specific/service_layers/osunixdir.c +f:tools/power/acpi/os_specific/service_layers/osunixmap.c +f:tools/power/acpi/os_specific/service_layers/osunixxf.c +f:tools/power/acpi/tools/acpidbg/Makefile +f:tools/power/acpi/tools/acpidbg/acpidbg.c +f:tools/power/acpi/tools/acpidump/Makefile +f:tools/power/acpi/tools/acpidump/acpidump.h +f:tools/power/acpi/tools/acpidump/apdump.c +f:tools/power/acpi/tools/acpidump/apfiles.c +f:tools/power/acpi/tools/acpidump/apmain.c +f:tools/power/acpi/tools/ec/Makefile +f:tools/power/acpi/tools/ec/ec_access.c +f:tools/power/acpi/tools/pfrut/Makefile +f:tools/power/acpi/tools/pfrut/pfrut.c +f:tools/power/cpupower/.gitignore +f:tools/power/cpupower/Makefile +f:tools/power/cpupower/README +f:tools/power/cpupower/TODO +f:tools/power/cpupower/bench/Makefile +f:tools/power/cpupower/bench/README-BENCH +f:tools/power/cpupower/bench/benchmark.c +f:tools/power/cpupower/bench/benchmark.h +f:tools/power/cpupower/bench/config.h +f:tools/power/cpupower/bench/cpufreq-bench_plot.sh +f:tools/power/cpupower/bench/cpufreq-bench_script.sh +f:tools/power/cpupower/bench/example.cfg +f:tools/power/cpupower/bench/main.c +f:tools/power/cpupower/bench/parse.c +f:tools/power/cpupower/bench/parse.h +f:tools/power/cpupower/bench/system.c +f:tools/power/cpupower/bench/system.h +f:tools/power/cpupower/bindings/python/.gitignore +f:tools/power/cpupower/bindings/python/Makefile +f:tools/power/cpupower/bindings/python/README +f:tools/power/cpupower/bindings/python/raw_pylibcpupower.swg +f:tools/power/cpupower/bindings/python/test_raw_pylibcpupower.py +f:tools/power/cpupower/cpupower-completion.sh +f:tools/power/cpupower/cpupower-service.conf +f:tools/power/cpupower/cpupower.service.in +f:tools/power/cpupower/cpupower.sh +f:tools/power/cpupower/debug/i386/Makefile +f:tools/power/cpupower/debug/i386/centrino-decode.c +f:tools/power/cpupower/debug/i386/dump_psb.c +f:tools/power/cpupower/debug/i386/intel_gsic.c +f:tools/power/cpupower/debug/i386/powernow-k8-decode.c +f:tools/power/cpupower/debug/kernel/Makefile +f:tools/power/cpupower/debug/kernel/cpufreq-test_tsc.c +f:tools/power/cpupower/debug/x86_64/Makefile +f:tools/power/cpupower/lib/acpi_cppc.c +f:tools/power/cpupower/lib/acpi_cppc.h +f:tools/power/cpupower/lib/cpufreq.c +f:tools/power/cpupower/lib/cpufreq.h +f:tools/power/cpupower/lib/cpuidle.c +f:tools/power/cpupower/lib/cpuidle.h +f:tools/power/cpupower/lib/cpupower.c +f:tools/power/cpupower/lib/cpupower.h +f:tools/power/cpupower/lib/cpupower_intern.h +f:tools/power/cpupower/lib/powercap.c +f:tools/power/cpupower/lib/powercap.h +f:tools/power/cpupower/man/cpupower-frequency-info.1 +f:tools/power/cpupower/man/cpupower-frequency-set.1 +f:tools/power/cpupower/man/cpupower-idle-info.1 +f:tools/power/cpupower/man/cpupower-idle-set.1 +f:tools/power/cpupower/man/cpupower-info.1 +f:tools/power/cpupower/man/cpupower-monitor.1 +f:tools/power/cpupower/man/cpupower-powercap-info.1 +f:tools/power/cpupower/man/cpupower-set.1 +f:tools/power/cpupower/man/cpupower.1 +f:tools/power/cpupower/po/cs.po +f:tools/power/cpupower/po/de.po +f:tools/power/cpupower/po/fr.po +f:tools/power/cpupower/po/it.po +f:tools/power/cpupower/po/ka.po +f:tools/power/cpupower/po/pt.po +f:tools/power/cpupower/po/zh_CN.po +f:tools/power/cpupower/utils/builtin.h +f:tools/power/cpupower/utils/cpufreq-info.c +f:tools/power/cpupower/utils/cpufreq-set.c +f:tools/power/cpupower/utils/cpuidle-info.c +f:tools/power/cpupower/utils/cpuidle-set.c +f:tools/power/cpupower/utils/cpupower-info.c +f:tools/power/cpupower/utils/cpupower-set.c +f:tools/power/cpupower/utils/cpupower.c +f:tools/power/cpupower/utils/helpers/amd.c +f:tools/power/cpupower/utils/helpers/bitmask.c +f:tools/power/cpupower/utils/helpers/bitmask.h +f:tools/power/cpupower/utils/helpers/cpuid.c +f:tools/power/cpupower/utils/helpers/helpers.h +f:tools/power/cpupower/utils/helpers/misc.c +f:tools/power/cpupower/utils/helpers/msr.c +f:tools/power/cpupower/utils/helpers/pci.c +f:tools/power/cpupower/utils/helpers/sysfs.c +f:tools/power/cpupower/utils/helpers/sysfs.h +f:tools/power/cpupower/utils/helpers/topology.c +f:tools/power/cpupower/utils/idle_monitor/amd_fam14h_idle.c +f:tools/power/cpupower/utils/idle_monitor/cpuidle_sysfs.c +f:tools/power/cpupower/utils/idle_monitor/cpupower-monitor.c +f:tools/power/cpupower/utils/idle_monitor/cpupower-monitor.h +f:tools/power/cpupower/utils/idle_monitor/hsw_ext_idle.c +f:tools/power/cpupower/utils/idle_monitor/idle_monitors.def +f:tools/power/cpupower/utils/idle_monitor/idle_monitors.h +f:tools/power/cpupower/utils/idle_monitor/mperf_monitor.c +f:tools/power/cpupower/utils/idle_monitor/nhm_idle.c +f:tools/power/cpupower/utils/idle_monitor/rapl_monitor.c +f:tools/power/cpupower/utils/idle_monitor/snb_idle.c +f:tools/power/cpupower/utils/powercap-info.c +f:tools/power/cpupower/utils/version-gen.sh +f:tools/power/pm-graph/.gitignore +f:tools/power/pm-graph/Makefile +f:tools/power/pm-graph/README +f:tools/power/pm-graph/bootgraph.8 +f:tools/power/pm-graph/bootgraph.py +f:tools/power/pm-graph/config/cgskip.txt +f:tools/power/pm-graph/config/custom-timeline-functions.cfg +f:tools/power/pm-graph/config/example.cfg +f:tools/power/pm-graph/config/freeze-callgraph.cfg +f:tools/power/pm-graph/config/freeze-dev.cfg +f:tools/power/pm-graph/config/freeze.cfg +f:tools/power/pm-graph/config/standby-callgraph.cfg +f:tools/power/pm-graph/config/standby-dev.cfg +f:tools/power/pm-graph/config/standby.cfg +f:tools/power/pm-graph/config/suspend-callgraph.cfg +f:tools/power/pm-graph/config/suspend-dev.cfg +f:tools/power/pm-graph/config/suspend-x2-proc.cfg +f:tools/power/pm-graph/config/suspend.cfg +f:tools/power/pm-graph/install_latest_from_github.sh +f:tools/power/pm-graph/sleepgraph.8 +f:tools/power/pm-graph/sleepgraph.py +f:tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py +f:tools/power/x86/intel-speed-select/.gitignore +f:tools/power/x86/intel-speed-select/Build +f:tools/power/x86/intel-speed-select/Makefile +f:tools/power/x86/intel-speed-select/hfi-events.c +f:tools/power/x86/intel-speed-select/isst-config.c +f:tools/power/x86/intel-speed-select/isst-core-mbox.c +f:tools/power/x86/intel-speed-select/isst-core-tpmi.c +f:tools/power/x86/intel-speed-select/isst-core.c +f:tools/power/x86/intel-speed-select/isst-daemon.c +f:tools/power/x86/intel-speed-select/isst-display.c +f:tools/power/x86/intel-speed-select/isst.h +f:tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py +f:tools/power/x86/turbostat/.gitignore +f:tools/power/x86/turbostat/Makefile +f:tools/power/x86/turbostat/turbostat.8 +f:tools/power/x86/turbostat/turbostat.c +f:tools/power/x86/x86_energy_perf_policy/Makefile +f:tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.8 +f:tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c +f:tools/rcu/extract-stall.sh +f:tools/rcu/rcu-cbs.py +f:tools/rcu/rcu-updaters.sh +f:tools/sched/dl_bw_dump.py +f:tools/sched/root_domains_dump.py +f:tools/sched_ext/.gitignore +f:tools/sched_ext/Makefile +f:tools/sched_ext/README.md +f:tools/sched_ext/include/bpf-compat/gnu/stubs.h +f:tools/sched_ext/include/scx/common.bpf.h +f:tools/sched_ext/include/scx/common.h +f:tools/sched_ext/include/scx/compat.bpf.h +f:tools/sched_ext/include/scx/compat.h +f:tools/sched_ext/include/scx/enum_defs.autogen.h +f:tools/sched_ext/include/scx/enums.autogen.bpf.h +f:tools/sched_ext/include/scx/enums.autogen.h +f:tools/sched_ext/include/scx/enums.bpf.h +f:tools/sched_ext/include/scx/enums.h +f:tools/sched_ext/include/scx/user_exit_info.h +f:tools/sched_ext/scx_central.bpf.c +f:tools/sched_ext/scx_central.c +f:tools/sched_ext/scx_flatcg.bpf.c +f:tools/sched_ext/scx_flatcg.c +f:tools/sched_ext/scx_flatcg.h +f:tools/sched_ext/scx_qmap.bpf.c +f:tools/sched_ext/scx_qmap.c +f:tools/sched_ext/scx_show_state.py +f:tools/sched_ext/scx_simple.bpf.c +f:tools/sched_ext/scx_simple.c +f:tools/scripts/Makefile.arch +f:tools/scripts/Makefile.include +f:tools/scripts/syscall.tbl +f:tools/scripts/utilities.mak +f:tools/sound/dapm-graph +f:tools/spi/.gitignore +f:tools/spi/Build +f:tools/spi/Makefile +f:tools/spi/spidev_fdx.c +f:tools/spi/spidev_test.c +f:tools/testing/crypto/chacha20-s390/Makefile +f:tools/testing/crypto/chacha20-s390/run-tests.sh +f:tools/testing/crypto/chacha20-s390/test-cipher.c +f:tools/testing/cxl/Kbuild +f:tools/testing/cxl/config_check.c +f:tools/testing/cxl/cxl_acpi_test.c +f:tools/testing/cxl/cxl_core_exports.c +f:tools/testing/cxl/cxl_core_test.c +f:tools/testing/cxl/cxl_mem_test.c +f:tools/testing/cxl/cxl_pmem_test.c +f:tools/testing/cxl/cxl_port_test.c +f:tools/testing/cxl/mock_acpi.c +f:tools/testing/cxl/test/Kbuild +f:tools/testing/cxl/test/cxl.c +f:tools/testing/cxl/test/mem.c +f:tools/testing/cxl/test/mock.c +f:tools/testing/cxl/test/mock.h +f:tools/testing/cxl/watermark.h +f:tools/testing/fault-injection/failcmd.sh +f:tools/testing/ktest/compare-ktest-sample.pl +f:tools/testing/ktest/config-bisect.pl +f:tools/testing/ktest/examples/README +f:tools/testing/ktest/examples/bootconfigs/boottrace.bconf +f:tools/testing/ktest/examples/bootconfigs/config-bootconfig +f:tools/testing/ktest/examples/bootconfigs/functiongraph.bconf +f:tools/testing/ktest/examples/bootconfigs/tracing.bconf +f:tools/testing/ktest/examples/bootconfigs/verify-boottrace.sh +f:tools/testing/ktest/examples/bootconfigs/verify-functiongraph.sh +f:tools/testing/ktest/examples/bootconfigs/verify-tracing.sh +f:tools/testing/ktest/examples/crosstests.conf +f:tools/testing/ktest/examples/include/bisect.conf +f:tools/testing/ktest/examples/include/bootconfig.conf +f:tools/testing/ktest/examples/include/defaults.conf +f:tools/testing/ktest/examples/include/min-config.conf +f:tools/testing/ktest/examples/include/patchcheck.conf +f:tools/testing/ktest/examples/include/tests.conf +f:tools/testing/ktest/examples/kvm.conf +f:tools/testing/ktest/examples/snowball.conf +f:tools/testing/ktest/examples/test.conf +f:tools/testing/ktest/examples/vmware.conf +f:tools/testing/ktest/ktest.pl +f:tools/testing/ktest/sample.conf +f:tools/testing/kunit/.gitignore +f:tools/testing/kunit/configs/all_tests.config +f:tools/testing/kunit/configs/arch_uml.config +f:tools/testing/kunit/configs/coverage_uml.config +f:tools/testing/kunit/configs/default.config +f:tools/testing/kunit/kunit.py +f:tools/testing/kunit/kunit_config.py +f:tools/testing/kunit/kunit_json.py +f:tools/testing/kunit/kunit_kernel.py +f:tools/testing/kunit/kunit_parser.py +f:tools/testing/kunit/kunit_printer.py +f:tools/testing/kunit/kunit_tool_test.py +f:tools/testing/kunit/mypy.ini +f:tools/testing/kunit/qemu_config.py +f:tools/testing/kunit/qemu_configs/alpha.py +f:tools/testing/kunit/qemu_configs/arm.py +f:tools/testing/kunit/qemu_configs/arm64.py +f:tools/testing/kunit/qemu_configs/i386.py +f:tools/testing/kunit/qemu_configs/loongarch.py +f:tools/testing/kunit/qemu_configs/m68k.py +f:tools/testing/kunit/qemu_configs/powerpc.py +f:tools/testing/kunit/qemu_configs/powerpc32.py +f:tools/testing/kunit/qemu_configs/powerpcle.py +f:tools/testing/kunit/qemu_configs/riscv.py +f:tools/testing/kunit/qemu_configs/riscv32.py +f:tools/testing/kunit/qemu_configs/s390.py +f:tools/testing/kunit/qemu_configs/sh.py +f:tools/testing/kunit/qemu_configs/sparc.py +f:tools/testing/kunit/qemu_configs/sparc64.py +f:tools/testing/kunit/qemu_configs/x86_64.py +f:tools/testing/kunit/run_checks.py +f:tools/testing/kunit/test_data/test_config_printk_time.log +f:tools/testing/kunit/test_data/test_insufficient_memory.log +f:tools/testing/kunit/test_data/test_interrupted_tap_output.log +f:tools/testing/kunit/test_data/test_is_test_passed-all_passed.log +f:tools/testing/kunit/test_data/test_is_test_passed-all_passed_nested.log +f:tools/testing/kunit/test_data/test_is_test_passed-failure.log +f:tools/testing/kunit/test_data/test_is_test_passed-kselftest.log +f:tools/testing/kunit/test_data/test_is_test_passed-missing_plan.log +f:tools/testing/kunit/test_data/test_is_test_passed-no_tests_no_plan.log +f:tools/testing/kunit/test_data/test_is_test_passed-no_tests_run_no_header.log +f:tools/testing/kunit/test_data/test_is_test_passed-no_tests_run_with_header.log +f:tools/testing/kunit/test_data/test_kernel_panic_interrupt.log +f:tools/testing/kunit/test_data/test_multiple_prefixes.log +f:tools/testing/kunit/test_data/test_output_isolated_correctly.log +f:tools/testing/kunit/test_data/test_output_with_prefix_isolated_correctly.log +f:tools/testing/kunit/test_data/test_parse_attributes.log +f:tools/testing/kunit/test_data/test_parse_ktap_output.log +f:tools/testing/kunit/test_data/test_parse_subtest_header.log +f:tools/testing/kunit/test_data/test_pound_no_prefix.log +f:tools/testing/kunit/test_data/test_pound_sign.log +f:tools/testing/kunit/test_data/test_read_from_file.kconfig +f:tools/testing/kunit/test_data/test_skip_all_tests.log +f:tools/testing/kunit/test_data/test_skip_tests.log +f:tools/testing/kunit/test_data/test_strip_hyphen.log +f:tools/testing/memblock/.gitignore +f:tools/testing/memblock/Makefile +f:tools/testing/memblock/README +f:tools/testing/memblock/TODO +f:tools/testing/memblock/asm/dma.h +f:tools/testing/memblock/internal.h +f:tools/testing/memblock/lib/slab.c +f:tools/testing/memblock/linux/kernel.h +f:tools/testing/memblock/linux/kmemleak.h +f:tools/testing/memblock/linux/memory_hotplug.h +f:tools/testing/memblock/linux/mmzone.h +f:tools/testing/memblock/linux/mutex.h +f:tools/testing/memblock/linux/printk.h +f:tools/testing/memblock/main.c +f:tools/testing/memblock/mmzone.c +f:tools/testing/memblock/scripts/Makefile.include +f:tools/testing/memblock/tests/alloc_api.c +f:tools/testing/memblock/tests/alloc_api.h +f:tools/testing/memblock/tests/alloc_exact_nid_api.c +f:tools/testing/memblock/tests/alloc_exact_nid_api.h +f:tools/testing/memblock/tests/alloc_helpers_api.c +f:tools/testing/memblock/tests/alloc_helpers_api.h +f:tools/testing/memblock/tests/alloc_nid_api.c +f:tools/testing/memblock/tests/alloc_nid_api.h +f:tools/testing/memblock/tests/basic_api.c +f:tools/testing/memblock/tests/basic_api.h +f:tools/testing/memblock/tests/common.c +f:tools/testing/memblock/tests/common.h +f:tools/testing/nvdimm/Kbuild +f:tools/testing/nvdimm/Makefile +f:tools/testing/nvdimm/acpi_nfit_test.c +f:tools/testing/nvdimm/config_check.c +f:tools/testing/nvdimm/dax-dev.c +f:tools/testing/nvdimm/dax_pmem_test.c +f:tools/testing/nvdimm/device_dax_test.c +f:tools/testing/nvdimm/libnvdimm_test.c +f:tools/testing/nvdimm/pmem-dax.c +f:tools/testing/nvdimm/pmem_test.c +f:tools/testing/nvdimm/test/Kbuild +f:tools/testing/nvdimm/test/iomap.c +f:tools/testing/nvdimm/test/ndtest.c +f:tools/testing/nvdimm/test/ndtest.h +f:tools/testing/nvdimm/test/nfit.c +f:tools/testing/nvdimm/test/nfit_test.h +f:tools/testing/nvdimm/watermark.h +f:tools/testing/radix-tree/.gitignore +f:tools/testing/radix-tree/Makefile +f:tools/testing/radix-tree/benchmark.c +f:tools/testing/radix-tree/idr-test.c +f:tools/testing/radix-tree/iteration_check.c +f:tools/testing/radix-tree/iteration_check_2.c +f:tools/testing/radix-tree/main.c +f:tools/testing/radix-tree/maple.c +f:tools/testing/radix-tree/multiorder.c +f:tools/testing/radix-tree/regression.h +f:tools/testing/radix-tree/regression1.c +f:tools/testing/radix-tree/regression2.c +f:tools/testing/radix-tree/regression3.c +f:tools/testing/radix-tree/regression4.c +f:tools/testing/radix-tree/tag_check.c +f:tools/testing/radix-tree/test.c +f:tools/testing/radix-tree/test.h +f:tools/testing/radix-tree/xarray.c +f:tools/testing/rbtree/Makefile +f:tools/testing/rbtree/interval_tree_test.c +f:tools/testing/rbtree/rbtree_test.c +f:tools/testing/rbtree/test.h +f:tools/testing/scatterlist/Makefile +f:tools/testing/scatterlist/linux/mm.h +f:tools/testing/scatterlist/main.c +f:tools/testing/selftests/.gitignore +f:tools/testing/selftests/Makefile +f:tools/testing/selftests/acct/.gitignore +f:tools/testing/selftests/acct/Makefile +f:tools/testing/selftests/acct/acct_syscall.c +f:tools/testing/selftests/alsa/.gitignore +f:tools/testing/selftests/alsa/Makefile +f:tools/testing/selftests/alsa/alsa-local.h +f:tools/testing/selftests/alsa/conf.c +f:tools/testing/selftests/alsa/conf.d/Lenovo_ThinkPad_P1_Gen2.conf +f:tools/testing/selftests/alsa/global-timer.c +f:tools/testing/selftests/alsa/mixer-test.c +f:tools/testing/selftests/alsa/pcm-test.c +f:tools/testing/selftests/alsa/pcm-test.conf +f:tools/testing/selftests/alsa/test-pcmtest-driver.c +f:tools/testing/selftests/alsa/utimer-test.c +f:tools/testing/selftests/amd-pstate/Makefile +f:tools/testing/selftests/amd-pstate/basic.sh +f:tools/testing/selftests/amd-pstate/config +f:tools/testing/selftests/amd-pstate/gitsource.sh +f:tools/testing/selftests/amd-pstate/run.sh +f:tools/testing/selftests/amd-pstate/tbench.sh +f:tools/testing/selftests/arm64/Makefile +f:tools/testing/selftests/arm64/README +f:tools/testing/selftests/arm64/abi/.gitignore +f:tools/testing/selftests/arm64/abi/Makefile +f:tools/testing/selftests/arm64/abi/hwcap.c +f:tools/testing/selftests/arm64/abi/ptrace.c +f:tools/testing/selftests/arm64/abi/syscall-abi-asm.S +f:tools/testing/selftests/arm64/abi/syscall-abi.c +f:tools/testing/selftests/arm64/abi/syscall-abi.h +f:tools/testing/selftests/arm64/abi/tpidr2.c +f:tools/testing/selftests/arm64/bti/.gitignore +f:tools/testing/selftests/arm64/bti/Makefile +f:tools/testing/selftests/arm64/bti/assembler.h +f:tools/testing/selftests/arm64/bti/btitest.h +f:tools/testing/selftests/arm64/bti/signal.c +f:tools/testing/selftests/arm64/bti/signal.h +f:tools/testing/selftests/arm64/bti/start.S +f:tools/testing/selftests/arm64/bti/syscall.S +f:tools/testing/selftests/arm64/bti/system.c +f:tools/testing/selftests/arm64/bti/system.h +f:tools/testing/selftests/arm64/bti/test.c +f:tools/testing/selftests/arm64/bti/teststubs.S +f:tools/testing/selftests/arm64/bti/trampoline.S +f:tools/testing/selftests/arm64/fp/.gitignore +f:tools/testing/selftests/arm64/fp/Makefile +f:tools/testing/selftests/arm64/fp/README +f:tools/testing/selftests/arm64/fp/TODO +f:tools/testing/selftests/arm64/fp/asm-offsets.h +f:tools/testing/selftests/arm64/fp/asm-utils.S +f:tools/testing/selftests/arm64/fp/assembler.h +f:tools/testing/selftests/arm64/fp/fp-pidbench.S +f:tools/testing/selftests/arm64/fp/fp-ptrace-asm.S +f:tools/testing/selftests/arm64/fp/fp-ptrace.c +f:tools/testing/selftests/arm64/fp/fp-ptrace.h +f:tools/testing/selftests/arm64/fp/fp-stress.c +f:tools/testing/selftests/arm64/fp/fpsimd-stress +f:tools/testing/selftests/arm64/fp/fpsimd-test.S +f:tools/testing/selftests/arm64/fp/kernel-test.c +f:tools/testing/selftests/arm64/fp/rdvl-sme.c +f:tools/testing/selftests/arm64/fp/rdvl-sve.c +f:tools/testing/selftests/arm64/fp/rdvl.S +f:tools/testing/selftests/arm64/fp/rdvl.h +f:tools/testing/selftests/arm64/fp/sme-inst.h +f:tools/testing/selftests/arm64/fp/ssve-stress +f:tools/testing/selftests/arm64/fp/sve-probe-vls.c +f:tools/testing/selftests/arm64/fp/sve-ptrace.c +f:tools/testing/selftests/arm64/fp/sve-stress +f:tools/testing/selftests/arm64/fp/sve-test.S +f:tools/testing/selftests/arm64/fp/vec-syscfg.c +f:tools/testing/selftests/arm64/fp/vlset.c +f:tools/testing/selftests/arm64/fp/za-fork-asm.S +f:tools/testing/selftests/arm64/fp/za-fork.c +f:tools/testing/selftests/arm64/fp/za-ptrace.c +f:tools/testing/selftests/arm64/fp/za-stress +f:tools/testing/selftests/arm64/fp/za-test.S +f:tools/testing/selftests/arm64/fp/zt-ptrace.c +f:tools/testing/selftests/arm64/fp/zt-test.S +f:tools/testing/selftests/arm64/gcs/.gitignore +f:tools/testing/selftests/arm64/gcs/Makefile +f:tools/testing/selftests/arm64/gcs/asm-offsets.h +f:tools/testing/selftests/arm64/gcs/basic-gcs.c +f:tools/testing/selftests/arm64/gcs/gcs-locking.c +f:tools/testing/selftests/arm64/gcs/gcs-stress-thread.S +f:tools/testing/selftests/arm64/gcs/gcs-stress.c +f:tools/testing/selftests/arm64/gcs/gcs-util.h +f:tools/testing/selftests/arm64/gcs/gcspushm.S +f:tools/testing/selftests/arm64/gcs/gcsstr.S +f:tools/testing/selftests/arm64/gcs/libc-gcs.c +f:tools/testing/selftests/arm64/mte/.gitignore +f:tools/testing/selftests/arm64/mte/Makefile +f:tools/testing/selftests/arm64/mte/check_buffer_fill.c +f:tools/testing/selftests/arm64/mte/check_child_memory.c +f:tools/testing/selftests/arm64/mte/check_gcr_el1_cswitch.c +f:tools/testing/selftests/arm64/mte/check_hugetlb_options.c +f:tools/testing/selftests/arm64/mte/check_ksm_options.c +f:tools/testing/selftests/arm64/mte/check_mmap_options.c +f:tools/testing/selftests/arm64/mte/check_prctl.c +f:tools/testing/selftests/arm64/mte/check_tags_inclusion.c +f:tools/testing/selftests/arm64/mte/check_user_mem.c +f:tools/testing/selftests/arm64/mte/mte_common_util.c +f:tools/testing/selftests/arm64/mte/mte_common_util.h +f:tools/testing/selftests/arm64/mte/mte_def.h +f:tools/testing/selftests/arm64/mte/mte_helper.S +f:tools/testing/selftests/arm64/pauth/.gitignore +f:tools/testing/selftests/arm64/pauth/Makefile +f:tools/testing/selftests/arm64/pauth/exec_target.c +f:tools/testing/selftests/arm64/pauth/helper.c +f:tools/testing/selftests/arm64/pauth/helper.h +f:tools/testing/selftests/arm64/pauth/pac.c +f:tools/testing/selftests/arm64/pauth/pac_corruptor.S +f:tools/testing/selftests/arm64/signal/.gitignore +f:tools/testing/selftests/arm64/signal/Makefile +f:tools/testing/selftests/arm64/signal/README +f:tools/testing/selftests/arm64/signal/signals.S +f:tools/testing/selftests/arm64/signal/sve_helpers.c +f:tools/testing/selftests/arm64/signal/sve_helpers.h +f:tools/testing/selftests/arm64/signal/test_signals.c +f:tools/testing/selftests/arm64/signal/test_signals.h +f:tools/testing/selftests/arm64/signal/test_signals_utils.c +f:tools/testing/selftests/arm64/signal/test_signals_utils.h +f:tools/testing/selftests/arm64/signal/testcases/TODO +f:tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_bad_magic.c +f:tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_bad_size.c +f:tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_bad_size_for_magic0.c +f:tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_duplicated_fpsimd.c +f:tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_misaligned_sp.c +f:tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_missing_fpsimd.c +f:tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_sme_change_vl.c +f:tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_sve_change_vl.c +f:tools/testing/selftests/arm64/signal/testcases/fpmr_siginfo.c +f:tools/testing/selftests/arm64/signal/testcases/gcs_exception_fault.c +f:tools/testing/selftests/arm64/signal/testcases/gcs_frame.c +f:tools/testing/selftests/arm64/signal/testcases/gcs_write_fault.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_compat_toggle.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_daif_bits.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_mode_el1h.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_mode_el1t.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_mode_el2h.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_mode_el2t.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_mode_el3h.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_mode_el3t.c +f:tools/testing/selftests/arm64/signal/testcases/mangle_pstate_invalid_mode_template.h +f:tools/testing/selftests/arm64/signal/testcases/poe_siginfo.c +f:tools/testing/selftests/arm64/signal/testcases/sme_trap_no_sm.c +f:tools/testing/selftests/arm64/signal/testcases/sme_trap_non_streaming.c +f:tools/testing/selftests/arm64/signal/testcases/sme_trap_za.c +f:tools/testing/selftests/arm64/signal/testcases/sme_vl.c +f:tools/testing/selftests/arm64/signal/testcases/ssve_regs.c +f:tools/testing/selftests/arm64/signal/testcases/ssve_za_regs.c +f:tools/testing/selftests/arm64/signal/testcases/sve_regs.c +f:tools/testing/selftests/arm64/signal/testcases/sve_vl.c +f:tools/testing/selftests/arm64/signal/testcases/testcases.c +f:tools/testing/selftests/arm64/signal/testcases/testcases.h +f:tools/testing/selftests/arm64/signal/testcases/tpidr2_restore.c +f:tools/testing/selftests/arm64/signal/testcases/tpidr2_siginfo.c +f:tools/testing/selftests/arm64/signal/testcases/za_no_regs.c +f:tools/testing/selftests/arm64/signal/testcases/za_regs.c +f:tools/testing/selftests/arm64/signal/testcases/zt_no_regs.c +f:tools/testing/selftests/arm64/signal/testcases/zt_regs.c +f:tools/testing/selftests/arm64/tags/.gitignore +f:tools/testing/selftests/arm64/tags/Makefile +f:tools/testing/selftests/arm64/tags/tags_test.c +f:tools/testing/selftests/bpf/.gitignore +f:tools/testing/selftests/bpf/DENYLIST +f:tools/testing/selftests/bpf/DENYLIST.riscv64 +f:tools/testing/selftests/bpf/DENYLIST.s390x +f:tools/testing/selftests/bpf/Makefile +f:tools/testing/selftests/bpf/Makefile.docs +f:tools/testing/selftests/bpf/README.rst +f:tools/testing/selftests/bpf/autoconf_helper.h +f:tools/testing/selftests/bpf/bench.c +f:tools/testing/selftests/bpf/bench.h +f:tools/testing/selftests/bpf/benchs/bench_bloom_filter_map.c +f:tools/testing/selftests/bpf/benchs/bench_bpf_crypto.c +f:tools/testing/selftests/bpf/benchs/bench_bpf_hashmap_full_update.c +f:tools/testing/selftests/bpf/benchs/bench_bpf_hashmap_lookup.c +f:tools/testing/selftests/bpf/benchs/bench_bpf_loop.c +f:tools/testing/selftests/bpf/benchs/bench_count.c +f:tools/testing/selftests/bpf/benchs/bench_htab_mem.c +f:tools/testing/selftests/bpf/benchs/bench_local_storage.c +f:tools/testing/selftests/bpf/benchs/bench_local_storage_create.c +f:tools/testing/selftests/bpf/benchs/bench_local_storage_rcu_tasks_trace.c +f:tools/testing/selftests/bpf/benchs/bench_rename.c +f:tools/testing/selftests/bpf/benchs/bench_ringbufs.c +f:tools/testing/selftests/bpf/benchs/bench_sockmap.c +f:tools/testing/selftests/bpf/benchs/bench_strncmp.c +f:tools/testing/selftests/bpf/benchs/bench_trigger.c +f:tools/testing/selftests/bpf/benchs/run_bench_bloom_filter_map.sh +f:tools/testing/selftests/bpf/benchs/run_bench_bpf_hashmap_full_update.sh +f:tools/testing/selftests/bpf/benchs/run_bench_bpf_loop.sh +f:tools/testing/selftests/bpf/benchs/run_bench_htab_mem.sh +f:tools/testing/selftests/bpf/benchs/run_bench_local_storage.sh +f:tools/testing/selftests/bpf/benchs/run_bench_local_storage_rcu_tasks_trace.sh +f:tools/testing/selftests/bpf/benchs/run_bench_rename.sh +f:tools/testing/selftests/bpf/benchs/run_bench_ringbufs.sh +f:tools/testing/selftests/bpf/benchs/run_bench_strncmp.sh +f:tools/testing/selftests/bpf/benchs/run_bench_trigger.sh +f:tools/testing/selftests/bpf/benchs/run_bench_uprobes.sh +f:tools/testing/selftests/bpf/benchs/run_common.sh +f:tools/testing/selftests/bpf/bpf_arena_alloc.h +f:tools/testing/selftests/bpf/bpf_arena_common.h +f:tools/testing/selftests/bpf/bpf_arena_htab.h +f:tools/testing/selftests/bpf/bpf_arena_list.h +f:tools/testing/selftests/bpf/bpf_atomic.h +f:tools/testing/selftests/bpf/bpf_experimental.h +f:tools/testing/selftests/bpf/bpf_kfuncs.h +f:tools/testing/selftests/bpf/bpf_legacy.h +f:tools/testing/selftests/bpf/bpf_rand.h +f:tools/testing/selftests/bpf/bpf_sockopt_helpers.h +f:tools/testing/selftests/bpf/bpf_util.h +f:tools/testing/selftests/bpf/btf_helpers.c +f:tools/testing/selftests/bpf/btf_helpers.h +f:tools/testing/selftests/bpf/cap_helpers.c +f:tools/testing/selftests/bpf/cap_helpers.h +f:tools/testing/selftests/bpf/cgroup_getset_retval_hooks.h +f:tools/testing/selftests/bpf/cgroup_helpers.c +f:tools/testing/selftests/bpf/cgroup_helpers.h +f:tools/testing/selftests/bpf/cgroup_tcp_skb.h +f:tools/testing/selftests/bpf/config +f:tools/testing/selftests/bpf/config.aarch64 +f:tools/testing/selftests/bpf/config.ppc64el +f:tools/testing/selftests/bpf/config.riscv64 +f:tools/testing/selftests/bpf/config.s390x +f:tools/testing/selftests/bpf/config.vm +f:tools/testing/selftests/bpf/config.x86_64 +f:tools/testing/selftests/bpf/disasm_helpers.c +f:tools/testing/selftests/bpf/disasm_helpers.h +f:tools/testing/selftests/bpf/flow_dissector_load.c +f:tools/testing/selftests/bpf/flow_dissector_load.h +f:tools/testing/selftests/bpf/generate_udp_fragments.py +f:tools/testing/selftests/bpf/gnu/stubs.h +f:tools/testing/selftests/bpf/ima_setup.sh +f:tools/testing/selftests/bpf/io_helpers.c +f:tools/testing/selftests/bpf/io_helpers.h +f:tools/testing/selftests/bpf/ip_check_defrag_frags.h +f:tools/testing/selftests/bpf/jit_disasm_helpers.c +f:tools/testing/selftests/bpf/jit_disasm_helpers.h +f:tools/testing/selftests/bpf/liburandom_read.map +f:tools/testing/selftests/bpf/map_tests/.gitignore +f:tools/testing/selftests/bpf/map_tests/array_map_batch_ops.c +f:tools/testing/selftests/bpf/map_tests/htab_map_batch_ops.c +f:tools/testing/selftests/bpf/map_tests/lpm_trie_map_basic_ops.c +f:tools/testing/selftests/bpf/map_tests/lpm_trie_map_batch_ops.c +f:tools/testing/selftests/bpf/map_tests/lpm_trie_map_get_next_key.c +f:tools/testing/selftests/bpf/map_tests/map_in_map_batch_ops.c +f:tools/testing/selftests/bpf/map_tests/map_percpu_stats.c +f:tools/testing/selftests/bpf/map_tests/sk_storage_map.c +f:tools/testing/selftests/bpf/map_tests/task_storage_map.c +f:tools/testing/selftests/bpf/netcnt_common.h +f:tools/testing/selftests/bpf/netlink_helpers.c +f:tools/testing/selftests/bpf/netlink_helpers.h +f:tools/testing/selftests/bpf/network_helpers.c +f:tools/testing/selftests/bpf/network_helpers.h +f:tools/testing/selftests/bpf/prog_tests/.gitignore +f:tools/testing/selftests/bpf/prog_tests/access_variable_array.c +f:tools/testing/selftests/bpf/prog_tests/align.c +f:tools/testing/selftests/bpf/prog_tests/arena_atomics.c +f:tools/testing/selftests/bpf/prog_tests/arena_htab.c +f:tools/testing/selftests/bpf/prog_tests/arena_list.c +f:tools/testing/selftests/bpf/prog_tests/arena_spin_lock.c +f:tools/testing/selftests/bpf/prog_tests/arg_parsing.c +f:tools/testing/selftests/bpf/prog_tests/assign_reuse.c +f:tools/testing/selftests/bpf/prog_tests/async_stack_depth.c +f:tools/testing/selftests/bpf/prog_tests/atomic_bounds.c +f:tools/testing/selftests/bpf/prog_tests/atomics.c +f:tools/testing/selftests/bpf/prog_tests/attach_probe.c +f:tools/testing/selftests/bpf/prog_tests/autoattach.c +f:tools/testing/selftests/bpf/prog_tests/autoload.c +f:tools/testing/selftests/bpf/prog_tests/bad_struct_ops.c +f:tools/testing/selftests/bpf/prog_tests/bind_perm.c +f:tools/testing/selftests/bpf/prog_tests/bloom_filter_map.c +f:tools/testing/selftests/bpf/prog_tests/bpf_cookie.c +f:tools/testing/selftests/bpf/prog_tests/bpf_iter.c +f:tools/testing/selftests/bpf/prog_tests/bpf_iter_setsockopt.c +f:tools/testing/selftests/bpf/prog_tests/bpf_iter_setsockopt_unix.c +f:tools/testing/selftests/bpf/prog_tests/bpf_loop.c +f:tools/testing/selftests/bpf/prog_tests/bpf_mod_race.c +f:tools/testing/selftests/bpf/prog_tests/bpf_nf.c +f:tools/testing/selftests/bpf/prog_tests/bpf_obj_id.c +f:tools/testing/selftests/bpf/prog_tests/bpf_obj_pinning.c +f:tools/testing/selftests/bpf/prog_tests/bpf_qdisc.c +f:tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c +f:tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c +f:tools/testing/selftests/bpf/prog_tests/btf.c +f:tools/testing/selftests/bpf/prog_tests/btf_dedup_split.c +f:tools/testing/selftests/bpf/prog_tests/btf_distill.c +f:tools/testing/selftests/bpf/prog_tests/btf_dump.c +f:tools/testing/selftests/bpf/prog_tests/btf_endian.c +f:tools/testing/selftests/bpf/prog_tests/btf_field_iter.c +f:tools/testing/selftests/bpf/prog_tests/btf_map_in_map.c +f:tools/testing/selftests/bpf/prog_tests/btf_module.c +f:tools/testing/selftests/bpf/prog_tests/btf_skc_cls_ingress.c +f:tools/testing/selftests/bpf/prog_tests/btf_split.c +f:tools/testing/selftests/bpf/prog_tests/btf_sysfs.c +f:tools/testing/selftests/bpf/prog_tests/btf_tag.c +f:tools/testing/selftests/bpf/prog_tests/btf_write.c +f:tools/testing/selftests/bpf/prog_tests/build_id.c +f:tools/testing/selftests/bpf/prog_tests/cb_refs.c +f:tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c +f:tools/testing/selftests/bpf/prog_tests/cgroup1_hierarchy.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_ancestor.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_attach_autodetach.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_attach_multi.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_attach_override.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_dev.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_get_current_cgroup_id.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_getset_retval.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_hierarchical_stats.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_iter.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_link.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_mprog_opts.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_mprog_ordering.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_preorder.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_skb_direct_packet_access.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_skb_sk_lookup.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_storage.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_tcp_skb.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_v1v2.c +f:tools/testing/selftests/bpf/prog_tests/cgroup_xattr.c +f:tools/testing/selftests/bpf/prog_tests/cgrp_kfunc.c +f:tools/testing/selftests/bpf/prog_tests/cgrp_local_storage.c +f:tools/testing/selftests/bpf/prog_tests/check_mtu.c +f:tools/testing/selftests/bpf/prog_tests/cls_redirect.c +f:tools/testing/selftests/bpf/prog_tests/compute_live_registers.c +f:tools/testing/selftests/bpf/prog_tests/connect_force_port.c +f:tools/testing/selftests/bpf/prog_tests/connect_ping.c +f:tools/testing/selftests/bpf/prog_tests/core_autosize.c +f:tools/testing/selftests/bpf/prog_tests/core_extern.c +f:tools/testing/selftests/bpf/prog_tests/core_kern.c +f:tools/testing/selftests/bpf/prog_tests/core_kern_overflow.c +f:tools/testing/selftests/bpf/prog_tests/core_read_macros.c +f:tools/testing/selftests/bpf/prog_tests/core_reloc.c +f:tools/testing/selftests/bpf/prog_tests/core_reloc_raw.c +f:tools/testing/selftests/bpf/prog_tests/core_retro.c +f:tools/testing/selftests/bpf/prog_tests/cpu_mask.c +f:tools/testing/selftests/bpf/prog_tests/cpumask.c +f:tools/testing/selftests/bpf/prog_tests/crypto_sanity.c +f:tools/testing/selftests/bpf/prog_tests/ctx_rewrite.c +f:tools/testing/selftests/bpf/prog_tests/custom_sec_handlers.c +f:tools/testing/selftests/bpf/prog_tests/d_path.c +f:tools/testing/selftests/bpf/prog_tests/decap_sanity.c +f:tools/testing/selftests/bpf/prog_tests/deny_namespace.c +f:tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c +f:tools/testing/selftests/bpf/prog_tests/dummy_st_ops.c +f:tools/testing/selftests/bpf/prog_tests/dynptr.c +f:tools/testing/selftests/bpf/prog_tests/empty_skb.c +f:tools/testing/selftests/bpf/prog_tests/enable_stats.c +f:tools/testing/selftests/bpf/prog_tests/endian.c +f:tools/testing/selftests/bpf/prog_tests/exceptions.c +f:tools/testing/selftests/bpf/prog_tests/exhandler.c +f:tools/testing/selftests/bpf/prog_tests/fd_array.c +f:tools/testing/selftests/bpf/prog_tests/fd_htab_lookup.c +f:tools/testing/selftests/bpf/prog_tests/fentry_fexit.c +f:tools/testing/selftests/bpf/prog_tests/fentry_test.c +f:tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c +f:tools/testing/selftests/bpf/prog_tests/fexit_sleep.c +f:tools/testing/selftests/bpf/prog_tests/fexit_stress.c +f:tools/testing/selftests/bpf/prog_tests/fexit_test.c +f:tools/testing/selftests/bpf/prog_tests/fib_lookup.c +f:tools/testing/selftests/bpf/prog_tests/fill_link_info.c +f:tools/testing/selftests/bpf/prog_tests/find_vma.c +f:tools/testing/selftests/bpf/prog_tests/flow_dissector.c +f:tools/testing/selftests/bpf/prog_tests/flow_dissector_classification.c +f:tools/testing/selftests/bpf/prog_tests/flow_dissector_load_bytes.c +f:tools/testing/selftests/bpf/prog_tests/flow_dissector_reattach.c +f:tools/testing/selftests/bpf/prog_tests/for_each.c +f:tools/testing/selftests/bpf/prog_tests/free_timer.c +f:tools/testing/selftests/bpf/prog_tests/fs_kfuncs.c +f:tools/testing/selftests/bpf/prog_tests/get_branch_snapshot.c +f:tools/testing/selftests/bpf/prog_tests/get_func_args_test.c +f:tools/testing/selftests/bpf/prog_tests/get_func_ip_test.c +f:tools/testing/selftests/bpf/prog_tests/get_stack_raw_tp.c +f:tools/testing/selftests/bpf/prog_tests/get_stackid_cannot_attach.c +f:tools/testing/selftests/bpf/prog_tests/global_data.c +f:tools/testing/selftests/bpf/prog_tests/global_data_init.c +f:tools/testing/selftests/bpf/prog_tests/global_func_args.c +f:tools/testing/selftests/bpf/prog_tests/global_func_dead_code.c +f:tools/testing/selftests/bpf/prog_tests/global_map_resize.c +f:tools/testing/selftests/bpf/prog_tests/hash_large_key.c +f:tools/testing/selftests/bpf/prog_tests/hashmap.c +f:tools/testing/selftests/bpf/prog_tests/helper_restricted.c +f:tools/testing/selftests/bpf/prog_tests/htab_reuse.c +f:tools/testing/selftests/bpf/prog_tests/htab_update.c +f:tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c +f:tools/testing/selftests/bpf/prog_tests/ip_check_defrag.c +f:tools/testing/selftests/bpf/prog_tests/iters.c +f:tools/testing/selftests/bpf/prog_tests/jeq_infer_not_null.c +f:tools/testing/selftests/bpf/prog_tests/jit_probe_mem.c +f:tools/testing/selftests/bpf/prog_tests/kernel_flag.c +f:tools/testing/selftests/bpf/prog_tests/kfree_skb.c +f:tools/testing/selftests/bpf/prog_tests/kfunc_call.c +f:tools/testing/selftests/bpf/prog_tests/kfunc_dynptr_param.c +f:tools/testing/selftests/bpf/prog_tests/kfunc_module_order.c +f:tools/testing/selftests/bpf/prog_tests/kfunc_param_nullable.c +f:tools/testing/selftests/bpf/prog_tests/kmem_cache_iter.c +f:tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c +f:tools/testing/selftests/bpf/prog_tests/kprobe_multi_testmod_test.c +f:tools/testing/selftests/bpf/prog_tests/kptr_xchg_inline.c +f:tools/testing/selftests/bpf/prog_tests/ksyms.c +f:tools/testing/selftests/bpf/prog_tests/ksyms_btf.c +f:tools/testing/selftests/bpf/prog_tests/ksyms_module.c +f:tools/testing/selftests/bpf/prog_tests/l4lb_all.c +f:tools/testing/selftests/bpf/prog_tests/legacy_printk.c +f:tools/testing/selftests/bpf/prog_tests/libbpf_get_fd_by_id_opts.c +f:tools/testing/selftests/bpf/prog_tests/libbpf_probes.c +f:tools/testing/selftests/bpf/prog_tests/libbpf_str.c +f:tools/testing/selftests/bpf/prog_tests/link_pinning.c +f:tools/testing/selftests/bpf/prog_tests/linked_funcs.c +f:tools/testing/selftests/bpf/prog_tests/linked_list.c +f:tools/testing/selftests/bpf/prog_tests/linked_maps.c +f:tools/testing/selftests/bpf/prog_tests/linked_vars.c +f:tools/testing/selftests/bpf/prog_tests/load_bytes_relative.c +f:tools/testing/selftests/bpf/prog_tests/local_kptr_stash.c +f:tools/testing/selftests/bpf/prog_tests/log_buf.c +f:tools/testing/selftests/bpf/prog_tests/log_fixup.c +f:tools/testing/selftests/bpf/prog_tests/lookup_and_delete.c +f:tools/testing/selftests/bpf/prog_tests/lookup_key.c +f:tools/testing/selftests/bpf/prog_tests/lru_bug.c +f:tools/testing/selftests/bpf/prog_tests/lsm_cgroup.c +f:tools/testing/selftests/bpf/prog_tests/lwt_helpers.h +f:tools/testing/selftests/bpf/prog_tests/lwt_ip_encap.c +f:tools/testing/selftests/bpf/prog_tests/lwt_redirect.c +f:tools/testing/selftests/bpf/prog_tests/lwt_reroute.c +f:tools/testing/selftests/bpf/prog_tests/lwt_seg6local.c +f:tools/testing/selftests/bpf/prog_tests/map_btf.c +f:tools/testing/selftests/bpf/prog_tests/map_in_map.c +f:tools/testing/selftests/bpf/prog_tests/map_init.c +f:tools/testing/selftests/bpf/prog_tests/map_kptr.c +f:tools/testing/selftests/bpf/prog_tests/map_lock.c +f:tools/testing/selftests/bpf/prog_tests/map_lookup_percpu_elem.c +f:tools/testing/selftests/bpf/prog_tests/map_ops.c +f:tools/testing/selftests/bpf/prog_tests/map_ptr.c +f:tools/testing/selftests/bpf/prog_tests/mem_rdonly_untrusted.c +f:tools/testing/selftests/bpf/prog_tests/metadata.c +f:tools/testing/selftests/bpf/prog_tests/migrate_reuseport.c +f:tools/testing/selftests/bpf/prog_tests/missed.c +f:tools/testing/selftests/bpf/prog_tests/mmap.c +f:tools/testing/selftests/bpf/prog_tests/modify_return.c +f:tools/testing/selftests/bpf/prog_tests/module_attach.c +f:tools/testing/selftests/bpf/prog_tests/module_fentry_shadow.c +f:tools/testing/selftests/bpf/prog_tests/mptcp.c +f:tools/testing/selftests/bpf/prog_tests/nested_trust.c +f:tools/testing/selftests/bpf/prog_tests/net_timestamping.c +f:tools/testing/selftests/bpf/prog_tests/netcnt.c +f:tools/testing/selftests/bpf/prog_tests/netfilter_link_attach.c +f:tools/testing/selftests/bpf/prog_tests/netns_cookie.c +f:tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c +f:tools/testing/selftests/bpf/prog_tests/obj_name.c +f:tools/testing/selftests/bpf/prog_tests/parse_tcp_hdr_opt.c +f:tools/testing/selftests/bpf/prog_tests/pe_preserve_elems.c +f:tools/testing/selftests/bpf/prog_tests/percpu_alloc.c +f:tools/testing/selftests/bpf/prog_tests/perf_branches.c +f:tools/testing/selftests/bpf/prog_tests/perf_buffer.c +f:tools/testing/selftests/bpf/prog_tests/perf_event_stackmap.c +f:tools/testing/selftests/bpf/prog_tests/perf_link.c +f:tools/testing/selftests/bpf/prog_tests/perf_skip.c +f:tools/testing/selftests/bpf/prog_tests/pinning.c +f:tools/testing/selftests/bpf/prog_tests/pkt_access.c +f:tools/testing/selftests/bpf/prog_tests/pkt_md_access.c +f:tools/testing/selftests/bpf/prog_tests/preempt_lock.c +f:tools/testing/selftests/bpf/prog_tests/preempted_bpf_ma_op.c +f:tools/testing/selftests/bpf/prog_tests/prepare.c +f:tools/testing/selftests/bpf/prog_tests/pro_epilogue.c +f:tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c +f:tools/testing/selftests/bpf/prog_tests/probe_user.c +f:tools/testing/selftests/bpf/prog_tests/prog_array_init.c +f:tools/testing/selftests/bpf/prog_tests/prog_run_opts.c +f:tools/testing/selftests/bpf/prog_tests/prog_tests_framework.c +f:tools/testing/selftests/bpf/prog_tests/ptr_untrusted.c +f:tools/testing/selftests/bpf/prog_tests/queue_stack_map.c +f:tools/testing/selftests/bpf/prog_tests/raw_tp_null.c +f:tools/testing/selftests/bpf/prog_tests/raw_tp_test_run.c +f:tools/testing/selftests/bpf/prog_tests/raw_tp_writable_reject_nbd_invalid.c +f:tools/testing/selftests/bpf/prog_tests/raw_tp_writable_test_run.c +f:tools/testing/selftests/bpf/prog_tests/rbtree.c +f:tools/testing/selftests/bpf/prog_tests/rcu_read_lock.c +f:tools/testing/selftests/bpf/prog_tests/rdonly_maps.c +f:tools/testing/selftests/bpf/prog_tests/read_vsyscall.c +f:tools/testing/selftests/bpf/prog_tests/recursion.c +f:tools/testing/selftests/bpf/prog_tests/recursive_attach.c +f:tools/testing/selftests/bpf/prog_tests/refcounted_kptr.c +f:tools/testing/selftests/bpf/prog_tests/reference_tracking.c +f:tools/testing/selftests/bpf/prog_tests/reg_bounds.c +f:tools/testing/selftests/bpf/prog_tests/res_spin_lock.c +f:tools/testing/selftests/bpf/prog_tests/resolve_btfids.c +f:tools/testing/selftests/bpf/prog_tests/ringbuf.c +f:tools/testing/selftests/bpf/prog_tests/ringbuf_multi.c +f:tools/testing/selftests/bpf/prog_tests/section_names.c +f:tools/testing/selftests/bpf/prog_tests/select_reuseport.c +f:tools/testing/selftests/bpf/prog_tests/send_signal.c +f:tools/testing/selftests/bpf/prog_tests/send_signal_sched_switch.c +f:tools/testing/selftests/bpf/prog_tests/setget_sockopt.c +f:tools/testing/selftests/bpf/prog_tests/signal_pending.c +f:tools/testing/selftests/bpf/prog_tests/sk_assign.c +f:tools/testing/selftests/bpf/prog_tests/sk_lookup.c +f:tools/testing/selftests/bpf/prog_tests/sk_storage_omem_uncharge.c +f:tools/testing/selftests/bpf/prog_tests/sk_storage_tracing.c +f:tools/testing/selftests/bpf/prog_tests/skb_ctx.c +f:tools/testing/selftests/bpf/prog_tests/skb_helpers.c +f:tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c +f:tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c +f:tools/testing/selftests/bpf/prog_tests/skeleton.c +f:tools/testing/selftests/bpf/prog_tests/snprintf.c +f:tools/testing/selftests/bpf/prog_tests/snprintf_btf.c +f:tools/testing/selftests/bpf/prog_tests/sock_addr.c +f:tools/testing/selftests/bpf/prog_tests/sock_create.c +f:tools/testing/selftests/bpf/prog_tests/sock_destroy.c +f:tools/testing/selftests/bpf/prog_tests/sock_fields.c +f:tools/testing/selftests/bpf/prog_tests/sock_iter_batch.c +f:tools/testing/selftests/bpf/prog_tests/sock_post_bind.c +f:tools/testing/selftests/bpf/prog_tests/socket_cookie.c +f:tools/testing/selftests/bpf/prog_tests/socket_helpers.h +f:tools/testing/selftests/bpf/prog_tests/sockmap_basic.c +f:tools/testing/selftests/bpf/prog_tests/sockmap_helpers.h +f:tools/testing/selftests/bpf/prog_tests/sockmap_ktls.c +f:tools/testing/selftests/bpf/prog_tests/sockmap_listen.c +f:tools/testing/selftests/bpf/prog_tests/sockmap_redir.c +f:tools/testing/selftests/bpf/prog_tests/sockmap_strp.c +f:tools/testing/selftests/bpf/prog_tests/sockopt.c +f:tools/testing/selftests/bpf/prog_tests/sockopt_inherit.c +f:tools/testing/selftests/bpf/prog_tests/sockopt_multi.c +f:tools/testing/selftests/bpf/prog_tests/sockopt_qos_to_cc.c +f:tools/testing/selftests/bpf/prog_tests/sockopt_sk.c +f:tools/testing/selftests/bpf/prog_tests/spin_lock.c +f:tools/testing/selftests/bpf/prog_tests/stack_var_off.c +f:tools/testing/selftests/bpf/prog_tests/stacktrace_build_id.c +f:tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +f:tools/testing/selftests/bpf/prog_tests/stacktrace_map.c +f:tools/testing/selftests/bpf/prog_tests/stacktrace_map_raw_tp.c +f:tools/testing/selftests/bpf/prog_tests/stacktrace_map_skip.c +f:tools/testing/selftests/bpf/prog_tests/static_linked.c +f:tools/testing/selftests/bpf/prog_tests/stream.c +f:tools/testing/selftests/bpf/prog_tests/string_kfuncs.c +f:tools/testing/selftests/bpf/prog_tests/struct_ops_autocreate.c +f:tools/testing/selftests/bpf/prog_tests/struct_ops_private_stack.c +f:tools/testing/selftests/bpf/prog_tests/subprogs.c +f:tools/testing/selftests/bpf/prog_tests/subprogs_extable.c +f:tools/testing/selftests/bpf/prog_tests/subskeleton.c +f:tools/testing/selftests/bpf/prog_tests/summarization.c +f:tools/testing/selftests/bpf/prog_tests/syscall.c +f:tools/testing/selftests/bpf/prog_tests/tailcalls.c +f:tools/testing/selftests/bpf/prog_tests/task_fd_query_rawtp.c +f:tools/testing/selftests/bpf/prog_tests/task_fd_query_tp.c +f:tools/testing/selftests/bpf/prog_tests/task_kfunc.c +f:tools/testing/selftests/bpf/prog_tests/task_local_storage.c +f:tools/testing/selftests/bpf/prog_tests/task_pt_regs.c +f:tools/testing/selftests/bpf/prog_tests/task_under_cgroup.c +f:tools/testing/selftests/bpf/prog_tests/tc_bpf.c +f:tools/testing/selftests/bpf/prog_tests/tc_change_tail.c +f:tools/testing/selftests/bpf/prog_tests/tc_helpers.h +f:tools/testing/selftests/bpf/prog_tests/tc_links.c +f:tools/testing/selftests/bpf/prog_tests/tc_netkit.c +f:tools/testing/selftests/bpf/prog_tests/tc_opts.c +f:tools/testing/selftests/bpf/prog_tests/tc_redirect.c +f:tools/testing/selftests/bpf/prog_tests/tcp_custom_syncookie.c +f:tools/testing/selftests/bpf/prog_tests/tcp_estats.c +f:tools/testing/selftests/bpf/prog_tests/tcp_hdr_options.c +f:tools/testing/selftests/bpf/prog_tests/tcp_rtt.c +f:tools/testing/selftests/bpf/prog_tests/tcpbpf_user.c +f:tools/testing/selftests/bpf/prog_tests/test_bpf_ma.c +f:tools/testing/selftests/bpf/prog_tests/test_bpf_syscall_macro.c +f:tools/testing/selftests/bpf/prog_tests/test_bpffs.c +f:tools/testing/selftests/bpf/prog_tests/test_bprm_opts.c +f:tools/testing/selftests/bpf/prog_tests/test_btf_ext.c +f:tools/testing/selftests/bpf/prog_tests/test_csum_diff.c +f:tools/testing/selftests/bpf/prog_tests/test_global_funcs.c +f:tools/testing/selftests/bpf/prog_tests/test_ima.c +f:tools/testing/selftests/bpf/prog_tests/test_ldsx_insn.c +f:tools/testing/selftests/bpf/prog_tests/test_local_storage.c +f:tools/testing/selftests/bpf/prog_tests/test_lsm.c +f:tools/testing/selftests/bpf/prog_tests/test_mmap_inner_array.c +f:tools/testing/selftests/bpf/prog_tests/test_overhead.c +f:tools/testing/selftests/bpf/prog_tests/test_profiler.c +f:tools/testing/selftests/bpf/prog_tests/test_skb_pkt_end.c +f:tools/testing/selftests/bpf/prog_tests/test_strncmp.c +f:tools/testing/selftests/bpf/prog_tests/test_struct_ops_kptr_return.c +f:tools/testing/selftests/bpf/prog_tests/test_struct_ops_maybe_null.c +f:tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c +f:tools/testing/selftests/bpf/prog_tests/test_struct_ops_multi_pages.c +f:tools/testing/selftests/bpf/prog_tests/test_struct_ops_no_cfi.c +f:tools/testing/selftests/bpf/prog_tests/test_struct_ops_refcounted.c +f:tools/testing/selftests/bpf/prog_tests/test_sysctl.c +f:tools/testing/selftests/bpf/prog_tests/test_tunnel.c +f:tools/testing/selftests/bpf/prog_tests/test_veristat.c +f:tools/testing/selftests/bpf/prog_tests/test_xdp_veth.c +f:tools/testing/selftests/bpf/prog_tests/time_tai.c +f:tools/testing/selftests/bpf/prog_tests/timer.c +f:tools/testing/selftests/bpf/prog_tests/timer_crash.c +f:tools/testing/selftests/bpf/prog_tests/timer_lockup.c +f:tools/testing/selftests/bpf/prog_tests/timer_mim.c +f:tools/testing/selftests/bpf/prog_tests/token.c +f:tools/testing/selftests/bpf/prog_tests/tp_attach_query.c +f:tools/testing/selftests/bpf/prog_tests/tp_btf_nullable.c +f:tools/testing/selftests/bpf/prog_tests/trace_ext.c +f:tools/testing/selftests/bpf/prog_tests/trace_printk.c +f:tools/testing/selftests/bpf/prog_tests/trace_vprintk.c +f:tools/testing/selftests/bpf/prog_tests/tracing_failure.c +f:tools/testing/selftests/bpf/prog_tests/tracing_struct.c +f:tools/testing/selftests/bpf/prog_tests/trampoline_count.c +f:tools/testing/selftests/bpf/prog_tests/type_cast.c +f:tools/testing/selftests/bpf/prog_tests/udp_limit.c +f:tools/testing/selftests/bpf/prog_tests/uninit_stack.c +f:tools/testing/selftests/bpf/prog_tests/unpriv_bpf_disabled.c +f:tools/testing/selftests/bpf/prog_tests/uprobe.c +f:tools/testing/selftests/bpf/prog_tests/uprobe_autoattach.c +f:tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c +f:tools/testing/selftests/bpf/prog_tests/uprobe_syscall.c +f:tools/testing/selftests/bpf/prog_tests/uretprobe_stack.c +f:tools/testing/selftests/bpf/prog_tests/usdt.c +f:tools/testing/selftests/bpf/prog_tests/user_ringbuf.c +f:tools/testing/selftests/bpf/prog_tests/varlen.c +f:tools/testing/selftests/bpf/prog_tests/verif_stats.c +f:tools/testing/selftests/bpf/prog_tests/verifier.c +f:tools/testing/selftests/bpf/prog_tests/verifier_kfunc_prog_types.c +f:tools/testing/selftests/bpf/prog_tests/verifier_log.c +f:tools/testing/selftests/bpf/prog_tests/verify_pkcs7_sig.c +f:tools/testing/selftests/bpf/prog_tests/vmlinux.c +f:tools/testing/selftests/bpf/prog_tests/vrf_socket_lookup.c +f:tools/testing/selftests/bpf/prog_tests/wq.c +f:tools/testing/selftests/bpf/prog_tests/xdp.c +f:tools/testing/selftests/bpf/prog_tests/xdp_adjust_frags.c +f:tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c +f:tools/testing/selftests/bpf/prog_tests/xdp_attach.c +f:tools/testing/selftests/bpf/prog_tests/xdp_bonding.c +f:tools/testing/selftests/bpf/prog_tests/xdp_bpf2bpf.c +f:tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c +f:tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c +f:tools/testing/selftests/bpf/prog_tests/xdp_dev_bound_only.c +f:tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c +f:tools/testing/selftests/bpf/prog_tests/xdp_do_redirect.c +f:tools/testing/selftests/bpf/prog_tests/xdp_flowtable.c +f:tools/testing/selftests/bpf/prog_tests/xdp_info.c +f:tools/testing/selftests/bpf/prog_tests/xdp_link.c +f:tools/testing/selftests/bpf/prog_tests/xdp_metadata.c +f:tools/testing/selftests/bpf/prog_tests/xdp_noinline.c +f:tools/testing/selftests/bpf/prog_tests/xdp_perf.c +f:tools/testing/selftests/bpf/prog_tests/xdp_synproxy.c +f:tools/testing/selftests/bpf/prog_tests/xdp_vlan.c +f:tools/testing/selftests/bpf/prog_tests/xdpwall.c +f:tools/testing/selftests/bpf/prog_tests/xfrm_info.c +f:tools/testing/selftests/bpf/progs/access_map_in_map.c +f:tools/testing/selftests/bpf/progs/arena_atomics.c +f:tools/testing/selftests/bpf/progs/arena_htab.c +f:tools/testing/selftests/bpf/progs/arena_htab_asm.c +f:tools/testing/selftests/bpf/progs/arena_list.c +f:tools/testing/selftests/bpf/progs/arena_spin_lock.c +f:tools/testing/selftests/bpf/progs/async_stack_depth.c +f:tools/testing/selftests/bpf/progs/atomic_bounds.c +f:tools/testing/selftests/bpf/progs/atomics.c +f:tools/testing/selftests/bpf/progs/bad_struct_ops.c +f:tools/testing/selftests/bpf/progs/bad_struct_ops2.c +f:tools/testing/selftests/bpf/progs/bench_local_storage_create.c +f:tools/testing/selftests/bpf/progs/bench_sockmap_prog.c +f:tools/testing/selftests/bpf/progs/bind4_prog.c +f:tools/testing/selftests/bpf/progs/bind6_prog.c +f:tools/testing/selftests/bpf/progs/bind_perm.c +f:tools/testing/selftests/bpf/progs/bind_prog.h +f:tools/testing/selftests/bpf/progs/bloom_filter_bench.c +f:tools/testing/selftests/bpf/progs/bloom_filter_map.c +f:tools/testing/selftests/bpf/progs/bpf_arena_spin_lock.h +f:tools/testing/selftests/bpf/progs/bpf_cc_cubic.c +f:tools/testing/selftests/bpf/progs/bpf_compiler.h +f:tools/testing/selftests/bpf/progs/bpf_cubic.c +f:tools/testing/selftests/bpf/progs/bpf_dctcp.c +f:tools/testing/selftests/bpf/progs/bpf_dctcp_release.c +f:tools/testing/selftests/bpf/progs/bpf_flow.c +f:tools/testing/selftests/bpf/progs/bpf_hashmap_full_update_bench.c +f:tools/testing/selftests/bpf/progs/bpf_hashmap_lookup.c +f:tools/testing/selftests/bpf/progs/bpf_iter_bpf_array_map.c +f:tools/testing/selftests/bpf/progs/bpf_iter_bpf_hash_map.c +f:tools/testing/selftests/bpf/progs/bpf_iter_bpf_link.c +f:tools/testing/selftests/bpf/progs/bpf_iter_bpf_map.c +f:tools/testing/selftests/bpf/progs/bpf_iter_bpf_percpu_array_map.c +f:tools/testing/selftests/bpf/progs/bpf_iter_bpf_percpu_hash_map.c +f:tools/testing/selftests/bpf/progs/bpf_iter_bpf_sk_storage_helpers.c +f:tools/testing/selftests/bpf/progs/bpf_iter_bpf_sk_storage_map.c +f:tools/testing/selftests/bpf/progs/bpf_iter_ipv6_route.c +f:tools/testing/selftests/bpf/progs/bpf_iter_ksym.c +f:tools/testing/selftests/bpf/progs/bpf_iter_map_elem.c +f:tools/testing/selftests/bpf/progs/bpf_iter_netlink.c +f:tools/testing/selftests/bpf/progs/bpf_iter_setsockopt.c +f:tools/testing/selftests/bpf/progs/bpf_iter_setsockopt_unix.c +f:tools/testing/selftests/bpf/progs/bpf_iter_sockmap.c +f:tools/testing/selftests/bpf/progs/bpf_iter_task_btf.c +f:tools/testing/selftests/bpf/progs/bpf_iter_task_file.c +f:tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c +f:tools/testing/selftests/bpf/progs/bpf_iter_task_vmas.c +f:tools/testing/selftests/bpf/progs/bpf_iter_tasks.c +f:tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c +f:tools/testing/selftests/bpf/progs/bpf_iter_tcp6.c +f:tools/testing/selftests/bpf/progs/bpf_iter_test_kern1.c +f:tools/testing/selftests/bpf/progs/bpf_iter_test_kern2.c +f:tools/testing/selftests/bpf/progs/bpf_iter_test_kern3.c +f:tools/testing/selftests/bpf/progs/bpf_iter_test_kern4.c +f:tools/testing/selftests/bpf/progs/bpf_iter_test_kern5.c +f:tools/testing/selftests/bpf/progs/bpf_iter_test_kern6.c +f:tools/testing/selftests/bpf/progs/bpf_iter_test_kern_common.h +f:tools/testing/selftests/bpf/progs/bpf_iter_udp4.c +f:tools/testing/selftests/bpf/progs/bpf_iter_udp6.c +f:tools/testing/selftests/bpf/progs/bpf_iter_unix.c +f:tools/testing/selftests/bpf/progs/bpf_iter_vma_offset.c +f:tools/testing/selftests/bpf/progs/bpf_loop.c +f:tools/testing/selftests/bpf/progs/bpf_loop_bench.c +f:tools/testing/selftests/bpf/progs/bpf_misc.h +f:tools/testing/selftests/bpf/progs/bpf_mod_race.c +f:tools/testing/selftests/bpf/progs/bpf_qdisc_common.h +f:tools/testing/selftests/bpf/progs/bpf_qdisc_fail__incompl_ops.c +f:tools/testing/selftests/bpf/progs/bpf_qdisc_fifo.c +f:tools/testing/selftests/bpf/progs/bpf_qdisc_fq.c +f:tools/testing/selftests/bpf/progs/bpf_syscall_macro.c +f:tools/testing/selftests/bpf/progs/bpf_tcp_nogpl.c +f:tools/testing/selftests/bpf/progs/bpf_tracing_net.h +f:tools/testing/selftests/bpf/progs/bprm_opts.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___diff_arr_dim.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___diff_arr_val_sz.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___equiv_zero_sz_arr.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___err_bad_signed_arr_elem_sz.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___err_bad_zero_sz_arr.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___err_non_array.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___err_too_shallow.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___err_too_small.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___err_wrong_val_type.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_arrays___fixed_arr.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_bitfields.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_bitfields___bit_sz_change.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_bitfields___bitfield_vs_int.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_bitfields___err_too_big_bitfield.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_bitfields___just_big_enough.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_enum64val.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_enum64val___diff.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_enum64val___err_missing.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_enum64val___val3_missing.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_enumval.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_enumval___diff.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_enumval___err_missing.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_enumval___val3_missing.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_existence.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_existence___minimal.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_existence___wrong_field_defs.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_flavors.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_flavors__err_wrong_name.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_ints.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_ints___bool.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_ints___reverse_sign.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_misc.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_mods.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_mods___mod_swap.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_mods___typedefs.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___anon_embed.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___dup_compat_types.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___err_array_container.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___err_array_field.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___err_dup_incompat_types.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___err_missing_container.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___err_missing_field.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___err_nonstruct_container.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___err_partial_match_dups.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___err_too_deep.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___extra_nesting.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_nesting___struct_union_mixup.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_primitives.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_primitives___diff_enum_def.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_primitives___diff_func_proto.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_primitives___diff_ptr_type.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_primitives___err_non_enum.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_primitives___err_non_int.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_primitives___err_non_ptr.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_ptr_as_arr.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_ptr_as_arr___diff_sz.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_size.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_size___diff_offs.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_size___diff_sz.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_size___err_ambiguous.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_type_based.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_type_based___all_missing.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_type_based___diff.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_type_based___diff_sz.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_type_based___fn_wrong_args.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_type_based___incompat.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_type_id.c +f:tools/testing/selftests/bpf/progs/btf__core_reloc_type_id___missing_targets.c +f:tools/testing/selftests/bpf/progs/btf_data.c +f:tools/testing/selftests/bpf/progs/btf_dump_test_case_bitfields.c +f:tools/testing/selftests/bpf/progs/btf_dump_test_case_multidim.c +f:tools/testing/selftests/bpf/progs/btf_dump_test_case_namespacing.c +f:tools/testing/selftests/bpf/progs/btf_dump_test_case_ordering.c +f:tools/testing/selftests/bpf/progs/btf_dump_test_case_packing.c +f:tools/testing/selftests/bpf/progs/btf_dump_test_case_padding.c +f:tools/testing/selftests/bpf/progs/btf_dump_test_case_syntax.c +f:tools/testing/selftests/bpf/progs/btf_ptr.h +f:tools/testing/selftests/bpf/progs/btf_type_tag.c +f:tools/testing/selftests/bpf/progs/btf_type_tag_percpu.c +f:tools/testing/selftests/bpf/progs/btf_type_tag_user.c +f:tools/testing/selftests/bpf/progs/cb_refs.c +f:tools/testing/selftests/bpf/progs/cg_storage_multi.h +f:tools/testing/selftests/bpf/progs/cg_storage_multi_egress_only.c +f:tools/testing/selftests/bpf/progs/cg_storage_multi_isolated.c +f:tools/testing/selftests/bpf/progs/cg_storage_multi_shared.c +f:tools/testing/selftests/bpf/progs/cgroup_ancestor.c +f:tools/testing/selftests/bpf/progs/cgroup_getset_retval_getsockopt.c +f:tools/testing/selftests/bpf/progs/cgroup_getset_retval_hooks.c +f:tools/testing/selftests/bpf/progs/cgroup_getset_retval_setsockopt.c +f:tools/testing/selftests/bpf/progs/cgroup_hierarchical_stats.c +f:tools/testing/selftests/bpf/progs/cgroup_iter.c +f:tools/testing/selftests/bpf/progs/cgroup_mprog.c +f:tools/testing/selftests/bpf/progs/cgroup_preorder.c +f:tools/testing/selftests/bpf/progs/cgroup_read_xattr.c +f:tools/testing/selftests/bpf/progs/cgroup_skb_direct_packet_access.c +f:tools/testing/selftests/bpf/progs/cgroup_skb_sk_lookup_kern.c +f:tools/testing/selftests/bpf/progs/cgroup_storage.c +f:tools/testing/selftests/bpf/progs/cgroup_tcp_skb.c +f:tools/testing/selftests/bpf/progs/cgrp_kfunc_common.h +f:tools/testing/selftests/bpf/progs/cgrp_kfunc_failure.c +f:tools/testing/selftests/bpf/progs/cgrp_kfunc_success.c +f:tools/testing/selftests/bpf/progs/cgrp_ls_attach_cgroup.c +f:tools/testing/selftests/bpf/progs/cgrp_ls_negative.c +f:tools/testing/selftests/bpf/progs/cgrp_ls_recursion.c +f:tools/testing/selftests/bpf/progs/cgrp_ls_sleepable.c +f:tools/testing/selftests/bpf/progs/cgrp_ls_tp_btf.c +f:tools/testing/selftests/bpf/progs/compute_live_registers.c +f:tools/testing/selftests/bpf/progs/connect4_dropper.c +f:tools/testing/selftests/bpf/progs/connect4_prog.c +f:tools/testing/selftests/bpf/progs/connect6_prog.c +f:tools/testing/selftests/bpf/progs/connect_force_port4.c +f:tools/testing/selftests/bpf/progs/connect_force_port6.c +f:tools/testing/selftests/bpf/progs/connect_ping.c +f:tools/testing/selftests/bpf/progs/connect_unix_prog.c +f:tools/testing/selftests/bpf/progs/core_kern.c +f:tools/testing/selftests/bpf/progs/core_kern_overflow.c +f:tools/testing/selftests/bpf/progs/core_reloc_types.h +f:tools/testing/selftests/bpf/progs/cpumask_common.h +f:tools/testing/selftests/bpf/progs/cpumask_failure.c +f:tools/testing/selftests/bpf/progs/cpumask_success.c +f:tools/testing/selftests/bpf/progs/crypto_basic.c +f:tools/testing/selftests/bpf/progs/crypto_bench.c +f:tools/testing/selftests/bpf/progs/crypto_common.h +f:tools/testing/selftests/bpf/progs/crypto_sanity.c +f:tools/testing/selftests/bpf/progs/csum_diff_test.c +f:tools/testing/selftests/bpf/progs/decap_sanity.c +f:tools/testing/selftests/bpf/progs/dev_cgroup.c +f:tools/testing/selftests/bpf/progs/dmabuf_iter.c +f:tools/testing/selftests/bpf/progs/dummy_st_ops_fail.c +f:tools/testing/selftests/bpf/progs/dummy_st_ops_success.c +f:tools/testing/selftests/bpf/progs/dynptr_fail.c +f:tools/testing/selftests/bpf/progs/dynptr_success.c +f:tools/testing/selftests/bpf/progs/empty_skb.c +f:tools/testing/selftests/bpf/progs/epilogue_exit.c +f:tools/testing/selftests/bpf/progs/epilogue_tailcall.c +f:tools/testing/selftests/bpf/progs/err.h +f:tools/testing/selftests/bpf/progs/exceptions.c +f:tools/testing/selftests/bpf/progs/exceptions_assert.c +f:tools/testing/selftests/bpf/progs/exceptions_ext.c +f:tools/testing/selftests/bpf/progs/exceptions_fail.c +f:tools/testing/selftests/bpf/progs/exhandler_kern.c +f:tools/testing/selftests/bpf/progs/fd_htab_lookup.c +f:tools/testing/selftests/bpf/progs/fentry_many_args.c +f:tools/testing/selftests/bpf/progs/fentry_recursive.c +f:tools/testing/selftests/bpf/progs/fentry_recursive_target.c +f:tools/testing/selftests/bpf/progs/fentry_test.c +f:tools/testing/selftests/bpf/progs/fexit_bpf2bpf.c +f:tools/testing/selftests/bpf/progs/fexit_bpf2bpf_simple.c +f:tools/testing/selftests/bpf/progs/fexit_many_args.c +f:tools/testing/selftests/bpf/progs/fexit_sleep.c +f:tools/testing/selftests/bpf/progs/fexit_test.c +f:tools/testing/selftests/bpf/progs/fib_lookup.c +f:tools/testing/selftests/bpf/progs/find_vma.c +f:tools/testing/selftests/bpf/progs/find_vma_fail1.c +f:tools/testing/selftests/bpf/progs/find_vma_fail2.c +f:tools/testing/selftests/bpf/progs/fmod_ret_freplace.c +f:tools/testing/selftests/bpf/progs/for_each_array_map_elem.c +f:tools/testing/selftests/bpf/progs/for_each_hash_map_elem.c +f:tools/testing/selftests/bpf/progs/for_each_hash_modify.c +f:tools/testing/selftests/bpf/progs/for_each_map_elem_write_key.c +f:tools/testing/selftests/bpf/progs/for_each_multi_maps.c +f:tools/testing/selftests/bpf/progs/free_timer.c +f:tools/testing/selftests/bpf/progs/freplace_attach_probe.c +f:tools/testing/selftests/bpf/progs/freplace_cls_redirect.c +f:tools/testing/selftests/bpf/progs/freplace_connect4.c +f:tools/testing/selftests/bpf/progs/freplace_connect_v4_prog.c +f:tools/testing/selftests/bpf/progs/freplace_dead_global_func.c +f:tools/testing/selftests/bpf/progs/freplace_get_constant.c +f:tools/testing/selftests/bpf/progs/freplace_global_func.c +f:tools/testing/selftests/bpf/progs/freplace_progmap.c +f:tools/testing/selftests/bpf/progs/freplace_unreliable_prog.c +f:tools/testing/selftests/bpf/progs/get_branch_snapshot.c +f:tools/testing/selftests/bpf/progs/get_cgroup_id_kern.c +f:tools/testing/selftests/bpf/progs/get_func_args_test.c +f:tools/testing/selftests/bpf/progs/get_func_ip_test.c +f:tools/testing/selftests/bpf/progs/get_func_ip_uprobe_test.c +f:tools/testing/selftests/bpf/progs/getpeername4_prog.c +f:tools/testing/selftests/bpf/progs/getpeername6_prog.c +f:tools/testing/selftests/bpf/progs/getpeername_unix_prog.c +f:tools/testing/selftests/bpf/progs/getsockname4_prog.c +f:tools/testing/selftests/bpf/progs/getsockname6_prog.c +f:tools/testing/selftests/bpf/progs/getsockname_unix_prog.c +f:tools/testing/selftests/bpf/progs/htab_mem_bench.c +f:tools/testing/selftests/bpf/progs/htab_reuse.c +f:tools/testing/selftests/bpf/progs/htab_update.c +f:tools/testing/selftests/bpf/progs/ima.c +f:tools/testing/selftests/bpf/progs/inner_array_lookup.c +f:tools/testing/selftests/bpf/progs/ip_check_defrag.c +f:tools/testing/selftests/bpf/progs/irq.c +f:tools/testing/selftests/bpf/progs/iters.c +f:tools/testing/selftests/bpf/progs/iters_css.c +f:tools/testing/selftests/bpf/progs/iters_css_task.c +f:tools/testing/selftests/bpf/progs/iters_looping.c +f:tools/testing/selftests/bpf/progs/iters_num.c +f:tools/testing/selftests/bpf/progs/iters_state_safety.c +f:tools/testing/selftests/bpf/progs/iters_task.c +f:tools/testing/selftests/bpf/progs/iters_task_failure.c +f:tools/testing/selftests/bpf/progs/iters_task_vma.c +f:tools/testing/selftests/bpf/progs/iters_testmod.c +f:tools/testing/selftests/bpf/progs/iters_testmod_seq.c +f:tools/testing/selftests/bpf/progs/jeq_infer_not_null_fail.c +f:tools/testing/selftests/bpf/progs/jit_probe_mem.c +f:tools/testing/selftests/bpf/progs/kfree_skb.c +f:tools/testing/selftests/bpf/progs/kfunc_call_destructive.c +f:tools/testing/selftests/bpf/progs/kfunc_call_fail.c +f:tools/testing/selftests/bpf/progs/kfunc_call_race.c +f:tools/testing/selftests/bpf/progs/kfunc_call_test.c +f:tools/testing/selftests/bpf/progs/kfunc_call_test_subprog.c +f:tools/testing/selftests/bpf/progs/kfunc_module_order.c +f:tools/testing/selftests/bpf/progs/kmem_cache_iter.c +f:tools/testing/selftests/bpf/progs/kprobe_multi.c +f:tools/testing/selftests/bpf/progs/kprobe_multi_empty.c +f:tools/testing/selftests/bpf/progs/kprobe_multi_override.c +f:tools/testing/selftests/bpf/progs/kprobe_multi_session.c +f:tools/testing/selftests/bpf/progs/kprobe_multi_session_cookie.c +f:tools/testing/selftests/bpf/progs/kprobe_multi_verifier.c +f:tools/testing/selftests/bpf/progs/kptr_xchg_inline.c +f:tools/testing/selftests/bpf/progs/ksym_race.c +f:tools/testing/selftests/bpf/progs/linked_funcs1.c +f:tools/testing/selftests/bpf/progs/linked_funcs2.c +f:tools/testing/selftests/bpf/progs/linked_list.c +f:tools/testing/selftests/bpf/progs/linked_list.h +f:tools/testing/selftests/bpf/progs/linked_list_fail.c +f:tools/testing/selftests/bpf/progs/linked_list_peek.c +f:tools/testing/selftests/bpf/progs/linked_maps1.c +f:tools/testing/selftests/bpf/progs/linked_maps2.c +f:tools/testing/selftests/bpf/progs/linked_vars1.c +f:tools/testing/selftests/bpf/progs/linked_vars2.c +f:tools/testing/selftests/bpf/progs/load_bytes_relative.c +f:tools/testing/selftests/bpf/progs/local_kptr_stash.c +f:tools/testing/selftests/bpf/progs/local_kptr_stash_fail.c +f:tools/testing/selftests/bpf/progs/local_storage.c +f:tools/testing/selftests/bpf/progs/local_storage_bench.c +f:tools/testing/selftests/bpf/progs/local_storage_rcu_tasks_trace_bench.c +f:tools/testing/selftests/bpf/progs/loop1.c +f:tools/testing/selftests/bpf/progs/loop2.c +f:tools/testing/selftests/bpf/progs/loop3.c +f:tools/testing/selftests/bpf/progs/loop4.c +f:tools/testing/selftests/bpf/progs/loop5.c +f:tools/testing/selftests/bpf/progs/loop6.c +f:tools/testing/selftests/bpf/progs/lru_bug.c +f:tools/testing/selftests/bpf/progs/lsm.c +f:tools/testing/selftests/bpf/progs/lsm_cgroup.c +f:tools/testing/selftests/bpf/progs/lsm_cgroup_nonvoid.c +f:tools/testing/selftests/bpf/progs/lsm_tailcall.c +f:tools/testing/selftests/bpf/progs/map_in_map_btf.c +f:tools/testing/selftests/bpf/progs/map_kptr.c +f:tools/testing/selftests/bpf/progs/map_kptr_fail.c +f:tools/testing/selftests/bpf/progs/map_percpu_stats.c +f:tools/testing/selftests/bpf/progs/map_ptr_kern.c +f:tools/testing/selftests/bpf/progs/mem_rdonly_untrusted.c +f:tools/testing/selftests/bpf/progs/metadata_unused.c +f:tools/testing/selftests/bpf/progs/metadata_used.c +f:tools/testing/selftests/bpf/progs/missed_kprobe.c +f:tools/testing/selftests/bpf/progs/missed_kprobe_recursion.c +f:tools/testing/selftests/bpf/progs/missed_tp_recursion.c +f:tools/testing/selftests/bpf/progs/mmap_inner_array.c +f:tools/testing/selftests/bpf/progs/modify_return.c +f:tools/testing/selftests/bpf/progs/mptcp_bpf.h +f:tools/testing/selftests/bpf/progs/mptcp_sock.c +f:tools/testing/selftests/bpf/progs/mptcp_subflow.c +f:tools/testing/selftests/bpf/progs/mptcpify.c +f:tools/testing/selftests/bpf/progs/nested_acquire.c +f:tools/testing/selftests/bpf/progs/nested_trust_common.h +f:tools/testing/selftests/bpf/progs/nested_trust_failure.c +f:tools/testing/selftests/bpf/progs/nested_trust_success.c +f:tools/testing/selftests/bpf/progs/net_timestamping.c +f:tools/testing/selftests/bpf/progs/netcnt_prog.c +f:tools/testing/selftests/bpf/progs/netif_receive_skb.c +f:tools/testing/selftests/bpf/progs/netns_cookie_prog.c +f:tools/testing/selftests/bpf/progs/normal_map_btf.c +f:tools/testing/selftests/bpf/progs/percpu_alloc_array.c +f:tools/testing/selftests/bpf/progs/percpu_alloc_cgrp_local_storage.c +f:tools/testing/selftests/bpf/progs/percpu_alloc_fail.c +f:tools/testing/selftests/bpf/progs/perf_event_stackmap.c +f:tools/testing/selftests/bpf/progs/perfbuf_bench.c +f:tools/testing/selftests/bpf/progs/preempt_lock.c +f:tools/testing/selftests/bpf/progs/preempted_bpf_ma_op.c +f:tools/testing/selftests/bpf/progs/prepare.c +f:tools/testing/selftests/bpf/progs/priv_freplace_prog.c +f:tools/testing/selftests/bpf/progs/priv_map.c +f:tools/testing/selftests/bpf/progs/priv_prog.c +f:tools/testing/selftests/bpf/progs/pro_epilogue.c +f:tools/testing/selftests/bpf/progs/pro_epilogue_goto_start.c +f:tools/testing/selftests/bpf/progs/pro_epilogue_with_kfunc.c +f:tools/testing/selftests/bpf/progs/profiler.h +f:tools/testing/selftests/bpf/progs/profiler.inc.h +f:tools/testing/selftests/bpf/progs/profiler1.c +f:tools/testing/selftests/bpf/progs/profiler2.c +f:tools/testing/selftests/bpf/progs/profiler3.c +f:tools/testing/selftests/bpf/progs/pyperf.h +f:tools/testing/selftests/bpf/progs/pyperf100.c +f:tools/testing/selftests/bpf/progs/pyperf180.c +f:tools/testing/selftests/bpf/progs/pyperf50.c +f:tools/testing/selftests/bpf/progs/pyperf600.c +f:tools/testing/selftests/bpf/progs/pyperf600_bpf_loop.c +f:tools/testing/selftests/bpf/progs/pyperf600_iter.c +f:tools/testing/selftests/bpf/progs/pyperf600_nounroll.c +f:tools/testing/selftests/bpf/progs/pyperf_global.c +f:tools/testing/selftests/bpf/progs/pyperf_subprogs.c +f:tools/testing/selftests/bpf/progs/raw_tp_null.c +f:tools/testing/selftests/bpf/progs/raw_tp_null_fail.c +f:tools/testing/selftests/bpf/progs/rbtree.c +f:tools/testing/selftests/bpf/progs/rbtree_btf_fail__add_wrong_type.c +f:tools/testing/selftests/bpf/progs/rbtree_btf_fail__wrong_node_type.c +f:tools/testing/selftests/bpf/progs/rbtree_fail.c +f:tools/testing/selftests/bpf/progs/rbtree_search.c +f:tools/testing/selftests/bpf/progs/rcu_read_lock.c +f:tools/testing/selftests/bpf/progs/rcu_tasks_trace_gp.c +f:tools/testing/selftests/bpf/progs/read_bpf_task_storage_busy.c +f:tools/testing/selftests/bpf/progs/read_cgroupfs_xattr.c +f:tools/testing/selftests/bpf/progs/read_vsyscall.c +f:tools/testing/selftests/bpf/progs/recursion.c +f:tools/testing/selftests/bpf/progs/recvmsg4_prog.c +f:tools/testing/selftests/bpf/progs/recvmsg6_prog.c +f:tools/testing/selftests/bpf/progs/recvmsg_unix_prog.c +f:tools/testing/selftests/bpf/progs/refcounted_kptr.c +f:tools/testing/selftests/bpf/progs/refcounted_kptr_fail.c +f:tools/testing/selftests/bpf/progs/res_spin_lock.c +f:tools/testing/selftests/bpf/progs/res_spin_lock_fail.c +f:tools/testing/selftests/bpf/progs/ringbuf_bench.c +f:tools/testing/selftests/bpf/progs/security_bpf_map.c +f:tools/testing/selftests/bpf/progs/sendmsg4_prog.c +f:tools/testing/selftests/bpf/progs/sendmsg6_prog.c +f:tools/testing/selftests/bpf/progs/sendmsg_unix_prog.c +f:tools/testing/selftests/bpf/progs/set_global_vars.c +f:tools/testing/selftests/bpf/progs/setget_sockopt.c +f:tools/testing/selftests/bpf/progs/sk_storage_omem_uncharge.c +f:tools/testing/selftests/bpf/progs/skb_load_bytes.c +f:tools/testing/selftests/bpf/progs/skb_pkt_end.c +f:tools/testing/selftests/bpf/progs/sock_addr_kern.c +f:tools/testing/selftests/bpf/progs/sock_destroy_prog.c +f:tools/testing/selftests/bpf/progs/sock_destroy_prog_fail.c +f:tools/testing/selftests/bpf/progs/sock_iter_batch.c +f:tools/testing/selftests/bpf/progs/socket_cookie_prog.c +f:tools/testing/selftests/bpf/progs/sockmap_parse_prog.c +f:tools/testing/selftests/bpf/progs/sockmap_tcp_msg_prog.c +f:tools/testing/selftests/bpf/progs/sockmap_verdict_prog.c +f:tools/testing/selftests/bpf/progs/sockopt_inherit.c +f:tools/testing/selftests/bpf/progs/sockopt_multi.c +f:tools/testing/selftests/bpf/progs/sockopt_qos_to_cc.c +f:tools/testing/selftests/bpf/progs/sockopt_sk.c +f:tools/testing/selftests/bpf/progs/stacktrace_map_skip.c +f:tools/testing/selftests/bpf/progs/stream.c +f:tools/testing/selftests/bpf/progs/stream_fail.c +f:tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c +f:tools/testing/selftests/bpf/progs/string_kfuncs_failure2.c +f:tools/testing/selftests/bpf/progs/string_kfuncs_success.c +f:tools/testing/selftests/bpf/progs/strncmp_bench.c +f:tools/testing/selftests/bpf/progs/strncmp_test.c +f:tools/testing/selftests/bpf/progs/strobemeta.c +f:tools/testing/selftests/bpf/progs/strobemeta.h +f:tools/testing/selftests/bpf/progs/strobemeta_bpf_loop.c +f:tools/testing/selftests/bpf/progs/strobemeta_nounroll1.c +f:tools/testing/selftests/bpf/progs/strobemeta_nounroll2.c +f:tools/testing/selftests/bpf/progs/strobemeta_subprogs.c +f:tools/testing/selftests/bpf/progs/struct_ops_autocreate.c +f:tools/testing/selftests/bpf/progs/struct_ops_autocreate2.c +f:tools/testing/selftests/bpf/progs/struct_ops_detach.c +f:tools/testing/selftests/bpf/progs/struct_ops_forgotten_cb.c +f:tools/testing/selftests/bpf/progs/struct_ops_kptr_return.c +f:tools/testing/selftests/bpf/progs/struct_ops_kptr_return_fail__invalid_scalar.c +f:tools/testing/selftests/bpf/progs/struct_ops_kptr_return_fail__local_kptr.c +f:tools/testing/selftests/bpf/progs/struct_ops_kptr_return_fail__nonzero_offset.c +f:tools/testing/selftests/bpf/progs/struct_ops_kptr_return_fail__wrong_type.c +f:tools/testing/selftests/bpf/progs/struct_ops_maybe_null.c +f:tools/testing/selftests/bpf/progs/struct_ops_maybe_null_fail.c +f:tools/testing/selftests/bpf/progs/struct_ops_module.c +f:tools/testing/selftests/bpf/progs/struct_ops_multi_pages.c +f:tools/testing/selftests/bpf/progs/struct_ops_nulled_out_cb.c +f:tools/testing/selftests/bpf/progs/struct_ops_private_stack.c +f:tools/testing/selftests/bpf/progs/struct_ops_private_stack_fail.c +f:tools/testing/selftests/bpf/progs/struct_ops_private_stack_recur.c +f:tools/testing/selftests/bpf/progs/struct_ops_refcounted.c +f:tools/testing/selftests/bpf/progs/struct_ops_refcounted_fail__global_subprog.c +f:tools/testing/selftests/bpf/progs/struct_ops_refcounted_fail__ref_leak.c +f:tools/testing/selftests/bpf/progs/struct_ops_refcounted_fail__tail_call.c +f:tools/testing/selftests/bpf/progs/summarization.c +f:tools/testing/selftests/bpf/progs/summarization_freplace.c +f:tools/testing/selftests/bpf/progs/syscall.c +f:tools/testing/selftests/bpf/progs/tailcall1.c +f:tools/testing/selftests/bpf/progs/tailcall2.c +f:tools/testing/selftests/bpf/progs/tailcall3.c +f:tools/testing/selftests/bpf/progs/tailcall4.c +f:tools/testing/selftests/bpf/progs/tailcall5.c +f:tools/testing/selftests/bpf/progs/tailcall6.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf1.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf2.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf3.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf4.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf6.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_fentry.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_fexit.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_hierarchy1.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_hierarchy2.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_hierarchy3.c +f:tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_hierarchy_fentry.c +f:tools/testing/selftests/bpf/progs/tailcall_fail.c +f:tools/testing/selftests/bpf/progs/tailcall_freplace.c +f:tools/testing/selftests/bpf/progs/tailcall_poke.c +f:tools/testing/selftests/bpf/progs/task_kfunc_common.h +f:tools/testing/selftests/bpf/progs/task_kfunc_failure.c +f:tools/testing/selftests/bpf/progs/task_kfunc_success.c +f:tools/testing/selftests/bpf/progs/task_local_storage.c +f:tools/testing/selftests/bpf/progs/task_local_storage_exit_creds.c +f:tools/testing/selftests/bpf/progs/task_ls_recursion.c +f:tools/testing/selftests/bpf/progs/task_ls_uptr.c +f:tools/testing/selftests/bpf/progs/task_storage_nodeadlock.c +f:tools/testing/selftests/bpf/progs/tc_bpf2bpf.c +f:tools/testing/selftests/bpf/progs/tc_dummy.c +f:tools/testing/selftests/bpf/progs/tcp_ca_incompl_cong_ops.c +f:tools/testing/selftests/bpf/progs/tcp_ca_kfunc.c +f:tools/testing/selftests/bpf/progs/tcp_ca_unsupp_cong_op.c +f:tools/testing/selftests/bpf/progs/tcp_ca_update.c +f:tools/testing/selftests/bpf/progs/tcp_ca_write_sk_pacing.c +f:tools/testing/selftests/bpf/progs/tcp_rtt.c +f:tools/testing/selftests/bpf/progs/test_access_variable_array.c +f:tools/testing/selftests/bpf/progs/test_assign_reuse.c +f:tools/testing/selftests/bpf/progs/test_attach_kprobe_sleepable.c +f:tools/testing/selftests/bpf/progs/test_attach_probe.c +f:tools/testing/selftests/bpf/progs/test_attach_probe_manual.c +f:tools/testing/selftests/bpf/progs/test_autoattach.c +f:tools/testing/selftests/bpf/progs/test_autoload.c +f:tools/testing/selftests/bpf/progs/test_bpf_cookie.c +f:tools/testing/selftests/bpf/progs/test_bpf_ma.c +f:tools/testing/selftests/bpf/progs/test_bpf_nf.c +f:tools/testing/selftests/bpf/progs/test_bpf_nf_fail.c +f:tools/testing/selftests/bpf/progs/test_btf_decl_tag.c +f:tools/testing/selftests/bpf/progs/test_btf_ext.c +f:tools/testing/selftests/bpf/progs/test_btf_map_in_map.c +f:tools/testing/selftests/bpf/progs/test_btf_newkv.c +f:tools/testing/selftests/bpf/progs/test_btf_nokv.c +f:tools/testing/selftests/bpf/progs/test_btf_skc_cls_ingress.c +f:tools/testing/selftests/bpf/progs/test_build_id.c +f:tools/testing/selftests/bpf/progs/test_cgroup1_hierarchy.c +f:tools/testing/selftests/bpf/progs/test_cgroup_link.c +f:tools/testing/selftests/bpf/progs/test_check_mtu.c +f:tools/testing/selftests/bpf/progs/test_cls_redirect.c +f:tools/testing/selftests/bpf/progs/test_cls_redirect.h +f:tools/testing/selftests/bpf/progs/test_cls_redirect_dynptr.c +f:tools/testing/selftests/bpf/progs/test_cls_redirect_subprogs.c +f:tools/testing/selftests/bpf/progs/test_core_autosize.c +f:tools/testing/selftests/bpf/progs/test_core_extern.c +f:tools/testing/selftests/bpf/progs/test_core_read_macros.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_arrays.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_direct.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_probed.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_enum64val.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_enumval.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_existence.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_flavors.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_ints.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_kernel.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_misc.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_mods.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_module.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_nesting.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_primitives.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_ptr_as_arr.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_size.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_type_based.c +f:tools/testing/selftests/bpf/progs/test_core_reloc_type_id.c +f:tools/testing/selftests/bpf/progs/test_core_retro.c +f:tools/testing/selftests/bpf/progs/test_custom_sec_handlers.c +f:tools/testing/selftests/bpf/progs/test_d_path.c +f:tools/testing/selftests/bpf/progs/test_d_path_check_rdonly_mem.c +f:tools/testing/selftests/bpf/progs/test_d_path_check_types.c +f:tools/testing/selftests/bpf/progs/test_deny_namespace.c +f:tools/testing/selftests/bpf/progs/test_enable_stats.c +f:tools/testing/selftests/bpf/progs/test_endian.c +f:tools/testing/selftests/bpf/progs/test_fill_link_info.c +f:tools/testing/selftests/bpf/progs/test_fsverity.c +f:tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c +f:tools/testing/selftests/bpf/progs/test_get_stack_rawtp_err.c +f:tools/testing/selftests/bpf/progs/test_get_xattr.c +f:tools/testing/selftests/bpf/progs/test_global_data.c +f:tools/testing/selftests/bpf/progs/test_global_func1.c +f:tools/testing/selftests/bpf/progs/test_global_func10.c +f:tools/testing/selftests/bpf/progs/test_global_func11.c +f:tools/testing/selftests/bpf/progs/test_global_func12.c +f:tools/testing/selftests/bpf/progs/test_global_func13.c +f:tools/testing/selftests/bpf/progs/test_global_func14.c +f:tools/testing/selftests/bpf/progs/test_global_func15.c +f:tools/testing/selftests/bpf/progs/test_global_func16.c +f:tools/testing/selftests/bpf/progs/test_global_func17.c +f:tools/testing/selftests/bpf/progs/test_global_func2.c +f:tools/testing/selftests/bpf/progs/test_global_func3.c +f:tools/testing/selftests/bpf/progs/test_global_func4.c +f:tools/testing/selftests/bpf/progs/test_global_func5.c +f:tools/testing/selftests/bpf/progs/test_global_func6.c +f:tools/testing/selftests/bpf/progs/test_global_func7.c +f:tools/testing/selftests/bpf/progs/test_global_func8.c +f:tools/testing/selftests/bpf/progs/test_global_func9.c +f:tools/testing/selftests/bpf/progs/test_global_func_args.c +f:tools/testing/selftests/bpf/progs/test_global_func_ctx_args.c +f:tools/testing/selftests/bpf/progs/test_global_map_resize.c +f:tools/testing/selftests/bpf/progs/test_hash_large_key.c +f:tools/testing/selftests/bpf/progs/test_helper_restricted.c +f:tools/testing/selftests/bpf/progs/test_jhash.h +f:tools/testing/selftests/bpf/progs/test_kernel_flag.c +f:tools/testing/selftests/bpf/progs/test_kfunc_dynptr_param.c +f:tools/testing/selftests/bpf/progs/test_kfunc_param_nullable.c +f:tools/testing/selftests/bpf/progs/test_ksyms.c +f:tools/testing/selftests/bpf/progs/test_ksyms_btf.c +f:tools/testing/selftests/bpf/progs/test_ksyms_btf_null_check.c +f:tools/testing/selftests/bpf/progs/test_ksyms_btf_write_check.c +f:tools/testing/selftests/bpf/progs/test_ksyms_module.c +f:tools/testing/selftests/bpf/progs/test_ksyms_weak.c +f:tools/testing/selftests/bpf/progs/test_l4lb.c +f:tools/testing/selftests/bpf/progs/test_l4lb_noinline.c +f:tools/testing/selftests/bpf/progs/test_l4lb_noinline_dynptr.c +f:tools/testing/selftests/bpf/progs/test_ldsx_insn.c +f:tools/testing/selftests/bpf/progs/test_legacy_printk.c +f:tools/testing/selftests/bpf/progs/test_libbpf_get_fd_by_id_opts.c +f:tools/testing/selftests/bpf/progs/test_link_pinning.c +f:tools/testing/selftests/bpf/progs/test_lirc_mode2_kern.c +f:tools/testing/selftests/bpf/progs/test_log_buf.c +f:tools/testing/selftests/bpf/progs/test_log_fixup.c +f:tools/testing/selftests/bpf/progs/test_lookup_and_delete.c +f:tools/testing/selftests/bpf/progs/test_lookup_key.c +f:tools/testing/selftests/bpf/progs/test_lwt_ip_encap.c +f:tools/testing/selftests/bpf/progs/test_lwt_redirect.c +f:tools/testing/selftests/bpf/progs/test_lwt_reroute.c +f:tools/testing/selftests/bpf/progs/test_lwt_seg6local.c +f:tools/testing/selftests/bpf/progs/test_map_in_map.c +f:tools/testing/selftests/bpf/progs/test_map_in_map_invalid.c +f:tools/testing/selftests/bpf/progs/test_map_init.c +f:tools/testing/selftests/bpf/progs/test_map_lock.c +f:tools/testing/selftests/bpf/progs/test_map_lookup_percpu_elem.c +f:tools/testing/selftests/bpf/progs/test_map_ops.c +f:tools/testing/selftests/bpf/progs/test_migrate_reuseport.c +f:tools/testing/selftests/bpf/progs/test_misc_tcp_hdr_options.c +f:tools/testing/selftests/bpf/progs/test_mmap.c +f:tools/testing/selftests/bpf/progs/test_module_attach.c +f:tools/testing/selftests/bpf/progs/test_netfilter_link_attach.c +f:tools/testing/selftests/bpf/progs/test_ns_current_pid_tgid.c +f:tools/testing/selftests/bpf/progs/test_obj_id.c +f:tools/testing/selftests/bpf/progs/test_overhead.c +f:tools/testing/selftests/bpf/progs/test_parse_tcp_hdr_opt.c +f:tools/testing/selftests/bpf/progs/test_parse_tcp_hdr_opt_dynptr.c +f:tools/testing/selftests/bpf/progs/test_pe_preserve_elems.c +f:tools/testing/selftests/bpf/progs/test_perf_branches.c +f:tools/testing/selftests/bpf/progs/test_perf_buffer.c +f:tools/testing/selftests/bpf/progs/test_perf_link.c +f:tools/testing/selftests/bpf/progs/test_perf_skip.c +f:tools/testing/selftests/bpf/progs/test_pinning.c +f:tools/testing/selftests/bpf/progs/test_pinning_invalid.c +f:tools/testing/selftests/bpf/progs/test_pkt_access.c +f:tools/testing/selftests/bpf/progs/test_pkt_md_access.c +f:tools/testing/selftests/bpf/progs/test_probe_read_user_str.c +f:tools/testing/selftests/bpf/progs/test_probe_user.c +f:tools/testing/selftests/bpf/progs/test_prog_array_init.c +f:tools/testing/selftests/bpf/progs/test_ptr_untrusted.c +f:tools/testing/selftests/bpf/progs/test_queue_map.c +f:tools/testing/selftests/bpf/progs/test_queue_stack_map.h +f:tools/testing/selftests/bpf/progs/test_raw_tp_test_run.c +f:tools/testing/selftests/bpf/progs/test_rdonly_maps.c +f:tools/testing/selftests/bpf/progs/test_ringbuf.c +f:tools/testing/selftests/bpf/progs/test_ringbuf_map_key.c +f:tools/testing/selftests/bpf/progs/test_ringbuf_multi.c +f:tools/testing/selftests/bpf/progs/test_ringbuf_n.c +f:tools/testing/selftests/bpf/progs/test_ringbuf_write.c +f:tools/testing/selftests/bpf/progs/test_seg6_loop.c +f:tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c +f:tools/testing/selftests/bpf/progs/test_send_signal_kern.c +f:tools/testing/selftests/bpf/progs/test_set_remove_xattr.c +f:tools/testing/selftests/bpf/progs/test_sig_in_xattr.c +f:tools/testing/selftests/bpf/progs/test_siphash.h +f:tools/testing/selftests/bpf/progs/test_sk_assign.c +f:tools/testing/selftests/bpf/progs/test_sk_assign_libbpf.c +f:tools/testing/selftests/bpf/progs/test_sk_lookup.c +f:tools/testing/selftests/bpf/progs/test_sk_lookup_kern.c +f:tools/testing/selftests/bpf/progs/test_sk_storage_trace_itself.c +f:tools/testing/selftests/bpf/progs/test_sk_storage_tracing.c +f:tools/testing/selftests/bpf/progs/test_skb_ctx.c +f:tools/testing/selftests/bpf/progs/test_skb_helpers.c +f:tools/testing/selftests/bpf/progs/test_skc_to_unix_sock.c +f:tools/testing/selftests/bpf/progs/test_skeleton.c +f:tools/testing/selftests/bpf/progs/test_skmsg_load_helpers.c +f:tools/testing/selftests/bpf/progs/test_snprintf.c +f:tools/testing/selftests/bpf/progs/test_snprintf_single.c +f:tools/testing/selftests/bpf/progs/test_sock_fields.c +f:tools/testing/selftests/bpf/progs/test_sockhash_kern.c +f:tools/testing/selftests/bpf/progs/test_sockmap_change_tail.c +f:tools/testing/selftests/bpf/progs/test_sockmap_drop_prog.c +f:tools/testing/selftests/bpf/progs/test_sockmap_invalid_update.c +f:tools/testing/selftests/bpf/progs/test_sockmap_kern.c +f:tools/testing/selftests/bpf/progs/test_sockmap_kern.h +f:tools/testing/selftests/bpf/progs/test_sockmap_ktls.c +f:tools/testing/selftests/bpf/progs/test_sockmap_listen.c +f:tools/testing/selftests/bpf/progs/test_sockmap_pass_prog.c +f:tools/testing/selftests/bpf/progs/test_sockmap_progs_query.c +f:tools/testing/selftests/bpf/progs/test_sockmap_redir.c +f:tools/testing/selftests/bpf/progs/test_sockmap_skb_verdict_attach.c +f:tools/testing/selftests/bpf/progs/test_sockmap_strp.c +f:tools/testing/selftests/bpf/progs/test_sockmap_update.c +f:tools/testing/selftests/bpf/progs/test_spin_lock.c +f:tools/testing/selftests/bpf/progs/test_spin_lock_fail.c +f:tools/testing/selftests/bpf/progs/test_stack_map.c +f:tools/testing/selftests/bpf/progs/test_stack_var_off.c +f:tools/testing/selftests/bpf/progs/test_stacktrace_build_id.c +f:tools/testing/selftests/bpf/progs/test_stacktrace_map.c +f:tools/testing/selftests/bpf/progs/test_static_linked1.c +f:tools/testing/selftests/bpf/progs/test_static_linked2.c +f:tools/testing/selftests/bpf/progs/test_subprogs.c +f:tools/testing/selftests/bpf/progs/test_subprogs_extable.c +f:tools/testing/selftests/bpf/progs/test_subprogs_unused.c +f:tools/testing/selftests/bpf/progs/test_subskeleton.c +f:tools/testing/selftests/bpf/progs/test_subskeleton_lib.c +f:tools/testing/selftests/bpf/progs/test_subskeleton_lib2.c +f:tools/testing/selftests/bpf/progs/test_sysctl_loop1.c +f:tools/testing/selftests/bpf/progs/test_sysctl_loop2.c +f:tools/testing/selftests/bpf/progs/test_sysctl_prog.c +f:tools/testing/selftests/bpf/progs/test_task_pt_regs.c +f:tools/testing/selftests/bpf/progs/test_task_under_cgroup.c +f:tools/testing/selftests/bpf/progs/test_tc_bpf.c +f:tools/testing/selftests/bpf/progs/test_tc_change_tail.c +f:tools/testing/selftests/bpf/progs/test_tc_dtime.c +f:tools/testing/selftests/bpf/progs/test_tc_edt.c +f:tools/testing/selftests/bpf/progs/test_tc_link.c +f:tools/testing/selftests/bpf/progs/test_tc_neigh.c +f:tools/testing/selftests/bpf/progs/test_tc_neigh_fib.c +f:tools/testing/selftests/bpf/progs/test_tc_peer.c +f:tools/testing/selftests/bpf/progs/test_tc_tunnel.c +f:tools/testing/selftests/bpf/progs/test_tcp_custom_syncookie.c +f:tools/testing/selftests/bpf/progs/test_tcp_custom_syncookie.h +f:tools/testing/selftests/bpf/progs/test_tcp_estats.c +f:tools/testing/selftests/bpf/progs/test_tcp_hdr_options.c +f:tools/testing/selftests/bpf/progs/test_tcpbpf_kern.c +f:tools/testing/selftests/bpf/progs/test_tcpnotify_kern.c +f:tools/testing/selftests/bpf/progs/test_time_tai.c +f:tools/testing/selftests/bpf/progs/test_tp_btf_nullable.c +f:tools/testing/selftests/bpf/progs/test_trace_ext.c +f:tools/testing/selftests/bpf/progs/test_trace_ext_tracing.c +f:tools/testing/selftests/bpf/progs/test_tracepoint.c +f:tools/testing/selftests/bpf/progs/test_trampoline_count.c +f:tools/testing/selftests/bpf/progs/test_tunnel_kern.c +f:tools/testing/selftests/bpf/progs/test_unpriv_bpf_disabled.c +f:tools/testing/selftests/bpf/progs/test_uprobe.c +f:tools/testing/selftests/bpf/progs/test_uprobe_autoattach.c +f:tools/testing/selftests/bpf/progs/test_urandom_usdt.c +f:tools/testing/selftests/bpf/progs/test_usdt.c +f:tools/testing/selftests/bpf/progs/test_usdt_multispec.c +f:tools/testing/selftests/bpf/progs/test_user_ringbuf.h +f:tools/testing/selftests/bpf/progs/test_varlen.c +f:tools/testing/selftests/bpf/progs/test_verif_scale1.c +f:tools/testing/selftests/bpf/progs/test_verif_scale2.c +f:tools/testing/selftests/bpf/progs/test_verif_scale3.c +f:tools/testing/selftests/bpf/progs/test_verify_pkcs7_sig.c +f:tools/testing/selftests/bpf/progs/test_vmlinux.c +f:tools/testing/selftests/bpf/progs/test_xdp.c +f:tools/testing/selftests/bpf/progs/test_xdp_adjust_tail_grow.c +f:tools/testing/selftests/bpf/progs/test_xdp_adjust_tail_shrink.c +f:tools/testing/selftests/bpf/progs/test_xdp_attach_fail.c +f:tools/testing/selftests/bpf/progs/test_xdp_bpf2bpf.c +f:tools/testing/selftests/bpf/progs/test_xdp_context_test_run.c +f:tools/testing/selftests/bpf/progs/test_xdp_devmap_helpers.c +f:tools/testing/selftests/bpf/progs/test_xdp_do_redirect.c +f:tools/testing/selftests/bpf/progs/test_xdp_dynptr.c +f:tools/testing/selftests/bpf/progs/test_xdp_link.c +f:tools/testing/selftests/bpf/progs/test_xdp_loop.c +f:tools/testing/selftests/bpf/progs/test_xdp_meta.c +f:tools/testing/selftests/bpf/progs/test_xdp_noinline.c +f:tools/testing/selftests/bpf/progs/test_xdp_update_frags.c +f:tools/testing/selftests/bpf/progs/test_xdp_vlan.c +f:tools/testing/selftests/bpf/progs/test_xdp_with_cpumap_frags_helpers.c +f:tools/testing/selftests/bpf/progs/test_xdp_with_cpumap_helpers.c +f:tools/testing/selftests/bpf/progs/test_xdp_with_devmap_frags_helpers.c +f:tools/testing/selftests/bpf/progs/test_xdp_with_devmap_helpers.c +f:tools/testing/selftests/bpf/progs/timer.c +f:tools/testing/selftests/bpf/progs/timer_crash.c +f:tools/testing/selftests/bpf/progs/timer_failure.c +f:tools/testing/selftests/bpf/progs/timer_lockup.c +f:tools/testing/selftests/bpf/progs/timer_mim.c +f:tools/testing/selftests/bpf/progs/timer_mim_reject.c +f:tools/testing/selftests/bpf/progs/token_lsm.c +f:tools/testing/selftests/bpf/progs/trace_dummy_st_ops.c +f:tools/testing/selftests/bpf/progs/trace_printk.c +f:tools/testing/selftests/bpf/progs/trace_vprintk.c +f:tools/testing/selftests/bpf/progs/tracing_failure.c +f:tools/testing/selftests/bpf/progs/tracing_struct.c +f:tools/testing/selftests/bpf/progs/tracing_struct_many_args.c +f:tools/testing/selftests/bpf/progs/trigger_bench.c +f:tools/testing/selftests/bpf/progs/twfw.c +f:tools/testing/selftests/bpf/progs/type_cast.c +f:tools/testing/selftests/bpf/progs/udp_limit.c +f:tools/testing/selftests/bpf/progs/uninit_stack.c +f:tools/testing/selftests/bpf/progs/unsupported_ops.c +f:tools/testing/selftests/bpf/progs/update_map_in_htab.c +f:tools/testing/selftests/bpf/progs/uprobe_multi.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_bench.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_consumers.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_pid_filter.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_session.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_session_cookie.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_session_recursive.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_session_single.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_usdt.c +f:tools/testing/selftests/bpf/progs/uprobe_multi_verifier.c +f:tools/testing/selftests/bpf/progs/uprobe_syscall.c +f:tools/testing/selftests/bpf/progs/uprobe_syscall_executed.c +f:tools/testing/selftests/bpf/progs/uptr_failure.c +f:tools/testing/selftests/bpf/progs/uptr_map_failure.c +f:tools/testing/selftests/bpf/progs/uptr_update_failure.c +f:tools/testing/selftests/bpf/progs/uretprobe_stack.c +f:tools/testing/selftests/bpf/progs/user_ringbuf_fail.c +f:tools/testing/selftests/bpf/progs/user_ringbuf_success.c +f:tools/testing/selftests/bpf/progs/verifier_and.c +f:tools/testing/selftests/bpf/progs/verifier_arena.c +f:tools/testing/selftests/bpf/progs/verifier_arena_large.c +f:tools/testing/selftests/bpf/progs/verifier_array_access.c +f:tools/testing/selftests/bpf/progs/verifier_basic_stack.c +f:tools/testing/selftests/bpf/progs/verifier_bitfield_write.c +f:tools/testing/selftests/bpf/progs/verifier_bits_iter.c +f:tools/testing/selftests/bpf/progs/verifier_bounds.c +f:tools/testing/selftests/bpf/progs/verifier_bounds_deduction.c +f:tools/testing/selftests/bpf/progs/verifier_bounds_deduction_non_const.c +f:tools/testing/selftests/bpf/progs/verifier_bounds_mix_sign_unsign.c +f:tools/testing/selftests/bpf/progs/verifier_bpf_fastcall.c +f:tools/testing/selftests/bpf/progs/verifier_bpf_get_stack.c +f:tools/testing/selftests/bpf/progs/verifier_bpf_trap.c +f:tools/testing/selftests/bpf/progs/verifier_bswap.c +f:tools/testing/selftests/bpf/progs/verifier_btf_ctx_access.c +f:tools/testing/selftests/bpf/progs/verifier_btf_unreliable_prog.c +f:tools/testing/selftests/bpf/progs/verifier_cfg.c +f:tools/testing/selftests/bpf/progs/verifier_cgroup_inv_retcode.c +f:tools/testing/selftests/bpf/progs/verifier_cgroup_skb.c +f:tools/testing/selftests/bpf/progs/verifier_cgroup_storage.c +f:tools/testing/selftests/bpf/progs/verifier_const.c +f:tools/testing/selftests/bpf/progs/verifier_const_or.c +f:tools/testing/selftests/bpf/progs/verifier_ctx.c +f:tools/testing/selftests/bpf/progs/verifier_ctx_sk_msg.c +f:tools/testing/selftests/bpf/progs/verifier_d_path.c +f:tools/testing/selftests/bpf/progs/verifier_direct_packet_access.c +f:tools/testing/selftests/bpf/progs/verifier_direct_stack_access_wraparound.c +f:tools/testing/selftests/bpf/progs/verifier_div0.c +f:tools/testing/selftests/bpf/progs/verifier_div_overflow.c +f:tools/testing/selftests/bpf/progs/verifier_global_ptr_args.c +f:tools/testing/selftests/bpf/progs/verifier_global_subprogs.c +f:tools/testing/selftests/bpf/progs/verifier_gotol.c +f:tools/testing/selftests/bpf/progs/verifier_helper_access_var_len.c +f:tools/testing/selftests/bpf/progs/verifier_helper_packet_access.c +f:tools/testing/selftests/bpf/progs/verifier_helper_restricted.c +f:tools/testing/selftests/bpf/progs/verifier_helper_value_access.c +f:tools/testing/selftests/bpf/progs/verifier_int_ptr.c +f:tools/testing/selftests/bpf/progs/verifier_iterating_callbacks.c +f:tools/testing/selftests/bpf/progs/verifier_jeq_infer_not_null.c +f:tools/testing/selftests/bpf/progs/verifier_jit_convergence.c +f:tools/testing/selftests/bpf/progs/verifier_kfunc_prog_types.c +f:tools/testing/selftests/bpf/progs/verifier_ld_ind.c +f:tools/testing/selftests/bpf/progs/verifier_ldsx.c +f:tools/testing/selftests/bpf/progs/verifier_leak_ptr.c +f:tools/testing/selftests/bpf/progs/verifier_linked_scalars.c +f:tools/testing/selftests/bpf/progs/verifier_load_acquire.c +f:tools/testing/selftests/bpf/progs/verifier_loops1.c +f:tools/testing/selftests/bpf/progs/verifier_lsm.c +f:tools/testing/selftests/bpf/progs/verifier_lwt.c +f:tools/testing/selftests/bpf/progs/verifier_map_in_map.c +f:tools/testing/selftests/bpf/progs/verifier_map_ptr.c +f:tools/testing/selftests/bpf/progs/verifier_map_ptr_mixing.c +f:tools/testing/selftests/bpf/progs/verifier_map_ret_val.c +f:tools/testing/selftests/bpf/progs/verifier_masking.c +f:tools/testing/selftests/bpf/progs/verifier_may_goto_1.c +f:tools/testing/selftests/bpf/progs/verifier_may_goto_2.c +f:tools/testing/selftests/bpf/progs/verifier_meta_access.c +f:tools/testing/selftests/bpf/progs/verifier_movsx.c +f:tools/testing/selftests/bpf/progs/verifier_mtu.c +f:tools/testing/selftests/bpf/progs/verifier_netfilter_ctx.c +f:tools/testing/selftests/bpf/progs/verifier_netfilter_retcode.c +f:tools/testing/selftests/bpf/progs/verifier_or_jmp32_k.c +f:tools/testing/selftests/bpf/progs/verifier_precision.c +f:tools/testing/selftests/bpf/progs/verifier_prevent_map_lookup.c +f:tools/testing/selftests/bpf/progs/verifier_private_stack.c +f:tools/testing/selftests/bpf/progs/verifier_raw_stack.c +f:tools/testing/selftests/bpf/progs/verifier_raw_tp_writable.c +f:tools/testing/selftests/bpf/progs/verifier_ref_tracking.c +f:tools/testing/selftests/bpf/progs/verifier_reg_equal.c +f:tools/testing/selftests/bpf/progs/verifier_regalloc.c +f:tools/testing/selftests/bpf/progs/verifier_ringbuf.c +f:tools/testing/selftests/bpf/progs/verifier_runtime_jit.c +f:tools/testing/selftests/bpf/progs/verifier_scalar_ids.c +f:tools/testing/selftests/bpf/progs/verifier_sdiv.c +f:tools/testing/selftests/bpf/progs/verifier_search_pruning.c +f:tools/testing/selftests/bpf/progs/verifier_sock.c +f:tools/testing/selftests/bpf/progs/verifier_sock_addr.c +f:tools/testing/selftests/bpf/progs/verifier_sockmap_mutate.c +f:tools/testing/selftests/bpf/progs/verifier_spill_fill.c +f:tools/testing/selftests/bpf/progs/verifier_spin_lock.c +f:tools/testing/selftests/bpf/progs/verifier_stack_ptr.c +f:tools/testing/selftests/bpf/progs/verifier_store_release.c +f:tools/testing/selftests/bpf/progs/verifier_subprog_precision.c +f:tools/testing/selftests/bpf/progs/verifier_subreg.c +f:tools/testing/selftests/bpf/progs/verifier_tailcall.c +f:tools/testing/selftests/bpf/progs/verifier_tailcall_jit.c +f:tools/testing/selftests/bpf/progs/verifier_typedef.c +f:tools/testing/selftests/bpf/progs/verifier_uninit.c +f:tools/testing/selftests/bpf/progs/verifier_unpriv.c +f:tools/testing/selftests/bpf/progs/verifier_unpriv_perf.c +f:tools/testing/selftests/bpf/progs/verifier_value.c +f:tools/testing/selftests/bpf/progs/verifier_value_adj_spill.c +f:tools/testing/selftests/bpf/progs/verifier_value_illegal_alu.c +f:tools/testing/selftests/bpf/progs/verifier_value_or_null.c +f:tools/testing/selftests/bpf/progs/verifier_value_ptr_arith.c +f:tools/testing/selftests/bpf/progs/verifier_var_off.c +f:tools/testing/selftests/bpf/progs/verifier_vfs_accept.c +f:tools/testing/selftests/bpf/progs/verifier_vfs_reject.c +f:tools/testing/selftests/bpf/progs/verifier_xadd.c +f:tools/testing/selftests/bpf/progs/verifier_xdp.c +f:tools/testing/selftests/bpf/progs/verifier_xdp_direct_packet_access.c +f:tools/testing/selftests/bpf/progs/vrf_socket_lookup.c +f:tools/testing/selftests/bpf/progs/wq.c +f:tools/testing/selftests/bpf/progs/wq_failures.c +f:tools/testing/selftests/bpf/progs/xdp_dummy.c +f:tools/testing/selftests/bpf/progs/xdp_features.c +f:tools/testing/selftests/bpf/progs/xdp_flowtable.c +f:tools/testing/selftests/bpf/progs/xdp_hw_metadata.c +f:tools/testing/selftests/bpf/progs/xdp_metadata.c +f:tools/testing/selftests/bpf/progs/xdp_metadata2.c +f:tools/testing/selftests/bpf/progs/xdp_redirect_map.c +f:tools/testing/selftests/bpf/progs/xdp_redirect_multi_kern.c +f:tools/testing/selftests/bpf/progs/xdp_synproxy_kern.c +f:tools/testing/selftests/bpf/progs/xdp_tx.c +f:tools/testing/selftests/bpf/progs/xdping_kern.c +f:tools/testing/selftests/bpf/progs/xdpwall.c +f:tools/testing/selftests/bpf/progs/xfrm_info.c +f:tools/testing/selftests/bpf/progs/xsk_xdp_progs.c +f:tools/testing/selftests/bpf/sdt-config.h +f:tools/testing/selftests/bpf/sdt.h +f:tools/testing/selftests/bpf/settings +f:tools/testing/selftests/bpf/task_local_storage_helpers.h +f:tools/testing/selftests/bpf/test_bpftool.py +f:tools/testing/selftests/bpf/test_bpftool.sh +f:tools/testing/selftests/bpf/test_bpftool_build.sh +f:tools/testing/selftests/bpf/test_bpftool_map.sh +f:tools/testing/selftests/bpf/test_bpftool_metadata.sh +f:tools/testing/selftests/bpf/test_bpftool_synctypes.py +f:tools/testing/selftests/bpf/test_btf.h +f:tools/testing/selftests/bpf/test_cpp.cpp +f:tools/testing/selftests/bpf/test_doc_build.sh +f:tools/testing/selftests/bpf/test_ftrace.sh +f:tools/testing/selftests/bpf/test_iptunnel_common.h +f:tools/testing/selftests/bpf/test_kmod.sh +f:tools/testing/selftests/bpf/test_kmods/.gitignore +f:tools/testing/selftests/bpf/test_kmods/Makefile +f:tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_x.c +f:tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_y.c +f:tools/testing/selftests/bpf/test_kmods/bpf_test_no_cfi.c +f:tools/testing/selftests/bpf/test_kmods/bpf_testmod-events.h +f:tools/testing/selftests/bpf/test_kmods/bpf_testmod.c +f:tools/testing/selftests/bpf/test_kmods/bpf_testmod.h +f:tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h +f:tools/testing/selftests/bpf/test_lirc_mode2.sh +f:tools/testing/selftests/bpf/test_lirc_mode2_user.c +f:tools/testing/selftests/bpf/test_loader.c +f:tools/testing/selftests/bpf/test_lru_map.c +f:tools/testing/selftests/bpf/test_maps.c +f:tools/testing/selftests/bpf/test_maps.h +f:tools/testing/selftests/bpf/test_progs.c +f:tools/testing/selftests/bpf/test_progs.h +f:tools/testing/selftests/bpf/test_select_reuseport_common.h +f:tools/testing/selftests/bpf/test_sockmap.c +f:tools/testing/selftests/bpf/test_tag.c +f:tools/testing/selftests/bpf/test_tc_edt.sh +f:tools/testing/selftests/bpf/test_tc_tunnel.sh +f:tools/testing/selftests/bpf/test_tcp_hdr_options.h +f:tools/testing/selftests/bpf/test_tcpbpf.h +f:tools/testing/selftests/bpf/test_tcpnotify.h +f:tools/testing/selftests/bpf/test_tcpnotify_user.c +f:tools/testing/selftests/bpf/test_verifier.c +f:tools/testing/selftests/bpf/test_xdp_features.sh +f:tools/testing/selftests/bpf/test_xdping.sh +f:tools/testing/selftests/bpf/test_xsk.sh +f:tools/testing/selftests/bpf/testing_helpers.c +f:tools/testing/selftests/bpf/testing_helpers.h +f:tools/testing/selftests/bpf/trace_helpers.c +f:tools/testing/selftests/bpf/trace_helpers.h +f:tools/testing/selftests/bpf/unpriv_helpers.c +f:tools/testing/selftests/bpf/unpriv_helpers.h +f:tools/testing/selftests/bpf/uprobe_multi.c +f:tools/testing/selftests/bpf/uprobe_multi.ld +f:tools/testing/selftests/bpf/uptr_test_common.h +f:tools/testing/selftests/bpf/urandom_read.c +f:tools/testing/selftests/bpf/urandom_read_aux.c +f:tools/testing/selftests/bpf/urandom_read_lib1.c +f:tools/testing/selftests/bpf/urandom_read_lib2.c +f:tools/testing/selftests/bpf/verifier/.gitignore +f:tools/testing/selftests/bpf/verifier/atomic_and.c +f:tools/testing/selftests/bpf/verifier/atomic_bounds.c +f:tools/testing/selftests/bpf/verifier/atomic_cmpxchg.c +f:tools/testing/selftests/bpf/verifier/atomic_fetch.c +f:tools/testing/selftests/bpf/verifier/atomic_fetch_add.c +f:tools/testing/selftests/bpf/verifier/atomic_invalid.c +f:tools/testing/selftests/bpf/verifier/atomic_or.c +f:tools/testing/selftests/bpf/verifier/atomic_xchg.c +f:tools/testing/selftests/bpf/verifier/atomic_xor.c +f:tools/testing/selftests/bpf/verifier/basic.c +f:tools/testing/selftests/bpf/verifier/basic_call.c +f:tools/testing/selftests/bpf/verifier/basic_instr.c +f:tools/testing/selftests/bpf/verifier/basic_stx_ldx.c +f:tools/testing/selftests/bpf/verifier/bpf_loop_inline.c +f:tools/testing/selftests/bpf/verifier/bpf_st_mem.c +f:tools/testing/selftests/bpf/verifier/calls.c +f:tools/testing/selftests/bpf/verifier/ctx_sk_lookup.c +f:tools/testing/selftests/bpf/verifier/ctx_skb.c +f:tools/testing/selftests/bpf/verifier/dead_code.c +f:tools/testing/selftests/bpf/verifier/direct_value_access.c +f:tools/testing/selftests/bpf/verifier/event_output.c +f:tools/testing/selftests/bpf/verifier/jit.c +f:tools/testing/selftests/bpf/verifier/jmp32.c +f:tools/testing/selftests/bpf/verifier/jset.c +f:tools/testing/selftests/bpf/verifier/jump.c +f:tools/testing/selftests/bpf/verifier/junk_insn.c +f:tools/testing/selftests/bpf/verifier/ld_abs.c +f:tools/testing/selftests/bpf/verifier/ld_dw.c +f:tools/testing/selftests/bpf/verifier/ld_imm64.c +f:tools/testing/selftests/bpf/verifier/map_kptr.c +f:tools/testing/selftests/bpf/verifier/perf_event_sample_period.c +f:tools/testing/selftests/bpf/verifier/precise.c +f:tools/testing/selftests/bpf/verifier/scale.c +f:tools/testing/selftests/bpf/verifier/sleepable.c +f:tools/testing/selftests/bpf/verifier/wide_access.c +f:tools/testing/selftests/bpf/verify_sig_setup.sh +f:tools/testing/selftests/bpf/veristat.c +f:tools/testing/selftests/bpf/veristat.cfg +f:tools/testing/selftests/bpf/vmtest.sh +f:tools/testing/selftests/bpf/xdp_features.c +f:tools/testing/selftests/bpf/xdp_features.h +f:tools/testing/selftests/bpf/xdp_hw_metadata.c +f:tools/testing/selftests/bpf/xdp_metadata.h +f:tools/testing/selftests/bpf/xdp_synproxy.c +f:tools/testing/selftests/bpf/xdping.c +f:tools/testing/selftests/bpf/xdping.h +f:tools/testing/selftests/bpf/xsk.c +f:tools/testing/selftests/bpf/xsk.h +f:tools/testing/selftests/bpf/xsk_prereqs.sh +f:tools/testing/selftests/bpf/xsk_xdp_common.h +f:tools/testing/selftests/bpf/xskxceiver.c +f:tools/testing/selftests/bpf/xskxceiver.h +f:tools/testing/selftests/breakpoints/.gitignore +f:tools/testing/selftests/breakpoints/Makefile +f:tools/testing/selftests/breakpoints/breakpoint_test.c +f:tools/testing/selftests/breakpoints/breakpoint_test_arm64.c +f:tools/testing/selftests/breakpoints/step_after_suspend_test.c +f:tools/testing/selftests/cachestat/.gitignore +f:tools/testing/selftests/cachestat/Makefile +f:tools/testing/selftests/cachestat/test_cachestat.c +f:tools/testing/selftests/capabilities/.gitignore +f:tools/testing/selftests/capabilities/Makefile +f:tools/testing/selftests/capabilities/test_execve.c +f:tools/testing/selftests/capabilities/validate_cap.c +f:tools/testing/selftests/cgroup/.gitignore +f:tools/testing/selftests/cgroup/Makefile +f:tools/testing/selftests/cgroup/config +f:tools/testing/selftests/cgroup/lib/cgroup_util.c +f:tools/testing/selftests/cgroup/lib/include/cgroup_util.h +f:tools/testing/selftests/cgroup/lib/libcgroup.mk +f:tools/testing/selftests/cgroup/memcg_protection.m +f:tools/testing/selftests/cgroup/test_core.c +f:tools/testing/selftests/cgroup/test_cpu.c +f:tools/testing/selftests/cgroup/test_cpuset.c +f:tools/testing/selftests/cgroup/test_cpuset_prs.sh +f:tools/testing/selftests/cgroup/test_cpuset_v1_base.sh +f:tools/testing/selftests/cgroup/test_cpuset_v1_hp.sh +f:tools/testing/selftests/cgroup/test_freezer.c +f:tools/testing/selftests/cgroup/test_hugetlb_memcg.c +f:tools/testing/selftests/cgroup/test_kill.c +f:tools/testing/selftests/cgroup/test_kmem.c +f:tools/testing/selftests/cgroup/test_memcontrol.c +f:tools/testing/selftests/cgroup/test_pids.c +f:tools/testing/selftests/cgroup/test_stress.sh +f:tools/testing/selftests/cgroup/test_zswap.c +f:tools/testing/selftests/cgroup/wait_inotify.c +f:tools/testing/selftests/cgroup/with_stress.sh +f:tools/testing/selftests/clone3/.gitignore +f:tools/testing/selftests/clone3/Makefile +f:tools/testing/selftests/clone3/clone3.c +f:tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c +f:tools/testing/selftests/clone3/clone3_clear_sighand.c +f:tools/testing/selftests/clone3/clone3_selftests.h +f:tools/testing/selftests/clone3/clone3_set_tid.c +f:tools/testing/selftests/connector/.gitignore +f:tools/testing/selftests/connector/Makefile +f:tools/testing/selftests/connector/proc_filter.c +f:tools/testing/selftests/core/.gitignore +f:tools/testing/selftests/core/Makefile +f:tools/testing/selftests/core/close_range_test.c +f:tools/testing/selftests/core/unshare_test.c +f:tools/testing/selftests/coredump/Makefile +f:tools/testing/selftests/coredump/README.rst +f:tools/testing/selftests/coredump/config +f:tools/testing/selftests/coredump/stackdump +f:tools/testing/selftests/coredump/stackdump_test.c +f:tools/testing/selftests/cpu-hotplug/Makefile +f:tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh +f:tools/testing/selftests/cpufreq/.gitignore +f:tools/testing/selftests/cpufreq/Makefile +f:tools/testing/selftests/cpufreq/config +f:tools/testing/selftests/cpufreq/cpu.sh +f:tools/testing/selftests/cpufreq/cpufreq.sh +f:tools/testing/selftests/cpufreq/governor.sh +f:tools/testing/selftests/cpufreq/main.sh +f:tools/testing/selftests/cpufreq/module.sh +f:tools/testing/selftests/cpufreq/special-tests.sh +f:tools/testing/selftests/damon/.gitignore +f:tools/testing/selftests/damon/Makefile +f:tools/testing/selftests/damon/_common.sh +f:tools/testing/selftests/damon/_damon_sysfs.py +f:tools/testing/selftests/damon/access_memory.c +f:tools/testing/selftests/damon/access_memory_even.c +f:tools/testing/selftests/damon/config +f:tools/testing/selftests/damon/damon_nr_regions.py +f:tools/testing/selftests/damon/damos_apply_interval.py +f:tools/testing/selftests/damon/damos_quota.py +f:tools/testing/selftests/damon/damos_quota_goal.py +f:tools/testing/selftests/damon/damos_tried_regions.py +f:tools/testing/selftests/damon/drgn_dump_damon_status.py +f:tools/testing/selftests/damon/lru_sort.sh +f:tools/testing/selftests/damon/reclaim.sh +f:tools/testing/selftests/damon/sysfs.py +f:tools/testing/selftests/damon/sysfs.sh +f:tools/testing/selftests/damon/sysfs_memcg_path_leak.sh +f:tools/testing/selftests/damon/sysfs_update_removed_scheme_dir.sh +f:tools/testing/selftests/damon/sysfs_update_schemes_tried_regions_hang.py +f:tools/testing/selftests/damon/sysfs_update_schemes_tried_regions_wss_estimation.py +f:tools/testing/selftests/devices/error_logs/Makefile +f:tools/testing/selftests/devices/error_logs/test_device_error_logs.py +f:tools/testing/selftests/devices/probe/Makefile +f:tools/testing/selftests/devices/probe/boards/Dell Inc.,XPS 13 9300.yaml +f:tools/testing/selftests/devices/probe/boards/google,spherion.yaml +f:tools/testing/selftests/devices/probe/test_discoverable_devices.py +f:tools/testing/selftests/dma/Makefile +f:tools/testing/selftests/dma/config +f:tools/testing/selftests/dma/dma_map_benchmark.c +f:tools/testing/selftests/dmabuf-heaps/.gitignore +f:tools/testing/selftests/dmabuf-heaps/Makefile +f:tools/testing/selftests/dmabuf-heaps/config +f:tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c +f:tools/testing/selftests/drivers/.gitignore +f:tools/testing/selftests/drivers/dma-buf/Makefile +f:tools/testing/selftests/drivers/dma-buf/config +f:tools/testing/selftests/drivers/dma-buf/udmabuf.c +f:tools/testing/selftests/drivers/gpu/drm_mm.sh +f:tools/testing/selftests/drivers/gpu/i915.sh +f:tools/testing/selftests/drivers/net/.gitignore +f:tools/testing/selftests/drivers/net/Makefile +f:tools/testing/selftests/drivers/net/README.rst +f:tools/testing/selftests/drivers/net/bonding/Makefile +f:tools/testing/selftests/drivers/net/bonding/bond-arp-interval-causes-panic.sh +f:tools/testing/selftests/drivers/net/bonding/bond-break-lacpdu-tx.sh +f:tools/testing/selftests/drivers/net/bonding/bond-eth-type-change.sh +f:tools/testing/selftests/drivers/net/bonding/bond-lladdr-target.sh +f:tools/testing/selftests/drivers/net/bonding/bond_macvlan_ipvlan.sh +f:tools/testing/selftests/drivers/net/bonding/bond_options.sh +f:tools/testing/selftests/drivers/net/bonding/bond_topo_2d1c.sh +f:tools/testing/selftests/drivers/net/bonding/bond_topo_3d1c.sh +f:tools/testing/selftests/drivers/net/bonding/config +f:tools/testing/selftests/drivers/net/bonding/dev_addr_lists.sh +f:tools/testing/selftests/drivers/net/bonding/lag_lib.sh +f:tools/testing/selftests/drivers/net/bonding/mode-1-recovery-updelay.sh +f:tools/testing/selftests/drivers/net/bonding/mode-2-recovery-updelay.sh +f:tools/testing/selftests/drivers/net/bonding/settings +f:tools/testing/selftests/drivers/net/config +f:tools/testing/selftests/drivers/net/dsa/Makefile +f:tools/testing/selftests/drivers/net/dsa/forwarding.config +f:tools/testing/selftests/drivers/net/dsa/run_net_forwarding_test.sh +f:tools/testing/selftests/drivers/net/dsa/test_bridge_fdb_stress.sh +f:tools/testing/selftests/drivers/net/hds.py +f:tools/testing/selftests/drivers/net/hw/.gitignore +f:tools/testing/selftests/drivers/net/hw/Makefile +f:tools/testing/selftests/drivers/net/hw/config +f:tools/testing/selftests/drivers/net/hw/csum.py +f:tools/testing/selftests/drivers/net/hw/devlink_port_split.py +f:tools/testing/selftests/drivers/net/hw/devlink_rate_tc_bw.py +f:tools/testing/selftests/drivers/net/hw/devmem.py +f:tools/testing/selftests/drivers/net/hw/ethtool.sh +f:tools/testing/selftests/drivers/net/hw/ethtool_extended_state.sh +f:tools/testing/selftests/drivers/net/hw/ethtool_lib.sh +f:tools/testing/selftests/drivers/net/hw/ethtool_mm.sh +f:tools/testing/selftests/drivers/net/hw/ethtool_rmon.sh +f:tools/testing/selftests/drivers/net/hw/hw_stats_l3.sh +f:tools/testing/selftests/drivers/net/hw/hw_stats_l3_gre.sh +f:tools/testing/selftests/drivers/net/hw/iou-zcrx.c +f:tools/testing/selftests/drivers/net/hw/iou-zcrx.py +f:tools/testing/selftests/drivers/net/hw/irq.py +f:tools/testing/selftests/drivers/net/hw/lib/py/__init__.py +f:tools/testing/selftests/drivers/net/hw/loopback.sh +f:tools/testing/selftests/drivers/net/hw/ncdevmem.c +f:tools/testing/selftests/drivers/net/hw/pp_alloc_fail.py +f:tools/testing/selftests/drivers/net/hw/rss_api.py +f:tools/testing/selftests/drivers/net/hw/rss_ctx.py +f:tools/testing/selftests/drivers/net/hw/rss_input_xfrm.py +f:tools/testing/selftests/drivers/net/hw/settings +f:tools/testing/selftests/drivers/net/hw/tso.py +f:tools/testing/selftests/drivers/net/hw/xsk_reconfig.py +f:tools/testing/selftests/drivers/net/lib/py/__init__.py +f:tools/testing/selftests/drivers/net/lib/py/env.py +f:tools/testing/selftests/drivers/net/lib/py/load.py +f:tools/testing/selftests/drivers/net/lib/py/remote.py +f:tools/testing/selftests/drivers/net/lib/py/remote_netns.py +f:tools/testing/selftests/drivers/net/lib/py/remote_ssh.py +f:tools/testing/selftests/drivers/net/lib/sh/lib_netcons.sh +f:tools/testing/selftests/drivers/net/microchip/ksz9477_qos.sh +f:tools/testing/selftests/drivers/net/mlxsw/blackhole_routes.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_linecard.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_acl_drops.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_control.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_l2_drops.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_l3_drops.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_l3_exceptions.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_policer.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_tunnel_ipip.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_tunnel_ipip6.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_tunnel_vxlan.sh +f:tools/testing/selftests/drivers/net/mlxsw/devlink_trap_tunnel_vxlan_ipv6.sh +f:tools/testing/selftests/drivers/net/mlxsw/egress_vid_classification.sh +f:tools/testing/selftests/drivers/net/mlxsw/ethtool_lanes.sh +f:tools/testing/selftests/drivers/net/mlxsw/extack.sh +f:tools/testing/selftests/drivers/net/mlxsw/fib.sh +f:tools/testing/selftests/drivers/net/mlxsw/fib_offload.sh +f:tools/testing/selftests/drivers/net/mlxsw/hw_stats_l3.sh +f:tools/testing/selftests/drivers/net/mlxsw/ingress_rif_conf_1d.sh +f:tools/testing/selftests/drivers/net/mlxsw/ingress_rif_conf_1q.sh +f:tools/testing/selftests/drivers/net/mlxsw/ingress_rif_conf_vxlan.sh +f:tools/testing/selftests/drivers/net/mlxsw/mirror_gre.sh +f:tools/testing/selftests/drivers/net/mlxsw/mirror_gre_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/mlxsw_lib.sh +f:tools/testing/selftests/drivers/net/mlxsw/one_armed_router.sh +f:tools/testing/selftests/drivers/net/mlxsw/pci_reset.sh +f:tools/testing/selftests/drivers/net/mlxsw/port_range_occ.sh +f:tools/testing/selftests/drivers/net/mlxsw/port_range_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/port_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/q_in_q_veto.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_defprio.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_dscp_bridge.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_dscp_router.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_ets_strict.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_headroom.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_lib.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_max_descriptors.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_mc_aware.sh +f:tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh +f:tools/testing/selftests/drivers/net/mlxsw/rif_bridge.sh +f:tools/testing/selftests/drivers/net/mlxsw/rif_counter_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/rif_lag.sh +f:tools/testing/selftests/drivers/net/mlxsw/rif_lag_vlan.sh +f:tools/testing/selftests/drivers/net/mlxsw/rif_mac_profile_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/rif_mac_profiles.sh +f:tools/testing/selftests/drivers/net/mlxsw/rif_mac_profiles_occ.sh +f:tools/testing/selftests/drivers/net/mlxsw/router_bridge_lag.sh +f:tools/testing/selftests/drivers/net/mlxsw/router_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/rtnetlink.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_ets.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_offload.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_red_core.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_red_ets.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_red_prio.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_red_root.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_tbf_ets.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_tbf_prio.sh +f:tools/testing/selftests/drivers/net/mlxsw/sch_tbf_root.sh +f:tools/testing/selftests/drivers/net/mlxsw/sharedbuffer.sh +f:tools/testing/selftests/drivers/net/mlxsw/sharedbuffer_configuration.py +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/mirror_gre_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/port_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/resource_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/rif_mac_profile_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/router_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_police_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum-2/vxlan_flooding_ipv6.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/devlink_lib_spectrum.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/devlink_resources.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/mirror_gre_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/port_range_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/port_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/q_in_vni_veto.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/resource_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/rif_counter_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/rif_mac_profile_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/router_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/tc_flower_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/tc_police_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/spectrum/vxlan_flooding_ipv6.sh +f:tools/testing/selftests/drivers/net/mlxsw/tc_action_hw_stats.sh +f:tools/testing/selftests/drivers/net/mlxsw/tc_flower_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/tc_police_occ.sh +f:tools/testing/selftests/drivers/net/mlxsw/tc_police_scale.sh +f:tools/testing/selftests/drivers/net/mlxsw/tc_restrictions.sh +f:tools/testing/selftests/drivers/net/mlxsw/tc_sample.sh +f:tools/testing/selftests/drivers/net/mlxsw/vxlan.sh +f:tools/testing/selftests/drivers/net/mlxsw/vxlan_fdb_veto.sh +f:tools/testing/selftests/drivers/net/mlxsw/vxlan_fdb_veto_ipv6.sh +f:tools/testing/selftests/drivers/net/mlxsw/vxlan_flooding.sh +f:tools/testing/selftests/drivers/net/mlxsw/vxlan_ipv6.sh +f:tools/testing/selftests/drivers/net/napi_id.py +f:tools/testing/selftests/drivers/net/napi_id_helper.c +f:tools/testing/selftests/drivers/net/netcons_basic.sh +f:tools/testing/selftests/drivers/net/netcons_cmdline.sh +f:tools/testing/selftests/drivers/net/netcons_fragmented_msg.sh +f:tools/testing/selftests/drivers/net/netcons_overflow.sh +f:tools/testing/selftests/drivers/net/netcons_sysdata.sh +f:tools/testing/selftests/drivers/net/netdevsim/Makefile +f:tools/testing/selftests/drivers/net/netdevsim/config +f:tools/testing/selftests/drivers/net/netdevsim/devlink.sh +f:tools/testing/selftests/drivers/net/netdevsim/devlink_in_netns.sh +f:tools/testing/selftests/drivers/net/netdevsim/devlink_trap.sh +f:tools/testing/selftests/drivers/net/netdevsim/ethtool-coalesce.sh +f:tools/testing/selftests/drivers/net/netdevsim/ethtool-common.sh +f:tools/testing/selftests/drivers/net/netdevsim/ethtool-features.sh +f:tools/testing/selftests/drivers/net/netdevsim/ethtool-fec.sh +f:tools/testing/selftests/drivers/net/netdevsim/ethtool-pause.sh +f:tools/testing/selftests/drivers/net/netdevsim/ethtool-ring.sh +f:tools/testing/selftests/drivers/net/netdevsim/fib.sh +f:tools/testing/selftests/drivers/net/netdevsim/fib_notifications.sh +f:tools/testing/selftests/drivers/net/netdevsim/hw_stats_l3.sh +f:tools/testing/selftests/drivers/net/netdevsim/macsec-offload.sh +f:tools/testing/selftests/drivers/net/netdevsim/nexthop.sh +f:tools/testing/selftests/drivers/net/netdevsim/peer.sh +f:tools/testing/selftests/drivers/net/netdevsim/psample.sh +f:tools/testing/selftests/drivers/net/netdevsim/settings +f:tools/testing/selftests/drivers/net/netdevsim/tc-mq-visibility.sh +f:tools/testing/selftests/drivers/net/netdevsim/udp_tunnel_nic.sh +f:tools/testing/selftests/drivers/net/netpoll_basic.py +f:tools/testing/selftests/drivers/net/ocelot/basic_qos.sh +f:tools/testing/selftests/drivers/net/ocelot/psfp.sh +f:tools/testing/selftests/drivers/net/ocelot/tc_flower_chains.sh +f:tools/testing/selftests/drivers/net/ping.py +f:tools/testing/selftests/drivers/net/queues.py +f:tools/testing/selftests/drivers/net/shaper.py +f:tools/testing/selftests/drivers/net/stats.py +f:tools/testing/selftests/drivers/net/team/Makefile +f:tools/testing/selftests/drivers/net/team/config +f:tools/testing/selftests/drivers/net/team/dev_addr_lists.sh +f:tools/testing/selftests/drivers/net/team/propagation.sh +f:tools/testing/selftests/drivers/net/virtio_net/Makefile +f:tools/testing/selftests/drivers/net/virtio_net/basic_features.sh +f:tools/testing/selftests/drivers/net/virtio_net/config +f:tools/testing/selftests/drivers/net/virtio_net/virtio_net_common.sh +f:tools/testing/selftests/drivers/net/xdp.py +f:tools/testing/selftests/drivers/ntsync/.gitignore +f:tools/testing/selftests/drivers/ntsync/Makefile +f:tools/testing/selftests/drivers/ntsync/config +f:tools/testing/selftests/drivers/ntsync/ntsync.c +f:tools/testing/selftests/drivers/platform/x86/intel/ifs/Makefile +f:tools/testing/selftests/drivers/platform/x86/intel/ifs/test_ifs.sh +f:tools/testing/selftests/drivers/s390x/uvdevice/Makefile +f:tools/testing/selftests/drivers/s390x/uvdevice/config +f:tools/testing/selftests/drivers/s390x/uvdevice/test_uvdevice.c +f:tools/testing/selftests/drivers/sdsi/sdsi.sh +f:tools/testing/selftests/drivers/sdsi/sdsi_test.py +f:tools/testing/selftests/drivers/usb/usbip/usbip_test.sh +f:tools/testing/selftests/dt/.gitignore +f:tools/testing/selftests/dt/Makefile +f:tools/testing/selftests/dt/compatible_ignore_list +f:tools/testing/selftests/dt/test_unprobed_devices.sh +f:tools/testing/selftests/efivarfs/.gitignore +f:tools/testing/selftests/efivarfs/Makefile +f:tools/testing/selftests/efivarfs/config +f:tools/testing/selftests/efivarfs/create-read.c +f:tools/testing/selftests/efivarfs/efivarfs.sh +f:tools/testing/selftests/efivarfs/open-unlink.c +f:tools/testing/selftests/exec/.gitignore +f:tools/testing/selftests/exec/Makefile +f:tools/testing/selftests/exec/binfmt_script.py +f:tools/testing/selftests/exec/check-exec-tests.sh +f:tools/testing/selftests/exec/check-exec.c +f:tools/testing/selftests/exec/config +f:tools/testing/selftests/exec/execveat.c +f:tools/testing/selftests/exec/false.c +f:tools/testing/selftests/exec/load_address.c +f:tools/testing/selftests/exec/non-regular.c +f:tools/testing/selftests/exec/null-argv.c +f:tools/testing/selftests/exec/recursion-depth.c +f:tools/testing/selftests/fchmodat2/.gitignore +f:tools/testing/selftests/fchmodat2/Makefile +f:tools/testing/selftests/fchmodat2/fchmodat2_test.c +f:tools/testing/selftests/filelock/Makefile +f:tools/testing/selftests/filelock/ofdlocks.c +f:tools/testing/selftests/filesystems/.gitignore +f:tools/testing/selftests/filesystems/Makefile +f:tools/testing/selftests/filesystems/anon_inode_test.c +f:tools/testing/selftests/filesystems/binderfs/.gitignore +f:tools/testing/selftests/filesystems/binderfs/Makefile +f:tools/testing/selftests/filesystems/binderfs/binderfs_test.c +f:tools/testing/selftests/filesystems/binderfs/config +f:tools/testing/selftests/filesystems/devpts_pts.c +f:tools/testing/selftests/filesystems/dnotify_test.c +f:tools/testing/selftests/filesystems/epoll/.gitignore +f:tools/testing/selftests/filesystems/epoll/Makefile +f:tools/testing/selftests/filesystems/epoll/epoll_wakeup_test.c +f:tools/testing/selftests/filesystems/eventfd/.gitignore +f:tools/testing/selftests/filesystems/eventfd/Makefile +f:tools/testing/selftests/filesystems/eventfd/eventfd_test.c +f:tools/testing/selftests/filesystems/fat/.gitignore +f:tools/testing/selftests/filesystems/fat/Makefile +f:tools/testing/selftests/filesystems/fat/config +f:tools/testing/selftests/filesystems/fat/rename_exchange.c +f:tools/testing/selftests/filesystems/fat/run_fat_tests.sh +f:tools/testing/selftests/filesystems/file_stressor.c +f:tools/testing/selftests/filesystems/kernfs_test.c +f:tools/testing/selftests/filesystems/mount-notify/.gitignore +f:tools/testing/selftests/filesystems/mount-notify/Makefile +f:tools/testing/selftests/filesystems/mount-notify/mount-notify_test.c +f:tools/testing/selftests/filesystems/mount-notify/mount-notify_test_ns.c +f:tools/testing/selftests/filesystems/nsfs/.gitignore +f:tools/testing/selftests/filesystems/nsfs/Makefile +f:tools/testing/selftests/filesystems/nsfs/config +f:tools/testing/selftests/filesystems/nsfs/iterate_mntns.c +f:tools/testing/selftests/filesystems/nsfs/owner.c +f:tools/testing/selftests/filesystems/nsfs/pidns.c +f:tools/testing/selftests/filesystems/overlayfs/.gitignore +f:tools/testing/selftests/filesystems/overlayfs/Makefile +f:tools/testing/selftests/filesystems/overlayfs/dev_in_maps.c +f:tools/testing/selftests/filesystems/overlayfs/log.h +f:tools/testing/selftests/filesystems/overlayfs/set_layers_via_fds.c +f:tools/testing/selftests/filesystems/statmount/.gitignore +f:tools/testing/selftests/filesystems/statmount/Makefile +f:tools/testing/selftests/filesystems/statmount/listmount_test.c +f:tools/testing/selftests/filesystems/statmount/statmount.h +f:tools/testing/selftests/filesystems/statmount/statmount_test.c +f:tools/testing/selftests/filesystems/statmount/statmount_test_ns.c +f:tools/testing/selftests/filesystems/utils.c +f:tools/testing/selftests/filesystems/utils.h +f:tools/testing/selftests/filesystems/wrappers.h +f:tools/testing/selftests/firmware/.gitignore +f:tools/testing/selftests/firmware/Makefile +f:tools/testing/selftests/firmware/config +f:tools/testing/selftests/firmware/fw_fallback.sh +f:tools/testing/selftests/firmware/fw_filesystem.sh +f:tools/testing/selftests/firmware/fw_lib.sh +f:tools/testing/selftests/firmware/fw_namespace.c +f:tools/testing/selftests/firmware/fw_run_tests.sh +f:tools/testing/selftests/firmware/fw_upload.sh +f:tools/testing/selftests/firmware/settings +f:tools/testing/selftests/fpu/.gitignore +f:tools/testing/selftests/fpu/Makefile +f:tools/testing/selftests/fpu/run_test_fpu.sh +f:tools/testing/selftests/fpu/test_fpu.c +f:tools/testing/selftests/ftrace/.gitignore +f:tools/testing/selftests/ftrace/Makefile +f:tools/testing/selftests/ftrace/README +f:tools/testing/selftests/ftrace/config +f:tools/testing/selftests/ftrace/ftracetest +f:tools/testing/selftests/ftrace/ftracetest-ktap +f:tools/testing/selftests/ftrace/poll.c +f:tools/testing/selftests/ftrace/samples/fail.tc +f:tools/testing/selftests/ftrace/samples/pass.tc +f:tools/testing/selftests/ftrace/samples/unresolved.tc +f:tools/testing/selftests/ftrace/samples/unsupported.tc +f:tools/testing/selftests/ftrace/samples/untested.tc +f:tools/testing/selftests/ftrace/samples/xfail.tc +f:tools/testing/selftests/ftrace/settings +f:tools/testing/selftests/ftrace/test.d/00basic/basic1.tc +f:tools/testing/selftests/ftrace/test.d/00basic/basic2.tc +f:tools/testing/selftests/ftrace/test.d/00basic/basic3.tc +f:tools/testing/selftests/ftrace/test.d/00basic/basic4.tc +f:tools/testing/selftests/ftrace/test.d/00basic/mount_options.tc +f:tools/testing/selftests/ftrace/test.d/00basic/ringbuffer_size.tc +f:tools/testing/selftests/ftrace/test.d/00basic/ringbuffer_subbuf_size.tc +f:tools/testing/selftests/ftrace/test.d/00basic/snapshot.tc +f:tools/testing/selftests/ftrace/test.d/00basic/snapshot1.tc +f:tools/testing/selftests/ftrace/test.d/00basic/test_ownership.tc +f:tools/testing/selftests/ftrace/test.d/00basic/trace_marker.tc +f:tools/testing/selftests/ftrace/test.d/00basic/trace_pipe.tc +f:tools/testing/selftests/ftrace/test.d/direct/ftrace-direct.tc +f:tools/testing/selftests/ftrace/test.d/direct/kprobe-direct.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_btfarg.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_eprobe.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_fprobe.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_fprobe_repeat.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_kprobe.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_synth.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_tprobe.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_tprobe_module.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/add_remove_uprobe.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/clear_select_events.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/dynevent_limitations.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/eprobes_syntax_errors.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/fprobe_args_vfs.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/fprobe_entry_arg.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/fprobe_syntax_errors.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/generic_clear_event.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/test_duplicates.tc +f:tools/testing/selftests/ftrace/test.d/dynevent/tprobe_syntax_errors.tc +f:tools/testing/selftests/ftrace/test.d/event/event-enable.tc +f:tools/testing/selftests/ftrace/test.d/event/event-mod.tc +f:tools/testing/selftests/ftrace/test.d/event/event-no-pid.tc +f:tools/testing/selftests/ftrace/test.d/event/event-pid.tc +f:tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc +f:tools/testing/selftests/ftrace/test.d/event/toplevel-enable.tc +f:tools/testing/selftests/ftrace/test.d/event/trace_printk.tc +f:tools/testing/selftests/ftrace/test.d/filter/event-filter-function.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter-stack.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/fgraph-multi-filter.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/fgraph-multi.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/fgraph-profiler.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/fgraph-retval.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func-filter-glob.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func-filter-notrace-pid.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func-filter-pid.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func-filter-stacktrace.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_cpumask.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_event_triggers.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_hotplug.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_mod_trace.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_profile_stat.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_profiler.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_set_ftrace_file.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_stack_tracer.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/func_traceonoff_triggers.tc +f:tools/testing/selftests/ftrace/test.d/ftrace/tracing-error-log.tc +f:tools/testing/selftests/ftrace/test.d/functions +f:tools/testing/selftests/ftrace/test.d/instances/instance-event.tc +f:tools/testing/selftests/ftrace/test.d/instances/instance.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_char.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_comm.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_string.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_symbol.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_syntax.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_type.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_user.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_vfs.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_eventname.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_ftrace.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_insn_boundary.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_module.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_multiprobe.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_non_uniq_symbol.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_opt_types.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kprobe_syntax_errors.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_args.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_entry_arg.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_maxactive.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_return_suffix.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/probepoint.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/profile.tc +f:tools/testing/selftests/ftrace/test.d/kprobe/uprobe_syntax_errors.tc +f:tools/testing/selftests/ftrace/test.d/preemptirq/irqsoff_tracer.tc +f:tools/testing/selftests/ftrace/test.d/selftest/bashisms.tc +f:tools/testing/selftests/ftrace/test.d/template +f:tools/testing/selftests/ftrace/test.d/tracer/wakeup.tc +f:tools/testing/selftests/ftrace/test.d/tracer/wakeup_rt.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-action-hist-xfail.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-field-variable-support.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-multi-actions-accept.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onchange-action-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmatch-action-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmatch-onmax-action-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmax-action-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-snapshot-action-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-eprobe.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-createremove.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-dynstring.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-stack-legacy.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-stack.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-syntax.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc +f:tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-trace-action-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-eventonoff.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-filter.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-expressions.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-mod.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-poll.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-syntax-errors.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-multihist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-snapshot.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-stacktrace.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-trace-marker-hist.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-trace-marker-snapshot.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-trace-marker-synthetic-kernel.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-trace-marker-synthetic.tc +f:tools/testing/selftests/ftrace/test.d/trigger/trigger-traceonoff.tc +f:tools/testing/selftests/futex/Makefile +f:tools/testing/selftests/futex/README +f:tools/testing/selftests/futex/functional/.gitignore +f:tools/testing/selftests/futex/functional/Makefile +f:tools/testing/selftests/futex/functional/futex_numa.c +f:tools/testing/selftests/futex/functional/futex_numa_mpol.c +f:tools/testing/selftests/futex/functional/futex_priv_hash.c +f:tools/testing/selftests/futex/functional/futex_requeue.c +f:tools/testing/selftests/futex/functional/futex_requeue_pi.c +f:tools/testing/selftests/futex/functional/futex_requeue_pi_mismatched_ops.c +f:tools/testing/selftests/futex/functional/futex_requeue_pi_signal_restart.c +f:tools/testing/selftests/futex/functional/futex_wait.c +f:tools/testing/selftests/futex/functional/futex_wait_private_mapped_file.c +f:tools/testing/selftests/futex/functional/futex_wait_timeout.c +f:tools/testing/selftests/futex/functional/futex_wait_uninitialized_heap.c +f:tools/testing/selftests/futex/functional/futex_wait_wouldblock.c +f:tools/testing/selftests/futex/functional/futex_waitv.c +f:tools/testing/selftests/futex/functional/run.sh +f:tools/testing/selftests/futex/include/atomic.h +f:tools/testing/selftests/futex/include/futex2test.h +f:tools/testing/selftests/futex/include/futextest.h +f:tools/testing/selftests/futex/include/logging.h +f:tools/testing/selftests/futex/run.sh +f:tools/testing/selftests/gen_kselftest_tar.sh +f:tools/testing/selftests/gpio/.gitignore +f:tools/testing/selftests/gpio/Makefile +f:tools/testing/selftests/gpio/config +f:tools/testing/selftests/gpio/gpio-aggregator.sh +f:tools/testing/selftests/gpio/gpio-chip-info.c +f:tools/testing/selftests/gpio/gpio-line-name.c +f:tools/testing/selftests/gpio/gpio-mockup-cdev.c +f:tools/testing/selftests/gpio/gpio-mockup-sysfs.sh +f:tools/testing/selftests/gpio/gpio-mockup.sh +f:tools/testing/selftests/gpio/gpio-sim.sh +f:tools/testing/selftests/hid/.gitignore +f:tools/testing/selftests/hid/Makefile +f:tools/testing/selftests/hid/config +f:tools/testing/selftests/hid/config.common +f:tools/testing/selftests/hid/config.x86_64 +f:tools/testing/selftests/hid/hid-apple.sh +f:tools/testing/selftests/hid/hid-core.sh +f:tools/testing/selftests/hid/hid-gamepad.sh +f:tools/testing/selftests/hid/hid-ite.sh +f:tools/testing/selftests/hid/hid-keyboard.sh +f:tools/testing/selftests/hid/hid-mouse.sh +f:tools/testing/selftests/hid/hid-multitouch.sh +f:tools/testing/selftests/hid/hid-sony.sh +f:tools/testing/selftests/hid/hid-tablet.sh +f:tools/testing/selftests/hid/hid-usb_crash.sh +f:tools/testing/selftests/hid/hid-wacom.sh +f:tools/testing/selftests/hid/hid_bpf.c +f:tools/testing/selftests/hid/hid_common.h +f:tools/testing/selftests/hid/hidraw.c +f:tools/testing/selftests/hid/progs/hid.c +f:tools/testing/selftests/hid/progs/hid_bpf_helpers.h +f:tools/testing/selftests/hid/run-hid-tools-tests.sh +f:tools/testing/selftests/hid/settings +f:tools/testing/selftests/hid/tests/__init__.py +f:tools/testing/selftests/hid/tests/base.py +f:tools/testing/selftests/hid/tests/base_device.py +f:tools/testing/selftests/hid/tests/base_gamepad.py +f:tools/testing/selftests/hid/tests/conftest.py +f:tools/testing/selftests/hid/tests/descriptors_wacom.py +f:tools/testing/selftests/hid/tests/test_apple_keyboard.py +f:tools/testing/selftests/hid/tests/test_gamepad.py +f:tools/testing/selftests/hid/tests/test_hid_core.py +f:tools/testing/selftests/hid/tests/test_ite_keyboard.py +f:tools/testing/selftests/hid/tests/test_keyboard.py +f:tools/testing/selftests/hid/tests/test_mouse.py +f:tools/testing/selftests/hid/tests/test_multitouch.py +f:tools/testing/selftests/hid/tests/test_sony.py +f:tools/testing/selftests/hid/tests/test_tablet.py +f:tools/testing/selftests/hid/tests/test_usb_crash.py +f:tools/testing/selftests/hid/tests/test_wacom_generic.py +f:tools/testing/selftests/hid/vmtest.sh +f:tools/testing/selftests/ia64/.gitignore +f:tools/testing/selftests/ia64/Makefile +f:tools/testing/selftests/ia64/aliasing-test.c +f:tools/testing/selftests/intel_pstate/.gitignore +f:tools/testing/selftests/intel_pstate/Makefile +f:tools/testing/selftests/intel_pstate/aperf.c +f:tools/testing/selftests/intel_pstate/msr.c +f:tools/testing/selftests/intel_pstate/run.sh +f:tools/testing/selftests/iommu/.gitignore +f:tools/testing/selftests/iommu/Makefile +f:tools/testing/selftests/iommu/config +f:tools/testing/selftests/iommu/iommufd.c +f:tools/testing/selftests/iommu/iommufd_fail_nth.c +f:tools/testing/selftests/iommu/iommufd_utils.h +f:tools/testing/selftests/ipc/.gitignore +f:tools/testing/selftests/ipc/Makefile +f:tools/testing/selftests/ipc/config +f:tools/testing/selftests/ipc/msgque.c +f:tools/testing/selftests/ir/.gitignore +f:tools/testing/selftests/ir/Makefile +f:tools/testing/selftests/ir/ir_loopback.c +f:tools/testing/selftests/ir/ir_loopback.sh +f:tools/testing/selftests/kcmp/.gitignore +f:tools/testing/selftests/kcmp/Makefile +f:tools/testing/selftests/kcmp/kcmp_test.c +f:tools/testing/selftests/kexec/Makefile +f:tools/testing/selftests/kexec/config +f:tools/testing/selftests/kexec/kexec_common_lib.sh +f:tools/testing/selftests/kexec/test_kexec_file_load.sh +f:tools/testing/selftests/kexec/test_kexec_jump.c +f:tools/testing/selftests/kexec/test_kexec_jump.sh +f:tools/testing/selftests/kexec/test_kexec_load.sh +f:tools/testing/selftests/kmod/Makefile +f:tools/testing/selftests/kmod/config +f:tools/testing/selftests/kmod/kmod.sh +f:tools/testing/selftests/kselftest.h +f:tools/testing/selftests/kselftest/ksft.py +f:tools/testing/selftests/kselftest/ktap_helpers.sh +f:tools/testing/selftests/kselftest/module.sh +f:tools/testing/selftests/kselftest/prefix.pl +f:tools/testing/selftests/kselftest/runner.sh +f:tools/testing/selftests/kselftest_deps.sh +f:tools/testing/selftests/kselftest_harness.h +f:tools/testing/selftests/kselftest_harness/.gitignore +f:tools/testing/selftests/kselftest_harness/Makefile +f:tools/testing/selftests/kselftest_harness/harness-selftest.c +f:tools/testing/selftests/kselftest_harness/harness-selftest.expected +f:tools/testing/selftests/kselftest_harness/harness-selftest.sh +f:tools/testing/selftests/kselftest_install.sh +f:tools/testing/selftests/kselftest_module.h +f:tools/testing/selftests/kvm/.gitignore +f:tools/testing/selftests/kvm/Makefile +f:tools/testing/selftests/kvm/Makefile.kvm +f:tools/testing/selftests/kvm/access_tracking_perf_test.c +f:tools/testing/selftests/kvm/arch_timer.c +f:tools/testing/selftests/kvm/arm64/aarch32_id_regs.c +f:tools/testing/selftests/kvm/arm64/arch_timer.c +f:tools/testing/selftests/kvm/arm64/arch_timer_edge_cases.c +f:tools/testing/selftests/kvm/arm64/debug-exceptions.c +f:tools/testing/selftests/kvm/arm64/external_aborts.c +f:tools/testing/selftests/kvm/arm64/get-reg-list.c +f:tools/testing/selftests/kvm/arm64/host_sve.c +f:tools/testing/selftests/kvm/arm64/hypercalls.c +f:tools/testing/selftests/kvm/arm64/no-vgic-v3.c +f:tools/testing/selftests/kvm/arm64/page_fault_test.c +f:tools/testing/selftests/kvm/arm64/psci_test.c +f:tools/testing/selftests/kvm/arm64/set_id_regs.c +f:tools/testing/selftests/kvm/arm64/smccc_filter.c +f:tools/testing/selftests/kvm/arm64/vcpu_width_config.c +f:tools/testing/selftests/kvm/arm64/vgic_init.c +f:tools/testing/selftests/kvm/arm64/vgic_irq.c +f:tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c +f:tools/testing/selftests/kvm/arm64/vpmu_counter_access.c +f:tools/testing/selftests/kvm/coalesced_io_test.c +f:tools/testing/selftests/kvm/config +f:tools/testing/selftests/kvm/demand_paging_test.c +f:tools/testing/selftests/kvm/dirty_log_perf_test.c +f:tools/testing/selftests/kvm/dirty_log_test.c +f:tools/testing/selftests/kvm/get-reg-list.c +f:tools/testing/selftests/kvm/guest_memfd_test.c +f:tools/testing/selftests/kvm/guest_print_test.c +f:tools/testing/selftests/kvm/hardware_disable_test.c +f:tools/testing/selftests/kvm/include/arm64/arch_timer.h +f:tools/testing/selftests/kvm/include/arm64/delay.h +f:tools/testing/selftests/kvm/include/arm64/gic.h +f:tools/testing/selftests/kvm/include/arm64/gic_v3.h +f:tools/testing/selftests/kvm/include/arm64/gic_v3_its.h +f:tools/testing/selftests/kvm/include/arm64/kvm_util_arch.h +f:tools/testing/selftests/kvm/include/arm64/processor.h +f:tools/testing/selftests/kvm/include/arm64/spinlock.h +f:tools/testing/selftests/kvm/include/arm64/ucall.h +f:tools/testing/selftests/kvm/include/arm64/vgic.h +f:tools/testing/selftests/kvm/include/guest_modes.h +f:tools/testing/selftests/kvm/include/kvm_test_harness.h +f:tools/testing/selftests/kvm/include/kvm_util.h +f:tools/testing/selftests/kvm/include/kvm_util_types.h +f:tools/testing/selftests/kvm/include/loongarch/kvm_util_arch.h +f:tools/testing/selftests/kvm/include/loongarch/processor.h +f:tools/testing/selftests/kvm/include/loongarch/ucall.h +f:tools/testing/selftests/kvm/include/lru_gen_util.h +f:tools/testing/selftests/kvm/include/memstress.h +f:tools/testing/selftests/kvm/include/numaif.h +f:tools/testing/selftests/kvm/include/riscv/arch_timer.h +f:tools/testing/selftests/kvm/include/riscv/kvm_util_arch.h +f:tools/testing/selftests/kvm/include/riscv/processor.h +f:tools/testing/selftests/kvm/include/riscv/sbi.h +f:tools/testing/selftests/kvm/include/riscv/ucall.h +f:tools/testing/selftests/kvm/include/s390/debug_print.h +f:tools/testing/selftests/kvm/include/s390/diag318_test_handler.h +f:tools/testing/selftests/kvm/include/s390/facility.h +f:tools/testing/selftests/kvm/include/s390/kvm_util_arch.h +f:tools/testing/selftests/kvm/include/s390/processor.h +f:tools/testing/selftests/kvm/include/s390/sie.h +f:tools/testing/selftests/kvm/include/s390/ucall.h +f:tools/testing/selftests/kvm/include/sparsebit.h +f:tools/testing/selftests/kvm/include/test_util.h +f:tools/testing/selftests/kvm/include/timer_test.h +f:tools/testing/selftests/kvm/include/ucall_common.h +f:tools/testing/selftests/kvm/include/userfaultfd_util.h +f:tools/testing/selftests/kvm/include/x86/apic.h +f:tools/testing/selftests/kvm/include/x86/evmcs.h +f:tools/testing/selftests/kvm/include/x86/hyperv.h +f:tools/testing/selftests/kvm/include/x86/kvm_util_arch.h +f:tools/testing/selftests/kvm/include/x86/mce.h +f:tools/testing/selftests/kvm/include/x86/pmu.h +f:tools/testing/selftests/kvm/include/x86/processor.h +f:tools/testing/selftests/kvm/include/x86/sev.h +f:tools/testing/selftests/kvm/include/x86/svm.h +f:tools/testing/selftests/kvm/include/x86/svm_util.h +f:tools/testing/selftests/kvm/include/x86/ucall.h +f:tools/testing/selftests/kvm/include/x86/vmx.h +f:tools/testing/selftests/kvm/irqfd_test.c +f:tools/testing/selftests/kvm/kvm_binary_stats_test.c +f:tools/testing/selftests/kvm/kvm_create_max_vcpus.c +f:tools/testing/selftests/kvm/kvm_page_table_test.c +f:tools/testing/selftests/kvm/lib/arm64/gic.c +f:tools/testing/selftests/kvm/lib/arm64/gic_private.h +f:tools/testing/selftests/kvm/lib/arm64/gic_v3.c +f:tools/testing/selftests/kvm/lib/arm64/gic_v3_its.c +f:tools/testing/selftests/kvm/lib/arm64/handlers.S +f:tools/testing/selftests/kvm/lib/arm64/processor.c +f:tools/testing/selftests/kvm/lib/arm64/spinlock.c +f:tools/testing/selftests/kvm/lib/arm64/ucall.c +f:tools/testing/selftests/kvm/lib/arm64/vgic.c +f:tools/testing/selftests/kvm/lib/assert.c +f:tools/testing/selftests/kvm/lib/elf.c +f:tools/testing/selftests/kvm/lib/guest_modes.c +f:tools/testing/selftests/kvm/lib/guest_sprintf.c +f:tools/testing/selftests/kvm/lib/io.c +f:tools/testing/selftests/kvm/lib/kvm_util.c +f:tools/testing/selftests/kvm/lib/loongarch/exception.S +f:tools/testing/selftests/kvm/lib/loongarch/processor.c +f:tools/testing/selftests/kvm/lib/loongarch/ucall.c +f:tools/testing/selftests/kvm/lib/lru_gen_util.c +f:tools/testing/selftests/kvm/lib/memstress.c +f:tools/testing/selftests/kvm/lib/rbtree.c +f:tools/testing/selftests/kvm/lib/riscv/handlers.S +f:tools/testing/selftests/kvm/lib/riscv/processor.c +f:tools/testing/selftests/kvm/lib/riscv/ucall.c +f:tools/testing/selftests/kvm/lib/s390/diag318_test_handler.c +f:tools/testing/selftests/kvm/lib/s390/facility.c +f:tools/testing/selftests/kvm/lib/s390/processor.c +f:tools/testing/selftests/kvm/lib/s390/ucall.c +f:tools/testing/selftests/kvm/lib/sparsebit.c +f:tools/testing/selftests/kvm/lib/string_override.c +f:tools/testing/selftests/kvm/lib/test_util.c +f:tools/testing/selftests/kvm/lib/ucall_common.c +f:tools/testing/selftests/kvm/lib/userfaultfd_util.c +f:tools/testing/selftests/kvm/lib/x86/apic.c +f:tools/testing/selftests/kvm/lib/x86/handlers.S +f:tools/testing/selftests/kvm/lib/x86/hyperv.c +f:tools/testing/selftests/kvm/lib/x86/memstress.c +f:tools/testing/selftests/kvm/lib/x86/pmu.c +f:tools/testing/selftests/kvm/lib/x86/processor.c +f:tools/testing/selftests/kvm/lib/x86/sev.c +f:tools/testing/selftests/kvm/lib/x86/svm.c +f:tools/testing/selftests/kvm/lib/x86/ucall.c +f:tools/testing/selftests/kvm/lib/x86/vmx.c +f:tools/testing/selftests/kvm/memslot_modification_stress_test.c +f:tools/testing/selftests/kvm/memslot_perf_test.c +f:tools/testing/selftests/kvm/mmu_stress_test.c +f:tools/testing/selftests/kvm/pre_fault_memory_test.c +f:tools/testing/selftests/kvm/riscv/arch_timer.c +f:tools/testing/selftests/kvm/riscv/ebreak_test.c +f:tools/testing/selftests/kvm/riscv/get-reg-list.c +f:tools/testing/selftests/kvm/riscv/sbi_pmu_test.c +f:tools/testing/selftests/kvm/rseq_test.c +f:tools/testing/selftests/kvm/s390/cmma_test.c +f:tools/testing/selftests/kvm/s390/config +f:tools/testing/selftests/kvm/s390/cpumodel_subfuncs_test.c +f:tools/testing/selftests/kvm/s390/debug_test.c +f:tools/testing/selftests/kvm/s390/memop.c +f:tools/testing/selftests/kvm/s390/resets.c +f:tools/testing/selftests/kvm/s390/shared_zeropage_test.c +f:tools/testing/selftests/kvm/s390/sync_regs_test.c +f:tools/testing/selftests/kvm/s390/tprot.c +f:tools/testing/selftests/kvm/s390/ucontrol_test.c +f:tools/testing/selftests/kvm/set_memory_region_test.c +f:tools/testing/selftests/kvm/settings +f:tools/testing/selftests/kvm/steal_time.c +f:tools/testing/selftests/kvm/system_counter_offset_test.c +f:tools/testing/selftests/kvm/x86/amx_test.c +f:tools/testing/selftests/kvm/x86/aperfmperf_test.c +f:tools/testing/selftests/kvm/x86/apic_bus_clock_test.c +f:tools/testing/selftests/kvm/x86/cpuid_test.c +f:tools/testing/selftests/kvm/x86/cr4_cpuid_sync_test.c +f:tools/testing/selftests/kvm/x86/debug_regs.c +f:tools/testing/selftests/kvm/x86/dirty_log_page_splitting_test.c +f:tools/testing/selftests/kvm/x86/exit_on_emulation_failure_test.c +f:tools/testing/selftests/kvm/x86/fastops_test.c +f:tools/testing/selftests/kvm/x86/feature_msrs_test.c +f:tools/testing/selftests/kvm/x86/fix_hypercall_test.c +f:tools/testing/selftests/kvm/x86/flds_emulation.h +f:tools/testing/selftests/kvm/x86/hwcr_msr_test.c +f:tools/testing/selftests/kvm/x86/hyperv_clock.c +f:tools/testing/selftests/kvm/x86/hyperv_cpuid.c +f:tools/testing/selftests/kvm/x86/hyperv_evmcs.c +f:tools/testing/selftests/kvm/x86/hyperv_extended_hypercalls.c +f:tools/testing/selftests/kvm/x86/hyperv_features.c +f:tools/testing/selftests/kvm/x86/hyperv_ipi.c +f:tools/testing/selftests/kvm/x86/hyperv_svm_test.c +f:tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c +f:tools/testing/selftests/kvm/x86/kvm_buslock_test.c +f:tools/testing/selftests/kvm/x86/kvm_clock_test.c +f:tools/testing/selftests/kvm/x86/kvm_pv_test.c +f:tools/testing/selftests/kvm/x86/max_vcpuid_cap_test.c +f:tools/testing/selftests/kvm/x86/monitor_mwait_test.c +f:tools/testing/selftests/kvm/x86/nested_emulation_test.c +f:tools/testing/selftests/kvm/x86/nested_exceptions_test.c +f:tools/testing/selftests/kvm/x86/nx_huge_pages_test.c +f:tools/testing/selftests/kvm/x86/nx_huge_pages_test.sh +f:tools/testing/selftests/kvm/x86/platform_info_test.c +f:tools/testing/selftests/kvm/x86/pmu_counters_test.c +f:tools/testing/selftests/kvm/x86/pmu_event_filter_test.c +f:tools/testing/selftests/kvm/x86/private_mem_conversions_test.c +f:tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c +f:tools/testing/selftests/kvm/x86/recalc_apic_map_test.c +f:tools/testing/selftests/kvm/x86/set_boot_cpu_id.c +f:tools/testing/selftests/kvm/x86/set_sregs_test.c +f:tools/testing/selftests/kvm/x86/sev_init2_tests.c +f:tools/testing/selftests/kvm/x86/sev_migrate_tests.c +f:tools/testing/selftests/kvm/x86/sev_smoke_test.c +f:tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c +f:tools/testing/selftests/kvm/x86/smm_test.c +f:tools/testing/selftests/kvm/x86/state_test.c +f:tools/testing/selftests/kvm/x86/svm_int_ctl_test.c +f:tools/testing/selftests/kvm/x86/svm_nested_shutdown_test.c +f:tools/testing/selftests/kvm/x86/svm_nested_soft_inject_test.c +f:tools/testing/selftests/kvm/x86/svm_vmcall_test.c +f:tools/testing/selftests/kvm/x86/sync_regs_test.c +f:tools/testing/selftests/kvm/x86/triple_fault_event_test.c +f:tools/testing/selftests/kvm/x86/tsc_msrs_test.c +f:tools/testing/selftests/kvm/x86/tsc_scaling_sync.c +f:tools/testing/selftests/kvm/x86/ucna_injection_test.c +f:tools/testing/selftests/kvm/x86/userspace_io_test.c +f:tools/testing/selftests/kvm/x86/userspace_msr_exit_test.c +f:tools/testing/selftests/kvm/x86/vmx_apic_access_test.c +f:tools/testing/selftests/kvm/x86/vmx_close_while_nested_test.c +f:tools/testing/selftests/kvm/x86/vmx_dirty_log_test.c +f:tools/testing/selftests/kvm/x86/vmx_exception_with_invalid_guest_state.c +f:tools/testing/selftests/kvm/x86/vmx_invalid_nested_guest_state.c +f:tools/testing/selftests/kvm/x86/vmx_msrs_test.c +f:tools/testing/selftests/kvm/x86/vmx_nested_tsc_scaling_test.c +f:tools/testing/selftests/kvm/x86/vmx_pmu_caps_test.c +f:tools/testing/selftests/kvm/x86/vmx_preemption_timer_test.c +f:tools/testing/selftests/kvm/x86/vmx_set_nested_state_test.c +f:tools/testing/selftests/kvm/x86/vmx_tsc_adjust_test.c +f:tools/testing/selftests/kvm/x86/xapic_ipi_test.c +f:tools/testing/selftests/kvm/x86/xapic_state_test.c +f:tools/testing/selftests/kvm/x86/xcr0_cpuid_test.c +f:tools/testing/selftests/kvm/x86/xen_shinfo_test.c +f:tools/testing/selftests/kvm/x86/xen_vmcall_test.c +f:tools/testing/selftests/kvm/x86/xss_msr_test.c +f:tools/testing/selftests/landlock/.gitignore +f:tools/testing/selftests/landlock/Makefile +f:tools/testing/selftests/landlock/audit.h +f:tools/testing/selftests/landlock/audit_test.c +f:tools/testing/selftests/landlock/base_test.c +f:tools/testing/selftests/landlock/common.h +f:tools/testing/selftests/landlock/config +f:tools/testing/selftests/landlock/config.um +f:tools/testing/selftests/landlock/fs_test.c +f:tools/testing/selftests/landlock/net_test.c +f:tools/testing/selftests/landlock/ptrace_test.c +f:tools/testing/selftests/landlock/sandbox-and-launch.c +f:tools/testing/selftests/landlock/scoped_abstract_unix_test.c +f:tools/testing/selftests/landlock/scoped_base_variants.h +f:tools/testing/selftests/landlock/scoped_common.h +f:tools/testing/selftests/landlock/scoped_multiple_domain_variants.h +f:tools/testing/selftests/landlock/scoped_signal_test.c +f:tools/testing/selftests/landlock/scoped_test.c +f:tools/testing/selftests/landlock/true.c +f:tools/testing/selftests/landlock/wait-pipe-sandbox.c +f:tools/testing/selftests/landlock/wait-pipe.c +f:tools/testing/selftests/landlock/wrappers.h +f:tools/testing/selftests/lib.mk +f:tools/testing/selftests/lib/Makefile +f:tools/testing/selftests/lib/bitmap.sh +f:tools/testing/selftests/lib/config +f:tools/testing/selftests/livepatch/.gitignore +f:tools/testing/selftests/livepatch/Makefile +f:tools/testing/selftests/livepatch/README +f:tools/testing/selftests/livepatch/config +f:tools/testing/selftests/livepatch/functions.sh +f:tools/testing/selftests/livepatch/settings +f:tools/testing/selftests/livepatch/test-callbacks.sh +f:tools/testing/selftests/livepatch/test-ftrace.sh +f:tools/testing/selftests/livepatch/test-kprobe.sh +f:tools/testing/selftests/livepatch/test-livepatch.sh +f:tools/testing/selftests/livepatch/test-shadow-vars.sh +f:tools/testing/selftests/livepatch/test-state.sh +f:tools/testing/selftests/livepatch/test-syscall.sh +f:tools/testing/selftests/livepatch/test-sysfs.sh +f:tools/testing/selftests/livepatch/test_klp-call_getpid.c +f:tools/testing/selftests/livepatch/test_modules/Makefile +f:tools/testing/selftests/livepatch/test_modules/test_klp_atomic_replace.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_busy.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo2.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_mod.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_kprobe.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_livepatch.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_shadow_vars.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_state.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_state2.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_state3.c +f:tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c +f:tools/testing/selftests/lkdtm/.gitignore +f:tools/testing/selftests/lkdtm/Makefile +f:tools/testing/selftests/lkdtm/config +f:tools/testing/selftests/lkdtm/run.sh +f:tools/testing/selftests/lkdtm/stack-entropy.sh +f:tools/testing/selftests/lkdtm/tests.txt +f:tools/testing/selftests/locking/Makefile +f:tools/testing/selftests/locking/ww_mutex.sh +f:tools/testing/selftests/lsm/.gitignore +f:tools/testing/selftests/lsm/Makefile +f:tools/testing/selftests/lsm/common.c +f:tools/testing/selftests/lsm/common.h +f:tools/testing/selftests/lsm/config +f:tools/testing/selftests/lsm/lsm_get_self_attr_test.c +f:tools/testing/selftests/lsm/lsm_list_modules_test.c +f:tools/testing/selftests/lsm/lsm_set_self_attr_test.c +f:tools/testing/selftests/media_tests/.gitignore +f:tools/testing/selftests/media_tests/Makefile +f:tools/testing/selftests/media_tests/bind_unbind_sample.sh +f:tools/testing/selftests/media_tests/media_dev_allocator.sh +f:tools/testing/selftests/media_tests/media_device_open.c +f:tools/testing/selftests/media_tests/media_device_test.c +f:tools/testing/selftests/media_tests/open_loop_test.sh +f:tools/testing/selftests/media_tests/regression_test.txt +f:tools/testing/selftests/media_tests/video_device_test.c +f:tools/testing/selftests/membarrier/.gitignore +f:tools/testing/selftests/membarrier/Makefile +f:tools/testing/selftests/membarrier/membarrier_test_impl.h +f:tools/testing/selftests/membarrier/membarrier_test_multi_thread.c +f:tools/testing/selftests/membarrier/membarrier_test_single_thread.c +f:tools/testing/selftests/memfd/.gitignore +f:tools/testing/selftests/memfd/Makefile +f:tools/testing/selftests/memfd/common.c +f:tools/testing/selftests/memfd/common.h +f:tools/testing/selftests/memfd/config +f:tools/testing/selftests/memfd/fuse_mnt.c +f:tools/testing/selftests/memfd/fuse_test.c +f:tools/testing/selftests/memfd/memfd_test.c +f:tools/testing/selftests/memfd/run_fuse_test.sh +f:tools/testing/selftests/memfd/run_hugetlbfs_test.sh +f:tools/testing/selftests/memory-hotplug/Makefile +f:tools/testing/selftests/memory-hotplug/config +f:tools/testing/selftests/memory-hotplug/mem-on-off-test.sh +f:tools/testing/selftests/mincore/.gitignore +f:tools/testing/selftests/mincore/Makefile +f:tools/testing/selftests/mincore/mincore_selftest.c +f:tools/testing/selftests/mm/.gitignore +f:tools/testing/selftests/mm/Makefile +f:tools/testing/selftests/mm/charge_reserved_hugetlb.sh +f:tools/testing/selftests/mm/check_config.sh +f:tools/testing/selftests/mm/compaction_test.c +f:tools/testing/selftests/mm/config +f:tools/testing/selftests/mm/cow.c +f:tools/testing/selftests/mm/droppable.c +f:tools/testing/selftests/mm/guard-regions.c +f:tools/testing/selftests/mm/gup_longterm.c +f:tools/testing/selftests/mm/gup_test.c +f:tools/testing/selftests/mm/hmm-tests.c +f:tools/testing/selftests/mm/hugepage-mmap.c +f:tools/testing/selftests/mm/hugepage-mremap.c +f:tools/testing/selftests/mm/hugepage-shm.c +f:tools/testing/selftests/mm/hugepage-vmemmap.c +f:tools/testing/selftests/mm/hugetlb-madvise.c +f:tools/testing/selftests/mm/hugetlb-read-hwpoison.c +f:tools/testing/selftests/mm/hugetlb-soft-offline.c +f:tools/testing/selftests/mm/hugetlb_dio.c +f:tools/testing/selftests/mm/hugetlb_fault_after_madv.c +f:tools/testing/selftests/mm/hugetlb_madv_vs_map.c +f:tools/testing/selftests/mm/hugetlb_reparenting_test.sh +f:tools/testing/selftests/mm/khugepaged.c +f:tools/testing/selftests/mm/ksm_functional_tests.c +f:tools/testing/selftests/mm/ksm_tests.c +f:tools/testing/selftests/mm/madv_populate.c +f:tools/testing/selftests/mm/map_fixed_noreplace.c +f:tools/testing/selftests/mm/map_hugetlb.c +f:tools/testing/selftests/mm/map_populate.c +f:tools/testing/selftests/mm/mdwe_test.c +f:tools/testing/selftests/mm/memfd_secret.c +f:tools/testing/selftests/mm/merge.c +f:tools/testing/selftests/mm/migration.c +f:tools/testing/selftests/mm/mkdirty.c +f:tools/testing/selftests/mm/mlock-random-test.c +f:tools/testing/selftests/mm/mlock2-tests.c +f:tools/testing/selftests/mm/mlock2.h +f:tools/testing/selftests/mm/mrelease_test.c +f:tools/testing/selftests/mm/mremap_dontunmap.c +f:tools/testing/selftests/mm/mremap_test.c +f:tools/testing/selftests/mm/mseal_helpers.h +f:tools/testing/selftests/mm/mseal_test.c +f:tools/testing/selftests/mm/on-fault-limit.c +f:tools/testing/selftests/mm/page_frag/Makefile +f:tools/testing/selftests/mm/page_frag/page_frag_test.c +f:tools/testing/selftests/mm/pagemap_ioctl.c +f:tools/testing/selftests/mm/pfnmap.c +f:tools/testing/selftests/mm/pkey-arm64.h +f:tools/testing/selftests/mm/pkey-helpers.h +f:tools/testing/selftests/mm/pkey-powerpc.h +f:tools/testing/selftests/mm/pkey-x86.h +f:tools/testing/selftests/mm/pkey_sighandler_tests.c +f:tools/testing/selftests/mm/pkey_util.c +f:tools/testing/selftests/mm/protection_keys.c +f:tools/testing/selftests/mm/run_vmtests.sh +f:tools/testing/selftests/mm/settings +f:tools/testing/selftests/mm/soft-dirty.c +f:tools/testing/selftests/mm/split_huge_page_test.c +f:tools/testing/selftests/mm/test_hmm.sh +f:tools/testing/selftests/mm/test_page_frag.sh +f:tools/testing/selftests/mm/test_vmalloc.sh +f:tools/testing/selftests/mm/thp_settings.c +f:tools/testing/selftests/mm/thp_settings.h +f:tools/testing/selftests/mm/thuge-gen.c +f:tools/testing/selftests/mm/transhuge-stress.c +f:tools/testing/selftests/mm/uffd-common.c +f:tools/testing/selftests/mm/uffd-common.h +f:tools/testing/selftests/mm/uffd-stress.c +f:tools/testing/selftests/mm/uffd-unit-tests.c +f:tools/testing/selftests/mm/uffd-wp-mremap.c +f:tools/testing/selftests/mm/va_high_addr_switch.c +f:tools/testing/selftests/mm/va_high_addr_switch.sh +f:tools/testing/selftests/mm/virtual_address_range.c +f:tools/testing/selftests/mm/vm_util.c +f:tools/testing/selftests/mm/vm_util.h +f:tools/testing/selftests/mm/write_hugetlb_memory.sh +f:tools/testing/selftests/mm/write_to_hugetlbfs.c +f:tools/testing/selftests/module/Makefile +f:tools/testing/selftests/module/config +f:tools/testing/selftests/module/find_symbol.sh +f:tools/testing/selftests/mount/.gitignore +f:tools/testing/selftests/mount/Makefile +f:tools/testing/selftests/mount/config +f:tools/testing/selftests/mount/nosymfollow-test.c +f:tools/testing/selftests/mount/run_nosymfollow.sh +f:tools/testing/selftests/mount/run_unprivileged_remount.sh +f:tools/testing/selftests/mount/unprivileged-remount-test.c +f:tools/testing/selftests/mount_setattr/.gitignore +f:tools/testing/selftests/mount_setattr/Makefile +f:tools/testing/selftests/mount_setattr/config +f:tools/testing/selftests/mount_setattr/mount_setattr_test.c +f:tools/testing/selftests/move_mount_set_group/.gitignore +f:tools/testing/selftests/move_mount_set_group/Makefile +f:tools/testing/selftests/move_mount_set_group/config +f:tools/testing/selftests/move_mount_set_group/move_mount_set_group_test.c +f:tools/testing/selftests/mqueue/.gitignore +f:tools/testing/selftests/mqueue/Makefile +f:tools/testing/selftests/mqueue/mq_open_tests.c +f:tools/testing/selftests/mqueue/mq_perf_tests.c +f:tools/testing/selftests/mqueue/setting +f:tools/testing/selftests/mseal_system_mappings/.gitignore +f:tools/testing/selftests/mseal_system_mappings/Makefile +f:tools/testing/selftests/mseal_system_mappings/config +f:tools/testing/selftests/mseal_system_mappings/sysmap_is_sealed.c +f:tools/testing/selftests/nci/.gitignore +f:tools/testing/selftests/nci/Makefile +f:tools/testing/selftests/nci/config +f:tools/testing/selftests/nci/nci_dev.c +f:tools/testing/selftests/net/.gitignore +f:tools/testing/selftests/net/Makefile +f:tools/testing/selftests/net/af_unix/Makefile +f:tools/testing/selftests/net/af_unix/config +f:tools/testing/selftests/net/af_unix/diag_uid.c +f:tools/testing/selftests/net/af_unix/msg_oob.c +f:tools/testing/selftests/net/af_unix/scm_inq.c +f:tools/testing/selftests/net/af_unix/scm_pidfd.c +f:tools/testing/selftests/net/af_unix/scm_rights.c +f:tools/testing/selftests/net/af_unix/unix_connect.c +f:tools/testing/selftests/net/altnames.sh +f:tools/testing/selftests/net/amt.sh +f:tools/testing/selftests/net/arp_ndisc_evict_nocarrier.sh +f:tools/testing/selftests/net/arp_ndisc_untracked_subnets.sh +f:tools/testing/selftests/net/bareudp.sh +f:tools/testing/selftests/net/bench/Makefile +f:tools/testing/selftests/net/bench/page_pool/Makefile +f:tools/testing/selftests/net/bench/page_pool/bench_page_pool_simple.c +f:tools/testing/selftests/net/bench/page_pool/time_bench.c +f:tools/testing/selftests/net/bench/page_pool/time_bench.h +f:tools/testing/selftests/net/bench/test_bench_page_pool.sh +f:tools/testing/selftests/net/big_tcp.sh +f:tools/testing/selftests/net/bind_bhash.c +f:tools/testing/selftests/net/bind_bhash.sh +f:tools/testing/selftests/net/bind_timewait.c +f:tools/testing/selftests/net/bind_wildcard.c +f:tools/testing/selftests/net/bpf.mk +f:tools/testing/selftests/net/bpf_offload.py +f:tools/testing/selftests/net/broadcast_pmtu.sh +f:tools/testing/selftests/net/busy_poll_test.sh +f:tools/testing/selftests/net/busy_poller.c +f:tools/testing/selftests/net/can/.gitignore +f:tools/testing/selftests/net/can/Makefile +f:tools/testing/selftests/net/can/test_raw_filter.c +f:tools/testing/selftests/net/can/test_raw_filter.sh +f:tools/testing/selftests/net/cmsg_ip.sh +f:tools/testing/selftests/net/cmsg_sender.c +f:tools/testing/selftests/net/cmsg_so_mark.sh +f:tools/testing/selftests/net/cmsg_so_priority.sh +f:tools/testing/selftests/net/cmsg_time.sh +f:tools/testing/selftests/net/config +f:tools/testing/selftests/net/drop_monitor_tests.sh +f:tools/testing/selftests/net/epoll_busy_poll.c +f:tools/testing/selftests/net/fcnal-test.sh +f:tools/testing/selftests/net/fdb_flush.sh +f:tools/testing/selftests/net/fdb_notify.sh +f:tools/testing/selftests/net/fib-onlink-tests.sh +f:tools/testing/selftests/net/fib_nexthop_multiprefix.sh +f:tools/testing/selftests/net/fib_nexthop_nongw.sh +f:tools/testing/selftests/net/fib_nexthops.sh +f:tools/testing/selftests/net/fib_rule_tests.sh +f:tools/testing/selftests/net/fib_tests.sh +f:tools/testing/selftests/net/fin_ack_lat.c +f:tools/testing/selftests/net/fin_ack_lat.sh +f:tools/testing/selftests/net/forwarding/.gitignore +f:tools/testing/selftests/net/forwarding/Makefile +f:tools/testing/selftests/net/forwarding/README +f:tools/testing/selftests/net/forwarding/bridge_fdb_learning_limit.sh +f:tools/testing/selftests/net/forwarding/bridge_igmp.sh +f:tools/testing/selftests/net/forwarding/bridge_locked_port.sh +f:tools/testing/selftests/net/forwarding/bridge_mdb.sh +f:tools/testing/selftests/net/forwarding/bridge_mdb_host.sh +f:tools/testing/selftests/net/forwarding/bridge_mdb_max.sh +f:tools/testing/selftests/net/forwarding/bridge_mdb_port_down.sh +f:tools/testing/selftests/net/forwarding/bridge_mld.sh +f:tools/testing/selftests/net/forwarding/bridge_port_isolation.sh +f:tools/testing/selftests/net/forwarding/bridge_sticky_fdb.sh +f:tools/testing/selftests/net/forwarding/bridge_vlan_aware.sh +f:tools/testing/selftests/net/forwarding/bridge_vlan_mcast.sh +f:tools/testing/selftests/net/forwarding/bridge_vlan_unaware.sh +f:tools/testing/selftests/net/forwarding/config +f:tools/testing/selftests/net/forwarding/custom_multipath_hash.sh +f:tools/testing/selftests/net/forwarding/devlink_lib.sh +f:tools/testing/selftests/net/forwarding/dual_vxlan_bridge.sh +f:tools/testing/selftests/net/forwarding/fib_offload_lib.sh +f:tools/testing/selftests/net/forwarding/forwarding.config.sample +f:tools/testing/selftests/net/forwarding/gre_custom_multipath_hash.sh +f:tools/testing/selftests/net/forwarding/gre_inner_v4_multipath.sh +f:tools/testing/selftests/net/forwarding/gre_inner_v6_multipath.sh +f:tools/testing/selftests/net/forwarding/gre_multipath.sh +f:tools/testing/selftests/net/forwarding/gre_multipath_nh.sh +f:tools/testing/selftests/net/forwarding/gre_multipath_nh_res.sh +f:tools/testing/selftests/net/forwarding/ip6_forward_instats_vrf.sh +f:tools/testing/selftests/net/forwarding/ip6gre_custom_multipath_hash.sh +f:tools/testing/selftests/net/forwarding/ip6gre_flat.sh +f:tools/testing/selftests/net/forwarding/ip6gre_flat_key.sh +f:tools/testing/selftests/net/forwarding/ip6gre_flat_keys.sh +f:tools/testing/selftests/net/forwarding/ip6gre_hier.sh +f:tools/testing/selftests/net/forwarding/ip6gre_hier_key.sh +f:tools/testing/selftests/net/forwarding/ip6gre_hier_keys.sh +f:tools/testing/selftests/net/forwarding/ip6gre_inner_v4_multipath.sh +f:tools/testing/selftests/net/forwarding/ip6gre_inner_v6_multipath.sh +f:tools/testing/selftests/net/forwarding/ip6gre_lib.sh +f:tools/testing/selftests/net/forwarding/ipip_flat_gre.sh +f:tools/testing/selftests/net/forwarding/ipip_flat_gre_key.sh +f:tools/testing/selftests/net/forwarding/ipip_flat_gre_keys.sh +f:tools/testing/selftests/net/forwarding/ipip_hier_gre.sh +f:tools/testing/selftests/net/forwarding/ipip_hier_gre_key.sh +f:tools/testing/selftests/net/forwarding/ipip_hier_gre_keys.sh +f:tools/testing/selftests/net/forwarding/ipip_lib.sh +f:tools/testing/selftests/net/forwarding/lib.sh +f:tools/testing/selftests/net/forwarding/lib_sh_test.sh +f:tools/testing/selftests/net/forwarding/local_termination.sh +f:tools/testing/selftests/net/forwarding/min_max_mtu.sh +f:tools/testing/selftests/net/forwarding/mirror_gre.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_bound.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_bridge_1q.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_bridge_1q_lag.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_changes.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_flower.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_lag_lacp.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_lib.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_neigh.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_nh.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_topo_lib.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_vlan.sh +f:tools/testing/selftests/net/forwarding/mirror_gre_vlan_bridge_1q.sh +f:tools/testing/selftests/net/forwarding/mirror_lib.sh +f:tools/testing/selftests/net/forwarding/mirror_topo_lib.sh +f:tools/testing/selftests/net/forwarding/mirror_vlan.sh +f:tools/testing/selftests/net/forwarding/no_forwarding.sh +f:tools/testing/selftests/net/forwarding/pedit_dsfield.sh +f:tools/testing/selftests/net/forwarding/pedit_ip.sh +f:tools/testing/selftests/net/forwarding/pedit_l4port.sh +f:tools/testing/selftests/net/forwarding/q_in_vni.sh +f:tools/testing/selftests/net/forwarding/q_in_vni_ipv6.sh +f:tools/testing/selftests/net/forwarding/router.sh +f:tools/testing/selftests/net/forwarding/router_bridge.sh +f:tools/testing/selftests/net/forwarding/router_bridge_1d.sh +f:tools/testing/selftests/net/forwarding/router_bridge_1d_lag.sh +f:tools/testing/selftests/net/forwarding/router_bridge_lag.sh +f:tools/testing/selftests/net/forwarding/router_bridge_pvid_vlan_upper.sh +f:tools/testing/selftests/net/forwarding/router_bridge_vlan.sh +f:tools/testing/selftests/net/forwarding/router_bridge_vlan_upper.sh +f:tools/testing/selftests/net/forwarding/router_bridge_vlan_upper_pvid.sh +f:tools/testing/selftests/net/forwarding/router_broadcast.sh +f:tools/testing/selftests/net/forwarding/router_mpath_nh.sh +f:tools/testing/selftests/net/forwarding/router_mpath_nh_lib.sh +f:tools/testing/selftests/net/forwarding/router_mpath_nh_res.sh +f:tools/testing/selftests/net/forwarding/router_mpath_seed.sh +f:tools/testing/selftests/net/forwarding/router_multicast.sh +f:tools/testing/selftests/net/forwarding/router_multipath.sh +f:tools/testing/selftests/net/forwarding/router_nh.sh +f:tools/testing/selftests/net/forwarding/router_vid_1.sh +f:tools/testing/selftests/net/forwarding/sch_ets.sh +f:tools/testing/selftests/net/forwarding/sch_ets_core.sh +f:tools/testing/selftests/net/forwarding/sch_ets_tests.sh +f:tools/testing/selftests/net/forwarding/sch_red.sh +f:tools/testing/selftests/net/forwarding/sch_tbf_core.sh +f:tools/testing/selftests/net/forwarding/sch_tbf_ets.sh +f:tools/testing/selftests/net/forwarding/sch_tbf_etsprio.sh +f:tools/testing/selftests/net/forwarding/sch_tbf_prio.sh +f:tools/testing/selftests/net/forwarding/sch_tbf_root.sh +f:tools/testing/selftests/net/forwarding/settings +f:tools/testing/selftests/net/forwarding/skbedit_priority.sh +f:tools/testing/selftests/net/forwarding/tc_actions.sh +f:tools/testing/selftests/net/forwarding/tc_chains.sh +f:tools/testing/selftests/net/forwarding/tc_common.sh +f:tools/testing/selftests/net/forwarding/tc_flower.sh +f:tools/testing/selftests/net/forwarding/tc_flower_cfm.sh +f:tools/testing/selftests/net/forwarding/tc_flower_l2_miss.sh +f:tools/testing/selftests/net/forwarding/tc_flower_port_range.sh +f:tools/testing/selftests/net/forwarding/tc_flower_router.sh +f:tools/testing/selftests/net/forwarding/tc_mpls_l2vpn.sh +f:tools/testing/selftests/net/forwarding/tc_police.sh +f:tools/testing/selftests/net/forwarding/tc_shblocks.sh +f:tools/testing/selftests/net/forwarding/tc_taprio.sh +f:tools/testing/selftests/net/forwarding/tc_tunnel_key.sh +f:tools/testing/selftests/net/forwarding/tc_vlan_modify.sh +f:tools/testing/selftests/net/forwarding/tsn_lib.sh +f:tools/testing/selftests/net/forwarding/vxlan_asymmetric.sh +f:tools/testing/selftests/net/forwarding/vxlan_asymmetric_ipv6.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1d.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1d_ipv6.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1d_port_8472.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1d_port_8472_ipv6.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1q.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1q_ipv6.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1q_mc_ul.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1q_port_8472.sh +f:tools/testing/selftests/net/forwarding/vxlan_bridge_1q_port_8472_ipv6.sh +f:tools/testing/selftests/net/forwarding/vxlan_reserved.sh +f:tools/testing/selftests/net/forwarding/vxlan_symmetric.sh +f:tools/testing/selftests/net/forwarding/vxlan_symmetric_ipv6.sh +f:tools/testing/selftests/net/fq_band_pktlimit.sh +f:tools/testing/selftests/net/gre_gso.sh +f:tools/testing/selftests/net/gre_ipv6_lladdr.sh +f:tools/testing/selftests/net/gro.c +f:tools/testing/selftests/net/gro.sh +f:tools/testing/selftests/net/hsr/Makefile +f:tools/testing/selftests/net/hsr/config +f:tools/testing/selftests/net/hsr/hsr_common.sh +f:tools/testing/selftests/net/hsr/hsr_ping.sh +f:tools/testing/selftests/net/hsr/hsr_redbox.sh +f:tools/testing/selftests/net/hsr/settings +f:tools/testing/selftests/net/hwtstamp_config.c +f:tools/testing/selftests/net/icmp.sh +f:tools/testing/selftests/net/icmp_redirect.sh +f:tools/testing/selftests/net/in_netns.sh +f:tools/testing/selftests/net/io_uring_zerocopy_tx.c +f:tools/testing/selftests/net/io_uring_zerocopy_tx.sh +f:tools/testing/selftests/net/ioam6.sh +f:tools/testing/selftests/net/ioam6_parser.c +f:tools/testing/selftests/net/ip6_gre_headroom.sh +f:tools/testing/selftests/net/ip_defrag.c +f:tools/testing/selftests/net/ip_defrag.sh +f:tools/testing/selftests/net/ip_local_port_range.c +f:tools/testing/selftests/net/ip_local_port_range.sh +f:tools/testing/selftests/net/ipsec.c +f:tools/testing/selftests/net/ipv6_flowlabel.c +f:tools/testing/selftests/net/ipv6_flowlabel.sh +f:tools/testing/selftests/net/ipv6_flowlabel_mgr.c +f:tools/testing/selftests/net/ipv6_force_forwarding.sh +f:tools/testing/selftests/net/ipv6_route_update_soft_lockup.sh +f:tools/testing/selftests/net/l2_tos_ttl_inherit.sh +f:tools/testing/selftests/net/l2tp.sh +f:tools/testing/selftests/net/lib.sh +f:tools/testing/selftests/net/lib/.gitignore +f:tools/testing/selftests/net/lib/Makefile +f:tools/testing/selftests/net/lib/csum.c +f:tools/testing/selftests/net/lib/ksft.h +f:tools/testing/selftests/net/lib/py/__init__.py +f:tools/testing/selftests/net/lib/py/consts.py +f:tools/testing/selftests/net/lib/py/ksft.py +f:tools/testing/selftests/net/lib/py/netns.py +f:tools/testing/selftests/net/lib/py/nsim.py +f:tools/testing/selftests/net/lib/py/utils.py +f:tools/testing/selftests/net/lib/py/ynl.py +f:tools/testing/selftests/net/lib/sh/defer.sh +f:tools/testing/selftests/net/lib/xdp_dummy.bpf.c +f:tools/testing/selftests/net/lib/xdp_helper.c +f:tools/testing/selftests/net/lib/xdp_native.bpf.c +f:tools/testing/selftests/net/link_netns.py +f:tools/testing/selftests/net/lwt_dst_cache_ref_loop.sh +f:tools/testing/selftests/net/mptcp/.gitignore +f:tools/testing/selftests/net/mptcp/Makefile +f:tools/testing/selftests/net/mptcp/config +f:tools/testing/selftests/net/mptcp/diag.sh +f:tools/testing/selftests/net/mptcp/mptcp_connect.c +f:tools/testing/selftests/net/mptcp/mptcp_connect.sh +f:tools/testing/selftests/net/mptcp/mptcp_connect_checksum.sh +f:tools/testing/selftests/net/mptcp/mptcp_connect_mmap.sh +f:tools/testing/selftests/net/mptcp/mptcp_connect_sendfile.sh +f:tools/testing/selftests/net/mptcp/mptcp_diag.c +f:tools/testing/selftests/net/mptcp/mptcp_inq.c +f:tools/testing/selftests/net/mptcp/mptcp_join.sh +f:tools/testing/selftests/net/mptcp/mptcp_lib.sh +f:tools/testing/selftests/net/mptcp/mptcp_sockopt.c +f:tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +f:tools/testing/selftests/net/mptcp/pm_netlink.sh +f:tools/testing/selftests/net/mptcp/pm_nl_ctl.c +f:tools/testing/selftests/net/mptcp/settings +f:tools/testing/selftests/net/mptcp/simult_flows.sh +f:tools/testing/selftests/net/mptcp/userspace_pm.sh +f:tools/testing/selftests/net/msg_zerocopy.c +f:tools/testing/selftests/net/msg_zerocopy.sh +f:tools/testing/selftests/net/nat6to4.bpf.c +f:tools/testing/selftests/net/nat6to4.sh +f:tools/testing/selftests/net/ndisc_unsolicited_na_test.sh +f:tools/testing/selftests/net/netdev-l2addr.sh +f:tools/testing/selftests/net/netdevice.sh +f:tools/testing/selftests/net/netfilter/.gitignore +f:tools/testing/selftests/net/netfilter/Makefile +f:tools/testing/selftests/net/netfilter/audit_logread.c +f:tools/testing/selftests/net/netfilter/br_netfilter.sh +f:tools/testing/selftests/net/netfilter/br_netfilter_queue.sh +f:tools/testing/selftests/net/netfilter/bridge_brouter.sh +f:tools/testing/selftests/net/netfilter/config +f:tools/testing/selftests/net/netfilter/connect_close.c +f:tools/testing/selftests/net/netfilter/conntrack_clash.sh +f:tools/testing/selftests/net/netfilter/conntrack_dump_flush.c +f:tools/testing/selftests/net/netfilter/conntrack_dump_flush.sh +f:tools/testing/selftests/net/netfilter/conntrack_icmp_related.sh +f:tools/testing/selftests/net/netfilter/conntrack_ipip_mtu.sh +f:tools/testing/selftests/net/netfilter/conntrack_resize.sh +f:tools/testing/selftests/net/netfilter/conntrack_reverse_clash.c +f:tools/testing/selftests/net/netfilter/conntrack_reverse_clash.sh +f:tools/testing/selftests/net/netfilter/conntrack_sctp_collision.sh +f:tools/testing/selftests/net/netfilter/conntrack_tcp_unreplied.sh +f:tools/testing/selftests/net/netfilter/conntrack_vrf.sh +f:tools/testing/selftests/net/netfilter/ipvs.sh +f:tools/testing/selftests/net/netfilter/lib.sh +f:tools/testing/selftests/net/netfilter/nf_conntrack_packetdrill.sh +f:tools/testing/selftests/net/netfilter/nf_nat_edemux.sh +f:tools/testing/selftests/net/netfilter/nf_queue.c +f:tools/testing/selftests/net/netfilter/nft_audit.sh +f:tools/testing/selftests/net/netfilter/nft_concat_range.sh +f:tools/testing/selftests/net/netfilter/nft_concat_range_perf.sh +f:tools/testing/selftests/net/netfilter/nft_conntrack_helper.sh +f:tools/testing/selftests/net/netfilter/nft_fib.sh +f:tools/testing/selftests/net/netfilter/nft_flowtable.sh +f:tools/testing/selftests/net/netfilter/nft_interface_stress.sh +f:tools/testing/selftests/net/netfilter/nft_meta.sh +f:tools/testing/selftests/net/netfilter/nft_nat.sh +f:tools/testing/selftests/net/netfilter/nft_nat_zones.sh +f:tools/testing/selftests/net/netfilter/nft_queue.sh +f:tools/testing/selftests/net/netfilter/nft_synproxy.sh +f:tools/testing/selftests/net/netfilter/nft_tproxy_tcp.sh +f:tools/testing/selftests/net/netfilter/nft_tproxy_udp.sh +f:tools/testing/selftests/net/netfilter/nft_zones_many.sh +f:tools/testing/selftests/net/netfilter/packetdrill/common.sh +f:tools/testing/selftests/net/netfilter/packetdrill/conntrack_ack_loss_stall.pkt +f:tools/testing/selftests/net/netfilter/packetdrill/conntrack_inexact_rst.pkt +f:tools/testing/selftests/net/netfilter/packetdrill/conntrack_rst_invalid.pkt +f:tools/testing/selftests/net/netfilter/packetdrill/conntrack_syn_challenge_ack.pkt +f:tools/testing/selftests/net/netfilter/packetdrill/conntrack_synack_old.pkt +f:tools/testing/selftests/net/netfilter/packetdrill/conntrack_synack_reuse.pkt +f:tools/testing/selftests/net/netfilter/rpath.sh +f:tools/testing/selftests/net/netfilter/sctp_collision.c +f:tools/testing/selftests/net/netfilter/settings +f:tools/testing/selftests/net/netfilter/udpclash.c +f:tools/testing/selftests/net/netfilter/vxlan_mtu_frag.sh +f:tools/testing/selftests/net/netfilter/xt_string.sh +f:tools/testing/selftests/net/netlink-dumps.c +f:tools/testing/selftests/net/netns-name.sh +f:tools/testing/selftests/net/netns-sysctl.sh +f:tools/testing/selftests/net/nettest.c +f:tools/testing/selftests/net/nl_netdev.py +f:tools/testing/selftests/net/openvswitch/Makefile +f:tools/testing/selftests/net/openvswitch/openvswitch.sh +f:tools/testing/selftests/net/openvswitch/ovs-dpctl.py +f:tools/testing/selftests/net/openvswitch/settings +f:tools/testing/selftests/net/ovpn/.gitignore +f:tools/testing/selftests/net/ovpn/Makefile +f:tools/testing/selftests/net/ovpn/common.sh +f:tools/testing/selftests/net/ovpn/config +f:tools/testing/selftests/net/ovpn/data64.key +f:tools/testing/selftests/net/ovpn/ovpn-cli.c +f:tools/testing/selftests/net/ovpn/tcp_peers.txt +f:tools/testing/selftests/net/ovpn/test-chachapoly.sh +f:tools/testing/selftests/net/ovpn/test-close-socket-tcp.sh +f:tools/testing/selftests/net/ovpn/test-close-socket.sh +f:tools/testing/selftests/net/ovpn/test-float.sh +f:tools/testing/selftests/net/ovpn/test-large-mtu.sh +f:tools/testing/selftests/net/ovpn/test-tcp.sh +f:tools/testing/selftests/net/ovpn/test.sh +f:tools/testing/selftests/net/ovpn/udp_peers.txt +f:tools/testing/selftests/net/packetdrill/Makefile +f:tools/testing/selftests/net/packetdrill/config +f:tools/testing/selftests/net/packetdrill/defaults.sh +f:tools/testing/selftests/net/packetdrill/ksft_runner.sh +f:tools/testing/selftests/net/packetdrill/set_sysctls.py +f:tools/testing/selftests/net/packetdrill/tcp_blocking_blocking-accept.pkt +f:tools/testing/selftests/net/packetdrill/tcp_blocking_blocking-connect.pkt +f:tools/testing/selftests/net/packetdrill/tcp_blocking_blocking-read.pkt +f:tools/testing/selftests/net/packetdrill/tcp_blocking_blocking-write.pkt +f:tools/testing/selftests/net/packetdrill/tcp_close_close-local-close-then-remote-fin.pkt +f:tools/testing/selftests/net/packetdrill/tcp_close_close-on-syn-sent.pkt +f:tools/testing/selftests/net/packetdrill/tcp_close_close-remote-fin-then-close.pkt +f:tools/testing/selftests/net/packetdrill/tcp_dsack_mult.pkt +f:tools/testing/selftests/net/packetdrill/tcp_ecn_ecn-uses-ect0.pkt +f:tools/testing/selftests/net/packetdrill/tcp_eor_no-coalesce-large.pkt +f:tools/testing/selftests/net/packetdrill/tcp_eor_no-coalesce-retrans.pkt +f:tools/testing/selftests/net/packetdrill/tcp_eor_no-coalesce-small.pkt +f:tools/testing/selftests/net/packetdrill/tcp_eor_no-coalesce-subsequent.pkt +f:tools/testing/selftests/net/packetdrill/tcp_fast_recovery_prr-ss-10pkt-lost-1.pkt +f:tools/testing/selftests/net/packetdrill/tcp_fast_recovery_prr-ss-30pkt-lost-1_4-11_16.pkt +f:tools/testing/selftests/net/packetdrill/tcp_fast_recovery_prr-ss-30pkt-lost1_4.pkt +f:tools/testing/selftests/net/packetdrill/tcp_fast_recovery_prr-ss-ack-below-snd_una-cubic.pkt +f:tools/testing/selftests/net/packetdrill/tcp_inq_client.pkt +f:tools/testing/selftests/net/packetdrill/tcp_inq_server.pkt +f:tools/testing/selftests/net/packetdrill/tcp_limited_transmit_limited-transmit-no-sack.pkt +f:tools/testing/selftests/net/packetdrill/tcp_limited_transmit_limited-transmit-sack.pkt +f:tools/testing/selftests/net/packetdrill/tcp_md5_md5-only-on-client-ack.pkt +f:tools/testing/selftests/net/packetdrill/tcp_nagle_https_client.pkt +f:tools/testing/selftests/net/packetdrill/tcp_nagle_sendmsg_msg_more.pkt +f:tools/testing/selftests/net/packetdrill/tcp_nagle_sockopt_cork_nodelay.pkt +f:tools/testing/selftests/net/packetdrill/tcp_ooo-before-and-after-accept.pkt +f:tools/testing/selftests/net/packetdrill/tcp_ooo_rcv_mss.pkt +f:tools/testing/selftests/net/packetdrill/tcp_rcv_big_endseq.pkt +f:tools/testing/selftests/net/packetdrill/tcp_rcv_toobig.pkt +f:tools/testing/selftests/net/packetdrill/tcp_sack_sack-route-refresh-ip-tos.pkt +f:tools/testing/selftests/net/packetdrill/tcp_sack_sack-shift-sacked-2-6-8-3-9-nofack.pkt +f:tools/testing/selftests/net/packetdrill/tcp_sack_sack-shift-sacked-7-3-4-8-9-fack.pkt +f:tools/testing/selftests/net/packetdrill/tcp_sack_sack-shift-sacked-7-5-6-8-9-fack.pkt +f:tools/testing/selftests/net/packetdrill/tcp_sendfile_sendfile-simple.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-ack-per-1pkt.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-ack-per-2pkt-send-5pkt.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-ack-per-2pkt-send-6pkt.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-ack-per-2pkt.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-ack-per-4pkt.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-after-idle.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-after-win-update.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-app-limited-9-packets-out.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-app-limited.pkt +f:tools/testing/selftests/net/packetdrill/tcp_slow_start_slow-start-fq-ack-per-2pkt.pkt +f:tools/testing/selftests/net/packetdrill/tcp_splice_tcp_splice_loop_test.pkt +f:tools/testing/selftests/net/packetdrill/tcp_syscall_bad_arg_fastopen-invalid-buf-ptr.pkt +f:tools/testing/selftests/net/packetdrill/tcp_syscall_bad_arg_sendmsg-empty-iov.pkt +f:tools/testing/selftests/net/packetdrill/tcp_syscall_bad_arg_syscall-invalid-buf-ptr.pkt +f:tools/testing/selftests/net/packetdrill/tcp_tcp_info_tcp-info-last_data_recv.pkt +f:tools/testing/selftests/net/packetdrill/tcp_tcp_info_tcp-info-rwnd-limited.pkt +f:tools/testing/selftests/net/packetdrill/tcp_tcp_info_tcp-info-sndbuf-limited.pkt +f:tools/testing/selftests/net/packetdrill/tcp_timestamping_client-only-last-byte.pkt +f:tools/testing/selftests/net/packetdrill/tcp_timestamping_partial.pkt +f:tools/testing/selftests/net/packetdrill/tcp_timestamping_server.pkt +f:tools/testing/selftests/net/packetdrill/tcp_ts_recent_fin_tsval.pkt +f:tools/testing/selftests/net/packetdrill/tcp_ts_recent_invalid_ack.pkt +f:tools/testing/selftests/net/packetdrill/tcp_ts_recent_reset_tsval.pkt +f:tools/testing/selftests/net/packetdrill/tcp_user_timeout_user-timeout-probe.pkt +f:tools/testing/selftests/net/packetdrill/tcp_user_timeout_user_timeout.pkt +f:tools/testing/selftests/net/packetdrill/tcp_validate_validate-established-no-flags.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_basic.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_batch.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_client.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_closed.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_epoll_edge.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_epoll_exclusive.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_epoll_oneshot.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_fastopen-client.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_fastopen-server.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_maxfrags.pkt +f:tools/testing/selftests/net/packetdrill/tcp_zerocopy_small.pkt +f:tools/testing/selftests/net/pmtu.sh +f:tools/testing/selftests/net/proc_net_pktgen.c +f:tools/testing/selftests/net/psock_fanout.c +f:tools/testing/selftests/net/psock_lib.h +f:tools/testing/selftests/net/psock_snd.c +f:tools/testing/selftests/net/psock_snd.sh +f:tools/testing/selftests/net/psock_tpacket.c +f:tools/testing/selftests/net/rds/.gitignore +f:tools/testing/selftests/net/rds/Makefile +f:tools/testing/selftests/net/rds/README.txt +f:tools/testing/selftests/net/rds/config.sh +f:tools/testing/selftests/net/rds/run.sh +f:tools/testing/selftests/net/rds/test.py +f:tools/testing/selftests/net/reuseaddr_conflict.c +f:tools/testing/selftests/net/reuseaddr_ports_exhausted.c +f:tools/testing/selftests/net/reuseaddr_ports_exhausted.sh +f:tools/testing/selftests/net/reuseport_addr_any.c +f:tools/testing/selftests/net/reuseport_addr_any.sh +f:tools/testing/selftests/net/reuseport_bpf.c +f:tools/testing/selftests/net/reuseport_bpf_cpu.c +f:tools/testing/selftests/net/reuseport_bpf_numa.c +f:tools/testing/selftests/net/reuseport_dualstack.c +f:tools/testing/selftests/net/route_localnet.sh +f:tools/testing/selftests/net/rps_default_mask.sh +f:tools/testing/selftests/net/rtnetlink.py +f:tools/testing/selftests/net/rtnetlink.sh +f:tools/testing/selftests/net/rtnetlink_notification.sh +f:tools/testing/selftests/net/run_afpackettests +f:tools/testing/selftests/net/run_netsocktests +f:tools/testing/selftests/net/rxtimestamp.c +f:tools/testing/selftests/net/rxtimestamp.sh +f:tools/testing/selftests/net/sample_map_ret0.bpf.c +f:tools/testing/selftests/net/sample_ret0.bpf.c +f:tools/testing/selftests/net/sctp_hello.c +f:tools/testing/selftests/net/sctp_vrf.sh +f:tools/testing/selftests/net/settings +f:tools/testing/selftests/net/setup_loopback.sh +f:tools/testing/selftests/net/setup_veth.sh +f:tools/testing/selftests/net/sk_bind_sendto_listen.c +f:tools/testing/selftests/net/sk_connect_zero_addr.c +f:tools/testing/selftests/net/sk_so_peek_off.c +f:tools/testing/selftests/net/skf_net_off.c +f:tools/testing/selftests/net/skf_net_off.sh +f:tools/testing/selftests/net/so_incoming_cpu.c +f:tools/testing/selftests/net/so_netns_cookie.c +f:tools/testing/selftests/net/so_rcv_listener.c +f:tools/testing/selftests/net/so_txtime.c +f:tools/testing/selftests/net/so_txtime.sh +f:tools/testing/selftests/net/socket.c +f:tools/testing/selftests/net/srv6_end_dt46_l3vpn_test.sh +f:tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh +f:tools/testing/selftests/net/srv6_end_dt6_l3vpn_test.sh +f:tools/testing/selftests/net/srv6_end_dx4_netfilter_test.sh +f:tools/testing/selftests/net/srv6_end_dx6_netfilter_test.sh +f:tools/testing/selftests/net/srv6_end_flavors_test.sh +f:tools/testing/selftests/net/srv6_end_next_csid_l3vpn_test.sh +f:tools/testing/selftests/net/srv6_end_x_next_csid_l3vpn_test.sh +f:tools/testing/selftests/net/srv6_hencap_red_l3vpn_test.sh +f:tools/testing/selftests/net/srv6_hl2encap_red_l2vpn_test.sh +f:tools/testing/selftests/net/stress_reuseport_listen.c +f:tools/testing/selftests/net/stress_reuseport_listen.sh +f:tools/testing/selftests/net/tap.c +f:tools/testing/selftests/net/tcp_ao/.gitignore +f:tools/testing/selftests/net/tcp_ao/Makefile +f:tools/testing/selftests/net/tcp_ao/bench-lookups.c +f:tools/testing/selftests/net/tcp_ao/config +f:tools/testing/selftests/net/tcp_ao/connect-deny.c +f:tools/testing/selftests/net/tcp_ao/connect.c +f:tools/testing/selftests/net/tcp_ao/icmps-discard.c +f:tools/testing/selftests/net/tcp_ao/key-management.c +f:tools/testing/selftests/net/tcp_ao/lib/aolib.h +f:tools/testing/selftests/net/tcp_ao/lib/ftrace-tcp.c +f:tools/testing/selftests/net/tcp_ao/lib/ftrace.c +f:tools/testing/selftests/net/tcp_ao/lib/kconfig.c +f:tools/testing/selftests/net/tcp_ao/lib/netlink.c +f:tools/testing/selftests/net/tcp_ao/lib/proc.c +f:tools/testing/selftests/net/tcp_ao/lib/repair.c +f:tools/testing/selftests/net/tcp_ao/lib/setup.c +f:tools/testing/selftests/net/tcp_ao/lib/sock.c +f:tools/testing/selftests/net/tcp_ao/lib/utils.c +f:tools/testing/selftests/net/tcp_ao/restore.c +f:tools/testing/selftests/net/tcp_ao/rst.c +f:tools/testing/selftests/net/tcp_ao/self-connect.c +f:tools/testing/selftests/net/tcp_ao/seq-ext.c +f:tools/testing/selftests/net/tcp_ao/setsockopt-closed.c +f:tools/testing/selftests/net/tcp_ao/settings +f:tools/testing/selftests/net/tcp_ao/unsigned-md5.c +f:tools/testing/selftests/net/tcp_fastopen_backup_key.c +f:tools/testing/selftests/net/tcp_fastopen_backup_key.sh +f:tools/testing/selftests/net/tcp_inq.c +f:tools/testing/selftests/net/tcp_mmap.c +f:tools/testing/selftests/net/test_bpf.sh +f:tools/testing/selftests/net/test_bridge_backup_port.sh +f:tools/testing/selftests/net/test_bridge_neigh_suppress.sh +f:tools/testing/selftests/net/test_ingress_egress_chaining.sh +f:tools/testing/selftests/net/test_neigh.sh +f:tools/testing/selftests/net/test_so_rcv.sh +f:tools/testing/selftests/net/test_vxlan_fdb_changelink.sh +f:tools/testing/selftests/net/test_vxlan_mdb.sh +f:tools/testing/selftests/net/test_vxlan_nolocalbypass.sh +f:tools/testing/selftests/net/test_vxlan_under_vrf.sh +f:tools/testing/selftests/net/test_vxlan_vnifiltering.sh +f:tools/testing/selftests/net/tfo.c +f:tools/testing/selftests/net/tfo_passive.sh +f:tools/testing/selftests/net/timestamping.c +f:tools/testing/selftests/net/tls.c +f:tools/testing/selftests/net/toeplitz.c +f:tools/testing/selftests/net/toeplitz.sh +f:tools/testing/selftests/net/toeplitz_client.sh +f:tools/testing/selftests/net/traceroute.sh +f:tools/testing/selftests/net/tun.c +f:tools/testing/selftests/net/txring_overwrite.c +f:tools/testing/selftests/net/txtimestamp.c +f:tools/testing/selftests/net/txtimestamp.sh +f:tools/testing/selftests/net/udpgro.sh +f:tools/testing/selftests/net/udpgro_bench.sh +f:tools/testing/selftests/net/udpgro_frglist.sh +f:tools/testing/selftests/net/udpgro_fwd.sh +f:tools/testing/selftests/net/udpgso.c +f:tools/testing/selftests/net/udpgso.sh +f:tools/testing/selftests/net/udpgso_bench.sh +f:tools/testing/selftests/net/udpgso_bench_rx.c +f:tools/testing/selftests/net/udpgso_bench_tx.c +f:tools/testing/selftests/net/unicast_extensions.sh +f:tools/testing/selftests/net/veth.sh +f:tools/testing/selftests/net/vlan_bridge_binding.sh +f:tools/testing/selftests/net/vlan_hw_filter.sh +f:tools/testing/selftests/net/vrf-xfrm-tests.sh +f:tools/testing/selftests/net/vrf_route_leaking.sh +f:tools/testing/selftests/net/vrf_strict_mode_test.sh +f:tools/testing/selftests/net/xfrm_policy.sh +f:tools/testing/selftests/net/xfrm_policy_add_speed.sh +f:tools/testing/selftests/net/ynl.mk +f:tools/testing/selftests/nolibc/.gitignore +f:tools/testing/selftests/nolibc/Makefile +f:tools/testing/selftests/nolibc/Makefile.include +f:tools/testing/selftests/nolibc/Makefile.nolibc +f:tools/testing/selftests/nolibc/nolibc-test-linkage.c +f:tools/testing/selftests/nolibc/nolibc-test-linkage.h +f:tools/testing/selftests/nolibc/nolibc-test.c +f:tools/testing/selftests/nolibc/run-tests.sh +f:tools/testing/selftests/ntb/ntb_test.sh +f:tools/testing/selftests/openat2/.gitignore +f:tools/testing/selftests/openat2/Makefile +f:tools/testing/selftests/openat2/helpers.c +f:tools/testing/selftests/openat2/helpers.h +f:tools/testing/selftests/openat2/openat2_test.c +f:tools/testing/selftests/openat2/rename_attack_test.c +f:tools/testing/selftests/openat2/resolve_test.c +f:tools/testing/selftests/pci_endpoint/.gitignore +f:tools/testing/selftests/pci_endpoint/Makefile +f:tools/testing/selftests/pci_endpoint/config +f:tools/testing/selftests/pci_endpoint/pci_endpoint_test.c +f:tools/testing/selftests/pcie_bwctrl/Makefile +f:tools/testing/selftests/pcie_bwctrl/set_pcie_cooling_state.sh +f:tools/testing/selftests/pcie_bwctrl/set_pcie_speed.sh +f:tools/testing/selftests/perf_events/.gitignore +f:tools/testing/selftests/perf_events/Makefile +f:tools/testing/selftests/perf_events/config +f:tools/testing/selftests/perf_events/remove_on_exec.c +f:tools/testing/selftests/perf_events/settings +f:tools/testing/selftests/perf_events/sigtrap_threads.c +f:tools/testing/selftests/perf_events/watermark_signal.c +f:tools/testing/selftests/pid_namespace/.gitignore +f:tools/testing/selftests/pid_namespace/Makefile +f:tools/testing/selftests/pid_namespace/config +f:tools/testing/selftests/pid_namespace/pid_max.c +f:tools/testing/selftests/pid_namespace/regression_enomem.c +f:tools/testing/selftests/pidfd/.gitignore +f:tools/testing/selftests/pidfd/Makefile +f:tools/testing/selftests/pidfd/config +f:tools/testing/selftests/pidfd/pidfd.h +f:tools/testing/selftests/pidfd/pidfd_bind_mount.c +f:tools/testing/selftests/pidfd/pidfd_exec_helper.c +f:tools/testing/selftests/pidfd/pidfd_fdinfo_test.c +f:tools/testing/selftests/pidfd/pidfd_file_handle_test.c +f:tools/testing/selftests/pidfd/pidfd_getfd_test.c +f:tools/testing/selftests/pidfd/pidfd_info_test.c +f:tools/testing/selftests/pidfd/pidfd_open_test.c +f:tools/testing/selftests/pidfd/pidfd_poll_test.c +f:tools/testing/selftests/pidfd/pidfd_setattr_test.c +f:tools/testing/selftests/pidfd/pidfd_setns_test.c +f:tools/testing/selftests/pidfd/pidfd_test.c +f:tools/testing/selftests/pidfd/pidfd_wait.c +f:tools/testing/selftests/pidfd/pidfd_xattr_test.c +f:tools/testing/selftests/power_supply/Makefile +f:tools/testing/selftests/power_supply/helpers.sh +f:tools/testing/selftests/power_supply/test_power_supply_properties.sh +f:tools/testing/selftests/powerpc/Makefile +f:tools/testing/selftests/powerpc/alignment/.gitignore +f:tools/testing/selftests/powerpc/alignment/Makefile +f:tools/testing/selftests/powerpc/alignment/alignment_handler.c +f:tools/testing/selftests/powerpc/alignment/copy_first_unaligned.c +f:tools/testing/selftests/powerpc/alignment/settings +f:tools/testing/selftests/powerpc/benchmarks/.gitignore +f:tools/testing/selftests/powerpc/benchmarks/Makefile +f:tools/testing/selftests/powerpc/benchmarks/context_switch.c +f:tools/testing/selftests/powerpc/benchmarks/exec_target.c +f:tools/testing/selftests/powerpc/benchmarks/fork.c +f:tools/testing/selftests/powerpc/benchmarks/futex_bench.c +f:tools/testing/selftests/powerpc/benchmarks/gettimeofday.c +f:tools/testing/selftests/powerpc/benchmarks/mmap_bench.c +f:tools/testing/selftests/powerpc/benchmarks/null_syscall.c +f:tools/testing/selftests/powerpc/benchmarks/settings +f:tools/testing/selftests/powerpc/cache_shape/.gitignore +f:tools/testing/selftests/powerpc/cache_shape/Makefile +f:tools/testing/selftests/powerpc/cache_shape/cache_shape.c +f:tools/testing/selftests/powerpc/cache_shape/settings +f:tools/testing/selftests/powerpc/copyloops/.gitignore +f:tools/testing/selftests/powerpc/copyloops/Makefile +f:tools/testing/selftests/powerpc/copyloops/asm/asm-compat.h +f:tools/testing/selftests/powerpc/copyloops/asm/feature-fixups.h +f:tools/testing/selftests/powerpc/copyloops/asm/kasan.h +f:tools/testing/selftests/powerpc/copyloops/asm/ppc_asm.h +f:tools/testing/selftests/powerpc/copyloops/asm/processor.h +f:tools/testing/selftests/powerpc/copyloops/copy_tofrom_user_reference.S +f:tools/testing/selftests/powerpc/copyloops/exc_validate.c +f:tools/testing/selftests/powerpc/copyloops/linux/export.h +f:tools/testing/selftests/powerpc/copyloops/memcpy_stubs.S +f:tools/testing/selftests/powerpc/copyloops/memmove_validate.c +f:tools/testing/selftests/powerpc/copyloops/settings +f:tools/testing/selftests/powerpc/copyloops/stubs.S +f:tools/testing/selftests/powerpc/copyloops/validate.c +f:tools/testing/selftests/powerpc/dexcr/.gitignore +f:tools/testing/selftests/powerpc/dexcr/Makefile +f:tools/testing/selftests/powerpc/dexcr/chdexcr.c +f:tools/testing/selftests/powerpc/dexcr/dexcr.c +f:tools/testing/selftests/powerpc/dexcr/dexcr.h +f:tools/testing/selftests/powerpc/dexcr/dexcr_test.c +f:tools/testing/selftests/powerpc/dexcr/hashchk_test.c +f:tools/testing/selftests/powerpc/dexcr/lsdexcr.c +f:tools/testing/selftests/powerpc/dexcr/settings +f:tools/testing/selftests/powerpc/dscr/.gitignore +f:tools/testing/selftests/powerpc/dscr/Makefile +f:tools/testing/selftests/powerpc/dscr/dscr.h +f:tools/testing/selftests/powerpc/dscr/dscr_default_test.c +f:tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c +f:tools/testing/selftests/powerpc/dscr/dscr_inherit_exec_test.c +f:tools/testing/selftests/powerpc/dscr/dscr_inherit_test.c +f:tools/testing/selftests/powerpc/dscr/dscr_sysfs_test.c +f:tools/testing/selftests/powerpc/dscr/dscr_sysfs_thread_test.c +f:tools/testing/selftests/powerpc/dscr/dscr_user_test.c +f:tools/testing/selftests/powerpc/dscr/settings +f:tools/testing/selftests/powerpc/eeh/Makefile +f:tools/testing/selftests/powerpc/eeh/eeh-basic.sh +f:tools/testing/selftests/powerpc/eeh/eeh-functions.sh +f:tools/testing/selftests/powerpc/eeh/eeh-vf-aware.sh +f:tools/testing/selftests/powerpc/eeh/eeh-vf-unaware.sh +f:tools/testing/selftests/powerpc/eeh/settings +f:tools/testing/selftests/powerpc/flags.mk +f:tools/testing/selftests/powerpc/harness.c +f:tools/testing/selftests/powerpc/include/basic_asm.h +f:tools/testing/selftests/powerpc/include/fpu_asm.h +f:tools/testing/selftests/powerpc/include/gpr_asm.h +f:tools/testing/selftests/powerpc/include/instructions.h +f:tools/testing/selftests/powerpc/include/pkeys.h +f:tools/testing/selftests/powerpc/include/reg.h +f:tools/testing/selftests/powerpc/include/subunit.h +f:tools/testing/selftests/powerpc/include/utils.h +f:tools/testing/selftests/powerpc/include/vmx_asm.h +f:tools/testing/selftests/powerpc/include/vsx_asm.h +f:tools/testing/selftests/powerpc/lib/reg.S +f:tools/testing/selftests/powerpc/lib/settings +f:tools/testing/selftests/powerpc/math/.gitignore +f:tools/testing/selftests/powerpc/math/Makefile +f:tools/testing/selftests/powerpc/math/fpu.h +f:tools/testing/selftests/powerpc/math/fpu_asm.S +f:tools/testing/selftests/powerpc/math/fpu_denormal.c +f:tools/testing/selftests/powerpc/math/fpu_preempt.c +f:tools/testing/selftests/powerpc/math/fpu_signal.c +f:tools/testing/selftests/powerpc/math/fpu_syscall.c +f:tools/testing/selftests/powerpc/math/mma.S +f:tools/testing/selftests/powerpc/math/mma.c +f:tools/testing/selftests/powerpc/math/settings +f:tools/testing/selftests/powerpc/math/vmx_asm.S +f:tools/testing/selftests/powerpc/math/vmx_preempt.c +f:tools/testing/selftests/powerpc/math/vmx_signal.c +f:tools/testing/selftests/powerpc/math/vmx_syscall.c +f:tools/testing/selftests/powerpc/math/vsx_asm.S +f:tools/testing/selftests/powerpc/math/vsx_preempt.c +f:tools/testing/selftests/powerpc/mce/.gitignore +f:tools/testing/selftests/powerpc/mce/Makefile +f:tools/testing/selftests/powerpc/mce/inject-ra-err.c +f:tools/testing/selftests/powerpc/mce/settings +f:tools/testing/selftests/powerpc/mm/.gitignore +f:tools/testing/selftests/powerpc/mm/Makefile +f:tools/testing/selftests/powerpc/mm/bad_accesses.c +f:tools/testing/selftests/powerpc/mm/exec_prot.c +f:tools/testing/selftests/powerpc/mm/hugetlb_vs_thp_test.c +f:tools/testing/selftests/powerpc/mm/large_vm_fork_separation.c +f:tools/testing/selftests/powerpc/mm/large_vm_gpr_corruption.c +f:tools/testing/selftests/powerpc/mm/pkey_exec_prot.c +f:tools/testing/selftests/powerpc/mm/pkey_siginfo.c +f:tools/testing/selftests/powerpc/mm/prot_sao.c +f:tools/testing/selftests/powerpc/mm/segv_errors.c +f:tools/testing/selftests/powerpc/mm/settings +f:tools/testing/selftests/powerpc/mm/stack_expansion_ldst.c +f:tools/testing/selftests/powerpc/mm/stack_expansion_signal.c +f:tools/testing/selftests/powerpc/mm/stress_code_patching.sh +f:tools/testing/selftests/powerpc/mm/subpage_prot.c +f:tools/testing/selftests/powerpc/mm/tlbie_test.c +f:tools/testing/selftests/powerpc/mm/wild_bctr.c +f:tools/testing/selftests/powerpc/nx-gzip/.gitignore +f:tools/testing/selftests/powerpc/nx-gzip/99-nx-gzip.rules +f:tools/testing/selftests/powerpc/nx-gzip/Makefile +f:tools/testing/selftests/powerpc/nx-gzip/README +f:tools/testing/selftests/powerpc/nx-gzip/gunz_test.c +f:tools/testing/selftests/powerpc/nx-gzip/gzfht_test.c +f:tools/testing/selftests/powerpc/nx-gzip/gzip_vas.c +f:tools/testing/selftests/powerpc/nx-gzip/include/copy-paste.h +f:tools/testing/selftests/powerpc/nx-gzip/include/crb.h +f:tools/testing/selftests/powerpc/nx-gzip/include/nx.h +f:tools/testing/selftests/powerpc/nx-gzip/include/nx_dbg.h +f:tools/testing/selftests/powerpc/nx-gzip/include/nxu.h +f:tools/testing/selftests/powerpc/nx-gzip/nx-gzip-test.sh +f:tools/testing/selftests/powerpc/nx-gzip/settings +f:tools/testing/selftests/powerpc/papr_attributes/.gitignore +f:tools/testing/selftests/powerpc/papr_attributes/Makefile +f:tools/testing/selftests/powerpc/papr_attributes/attr_test.c +f:tools/testing/selftests/powerpc/papr_attributes/settings +f:tools/testing/selftests/powerpc/papr_sysparm/.gitignore +f:tools/testing/selftests/powerpc/papr_sysparm/Makefile +f:tools/testing/selftests/powerpc/papr_sysparm/papr_sysparm.c +f:tools/testing/selftests/powerpc/papr_sysparm/settings +f:tools/testing/selftests/powerpc/papr_vpd/.gitignore +f:tools/testing/selftests/powerpc/papr_vpd/Makefile +f:tools/testing/selftests/powerpc/papr_vpd/papr_vpd.c +f:tools/testing/selftests/powerpc/papr_vpd/settings +f:tools/testing/selftests/powerpc/pmu/.gitignore +f:tools/testing/selftests/powerpc/pmu/Makefile +f:tools/testing/selftests/powerpc/pmu/branch_loops.S +f:tools/testing/selftests/powerpc/pmu/count_instructions.c +f:tools/testing/selftests/powerpc/pmu/count_stcx_fail.c +f:tools/testing/selftests/powerpc/pmu/ebb/.gitignore +f:tools/testing/selftests/powerpc/pmu/ebb/Makefile +f:tools/testing/selftests/powerpc/pmu/ebb/back_to_back_ebbs_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/busy_loop.S +f:tools/testing/selftests/powerpc/pmu/ebb/close_clears_pmcc_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/cpu_event_pinned_vs_ebb_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/cpu_event_vs_ebb_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/cycles_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/cycles_with_freeze_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/cycles_with_mmcr2_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/ebb.c +f:tools/testing/selftests/powerpc/pmu/ebb/ebb.h +f:tools/testing/selftests/powerpc/pmu/ebb/ebb_handler.S +f:tools/testing/selftests/powerpc/pmu/ebb/ebb_on_child_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/ebb_on_willing_child_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/ebb_vs_cpu_event_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/event_attributes_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/fork_cleanup_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/instruction_count_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/lost_exception_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/multi_counter_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/multi_ebb_procs_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/pmae_handling_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/pmc56_overflow_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/reg_access_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/regs_access_pmccext_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/task_event_pinned_vs_ebb_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/task_event_vs_ebb_test.c +f:tools/testing/selftests/powerpc/pmu/ebb/trace.c +f:tools/testing/selftests/powerpc/pmu/ebb/trace.h +f:tools/testing/selftests/powerpc/pmu/event.c +f:tools/testing/selftests/powerpc/pmu/event.h +f:tools/testing/selftests/powerpc/pmu/event_code_tests/.gitignore +f:tools/testing/selftests/powerpc/pmu/event_code_tests/Makefile +f:tools/testing/selftests/powerpc/pmu/event_code_tests/blacklisted_events_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/event_alternatives_tests_p10.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/event_alternatives_tests_p9.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/generic_events_valid_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_cache_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_l2l3_sel_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_mmcra_sample_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_pmc56_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_pmc_count_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_radix_scope_qual_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_repeat_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_thresh_cmp_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_thresh_ctl_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_thresh_sel_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_constraint_unit_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/group_pmc56_exclude_constraints_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/hw_cache_event_type_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/invalid_event_code_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/reserved_bits_mmcra_sample_elig_mode_test.c +f:tools/testing/selftests/powerpc/pmu/event_code_tests/reserved_bits_mmcra_thresh_ctl_test.c +f:tools/testing/selftests/powerpc/pmu/l3_bank_test.c +f:tools/testing/selftests/powerpc/pmu/lib.c +f:tools/testing/selftests/powerpc/pmu/lib.h +f:tools/testing/selftests/powerpc/pmu/loop.S +f:tools/testing/selftests/powerpc/pmu/per_event_excludes.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/.gitignore +f:tools/testing/selftests/powerpc/pmu/sampling_tests/Makefile +f:tools/testing/selftests/powerpc/pmu/sampling_tests/bhrb_filter_map_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/bhrb_no_crash_wo_pmu_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/check_extended_reg_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/intr_regs_no_crash_wo_pmu_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/misc.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/misc.h +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr0_cc56run_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr0_exceptionbits_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr0_fc56_pmc1ce_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr0_fc56_pmc56_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr0_pmccext_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr0_pmcjce_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr1_comb_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr1_sel_unit_cache_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr2_fcs_fch_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr2_l2l3_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr3_src_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcra_bhrb_any_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcra_bhrb_cond_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcra_bhrb_disable_no_branch_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcra_bhrb_disable_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcra_bhrb_ind_call_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcra_thresh_cmp_test.c +f:tools/testing/selftests/powerpc/pmu/sampling_tests/mmcra_thresh_marked_sample_test.c +f:tools/testing/selftests/powerpc/pmu/settings +f:tools/testing/selftests/powerpc/primitives/.gitignore +f:tools/testing/selftests/powerpc/primitives/Makefile +f:tools/testing/selftests/powerpc/primitives/asm/firmware.h +f:tools/testing/selftests/powerpc/primitives/asm/ppc-opcode.h +f:tools/testing/selftests/powerpc/primitives/asm/processor.h +f:tools/testing/selftests/powerpc/primitives/linux/bitops.h +f:tools/testing/selftests/powerpc/primitives/linux/stringify.h +f:tools/testing/selftests/powerpc/primitives/load_unaligned_zeropad.c +f:tools/testing/selftests/powerpc/primitives/settings +f:tools/testing/selftests/powerpc/ptrace/.gitignore +f:tools/testing/selftests/powerpc/ptrace/Makefile +f:tools/testing/selftests/powerpc/ptrace/child.h +f:tools/testing/selftests/powerpc/ptrace/core-pkey.c +f:tools/testing/selftests/powerpc/ptrace/perf-hwbreak.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-gpr.S +f:tools/testing/selftests/powerpc/ptrace/ptrace-gpr.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-gpr.h +f:tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-perf-asm.S +f:tools/testing/selftests/powerpc/ptrace/ptrace-perf-hwbreak.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-pkey.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-syscall.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-tar.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-tar.h +f:tools/testing/selftests/powerpc/ptrace/ptrace-tm-gpr.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-gpr.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-vsx.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-tm-spr.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-tm-tar.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-tm-vsx.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-vsx.c +f:tools/testing/selftests/powerpc/ptrace/ptrace-vsx.h +f:tools/testing/selftests/powerpc/ptrace/ptrace.h +f:tools/testing/selftests/powerpc/ptrace/settings +f:tools/testing/selftests/powerpc/scripts/hmi.sh +f:tools/testing/selftests/powerpc/scripts/settings +f:tools/testing/selftests/powerpc/security/.gitignore +f:tools/testing/selftests/powerpc/security/Makefile +f:tools/testing/selftests/powerpc/security/branch_loops.S +f:tools/testing/selftests/powerpc/security/entry_flush.c +f:tools/testing/selftests/powerpc/security/flush_utils.c +f:tools/testing/selftests/powerpc/security/flush_utils.h +f:tools/testing/selftests/powerpc/security/mitigation-patching.sh +f:tools/testing/selftests/powerpc/security/rfi_flush.c +f:tools/testing/selftests/powerpc/security/settings +f:tools/testing/selftests/powerpc/security/spectre_v2.c +f:tools/testing/selftests/powerpc/security/uaccess_flush.c +f:tools/testing/selftests/powerpc/signal/.gitignore +f:tools/testing/selftests/powerpc/signal/Makefile +f:tools/testing/selftests/powerpc/signal/settings +f:tools/testing/selftests/powerpc/signal/sig_sc_double_restart.c +f:tools/testing/selftests/powerpc/signal/sigfuz.c +f:tools/testing/selftests/powerpc/signal/signal.S +f:tools/testing/selftests/powerpc/signal/signal.c +f:tools/testing/selftests/powerpc/signal/signal_tm.c +f:tools/testing/selftests/powerpc/signal/sigreturn_kernel.c +f:tools/testing/selftests/powerpc/signal/sigreturn_unaligned.c +f:tools/testing/selftests/powerpc/signal/sigreturn_vdso.c +f:tools/testing/selftests/powerpc/stringloops/.gitignore +f:tools/testing/selftests/powerpc/stringloops/Makefile +f:tools/testing/selftests/powerpc/stringloops/asm/cache.h +f:tools/testing/selftests/powerpc/stringloops/asm/ppc-opcode.h +f:tools/testing/selftests/powerpc/stringloops/asm/ppc_asm.h +f:tools/testing/selftests/powerpc/stringloops/linux/export.h +f:tools/testing/selftests/powerpc/stringloops/memcmp.c +f:tools/testing/selftests/powerpc/stringloops/settings +f:tools/testing/selftests/powerpc/stringloops/string.c +f:tools/testing/selftests/powerpc/stringloops/strlen.c +f:tools/testing/selftests/powerpc/switch_endian/.gitignore +f:tools/testing/selftests/powerpc/switch_endian/Makefile +f:tools/testing/selftests/powerpc/switch_endian/check.S +f:tools/testing/selftests/powerpc/switch_endian/common.h +f:tools/testing/selftests/powerpc/switch_endian/settings +f:tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S +f:tools/testing/selftests/powerpc/syscalls/.gitignore +f:tools/testing/selftests/powerpc/syscalls/Makefile +f:tools/testing/selftests/powerpc/syscalls/ipc.h +f:tools/testing/selftests/powerpc/syscalls/ipc_unmuxed.c +f:tools/testing/selftests/powerpc/syscalls/rtas_filter.c +f:tools/testing/selftests/powerpc/syscalls/settings +f:tools/testing/selftests/powerpc/tm/.gitignore +f:tools/testing/selftests/powerpc/tm/Makefile +f:tools/testing/selftests/powerpc/tm/settings +f:tools/testing/selftests/powerpc/tm/tm-exec.c +f:tools/testing/selftests/powerpc/tm/tm-fork.c +f:tools/testing/selftests/powerpc/tm/tm-poison.c +f:tools/testing/selftests/powerpc/tm/tm-resched-dscr.c +f:tools/testing/selftests/powerpc/tm/tm-signal-context-chk-fpu.c +f:tools/testing/selftests/powerpc/tm/tm-signal-context-chk-gpr.c +f:tools/testing/selftests/powerpc/tm/tm-signal-context-chk-vmx.c +f:tools/testing/selftests/powerpc/tm/tm-signal-context-chk-vsx.c +f:tools/testing/selftests/powerpc/tm/tm-signal-context-force-tm.c +f:tools/testing/selftests/powerpc/tm/tm-signal-msr-resv.c +f:tools/testing/selftests/powerpc/tm/tm-signal-pagefault.c +f:tools/testing/selftests/powerpc/tm/tm-signal-sigreturn-nt.c +f:tools/testing/selftests/powerpc/tm/tm-signal-stack.c +f:tools/testing/selftests/powerpc/tm/tm-signal.S +f:tools/testing/selftests/powerpc/tm/tm-sigreturn.c +f:tools/testing/selftests/powerpc/tm/tm-syscall-asm.S +f:tools/testing/selftests/powerpc/tm/tm-syscall.c +f:tools/testing/selftests/powerpc/tm/tm-tar.c +f:tools/testing/selftests/powerpc/tm/tm-tmspr.c +f:tools/testing/selftests/powerpc/tm/tm-trap.c +f:tools/testing/selftests/powerpc/tm/tm-unavailable.c +f:tools/testing/selftests/powerpc/tm/tm-vmx-unavail.c +f:tools/testing/selftests/powerpc/tm/tm-vmxcopy.c +f:tools/testing/selftests/powerpc/tm/tm.h +f:tools/testing/selftests/powerpc/utils.c +f:tools/testing/selftests/powerpc/vphn/.gitignore +f:tools/testing/selftests/powerpc/vphn/Makefile +f:tools/testing/selftests/powerpc/vphn/settings +f:tools/testing/selftests/powerpc/vphn/test-vphn.c +f:tools/testing/selftests/prctl/.gitignore +f:tools/testing/selftests/prctl/Makefile +f:tools/testing/selftests/prctl/config +f:tools/testing/selftests/prctl/disable-tsc-ctxt-sw-stress-test.c +f:tools/testing/selftests/prctl/disable-tsc-on-off-stress-test.c +f:tools/testing/selftests/prctl/disable-tsc-test.c +f:tools/testing/selftests/prctl/set-anon-vma-name-test.c +f:tools/testing/selftests/prctl/set-process-name.c +f:tools/testing/selftests/proc/.gitignore +f:tools/testing/selftests/proc/Makefile +f:tools/testing/selftests/proc/config +f:tools/testing/selftests/proc/fd-001-lookup.c +f:tools/testing/selftests/proc/fd-002-posix-eq.c +f:tools/testing/selftests/proc/fd-003-kthread.c +f:tools/testing/selftests/proc/proc-2-is-kthread.c +f:tools/testing/selftests/proc/proc-empty-vm.c +f:tools/testing/selftests/proc/proc-fsconfig-hidepid.c +f:tools/testing/selftests/proc/proc-loadavg-001.c +f:tools/testing/selftests/proc/proc-maps-race.c +f:tools/testing/selftests/proc/proc-multiple-procfs.c +f:tools/testing/selftests/proc/proc-pid-vm.c +f:tools/testing/selftests/proc/proc-self-isnt-kthread.c +f:tools/testing/selftests/proc/proc-self-map-files-001.c +f:tools/testing/selftests/proc/proc-self-map-files-002.c +f:tools/testing/selftests/proc/proc-self-syscall.c +f:tools/testing/selftests/proc/proc-self-wchan.c +f:tools/testing/selftests/proc/proc-subset-pid.c +f:tools/testing/selftests/proc/proc-tid0.c +f:tools/testing/selftests/proc/proc-uptime-001.c +f:tools/testing/selftests/proc/proc-uptime-002.c +f:tools/testing/selftests/proc/proc-uptime.h +f:tools/testing/selftests/proc/proc.h +f:tools/testing/selftests/proc/read.c +f:tools/testing/selftests/proc/self.c +f:tools/testing/selftests/proc/setns-dcache.c +f:tools/testing/selftests/proc/setns-sysvipc.c +f:tools/testing/selftests/proc/thread-self.c +f:tools/testing/selftests/pstore/.gitignore +f:tools/testing/selftests/pstore/Makefile +f:tools/testing/selftests/pstore/common_tests +f:tools/testing/selftests/pstore/config +f:tools/testing/selftests/pstore/pstore_crash_test +f:tools/testing/selftests/pstore/pstore_post_reboot_tests +f:tools/testing/selftests/pstore/pstore_tests +f:tools/testing/selftests/ptp/.gitignore +f:tools/testing/selftests/ptp/Makefile +f:tools/testing/selftests/ptp/phc.sh +f:tools/testing/selftests/ptp/ptpchmaskfmt.sh +f:tools/testing/selftests/ptp/testptp.c +f:tools/testing/selftests/ptp/testptp.mk +f:tools/testing/selftests/ptrace/.gitignore +f:tools/testing/selftests/ptrace/Makefile +f:tools/testing/selftests/ptrace/get_set_sud.c +f:tools/testing/selftests/ptrace/get_syscall_info.c +f:tools/testing/selftests/ptrace/peeksiginfo.c +f:tools/testing/selftests/ptrace/set_syscall_info.c +f:tools/testing/selftests/ptrace/vmaccess.c +f:tools/testing/selftests/rcutorture/.gitignore +f:tools/testing/selftests/rcutorture/Makefile +f:tools/testing/selftests/rcutorture/bin/config2csv.sh +f:tools/testing/selftests/rcutorture/bin/configNR_CPUS.sh +f:tools/testing/selftests/rcutorture/bin/config_override.sh +f:tools/testing/selftests/rcutorture/bin/configcheck.sh +f:tools/testing/selftests/rcutorture/bin/configinit.sh +f:tools/testing/selftests/rcutorture/bin/console-badness.sh +f:tools/testing/selftests/rcutorture/bin/cpus2use.sh +f:tools/testing/selftests/rcutorture/bin/functions.sh +f:tools/testing/selftests/rcutorture/bin/jitter.sh +f:tools/testing/selftests/rcutorture/bin/jitterstart.sh +f:tools/testing/selftests/rcutorture/bin/jitterstop.sh +f:tools/testing/selftests/rcutorture/bin/kcsan-collapse.sh +f:tools/testing/selftests/rcutorture/bin/kvm-again.sh +f:tools/testing/selftests/rcutorture/bin/kvm-assign-cpus.sh +f:tools/testing/selftests/rcutorture/bin/kvm-build.sh +f:tools/testing/selftests/rcutorture/bin/kvm-check-branches.sh +f:tools/testing/selftests/rcutorture/bin/kvm-end-run-stats.sh +f:tools/testing/selftests/rcutorture/bin/kvm-find-errors.sh +f:tools/testing/selftests/rcutorture/bin/kvm-get-cpus-script.sh +f:tools/testing/selftests/rcutorture/bin/kvm-recheck-lock.sh +f:tools/testing/selftests/rcutorture/bin/kvm-recheck-rcu.sh +f:tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuscale-ftrace.sh +f:tools/testing/selftests/rcutorture/bin/kvm-recheck-rcuscale.sh +f:tools/testing/selftests/rcutorture/bin/kvm-recheck-refscale.sh +f:tools/testing/selftests/rcutorture/bin/kvm-recheck-scf.sh +f:tools/testing/selftests/rcutorture/bin/kvm-recheck.sh +f:tools/testing/selftests/rcutorture/bin/kvm-remote-noreap.sh +f:tools/testing/selftests/rcutorture/bin/kvm-remote.sh +f:tools/testing/selftests/rcutorture/bin/kvm-test-1-run-batch.sh +f:tools/testing/selftests/rcutorture/bin/kvm-test-1-run-qemu.sh +f:tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh +f:tools/testing/selftests/rcutorture/bin/kvm-transform.sh +f:tools/testing/selftests/rcutorture/bin/kvm.sh +f:tools/testing/selftests/rcutorture/bin/mkinitrd.sh +f:tools/testing/selftests/rcutorture/bin/mktestid.sh +f:tools/testing/selftests/rcutorture/bin/parse-build.sh +f:tools/testing/selftests/rcutorture/bin/parse-console.sh +f:tools/testing/selftests/rcutorture/bin/srcu_lockdep.sh +f:tools/testing/selftests/rcutorture/bin/torture.sh +f:tools/testing/selftests/rcutorture/configs/lock/BUSTED +f:tools/testing/selftests/rcutorture/configs/lock/BUSTED.boot +f:tools/testing/selftests/rcutorture/configs/lock/CFLIST +f:tools/testing/selftests/rcutorture/configs/lock/CFcommon +f:tools/testing/selftests/rcutorture/configs/lock/LOCK01 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK02 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK02.boot +f:tools/testing/selftests/rcutorture/configs/lock/LOCK03 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK03.boot +f:tools/testing/selftests/rcutorture/configs/lock/LOCK04 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK04.boot +f:tools/testing/selftests/rcutorture/configs/lock/LOCK05 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK05.boot +f:tools/testing/selftests/rcutorture/configs/lock/LOCK06 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK06.boot +f:tools/testing/selftests/rcutorture/configs/lock/LOCK07 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK07.boot +f:tools/testing/selftests/rcutorture/configs/lock/LOCK08 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK08.boot +f:tools/testing/selftests/rcutorture/configs/lock/LOCK09 +f:tools/testing/selftests/rcutorture/configs/lock/LOCK09.boot +f:tools/testing/selftests/rcutorture/configs/lock/ver_functions.sh +f:tools/testing/selftests/rcutorture/configs/rcu/BUSTED +f:tools/testing/selftests/rcutorture/configs/rcu/BUSTED-BOOST +f:tools/testing/selftests/rcutorture/configs/rcu/BUSTED-BOOST.boot +f:tools/testing/selftests/rcutorture/configs/rcu/BUSTED.boot +f:tools/testing/selftests/rcutorture/configs/rcu/CFLIST +f:tools/testing/selftests/rcutorture/configs/rcu/CFcommon +f:tools/testing/selftests/rcutorture/configs/rcu/CFcommon.i686 +f:tools/testing/selftests/rcutorture/configs/rcu/CFcommon.ppc64le +f:tools/testing/selftests/rcutorture/configs/rcu/CFcommon.x86_64 +f:tools/testing/selftests/rcutorture/configs/rcu/RUDE01 +f:tools/testing/selftests/rcutorture/configs/rcu/RUDE01.boot +f:tools/testing/selftests/rcutorture/configs/rcu/SRCU-N +f:tools/testing/selftests/rcutorture/configs/rcu/SRCU-N.boot +f:tools/testing/selftests/rcutorture/configs/rcu/SRCU-P +f:tools/testing/selftests/rcutorture/configs/rcu/SRCU-P.boot +f:tools/testing/selftests/rcutorture/configs/rcu/SRCU-T +f:tools/testing/selftests/rcutorture/configs/rcu/SRCU-T.boot +f:tools/testing/selftests/rcutorture/configs/rcu/SRCU-U +f:tools/testing/selftests/rcutorture/configs/rcu/SRCU-U.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TASKS01 +f:tools/testing/selftests/rcutorture/configs/rcu/TASKS01.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TASKS02 +f:tools/testing/selftests/rcutorture/configs/rcu/TASKS02.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TASKS03 +f:tools/testing/selftests/rcutorture/configs/rcu/TASKS03.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TINY01 +f:tools/testing/selftests/rcutorture/configs/rcu/TINY02 +f:tools/testing/selftests/rcutorture/configs/rcu/TINY02.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TRACE01 +f:tools/testing/selftests/rcutorture/configs/rcu/TRACE01.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TRACE02 +f:tools/testing/selftests/rcutorture/configs/rcu/TRACE02.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE01 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE01.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE02 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE02.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE03 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE03.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE04 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE04.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE05 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE05.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE06 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE06.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE07 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE07.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE08 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE08.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TREE09 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE10 +f:tools/testing/selftests/rcutorture/configs/rcu/TREE10.boot +f:tools/testing/selftests/rcutorture/configs/rcu/TRIVIAL +f:tools/testing/selftests/rcutorture/configs/rcu/TRIVIAL.boot +f:tools/testing/selftests/rcutorture/configs/rcu/ver_functions.sh +f:tools/testing/selftests/rcutorture/configs/rcuscale/CFLIST +f:tools/testing/selftests/rcutorture/configs/rcuscale/CFcommon +f:tools/testing/selftests/rcutorture/configs/rcuscale/TINY +f:tools/testing/selftests/rcutorture/configs/rcuscale/TRACE01 +f:tools/testing/selftests/rcutorture/configs/rcuscale/TRACE01.boot +f:tools/testing/selftests/rcutorture/configs/rcuscale/TREE +f:tools/testing/selftests/rcutorture/configs/rcuscale/TREE54 +f:tools/testing/selftests/rcutorture/configs/rcuscale/ver_functions.sh +f:tools/testing/selftests/rcutorture/configs/refscale/CFLIST +f:tools/testing/selftests/rcutorture/configs/refscale/CFcommon +f:tools/testing/selftests/rcutorture/configs/refscale/NOPREEMPT +f:tools/testing/selftests/rcutorture/configs/refscale/PREEMPT +f:tools/testing/selftests/rcutorture/configs/refscale/TINY +f:tools/testing/selftests/rcutorture/configs/refscale/ver_functions.sh +f:tools/testing/selftests/rcutorture/configs/scf/CFLIST +f:tools/testing/selftests/rcutorture/configs/scf/CFcommon +f:tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT +f:tools/testing/selftests/rcutorture/configs/scf/NOPREEMPT.boot +f:tools/testing/selftests/rcutorture/configs/scf/PREEMPT +f:tools/testing/selftests/rcutorture/configs/scf/ver_functions.sh +f:tools/testing/selftests/rcutorture/doc/TINY_RCU.txt +f:tools/testing/selftests/rcutorture/doc/TREE_RCU-kconfig.txt +f:tools/testing/selftests/rcutorture/doc/initrd.txt +f:tools/testing/selftests/rcutorture/doc/rcu-test-image.txt +f:tools/testing/selftests/resctrl/.gitignore +f:tools/testing/selftests/resctrl/Makefile +f:tools/testing/selftests/resctrl/README +f:tools/testing/selftests/resctrl/cache.c +f:tools/testing/selftests/resctrl/cat_test.c +f:tools/testing/selftests/resctrl/cmt_test.c +f:tools/testing/selftests/resctrl/config +f:tools/testing/selftests/resctrl/fill_buf.c +f:tools/testing/selftests/resctrl/mba_test.c +f:tools/testing/selftests/resctrl/mbm_test.c +f:tools/testing/selftests/resctrl/resctrl.h +f:tools/testing/selftests/resctrl/resctrl_tests.c +f:tools/testing/selftests/resctrl/resctrl_val.c +f:tools/testing/selftests/resctrl/resctrlfs.c +f:tools/testing/selftests/resctrl/settings +f:tools/testing/selftests/ring-buffer/.gitignore +f:tools/testing/selftests/ring-buffer/Makefile +f:tools/testing/selftests/ring-buffer/config +f:tools/testing/selftests/ring-buffer/map_test.c +f:tools/testing/selftests/riscv/Makefile +f:tools/testing/selftests/riscv/abi/.gitignore +f:tools/testing/selftests/riscv/abi/Makefile +f:tools/testing/selftests/riscv/abi/pointer_masking.c +f:tools/testing/selftests/riscv/hwprobe/.gitignore +f:tools/testing/selftests/riscv/hwprobe/Makefile +f:tools/testing/selftests/riscv/hwprobe/cbo.c +f:tools/testing/selftests/riscv/hwprobe/hwprobe.c +f:tools/testing/selftests/riscv/hwprobe/hwprobe.h +f:tools/testing/selftests/riscv/hwprobe/sys_hwprobe.S +f:tools/testing/selftests/riscv/hwprobe/which-cpus.c +f:tools/testing/selftests/riscv/mm/.gitignore +f:tools/testing/selftests/riscv/mm/Makefile +f:tools/testing/selftests/riscv/mm/mmap_bottomup.c +f:tools/testing/selftests/riscv/mm/mmap_default.c +f:tools/testing/selftests/riscv/mm/mmap_test.h +f:tools/testing/selftests/riscv/mm/run_mmap.sh +f:tools/testing/selftests/riscv/sigreturn/.gitignore +f:tools/testing/selftests/riscv/sigreturn/Makefile +f:tools/testing/selftests/riscv/sigreturn/sigreturn.c +f:tools/testing/selftests/riscv/vector/.gitignore +f:tools/testing/selftests/riscv/vector/Makefile +f:tools/testing/selftests/riscv/vector/v_exec_initval_nolibc.c +f:tools/testing/selftests/riscv/vector/v_helpers.c +f:tools/testing/selftests/riscv/vector/v_helpers.h +f:tools/testing/selftests/riscv/vector/v_initval.c +f:tools/testing/selftests/riscv/vector/vstate_exec_nolibc.c +f:tools/testing/selftests/riscv/vector/vstate_prctl.c +f:tools/testing/selftests/rlimits/.gitignore +f:tools/testing/selftests/rlimits/Makefile +f:tools/testing/selftests/rlimits/config +f:tools/testing/selftests/rlimits/rlimits-per-userns.c +f:tools/testing/selftests/rseq/.gitignore +f:tools/testing/selftests/rseq/Makefile +f:tools/testing/selftests/rseq/basic_percpu_ops_test.c +f:tools/testing/selftests/rseq/basic_test.c +f:tools/testing/selftests/rseq/compiler.h +f:tools/testing/selftests/rseq/param_test.c +f:tools/testing/selftests/rseq/rseq-abi.h +f:tools/testing/selftests/rseq/rseq-arm-bits.h +f:tools/testing/selftests/rseq/rseq-arm.h +f:tools/testing/selftests/rseq/rseq-arm64-bits.h +f:tools/testing/selftests/rseq/rseq-arm64.h +f:tools/testing/selftests/rseq/rseq-bits-reset.h +f:tools/testing/selftests/rseq/rseq-bits-template.h +f:tools/testing/selftests/rseq/rseq-generic-thread-pointer.h +f:tools/testing/selftests/rseq/rseq-mips-bits.h +f:tools/testing/selftests/rseq/rseq-mips.h +f:tools/testing/selftests/rseq/rseq-or1k-bits.h +f:tools/testing/selftests/rseq/rseq-or1k-thread-pointer.h +f:tools/testing/selftests/rseq/rseq-or1k.h +f:tools/testing/selftests/rseq/rseq-ppc-bits.h +f:tools/testing/selftests/rseq/rseq-ppc-thread-pointer.h +f:tools/testing/selftests/rseq/rseq-ppc.h +f:tools/testing/selftests/rseq/rseq-riscv-bits.h +f:tools/testing/selftests/rseq/rseq-riscv.h +f:tools/testing/selftests/rseq/rseq-s390-bits.h +f:tools/testing/selftests/rseq/rseq-s390.h +f:tools/testing/selftests/rseq/rseq-thread-pointer.h +f:tools/testing/selftests/rseq/rseq-x86-bits.h +f:tools/testing/selftests/rseq/rseq-x86-thread-pointer.h +f:tools/testing/selftests/rseq/rseq-x86.h +f:tools/testing/selftests/rseq/rseq.c +f:tools/testing/selftests/rseq/rseq.h +f:tools/testing/selftests/rseq/run_param_test.sh +f:tools/testing/selftests/rseq/run_syscall_errors_test.sh +f:tools/testing/selftests/rseq/settings +f:tools/testing/selftests/rseq/syscall_errors_test.c +f:tools/testing/selftests/rtc/.gitignore +f:tools/testing/selftests/rtc/Makefile +f:tools/testing/selftests/rtc/rtctest.c +f:tools/testing/selftests/rtc/settings +f:tools/testing/selftests/run_kselftest.sh +f:tools/testing/selftests/rust/Makefile +f:tools/testing/selftests/rust/config +f:tools/testing/selftests/rust/test_probe_samples.sh +f:tools/testing/selftests/safesetid/.gitignore +f:tools/testing/selftests/safesetid/Makefile +f:tools/testing/selftests/safesetid/config +f:tools/testing/selftests/safesetid/safesetid-test.c +f:tools/testing/selftests/safesetid/safesetid-test.sh +f:tools/testing/selftests/sched/.gitignore +f:tools/testing/selftests/sched/Makefile +f:tools/testing/selftests/sched/config +f:tools/testing/selftests/sched/cs_prctl_test.c +f:tools/testing/selftests/sched_ext/.gitignore +f:tools/testing/selftests/sched_ext/Makefile +f:tools/testing/selftests/sched_ext/allowed_cpus.bpf.c +f:tools/testing/selftests/sched_ext/allowed_cpus.c +f:tools/testing/selftests/sched_ext/config +f:tools/testing/selftests/sched_ext/create_dsq.bpf.c +f:tools/testing/selftests/sched_ext/create_dsq.c +f:tools/testing/selftests/sched_ext/ddsp_bogus_dsq_fail.bpf.c +f:tools/testing/selftests/sched_ext/ddsp_bogus_dsq_fail.c +f:tools/testing/selftests/sched_ext/ddsp_vtimelocal_fail.bpf.c +f:tools/testing/selftests/sched_ext/ddsp_vtimelocal_fail.c +f:tools/testing/selftests/sched_ext/dsp_local_on.bpf.c +f:tools/testing/selftests/sched_ext/dsp_local_on.c +f:tools/testing/selftests/sched_ext/enq_last_no_enq_fails.bpf.c +f:tools/testing/selftests/sched_ext/enq_last_no_enq_fails.c +f:tools/testing/selftests/sched_ext/enq_select_cpu.bpf.c +f:tools/testing/selftests/sched_ext/enq_select_cpu.c +f:tools/testing/selftests/sched_ext/exit.bpf.c +f:tools/testing/selftests/sched_ext/exit.c +f:tools/testing/selftests/sched_ext/exit_test.h +f:tools/testing/selftests/sched_ext/hotplug.bpf.c +f:tools/testing/selftests/sched_ext/hotplug.c +f:tools/testing/selftests/sched_ext/hotplug_test.h +f:tools/testing/selftests/sched_ext/init_enable_count.bpf.c +f:tools/testing/selftests/sched_ext/init_enable_count.c +f:tools/testing/selftests/sched_ext/maximal.bpf.c +f:tools/testing/selftests/sched_ext/maximal.c +f:tools/testing/selftests/sched_ext/maybe_null.bpf.c +f:tools/testing/selftests/sched_ext/maybe_null.c +f:tools/testing/selftests/sched_ext/maybe_null_fail_dsp.bpf.c +f:tools/testing/selftests/sched_ext/maybe_null_fail_yld.bpf.c +f:tools/testing/selftests/sched_ext/minimal.bpf.c +f:tools/testing/selftests/sched_ext/minimal.c +f:tools/testing/selftests/sched_ext/numa.bpf.c +f:tools/testing/selftests/sched_ext/numa.c +f:tools/testing/selftests/sched_ext/prog_run.bpf.c +f:tools/testing/selftests/sched_ext/prog_run.c +f:tools/testing/selftests/sched_ext/reload_loop.c +f:tools/testing/selftests/sched_ext/runner.c +f:tools/testing/selftests/sched_ext/scx_test.h +f:tools/testing/selftests/sched_ext/select_cpu_dfl.bpf.c +f:tools/testing/selftests/sched_ext/select_cpu_dfl.c +f:tools/testing/selftests/sched_ext/select_cpu_dfl_nodispatch.bpf.c +f:tools/testing/selftests/sched_ext/select_cpu_dfl_nodispatch.c +f:tools/testing/selftests/sched_ext/select_cpu_dispatch.bpf.c +f:tools/testing/selftests/sched_ext/select_cpu_dispatch.c +f:tools/testing/selftests/sched_ext/select_cpu_dispatch_bad_dsq.bpf.c +f:tools/testing/selftests/sched_ext/select_cpu_dispatch_bad_dsq.c +f:tools/testing/selftests/sched_ext/select_cpu_dispatch_dbl_dsp.bpf.c +f:tools/testing/selftests/sched_ext/select_cpu_dispatch_dbl_dsp.c +f:tools/testing/selftests/sched_ext/select_cpu_vtime.bpf.c +f:tools/testing/selftests/sched_ext/select_cpu_vtime.c +f:tools/testing/selftests/sched_ext/test_example.c +f:tools/testing/selftests/sched_ext/util.c +f:tools/testing/selftests/sched_ext/util.h +f:tools/testing/selftests/seccomp/.gitignore +f:tools/testing/selftests/seccomp/Makefile +f:tools/testing/selftests/seccomp/config +f:tools/testing/selftests/seccomp/seccomp_benchmark.c +f:tools/testing/selftests/seccomp/seccomp_bpf.c +f:tools/testing/selftests/seccomp/settings +f:tools/testing/selftests/sgx/.gitignore +f:tools/testing/selftests/sgx/Makefile +f:tools/testing/selftests/sgx/call.S +f:tools/testing/selftests/sgx/defines.h +f:tools/testing/selftests/sgx/load.c +f:tools/testing/selftests/sgx/main.c +f:tools/testing/selftests/sgx/main.h +f:tools/testing/selftests/sgx/sign_key.S +f:tools/testing/selftests/sgx/sign_key.pem +f:tools/testing/selftests/sgx/sigstruct.c +f:tools/testing/selftests/sgx/test_encl.c +f:tools/testing/selftests/sgx/test_encl.lds +f:tools/testing/selftests/sgx/test_encl_bootstrap.S +f:tools/testing/selftests/signal/.gitignore +f:tools/testing/selftests/signal/Makefile +f:tools/testing/selftests/signal/current_stack_pointer.h +f:tools/testing/selftests/signal/mangle_uc_sigmask.c +f:tools/testing/selftests/signal/sas.c +f:tools/testing/selftests/size/.gitignore +f:tools/testing/selftests/size/Makefile +f:tools/testing/selftests/size/get_size.c +f:tools/testing/selftests/sparc64/Makefile +f:tools/testing/selftests/sparc64/drivers/.gitignore +f:tools/testing/selftests/sparc64/drivers/Makefile +f:tools/testing/selftests/sparc64/drivers/adi-test.c +f:tools/testing/selftests/sparc64/drivers/drivers_test.sh +f:tools/testing/selftests/sparc64/run.sh +f:tools/testing/selftests/splice/.gitignore +f:tools/testing/selftests/splice/Makefile +f:tools/testing/selftests/splice/config +f:tools/testing/selftests/splice/default_file_splice_read.c +f:tools/testing/selftests/splice/default_file_splice_read.sh +f:tools/testing/selftests/splice/settings +f:tools/testing/selftests/splice/short_splice_read.sh +f:tools/testing/selftests/splice/splice_read.c +f:tools/testing/selftests/static_keys/Makefile +f:tools/testing/selftests/static_keys/config +f:tools/testing/selftests/static_keys/test_static_keys.sh +f:tools/testing/selftests/sync/.gitignore +f:tools/testing/selftests/sync/Makefile +f:tools/testing/selftests/sync/config +f:tools/testing/selftests/sync/sw_sync.h +f:tools/testing/selftests/sync/sync.c +f:tools/testing/selftests/sync/sync.h +f:tools/testing/selftests/sync/sync_alloc.c +f:tools/testing/selftests/sync/sync_fence.c +f:tools/testing/selftests/sync/sync_merge.c +f:tools/testing/selftests/sync/sync_stress_consumer.c +f:tools/testing/selftests/sync/sync_stress_merge.c +f:tools/testing/selftests/sync/sync_stress_parallelism.c +f:tools/testing/selftests/sync/sync_test.c +f:tools/testing/selftests/sync/sync_wait.c +f:tools/testing/selftests/sync/synctest.h +f:tools/testing/selftests/syscall_user_dispatch/.gitignore +f:tools/testing/selftests/syscall_user_dispatch/Makefile +f:tools/testing/selftests/syscall_user_dispatch/config +f:tools/testing/selftests/syscall_user_dispatch/sud_benchmark.c +f:tools/testing/selftests/syscall_user_dispatch/sud_test.c +f:tools/testing/selftests/sysctl/Makefile +f:tools/testing/selftests/sysctl/config +f:tools/testing/selftests/sysctl/sysctl.sh +f:tools/testing/selftests/tc-testing/.gitignore +f:tools/testing/selftests/tc-testing/Makefile +f:tools/testing/selftests/tc-testing/README +f:tools/testing/selftests/tc-testing/TODO.txt +f:tools/testing/selftests/tc-testing/TdcPlugin.py +f:tools/testing/selftests/tc-testing/TdcResults.py +f:tools/testing/selftests/tc-testing/action-ebpf +f:tools/testing/selftests/tc-testing/action.c +f:tools/testing/selftests/tc-testing/config +f:tools/testing/selftests/tc-testing/creating-plugins/AddingPlugins.txt +f:tools/testing/selftests/tc-testing/creating-testcases/AddingTestCases.txt +f:tools/testing/selftests/tc-testing/creating-testcases/example.json +f:tools/testing/selftests/tc-testing/creating-testcases/scapy-example.json +f:tools/testing/selftests/tc-testing/creating-testcases/template.json +f:tools/testing/selftests/tc-testing/plugin-lib/README-PLUGINS +f:tools/testing/selftests/tc-testing/plugin-lib/nsPlugin.py +f:tools/testing/selftests/tc-testing/plugin-lib/rootPlugin.py +f:tools/testing/selftests/tc-testing/plugin-lib/scapyPlugin.py +f:tools/testing/selftests/tc-testing/plugin-lib/valgrindPlugin.py +f:tools/testing/selftests/tc-testing/plugins/__init__.py +f:tools/testing/selftests/tc-testing/scripts/sfq_rejects_limit_1.py +f:tools/testing/selftests/tc-testing/scripts/taprio_wait_for_admin.sh +f:tools/testing/selftests/tc-testing/settings +f:tools/testing/selftests/tc-testing/tc-tests/actions/bpf.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/connmark.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/csum.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/ct.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/ctinfo.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/gact.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/gate.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/ife.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/mirred.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/mpls.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/nat.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/pedit.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/police.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/sample.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/simple.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/skbedit.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/tunnel_key.json +f:tools/testing/selftests/tc-testing/tc-tests/actions/vlan.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/basic.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/bpf.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/cgroup.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/flow.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/flower.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/fw.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/matchall.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/route.json +f:tools/testing/selftests/tc-testing/tc-tests/filters/u32.json +f:tools/testing/selftests/tc-testing/tc-tests/infra/actions.json +f:tools/testing/selftests/tc-testing/tc-tests/infra/filter.json +f:tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/cake.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/cbs.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/choke.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/codel.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/drr.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/dualpi2.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/etf.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/fifo.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq_codel.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq_pie.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/gred.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/hfsc.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/hhf.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/htb.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/ingress.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/mq.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/mqprio.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/multiq.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/netem.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/pfifo_fast.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/pie.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/plug.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/prio.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/qfq.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/red.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/sfb.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/sfq.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/skbprio.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/taprio.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/tbf.json +f:tools/testing/selftests/tc-testing/tc-tests/qdiscs/teql.json +f:tools/testing/selftests/tc-testing/tdc.py +f:tools/testing/selftests/tc-testing/tdc.sh +f:tools/testing/selftests/tc-testing/tdc_batch.py +f:tools/testing/selftests/tc-testing/tdc_config.py +f:tools/testing/selftests/tc-testing/tdc_config_local_template.py +f:tools/testing/selftests/tc-testing/tdc_helper.py +f:tools/testing/selftests/tc-testing/tdc_multibatch.py +f:tools/testing/selftests/tdx/.gitignore +f:tools/testing/selftests/tdx/Makefile +f:tools/testing/selftests/tdx/config +f:tools/testing/selftests/tdx/tdx_guest_test.c +f:tools/testing/selftests/thermal/intel/power_floor/.gitignore +f:tools/testing/selftests/thermal/intel/power_floor/Makefile +f:tools/testing/selftests/thermal/intel/power_floor/power_floor_test.c +f:tools/testing/selftests/thermal/intel/workload_hint/.gitignore +f:tools/testing/selftests/thermal/intel/workload_hint/Makefile +f:tools/testing/selftests/thermal/intel/workload_hint/workload_hint_test.c +f:tools/testing/selftests/timens/.gitignore +f:tools/testing/selftests/timens/Makefile +f:tools/testing/selftests/timens/clock_nanosleep.c +f:tools/testing/selftests/timens/config +f:tools/testing/selftests/timens/exec.c +f:tools/testing/selftests/timens/futex.c +f:tools/testing/selftests/timens/gettime_perf.c +f:tools/testing/selftests/timens/log.h +f:tools/testing/selftests/timens/procfs.c +f:tools/testing/selftests/timens/timens.c +f:tools/testing/selftests/timens/timens.h +f:tools/testing/selftests/timens/timer.c +f:tools/testing/selftests/timens/timerfd.c +f:tools/testing/selftests/timens/vfork_exec.c +f:tools/testing/selftests/timers/.gitignore +f:tools/testing/selftests/timers/Makefile +f:tools/testing/selftests/timers/adjtick.c +f:tools/testing/selftests/timers/alarmtimer-suspend.c +f:tools/testing/selftests/timers/change_skew.c +f:tools/testing/selftests/timers/clocksource-switch.c +f:tools/testing/selftests/timers/freq-step.c +f:tools/testing/selftests/timers/inconsistency-check.c +f:tools/testing/selftests/timers/leap-a-day.c +f:tools/testing/selftests/timers/leapcrash.c +f:tools/testing/selftests/timers/mqueue-lat.c +f:tools/testing/selftests/timers/nanosleep.c +f:tools/testing/selftests/timers/nsleep-lat.c +f:tools/testing/selftests/timers/posix_timers.c +f:tools/testing/selftests/timers/raw_skew.c +f:tools/testing/selftests/timers/rtcpie.c +f:tools/testing/selftests/timers/set-2038.c +f:tools/testing/selftests/timers/set-tai.c +f:tools/testing/selftests/timers/set-timer-lat.c +f:tools/testing/selftests/timers/set-tz.c +f:tools/testing/selftests/timers/settings +f:tools/testing/selftests/timers/skew_consistency.c +f:tools/testing/selftests/timers/threadtest.c +f:tools/testing/selftests/timers/valid-adjtimex.c +f:tools/testing/selftests/tmpfs/.gitignore +f:tools/testing/selftests/tmpfs/Makefile +f:tools/testing/selftests/tmpfs/bug-link-o-tmpfile.c +f:tools/testing/selftests/tpm2/.gitignore +f:tools/testing/selftests/tpm2/Makefile +f:tools/testing/selftests/tpm2/settings +f:tools/testing/selftests/tpm2/test_async.sh +f:tools/testing/selftests/tpm2/test_smoke.sh +f:tools/testing/selftests/tpm2/test_space.sh +f:tools/testing/selftests/tpm2/tpm2.py +f:tools/testing/selftests/tpm2/tpm2_tests.py +f:tools/testing/selftests/tty/.gitignore +f:tools/testing/selftests/tty/Makefile +f:tools/testing/selftests/tty/tty_tstamp_update.c +f:tools/testing/selftests/turbostat/added_perf_counters.py +f:tools/testing/selftests/turbostat/defcolumns.py +f:tools/testing/selftests/turbostat/smi_aperf_mperf.py +f:tools/testing/selftests/ublk/.gitignore +f:tools/testing/selftests/ublk/Makefile +f:tools/testing/selftests/ublk/common.c +f:tools/testing/selftests/ublk/config +f:tools/testing/selftests/ublk/fault_inject.c +f:tools/testing/selftests/ublk/file_backed.c +f:tools/testing/selftests/ublk/kublk.c +f:tools/testing/selftests/ublk/kublk.h +f:tools/testing/selftests/ublk/null.c +f:tools/testing/selftests/ublk/stripe.c +f:tools/testing/selftests/ublk/test_common.sh +f:tools/testing/selftests/ublk/test_generic_01.sh +f:tools/testing/selftests/ublk/test_generic_02.sh +f:tools/testing/selftests/ublk/test_generic_03.sh +f:tools/testing/selftests/ublk/test_generic_04.sh +f:tools/testing/selftests/ublk/test_generic_05.sh +f:tools/testing/selftests/ublk/test_generic_06.sh +f:tools/testing/selftests/ublk/test_generic_07.sh +f:tools/testing/selftests/ublk/test_generic_08.sh +f:tools/testing/selftests/ublk/test_generic_09.sh +f:tools/testing/selftests/ublk/test_generic_10.sh +f:tools/testing/selftests/ublk/test_generic_11.sh +f:tools/testing/selftests/ublk/test_generic_12.sh +f:tools/testing/selftests/ublk/test_loop_01.sh +f:tools/testing/selftests/ublk/test_loop_02.sh +f:tools/testing/selftests/ublk/test_loop_03.sh +f:tools/testing/selftests/ublk/test_loop_04.sh +f:tools/testing/selftests/ublk/test_loop_05.sh +f:tools/testing/selftests/ublk/test_null_01.sh +f:tools/testing/selftests/ublk/test_null_02.sh +f:tools/testing/selftests/ublk/test_stress_01.sh +f:tools/testing/selftests/ublk/test_stress_02.sh +f:tools/testing/selftests/ublk/test_stress_03.sh +f:tools/testing/selftests/ublk/test_stress_04.sh +f:tools/testing/selftests/ublk/test_stress_05.sh +f:tools/testing/selftests/ublk/test_stripe_01.sh +f:tools/testing/selftests/ublk/test_stripe_02.sh +f:tools/testing/selftests/ublk/test_stripe_03.sh +f:tools/testing/selftests/ublk/test_stripe_04.sh +f:tools/testing/selftests/ublk/trace/count_ios_per_tid.bt +f:tools/testing/selftests/ublk/trace/seq_io.bt +f:tools/testing/selftests/ublk/ublk_dep.h +f:tools/testing/selftests/ublk/utils.h +f:tools/testing/selftests/uevent/.gitignore +f:tools/testing/selftests/uevent/Makefile +f:tools/testing/selftests/uevent/config +f:tools/testing/selftests/uevent/uevent_filtering.c +f:tools/testing/selftests/user_events/.gitignore +f:tools/testing/selftests/user_events/Makefile +f:tools/testing/selftests/user_events/abi_test.c +f:tools/testing/selftests/user_events/config +f:tools/testing/selftests/user_events/dyn_test.c +f:tools/testing/selftests/user_events/ftrace_test.c +f:tools/testing/selftests/user_events/perf_test.c +f:tools/testing/selftests/user_events/settings +f:tools/testing/selftests/user_events/user_events_selftests.h +f:tools/testing/selftests/vDSO/.gitignore +f:tools/testing/selftests/vDSO/Makefile +f:tools/testing/selftests/vDSO/parse_vdso.c +f:tools/testing/selftests/vDSO/parse_vdso.h +f:tools/testing/selftests/vDSO/vdso_call.h +f:tools/testing/selftests/vDSO/vdso_config.h +f:tools/testing/selftests/vDSO/vdso_test_abi.c +f:tools/testing/selftests/vDSO/vdso_test_chacha.c +f:tools/testing/selftests/vDSO/vdso_test_clock_getres.c +f:tools/testing/selftests/vDSO/vdso_test_correctness.c +f:tools/testing/selftests/vDSO/vdso_test_getcpu.c +f:tools/testing/selftests/vDSO/vdso_test_getrandom.c +f:tools/testing/selftests/vDSO/vdso_test_gettimeofday.c +f:tools/testing/selftests/vDSO/vgetrandom-chacha.S +f:tools/testing/selftests/vsock/.gitignore +f:tools/testing/selftests/vsock/Makefile +f:tools/testing/selftests/vsock/config +f:tools/testing/selftests/vsock/settings +f:tools/testing/selftests/vsock/vmtest.sh +f:tools/testing/selftests/watchdog/.gitignore +f:tools/testing/selftests/watchdog/Makefile +f:tools/testing/selftests/watchdog/watchdog-test.c +f:tools/testing/selftests/wireguard/netns.sh +f:tools/testing/selftests/wireguard/qemu/.gitignore +f:tools/testing/selftests/wireguard/qemu/Makefile +f:tools/testing/selftests/wireguard/qemu/arch/aarch64.config +f:tools/testing/selftests/wireguard/qemu/arch/aarch64_be.config +f:tools/testing/selftests/wireguard/qemu/arch/arm.config +f:tools/testing/selftests/wireguard/qemu/arch/armeb.config +f:tools/testing/selftests/wireguard/qemu/arch/i686.config +f:tools/testing/selftests/wireguard/qemu/arch/m68k.config +f:tools/testing/selftests/wireguard/qemu/arch/mips.config +f:tools/testing/selftests/wireguard/qemu/arch/mips64.config +f:tools/testing/selftests/wireguard/qemu/arch/mips64el.config +f:tools/testing/selftests/wireguard/qemu/arch/mipsel.config +f:tools/testing/selftests/wireguard/qemu/arch/powerpc.config +f:tools/testing/selftests/wireguard/qemu/arch/powerpc64.config +f:tools/testing/selftests/wireguard/qemu/arch/powerpc64le.config +f:tools/testing/selftests/wireguard/qemu/arch/riscv32.config +f:tools/testing/selftests/wireguard/qemu/arch/riscv64.config +f:tools/testing/selftests/wireguard/qemu/arch/s390x.config +f:tools/testing/selftests/wireguard/qemu/arch/um.config +f:tools/testing/selftests/wireguard/qemu/arch/x86_64.config +f:tools/testing/selftests/wireguard/qemu/debug.config +f:tools/testing/selftests/wireguard/qemu/init.c +f:tools/testing/selftests/wireguard/qemu/kernel.config +f:tools/testing/selftests/x86/.gitignore +f:tools/testing/selftests/x86/Makefile +f:tools/testing/selftests/x86/amx.c +f:tools/testing/selftests/x86/apx.c +f:tools/testing/selftests/x86/avx.c +f:tools/testing/selftests/x86/bugs/Makefile +f:tools/testing/selftests/x86/bugs/common.py +f:tools/testing/selftests/x86/bugs/its_indirect_alignment.py +f:tools/testing/selftests/x86/bugs/its_permutations.py +f:tools/testing/selftests/x86/bugs/its_ret_alignment.py +f:tools/testing/selftests/x86/bugs/its_sysfs.py +f:tools/testing/selftests/x86/check_cc.sh +f:tools/testing/selftests/x86/check_initial_reg_state.c +f:tools/testing/selftests/x86/clang_helpers_32.S +f:tools/testing/selftests/x86/clang_helpers_64.S +f:tools/testing/selftests/x86/corrupt_xstate_header.c +f:tools/testing/selftests/x86/entry_from_vm86.c +f:tools/testing/selftests/x86/fsgsbase.c +f:tools/testing/selftests/x86/fsgsbase_restore.c +f:tools/testing/selftests/x86/helpers.h +f:tools/testing/selftests/x86/ioperm.c +f:tools/testing/selftests/x86/iopl.c +f:tools/testing/selftests/x86/lam.c +f:tools/testing/selftests/x86/ldt_gdt.c +f:tools/testing/selftests/x86/mov_ss_trap.c +f:tools/testing/selftests/x86/nx_stack.c +f:tools/testing/selftests/x86/ptrace_syscall.c +f:tools/testing/selftests/x86/raw_syscall_helper_32.S +f:tools/testing/selftests/x86/sigaltstack.c +f:tools/testing/selftests/x86/sigreturn.c +f:tools/testing/selftests/x86/sigtrap_loop.c +f:tools/testing/selftests/x86/single_step_syscall.c +f:tools/testing/selftests/x86/srso.c +f:tools/testing/selftests/x86/syscall_arg_fault.c +f:tools/testing/selftests/x86/syscall_nt.c +f:tools/testing/selftests/x86/syscall_numbering.c +f:tools/testing/selftests/x86/sysret_rip.c +f:tools/testing/selftests/x86/sysret_ss_attrs.c +f:tools/testing/selftests/x86/test_FCMOV.c +f:tools/testing/selftests/x86/test_FCOMI.c +f:tools/testing/selftests/x86/test_FISTTP.c +f:tools/testing/selftests/x86/test_mremap_vdso.c +f:tools/testing/selftests/x86/test_shadow_stack.c +f:tools/testing/selftests/x86/test_syscall_vdso.c +f:tools/testing/selftests/x86/test_vsyscall.c +f:tools/testing/selftests/x86/thunks.S +f:tools/testing/selftests/x86/thunks_32.S +f:tools/testing/selftests/x86/trivial_32bit_program.c +f:tools/testing/selftests/x86/trivial_64bit_program.c +f:tools/testing/selftests/x86/trivial_program.c +f:tools/testing/selftests/x86/unwind_vdso.c +f:tools/testing/selftests/x86/vdso_restorer.c +f:tools/testing/selftests/x86/xstate.c +f:tools/testing/selftests/x86/xstate.h +f:tools/testing/selftests/zram/.gitignore +f:tools/testing/selftests/zram/Makefile +f:tools/testing/selftests/zram/README +f:tools/testing/selftests/zram/config +f:tools/testing/selftests/zram/zram.sh +f:tools/testing/selftests/zram/zram01.sh +f:tools/testing/selftests/zram/zram02.sh +f:tools/testing/selftests/zram/zram_lib.sh +f:tools/testing/shared/autoconf.h +f:tools/testing/shared/interval_tree-shim.c +f:tools/testing/shared/linux.c +f:tools/testing/shared/linux/bug.h +f:tools/testing/shared/linux/cleanup.h +f:tools/testing/shared/linux/cpu.h +f:tools/testing/shared/linux/idr.h +f:tools/testing/shared/linux/interval_tree.h +f:tools/testing/shared/linux/interval_tree_generic.h +f:tools/testing/shared/linux/kconfig.h +f:tools/testing/shared/linux/kernel.h +f:tools/testing/shared/linux/kmemleak.h +f:tools/testing/shared/linux/local_lock.h +f:tools/testing/shared/linux/lockdep.h +f:tools/testing/shared/linux/maple_tree.h +f:tools/testing/shared/linux/percpu.h +f:tools/testing/shared/linux/preempt.h +f:tools/testing/shared/linux/radix-tree.h +f:tools/testing/shared/linux/rbtree.h +f:tools/testing/shared/linux/rbtree_augmented.h +f:tools/testing/shared/linux/rbtree_types.h +f:tools/testing/shared/linux/rcupdate.h +f:tools/testing/shared/linux/xarray.h +f:tools/testing/shared/maple-shared.h +f:tools/testing/shared/maple-shim.c +f:tools/testing/shared/rbtree-shim.c +f:tools/testing/shared/shared.h +f:tools/testing/shared/shared.mk +f:tools/testing/shared/trace/events/maple_tree.h +f:tools/testing/shared/xarray-shared.c +f:tools/testing/shared/xarray-shared.h +f:tools/testing/vma/.gitignore +f:tools/testing/vma/Makefile +f:tools/testing/vma/linux/atomic.h +f:tools/testing/vma/linux/mmzone.h +f:tools/testing/vma/vma.c +f:tools/testing/vma/vma_internal.h +f:tools/testing/vsock/.gitignore +f:tools/testing/vsock/Makefile +f:tools/testing/vsock/README +f:tools/testing/vsock/control.c +f:tools/testing/vsock/control.h +f:tools/testing/vsock/msg_zerocopy_common.c +f:tools/testing/vsock/msg_zerocopy_common.h +f:tools/testing/vsock/timeout.c +f:tools/testing/vsock/timeout.h +f:tools/testing/vsock/util.c +f:tools/testing/vsock/util.h +f:tools/testing/vsock/vsock_diag_test.c +f:tools/testing/vsock/vsock_perf.c +f:tools/testing/vsock/vsock_test.c +f:tools/testing/vsock/vsock_test_zerocopy.c +f:tools/testing/vsock/vsock_test_zerocopy.h +f:tools/testing/vsock/vsock_uring_test.c +f:tools/thermal/lib/Build +f:tools/thermal/lib/Makefile +f:tools/thermal/lib/libthermal_tools.pc.template +f:tools/thermal/lib/log.c +f:tools/thermal/lib/log.h +f:tools/thermal/lib/mainloop.c +f:tools/thermal/lib/mainloop.h +f:tools/thermal/lib/thermal-tools.h +f:tools/thermal/lib/uptimeofday.c +f:tools/thermal/lib/uptimeofday.h +f:tools/thermal/thermal-engine/Build +f:tools/thermal/thermal-engine/Makefile +f:tools/thermal/thermal-engine/thermal-engine.c +f:tools/thermal/thermometer/Build +f:tools/thermal/thermometer/Makefile +f:tools/thermal/thermometer/thermometer.8 +f:tools/thermal/thermometer/thermometer.c +f:tools/thermal/thermometer/thermometer.conf +f:tools/thermal/tmon/.gitignore +f:tools/thermal/tmon/Makefile +f:tools/thermal/tmon/README +f:tools/thermal/tmon/pid.c +f:tools/thermal/tmon/sysfs.c +f:tools/thermal/tmon/tmon.8 +f:tools/thermal/tmon/tmon.c +f:tools/thermal/tmon/tmon.h +f:tools/thermal/tmon/tui.c +f:tools/time/udelay_test.sh +f:tools/tracing/Makefile +f:tools/tracing/latency/.gitignore +f:tools/tracing/latency/Build +f:tools/tracing/latency/Makefile +f:tools/tracing/latency/Makefile.config +f:tools/tracing/latency/latency-collector.c +f:tools/tracing/rtla/.gitignore +f:tools/tracing/rtla/Build +f:tools/tracing/rtla/Makefile +f:tools/tracing/rtla/Makefile.config +f:tools/tracing/rtla/Makefile.rtla +f:tools/tracing/rtla/Makefile.standalone +f:tools/tracing/rtla/README.txt +f:tools/tracing/rtla/sample/timerlat_load.py +f:tools/tracing/rtla/src/Build +f:tools/tracing/rtla/src/osnoise.c +f:tools/tracing/rtla/src/osnoise.h +f:tools/tracing/rtla/src/osnoise_hist.c +f:tools/tracing/rtla/src/osnoise_top.c +f:tools/tracing/rtla/src/rtla.c +f:tools/tracing/rtla/src/timerlat.bpf.c +f:tools/tracing/rtla/src/timerlat.c +f:tools/tracing/rtla/src/timerlat.h +f:tools/tracing/rtla/src/timerlat_aa.c +f:tools/tracing/rtla/src/timerlat_aa.h +f:tools/tracing/rtla/src/timerlat_bpf.c +f:tools/tracing/rtla/src/timerlat_bpf.h +f:tools/tracing/rtla/src/timerlat_hist.c +f:tools/tracing/rtla/src/timerlat_top.c +f:tools/tracing/rtla/src/timerlat_u.c +f:tools/tracing/rtla/src/timerlat_u.h +f:tools/tracing/rtla/src/trace.c +f:tools/tracing/rtla/src/trace.h +f:tools/tracing/rtla/src/utils.c +f:tools/tracing/rtla/src/utils.h +f:tools/tracing/rtla/tests/engine.sh +f:tools/tracing/rtla/tests/hwnoise.t +f:tools/tracing/rtla/tests/osnoise.t +f:tools/tracing/rtla/tests/timerlat.t +f:tools/usb/.gitignore +f:tools/usb/Build +f:tools/usb/Makefile +f:tools/usb/ffs-aio-example/multibuff/device_app/aio_multibuff.c +f:tools/usb/ffs-aio-example/multibuff/host_app/Makefile +f:tools/usb/ffs-aio-example/multibuff/host_app/test.c +f:tools/usb/ffs-aio-example/simple/device_app/aio_simple.c +f:tools/usb/ffs-aio-example/simple/host_app/Makefile +f:tools/usb/ffs-aio-example/simple/host_app/test.c +f:tools/usb/ffs-test.c +f:tools/usb/hcd-tests.sh +f:tools/usb/p9_fwd.py +f:tools/usb/testusb.c +f:tools/usb/usbip/.gitignore +f:tools/usb/usbip/AUTHORS +f:tools/usb/usbip/COPYING +f:tools/usb/usbip/INSTALL +f:tools/usb/usbip/Makefile.am +f:tools/usb/usbip/README +f:tools/usb/usbip/autogen.sh +f:tools/usb/usbip/cleanup.sh +f:tools/usb/usbip/configure.ac +f:tools/usb/usbip/doc/usbip.8 +f:tools/usb/usbip/doc/usbipd.8 +f:tools/usb/usbip/libsrc/Makefile.am +f:tools/usb/usbip/libsrc/list.h +f:tools/usb/usbip/libsrc/names.c +f:tools/usb/usbip/libsrc/names.h +f:tools/usb/usbip/libsrc/sysfs_utils.c +f:tools/usb/usbip/libsrc/sysfs_utils.h +f:tools/usb/usbip/libsrc/usbip_common.c +f:tools/usb/usbip/libsrc/usbip_common.h +f:tools/usb/usbip/libsrc/usbip_device_driver.c +f:tools/usb/usbip/libsrc/usbip_device_driver.h +f:tools/usb/usbip/libsrc/usbip_host_common.c +f:tools/usb/usbip/libsrc/usbip_host_common.h +f:tools/usb/usbip/libsrc/usbip_host_driver.c +f:tools/usb/usbip/libsrc/usbip_host_driver.h +f:tools/usb/usbip/libsrc/vhci_driver.c +f:tools/usb/usbip/libsrc/vhci_driver.h +f:tools/usb/usbip/src/Makefile.am +f:tools/usb/usbip/src/usbip.c +f:tools/usb/usbip/src/usbip.h +f:tools/usb/usbip/src/usbip_attach.c +f:tools/usb/usbip/src/usbip_bind.c +f:tools/usb/usbip/src/usbip_detach.c +f:tools/usb/usbip/src/usbip_list.c +f:tools/usb/usbip/src/usbip_network.c +f:tools/usb/usbip/src/usbip_network.h +f:tools/usb/usbip/src/usbip_port.c +f:tools/usb/usbip/src/usbip_unbind.c +f:tools/usb/usbip/src/usbipd.c +f:tools/usb/usbip/src/utils.c +f:tools/usb/usbip/src/utils.h +f:tools/usb/usbip/vudc/vudc_server_example.sh +f:tools/verification/models/rtapp/pagefault.ltl +f:tools/verification/models/rtapp/sleep.ltl +f:tools/verification/models/sched/nrp.dot +f:tools/verification/models/sched/opid.dot +f:tools/verification/models/sched/sco.dot +f:tools/verification/models/sched/scpd.dot +f:tools/verification/models/sched/snep.dot +f:tools/verification/models/sched/snroc.dot +f:tools/verification/models/sched/sssw.dot +f:tools/verification/models/sched/sts.dot +f:tools/verification/models/wip.dot +f:tools/verification/models/wwnr.dot +f:tools/verification/rv/.gitignore +f:tools/verification/rv/Build +f:tools/verification/rv/Makefile +f:tools/verification/rv/Makefile.config +f:tools/verification/rv/Makefile.rv +f:tools/verification/rv/README.txt +f:tools/verification/rv/include/in_kernel.h +f:tools/verification/rv/include/rv.h +f:tools/verification/rv/include/trace.h +f:tools/verification/rv/include/utils.h +f:tools/verification/rv/src/Build +f:tools/verification/rv/src/in_kernel.c +f:tools/verification/rv/src/rv.c +f:tools/verification/rv/src/trace.c +f:tools/verification/rv/src/utils.c +f:tools/verification/rvgen/.gitignore +f:tools/verification/rvgen/Makefile +f:tools/verification/rvgen/__main__.py +f:tools/verification/rvgen/dot2c +f:tools/verification/rvgen/rvgen/automata.py +f:tools/verification/rvgen/rvgen/container.py +f:tools/verification/rvgen/rvgen/dot2c.py +f:tools/verification/rvgen/rvgen/dot2k.py +f:tools/verification/rvgen/rvgen/generator.py +f:tools/verification/rvgen/rvgen/ltl2ba.py +f:tools/verification/rvgen/rvgen/ltl2k.py +f:tools/verification/rvgen/rvgen/templates/Kconfig +f:tools/verification/rvgen/rvgen/templates/container/Kconfig +f:tools/verification/rvgen/rvgen/templates/container/main.c +f:tools/verification/rvgen/rvgen/templates/container/main.h +f:tools/verification/rvgen/rvgen/templates/dot2k/main.c +f:tools/verification/rvgen/rvgen/templates/dot2k/trace.h +f:tools/verification/rvgen/rvgen/templates/ltl2k/main.c +f:tools/verification/rvgen/rvgen/templates/ltl2k/trace.h +f:tools/virtio/.gitignore +f:tools/virtio/Makefile +f:tools/virtio/asm/barrier.h +f:tools/virtio/crypto/hash.h +f:tools/virtio/generated/autoconf.h +f:tools/virtio/linux/bug.h +f:tools/virtio/linux/build_bug.h +f:tools/virtio/linux/compiler.h +f:tools/virtio/linux/cpumask.h +f:tools/virtio/linux/device.h +f:tools/virtio/linux/dma-mapping.h +f:tools/virtio/linux/err.h +f:tools/virtio/linux/export.h +f:tools/virtio/linux/gfp.h +f:tools/virtio/linux/hrtimer.h +f:tools/virtio/linux/irqreturn.h +f:tools/virtio/linux/kernel.h +f:tools/virtio/linux/kmemleak.h +f:tools/virtio/linux/kmsan.h +f:tools/virtio/linux/mm_types.h +f:tools/virtio/linux/module.h +f:tools/virtio/linux/printk.h +f:tools/virtio/linux/ratelimit.h +f:tools/virtio/linux/scatterlist.h +f:tools/virtio/linux/slab.h +f:tools/virtio/linux/spinlock.h +f:tools/virtio/linux/thread_info.h +f:tools/virtio/linux/topology.h +f:tools/virtio/linux/uaccess.h +f:tools/virtio/linux/uio.h +f:tools/virtio/linux/virtio.h +f:tools/virtio/linux/virtio_byteorder.h +f:tools/virtio/linux/virtio_config.h +f:tools/virtio/linux/virtio_ring.h +f:tools/virtio/linux/vringh.h +f:tools/virtio/ringtest/.gitignore +f:tools/virtio/ringtest/Makefile +f:tools/virtio/ringtest/README +f:tools/virtio/ringtest/main.c +f:tools/virtio/ringtest/main.h +f:tools/virtio/ringtest/noring.c +f:tools/virtio/ringtest/ptr_ring.c +f:tools/virtio/ringtest/ring.c +f:tools/virtio/ringtest/run-on-all.sh +f:tools/virtio/ringtest/virtio_ring_0_9.c +f:tools/virtio/ringtest/virtio_ring_inorder.c +f:tools/virtio/ringtest/virtio_ring_poll.c +f:tools/virtio/uapi/linux/uio.h +f:tools/virtio/uapi/linux/virtio_config.h +f:tools/virtio/uapi/linux/virtio_ring.h +f:tools/virtio/uapi/linux/virtio_types.h +f:tools/virtio/vhost_net_test.c +f:tools/virtio/vhost_test/Makefile +f:tools/virtio/vhost_test/vhost_test.c +f:tools/virtio/virtio-trace/Makefile +f:tools/virtio/virtio-trace/README +f:tools/virtio/virtio-trace/trace-agent-ctl.c +f:tools/virtio/virtio-trace/trace-agent-rw.c +f:tools/virtio/virtio-trace/trace-agent.c +f:tools/virtio/virtio-trace/trace-agent.h +f:tools/virtio/virtio_test.c +f:tools/virtio/vringh_test.c +f:tools/virtio/xen/xen.h +f:tools/wmi/Makefile +f:tools/wmi/dell-smbios-example.c +f:tools/workqueue/wq_dump.py +f:tools/workqueue/wq_monitor.py +f:tools/writeback/wb_monitor.py +f:usr/.gitignore +f:usr/Kconfig +f:usr/Makefile +f:usr/default_cpio_list +f:usr/dummy-include/stdbool.h +f:usr/dummy-include/stdlib.h +f:usr/gen_init_cpio.c +f:usr/gen_initramfs.sh +f:usr/include/.gitignore +f:usr/include/Makefile +f:usr/include/headers_check.pl +f:usr/initramfs_data.S +f:virt/Makefile +f:virt/kvm/Kconfig +f:virt/kvm/Makefile.kvm +f:virt/kvm/async_pf.c +f:virt/kvm/async_pf.h +f:virt/kvm/binary_stats.c +f:virt/kvm/coalesced_mmio.c +f:virt/kvm/coalesced_mmio.h +f:virt/kvm/dirty_ring.c +f:virt/kvm/eventfd.c +f:virt/kvm/guest_memfd.c +f:virt/kvm/irqchip.c +f:virt/kvm/kvm_main.c +f:virt/kvm/kvm_mm.h +f:virt/kvm/pfncache.c +f:virt/kvm/vfio.c +f:virt/kvm/vfio.h +f:virt/lib/Kconfig +f:virt/lib/Makefile +f:virt/lib/irqbypass.c diff --git a/crates/project_panel/benches/sorting.rs b/crates/project_panel/benches/sorting.rs new file mode 100644 index 0000000000000000000000000000000000000000..73d92ccd4913a008020a1480422c020117a723ca --- /dev/null +++ b/crates/project_panel/benches/sorting.rs @@ -0,0 +1,55 @@ +use criterion::{Criterion, criterion_group, criterion_main}; +use project::{Entry, EntryKind, GitEntry, ProjectEntryId}; +use project_panel::par_sort_worktree_entries; +use std::sync::Arc; +use util::rel_path::RelPath; + +fn load_linux_repo_snapshot() -> Vec { + let file = std::fs::read_to_string( + "/Users/hiro/Projects/zed/crates/project_panel/benches/linux_repo_snapshot.txt", + ) + .expect("Failed to read file"); + file.lines() + .filter_map(|line| { + let kind = match line.chars().next() { + Some('f') => EntryKind::File, + Some('d') => EntryKind::Dir, + _ => return None, + }; + + let entry = Entry { + kind, + path: Arc::from(RelPath::unix(&(line.trim_end()[2..])).unwrap()), + id: ProjectEntryId::default(), + size: 0, + inode: 0, + mtime: None, + canonical_path: None, + is_ignored: false, + is_always_included: false, + is_external: false, + is_private: false, + is_hidden: false, + char_bag: Default::default(), + is_fifo: false, + }; + Some(GitEntry { + entry, + git_summary: Default::default(), + }) + }) + .collect() +} +fn criterion_benchmark(c: &mut Criterion) { + let snapshot = load_linux_repo_snapshot(); + c.bench_function("Sort linux worktree snapshot", |b| { + b.iter_batched( + || snapshot.clone(), + |mut snapshot| par_sort_worktree_entries(&mut snapshot), + criterion::BatchSize::LargeInput, + ); + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 70ceb639acb5d76b35c852654d31093839006e23..aac3769ac4ed3def5dfd427fe13885176fd43047 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -17,38 +17,36 @@ use file_icons::FileIcons; use git::status::GitSummary; use git_ui::file_diff_view::FileDiffView; use gpui::{ - Action, AnyElement, App, ArcCow, AsyncWindowContext, Bounds, ClipboardItem, Context, - CursorStyle, DismissEvent, Div, DragMoveEvent, Entity, EventEmitter, ExternalPaths, - FocusHandle, Focusable, Hsla, InteractiveElement, KeyContext, ListHorizontalSizingBehavior, - ListSizingBehavior, Modifiers, ModifiersChangedEvent, MouseButton, MouseDownEvent, - ParentElement, Pixels, Point, PromptLevel, Render, ScrollStrategy, Stateful, Styled, - Subscription, Task, UniformListScrollHandle, WeakEntity, Window, actions, anchored, deferred, - div, hsla, linear_color_stop, linear_gradient, point, px, size, transparent_white, - uniform_list, + Action, AnyElement, App, AsyncWindowContext, Bounds, ClipboardItem, Context, CursorStyle, + DismissEvent, Div, DragMoveEvent, Entity, EventEmitter, ExternalPaths, FocusHandle, Focusable, + Hsla, InteractiveElement, KeyContext, ListHorizontalSizingBehavior, ListSizingBehavior, + Modifiers, ModifiersChangedEvent, MouseButton, MouseDownEvent, ParentElement, Pixels, Point, + PromptLevel, Render, ScrollStrategy, Stateful, Styled, Subscription, Task, + UniformListScrollHandle, WeakEntity, Window, actions, anchored, deferred, div, hsla, + linear_color_stop, linear_gradient, point, px, size, transparent_white, uniform_list, }; -use indexmap::IndexMap; use language::DiagnosticSeverity; use menu::{Confirm, SelectFirst, SelectLast, SelectNext, SelectPrevious}; use project::{ Entry, EntryKind, Fs, GitEntry, GitEntryRef, GitTraversal, Project, ProjectEntryId, ProjectPath, Worktree, WorktreeId, - git_store::{GitStoreEvent, git_traversal::ChildEntriesGitIter}, + git_store::{GitStoreEvent, RepositoryEvent, git_traversal::ChildEntriesGitIter}, project_settings::GoToDiagnosticSeverityFilter, - relativize_path, -}; -use project_panel_settings::{ - ProjectPanelDockPosition, ProjectPanelSettings, ShowDiagnostics, ShowIndentGuides, }; +use project_panel_settings::ProjectPanelSettings; +use rayon::slice::ParallelSliceMut; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore, update_settings_file}; +use settings::{ + DockSide, ProjectPanelEntrySpacing, Settings, SettingsStore, ShowDiagnostics, ShowIndentGuides, + update_settings_file, +}; use smallvec::SmallVec; use std::{any::TypeId, time::Instant}; use std::{ cell::OnceCell, cmp, collections::HashSet, - ffi::OsStr, ops::Range, path::{Path, PathBuf}, sync::Arc, @@ -61,7 +59,7 @@ use ui::{ ScrollAxes, ScrollableHandle, Scrollbars, StickyCandidate, Tooltip, WithScrollbar, prelude::*, v_flex, }; -use util::{ResultExt, TakeUntilExt, TryFutureExt, maybe, paths::compare_paths}; +use util::{ResultExt, TakeUntilExt, TryFutureExt, maybe, paths::compare_paths, rel_path::RelPath}; use workspace::{ DraggedSelection, OpenInTerminal, OpenOptions, OpenVisible, PreviewTabsSettings, SelectedEntry, SplitDirection, Workspace, @@ -77,7 +75,37 @@ const NEW_ENTRY_ID: ProjectEntryId = ProjectEntryId::MAX; struct VisibleEntriesForWorktree { worktree_id: WorktreeId, entries: Vec, - index: OnceCell>>, + index: OnceCell>>, +} + +struct State { + last_worktree_root_id: Option, + /// Maps from leaf project entry ID to the currently selected ancestor. + /// Relevant only for auto-fold dirs, where a single project panel entry may actually consist of several + /// project entries (and all non-leaf nodes are guaranteed to be directories). + ancestors: HashMap, + visible_entries: Vec, + max_width_item_index: Option, + // Currently selected leaf entry (see auto-folding for a definition of that) in a file tree + selection: Option, + edit_state: Option, + unfolded_dir_ids: HashSet, + expanded_dir_ids: HashMap>, +} + +impl State { + fn derive(old: &Self) -> Self { + Self { + last_worktree_root_id: None, + ancestors: Default::default(), + visible_entries: Default::default(), + max_width_item_index: None, + edit_state: old.edit_state.clone(), + unfolded_dir_ids: old.unfolded_dir_ids.clone(), + selection: old.selection, + expanded_dir_ids: old.expanded_dir_ids.clone(), + } + } } pub struct ProjectPanel { @@ -88,29 +116,18 @@ pub struct ProjectPanel { // An update loop that keeps incrementing/decrementing scroll offset while there is a dragged entry that's // hovered over the start/end of a list. hover_scroll_task: Option>, - visible_entries: Vec, - /// Maps from leaf project entry ID to the currently selected ancestor. - /// Relevant only for auto-fold dirs, where a single project panel entry may actually consist of several - /// project entries (and all non-leaf nodes are guaranteed to be directories). - ancestors: HashMap, + rendered_entries_len: usize, folded_directory_drag_target: Option, - last_worktree_root_id: Option, drag_target_entry: Option, - expanded_dir_ids: HashMap>, - unfolded_dir_ids: HashSet, - // Currently selected leaf entry (see auto-folding for a definition of that) in a file tree - selection: Option, marked_entries: Vec, context_menu: Option<(Entity, Point, Subscription)>, - edit_state: Option, filename_editor: Entity, clipboard: Option, _dragged_entry_destination: Option>, workspace: WeakEntity, width: Option, pending_serialization: Task>, - diagnostics: HashMap<(WorktreeId, PathBuf), DiagnosticSeverity>, - max_width_item_index: Option, + diagnostics: HashMap<(WorktreeId, Arc), DiagnosticSeverity>, diagnostic_summary_update: Task<()>, // We keep track of the mouse down state on entries so we don't flash the UI // in case a user clicks to open a file. @@ -119,6 +136,8 @@ pub struct ProjectPanel { previous_drag_position: Option>, sticky_items_count: usize, last_reported_update: Instant, + update_visible_entries_task: Task<()>, + state: State, } enum DragTarget { @@ -155,7 +174,7 @@ struct EditState { leaf_entry_id: Option, is_dir: bool, depth: usize, - processing_filename: Option, + processing_filename: Option>, previously_focused: Option, validation_state: ValidationState, } @@ -176,7 +195,7 @@ enum ClipboardEntry { struct EntryDetails { filename: String, icon: Option, - path: Arc, + path: Arc, depth: usize, kind: EntryKind, is_ignored: bool, @@ -281,6 +300,16 @@ actions!( UnfoldDirectory, /// Folds the selected directory. FoldDirectory, + /// Scroll half a page upwards + ScrollUp, + /// Scroll half a page downwards + ScrollDown, + /// Scroll until the cursor displays at the center + ScrollCursorCenter, + /// Scroll until the cursor displays at the top + ScrollCursorTop, + /// Scroll until the cursor displays at the bottom + ScrollCursorBottom, /// Selects the parent directory. SelectParent, /// Selects the next entry with git changes. @@ -296,7 +325,7 @@ actions!( ] ); -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] struct FoldedAncestors { current_ancestor_depth: usize, ancestors: Vec, @@ -343,8 +372,14 @@ pub fn init(cx: &mut App) { workspace.register_action(|workspace, _: &ToggleHideGitIgnore, _, cx| { let fs = workspace.app_state().fs.clone(); - update_settings_file::(fs, cx, move |setting, _| { - setting.hide_gitignore = Some(!setting.hide_gitignore.unwrap_or(false)); + update_settings_file(fs, cx, move |setting, _| { + setting.project_panel.get_or_insert_default().hide_gitignore = Some( + !setting + .project_panel + .get_or_insert_default() + .hide_gitignore + .unwrap_or(false), + ); }) }); @@ -363,7 +398,7 @@ pub fn init(cx: &mut App) { if let Some(first_marked) = panel.marked_entries.first() { let first_marked = *first_marked; panel.marked_entries.clear(); - panel.selection = Some(first_marked); + panel.state.selection = Some(first_marked); } panel.rename(action, window, cx); }); @@ -452,6 +487,7 @@ impl ProjectPanel { ) -> Entity { let project = workspace.project().clone(); let git_store = project.read(cx).git_store().clone(); + let path_style = project.read(cx).path_style(cx); let project_panel = cx.new(|cx| { let focus_handle = cx.focus_handle(); cx.on_focus(&focus_handle, window, Self::focus_in).detach(); @@ -460,106 +496,122 @@ impl ProjectPanel { }) .detach(); - cx.subscribe(&git_store, |this, _, event, cx| match event { - GitStoreEvent::RepositoryUpdated(_, _, _) - | GitStoreEvent::RepositoryAdded(_) - | GitStoreEvent::RepositoryRemoved(_) => { - this.update_visible_entries(None, cx); - cx.notify(); - } - _ => {} - }) + cx.subscribe_in( + &git_store, + window, + |this, _, event, window, cx| match event { + GitStoreEvent::RepositoryUpdated(_, RepositoryEvent::Updated { .. }, _) + | GitStoreEvent::RepositoryAdded(_) + | GitStoreEvent::RepositoryRemoved(_) => { + this.update_visible_entries(None, false, false, window, cx); + cx.notify(); + } + _ => {} + }, + ) .detach(); - cx.subscribe(&project, |this, project, event, cx| match event { - project::Event::ActiveEntryChanged(Some(entry_id)) => { - if ProjectPanelSettings::get_global(cx).auto_reveal_entries { - this.reveal_entry(project, *entry_id, true, cx).ok(); + cx.subscribe_in( + &project, + window, + |this, project, event, window, cx| match event { + project::Event::ActiveEntryChanged(Some(entry_id)) => { + if ProjectPanelSettings::get_global(cx).auto_reveal_entries { + this.reveal_entry(project.clone(), *entry_id, true, window, cx) + .ok(); + } } - } - project::Event::ActiveEntryChanged(None) => { - let is_active_item_file_diff_view = this - .workspace - .upgrade() - .and_then(|ws| ws.read(cx).active_item(cx)) - .map(|item| item.act_as_type(TypeId::of::(), cx).is_some()) - .unwrap_or(false); - if !is_active_item_file_diff_view { - this.marked_entries.clear(); + project::Event::ActiveEntryChanged(None) => { + let is_active_item_file_diff_view = this + .workspace + .upgrade() + .and_then(|ws| ws.read(cx).active_item(cx)) + .map(|item| { + item.act_as_type(TypeId::of::(), cx).is_some() + }) + .unwrap_or(false); + if !is_active_item_file_diff_view { + this.marked_entries.clear(); + } } - } - project::Event::RevealInProjectPanel(entry_id) => { - if let Some(()) = this.reveal_entry(project, *entry_id, false, cx).log_err() { + project::Event::RevealInProjectPanel(entry_id) => { + if let Some(()) = this + .reveal_entry(project.clone(), *entry_id, false, window, cx) + .log_err() + { + cx.emit(PanelEvent::Activate); + } + } + project::Event::ActivateProjectPanel => { cx.emit(PanelEvent::Activate); } - } - project::Event::ActivateProjectPanel => { - cx.emit(PanelEvent::Activate); - } - project::Event::DiskBasedDiagnosticsFinished { .. } - | project::Event::DiagnosticsUpdated { .. } => { - if ProjectPanelSettings::get_global(cx).show_diagnostics != ShowDiagnostics::Off - { - this.diagnostic_summary_update = cx.spawn(async move |this, cx| { - cx.background_executor() - .timer(Duration::from_millis(30)) - .await; - this.update(cx, |this, cx| { - this.update_diagnostics(cx); - cx.notify(); - }) - .log_err(); - }); + project::Event::DiskBasedDiagnosticsFinished { .. } + | project::Event::DiagnosticsUpdated { .. } => { + if ProjectPanelSettings::get_global(cx).show_diagnostics + != ShowDiagnostics::Off + { + this.diagnostic_summary_update = cx.spawn(async move |this, cx| { + cx.background_executor() + .timer(Duration::from_millis(30)) + .await; + this.update(cx, |this, cx| { + this.update_diagnostics(cx); + cx.notify(); + }) + .log_err(); + }); + } } - } - project::Event::WorktreeRemoved(id) => { - this.expanded_dir_ids.remove(id); - this.update_visible_entries(None, cx); - cx.notify(); - } - project::Event::WorktreeUpdatedEntries(_, _) - | project::Event::WorktreeAdded(_) - | project::Event::WorktreeOrderChanged => { - this.update_visible_entries(None, cx); - cx.notify(); - } - project::Event::ExpandedAllForEntry(worktree_id, entry_id) => { - if let Some((worktree, expanded_dir_ids)) = project - .read(cx) - .worktree_for_id(*worktree_id, cx) - .zip(this.expanded_dir_ids.get_mut(worktree_id)) - { - let worktree = worktree.read(cx); - - let Some(entry) = worktree.entry_for_id(*entry_id) else { - return; - }; - let include_ignored_dirs = !entry.is_ignored; + project::Event::WorktreeRemoved(id) => { + this.state.expanded_dir_ids.remove(id); + this.update_visible_entries(None, false, false, window, cx); + cx.notify(); + } + project::Event::WorktreeUpdatedEntries(_, _) + | project::Event::WorktreeAdded(_) + | project::Event::WorktreeOrderChanged => { + this.update_visible_entries(None, false, false, window, cx); + cx.notify(); + } + project::Event::ExpandedAllForEntry(worktree_id, entry_id) => { + if let Some((worktree, expanded_dir_ids)) = project + .read(cx) + .worktree_for_id(*worktree_id, cx) + .zip(this.state.expanded_dir_ids.get_mut(worktree_id)) + { + let worktree = worktree.read(cx); - let mut dirs_to_expand = vec![*entry_id]; - while let Some(current_id) = dirs_to_expand.pop() { - let Some(current_entry) = worktree.entry_for_id(current_id) else { - continue; + let Some(entry) = worktree.entry_for_id(*entry_id) else { + return; }; - for child in worktree.child_entries(¤t_entry.path) { - if !child.is_dir() || (include_ignored_dirs && child.is_ignored) { + let include_ignored_dirs = !entry.is_ignored; + + let mut dirs_to_expand = vec![*entry_id]; + while let Some(current_id) = dirs_to_expand.pop() { + let Some(current_entry) = worktree.entry_for_id(current_id) else { continue; - } + }; + for child in worktree.child_entries(¤t_entry.path) { + if !child.is_dir() || (include_ignored_dirs && child.is_ignored) + { + continue; + } - dirs_to_expand.push(child.id); + dirs_to_expand.push(child.id); - if let Err(ix) = expanded_dir_ids.binary_search(&child.id) { - expanded_dir_ids.insert(ix, child.id); + if let Err(ix) = expanded_dir_ids.binary_search(&child.id) { + expanded_dir_ids.insert(ix, child.id); + } + this.state.unfolded_dir_ids.insert(child.id); } - this.unfolded_dir_ids.insert(child.id); } + this.update_visible_entries(None, false, false, window, cx); + cx.notify(); } - this.update_visible_entries(None, cx); - cx.notify(); } - } - _ => {} - }) + _ => {} + }, + ) .detach(); let trash_action = [TypeId::of::()]; @@ -573,9 +625,10 @@ impl ProjectPanel { let filename_editor = cx.new(|cx| Editor::single_line(window, cx)); - cx.subscribe( + cx.subscribe_in( &filename_editor, - |project_panel, _, editor_event, cx| match editor_event { + window, + |project_panel, _, editor_event, window, cx| match editor_event { EditorEvent::BufferEdited => { project_panel.populate_validation_error(cx); project_panel.autoscroll(cx); @@ -585,13 +638,22 @@ impl ProjectPanel { } EditorEvent::Blurred => { if project_panel + .state .edit_state .as_ref() .is_some_and(|state| state.processing_filename.is_none()) { - project_panel.edit_state = None; - project_panel.update_visible_entries(None, cx); - cx.notify(); + match project_panel.confirm_edit(window, cx) { + Some(task) => { + task.detach_and_notify_err(window, cx); + } + None => { + project_panel.state.edit_state = None; + project_panel + .update_visible_entries(None, false, false, window, cx); + cx.notify(); + } + } } } _ => {} @@ -605,14 +667,17 @@ impl ProjectPanel { .detach(); let mut project_panel_settings = *ProjectPanelSettings::get_global(cx); - cx.observe_global::(move |this, cx| { + cx.observe_global_in::(window, move |this, window, cx| { let new_settings = *ProjectPanelSettings::get_global(cx); if project_panel_settings != new_settings { if project_panel_settings.hide_gitignore != new_settings.hide_gitignore { - this.update_visible_entries(None, cx); + this.update_visible_entries(None, false, false, window, cx); } if project_panel_settings.hide_root != new_settings.hide_root { - this.update_visible_entries(None, cx); + this.update_visible_entries(None, false, false, window, cx); + } + if project_panel_settings.hide_hidden != new_settings.hide_hidden { + this.update_visible_entries(None, false, false, window, cx); } if project_panel_settings.sticky_scroll && !new_settings.sticky_scroll { this.sticky_items_count = 0; @@ -630,16 +695,11 @@ impl ProjectPanel { hover_scroll_task: None, fs: workspace.app_state().fs.clone(), focus_handle, - visible_entries: Default::default(), - ancestors: Default::default(), + rendered_entries_len: 0, folded_directory_drag_target: None, drag_target_entry: None, - last_worktree_root_id: Default::default(), - expanded_dir_ids: Default::default(), - unfolded_dir_ids: Default::default(), - selection: None, + marked_entries: Default::default(), - edit_state: None, context_menu: None, filename_editor, clipboard: None, @@ -647,7 +707,6 @@ impl ProjectPanel { workspace: workspace.weak_handle(), width: None, pending_serialization: Task::ready(None), - max_width_item_index: None, diagnostics: Default::default(), diagnostic_summary_update: Task::ready(()), scroll_handle, @@ -656,8 +715,19 @@ impl ProjectPanel { previous_drag_position: None, sticky_items_count: 0, last_reported_update: Instant::now(), + state: State { + max_width_item_index: None, + edit_state: None, + selection: None, + last_worktree_root_id: Default::default(), + visible_entries: Default::default(), + ancestors: Default::default(), + expanded_dir_ids: Default::default(), + unfolded_dir_ids: Default::default(), + }, + update_visible_entries_task: Task::ready(()), }; - this.update_visible_entries(None, cx); + this.update_visible_entries(None, false, false, window, cx); this }); @@ -698,7 +768,7 @@ impl ProjectPanel { }, ErrorCode::UnsharedItem => Some(format!( "{} is not shared by the host. This could be because it has been marked as `private`", - file_path.display() + file_path.display(path_style) )), // See note in worktree.rs where this error originates. Returning Some in this case prevents // the error popup from saying "Try Again", which is a red herring in this case @@ -713,7 +783,7 @@ impl ProjectPanel { let entry = SelectedEntry { worktree_id, entry_id }; project_panel.marked_entries.clear(); project_panel.marked_entries.push(entry); - project_panel.selection = Some(entry); + project_panel.state.selection = Some(entry); }); if !focus_opened_item { let focus_handle = project_panel.read(cx).focus_handle.clone(); @@ -788,7 +858,7 @@ impl ProjectPanel { } fn update_diagnostics(&mut self, cx: &mut Context) { - let mut diagnostics: HashMap<(WorktreeId, PathBuf), DiagnosticSeverity> = + let mut diagnostics: HashMap<(WorktreeId, Arc), DiagnosticSeverity> = Default::default(); let show_diagnostics_setting = ProjectPanelSettings::get_global(cx).show_diagnostics; @@ -808,20 +878,12 @@ impl ProjectPanel { } }) .for_each(|(project_path, diagnostic_severity)| { - let mut path_buffer = PathBuf::new(); - Self::update_strongest_diagnostic_severity( - &mut diagnostics, - &project_path, - path_buffer.clone(), - diagnostic_severity, - ); - - for component in project_path.path.components() { - path_buffer.push(component); + let ancestors = project_path.path.ancestors().collect::>(); + for path in ancestors.into_iter().rev() { Self::update_strongest_diagnostic_severity( &mut diagnostics, &project_path, - path_buffer.clone(), + path.into(), diagnostic_severity, ); } @@ -831,9 +893,9 @@ impl ProjectPanel { } fn update_strongest_diagnostic_severity( - diagnostics: &mut HashMap<(WorktreeId, PathBuf), DiagnosticSeverity>, + diagnostics: &mut HashMap<(WorktreeId, Arc), DiagnosticSeverity>, project_path: &ProjectPath, - path_buffer: PathBuf, + path_buffer: Arc, diagnostic_severity: DiagnosticSeverity, ) { diagnostics @@ -906,7 +968,7 @@ impl ProjectPanel { return; }; - self.selection = Some(SelectedEntry { + self.state.selection = Some(SelectedEntry { worktree_id, entry_id, }); @@ -1017,7 +1079,7 @@ impl ProjectPanel { } fn is_unfoldable(&self, entry: &Entry, worktree: &Worktree) -> bool { - if !entry.is_dir() || self.unfolded_dir_ids.contains(&entry.id) { + if !entry.is_dir() || self.state.unfolded_dir_ids.contains(&entry.id) { return false; } @@ -1054,7 +1116,7 @@ impl ProjectPanel { cx: &mut Context, ) { if let Some((worktree, entry)) = self.selected_entry(cx) { - if let Some(folded_ancestors) = self.ancestors.get_mut(&entry.id) + if let Some(folded_ancestors) = self.state.ancestors.get_mut(&entry.id) && folded_ancestors.current_ancestor_depth > 0 { folded_ancestors.current_ancestor_depth -= 1; @@ -1064,12 +1126,13 @@ impl ProjectPanel { if entry.is_dir() { let worktree_id = worktree.id(); let entry_id = entry.id; - let expanded_dir_ids = - if let Some(expanded_dir_ids) = self.expanded_dir_ids.get_mut(&worktree_id) { - expanded_dir_ids - } else { - return; - }; + let expanded_dir_ids = if let Some(expanded_dir_ids) = + self.state.expanded_dir_ids.get_mut(&worktree_id) + { + expanded_dir_ids + } else { + return; + }; match expanded_dir_ids.binary_search(&entry_id) { Ok(_) => self.select_next(&SelectNext, window, cx), @@ -1079,7 +1142,7 @@ impl ProjectPanel { }); expanded_dir_ids.insert(ix, entry_id); - self.update_visible_entries(None, cx); + self.update_visible_entries(None, false, false, window, cx); cx.notify(); } } @@ -1090,18 +1153,24 @@ impl ProjectPanel { fn collapse_selected_entry( &mut self, _: &CollapseSelectedEntry, - _: &mut Window, + window: &mut Window, cx: &mut Context, ) { let Some((worktree, entry)) = self.selected_entry_handle(cx) else { return; }; - self.collapse_entry(entry.clone(), worktree, cx) + self.collapse_entry(entry.clone(), worktree, window, cx) } - fn collapse_entry(&mut self, entry: Entry, worktree: Entity, cx: &mut Context) { + fn collapse_entry( + &mut self, + entry: Entry, + worktree: Entity, + window: &mut Window, + cx: &mut Context, + ) { let worktree = worktree.read(cx); - if let Some(folded_ancestors) = self.ancestors.get_mut(&entry.id) + if let Some(folded_ancestors) = self.state.ancestors.get_mut(&entry.id) && folded_ancestors.current_ancestor_depth + 1 < folded_ancestors.max_ancestor_depth() { folded_ancestors.current_ancestor_depth += 1; @@ -1110,7 +1179,7 @@ impl ProjectPanel { } let worktree_id = worktree.id(); let expanded_dir_ids = - if let Some(expanded_dir_ids) = self.expanded_dir_ids.get_mut(&worktree_id) { + if let Some(expanded_dir_ids) = self.state.expanded_dir_ids.get_mut(&worktree_id) { expanded_dir_ids } else { return; @@ -1122,7 +1191,13 @@ impl ProjectPanel { match expanded_dir_ids.binary_search(&entry_id) { Ok(ix) => { expanded_dir_ids.remove(ix); - self.update_visible_entries(Some((worktree_id, entry_id)), cx); + self.update_visible_entries( + Some((worktree_id, entry_id)), + false, + false, + window, + cx, + ); cx.notify(); break; } @@ -1142,14 +1217,39 @@ impl ProjectPanel { pub fn collapse_all_entries( &mut self, _: &CollapseAllEntries, - _: &mut Window, + window: &mut Window, cx: &mut Context, ) { // By keeping entries for fully collapsed worktrees, we avoid expanding them within update_visible_entries // (which is it's default behavior when there's no entry for a worktree in expanded_dir_ids). - self.expanded_dir_ids - .retain(|_, expanded_entries| expanded_entries.is_empty()); - self.update_visible_entries(None, cx); + let multiple_worktrees = self.project.read(cx).worktrees(cx).count() > 1; + let project = self.project.read(cx); + + self.state + .expanded_dir_ids + .iter_mut() + .for_each(|(worktree_id, expanded_entries)| { + if multiple_worktrees { + *expanded_entries = Default::default(); + return; + } + + let root_entry_id = project + .worktree_for_id(*worktree_id, cx) + .map(|worktree| worktree.read(cx).snapshot()) + .and_then(|worktree_snapshot| { + worktree_snapshot.root_entry().map(|entry| entry.id) + }); + + match root_entry_id { + Some(id) => { + expanded_entries.retain(|entry_id| entry_id == &id); + } + None => *expanded_entries = Default::default(), + }; + }); + + self.update_visible_entries(None, false, false, window, cx); cx.notify(); } @@ -1160,7 +1260,7 @@ impl ProjectPanel { cx: &mut Context, ) { if let Some(worktree_id) = self.project.read(cx).worktree_id_for_entry(entry_id, cx) - && let Some(expanded_dir_ids) = self.expanded_dir_ids.get_mut(&worktree_id) + && let Some(expanded_dir_ids) = self.state.expanded_dir_ids.get_mut(&worktree_id) { self.project.update(cx, |project, cx| { match expanded_dir_ids.binary_search(&entry_id) { @@ -1173,7 +1273,7 @@ impl ProjectPanel { } } }); - self.update_visible_entries(Some((worktree_id, entry_id)), cx); + self.update_visible_entries(Some((worktree_id, entry_id)), false, false, window, cx); window.focus(&self.focus_handle); cx.notify(); } @@ -1186,7 +1286,7 @@ impl ProjectPanel { cx: &mut Context, ) { if let Some(worktree_id) = self.project.read(cx).worktree_id_for_entry(entry_id, cx) - && let Some(expanded_dir_ids) = self.expanded_dir_ids.get_mut(&worktree_id) + && let Some(expanded_dir_ids) = self.state.expanded_dir_ids.get_mut(&worktree_id) { match expanded_dir_ids.binary_search(&entry_id) { Ok(_ix) => { @@ -1196,7 +1296,7 @@ impl ProjectPanel { self.expand_all_for_entry(worktree_id, entry_id, cx); } } - self.update_visible_entries(Some((worktree_id, entry_id)), cx); + self.update_visible_entries(Some((worktree_id, entry_id)), false, false, window, cx); window.focus(&self.focus_handle); cx.notify(); } @@ -1211,7 +1311,7 @@ impl ProjectPanel { self.project.update(cx, |project, cx| { if let Some((worktree, expanded_dir_ids)) = project .worktree_for_id(worktree_id, cx) - .zip(self.expanded_dir_ids.get_mut(&worktree_id)) + .zip(self.state.expanded_dir_ids.get_mut(&worktree_id)) { if let Some(task) = project.expand_all_for_entry(worktree_id, entry_id, cx) { task.detach(); @@ -1247,7 +1347,7 @@ impl ProjectPanel { self.project.update(cx, |project, cx| { if let Some((worktree, expanded_dir_ids)) = project .worktree_for_id(worktree_id, cx) - .zip(self.expanded_dir_ids.get_mut(&worktree_id)) + .zip(self.state.expanded_dir_ids.get_mut(&worktree_id)) { let worktree = worktree.read(cx); let mut dirs_to_collapse = vec![entry_id]; @@ -1260,7 +1360,7 @@ impl ProjectPanel { expanded_dir_ids.remove(ix); } if auto_fold_enabled { - self.unfolded_dir_ids.remove(¤t_id); + self.state.unfolded_dir_ids.remove(¤t_id); } for child in worktree.child_entries(¤t_entry.path) { if child.is_dir() { @@ -1273,7 +1373,7 @@ impl ProjectPanel { } fn select_previous(&mut self, _: &SelectPrevious, window: &mut Window, cx: &mut Context) { - if let Some(edit_state) = &self.edit_state + if let Some(edit_state) = &self.state.edit_state && edit_state.processing_filename.is_none() { self.filename_editor.update(cx, |editor, cx| { @@ -1288,14 +1388,14 @@ impl ProjectPanel { }); return; } - if let Some(selection) = self.selection { + if let Some(selection) = self.state.selection { let (mut worktree_ix, mut entry_ix, _) = self.index_for_selection(selection).unwrap_or_default(); if entry_ix > 0 { entry_ix -= 1; } else if worktree_ix > 0 { worktree_ix -= 1; - entry_ix = self.visible_entries[worktree_ix].entries.len() - 1; + entry_ix = self.state.visible_entries[worktree_ix].entries.len() - 1; } else { return; } @@ -1304,12 +1404,12 @@ impl ProjectPanel { worktree_id, entries, .. - } = &self.visible_entries[worktree_ix]; + } = &self.state.visible_entries[worktree_ix]; let selection = SelectedEntry { worktree_id: *worktree_id, entry_id: entries[entry_ix].id, }; - self.selection = Some(selection); + self.state.selection = Some(selection); if window.modifiers().shift { self.marked_entries.push(selection); } @@ -1382,12 +1482,37 @@ impl ProjectPanel { } fn populate_validation_error(&mut self, cx: &mut Context) { - let edit_state = match self.edit_state.as_mut() { + let edit_state = match self.state.edit_state.as_mut() { Some(state) => state, None => return, }; let filename = self.filename_editor.read(cx).text(cx); if !filename.is_empty() { + if filename.is_empty() { + edit_state.validation_state = + ValidationState::Error("File or directory name cannot be empty.".to_string()); + cx.notify(); + return; + } + + let trimmed_filename = filename.trim(); + if trimmed_filename != filename { + edit_state.validation_state = ValidationState::Warning( + "File or directory name contains leading or trailing whitespace.".to_string(), + ); + cx.notify(); + return; + } + let trimmed_filename = trimmed_filename.trim_start_matches('/'); + + let Ok(filename) = RelPath::unix(trimmed_filename) else { + edit_state.validation_state = ValidationState::Warning( + "File or directory name contains leading or trailing whitespace.".to_string(), + ); + cx.notify(); + return; + }; + if let Some(worktree) = self .project .read(cx) @@ -1396,21 +1521,17 @@ impl ProjectPanel { { let mut already_exists = false; if edit_state.is_new_entry() { - let new_path = entry.path.join(filename.trim_start_matches('/')); - if worktree - .read(cx) - .entry_for_path(new_path.as_path()) - .is_some() - { + let new_path = entry.path.join(filename); + if worktree.read(cx).entry_for_path(&new_path).is_some() { already_exists = true; } } else { let new_path = if let Some(parent) = entry.path.clone().parent() { parent.join(&filename) } else { - filename.clone().into() + filename.into() }; - if let Some(existing) = worktree.read(cx).entry_for_path(new_path.as_path()) + if let Some(existing) = worktree.read(cx).entry_for_path(&new_path) && existing.id != entry.id { already_exists = true; @@ -1419,26 +1540,12 @@ impl ProjectPanel { if already_exists { edit_state.validation_state = ValidationState::Error(format!( "File or directory '{}' already exists at location. Please choose a different name.", - filename + filename.as_unix_str() )); cx.notify(); return; } } - let trimmed_filename = filename.trim(); - if trimmed_filename.is_empty() { - edit_state.validation_state = - ValidationState::Error("File or directory name cannot be empty.".to_string()); - cx.notify(); - return; - } - if trimmed_filename != filename { - edit_state.validation_state = ValidationState::Warning( - "File or directory name contains leading or trailing whitespace.".to_string(), - ); - cx.notify(); - return; - } } edit_state.validation_state = ValidationState::None; cx.notify(); @@ -1449,18 +1556,27 @@ impl ProjectPanel { window: &mut Window, cx: &mut Context, ) -> Option>> { - let edit_state = self.edit_state.as_mut()?; + let edit_state = self.state.edit_state.as_mut()?; let worktree_id = edit_state.worktree_id; let is_new_entry = edit_state.is_new_entry(); let filename = self.filename_editor.read(cx).text(cx); if filename.trim().is_empty() { return None; } - #[cfg(not(target_os = "windows"))] - let filename_indicates_dir = filename.ends_with("/"); - // On Windows, path separator could be either `/` or `\`. - #[cfg(target_os = "windows")] - let filename_indicates_dir = filename.ends_with("/") || filename.ends_with("\\"); + + let path_style = self.project.read(cx).path_style(cx); + let filename_indicates_dir = if path_style.is_windows() { + filename.ends_with('/') || filename.ends_with('\\') + } else { + filename.ends_with('/') + }; + let filename = if path_style.is_windows() { + filename.trim_start_matches(&['/', '\\']) + } else { + filename.trim_start_matches('/') + }; + let filename = RelPath::new(filename.as_ref(), path_style).ok()?.into_arc(); + edit_state.is_dir = edit_state.is_dir || (edit_state.is_new_entry() && filename_indicates_dir); let is_dir = edit_state.is_dir; @@ -1470,30 +1586,26 @@ impl ProjectPanel { let edit_task; let edited_entry_id; if is_new_entry { - self.selection = Some(SelectedEntry { + self.state.selection = Some(SelectedEntry { worktree_id, entry_id: NEW_ENTRY_ID, }); - let new_path = entry.path.join(filename.trim_start_matches('/')); - if worktree - .read(cx) - .entry_for_path(new_path.as_path()) - .is_some() - { + let new_path = entry.path.join(&filename); + if worktree.read(cx).entry_for_path(&new_path).is_some() { return None; } edited_entry_id = NEW_ENTRY_ID; edit_task = self.project.update(cx, |project, cx| { - project.create_entry((worktree_id, &new_path), is_dir, cx) + project.create_entry((worktree_id, new_path), is_dir, cx) }); } else { let new_path = if let Some(parent) = entry.path.clone().parent() { parent.join(&filename) } else { - filename.clone().into() + filename.clone() }; - if let Some(existing) = worktree.read(cx).entry_for_path(new_path.as_path()) { + if let Some(existing) = worktree.read(cx).entry_for_path(&new_path) { if existing.id == entry.id { window.focus(&self.focus_handle); } @@ -1501,7 +1613,7 @@ impl ProjectPanel { } edited_entry_id = entry.id; edit_task = self.project.update(cx, |project, cx| { - project.rename_entry(entry.id, new_path.as_path(), cx) + project.rename_entry(entry.id, (worktree_id, new_path).into(), cx) }); }; @@ -1512,28 +1624,28 @@ impl ProjectPanel { Some(cx.spawn_in(window, async move |project_panel, cx| { let new_entry = edit_task.await; project_panel.update(cx, |project_panel, cx| { - project_panel.edit_state = None; + project_panel.state.edit_state = None; cx.notify(); })?; match new_entry { Err(e) => { - project_panel.update( cx, |project_panel, cx| { + project_panel.update_in( cx, |project_panel, window, cx| { project_panel.marked_entries.clear(); - project_panel.update_visible_entries(None, cx); + project_panel.update_visible_entries(None, false, false, window, cx); }).ok(); Err(e)?; } Ok(CreatedEntry::Included(new_entry)) => { - project_panel.update( cx, |project_panel, cx| { - if let Some(selection) = &mut project_panel.selection + project_panel.update_in( cx, |project_panel, window, cx| { + if let Some(selection) = &mut project_panel.state.selection && selection.entry_id == edited_entry_id { selection.worktree_id = worktree_id; selection.entry_id = new_entry.id; project_panel.marked_entries.clear(); project_panel.expand_to_selection(cx); } - project_panel.update_visible_entries(None, cx); + project_panel.update_visible_entries(None, false, false, window, cx); if is_new_entry && !is_dir { project_panel.open_entry(new_entry.id, true, false, cx); } @@ -1542,9 +1654,9 @@ impl ProjectPanel { } Ok(CreatedEntry::Excluded { abs_path }) => { if let Some(open_task) = project_panel - .update_in( cx, |project_panel, window, cx| { + .update_in(cx, |project_panel, window, cx| { project_panel.marked_entries.clear(); - project_panel.update_visible_entries(None, cx); + project_panel.update_visible_entries(None, false, false, window, cx); if is_dir { project_panel.project.update(cx, |_, cx| { @@ -1581,14 +1693,14 @@ impl ProjectPanel { return; } - let previous_edit_state = self.edit_state.take(); - self.update_visible_entries(None, cx); + let previous_edit_state = self.state.edit_state.take(); + self.update_visible_entries(None, false, false, window, cx); self.marked_entries.clear(); if let Some(previously_focused) = previous_edit_state.and_then(|edit_state| edit_state.previously_focused) { - self.selection = Some(previously_focused); + self.state.selection = Some(previously_focused); self.autoscroll(cx); } @@ -1636,10 +1748,11 @@ impl ProjectPanel { fn add_entry(&mut self, is_dir: bool, window: &mut Window, cx: &mut Context) { let Some((worktree_id, entry_id)) = self + .state .selection .map(|entry| (entry.worktree_id, entry.entry_id)) .or_else(|| { - let entry_id = self.last_worktree_root_id?; + let entry_id = self.state.last_worktree_root_id?; let worktree_id = self .project .read(cx) @@ -1647,7 +1760,7 @@ impl ProjectPanel { .read(cx) .id(); - self.selection = Some(SelectedEntry { + self.state.selection = Some(SelectedEntry { worktree_id, entry_id, }); @@ -1664,7 +1777,7 @@ impl ProjectPanel { .project .read(cx) .worktree_for_id(worktree_id, cx) - .zip(self.expanded_dir_ids.get_mut(&worktree_id)) + .zip(self.state.expanded_dir_ids.get_mut(&worktree_id)) { let worktree = worktree.read(cx); if let Some(mut entry) = worktree.entry_for_id(new_entry_id) { @@ -1693,27 +1806,22 @@ impl ProjectPanel { }; self.marked_entries.clear(); - self.edit_state = Some(EditState { + self.state.edit_state = Some(EditState { worktree_id, entry_id: directory_id, leaf_entry_id: None, is_dir, processing_filename: None, - previously_focused: self.selection, + previously_focused: self.state.selection, depth: 0, validation_state: ValidationState::None, }); - self.filename_editor.update(cx, |editor, cx| { - editor.clear(window, cx); - window.focus(&editor.focus_handle(cx)); - }); - self.update_visible_entries(Some((worktree_id, NEW_ENTRY_ID)), cx); - self.autoscroll(cx); + self.update_visible_entries(Some((worktree_id, NEW_ENTRY_ID)), true, true, window, cx); cx.notify(); } fn unflatten_entry_id(&self, leaf_entry_id: ProjectEntryId) -> ProjectEntryId { - if let Some(ancestors) = self.ancestors.get(&leaf_entry_id) { + if let Some(ancestors) = self.state.ancestors.get(&leaf_entry_id) { ancestors .ancestors .get(ancestors.current_ancestor_depth) @@ -1733,7 +1841,7 @@ impl ProjectPanel { if let Some(SelectedEntry { worktree_id, entry_id, - }) = self.selection + }) = self.state.selection && let Some(worktree) = self.project.read(cx).worktree_for_id(worktree_id, cx) { let sub_entry_id = self.unflatten_entry_id(entry_id); @@ -1752,7 +1860,7 @@ impl ProjectPanel { } } - self.edit_state = Some(EditState { + self.state.edit_state = Some(EditState { worktree_id, entry_id: sub_entry_id, leaf_entry_id: Some(entry_id), @@ -1762,14 +1870,9 @@ impl ProjectPanel { depth: 0, validation_state: ValidationState::None, }); - let file_name = entry - .path - .file_name() - .map(|s| s.to_string_lossy()) - .unwrap_or_default() - .to_string(); + let file_name = entry.path.file_name().unwrap_or_default().to_string(); let selection = selection.unwrap_or_else(|| { - let file_stem = entry.path.file_stem().map(|s| s.to_string_lossy()); + let file_stem = entry.path.file_stem().map(|s| s.to_string()); let selection_end = file_stem.map_or(file_name.len(), |file_stem| file_stem.len()); 0..selection_end @@ -1781,8 +1884,7 @@ impl ProjectPanel { }); window.focus(&editor.focus_handle(cx)); }); - self.update_visible_entries(None, cx); - self.autoscroll(cx); + self.update_visible_entries(None, false, true, window, cx); cx.notify(); } } @@ -1823,11 +1925,7 @@ impl ProjectPanel { project.dirty_buffers(cx).any(|path| path == project_path) as usize; Some(( selection.entry_id, - project_path - .path - .file_name()? - .to_string_lossy() - .into_owned(), + project_path.path.file_name()?.to_string(), )) }) .collect::>(); @@ -1906,8 +2004,13 @@ impl ProjectPanel { } panel.update_in(cx, |panel, window, cx| { if let Some(next_selection) = next_selection { - panel.selection = Some(next_selection); - panel.autoscroll(cx); + panel.update_visible_entries( + Some((next_selection.worktree_id, next_selection.entry_id)), + false, + true, + window, + cx, + ); } else { panel.select_last(&SelectLast {}, window, cx); } @@ -1946,9 +2049,10 @@ impl ProjectPanel { worktree.entry_for_id(a.entry_id), worktree.entry_for_id(b.entry_id), ) { - (Some(a), Some(b)) => { - compare_paths((&a.path, a.is_file()), (&b.path, b.is_file())) - } + (Some(a), Some(b)) => compare_paths( + (a.path.as_std_path(), a.is_file()), + (b.path.as_std_path(), b.is_file()), + ), _ => cmp::Ordering::Equal, } }) @@ -1973,7 +2077,7 @@ impl ProjectPanel { .map(|entry| entry.to_owned()) .collect(); - project::sort_worktree_entries(&mut siblings); + sort_worktree_entries(&mut siblings); let sibling_entry_index = siblings .iter() .position(|sibling| sibling.id == latest_entry.id)?; @@ -2003,9 +2107,14 @@ impl ProjectPanel { }) } - fn unfold_directory(&mut self, _: &UnfoldDirectory, _: &mut Window, cx: &mut Context) { + fn unfold_directory( + &mut self, + _: &UnfoldDirectory, + window: &mut Window, + cx: &mut Context, + ) { if let Some((worktree, entry)) = self.selected_entry(cx) { - self.unfolded_dir_ids.insert(entry.id); + self.state.unfolded_dir_ids.insert(entry.id); let snapshot = worktree.snapshot(); let mut parent_path = entry.path.parent(); @@ -2017,22 +2126,21 @@ impl ProjectPanel { break; } - self.unfolded_dir_ids.insert(parent_entry.id); + self.state.unfolded_dir_ids.insert(parent_entry.id); parent_path = path.parent(); } else { break; } } - self.update_visible_entries(None, cx); - self.autoscroll(cx); + self.update_visible_entries(None, false, true, window, cx); cx.notify(); } } - fn fold_directory(&mut self, _: &FoldDirectory, _: &mut Window, cx: &mut Context) { + fn fold_directory(&mut self, _: &FoldDirectory, window: &mut Window, cx: &mut Context) { if let Some((worktree, entry)) = self.selected_entry(cx) { - self.unfolded_dir_ids.remove(&entry.id); + self.state.unfolded_dir_ids.remove(&entry.id); let snapshot = worktree.snapshot(); let mut path = &*entry.path; @@ -2040,7 +2148,7 @@ impl ProjectPanel { let mut child_entries_iter = snapshot.child_entries(path); if let Some(child) = child_entries_iter.next() { if child_entries_iter.next().is_none() && child.is_dir() { - self.unfolded_dir_ids.remove(&child.id); + self.state.unfolded_dir_ids.remove(&child.id); path = &*child.path; } else { break; @@ -2050,14 +2158,71 @@ impl ProjectPanel { } } - self.update_visible_entries(None, cx); - self.autoscroll(cx); + self.update_visible_entries(None, false, true, window, cx); + cx.notify(); + } + } + + fn scroll_up(&mut self, _: &ScrollUp, window: &mut Window, cx: &mut Context) { + for _ in 0..self.rendered_entries_len / 2 { + window.dispatch_action(SelectPrevious.boxed_clone(), cx); + } + } + + fn scroll_down(&mut self, _: &ScrollDown, window: &mut Window, cx: &mut Context) { + for _ in 0..self.rendered_entries_len / 2 { + window.dispatch_action(SelectNext.boxed_clone(), cx); + } + } + + fn scroll_cursor_center( + &mut self, + _: &ScrollCursorCenter, + _: &mut Window, + cx: &mut Context, + ) { + if let Some((_, _, index)) = self + .state + .selection + .and_then(|s| self.index_for_selection(s)) + { + self.scroll_handle + .scroll_to_item_strict(index, ScrollStrategy::Center); + cx.notify(); + } + } + + fn scroll_cursor_top(&mut self, _: &ScrollCursorTop, _: &mut Window, cx: &mut Context) { + if let Some((_, _, index)) = self + .state + .selection + .and_then(|s| self.index_for_selection(s)) + { + self.scroll_handle + .scroll_to_item_strict(index, ScrollStrategy::Top); + cx.notify(); + } + } + + fn scroll_cursor_bottom( + &mut self, + _: &ScrollCursorBottom, + _: &mut Window, + cx: &mut Context, + ) { + if let Some((_, _, index)) = self + .state + .selection + .and_then(|s| self.index_for_selection(s)) + { + self.scroll_handle + .scroll_to_item_strict(index, ScrollStrategy::Bottom); cx.notify(); } } fn select_next(&mut self, _: &SelectNext, window: &mut Window, cx: &mut Context) { - if let Some(edit_state) = &self.edit_state + if let Some(edit_state) = &self.state.edit_state && edit_state.processing_filename.is_none() { self.filename_editor.update(cx, |editor, cx| { @@ -2071,11 +2236,14 @@ impl ProjectPanel { }); return; } - if let Some(selection) = self.selection { + if let Some(selection) = self.state.selection { let (mut worktree_ix, mut entry_ix, _) = self.index_for_selection(selection).unwrap_or_default(); - if let Some(worktree_entries) = - self.visible_entries.get(worktree_ix).map(|v| &v.entries) + if let Some(worktree_entries) = self + .state + .visible_entries + .get(worktree_ix) + .map(|v| &v.entries) { if entry_ix + 1 < worktree_entries.len() { entry_ix += 1; @@ -2089,14 +2257,14 @@ impl ProjectPanel { worktree_id, entries, .. - }) = self.visible_entries.get(worktree_ix) + }) = self.state.visible_entries.get(worktree_ix) && let Some(entry) = entries.get(entry_ix) { let selection = SelectedEntry { worktree_id: *worktree_id, entry_id: entry.id, }; - self.selection = Some(selection); + self.state.selection = Some(selection); if window.modifiers().shift { self.marked_entries.push(selection); } @@ -2112,35 +2280,38 @@ impl ProjectPanel { fn select_prev_diagnostic( &mut self, action: &SelectPrevDiagnostic, - _: &mut Window, + window: &mut Window, cx: &mut Context, ) { let selection = self.find_entry( - self.selection.as_ref(), + self.state.selection.as_ref(), true, |entry, worktree_id| { - (self.selection.is_none() - || self.selection.is_some_and(|selection| { - if selection.worktree_id == worktree_id { - selection.entry_id != entry.id - } else { - true - } - })) - && entry.is_file() + self.state.selection.is_none_or(|selection| { + if selection.worktree_id == worktree_id { + selection.entry_id != entry.id + } else { + true + } + }) && entry.is_file() && self .diagnostics - .get(&(worktree_id, entry.path.to_path_buf())) + .get(&(worktree_id, entry.path.clone())) .is_some_and(|severity| action.severity.matches(*severity)) }, cx, ); if let Some(selection) = selection { - self.selection = Some(selection); + self.state.selection = Some(selection); self.expand_entry(selection.worktree_id, selection.entry_id, cx); - self.update_visible_entries(Some((selection.worktree_id, selection.entry_id)), cx); - self.autoscroll(cx); + self.update_visible_entries( + Some((selection.worktree_id, selection.entry_id)), + false, + true, + window, + cx, + ); cx.notify(); } } @@ -2148,35 +2319,38 @@ impl ProjectPanel { fn select_next_diagnostic( &mut self, action: &SelectNextDiagnostic, - _: &mut Window, + window: &mut Window, cx: &mut Context, ) { let selection = self.find_entry( - self.selection.as_ref(), + self.state.selection.as_ref(), false, |entry, worktree_id| { - (self.selection.is_none() - || self.selection.is_some_and(|selection| { - if selection.worktree_id == worktree_id { - selection.entry_id != entry.id - } else { - true - } - })) - && entry.is_file() + self.state.selection.is_none_or(|selection| { + if selection.worktree_id == worktree_id { + selection.entry_id != entry.id + } else { + true + } + }) && entry.is_file() && self .diagnostics - .get(&(worktree_id, entry.path.to_path_buf())) + .get(&(worktree_id, entry.path.clone())) .is_some_and(|severity| action.severity.matches(*severity)) }, cx, ); if let Some(selection) = selection { - self.selection = Some(selection); + self.state.selection = Some(selection); self.expand_entry(selection.worktree_id, selection.entry_id, cx); - self.update_visible_entries(Some((selection.worktree_id, selection.entry_id)), cx); - self.autoscroll(cx); + self.update_visible_entries( + Some((selection.worktree_id, selection.entry_id)), + false, + true, + window, + cx, + ); cx.notify(); } } @@ -2184,15 +2358,15 @@ impl ProjectPanel { fn select_prev_git_entry( &mut self, _: &SelectPrevGitEntry, - _: &mut Window, + window: &mut Window, cx: &mut Context, ) { let selection = self.find_entry( - self.selection.as_ref(), + self.state.selection.as_ref(), true, |entry, worktree_id| { - (self.selection.is_none() - || self.selection.is_some_and(|selection| { + (self.state.selection.is_none() + || self.state.selection.is_some_and(|selection| { if selection.worktree_id == worktree_id { selection.entry_id != entry.id } else { @@ -2206,10 +2380,15 @@ impl ProjectPanel { ); if let Some(selection) = selection { - self.selection = Some(selection); + self.state.selection = Some(selection); self.expand_entry(selection.worktree_id, selection.entry_id, cx); - self.update_visible_entries(Some((selection.worktree_id, selection.entry_id)), cx); - self.autoscroll(cx); + self.update_visible_entries( + Some((selection.worktree_id, selection.entry_id)), + false, + true, + window, + cx, + ); cx.notify(); } } @@ -2221,24 +2400,22 @@ impl ProjectPanel { cx: &mut Context, ) { let selection = self.find_visible_entry( - self.selection.as_ref(), + self.state.selection.as_ref(), true, |entry, worktree_id| { - (self.selection.is_none() - || self.selection.is_some_and(|selection| { - if selection.worktree_id == worktree_id { - selection.entry_id != entry.id - } else { - true - } - })) - && entry.is_dir() + self.state.selection.is_none_or(|selection| { + if selection.worktree_id == worktree_id { + selection.entry_id != entry.id + } else { + true + } + }) && entry.is_dir() }, cx, ); if let Some(selection) = selection { - self.selection = Some(selection); + self.state.selection = Some(selection); self.autoscroll(cx); cx.notify(); } @@ -2251,24 +2428,22 @@ impl ProjectPanel { cx: &mut Context, ) { let selection = self.find_visible_entry( - self.selection.as_ref(), + self.state.selection.as_ref(), false, |entry, worktree_id| { - (self.selection.is_none() - || self.selection.is_some_and(|selection| { - if selection.worktree_id == worktree_id { - selection.entry_id != entry.id - } else { - true - } - })) - && entry.is_dir() + self.state.selection.is_none_or(|selection| { + if selection.worktree_id == worktree_id { + selection.entry_id != entry.id + } else { + true + } + }) && entry.is_dir() }, cx, ); if let Some(selection) = selection { - self.selection = Some(selection); + self.state.selection = Some(selection); self.autoscroll(cx); cx.notify(); } @@ -2277,32 +2452,35 @@ impl ProjectPanel { fn select_next_git_entry( &mut self, _: &SelectNextGitEntry, - _: &mut Window, + window: &mut Window, cx: &mut Context, ) { let selection = self.find_entry( - self.selection.as_ref(), + self.state.selection.as_ref(), false, |entry, worktree_id| { - (self.selection.is_none() - || self.selection.is_some_and(|selection| { - if selection.worktree_id == worktree_id { - selection.entry_id != entry.id - } else { - true - } - })) - && entry.is_file() + self.state.selection.is_none_or(|selection| { + if selection.worktree_id == worktree_id { + selection.entry_id != entry.id + } else { + true + } + }) && entry.is_file() && entry.git_summary.index.modified + entry.git_summary.worktree.modified > 0 }, cx, ); if let Some(selection) = selection { - self.selection = Some(selection); + self.state.selection = Some(selection); self.expand_entry(selection.worktree_id, selection.entry_id, cx); - self.update_visible_entries(Some((selection.worktree_id, selection.entry_id)), cx); - self.autoscroll(cx); + self.update_visible_entries( + Some((selection.worktree_id, selection.entry_id)), + false, + true, + window, + cx, + ); cx.notify(); } } @@ -2312,7 +2490,7 @@ impl ProjectPanel { if let Some(parent) = entry.path.parent() { let worktree = worktree.read(cx); if let Some(parent_entry) = worktree.entry_for_path(parent) { - self.selection = Some(SelectedEntry { + self.state.selection = Some(SelectedEntry { worktree_id: worktree.id(), entry_id: parent_entry.id, }); @@ -2330,14 +2508,14 @@ impl ProjectPanel { worktree_id, entries, .. - }) = self.visible_entries.first() + }) = self.state.visible_entries.first() && let Some(entry) = entries.first() { let selection = SelectedEntry { worktree_id: *worktree_id, entry_id: entry.id, }; - self.selection = Some(selection); + self.state.selection = Some(selection); if window.modifiers().shift { self.marked_entries.push(selection); } @@ -2351,7 +2529,7 @@ impl ProjectPanel { worktree_id, entries, .. - }) = self.visible_entries.last() + }) = self.state.visible_entries.last() { let worktree = self.project.read(cx).worktree_for_id(*worktree_id, cx); if let (Some(worktree), Some(entry)) = (worktree, entries.last()) { @@ -2361,7 +2539,7 @@ impl ProjectPanel { worktree_id: *worktree_id, entry_id: entry.id, }; - self.selection = Some(selection); + self.state.selection = Some(selection); self.autoscroll(cx); cx.notify(); } @@ -2370,7 +2548,11 @@ impl ProjectPanel { } fn autoscroll(&mut self, cx: &mut Context) { - if let Some((_, _, index)) = self.selection.and_then(|s| self.index_for_selection(s)) { + if let Some((_, _, index)) = self + .state + .selection + .and_then(|s| self.index_for_selection(s)) + { self.scroll_handle.scroll_to_item_with_offset( index, ScrollStrategy::Center, @@ -2401,8 +2583,8 @@ impl ProjectPanel { source: &SelectedEntry, (worktree, target_entry): (Entity, &Entry), cx: &App, - ) -> Option<(PathBuf, Option>)> { - let mut new_path = target_entry.path.to_path_buf(); + ) -> Option<(Arc, Option>)> { + let mut new_path = target_entry.path.to_rel_path_buf(); // If we're pasting into a file, or a directory into itself, go up one level. if target_entry.is_file() || (target_entry.is_dir() && target_entry.id == source.entry_id) { new_path.pop(); @@ -2413,11 +2595,11 @@ impl ProjectPanel { .path_for_entry(source.entry_id, cx)? .path .file_name()? - .to_os_string(); - new_path.push(&clipboard_entry_file_name); - let extension = new_path.extension().map(|e| e.to_os_string()); - let file_name_without_extension = Path::new(&clipboard_entry_file_name).file_stem()?; - let file_name_len = file_name_without_extension.to_string_lossy().len(); + .to_string(); + new_path.push(RelPath::unix(&clipboard_entry_file_name).unwrap()); + let extension = new_path.extension().map(|s| s.to_string()); + let file_name_without_extension = new_path.file_stem()?.to_string(); + let file_name_len = file_name_without_extension.len(); let mut disambiguation_range = None; let mut ix = 0; { @@ -2425,30 +2607,30 @@ impl ProjectPanel { while worktree.entry_for_path(&new_path).is_some() { new_path.pop(); - let mut new_file_name = file_name_without_extension.to_os_string(); + let mut new_file_name = file_name_without_extension.to_string(); let disambiguation = " copy"; let mut disambiguation_len = disambiguation.len(); - new_file_name.push(disambiguation); + new_file_name.push_str(disambiguation); if ix > 0 { let extra_disambiguation = format!(" {}", ix); disambiguation_len += extra_disambiguation.len(); - - new_file_name.push(extra_disambiguation); + new_file_name.push_str(&extra_disambiguation); } if let Some(extension) = extension.as_ref() { - new_file_name.push("."); - new_file_name.push(extension); + new_file_name.push_str("."); + new_file_name.push_str(extension); } - new_path.push(new_file_name); + new_path.push(RelPath::unix(&new_file_name).unwrap()); + disambiguation_range = Some(file_name_len..(file_name_len + disambiguation_len)); ix += 1; } } - Some((new_path, disambiguation_range)) + Some((new_path.as_rel_path().into(), disambiguation_range)) } fn paste(&mut self, _: &Paste, window: &mut Window, cx: &mut Context) { @@ -2460,61 +2642,39 @@ impl ProjectPanel { .clipboard .as_ref() .filter(|clipboard| !clipboard.items().is_empty())?; + enum PasteTask { Rename(Task>), Copy(Task>>), } - let mut paste_entry_tasks: IndexMap<(ProjectEntryId, bool), PasteTask> = - IndexMap::default(); + + let mut paste_tasks = Vec::new(); let mut disambiguation_range = None; let clip_is_cut = clipboard_entries.is_cut(); for clipboard_entry in clipboard_entries.items() { let (new_path, new_disambiguation_range) = self.create_paste_path(clipboard_entry, self.selected_sub_entry(cx)?, cx)?; let clip_entry_id = clipboard_entry.entry_id; - let is_same_worktree = clipboard_entry.worktree_id == worktree_id; - let relative_worktree_source_path = if !is_same_worktree { - let target_base_path = worktree.read(cx).abs_path(); - let clipboard_project_path = - self.project.read(cx).path_for_entry(clip_entry_id, cx)?; - let clipboard_abs_path = self - .project - .read(cx) - .absolute_path(&clipboard_project_path, cx)?; - Some(relativize_path( - &target_base_path, - clipboard_abs_path.as_path(), - )) - } else { - None - }; - let task = if clip_is_cut && is_same_worktree { + let task = if clipboard_entries.is_cut() { let task = self.project.update(cx, |project, cx| { - project.rename_entry(clip_entry_id, new_path, cx) + project.rename_entry(clip_entry_id, (worktree_id, new_path).into(), cx) }); PasteTask::Rename(task) } else { - let entry_id = if is_same_worktree { - clip_entry_id - } else { - entry.id - }; let task = self.project.update(cx, |project, cx| { - project.copy_entry(entry_id, relative_worktree_source_path, new_path, cx) + project.copy_entry(clip_entry_id, (worktree_id, new_path).into(), cx) }); PasteTask::Copy(task) }; - let needs_delete = !is_same_worktree && clip_is_cut; - paste_entry_tasks.insert((clip_entry_id, needs_delete), task); + paste_tasks.push(task); disambiguation_range = new_disambiguation_range.or(disambiguation_range); } - let item_count = paste_entry_tasks.len(); + let item_count = paste_tasks.len(); cx.spawn_in(window, async move |project_panel, cx| { let mut last_succeed = None; - let mut need_delete_ids = Vec::new(); - for ((entry_id, need_delete), task) in paste_entry_tasks.into_iter() { + for task in paste_tasks { match task { PasteTask::Rename(task) => { if let Some(CreatedEntry::Included(entry)) = task.await.log_err() { @@ -2524,29 +2684,15 @@ impl ProjectPanel { PasteTask::Copy(task) => { if let Some(Some(entry)) = task.await.log_err() { last_succeed = Some(entry); - if need_delete { - need_delete_ids.push(entry_id); - } } } } } - // remove entry for cut in difference worktree - for entry_id in need_delete_ids { - project_panel - .update(cx, |project_panel, cx| { - project_panel - .project - .update(cx, |project, cx| project.delete_entry(entry_id, true, cx)) - .context("no such entry") - })?? - .await?; - } // update selection if let Some(entry) = last_succeed { project_panel .update_in(cx, |project_panel, window, cx| { - project_panel.selection = Some(SelectedEntry { + project_panel.state.selection = Some(SelectedEntry { worktree_id, entry_id: entry.id, }); @@ -2608,8 +2754,7 @@ impl ProjectPanel { project .worktree_for_id(entry.worktree_id, cx)? .read(cx) - .abs_path() - .join(entry_path) + .absolutize(&entry_path) .to_string_lossy() .to_string(), ) @@ -2627,6 +2772,7 @@ impl ProjectPanel { _: &mut Window, cx: &mut Context, ) { + let path_style = self.project.read(cx).path_style(cx); let file_paths = { let project = self.project.read(cx); self.effective_entries() @@ -2636,8 +2782,8 @@ impl ProjectPanel { project .path_for_entry(entry.entry_id, cx)? .path - .to_string_lossy() - .to_string(), + .display(path_style) + .into_owned(), ) }) .collect::>() @@ -2654,7 +2800,7 @@ impl ProjectPanel { cx: &mut Context, ) { if let Some((worktree, entry)) = self.selected_sub_entry(cx) { - cx.reveal_path(&worktree.read(cx).abs_path().join(&entry.path)); + cx.reveal_path(&worktree.read(cx).absolutize(&entry.path)); } } @@ -2682,7 +2828,7 @@ impl ProjectPanel { if !entry.is_file() { return None; } - worktree.read(cx).absolutize(&entry.path).ok() + Some(worktree.read(cx).absolutize(&entry.path)) }) .rev(); @@ -2710,7 +2856,7 @@ impl ProjectPanel { fn open_system(&mut self, _: &OpenWithSystem, _: &mut Window, cx: &mut Context) { if let Some((worktree, entry)) = self.selected_entry(cx) { - let abs_path = worktree.abs_path().join(&entry.path); + let abs_path = worktree.absolutize(&entry.path); cx.open_with_system(&abs_path); } } @@ -2723,14 +2869,14 @@ impl ProjectPanel { ) { if let Some((worktree, entry)) = self.selected_sub_entry(cx) { let abs_path = match &entry.canonical_path { - Some(canonical_path) => Some(canonical_path.to_path_buf()), - None => worktree.read(cx).absolutize(&entry.path).ok(), + Some(canonical_path) => canonical_path.to_path_buf(), + None => worktree.read(cx).absolutize(&entry.path), }; let working_directory = if entry.is_dir() { - abs_path + Some(abs_path) } else { - abs_path.and_then(|path| Some(path.parent()?.to_path_buf())) + abs_path.parent().map(|path| path.to_path_buf()) }; if let Some(working_directory) = working_directory { window.dispatch_action( @@ -2760,7 +2906,7 @@ impl ProjectPanel { .update(cx, |workspace, cx| { search::ProjectSearchView::new_search_in_directory( workspace, - Path::new(""), + RelPath::empty(), window, cx, ); @@ -2773,9 +2919,7 @@ impl ProjectPanel { let include_root = self.project.read(cx).visible_worktrees(cx).count() > 1; let dir_path = if include_root { - let mut full_path = PathBuf::from(worktree.read(cx).root_name()); - full_path.push(&dir_path); - Arc::from(full_path) + worktree.read(cx).root_name().join(&dir_path) } else { dir_path }; @@ -2834,35 +2978,40 @@ impl ProjectPanel { fn move_worktree_entry( &mut self, entry_to_move: ProjectEntryId, - destination: ProjectEntryId, + destination_entry: ProjectEntryId, destination_is_file: bool, cx: &mut Context, ) { - if entry_to_move == destination { + if entry_to_move == destination_entry { return; } let destination_worktree = self.project.update(cx, |project, cx| { - let entry_path = project.path_for_entry(entry_to_move, cx)?; - let destination_entry_path = project.path_for_entry(destination, cx)?.path; + let source_path = project.path_for_entry(entry_to_move, cx)?; + let destination_path = project.path_for_entry(destination_entry, cx)?; + let destination_worktree_id = destination_path.worktree_id; - let mut destination_path = destination_entry_path.as_ref(); + let mut destination_path = destination_path.path.as_ref(); if destination_is_file { destination_path = destination_path.parent()?; } - let mut new_path = destination_path.to_path_buf(); - new_path.push(entry_path.path.file_name()?); - if new_path != entry_path.path.as_ref() { - let task = project.rename_entry(entry_to_move, new_path, cx); + let mut new_path = destination_path.to_rel_path_buf(); + new_path.push(RelPath::unix(source_path.path.file_name()?).unwrap()); + if new_path.as_rel_path() != source_path.path.as_ref() { + let task = project.rename_entry( + entry_to_move, + (destination_worktree_id, new_path).into(), + cx, + ); cx.foreground_executor().spawn(task).detach_and_log_err(cx); } - project.worktree_id_for_entry(destination, cx) + project.worktree_id_for_entry(destination_entry, cx) }); if let Some(destination_worktree) = destination_worktree { - self.expand_entry(destination_worktree, destination, cx); + self.expand_entry(destination_worktree, destination_entry, cx); } } @@ -2919,7 +3068,7 @@ impl ProjectPanel { } fn effective_entries(&self) -> BTreeSet { - if let Some(selection) = self.selection { + if let Some(selection) = self.state.selection { let selection = SelectedEntry { entry_id: self.resolve_entry(selection.entry_id), worktree_id: selection.worktree_id, @@ -2952,7 +3101,8 @@ impl ProjectPanel { /// Finds the currently selected subentry for a given leaf entry id. If a given entry /// has no ancestors, the project entry ID that's passed in is returned as-is. fn resolve_entry(&self, id: ProjectEntryId) -> ProjectEntryId { - self.ancestors + self.state + .ancestors .get(&id) .and_then(|ancestors| ancestors.active_ancestor()) .unwrap_or(id) @@ -2982,7 +3132,7 @@ impl ProjectPanel { &self, cx: &'a App, ) -> Option<(Entity, &'a project::Entry)> { - let selection = self.selection?; + let selection = self.state.selection?; let project = self.project.read(cx); let worktree = project.worktree_for_id(selection.worktree_id, cx)?; let entry = worktree.read(cx).entry_for_id(selection.entry_id)?; @@ -2991,7 +3141,11 @@ impl ProjectPanel { fn expand_to_selection(&mut self, cx: &mut Context) -> Option<()> { let (worktree, entry) = self.selected_entry(cx)?; - let expanded_dir_ids = self.expanded_dir_ids.entry(worktree.id()).or_default(); + let expanded_dir_ids = self + .state + .expanded_dir_ids + .entry(worktree.id()) + .or_default(); for path in entry.path.ancestors() { let Some(entry) = worktree.entry_for_path(path) else { @@ -3016,11 +3170,12 @@ impl ProjectPanel { entry: Entry { id: NEW_ENTRY_ID, kind: new_entry_kind, - path: parent_entry.path.join("\0").into(), + path: parent_entry.path.join(RelPath::unix("\0").unwrap()), inode: 0, mtime: parent_entry.mtime, size: parent_entry.size, is_ignored: parent_entry.is_ignored, + is_hidden: parent_entry.is_hidden, is_external: false, is_private: false, is_always_included: parent_entry.is_always_included, @@ -3035,6 +3190,9 @@ impl ProjectPanel { fn update_visible_entries( &mut self, new_selected_entry: Option<(WorktreeId, ProjectEntryId)>, + focus_filename_editor: bool, + autoscroll: bool, + window: &mut Window, cx: &mut Context, ) { let now = Instant::now(); @@ -3043,240 +3201,281 @@ impl ProjectPanel { let hide_gitignore = settings.hide_gitignore; let project = self.project.read(cx); let repo_snapshots = project.git_store().read(cx).repo_snapshots(cx); - self.last_worktree_root_id = project + + let old_ancestors = self.state.ancestors.clone(); + let mut new_state = State::derive(&self.state); + new_state.last_worktree_root_id = project .visible_worktrees(cx) .next_back() .and_then(|worktree| worktree.read(cx).root_entry()) .map(|entry| entry.id); - - let old_ancestors = std::mem::take(&mut self.ancestors); - self.visible_entries.clear(); let mut max_width_item = None; - let visible_worktrees: Vec<_> = project.visible_worktrees(cx).collect(); + let visible_worktrees: Vec<_> = project + .visible_worktrees(cx) + .map(|worktree| worktree.read(cx).snapshot()) + .collect(); let hide_root = settings.hide_root && visible_worktrees.len() == 1; - for worktree in visible_worktrees { - let worktree_snapshot = worktree.read(cx).snapshot(); - let worktree_id = worktree_snapshot.id(); - - let expanded_dir_ids = match self.expanded_dir_ids.entry(worktree_id) { - hash_map::Entry::Occupied(e) => e.into_mut(), - hash_map::Entry::Vacant(e) => { - // The first time a worktree's root entry becomes available, - // mark that root entry as expanded. - if let Some(entry) = worktree_snapshot.root_entry() { - e.insert(vec![entry.id]).as_slice() - } else { - &[] - } - } - }; - - let mut new_entry_parent_id = None; - let mut new_entry_kind = EntryKind::Dir; - if let Some(edit_state) = &self.edit_state - && edit_state.worktree_id == worktree_id - && edit_state.is_new_entry() - { - new_entry_parent_id = Some(edit_state.entry_id); - new_entry_kind = if edit_state.is_dir { - EntryKind::Dir - } else { - EntryKind::File - }; - } + let hide_hidden = settings.hide_hidden; + self.update_visible_entries_task = cx.spawn_in(window, async move |this, cx| { + let new_state = cx + .background_spawn(async move { + for worktree_snapshot in visible_worktrees { + let worktree_id = worktree_snapshot.id(); + + let expanded_dir_ids = match new_state.expanded_dir_ids.entry(worktree_id) { + hash_map::Entry::Occupied(e) => e.into_mut(), + hash_map::Entry::Vacant(e) => { + // The first time a worktree's root entry becomes available, + // mark that root entry as expanded. + if let Some(entry) = worktree_snapshot.root_entry() { + e.insert(vec![entry.id]).as_slice() + } else { + &[] + } + } + }; - let mut visible_worktree_entries = Vec::new(); - let mut entry_iter = - GitTraversal::new(&repo_snapshots, worktree_snapshot.entries(true, 0)); - let mut auto_folded_ancestors = vec![]; - while let Some(entry) = entry_iter.entry() { - if hide_root && Some(entry.entry) == worktree.read(cx).root_entry() { - if new_entry_parent_id == Some(entry.id) { - visible_worktree_entries.push(Self::create_new_git_entry( - entry.entry, - entry.git_summary, - new_entry_kind, - )); - new_entry_parent_id = None; - } - entry_iter.advance(); - continue; - } - if auto_collapse_dirs && entry.kind.is_dir() { - auto_folded_ancestors.push(entry.id); - if !self.unfolded_dir_ids.contains(&entry.id) - && let Some(root_path) = worktree_snapshot.root_entry() - { - let mut child_entries = worktree_snapshot.child_entries(&entry.path); - if let Some(child) = child_entries.next() - && entry.path != root_path.path - && child_entries.next().is_none() - && child.kind.is_dir() + let mut new_entry_parent_id = None; + let mut new_entry_kind = EntryKind::Dir; + if let Some(edit_state) = &new_state.edit_state + && edit_state.worktree_id == worktree_id + && edit_state.is_new_entry() { - entry_iter.advance(); + new_entry_parent_id = Some(edit_state.entry_id); + new_entry_kind = if edit_state.is_dir { + EntryKind::Dir + } else { + EntryKind::File + }; + } - continue; + let mut visible_worktree_entries = Vec::new(); + let mut entry_iter = + GitTraversal::new(&repo_snapshots, worktree_snapshot.entries(true, 0)); + let mut auto_folded_ancestors = vec![]; + let worktree_abs_path = worktree_snapshot.abs_path(); + while let Some(entry) = entry_iter.entry() { + if hide_root && Some(entry.entry) == worktree_snapshot.root_entry() { + if new_entry_parent_id == Some(entry.id) { + visible_worktree_entries.push(Self::create_new_git_entry( + entry.entry, + entry.git_summary, + new_entry_kind, + )); + new_entry_parent_id = None; + } + entry_iter.advance(); + continue; + } + if auto_collapse_dirs && entry.kind.is_dir() { + auto_folded_ancestors.push(entry.id); + if !new_state.unfolded_dir_ids.contains(&entry.id) + && let Some(root_path) = worktree_snapshot.root_entry() + { + let mut child_entries = + worktree_snapshot.child_entries(&entry.path); + if let Some(child) = child_entries.next() + && entry.path != root_path.path + && child_entries.next().is_none() + && child.kind.is_dir() + { + entry_iter.advance(); + + continue; + } + } + let depth = old_ancestors + .get(&entry.id) + .map(|ancestor| ancestor.current_ancestor_depth) + .unwrap_or_default() + .min(auto_folded_ancestors.len()); + if let Some(edit_state) = &mut new_state.edit_state + && edit_state.entry_id == entry.id + { + edit_state.depth = depth; + } + let mut ancestors = std::mem::take(&mut auto_folded_ancestors); + if ancestors.len() > 1 { + ancestors.reverse(); + new_state.ancestors.insert( + entry.id, + FoldedAncestors { + current_ancestor_depth: depth, + ancestors, + }, + ); + } + } + auto_folded_ancestors.clear(); + if (!hide_gitignore || !entry.is_ignored) + && (!hide_hidden || !entry.is_hidden) + { + visible_worktree_entries.push(entry.to_owned()); + } + let precedes_new_entry = if let Some(new_entry_id) = new_entry_parent_id + { + entry.id == new_entry_id || { + new_state.ancestors.get(&entry.id).is_some_and(|entries| { + entries.ancestors.contains(&new_entry_id) + }) + } + } else { + false + }; + if precedes_new_entry + && (!hide_gitignore || !entry.is_ignored) + && (!hide_hidden || !entry.is_hidden) + { + visible_worktree_entries.push(Self::create_new_git_entry( + entry.entry, + entry.git_summary, + new_entry_kind, + )); + } + + let (depth, chars) = if Some(entry.entry) + == worktree_snapshot.root_entry() + { + let Some(path_name) = worktree_abs_path.file_name() else { + continue; + }; + let depth = 0; + (depth, path_name.to_string_lossy().chars().count()) + } else if entry.is_file() { + let Some(path_name) = entry + .path + .file_name() + .with_context(|| { + format!("Non-root entry has no file name: {entry:?}") + }) + .log_err() + else { + continue; + }; + let depth = entry.path.ancestors().count() - 1; + (depth, path_name.chars().count()) + } else { + let path = new_state + .ancestors + .get(&entry.id) + .and_then(|ancestors| { + let outermost_ancestor = ancestors.ancestors.last()?; + let root_folded_entry = worktree_snapshot + .entry_for_id(*outermost_ancestor)? + .path + .as_ref(); + entry.path.strip_prefix(root_folded_entry).ok().and_then( + |suffix| { + Some( + RelPath::unix(root_folded_entry.file_name()?) + .unwrap() + .join(suffix), + ) + }, + ) + }) + .or_else(|| { + entry.path.file_name().map(|file_name| { + RelPath::unix(file_name).unwrap().into() + }) + }) + .unwrap_or_else(|| entry.path.clone()); + let depth = path.components().count(); + (depth, path.as_unix_str().chars().count()) + }; + let width_estimate = + item_width_estimate(depth, chars, entry.canonical_path.is_some()); + + match max_width_item.as_mut() { + Some((id, worktree_id, width)) => { + if *width < width_estimate { + *id = entry.id; + *worktree_id = worktree_snapshot.id(); + *width = width_estimate; + } + } + None => { + max_width_item = + Some((entry.id, worktree_snapshot.id(), width_estimate)) + } + } + + if expanded_dir_ids.binary_search(&entry.id).is_err() + && entry_iter.advance_to_sibling() + { + continue; + } + entry_iter.advance(); } + + par_sort_worktree_entries(&mut visible_worktree_entries); + new_state.visible_entries.push(VisibleEntriesForWorktree { + worktree_id, + entries: visible_worktree_entries, + index: OnceCell::new(), + }) } - let depth = old_ancestors - .get(&entry.id) - .map(|ancestor| ancestor.current_ancestor_depth) - .unwrap_or_default() - .min(auto_folded_ancestors.len()); - if let Some(edit_state) = &mut self.edit_state - && edit_state.entry_id == entry.id - { - edit_state.depth = depth; - } - let mut ancestors = std::mem::take(&mut auto_folded_ancestors); - if ancestors.len() > 1 { - ancestors.reverse(); - self.ancestors.insert( - entry.id, - FoldedAncestors { - current_ancestor_depth: depth, - ancestors, - }, - ); - } - } - auto_folded_ancestors.clear(); - if !hide_gitignore || !entry.is_ignored { - visible_worktree_entries.push(entry.to_owned()); - } - let precedes_new_entry = if let Some(new_entry_id) = new_entry_parent_id { - entry.id == new_entry_id || { - self.ancestors - .get(&entry.id) - .is_some_and(|entries| entries.ancestors.contains(&new_entry_id)) + if let Some((project_entry_id, worktree_id, _)) = max_width_item { + let mut visited_worktrees_length = 0; + let index = new_state + .visible_entries + .iter() + .find_map(|visible_entries| { + if worktree_id == visible_entries.worktree_id { + visible_entries + .entries + .iter() + .position(|entry| entry.id == project_entry_id) + } else { + visited_worktrees_length += visible_entries.entries.len(); + None + } + }); + if let Some(index) = index { + new_state.max_width_item_index = Some(visited_worktrees_length + index); + } } + new_state + }) + .await; + this.update_in(cx, |this, window, cx| { + let current_selection = this.state.selection; + this.state = new_state; + if let Some((worktree_id, entry_id)) = new_selected_entry { + this.state.selection = Some(SelectedEntry { + worktree_id, + entry_id, + }); } else { - false - }; - if precedes_new_entry && (!hide_gitignore || !entry.is_ignored) { - visible_worktree_entries.push(Self::create_new_git_entry( - entry.entry, - entry.git_summary, - new_entry_kind, - )); + this.state.selection = current_selection; } - let worktree_abs_path = worktree.read(cx).abs_path(); - let (depth, path) = if Some(entry.entry) == worktree.read(cx).root_entry() { - let Some(path_name) = worktree_abs_path.file_name() else { - continue; - }; - let path = ArcCow::Borrowed(Path::new(path_name)); - let depth = 0; - (depth, path) - } else if entry.is_file() { - let Some(path_name) = entry - .path - .file_name() - .with_context(|| format!("Non-root entry has no file name: {entry:?}")) - .log_err() - else { - continue; - }; - let path = ArcCow::Borrowed(Path::new(path_name)); - let depth = entry.path.ancestors().count() - 1; - (depth, path) - } else { - let path = self - .ancestors - .get(&entry.id) - .and_then(|ancestors| { - let outermost_ancestor = ancestors.ancestors.last()?; - let root_folded_entry = worktree - .read(cx) - .entry_for_id(*outermost_ancestor)? - .path - .as_ref(); - entry - .path - .strip_prefix(root_folded_entry) - .ok() - .and_then(|suffix| { - let full_path = Path::new(root_folded_entry.file_name()?); - Some(ArcCow::Owned(Arc::::from(full_path.join(suffix)))) - }) - }) - .or_else(|| entry.path.file_name().map(Path::new).map(ArcCow::Borrowed)) - .unwrap_or_else(|| ArcCow::Owned(entry.path.clone())); - let depth = path.components().count(); - (depth, path) - }; - let width_estimate = item_width_estimate( - depth, - path.to_string_lossy().chars().count(), - entry.canonical_path.is_some(), - ); - - match max_width_item.as_mut() { - Some((id, worktree_id, width)) => { - if *width < width_estimate { - *id = entry.id; - *worktree_id = worktree.read(cx).id(); - *width = width_estimate; - } - } - None => { - max_width_item = Some((entry.id, worktree.read(cx).id(), width_estimate)) - } + let elapsed = now.elapsed(); + if this.last_reported_update.elapsed() > Duration::from_secs(3600) { + telemetry::event!( + "Project Panel Updated", + elapsed_ms = elapsed.as_millis() as u64, + worktree_entries = this + .state + .visible_entries + .iter() + .map(|worktree| worktree.entries.len()) + .sum::(), + ) } - - if expanded_dir_ids.binary_search(&entry.id).is_err() - && entry_iter.advance_to_sibling() - { - continue; + if focus_filename_editor { + this.filename_editor.update(cx, |editor, cx| { + editor.clear(window, cx); + window.focus(&editor.focus_handle(cx)); + }); } - entry_iter.advance(); - } - - project::sort_worktree_entries(&mut visible_worktree_entries); - - self.visible_entries.push(VisibleEntriesForWorktree { - worktree_id, - entries: visible_worktree_entries, - index: OnceCell::new(), - }) - } - - if let Some((project_entry_id, worktree_id, _)) = max_width_item { - let mut visited_worktrees_length = 0; - let index = self.visible_entries.iter().find_map(|visible_entries| { - if worktree_id == visible_entries.worktree_id { - visible_entries - .entries - .iter() - .position(|entry| entry.id == project_entry_id) - } else { - visited_worktrees_length += visible_entries.entries.len(); - None + if autoscroll { + this.autoscroll(cx); } - }); - if let Some(index) = index { - self.max_width_item_index = Some(visited_worktrees_length + index); - } - } - if let Some((worktree_id, entry_id)) = new_selected_entry { - self.selection = Some(SelectedEntry { - worktree_id, - entry_id, - }); - } - let elapsed = now.elapsed(); - if self.last_reported_update.elapsed() > Duration::from_secs(3600) { - telemetry::event!( - "Project Panel Updated", - elapsed_ms = elapsed.as_millis() as u64, - worktree_entries = self - .visible_entries - .iter() - .map(|worktree| worktree.entries.len()) - .sum::(), - ) - } + cx.notify(); + }) + .ok(); + }); } fn expand_entry( @@ -3288,7 +3487,7 @@ impl ProjectPanel { self.project.update(cx, |project, cx| { if let Some((worktree, expanded_dir_ids)) = project .worktree_for_id(worktree_id, cx) - .zip(self.expanded_dir_ids.get_mut(&worktree_id)) + .zip(self.state.expanded_dir_ids.get_mut(&worktree_id)) { project.expand_entry(worktree_id, entry_id, cx); let worktree = worktree.read(cx); @@ -3330,9 +3529,9 @@ impl ProjectPanel { let entry = worktree.read(cx).entry_for_id(entry_id)?; let path = entry.path.clone(); let target_directory = if entry.is_dir() { - path.to_path_buf() + path } else { - path.parent()?.to_path_buf() + path.parent()?.into() }; Some((target_directory, worktree, fs)) }) else { @@ -3341,11 +3540,12 @@ impl ProjectPanel { let mut paths_to_replace = Vec::new(); for path in &paths { - if let Some(name) = path.file_name() { - let mut target_path = target_directory.clone(); - target_path.push(name); - if target_path.exists() { - paths_to_replace.push((name.to_string_lossy().to_string(), path.clone())); + if let Some(name) = path.file_name() + && let Some(name) = name.to_str() + { + let target_path = target_directory.join(RelPath::unix(name).unwrap()); + if worktree.read(cx).entry_for_path(&target_path).is_some() { + paths_to_replace.push((name.to_string(), path.clone())); } } } @@ -3375,7 +3575,7 @@ impl ProjectPanel { } let task = worktree.update( cx, |worktree, cx| { - worktree.copy_external_entries(target_directory.into(), paths, fs, cx) + worktree.copy_external_entries(target_directory, paths, fs, cx) })?; let opened_entries = task.await.with_context(|| "failed to copy external paths")?; @@ -3441,7 +3641,7 @@ impl ProjectPanel { )?; let task = self.project.update(cx, |project, cx| { - project.copy_entry(selection.entry_id, None, new_path, cx) + project.copy_entry(selection.entry_id, (worktree_id, new_path).into(), cx) }); copy_tasks.push(task); disambiguation_range = new_disambiguation_range.or(disambiguation_range); @@ -3460,7 +3660,7 @@ impl ProjectPanel { if let Some(entry_id) = last_succeed { project_panel .update_in(cx, |project_panel, window, cx| { - project_panel.selection = Some(SelectedEntry { + project_panel.state.selection = Some(SelectedEntry { worktree_id, entry_id, }); @@ -3489,7 +3689,7 @@ impl ProjectPanel { worktree_id: WorktreeId, ) -> Option<(usize, usize, usize)> { let mut total_ix = 0; - for (worktree_ix, visible) in self.visible_entries.iter().enumerate() { + for (worktree_ix, visible) in self.state.visible_entries.iter().enumerate() { if worktree_id != visible.worktree_id { total_ix += visible.entries.len(); continue; @@ -3507,7 +3707,7 @@ impl ProjectPanel { fn entry_at_index(&self, index: usize) -> Option<(WorktreeId, GitEntryRef<'_>)> { let mut offset = 0; - for worktree in &self.visible_entries { + for worktree in &self.state.visible_entries { let current_len = worktree.entries.len(); if index < offset + current_len { return worktree @@ -3528,13 +3728,13 @@ impl ProjectPanel { mut callback: impl FnMut( &Entry, usize, - &HashSet>, + &HashSet>, &mut Window, &mut Context, ), ) { let mut ix = 0; - for visible in &self.visible_entries { + for visible in &self.state.visible_entries { if ix >= range.end { return; } @@ -3548,7 +3748,7 @@ impl ProjectPanel { let entry_range = range.start.saturating_sub(ix)..end_ix - ix; let entries = visible .index - .get_or_init(|| visible.entries.iter().map(|e| (e.path.clone())).collect()); + .get_or_init(|| visible.entries.iter().map(|e| e.path.clone()).collect()); let base_index = ix + entry_range.start; for (i, entry) in visible.entries[entry_range].iter().enumerate() { let global_index = base_index + i; @@ -3566,7 +3766,7 @@ impl ProjectPanel { mut callback: impl FnMut(ProjectEntryId, EntryDetails, &mut Window, &mut Context), ) { let mut ix = 0; - for visible in &self.visible_entries { + for visible in &self.state.visible_entries { if ix >= range.end { return; } @@ -3587,12 +3787,12 @@ impl ProjectPanel { .worktree_for_id(visible.worktree_id, cx) { let snapshot = worktree.read(cx).snapshot(); - let root_name = OsStr::new(snapshot.root_name()); + let root_name = snapshot.root_name(); let entry_range = range.start.saturating_sub(ix)..end_ix - ix; let entries = visible .index - .get_or_init(|| visible.entries.iter().map(|e| (e.path.clone())).collect()); + .get_or_init(|| visible.entries.iter().map(|e| e.path.clone()).collect()); for entry in visible.entries[entry_range].iter() { let status = git_status_setting .then_some(entry.git_summary) @@ -3609,17 +3809,16 @@ impl ProjectPanel { cx, ); - if let Some(edit_state) = &self.edit_state { + if let Some(edit_state) = &self.state.edit_state { let is_edited_entry = if edit_state.is_new_entry() { entry.id == NEW_ENTRY_ID } else { entry.id == edit_state.entry_id - || self - .ancestors - .get(&entry.id) - .is_some_and(|auto_folded_dirs| { + || self.state.ancestors.get(&entry.id).is_some_and( + |auto_folded_dirs| { auto_folded_dirs.ancestors.contains(&edit_state.entry_id) - }) + }, + ) }; if is_edited_entry { @@ -3627,7 +3826,7 @@ impl ProjectPanel { details.is_processing = true; if let Some(ancestors) = edit_state .leaf_entry_id - .and_then(|entry| self.ancestors.get(&entry)) + .and_then(|entry| self.state.ancestors.get(&entry)) { let position = ancestors.ancestors.iter().position(|entry_id| *entry_id == edit_state.entry_id).expect("Edited sub-entry should be an ancestor of selected leaf entry") + 1; let all_components = ancestors.ancestors.len(); @@ -3641,7 +3840,7 @@ impl ProjectPanel { .take(prefix_components) .collect::(); if let Some(last_component) = - Path::new(processing_filename).components().next_back() + processing_filename.components().next_back() { new_path.push(last_component); previous_components.next(); @@ -3656,7 +3855,7 @@ impl ProjectPanel { } } else { details.filename.clear(); - details.filename.push_str(processing_filename); + details.filename.push_str(processing_filename.as_unix_str()); } } else { if edit_state.is_new_entry() { @@ -3684,6 +3883,7 @@ impl ProjectPanel { ) -> Option { if only_visible_entries { let entries = self + .state .visible_entries .iter() .find_map(|visible| { @@ -3725,6 +3925,7 @@ impl ProjectPanel { cx: &mut Context, ) -> Option { let mut worktree_ids: Vec<_> = self + .state .visible_entries .iter() .map(|worktree| worktree.worktree_id) @@ -3841,6 +4042,7 @@ impl ProjectPanel { cx: &mut Context, ) -> Option { let mut worktree_ids: Vec<_> = self + .state .visible_entries .iter() .map(|worktree| worktree.worktree_id) @@ -3850,6 +4052,7 @@ impl ProjectPanel { if let Some(start) = start { let entries = self + .state .visible_entries .iter() .find(|worktree| worktree.worktree_id == start.worktree_id) @@ -3922,7 +4125,7 @@ impl ProjectPanel { fn calculate_depth_and_difference( entry: &Entry, - visible_worktree_entries: &HashSet>, + visible_worktree_entries: &HashSet>, ) -> (usize, usize) { let (depth, difference) = entry .path @@ -4025,7 +4228,7 @@ impl ProjectPanel { .path_for_entry(drag_state.active_selection.entry_id, cx) { if let Some(parent_path) = entry_path.path.parent() { - if !parent_path.as_os_str().is_empty() { + if !parent_path.is_empty() { return true; } } @@ -4067,6 +4270,7 @@ impl ProjectPanel { let is_marked = self.marked_entries.contains(&selection); let is_active = self + .state .selection .is_some_and(|selection| selection.entry_id == entry_id); @@ -4087,7 +4291,8 @@ impl ProjectPanel { let canonical_path = details .canonical_path .as_ref() - .map(|f| f.to_string_lossy().to_string()); + .map(|f| f.to_string_lossy().into_owned()); + let path_style = self.project.read(cx).path_style(cx); let path = details.path.clone(); let path_for_external_paths = path.clone(); let path_for_dragged_selection = path.clone(); @@ -4116,6 +4321,7 @@ impl ProjectPanel { let validation_color_and_message = if show_editor { match self + .state .edit_state .as_ref() .map_or(ValidationState::None, |e| e.validation_state.clone()) @@ -4157,7 +4363,7 @@ impl ProjectPanel { DragTarget::Entry { highlight_entry_id, .. } => Some(*highlight_entry_id), - DragTarget::Background => self.last_worktree_root_id, + DragTarget::Background => self.state.last_worktree_root_id, }) { // Highlight if same entry or it's children @@ -4293,6 +4499,7 @@ impl ProjectPanel { if !kind.is_dir() || this + .state .expanded_dir_ids .get(&details.worktree_id) .is_some_and(|ids| ids.binary_search(&entry_id).is_ok()) @@ -4317,6 +4524,9 @@ impl ProjectPanel { this.expand_entry(worktree_id, entry_id, cx); this.update_visible_entries( Some((worktree_id, entry_id)), + false, + false, + window, cx, ); cx.notify(); @@ -4329,7 +4539,7 @@ impl ProjectPanel { .on_drag( dragged_selection, { - let active_component = self.ancestors.get(&entry_id).and_then(|ancestors| ancestors.active_component(&details.filename)); + let active_component = self.state.ancestors.get(&entry_id).and_then(|ancestors| ancestors.active_component(&details.filename)); move |selection, click_offset, _window, cx| { let filename = active_component.as_ref().unwrap_or_else(|| &details.filename); cx.new(|_| DraggedProjectEntryView { @@ -4373,7 +4583,7 @@ impl ProjectPanel { } cx.stop_propagation(); - if let Some(selection) = project_panel.selection.filter(|_| event.modifiers().shift) { + if let Some(selection) = project_panel.state.selection.filter(|_| event.modifiers().shift) { let current_selection = project_panel.index_for_selection(selection); let clicked_entry = SelectedEntry { entry_id, @@ -4404,7 +4614,7 @@ impl ProjectPanel { } } - project_panel.selection = Some(clicked_entry); + project_panel.state.selection = Some(clicked_entry); if !project_panel.marked_entries.contains(&clicked_entry) { project_panel.marked_entries.push(clicked_entry); } @@ -4413,7 +4623,7 @@ impl ProjectPanel { if event.click_count() > 1 { project_panel.split_entry(entry_id, false, None, cx); } else { - project_panel.selection = Some(selection); + project_panel.state.selection = Some(selection); if let Some(position) = project_panel.marked_entries.iter().position(|e| *e == selection) { project_panel.marked_entries.remove(position); } else { @@ -4424,7 +4634,7 @@ impl ProjectPanel { project_panel.marked_entries.clear(); if is_sticky && let Some((_, _, index)) = project_panel.index_for_entry(entry_id, worktree_id) { - project_panel.scroll_handle.scroll_to_item_with_offset(index, ScrollStrategy::Top, sticky_index.unwrap_or(0)); + project_panel.scroll_handle.scroll_to_item_strict_with_offset(index, ScrollStrategy::Top, sticky_index.unwrap_or(0)); cx.notify(); // move down by 1px so that clicked item // don't count as sticky anymore @@ -4457,8 +4667,8 @@ impl ProjectPanel { .indent_level(depth) .indent_step_size(px(settings.indent_size)) .spacing(match settings.entry_spacing { - project_panel_settings::EntrySpacing::Comfortable => ListItemSpacing::Dense, - project_panel_settings::EntrySpacing::Standard => { + ProjectPanelEntrySpacing::Comfortable => ListItemSpacing::Dense, + ProjectPanelEntrySpacing::Standard => { ListItemSpacing::ExtraDense } }) @@ -4540,15 +4750,14 @@ impl ProjectPanel { h_flex().h_6().w_full().child(editor.clone()) } else { h_flex().h_6().map(|mut this| { - if let Some(folded_ancestors) = self.ancestors.get(&entry_id) { + if let Some(folded_ancestors) = self.state.ancestors.get(&entry_id) { let components = Path::new(&file_name) .components() .map(|comp| comp.as_os_str().to_string_lossy().into_owned()) .collect::>(); let active_index = folded_ancestors.active_index(); let components_len = components.len(); - const DELIMITER: SharedString = - SharedString::new_static(std::path::MAIN_SEPARATOR_STR); + let delimiter = SharedString::new(path_style.separator()); for (index, component) in components.iter().enumerate() { if index != 0 { let delimiter_target_index = index - 1; @@ -4592,7 +4801,7 @@ impl ProjectPanel { ))) }) .child( - Label::new(DELIMITER.clone()) + Label::new(delimiter.clone()) .single_line() .color(filename_text_color) ) @@ -4655,7 +4864,7 @@ impl ProjectPanel { cx.listener(move |this, _, _, cx| { if index != active_index && let Some(folds) = - this.ancestors.get_mut(&entry_id) + this.state.ancestors.get_mut(&entry_id) { folds.current_ancestor_depth = components_len - 1 - index; @@ -4738,8 +4947,8 @@ impl ProjectPanel { &self, entry: &Entry, worktree_id: WorktreeId, - root_name: &OsStr, - entries_paths: &HashSet>, + root_name: &RelPath, + entries_paths: &HashSet>, git_status: GitSummary, sticky: Option, _window: &mut Window, @@ -4751,6 +4960,7 @@ impl ProjectPanel { }; let expanded_entry_ids = self + .state .expanded_dir_ids .get(&worktree_id) .map(Vec::as_slice) @@ -4760,37 +4970,37 @@ impl ProjectPanel { let icon = match entry.kind { EntryKind::File => { if show_file_icons { - FileIcons::get_icon(&entry.path, cx) + FileIcons::get_icon(entry.path.as_std_path(), cx) } else { None } } _ => { if show_folder_icons { - FileIcons::get_folder_icon(is_expanded, &entry.path, cx) + FileIcons::get_folder_icon(is_expanded, entry.path.as_std_path(), cx) } else { FileIcons::get_chevron_icon(is_expanded, cx) } } }; + let path_style = self.project.read(cx).path_style(cx); let (depth, difference) = ProjectPanel::calculate_depth_and_difference(entry, entries_paths); - let filename = match difference { - diff if diff > 1 => entry + let filename = if difference > 1 { + entry .path - .iter() - .skip(entry.path.components().count() - diff) - .collect::() - .to_str() - .unwrap_or_default() - .to_string(), - _ => entry + .last_n_components(difference) + .map_or(String::new(), |suffix| { + suffix.display(path_style).to_string() + }) + } else { + entry .path .file_name() - .map(|name| name.to_string_lossy().into_owned()) - .unwrap_or_else(|| root_name.to_string_lossy().to_string()), + .map(|name| name.to_string()) + .unwrap_or_else(|| root_name.as_unix_str().to_string()) }; let selection = SelectedEntry { @@ -4798,11 +5008,11 @@ impl ProjectPanel { entry_id: entry.id, }; let is_marked = self.marked_entries.contains(&selection); - let is_selected = self.selection == Some(selection); + let is_selected = self.state.selection == Some(selection); let diagnostic_severity = self .diagnostics - .get(&(worktree_id, entry.path.to_path_buf())) + .get(&(worktree_id, entry.path.clone())) .cloned(); let filename_text_color = @@ -4856,6 +5066,7 @@ impl ProjectPanel { project: Entity, entry_id: ProjectEntryId, skip_ignored: bool, + window: &mut Window, cx: &mut Context, ) -> Result<()> { let worktree = project @@ -4882,13 +5093,12 @@ impl ProjectPanel { let worktree_id = worktree.id(); self.expand_entry(worktree_id, entry_id, cx); - self.update_visible_entries(Some((worktree_id, entry_id)), cx); + self.update_visible_entries(Some((worktree_id, entry_id)), false, true, window, cx); self.marked_entries.clear(); self.marked_entries.push(SelectedEntry { worktree_id, entry_id, }); - self.autoscroll(cx); cx.notify(); Ok(()) } @@ -4907,6 +5117,7 @@ impl ProjectPanel { loop { let is_expanded_dir = entry.is_dir() && self + .state .expanded_dir_ids .get(&worktree.id()) .map(|ids| ids.binary_search(&entry.id).is_ok()) @@ -4919,7 +5130,7 @@ impl ProjectPanel { let (active_indent_range, depth) = { let (worktree_ix, child_offset, ix) = self.index_for_entry(entry.id, worktree.id())?; - let child_paths = &self.visible_entries[worktree_ix].entries; + let child_paths = &self.state.visible_entries[worktree_ix].entries; let mut child_count = 0; let depth = entry.path.ancestors().count(); while let Some(entry) = child_paths.get(child_offset + child_count + 1) { @@ -4932,12 +5143,12 @@ impl ProjectPanel { let start = ix + 1; let end = start + child_count; - let visible_worktree = &self.visible_entries[worktree_ix]; + let visible_worktree = &self.state.visible_entries[worktree_ix]; let visible_worktree_entries = visible_worktree.index.get_or_init(|| { visible_worktree .entries .iter() - .map(|e| (e.path.clone())) + .map(|e| e.path.clone()) .collect() }); @@ -4975,6 +5186,7 @@ impl ProjectPanel { }; let Some(visible) = self + .state .visible_entries .iter() .find(|worktree| worktree.worktree_id == worktree_id) @@ -5017,7 +5229,7 @@ impl ProjectPanel { let panel_settings = ProjectPanelSettings::get_global(cx); let git_status_enabled = panel_settings.git_status; - let root_name = OsStr::new(worktree.root_name()); + let root_name = worktree.root_name(); let git_summaries_by_id = if git_status_enabled { visible @@ -5098,7 +5310,7 @@ fn item_width_estimate(depth: usize, item_text_chars: usize, is_symlink: bool) - impl Render for ProjectPanel { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - let has_worktree = !self.visible_entries.is_empty(); + let has_worktree = !self.state.visible_entries.is_empty(); let project = self.project.read(cx); let panel_settings = ProjectPanelSettings::get_global(cx); let indent_size = panel_settings.indent_size; @@ -5117,6 +5329,7 @@ impl Render for ProjectPanel { if has_worktree { let item_count = self + .state .visible_entries .iter() .map(|worktree| worktree.entries.len()) @@ -5203,15 +5416,12 @@ impl Render for ProjectPanel { this.refresh_drag_cursor_style(&event.modifiers, window, cx); }, )) - .on_click(cx.listener(|this, event, _, cx| { - if matches!(event, gpui::ClickEvent::Keyboard(_)) { - return; - } - cx.stop_propagation(); - this.selection = None; - this.marked_entries.clear(); - })) .key_context(self.dispatch_context(window, cx)) + .on_action(cx.listener(Self::scroll_up)) + .on_action(cx.listener(Self::scroll_down)) + .on_action(cx.listener(Self::scroll_cursor_center)) + .on_action(cx.listener(Self::scroll_cursor_top)) + .on_action(cx.listener(Self::scroll_cursor_bottom)) .on_action(cx.listener(Self::select_next)) .on_action(cx.listener(Self::select_previous)) .on_action(cx.listener(Self::select_first)) @@ -5251,7 +5461,7 @@ impl Render for ProjectPanel { .on_action(cx.listener(Self::duplicate)) .on_click(cx.listener(|this, event: &gpui::ClickEvent, window, cx| { if event.click_count() > 1 - && let Some(entry_id) = this.last_worktree_root_id + && let Some(entry_id) = this.state.last_worktree_root_id { let project = this.project.read(cx); @@ -5263,7 +5473,7 @@ impl Render for ProjectPanel { return; }; - this.selection = Some(SelectedEntry { + this.state.selection = Some(SelectedEntry { worktree_id, entry_id, }); @@ -5280,23 +5490,14 @@ impl Render for ProjectPanel { .when(project.is_via_remote_server(), |el| { el.on_action(cx.listener(Self::open_in_terminal)) }) - .on_mouse_down( - MouseButton::Right, - cx.listener(move |this, event: &MouseDownEvent, window, cx| { - // When deploying the context menu anywhere below the last project entry, - // act as if the user clicked the root of the last worktree. - if let Some(entry_id) = this.last_worktree_root_id { - this.deploy_context_menu(event.position, entry_id, window, cx); - } - }), - ) .track_focus(&self.focus_handle(cx)) .child( v_flex() .child( uniform_list("entries", item_count, { cx.processor(|this, range: Range, window, cx| { - let mut items = Vec::with_capacity(range.end - range.start); + this.rendered_entries_len = range.end - range.start; + let mut items = Vec::with_capacity(this.rendered_entries_len); this.for_each_visible_entry( range, window, @@ -5359,6 +5560,7 @@ impl Render for ProjectPanel { this.collapse_entry( target_entry.clone(), worktree, + window, cx, ); } @@ -5502,11 +5704,12 @@ impl Render for ProjectPanel { .with_horizontal_sizing_behavior( ListHorizontalSizingBehavior::Unconstrained, ) - .with_width_from_item(self.max_width_item_index) + .with_width_from_item(self.state.max_width_item_index) .track_scroll(self.scroll_handle.clone()), ) .child( div() + .id("project-panel-blank-area") .block_mouse_except_scroll() .flex_grow() .when( @@ -5515,18 +5718,17 @@ impl Render for ProjectPanel { DragTarget::Background => true, DragTarget::Entry { highlight_entry_id, .. - } => { - self.last_worktree_root_id.is_some_and(|root_id| { - *highlight_entry_id == root_id - }) - } + } => self.state.last_worktree_root_id.is_some_and( + |root_id| *highlight_entry_id == root_id, + ), }, ), |div| div.bg(cx.theme().colors().drop_target_background), ) .on_drag_move::(cx.listener( move |this, event: &DragMoveEvent, _, _| { - let Some(_last_root_id) = this.last_worktree_root_id else { + let Some(_last_root_id) = this.state.last_worktree_root_id + else { return; }; if event.bounds.contains(&event.event.position) { @@ -5542,7 +5744,8 @@ impl Render for ProjectPanel { )) .on_drag_move::(cx.listener( move |this, event: &DragMoveEvent, _, cx| { - let Some(last_root_id) = this.last_worktree_root_id else { + let Some(last_root_id) = this.state.last_worktree_root_id + else { return; }; if event.bounds.contains(&event.event.position) { @@ -5568,7 +5771,7 @@ impl Render for ProjectPanel { move |this, external_paths: &ExternalPaths, window, cx| { this.drag_target_entry = None; this.hover_scroll_task.take(); - if let Some(entry_id) = this.last_worktree_root_id { + if let Some(entry_id) = this.state.last_worktree_root_id { this.drop_external_files( external_paths.paths(), entry_id, @@ -5583,19 +5786,46 @@ impl Render for ProjectPanel { move |this, selections: &DraggedSelection, window, cx| { this.drag_target_entry = None; this.hover_scroll_task.take(); - if let Some(entry_id) = this.last_worktree_root_id { + if let Some(entry_id) = this.state.last_worktree_root_id { this.drag_onto(selections, entry_id, false, window, cx); } cx.stop_propagation(); }, - )), + )) + .on_click(cx.listener(|this, event, window, cx| { + if matches!(event, gpui::ClickEvent::Keyboard(_)) { + return; + } + cx.stop_propagation(); + this.state.selection = None; + this.marked_entries.clear(); + this.focus_handle(cx).focus(window); + })) + .on_mouse_down( + MouseButton::Right, + cx.listener(move |this, event: &MouseDownEvent, window, cx| { + // When deploying the context menu anywhere below the last project entry, + // act as if the user clicked the root of the last worktree. + if let Some(entry_id) = this.state.last_worktree_root_id { + this.deploy_context_menu( + event.position, + entry_id, + window, + cx, + ); + } + }), + ), ) .size_full(), ) .custom_scrollbars( Scrollbars::for_settings::() .tracked_scroll_handle(self.scroll_handle.clone()) - .with_track_along(ScrollAxes::Horizontal) + .with_track_along( + ScrollAxes::Horizontal, + cx.theme().colors().panel_background, + ) .notify_content(), window, cx, @@ -5727,8 +5957,8 @@ impl EventEmitter for ProjectPanel {} impl Panel for ProjectPanel { fn position(&self, _: &Window, cx: &App) -> DockPosition { match ProjectPanelSettings::get_global(cx).dock { - ProjectPanelDockPosition::Left => DockPosition::Left, - ProjectPanelDockPosition::Right => DockPosition::Right, + DockSide::Left => DockPosition::Left, + DockSide::Right => DockPosition::Right, } } @@ -5737,17 +5967,13 @@ impl Panel for ProjectPanel { } fn set_position(&mut self, position: DockPosition, _: &mut Window, cx: &mut Context) { - settings::update_settings_file::( - self.fs.clone(), - cx, - move |settings, _| { - let dock = match position { - DockPosition::Left | DockPosition::Bottom => ProjectPanelDockPosition::Left, - DockPosition::Right => ProjectPanelDockPosition::Right, - }; - settings.dock = Some(dock); - }, - ); + settings::update_settings_file(self.fs.clone(), cx, move |settings, _| { + let dock = match position { + DockPosition::Left | DockPosition::Bottom => DockSide::Left, + DockPosition::Right => DockSide::Right, + }; + settings.project_panel.get_or_insert_default().dock = Some(dock); + }); } fn size(&self, _: &Window, cx: &App) -> Pixels { @@ -5824,5 +6050,22 @@ impl ClipboardEntry { } } +fn cmp>(lhs: T, rhs: T) -> cmp::Ordering { + let entry_a = lhs.as_ref(); + let entry_b = rhs.as_ref(); + util::paths::compare_rel_paths( + (&entry_a.path, entry_a.is_file()), + (&entry_b.path, entry_b.is_file()), + ) +} + +pub fn sort_worktree_entries(entries: &mut [impl AsRef]) { + entries.sort_by(|lhs, rhs| cmp(lhs, rhs)); +} + +pub fn par_sort_worktree_entries(entries: &mut Vec) { + entries.par_sort_by(|lhs, rhs| cmp(lhs, rhs)); +} + #[cfg(test)] mod project_panel_tests; diff --git a/crates/project_panel/src/project_panel_settings.rs b/crates/project_panel/src/project_panel_settings.rs index 09e450c149ab5580e6c86241f8c3e30515b93a4f..45d50efcaf36ea04aa799185490c14a37736b5b1 100644 --- a/crates/project_panel/src/project_panel_settings.rs +++ b/crates/project_panel/src/project_panel_settings.rs @@ -1,41 +1,23 @@ use editor::EditorSettings; use gpui::Pixels; use schemars::JsonSchema; -use serde_derive::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; -use ui::scrollbars::{ScrollbarVisibility, ShowScrollbar}; - -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, Copy, PartialEq)] -#[serde(rename_all = "snake_case")] -pub enum ProjectPanelDockPosition { - Left, - Right, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum ShowIndentGuides { - Always, - Never, -} - -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum EntrySpacing { - /// Comfortable spacing of entries. - #[default] - Comfortable, - /// The standard spacing of entries. - Standard, -} +use serde::{Deserialize, Serialize}; +use settings::{ + DockSide, ProjectPanelEntrySpacing, Settings, SettingsContent, ShowDiagnostics, + ShowIndentGuides, +}; +use ui::{ + px, + scrollbars::{ScrollbarVisibility, ShowScrollbar}, +}; #[derive(Deserialize, Debug, Clone, Copy, PartialEq)] pub struct ProjectPanelSettings { pub button: bool, pub hide_gitignore: bool, pub default_width: Pixels, - pub dock: ProjectPanelDockPosition, - pub entry_spacing: EntrySpacing, + pub dock: DockSide, + pub entry_spacing: ProjectPanelEntrySpacing, pub file_icons: bool, pub folder_icons: bool, pub git_status: bool, @@ -48,6 +30,7 @@ pub struct ProjectPanelSettings { pub scrollbar: ScrollbarSettings, pub show_diagnostics: ShowDiagnostics, pub hide_root: bool, + pub hide_hidden: bool, pub drag_and_drop: bool, } @@ -56,12 +39,6 @@ pub struct IndentGuidesSettings { pub show: ShowIndentGuides, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -pub struct IndentGuidesSettingsContent { - /// When to show the scrollbar in the project panel. - pub show: Option, -} - #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] pub struct ScrollbarSettings { /// When to show the scrollbar in the project panel. @@ -70,105 +47,6 @@ pub struct ScrollbarSettings { pub show: Option, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -pub struct ScrollbarSettingsContent { - /// When to show the scrollbar in the project panel. - /// - /// Default: inherits editor scrollbar settings - pub show: Option>, -} - -/// Whether to indicate diagnostic errors and/or warnings in project panel items. -/// -/// Default: all -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum ShowDiagnostics { - /// Never mark the diagnostic errors/warnings in the project panel. - Off, - /// Mark files containing only diagnostic errors in the project panel. - Errors, - #[default] - /// Mark files containing diagnostic errors or warnings in the project panel. - All, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[settings_key(key = "project_panel")] -pub struct ProjectPanelSettingsContent { - /// Whether to show the project panel button in the status bar. - /// - /// Default: true - pub button: Option, - /// Whether to hide gitignore files in the project panel. - /// - /// Default: false - pub hide_gitignore: Option, - /// Customize default width (in pixels) taken by project panel - /// - /// Default: 240 - pub default_width: Option, - /// The position of project panel - /// - /// Default: left - pub dock: Option, - /// Spacing between worktree entries in the project panel. - /// - /// Default: comfortable - pub entry_spacing: Option, - /// Whether to show file icons in the project panel. - /// - /// Default: true - pub file_icons: Option, - /// Whether to show folder icons or chevrons for directories in the project panel. - /// - /// Default: true - pub folder_icons: Option, - /// Whether to show the git status in the project panel. - /// - /// Default: true - pub git_status: Option, - /// Amount of indentation (in pixels) for nested items. - /// - /// Default: 20 - pub indent_size: Option, - /// Whether to reveal it in the project panel automatically, - /// when a corresponding project entry becomes active. - /// Gitignored entries are never auto revealed. - /// - /// Default: true - pub auto_reveal_entries: Option, - /// Whether to fold directories automatically - /// when directory has only one directory inside. - /// - /// Default: true - pub auto_fold_dirs: Option, - /// Whether the project panel should open on startup. - /// - /// Default: true - pub starts_open: Option, - /// Scrollbar-related settings - pub scrollbar: Option, - /// Which files containing diagnostic errors/warnings to mark in the project panel. - /// - /// Default: all - pub show_diagnostics: Option, - /// Settings related to indent guides in the project panel. - pub indent_guides: Option, - /// Whether to hide the root entry when only one folder is open in the window. - /// - /// Default: false - pub hide_root: Option, - /// Whether to stick parent directories at top of the project panel. - /// - /// Default: true - pub sticky_scroll: Option, - /// Whether to enable drag-and-drop operations in the project panel. - /// - /// Default: true - pub drag_and_drop: Option, -} - impl ScrollbarVisibility for ProjectPanelSettings { fn visibility(&self, cx: &ui::App) -> ShowScrollbar { self.scrollbar @@ -178,32 +56,67 @@ impl ScrollbarVisibility for ProjectPanelSettings { } impl Settings for ProjectPanelSettings { - type FileContent = ProjectPanelSettingsContent; - - fn load( - sources: SettingsSources, - _: &mut gpui::App, - ) -> anyhow::Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let project_panel = content.project_panel.clone().unwrap(); + Self { + button: project_panel.button.unwrap(), + hide_gitignore: project_panel.hide_gitignore.unwrap(), + default_width: px(project_panel.default_width.unwrap()), + dock: project_panel.dock.unwrap(), + entry_spacing: project_panel.entry_spacing.unwrap(), + file_icons: project_panel.file_icons.unwrap(), + folder_icons: project_panel.folder_icons.unwrap(), + git_status: project_panel.git_status.unwrap(), + indent_size: project_panel.indent_size.unwrap(), + indent_guides: IndentGuidesSettings { + show: project_panel.indent_guides.unwrap().show.unwrap(), + }, + sticky_scroll: project_panel.sticky_scroll.unwrap(), + auto_reveal_entries: project_panel.auto_reveal_entries.unwrap(), + auto_fold_dirs: project_panel.auto_fold_dirs.unwrap(), + starts_open: project_panel.starts_open.unwrap(), + scrollbar: ScrollbarSettings { + show: project_panel.scrollbar.unwrap().show.map(Into::into), + }, + show_diagnostics: project_panel.show_diagnostics.unwrap(), + hide_root: project_panel.hide_root.unwrap(), + hide_hidden: project_panel.hide_hidden.unwrap(), + drag_and_drop: project_panel.drag_and_drop.unwrap(), + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { - vscode.bool_setting("explorer.excludeGitIgnore", &mut current.hide_gitignore); - vscode.bool_setting("explorer.autoReveal", &mut current.auto_reveal_entries); - vscode.bool_setting("explorer.compactFolders", &mut current.auto_fold_dirs); + fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut SettingsContent) { + if let Some(hide_gitignore) = vscode.read_bool("explorer.excludeGitIgnore") { + current.project_panel.get_or_insert_default().hide_gitignore = Some(hide_gitignore); + } + if let Some(auto_reveal) = vscode.read_bool("explorer.autoReveal") { + current + .project_panel + .get_or_insert_default() + .auto_reveal_entries = Some(auto_reveal); + } + if let Some(compact_folders) = vscode.read_bool("explorer.compactFolders") { + current.project_panel.get_or_insert_default().auto_fold_dirs = Some(compact_folders); + } if Some(false) == vscode.read_bool("git.decorations.enabled") { - current.git_status = Some(false); + current.project_panel.get_or_insert_default().git_status = Some(false); } if Some(false) == vscode.read_bool("problems.decorations.enabled") { - current.show_diagnostics = Some(ShowDiagnostics::Off); + current + .project_panel + .get_or_insert_default() + .show_diagnostics = Some(ShowDiagnostics::Off); } if let (Some(false), Some(false)) = ( vscode.read_bool("explorer.decorations.badges"), vscode.read_bool("explorer.decorations.colors"), ) { - current.git_status = Some(false); - current.show_diagnostics = Some(ShowDiagnostics::Off); + current.project_panel.get_or_insert_default().git_status = Some(false); + current + .project_panel + .get_or_insert_default() + .show_diagnostics = Some(ShowDiagnostics::Off); } } } diff --git a/crates/project_panel/src/project_panel_tests.rs b/crates/project_panel/src/project_panel_tests.rs index ad2a7d12ecce31cf1aa4458b3fd59e23f63ab08b..3f1e1e1b3c3fd909f667ebf9dc8e717b0d116c78 100644 --- a/crates/project_panel/src/project_panel_tests.rs +++ b/crates/project_panel/src/project_panel_tests.rs @@ -2,11 +2,11 @@ use super::*; use collections::HashSet; use gpui::{Empty, Entity, TestAppContext, VisualTestContext, WindowHandle}; use pretty_assertions::assert_eq; -use project::{FakeFs, WorktreeSettings}; +use project::FakeFs; use serde_json::json; use settings::SettingsStore; use std::path::{Path, PathBuf}; -use util::path; +use util::{path, paths::PathStyle, rel_path::rel_path}; use workspace::{ AppState, ItemHandle, Pane, item::{Item, ProjectItem}, @@ -58,6 +58,7 @@ async fn test_visible_list(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..50, cx), &[ @@ -123,6 +124,7 @@ async fn test_opening_file(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "src/test", cx); select_path(&panel, "src/test/first.rs", cx); @@ -161,8 +163,8 @@ async fn test_exclusions_in_visible_list(cx: &mut gpui::TestAppContext) { init_test(cx); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |worktree_settings| { - worktree_settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/.git".to_string(), "**/4/**".to_string()]); }); }); @@ -209,6 +211,7 @@ async fn test_exclusions_in_visible_list(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..50, cx), &[ @@ -329,6 +332,7 @@ async fn test_auto_collapse_dir_paths(cx: &mut gpui::TestAppContext) { ); }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -412,6 +416,7 @@ async fn test_auto_collapse_dir_paths(cx: &mut gpui::TestAppContext) { ); }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &["> dir_1/nested_dir_1/nested_dir_2/nested_dir_3"], @@ -506,6 +511,7 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { panel }) .unwrap(); + cx.run_until_parked(); select_path(&panel, "root1", cx); assert_eq!( @@ -526,6 +532,7 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { // Add a file with the root folder selected. The filename editor is placed // before the first file in the root folder. panel.update_in(cx, |panel, window, cx| panel.new_file(&NewFile, window, cx)); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); @@ -568,6 +575,7 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { ); confirm.await.unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -586,6 +594,7 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { select_path(&panel, "root1/b", cx); panel.update_in(cx, |panel, window, cx| panel.new_file(&NewFile, window, cx)); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -611,6 +620,7 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { }) .await .unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -685,6 +695,7 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { ); confirm.await.unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -729,10 +740,11 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { }); panel.cancel(&menu::Cancel, window, cx) }); - + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { panel.new_directory(&NewDirectory, window, cx) }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -775,6 +787,7 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { ); confirm.await.unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -830,6 +843,7 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { // Test empty filename and filename with only whitespace panel.update_in(cx, |panel, window, cx| panel.new_file(&NewFile, window, cx)); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -854,8 +868,10 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { editor.set_text(" ", window, cx); }); assert!(panel.confirm_edit(window, cx).is_none()); - panel.cancel(&menu::Cancel, window, cx) + panel.cancel(&menu::Cancel, window, cx); + panel.update_visible_entries(None, false, false, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -924,6 +940,7 @@ async fn test_adding_directories_via_file(cx: &mut gpui::TestAppContext) { panel }) .unwrap(); + cx.run_until_parked(); select_path(&panel, "root1", cx); assert_eq!( @@ -944,9 +961,11 @@ async fn test_adding_directories_via_file(cx: &mut gpui::TestAppContext) { // Add a file with the root folder selected. The filename editor is placed // before the first file in the root folder. panel.update_in(cx, |panel, window, cx| panel.new_file(&NewFile, window, cx)); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -978,7 +997,7 @@ async fn test_adding_directories_via_file(cx: &mut gpui::TestAppContext) { " > a", " > b", " > C", - " [PROCESSING: '/bdir1/dir2/the-new-filename'] <== selected", + " [PROCESSING: 'bdir1/dir2/the-new-filename'] <== selected", " .dockerignore", "v root2", " > d", @@ -987,6 +1006,7 @@ async fn test_adding_directories_via_file(cx: &mut gpui::TestAppContext) { ); confirm.await.unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..13, cx), &[ @@ -1032,6 +1052,7 @@ async fn test_adding_directory_via_file(cx: &mut gpui::TestAppContext) { panel }) .unwrap(); + cx.run_until_parked(); select_path(&panel, "root1", cx); assert_eq!( @@ -1042,6 +1063,7 @@ async fn test_adding_directory_via_file(cx: &mut gpui::TestAppContext) { // Add a file with the root folder selected. The filename editor is placed // before the first file in the root folder. panel.update_in(cx, |panel, window, cx| panel.new_file(&NewFile, window, cx)); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); @@ -1068,12 +1090,13 @@ async fn test_adding_directory_via_file(cx: &mut gpui::TestAppContext) { &[ "v root1", " > .git", - " [PROCESSING: 'new_dir/'] <== selected", + " [PROCESSING: 'new_dir'] <== selected", " .dockerignore", ] ); confirm.await.unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -1095,6 +1118,7 @@ async fn test_adding_directory_via_file(cx: &mut gpui::TestAppContext) { panel.confirm_edit(window, cx).unwrap() }); confirm.await.unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -1119,6 +1143,7 @@ async fn test_adding_directory_via_file(cx: &mut gpui::TestAppContext) { panel.confirm_edit(window, cx).unwrap() }); confirm.await.unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -1151,6 +1176,7 @@ async fn test_copy_paste(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { panel.select_next(&Default::default(), window, cx); @@ -1251,6 +1277,7 @@ async fn test_cut_paste(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); select_path_with_mark(&panel, "root/one.txt", cx); select_path_with_mark(&panel, "root/two.txt", cx); @@ -1274,6 +1301,7 @@ async fn test_cut_paste(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.paste(&Default::default(), window, cx); + panel.update_visible_entries(None, false, false, window, cx); }); cx.executor().run_until_parked(); @@ -1354,6 +1382,7 @@ async fn test_cut_paste_between_different_worktrees(cx: &mut gpui::TestAppContex let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); select_path(&panel, "root1/three.txt", cx); panel.update_in(cx, |panel, window, cx| { @@ -1450,6 +1479,7 @@ async fn test_copy_paste_between_different_worktrees(cx: &mut gpui::TestAppConte let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); select_path(&panel, "root1/three.txt", cx); panel.update_in(cx, |panel, window, cx| { @@ -1572,6 +1602,7 @@ async fn test_copy_paste_directory(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); select_path(&panel, "root/a", cx); panel.update_in(cx, |panel, window, cx| { @@ -1711,6 +1742,7 @@ async fn test_copy_paste_directory_with_sibling_file(cx: &mut gpui::TestAppConte let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "test/dir1", cx); @@ -1816,6 +1848,7 @@ async fn test_copy_paste_nested_and_root_entries(cx: &mut gpui::TestAppContext) let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "test/dir1", cx); @@ -1893,6 +1926,7 @@ async fn test_remove_opened_file(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "src/test", cx); select_path(&panel, "src/test/first.rs", cx); @@ -1991,8 +2025,9 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { panel }) .unwrap(); + cx.run_until_parked(); - select_path(&panel, "src/", cx); + select_path(&panel, "src", cx); panel.update_in(cx, |panel, window, cx| panel.confirm(&Confirm, window, cx)); cx.executor().run_until_parked(); assert_eq!( @@ -2006,9 +2041,11 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.new_directory(&NewDirectory, window, cx) }); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); + cx.executor().run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -2030,11 +2067,13 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { cx.executor().run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!( - panel.edit_state.is_some(), + panel.state.edit_state.is_some(), "Edit state should not be None after conflicting new directory name" ); panel.cancel(&menu::Cancel, window, cx); + panel.update_visible_entries(None, false, false, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -2045,7 +2084,7 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { "File list should be unchanged after failed folder create confirmation" ); - select_path(&panel, "src/test/", cx); + select_path(&panel, "src/test", cx); panel.update_in(cx, |panel, window, cx| panel.confirm(&Confirm, window, cx)); cx.executor().run_until_parked(); assert_eq!( @@ -2057,6 +2096,7 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { ] ); panel.update_in(cx, |panel, window, cx| panel.new_file(&NewFile, window, cx)); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); @@ -2083,11 +2123,13 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { cx.executor().run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!( - panel.edit_state.is_some(), + panel.state.edit_state.is_some(), "Edit state should not be None after conflicting new file name" ); panel.cancel(&menu::Cancel, window, cx); + panel.update_visible_entries(None, false, false, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -2139,7 +2181,7 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { cx.executor().run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!( - panel.edit_state.is_some(), + panel.state.edit_state.is_some(), "Edit state should not be None after conflicting file rename" ); panel.cancel(&menu::Cancel, window, cx); @@ -2193,20 +2235,20 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { .await; // Mark files as git modified - fs.set_git_content_for_repo( + fs.set_head_and_index_for_repo( path!("/root/tree1/.git").as_ref(), &[ - ("dir1/modified1.txt".into(), "modified".into(), None), - ("dir1/modified2.txt".into(), "modified".into(), None), - ("modified4.txt".into(), "modified".into(), None), - ("dir2/modified3.txt".into(), "modified".into(), None), + ("dir1/modified1.txt", "modified".into()), + ("dir1/modified2.txt", "modified".into()), + ("modified4.txt", "modified".into()), + ("dir2/modified3.txt", "modified".into()), ], ); - fs.set_git_content_for_repo( + fs.set_head_and_index_for_repo( path!("/root/tree2/.git").as_ref(), &[ - ("dir3/modified5.txt".into(), "modified".into(), None), - ("modified6.txt".into(), "modified".into(), None), + ("dir3/modified5.txt", "modified".into()), + ("modified6.txt", "modified".into()), ], ); @@ -2233,6 +2275,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); // Check initial state assert_eq!( @@ -2256,6 +2299,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_next_git_entry(&SelectNextGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..6, cx), @@ -2272,6 +2316,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_next_git_entry(&SelectNextGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..6, cx), @@ -2288,6 +2333,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_next_git_entry(&SelectNextGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 6..9, cx), @@ -2301,6 +2347,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_next_git_entry(&SelectNextGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 9..11, cx), @@ -2310,6 +2357,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_next_git_entry(&SelectNextGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 13..16, cx), @@ -2323,6 +2371,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_next_git_entry(&SelectNextGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 16..18, cx), @@ -2333,6 +2382,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_next_git_entry(&SelectNextGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..18, cx), @@ -2362,6 +2412,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_prev_git_entry(&SelectPrevGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 16..18, cx), @@ -2371,6 +2422,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_prev_git_entry(&SelectPrevGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 13..16, cx), @@ -2384,6 +2436,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_prev_git_entry(&SelectPrevGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 9..11, cx), @@ -2393,6 +2446,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_prev_git_entry(&SelectPrevGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 6..9, cx), @@ -2406,6 +2460,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_prev_git_entry(&SelectPrevGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..6, cx), @@ -2422,6 +2477,7 @@ async fn test_select_git_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.select_prev_git_entry(&SelectPrevGitEntry, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..6, cx), @@ -2468,6 +2524,7 @@ async fn test_select_directory(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| panel.open(&Open, window, cx)); cx.executor().run_until_parked(); @@ -2565,6 +2622,7 @@ async fn test_select_first_last(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), @@ -2618,6 +2676,7 @@ async fn test_select_first_last(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); #[rustfmt::skip] assert_eq!( @@ -2669,6 +2728,7 @@ async fn test_dir_toggle_collapse(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| panel.open(&Open, window, cx)); cx.executor().run_until_parked(); @@ -2720,6 +2780,7 @@ async fn test_collapse_all_entries(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { panel.collapse_all_entries(&CollapseAllEntries, window, cx) @@ -2747,6 +2808,113 @@ async fn test_collapse_all_entries(cx: &mut gpui::TestAppContext) { ); } +#[gpui::test] +async fn test_collapse_all_entries_multiple_worktrees(cx: &mut gpui::TestAppContext) { + init_test_with_editor(cx); + + let fs = FakeFs::new(cx.executor()); + let worktree_content = json!({ + "dir_1": { + "file_1.py": "# File contents", + }, + "dir_2": { + "file_1.py": "# File contents", + } + }); + + fs.insert_tree("/project_root_1", worktree_content.clone()) + .await; + fs.insert_tree("/project_root_2", worktree_content).await; + + let project = Project::test( + fs.clone(), + ["/project_root_1".as_ref(), "/project_root_2".as_ref()], + cx, + ) + .await; + let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let cx = &mut VisualTestContext::from_window(*workspace, cx); + let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); + + panel.update_in(cx, |panel, window, cx| { + panel.collapse_all_entries(&CollapseAllEntries, window, cx) + }); + cx.executor().run_until_parked(); + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &["> project_root_1", "> project_root_2",] + ); +} + +#[gpui::test] +async fn test_collapse_all_entries_with_collapsed_root(cx: &mut gpui::TestAppContext) { + init_test_with_editor(cx); + + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + "/project_root", + json!({ + "dir_1": { + "nested_dir": { + "file_a.py": "# File contents", + "file_b.py": "# File contents", + "file_c.py": "# File contents", + }, + "file_1.py": "# File contents", + "file_2.py": "# File contents", + "file_3.py": "# File contents", + }, + "dir_2": { + "file_1.py": "# File contents", + "file_2.py": "# File contents", + "file_3.py": "# File contents", + } + }), + ) + .await; + + let project = Project::test(fs.clone(), ["/project_root".as_ref()], cx).await; + let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let cx = &mut VisualTestContext::from_window(*workspace, cx); + let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); + + // Open project_root/dir_1 to ensure that a nested directory is expanded + toggle_expand_dir(&panel, "project_root/dir_1", cx); + cx.executor().run_until_parked(); + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &[ + "v project_root", + " v dir_1 <== selected", + " > nested_dir", + " file_1.py", + " file_2.py", + " file_3.py", + " > dir_2", + ] + ); + + // Close root directory + toggle_expand_dir(&panel, "project_root", cx); + cx.executor().run_until_parked(); + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &["> project_root <== selected"] + ); + + // Run collapse_all_entries and make sure root is not expanded + panel.update_in(cx, |panel, window, cx| { + panel.collapse_all_entries(&CollapseAllEntries, window, cx) + }); + cx.executor().run_until_parked(); + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &["> project_root <== selected"] + ); +} + #[gpui::test] async fn test_new_file_move(cx: &mut gpui::TestAppContext) { init_test(cx); @@ -2757,6 +2925,7 @@ async fn test_new_file_move(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); // Make a new buffer with no backing file workspace @@ -2814,6 +2983,12 @@ async fn test_new_file_move(cx: &mut gpui::TestAppContext) { ); } +// NOTE: This test is skipped on Windows, because on Windows, unlike on Unix, +// you can't rename a directory which some program has already open. This is a +// limitation of the Windows. Since Zed will have the root open, it will hold an open handle +// to it, and thus renaming it will fail on Windows. +// See: https://stackoverflow.com/questions/41365318/access-is-denied-when-renaming-folder +// See: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_rename_information #[gpui::test] #[cfg_attr(target_os = "windows", ignore)] async fn test_rename_root_of_worktree(cx: &mut gpui::TestAppContext) { @@ -2834,6 +3009,7 @@ async fn test_rename_root_of_worktree(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root1/dir1", cx); @@ -2868,6 +3044,7 @@ async fn test_rename_root_of_worktree(cx: &mut gpui::TestAppContext) { panel.confirm_edit(window, cx).unwrap() }); confirm.await.unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..20, cx), &[ @@ -2926,12 +3103,13 @@ async fn test_rename_with_hide_root(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update(cx, |panel, cx| { let project = panel.project.read(cx); let worktree = project.visible_worktrees(cx).next().unwrap(); let root_entry = worktree.read(cx).root_entry().unwrap(); - panel.selection = Some(SelectedEntry { + panel.state.selection = Some(SelectedEntry { worktree_id: worktree.read(cx).id(), entry_id: root_entry.id, }); @@ -2940,7 +3118,7 @@ async fn test_rename_with_hide_root(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| panel.rename(&Rename, window, cx)); assert!( - panel.read_with(cx, |panel, _| panel.edit_state.is_none()), + panel.read_with(cx, |panel, _| panel.state.edit_state.is_none()), "Rename should be blocked when hide_root=true with single worktree" ); } @@ -2964,19 +3142,21 @@ async fn test_rename_with_hide_root(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); + select_path(&panel, "root1", cx); panel.update_in(cx, |panel, window, cx| panel.rename(&Rename, window, cx)); #[cfg(target_os = "windows")] assert!( - panel.read_with(cx, |panel, _| panel.edit_state.is_none()), + panel.read_with(cx, |panel, _| panel.state.edit_state.is_none()), "Rename should be blocked on Windows even with multiple worktrees" ); #[cfg(not(target_os = "windows"))] { assert!( - panel.read_with(cx, |panel, _| panel.edit_state.is_some()), + panel.read_with(cx, |panel, _| panel.state.edit_state.is_some()), "Rename should work with multiple worktrees on non-Windows when hide_root=true" ); panel.update_in(cx, |panel, window, cx| { @@ -3008,16 +3188,38 @@ async fn test_multiple_marked_entries(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); + cx.update(|window, cx| { panel.update(cx, |this, cx| { this.select_next(&Default::default(), window, cx); this.expand_selected_entry(&Default::default(), window, cx); + }) + }); + cx.run_until_parked(); + + cx.update(|window, cx| { + panel.update(cx, |this, cx| { this.expand_selected_entry(&Default::default(), window, cx); + }) + }); + cx.run_until_parked(); + + cx.update(|window, cx| { + panel.update(cx, |this, cx| { this.select_next(&Default::default(), window, cx); this.expand_selected_entry(&Default::default(), window, cx); + }) + }); + cx.run_until_parked(); + + cx.update(|window, cx| { + panel.update(cx, |this, cx| { this.select_next(&Default::default(), window, cx); }) }); + cx.run_until_parked(); + assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -3067,13 +3269,13 @@ async fn test_multiple_marked_entries(cx: &mut gpui::TestAppContext) { cx.update(|window, cx| { panel.update(cx, |this, cx| { let drag = DraggedSelection { - active_selection: this.selection.unwrap(), + active_selection: this.state.selection.unwrap(), marked_selections: this.marked_entries.clone().into(), }; let target_entry = this .project .read(cx) - .entry_for_path(&(worktree_id, "").into(), cx) + .entry_for_path(&(worktree_id, rel_path("")).into(), cx) .unwrap(); this.drag_onto(&drag, target_entry.id, false, window, cx); }); @@ -3130,7 +3332,7 @@ async fn test_multiple_marked_entries(cx: &mut gpui::TestAppContext) { this.select_previous(&SelectPrevious, window, cx); this.paste(&Paste, window, cx); - // this.expand_selected_entry(&ExpandSelectedEntry, cx); + this.update_visible_entries(None, false, false, window, cx); }) }); cx.run_until_parked(); @@ -3199,16 +3401,17 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); // Case 1: Move last dir 'd' - should move only 'd', leaving 'a/b/c' select_path(&panel, "root/a/b/c/d", cx); panel.update_in(cx, |panel, window, cx| { let drag = DraggedSelection { active_selection: SelectedEntry { - worktree_id: panel.selection.as_ref().unwrap().worktree_id, - entry_id: panel.resolve_entry(panel.selection.as_ref().unwrap().entry_id), + worktree_id: panel.state.selection.as_ref().unwrap().worktree_id, + entry_id: panel.resolve_entry(panel.state.selection.as_ref().unwrap().entry_id), }, - marked_selections: Arc::new([*panel.selection.as_ref().unwrap()]), + marked_selections: Arc::new([*panel.state.selection.as_ref().unwrap()]), }; let target_entry = panel .project @@ -3217,7 +3420,7 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { .next() .unwrap() .read(cx) - .entry_for_path("target_destination") + .entry_for_path(rel_path("target_destination")) .unwrap(); panel.drag_onto(&drag, target_entry.id, false, window, cx); }); @@ -3238,10 +3441,10 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { let drag = DraggedSelection { active_selection: SelectedEntry { - worktree_id: panel.selection.as_ref().unwrap().worktree_id, - entry_id: panel.resolve_entry(panel.selection.as_ref().unwrap().entry_id), + worktree_id: panel.state.selection.as_ref().unwrap().worktree_id, + entry_id: panel.resolve_entry(panel.state.selection.as_ref().unwrap().entry_id), }, - marked_selections: Arc::new([*panel.selection.as_ref().unwrap()]), + marked_selections: Arc::new([*panel.state.selection.as_ref().unwrap()]), }; let target_entry = panel .project @@ -3250,7 +3453,7 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { .next() .unwrap() .read(cx) - .entry_for_path("a/b/c") + .entry_for_path(rel_path("a/b/c")) .unwrap(); panel.drag_onto(&drag, target_entry.id, false, window, cx); }); @@ -3261,10 +3464,10 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { let drag = DraggedSelection { active_selection: SelectedEntry { - worktree_id: panel.selection.as_ref().unwrap().worktree_id, - entry_id: panel.resolve_entry(panel.selection.as_ref().unwrap().entry_id), + worktree_id: panel.state.selection.as_ref().unwrap().worktree_id, + entry_id: panel.resolve_entry(panel.state.selection.as_ref().unwrap().entry_id), }, - marked_selections: Arc::new([*panel.selection.as_ref().unwrap()]), + marked_selections: Arc::new([*panel.state.selection.as_ref().unwrap()]), }; let target_entry = panel .project @@ -3273,7 +3476,7 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { .next() .unwrap() .read(cx) - .entry_for_path("target_destination") + .entry_for_path(rel_path("target_destination")) .unwrap(); panel.drag_onto(&drag, target_entry.id, false, window, cx); }); @@ -3290,10 +3493,10 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { let drag = DraggedSelection { active_selection: SelectedEntry { - worktree_id: panel.selection.as_ref().unwrap().worktree_id, - entry_id: panel.resolve_entry(panel.selection.as_ref().unwrap().entry_id), + worktree_id: panel.state.selection.as_ref().unwrap().worktree_id, + entry_id: panel.resolve_entry(panel.state.selection.as_ref().unwrap().entry_id), }, - marked_selections: Arc::new([*panel.selection.as_ref().unwrap()]), + marked_selections: Arc::new([*panel.state.selection.as_ref().unwrap()]), }; let target_entry = panel .project @@ -3302,7 +3505,7 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { .next() .unwrap() .read(cx) - .entry_for_path("a") + .entry_for_path(rel_path("a")) .unwrap(); panel.drag_onto(&drag, target_entry.id, false, window, cx); }); @@ -3313,10 +3516,10 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { let drag = DraggedSelection { active_selection: SelectedEntry { - worktree_id: panel.selection.as_ref().unwrap().worktree_id, - entry_id: panel.resolve_entry(panel.selection.as_ref().unwrap().entry_id), + worktree_id: panel.state.selection.as_ref().unwrap().worktree_id, + entry_id: panel.resolve_entry(panel.state.selection.as_ref().unwrap().entry_id), }, - marked_selections: Arc::new([*panel.selection.as_ref().unwrap()]), + marked_selections: Arc::new([*panel.state.selection.as_ref().unwrap()]), }; let target_entry = panel .project @@ -3325,7 +3528,7 @@ async fn test_dragged_selection_resolve_entry(cx: &mut gpui::TestAppContext) { .next() .unwrap() .read(cx) - .entry_for_path("target_destination") + .entry_for_path(rel_path("target_destination")) .unwrap(); panel.drag_onto(&drag, target_entry.id, false, window, cx); }); @@ -3343,11 +3546,12 @@ async fn test_autoreveal_and_gitignored_files(cx: &mut gpui::TestAppContext) { init_test_with_editor(cx); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |worktree_settings| { - worktree_settings.file_scan_exclusions = Some(Vec::new()); - }); - store.update_user_settings::(cx, |project_panel_settings| { - project_panel_settings.auto_reveal_entries = Some(false) + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(Vec::new()); + settings + .project_panel + .get_or_insert_default() + .auto_reveal_entries = Some(false); }); }) }); @@ -3381,6 +3585,7 @@ async fn test_autoreveal_and_gitignored_files(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..20, cx), @@ -3465,8 +3670,11 @@ async fn test_autoreveal_and_gitignored_files(cx: &mut gpui::TestAppContext) { cx.update(|_, cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_panel_settings| { - project_panel_settings.auto_reveal_entries = Some(true) + store.update_user_settings(cx, |settings| { + settings + .project_panel + .get_or_insert_default() + .auto_reveal_entries = Some(true) }); }) }); @@ -3579,13 +3787,14 @@ async fn test_gitignored_and_always_included(cx: &mut gpui::TestAppContext) { init_test_with_editor(cx); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |worktree_settings| { - worktree_settings.file_scan_exclusions = Some(Vec::new()); - worktree_settings.file_scan_inclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(Vec::new()); + settings.project.worktree.file_scan_inclusions = Some(vec!["always_included_but_ignored_dir/*".to_string()]); - }); - store.update_user_settings::(cx, |project_panel_settings| { - project_panel_settings.auto_reveal_entries = Some(false) + settings + .project_panel + .get_or_insert_default() + .auto_reveal_entries = Some(false) }); }) }); @@ -3624,6 +3833,7 @@ async fn test_gitignored_and_always_included(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..20, cx), @@ -3654,8 +3864,11 @@ async fn test_gitignored_and_always_included(cx: &mut gpui::TestAppContext) { cx.run_until_parked(); cx.update(|_, cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_panel_settings| { - project_panel_settings.auto_reveal_entries = Some(true) + store.update_user_settings(cx, |settings| { + settings + .project_panel + .get_or_insert_default() + .auto_reveal_entries = Some(true) }); }) }); @@ -3695,11 +3908,12 @@ async fn test_explicit_reveal(cx: &mut gpui::TestAppContext) { init_test_with_editor(cx); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |worktree_settings| { - worktree_settings.file_scan_exclusions = Some(Vec::new()); - }); - store.update_user_settings::(cx, |project_panel_settings| { - project_panel_settings.auto_reveal_entries = Some(false) + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(Vec::new()); + settings + .project_panel + .get_or_insert_default() + .auto_reveal_entries = Some(false) }); }) }); @@ -3733,6 +3947,7 @@ async fn test_explicit_reveal(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..20, cx), @@ -3896,8 +4111,8 @@ async fn test_creating_excluded_entries(cx: &mut gpui::TestAppContext) { init_test(cx); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["excluded_dir".to_string(), "**/.git".to_string()]); }); }); @@ -3929,6 +4144,7 @@ async fn test_creating_excluded_entries(cx: &mut gpui::TestAppContext) { panel }) .unwrap(); + cx.run_until_parked(); select_path(&panel, "root1", cx); assert_eq!( @@ -3948,6 +4164,7 @@ async fn test_creating_excluded_entries(cx: &mut gpui::TestAppContext) { let excluded_dir_path = "excluded_dir"; panel.update_in(cx, |panel, window, cx| panel.new_file(&NewFile, window, cx)); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); @@ -3984,7 +4201,7 @@ async fn test_creating_excluded_entries(cx: &mut gpui::TestAppContext) { .clone(); assert_eq!( active_entry_path.path.as_ref(), - Path::new(excluded_file_path), + rel_path(excluded_file_path), "Should open the excluded file" ); @@ -4003,6 +4220,7 @@ async fn test_creating_excluded_entries(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.new_directory(&NewDirectory, window, cx) }); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); @@ -4015,7 +4233,7 @@ async fn test_creating_excluded_entries(cx: &mut gpui::TestAppContext) { }) .await .unwrap(); - + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..13, cx), &["v root1", " .dockerignore"], @@ -4044,9 +4262,12 @@ async fn test_creating_excluded_entries(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.new_directory(&NewDirectory, window, cx) }); + cx.run_until_parked(); + panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); + panel .update_in(cx, |panel, window, cx| { panel.filename_editor.update(cx, |editor, cx| { @@ -4057,6 +4278,8 @@ async fn test_creating_excluded_entries(cx: &mut gpui::TestAppContext) { .await .unwrap(); + cx.run_until_parked(); + assert_eq!( visible_entries_as_strings(&panel, 0..13, cx), &["v root1", " .dockerignore"], @@ -4113,8 +4336,9 @@ async fn test_selection_restored_when_creation_cancelled(cx: &mut gpui::TestAppC panel }) .unwrap(); + cx.run_until_parked(); - select_path(&panel, "src/", cx); + select_path(&panel, "src", cx); panel.update_in(cx, |panel, window, cx| panel.confirm(&Confirm, window, cx)); cx.executor().run_until_parked(); assert_eq!( @@ -4128,6 +4352,7 @@ async fn test_selection_restored_when_creation_cancelled(cx: &mut gpui::TestAppC panel.update_in(cx, |panel, window, cx| { panel.new_directory(&NewDirectory, window, cx) }); + cx.executor().run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); @@ -4142,8 +4367,10 @@ async fn test_selection_restored_when_creation_cancelled(cx: &mut gpui::TestAppC ); panel.update_in(cx, |panel, window, cx| { - panel.cancel(&menu::Cancel, window, cx) + panel.cancel(&menu::Cancel, window, cx); + panel.update_visible_entries(None, false, false, window, cx); }); + cx.executor().run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -4182,6 +4409,7 @@ async fn test_basic_file_deletion_scenarios(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root/dir1", cx); toggle_expand_dir(&panel, "root/dir2", cx); @@ -4316,6 +4544,7 @@ async fn test_deletion_gitignored(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); select_path(&panel, "root/aa", cx); assert_eq!( @@ -4413,6 +4642,7 @@ async fn test_nested_deletion_gitignore(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); // Test 1: Visible items should exclude files on gitignore toggle_expand_dir(&panel, "root/dir1", cx); @@ -4474,6 +4704,7 @@ async fn test_complex_selection_scenarios(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root/dir1", cx); toggle_expand_dir(&panel, "root/dir1/subdir1", cx); @@ -4586,6 +4817,7 @@ async fn test_delete_all_files_and_directories(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root/dir1", cx); toggle_expand_dir(&panel, "root/dir1/subdir1", cx); @@ -4658,6 +4890,7 @@ async fn test_nested_selection_deletion(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root/dir1", cx); toggle_expand_dir(&panel, "root/dir1/subdir1", cx); @@ -4732,6 +4965,7 @@ async fn test_multiple_worktrees_deletion(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); // Expand all directories for testing toggle_expand_dir(&panel, "root1/dir1", cx); @@ -4863,6 +5097,7 @@ async fn test_selection_vs_marked_entries_priority(cx: &mut gpui::TestAppContext let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root/dir1", cx); toggle_expand_dir(&panel, "root/dir2", cx); @@ -4966,6 +5201,7 @@ async fn test_selection_fallback_to_next_highest_worktree(cx: &mut gpui::TestApp let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root_b/dir1", cx); toggle_expand_dir(&panel, "root_c/dir2", cx); @@ -5012,12 +5248,8 @@ async fn test_selection_fallback_to_next_highest_worktree(cx: &mut gpui::TestApp ); } -fn toggle_expand_dir( - panel: &Entity, - path: impl AsRef, - cx: &mut VisualTestContext, -) { - let path = path.as_ref(); +fn toggle_expand_dir(panel: &Entity, path: &str, cx: &mut VisualTestContext) { + let path = rel_path(path); panel.update_in(cx, |panel, window, cx| { for worktree in panel.project.read(cx).worktrees(cx).collect::>() { let worktree = worktree.read(cx); @@ -5029,6 +5261,7 @@ fn toggle_expand_dir( } panic!("no worktree for path {:?}", path); }); + cx.run_until_parked(); } #[gpui::test] @@ -5082,6 +5315,7 @@ async fn test_expand_all_for_entry(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..20, cx), @@ -5104,11 +5338,11 @@ async fn test_expand_all_for_entry(cx: &mut gpui::TestAppContext) { ); let entry_id = find_project_entry(&panel, "root/dir1", cx).unwrap(); - panel.update(cx, |panel, cx| { + panel.update_in(cx, |panel, window, cx| { let project = panel.project.read(cx); let worktree = project.worktrees(cx).next().unwrap().read(cx); panel.expand_all_for_entry(worktree.id(), entry_id, cx); - panel.update_visible_entries(None, cx); + panel.update_visible_entries(None, false, false, window, cx); }); cx.run_until_parked(); @@ -5162,11 +5396,11 @@ async fn test_expand_all_for_entry(cx: &mut gpui::TestAppContext) { ); let entry_id = find_project_entry(&panel, "root/dir1", cx).unwrap(); - panel.update(cx, |panel, cx| { + panel.update_in(cx, |panel, window, cx| { let project = panel.project.read(cx); let worktree = project.worktrees(cx).next().unwrap().read(cx); panel.expand_all_for_entry(worktree.id(), entry_id, cx); - panel.update_visible_entries(None, cx); + panel.update_visible_entries(None, false, false, window, cx); }); cx.run_until_parked(); @@ -5192,11 +5426,11 @@ async fn test_expand_all_for_entry(cx: &mut gpui::TestAppContext) { // Test 3: When explicitly called on ignored directory let ignored_dir_entry = find_project_entry(&panel, "root/dir1/ignored_dir", cx).unwrap(); - panel.update(cx, |panel, cx| { + panel.update_in(cx, |panel, window, cx| { let project = panel.project.read(cx); let worktree = project.worktrees(cx).next().unwrap().read(cx); panel.expand_all_for_entry(worktree.id(), ignored_dir_entry, cx); - panel.update_visible_entries(None, cx); + panel.update_visible_entries(None, false, false, window, cx); }); cx.run_until_parked(); @@ -5257,6 +5491,7 @@ async fn test_collapse_all_for_entry(cx: &mut gpui::TestAppContext) { // Test 1: Basic collapsing { let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root/dir1", cx); toggle_expand_dir(&panel, "root/dir1/subdir1", cx); @@ -5280,12 +5515,13 @@ async fn test_collapse_all_for_entry(cx: &mut gpui::TestAppContext) { ); let entry_id = find_project_entry(&panel, "root/dir1", cx).unwrap(); - panel.update(cx, |panel, cx| { + panel.update_in(cx, |panel, window, cx| { let project = panel.project.read(cx); let worktree = project.worktrees(cx).next().unwrap().read(cx); panel.collapse_all_for_entry(worktree.id(), entry_id, cx); - panel.update_visible_entries(None, cx); + panel.update_visible_entries(None, false, false, window, cx); }); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..20, cx), @@ -5308,6 +5544,7 @@ async fn test_collapse_all_for_entry(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root/dir1", cx); toggle_expand_dir(&panel, "root/dir1/subdir1", cx); @@ -5363,6 +5600,7 @@ async fn test_collapse_all_for_entry(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); toggle_expand_dir(&panel, "root/dir1", cx); toggle_expand_dir(&panel, "root/dir1/subdir1", cx); @@ -5432,6 +5670,7 @@ async fn test_create_entries_without_selection(cx: &mut gpui::TestAppContext) { panel }) .unwrap(); + cx.run_until_parked(); #[rustfmt::skip] assert_eq!( @@ -5446,6 +5685,7 @@ async fn test_create_entries_without_selection(cx: &mut gpui::TestAppContext) { panel.update_in(cx, |panel, window, cx| { panel.new_file(&NewFile, window, cx); }); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); @@ -5458,7 +5698,7 @@ async fn test_create_entries_without_selection(cx: &mut gpui::TestAppContext) { }) .await .unwrap(); - + cx.run_until_parked(); #[rustfmt::skip] assert_eq!( visible_entries_as_strings(&panel, 0..20, cx), @@ -5509,6 +5749,7 @@ async fn test_create_entries_without_selection_hide_root(cx: &mut gpui::TestAppC panel }) .unwrap(); + cx.run_until_parked(); #[rustfmt::skip] assert_eq!( @@ -5522,7 +5763,7 @@ async fn test_create_entries_without_selection_hide_root(cx: &mut gpui::TestAppC panel.update(cx, |panel, _| { assert!( - panel.selection.is_none(), + panel.state.selection.is_none(), "Should have no selection initially" ); }); @@ -5531,10 +5772,11 @@ async fn test_create_entries_without_selection_hide_root(cx: &mut gpui::TestAppC panel.update_in(cx, |panel, window, cx| { panel.new_file(&NewFile, window, cx); }); + cx.run_until_parked(); panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); - + cx.run_until_parked(); #[rustfmt::skip] assert_eq!( visible_entries_as_strings(&panel, 0..20, cx), @@ -5553,6 +5795,7 @@ async fn test_create_entries_without_selection_hide_root(cx: &mut gpui::TestAppC panel.confirm_edit(window, cx).unwrap() }); confirm.await.unwrap(); + cx.run_until_parked(); #[rustfmt::skip] assert_eq!( @@ -5572,12 +5815,14 @@ async fn test_create_entries_without_selection_hide_root(cx: &mut gpui::TestAppC // Test 2: Create new directory when no entry is selected panel.update(cx, |panel, _| { - panel.selection = None; + panel.state.selection = None; }); panel.update_in(cx, |panel, window, cx| { panel.new_directory(&NewDirectory, window, cx); }); + cx.run_until_parked(); + panel.update_in(cx, |panel, window, cx| { assert!(panel.filename_editor.read(cx).is_focused(window)); }); @@ -5601,6 +5846,7 @@ async fn test_create_entries_without_selection_hide_root(cx: &mut gpui::TestAppC panel.confirm_edit(window, cx).unwrap() }); confirm.await.unwrap(); + cx.run_until_parked(); #[rustfmt::skip] assert_eq!( @@ -5643,6 +5889,7 @@ async fn test_highlight_entry_for_external_drag(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update(cx, |panel, cx| { let project = panel.project.read(cx); @@ -5650,7 +5897,7 @@ async fn test_highlight_entry_for_external_drag(cx: &mut gpui::TestAppContext) { let worktree = worktree.read(cx); // Test 1: Target is a directory, should highlight the directory itself - let dir_entry = worktree.entry_for_path("dir1").unwrap(); + let dir_entry = worktree.entry_for_path(rel_path("dir1")).unwrap(); let result = panel.highlight_entry_for_external_drag(dir_entry, worktree); assert_eq!( result, @@ -5659,8 +5906,10 @@ async fn test_highlight_entry_for_external_drag(cx: &mut gpui::TestAppContext) { ); // Test 2: Target is nested file, should highlight immediate parent - let nested_file = worktree.entry_for_path("dir1/dir2/file2.txt").unwrap(); - let nested_parent = worktree.entry_for_path("dir1/dir2").unwrap(); + let nested_file = worktree + .entry_for_path(rel_path("dir1/dir2/file2.txt")) + .unwrap(); + let nested_parent = worktree.entry_for_path(rel_path("dir1/dir2")).unwrap(); let result = panel.highlight_entry_for_external_drag(nested_file, worktree); assert_eq!( result, @@ -5669,7 +5918,7 @@ async fn test_highlight_entry_for_external_drag(cx: &mut gpui::TestAppContext) { ); // Test 3: Target is root level file, should highlight root - let root_file = worktree.entry_for_path("file3.txt").unwrap(); + let root_file = worktree.entry_for_path(rel_path("file3.txt")).unwrap(); let result = panel.highlight_entry_for_external_drag(root_file, worktree); assert_eq!( result, @@ -5714,6 +5963,7 @@ async fn test_highlight_entry_for_selection_drag(cx: &mut gpui::TestAppContext) let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update(cx, |panel, cx| { let project = panel.project.read(cx); @@ -5721,16 +5971,20 @@ async fn test_highlight_entry_for_selection_drag(cx: &mut gpui::TestAppContext) let worktree_id = worktree.read(cx).id(); let worktree = worktree.read(cx); - let parent_dir = worktree.entry_for_path("parent_dir").unwrap(); + let parent_dir = worktree.entry_for_path(rel_path("parent_dir")).unwrap(); let child_file = worktree - .entry_for_path("parent_dir/child_file.txt") + .entry_for_path(rel_path("parent_dir/child_file.txt")) .unwrap(); let sibling_file = worktree - .entry_for_path("parent_dir/sibling_file.txt") + .entry_for_path(rel_path("parent_dir/sibling_file.txt")) + .unwrap(); + let child_dir = worktree + .entry_for_path(rel_path("parent_dir/child_dir")) + .unwrap(); + let other_dir = worktree.entry_for_path(rel_path("other_dir")).unwrap(); + let other_file = worktree + .entry_for_path(rel_path("other_dir/other_file.txt")) .unwrap(); - let child_dir = worktree.entry_for_path("parent_dir/child_dir").unwrap(); - let other_dir = worktree.entry_for_path("other_dir").unwrap(); - let other_file = worktree.entry_for_path("other_dir/other_file.txt").unwrap(); // Test 1: Single item drag, don't highlight parent directory let dragged_selection = DraggedSelection { @@ -5849,17 +6103,24 @@ async fn test_highlight_entry_for_selection_drag_cross_worktree(cx: &mut gpui::T let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update(cx, |panel, cx| { let project = panel.project.read(cx); let worktrees: Vec<_> = project.visible_worktrees(cx).collect(); let worktree_a = &worktrees[0]; - let main_rs_from_a = worktree_a.read(cx).entry_for_path("src/main.rs").unwrap(); + let main_rs_from_a = worktree_a + .read(cx) + .entry_for_path(rel_path("src/main.rs")) + .unwrap(); let worktree_b = &worktrees[1]; - let src_dir_from_b = worktree_b.read(cx).entry_for_path("src").unwrap(); - let main_rs_from_b = worktree_b.read(cx).entry_for_path("src/main.rs").unwrap(); + let src_dir_from_b = worktree_b.read(cx).entry_for_path(rel_path("src")).unwrap(); + let main_rs_from_b = worktree_b + .read(cx) + .entry_for_path(rel_path("src/main.rs")) + .unwrap(); // Test dragging file from worktree A onto parent of file with same relative path in worktree B let dragged_selection = DraggedSelection { @@ -5933,6 +6194,7 @@ async fn test_should_highlight_background_for_selection_drag(cx: &mut gpui::Test let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); panel.update(cx, |panel, cx| { let project = panel.project.read(cx); @@ -5944,14 +6206,14 @@ async fn test_should_highlight_background_for_selection_drag(cx: &mut gpui::Test let root1_entry = worktree1.root_entry().unwrap(); let root2_entry = worktree2.root_entry().unwrap(); - let _parent_dir = worktree1.entry_for_path("parent_dir").unwrap(); + let _parent_dir = worktree1.entry_for_path(rel_path("parent_dir")).unwrap(); let child_file = worktree1 - .entry_for_path("parent_dir/child_file.txt") + .entry_for_path(rel_path("parent_dir/child_file.txt")) .unwrap(); let nested_file = worktree1 - .entry_for_path("parent_dir/nested_dir/nested_file.txt") + .entry_for_path(rel_path("parent_dir/nested_dir/nested_file.txt")) .unwrap(); - let root_file = worktree1.entry_for_path("root_file.txt").unwrap(); + let root_file = worktree1.entry_for_path(rel_path("root_file.txt")).unwrap(); // Test 1: Multiple entries - should always highlight background let multiple_dragged_selection = DraggedSelection { @@ -6104,6 +6366,7 @@ async fn test_hide_root(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); #[rustfmt::skip] assert_eq!( @@ -6138,6 +6401,7 @@ async fn test_hide_root(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), @@ -6180,6 +6444,7 @@ async fn test_hide_root(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), @@ -6215,6 +6480,7 @@ async fn test_hide_root(cx: &mut gpui::TestAppContext) { }); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), @@ -6253,9 +6519,10 @@ async fn test_compare_selected_files(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); - let file1_path = path!("root/file1.txt"); - let file2_path = path!("root/file2.txt"); + let file1_path = "root/file1.txt"; + let file2_path = "root/file2.txt"; select_path_with_mark(&panel, file1_path, cx); select_path_with_mark(&panel, file2_path, cx); @@ -6281,7 +6548,11 @@ async fn test_compare_selected_files(cx: &mut gpui::TestAppContext) { assert_eq!(diff_view.tab_content_text(0, cx), "file1.txt ↔ file2.txt"); assert_eq!( diff_view.tab_tooltip_text(cx).unwrap(), - format!("{} ↔ {}", file1_path, file2_path) + format!( + "{} ↔ {}", + rel_path(file1_path).display(PathStyle::local()), + rel_path(file2_path).display(PathStyle::local()) + ) ); }) .unwrap(); @@ -6352,6 +6623,7 @@ async fn test_compare_files_context_menu(cx: &mut gpui::TestAppContext) { let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let cx = &mut VisualTestContext::from_window(*workspace, cx); let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); // Test 1: When only one file is selected, there should be no compare option select_path(&panel, "root/file1.txt", cx); @@ -6412,30 +6684,166 @@ async fn test_compare_files_context_menu(cx: &mut gpui::TestAppContext) { } } -fn select_path(panel: &Entity, path: impl AsRef, cx: &mut VisualTestContext) { - let path = path.as_ref(); - panel.update(cx, |panel, cx| { +#[gpui::test] +async fn test_hide_hidden_entries(cx: &mut gpui::TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + "/root", + json!({ + ".hidden-file.txt": "hidden file content", + "visible-file.txt": "visible file content", + ".hidden-parent-dir": { + "nested-dir": { + "file.txt": "file content", + } + }, + "visible-dir": { + "file-in-visible.txt": "file content", + "nested": { + ".hidden-nested-dir": { + ".double-hidden-dir": { + "deep-file-1.txt": "deep content 1", + "deep-file-2.txt": "deep content 2" + }, + "hidden-nested-file-1.txt": "hidden nested 1", + "hidden-nested-file-2.txt": "hidden nested 2" + }, + "visible-nested-file.txt": "visible nested content" + } + } + }), + ) + .await; + + let project = Project::test(fs.clone(), ["/root".as_ref()], cx).await; + let workspace = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let cx = &mut VisualTestContext::from_window(*workspace, cx); + + cx.update(|_, cx| { + let settings = *ProjectPanelSettings::get_global(cx); + ProjectPanelSettings::override_global( + ProjectPanelSettings { + hide_hidden: false, + ..settings + }, + cx, + ); + }); + + let panel = workspace.update(cx, ProjectPanel::new).unwrap(); + cx.run_until_parked(); + + toggle_expand_dir(&panel, "root/.hidden-parent-dir", cx); + toggle_expand_dir(&panel, "root/.hidden-parent-dir/nested-dir", cx); + toggle_expand_dir(&panel, "root/visible-dir", cx); + toggle_expand_dir(&panel, "root/visible-dir/nested", cx); + toggle_expand_dir(&panel, "root/visible-dir/nested/.hidden-nested-dir", cx); + toggle_expand_dir( + &panel, + "root/visible-dir/nested/.hidden-nested-dir/.double-hidden-dir", + cx, + ); + + let expanded = [ + "v root", + " v .hidden-parent-dir", + " v nested-dir", + " file.txt", + " v visible-dir", + " v nested", + " v .hidden-nested-dir", + " v .double-hidden-dir <== selected", + " deep-file-1.txt", + " deep-file-2.txt", + " hidden-nested-file-1.txt", + " hidden-nested-file-2.txt", + " visible-nested-file.txt", + " file-in-visible.txt", + " .hidden-file.txt", + " visible-file.txt", + ]; + + assert_eq!( + visible_entries_as_strings(&panel, 0..30, cx), + &expanded, + "With hide_hidden=false, contents of hidden nested directory should be visible" + ); + + cx.update(|_, cx| { + let settings = *ProjectPanelSettings::get_global(cx); + ProjectPanelSettings::override_global( + ProjectPanelSettings { + hide_hidden: true, + ..settings + }, + cx, + ); + }); + + panel.update_in(cx, |panel, window, cx| { + panel.update_visible_entries(None, false, false, window, cx); + }); + cx.run_until_parked(); + + assert_eq!( + visible_entries_as_strings(&panel, 0..30, cx), + &[ + "v root", + " v visible-dir", + " v nested", + " visible-nested-file.txt", + " file-in-visible.txt", + " visible-file.txt", + ], + "With hide_hidden=false, contents of hidden nested directory should be visible" + ); + + panel.update_in(cx, |panel, window, cx| { + let settings = *ProjectPanelSettings::get_global(cx); + ProjectPanelSettings::override_global( + ProjectPanelSettings { + hide_hidden: false, + ..settings + }, + cx, + ); + panel.update_visible_entries(None, false, false, window, cx); + }); + cx.run_until_parked(); + + assert_eq!( + visible_entries_as_strings(&panel, 0..30, cx), + &expanded, + "With hide_hidden=false, deeply nested hidden directories and their contents should be visible" + ); +} + +fn select_path(panel: &Entity, path: &str, cx: &mut VisualTestContext) { + let path = rel_path(path); + panel.update_in(cx, |panel, window, cx| { for worktree in panel.project.read(cx).worktrees(cx).collect::>() { let worktree = worktree.read(cx); if let Ok(relative_path) = path.strip_prefix(worktree.root_name()) { let entry_id = worktree.entry_for_path(relative_path).unwrap().id; - panel.selection = Some(crate::SelectedEntry { - worktree_id: worktree.id(), - entry_id, - }); + panel.update_visible_entries( + Some((worktree.id(), entry_id)), + false, + false, + window, + cx, + ); return; } } panic!("no worktree for path {:?}", path); }); + cx.run_until_parked(); } -fn select_path_with_mark( - panel: &Entity, - path: impl AsRef, - cx: &mut VisualTestContext, -) { - let path = path.as_ref(); +fn select_path_with_mark(panel: &Entity, path: &str, cx: &mut VisualTestContext) { + let path = rel_path(path); panel.update(cx, |panel, cx| { for worktree in panel.project.read(cx).worktrees(cx).collect::>() { let worktree = worktree.read(cx); @@ -6448,7 +6856,7 @@ fn select_path_with_mark( if !panel.marked_entries.contains(&entry) { panel.marked_entries.push(entry); } - panel.selection = Some(entry); + panel.state.selection = Some(entry); return; } } @@ -6458,10 +6866,10 @@ fn select_path_with_mark( fn find_project_entry( panel: &Entity, - path: impl AsRef, + path: &str, cx: &mut VisualTestContext, ) -> Option { - let path = path.as_ref(); + let path = rel_path(path); panel.update(cx, |panel, cx| { for worktree in panel.project.read(cx).worktrees(cx).collect::>() { let worktree = worktree.read(cx); @@ -6545,11 +6953,12 @@ fn init_test(cx: &mut TestAppContext) { Project::init_settings(cx); cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_panel_settings| { - project_panel_settings.auto_fold_dirs = Some(false); - }); - store.update_user_settings::(cx, |worktree_settings| { - worktree_settings.file_scan_exclusions = Some(Vec::new()); + store.update_user_settings(cx, |settings| { + settings + .project_panel + .get_or_insert_default() + .auto_fold_dirs = Some(false); + settings.project.worktree.file_scan_exclusions = Some(Vec::new()); }); }); }); @@ -6567,11 +6976,12 @@ fn init_test_with_editor(cx: &mut TestAppContext) { Project::init_settings(cx); cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_panel_settings| { - project_panel_settings.auto_fold_dirs = Some(false); - }); - store.update_user_settings::(cx, |worktree_settings| { - worktree_settings.file_scan_exclusions = Some(Vec::new()); + store.update_user_settings(cx, |settings| { + settings + .project_panel + .get_or_insert_default() + .auto_fold_dirs = Some(false); + settings.project.worktree.file_scan_exclusions = Some(Vec::new()) }); }); }); @@ -6597,7 +7007,7 @@ fn ensure_single_file_is_opened( open_project_paths, vec![ProjectPath { worktree_id, - path: Arc::from(Path::new(expected_path)) + path: Arc::from(rel_path(expected_path)) }], "Should have opened file, selected in project panel" ); diff --git a/crates/project_symbols/src/project_symbols.rs b/crates/project_symbols/src/project_symbols.rs index cec7729252ac4bf8a532c18d18f5c1c4636b308c..7d3350633d6e76ae3a880d21e22efe6b700f1d4a 100644 --- a/crates/project_symbols/src/project_symbols.rs +++ b/crates/project_symbols/src/project_symbols.rs @@ -6,9 +6,9 @@ use gpui::{ }; use ordered_float::OrderedFloat; use picker::{Picker, PickerDelegate}; -use project::{Project, Symbol}; +use project::{Project, Symbol, lsp_store::SymbolLocation}; use settings::Settings; -use std::{borrow::Cow, cmp::Reverse, sync::Arc}; +use std::{cmp::Reverse, sync::Arc}; use theme::{ActiveTheme, ThemeSettings}; use util::ResultExt; use workspace::{ @@ -195,9 +195,13 @@ impl PickerDelegate for ProjectSymbolsDelegate { StringMatchCandidate::new(id, symbol.label.filter_text()) }) .partition(|candidate| { - project - .entry_for_path(&symbols[candidate.id].path, cx) - .is_some_and(|e| !e.is_ignored) + if let SymbolLocation::InProject(path) = &symbols[candidate.id].path { + project + .entry_for_path(path, cx) + .is_some_and(|e| !e.is_ignored) + } else { + false + } }); delegate.visible_match_candidates = visible_match_candidates; @@ -217,22 +221,27 @@ impl PickerDelegate for ProjectSymbolsDelegate { _window: &mut Window, cx: &mut Context>, ) -> Option { + let path_style = self.project.read(cx).path_style(cx); let string_match = &self.matches.get(ix)?; let symbol = &self.symbols.get(string_match.candidate_id)?; let syntax_runs = styled_runs_for_code_label(&symbol.label, cx.theme().syntax()); - let mut path = symbol.path.path.to_string_lossy(); - if self.show_worktree_root_name { - let project = self.project.read(cx); - if let Some(worktree) = project.worktree_for_id(symbol.path.worktree_id, cx) { - path = Cow::Owned(format!( - "{}{}{}", - worktree.read(cx).root_name(), - std::path::MAIN_SEPARATOR, - path.as_ref() - )); + let path = match &symbol.path { + SymbolLocation::InProject(project_path) => { + let project = self.project.read(cx); + let mut path = project_path.path.clone(); + if self.show_worktree_root_name + && let Some(worktree) = project.worktree_for_id(project_path.worktree_id, cx) + { + path = worktree.read(cx).root_name().join(&path); + } + path.display(path_style).into_owned().into() } - } + SymbolLocation::OutsideProject { + abs_path, + signature: _, + } => abs_path.to_string_lossy(), + }; let label = symbol.label.text.clone(); let path = path.to_string(); diff --git a/crates/prompt_store/src/prompts.rs b/crates/prompt_store/src/prompts.rs index 9a9b2fc3de91cea156b1c0affc2e2a8184aebb42..8790e8039957632dcc9508839ada1f6ac026e174 100644 --- a/crates/prompt_store/src/prompts.rs +++ b/crates/prompt_store/src/prompts.rs @@ -14,7 +14,9 @@ use std::{ time::Duration, }; use text::LineEnding; -use util::{ResultExt, get_system_shell}; +use util::{ + ResultExt, get_default_system_shell_preferring_bash, rel_path::RelPath, shell::ShellKind, +}; use crate::UserPromptId; @@ -43,7 +45,7 @@ impl ProjectContext { user_rules: default_user_rules, os: std::env::consts::OS.to_string(), arch: std::env::consts::ARCH.to_string(), - shell: get_system_shell(), + shell: ShellKind::new(&get_default_system_shell_preferring_bash()).to_string(), } } } @@ -80,7 +82,7 @@ pub struct WorktreeContext { #[derive(Debug, Clone, Eq, PartialEq, Serialize)] pub struct RulesFileContext { - pub path_in_worktree: Arc, + pub path_in_worktree: Arc, pub text: String, // This used for opening rules files. TODO: Since it isn't related to prompt templating, this // should be moved elsewhere. @@ -447,6 +449,7 @@ impl PromptBuilder { mod test { use super::*; use serde_json; + use util::rel_path::rel_path; use uuid::Uuid; #[test] @@ -455,7 +458,7 @@ mod test { root_name: "path".into(), abs_path: Path::new("/path/to/root").into(), rules_file: Some(RulesFileContext { - path_in_worktree: Path::new(".rules").into(), + path_in_worktree: rel_path(".rules").into(), text: "".into(), project_entry_id: 0, }), diff --git a/crates/proto/proto/call.proto b/crates/proto/proto/call.proto index b5c882db568200b4a56f49393d93317ccf49cd12..9e801515af3a4ea37eb3564c32b8ee9ad7278aa8 100644 --- a/crates/proto/proto/call.proto +++ b/crates/proto/proto/call.proto @@ -173,6 +173,7 @@ message ShareProject { repeated WorktreeMetadata worktrees = 2; reserved 3; bool is_ssh_project = 4; + optional bool windows_paths = 5; } message ShareProjectResponse { @@ -202,6 +203,7 @@ message JoinProjectResponse { repeated LanguageServer language_servers = 4; repeated string language_server_capabilities = 8; ChannelRole role = 6; + bool windows_paths = 9; reserved 7; } @@ -356,8 +358,10 @@ message UpdateView { repeated Selection selections = 3; optional Selection pending_selection = 4; EditorAnchor scroll_top_anchor = 5; - float scroll_x = 6; - float scroll_y = 7; + reserved 6; + reserved 7; + double scroll_x = 8; + double scroll_y = 9; } } @@ -379,8 +383,10 @@ message View { repeated Selection selections = 4; optional Selection pending_selection = 5; EditorAnchor scroll_top_anchor = 6; - float scroll_x = 7; - float scroll_y = 8; + reserved 7; + reserved 8; + double scroll_x = 9; + double scroll_y = 10; } message ChannelView { diff --git a/crates/proto/proto/git.proto b/crates/proto/proto/git.proto index 3f17f0d0c3483ade36b73e26c7207f6cf667bb63..7004b0c9a0b4aff54434fac6b1f6ecc9be773ed4 100644 --- a/crates/proto/proto/git.proto +++ b/crates/proto/proto/git.proto @@ -183,6 +183,13 @@ message GitChangeBranch { string branch_name = 4; } +message GitRenameBranch { + uint64 project_id = 1; + uint64 repository_id = 2; + string branch = 3; + string new_name = 4; +} + message GitDiff { uint64 project_id = 1; reserved 2; diff --git a/crates/proto/proto/worktree.proto b/crates/proto/proto/worktree.proto index 19a61cc4bc8d3b04103afe3a6c6b799ab92461e3..9ab9e95438d220834351308ea83ffe9a18dec999 100644 --- a/crates/proto/proto/worktree.proto +++ b/crates/proto/proto/worktree.proto @@ -27,6 +27,7 @@ message Entry { bool is_fifo = 10; optional uint64 size = 11; optional string canonical_path = 12; + bool is_hidden = 13; } message AddWorktree { @@ -98,13 +99,15 @@ message RenameProjectEntry { uint64 project_id = 1; uint64 entry_id = 2; string new_path = 3; + uint64 new_worktree_id = 4; } message CopyProjectEntry { uint64 project_id = 1; uint64 entry_id = 2; string new_path = 3; - optional string relative_worktree_source_path = 4; + uint64 new_worktree_id = 5; + reserved 4; } message DeleteProjectEntry { diff --git a/crates/proto/proto/zed.proto b/crates/proto/proto/zed.proto index b20979081187b3dc7350b08b5c07ae700d86e02e..2c8380661a31f37687ac932771df15e15362c428 100644 --- a/crates/proto/proto/zed.proto +++ b/crates/proto/proto/zed.proto @@ -414,7 +414,11 @@ message Envelope { NewExternalAgentVersionAvailable new_external_agent_version_available = 377; StashDrop stash_drop = 378; - StashApply stash_apply = 379; // current max + StashApply stash_apply = 379; + + GitRenameBranch git_rename_branch = 380; + + RemoteStarted remote_started = 381; // current max } reserved 87 to 88; @@ -488,3 +492,5 @@ message Test { message FlushBufferedMessages {} message FlushBufferedMessagesResponse {} + +message RemoteStarted {} diff --git a/crates/proto/src/proto.rs b/crates/proto/src/proto.rs index 2985fde4d3ff4357628534f0ca3a5daf5476f813..2217cabbba96271bec7306bb48e950aae04ee167 100644 --- a/crates/proto/src/proto.rs +++ b/crates/proto/src/proto.rs @@ -300,6 +300,7 @@ messages!( (AskPassResponse, Background), (GitCreateBranch, Background), (GitChangeBranch, Background), + (GitRenameBranch, Background), (CheckForPushedCommits, Background), (CheckForPushedCommitsResponse, Background), (GitDiff, Background), @@ -323,6 +324,7 @@ messages!( (ExternalAgentsUpdated, Background), (ExternalAgentLoadingStatusUpdated, Background), (NewExternalAgentVersionAvailable, Background), + (RemoteStarted, Background), ); request_messages!( @@ -483,6 +485,7 @@ request_messages!( (AskPassRequest, AskPassResponse), (GitCreateBranch, Ack), (GitChangeBranch, Ack), + (GitRenameBranch, Ack), (CheckForPushedCommits, CheckForPushedCommitsResponse), (GitDiff, GitDiffResponse), (GitInit, Ack), @@ -495,7 +498,8 @@ request_messages!( (GitClone, GitCloneResponse), (ToggleLspLogs, Ack), (GetProcesses, GetProcessesResponse), - (GetAgentServerCommand, AgentServerCommand) + (GetAgentServerCommand, AgentServerCommand), + (RemoteStarted, Ack), ); lsp_messages!( @@ -637,6 +641,7 @@ entity_messages!( Pull, AskPassRequest, GitChangeBranch, + GitRenameBranch, GitCreateBranch, CheckForPushedCommits, GitDiff, @@ -870,24 +875,4 @@ mod tests { }; assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id); } - - #[test] - #[cfg(target_os = "windows")] - fn test_proto() { - use std::path::PathBuf; - - fn generate_proto_path(path: PathBuf) -> PathBuf { - let proto = path.to_proto(); - PathBuf::from_proto(proto) - } - - let path = PathBuf::from("C:\\foo\\bar"); - assert_eq!(path, generate_proto_path(path.clone())); - - let path = PathBuf::from("C:/foo/bar/"); - assert_eq!(path, generate_proto_path(path.clone())); - - let path = PathBuf::from("C:/foo\\bar\\"); - assert_eq!(path, generate_proto_path(path.clone())); - } } diff --git a/crates/proto/src/typed_envelope.rs b/crates/proto/src/typed_envelope.rs index f677a3b96728a574416cbfc1ec97799ac19184fa..a7a8a1c7a2314ad41eaa232cf2256a4bcb398d8d 100644 --- a/crates/proto/src/typed_envelope.rs +++ b/crates/proto/src/typed_envelope.rs @@ -5,8 +5,6 @@ use std::{ any::{Any, TypeId}, cmp, fmt::{self, Debug}, - path::{Path, PathBuf}, - sync::Arc, }; use std::{marker::PhantomData, time::Instant}; @@ -171,57 +169,6 @@ impl fmt::Display for PeerId { } } -pub trait FromProto { - fn from_proto(proto: String) -> Self; -} - -pub trait ToProto { - fn to_proto(self) -> String; -} - -#[inline] -fn from_proto_path(proto: String) -> PathBuf { - #[cfg(target_os = "windows")] - let proto = proto.replace('/', "\\"); - - PathBuf::from(proto) -} - -#[inline] -fn to_proto_path(path: &Path) -> String { - #[cfg(target_os = "windows")] - let proto = path.to_string_lossy().replace('\\', "/"); - - #[cfg(not(target_os = "windows"))] - let proto = path.to_string_lossy().to_string(); - - proto -} - -impl FromProto for PathBuf { - fn from_proto(proto: String) -> Self { - from_proto_path(proto) - } -} - -impl FromProto for Arc { - fn from_proto(proto: String) -> Self { - from_proto_path(proto).into() - } -} - -impl ToProto for PathBuf { - fn to_proto(self) -> String { - to_proto_path(&self) - } -} - -impl ToProto for &Path { - fn to_proto(self) -> String { - to_proto_path(self) - } -} - pub struct Receipt { pub sender_id: PeerId, pub message_id: u32, @@ -261,103 +208,3 @@ impl TypedEnvelope { } } } - -#[cfg(test)] -mod tests { - use typed_path::{UnixPath, UnixPathBuf, WindowsPath, WindowsPathBuf}; - - fn windows_path_from_proto(proto: String) -> WindowsPathBuf { - let proto = proto.replace('/', "\\"); - WindowsPathBuf::from(proto) - } - - fn unix_path_from_proto(proto: String) -> UnixPathBuf { - UnixPathBuf::from(proto) - } - - fn windows_path_to_proto(path: &WindowsPath) -> String { - path.to_string_lossy().replace('\\', "/") - } - - fn unix_path_to_proto(path: &UnixPath) -> String { - path.to_string_lossy().to_string() - } - - #[test] - fn test_path_proto_interop() { - const WINDOWS_PATHS: &[&str] = &[ - "C:\\Users\\User\\Documents\\file.txt", - "C:/Program Files/App/app.exe", - "projects\\zed\\crates\\proto\\src\\typed_envelope.rs", - "projects/my project/src/main.rs", - ]; - const UNIX_PATHS: &[&str] = &[ - "/home/user/documents/file.txt", - "/usr/local/bin/my app/app", - "projects/zed/crates/proto/src/typed_envelope.rs", - "projects/my project/src/main.rs", - ]; - - // Windows path to proto and back - for &windows_path_str in WINDOWS_PATHS { - let windows_path = WindowsPathBuf::from(windows_path_str); - let proto = windows_path_to_proto(&windows_path); - let recovered_path = windows_path_from_proto(proto); - assert_eq!(windows_path, recovered_path); - assert_eq!( - recovered_path.to_string_lossy(), - windows_path_str.replace('/', "\\") - ); - } - // Unix path to proto and back - for &unix_path_str in UNIX_PATHS { - let unix_path = UnixPathBuf::from(unix_path_str); - let proto = unix_path_to_proto(&unix_path); - let recovered_path = unix_path_from_proto(proto); - assert_eq!(unix_path, recovered_path); - assert_eq!(recovered_path.to_string_lossy(), unix_path_str); - } - // Windows host, Unix client, host sends Windows path to client - for &windows_path_str in WINDOWS_PATHS { - let windows_host_path = WindowsPathBuf::from(windows_path_str); - let proto = windows_path_to_proto(&windows_host_path); - let unix_client_received_path = unix_path_from_proto(proto); - let proto = unix_path_to_proto(&unix_client_received_path); - let windows_host_recovered_path = windows_path_from_proto(proto); - assert_eq!(windows_host_path, windows_host_recovered_path); - assert_eq!( - windows_host_recovered_path.to_string_lossy(), - windows_path_str.replace('/', "\\") - ); - } - // Unix host, Windows client, host sends Unix path to client - for &unix_path_str in UNIX_PATHS { - let unix_host_path = UnixPathBuf::from(unix_path_str); - let proto = unix_path_to_proto(&unix_host_path); - let windows_client_received_path = windows_path_from_proto(proto); - let proto = windows_path_to_proto(&windows_client_received_path); - let unix_host_recovered_path = unix_path_from_proto(proto); - assert_eq!(unix_host_path, unix_host_recovered_path); - assert_eq!(unix_host_recovered_path.to_string_lossy(), unix_path_str); - } - } - - // todo(zjk) - #[test] - fn test_unsolved_case() { - // Unix host, Windows client - // The Windows client receives a Unix path with backslashes in it, then - // sends it back to the host. - // This currently fails. - let unix_path = UnixPathBuf::from("/home/user/projects/my\\project/src/main.rs"); - let proto = unix_path_to_proto(&unix_path); - let windows_client_received_path = windows_path_from_proto(proto); - let proto = windows_path_to_proto(&windows_client_received_path); - let unix_host_recovered_path = unix_path_from_proto(proto); - assert_ne!(unix_path, unix_host_recovered_path); - assert_eq!( - unix_host_recovered_path.to_string_lossy(), - "/home/user/projects/my/project/src/main.rs" - ); - } -} diff --git a/crates/recent_projects/Cargo.toml b/crates/recent_projects/Cargo.toml index d48beeaab6bfbe54e3cac6d7f836248cc0ff2f3e..d81ac89e7cdacb96198313b2b8cdea86430dd0b2 100644 --- a/crates/recent_projects/Cargo.toml +++ b/crates/recent_projects/Cargo.toml @@ -14,6 +14,7 @@ doctest = false [dependencies] anyhow.workspace = true +askpass.workspace = true auto_update.workspace = true editor.workspace = true extension_host.workspace = true @@ -31,7 +32,6 @@ picker.workspace = true project.workspace = true release_channel.workspace = true remote.workspace = true -schemars.workspace = true serde.workspace = true settings.workspace = true smol.workspace = true @@ -43,6 +43,10 @@ util.workspace = true workspace.workspace = true zed_actions.workspace = true workspace-hack.workspace = true +indoc.workspace = true + +[target.'cfg(target_os = "windows")'.dependencies] +windows-registry = "0.6.0" [dev-dependencies] dap.workspace = true diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index aa0ce7661b29123c25fdf20cbde5f53e6525d2d6..b97966692f6377d9761b9b689df1471031e0a011 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -3,6 +3,9 @@ mod remote_connections; mod remote_servers; mod ssh_config; +#[cfg(target_os = "windows")] +mod wsl_picker; + use remote::RemoteConnectionOptions; pub use remote_connections::open_remote_project; @@ -31,6 +34,74 @@ use zed_actions::{OpenRecent, OpenRemote}; pub fn init(cx: &mut App) { SshSettings::register(cx); + + #[cfg(target_os = "windows")] + cx.on_action(|open_wsl: &zed_actions::wsl_actions::OpenFolderInWsl, cx| { + let create_new_window = open_wsl.create_new_window; + with_active_or_new_workspace(cx, move |workspace, window, cx| { + use gpui::PathPromptOptions; + use project::DirectoryLister; + + let paths = workspace.prompt_for_open_path( + PathPromptOptions { + files: true, + directories: true, + multiple: false, + prompt: None, + }, + DirectoryLister::Local( + workspace.project().clone(), + workspace.app_state().fs.clone(), + ), + window, + cx, + ); + + cx.spawn_in(window, async move |workspace, cx| { + use util::paths::SanitizedPath; + + let Some(paths) = paths.await.log_err().flatten() else { + return; + }; + + let paths = paths + .into_iter() + .filter_map(|path| SanitizedPath::new(&path).local_to_wsl()) + .collect::>(); + + if paths.is_empty() { + let message = indoc::indoc! { r#" + Invalid path specified when trying to open a folder inside WSL. + + Please note that Zed currently does not support opening network share folders inside wsl. + "#}; + + let _ = cx.prompt(gpui::PromptLevel::Critical, "Invalid path", Some(&message), &["Ok"]).await; + return; + } + + workspace.update_in(cx, |workspace, window, cx| { + workspace.toggle_modal(window, cx, |window, cx| { + crate::wsl_picker::WslOpenModal::new(paths, create_new_window, window, cx) + }); + }).log_err(); + }) + .detach(); + }); + }); + + #[cfg(target_os = "windows")] + cx.on_action(|open_wsl: &zed_actions::wsl_actions::OpenWsl, cx| { + let create_new_window = open_wsl.create_new_window; + with_active_or_new_workspace(cx, move |workspace, window, cx| { + let handle = cx.entity().downgrade(); + let fs = workspace.project().read(cx).fs().clone(); + workspace.toggle_modal(window, cx, |window, cx| { + RemoteServerProjects::wsl(create_new_window, fs, window, handle, cx) + }); + }); + }); + cx.on_action(|open_recent: &OpenRecent, cx| { let create_new_window = open_recent.create_new_window; with_active_or_new_workspace(cx, move |workspace, window, cx| { @@ -257,7 +328,12 @@ impl PickerDelegate for RecentProjectsDelegate { &Default::default(), cx.background_executor().clone(), )); - self.matches.sort_unstable_by_key(|m| m.candidate_id); + self.matches.sort_unstable_by(|a, b| { + b.score + .partial_cmp(&a.score) // Descending score + .unwrap_or(std::cmp::Ordering::Equal) + .then_with(|| a.candidate_id.cmp(&b.candidate_id)) // Ascending candidate_id for ties + }); if self.reset_selected_match_index { self.selected_match_index = self @@ -392,8 +468,7 @@ impl PickerDelegate for RecentProjectsDelegate { .map(|path| { let highlighted_text = highlights_for_path(path.as_ref(), &hit.positions, path_start_offset); - - path_start_offset += highlighted_text.1.char_count; + path_start_offset += highlighted_text.1.text.len(); highlighted_text }) .unzip(); @@ -417,10 +492,13 @@ impl PickerDelegate for RecentProjectsDelegate { SerializedWorkspaceLocation::Local => Icon::new(IconName::Screen) .color(Color::Muted) .into_any_element(), - SerializedWorkspaceLocation::Remote(_) => { - Icon::new(IconName::Server) - .color(Color::Muted) - .into_any_element() + SerializedWorkspaceLocation::Remote(options) => { + Icon::new(match options { + RemoteConnectionOptions::Ssh { .. } => IconName::Server, + RemoteConnectionOptions::Wsl { .. } => IconName::Linux, + }) + .color(Color::Muted) + .into_any_element() } }) }) @@ -516,34 +594,33 @@ fn highlights_for_path( path_start_offset: usize, ) -> (Option, HighlightedMatch) { let path_string = path.to_string_lossy(); - let path_char_count = path_string.chars().count(); + let path_text = path_string.to_string(); + let path_byte_len = path_text.len(); // Get the subset of match highlight positions that line up with the given path. // Also adjusts them to start at the path start let path_positions = match_positions .iter() .copied() .skip_while(|position| *position < path_start_offset) - .take_while(|position| *position < path_start_offset + path_char_count) + .take_while(|position| *position < path_start_offset + path_byte_len) .map(|position| position - path_start_offset) .collect::>(); // Again subset the highlight positions to just those that line up with the file_name // again adjusted to the start of the file_name let file_name_text_and_positions = path.file_name().map(|file_name| { - let text = file_name.to_string_lossy(); - let char_count = text.chars().count(); - let file_name_start = path_char_count - char_count; + let file_name_text = file_name.to_string_lossy().into_owned(); + let file_name_start_byte = path_byte_len - file_name_text.len(); let highlight_positions = path_positions .iter() .copied() - .skip_while(|position| *position < file_name_start) - .take_while(|position| *position < file_name_start + char_count) - .map(|position| position - file_name_start) + .skip_while(|position| *position < file_name_start_byte) + .take_while(|position| *position < file_name_start_byte + file_name_text.len()) + .map(|position| position - file_name_start_byte) .collect::>(); HighlightedMatch { - text: text.to_string(), + text: file_name_text, highlight_positions, - char_count, color: Color::Default, } }); @@ -551,9 +628,8 @@ fn highlights_for_path( ( file_name_text_and_positions, HighlightedMatch { - text: path_string.to_string(), + text: path_text, highlight_positions: path_positions, - char_count: path_char_count, color: Color::Default, }, ) @@ -612,8 +688,8 @@ struct MatchTooltip { } impl Render for MatchTooltip { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - tooltip_container(window, cx, |div, _, _| { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + tooltip_container(cx, |div, _| { self.highlighted_location.render_paths_children(div) }) } @@ -626,7 +702,7 @@ mod tests { use dap::debugger_settings::DebuggerSettings; use editor::Editor; use gpui::{TestAppContext, UpdateGlobal, WindowHandle}; - use project::{Project, project_settings::ProjectSettings}; + use project::Project; use serde_json::json; use settings::SettingsStore; use util::path; @@ -640,8 +716,11 @@ mod tests { cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.session.restore_unsaved_buffers = false + store.update_user_settings(cx, |settings| { + settings + .session + .get_or_insert_default() + .restore_unsaved_buffers = Some(false) }); }); }); diff --git a/crates/recent_projects/src/remote_connections.rs b/crates/recent_projects/src/remote_connections.rs index 3e6810239c80c72d74624bcc243157290fcd93fa..4431c49a2d28ccfc5d799f3646cb9f46714183f1 100644 --- a/crates/recent_projects/src/remote_connections.rs +++ b/crates/recent_projects/src/remote_connections.rs @@ -1,7 +1,7 @@ -use std::collections::BTreeSet; use std::{path::PathBuf, sync::Arc}; use anyhow::{Context as _, Result}; +use askpass::EncryptedPassword; use auto_update::AutoUpdater; use editor::Editor; use extension_host::ExtensionStore; @@ -17,30 +17,31 @@ use markdown::{Markdown, MarkdownElement, MarkdownStyle}; use release_channel::ReleaseChannel; use remote::{ ConnectionIdentifier, RemoteClient, RemoteConnectionOptions, RemotePlatform, - SshConnectionOptions, SshPortForwardOption, + SshConnectionOptions, }; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +pub use settings::SshConnection; +use settings::{ExtendingVec, Settings, WslConnection}; use theme::ThemeSettings; use ui::{ ActiveTheme, Color, CommonAnimationExt, Context, Icon, IconName, IconSize, InteractiveElement, IntoElement, Label, LabelCommon, Styled, Window, prelude::*, }; -use util::serde::default_true; use workspace::{AppState, ModalView, Workspace}; -#[derive(Deserialize)] pub struct SshSettings { - pub ssh_connections: Option>, + pub ssh_connections: ExtendingVec, + pub wsl_connections: ExtendingVec, /// Whether to read ~/.ssh/config for ssh connection sources. - #[serde(default = "default_true")] pub read_ssh_config: bool, } impl SshSettings { pub fn ssh_connections(&self) -> impl Iterator + use<> { - self.ssh_connections.clone().into_iter().flatten() + self.ssh_connections.clone().0.into_iter() + } + + pub fn wsl_connections(&self) -> impl Iterator + use<> { + self.wsl_connections.clone().0.into_iter() } pub fn fill_connection_options_from_settings(&self, options: &mut SshConnectionOptions) { @@ -75,74 +76,50 @@ impl SshSettings { } } -#[derive(Clone, Default, Serialize, Deserialize, PartialEq, JsonSchema)] -pub struct SshConnection { - pub host: SharedString, - #[serde(skip_serializing_if = "Option::is_none")] - pub username: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub port: Option, - #[serde(skip_serializing_if = "Vec::is_empty")] - #[serde(default)] - pub args: Vec, - #[serde(default)] - pub projects: BTreeSet, - /// Name to use for this server in UI. - #[serde(skip_serializing_if = "Option::is_none")] - pub nickname: Option, - // By default Zed will download the binary to the host directly. - // If this is set to true, Zed will download the binary to your local machine, - // and then upload it over the SSH connection. Useful if your SSH server has - // limited outbound internet access. - #[serde(skip_serializing_if = "Option::is_none")] - pub upload_binary_over_ssh: Option, - - #[serde(skip_serializing_if = "Option::is_none")] - pub port_forwards: Option>, +#[derive(Clone, PartialEq)] +pub enum Connection { + Ssh(SshConnection), + Wsl(WslConnection), } -impl From for SshConnectionOptions { - fn from(val: SshConnection) -> Self { - SshConnectionOptions { - host: val.host.into(), - username: val.username, - port: val.port, - password: None, - args: Some(val.args), - nickname: val.nickname, - upload_binary_over_ssh: val.upload_binary_over_ssh.unwrap_or_default(), - port_forwards: val.port_forwards, +impl From for RemoteConnectionOptions { + fn from(val: Connection) -> Self { + match val { + Connection::Ssh(conn) => RemoteConnectionOptions::Ssh(conn.into()), + Connection::Wsl(conn) => RemoteConnectionOptions::Wsl(conn.into()), } } } -#[derive(Clone, Default, Serialize, PartialEq, Eq, PartialOrd, Ord, Deserialize, JsonSchema)] -pub struct SshProject { - pub paths: Vec, +impl From for Connection { + fn from(val: SshConnection) -> Self { + Connection::Ssh(val) + } } -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] -pub struct RemoteSettingsContent { - pub ssh_connections: Option>, - pub read_ssh_config: Option, +impl From for Connection { + fn from(val: WslConnection) -> Self { + Connection::Wsl(val) + } } impl Settings for SshSettings { - type FileContent = RemoteSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let remote = &content.remote; + Self { + ssh_connections: remote.ssh_connections.clone().unwrap_or_default().into(), + wsl_connections: remote.wsl_connections.clone().unwrap_or_default().into(), + read_ssh_config: remote.read_ssh_config.unwrap(), + } } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } pub struct RemoteConnectionPrompt { connection_string: SharedString, nickname: Option, + is_wsl: bool, status_message: Option, - prompt: Option<(Entity, oneshot::Sender)>, + prompt: Option<(Entity, oneshot::Sender)>, cancellation: Option>, editor: Entity, } @@ -165,12 +142,14 @@ impl RemoteConnectionPrompt { pub(crate) fn new( connection_string: String, nickname: Option, + is_wsl: bool, window: &mut Window, cx: &mut Context, ) -> Self { Self { connection_string: connection_string.into(), nickname: nickname.map(|nickname| nickname.into()), + is_wsl, editor: cx.new(|cx| Editor::single_line(window, cx)), status_message: None, cancellation: None, @@ -182,10 +161,10 @@ impl RemoteConnectionPrompt { self.cancellation = Some(tx); } - pub fn set_prompt( + fn set_prompt( &mut self, prompt: String, - tx: oneshot::Sender, + tx: oneshot::Sender, window: &mut Window, cx: &mut Context, ) { @@ -225,8 +204,12 @@ impl RemoteConnectionPrompt { pub fn confirm(&mut self, window: &mut Window, cx: &mut Context) { if let Some((_, tx)) = self.prompt.take() { self.status_message = Some("Connecting".into()); + self.editor.update(cx, |editor, cx| { - tx.send(editor.text(cx)).ok(); + let pw = editor.text(cx); + if let Ok(secure) = EncryptedPassword::try_from(pw.as_ref()) { + tx.send(secure).ok(); + } editor.clear(window, cx); }); } @@ -299,15 +282,16 @@ impl RemoteConnectionModal { window: &mut Window, cx: &mut Context, ) -> Self { - let (connection_string, nickname) = match connection_options { + let (connection_string, nickname, is_wsl) = match connection_options { RemoteConnectionOptions::Ssh(options) => { - (options.connection_string(), options.nickname.clone()) + (options.connection_string(), options.nickname.clone(), false) } - RemoteConnectionOptions::Wsl(options) => (options.distro_name.clone(), None), + RemoteConnectionOptions::Wsl(options) => (options.distro_name.clone(), None, true), }; Self { - prompt: cx - .new(|cx| RemoteConnectionPrompt::new(connection_string, nickname, window, cx)), + prompt: cx.new(|cx| { + RemoteConnectionPrompt::new(connection_string, nickname, is_wsl, window, cx) + }), finished: false, paths, } @@ -338,6 +322,7 @@ pub(crate) struct SshConnectionHeader { pub(crate) connection_string: SharedString, pub(crate) paths: Vec, pub(crate) nickname: Option, + pub(crate) is_wsl: bool, } impl RenderOnce for SshConnectionHeader { @@ -353,6 +338,11 @@ impl RenderOnce for SshConnectionHeader { (self.connection_string, None) }; + let icon = match self.is_wsl { + true => IconName::Linux, + false => IconName::Server, + }; + h_flex() .px(DynamicSpacing::Base12.rems(cx)) .pt(DynamicSpacing::Base08.rems(cx)) @@ -360,7 +350,7 @@ impl RenderOnce for SshConnectionHeader { .rounded_t_sm() .w_full() .gap_1p5() - .child(Icon::new(IconName::Server).size(IconSize::Small)) + .child(Icon::new(icon).size(IconSize::Small)) .child( h_flex() .gap_1() @@ -379,7 +369,7 @@ impl RenderOnce for SshConnectionHeader { ) .child(div().overflow_x_hidden().text_ellipsis().children( self.paths.into_iter().map(|path| { - Label::new(path.to_string_lossy().to_string()) + Label::new(path.to_string_lossy().into_owned()) .size(LabelSize::Small) .color(Color::Muted) }), @@ -392,6 +382,7 @@ impl Render for RemoteConnectionModal { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl ui::IntoElement { let nickname = self.prompt.read(cx).nickname.clone(); let connection_string = self.prompt.read(cx).connection_string.clone(); + let is_wsl = self.prompt.read(cx).is_wsl; let theme = cx.theme().clone(); let body_color = theme.colors().editor_background; @@ -410,6 +401,7 @@ impl Render for RemoteConnectionModal { paths: self.paths.clone(), connection_string, nickname, + is_wsl, } .render(window, cx), ) @@ -451,11 +443,16 @@ impl ModalView for RemoteConnectionModal { pub struct RemoteClientDelegate { window: AnyWindowHandle, ui: WeakEntity, - known_password: Option, + known_password: Option, } impl remote::RemoteClientDelegate for RemoteClientDelegate { - fn ask_password(&self, prompt: String, tx: oneshot::Sender, cx: &mut AsyncApp) { + fn ask_password( + &self, + prompt: String, + tx: oneshot::Sender, + cx: &mut AsyncApp, + ) { let mut known_password = self.known_password.clone(); if let Some(password) = known_password.take() { tx.send(password).ok(); @@ -544,7 +541,10 @@ pub fn connect_over_ssh( cx: &mut App, ) -> Task>>> { let window = window.window_handle(); - let known_password = connection_options.password.clone(); + let known_password = connection_options + .password + .as_deref() + .and_then(|pw| EncryptedPassword::try_from(pw).ok()); let (tx, rx) = oneshot::channel(); ui.update(cx, |ui, _cx| ui.set_cancellation_tx(tx)); @@ -561,6 +561,37 @@ pub fn connect_over_ssh( ) } +pub fn connect( + unique_identifier: ConnectionIdentifier, + connection_options: RemoteConnectionOptions, + ui: Entity, + window: &mut Window, + cx: &mut App, +) -> Task>>> { + let window = window.window_handle(); + let known_password = match &connection_options { + RemoteConnectionOptions::Ssh(ssh_connection_options) => ssh_connection_options + .password + .as_deref() + .and_then(|pw| pw.try_into().ok()), + _ => None, + }; + let (tx, rx) = oneshot::channel(); + ui.update(cx, |ui, _cx| ui.set_cancellation_tx(tx)); + + remote::RemoteClient::new( + unique_identifier, + connection_options, + rx, + Arc::new(RemoteClientDelegate { + window, + ui: ui.downgrade(), + known_password, + }), + cx, + ) +} + pub async fn open_remote_project( connection_options: RemoteConnectionOptions, paths: Vec, @@ -627,7 +658,10 @@ pub async fn open_remote_project( known_password: if let RemoteConnectionOptions::Ssh(options) = &connection_options { - options.password.clone() + options + .password + .as_deref() + .and_then(|pw| EncryptedPassword::try_from(pw).ok()) } else { None }, diff --git a/crates/recent_projects/src/remote_servers.rs b/crates/recent_projects/src/remote_servers.rs index fe0412a989b66d531aa670295b38f2e2d641e3fd..92d6cc957adb3ef927ada906a6201306d893666b 100644 --- a/crates/recent_projects/src/remote_servers.rs +++ b/crates/recent_projects/src/remote_servers.rs @@ -1,7 +1,7 @@ use crate::{ remote_connections::{ - RemoteConnectionModal, RemoteConnectionPrompt, RemoteSettingsContent, SshConnection, - SshConnectionHeader, SshProject, SshSettings, connect_over_ssh, open_remote_project, + Connection, RemoteConnectionModal, RemoteConnectionPrompt, SshConnection, + SshConnectionHeader, SshSettings, connect, connect_over_ssh, open_remote_project, }, ssh_config::parse_ssh_config_hosts, }; @@ -13,14 +13,18 @@ use gpui::{ FocusHandle, Focusable, PromptLevel, ScrollHandle, Subscription, Task, WeakEntity, Window, canvas, }; +use log::info; use paths::{global_ssh_config_file, user_ssh_config_file}; use picker::Picker; use project::{Fs, Project}; use remote::{ - RemoteClient, RemoteConnectionOptions, SshConnectionOptions, + RemoteClient, RemoteConnectionOptions, SshConnectionOptions, WslConnectionOptions, remote_client::ConnectionIdentifier, }; -use settings::{Settings, SettingsStore, update_settings_file, watch_config_file}; +use settings::{ + RemoteSettingsContent, Settings as _, SettingsStore, SshProject, update_settings_file, + watch_config_file, +}; use smol::stream::StreamExt as _; use std::{ borrow::Cow, @@ -79,27 +83,77 @@ impl CreateRemoteServer { } } +#[cfg(target_os = "windows")] +struct AddWslDistro { + picker: Entity>, + connection_prompt: Option>, + _creating: Option>, +} + +#[cfg(target_os = "windows")] +impl AddWslDistro { + fn new(window: &mut Window, cx: &mut Context) -> Self { + use crate::wsl_picker::{WslDistroSelected, WslPickerDelegate, WslPickerDismissed}; + + let delegate = WslPickerDelegate::new(); + let picker = cx.new(|cx| Picker::uniform_list(delegate, window, cx).modal(false)); + + cx.subscribe_in( + &picker, + window, + |this, _, _: &WslDistroSelected, window, cx| { + this.confirm(&menu::Confirm, window, cx); + }, + ) + .detach(); + + cx.subscribe_in( + &picker, + window, + |this, _, _: &WslPickerDismissed, window, cx| { + this.cancel(&menu::Cancel, window, cx); + }, + ) + .detach(); + + AddWslDistro { + picker, + connection_prompt: None, + _creating: None, + } + } +} + +enum ProjectPickerData { + Ssh { + connection_string: SharedString, + nickname: Option, + }, + Wsl { + distro_name: SharedString, + }, +} + struct ProjectPicker { - connection_string: SharedString, - nickname: Option, + data: ProjectPickerData, picker: Entity>, _path_task: Shared>>, } struct EditNicknameState { - index: usize, + index: SshServerIndex, editor: Entity, } impl EditNicknameState { - fn new(index: usize, window: &mut Window, cx: &mut App) -> Self { + fn new(index: SshServerIndex, window: &mut Window, cx: &mut App) -> Self { let this = Self { index, editor: cx.new(|cx| Editor::single_line(window, cx)), }; let starting_text = SshSettings::get_global(cx) .ssh_connections() - .nth(index) + .nth(index.0) .and_then(|state| state.nickname) .filter(|text| !text.is_empty()); this.editor.update(cx, |this, cx| { @@ -122,8 +176,8 @@ impl Focusable for ProjectPicker { impl ProjectPicker { fn new( create_new_window: bool, - ix: usize, - connection: SshConnectionOptions, + index: ServerIndex, + connection: RemoteConnectionOptions, project: Entity, home_dir: RemotePathBuf, path_style: PathStyle, @@ -142,8 +196,16 @@ impl ProjectPicker { picker.set_query(home_dir.to_string(), window, cx); picker }); - let connection_string = connection.connection_string().into(); - let nickname = connection.nickname.clone().map(|nick| nick.into()); + + let data = match &connection { + RemoteConnectionOptions::Ssh(connection) => ProjectPickerData::Ssh { + connection_string: connection.connection_string().into(), + nickname: connection.nickname.clone().map(|nick| nick.into()), + }, + RemoteConnectionOptions::Wsl(connection) => ProjectPickerData::Wsl { + distro_name: connection.distro_name.clone().into(), + }, + }; let _path_task = cx .spawn_in(window, { let workspace = workspace; @@ -173,18 +235,31 @@ impl ProjectPicker { cx.update(|_, cx| { let fs = app_state.fs.clone(); - update_settings_file::(fs, cx, { + update_settings_file(fs, cx, { let paths = paths .iter() - .map(|path| path.to_string_lossy().to_string()) + .map(|path| path.to_string_lossy().into_owned()) .collect(); - move |setting, _| { - if let Some(server) = setting - .ssh_connections - .as_mut() - .and_then(|connections| connections.get_mut(ix)) - { - server.projects.insert(SshProject { paths }); + move |settings, _| match index { + ServerIndex::Ssh(index) => { + if let Some(server) = settings + .remote + .ssh_connections + .as_mut() + .and_then(|connections| connections.get_mut(index.0)) + { + server.projects.insert(SshProject { paths }); + }; + } + ServerIndex::Wsl(index) => { + if let Some(server) = settings + .remote + .wsl_connections + .as_mut() + .and_then(|connections| connections.get_mut(index.0)) + { + server.projects.insert(SshProject { paths }); + }; } } }); @@ -204,12 +279,7 @@ impl ProjectPicker { .log_err()?; open_remote_project_with_existing_connection( - RemoteConnectionOptions::Ssh(connection), - project, - paths, - app_state, - window, - cx, + connection, project, paths, app_state, window, cx, ) .await .log_err(); @@ -225,8 +295,7 @@ impl ProjectPicker { cx.new(|_| Self { _path_task, picker, - connection_string, - nickname, + data, }) } } @@ -234,14 +303,25 @@ impl ProjectPicker { impl gpui::Render for ProjectPicker { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { v_flex() - .child( - SshConnectionHeader { - connection_string: self.connection_string.clone(), + .child(match &self.data { + ProjectPickerData::Ssh { + connection_string, + nickname, + } => SshConnectionHeader { + connection_string: connection_string.clone(), paths: Default::default(), - nickname: self.nickname.clone(), + nickname: nickname.clone(), + is_wsl: false, } .render(window, cx), - ) + ProjectPickerData::Wsl { distro_name } => SshConnectionHeader { + connection_string: distro_name.clone(), + paths: Default::default(), + nickname: None, + is_wsl: true, + } + .render(window, cx), + }) .child( div() .border_t_1() @@ -251,13 +331,48 @@ impl gpui::Render for ProjectPicker { } } +#[repr(transparent)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +struct SshServerIndex(usize); +impl std::fmt::Display for SshServerIndex { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +#[repr(transparent)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +struct WslServerIndex(usize); +impl std::fmt::Display for WslServerIndex { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +enum ServerIndex { + Ssh(SshServerIndex), + Wsl(WslServerIndex), +} +impl From for ServerIndex { + fn from(index: SshServerIndex) -> Self { + Self::Ssh(index) + } +} +impl From for ServerIndex { + fn from(index: WslServerIndex) -> Self { + Self::Wsl(index) + } +} + #[derive(Clone)] enum RemoteEntry { Project { open_folder: NavigableEntry, projects: Vec<(NavigableEntry, SshProject)>, configure: NavigableEntry, - connection: SshConnection, + connection: Connection, + index: ServerIndex, }, SshConfig { open_folder: NavigableEntry, @@ -270,13 +385,16 @@ impl RemoteEntry { matches!(self, Self::Project { .. }) } - fn connection(&self) -> Cow<'_, SshConnection> { + fn connection(&self) -> Cow<'_, Connection> { match self { Self::Project { connection, .. } => Cow::Borrowed(connection), - Self::SshConfig { host, .. } => Cow::Owned(SshConnection { - host: host.clone(), - ..SshConnection::default() - }), + Self::SshConfig { host, .. } => Cow::Owned( + SshConnection { + host: host.clone(), + ..SshConnection::default() + } + .into(), + ), } } } @@ -285,6 +403,7 @@ impl RemoteEntry { struct DefaultState { scroll_handle: ScrollHandle, add_new_server: NavigableEntry, + add_new_wsl: NavigableEntry, servers: Vec, } @@ -292,13 +411,15 @@ impl DefaultState { fn new(ssh_config_servers: &BTreeSet, cx: &mut App) -> Self { let handle = ScrollHandle::new(); let add_new_server = NavigableEntry::new(&handle, cx); + let add_new_wsl = NavigableEntry::new(&handle, cx); let ssh_settings = SshSettings::get_global(cx); let read_ssh_config = ssh_settings.read_ssh_config; - let mut servers: Vec = ssh_settings + let ssh_servers = ssh_settings .ssh_connections() - .map(|connection| { + .enumerate() + .map(|(index, connection)| { let open_folder = NavigableEntry::new(&handle, cx); let configure = NavigableEntry::new(&handle, cx); let projects = connection @@ -310,16 +431,42 @@ impl DefaultState { open_folder, configure, projects, - connection, + index: ServerIndex::Ssh(SshServerIndex(index)), + connection: connection.into(), } - }) - .collect(); + }); + + let wsl_servers = ssh_settings + .wsl_connections() + .enumerate() + .map(|(index, connection)| { + let open_folder = NavigableEntry::new(&handle, cx); + let configure = NavigableEntry::new(&handle, cx); + let projects = connection + .projects + .iter() + .map(|project| (NavigableEntry::new(&handle, cx), project.clone())) + .collect(); + RemoteEntry::Project { + open_folder, + configure, + projects, + index: ServerIndex::Wsl(WslServerIndex(index)), + connection: connection.into(), + } + }); + + let mut servers = ssh_servers.chain(wsl_servers).collect::>(); if read_ssh_config { let mut extra_servers_from_config = ssh_config_servers.clone(); for server in &servers { - if let RemoteEntry::Project { connection, .. } = server { - extra_servers_from_config.remove(&connection.host); + if let RemoteEntry::Project { + connection: Connection::Ssh(ssh_options), + .. + } = server + { + extra_servers_from_config.remove(&SharedString::new(ssh_options.host.clone())); } } servers.extend(extra_servers_from_config.into_iter().map(|host| { @@ -333,23 +480,43 @@ impl DefaultState { Self { scroll_handle: handle, add_new_server, + add_new_wsl, servers, } } } #[derive(Clone)] -struct ViewServerOptionsState { - server_index: usize, - connection: SshConnection, - entries: [NavigableEntry; 4], +enum ViewServerOptionsState { + Ssh { + connection: SshConnectionOptions, + server_index: SshServerIndex, + entries: [NavigableEntry; 4], + }, + Wsl { + connection: WslConnectionOptions, + server_index: WslServerIndex, + entries: [NavigableEntry; 2], + }, +} + +impl ViewServerOptionsState { + fn entries(&self) -> &[NavigableEntry] { + match self { + Self::Ssh { entries, .. } => entries, + Self::Wsl { entries, .. } => entries, + } + } } + enum Mode { Default(DefaultState), ViewServerOptions(ViewServerOptionsState), EditNickname(EditNicknameState), ProjectPicker(Entity), CreateRemoteServer(CreateRemoteServer), + #[cfg(target_os = "windows")] + AddWslDistro(AddWslDistro), } impl Mode { @@ -357,13 +524,50 @@ impl Mode { Self::Default(DefaultState::new(ssh_config_servers, cx)) } } + impl RemoteServerProjects { + #[cfg(target_os = "windows")] + pub fn wsl( + create_new_window: bool, + fs: Arc, + window: &mut Window, + workspace: WeakEntity, + cx: &mut Context, + ) -> Self { + Self::new_inner( + Mode::AddWslDistro(AddWslDistro::new(window, cx)), + create_new_window, + fs, + window, + workspace, + cx, + ) + } + pub fn new( create_new_window: bool, fs: Arc, window: &mut Window, workspace: WeakEntity, cx: &mut Context, + ) -> Self { + Self::new_inner( + Mode::default_mode(&BTreeSet::new(), cx), + create_new_window, + fs, + window, + workspace, + cx, + ) + } + + fn new_inner( + mode: Mode, + create_new_window: bool, + fs: Arc, + window: &mut Window, + workspace: WeakEntity, + cx: &mut Context, ) -> Self { let focus_handle = cx.focus_handle(); let mut read_ssh_config = SshSettings::get_global(cx).read_ssh_config; @@ -394,7 +598,7 @@ impl RemoteServerProjects { }); Self { - mode: Mode::default_mode(&BTreeSet::new(), cx), + mode, focus_handle, workspace, retained_connections: Vec::new(), @@ -405,10 +609,10 @@ impl RemoteServerProjects { } } - pub fn project_picker( + fn project_picker( create_new_window: bool, - ix: usize, - connection_options: remote::SshConnectionOptions, + index: ServerIndex, + connection_options: remote::RemoteConnectionOptions, project: Entity, home_dir: RemotePathBuf, path_style: PathStyle, @@ -420,7 +624,7 @@ impl RemoteServerProjects { let mut this = Self::new(create_new_window, fs, window, workspace.clone(), cx); this.mode = Mode::ProjectPicker(ProjectPicker::new( create_new_window, - ix, + index, connection_options, project, home_dir, @@ -461,6 +665,7 @@ impl RemoteServerProjects { RemoteConnectionPrompt::new( connection_options.connection_string(), connection_options.nickname.clone(), + false, window, cx, ) @@ -480,6 +685,7 @@ impl RemoteServerProjects { match connection.await { Some(Some(client)) => this .update_in(cx, |this, window, cx| { + info!("ssh server created"); telemetry::event!("SSH Server Created"); this.retained_connections.push(client); this.add_ssh_server(connection_options, cx); @@ -517,25 +723,106 @@ impl RemoteServerProjects { }); } + #[cfg(target_os = "windows")] + fn connect_wsl_distro( + &mut self, + picker: Entity>, + distro: String, + window: &mut Window, + cx: &mut Context, + ) { + let connection_options = WslConnectionOptions { + distro_name: distro, + user: None, + }; + + let prompt = cx.new(|cx| { + RemoteConnectionPrompt::new( + connection_options.distro_name.clone(), + None, + true, + window, + cx, + ) + }); + let connection = connect( + ConnectionIdentifier::setup(), + connection_options.clone().into(), + prompt.clone(), + window, + cx, + ) + .prompt_err("Failed to connect", window, cx, |_, _, _| None); + + let wsl_picker = picker.clone(); + let creating = cx.spawn_in(window, async move |this, cx| { + match connection.await { + Some(Some(client)) => this + .update_in(cx, |this, window, cx| { + telemetry::event!("WSL Distro Added"); + this.retained_connections.push(client); + this.add_wsl_distro(connection_options, cx); + this.mode = Mode::default_mode(&BTreeSet::new(), cx); + this.focus_handle(cx).focus(window); + cx.notify() + }) + .log_err(), + _ => this + .update(cx, |this, cx| { + this.mode = Mode::AddWslDistro(AddWslDistro { + picker: wsl_picker, + connection_prompt: None, + _creating: None, + }); + cx.notify() + }) + .log_err(), + }; + () + }); + + self.mode = Mode::AddWslDistro(AddWslDistro { + picker, + connection_prompt: Some(prompt), + _creating: Some(creating), + }); + } + fn view_server_options( &mut self, - (server_index, connection): (usize, SshConnection), + (server_index, connection): (ServerIndex, RemoteConnectionOptions), window: &mut Window, cx: &mut Context, ) { - self.mode = Mode::ViewServerOptions(ViewServerOptionsState { - server_index, - connection, - entries: std::array::from_fn(|_| NavigableEntry::focusable(cx)), + self.mode = Mode::ViewServerOptions(match (server_index, connection) { + (ServerIndex::Ssh(server_index), RemoteConnectionOptions::Ssh(connection)) => { + ViewServerOptionsState::Ssh { + connection, + server_index, + entries: std::array::from_fn(|_| NavigableEntry::focusable(cx)), + } + } + (ServerIndex::Wsl(server_index), RemoteConnectionOptions::Wsl(connection)) => { + ViewServerOptionsState::Wsl { + connection, + server_index, + entries: std::array::from_fn(|_| NavigableEntry::focusable(cx)), + } + } + _ => { + log::error!("server index and connection options mismatch"); + self.mode = Mode::default_mode(&BTreeSet::default(), cx); + return; + } }); self.focus_handle(cx).focus(window); cx.notify(); } - fn create_ssh_project( + fn create_remote_project( &mut self, - ix: usize, - ssh_connection: SshConnection, + index: ServerIndex, + connection_options: RemoteConnectionOptions, window: &mut Window, cx: &mut Context, ) { @@ -544,17 +831,11 @@ impl RemoteServerProjects { }; let create_new_window = self.create_new_window; - let connection_options: SshConnectionOptions = ssh_connection.into(); workspace.update(cx, |_, cx| { cx.defer_in(window, move |workspace, window, cx| { let app_state = workspace.app_state().clone(); workspace.toggle_modal(window, cx, |window, cx| { - RemoteConnectionModal::new( - &RemoteConnectionOptions::Ssh(connection_options.clone()), - Vec::new(), - window, - cx, - ) + RemoteConnectionModal::new(&connection_options, Vec::new(), window, cx) }); let prompt = workspace .active_modal::(cx) @@ -563,7 +844,7 @@ impl RemoteServerProjects { .prompt .clone(); - let connect = connect_over_ssh( + let connect = connect( ConnectionIdentifier::setup(), connection_options.clone(), prompt, @@ -624,7 +905,7 @@ impl RemoteServerProjects { workspace.toggle_modal(window, cx, |window, cx| { RemoteServerProjects::project_picker( create_new_window, - ix, + index, connection_options, project, home_dir, @@ -662,7 +943,7 @@ impl RemoteServerProjects { let index = state.index; self.update_settings_file(cx, move |setting, _| { if let Some(connections) = setting.ssh_connections.as_mut() - && let Some(connection) = connections.get_mut(index) + && let Some(connection) = connections.get_mut(index.0) { connection.nickname = text; } @@ -670,6 +951,12 @@ impl RemoteServerProjects { self.mode = Mode::default_mode(&self.ssh_config_servers, cx); self.focus_handle.focus(window); } + #[cfg(target_os = "windows")] + Mode::AddWslDistro(state) => { + let delegate = &state.picker.read(cx).delegate; + let distro = delegate.selected_distro().unwrap(); + self.connect_wsl_distro(state.picker.clone(), distro, window, cx); + } } } @@ -702,11 +989,19 @@ impl RemoteServerProjects { cx: &mut Context, ) -> impl IntoElement { let connection = ssh_server.connection().into_owned(); - let (main_label, aux_label) = if let Some(nickname) = connection.nickname.clone() { - let aux_label = SharedString::from(format!("({})", connection.host)); - (nickname.into(), Some(aux_label)) - } else { - (connection.host.clone(), None) + + let (main_label, aux_label, is_wsl) = match &connection { + Connection::Ssh(connection) => { + if let Some(nickname) = connection.nickname.clone() { + let aux_label = SharedString::from(format!("({})", connection.host)); + (nickname.into(), Some(aux_label), false) + } else { + (connection.host.clone(), None, false) + } + } + Connection::Wsl(wsl_connection_options) => { + (wsl_connection_options.distro_name.clone(), None, true) + } }; v_flex() .w_full() @@ -720,11 +1015,23 @@ impl RemoteServerProjects { .gap_1() .overflow_hidden() .child( - div().max_w_96().overflow_hidden().text_ellipsis().child( - Label::new(main_label) - .size(LabelSize::Small) - .color(Color::Muted), - ), + h_flex() + .gap_1() + .max_w_96() + .overflow_hidden() + .text_ellipsis() + .when(is_wsl, |this| { + this.child( + Label::new("WSL:") + .size(LabelSize::Small) + .color(Color::Muted), + ) + }) + .child( + Label::new(main_label) + .size(LabelSize::Small) + .color(Color::Muted), + ), ) .children( aux_label.map(|label| { @@ -738,98 +1045,114 @@ impl RemoteServerProjects { projects, configure, connection, - } => List::new() - .empty_message("No projects.") - .children(projects.iter().enumerate().map(|(pix, p)| { - v_flex().gap_0p5().child(self.render_ssh_project( - ix, - ssh_server.clone(), - pix, - p, - window, - cx, - )) - })) - .child( - h_flex() - .id(("new-remote-project-container", ix)) - .track_focus(&open_folder.focus_handle) - .anchor_scroll(open_folder.scroll_anchor.clone()) - .on_action(cx.listener({ - let ssh_connection = connection.clone(); - move |this, _: &menu::Confirm, window, cx| { - this.create_ssh_project(ix, ssh_connection.clone(), window, cx); - } - })) - .child( - ListItem::new(("new-remote-project", ix)) - .toggle_state( - open_folder.focus_handle.contains_focused(window, cx), - ) - .inset(true) - .spacing(ui::ListItemSpacing::Sparse) - .start_slot(Icon::new(IconName::Plus).color(Color::Muted)) - .child(Label::new("Open Folder")) - .on_click(cx.listener({ - let ssh_connection = connection.clone(); - move |this, _, window, cx| { - this.create_ssh_project( - ix, - ssh_connection.clone(), - window, - cx, - ); - } - })), - ), - ) - .child( - h_flex() - .id(("server-options-container", ix)) - .track_focus(&configure.focus_handle) - .anchor_scroll(configure.scroll_anchor.clone()) - .on_action(cx.listener({ - let ssh_connection = connection.clone(); - move |this, _: &menu::Confirm, window, cx| { - this.view_server_options( - (ix, ssh_connection.clone()), - window, - cx, - ); - } - })) - .child( - ListItem::new(("server-options", ix)) - .toggle_state( - configure.focus_handle.contains_focused(window, cx), - ) - .inset(true) - .spacing(ui::ListItemSpacing::Sparse) - .start_slot(Icon::new(IconName::Settings).color(Color::Muted)) - .child(Label::new("View Server Options")) - .on_click(cx.listener({ - let ssh_connection = connection.clone(); - move |this, _, window, cx| { - this.view_server_options( - (ix, ssh_connection.clone()), - window, - cx, - ); - } - })), - ), - ), + index, + } => { + let index = *index; + List::new() + .empty_message("No projects.") + .children(projects.iter().enumerate().map(|(pix, p)| { + v_flex().gap_0p5().child(self.render_ssh_project( + index, + ssh_server.clone(), + pix, + p, + window, + cx, + )) + })) + .child( + h_flex() + .id(("new-remote-project-container", ix)) + .track_focus(&open_folder.focus_handle) + .anchor_scroll(open_folder.scroll_anchor.clone()) + .on_action(cx.listener({ + let connection = connection.clone(); + move |this, _: &menu::Confirm, window, cx| { + this.create_remote_project( + index, + connection.clone().into(), + window, + cx, + ); + } + })) + .child( + ListItem::new(("new-remote-project", ix)) + .toggle_state( + open_folder.focus_handle.contains_focused(window, cx), + ) + .inset(true) + .spacing(ui::ListItemSpacing::Sparse) + .start_slot(Icon::new(IconName::Plus).color(Color::Muted)) + .child(Label::new("Open Folder")) + .on_click(cx.listener({ + let connection = connection.clone(); + move |this, _, window, cx| { + this.create_remote_project( + index, + connection.clone().into(), + window, + cx, + ); + } + })), + ), + ) + .child( + h_flex() + .id(("server-options-container", ix)) + .track_focus(&configure.focus_handle) + .anchor_scroll(configure.scroll_anchor.clone()) + .on_action(cx.listener({ + let connection = connection.clone(); + move |this, _: &menu::Confirm, window, cx| { + this.view_server_options( + (index, connection.clone().into()), + window, + cx, + ); + } + })) + .child( + ListItem::new(("server-options", ix)) + .toggle_state( + configure.focus_handle.contains_focused(window, cx), + ) + .inset(true) + .spacing(ui::ListItemSpacing::Sparse) + .start_slot( + Icon::new(IconName::Settings).color(Color::Muted), + ) + .child(Label::new("View Server Options")) + .on_click(cx.listener({ + let ssh_connection = connection.clone(); + move |this, _, window, cx| { + this.view_server_options( + (index, ssh_connection.clone().into()), + window, + cx, + ); + } + })), + ), + ) + } RemoteEntry::SshConfig { open_folder, host } => List::new().child( h_flex() .id(("new-remote-project-container", ix)) .track_focus(&open_folder.focus_handle) .anchor_scroll(open_folder.scroll_anchor.clone()) .on_action(cx.listener({ - let ssh_connection = connection.clone(); + let connection = connection.clone(); let host = host.clone(); move |this, _: &menu::Confirm, window, cx| { let new_ix = this.create_host_from_ssh_config(&host, cx); - this.create_ssh_project(new_ix, ssh_connection.clone(), window, cx); + this.create_remote_project( + new_ix.into(), + connection.clone().into(), + window, + cx, + ); } })) .child( @@ -840,13 +1163,12 @@ impl RemoteServerProjects { .start_slot(Icon::new(IconName::Plus).color(Color::Muted)) .child(Label::new("Open Folder")) .on_click(cx.listener({ - let ssh_connection = connection; let host = host.clone(); move |this, _, window, cx| { let new_ix = this.create_host_from_ssh_config(&host, cx); - this.create_ssh_project( - new_ix, - ssh_connection.clone(), + this.create_remote_project( + new_ix.into(), + connection.clone().into(), window, cx, ); @@ -859,7 +1181,7 @@ impl RemoteServerProjects { fn render_ssh_project( &mut self, - server_ix: usize, + server_ix: ServerIndex, server: RemoteEntry, ix: usize, (navigation, project): &(NavigableEntry, SshProject), @@ -868,7 +1190,13 @@ impl RemoteServerProjects { ) -> impl IntoElement { let create_new_window = self.create_new_window; let is_from_zed = server.is_from_zed(); - let element_id_base = SharedString::from(format!("remote-project-{server_ix}")); + let element_id_base = SharedString::from(format!( + "remote-project-{}", + match server_ix { + ServerIndex::Ssh(index) => format!("ssh-{index}"), + ServerIndex::Wsl(index) => format!("wsl-{index}"), + } + )); let container_element_id_base = SharedString::from(format!("remote-project-container-{element_id_base}")); @@ -896,7 +1224,7 @@ impl RemoteServerProjects { cx.spawn_in(window, async move |_, cx| { let result = open_remote_project( - RemoteConnectionOptions::Ssh(server.into()), + server.into(), project.paths.into_iter().map(PathBuf::from).collect(), app_state, OpenOptions { @@ -953,24 +1281,30 @@ impl RemoteServerProjects { let secondary_confirm = e.modifiers().platform; callback(this, secondary_confirm, window, cx) })) - .when(is_from_zed, |server_list_item| { - server_list_item.end_hover_slot::(Some( - div() - .mr_2() - .child({ - let project = project.clone(); - // Right-margin to offset it from the Scrollbar - IconButton::new("remove-remote-project", IconName::Trash) - .icon_size(IconSize::Small) - .size(ButtonSize::Large) - .tooltip(Tooltip::text("Delete Remote Project")) - .on_click(cx.listener(move |this, _, _, cx| { - this.delete_ssh_project(server_ix, &project, cx) - })) - }) - .into_any_element(), - )) - }), + .when( + is_from_zed && matches!(server_ix, ServerIndex::Ssh(_)), + |server_list_item| { + let ServerIndex::Ssh(server_ix) = server_ix else { + unreachable!() + }; + server_list_item.end_hover_slot::(Some( + div() + .mr_2() + .child({ + let project = project.clone(); + // Right-margin to offset it from the Scrollbar + IconButton::new("remove-remote-project", IconName::Trash) + .icon_size(IconSize::Small) + .size(ButtonSize::Large) + .tooltip(Tooltip::text("Delete Remote Project")) + .on_click(cx.listener(move |this, _, _, cx| { + this.delete_ssh_project(server_ix, &project, cx) + })) + }) + .into_any_element(), + )) + }, + ), ) } @@ -986,30 +1320,61 @@ impl RemoteServerProjects { else { return; }; - update_settings_file::(fs, cx, move |setting, cx| f(setting, cx)); + update_settings_file(fs, cx, move |setting, cx| f(&mut setting.remote, cx)); } - fn delete_ssh_server(&mut self, server: usize, cx: &mut Context) { + fn delete_ssh_server(&mut self, server: SshServerIndex, cx: &mut Context) { self.update_settings_file(cx, move |setting, _| { if let Some(connections) = setting.ssh_connections.as_mut() { - connections.remove(server); + connections.remove(server.0); } }); } - fn delete_ssh_project(&mut self, server: usize, project: &SshProject, cx: &mut Context) { + fn delete_ssh_project( + &mut self, + server: SshServerIndex, + project: &SshProject, + cx: &mut Context, + ) { let project = project.clone(); self.update_settings_file(cx, move |setting, _| { if let Some(server) = setting .ssh_connections .as_mut() - .and_then(|connections| connections.get_mut(server)) + .and_then(|connections| connections.get_mut(server.0)) { server.projects.remove(&project); } }); } + #[cfg(target_os = "windows")] + fn add_wsl_distro( + &mut self, + connection_options: remote::WslConnectionOptions, + cx: &mut Context, + ) { + self.update_settings_file(cx, move |setting, _| { + setting + .wsl_connections + .get_or_insert(Default::default()) + .push(settings::WslConnection { + distro_name: SharedString::from(connection_options.distro_name), + user: connection_options.user, + projects: BTreeSet::new(), + }) + }); + } + + fn delete_wsl_distro(&mut self, server: WslServerIndex, cx: &mut Context) { + self.update_settings_file(cx, move |setting, _| { + if let Some(connections) = setting.wsl_connections.as_mut() { + connections.remove(server.0); + } + }); + } + fn add_ssh_server( &mut self, connection_options: remote::SshConnectionOptions, @@ -1107,222 +1472,96 @@ impl RemoteServerProjects { ) } + #[cfg(target_os = "windows")] + fn render_add_wsl_distro( + &self, + state: &AddWslDistro, + window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + let connection_prompt = state.connection_prompt.clone(); + + state.picker.update(cx, |picker, cx| { + picker.focus_handle(cx).focus(window); + }); + + v_flex() + .id("add-wsl-distro") + .overflow_hidden() + .size_full() + .flex_1() + .map(|this| { + if let Some(connection_prompt) = connection_prompt { + this.child(connection_prompt) + } else { + this.child(state.picker.clone()) + } + }) + } + fn render_view_options( &mut self, - ViewServerOptionsState { - server_index, - connection, - entries, - }: ViewServerOptionsState, + options: ViewServerOptionsState, window: &mut Window, cx: &mut Context, ) -> impl IntoElement { - let connection_string = connection.host.clone(); + let last_entry = options.entries().last().unwrap(); let mut view = Navigable::new( div() .track_focus(&self.focus_handle(cx)) .size_full() - .child( - SshConnectionHeader { - connection_string: connection_string.clone(), + .child(match &options { + ViewServerOptionsState::Ssh { connection, .. } => SshConnectionHeader { + connection_string: connection.host.clone().into(), paths: Default::default(), nickname: connection.nickname.clone().map(|s| s.into()), + is_wsl: false, } - .render(window, cx), - ) + .render(window, cx) + .into_any_element(), + ViewServerOptionsState::Wsl { connection, .. } => SshConnectionHeader { + connection_string: connection.distro_name.clone().into(), + paths: Default::default(), + nickname: None, + is_wsl: true, + } + .render(window, cx) + .into_any_element(), + }) .child( v_flex() .pb_1() .child(ListSeparator) - .child({ - let label = if connection.nickname.is_some() { - "Edit Nickname" - } else { - "Add Nickname to Server" - }; - div() - .id("ssh-options-add-nickname") - .track_focus(&entries[0].focus_handle) - .on_action(cx.listener( - move |this, _: &menu::Confirm, window, cx| { - this.mode = Mode::EditNickname(EditNicknameState::new( - server_index, - window, - cx, - )); - cx.notify(); - }, - )) - .child( - ListItem::new("add-nickname") - .toggle_state( - entries[0].focus_handle.contains_focused(window, cx), - ) - .inset(true) - .spacing(ui::ListItemSpacing::Sparse) - .start_slot(Icon::new(IconName::Pencil).color(Color::Muted)) - .child(Label::new(label)) - .on_click(cx.listener(move |this, _, window, cx| { - this.mode = Mode::EditNickname(EditNicknameState::new( - server_index, - window, - cx, - )); - cx.notify(); - })), - ) - }) - .child({ - let workspace = self.workspace.clone(); - fn callback( - workspace: WeakEntity, - connection_string: SharedString, - cx: &mut App, - ) { - cx.write_to_clipboard(ClipboardItem::new_string( - connection_string.to_string(), - )); - workspace - .update(cx, |this, cx| { - struct SshServerAddressCopiedToClipboard; - let notification = format!( - "Copied server address ({}) to clipboard", - connection_string - ); - - this.show_toast( - Toast::new( - NotificationId::composite::< - SshServerAddressCopiedToClipboard, - >( - connection_string.clone() - ), - notification, - ) - .autohide(), - cx, - ); - }) - .ok(); - } - div() - .id("ssh-options-copy-server-address") - .track_focus(&entries[1].focus_handle) - .on_action({ - let connection_string = connection_string.clone(); - let workspace = self.workspace.clone(); - move |_: &menu::Confirm, _, cx| { - callback(workspace.clone(), connection_string.clone(), cx); - } - }) - .child( - ListItem::new("copy-server-address") - .toggle_state( - entries[1].focus_handle.contains_focused(window, cx), - ) - .inset(true) - .spacing(ui::ListItemSpacing::Sparse) - .start_slot(Icon::new(IconName::Copy).color(Color::Muted)) - .child(Label::new("Copy Server Address")) - .end_hover_slot( - Label::new(connection_string.clone()) - .color(Color::Muted), - ) - .on_click({ - let connection_string = connection_string.clone(); - move |_, _, cx| { - callback( - workspace.clone(), - connection_string.clone(), - cx, - ); - } - }), - ) - }) - .child({ - fn remove_ssh_server( - remote_servers: Entity, - index: usize, - connection_string: SharedString, - window: &mut Window, - cx: &mut App, - ) { - let prompt_message = - format!("Remove server `{}`?", connection_string); - - let confirmation = window.prompt( - PromptLevel::Warning, - &prompt_message, - None, - &["Yes, remove it", "No, keep it"], - cx, - ); - - cx.spawn(async move |cx| { - if confirmation.await.ok() == Some(0) { - remote_servers - .update(cx, |this, cx| { - this.delete_ssh_server(index, cx); - }) - .ok(); - remote_servers - .update(cx, |this, cx| { - this.mode = Mode::default_mode( - &this.ssh_config_servers, - cx, - ); - cx.notify(); - }) - .ok(); - } - anyhow::Ok(()) - }) - .detach_and_log_err(cx); - } - div() - .id("ssh-options-copy-server-address") - .track_focus(&entries[2].focus_handle) - .on_action(cx.listener({ - let connection_string = connection_string.clone(); - move |_, _: &menu::Confirm, window, cx| { - remove_ssh_server( - cx.entity(), - server_index, - connection_string.clone(), - window, - cx, - ); - cx.focus_self(window); - } - })) - .child( - ListItem::new("remove-server") - .toggle_state( - entries[2].focus_handle.contains_focused(window, cx), - ) - .inset(true) - .spacing(ui::ListItemSpacing::Sparse) - .start_slot(Icon::new(IconName::Trash).color(Color::Error)) - .child(Label::new("Remove Server").color(Color::Error)) - .on_click(cx.listener(move |_, _, window, cx| { - remove_ssh_server( - cx.entity(), - server_index, - connection_string.clone(), - window, - cx, - ); - cx.focus_self(window); - })), - ) + .map(|this| match &options { + ViewServerOptionsState::Ssh { + connection, + entries, + server_index, + } => this.child(self.render_edit_ssh( + connection, + *server_index, + entries, + window, + cx, + )), + ViewServerOptionsState::Wsl { + connection, + entries, + server_index, + } => this.child(self.render_edit_wsl( + connection, + *server_index, + entries, + window, + cx, + )), }) .child(ListSeparator) .child({ div() .id("ssh-options-copy-server-address") - .track_focus(&entries[3].focus_handle) + .track_focus(&last_entry.focus_handle) .on_action(cx.listener(|this, _: &menu::Confirm, window, cx| { this.mode = Mode::default_mode(&this.ssh_config_servers, cx); cx.focus_self(window); @@ -1331,7 +1570,7 @@ impl RemoteServerProjects { .child( ListItem::new("go-back") .toggle_state( - entries[3].focus_handle.contains_focused(window, cx), + last_entry.focus_handle.contains_focused(window, cx), ) .inset(true) .spacing(ui::ListItemSpacing::Sparse) @@ -1350,13 +1589,253 @@ impl RemoteServerProjects { ) .into_any_element(), ); - for entry in entries { - view = view.entry(entry); + + for entry in options.entries() { + view = view.entry(entry.clone()); } view.render(window, cx).into_any_element() } + fn render_edit_wsl( + &self, + connection: &WslConnectionOptions, + index: WslServerIndex, + entries: &[NavigableEntry], + window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + let distro_name = SharedString::new(connection.distro_name.clone()); + + v_flex().child({ + fn remove_wsl_distro( + remote_servers: Entity, + index: WslServerIndex, + distro_name: SharedString, + window: &mut Window, + cx: &mut App, + ) { + let prompt_message = format!("Remove WSL distro `{}`?", distro_name); + + let confirmation = window.prompt( + PromptLevel::Warning, + &prompt_message, + None, + &["Yes, remove it", "No, keep it"], + cx, + ); + + cx.spawn(async move |cx| { + if confirmation.await.ok() == Some(0) { + remote_servers + .update(cx, |this, cx| { + this.delete_wsl_distro(index, cx); + }) + .ok(); + remote_servers + .update(cx, |this, cx| { + this.mode = Mode::default_mode(&this.ssh_config_servers, cx); + cx.notify(); + }) + .ok(); + } + anyhow::Ok(()) + }) + .detach_and_log_err(cx); + } + div() + .id("wsl-options-remove-distro") + .track_focus(&entries[0].focus_handle) + .on_action(cx.listener({ + let distro_name = distro_name.clone(); + move |_, _: &menu::Confirm, window, cx| { + remove_wsl_distro(cx.entity(), index, distro_name.clone(), window, cx); + cx.focus_self(window); + } + })) + .child( + ListItem::new("remove-distro") + .toggle_state(entries[0].focus_handle.contains_focused(window, cx)) + .inset(true) + .spacing(ui::ListItemSpacing::Sparse) + .start_slot(Icon::new(IconName::Trash).color(Color::Error)) + .child(Label::new("Remove Distro").color(Color::Error)) + .on_click(cx.listener(move |_, _, window, cx| { + remove_wsl_distro(cx.entity(), index, distro_name.clone(), window, cx); + cx.focus_self(window); + })), + ) + }) + } + + fn render_edit_ssh( + &self, + connection: &SshConnectionOptions, + index: SshServerIndex, + entries: &[NavigableEntry], + window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + let connection_string = SharedString::new(connection.host.clone()); + + v_flex() + .child({ + let label = if connection.nickname.is_some() { + "Edit Nickname" + } else { + "Add Nickname to Server" + }; + div() + .id("ssh-options-add-nickname") + .track_focus(&entries[0].focus_handle) + .on_action(cx.listener(move |this, _: &menu::Confirm, window, cx| { + this.mode = Mode::EditNickname(EditNicknameState::new(index, window, cx)); + cx.notify(); + })) + .child( + ListItem::new("add-nickname") + .toggle_state(entries[0].focus_handle.contains_focused(window, cx)) + .inset(true) + .spacing(ui::ListItemSpacing::Sparse) + .start_slot(Icon::new(IconName::Pencil).color(Color::Muted)) + .child(Label::new(label)) + .on_click(cx.listener(move |this, _, window, cx| { + this.mode = + Mode::EditNickname(EditNicknameState::new(index, window, cx)); + cx.notify(); + })), + ) + }) + .child({ + let workspace = self.workspace.clone(); + fn callback( + workspace: WeakEntity, + connection_string: SharedString, + cx: &mut App, + ) { + cx.write_to_clipboard(ClipboardItem::new_string(connection_string.to_string())); + workspace + .update(cx, |this, cx| { + struct SshServerAddressCopiedToClipboard; + let notification = format!( + "Copied server address ({}) to clipboard", + connection_string + ); + + this.show_toast( + Toast::new( + NotificationId::composite::( + connection_string.clone(), + ), + notification, + ) + .autohide(), + cx, + ); + }) + .ok(); + } + div() + .id("ssh-options-copy-server-address") + .track_focus(&entries[1].focus_handle) + .on_action({ + let connection_string = connection_string.clone(); + let workspace = self.workspace.clone(); + move |_: &menu::Confirm, _, cx| { + callback(workspace.clone(), connection_string.clone(), cx); + } + }) + .child( + ListItem::new("copy-server-address") + .toggle_state(entries[1].focus_handle.contains_focused(window, cx)) + .inset(true) + .spacing(ui::ListItemSpacing::Sparse) + .start_slot(Icon::new(IconName::Copy).color(Color::Muted)) + .child(Label::new("Copy Server Address")) + .end_hover_slot( + Label::new(connection_string.clone()).color(Color::Muted), + ) + .on_click({ + let connection_string = connection_string.clone(); + move |_, _, cx| { + callback(workspace.clone(), connection_string.clone(), cx); + } + }), + ) + }) + .child({ + fn remove_ssh_server( + remote_servers: Entity, + index: SshServerIndex, + connection_string: SharedString, + window: &mut Window, + cx: &mut App, + ) { + let prompt_message = format!("Remove server `{}`?", connection_string); + + let confirmation = window.prompt( + PromptLevel::Warning, + &prompt_message, + None, + &["Yes, remove it", "No, keep it"], + cx, + ); + + cx.spawn(async move |cx| { + if confirmation.await.ok() == Some(0) { + remote_servers + .update(cx, |this, cx| { + this.delete_ssh_server(index, cx); + }) + .ok(); + remote_servers + .update(cx, |this, cx| { + this.mode = Mode::default_mode(&this.ssh_config_servers, cx); + cx.notify(); + }) + .ok(); + } + anyhow::Ok(()) + }) + .detach_and_log_err(cx); + } + div() + .id("ssh-options-copy-server-address") + .track_focus(&entries[2].focus_handle) + .on_action(cx.listener({ + let connection_string = connection_string.clone(); + move |_, _: &menu::Confirm, window, cx| { + remove_ssh_server( + cx.entity(), + index, + connection_string.clone(), + window, + cx, + ); + cx.focus_self(window); + } + })) + .child( + ListItem::new("remove-server") + .toggle_state(entries[2].focus_handle.contains_focused(window, cx)) + .inset(true) + .spacing(ui::ListItemSpacing::Sparse) + .start_slot(Icon::new(IconName::Trash).color(Color::Error)) + .child(Label::new("Remove Server").color(Color::Error)) + .on_click(cx.listener(move |_, _, window, cx| { + remove_ssh_server( + cx.entity(), + index, + connection_string.clone(), + window, + cx, + ); + cx.focus_self(window); + })), + ) + }) + } + fn render_edit_nickname( &self, state: &EditNicknameState, @@ -1365,7 +1844,7 @@ impl RemoteServerProjects { ) -> impl IntoElement { let Some(connection) = SshSettings::get_global(cx) .ssh_connections() - .nth(state.index) + .nth(state.index.0) else { return v_flex() .id("ssh-edit-nickname") @@ -1383,6 +1862,7 @@ impl RemoteServerProjects { connection_string, paths: Default::default(), nickname, + is_wsl: false, } .render(window, cx), ) @@ -1404,20 +1884,29 @@ impl RemoteServerProjects { let ssh_settings = SshSettings::get_global(cx); let mut should_rebuild = false; - if ssh_settings - .ssh_connections - .as_ref() - .is_some_and(|connections| { - state - .servers - .iter() - .filter_map(|server| match server { - RemoteEntry::Project { connection, .. } => Some(connection), - RemoteEntry::SshConfig { .. } => None, - }) - .ne(connections.iter()) - }) - { + let ssh_connections_changed = ssh_settings.ssh_connections.0.iter().ne(state + .servers + .iter() + .filter_map(|server| match server { + RemoteEntry::Project { + connection: Connection::Ssh(connection), + .. + } => Some(connection), + _ => None, + })); + + let wsl_connections_changed = ssh_settings.wsl_connections.0.iter().ne(state + .servers + .iter() + .filter_map(|server| match server { + RemoteEntry::Project { + connection: Connection::Wsl(connection), + .. + } => Some(connection), + _ => None, + })); + + if ssh_connections_changed || wsl_connections_changed { should_rebuild = true; }; @@ -1432,7 +1921,11 @@ impl RemoteServerProjects { .collect(); let mut expected_ssh_hosts = self.ssh_config_servers.clone(); for server in &state.servers { - if let RemoteEntry::Project { connection, .. } = server { + if let RemoteEntry::Project { + connection: Connection::Ssh(connection), + .. + } = server + { expected_ssh_hosts.remove(&connection.host); } } @@ -1476,14 +1969,47 @@ impl RemoteServerProjects { cx.notify(); })); + #[cfg(target_os = "windows")] + let wsl_connect_button = div() + .id("wsl-connect-new-server") + .track_focus(&state.add_new_wsl.focus_handle) + .anchor_scroll(state.add_new_wsl.scroll_anchor.clone()) + .child( + ListItem::new("wsl-add-new-server") + .toggle_state(state.add_new_wsl.focus_handle.contains_focused(window, cx)) + .inset(true) + .spacing(ui::ListItemSpacing::Sparse) + .start_slot(Icon::new(IconName::Plus).color(Color::Muted)) + .child(Label::new("Add WSL Distro")) + .on_click(cx.listener(|this, _, window, cx| { + let state = AddWslDistro::new(window, cx); + this.mode = Mode::AddWslDistro(state); + + cx.notify(); + })), + ) + .on_action(cx.listener(|this, _: &menu::Confirm, window, cx| { + let state = AddWslDistro::new(window, cx); + this.mode = Mode::AddWslDistro(state); + + cx.notify(); + })); + + let modal_section = v_flex() + .track_focus(&self.focus_handle(cx)) + .id("ssh-server-list") + .overflow_y_scroll() + .track_scroll(&state.scroll_handle) + .size_full() + .child(connect_button); + + #[cfg(target_os = "windows")] + let modal_section = modal_section.child(wsl_connect_button); + #[cfg(not(target_os = "windows"))] + let modal_section = modal_section; + let mut modal_section = Navigable::new( - v_flex() - .track_focus(&self.focus_handle(cx)) - .id("ssh-server-list") - .overflow_y_scroll() - .track_scroll(&state.scroll_handle) - .size_full() - .child(connect_button) + modal_section .child( List::new() .empty_message( @@ -1505,6 +2031,10 @@ impl RemoteServerProjects { ) .entry(state.add_new_server.clone()); + if cfg!(target_os = "windows") { + modal_section = modal_section.entry(state.add_new_wsl.clone()); + } + for server in &state.servers { match server { RemoteEntry::Project { @@ -1586,7 +2116,7 @@ impl RemoteServerProjects { &mut self, ssh_config_host: &SharedString, cx: &mut Context<'_, Self>, - ) -> usize { + ) -> SshServerIndex { let new_ix = Arc::new(AtomicUsize::new(0)); let update_new_ix = new_ix.clone(); @@ -1608,7 +2138,7 @@ impl RemoteServerProjects { cx, ); self.mode = Mode::default_mode(&self.ssh_config_servers, cx); - new_ix.load(atomic::Ordering::Acquire) + SshServerIndex(new_ix.load(atomic::Ordering::Acquire)) } } @@ -1718,6 +2248,10 @@ impl Render for RemoteServerProjects { Mode::EditNickname(state) => self .render_edit_nickname(state, window, cx) .into_any_element(), + #[cfg(target_os = "windows")] + Mode::AddWslDistro(state) => self + .render_add_wsl_distro(state, window, cx) + .into_any_element(), }) } } diff --git a/crates/recent_projects/src/wsl_picker.rs b/crates/recent_projects/src/wsl_picker.rs new file mode 100644 index 0000000000000000000000000000000000000000..e386b723fa43777e496565c11b8308f16031d837 --- /dev/null +++ b/crates/recent_projects/src/wsl_picker.rs @@ -0,0 +1,295 @@ +use std::{path::PathBuf, sync::Arc}; + +use gpui::{AppContext, DismissEvent, Entity, EventEmitter, Focusable, Subscription, Task}; +use picker::Picker; +use remote::{RemoteConnectionOptions, WslConnectionOptions}; +use ui::{ + App, Context, HighlightedLabel, Icon, IconName, InteractiveElement, ListItem, ParentElement, + Render, Styled, StyledExt, Toggleable, Window, div, h_flex, rems, v_flex, +}; +use util::ResultExt as _; +use workspace::{ModalView, Workspace}; + +use crate::open_remote_project; + +#[derive(Clone, Debug)] +pub struct WslDistroSelected { + pub secondary: bool, + pub distro: String, +} + +#[derive(Clone, Debug)] +pub struct WslPickerDismissed; + +pub(crate) struct WslPickerDelegate { + selected_index: usize, + distro_list: Option>, + matches: Vec, +} + +impl WslPickerDelegate { + pub fn new() -> Self { + WslPickerDelegate { + selected_index: 0, + distro_list: None, + matches: Vec::new(), + } + } + + pub fn selected_distro(&self) -> Option { + self.matches + .get(self.selected_index) + .map(|m| m.string.clone()) + } +} + +impl WslPickerDelegate { + fn fetch_distros() -> anyhow::Result> { + use anyhow::Context; + use windows_registry::CURRENT_USER; + + let lxss_key = CURRENT_USER + .open("Software\\Microsoft\\Windows\\CurrentVersion\\Lxss") + .context("failed to get lxss wsl key")?; + + let distros = lxss_key + .keys() + .context("failed to get wsl distros")? + .filter_map(|key| { + lxss_key + .open(&key) + .context("failed to open subkey for distro") + .log_err() + }) + .filter_map(|distro| distro.get_string("DistributionName").ok()) + .collect::>(); + + Ok(distros) + } +} + +impl EventEmitter for Picker {} + +impl EventEmitter for Picker {} + +impl picker::PickerDelegate for WslPickerDelegate { + type ListItem = ListItem; + + fn match_count(&self) -> usize { + self.matches.len() + } + + fn selected_index(&self) -> usize { + self.selected_index + } + + fn set_selected_index( + &mut self, + ix: usize, + _window: &mut Window, + cx: &mut Context>, + ) { + self.selected_index = ix; + cx.notify(); + } + + fn placeholder_text(&self, _window: &mut Window, _cx: &mut App) -> Arc { + Arc::from("Enter WSL distro name") + } + + fn update_matches( + &mut self, + query: String, + _window: &mut Window, + cx: &mut Context>, + ) -> Task<()> { + use fuzzy::StringMatchCandidate; + + let needs_fetch = self.distro_list.is_none(); + if needs_fetch { + let distros = Self::fetch_distros().log_err(); + self.distro_list = distros; + } + + if let Some(distro_list) = &self.distro_list { + use ordered_float::OrderedFloat; + + let candidates = distro_list + .iter() + .enumerate() + .map(|(id, distro)| StringMatchCandidate::new(id, distro)) + .collect::>(); + + let query = query.trim_start(); + let smart_case = query.chars().any(|c| c.is_uppercase()); + self.matches = smol::block_on(fuzzy::match_strings( + candidates.as_slice(), + query, + smart_case, + true, + 100, + &Default::default(), + cx.background_executor().clone(), + )); + self.matches.sort_unstable_by_key(|m| m.candidate_id); + + self.selected_index = self + .matches + .iter() + .enumerate() + .rev() + .max_by_key(|(_, m)| OrderedFloat(m.score)) + .map(|(index, _)| index) + .unwrap_or(0); + } + + Task::ready(()) + } + + fn confirm(&mut self, secondary: bool, _window: &mut Window, cx: &mut Context>) { + if let Some(distro) = self.matches.get(self.selected_index) { + cx.emit(WslDistroSelected { + secondary, + distro: distro.string.clone(), + }); + } + } + + fn dismissed(&mut self, _window: &mut Window, cx: &mut Context>) { + cx.emit(WslPickerDismissed); + } + + fn render_match( + &self, + ix: usize, + selected: bool, + _: &mut Window, + _: &mut Context>, + ) -> Option { + let matched = self.matches.get(ix)?; + Some( + ListItem::new(ix) + .toggle_state(selected) + .inset(true) + .spacing(ui::ListItemSpacing::Sparse) + .child( + h_flex() + .flex_grow() + .gap_3() + .child(Icon::new(IconName::Linux)) + .child(v_flex().child(HighlightedLabel::new( + matched.string.clone(), + matched.positions.clone(), + ))), + ), + ) + } +} + +pub(crate) struct WslOpenModal { + paths: Vec, + create_new_window: bool, + picker: Entity>, + _subscriptions: [Subscription; 2], +} + +impl WslOpenModal { + pub fn new( + paths: Vec, + create_new_window: bool, + window: &mut Window, + cx: &mut Context, + ) -> Self { + let delegate = WslPickerDelegate::new(); + let picker = cx.new(|cx| Picker::uniform_list(delegate, window, cx).modal(false)); + + let selected = cx.subscribe_in( + &picker, + window, + |this, _, event: &WslDistroSelected, window, cx| { + this.confirm(&event.distro, event.secondary, window, cx); + }, + ); + + let dismissed = cx.subscribe_in( + &picker, + window, + |this, _, _: &WslPickerDismissed, window, cx| { + this.cancel(&menu::Cancel, window, cx); + }, + ); + + WslOpenModal { + paths, + create_new_window, + picker, + _subscriptions: [selected, dismissed], + } + } + + fn confirm( + &mut self, + distro: &str, + secondary: bool, + window: &mut Window, + cx: &mut Context, + ) { + let app_state = workspace::AppState::global(cx); + let Some(app_state) = app_state.upgrade() else { + return; + }; + + let connection_options = RemoteConnectionOptions::Wsl(WslConnectionOptions { + distro_name: distro.to_string(), + user: None, + }); + + let replace_current_window = match self.create_new_window { + true => secondary, + false => !secondary, + }; + let replace_window = match replace_current_window { + true => window.window_handle().downcast::(), + false => None, + }; + + let paths = self.paths.clone(); + let open_options = workspace::OpenOptions { + replace_window, + ..Default::default() + }; + + cx.emit(DismissEvent); + cx.spawn_in(window, async move |_, cx| { + open_remote_project(connection_options, paths, app_state, open_options, cx).await + }) + .detach(); + } + + fn cancel(&mut self, _: &menu::Cancel, _: &mut Window, cx: &mut Context) { + cx.emit(DismissEvent); + } +} + +impl ModalView for WslOpenModal {} + +impl Focusable for WslOpenModal { + fn focus_handle(&self, cx: &App) -> gpui::FocusHandle { + self.picker.focus_handle(cx) + } +} + +impl EventEmitter for WslOpenModal {} + +impl Render for WslOpenModal { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl ui::IntoElement { + div() + .on_mouse_down_out(cx.listener(|_, _, _, cx| cx.emit(DismissEvent))) + .on_action(cx.listener(Self::cancel)) + .elevation_3(cx) + .w(rems(34.)) + .flex_1() + .overflow_hidden() + .child(self.picker.clone()) + } +} diff --git a/crates/refineable/Cargo.toml b/crates/refineable/Cargo.toml index 88348c6edc5b1d5937ad2efb2a1eb848f5c60ddf..76ed82548d1bfc8cda3976a09f5f0e424b1857b0 100644 --- a/crates/refineable/Cargo.toml +++ b/crates/refineable/Cargo.toml @@ -1,9 +1,10 @@ [package] -name = "refineable" +name = "zed-refineable" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "A macro for creating 'refinement' types that can be used to partially initialize or mutate a complex struct" [lints] workspace = true @@ -13,5 +14,5 @@ path = "src/refineable.rs" doctest = false [dependencies] -derive_refineable = { path = "./derive_refineable" } +derive_refineable.workspace = true workspace-hack.workspace = true diff --git a/crates/refineable/derive_refineable/Cargo.toml b/crates/refineable/derive_refineable/Cargo.toml index 2afc8cd1afc066349008ad690e64de491657e310..42b9ef9ca69deef406c3f64229a9f392d064d33c 100644 --- a/crates/refineable/derive_refineable/Cargo.toml +++ b/crates/refineable/derive_refineable/Cargo.toml @@ -1,9 +1,11 @@ [package] -name = "derive_refineable" +name = "zed-derive-refineable" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "A derive macro for creating refinement types in Rust" + [lints] workspace = true diff --git a/crates/refineable/src/refineable.rs b/crates/refineable/src/refineable.rs index 930f80dbefada3ee15b9c6a1ca2fabed78b21034..d2a7c3d3f2148ae174be10121dc23b4dbfc5a650 100644 --- a/crates/refineable/src/refineable.rs +++ b/crates/refineable/src/refineable.rs @@ -17,47 +17,6 @@ pub use derive_refineable::Refineable; /// - **Optional fields** (`Option`): Remain as `Option` /// - **Regular fields**: Become `Option` /// -/// ## Example -/// -/// ``` -/// use derive_refineable::Refineable as _; -/// use refineable::Refineable; -/// -/// #[derive(Refineable, Clone, Default)] -/// struct Example { -/// color: String, -/// font_size: Option, -/// #[refineable] -/// margin: Margin, -/// } -/// -/// #[derive(Refineable, Clone, Default)] -/// struct Margin { -/// top: u32, -/// left: u32, -/// } -/// -/// -/// fn example() { -/// let mut base_style = Example::default(); -/// let refinement = ExampleRefinement { -/// color: Some("red".to_string()), -/// font_size: None, -/// margin: MarginRefinement { -/// top: Some(10), -/// left: None, -/// }, -/// }; -/// -/// base_style.refine(&refinement); -/// } -/// ``` -/// -/// This generates `ExampleRefinement` with: -/// - `color: Option` -/// - `font_size: Option` (unchanged) -/// - `margin: MarginRefinement` -/// /// ## Attributes /// /// The derive macro supports these attributes on the struct: diff --git a/crates/remote/Cargo.toml b/crates/remote/Cargo.toml index 5985bcae827c42f4ae535b1dd859e436167e3fe5..0b2bf4e2fccef3ed1ccd175eda8bde13b179f696 100644 --- a/crates/remote/Cargo.toml +++ b/crates/remote/Cargo.toml @@ -25,16 +25,15 @@ collections.workspace = true fs.workspace = true futures.workspace = true gpui.workspace = true -itertools.workspace = true log.workspace = true parking_lot.workspace = true paths.workspace = true prost.workspace = true release_channel.workspace = true rpc = { workspace = true, features = ["gpui"] } -schemars.workspace = true serde.workspace = true serde_json.workspace = true +settings.workspace = true shlex.workspace = true smol.workspace = true tempfile.workspace = true @@ -44,6 +43,7 @@ util.workspace = true which.workspace = true workspace-hack.workspace = true + [dev-dependencies] gpui = { workspace = true, features = ["test-support"] } fs = { workspace = true, features = ["test-support"] } diff --git a/crates/remote/src/remote_client.rs b/crates/remote/src/remote_client.rs index 501c6a8dd639630b1930cb32e804f8cca658a9ca..e2f51c8e2ba59d02a4d6ac8e4bdbea2e443a4590 100644 --- a/crates/remote/src/remote_client.rs +++ b/crates/remote/src/remote_client.rs @@ -8,6 +8,7 @@ use crate::{ }, }; use anyhow::{Context as _, Result, anyhow}; +use askpass::EncryptedPassword; use async_trait::async_trait; use collections::HashMap; use futures::{ @@ -21,7 +22,7 @@ use futures::{ }; use gpui::{ App, AppContext as _, AsyncApp, BackgroundExecutor, BorrowAppContext, Context, Entity, - EventEmitter, Global, SemanticVersion, Task, WeakEntity, + EventEmitter, FutureExt, Global, SemanticVersion, Task, WeakEntity, }; use parking_lot::Mutex; @@ -60,7 +61,12 @@ pub struct CommandTemplate { } pub trait RemoteClientDelegate: Send + Sync { - fn ask_password(&self, prompt: String, tx: oneshot::Sender, cx: &mut AsyncApp); + fn ask_password( + &self, + prompt: String, + tx: oneshot::Sender, + cx: &mut AsyncApp, + ); fn get_download_params( &self, platform: RemotePlatform, @@ -350,8 +356,43 @@ impl RemoteClient { cx, ); + let ready = client + .wait_for_remote_started() + .with_timeout(HEARTBEAT_TIMEOUT, cx.background_executor()) + .await; + match ready { + Ok(Some(_)) => {} + Ok(None) => { + let mut error = "remote client exited before becoming ready".to_owned(); + if let Some(status) = io_task.now_or_never() { + match status { + Ok(exit_code) => { + error.push_str(&format!(", exit_code={exit_code:?}")) + } + Err(e) => error.push_str(&format!(", error={e:?}")), + } + } + let error = anyhow::anyhow!("{error}"); + log::error!("failed to establish connection: {}", error); + return Err(error); + } + Err(_) => { + let mut error = + "remote client did not become ready within the timeout".to_owned(); + if let Some(status) = io_task.now_or_never() { + match status { + Ok(exit_code) => { + error.push_str(&format!(", exit_code={exit_code:?}")) + } + Err(e) => error.push_str(&format!(", error={e:?}")), + } + } + let error = anyhow::anyhow!("{error}"); + log::error!("failed to establish connection: {}", error); + return Err(error); + } + } let multiplex_task = Self::monitor(this.downgrade(), io_task, cx); - if let Err(error) = client.ping(HEARTBEAT_TIMEOUT).await { log::error!("failed to establish connection: {}", error); return Err(error); @@ -769,13 +810,15 @@ impl RemoteClient { } pub fn shell(&self) -> Option { - Some(self.state.as_ref()?.remote_connection()?.shell()) + Some(self.remote_connection()?.shell()) + } + + pub fn default_system_shell(&self) -> Option { + Some(self.remote_connection()?.default_system_shell()) } pub fn shares_network_interface(&self) -> bool { - self.state - .as_ref() - .and_then(|state| state.remote_connection()) + self.remote_connection() .map_or(false, |connection| connection.shares_network_interface()) } @@ -787,27 +830,31 @@ impl RemoteClient { working_dir: Option, port_forward: Option<(u16, String, u16)>, ) -> Result { - let Some(connection) = self - .state - .as_ref() - .and_then(|state| state.remote_connection()) - else { - return Err(anyhow!("no connection")); + let Some(connection) = self.remote_connection() else { + return Err(anyhow!("no ssh connection")); }; connection.build_command(program, args, env, working_dir, port_forward) } + pub fn build_forward_port_command( + &self, + local_port: u16, + host: String, + remote_port: u16, + ) -> Result { + let Some(connection) = self.remote_connection() else { + return Err(anyhow!("no ssh connection")); + }; + connection.build_forward_port_command(local_port, host, remote_port) + } + pub fn upload_directory( &self, src_path: PathBuf, dest_path: RemotePathBuf, cx: &App, ) -> Task> { - let Some(connection) = self - .state - .as_ref() - .and_then(|state| state.remote_connection()) - else { + let Some(connection) = self.remote_connection() else { return Task::ready(Err(anyhow!("no ssh connection"))); }; connection.upload_directory(src_path, dest_path, cx) @@ -916,6 +963,12 @@ impl RemoteClient { .unwrap() .unwrap() } + + fn remote_connection(&self) -> Option> { + self.state + .as_ref() + .and_then(|state| state.remote_connection()) + } } enum ConnectionPoolEntry { @@ -1063,9 +1116,16 @@ pub(crate) trait RemoteConnection: Send + Sync { working_dir: Option, port_forward: Option<(u16, String, u16)>, ) -> Result; + fn build_forward_port_command( + &self, + local_port: u16, + remote: String, + remote_port: u16, + ) -> Result; fn connection_options(&self) -> RemoteConnectionOptions; fn path_style(&self) -> PathStyle; fn shell(&self) -> String; + fn default_system_shell(&self) -> String; #[cfg(any(test, feature = "test-support"))] fn simulate_disconnect(&self, _: &AsyncApp) {} @@ -1073,6 +1133,37 @@ pub(crate) trait RemoteConnection: Send + Sync { type ResponseChannels = Mutex)>>>; +struct Signal { + tx: Mutex>>, + rx: Shared>>, +} + +impl Signal { + pub fn new(cx: &App) -> Self { + let (tx, rx) = oneshot::channel(); + + let task = cx + .background_executor() + .spawn(async move { rx.await.ok() }) + .shared(); + + Self { + tx: Mutex::new(Some(tx)), + rx: task, + } + } + + fn set(&self, value: T) { + if let Some(tx) = self.tx.lock().take() { + let _ = tx.send(value); + } + } + + fn wait(&self) -> Shared>> { + self.rx.clone() + } +} + struct ChannelClient { next_message_id: AtomicU32, outgoing_tx: Mutex>, @@ -1082,6 +1173,7 @@ struct ChannelClient { max_received: AtomicU32, name: &'static str, task: Mutex>>, + remote_started: Signal<()>, } impl ChannelClient { @@ -1104,15 +1196,25 @@ impl ChannelClient { incoming_rx, &cx.to_async(), )), + remote_started: Signal::new(cx), }) } + fn wait_for_remote_started(&self) -> Shared>> { + self.remote_started.wait() + } + fn start_handling_messages( this: Weak, mut incoming_rx: mpsc::UnboundedReceiver, cx: &AsyncApp, ) -> Task> { cx.spawn(async move |cx| { + if let Some(this) = this.upgrade() { + let envelope = proto::RemoteStarted {}.into_envelope(0, None, None); + this.outgoing_tx.lock().unbounded_send(envelope).ok(); + }; + let peer_id = PeerId { owner_id: 0, id: 0 }; while let Some(incoming) = incoming_rx.next().await { let Some(this) = this.upgrade() else { @@ -1145,6 +1247,14 @@ impl ChannelClient { continue; } + if let Some(proto::envelope::Payload::RemoteStarted(_)) = &incoming.payload { + this.remote_started.set(()); + let mut envelope = proto::Ack {}.into_envelope(0, Some(incoming.id), None); + envelope.id = this.next_message_id.fetch_add(1, SeqCst); + this.outgoing_tx.lock().unbounded_send(envelope).ok(); + continue; + } + this.max_received.store(incoming.id, SeqCst); if let Some(request_id) = incoming.responding_to { @@ -1372,6 +1482,7 @@ mod fake { use super::{ChannelClient, RemoteClientDelegate, RemoteConnection, RemotePlatform}; use crate::remote_client::{CommandTemplate, RemoteConnectionOptions}; use anyhow::Result; + use askpass::EncryptedPassword; use async_trait::async_trait; use collections::HashMap; use futures::{ @@ -1440,6 +1551,23 @@ mod fake { }) } + fn build_forward_port_command( + &self, + local_port: u16, + host: String, + remote_port: u16, + ) -> anyhow::Result { + Ok(CommandTemplate { + program: "ssh".into(), + args: vec![ + "-N".into(), + "-L".into(), + format!("{local_port}:{host}:{remote_port}"), + ], + env: Default::default(), + }) + } + fn upload_directory( &self, _src_path: PathBuf, @@ -1501,18 +1629,22 @@ mod fake { } fn path_style(&self) -> PathStyle { - PathStyle::current() + PathStyle::local() } fn shell(&self) -> String { "sh".to_owned() } + + fn default_system_shell(&self) -> String { + "sh".to_owned() + } } pub(super) struct Delegate; impl RemoteClientDelegate for Delegate { - fn ask_password(&self, _: String, _: oneshot::Sender, _: &mut AsyncApp) { + fn ask_password(&self, _: String, _: oneshot::Sender, _: &mut AsyncApp) { unreachable!() } diff --git a/crates/remote/src/transport.rs b/crates/remote/src/transport.rs index 36525b7fcc1d91f106cffb6592a1ffd8e5e96fa9..62144d565348b65a5ef242124277a8325e77d1a7 100644 --- a/crates/remote/src/transport.rs +++ b/crates/remote/src/transport.rs @@ -107,7 +107,6 @@ fn handle_rpc_messages_over_child_process_stdio( result.context("stderr") } }; - let status = ssh_proxy_process.status().await?.code().unwrap_or(1); match result { Ok(_) => Ok(status), @@ -194,7 +193,6 @@ async fn build_remote_server_from_source( ) .await?; } else if build_remote_server.contains("cross") { - #[cfg(target_os = "windows")] use util::paths::SanitizedPath; delegate.set_status(Some("Installing cross.rs for cross-compilation"), cx); @@ -216,11 +214,7 @@ async fn build_remote_server_from_source( ); log::info!("building remote server binary from source for {}", &triple); - // On Windows, the binding needs to be set to the canonical path - #[cfg(target_os = "windows")] - let src = SanitizedPath::new(&smol::fs::canonicalize("./target").await?).to_glob_string(); - #[cfg(not(target_os = "windows"))] - let src = "./target"; + let src = SanitizedPath::new(&smol::fs::canonicalize("target").await?).to_string(); run_cmd( Command::new("cross") diff --git a/crates/remote/src/transport/ssh.rs b/crates/remote/src/transport/ssh.rs index 42c6da04b5c39b0b1133b2d13549585fa9433ef7..909ff93169a8a93cea1474348008981a4fdaa36b 100644 --- a/crates/remote/src/transport/ssh.rs +++ b/crates/remote/src/transport/ssh.rs @@ -11,32 +11,34 @@ use futures::{ select_biased, }; use gpui::{App, AppContext as _, AsyncApp, SemanticVersion, Task}; -use itertools::Itertools; use parking_lot::Mutex; +use paths::remote_server_dir_relative; use release_channel::{AppCommitSha, AppVersion, ReleaseChannel}; use rpc::proto::Envelope; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +pub use settings::SshPortForwardOption; use smol::{ fs, process::{self, Child, Stdio}, }; use std::{ - iter, path::{Path, PathBuf}, sync::Arc, time::Instant, }; use tempfile::TempDir; -use util::paths::{PathStyle, RemotePathBuf}; +use util::{ + paths::{PathStyle, RemotePathBuf}, + rel_path::RelPath, +}; pub(crate) struct SshRemoteConnection { socket: SshSocket, master_process: Mutex>, - remote_binary_path: Option, + remote_binary_path: Option>, ssh_platform: RemotePlatform, ssh_path_style: PathStyle, ssh_shell: String, + ssh_default_system_shell: String, _temp_dir: TempDir, } @@ -53,22 +55,28 @@ pub struct SshConnectionOptions { pub upload_binary_over_ssh: bool, } -#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, JsonSchema)] -pub struct SshPortForwardOption { - #[serde(skip_serializing_if = "Option::is_none")] - pub local_host: Option, - pub local_port: u16, - #[serde(skip_serializing_if = "Option::is_none")] - pub remote_host: Option, - pub remote_port: u16, +impl From for SshConnectionOptions { + fn from(val: settings::SshConnection) -> Self { + SshConnectionOptions { + host: val.host.into(), + username: val.username, + port: val.port, + password: None, + args: Some(val.args), + nickname: val.nickname, + upload_binary_over_ssh: val.upload_binary_over_ssh.unwrap_or_default(), + port_forwards: val.port_forwards, + } + } } -#[derive(Clone)] struct SshSocket { connection_options: SshConnectionOptions, #[cfg(not(target_os = "windows"))] - socket_path: PathBuf, + socket_path: std::path::PathBuf, envs: HashMap, + #[cfg(target_os = "windows")] + _proxy: askpass::PasswordProxy, } macro_rules! shell_script { @@ -105,6 +113,10 @@ impl RemoteConnection for SshRemoteConnection { self.ssh_shell.clone() } + fn default_system_shell(&self) -> String { + self.ssh_default_system_shell.clone() + } + fn build_command( &self, input_program: Option, @@ -113,63 +125,40 @@ impl RemoteConnection for SshRemoteConnection { working_dir: Option, port_forward: Option<(u16, String, u16)>, ) -> Result { - use std::fmt::Write as _; - - let mut script = String::new(); - if let Some(working_dir) = working_dir { - let working_dir = - RemotePathBuf::new(working_dir.into(), self.ssh_path_style).to_string(); - - // shlex will wrap the command in single quotes (''), disabling ~ expansion, - // replace ith with something that works - const TILDE_PREFIX: &'static str = "~/"; - let working_dir = if working_dir.starts_with(TILDE_PREFIX) { - let working_dir = working_dir.trim_start_matches("~").trim_start_matches("/"); - format!("$HOME/{working_dir}") - } else { - working_dir - }; - write!(&mut script, "cd \"{working_dir}\"; ",).unwrap(); - } else { - write!(&mut script, "cd; ").unwrap(); - }; - - for (k, v) in input_env.iter() { - if let Some((k, v)) = shlex::try_quote(k).ok().zip(shlex::try_quote(v).ok()) { - write!(&mut script, "{}={} ", k, v).unwrap(); - } - } - - let shell = &self.ssh_shell; - - if let Some(input_program) = input_program { - let command = shlex::try_quote(&input_program)?; - script.push_str(&command); - for arg in input_args { - let arg = shlex::try_quote(&arg)?; - script.push_str(" "); - script.push_str(&arg); - } - } else { - write!(&mut script, "exec {shell} -l").unwrap(); - }; - - let shell_invocation = format!("{shell} -c {}", shlex::try_quote(&script).unwrap()); - - let mut args = Vec::new(); - args.extend(self.socket.ssh_args()); - - if let Some((local_port, host, remote_port)) = port_forward { - args.push("-L".into()); - args.push(format!("{local_port}:{host}:{remote_port}")); - } + let Self { + ssh_path_style, + socket, + ssh_shell, + .. + } = self; + let env = socket.envs.clone(); + build_command( + input_program, + input_args, + input_env, + working_dir, + port_forward, + env, + *ssh_path_style, + ssh_shell, + socket.ssh_args(), + ) + } - args.push("-t".into()); - args.push(shell_invocation); + fn build_forward_port_command( + &self, + local_port: u16, + host: String, + remote_port: u16, + ) -> Result { Ok(CommandTemplate { program: "ssh".into(), - args, - env: self.socket.envs.clone(), + args: vec![ + "-N".into(), + "-L".into(), + format!("{local_port}:{host}:{remote_port}"), + ], + env: Default::default(), }) } @@ -231,30 +220,24 @@ impl RemoteConnection for SshRemoteConnection { return Task::ready(Err(anyhow!("Remote binary path not set"))); }; - let mut start_proxy_command = shell_script!( - "exec {binary_path} proxy --identifier {identifier}", - binary_path = &remote_binary_path.to_string(), - identifier = &unique_identifier, - ); - + let mut proxy_args = vec![]; for env_var in ["RUST_LOG", "RUST_BACKTRACE", "ZED_GENERATE_MINIDUMPS"] { if let Some(value) = std::env::var(env_var).ok() { - start_proxy_command = format!( - "{}={} {} ", - env_var, - shlex::try_quote(&value).unwrap(), - start_proxy_command, - ); + proxy_args.push(format!("{}='{}'", env_var, value)); } } + proxy_args.push(remote_binary_path.display(self.path_style()).into_owned()); + proxy_args.push("proxy".to_owned()); + proxy_args.push("--identifier".to_owned()); + proxy_args.push(unique_identifier); if reconnect { - start_proxy_command.push_str(" --reconnect"); + proxy_args.push("--reconnect".to_owned()); } let ssh_proxy_process = match self .socket - .ssh_command("sh", &["-c", &start_proxy_command]) + .ssh_command("env", &proxy_args) // IMPORTANT: we kill this process when we drop the task that uses it. .kill_on_drop(true) .spawn() @@ -376,9 +359,17 @@ impl SshRemoteConnection { } #[cfg(not(target_os = "windows"))] - let socket = SshSocket::new(connection_options, socket_path)?; + let socket = SshSocket::new(connection_options, socket_path).await?; #[cfg(target_os = "windows")] - let socket = SshSocket::new(connection_options, &temp_dir, askpass.get_password())?; + let socket = SshSocket::new( + connection_options, + askpass + .get_password() + .or_else(|| askpass::EncryptedPassword::try_from("").ok()) + .context("Failed to fetch askpass password")?, + cx.background_executor().clone(), + ) + .await?; drop(askpass); let ssh_platform = socket.platform().await?; @@ -387,6 +378,7 @@ impl SshRemoteConnection { _ => PathStyle::Posix, }; let ssh_shell = socket.shell().await; + let ssh_default_system_shell = String::from("/bin/sh"); let mut this = Self { socket, @@ -396,6 +388,7 @@ impl SshRemoteConnection { ssh_path_style, ssh_platform, ssh_shell, + ssh_default_system_shell, }; let (release_channel, version, commit) = cx.update(|cx| { @@ -420,7 +413,7 @@ impl SshRemoteConnection { version: SemanticVersion, commit: Option, cx: &mut AsyncApp, - ) -> Result { + ) -> Result> { let version_str = match release_channel { ReleaseChannel::Nightly => { let commit = commit.map(|s| s.full()).unwrap_or_default(); @@ -434,23 +427,21 @@ impl SshRemoteConnection { release_channel.dev_name(), version_str ); - let dst_path = RemotePathBuf::new( - paths::remote_server_dir_relative().join(binary_name), - self.ssh_path_style, - ); + let dst_path = + paths::remote_server_dir_relative().join(RelPath::unix(&binary_name).unwrap()); #[cfg(debug_assertions)] if let Some(remote_server_path) = super::build_remote_server_from_source(&self.ssh_platform, delegate.as_ref(), cx) .await? { - let tmp_path = RemotePathBuf::new( - paths::remote_server_dir_relative().join(format!( + let tmp_path = paths::remote_server_dir_relative().join( + RelPath::unix(&format!( "download-{}-{}", std::process::id(), remote_server_path.file_name().unwrap().to_string_lossy() - )), - self.ssh_path_style, + )) + .unwrap(), ); self.upload_local_server_binary(&remote_server_path, &tmp_path, delegate, cx) .await?; @@ -461,7 +452,7 @@ impl SshRemoteConnection { if self .socket - .run_command(&dst_path.to_string(), &["version"]) + .run_command(&dst_path.display(self.path_style()), &["version"]) .await .is_ok() { @@ -479,9 +470,13 @@ impl SshRemoteConnection { _ => Ok(Some(AppVersion::global(cx))), })??; - let tmp_path_gz = RemotePathBuf::new( - PathBuf::from(format!("{}-download-{}.gz", dst_path, std::process::id())), - self.ssh_path_style, + let tmp_path_gz = remote_server_dir_relative().join( + RelPath::unix(&format!( + "{}-download-{}.gz", + binary_name, + std::process::id() + )) + .unwrap(), ); if !self.socket.connection_options.upload_binary_over_ssh && let Some((url, body)) = delegate @@ -520,19 +515,13 @@ impl SshRemoteConnection { &self, url: &str, body: &str, - tmp_path_gz: &RemotePathBuf, + tmp_path_gz: &RelPath, delegate: &Arc, cx: &mut AsyncApp, ) -> Result<()> { if let Some(parent) = tmp_path_gz.parent() { self.socket - .run_command( - "sh", - &[ - "-c", - &shell_script!("mkdir -p {parent}", parent = parent.to_string().as_ref()), - ], - ) + .run_command("mkdir", &["-p", parent.display(self.path_style()).as_ref()]) .await?; } @@ -553,7 +542,7 @@ impl SshRemoteConnection { body, url, "-o", - &tmp_path_gz.to_string(), + &tmp_path_gz.display(self.path_style()), ], ) .await @@ -569,13 +558,12 @@ impl SshRemoteConnection { .run_command( "wget", &[ - "--method=GET", "--header=Content-Type: application/json", "--body-data", body, url, "-O", - &tmp_path_gz.to_string(), + &tmp_path_gz.display(self.path_style()), ], ) .await @@ -598,19 +586,13 @@ impl SshRemoteConnection { async fn upload_local_server_binary( &self, src_path: &Path, - tmp_path_gz: &RemotePathBuf, + tmp_path_gz: &RelPath, delegate: &Arc, cx: &mut AsyncApp, ) -> Result<()> { if let Some(parent) = tmp_path_gz.parent() { self.socket - .run_command( - "sh", - &[ - "-c", - &shell_script!("mkdir -p {parent}", parent = parent.to_string().as_ref()), - ], - ) + .run_command("mkdir", &["-p", parent.display(self.path_style()).as_ref()]) .await?; } @@ -633,33 +615,33 @@ impl SshRemoteConnection { async fn extract_server_binary( &self, - dst_path: &RemotePathBuf, - tmp_path: &RemotePathBuf, + dst_path: &RelPath, + tmp_path: &RelPath, delegate: &Arc, cx: &mut AsyncApp, ) -> Result<()> { delegate.set_status(Some("Extracting remote development server"), cx); let server_mode = 0o755; - let orig_tmp_path = tmp_path.to_string(); + let orig_tmp_path = tmp_path.display(self.path_style()); let script = if let Some(tmp_path) = orig_tmp_path.strip_suffix(".gz") { shell_script!( "gunzip -f {orig_tmp_path} && chmod {server_mode} {tmp_path} && mv {tmp_path} {dst_path}", server_mode = &format!("{:o}", server_mode), - dst_path = &dst_path.to_string(), + dst_path = &dst_path.display(self.path_style()), ) } else { shell_script!( "chmod {server_mode} {orig_tmp_path} && mv {orig_tmp_path} {dst_path}", server_mode = &format!("{:o}", server_mode), - dst_path = &dst_path.to_string() + dst_path = &dst_path.display(self.path_style()) ) }; self.socket.run_command("sh", &["-c", &script]).await?; Ok(()) } - async fn upload_file(&self, src_path: &Path, dest_path: &RemotePathBuf) -> Result<()> { + async fn upload_file(&self, src_path: &Path, dest_path: &RelPath) -> Result<()> { log::debug!("uploading file {:?} to {:?}", src_path, dest_path); let mut command = util::command::new_smol_command("scp"); let output = self @@ -676,7 +658,7 @@ impl SshRemoteConnection { .arg(format!( "{}:{}", self.socket.connection_options.scp_url(), - dest_path + dest_path.display(self.path_style()) )) .output() .await?; @@ -685,7 +667,7 @@ impl SshRemoteConnection { output.status.success(), "failed to upload file {} -> {}: {}", src_path.display(), - dest_path.to_string(), + dest_path.display(self.path_style()), String::from_utf8_lossy(&output.stderr) ); Ok(()) @@ -694,7 +676,7 @@ impl SshRemoteConnection { impl SshSocket { #[cfg(not(target_os = "windows"))] - fn new(options: SshConnectionOptions, socket_path: PathBuf) -> Result { + async fn new(options: SshConnectionOptions, socket_path: PathBuf) -> Result { Ok(Self { connection_options: options, envs: HashMap::default(), @@ -703,16 +685,26 @@ impl SshSocket { } #[cfg(target_os = "windows")] - fn new(options: SshConnectionOptions, temp_dir: &TempDir, secret: String) -> Result { - let askpass_script = temp_dir.path().join("askpass.bat"); - std::fs::write(&askpass_script, "@ECHO OFF\necho %ZED_SSH_ASKPASS%")?; + async fn new( + options: SshConnectionOptions, + password: askpass::EncryptedPassword, + executor: gpui::BackgroundExecutor, + ) -> Result { let mut envs = HashMap::default(); + let get_password = + move |_| Task::ready(std::ops::ControlFlow::Continue(Ok(password.clone()))); + + let _proxy = askpass::PasswordProxy::new(get_password, executor).await?; envs.insert("SSH_ASKPASS_REQUIRE".into(), "force".into()); - envs.insert("SSH_ASKPASS".into(), askpass_script.display().to_string()); - envs.insert("ZED_SSH_ASKPASS".into(), secret); + envs.insert( + "SSH_ASKPASS".into(), + _proxy.script_path().as_ref().display().to_string(), + ); + Ok(Self { connection_options: options, envs, + _proxy, }) } @@ -722,24 +714,24 @@ impl SshSocket { // Furthermore, some setups (e.g. Coder) will change directory when SSH'ing // into a machine. You must use `cd` to get back to $HOME. // You need to do it like this: $ ssh host "cd; sh -c 'ls -l /tmp'" - fn ssh_command(&self, program: &str, args: &[&str]) -> process::Command { + fn ssh_command(&self, program: &str, args: &[impl AsRef]) -> process::Command { let mut command = util::command::new_smol_command("ssh"); - let to_run = iter::once(&program) - .chain(args.iter()) - .map(|token| { - // We're trying to work with: sh, bash, zsh, fish, tcsh, ...? - debug_assert!( - !token.contains('\n'), - "multiline arguments do not work in all shells" - ); - shlex::try_quote(token).unwrap() - }) - .join(" "); + let mut to_run = shlex::try_quote(program).unwrap().into_owned(); + for arg in args { + // We're trying to work with: sh, bash, zsh, fish, tcsh, ...? + debug_assert!( + !arg.as_ref().contains('\n'), + "multiline arguments do not work in all shells" + ); + to_run.push(' '); + to_run.push_str(&shlex::try_quote(arg.as_ref()).unwrap()); + } let to_run = format!("cd; {to_run}"); - log::debug!("ssh {} {:?}", self.connection_options.ssh_url(), to_run); self.ssh_options(&mut command) .arg(self.connection_options.ssh_url()) + .arg("-T") .arg(to_run); + log::debug!("ssh {:?}", command); command } @@ -797,7 +789,7 @@ impl SshSocket { } async fn platform(&self) -> Result { - let uname = self.run_command("sh", &["-c", "uname -sm"]).await?; + let uname = self.run_command("uname", &["-sm"]).await?; let Some((os, arch)) = uname.split_once(" ") else { anyhow::bail!("unknown uname: {uname:?}") }; @@ -1037,3 +1029,137 @@ impl SshConnectionOptions { } } } + +fn build_command( + input_program: Option, + input_args: &[String], + input_env: &HashMap, + working_dir: Option, + port_forward: Option<(u16, String, u16)>, + ssh_env: HashMap, + ssh_path_style: PathStyle, + ssh_shell: &str, + ssh_args: Vec, +) -> Result { + use std::fmt::Write as _; + + let mut exec = String::new(); + if let Some(working_dir) = working_dir { + let working_dir = RemotePathBuf::new(working_dir, ssh_path_style).to_string(); + + // shlex will wrap the command in single quotes (''), disabling ~ expansion, + // replace with with something that works + const TILDE_PREFIX: &'static str = "~/"; + if working_dir.starts_with(TILDE_PREFIX) { + let working_dir = working_dir.trim_start_matches("~").trim_start_matches("/"); + write!(exec, "cd \"$HOME/{working_dir}\" && ",).unwrap(); + } else { + write!(exec, "cd \"{working_dir}\" && ",).unwrap(); + } + } else { + write!(exec, "cd && ").unwrap(); + }; + write!(exec, "exec env ").unwrap(); + + for (k, v) in input_env.iter() { + if let Some((k, v)) = shlex::try_quote(k).ok().zip(shlex::try_quote(v).ok()) { + write!(exec, "{}={} ", k, v).unwrap(); + } + } + + if let Some(input_program) = input_program { + write!(exec, "{}", shlex::try_quote(&input_program).unwrap()).unwrap(); + for arg in input_args { + let arg = shlex::try_quote(&arg)?; + write!(exec, " {}", &arg).unwrap(); + } + } else { + write!(exec, "{ssh_shell} -l").unwrap(); + }; + + let mut args = Vec::new(); + args.extend(ssh_args); + + if let Some((local_port, host, remote_port)) = port_forward { + args.push("-L".into()); + args.push(format!("{local_port}:{host}:{remote_port}")); + } + + args.push("-t".into()); + args.push(exec); + Ok(CommandTemplate { + program: "ssh".into(), + args, + env: ssh_env, + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_build_command() -> Result<()> { + let mut input_env = HashMap::default(); + input_env.insert("INPUT_VA".to_string(), "val".to_string()); + let mut env = HashMap::default(); + env.insert("SSH_VAR".to_string(), "ssh-val".to_string()); + + let command = build_command( + Some("remote_program".to_string()), + &["arg1".to_string(), "arg2".to_string()], + &input_env, + Some("~/work".to_string()), + None, + env.clone(), + PathStyle::Posix, + "/bin/fish", + vec!["-p".to_string(), "2222".to_string()], + )?; + + assert_eq!(command.program, "ssh"); + assert_eq!( + command.args.iter().map(String::as_str).collect::>(), + [ + "-p", + "2222", + "-t", + "cd \"$HOME/work\" && exec env INPUT_VA=val remote_program arg1 arg2" + ] + ); + assert_eq!(command.env, env); + + let mut input_env = HashMap::default(); + input_env.insert("INPUT_VA".to_string(), "val".to_string()); + let mut env = HashMap::default(); + env.insert("SSH_VAR".to_string(), "ssh-val".to_string()); + + let command = build_command( + None, + &["arg1".to_string(), "arg2".to_string()], + &input_env, + None, + Some((1, "foo".to_owned(), 2)), + env.clone(), + PathStyle::Posix, + "/bin/fish", + vec!["-p".to_string(), "2222".to_string()], + )?; + + assert_eq!(command.program, "ssh"); + assert_eq!( + command.args.iter().map(String::as_str).collect::>(), + [ + "-p", + "2222", + "-L", + "1:foo:2", + "-t", + "cd && exec env INPUT_VA=val /bin/fish -l" + ] + ); + assert_eq!(command.env, env); + + Ok(()) + } +} diff --git a/crates/remote/src/transport/wsl.rs b/crates/remote/src/transport/wsl.rs index 2b4d29eafeede14f305c4d21f61188b858253285..2ec2571aae0b91f8d8c7b1c75cd94d45f73531f6 100644 --- a/crates/remote/src/transport/wsl.rs +++ b/crates/remote/src/transport/wsl.rs @@ -11,13 +11,17 @@ use release_channel::{AppCommitSha, AppVersion, ReleaseChannel}; use rpc::proto::Envelope; use smol::{fs, process}; use std::{ + ffi::OsStr, fmt::Write as _, path::{Path, PathBuf}, process::Stdio, sync::Arc, time::Instant, }; -use util::paths::{PathStyle, RemotePathBuf}; +use util::{ + paths::{PathStyle, RemotePathBuf}, + rel_path::RelPath, +}; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct WslConnectionOptions { @@ -25,10 +29,20 @@ pub struct WslConnectionOptions { pub user: Option, } +impl From for WslConnectionOptions { + fn from(val: settings::WslConnection) -> Self { + WslConnectionOptions { + distro_name: val.distro_name.into(), + user: val.user, + } + } +} + pub(crate) struct WslRemoteConnection { - remote_binary_path: Option, + remote_binary_path: Option>, platform: RemotePlatform, shell: String, + default_system_shell: String, connection_options: WslConnectionOptions, } @@ -56,6 +70,7 @@ impl WslRemoteConnection { remote_binary_path: None, platform: RemotePlatform { os: "", arch: "" }, shell: String::new(), + default_system_shell: String::from("/bin/sh"), }; delegate.set_status(Some("Detecting WSL environment"), cx); this.platform = this.detect_platform().await?; @@ -84,7 +99,6 @@ impl WslRemoteConnection { .run_wsl_command("sh", &["-c", "echo $SHELL"]) .await .ok() - .and_then(|shell_path| shell_path.trim().split('/').next_back().map(str::to_string)) .unwrap_or_else(|| "bash".to_string())) } @@ -92,7 +106,7 @@ impl WslRemoteConnection { windows_path_to_wsl_path_impl(&self.connection_options, source).await } - fn wsl_command(&self, program: &str, args: &[&str]) -> process::Command { + fn wsl_command(&self, program: &str, args: &[impl AsRef]) -> process::Command { wsl_command_impl(&self.connection_options, program, args) } @@ -107,7 +121,7 @@ impl WslRemoteConnection { version: SemanticVersion, commit: Option, cx: &mut AsyncApp, - ) -> Result { + ) -> Result> { let version_str = match release_channel { ReleaseChannel::Nightly => { let commit = commit.map(|s| s.full()).unwrap_or_default(); @@ -123,13 +137,11 @@ impl WslRemoteConnection { version_str ); - let dst_path = RemotePathBuf::new( - paths::remote_wsl_server_dir_relative().join(binary_name), - PathStyle::Posix, - ); + let dst_path = + paths::remote_wsl_server_dir_relative().join(RelPath::unix(&binary_name).unwrap()); if let Some(parent) = dst_path.parent() { - self.run_wsl_command("mkdir", &["-p", &parent.to_string()]) + self.run_wsl_command("mkdir", &["-p", &parent.display(PathStyle::Posix)]) .await .map_err(|e| anyhow!("Failed to create directory: {}", e))?; } @@ -138,13 +150,13 @@ impl WslRemoteConnection { if let Some(remote_server_path) = super::build_remote_server_from_source(&self.platform, delegate.as_ref(), cx).await? { - let tmp_path = RemotePathBuf::new( - paths::remote_wsl_server_dir_relative().join(format!( + let tmp_path = paths::remote_wsl_server_dir_relative().join( + &RelPath::unix(&format!( "download-{}-{}", std::process::id(), remote_server_path.file_name().unwrap().to_string_lossy() - )), - PathStyle::Posix, + )) + .unwrap(), ); self.upload_file(&remote_server_path, &tmp_path, delegate, cx) .await?; @@ -154,7 +166,7 @@ impl WslRemoteConnection { } if self - .run_wsl_command(&dst_path.to_string(), &["version"]) + .run_wsl_command(&dst_path.display(PathStyle::Posix), &["version"]) .await .is_ok() { @@ -172,10 +184,12 @@ impl WslRemoteConnection { .download_server_binary_locally(self.platform, release_channel, wanted_version, cx) .await?; - let tmp_path = RemotePathBuf::new( - PathBuf::from(format!("{}.{}.gz", dst_path, std::process::id())), - PathStyle::Posix, + let tmp_path = format!( + "{}.{}.gz", + dst_path.display(PathStyle::Posix), + std::process::id() ); + let tmp_path = RelPath::unix(&tmp_path).unwrap(); self.upload_file(&src_path, &tmp_path, delegate, cx).await?; self.extract_and_install(&tmp_path, &dst_path, delegate, cx) @@ -187,14 +201,14 @@ impl WslRemoteConnection { async fn upload_file( &self, src_path: &Path, - dst_path: &RemotePathBuf, + dst_path: &RelPath, delegate: &Arc, cx: &mut AsyncApp, ) -> Result<()> { delegate.set_status(Some("Uploading remote server to WSL"), cx); if let Some(parent) = dst_path.parent() { - self.run_wsl_command("mkdir", &["-p", &parent.to_string()]) + self.run_wsl_command("mkdir", &["-p", &parent.display(PathStyle::Posix)]) .await .map_err(|e| anyhow!("Failed to create directory when uploading file: {}", e))?; } @@ -209,17 +223,20 @@ impl WslRemoteConnection { ); let src_path_in_wsl = self.windows_path_to_wsl_path(src_path).await?; - self.run_wsl_command("cp", &["-f", &src_path_in_wsl, &dst_path.to_string()]) - .await - .map_err(|e| { - anyhow!( - "Failed to copy file {}({}) to WSL {:?}: {}", - src_path.display(), - src_path_in_wsl, - dst_path, - e - ) - })?; + self.run_wsl_command( + "cp", + &["-f", &src_path_in_wsl, &dst_path.display(PathStyle::Posix)], + ) + .await + .map_err(|e| { + anyhow!( + "Failed to copy file {}({}) to WSL {:?}: {}", + src_path.display(), + src_path_in_wsl, + dst_path, + e + ) + })?; log::info!("uploaded remote server in {:?}", t0.elapsed()); Ok(()) @@ -227,15 +244,15 @@ impl WslRemoteConnection { async fn extract_and_install( &self, - tmp_path: &RemotePathBuf, - dst_path: &RemotePathBuf, + tmp_path: &RelPath, + dst_path: &RelPath, delegate: &Arc, cx: &mut AsyncApp, ) -> Result<()> { delegate.set_status(Some("Extracting remote server"), cx); - let tmp_path_str = tmp_path.to_string(); - let dst_path_str = dst_path.to_string(); + let tmp_path_str = tmp_path.display(PathStyle::Posix); + let dst_path_str = dst_path.display(PathStyle::Posix); // Build extraction script with proper error handling let script = if tmp_path_str.ends_with(".gz") { @@ -276,22 +293,22 @@ impl RemoteConnection for WslRemoteConnection { return Task::ready(Err(anyhow!("Remote binary path not set"))); }; - let mut proxy_command = format!( - "exec {} proxy --identifier {}", - remote_binary_path, unique_identifier - ); - - if reconnect { - proxy_command.push_str(" --reconnect"); - } - + let mut proxy_args = vec![]; for env_var in ["RUST_LOG", "RUST_BACKTRACE", "ZED_GENERATE_MINIDUMPS"] { if let Some(value) = std::env::var(env_var).ok() { - proxy_command = format!("{}='{}' {}", env_var, value, proxy_command); + proxy_args.push(format!("{}='{}'", env_var, value)); } } + proxy_args.push(remote_binary_path.display(PathStyle::Posix).into_owned()); + proxy_args.push("proxy".to_owned()); + proxy_args.push("--identifier".to_owned()); + proxy_args.push(unique_identifier); + + if reconnect { + proxy_args.push("--reconnect".to_owned()); + } let proxy_process = match self - .wsl_command("sh", &["-lc", &proxy_command]) + .wsl_command("env", &proxy_args) .kill_on_drop(true) .spawn() { @@ -362,25 +379,25 @@ impl RemoteConnection for WslRemoteConnection { } let working_dir = working_dir - .map(|working_dir| RemotePathBuf::new(working_dir.into(), PathStyle::Posix).to_string()) + .map(|working_dir| RemotePathBuf::new(working_dir, PathStyle::Posix).to_string()) .unwrap_or("~".to_string()); - let mut script = String::new(); + let mut exec = String::from("exec env "); for (k, v) in env.iter() { - write!(&mut script, "{}='{}' ", k, v).unwrap(); + if let Some((k, v)) = shlex::try_quote(k).ok().zip(shlex::try_quote(v).ok()) { + write!(exec, "{}={} ", k, v).unwrap(); + } } if let Some(program) = program { - let command = shlex::try_quote(&program)?; - script.push_str(&command); + write!(exec, "{}", shlex::try_quote(&program)?).unwrap(); for arg in args { let arg = shlex::try_quote(&arg)?; - script.push_str(" "); - script.push_str(&arg); + write!(exec, " {}", &arg).unwrap(); } } else { - write!(&mut script, "exec {} -l", self.shell).unwrap(); + write!(&mut exec, "{} -l", self.shell).unwrap(); } let wsl_args = if let Some(user) = &self.connection_options.user { @@ -394,7 +411,7 @@ impl RemoteConnection for WslRemoteConnection { "--".to_string(), self.shell.clone(), "-c".to_string(), - shlex::try_quote(&script)?.to_string(), + exec, ] } else { vec![ @@ -405,7 +422,7 @@ impl RemoteConnection for WslRemoteConnection { "--".to_string(), self.shell.clone(), "-c".to_string(), - shlex::try_quote(&script)?.to_string(), + exec, ] }; @@ -416,6 +433,15 @@ impl RemoteConnection for WslRemoteConnection { }) } + fn build_forward_port_command( + &self, + _: u16, + _: String, + _: u16, + ) -> anyhow::Result { + Err(anyhow!("WSL shares a network interface with the host")) + } + fn connection_options(&self) -> RemoteConnectionOptions { RemoteConnectionOptions::Wsl(self.connection_options.clone()) } @@ -427,6 +453,10 @@ impl RemoteConnection for WslRemoteConnection { fn shell(&self) -> String { self.shell.clone() } + + fn default_system_shell(&self) -> String { + self.default_system_shell.clone() + } } /// `wslpath` is a executable available in WSL, it's a linux binary. @@ -447,10 +477,31 @@ async fn windows_path_to_wsl_path_impl( run_wsl_command_impl(options, "wslpath", &["-u", &source]).await } -fn wsl_command_impl( +async fn run_wsl_command_impl( options: &WslConnectionOptions, program: &str, args: &[&str], +) -> Result { + let output = wsl_command_impl(options, program, args).output().await?; + + if !output.status.success() { + return Err(anyhow!( + "Command '{}' failed: {}", + program, + String::from_utf8_lossy(&output.stderr).trim() + )); + } + + Ok(String::from_utf8_lossy(&output.stdout).trim().to_owned()) +} + +/// Creates a new `wsl.exe` command that runs the given program with the given arguments. +/// +/// If `exec` is true, the command will be executed in the WSL environment without spawning a new shell. +fn wsl_command_impl( + options: &WslConnectionOptions, + program: &str, + args: &[impl AsRef], ) -> process::Command { let mut command = util::command::new_smol_command("wsl.exe"); @@ -466,26 +517,10 @@ fn wsl_command_impl( .arg(&options.distro_name) .arg("--cd") .arg("~") + .arg("--exec") .arg(program) .args(args); + log::debug!("wsl {:?}", command); command } - -async fn run_wsl_command_impl( - options: &WslConnectionOptions, - program: &str, - args: &[&str], -) -> Result { - let output = wsl_command_impl(options, program, args).output().await?; - - if !output.status.success() { - return Err(anyhow!( - "Command '{}' failed: {}", - program, - String::from_utf8_lossy(&output.stderr).trim() - )); - } - - Ok(String::from_utf8_lossy(&output.stdout).trim().to_string()) -} diff --git a/crates/remote_server/Cargo.toml b/crates/remote_server/Cargo.toml index 59b2af0f410c98385cf13a271833980aacd6c8bc..92777d1a5950cf67f5ba060e6e891ea213ea504d 100644 --- a/crates/remote_server/Cargo.toml +++ b/crates/remote_server/Cargo.toml @@ -39,6 +39,7 @@ git2 = { workspace = true, features = ["vendored-libgit2"] } gpui.workspace = true gpui_tokio.workspace = true http_client.workspace = true +json_schema_store.workspace = true language.workspace = true language_extension.workspace = true languages.workspace = true @@ -77,6 +78,7 @@ assistant_tool.workspace = true assistant_tools.workspace = true client = { workspace = true, features = ["test-support"] } clock = { workspace = true, features = ["test-support"] } +collections.workspace = true dap = { workspace = true, features = ["test-support"] } editor = { workspace = true, features = ["test-support"] } workspace = { workspace = true, features = ["test-support"] } @@ -85,6 +87,7 @@ gpui = { workspace = true, features = ["test-support"] } http_client = { workspace = true, features = ["test-support"] } language = { workspace = true, features = ["test-support"] } node_runtime = { workspace = true, features = ["test-support"] } +pretty_assertions.workspace = true project = { workspace = true, features = ["test-support"] } remote = { workspace = true, features = ["test-support"] } language_model = { workspace = true, features = ["test-support"] } diff --git a/crates/remote_server/build.rs b/crates/remote_server/build.rs index 0573d9b666061027a60319bacb59dca60a2f03c8..f0852a1b0a2560540ff4e1b7a9e91aaffcc9b228 100644 --- a/crates/remote_server/build.rs +++ b/crates/remote_server/build.rs @@ -1,3 +1,4 @@ +#![allow(clippy::disallowed_methods, reason = "build scripts are exempt")] use std::process::Command; const ZED_MANIFEST: &str = include_str!("../zed/Cargo.toml"); diff --git a/crates/remote_server/src/headless_project.rs b/crates/remote_server/src/headless_project.rs index f107ff2c8f8860a621ad5c637e6fa34b54734a6d..be9dbca50c709accfc48dc9c33ae2cd9371b4efa 100644 --- a/crates/remote_server/src/headless_project.rs +++ b/crates/remote_server/src/headless_project.rs @@ -1,4 +1,3 @@ -use ::proto::{FromProto, ToProto}; use anyhow::{Context as _, Result, anyhow}; use lsp::LanguageServerId; @@ -27,14 +26,14 @@ use rpc::{ proto::{self, REMOTE_SERVER_PEER_ID, REMOTE_SERVER_PROJECT_ID}, }; -use settings::initial_server_settings_content; +use settings::{Settings as _, initial_server_settings_content}; use smol::stream::StreamExt; use std::{ path::{Path, PathBuf}, sync::{Arc, atomic::AtomicUsize}, }; use sysinfo::System; -use util::ResultExt; +use util::{ResultExt, paths::PathStyle, rel_path::RelPath}; use worktree::Worktree; pub struct HeadlessProject { @@ -70,6 +69,7 @@ impl HeadlessProject { settings::init(cx); language::init(cx); project::Project::init_settings(cx); + extension_host::ExtensionSettings::register(cx); log_store::init(true, cx); } @@ -123,6 +123,7 @@ impl HeadlessProject { toolchain_store.read(cx).as_language_toolchain_store(), worktree_store.clone(), breakpoint_store.clone(), + true, cx, ); dap_store.shared(REMOTE_SERVER_PROJECT_ID, session.clone(), cx); @@ -195,9 +196,14 @@ impl HeadlessProject { }); let agent_server_store = cx.new(|cx| { - let mut agent_server_store = - AgentServerStore::local(node_runtime.clone(), fs.clone(), environment, cx); - agent_server_store.shared(REMOTE_SERVER_PROJECT_ID, session.clone()); + let mut agent_server_store = AgentServerStore::local( + node_runtime.clone(), + fs.clone(), + environment, + http_client.clone(), + cx, + ); + agent_server_store.shared(REMOTE_SERVER_PROJECT_ID, session.clone(), cx); agent_server_store }); @@ -405,7 +411,7 @@ impl HeadlessProject { ) -> Result { use client::ErrorCodeExt; let fs = this.read_with(&cx, |this, _| this.fs.clone())?; - let path = PathBuf::from_proto(shellexpand::tilde(&message.payload.path).to_string()); + let path = PathBuf::from(shellexpand::tilde(&message.payload.path).to_string()); let canonicalized = match fs.canonicalize(&path).await { Ok(path) => path, @@ -443,7 +449,7 @@ impl HeadlessProject { let worktree = worktree.read(cx); proto::AddWorktreeResponse { worktree_id: worktree.id().to_proto(), - canonicalized_path: canonicalized.to_proto(), + canonicalized_path: canonicalized.to_string_lossy().into_owned(), } })?; @@ -492,16 +498,11 @@ impl HeadlessProject { mut cx: AsyncApp, ) -> Result { let worktree_id = WorktreeId::from_proto(message.payload.worktree_id); + let path = RelPath::from_proto(&message.payload.path)?; let (buffer_store, buffer) = this.update(&mut cx, |this, cx| { let buffer_store = this.buffer_store.clone(); let buffer = this.buffer_store.update(cx, |buffer_store, cx| { - buffer_store.open_buffer( - ProjectPath { - worktree_id, - path: Arc::::from_proto(message.payload.path), - }, - cx, - ) + buffer_store.open_buffer(ProjectPath { worktree_id, path }, cx) }); anyhow::Ok((buffer_store, buffer)) })??; @@ -590,7 +591,7 @@ impl HeadlessProject { buffer_store.open_buffer( ProjectPath { worktree_id: worktree.read(cx).id(), - path: path.into(), + path: path, }, cx, ) @@ -630,7 +631,10 @@ impl HeadlessProject { mut cx: AsyncApp, ) -> Result { let message = envelope.payload; - let query = SearchQuery::from_proto(message.query.context("missing query field")?)?; + let query = SearchQuery::from_proto( + message.query.context("missing query field")?, + PathStyle::local(), + )?; let results = this.update(&mut cx, |this, cx| { this.buffer_store.update(cx, |buffer_store, cx| { buffer_store.find_search_candidates(&query, message.limit as _, this.fs.clone(), cx) @@ -662,7 +666,7 @@ impl HeadlessProject { cx: AsyncApp, ) -> Result { let fs = cx.read_entity(&this, |this, _| this.fs.clone())?; - let expanded = PathBuf::from_proto(shellexpand::tilde(&envelope.payload.path).to_string()); + let expanded = PathBuf::from(shellexpand::tilde(&envelope.payload.path).to_string()); let check_info = envelope .payload .config @@ -675,7 +679,7 @@ impl HeadlessProject { while let Some(path) = response.next().await { let path = path?; if let Some(file_name) = path.file_name() { - entries.push(file_name.to_string_lossy().to_string()); + entries.push(file_name.to_string_lossy().into_owned()); if check_info { let is_dir = fs.is_dir(&path).await; entry_info.push(proto::EntryInfo { is_dir }); @@ -694,7 +698,7 @@ impl HeadlessProject { cx: AsyncApp, ) -> Result { let fs = cx.read_entity(&this, |this, _| this.fs.clone())?; - let expanded = PathBuf::from_proto(shellexpand::tilde(&envelope.payload.path).to_string()); + let expanded = PathBuf::from(shellexpand::tilde(&envelope.payload.path).to_string()); let metadata = fs.metadata(&expanded).await?; let is_dir = metadata.map(|metadata| metadata.is_dir).unwrap_or(false); @@ -702,7 +706,7 @@ impl HeadlessProject { Ok(proto::GetPathMetadataResponse { exists: metadata.is_some(), is_dir, - path: expanded.to_proto(), + path: expanded.to_string_lossy().into_owned(), }) } @@ -746,7 +750,7 @@ impl HeadlessProject { let command = process .cmd() .iter() - .map(|s| s.to_string_lossy().to_string()) + .map(|s| s.to_string_lossy().into_owned()) .collect::>(); processes.push(proto::ProcessInfo { diff --git a/crates/remote_server/src/remote_editing_tests.rs b/crates/remote_server/src/remote_editing_tests.rs index c0ccaf900d18ee176bab7193c2bfb65b8555318d..f6cddc65688a35b6ed67bfaa13bccb1ff5bde2c2 100644 --- a/crates/remote_server/src/remote_editing_tests.rs +++ b/crates/remote_server/src/remote_editing_tests.rs @@ -6,6 +6,7 @@ use assistant_tool::{Tool as _, ToolResultContent}; use assistant_tools::{ReadFileTool, ReadFileToolInput}; use client::{Client, UserStore}; use clock::FakeSystemClock; +use collections::{HashMap, HashSet}; use language_model::{LanguageModelRequest, fake_provider::FakeLanguageModel}; use extension::ExtensionHostProxy; @@ -19,7 +20,8 @@ use language::{ use lsp::{CompletionContext, CompletionResponse, CompletionTriggerKind, LanguageServerName}; use node_runtime::NodeRuntime; use project::{ - Project, ProjectPath, + Project, + agent_server_store::AgentServerCommand, search::{SearchQuery, SearchResult}, }; use remote::RemoteClient; @@ -27,13 +29,11 @@ use serde_json::json; use settings::{Settings, SettingsLocation, SettingsStore, initial_server_settings_content}; use smol::stream::StreamExt; use std::{ - collections::HashSet, path::{Path, PathBuf}, sync::Arc, }; -#[cfg(not(windows))] use unindent::Unindent as _; -use util::path; +use util::{path, rel_path::rel_path}; #[gpui::test] async fn test_basic_remote_editing(cx: &mut TestAppContext, server_cx: &mut TestAppContext) { @@ -56,7 +56,7 @@ async fn test_basic_remote_editing(cx: &mut TestAppContext, server_cx: &mut Test .await; fs.set_index_for_repo( Path::new(path!("/code/project1/.git")), - &[("src/lib.rs".into(), "fn one() -> usize { 0 }".into())], + &[("src/lib.rs", "fn one() -> usize { 0 }".into())], ); let (project, _headless) = init_test(&fs, cx, server_cx).await; @@ -72,11 +72,11 @@ async fn test_basic_remote_editing(cx: &mut TestAppContext, server_cx: &mut Test let worktree_id = worktree.read_with(cx, |worktree, _| worktree.id()); worktree.update(cx, |worktree, _cx| { assert_eq!( - worktree.paths().map(Arc::as_ref).collect::>(), + worktree.paths().collect::>(), vec![ - Path::new("README.md"), - Path::new("src"), - Path::new("src/lib.rs"), + rel_path("README.md"), + rel_path("src"), + rel_path("src/lib.rs"), ] ); }); @@ -85,7 +85,7 @@ async fn test_basic_remote_editing(cx: &mut TestAppContext, server_cx: &mut Test // contents are loaded from the remote filesystem. let buffer = project .update(cx, |project, cx| { - project.open_buffer((worktree_id, Path::new("src/lib.rs")), cx) + project.open_buffer((worktree_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -129,12 +129,12 @@ async fn test_basic_remote_editing(cx: &mut TestAppContext, server_cx: &mut Test cx.executor().run_until_parked(); worktree.update(cx, |worktree, _cx| { assert_eq!( - worktree.paths().map(Arc::as_ref).collect::>(), + worktree.paths().collect::>(), vec![ - Path::new("README.md"), - Path::new("src"), - Path::new("src/lib.rs"), - Path::new("src/main.rs"), + rel_path("README.md"), + rel_path("src"), + rel_path("src/lib.rs"), + rel_path("src/main.rs"), ] ); }); @@ -149,12 +149,12 @@ async fn test_basic_remote_editing(cx: &mut TestAppContext, server_cx: &mut Test .unwrap(); cx.executor().run_until_parked(); buffer.update(cx, |buffer, _| { - assert_eq!(&**buffer.file().unwrap().path(), Path::new("src/lib2.rs")); + assert_eq!(&**buffer.file().unwrap().path(), rel_path("src/lib2.rs")); }); fs.set_index_for_repo( Path::new(path!("/code/project1/.git")), - &[("src/lib2.rs".into(), "fn one() -> usize { 100 }".into())], + &[("src/lib2.rs", "fn one() -> usize { 100 }".into())], ); cx.executor().run_until_parked(); diff.update(cx, |diff, _| { @@ -335,7 +335,7 @@ async fn test_remote_settings(cx: &mut TestAppContext, server_cx: &mut TestAppCo let buffer = project .update(cx, |project, cx| { - project.open_buffer((worktree_id, Path::new("src/lib.rs")), cx) + project.open_buffer((worktree_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -355,7 +355,7 @@ async fn test_remote_settings(cx: &mut TestAppContext, server_cx: &mut TestAppCo AllLanguageSettings::get( Some(SettingsLocation { worktree_id, - path: Path::new("src/lib.rs") + path: rel_path("src/lib.rs") }), cx ) @@ -462,7 +462,7 @@ async fn test_remote_lsp(cx: &mut TestAppContext, server_cx: &mut TestAppContext let (buffer, _handle) = project .update(cx, |project, cx| { - project.open_buffer_with_lsp((worktree_id, Path::new("src/lib.rs")), cx) + project.open_buffer_with_lsp((worktree_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -642,7 +642,7 @@ async fn test_remote_cancel_language_server_work( let (buffer, _handle) = project .update(cx, |project, cx| { - project.open_buffer_with_lsp((worktree_id, Path::new("src/lib.rs")), cx) + project.open_buffer_with_lsp((worktree_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -756,7 +756,7 @@ async fn test_remote_reload(cx: &mut TestAppContext, server_cx: &mut TestAppCont let buffer = project .update(cx, |project, cx| { - project.open_buffer((worktree_id, Path::new("src/lib.rs")), cx) + project.open_buffer((worktree_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -848,9 +848,11 @@ async fn test_remote_resolve_path_in_buffer( let worktree2_id = cx.update(|cx| worktree2.read(cx).id()); + cx.run_until_parked(); + let buffer2 = project .update(cx, |project, cx| { - project.open_buffer((worktree2_id, Path::new("src/lib.rs")), cx) + project.open_buffer((worktree2_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -862,10 +864,7 @@ async fn test_remote_resolve_path_in_buffer( .await .unwrap(); assert!(path.is_file()); - assert_eq!( - path.abs_path().unwrap().to_string_lossy(), - path!("/code/project2/README.md") - ); + assert_eq!(path.abs_path().unwrap(), path!("/code/project2/README.md")); let path = project .update(cx, |project, cx| { @@ -876,7 +875,7 @@ async fn test_remote_resolve_path_in_buffer( assert!(path.is_file()); assert_eq!( path.project_path().unwrap().clone(), - ProjectPath::from((worktree2_id, "README.md")) + (worktree2_id, rel_path("README.md")).into() ); let path = project @@ -887,7 +886,7 @@ async fn test_remote_resolve_path_in_buffer( .unwrap(); assert_eq!( path.project_path().unwrap().clone(), - ProjectPath::from((worktree2_id, "src")) + (worktree2_id, rel_path("src")).into() ); assert!(path.is_dir()); } @@ -919,10 +918,7 @@ async fn test_remote_resolve_abs_path(cx: &mut TestAppContext, server_cx: &mut T .unwrap(); assert!(path.is_file()); - assert_eq!( - path.abs_path().unwrap().to_string_lossy(), - path!("/code/project1/README.md") - ); + assert_eq!(path.abs_path().unwrap(), path!("/code/project1/README.md")); let path = project .update(cx, |project, cx| { @@ -932,10 +928,7 @@ async fn test_remote_resolve_abs_path(cx: &mut TestAppContext, server_cx: &mut T .unwrap(); assert!(path.is_dir()); - assert_eq!( - path.abs_path().unwrap().to_string_lossy(), - path!("/code/project1/src") - ); + assert_eq!(path.abs_path().unwrap(), path!("/code/project1/src")); let path = project .update(cx, |project, cx| { @@ -972,14 +965,18 @@ async fn test_canceling_buffer_opening(cx: &mut TestAppContext, server_cx: &mut let worktree_id = worktree.read_with(cx, |tree, _| tree.id()); // Open a buffer on the client but cancel after a random amount of time. - let buffer = project.update(cx, |p, cx| p.open_buffer((worktree_id, "src/lib.rs"), cx)); + let buffer = project.update(cx, |p, cx| { + p.open_buffer((worktree_id, rel_path("src/lib.rs")), cx) + }); cx.executor().simulate_random_delay().await; drop(buffer); // Try opening the same buffer again as the client, and ensure we can // still do it despite the cancellation above. let buffer = project - .update(cx, |p, cx| p.open_buffer((worktree_id, "src/lib.rs"), cx)) + .update(cx, |p, cx| { + p.open_buffer((worktree_id, rel_path("src/lib.rs")), cx) + }) .await .unwrap(); @@ -1041,10 +1038,7 @@ async fn test_adding_then_removing_then_adding_worktrees( assert!(worktree.is_visible()); let entries = worktree.entries(true, 0).collect::>(); assert_eq!(entries.len(), 2); - assert_eq!( - entries[1].path.to_string_lossy().to_string(), - "README.md".to_string() - ) + assert_eq!(entries[1].path.as_unix_str(), "README.md") }) } @@ -1110,7 +1104,7 @@ async fn test_reconnect(cx: &mut TestAppContext, server_cx: &mut TestAppContext) let worktree_id = worktree.read_with(cx, |worktree, _| worktree.id()); let buffer = project .update(cx, |project, cx| { - project.open_buffer((worktree_id, Path::new("src/lib.rs")), cx) + project.open_buffer((worktree_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -1202,10 +1196,11 @@ async fn test_remote_rename_entry(cx: &mut TestAppContext, server_cx: &mut TestA cx.run_until_parked(); - let entry = worktree - .update(cx, |worktree, cx| { - let entry = worktree.entry_for_path("README.md").unwrap(); - worktree.rename_entry(entry.id, Path::new("README.rst"), cx) + let entry = project + .update(cx, |project, cx| { + let worktree = worktree.read(cx); + let entry = worktree.entry_for_path(rel_path("README.md")).unwrap(); + project.rename_entry(entry.id, (worktree.id(), rel_path("README.rst")).into(), cx) }) .await .unwrap() @@ -1215,7 +1210,10 @@ async fn test_remote_rename_entry(cx: &mut TestAppContext, server_cx: &mut TestA cx.run_until_parked(); worktree.update(cx, |worktree, _| { - assert_eq!(worktree.entry_for_path("README.rst").unwrap().id, entry.id) + assert_eq!( + worktree.entry_for_path(rel_path("README.rst")).unwrap().id, + entry.id + ) }); } @@ -1276,7 +1274,7 @@ async fn test_copy_file_into_remote_project( worktree .update(cx, |worktree, cx| { worktree.copy_external_entries( - Path::new("src").into(), + rel_path("src").into(), vec![ Path::new(path!("/local-code/dir1/file1")).into(), Path::new(path!("/local-code/dir1/dir2")).into(), @@ -1329,8 +1327,6 @@ async fn test_copy_file_into_remote_project( ); } -// TODO: this test fails on Windows. -#[cfg(not(windows))] #[gpui::test] async fn test_remote_git_diffs(cx: &mut TestAppContext, server_cx: &mut TestAppContext) { let text_2 = " @@ -1362,11 +1358,11 @@ async fn test_remote_git_diffs(cx: &mut TestAppContext, server_cx: &mut TestAppC .await; fs.set_index_for_repo( Path::new("/code/project1/.git"), - &[("src/lib.rs".into(), text_1.clone())], + &[("src/lib.rs", text_1.clone())], ); fs.set_head_for_repo( Path::new("/code/project1/.git"), - &[("src/lib.rs".into(), text_1.clone())], + &[("src/lib.rs", text_1.clone())], "deadbeef", ); @@ -1382,7 +1378,7 @@ async fn test_remote_git_diffs(cx: &mut TestAppContext, server_cx: &mut TestAppC let buffer = project .update(cx, |project, cx| { - project.open_buffer((worktree_id, Path::new("src/lib.rs")), cx) + project.open_buffer((worktree_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -1408,7 +1404,7 @@ async fn test_remote_git_diffs(cx: &mut TestAppContext, server_cx: &mut TestAppC // stage the current buffer's contents fs.set_index_for_repo( Path::new("/code/project1/.git"), - &[("src/lib.rs".into(), text_2.clone())], + &[("src/lib.rs", text_2.clone())], ); cx.executor().run_until_parked(); @@ -1427,7 +1423,7 @@ async fn test_remote_git_diffs(cx: &mut TestAppContext, server_cx: &mut TestAppC // commit the current buffer's contents fs.set_head_for_repo( Path::new("/code/project1/.git"), - &[("src/lib.rs".into(), text_2.clone())], + &[("src/lib.rs", text_2.clone())], "deadbeef", ); @@ -1445,8 +1441,6 @@ async fn test_remote_git_diffs(cx: &mut TestAppContext, server_cx: &mut TestAppC }); } -// TODO: this test fails on Windows. -#[cfg(not(windows))] #[gpui::test] async fn test_remote_git_diffs_when_recv_update_repository_delay( cx: &mut TestAppContext, @@ -1469,7 +1463,7 @@ async fn test_remote_git_diffs_when_recv_update_repository_delay( let fs = FakeFs::new(server_cx.executor()); fs.insert_tree( - "/code", + path!("/code"), json!({ "project1": { "src": { @@ -1484,14 +1478,14 @@ async fn test_remote_git_diffs_when_recv_update_repository_delay( let (project, _headless) = init_test(&fs, cx, server_cx).await; let (worktree, _) = project .update(cx, |project, cx| { - project.find_or_create_worktree("/code/project1", true, cx) + project.find_or_create_worktree(path!("/code/project1"), true, cx) }) .await .unwrap(); let worktree_id = cx.update(|cx| worktree.read(cx).id()); let buffer = project .update(cx, |project, cx| { - project.open_buffer((worktree_id, Path::new("src/lib.rs")), cx) + project.open_buffer((worktree_id, rel_path("src/lib.rs")), cx) }) .await .unwrap(); @@ -1507,7 +1501,7 @@ async fn test_remote_git_diffs_when_recv_update_repository_delay( // Remote server will send proto::UpdateRepository after the instance of Editor create. fs.insert_tree( - "/code", + path!("/code"), json!({ "project1": { ".git": {}, @@ -1517,12 +1511,12 @@ async fn test_remote_git_diffs_when_recv_update_repository_delay( .await; fs.set_index_for_repo( - Path::new("/code/project1/.git"), - &[("src/lib.rs".into(), text_1.clone())], + Path::new(path!("/code/project1/.git")), + &[("src/lib.rs", text_1.clone())], ); fs.set_head_for_repo( - Path::new("/code/project1/.git"), - &[("src/lib.rs".into(), text_1.clone())], + Path::new(path!("/code/project1/.git")), + &[("src/lib.rs", text_1.clone())], "sha", ); @@ -1549,8 +1543,8 @@ async fn test_remote_git_diffs_when_recv_update_repository_delay( // stage the current buffer's contents fs.set_index_for_repo( - Path::new("/code/project1/.git"), - &[("src/lib.rs".into(), text_2.clone())], + Path::new(path!("/code/project1/.git")), + &[("src/lib.rs", text_2.clone())], ); cx.executor().run_until_parked(); @@ -1568,8 +1562,8 @@ async fn test_remote_git_diffs_when_recv_update_repository_delay( // commit the current buffer's contents fs.set_head_for_repo( - Path::new("/code/project1/.git"), - &[("src/lib.rs".into(), text_2.clone())], + Path::new(path!("/code/project1/.git")), + &[("src/lib.rs", text_2.clone())], "sha", ); @@ -1770,6 +1764,92 @@ async fn test_remote_agent_fs_tool_calls(cx: &mut TestAppContext, server_cx: &mu does_not_exist_result.output.await.unwrap_err(); } +#[gpui::test] +async fn test_remote_external_agent_server( + cx: &mut TestAppContext, + server_cx: &mut TestAppContext, +) { + let fs = FakeFs::new(server_cx.executor()); + fs.insert_tree(path!("/project"), json!({})).await; + + let (project, _headless_project) = init_test(&fs, cx, server_cx).await; + project + .update(cx, |project, cx| { + project.find_or_create_worktree(path!("/project"), true, cx) + }) + .await + .unwrap(); + let names = project.update(cx, |project, cx| { + project + .agent_server_store() + .read(cx) + .external_agents() + .map(|name| name.to_string()) + .collect::>() + }); + pretty_assertions::assert_eq!(names, ["codex", "gemini", "claude"]); + server_cx.update_global::(|settings_store, cx| { + settings_store + .set_server_settings( + &json!({ + "agent_servers": { + "foo": { + "command": "foo-cli", + "args": ["--flag"], + "env": { + "VAR": "val" + } + } + } + }) + .to_string(), + cx, + ) + .unwrap(); + }); + server_cx.run_until_parked(); + cx.run_until_parked(); + let names = project.update(cx, |project, cx| { + project + .agent_server_store() + .read(cx) + .external_agents() + .map(|name| name.to_string()) + .collect::>() + }); + pretty_assertions::assert_eq!(names, ["gemini", "codex", "claude", "foo"]); + let (command, root, login) = project + .update(cx, |project, cx| { + project.agent_server_store().update(cx, |store, cx| { + store + .get_external_agent(&"foo".into()) + .unwrap() + .get_command( + None, + HashMap::from_iter([("OTHER_VAR".into(), "other-val".into())]), + None, + None, + &mut cx.to_async(), + ) + }) + }) + .await + .unwrap(); + assert_eq!( + command, + AgentServerCommand { + path: "ssh".into(), + args: vec!["foo-cli".into(), "--flag".into()], + env: Some(HashMap::from_iter([ + ("VAR".into(), "val".into()), + ("OTHER_VAR".into(), "other-val".into()) + ])) + } + ); + assert_eq!(&PathBuf::from(root), paths::home_dir()); + assert!(login.is_none()); +} + pub async fn init_test( server_fs: &Arc, cx: &mut TestAppContext, diff --git a/crates/remote_server/src/unix.rs b/crates/remote_server/src/unix.rs index d6b730e6d63ea990e695f71a38028dfcc9f8600f..cb09b91fc72404032b1f9c6334b35e24bf3d610d 100644 --- a/crates/remote_server/src/unix.rs +++ b/crates/remote_server/src/unix.rs @@ -349,6 +349,7 @@ pub fn execute_run( .spawn(crashes::init(crashes::InitCrashHandler { session_id: id, zed_version: VERSION.to_owned(), + binary: "zed-remote-server".to_string(), release_channel: release_channel::RELEASE_CHANNEL_NAME.clone(), commit_sha: option_env!("ZED_COMMIT_SHA").unwrap_or("no_sha").to_owned(), })) @@ -388,6 +389,8 @@ pub fn execute_run( extension::init(cx); let extension_host_proxy = ExtensionHostProxy::global(cx); + json_schema_store::init(cx); + let project = cx.new(|cx| { let fs = Arc::new(RealFs::new(None, cx.background_executor().clone())); let node_settings_rx = initialize_settings(session.clone(), fs.clone(), cx); @@ -541,38 +544,43 @@ pub(crate) fn execute_proxy( smol::spawn(crashes::init(crashes::InitCrashHandler { session_id: id, zed_version: VERSION.to_owned(), + binary: "zed-remote-server".to_string(), release_channel: release_channel::RELEASE_CHANNEL_NAME.clone(), commit_sha: option_env!("ZED_COMMIT_SHA").unwrap_or("no_sha").to_owned(), })) .detach(); log::info!("starting proxy process. PID: {}", std::process::id()); + smol::block_on(async { + let server_pid = check_pid_file(&server_paths.pid_file) + .await + .map_err(|source| ExecuteProxyError::CheckPidFile { + source, + path: server_paths.pid_file.clone(), + })?; + let server_running = server_pid.is_some(); + if is_reconnecting { + if !server_running { + log::error!("attempted to reconnect, but no server running"); + return Err(ExecuteProxyError::ServerNotRunning( + ProxyLaunchError::ServerNotRunning, + )); + } + } else { + if let Some(pid) = server_pid { + log::info!( + "proxy found server already running with PID {}. Killing process and cleaning up files...", + pid + ); + kill_running_server(pid, &server_paths).await?; + } - let server_pid = check_pid_file(&server_paths.pid_file).map_err(|source| { - ExecuteProxyError::CheckPidFile { - source, - path: server_paths.pid_file.clone(), - } + spawn_server(&server_paths) + .await + .map_err(ExecuteProxyError::SpawnServer)?; + }; + Ok(()) })?; - let server_running = server_pid.is_some(); - if is_reconnecting { - if !server_running { - log::error!("attempted to reconnect, but no server running"); - return Err(ExecuteProxyError::ServerNotRunning( - ProxyLaunchError::ServerNotRunning, - )); - } - } else { - if let Some(pid) = server_pid { - log::info!( - "proxy found server already running with PID {}. Killing process and cleaning up files...", - pid - ); - kill_running_server(pid, &server_paths)?; - } - - spawn_server(&server_paths).map_err(ExecuteProxyError::SpawnServer)?; - }; let stdin_task = smol::spawn(async move { let stdin = Async::new(std::io::stdin())?; @@ -626,11 +634,12 @@ pub(crate) fn execute_proxy( Ok(()) } -fn kill_running_server(pid: u32, paths: &ServerPaths) -> Result<(), ExecuteProxyError> { +async fn kill_running_server(pid: u32, paths: &ServerPaths) -> Result<(), ExecuteProxyError> { log::info!("killing existing server with PID {}", pid); - std::process::Command::new("kill") + smol::process::Command::new("kill") .arg(pid.to_string()) .output() + .await .map_err(|source| ExecuteProxyError::KillRunningServer { source, pid })?; for file in [ @@ -666,7 +675,7 @@ pub(crate) enum SpawnServerError { LaunchStatus { status: ExitStatus, paths: String }, } -fn spawn_server(paths: &ServerPaths) -> Result<(), SpawnServerError> { +async fn spawn_server(paths: &ServerPaths) -> Result<(), SpawnServerError> { if paths.stdin_socket.exists() { std::fs::remove_file(&paths.stdin_socket).map_err(SpawnServerError::RemoveStdinSocket)?; } @@ -678,7 +687,7 @@ fn spawn_server(paths: &ServerPaths) -> Result<(), SpawnServerError> { } let binary_name = std::env::current_exe().map_err(SpawnServerError::CurrentExe)?; - let mut server_process = std::process::Command::new(binary_name); + let mut server_process = smol::process::Command::new(binary_name); server_process .arg("run") .arg("--log-file") @@ -694,6 +703,7 @@ fn spawn_server(paths: &ServerPaths) -> Result<(), SpawnServerError> { let status = server_process .status() + .await .map_err(SpawnServerError::ProcessStatus)?; if !status.success() { @@ -733,7 +743,7 @@ pub(crate) struct CheckPidError { pid: u32, } -fn check_pid_file(path: &Path) -> Result, CheckPidError> { +async fn check_pid_file(path: &Path) -> Result, CheckPidError> { let Some(pid) = std::fs::read_to_string(&path) .ok() .and_then(|contents| contents.parse::().ok()) @@ -742,10 +752,11 @@ fn check_pid_file(path: &Path) -> Result, CheckPidError> { }; log::debug!("Checking if process with PID {} exists...", pid); - match std::process::Command::new("kill") + match smol::process::Command::new("kill") .arg("-0") .arg(pid.to_string()) .output() + .await { Ok(output) if output.status.success() => { log::debug!( @@ -953,7 +964,7 @@ fn cleanup_old_binaries() -> Result<()> { let release_channel = release_channel::RELEASE_CHANNEL.dev_name(); let prefix = format!("zed-remote-server-{}-", release_channel); - for entry in std::fs::read_dir(server_dir)? { + for entry in std::fs::read_dir(server_dir.as_std_path())? { let path = entry?.path(); if let Some(file_name) = path.file_name() diff --git a/crates/repl/Cargo.toml b/crates/repl/Cargo.toml index 5821bc6297266cffba19234d82efec3f6190c310..6386dc330af8fd1eb46380cb39c71f4adffea1e6 100644 --- a/crates/repl/Cargo.toml +++ b/crates/repl/Cargo.toml @@ -38,7 +38,6 @@ multi_buffer.workspace = true nbformat.workspace = true project.workspace = true runtimelib.workspace = true -schemars.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true diff --git a/crates/repl/src/jupyter_settings.rs b/crates/repl/src/jupyter_settings.rs index c89736a03dc6d77dd89bb33c4990b25149189a41..9b3dc014f21443cc6112a864badc3a8d36ac90ed 100644 --- a/crates/repl/src/jupyter_settings.rs +++ b/crates/repl/src/jupyter_settings.rs @@ -1,10 +1,8 @@ -use std::collections::HashMap; +use collections::HashMap; use editor::EditorSettings; use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::Settings; #[derive(Debug, Default)] pub struct JupyterSettings { @@ -20,45 +18,11 @@ impl JupyterSettings { } } -#[derive(Clone, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[settings_key(key = "jupyter")] -pub struct JupyterSettingsContent { - /// Default kernels to select for each language. - /// - /// Default: `{}` - pub kernel_selections: Option>, -} - -impl Default for JupyterSettingsContent { - fn default() -> Self { - JupyterSettingsContent { - kernel_selections: Some(HashMap::new()), - } - } -} - impl Settings for JupyterSettings { - type FileContent = JupyterSettingsContent; - - fn load( - sources: SettingsSources, - _cx: &mut gpui::App, - ) -> anyhow::Result - where - Self: Sized, - { - let mut settings = JupyterSettings::default(); - - for value in sources.defaults_and_customizations() { - if let Some(source) = &value.kernel_selections { - for (k, v) in source { - settings.kernel_selections.insert(k.clone(), v.clone()); - } - } + fn from_settings(content: &settings::SettingsContent) -> Self { + let jupyter = content.editor.jupyter.clone().unwrap(); + Self { + kernel_selections: jupyter.kernel_selections.unwrap_or_default(), } - - Ok(settings) } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } diff --git a/crates/repl/src/kernels/mod.rs b/crates/repl/src/kernels/mod.rs index fb16cb1ea3b093b0592cb114a1224dc4858630fe..a99c80230a4ec468ac6505346b4c0d017e7576d7 100644 --- a/crates/repl/src/kernels/mod.rs +++ b/crates/repl/src/kernels/mod.rs @@ -1,5 +1,5 @@ mod native_kernel; -use std::{fmt::Debug, future::Future, path::PathBuf, sync::Arc}; +use std::{fmt::Debug, future::Future, path::PathBuf}; use futures::{ channel::mpsc::{self, Receiver}, @@ -18,6 +18,7 @@ use anyhow::Result; use jupyter_protocol::JupyterKernelspec; use runtimelib::{ExecutionState, JupyterMessage, KernelInfoReply}; use ui::{Icon, IconName, SharedString}; +use util::rel_path::RelPath; pub type JupyterMessageChannel = stream::SelectAll>; @@ -47,8 +48,8 @@ impl KernelSpecification { pub fn path(&self) -> SharedString { SharedString::from(match self { - Self::Jupyter(spec) => spec.path.to_string_lossy().to_string(), - Self::PythonEnv(spec) => spec.path.to_string_lossy().to_string(), + Self::Jupyter(spec) => spec.path.to_string_lossy().into_owned(), + Self::PythonEnv(spec) => spec.path.to_string_lossy().into_owned(), Self::Remote(spec) => spec.url.to_string(), }) } @@ -84,7 +85,7 @@ pub fn python_env_kernel_specifications( let toolchains = project.read(cx).available_toolchains( ProjectPath { worktree_id, - path: Arc::from("".as_ref()), + path: RelPath::empty().into(), }, python_language, cx, diff --git a/crates/repl/src/kernels/native_kernel.rs b/crates/repl/src/kernels/native_kernel.rs index 83271fae16fd2d22f37fd03d86dae277070e20eb..cf88fbc582296e1d61ea729a642a7e8ec8e290df 100644 --- a/crates/repl/src/kernels/native_kernel.rs +++ b/crates/repl/src/kernels/native_kernel.rs @@ -371,7 +371,7 @@ async fn read_kernelspec_at( ) -> Result { let path = kernel_dir; let kernel_name = if let Some(kernel_name) = path.file_name() { - kernel_name.to_string_lossy().to_string() + kernel_name.to_string_lossy().into_owned() } else { anyhow::bail!("Invalid kernelspec directory: {path:?}"); }; diff --git a/crates/repl/src/notebook/notebook_ui.rs b/crates/repl/src/notebook/notebook_ui.rs index 081c474cdad86a5340520ef09345bd456f55b5ba..20b2bc62e001cc565495924ffa80cbe466abe649 100644 --- a/crates/repl/src/notebook/notebook_ui.rs +++ b/crates/repl/src/notebook/notebook_ui.rs @@ -724,10 +724,6 @@ impl Item for NotebookEditor { f(self.notebook_item.entity_id(), self.notebook_item.read(cx)) } - fn is_singleton(&self, _cx: &App) -> bool { - true - } - fn tab_content(&self, params: TabContentParams, window: &Window, cx: &App) -> AnyElement { Label::new(self.tab_content_text(params.detail.unwrap_or(0), cx)) .single_line() diff --git a/crates/repl/src/outputs/image.rs b/crates/repl/src/outputs/image.rs index 8db38826be7fae3555f718ce91c70b60cc70b1a7..0cabbbbae4715181a76b3730bf492b481d0a6e1b 100644 --- a/crates/repl/src/outputs/image.rs +++ b/crates/repl/src/outputs/image.rs @@ -3,7 +3,7 @@ use base64::{ Engine as _, alphabet, engine::{DecodePaddingMode, GeneralPurpose, GeneralPurposeConfig}, }; -use gpui::{App, ClipboardItem, Image, ImageFormat, Pixels, RenderImage, Window, img}; +use gpui::{App, ClipboardItem, Image, ImageFormat, RenderImage, Window, img}; use std::sync::Arc; use ui::{IntoElement, Styled, div, prelude::*}; @@ -72,17 +72,17 @@ impl Render for ImageView { fn render(&mut self, window: &mut Window, _: &mut Context) -> impl IntoElement { let line_height = window.line_height(); - let (height, width) = if self.height as f32 / line_height.0 == u8::MAX as f32 { - let height = u8::MAX as f32 * line_height.0; + let (height, width) = if self.height as f32 / f32::from(line_height) == u8::MAX as f32 { + let height = u8::MAX as f32 * line_height; let width = self.width as f32 * height / self.height as f32; (height, width) } else { - (self.height as f32, self.width as f32) + (self.height.into(), self.width.into()) }; let image = self.image.clone(); - div().h(Pixels(height)).w(Pixels(width)).child(img(image)) + div().h(height).w(width).child(img(image)) } } diff --git a/crates/repl/src/outputs/plain.rs b/crates/repl/src/outputs/plain.rs index 268224fda35d6db78135f0b0154966159570dc4c..f58cf6bd3f9574c79a978b650287ca8ace40092b 100644 --- a/crates/repl/src/outputs/plain.rs +++ b/crates/repl/src/outputs/plain.rs @@ -31,6 +31,7 @@ use theme::ThemeSettings; use ui::{IntoElement, prelude::*}; use crate::outputs::OutputContent; +use crate::repl_settings::ReplSettings; /// The `TerminalOutput` struct handles the parsing and rendering of text input, /// simulating a basic terminal environment within REPL output. @@ -53,9 +54,6 @@ pub struct TerminalOutput { handler: alacritty_terminal::Term, } -const DEFAULT_NUM_LINES: usize = 32; -const DEFAULT_NUM_COLUMNS: usize = 128; - /// Returns the default text style for the terminal output. pub fn text_style(window: &mut Window, cx: &mut App) -> TextStyle { let settings = ThemeSettings::get_global(cx).clone(); @@ -99,8 +97,8 @@ pub fn terminal_size(window: &mut Window, cx: &mut App) -> terminal::TerminalBou .unwrap() .width; - let num_lines = DEFAULT_NUM_LINES; - let columns = DEFAULT_NUM_COLUMNS; + let num_lines = ReplSettings::get_global(cx).max_lines; + let columns = ReplSettings::get_global(cx).max_columns; // Reversed math from terminal::TerminalSize to get pixel width according to terminal width let width = columns as f32 * cell_width; @@ -233,8 +231,7 @@ impl TerminalOutput { } } - // Trim any trailing newlines - full_text.trim_end().to_string() + full_text } } @@ -276,7 +273,7 @@ impl Render for TerminalOutput { let cell_width = text_system .advance(font_id, font_pixels, 'w') .map(|advance| advance.width) - .unwrap_or(Pixels(0.0)); + .unwrap_or(Pixels::ZERO); canvas( // prepaint diff --git a/crates/repl/src/repl.rs b/crates/repl/src/repl.rs index 7c17b5fac2a3aa9107a44543416f6210dcaa80c7..f6005f1ed73ac07697af48297643b30be113c83c 100644 --- a/crates/repl/src/repl.rs +++ b/crates/repl/src/repl.rs @@ -5,6 +5,7 @@ pub mod notebook; mod outputs; mod repl_editor; mod repl_sessions_ui; +mod repl_settings; mod repl_store; mod session; @@ -22,6 +23,7 @@ pub use crate::repl_editor::*; pub use crate::repl_sessions_ui::{ ClearOutputs, Interrupt, ReplSessionsPage, Restart, Run, Sessions, Shutdown, }; +pub use crate::repl_settings::ReplSettings; use crate::repl_store::ReplStore; pub use crate::session::Session; @@ -31,6 +33,7 @@ pub fn init(fs: Arc, cx: &mut App) { set_dispatcher(zed_dispatcher(cx)); JupyterSettings::register(cx); ::editor::init_settings(cx); + ReplSettings::register(cx); repl_sessions_ui::init(cx); ReplStore::init(fs, cx); } diff --git a/crates/repl/src/repl_sessions_ui.rs b/crates/repl/src/repl_sessions_ui.rs index 493b8aa950fb6fe9750fbc31c29d237b26d11d72..36936641b050012968ec4ac586c540c2567db350 100644 --- a/crates/repl/src/repl_sessions_ui.rs +++ b/crates/repl/src/repl_sessions_ui.rs @@ -6,7 +6,6 @@ use gpui::{ use project::ProjectItem as _; use ui::{ButtonLike, ElevationIndex, KeyBinding, prelude::*}; use util::ResultExt as _; -use workspace::WorkspaceId; use workspace::item::ItemEvent; use workspace::{Workspace, item::Item}; @@ -192,15 +191,6 @@ impl Item for ReplSessionsPage { false } - fn clone_on_split( - &self, - _workspace_id: Option, - _window: &mut Window, - _: &mut Context, - ) -> Option> { - None - } - fn to_item_events(event: &Self::Event, mut f: impl FnMut(workspace::item::ItemEvent)) { f(*event) } diff --git a/crates/repl/src/repl_settings.rs b/crates/repl/src/repl_settings.rs new file mode 100644 index 0000000000000000000000000000000000000000..1cd96ca47705e90c56fb1b3e25e41eb8edce0c87 --- /dev/null +++ b/crates/repl/src/repl_settings.rs @@ -0,0 +1,27 @@ +use settings::Settings; + +/// Settings for configuring REPL display and behavior. +#[derive(Clone, Debug)] +pub struct ReplSettings { + /// Maximum number of lines to keep in REPL's scrollback buffer. + /// Clamped with [4, 256] range. + /// + /// Default: 32 + pub max_lines: usize, + /// Maximum number of columns to keep in REPL's scrollback buffer. + /// Clamped with [20, 512] range. + /// + /// Default: 128 + pub max_columns: usize, +} + +impl Settings for ReplSettings { + fn from_settings(content: &settings::SettingsContent) -> Self { + let repl = content.repl.as_ref().unwrap(); + + Self { + max_lines: repl.max_lines.unwrap(), + max_columns: repl.max_columns.unwrap(), + } + } +} diff --git a/crates/rope/benches/rope_benchmark.rs b/crates/rope/benches/rope_benchmark.rs index cb741fc78481e7d03a7c18dbf0d8919359b06436..bf891a4f837c3e63975aea1233b15c913758c175 100644 --- a/crates/rope/benches/rope_benchmark.rs +++ b/crates/rope/benches/rope_benchmark.rs @@ -144,7 +144,7 @@ fn rope_benchmarks(c: &mut Criterion) { group.bench_with_input(BenchmarkId::from_parameter(size), &size, |b, &size| { let rope = generate_random_rope(rng.clone(), *size); - b.iter_with_large_drop(|| { + b.iter(|| { let chars = rope.chars().count(); assert!(chars > 0); }); @@ -190,6 +190,34 @@ fn rope_benchmarks(c: &mut Criterion) { }); } group.finish(); + + let mut group = c.benchmark_group("cursor"); + for size in sizes.iter() { + group.throughput(Throughput::Bytes(*size as u64)); + group.bench_with_input(BenchmarkId::from_parameter(size), &size, |b, &size| { + let rope = generate_random_rope(rng.clone(), *size); + + b.iter_batched( + || { + let mut rng = rng.clone(); + let num_points = rope.len() / 10; + + let mut points = Vec::new(); + for _ in 0..num_points { + points.push(rng.random_range(0..rope.len())); + } + points + }, + |offsets| { + for offset in offsets.iter() { + black_box(rope.cursor(*offset)); + } + }, + BatchSize::SmallInput, + ); + }); + } + group.finish(); } criterion_group!(benches, rope_benchmarks); diff --git a/crates/rope/src/chunk.rs b/crates/rope/src/chunk.rs index 6b1f290852bb7918d562a9c9110433ffeaf2fed9..91e61a517144f5b2408902173a8c34ccb865e9d5 100644 --- a/crates/rope/src/chunk.rs +++ b/crates/rope/src/chunk.rs @@ -10,9 +10,19 @@ pub(crate) const MAX_BASE: usize = MIN_BASE * 2; #[derive(Clone, Debug, Default)] pub struct Chunk { + /// If bit[i] is set, then the character at index i is the start of a UTF-8 character in the + /// text. chars: u128, + /// The number of set bits is the number of UTF-16 code units it would take to represent the + /// text. + /// + /// Bit[i] is set if text[i] is the start of a UTF-8 character. If the character would + /// take two UTF-16 code units, then bit[i+1] is also set. (Rust chars never take more + /// than two UTF-16 code units.) chars_utf16: u128, + /// If bit[i] is set, then the character at index i is an ascii newline. newlines: u128, + /// If bit[i] is set, then the character at index i is an ascii tab. pub tabs: u128, pub text: ArrayString, } @@ -144,6 +154,12 @@ impl<'a> ChunkSlice<'a> { let mask = if range.end == MAX_BASE { u128::MAX } else { + debug_assert!( + self.is_char_boundary(range.end), + "Invalid range end {} in {:?}", + range.end, + self + ); (1u128 << range.end) - 1 }; if range.start == MAX_BASE { @@ -155,6 +171,12 @@ impl<'a> ChunkSlice<'a> { text: "", } } else { + debug_assert!( + self.is_char_boundary(range.start), + "Invalid range start {} in {:?}", + range.start, + self + ); Self { chars: (self.chars & mask) >> range.start, chars_utf16: (self.chars_utf16 & mask) >> range.start, @@ -617,19 +639,17 @@ mod tests { #[gpui::test(iterations = 100)] fn test_random_chunks(mut rng: StdRng) { - let chunk_len = rng.random_range(0..=MAX_BASE); - let text = RandomCharIter::new(&mut rng) - .take(chunk_len) - .collect::(); - let mut ix = chunk_len; - while !text.is_char_boundary(ix) { - ix -= 1; - } - let text = &text[..ix]; - + let text = random_string_with_utf8_len(&mut rng, MAX_BASE); log::info!("Chunk: {:?}", text); - let chunk = Chunk::new(text); - verify_chunk(chunk.as_slice(), text); + let chunk = Chunk::new(&text); + verify_chunk(chunk.as_slice(), &text); + + // Verify Chunk::chars() bitmap + let expected_chars = char_offsets(&text) + .into_iter() + .inspect(|i| assert!(*i < 128)) + .fold(0u128, |acc, i| acc | (1 << i)); + assert_eq!(chunk.chars(), expected_chars); for _ in 0..10 { let mut start = rng.random_range(0..=chunk.text.len()); @@ -648,6 +668,20 @@ mod tests { } } + #[gpui::test(iterations = 100)] + fn test_split_chunk_slice(mut rng: StdRng) { + let text = &random_string_with_utf8_len(&mut rng, MAX_BASE); + let chunk = Chunk::new(text); + let offset = char_offsets_with_end(text) + .into_iter() + .choose(&mut rng) + .unwrap(); + let (a, b) = chunk.as_slice().split_at(offset); + let (a_str, b_str) = text.split_at(offset); + verify_chunk(a, a_str); + verify_chunk(b, b_str); + } + #[gpui::test(iterations = 1000)] fn test_nth_set_bit_random(mut rng: StdRng) { let set_count = rng.random_range(0..=128); @@ -670,6 +704,51 @@ mod tests { } } + /// Returns a (biased) random string whose UTF-8 length is no more than `len`. + fn random_string_with_utf8_len(rng: &mut StdRng, len: usize) -> String { + let mut str = String::new(); + let mut chars = RandomCharIter::new(rng); + loop { + let ch = chars.next().unwrap(); + if str.len() + ch.len_utf8() > len { + break; + } + str.push(ch); + } + str + } + + #[gpui::test(iterations = 1000)] + fn test_append_random_strings(mut rng: StdRng) { + let len1 = rng.random_range(0..=MAX_BASE); + let len2 = rng.random_range(0..=MAX_BASE).saturating_sub(len1); + let str1 = random_string_with_utf8_len(&mut rng, len1); + let str2 = random_string_with_utf8_len(&mut rng, len2); + let mut chunk1 = Chunk::new(&str1); + let chunk2 = Chunk::new(&str2); + let char_offsets = char_offsets_with_end(&str2); + let start_index = rng.random_range(0..char_offsets.len()); + let start_offset = char_offsets[start_index]; + let end_offset = char_offsets[rng.random_range(start_index..char_offsets.len())]; + chunk1.append(chunk2.slice(start_offset..end_offset)); + verify_chunk(chunk1.as_slice(), &(str1 + &str2[start_offset..end_offset])); + } + + /// Return the byte offsets for each character in a string. + /// + /// These are valid offsets to split the string. + fn char_offsets(text: &str) -> Vec { + text.char_indices().map(|(i, _c)| i).collect() + } + + /// Return the byte offsets for each character in a string, plus the offset + /// past the end of the string. + fn char_offsets_with_end(text: &str) -> Vec { + let mut v = char_offsets(text); + v.push(text.len()); + v + } + fn verify_chunk(chunk: ChunkSlice<'_>, text: &str) { let mut offset = 0; let mut offset_utf16 = OffsetUtf16(0); diff --git a/crates/rope/src/rope.rs b/crates/rope/src/rope.rs index 8bcaef20ca3bd5c79413791764a313fd1e6b75ac..c349f3f4513ae0f229ac866cfae36c63734a5c22 100644 --- a/crates/rope/src/rope.rs +++ b/crates/rope/src/rope.rs @@ -30,6 +30,76 @@ impl Rope { Self::default() } + pub fn is_char_boundary(&self, offset: usize) -> bool { + if self.chunks.is_empty() { + return offset == 0; + } + let mut cursor = self.chunks.cursor::(()); + cursor.seek(&offset, Bias::Left); + let chunk_offset = offset - cursor.start(); + cursor + .item() + .map(|chunk| chunk.text.is_char_boundary(chunk_offset)) + .unwrap_or(false) + } + + pub fn floor_char_boundary(&self, index: usize) -> usize { + if index >= self.len() { + self.len() + } else { + #[inline] + pub(crate) const fn is_utf8_char_boundary(u8: u8) -> bool { + // This is bit magic equivalent to: b < 128 || b >= 192 + (u8 as i8) >= -0x40 + } + + let mut cursor = self.chunks.cursor::(()); + cursor.seek(&index, Bias::Left); + let chunk_offset = index - cursor.start(); + let lower_idx = cursor.item().map(|chunk| { + let lower_bound = chunk_offset.saturating_sub(3); + chunk + .text + .as_bytes() + .get(lower_bound..=chunk_offset) + .map(|it| { + let new_idx = it + .iter() + .rposition(|&b| is_utf8_char_boundary(b)) + .unwrap_or(0); + lower_bound + new_idx + }) + .unwrap_or(chunk.text.len()) + }); + lower_idx.map_or_else(|| self.len(), |idx| cursor.start() + idx) + } + } + + pub fn ceil_char_boundary(&self, index: usize) -> usize { + if index > self.len() { + self.len() + } else { + #[inline] + pub(crate) const fn is_utf8_char_boundary(u8: u8) -> bool { + // This is bit magic equivalent to: b < 128 || b >= 192 + (u8 as i8) >= -0x40 + } + + let mut cursor = self.chunks.cursor::(()); + cursor.seek(&index, Bias::Left); + let chunk_offset = index - cursor.start(); + let upper_idx = cursor.item().map(|chunk| { + let upper_bound = Ord::min(chunk_offset + 4, chunk.text.len()); + chunk.text.as_bytes()[chunk_offset..upper_bound] + .iter() + .position(|&b| is_utf8_char_boundary(b)) + .map_or(upper_bound, |pos| pos + chunk_offset) + }); + + upper_idx.map_or_else(|| self.len(), |idx| cursor.start() + idx) + } + } + pub fn append(&mut self, rope: Rope) { if let Some(chunk) = rope.chunks.first() && (self @@ -40,15 +110,13 @@ impl Rope { { self.push_chunk(chunk.as_slice()); - let mut chunks = rope.chunks.cursor::<()>(&()); + let mut chunks = rope.chunks.cursor::<()>(()); chunks.next(); chunks.next(); - self.chunks.append(chunks.suffix(), &()); - self.check_invariants(); - return; + self.chunks.append(chunks.suffix(), ()); + } else { + self.chunks.append(rope.chunks, ()); } - - self.chunks.append(rope.chunks.clone(), &()); self.check_invariants(); } @@ -95,7 +163,7 @@ impl Rope { last_chunk.push_str(suffix); text = remainder; }, - &(), + (), ); if text.len() > 2048 { @@ -120,10 +188,10 @@ impl Rope { if new_chunks.len() >= PARALLEL_THRESHOLD { self.chunks - .par_extend(new_chunks.into_vec().into_par_iter().map(Chunk::new), &()); + .par_extend(new_chunks.into_vec().into_par_iter().map(Chunk::new), ()); } else { self.chunks - .extend(new_chunks.into_iter().map(Chunk::new), &()); + .extend(new_chunks.into_iter().map(Chunk::new), ()); } self.check_invariants(); @@ -164,10 +232,10 @@ impl Rope { if new_chunks.len() >= PARALLEL_THRESHOLD { self.chunks - .par_extend(new_chunks.into_par_iter().map(Chunk::new), &()); + .par_extend(new_chunks.into_par_iter().map(Chunk::new), ()); } else { self.chunks - .extend(new_chunks.into_iter().map(Chunk::new), &()); + .extend(new_chunks.into_iter().map(Chunk::new), ()); } self.check_invariants(); @@ -193,11 +261,11 @@ impl Rope { last_chunk.append(suffix); chunk = remainder; }, - &(), + (), ); if !chunk.is_empty() { - self.chunks.push(chunk.into(), &()); + self.chunks.push(chunk.into(), ()); } } @@ -211,7 +279,7 @@ impl Rope { { // Ensure all chunks except maybe the last one are not underflowing. // Allow some wiggle room for multibyte characters at chunk boundaries. - let mut chunks = self.chunks.cursor::<()>(&()).peekable(); + let mut chunks = self.chunks.cursor::<()>(()).peekable(); while let Some(chunk) = chunks.next() { if chunks.peek().is_some() { assert!(chunk.text.len() + 3 >= chunk::MIN_BASE); @@ -225,7 +293,7 @@ impl Rope { } pub fn len(&self) -> usize { - self.chunks.extent(&()) + self.chunks.extent(()) } pub fn is_empty(&self) -> bool { @@ -233,11 +301,11 @@ impl Rope { } pub fn max_point(&self) -> Point { - self.chunks.extent(&()) + self.chunks.extent(()) } pub fn max_point_utf16(&self) -> PointUtf16 { - self.chunks.extent(&()) + self.chunks.extent(()) } pub fn cursor(&self, offset: usize) -> Cursor<'_> { @@ -281,7 +349,7 @@ impl Rope { if offset >= self.summary().len { return self.summary().len_utf16; } - let mut cursor = self.chunks.cursor::>(&()); + let mut cursor = self.chunks.cursor::>(()); cursor.seek(&offset, Bias::Left); let overshoot = offset - cursor.start().0; cursor.start().1 @@ -294,7 +362,7 @@ impl Rope { if offset >= self.summary().len_utf16 { return self.summary().len; } - let mut cursor = self.chunks.cursor::>(&()); + let mut cursor = self.chunks.cursor::>(()); cursor.seek(&offset, Bias::Left); let overshoot = offset - cursor.start().0; cursor.start().1 @@ -307,7 +375,7 @@ impl Rope { if offset >= self.summary().len { return self.summary().lines; } - let mut cursor = self.chunks.cursor::>(&()); + let mut cursor = self.chunks.cursor::>(()); cursor.seek(&offset, Bias::Left); let overshoot = offset - cursor.start().0; cursor.start().1 @@ -320,7 +388,7 @@ impl Rope { if offset >= self.summary().len { return self.summary().lines_utf16(); } - let mut cursor = self.chunks.cursor::>(&()); + let mut cursor = self.chunks.cursor::>(()); cursor.seek(&offset, Bias::Left); let overshoot = offset - cursor.start().0; cursor.start().1 @@ -333,7 +401,7 @@ impl Rope { if point >= self.summary().lines { return self.summary().lines_utf16(); } - let mut cursor = self.chunks.cursor::>(&()); + let mut cursor = self.chunks.cursor::>(()); cursor.seek(&point, Bias::Left); let overshoot = point - cursor.start().0; cursor.start().1 @@ -346,7 +414,7 @@ impl Rope { if point >= self.summary().lines { return self.summary().len; } - let mut cursor = self.chunks.cursor::>(&()); + let mut cursor = self.chunks.cursor::>(()); cursor.seek(&point, Bias::Left); let overshoot = point - cursor.start().0; cursor.start().1 @@ -367,7 +435,7 @@ impl Rope { if point >= self.summary().lines_utf16() { return self.summary().len; } - let mut cursor = self.chunks.cursor::>(&()); + let mut cursor = self.chunks.cursor::>(()); cursor.seek(&point, Bias::Left); let overshoot = point - cursor.start().0; cursor.start().1 @@ -380,7 +448,7 @@ impl Rope { if point.0 >= self.summary().lines_utf16() { return self.summary().lines; } - let mut cursor = self.chunks.cursor::>(&()); + let mut cursor = self.chunks.cursor::>(()); cursor.seek(&point.0, Bias::Left); let overshoot = Unclipped(point.0 - cursor.start().0); cursor.start().1 @@ -389,31 +457,15 @@ impl Rope { }) } - pub fn clip_offset(&self, mut offset: usize, bias: Bias) -> usize { - let mut cursor = self.chunks.cursor::(&()); - cursor.seek(&offset, Bias::Left); - if let Some(chunk) = cursor.item() { - let mut ix = offset - cursor.start(); - while !chunk.text.is_char_boundary(ix) { - match bias { - Bias::Left => { - ix -= 1; - offset -= 1; - } - Bias::Right => { - ix += 1; - offset += 1; - } - } - } - offset - } else { - self.summary().len + pub fn clip_offset(&self, offset: usize, bias: Bias) -> usize { + match bias { + Bias::Left => self.floor_char_boundary(offset), + Bias::Right => self.ceil_char_boundary(offset), } } pub fn clip_offset_utf16(&self, offset: OffsetUtf16, bias: Bias) -> OffsetUtf16 { - let mut cursor = self.chunks.cursor::(&()); + let mut cursor = self.chunks.cursor::(()); cursor.seek(&offset, Bias::Right); if let Some(chunk) = cursor.item() { let overshoot = offset - cursor.start(); @@ -424,7 +476,7 @@ impl Rope { } pub fn clip_point(&self, point: Point, bias: Bias) -> Point { - let mut cursor = self.chunks.cursor::(&()); + let mut cursor = self.chunks.cursor::(()); cursor.seek(&point, Bias::Right); if let Some(chunk) = cursor.item() { let overshoot = point - cursor.start(); @@ -435,7 +487,7 @@ impl Rope { } pub fn clip_point_utf16(&self, point: Unclipped, bias: Bias) -> PointUtf16 { - let mut cursor = self.chunks.cursor::(&()); + let mut cursor = self.chunks.cursor::(()); cursor.seek(&point.0, Bias::Right); if let Some(chunk) = cursor.item() { let overshoot = Unclipped(point.0 - cursor.start()); @@ -510,13 +562,13 @@ impl fmt::Debug for Rope { pub struct Cursor<'a> { rope: &'a Rope, - chunks: sum_tree::Cursor<'a, Chunk, usize>, + chunks: sum_tree::Cursor<'a, 'static, Chunk, usize>, offset: usize, } impl<'a> Cursor<'a> { pub fn new(rope: &'a Rope, offset: usize) -> Self { - let mut chunks = rope.chunks.cursor(&()); + let mut chunks = rope.chunks.cursor(()); chunks.seek(&offset, Bias::Right); Self { rope, @@ -565,7 +617,7 @@ impl<'a> Cursor<'a> { pub fn summary(&mut self, end_offset: usize) -> D { debug_assert!(end_offset >= self.offset); - let mut summary = D::zero(&()); + let mut summary = D::zero(()); if let Some(start_chunk) = self.chunks.item() { let start_ix = self.offset - self.chunks.start(); let end_ix = cmp::min(end_offset, self.chunks.end()) - self.chunks.start(); @@ -586,7 +638,7 @@ impl<'a> Cursor<'a> { } pub fn suffix(mut self) -> Rope { - self.slice(self.rope.chunks.extent(&())) + self.slice(self.rope.chunks.extent(())) } pub fn offset(&self) -> usize { @@ -605,7 +657,7 @@ pub struct ChunkBitmaps<'a> { #[derive(Clone)] pub struct Chunks<'a> { - chunks: sum_tree::Cursor<'a, Chunk, usize>, + chunks: sum_tree::Cursor<'a, 'static, Chunk, usize>, range: Range, offset: usize, reversed: bool, @@ -613,7 +665,7 @@ pub struct Chunks<'a> { impl<'a> Chunks<'a> { pub fn new(rope: &'a Rope, range: Range, reversed: bool) -> Self { - let mut chunks = rope.chunks.cursor(&()); + let mut chunks = rope.chunks.cursor(()); let offset = if reversed { chunks.seek(&range.end, Bias::Left); range.end @@ -767,7 +819,7 @@ impl<'a> Chunks<'a> { } /// Returns bitmaps that represent character positions and tab positions - pub fn peak_with_bitmaps(&self) -> Option> { + pub fn peek_with_bitmaps(&self) -> Option> { if !self.offset_is_valid() { return None; } @@ -784,7 +836,10 @@ impl<'a> Chunks<'a> { slice_start..slice_end }; - let bitmask = (1u128 << slice_range.end as u128).saturating_sub(1); + // slice range has a bounds between 0 and 128 in non test builds + // We use a non wrapping sub because we want to overflow in the case where slice_range.end == 128 + // because that represents a full chunk and the bitmask shouldn't remove anything + let bitmask = (1u128.unbounded_shl(slice_range.end as u32)).wrapping_sub(1); let chars = (chunk.chars() & bitmask) >> slice_range.start; let tabs = (chunk.tabs & bitmask) >> slice_range.start; @@ -898,7 +953,7 @@ impl<'a> Iterator for ChunkWithBitmaps<'a> { type Item = ChunkBitmaps<'a>; fn next(&mut self) -> Option { - let chunk_bitmaps = self.0.peak_with_bitmaps()?; + let chunk_bitmaps = self.0.peek_with_bitmaps()?; if self.0.reversed { self.0.offset -= chunk_bitmaps.text.len(); if self.0.offset <= *self.0.chunks.start() { @@ -937,14 +992,14 @@ impl<'a> Iterator for Chunks<'a> { } pub struct Bytes<'a> { - chunks: sum_tree::Cursor<'a, Chunk, usize>, + chunks: sum_tree::Cursor<'a, 'static, Chunk, usize>, range: Range, reversed: bool, } impl<'a> Bytes<'a> { pub fn new(rope: &'a Rope, range: Range, reversed: bool) -> Self { - let mut chunks = rope.chunks.cursor(&()); + let mut chunks = rope.chunks.cursor(()); if reversed { chunks.seek(&range.end, Bias::Left); } else { @@ -1022,7 +1077,7 @@ pub struct Lines<'a> { reversed: bool, } -impl Lines<'_> { +impl<'a> Lines<'a> { pub fn next(&mut self) -> Option<&str> { if self.done { return None; @@ -1087,7 +1142,7 @@ impl Lines<'_> { impl sum_tree::Item for Chunk { type Summary = ChunkSummary; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { ChunkSummary { text: self.as_slice().text_summary(), } @@ -1099,14 +1154,12 @@ pub struct ChunkSummary { text: TextSummary, } -impl sum_tree::Summary for ChunkSummary { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl sum_tree::ContextLessSummary for ChunkSummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &()) { + fn add_summary(&mut self, summary: &Self) { self.text += &summary.text; } } @@ -1216,14 +1269,12 @@ impl<'a> From<&'a str> for TextSummary { } } -impl sum_tree::Summary for TextSummary { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl sum_tree::ContextLessSummary for TextSummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &Self::Context) { + fn add_summary(&mut self, summary: &Self) { *self += summary; } } @@ -1302,11 +1353,11 @@ impl TextDimension for Dimensions sum_tree::Dimension<'a, ChunkSummary> for TextSummary { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ChunkSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ChunkSummary, _: ()) { *self += &summary.text; } } @@ -1326,11 +1377,11 @@ impl TextDimension for TextSummary { } impl<'a> sum_tree::Dimension<'a, ChunkSummary> for usize { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ChunkSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ChunkSummary, _: ()) { *self += summary.text.len; } } @@ -1350,11 +1401,11 @@ impl TextDimension for usize { } impl<'a> sum_tree::Dimension<'a, ChunkSummary> for OffsetUtf16 { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ChunkSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ChunkSummary, _: ()) { *self += summary.text.len_utf16; } } @@ -1374,11 +1425,11 @@ impl TextDimension for OffsetUtf16 { } impl<'a> sum_tree::Dimension<'a, ChunkSummary> for Point { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ChunkSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ChunkSummary, _: ()) { *self += summary.text.lines; } } @@ -1398,11 +1449,11 @@ impl TextDimension for Point { } impl<'a> sum_tree::Dimension<'a, ChunkSummary> for PointUtf16 { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a ChunkSummary, _: &()) { + fn add_summary(&mut self, summary: &'a ChunkSummary, _: ()) { *self += summary.text.lines_utf16(); } } @@ -1490,14 +1541,14 @@ where K: sum_tree::Dimension<'a, ChunkSummary>, V: sum_tree::Dimension<'a, ChunkSummary>, { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Self { key: K::zero(_cx), value: Some(V::zero(_cx)), } } - fn add_summary(&mut self, summary: &'a ChunkSummary, _cx: &()) { + fn add_summary(&mut self, summary: &'a ChunkSummary, _cx: ()) { self.key.add_summary(summary, _cx); if let Some(value) = &mut self.value { value.add_summary(summary, _cx); @@ -2066,6 +2117,103 @@ mod tests { assert!(!rope.reversed_chunks_in_range(0..0).equals_str("foo")); } + #[test] + fn test_is_char_boundary() { + let fixture = "地"; + let rope = Rope::from("地"); + for b in 0..=fixture.len() { + assert_eq!(rope.is_char_boundary(b), fixture.is_char_boundary(b)); + } + let fixture = ""; + let rope = Rope::from(""); + for b in 0..=fixture.len() { + assert_eq!(rope.is_char_boundary(b), fixture.is_char_boundary(b)); + } + let fixture = "🔴🟠🟡🟢🔵🟣⚫️⚪️🟤\n🏳️‍⚧️🏁🏳️‍🌈🏴‍☠️⛳️📬📭🏴🏳️🚩"; + let rope = Rope::from("🔴🟠🟡🟢🔵🟣⚫️⚪️🟤\n🏳️‍⚧️🏁🏳️‍🌈🏴‍☠️⛳️📬📭🏴🏳️🚩"); + for b in 0..=fixture.len() { + assert_eq!(rope.is_char_boundary(b), fixture.is_char_boundary(b)); + } + } + + #[test] + fn test_floor_char_boundary() { + // polyfill of str::floor_char_boundary + fn floor_char_boundary(str: &str, index: usize) -> usize { + if index >= str.len() { + str.len() + } else { + let lower_bound = index.saturating_sub(3); + let new_index = str.as_bytes()[lower_bound..=index] + .iter() + .rposition(|b| (*b as i8) >= -0x40); + + lower_bound + new_index.unwrap() + } + } + + let fixture = "地"; + let rope = Rope::from("地"); + for b in 0..=fixture.len() { + assert_eq!( + rope.floor_char_boundary(b), + floor_char_boundary(&fixture, b) + ); + } + + let fixture = ""; + let rope = Rope::from(""); + for b in 0..=fixture.len() { + assert_eq!( + rope.floor_char_boundary(b), + floor_char_boundary(&fixture, b) + ); + } + + let fixture = "🔴🟠🟡🟢🔵🟣⚫️⚪️🟤\n🏳️‍⚧️🏁🏳️‍🌈🏴‍☠️⛳️📬📭🏴🏳️🚩"; + let rope = Rope::from("🔴🟠🟡🟢🔵🟣⚫️⚪️🟤\n🏳️‍⚧️🏁🏳️‍🌈🏴‍☠️⛳️📬📭🏴🏳️🚩"); + for b in 0..=fixture.len() { + assert_eq!( + rope.floor_char_boundary(b), + floor_char_boundary(&fixture, b) + ); + } + } + + #[test] + fn test_ceil_char_boundary() { + // polyfill of str::ceil_char_boundary + fn ceil_char_boundary(str: &str, index: usize) -> usize { + if index > str.len() { + str.len() + } else { + let upper_bound = Ord::min(index + 4, str.len()); + str.as_bytes()[index..upper_bound] + .iter() + .position(|b| (*b as i8) >= -0x40) + .map_or(upper_bound, |pos| pos + index) + } + } + + let fixture = "地"; + let rope = Rope::from("地"); + for b in 0..=fixture.len() { + assert_eq!(rope.ceil_char_boundary(b), ceil_char_boundary(&fixture, b)); + } + + let fixture = ""; + let rope = Rope::from(""); + for b in 0..=fixture.len() { + assert_eq!(rope.ceil_char_boundary(b), ceil_char_boundary(&fixture, b)); + } + + let fixture = "🔴🟠🟡🟢🔵🟣⚫️⚪️🟤\n🏳️‍⚧️🏁🏳️‍🌈🏴‍☠️⛳️📬📭🏴🏳️🚩"; + let rope = Rope::from("🔴🟠🟡🟢🔵🟣⚫️⚪️🟤\n🏳️‍⚧️🏁🏳️‍🌈🏴‍☠️⛳️📬📭🏴🏳️🚩"); + for b in 0..=fixture.len() { + assert_eq!(rope.ceil_char_boundary(b), ceil_char_boundary(&fixture, b)); + } + } + fn clip_offset(text: &str, mut offset: usize, bias: Bias) -> usize { while !text.is_char_boundary(offset) { match bias { @@ -2079,7 +2227,7 @@ mod tests { impl Rope { fn text(&self) -> String { let mut text = String::new(); - for chunk in self.chunks.cursor::<()>(&()) { + for chunk in self.chunks.cursor::<()>(()) { text.push_str(&chunk.text); } text diff --git a/crates/rope/src/unclipped.rs b/crates/rope/src/unclipped.rs index 051293bfc72ebe22b5e3e9bbabe207d41323543a..abf82504ea8db74cc78bdb55f32406f63125b465 100644 --- a/crates/rope/src/unclipped.rs +++ b/crates/rope/src/unclipped.rs @@ -13,12 +13,12 @@ impl From for Unclipped { impl<'a, T: sum_tree::Dimension<'a, ChunkSummary>> sum_tree::Dimension<'a, ChunkSummary> for Unclipped { - fn zero(_: &()) -> Self { - Self(T::zero(&())) + fn zero(_: ()) -> Self { + Self(T::zero(())) } - fn add_summary(&mut self, summary: &'a ChunkSummary, _: &()) { - self.0.add_summary(summary, &()); + fn add_summary(&mut self, summary: &'a ChunkSummary, _: ()) { + self.0.add_summary(summary, ()); } } diff --git a/crates/rules_library/src/rules_library.rs b/crates/rules_library/src/rules_library.rs index ce1a0fa1e1d4dc5bd9ec47a6e9109b3b48714690..abb0b4e3a1a84cf7ecf40939b33aee19b874bcdf 100644 --- a/crates/rules_library/src/rules_library.rs +++ b/crates/rules_library/src/rules_library.rs @@ -22,8 +22,7 @@ use std::time::Duration; use theme::ThemeSettings; use title_bar::platform_title_bar::PlatformTitleBar; use ui::{ - Context, KeyBinding, ListItem, ListItemSpacing, ParentElement, Render, SharedString, Styled, - Tooltip, Window, div, prelude::*, + Divider, KeyBinding, ListItem, ListItemSpacing, ListSubHeader, Render, Tooltip, prelude::*, }; use util::{ResultExt, TryFutureExt}; use workspace::{Workspace, client_side_decorations}; @@ -136,6 +135,8 @@ pub fn open_rules_library( window_bounds: Some(WindowBounds::Windowed(bounds)), window_background: cx.theme().window_background_appearance(), window_decorations: Some(window_decorations), + window_min_size: Some(size(px(800.), px(600.))), // 4:3 Aspect Ratio + kind: gpui::WindowKind::Floating, ..Default::default() }, |window, cx| { @@ -179,10 +180,16 @@ struct RuleEditor { _subscriptions: Vec, } +enum RulePickerEntry { + Header(SharedString), + Rule(PromptMetadata), + Separator, +} + struct RulePickerDelegate { store: Entity, selected_index: usize, - matches: Vec, + filtered_entries: Vec, } enum RulePickerEvent { @@ -195,10 +202,10 @@ enum RulePickerEvent { impl EventEmitter for Picker {} impl PickerDelegate for RulePickerDelegate { - type ListItem = ListItem; + type ListItem = AnyElement; fn match_count(&self) -> usize { - self.matches.len() + self.filtered_entries.len() } fn no_matches_text(&self, _window: &mut Window, cx: &mut App) -> Option { @@ -215,16 +222,24 @@ impl PickerDelegate for RulePickerDelegate { } fn set_selected_index(&mut self, ix: usize, _: &mut Window, cx: &mut Context>) { - self.selected_index = ix; - if let Some(prompt) = self.matches.get(self.selected_index) { - cx.emit(RulePickerEvent::Selected { - prompt_id: prompt.id, - }); + self.selected_index = ix.min(self.filtered_entries.len().saturating_sub(1)); + + if let Some(RulePickerEntry::Rule(rule)) = self.filtered_entries.get(self.selected_index) { + cx.emit(RulePickerEvent::Selected { prompt_id: rule.id }); + } + + cx.notify(); + } + + fn can_select(&mut self, ix: usize, _: &mut Window, _: &mut Context>) -> bool { + match self.filtered_entries.get(ix) { + Some(RulePickerEntry::Rule(_)) => true, + Some(RulePickerEntry::Header(_)) | Some(RulePickerEntry::Separator) | None => false, } } fn placeholder_text(&self, _window: &mut Window, _cx: &mut App) -> Arc { - "Search...".into() + "Search…".into() } fn update_matches( @@ -235,24 +250,72 @@ impl PickerDelegate for RulePickerDelegate { ) -> Task<()> { let cancellation_flag = Arc::new(AtomicBool::default()); let search = self.store.read(cx).search(query, cancellation_flag, cx); - let prev_prompt_id = self.matches.get(self.selected_index).map(|mat| mat.id); + + let prev_prompt_id = self + .filtered_entries + .get(self.selected_index) + .and_then(|entry| { + if let RulePickerEntry::Rule(rule) = entry { + Some(rule.id) + } else { + None + } + }); + cx.spawn_in(window, async move |this, cx| { - let (matches, selected_index) = cx + let (filtered_entries, selected_index) = cx .background_spawn(async move { let matches = search.await; + let (default_rules, non_default_rules): (Vec<_>, Vec<_>) = + matches.iter().partition(|rule| rule.default); + + let mut filtered_entries = Vec::new(); + + if !default_rules.is_empty() { + filtered_entries.push(RulePickerEntry::Header("Default Rules".into())); + + for rule in default_rules { + filtered_entries.push(RulePickerEntry::Rule(rule.clone())); + } + + filtered_entries.push(RulePickerEntry::Separator); + } + + for rule in non_default_rules { + filtered_entries.push(RulePickerEntry::Rule(rule.clone())); + } + let selected_index = prev_prompt_id .and_then(|prev_prompt_id| { - matches.iter().position(|entry| entry.id == prev_prompt_id) + filtered_entries.iter().position(|entry| { + if let RulePickerEntry::Rule(rule) = entry { + rule.id == prev_prompt_id + } else { + false + } + }) }) - .unwrap_or(0); - (matches, selected_index) + .unwrap_or_else(|| { + filtered_entries + .iter() + .position(|entry| matches!(entry, RulePickerEntry::Rule(_))) + .unwrap_or(0) + }); + + (filtered_entries, selected_index) }) .await; this.update_in(cx, |this, window, cx| { - this.delegate.matches = matches; - this.delegate.set_selected_index(selected_index, window, cx); + this.delegate.filtered_entries = filtered_entries; + this.set_selected_index( + selected_index, + Some(picker::Direction::Down), + true, + window, + cx, + ); cx.notify(); }) .ok(); @@ -260,10 +323,8 @@ impl PickerDelegate for RulePickerDelegate { } fn confirm(&mut self, _secondary: bool, _: &mut Window, cx: &mut Context>) { - if let Some(prompt) = self.matches.get(self.selected_index) { - cx.emit(RulePickerEvent::Confirmed { - prompt_id: prompt.id, - }); + if let Some(RulePickerEntry::Rule(rule)) = self.filtered_entries.get(self.selected_index) { + cx.emit(RulePickerEvent::Confirmed { prompt_id: rule.id }); } } @@ -276,84 +337,115 @@ impl PickerDelegate for RulePickerDelegate { _: &mut Window, cx: &mut Context>, ) -> Option { - let rule = self.matches.get(ix)?; - let default = rule.default; - let prompt_id = rule.id; - - let element = ListItem::new(ix) - .inset(true) - .spacing(ListItemSpacing::Sparse) - .toggle_state(selected) - .child( - h_flex() - .h_5() - .line_height(relative(1.)) - .child(Label::new(rule.title.clone().unwrap_or("Untitled".into()))), - ) - .end_slot::(default.then(|| { - IconButton::new("toggle-default-rule", IconName::StarFilled) - .toggle_state(true) - .icon_color(Color::Accent) - .icon_size(IconSize::Small) - .tooltip(Tooltip::text("Remove from Default Rules")) - .on_click(cx.listener(move |_, _, _, cx| { - cx.emit(RulePickerEvent::ToggledDefault { prompt_id }) - })) - })) - .end_hover_slot( - h_flex() - .gap_1() - .child(if prompt_id.is_built_in() { - div() - .id("built-in-rule") - .child(Icon::new(IconName::FileLock).color(Color::Muted)) - .tooltip(move |window, cx| { - Tooltip::with_meta( - "Built-in rule", - None, - BUILT_IN_TOOLTIP_TEXT, - window, - cx, - ) - }) - .into_any() - } else { - IconButton::new("delete-rule", IconName::Trash) - .icon_color(Color::Muted) - .icon_size(IconSize::Small) - .tooltip(Tooltip::text("Delete Rule")) - .on_click(cx.listener(move |_, _, _, cx| { - cx.emit(RulePickerEvent::Deleted { prompt_id }) - })) - .into_any_element() - }) - .child( - IconButton::new("toggle-default-rule", IconName::Star) - .toggle_state(default) - .selected_icon(IconName::StarFilled) - .icon_color(if default { Color::Accent } else { Color::Muted }) + match self.filtered_entries.get(ix)? { + RulePickerEntry::Header(title) => Some( + ListSubHeader::new(title.clone()) + .end_slot( + IconButton::new("info", IconName::Info) + .style(ButtonStyle::Transparent) .icon_size(IconSize::Small) - .map(|this| { - if default { - this.tooltip(Tooltip::text("Remove from Default Rules")) + .icon_color(Color::Muted) + .tooltip(Tooltip::text( + "Default Rules are attached by default with every new thread.", + )) + .into_any_element(), + ) + .inset(true) + .into_any_element(), + ), + RulePickerEntry::Separator => Some( + h_flex() + .py_1() + .child(Divider::horizontal()) + .into_any_element(), + ), + RulePickerEntry::Rule(rule) => { + let default = rule.default; + let prompt_id = rule.id; + + Some( + ListItem::new(ix) + .inset(true) + .spacing(ListItemSpacing::Sparse) + .toggle_state(selected) + .child( + h_flex() + .h_5() + .line_height(relative(1.)) + .child(Label::new(rule.title.clone().unwrap_or("Untitled".into()))), + ) + .end_slot::(default.then(|| { + IconButton::new("toggle-default-rule", IconName::Paperclip) + .toggle_state(true) + .icon_color(Color::Accent) + .icon_size(IconSize::Small) + .tooltip(Tooltip::text("Remove from Default Rules")) + .on_click(cx.listener(move |_, _, _, cx| { + cx.emit(RulePickerEvent::ToggledDefault { prompt_id }) + })) + })) + .end_hover_slot( + h_flex() + .child(if prompt_id.is_built_in() { + div() + .id("built-in-rule") + .child(Icon::new(IconName::FileLock).color(Color::Muted)) + .tooltip(move |window, cx| { + Tooltip::with_meta( + "Built-in rule", + None, + BUILT_IN_TOOLTIP_TEXT, + window, + cx, + ) + }) + .into_any() } else { - this.tooltip(move |window, cx| { - Tooltip::with_meta( - "Add to Default Rules", - None, - "Always included in every thread.", - window, - cx, - ) - }) - } - }) - .on_click(cx.listener(move |_, _, _, cx| { - cx.emit(RulePickerEvent::ToggledDefault { prompt_id }) - })), - ), - ); - Some(element) + IconButton::new("delete-rule", IconName::Trash) + .icon_color(Color::Muted) + .icon_size(IconSize::Small) + .tooltip(Tooltip::text("Delete Rule")) + .on_click(cx.listener(move |_, _, _, cx| { + cx.emit(RulePickerEvent::Deleted { prompt_id }) + })) + .into_any_element() + }) + .child( + IconButton::new("toggle-default-rule", IconName::Plus) + .selected_icon(IconName::Dash) + .toggle_state(default) + .icon_size(IconSize::Small) + .icon_color(if default { + Color::Accent + } else { + Color::Muted + }) + .map(|this| { + if default { + this.tooltip(Tooltip::text( + "Remove from Default Rules", + )) + } else { + this.tooltip(move |window, cx| { + Tooltip::with_meta( + "Add to Default Rules", + None, + "Always included in every thread.", + window, + cx, + ) + }) + } + }) + .on_click(cx.listener(move |_, _, _, cx| { + cx.emit(RulePickerEvent::ToggledDefault { prompt_id }) + })), + ), + ) + .into_any_element(), + ) + } + } } fn render_editor( @@ -384,7 +476,7 @@ impl RulesLibrary { window: &mut Window, cx: &mut Context, ) -> Self { - let (selected_index, matches) = if let Some(rule_to_select) = rule_to_select { + let (_selected_index, _matches) = if let Some(rule_to_select) = rule_to_select { let matches = store.read(cx).all_prompt_metadata(); let selected_index = matches .iter() @@ -396,19 +488,20 @@ impl RulesLibrary { (0, vec![]) }; - let delegate = RulePickerDelegate { + let picker_delegate = RulePickerDelegate { store: store.clone(), - selected_index, - matches, + selected_index: 0, + filtered_entries: Vec::new(), }; let picker = cx.new(|cx| { - let picker = Picker::uniform_list(delegate, window, cx) + let picker = Picker::list(picker_delegate, window, cx) .modal(false) .max_height(None); picker.focus(window, cx); picker }); + Self { title_bar: if !cfg!(target_os = "macos") { Some(cx.new(|cx| PlatformTitleBar::new("rules-library-title-bar", cx))) @@ -634,7 +727,7 @@ impl RulesLibrary { editor.set_show_gutter(false, cx); editor.set_show_wrap_guides(false, cx); editor.set_show_indent_guides(false, cx); - editor.set_use_modal_editing(false); + editor.set_use_modal_editing(true); editor.set_current_line_highlight(Some(CurrentLineHighlight::None)); editor.set_completion_provider(Some(make_completion_provider())); if focus { @@ -698,14 +791,22 @@ impl RulesLibrary { if let Some(prompt_id) = prompt_id { if picker .delegate - .matches + .filtered_entries .get(picker.delegate.selected_index()) - .is_none_or(|old_selected_prompt| old_selected_prompt.id != prompt_id) - && let Some(ix) = picker - .delegate - .matches - .iter() - .position(|mat| mat.id == prompt_id) + .is_none_or(|old_selected_prompt| { + if let RulePickerEntry::Rule(rule) = old_selected_prompt { + rule.id != prompt_id + } else { + true + } + }) + && let Some(ix) = picker.delegate.filtered_entries.iter().position(|mat| { + if let RulePickerEntry::Rule(rule) = mat { + rule.id == prompt_id + } else { + false + } + }) { picker.set_selected_index(ix, None, true, window, cx); } @@ -1011,7 +1112,6 @@ impl RulesLibrary { .justify_end() .child( IconButton::new("new-rule", IconName::Plus) - .style(ButtonStyle::Transparent) .tooltip(move |window, cx| { Tooltip::for_action("New Rule", &NewRule, window, cx) }) @@ -1055,13 +1155,15 @@ impl RulesLibrary { h_flex() .group("active-editor-header") .pt_2() - .px_2p5() + .pl_1p5() + .pr_2p5() .gap_2() .justify_between() .child( div() .w_full() .on_action(cx.listener(Self::move_down_from_title)) + .pl_1() .border_1() .border_color(transparent_black()) .rounded_sm() @@ -1103,7 +1205,6 @@ impl RulesLibrary { h_flex() .h_full() .flex_shrink_0() - .gap(DynamicSpacing::Base04.rems(cx)) .children(rule_editor.token_count.map(|token_count| { let token_count: SharedString = token_count.to_string().into(); @@ -1156,7 +1257,6 @@ impl RulesLibrary { .into_any() } else { IconButton::new("delete-rule", IconName::Trash) - .icon_size(IconSize::Small) .tooltip(move |window, cx| { Tooltip::for_action( "Delete Rule", @@ -1173,7 +1273,6 @@ impl RulesLibrary { }) .child( IconButton::new("duplicate-rule", IconName::BookCopy) - .icon_size(IconSize::Small) .tooltip(move |window, cx| { Tooltip::for_action( "Duplicate Rule", @@ -1190,38 +1289,41 @@ impl RulesLibrary { }), ) .child( - IconButton::new("toggle-default-rule", IconName::Star) - .icon_size(IconSize::Small) - .toggle_state(rule_metadata.default) - .selected_icon(IconName::StarFilled) - .icon_color(if rule_metadata.default { - Color::Accent + IconButton::new( + "toggle-default-rule", + IconName::Paperclip, + ) + .toggle_state(rule_metadata.default) + .icon_color(if rule_metadata.default { + Color::Accent + } else { + Color::Muted + }) + .map(|this| { + if rule_metadata.default { + this.tooltip(Tooltip::text( + "Remove from Default Rules", + )) } else { - Color::Muted - }) - .map(|this| { - if rule_metadata.default { - this.tooltip(Tooltip::text( - "Remove from Default Rules", - )) - } else { - this.tooltip(move |window, cx| { - Tooltip::with_meta( - "Add to Default Rules", - None, - "Always included in every thread.", - window, - cx, - ) - }) - } - }) - .on_click(|_, window, cx| { + this.tooltip(move |window, cx| { + Tooltip::with_meta( + "Add to Default Rules", + None, + "Always included in every thread.", + window, + cx, + ) + }) + } + }) + .on_click( + |_, window, cx| { window.dispatch_action( Box::new(ToggleDefaultRule), cx, ); - }), + }, + ), ), ), ) @@ -1230,8 +1332,8 @@ impl RulesLibrary { .on_action(cx.listener(Self::focus_picker)) .on_action(cx.listener(Self::inline_assist)) .on_action(cx.listener(Self::move_up_from_body)) - .flex_grow() .h_full() + .flex_grow() .child( h_flex() .py_2() @@ -1253,6 +1355,7 @@ impl Render for RulesLibrary { client_side_decorations( v_flex() + .bg(theme.colors().background) .id("rules-library") .key_context("PromptLibrary") .on_action(cx.listener(|this, &NewRule, window, cx| this.new_rule(window, cx))) diff --git a/crates/scheduler/src/test_scheduler.rs b/crates/scheduler/src/test_scheduler.rs index d9523640f4c39f6487a0383c3edba461260379af..d56db6b83909be8aa20bfe341e7767c2931f3959 100644 --- a/crates/scheduler/src/test_scheduler.rs +++ b/crates/scheduler/src/test_scheduler.rs @@ -41,14 +41,26 @@ impl TestScheduler { } /// Run a test multiple times with sequential seeds (0, 1, 2, ...) - pub fn many(iterations: usize, mut f: impl AsyncFnMut(Arc) -> R) -> Vec { - (0..iterations as u64) + pub fn many( + default_iterations: usize, + mut f: impl AsyncFnMut(Arc) -> R, + ) -> Vec { + let num_iterations = std::env::var("ITERATIONS") + .map(|iterations| iterations.parse().unwrap()) + .unwrap_or(default_iterations); + + let seed = std::env::var("SEED") + .map(|seed| seed.parse().unwrap()) + .unwrap_or(0); + + (seed..num_iterations as u64) .map(|seed| { let mut unwind_safe_f = AssertUnwindSafe(&mut f); + eprintln!("Running seed: {seed}"); match panic::catch_unwind(move || Self::with_seed(seed, &mut *unwind_safe_f)) { Ok(result) => result, Err(error) => { - eprintln!("Failing Seed: {seed}"); + eprintln!("\x1b[31mFailing Seed: {seed}\x1b[0m"); panic::resume_unwind(error); } } @@ -56,8 +68,7 @@ impl TestScheduler { .collect() } - /// Run a test once with a specific seed - pub fn with_seed(seed: u64, f: impl AsyncFnOnce(Arc) -> R) -> R { + fn with_seed(seed: u64, f: impl AsyncFnOnce(Arc) -> R) -> R { let scheduler = Arc::new(TestScheduler::new(TestSchedulerConfig::with_seed(seed))); let future = f(scheduler.clone()); let result = scheduler.foreground().block_on(future); diff --git a/crates/scheduler/src/tests.rs b/crates/scheduler/src/tests.rs index 54ce84e8841c738316232d9e8fec16f62810385e..14f436c502a2d905be9fa9d7989073398506b506 100644 --- a/crates/scheduler/src/tests.rs +++ b/crates/scheduler/src/tests.rs @@ -288,16 +288,6 @@ fn test_helper_methods() { background.spawn(async { 10 }).await }); assert_eq!(results, vec![10, 10, 10]); - - // Test the with_seed method - let result = TestScheduler::with_seed(123, async |scheduler: Arc| { - let background = scheduler.background(); - - // Spawn a background task and wait for its result - let task = background.spawn(async { 99 }); - task.await - }); - assert_eq!(result, 99); } #[test] diff --git a/crates/search/src/buffer_search.rs b/crates/search/src/buffer_search.rs index edbc54bbc7415af4c2d7763062fd0f5ec51995b5..e38dae86f1c0a185b744234387a97f03239a422f 100644 --- a/crates/search/src/buffer_search.rs +++ b/crates/search/src/buffer_search.rs @@ -28,16 +28,18 @@ use schemars::JsonSchema; use serde::Deserialize; use settings::Settings; use std::sync::Arc; -use zed_actions::outline::ToggleOutline; +use zed_actions::{outline::ToggleOutline, workspace::CopyPath, workspace::CopyRelativePath}; use ui::{ BASE_REM_SIZE_IN_PX, IconButton, IconName, Tooltip, h_flex, prelude::*, utils::SearchInputWidth, }; -use util::ResultExt; +use util::{ResultExt, paths::PathMatcher}; use workspace::{ ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace, item::ItemHandle, - searchable::{Direction, SearchEvent, SearchableItemHandle, WeakSearchableItemHandle}, + searchable::{ + Direction, FilteredSearchRange, SearchEvent, SearchableItemHandle, WeakSearchableItemHandle, + }, }; pub use registrar::DivRegistrar; @@ -116,7 +118,7 @@ pub struct BufferSearchBar { search_history: SearchHistory, search_history_cursor: SearchHistoryCursor, replace_enabled: bool, - selection_search_enabled: bool, + selection_search_enabled: Option, scroll_handle: ScrollHandle, editor_scroll_handle: ScrollHandle, editor_needed_width: Pixels, @@ -253,13 +255,13 @@ impl Render for BufferSearchBar { IconName::Quote, ) .style(ButtonStyle::Subtle) - .when(self.selection_search_enabled, |button| { + .when(self.selection_search_enabled.is_some(), |button| { button.style(ButtonStyle::Filled) }) .on_click(cx.listener(|this, _: &ClickEvent, window, cx| { this.toggle_selection(&ToggleSelection, window, cx); })) - .toggle_state(self.selection_search_enabled) + .toggle_state(self.selection_search_enabled.is_some()) .tooltip({ let focus_handle = focus_handle.clone(); move |window, cx| { @@ -423,6 +425,16 @@ impl Render for BufferSearchBar { active_searchable_item.relay_action(Box::new(ToggleOutline), window, cx); } })) + .on_action(cx.listener(|this, _: &CopyPath, window, cx| { + if let Some(active_searchable_item) = &mut this.active_searchable_item { + active_searchable_item.relay_action(Box::new(CopyPath), window, cx); + } + })) + .on_action(cx.listener(|this, _: &CopyRelativePath, window, cx| { + if let Some(active_searchable_item) = &mut this.active_searchable_item { + active_searchable_item.relay_action(Box::new(CopyRelativePath), window, cx); + } + })) .when(replacement, |this| { this.on_action(cx.listener(Self::toggle_replace)) .when(in_replace, |this| { @@ -661,7 +673,7 @@ impl BufferSearchBar { search_history_cursor: Default::default(), active_search: None, replace_enabled: false, - selection_search_enabled: false, + selection_search_enabled: None, scroll_handle: ScrollHandle::new(), editor_scroll_handle: ScrollHandle::new(), editor_needed_width: px(0.), @@ -684,10 +696,10 @@ impl BufferSearchBar { } } if let Some(active_editor) = self.active_searchable_item.as_mut() { - self.selection_search_enabled = false; + self.selection_search_enabled = None; self.replace_enabled = false; active_editor.search_bar_visibility_changed(false, window, cx); - active_editor.toggle_filtered_search_ranges(false, window, cx); + active_editor.toggle_filtered_search_ranges(None, window, cx); let handle = active_editor.item_focus_handle(cx); self.focus(&handle, window); } @@ -699,18 +711,23 @@ impl BufferSearchBar { } pub fn deploy(&mut self, deploy: &Deploy, window: &mut Window, cx: &mut Context) -> bool { + let filtered_search_range = if deploy.selection_search_enabled { + Some(FilteredSearchRange::Default) + } else { + None + }; if self.show(window, cx) { if let Some(active_item) = self.active_searchable_item.as_mut() { - active_item.toggle_filtered_search_ranges( - deploy.selection_search_enabled, - window, - cx, - ); + active_item.toggle_filtered_search_ranges(filtered_search_range, window, cx); } self.search_suggested(window, cx); self.smartcase(window, cx); self.replace_enabled = deploy.replace_enabled; - self.selection_search_enabled = deploy.selection_search_enabled; + self.selection_search_enabled = if deploy.selection_search_enabled { + Some(FilteredSearchRange::Default) + } else { + None + }; if deploy.focus { let mut handle = self.query_editor.focus_handle(cx); let mut select_query = true; @@ -782,10 +799,13 @@ impl BufferSearchBar { if let Some(search) = search { cx.spawn_in(window, async move |this, cx| { - search.await?; - this.update_in(cx, |this, window, cx| { - this.activate_current_match(window, cx) - }) + if search.await.is_ok() { + this.update_in(cx, |this, window, cx| { + this.activate_current_match(window, cx) + }) + } else { + Ok(()) + } }) .detach_and_log_err(cx); } @@ -908,6 +928,19 @@ impl BufferSearchBar { } } + pub fn set_search_within_selection( + &mut self, + search_within_selection: Option, + window: &mut Window, + cx: &mut Context, + ) -> Option> { + let active_item = self.active_searchable_item.as_mut()?; + self.selection_search_enabled = search_within_selection; + active_item.toggle_filtered_search_ranges(self.selection_search_enabled, window, cx); + cx.notify(); + Some(self.update_matches(false, false, window, cx)) + } + pub fn set_search_options(&mut self, search_options: SearchOptions, cx: &mut Context) { self.search_options = search_options; self.adjust_query_regex_language(cx); @@ -942,7 +975,7 @@ impl BufferSearchBar { self.select_match(Direction::Prev, 1, window, cx); } - fn select_all_matches( + pub fn select_all_matches( &mut self, _: &SelectAllMatches, window: &mut Window, @@ -1045,10 +1078,13 @@ impl BufferSearchBar { cx.notify(); cx.spawn_in(window, async move |this, cx| { - search.await?; - this.update_in(cx, |this, window, cx| { - this.activate_current_match(window, cx) - }) + if search.await.is_ok() { + this.update_in(cx, |this, window, cx| { + this.activate_current_match(window, cx) + }) + } else { + Ok(()) + } }) .detach_and_log_err(cx); } @@ -1107,12 +1143,15 @@ impl BufferSearchBar { window: &mut Window, cx: &mut Context, ) { - if let Some(active_item) = self.active_searchable_item.as_mut() { - self.selection_search_enabled = !self.selection_search_enabled; - active_item.toggle_filtered_search_ranges(self.selection_search_enabled, window, cx); - drop(self.update_matches(false, false, window, cx)); - cx.notify(); - } + self.set_search_within_selection( + if let Some(_) = self.selection_search_enabled { + None + } else { + Some(FilteredSearchRange::Default) + }, + window, + cx, + ); } fn toggle_regex(&mut self, _: &ToggleRegex, window: &mut Window, cx: &mut Context) { @@ -1173,6 +1212,8 @@ impl BufferSearchBar { { search } else { + // Value doesn't matter, we only construct empty matchers with it + if self.search_options.contains(SearchOptions::REGEX) { match SearchQuery::regex( query, @@ -1181,8 +1222,8 @@ impl BufferSearchBar { false, self.search_options .contains(SearchOptions::ONE_MATCH_PER_LINE), - Default::default(), - Default::default(), + PathMatcher::default(), + PathMatcher::default(), false, None, ) { @@ -1200,8 +1241,8 @@ impl BufferSearchBar { self.search_options.contains(SearchOptions::WHOLE_WORD), self.search_options.contains(SearchOptions::CASE_SENSITIVE), false, - Default::default(), - Default::default(), + PathMatcher::default(), + PathMatcher::default(), false, None, ) { @@ -1478,7 +1519,7 @@ mod tests { use gpui::{Hsla, TestAppContext, UpdateGlobal, VisualTestContext}; use language::{Buffer, Point}; use project::Project; - use settings::SettingsStore; + use settings::{SearchSettingsContent, SettingsStore}; use smol::stream::StreamExt as _; use unindent::Unindent as _; @@ -2864,8 +2905,14 @@ mod tests { fn update_search_settings(search_settings: SearchSettings, cx: &mut TestAppContext) { cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.search = Some(search_settings); + store.update_user_settings(cx, |settings| { + settings.editor.search = Some(SearchSettingsContent { + button: Some(search_settings.button), + whole_word: Some(search_settings.whole_word), + case_sensitive: Some(search_settings.case_sensitive), + include_ignored: Some(search_settings.include_ignored), + regex: Some(search_settings.regex), + }); }); }); }); diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index 40458bd715c9ff3aba25bd71923072206afa701c..0c67abc8badd56c30da14cfe97250a6c3699d306 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -32,12 +32,11 @@ use std::{ any::{Any, TypeId}, mem, ops::{Not, Range}, - path::Path, pin::pin, sync::Arc, }; -use ui::{KeyBinding, Toggleable, Tooltip, prelude::*, utils::SearchInputWidth}; -use util::{ResultExt as _, paths::PathMatcher}; +use ui::{IconButtonShape, KeyBinding, Toggleable, Tooltip, prelude::*, utils::SearchInputWidth}; +use util::{ResultExt as _, paths::PathMatcher, rel_path::RelPath}; use workspace::{ DeploySearch, ItemNavHistory, NewSearch, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace, WorkspaceId, @@ -523,10 +522,6 @@ impl Item for ProjectSearchView { self.results_editor.for_each_project_item(cx, f) } - fn is_singleton(&self, _: &App) -> bool { - false - } - fn can_save(&self, _: &App) -> bool { true } @@ -679,7 +674,18 @@ impl ProjectSearchView { self.included_opened_only = !self.included_opened_only; } + pub fn replacement(&self, cx: &App) -> String { + self.replacement_editor.read(cx).text(cx) + } + fn replace_next(&mut self, _: &ReplaceNext, window: &mut Window, cx: &mut Context) { + if let Some(last_search_query_text) = &self.entity.read(cx).last_search_query_text + && self.query_editor.read(cx).text(cx) != *last_search_query_text + { + // search query has changed, restart search and bail + self.search(cx); + return; + } if self.entity.read(cx).match_ranges.is_empty() { return; } @@ -699,14 +705,17 @@ impl ProjectSearchView { self.select_match(Direction::Next, window, cx) } } - pub fn replacement(&self, cx: &App) -> String { - self.replacement_editor.read(cx).text(cx) - } fn replace_all(&mut self, _: &ReplaceAll, window: &mut Window, cx: &mut Context) { + if let Some(last_search_query_text) = &self.entity.read(cx).last_search_query_text + && self.query_editor.read(cx).text(cx) != *last_search_query_text + { + // search query has changed, restart search and bail + self.search(cx); + return; + } if self.active_match_index.is_none() { return; } - let Some(query) = self.entity.read(cx).active_query.as_ref() else { return; }; @@ -894,13 +903,11 @@ impl ProjectSearchView { pub fn new_search_in_directory( workspace: &mut Workspace, - dir_path: &Path, + dir_path: &RelPath, window: &mut Window, cx: &mut Context, ) { - let Some(filter_str) = dir_path.to_str() else { - return; - }; + let filter_str = dir_path.display(workspace.path_style(cx)); let weak_workspace = cx.entity().downgrade(); @@ -944,7 +951,12 @@ impl ProjectSearchView { .and_then(|item| item.downcast::()) { let new_query = search_view.update(cx, |search_view, cx| { - let new_query = search_view.build_search_query(cx); + let open_buffers = if search_view.included_opened_only { + Some(search_view.open_buffers(cx, workspace)) + } else { + None + }; + let new_query = search_view.build_search_query(cx, open_buffers); if new_query.is_some() && let Some(old_query) = search_view.entity.read(cx).active_query.clone() { @@ -1057,18 +1069,12 @@ impl ProjectSearchView { window: &mut Window, cx: &mut Context, ) -> Task> { - use workspace::AutosaveSetting; - let project = self.entity.read(cx).project.clone(); let can_autosave = self.results_editor.can_autosave(cx); let autosave_setting = self.results_editor.workspace_settings(cx).autosave; - let will_autosave = can_autosave - && matches!( - autosave_setting, - AutosaveSetting::OnFocusChange | AutosaveSetting::OnWindowChange - ); + let will_autosave = can_autosave && autosave_setting.should_save_on_close(); let is_dirty = self.is_dirty(cx); @@ -1126,7 +1132,14 @@ impl ProjectSearchView { } fn search(&mut self, cx: &mut Context) { - if let Some(query) = self.build_search_query(cx) { + let open_buffers = if self.included_opened_only { + self.workspace + .update(cx, |workspace, cx| self.open_buffers(cx, workspace)) + .ok() + } else { + None + }; + if let Some(query) = self.build_search_query(cx, open_buffers) { self.entity.update(cx, |model, cx| model.search(query, cx)); } } @@ -1135,18 +1148,18 @@ impl ProjectSearchView { self.query_editor.read(cx).text(cx) } - fn build_search_query(&mut self, cx: &mut Context) -> Option { + fn build_search_query( + &mut self, + cx: &mut Context, + open_buffers: Option>>, + ) -> Option { // Do not bail early in this function, as we want to fill out `self.panels_with_errors`. + let text = self.search_query_text(cx); - let open_buffers = if self.included_opened_only { - Some(self.open_buffers(cx)) - } else { - None - }; let included_files = self .filters_enabled .then(|| { - match Self::parse_path_matches(&self.included_files_editor.read(cx).text(cx)) { + match self.parse_path_matches(self.included_files_editor.read(cx).text(cx), cx) { Ok(included_files) => { let should_unmark_error = self.panels_with_errors.remove(&InputPanel::Include); @@ -1166,11 +1179,11 @@ impl ProjectSearchView { } } }) - .unwrap_or_default(); + .unwrap_or(PathMatcher::default()); let excluded_files = self .filters_enabled .then(|| { - match Self::parse_path_matches(&self.excluded_files_editor.read(cx).text(cx)) { + match self.parse_path_matches(self.excluded_files_editor.read(cx).text(cx), cx) { Ok(excluded_files) => { let should_unmark_error = self.panels_with_errors.remove(&InputPanel::Exclude); @@ -1191,7 +1204,7 @@ impl ProjectSearchView { } } }) - .unwrap_or_default(); + .unwrap_or(PathMatcher::default()); // If the project contains multiple visible worktrees, we match the // include/exclude patterns against full paths to allow them to be @@ -1278,28 +1291,25 @@ impl ProjectSearchView { query } - fn open_buffers(&self, cx: &mut Context) -> Vec> { + fn open_buffers(&self, cx: &App, workspace: &Workspace) -> Vec> { let mut buffers = Vec::new(); - self.workspace - .update(cx, |workspace, cx| { - for editor in workspace.items_of_type::(cx) { - if let Some(buffer) = editor.read(cx).buffer().read(cx).as_singleton() { - buffers.push(buffer); - } - } - }) - .ok(); + for editor in workspace.items_of_type::(cx) { + if let Some(buffer) = editor.read(cx).buffer().read(cx).as_singleton() { + buffers.push(buffer); + } + } buffers } - fn parse_path_matches(text: &str) -> anyhow::Result { + fn parse_path_matches(&self, text: String, cx: &App) -> anyhow::Result { + let path_style = self.entity.read(cx).project.read(cx).path_style(cx); let queries = text .split(',') .map(str::trim) .filter(|maybe_glob_str| !maybe_glob_str.is_empty()) .map(str::to_owned) .collect::>(); - Ok(PathMatcher::new(&queries)?) + Ok(PathMatcher::new(&queries, path_style)?) } fn select_match(&mut self, direction: Direction, window: &mut Window, cx: &mut Context) { @@ -2344,7 +2354,7 @@ pub mod tests { use project::FakeFs; use serde_json::json; use settings::SettingsStore; - use util::path; + use util::{path, paths::PathStyle, rel_path::rel_path}; use workspace::DeploySearch; #[gpui::test] @@ -3194,7 +3204,7 @@ pub mod tests { .read(cx) .project() .read(cx) - .entry_for_path(&(worktree_id, "a").into(), cx) + .entry_for_path(&(worktree_id, rel_path("a")).into(), cx) .expect("no entry for /a/ directory") .clone() }); @@ -3232,7 +3242,7 @@ pub mod tests { search_view.included_files_editor.update(cx, |editor, cx| { assert_eq!( editor.display_text(cx), - a_dir_entry.path.to_str().unwrap(), + a_dir_entry.path.display(PathStyle::local()), "New search in directory should have included dir entry path" ); }); @@ -3628,7 +3638,7 @@ pub mod tests { window .update(cx, |workspace, window, cx| { workspace.open_path( - (worktree_id, "one.rs"), + (worktree_id, rel_path("one.rs")), Some(first_pane.downgrade()), true, window, @@ -3845,7 +3855,7 @@ pub mod tests { window .update(cx, |workspace, window, cx| { workspace.open_path( - (worktree_id, "one.rs"), + (worktree_id, rel_path("one.rs")), Some(first_pane.downgrade()), true, window, @@ -4031,7 +4041,7 @@ pub mod tests { // Scroll results all the way down results_editor.scroll( - Point::new(0., f32::MAX), + Point::new(0., f64::MAX), Some(Axis::Vertical), window, cx, @@ -4079,7 +4089,7 @@ pub mod tests { let editor = workspace .update_in(&mut cx, |workspace, window, cx| { - workspace.open_path((worktree_id, "one.rs"), None, true, window, cx) + workspace.open_path((worktree_id, rel_path("one.rs")), None, true, window, cx) }) .await .unwrap() diff --git a/crates/search/src/search.rs b/crates/search/src/search.rs index ad321a5aed77bb93d362e09fa2d68235eec5cb9a..6d30485d827c94501a871152ac642d9e508bdc8c 100644 --- a/crates/search/src/search.rs +++ b/crates/search/src/search.rs @@ -98,7 +98,7 @@ impl SearchOption { pub fn label(&self) -> &'static str { match self { SearchOption::WholeWord => "Match Whole Words", - SearchOption::CaseSensitive => "Match Case Sensitively", + SearchOption::CaseSensitive => "Match Case Sensitivity", SearchOption::IncludeIgnored => "Also search files ignored by configuration", SearchOption::Regex => "Use Regular Expressions", SearchOption::OneMatchPerLine => "One Match Per Line", diff --git a/crates/semantic_version/Cargo.toml b/crates/semantic_version/Cargo.toml index eafbf903ffda809f0735c5dcaf6965e682264c86..b0ecef94d71026a0b596baafc7460b96ade7d4c0 100644 --- a/crates/semantic_version/Cargo.toml +++ b/crates/semantic_version/Cargo.toml @@ -1,9 +1,10 @@ [package] -name = "semantic_version" +name = "zed-semantic-version" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "A library for working with semantic versioning in gpui and Zed" [lints] workspace = true diff --git a/crates/session/src/session.rs b/crates/session/src/session.rs index 438059fef78adb6b83853335bfe1d38113a768d9..e8151f97fd4290058ed9928ba17a700fddbf3d35 100644 --- a/crates/session/src/session.rs +++ b/crates/session/src/session.rs @@ -43,7 +43,7 @@ impl Session { } } - #[cfg(any(test, feature = "test-support"))] + // #[cfg(any(test, feature = "test-support"))] pub fn test() -> Self { Self { session_id: Uuid::new_v4().to_string(), diff --git a/crates/settings/Cargo.toml b/crates/settings/Cargo.toml index d9b8d7275f9abdd60df85443988595f025bf26c0..cc2a39ce230ea0a8e8f9774cc2d8ee33d4e13037 100644 --- a/crates/settings/Cargo.toml +++ b/crates/settings/Cargo.toml @@ -18,6 +18,7 @@ test-support = ["gpui/test-support", "fs/test-support"] [dependencies] anyhow.workspace = true collections.workspace = true +derive_more.workspace = true ec4rs.workspace = true fs.workspace = true futures.workspace = true @@ -29,12 +30,14 @@ release_channel.workspace = true rust-embed.workspace = true schemars.workspace = true serde.workspace = true -serde_derive.workspace = true serde_json.workspace = true -settings_ui_macros.workspace = true serde_json_lenient.workspace = true serde_path_to_error.workspace = true +serde_repr.workspace = true +serde_with.workspace = true +settings_macros.workspace = true smallvec.workspace = true +strum.workspace = true tree-sitter-json.workspace = true tree-sitter.workspace = true util.workspace = true @@ -44,6 +47,7 @@ zlog.workspace = true [dev-dependencies] fs = { workspace = true, features = ["test-support"] } gpui = { workspace = true, features = ["test-support"] } + indoc.workspace = true pretty_assertions.workspace = true unindent.workspace = true diff --git a/crates/settings/src/base_keymap_setting.rs b/crates/settings/src/base_keymap_setting.rs index a6bfeecbc3c01eb5309221443d1b9905b99dcd5b..b2b19864256704fe1a8e1eb929743d37b7ba4407 100644 --- a/crates/settings/src/base_keymap_setting.rs +++ b/crates/settings/src/base_keymap_setting.rs @@ -1,17 +1,17 @@ use std::fmt::{Display, Formatter}; -use crate::{self as settings}; +use crate::{ + self as settings, + settings_content::{BaseKeymapContent, SettingsContent}, +}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsSources, VsCodeSettings}; -use settings_ui_macros::{SettingsKey, SettingsUi}; +use settings::{Settings, VsCodeSettings}; /// Base key bindings scheme. Base keymaps can be overridden with user keymaps. /// /// Default: VSCode -#[derive( - Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Default, SettingsUi, -)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Default)] pub enum BaseKeymap { #[default] VSCode, @@ -24,6 +24,35 @@ pub enum BaseKeymap { None, } +impl From for BaseKeymap { + fn from(value: BaseKeymapContent) -> Self { + match value { + BaseKeymapContent::VSCode => Self::VSCode, + BaseKeymapContent::JetBrains => Self::JetBrains, + BaseKeymapContent::SublimeText => Self::SublimeText, + BaseKeymapContent::Atom => Self::Atom, + BaseKeymapContent::TextMate => Self::TextMate, + BaseKeymapContent::Emacs => Self::Emacs, + BaseKeymapContent::Cursor => Self::Cursor, + BaseKeymapContent::None => Self::None, + } + } +} +impl Into for BaseKeymap { + fn into(self) -> BaseKeymapContent { + match self { + BaseKeymap::VSCode => BaseKeymapContent::VSCode, + BaseKeymap::JetBrains => BaseKeymapContent::JetBrains, + BaseKeymap::SublimeText => BaseKeymapContent::SublimeText, + BaseKeymap::Atom => BaseKeymapContent::Atom, + BaseKeymap::TextMate => BaseKeymapContent::TextMate, + BaseKeymap::Emacs => BaseKeymapContent::Emacs, + BaseKeymap::Cursor => BaseKeymapContent::Cursor, + BaseKeymap::None => BaseKeymapContent::None, + } + } +} + impl Display for BaseKeymap { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { @@ -100,45 +129,12 @@ impl BaseKeymap { } } -#[derive( - Copy, - Clone, - Debug, - Serialize, - Deserialize, - JsonSchema, - PartialEq, - Eq, - Default, - SettingsUi, - SettingsKey, -)] -// extracted so that it can be an option, and still work with derive(SettingsUi) -#[settings_key(None)] -pub struct BaseKeymapSetting { - pub base_keymap: Option, -} - impl Settings for BaseKeymap { - type FileContent = BaseKeymapSetting; - - fn load( - sources: SettingsSources, - _: &mut gpui::App, - ) -> anyhow::Result { - if let Some(Some(user_value)) = sources.user.map(|setting| setting.base_keymap) { - return Ok(user_value); - } - if let Some(Some(server_value)) = sources.server.map(|setting| setting.base_keymap) { - return Ok(server_value); - } - sources - .default - .base_keymap - .ok_or_else(Self::missing_default) + fn from_settings(s: &crate::settings_content::SettingsContent) -> Self { + s.base_keymap.unwrap().into() } - fn import_from_vscode(_vscode: &VsCodeSettings, current: &mut Self::FileContent) { - current.base_keymap = Some(BaseKeymap::VSCode); + fn import_from_vscode(_vscode: &VsCodeSettings, current: &mut SettingsContent) { + current.base_keymap = Some(BaseKeymapContent::VSCode); } } diff --git a/crates/settings/src/editable_setting_control.rs b/crates/settings/src/editable_setting_control.rs index 0a5b3e9be0f93e9e2c0a20386d68b644af883be9..fd9d9869620f57b9cee9c522312bb2e59222e4c0 100644 --- a/crates/settings/src/editable_setting_control.rs +++ b/crates/settings/src/editable_setting_control.rs @@ -1,16 +1,13 @@ use fs::Fs; use gpui::{App, RenderOnce, SharedString}; -use crate::{Settings, update_settings_file}; +use crate::{settings_content::SettingsContent, update_settings_file}; /// A UI control that can be used to edit a setting. pub trait EditableSettingControl: RenderOnce { /// The type of the setting value. type Value: Send; - /// The settings type to which this setting belongs. - type Settings: Settings; - /// Returns the name of this setting. fn name(&self) -> SharedString; @@ -20,17 +17,13 @@ pub trait EditableSettingControl: RenderOnce { /// Applies the given setting file to the settings file contents. /// /// This will be called when writing the setting value back to the settings file. - fn apply( - settings: &mut ::FileContent, - value: Self::Value, - cx: &App, - ); + fn apply(settings: &mut SettingsContent, value: Self::Value, cx: &App); /// Writes the given setting value to the settings files. fn write(value: Self::Value, cx: &App) { let fs = ::global(cx); - update_settings_file::(fs, cx, move |settings, cx| { + update_settings_file(fs, cx, move |settings, cx| { Self::apply(settings, value, cx); }); } diff --git a/crates/settings/src/keymap_file.rs b/crates/settings/src/keymap_file.rs index be44d519449ecc003746a8a41513669bb4e90329..b69b498a6c5596d8bbc78799e8edbe0befc9c35e 100644 --- a/crates/settings/src/keymap_file.rs +++ b/crates/settings/src/keymap_file.rs @@ -4,7 +4,7 @@ use fs::Fs; use gpui::{ Action, ActionBuildError, App, InvalidKeystrokeError, KEYSTROKE_PARSE_EXPECTED_MESSAGE, KeyBinding, KeyBindingContextPredicate, KeyBindingMetaIndex, KeybindingKeystroke, Keystroke, - NoAction, SharedString, + NoAction, SharedString, register_action, }; use schemars::{JsonSchema, json_schema}; use serde::Deserialize; @@ -177,7 +177,6 @@ impl KeymapFile { } } - #[cfg(feature = "test-support")] pub fn load_asset_allow_partial_failure( asset_path: &str, cx: &App, @@ -331,7 +330,40 @@ impl KeymapFile { use_key_equivalents: bool, cx: &App, ) -> std::result::Result { - let (build_result, action_input_string) = match &action.0 { + let (action, action_input_string) = Self::build_keymap_action(action, cx)?; + + let key_binding = match KeyBinding::load( + keystrokes, + action, + context, + use_key_equivalents, + action_input_string.map(SharedString::from), + cx.keyboard_mapper().as_ref(), + ) { + Ok(key_binding) => key_binding, + Err(InvalidKeystrokeError { keystroke }) => { + return Err(format!( + "invalid keystroke {}. {}", + MarkdownInlineCode(&format!("\"{}\"", &keystroke)), + KEYSTROKE_PARSE_EXPECTED_MESSAGE + )); + } + }; + + if let Some(validator) = KEY_BINDING_VALIDATORS.get(&key_binding.action().type_id()) { + match validator.validate(&key_binding) { + Ok(()) => Ok(key_binding), + Err(error) => Err(error.0), + } + } else { + Ok(key_binding) + } + } + + pub fn parse_action( + action: &KeymapAction, + ) -> Result)>, String> { + let name_and_input = match &action.0 { Value::Array(items) => { if items.len() != 2 { return Err(format!( @@ -347,15 +379,10 @@ impl KeymapFile { MarkdownInlineCode(&action.0.to_string()) )); }; - let action_input = items[1].clone(); - let action_input_string = action_input.to_string(); - ( - cx.build_action(name, Some(action_input)), - Some(action_input_string), - ) + Some((name, Some(&items[1]))) } - Value::String(name) => (cx.build_action(name, None), None), - Value::Null => (Ok(NoAction.boxed_clone()), None), + Value::String(name) => Some((name, None)), + Value::Null => None, _ => { return Err(format!( "expected two-element array of `[name, input]`. \ @@ -364,6 +391,33 @@ impl KeymapFile { )); } }; + Ok(name_and_input) + } + + fn build_keymap_action( + action: &KeymapAction, + cx: &App, + ) -> std::result::Result<(Box, Option), String> { + let (build_result, action_input_string) = match Self::parse_action(action)? { + Some((name, action_input)) if name.as_str() == ActionSequence::name_for_type() => { + match action_input { + Some(action_input) => ( + ActionSequence::build_sequence(action_input.clone(), cx), + None, + ), + None => (Err(ActionSequence::expected_array_error()), None), + } + } + Some((name, Some(action_input))) => { + let action_input_string = action_input.to_string(); + ( + cx.build_action(name, Some(action_input.clone())), + Some(action_input_string), + ) + } + Some((name, None)) => (cx.build_action(name, None), None), + None => (Ok(NoAction.boxed_clone()), None), + }; let action = match build_result { Ok(action) => action, @@ -392,32 +446,7 @@ impl KeymapFile { }, }; - let key_binding = match KeyBinding::load( - keystrokes, - action, - context, - use_key_equivalents, - action_input_string.map(SharedString::from), - cx.keyboard_mapper().as_ref(), - ) { - Ok(key_binding) => key_binding, - Err(InvalidKeystrokeError { keystroke }) => { - return Err(format!( - "invalid keystroke {}. {}", - MarkdownInlineCode(&format!("\"{}\"", &keystroke)), - KEYSTROKE_PARSE_EXPECTED_MESSAGE - )); - } - }; - - if let Some(validator) = KEY_BINDING_VALIDATORS.get(&key_binding.action().type_id()) { - match validator.validate(&key_binding) { - Ok(()) => Ok(key_binding), - Err(error) => Err(error.0), - } - } else { - Ok(key_binding) - } + Ok((action, action_input_string)) } /// Creates a JSON schema generator, suitable for generating json schemas @@ -434,11 +463,13 @@ impl KeymapFile { let mut generator = Self::action_schema_generator(); let action_schemas = cx.action_schemas(&mut generator); + let action_documentation = cx.action_documentation(); let deprecations = cx.deprecated_actions_to_preferred_actions(); let deprecation_messages = cx.action_deprecation_messages(); KeymapFile::generate_json_schema( generator, action_schemas, + action_documentation, deprecations, deprecation_messages, ) @@ -447,6 +478,7 @@ impl KeymapFile { fn generate_json_schema( mut generator: schemars::SchemaGenerator, action_schemas: Vec<(&'static str, Option)>, + action_documentation: &HashMap<&'static str, &'static str>, deprecations: &HashMap<&'static str, &'static str>, deprecation_messages: &HashMap<&'static str, &'static str>, ) -> serde_json::Value { @@ -499,14 +531,6 @@ impl KeymapFile { let mut empty_schema_action_names = vec![]; for (name, action_schema) in action_schemas.into_iter() { - let description = action_schema.as_ref().and_then(|schema| { - schema - .as_object() - .and_then(|obj| obj.get("description")) - .and_then(|v| v.as_str()) - .map(|s| s.to_string()) - }); - let deprecation = if name == NoAction.name() { Some("null") } else { @@ -523,6 +547,7 @@ impl KeymapFile { } else if let Some(new_name) = deprecation { add_deprecation_preferred_name(&mut plain_action, new_name); } + let description = action_documentation.get(name); if let Some(description) = &description { add_description(&mut plain_action, description); } @@ -678,8 +703,7 @@ impl KeymapFile { None, index, tab_size, - ) - .context("Failed to remove keybinding")?; + ); keymap_contents.replace_range(replace_range, &replace_value); return Ok(keymap_contents); } @@ -699,16 +723,14 @@ impl KeymapFile { // if we are only changing the keybinding (common case) // not the context, etc. Then just update the binding in place - let (replace_range, replace_value) = - replace_top_level_array_value_in_json_text( - &keymap_contents, - &["bindings", keystrokes_str], - Some(&source_action_value), - Some(&source.keystrokes_unparsed()), - index, - tab_size, - ) - .context("Failed to replace keybinding")?; + let (replace_range, replace_value) = replace_top_level_array_value_in_json_text( + &keymap_contents, + &["bindings", keystrokes_str], + Some(&source_action_value), + Some(&source.keystrokes_unparsed()), + index, + tab_size, + ); keymap_contents.replace_range(replace_range, &replace_value); return Ok(keymap_contents); @@ -721,28 +743,24 @@ impl KeymapFile { // just update the section in place, updating the context // and the binding - let (replace_range, replace_value) = - replace_top_level_array_value_in_json_text( - &keymap_contents, - &["bindings", keystrokes_str], - Some(&source_action_value), - Some(&source.keystrokes_unparsed()), - index, - tab_size, - ) - .context("Failed to replace keybinding")?; + let (replace_range, replace_value) = replace_top_level_array_value_in_json_text( + &keymap_contents, + &["bindings", keystrokes_str], + Some(&source_action_value), + Some(&source.keystrokes_unparsed()), + index, + tab_size, + ); keymap_contents.replace_range(replace_range, &replace_value); - let (replace_range, replace_value) = - replace_top_level_array_value_in_json_text( - &keymap_contents, - &["context"], - source.context.map(Into::into).as_ref(), - None, - index, - tab_size, - ) - .context("Failed to replace keybinding")?; + let (replace_range, replace_value) = replace_top_level_array_value_in_json_text( + &keymap_contents, + &["context"], + source.context.map(Into::into).as_ref(), + None, + index, + tab_size, + ); keymap_contents.replace_range(replace_range, &replace_value); return Ok(keymap_contents); } else { @@ -751,16 +769,14 @@ impl KeymapFile { // section, then treat this operation as an add operation of the // new binding with the updated context. - let (replace_range, replace_value) = - replace_top_level_array_value_in_json_text( - &keymap_contents, - &["bindings", keystrokes_str], - None, - None, - index, - tab_size, - ) - .context("Failed to replace keybinding")?; + let (replace_range, replace_value) = replace_top_level_array_value_in_json_text( + &keymap_contents, + &["bindings", keystrokes_str], + None, + None, + index, + tab_size, + ); keymap_contents.replace_range(replace_range, &replace_value); operation = KeybindUpdateOperation::Add { source, @@ -811,7 +827,7 @@ impl KeymapFile { &keymap_contents, &value.into(), tab_size, - )?; + ); keymap_contents.replace_range(replace_range, &replace_value); } return Ok(keymap_contents); @@ -1041,6 +1057,119 @@ impl From for KeyBindingMetaIndex { } } +/// Runs a sequence of actions. Does not wait for asynchronous actions to complete before running +/// the next action. Currently only works in workspace windows. +/// +/// This action is special-cased in keymap parsing to allow it to access `App` while parsing, so +/// that it can parse its input actions. +pub struct ActionSequence(pub Vec>); + +register_action!(ActionSequence); + +impl ActionSequence { + fn build_sequence( + value: Value, + cx: &App, + ) -> std::result::Result, ActionBuildError> { + match value { + Value::Array(values) => { + let actions = values + .into_iter() + .enumerate() + .map(|(index, action)| { + match KeymapFile::build_keymap_action(&KeymapAction(action), cx) { + Ok((action, _)) => Ok(action), + Err(err) => { + return Err(ActionBuildError::BuildError { + name: Self::name_for_type().to_string(), + error: anyhow::anyhow!( + "error at sequence index {index}: {err}" + ), + }); + } + } + }) + .collect::, _>>()?; + Ok(Box::new(Self(actions))) + } + _ => Err(Self::expected_array_error()), + } + } + + fn expected_array_error() -> ActionBuildError { + ActionBuildError::BuildError { + name: Self::name_for_type().to_string(), + error: anyhow::anyhow!("expected array of actions"), + } + } +} + +impl Action for ActionSequence { + fn name(&self) -> &'static str { + Self::name_for_type() + } + + fn name_for_type() -> &'static str + where + Self: Sized, + { + "action::Sequence" + } + + fn partial_eq(&self, action: &dyn Action) -> bool { + action + .as_any() + .downcast_ref::() + .map_or(false, |other| { + self.0.len() == other.0.len() + && self + .0 + .iter() + .zip(other.0.iter()) + .all(|(a, b)| a.partial_eq(b.as_ref())) + }) + } + + fn boxed_clone(&self) -> Box { + Box::new(ActionSequence( + self.0 + .iter() + .map(|action| action.boxed_clone()) + .collect::>(), + )) + } + + fn build(_value: Value) -> Result> { + Err(anyhow::anyhow!( + "{} cannot be built directly", + Self::name_for_type() + )) + } + + fn action_json_schema(generator: &mut schemars::SchemaGenerator) -> Option { + let keymap_action_schema = generator.subschema_for::(); + Some(json_schema!({ + "type": "array", + "items": keymap_action_schema + })) + } + + fn deprecated_aliases() -> &'static [&'static str] { + &[] + } + + fn deprecation_message() -> Option<&'static str> { + None + } + + fn documentation() -> Option<&'static str> { + Some( + "Runs a sequence of actions.\n\n\ + NOTE: This does **not** wait for asynchronous actions to complete before running the next action.", + ) + } +} + #[cfg(test)] mod tests { use gpui::{DummyKeyboardMapper, KeybindingKeystroke, Keystroke}; diff --git a/crates/settings/src/merge_from.rs b/crates/settings/src/merge_from.rs new file mode 100644 index 0000000000000000000000000000000000000000..6347f231f8d00f0dbe10b98d1172c4b14b105e98 --- /dev/null +++ b/crates/settings/src/merge_from.rs @@ -0,0 +1,176 @@ +/// Trait for recursively merging settings structures. +/// +/// When Zed starts it loads settinsg from `default.json` to initialize +/// everything. These may be further refined by loading the user's settings, +/// and any settings profiles; and then further refined by loading any +/// local project settings. +/// +/// The default behaviour of merging is: +/// * For objects with named keys (HashMap, structs, etc.). The values are merged deeply +/// (so if the default settings has languages.JSON.prettier.allowed = true, and the user's settings has +/// languages.JSON.tab_size = 4; the merged settings file will have both settings). +/// * For options, a None value is ignored, but Some values are merged recursively. +/// * For other types (including Vec), a merge overwrites the current value. +/// +/// If you want to break the rules you can (e.g. ExtendingVec, or SaturatingBool). +#[allow(unused)] +pub trait MergeFrom { + /// Merge from a source of the same type. + fn merge_from(&mut self, other: &Self); + + /// Merge from an optional source of the same type. + fn merge_from_option(&mut self, other: Option<&Self>) { + if let Some(other) = other { + self.merge_from(other); + } + } +} + +macro_rules! merge_from_overwrites { + ($($type:ty),+) => { + $( + impl MergeFrom for $type { + fn merge_from(&mut self, other: &Self) { + *self = other.clone(); + } + } + )+ + } +} + +merge_from_overwrites!( + u16, + u32, + u64, + usize, + i16, + i32, + i64, + bool, + f64, + f32, + char, + std::num::NonZeroUsize, + std::num::NonZeroU32, + String, + std::sync::Arc, + gpui::SharedString, + std::path::PathBuf, + gpui::Modifiers, + gpui::FontFeatures, + gpui::FontWeight +); + +impl MergeFrom for Option { + fn merge_from(&mut self, other: &Self) { + let Some(other) = other else { + return; + }; + if let Some(this) = self { + this.merge_from(other); + } else { + self.replace(other.clone()); + } + } +} + +impl MergeFrom for Vec { + fn merge_from(&mut self, other: &Self) { + *self = other.clone() + } +} + +impl MergeFrom for Box { + fn merge_from(&mut self, other: &Self) { + self.as_mut().merge_from(other.as_ref()) + } +} + +// Implementations for collections that extend/merge their contents +impl MergeFrom for collections::HashMap +where + K: Clone + std::hash::Hash + Eq, + V: Clone + MergeFrom, +{ + fn merge_from(&mut self, other: &Self) { + for (k, v) in other { + if let Some(existing) = self.get_mut(k) { + existing.merge_from(v); + } else { + self.insert(k.clone(), v.clone()); + } + } + } +} + +impl MergeFrom for collections::BTreeMap +where + K: Clone + std::hash::Hash + Eq + Ord, + V: Clone + MergeFrom, +{ + fn merge_from(&mut self, other: &Self) { + for (k, v) in other { + if let Some(existing) = self.get_mut(k) { + existing.merge_from(v); + } else { + self.insert(k.clone(), v.clone()); + } + } + } +} + +impl MergeFrom for collections::IndexMap +where + K: std::hash::Hash + Eq + Clone, + // Q: ?Sized + std::hash::Hash + collections::Equivalent + Eq, + V: Clone + MergeFrom, +{ + fn merge_from(&mut self, other: &Self) { + for (k, v) in other { + if let Some(existing) = self.get_mut(k) { + existing.merge_from(v); + } else { + self.insert(k.clone(), v.clone()); + } + } + } +} + +impl MergeFrom for collections::BTreeSet +where + T: Clone + Ord, +{ + fn merge_from(&mut self, other: &Self) { + for item in other { + self.insert(item.clone()); + } + } +} + +impl MergeFrom for collections::HashSet +where + T: Clone + std::hash::Hash + Eq, +{ + fn merge_from(&mut self, other: &Self) { + for item in other { + self.insert(item.clone()); + } + } +} + +impl MergeFrom for serde_json::Value { + fn merge_from(&mut self, other: &Self) { + match (self, other) { + (serde_json::Value::Object(this), serde_json::Value::Object(other)) => { + for (k, v) in other { + if let Some(existing) = this.get_mut(k) { + existing.merge_from(v); + } else { + this.insert(k.clone(), v.clone()); + } + } + } + (this, other) => *this = other.clone(), + } + } +} diff --git a/crates/settings/src/settings.rs b/crates/settings/src/settings.rs index 8a50b1afe5d0c68365efe0652421937f6dad2783..6fe078301abab974ba202660319966e7df42027a 100644 --- a/crates/settings/src/settings.rs +++ b/crates/settings/src/settings.rs @@ -1,12 +1,15 @@ mod base_keymap_setting; mod editable_setting_control; mod keymap_file; +pub mod merge_from; +mod settings_content; mod settings_file; mod settings_json; mod settings_store; -mod settings_ui_core; mod vscode_import; +pub use settings_content::*; + use gpui::{App, Global}; use rust_embed::RustEmbed; use std::{borrow::Cow, fmt, str}; @@ -21,14 +24,14 @@ pub use keymap_file::{ pub use settings_file::*; pub use settings_json::*; pub use settings_store::{ - InvalidSettingsError, LocalSettingsKind, Settings, SettingsKey, SettingsLocation, - SettingsSources, SettingsStore, + InvalidSettingsError, LocalSettingsKind, Settings, SettingsFile, SettingsKey, SettingsLocation, + SettingsStore, }; -pub use settings_ui_core::*; -// Re-export the derive macro -pub use settings_ui_macros::{SettingsKey, SettingsUi}; + pub use vscode_import::{VsCodeSettings, VsCodeSettingsSource}; +pub use keymap_file::ActionSequence; + #[derive(Clone, Debug, PartialEq)] pub struct ActiveSettingsProfileName(pub String); @@ -75,10 +78,7 @@ impl fmt::Display for WorktreeId { pub struct SettingsAssets; pub fn init(cx: &mut App) { - let mut settings = SettingsStore::new(cx); - settings - .set_default_settings(&default_settings(), cx) - .unwrap(); + let settings = SettingsStore::new(cx, &default_settings()); cx.set_global(settings); BaseKeymap::register(cx); SettingsStore::observe_active_settings_profile_name(cx).detach(); diff --git a/crates/settings/src/settings_content.rs b/crates/settings/src/settings_content.rs new file mode 100644 index 0000000000000000000000000000000000000000..3599ac4110360c62071ea40bd2c73935fc5116ec --- /dev/null +++ b/crates/settings/src/settings_content.rs @@ -0,0 +1,950 @@ +mod agent; +mod editor; +mod extension; +mod language; +mod language_model; +mod project; +mod terminal; +mod theme; +mod workspace; + +pub use agent::*; +pub use editor::*; +pub use extension::*; +pub use language::*; +pub use language_model::*; +pub use project::*; +pub use terminal::*; +pub use theme::*; +pub use workspace::*; + +use collections::{HashMap, IndexMap}; +use gpui::{App, SharedString}; +use release_channel::ReleaseChannel; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; +use std::collections::BTreeSet; +use std::env; +use std::sync::Arc; +pub use util::serde::default_true; + +use crate::{ActiveSettingsProfileName, merge_from}; + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Default, Clone, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct SettingsContent { + #[serde(flatten)] + pub project: ProjectSettingsContent, + + #[serde(flatten)] + pub theme: Box, + + #[serde(flatten)] + pub extension: ExtensionSettingsContent, + + #[serde(flatten)] + pub workspace: WorkspaceSettingsContent, + + #[serde(flatten)] + pub editor: EditorSettingsContent, + + #[serde(flatten)] + pub remote: RemoteSettingsContent, + + /// Settings related to the file finder. + pub file_finder: Option, + + pub git_panel: Option, + + pub tabs: Option, + pub tab_bar: Option, + pub status_bar: Option, + + pub preview_tabs: Option, + + pub agent: Option, + pub agent_servers: Option, + + /// Configuration of audio in Zed. + pub audio: Option, + + /// Whether or not to automatically check for updates. + /// + /// Default: true + pub auto_update: Option, + + /// This base keymap settings adjusts the default keybindings in Zed to be similar + /// to other common code editors. By default, Zed's keymap closely follows VSCode's + /// keymap, with minor adjustments, this corresponds to the "VSCode" setting. + /// + /// Default: VSCode + pub base_keymap: Option, + + /// Configuration for the collab panel visual settings. + pub collaboration_panel: Option, + + pub debugger: Option, + + /// Configuration for Diagnostics-related features. + pub diagnostics: Option, + + /// Configuration for Git-related features + pub git: Option, + + /// Common language server settings. + pub global_lsp_settings: Option, + + /// The settings for the image viewer. + pub image_viewer: Option, + + pub repl: Option, + + /// Whether or not to enable Helix mode. + /// + /// Default: false + pub helix_mode: Option, + + pub journal: Option, + + /// A map of log scopes to the desired log level. + /// Useful for filtering out noisy logs or enabling more verbose logging. + /// + /// Example: {"log": {"client": "warn"}} + pub log: Option>, + + pub line_indicator_format: Option, + + pub language_models: Option, + + pub outline_panel: Option, + + pub project_panel: Option, + + /// Configuration for the Message Editor + pub message_editor: Option, + + /// Configuration for Node-related features + pub node: Option, + + /// Configuration for the Notification Panel + pub notification_panel: Option, + + pub proxy: Option, + + /// The URL of the Zed server to connect to. + pub server_url: Option, + + /// Configuration for session-related features + pub session: Option, + /// Control what info is collected by Zed. + pub telemetry: Option, + + /// Configuration of the terminal in Zed. + pub terminal: Option, + + pub title_bar: Option, + + /// Whether or not to enable Vim mode. + /// + /// Default: false + pub vim_mode: Option, + + // Settings related to calls in Zed + pub calls: Option, + + /// Whether to disable all AI features in Zed. + /// + /// Default: false + pub disable_ai: Option, + + /// Settings related to Vim mode in Zed. + pub vim: Option, +} + +impl SettingsContent { + pub fn languages_mut(&mut self) -> &mut HashMap { + &mut self.project.all_languages.languages.0 + } +} + +#[skip_serializing_none] +#[derive(Debug, Default, PartialEq, Clone, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct UserSettingsContent { + #[serde(flatten)] + pub content: Box, + + pub dev: Option>, + pub nightly: Option>, + pub preview: Option>, + pub stable: Option>, + + pub macos: Option>, + pub windows: Option>, + pub linux: Option>, + + #[serde(default)] + pub profiles: IndexMap, +} + +pub struct ExtensionsSettingsContent { + pub all_languages: AllLanguageSettingsContent, +} + +impl UserSettingsContent { + pub fn for_release_channel(&self) -> Option<&SettingsContent> { + match *release_channel::RELEASE_CHANNEL { + ReleaseChannel::Dev => self.dev.as_deref(), + ReleaseChannel::Nightly => self.nightly.as_deref(), + ReleaseChannel::Preview => self.preview.as_deref(), + ReleaseChannel::Stable => self.stable.as_deref(), + } + } + + pub fn for_os(&self) -> Option<&SettingsContent> { + match env::consts::OS { + "macos" => self.macos.as_deref(), + "linux" => self.linux.as_deref(), + "windows" => self.windows.as_deref(), + _ => None, + } + } + + pub fn for_profile(&self, cx: &App) -> Option<&SettingsContent> { + let Some(active_profile) = cx.try_global::() else { + return None; + }; + self.profiles.get(&active_profile.0) + } +} + +/// Base key bindings scheme. Base keymaps can be overridden with user keymaps. +/// +/// Default: VSCode +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + Default, + strum::VariantArray, + strum::VariantNames, +)] +pub enum BaseKeymapContent { + #[default] + VSCode, + JetBrains, + SublimeText, + Atom, + TextMate, + Emacs, + Cursor, + None, +} + +#[skip_serializing_none] +#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)] +pub struct TitleBarSettingsContent { + /// Whether to show the branch icon beside branch switcher in the title bar. + /// + /// Default: false + pub show_branch_icon: Option, + /// Whether to show onboarding banners in the title bar. + /// + /// Default: true + pub show_onboarding_banner: Option, + /// Whether to show user avatar in the title bar. + /// + /// Default: true + pub show_user_picture: Option, + /// Whether to show the branch name button in the titlebar. + /// + /// Default: true + pub show_branch_name: Option, + /// Whether to show the project host and name in the titlebar. + /// + /// Default: true + pub show_project_items: Option, + /// Whether to show the sign in button in the title bar. + /// + /// Default: true + pub show_sign_in: Option, + /// Whether to show the menus in the title bar. + /// + /// Default: false + pub show_menus: Option, +} + +/// Configuration of audio in Zed. +#[skip_serializing_none] +#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)] +pub struct AudioSettingsContent { + /// Opt into the new audio system. + /// + /// You need to rejoin a call for this setting to apply + #[serde(rename = "experimental.rodio_audio")] + pub rodio_audio: Option, // default is false + /// Requires 'rodio_audio: true' + /// + /// Automatically increase or decrease you microphone's volume. This affects how + /// loud you sound to others. + /// + /// Recommended: off (default) + /// Microphones are too quite in zed, until everyone is on experimental + /// audio and has auto speaker volume on this will make you very loud + /// compared to other speakers. + #[serde(rename = "experimental.auto_microphone_volume")] + pub auto_microphone_volume: Option, + /// Requires 'rodio_audio: true' + /// + /// Automatically increate or decrease the volume of other call members. + /// This only affects how things sound for you. + #[serde(rename = "experimental.auto_speaker_volume")] + pub auto_speaker_volume: Option, + /// Requires 'rodio_audio: true' + /// + /// Remove background noises. Works great for typing, cars, dogs, AC. Does + /// not work well on music. + #[serde(rename = "experimental.denoise")] + pub denoise: Option, + /// Requires 'rodio_audio: true' + /// + /// Use audio parameters compatible with the previous versions of + /// experimental audio and non-experimental audio. When this is false you + /// will sound strange to anyone not on the latest experimental audio. In + /// the future we will migrate by setting this to false + /// + /// You need to rejoin a call for this setting to apply + #[serde(rename = "experimental.legacy_audio_compatible")] + pub legacy_audio_compatible: Option, +} + +/// Control what info is collected by Zed. +#[skip_serializing_none] +#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Debug, MergeFrom)] +pub struct TelemetrySettingsContent { + /// Send debug info like crash reports. + /// + /// Default: true + pub diagnostics: Option, + /// Send anonymized usage data like what languages you're using Zed with. + /// + /// Default: true + pub metrics: Option, +} + +impl Default for TelemetrySettingsContent { + fn default() -> Self { + Self { + diagnostics: Some(true), + metrics: Some(true), + } + } +} + +#[skip_serializing_none] +#[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Clone, MergeFrom)] +pub struct DebuggerSettingsContent { + /// Determines the stepping granularity. + /// + /// Default: line + pub stepping_granularity: Option, + /// Whether the breakpoints should be reused across Zed sessions. + /// + /// Default: true + pub save_breakpoints: Option, + /// Whether to show the debug button in the status bar. + /// + /// Default: true + pub button: Option, + /// Time in milliseconds until timeout error when connecting to a TCP debug adapter + /// + /// Default: 2000ms + pub timeout: Option, + /// Whether to log messages between active debug adapters and Zed + /// + /// Default: true + pub log_dap_communications: Option, + /// Whether to format dap messages in when adding them to debug adapter logger + /// + /// Default: true + pub format_dap_log_messages: Option, + /// The dock position of the debug panel + /// + /// Default: Bottom + pub dock: Option, +} + +/// The granularity of one 'step' in the stepping requests `next`, `stepIn`, `stepOut`, and `stepBack`. +#[derive( + PartialEq, + Eq, + Debug, + Hash, + Clone, + Copy, + Deserialize, + Serialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum SteppingGranularity { + /// The step should allow the program to run until the current statement has finished executing. + /// The meaning of a statement is determined by the adapter and it may be considered equivalent to a line. + /// For example 'for(int i = 0; i < 10; i++)' could be considered to have 3 statements 'int i = 0', 'i < 10', and 'i++'. + Statement, + /// The step should allow the program to run until the current source line has executed. + Line, + /// The step should allow one instruction to execute (e.g. one x86 instruction). + Instruction, +} + +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum DockPosition { + Left, + Bottom, + Right, +} + +/// Settings for slash commands. +#[skip_serializing_none] +#[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct SlashCommandSettings { + /// Settings for the `/cargo-workspace` slash command. + pub cargo_workspace: Option, +} + +/// Settings for the `/cargo-workspace` slash command. +#[skip_serializing_none] +#[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct CargoWorkspaceCommandSettings { + /// Whether `/cargo-workspace` is enabled. + pub enabled: Option, +} + +/// Configuration of voice calls in Zed. +#[skip_serializing_none] +#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)] +pub struct CallSettingsContent { + /// Whether the microphone should be muted when joining a channel or a call. + /// + /// Default: false + pub mute_on_join: Option, + + /// Whether your current project should be shared when joining an empty channel. + /// + /// Default: false + pub share_on_join: Option, +} + +#[skip_serializing_none] +#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)] +pub struct GitPanelSettingsContent { + /// Whether to show the panel button in the status bar. + /// + /// Default: true + pub button: Option, + /// Where to dock the panel. + /// + /// Default: left + pub dock: Option, + /// Default width of the panel in pixels. + /// + /// Default: 360 + pub default_width: Option, + /// How entry statuses are displayed. + /// + /// Default: icon + pub status_style: Option, + /// How and when the scrollbar should be displayed. + /// + /// Default: inherits editor scrollbar settings + pub scrollbar: Option, + + /// What the default branch name should be when + /// `init.defaultBranch` is not set in git + /// + /// Default: main + pub fallback_branch_name: Option, + + /// Whether to sort entries in the panel by path + /// or by status (the default). + /// + /// Default: false + pub sort_by_path: Option, + + /// Whether to collapse untracked files in the diff panel. + /// + /// Default: false + pub collapse_untracked_diff: Option, +} + +#[derive( + Default, Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, +)] +#[serde(rename_all = "snake_case")] +pub enum StatusStyle { + #[default] + Icon, + LabelColor, +} + +#[skip_serializing_none] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct ScrollbarSettings { + pub show: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq)] +pub struct NotificationPanelSettingsContent { + /// Whether to show the panel button in the status bar. + /// + /// Default: true + pub button: Option, + /// Where to dock the panel. + /// + /// Default: right + pub dock: Option, + /// Default width of the panel in pixels. + /// + /// Default: 300 + pub default_width: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq)] +pub struct PanelSettingsContent { + /// Whether to show the panel button in the status bar. + /// + /// Default: true + pub button: Option, + /// Where to dock the panel. + /// + /// Default: left + pub dock: Option, + /// Default width of the panel in pixels. + /// + /// Default: 240 + pub default_width: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq)] +pub struct MessageEditorSettings { + /// Whether to automatically replace emoji shortcodes with emoji characters. + /// For example: typing `:wave:` gets replaced with `👋`. + /// + /// Default: false + pub auto_replace_emoji_shortcode: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq)] +pub struct FileFinderSettingsContent { + /// Whether to show file icons in the file finder. + /// + /// Default: true + pub file_icons: Option, + /// Determines how much space the file finder can take up in relation to the available window width. + /// + /// Default: small + pub modal_max_width: Option, + /// Determines whether the file finder should skip focus for the active file in search results. + /// + /// Default: true + pub skip_focus_for_active_in_search: Option, + /// Determines whether to show the git status in the file finder + /// + /// Default: true + pub git_status: Option, + /// Whether to use gitignored files when searching. + /// Only the file Zed had indexed will be used, not necessary all the gitignored files. + /// + /// Can accept 3 values: + /// * `Some(true)`: Use all gitignored files + /// * `Some(false)`: Use only the files Zed had indexed + /// * `None`: Be smart and search for ignored when called from a gitignored worktree + /// + /// Default: None + /// todo() -> Change this type to an enum + pub include_ignored: Option, +} + +#[derive( + Debug, + PartialEq, + Eq, + Clone, + Copy, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "lowercase")] +pub enum FileFinderWidthContent { + #[default] + Small, + Medium, + Large, + XLarge, + Full, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Serialize, Deserialize, PartialEq, Debug, JsonSchema, MergeFrom)] +pub struct VimSettingsContent { + pub default_mode: Option, + pub toggle_relative_line_numbers: Option, + pub use_system_clipboard: Option, + pub use_smartcase_find: Option, + pub custom_digraphs: Option>>, + pub highlight_on_yank_duration: Option, + pub cursor_shape: Option, +} + +#[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Debug)] +#[serde(rename_all = "snake_case")] +pub enum ModeContent { + #[default] + Normal, + Insert, +} + +/// Controls when to use system clipboard. +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum UseSystemClipboard { + /// Don't use system clipboard. + Never, + /// Use system clipboard. + Always, + /// Use system clipboard for yank operations. + OnYank, +} + +/// The settings for cursor shape. +#[skip_serializing_none] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +pub struct CursorShapeSettings { + /// Cursor shape for the normal mode. + /// + /// Default: block + pub normal: Option, + /// Cursor shape for the replace mode. + /// + /// Default: underline + pub replace: Option, + /// Cursor shape for the visual mode. + /// + /// Default: block + pub visual: Option, + /// Cursor shape for the insert mode. + /// + /// The default value follows the primary cursor_shape. + pub insert: Option, +} + +/// Settings specific to journaling +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct JournalSettingsContent { + /// The path of the directory where journal entries are stored. + /// + /// Default: `~` + pub path: Option, + /// What format to display the hours in. + /// + /// Default: hour12 + pub hour_format: Option, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum HourFormat { + #[default] + Hour12, + Hour24, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq)] +pub struct OutlinePanelSettingsContent { + /// Whether to show the outline panel button in the status bar. + /// + /// Default: true + pub button: Option, + /// Customize default width (in pixels) taken by outline panel + /// + /// Default: 240 + pub default_width: Option, + /// The position of outline panel + /// + /// Default: left + pub dock: Option, + /// Whether to show file icons in the outline panel. + /// + /// Default: true + pub file_icons: Option, + /// Whether to show folder icons or chevrons for directories in the outline panel. + /// + /// Default: true + pub folder_icons: Option, + /// Whether to show the git status in the outline panel. + /// + /// Default: true + pub git_status: Option, + /// Amount of indentation (in pixels) for nested items. + /// + /// Default: 20 + pub indent_size: Option, + /// Whether to reveal it in the outline panel automatically, + /// when a corresponding project entry becomes active. + /// Gitignored entries are never auto revealed. + /// + /// Default: true + pub auto_reveal_entries: Option, + /// Whether to fold directories automatically + /// when directory has only one directory inside. + /// + /// Default: true + pub auto_fold_dirs: Option, + /// Settings related to indent guides in the outline panel. + pub indent_guides: Option, + /// Scrollbar-related settings + pub scrollbar: Option, + /// Default depth to expand outline items in the current file. + /// The default depth to which outline entries are expanded on reveal. + /// - Set to 0 to collapse all items that have children + /// - Set to 1 or higher to collapse items at that depth or deeper + /// + /// Default: 100 + pub expand_outlines_with_depth: Option, +} + +#[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum DockSide { + Left, + Right, +} + +#[derive( + Copy, + Clone, + Debug, + PartialEq, + Eq, + Deserialize, + Serialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum ShowIndentGuides { + Always, + Never, +} + +#[skip_serializing_none] +#[derive( + Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default, +)] +pub struct IndentGuidesSettingsContent { + /// When to show the scrollbar in the outline panel. + pub show: Option, +} + +#[derive(Clone, Copy, Default, PartialEq, Debug, JsonSchema, MergeFrom, Deserialize, Serialize)] +#[serde(rename_all = "snake_case")] +pub enum LineIndicatorFormat { + Short, + #[default] + Long, +} + +/// The settings for the image viewer. +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, Default, PartialEq)] +pub struct ImageViewerSettingsContent { + /// The unit to use for displaying image file sizes. + /// + /// Default: "binary" + pub unit: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, Default, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum ImageFileSizeUnit { + /// Displays file size in binary units (e.g., KiB, MiB). + #[default] + Binary, + /// Displays file size in decimal units (e.g., KB, MB). + Decimal, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct RemoteSettingsContent { + pub ssh_connections: Option>, + pub wsl_connections: Option>, + pub read_ssh_config: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct SshConnection { + pub host: SharedString, + pub username: Option, + pub port: Option, + #[serde(default)] + pub args: Vec, + #[serde(default)] + pub projects: collections::BTreeSet, + /// Name to use for this server in UI. + pub nickname: Option, + // By default Zed will download the binary to the host directly. + // If this is set to true, Zed will download the binary to your local machine, + // and then upload it over the SSH connection. Useful if your SSH server has + // limited outbound internet access. + pub upload_binary_over_ssh: Option, + + pub port_forwards: Option>, +} + +#[derive(Clone, Default, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom, Debug)] +pub struct WslConnection { + pub distro_name: SharedString, + pub user: Option, + #[serde(default)] + pub projects: BTreeSet, +} + +#[skip_serializing_none] +#[derive( + Clone, Debug, Default, Serialize, PartialEq, Eq, PartialOrd, Ord, Deserialize, JsonSchema, +)] +pub struct SshProject { + pub paths: Vec, +} + +#[skip_serializing_none] +#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, JsonSchema, MergeFrom)] +pub struct SshPortForwardOption { + #[serde(skip_serializing_if = "Option::is_none")] + pub local_host: Option, + pub local_port: u16, + #[serde(skip_serializing_if = "Option::is_none")] + pub remote_host: Option, + pub remote_port: u16, +} + +/// Settings for configuring REPL display and behavior. +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct ReplSettingsContent { + /// Maximum number of lines to keep in REPL's scrollback buffer. + /// Clamped with [4, 256] range. + /// + /// Default: 32 + pub max_lines: Option, + /// Maximum number of columns to keep in REPL's scrollback buffer. + /// Clamped with [20, 512] range. + /// + /// Default: 128 + pub max_columns: Option, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +/// An ExtendingVec in the settings can only accumulate new values. +/// +/// This is useful for things like private files where you only want +/// to allow new values to be added. +/// +/// Consider using a HashMap instead of this type +/// (like auto_install_extensions) so that user settings files can both add +/// and remove values from the set. +pub struct ExtendingVec(pub Vec); + +impl Into> for ExtendingVec { + fn into(self) -> Vec { + self.0 + } +} +impl From> for ExtendingVec { + fn from(vec: Vec) -> Self { + ExtendingVec(vec) + } +} + +impl merge_from::MergeFrom for ExtendingVec { + fn merge_from(&mut self, other: &Self) { + self.0.extend_from_slice(other.0.as_slice()); + } +} + +/// A SaturatingBool in the settings can only ever be set to true, +/// later attempts to set it to false will be ignored. +/// +/// Used by `disable_ai`. +#[derive(Debug, Default, Copy, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +pub struct SaturatingBool(pub bool); + +impl From for SaturatingBool { + fn from(value: bool) -> Self { + SaturatingBool(value) + } +} + +impl From for bool { + fn from(value: SaturatingBool) -> bool { + value.0 + } +} + +impl merge_from::MergeFrom for SaturatingBool { + fn merge_from(&mut self, other: &Self) { + self.0 |= other.0 + } +} diff --git a/crates/settings/src/settings_content/agent.rs b/crates/settings/src/settings_content/agent.rs new file mode 100644 index 0000000000000000000000000000000000000000..9644cbb3bd455f42052d0c4c45d958d9a492d712 --- /dev/null +++ b/crates/settings/src/settings_content/agent.rs @@ -0,0 +1,338 @@ +use collections::{HashMap, IndexMap}; +use gpui::SharedString; +use schemars::{JsonSchema, json_schema}; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; +use std::{borrow::Cow, path::PathBuf, sync::Arc}; + +use crate::DockPosition; + +#[skip_serializing_none] +#[derive(Clone, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, Default)] +pub struct AgentSettingsContent { + /// Whether the Agent is enabled. + /// + /// Default: true + pub enabled: Option, + /// Whether to show the agent panel button in the status bar. + /// + /// Default: true + pub button: Option, + /// Where to dock the agent panel. + /// + /// Default: right + pub dock: Option, + /// Default width in pixels when the agent panel is docked to the left or right. + /// + /// Default: 640 + pub default_width: Option, + /// Default height in pixels when the agent panel is docked to the bottom. + /// + /// Default: 320 + pub default_height: Option, + /// The default model to use when creating new chats and for other features when a specific model is not specified. + pub default_model: Option, + /// Model to use for the inline assistant. Defaults to default_model when not specified. + pub inline_assistant_model: Option, + /// Model to use for generating git commit messages. Defaults to default_model when not specified. + pub commit_message_model: Option, + /// Model to use for generating thread summaries. Defaults to default_model when not specified. + pub thread_summary_model: Option, + /// Additional models with which to generate alternatives when performing inline assists. + pub inline_alternatives: Option>, + /// The default profile to use in the Agent. + /// + /// Default: write + pub default_profile: Option>, + /// Which view type to show by default in the agent panel. + /// + /// Default: "thread" + pub default_view: Option, + /// The available agent profiles. + pub profiles: Option, AgentProfileContent>>, + /// Whenever a tool action would normally wait for your confirmation + /// that you allow it, always choose to allow it. + /// + /// This setting has no effect on external agents that support permission modes, such as Claude Code. + /// + /// Set `agent_servers.claude.default_mode` to `bypassPermissions`, to disable all permission requests when using Claude Code. + /// + /// Default: false + pub always_allow_tool_actions: Option, + /// Where to show a popup notification when the agent is waiting for user input. + /// + /// Default: "primary_screen" + pub notify_when_agent_waiting: Option, + /// Whether to play a sound when the agent has either completed its response, or needs user input. + /// + /// Default: false + pub play_sound_when_agent_done: Option, + /// Whether to stream edits from the agent as they are received. + /// + /// Default: false + pub stream_edits: Option, + /// Whether to display agent edits in single-file editors in addition to the review multibuffer pane. + /// + /// Default: true + pub single_file_review: Option, + /// Additional parameters for language model requests. When making a request + /// to a model, parameters will be taken from the last entry in this list + /// that matches the model's provider and name. In each entry, both provider + /// and model are optional, so that you can specify parameters for either + /// one. + /// + /// Default: [] + #[serde(default)] + pub model_parameters: Vec, + /// What completion mode to enable for new threads + /// + /// Default: normal + pub preferred_completion_mode: Option, + /// Whether to show thumb buttons for feedback in the agent panel. + /// + /// Default: true + pub enable_feedback: Option, + /// Whether to have edit cards in the agent panel expanded, showing a preview of the full diff. + /// + /// Default: true + pub expand_edit_card: Option, + /// Whether to have terminal cards in the agent panel expanded, showing the whole command output. + /// + /// Default: true + pub expand_terminal_card: Option, + /// Whether to always use cmd-enter (or ctrl-enter on Linux or Windows) to send messages in the agent panel. + /// + /// Default: false + pub use_modifier_to_send: Option, + /// Minimum number of lines of height the agent message editor should have. + /// + /// Default: 4 + pub message_editor_min_lines: Option, +} + +impl AgentSettingsContent { + pub fn set_dock(&mut self, dock: DockPosition) { + self.dock = Some(dock); + } + + pub fn set_model(&mut self, language_model: LanguageModelSelection) { + // let model = language_model.id().0.to_string(); + // let provider = language_model.provider_id().0.to_string(); + // self.default_model = Some(LanguageModelSelection { + // provider: provider.into(), + // model, + // }); + self.default_model = Some(language_model) + } + + pub fn set_inline_assistant_model(&mut self, provider: String, model: String) { + self.inline_assistant_model = Some(LanguageModelSelection { + provider: provider.into(), + model, + }); + } + + pub fn set_commit_message_model(&mut self, provider: String, model: String) { + self.commit_message_model = Some(LanguageModelSelection { + provider: provider.into(), + model, + }); + } + + pub fn set_thread_summary_model(&mut self, provider: String, model: String) { + self.thread_summary_model = Some(LanguageModelSelection { + provider: provider.into(), + model, + }); + } + + pub fn set_always_allow_tool_actions(&mut self, allow: bool) { + self.always_allow_tool_actions = Some(allow); + } + + pub fn set_play_sound_when_agent_done(&mut self, allow: bool) { + self.play_sound_when_agent_done = Some(allow); + } + + pub fn set_single_file_review(&mut self, allow: bool) { + self.single_file_review = Some(allow); + } + + pub fn set_use_modifier_to_send(&mut self, always_use: bool) { + self.use_modifier_to_send = Some(always_use); + } + + pub fn set_profile(&mut self, profile_id: Arc) { + self.default_profile = Some(profile_id); + } +} + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct AgentProfileContent { + pub name: Arc, + #[serde(default)] + pub tools: IndexMap, bool>, + /// Whether all context servers are enabled by default. + pub enable_all_context_servers: Option, + #[serde(default)] + pub context_servers: IndexMap, ContextServerPresetContent>, +} + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct ContextServerPresetContent { + pub tools: IndexMap, bool>, +} + +#[derive(Copy, Clone, Default, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum DefaultAgentView { + #[default] + Thread, + TextThread, +} + +#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum NotifyWhenAgentWaiting { + #[default] + PrimaryScreen, + AllScreens, + Never, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct LanguageModelSelection { + pub provider: LanguageModelProviderSetting, + pub model: String, +} + +#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Default)] +#[serde(rename_all = "snake_case")] +pub enum CompletionMode { + #[default] + Normal, + #[serde(alias = "max")] + Burn, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct LanguageModelParameters { + pub provider: Option, + pub model: Option, + pub temperature: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, MergeFrom)] +pub struct LanguageModelProviderSetting(pub String); + +impl JsonSchema for LanguageModelProviderSetting { + fn schema_name() -> Cow<'static, str> { + "LanguageModelProviderSetting".into() + } + + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + // list the builtin providers as a subset so that we still auto complete them in the settings + json_schema!({ + "anyOf": [ + { + "type": "string", + "enum": [ + "amazon-bedrock", + "anthropic", + "copilot_chat", + "deepseek", + "google", + "lmstudio", + "mistral", + "ollama", + "openai", + "openrouter", + "vercel", + "x_ai", + "zed.dev" + ] + }, + { + "type": "string", + } + ] + }) + } +} + +impl From for LanguageModelProviderSetting { + fn from(provider: String) -> Self { + Self(provider) + } +} + +impl From<&str> for LanguageModelProviderSetting { + fn from(provider: &str) -> Self { + Self(provider.to_string()) + } +} + +#[skip_serializing_none] +#[derive(Default, PartialEq, Deserialize, Serialize, Clone, JsonSchema, MergeFrom, Debug)] +pub struct AllAgentServersSettings { + pub gemini: Option, + pub claude: Option, + pub codex: Option, + + /// Custom agent servers configured by the user + #[serde(flatten)] + pub custom: HashMap, +} + +#[skip_serializing_none] +#[derive(Default, Deserialize, Serialize, Clone, JsonSchema, MergeFrom, Debug, PartialEq)] +pub struct BuiltinAgentServerSettings { + /// Absolute path to a binary to be used when launching this agent. + /// + /// This can be used to run a specific binary without automatic downloads or searching `$PATH`. + #[serde(rename = "command")] + pub path: Option, + /// If a binary is specified in `command`, it will be passed these arguments. + pub args: Option>, + /// If a binary is specified in `command`, it will be passed these environment variables. + pub env: Option>, + /// Whether to skip searching `$PATH` for an agent server binary when + /// launching this agent. + /// + /// This has no effect if a `command` is specified. Otherwise, when this is + /// `false`, Zed will search `$PATH` for an agent server binary and, if one + /// is found, use it for threads with this agent. If no agent binary is + /// found on `$PATH`, Zed will automatically install and use its own binary. + /// When this is `true`, Zed will not search `$PATH`, and will always use + /// its own binary. + /// + /// Default: true + pub ignore_system_version: Option, + /// The default mode to use for this agent. + /// + /// Note: Not only all agents support modes. + /// + /// Default: None + pub default_mode: Option, +} + +#[skip_serializing_none] +#[derive(Deserialize, Serialize, Clone, JsonSchema, MergeFrom, Debug, PartialEq)] +pub struct CustomAgentServerSettings { + #[serde(rename = "command")] + pub path: PathBuf, + #[serde(default)] + pub args: Vec, + pub env: Option>, + /// The default mode to use for this agent. + /// + /// Note: Not only all agents support modes. + /// + /// Default: None + pub default_mode: Option, +} diff --git a/crates/settings/src/settings_content/editor.rs b/crates/settings/src/settings_content/editor.rs new file mode 100644 index 0000000000000000000000000000000000000000..5bd1b0daf9206b6ea97374a0281c7f737e0fc2e0 --- /dev/null +++ b/crates/settings/src/settings_content/editor.rs @@ -0,0 +1,794 @@ +use std::fmt::Display; +use std::num; + +use collections::HashMap; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; + +use crate::{DiagnosticSeverityContent, ShowScrollbar}; + +#[skip_serializing_none] +#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct EditorSettingsContent { + /// Whether the cursor blinks in the editor. + /// + /// Default: true + pub cursor_blink: Option, + /// Cursor shape for the default editor. + /// Can be "bar", "block", "underline", or "hollow". + /// + /// Default: bar + pub cursor_shape: Option, + /// Determines when the mouse cursor should be hidden in an editor or input box. + /// + /// Default: on_typing_and_movement + pub hide_mouse: Option, + /// Determines how snippets are sorted relative to other completion items. + /// + /// Default: inline + pub snippet_sort_order: Option, + /// How to highlight the current line in the editor. + /// + /// Default: all + pub current_line_highlight: Option, + /// Whether to highlight all occurrences of the selected text in an editor. + /// + /// Default: true + pub selection_highlight: Option, + /// Whether the text selection should have rounded corners. + /// + /// Default: true + pub rounded_selection: Option, + /// The debounce delay before querying highlights from the language + /// server based on the current cursor location. + /// + /// Default: 75 + pub lsp_highlight_debounce: Option, + /// Whether to show the informational hover box when moving the mouse + /// over symbols in the editor. + /// + /// Default: true + pub hover_popover_enabled: Option, + /// Time to wait in milliseconds before showing the informational hover box. + /// + /// Default: 300 + pub hover_popover_delay: Option, + /// Toolbar related settings + pub toolbar: Option, + /// Scrollbar related settings + pub scrollbar: Option, + /// Minimap related settings + pub minimap: Option, + /// Gutter related settings + pub gutter: Option, + /// Whether the editor will scroll beyond the last line. + /// + /// Default: one_page + pub scroll_beyond_last_line: Option, + /// The number of lines to keep above/below the cursor when auto-scrolling. + /// + /// Default: 3. + pub vertical_scroll_margin: Option, + /// Whether to scroll when clicking near the edge of the visible text area. + /// + /// Default: false + pub autoscroll_on_clicks: Option, + /// The number of characters to keep on either side when scrolling with the mouse. + /// + /// Default: 5. + pub horizontal_scroll_margin: Option, + /// Scroll sensitivity multiplier. This multiplier is applied + /// to both the horizontal and vertical delta values while scrolling. + /// + /// Default: 1.0 + pub scroll_sensitivity: Option, + /// Scroll sensitivity multiplier for fast scrolling. This multiplier is applied + /// to both the horizontal and vertical delta values while scrolling. Fast scrolling + /// happens when a user holds the alt or option key while scrolling. + /// + /// Default: 4.0 + pub fast_scroll_sensitivity: Option, + /// Whether the line numbers on editors gutter are relative or not. + /// + /// Default: false + pub relative_line_numbers: Option, + /// When to populate a new search's query based on the text under the cursor. + /// + /// Default: always + pub seed_search_query_from_cursor: Option, + pub use_smartcase_search: Option, + /// Determines the modifier to be used to add multiple cursors with the mouse. The open hover link mouse gestures will adapt such that it do not conflict with the multicursor modifier. + /// + /// Default: alt + pub multi_cursor_modifier: Option, + /// Hide the values of variables in `private` files, as defined by the + /// private_files setting. This only changes the visual representation, + /// the values are still present in the file and can be selected / copied / pasted + /// + /// Default: false + pub redact_private_values: Option, + + /// How many lines to expand the multibuffer excerpts by default + /// + /// Default: 3 + pub expand_excerpt_lines: Option, + + /// How many lines of context to provide in multibuffer excerpts by default + /// + /// Default: 2 + pub excerpt_context_lines: Option, + + /// Whether to enable middle-click paste on Linux + /// + /// Default: true + pub middle_click_paste: Option, + + /// What to do when multibuffer is double clicked in some of its excerpts + /// (parts of singleton buffers). + /// + /// Default: select + pub double_click_in_multibuffer: Option, + /// Whether the editor search results will loop + /// + /// Default: true + pub search_wrap: Option, + + /// Defaults to use when opening a new buffer and project search items. + /// + /// Default: nothing is enabled + pub search: Option, + + /// Whether to automatically show a signature help pop-up or not. + /// + /// Default: false + pub auto_signature_help: Option, + + /// Whether to show the signature help pop-up after completions or bracket pairs inserted. + /// + /// Default: false + pub show_signature_help_after_edits: Option, + /// The minimum APCA perceptual contrast to maintain when + /// rendering text over highlight backgrounds in the editor. + /// + /// Values range from 0 to 106. Set to 0 to disable adjustments. + /// Default: 45 + #[schemars(range(min = 0, max = 106))] + pub minimum_contrast_for_highlights: Option, + + /// Whether to follow-up empty go to definition responses from the language server or not. + /// `FindAllReferences` allows to look up references of the same symbol instead. + /// `None` disables the fallback. + /// + /// Default: FindAllReferences + pub go_to_definition_fallback: Option, + + /// Jupyter REPL settings. + pub jupyter: Option, + + /// Which level to use to filter out diagnostics displayed in the editor. + /// + /// Affects the editor rendering only, and does not interrupt + /// the functionality of diagnostics fetching and project diagnostics editor. + /// Which files containing diagnostic errors/warnings to mark in the tabs. + /// Diagnostics are only shown when file icons are also active. + /// + /// Shows all diagnostics if not specified. + /// + /// Default: warning + pub diagnostics_max_severity: Option, + + /// Whether to show code action button at start of buffer line. + /// + /// Default: true + pub inline_code_actions: Option, + + /// Drag and drop related settings + pub drag_and_drop_selection: Option, + + /// How to render LSP `textDocument/documentColor` colors in the editor. + /// + /// Default: [`DocumentColorsRenderMode::Inlay`] + pub lsp_document_colors: Option, +} + +// Toolbar related settings +#[skip_serializing_none] +#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct ToolbarContent { + /// Whether to display breadcrumbs in the editor toolbar. + /// + /// Default: true + pub breadcrumbs: Option, + /// Whether to display quick action buttons in the editor toolbar. + /// + /// Default: true + pub quick_actions: Option, + /// Whether to show the selections menu in the editor toolbar. + /// + /// Default: true + pub selections_menu: Option, + /// Whether to display Agent review buttons in the editor toolbar. + /// Only applicable while reviewing a file edited by the Agent. + /// + /// Default: true + pub agent_review: Option, + /// Whether to display code action buttons in the editor toolbar. + /// + /// Default: false + pub code_actions: Option, +} + +/// Scrollbar related settings +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Default)] +pub struct ScrollbarContent { + /// When to show the scrollbar in the editor. + /// + /// Default: auto + pub show: Option, + /// Whether to show git diff indicators in the scrollbar. + /// + /// Default: true + pub git_diff: Option, + /// Whether to show buffer search result indicators in the scrollbar. + /// + /// Default: true + pub search_results: Option, + /// Whether to show selected text occurrences in the scrollbar. + /// + /// Default: true + pub selected_text: Option, + /// Whether to show selected symbol occurrences in the scrollbar. + /// + /// Default: true + pub selected_symbol: Option, + /// Which diagnostic indicators to show in the scrollbar: + /// + /// Default: all + pub diagnostics: Option, + /// Whether to show cursor positions in the scrollbar. + /// + /// Default: true + pub cursors: Option, + /// Forcefully enable or disable the scrollbar for each axis + pub axes: Option, +} + +/// Minimap related settings +#[skip_serializing_none] +#[derive(Clone, Default, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct MinimapContent { + /// When to show the minimap in the editor. + /// + /// Default: never + pub show: Option, + + /// Where to show the minimap in the editor. + /// + /// Default: [`DisplayIn::ActiveEditor`] + pub display_in: Option, + + /// When to show the minimap thumb. + /// + /// Default: always + pub thumb: Option, + + /// Defines the border style for the minimap's scrollbar thumb. + /// + /// Default: left_open + pub thumb_border: Option, + + /// How to highlight the current line in the minimap. + /// + /// Default: inherits editor line highlights setting + pub current_line_highlight: Option, + + /// Maximum number of columns to display in the minimap. + /// + /// Default: 80 + pub max_width_columns: Option, +} + +/// Forcefully enable or disable the scrollbar for each axis +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Default)] +pub struct ScrollbarAxesContent { + /// When false, forcefully disables the horizontal scrollbar. Otherwise, obey other settings. + /// + /// Default: true + pub horizontal: Option, + + /// When false, forcefully disables the vertical scrollbar. Otherwise, obey other settings. + /// + /// Default: true + pub vertical: Option, +} + +/// Gutter related settings +#[skip_serializing_none] +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct GutterContent { + /// Whether to show line numbers in the gutter. + /// + /// Default: true + pub line_numbers: Option, + /// Minimum number of characters to reserve space for in the gutter. + /// + /// Default: 4 + pub min_line_number_digits: Option, + /// Whether to show runnable buttons in the gutter. + /// + /// Default: true + pub runnables: Option, + /// Whether to show breakpoints in the gutter. + /// + /// Default: true + pub breakpoints: Option, + /// Whether to show fold buttons in the gutter. + /// + /// Default: true + pub folds: Option, +} + +/// How to render LSP `textDocument/documentColor` colors in the editor. +#[derive( + Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, +)] +#[serde(rename_all = "snake_case")] +pub enum DocumentColorsRenderMode { + /// Do not query and render document colors. + None, + /// Render document colors as inlay hints near the color text. + #[default] + Inlay, + /// Draw a border around the color text. + Border, + /// Draw a background behind the color text. + Background, +} + +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum CurrentLineHighlight { + // Don't highlight the current line. + None, + // Highlight the gutter area. + Gutter, + // Highlight the editor area. + Line, + // Highlight the full line. + All, +} + +/// When to populate a new search's query based on the text under the cursor. +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum SeedQuerySetting { + /// Always populate the search query with the word under the cursor. + Always, + /// Only populate the search query when there is text selected. + Selection, + /// Never populate the search query + Never, +} + +/// What to do when multibuffer is double clicked in some of its excerpts (parts of singleton buffers). +#[derive( + Default, + Copy, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum DoubleClickInMultibuffer { + /// Behave as a regular buffer and select the whole word. + #[default] + Select, + /// Open the excerpt clicked as a new buffer in the new tab, if no `alt` modifier was pressed during double click. + /// Otherwise, behave as a regular buffer and select the whole word. + Open, +} + +/// When to show the minimap thumb. +/// +/// Default: always +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum MinimapThumb { + /// Show the minimap thumb only when the mouse is hovering over the minimap. + Hover, + /// Always show the minimap thumb. + #[default] + Always, +} + +/// Defines the border style for the minimap's scrollbar thumb. +/// +/// Default: left_open +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum MinimapThumbBorder { + /// Displays a border on all sides of the thumb. + Full, + /// Displays a border on all sides except the left side of the thumb. + #[default] + LeftOpen, + /// Displays a border on all sides except the right side of the thumb. + RightOpen, + /// Displays a border only on the left side of the thumb. + LeftOnly, + /// Displays the thumb without any border. + None, +} + +/// Which diagnostic indicators to show in the scrollbar. +/// +/// Default: all +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "lowercase")] +pub enum ScrollbarDiagnostics { + /// Show all diagnostic levels: hint, information, warnings, error. + All, + /// Show only the following diagnostic levels: information, warning, error. + Information, + /// Show only the following diagnostic levels: warning, error. + Warning, + /// Show only the following diagnostic level: error. + Error, + /// Do not show diagnostics. + None, +} + +/// The key to use for adding multiple cursors +/// +/// Default: alt +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum MultiCursorModifier { + Alt, + #[serde(alias = "cmd", alias = "ctrl")] + CmdOrCtrl, +} + +/// Whether the editor will scroll beyond the last line. +/// +/// Default: one_page +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum ScrollBeyondLastLine { + /// The editor will not scroll beyond the last line. + Off, + + /// The editor will scroll beyond the last line by one page. + OnePage, + + /// The editor will scroll beyond the last line by the same number of lines as vertical_scroll_margin. + VerticalScrollMargin, +} + +/// The shape of a selection cursor. +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum CursorShape { + /// A vertical bar + #[default] + Bar, + /// A block that surrounds the following character + Block, + /// An underline that runs along the following character + Underline, + /// A box drawn around the following character + Hollow, +} + +/// What to do when go to definition yields no results. +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum GoToDefinitionFallback { + /// Disables the fallback. + None, + /// Looks up references of the same symbol instead. + #[default] + FindAllReferences, +} + +/// Determines when the mouse cursor should be hidden in an editor or input box. +/// +/// Default: on_typing_and_movement +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum HideMouseMode { + /// Never hide the mouse cursor + Never, + /// Hide only when typing + OnTyping, + /// Hide on both typing and cursor movement + #[default] + OnTypingAndMovement, +} + +/// Determines how snippets are sorted relative to other completion items. +/// +/// Default: inline +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum SnippetSortOrder { + /// Place snippets at the top of the completion list + Top, + /// Sort snippets normally using the default comparison logic + #[default] + Inline, + /// Place snippets at the bottom of the completion list + Bottom, + /// Do not show snippets in the completion list + None, +} + +/// Default options for buffer and project search items. +#[skip_serializing_none] +#[derive(Clone, Default, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct SearchSettingsContent { + /// Whether to show the project search button in the status bar. + pub button: Option, + pub whole_word: Option, + pub case_sensitive: Option, + pub include_ignored: Option, + pub regex: Option, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub struct JupyterContent { + /// Whether the Jupyter feature is enabled. + /// + /// Default: true + pub enabled: Option, + + /// Default kernels to select for each language. + /// + /// Default: `{}` + pub kernel_selections: Option>, +} + +/// Whether to allow drag and drop text selection in buffer. +#[skip_serializing_none] +#[derive(Clone, Default, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct DragAndDropSelectionContent { + /// When true, enables drag and drop text selection in buffer. + /// + /// Default: true + pub enabled: Option, + + /// The delay in milliseconds that must elapse before drag and drop is allowed. Otherwise, a new text selection is created. + /// + /// Default: 300 + pub delay: Option, +} + +/// When to show the minimap in the editor. +/// +/// Default: never +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum ShowMinimap { + /// Follow the visibility of the scrollbar. + Auto, + /// Always show the minimap. + Always, + /// Never show the minimap. + #[default] + Never, +} + +/// Where to show the minimap in the editor. +/// +/// Default: all_editors +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum DisplayIn { + /// Show on all open editors. + AllEditors, + /// Show the minimap on the active editor only. + #[default] + ActiveEditor, +} + +/// Minimum APCA perceptual contrast for text over highlight backgrounds. +/// +/// Valid range: 0.0 to 106.0 +/// Default: 45.0 +#[derive( + Clone, + Copy, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + PartialOrd, + derive_more::FromStr, +)] +#[serde(transparent)] +pub struct MinimumContrast(pub f32); + +impl Display for MinimumContrast { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:.1}", self.0) + } +} diff --git a/crates/settings/src/settings_content/extension.rs b/crates/settings/src/settings_content/extension.rs new file mode 100644 index 0000000000000000000000000000000000000000..f8abb5283ff02365efe5f8cd919757c0e0c4565a --- /dev/null +++ b/crates/settings/src/settings_content/extension.rs @@ -0,0 +1,47 @@ +use std::sync::Arc; + +use collections::HashMap; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct ExtensionSettingsContent { + /// The extensions that should be automatically installed by Zed. + /// + /// This is used to make functionality provided by extensions (e.g., language support) + /// available out-of-the-box. + /// + /// Default: { "html": true } + #[serde(default)] + pub auto_install_extensions: HashMap, bool>, + #[serde(default)] + pub auto_update_extensions: HashMap, bool>, + /// The capabilities granted to extensions. + #[serde(default)] + pub granted_extension_capabilities: Option>, +} + +/// A capability for an extension. +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(tag = "kind", rename_all = "snake_case")] +pub enum ExtensionCapabilityContent { + #[serde(rename = "process:exec")] + ProcessExec { + /// The command to execute. + command: String, + /// The arguments to pass to the command. Use `*` for a single wildcard argument. + /// If the last element is `**`, then any trailing arguments are allowed. + args: Vec, + }, + DownloadFile { + host: String, + path: Vec, + }, + #[serde(rename = "npm:install")] + NpmInstallPackage { + package: String, + }, +} diff --git a/crates/settings/src/settings_content/language.rs b/crates/settings/src/settings_content/language.rs new file mode 100644 index 0000000000000000000000000000000000000000..856a0d9394626eb42583bdc32940fb3bebfcb552 --- /dev/null +++ b/crates/settings/src/settings_content/language.rs @@ -0,0 +1,942 @@ +use std::{borrow::Cow, num::NonZeroU32}; + +use collections::{HashMap, HashSet}; +use gpui::{Modifiers, SharedString}; +use schemars::{JsonSchema, json_schema}; +use serde::{ + Deserialize, Deserializer, Serialize, + de::{self, IntoDeserializer, MapAccess, SeqAccess, Visitor}, +}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; +use std::sync::Arc; + +use crate::{ExtendingVec, merge_from}; + +#[skip_serializing_none] +#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)] +pub struct AllLanguageSettingsContent { + /// The settings for enabling/disabling features. + #[serde(default)] + pub features: Option, + /// The edit prediction settings. + #[serde(default)] + pub edit_predictions: Option, + /// The default language settings. + #[serde(flatten)] + pub defaults: LanguageSettingsContent, + /// The settings for individual languages. + #[serde(default)] + pub languages: LanguageToSettingsMap, + /// Settings for associating file extensions and filenames + /// with languages. + #[serde(default)] + pub file_types: HashMap, ExtendingVec>, +} + +impl merge_from::MergeFrom for AllLanguageSettingsContent { + fn merge_from(&mut self, other: &Self) { + self.file_types.merge_from(&other.file_types); + self.features.merge_from(&other.features); + self.edit_predictions.merge_from(&other.edit_predictions); + + // A user's global settings override the default global settings and + // all default language-specific settings. + // + self.defaults.merge_from(&other.defaults); + for language_settings in self.languages.0.values_mut() { + language_settings.merge_from(&other.defaults); + } + + // A user's language-specific settings override default language-specific settings. + for (language_name, user_language_settings) in &other.languages.0 { + if let Some(existing) = self.languages.0.get_mut(language_name) { + existing.merge_from(&user_language_settings); + } else { + let mut new_settings = self.defaults.clone(); + new_settings.merge_from(&user_language_settings); + + self.languages.0.insert(language_name.clone(), new_settings); + } + } + } +} + +/// The settings for enabling/disabling features. +#[skip_serializing_none] +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub struct FeaturesContent { + /// Determines which edit prediction provider to use. + pub edit_prediction_provider: Option, +} + +/// The provider that supplies edit predictions. +#[derive( + Copy, Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom, +)] +#[serde(rename_all = "snake_case")] +pub enum EditPredictionProvider { + None, + #[default] + Copilot, + Supermaven, + Zed, + Codestral, +} + +impl EditPredictionProvider { + pub fn is_zed(&self) -> bool { + match self { + EditPredictionProvider::Zed => true, + EditPredictionProvider::None + | EditPredictionProvider::Copilot + | EditPredictionProvider::Supermaven + | EditPredictionProvider::Codestral => false, + } + } +} + +/// The contents of the edit prediction settings. +#[skip_serializing_none] +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct EditPredictionSettingsContent { + /// A list of globs representing files that edit predictions should be disabled for. + /// This list adds to a pre-existing, sensible default set of globs. + /// Any additional ones you add are combined with them. + pub disabled_globs: Option>, + /// The mode used to display edit predictions in the buffer. + /// Provider support required. + pub mode: Option, + /// Settings specific to GitHub Copilot. + pub copilot: Option, + /// Settings specific to Codestral. + pub codestral: Option, + /// Whether edit predictions are enabled in the assistant prompt editor. + /// This has no effect if globally disabled. + pub enabled_in_text_threads: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct CopilotSettingsContent { + /// HTTP/HTTPS proxy to use for Copilot. + /// + /// Default: none + pub proxy: Option, + /// Disable certificate verification for the proxy (not recommended). + /// + /// Default: false + pub proxy_no_verify: Option, + /// Enterprise URI for Copilot. + /// + /// Default: none + pub enterprise_uri: Option, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct CodestralSettingsContent { + /// Model to use for completions. + /// + /// Default: "codestral-latest" + #[serde(default)] + pub model: Option, + /// Maximum tokens to generate. + /// + /// Default: 150 + #[serde(default)] + pub max_tokens: Option, +} + +/// The mode in which edit predictions should be displayed. +#[derive( + Copy, Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom, +)] +#[serde(rename_all = "snake_case")] +pub enum EditPredictionsMode { + /// If provider supports it, display inline when holding modifier key (e.g., alt). + /// Otherwise, eager preview is used. + #[serde(alias = "auto")] + Subtle, + /// Display inline when there are no language server completions available. + #[default] + #[serde(alias = "eager_preview")] + Eager, +} + +/// Controls the soft-wrapping behavior in the editor. +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum SoftWrap { + /// Prefer a single line generally, unless an overly long line is encountered. + None, + /// Deprecated: use None instead. Left to avoid breaking existing users' configs. + /// Prefer a single line generally, unless an overly long line is encountered. + PreferLine, + /// Soft wrap lines that exceed the editor width. + EditorWidth, + /// Soft wrap lines at the preferred line length. + PreferredLineLength, + /// Soft wrap line at the preferred line length or the editor width (whichever is smaller). + Bounded, +} + +/// The settings for a particular language. +#[skip_serializing_none] +#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct LanguageSettingsContent { + /// How many columns a tab should occupy. + /// + /// Default: 4 + #[schemars(range(min = 1, max = 128))] + pub tab_size: Option, + /// Whether to indent lines using tab characters, as opposed to multiple + /// spaces. + /// + /// Default: false + pub hard_tabs: Option, + /// How to soft-wrap long lines of text. + /// + /// Default: none + pub soft_wrap: Option, + /// The column at which to soft-wrap lines, for buffers where soft-wrap + /// is enabled. + /// + /// Default: 80 + pub preferred_line_length: Option, + /// Whether to show wrap guides in the editor. Setting this to true will + /// show a guide at the 'preferred_line_length' value if softwrap is set to + /// 'preferred_line_length', and will show any additional guides as specified + /// by the 'wrap_guides' setting. + /// + /// Default: true + pub show_wrap_guides: Option, + /// Character counts at which to show wrap guides in the editor. + /// + /// Default: [] + pub wrap_guides: Option>, + /// Indent guide related settings. + pub indent_guides: Option, + /// Whether or not to perform a buffer format before saving. + /// + /// Default: on + pub format_on_save: Option, + /// Whether or not to remove any trailing whitespace from lines of a buffer + /// before saving it. + /// + /// Default: true + pub remove_trailing_whitespace_on_save: Option, + /// Whether or not to ensure there's a single newline at the end of a buffer + /// when saving it. + /// + /// Default: true + pub ensure_final_newline_on_save: Option, + /// How to perform a buffer format. + /// + /// Default: auto + pub formatter: Option, + /// Zed's Prettier integration settings. + /// Allows to enable/disable formatting with Prettier + /// and configure default Prettier, used when no project-level Prettier installation is found. + /// + /// Default: off + pub prettier: Option, + /// Whether to automatically close JSX tags. + pub jsx_tag_auto_close: Option, + /// Whether to use language servers to provide code intelligence. + /// + /// Default: true + pub enable_language_server: Option, + /// The list of language servers to use (or disable) for this language. + /// + /// This array should consist of language server IDs, as well as the following + /// special tokens: + /// - `"!"` - A language server ID prefixed with a `!` will be disabled. + /// - `"..."` - A placeholder to refer to the **rest** of the registered language servers for this language. + /// + /// Default: ["..."] + pub language_servers: Option>, + /// Controls where the `editor::Rewrap` action is allowed for this language. + /// + /// Note: This setting has no effect in Vim mode, as rewrap is already + /// allowed everywhere. + /// + /// Default: "in_comments" + pub allow_rewrap: Option, + /// Controls whether edit predictions are shown immediately (true) + /// or manually by triggering `editor::ShowEditPrediction` (false). + /// + /// Default: true + pub show_edit_predictions: Option, + /// Controls whether edit predictions are shown in the given language + /// scopes. + /// + /// Example: ["string", "comment"] + /// + /// Default: [] + pub edit_predictions_disabled_in: Option>, + /// Whether to show tabs and spaces in the editor. + pub show_whitespaces: Option, + /// Visible characters used to render whitespace when show_whitespaces is enabled. + /// + /// Default: "•" for spaces, "→" for tabs. + pub whitespace_map: Option, + /// Whether to start a new line with a comment when a previous line is a comment as well. + /// + /// Default: true + pub extend_comment_on_newline: Option, + /// Inlay hint related settings. + pub inlay_hints: Option, + /// Whether to automatically type closing characters for you. For example, + /// when you type (, Zed will automatically add a closing ) at the correct position. + /// + /// Default: true + pub use_autoclose: Option, + /// Whether to automatically surround text with characters for you. For example, + /// when you select text and type (, Zed will automatically surround text with (). + /// + /// Default: true + pub use_auto_surround: Option, + /// Controls how the editor handles the autoclosed characters. + /// When set to `false`(default), skipping over and auto-removing of the closing characters + /// happen only for auto-inserted characters. + /// Otherwise(when `true`), the closing characters are always skipped over and auto-removed + /// no matter how they were inserted. + /// + /// Default: false + pub always_treat_brackets_as_autoclosed: Option, + /// Whether to use additional LSP queries to format (and amend) the code after + /// every "trigger" symbol input, defined by LSP server capabilities. + /// + /// Default: true + pub use_on_type_format: Option, + /// Whether to perform linked edits of associated ranges, if the language server supports it. + /// For example, when editing opening tag, the contents of the closing tag will be edited as well. + /// + /// Default: true + pub linked_edits: Option, + /// Whether indentation should be adjusted based on the context whilst typing. + /// + /// Default: true + pub auto_indent: Option, + /// Whether indentation of pasted content should be adjusted based on the context. + /// + /// Default: true + pub auto_indent_on_paste: Option, + /// Task configuration for this language. + /// + /// Default: {} + pub tasks: Option, + /// Whether to pop the completions menu while typing in an editor without + /// explicitly requesting it. + /// + /// Default: true + pub show_completions_on_input: Option, + /// Whether to display inline and alongside documentation for items in the + /// completions menu. + /// + /// Default: true + pub show_completion_documentation: Option, + /// Controls how completions are processed for this language. + pub completions: Option, + /// Preferred debuggers for this language. + /// + /// Default: [] + pub debuggers: Option>, +} + +/// Controls how whitespace should be displayedin the editor. +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum ShowWhitespaceSetting { + /// Draw whitespace only for the selected text. + Selection, + /// Do not draw any tabs or spaces. + None, + /// Draw all invisible symbols. + All, + /// Draw whitespaces at boundaries only. + /// + /// For a whitespace to be on a boundary, any of the following conditions need to be met: + /// - It is a tab + /// - It is adjacent to an edge (start or end) + /// - It is adjacent to a whitespace (left or right) + Boundary, + /// Draw whitespaces only after non-whitespace characters. + Trailing, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct WhitespaceMapContent { + pub space: Option, + pub tab: Option, +} + +/// The behavior of `editor::Rewrap`. +#[derive( + Debug, + PartialEq, + Clone, + Copy, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum RewrapBehavior { + /// Only rewrap within comments. + #[default] + InComments, + /// Only rewrap within the current selection(s). + InSelections, + /// Allow rewrapping anywhere. + Anywhere, +} + +#[skip_serializing_none] +#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct JsxTagAutoCloseSettingsContent { + /// Enables or disables auto-closing of JSX tags. + pub enabled: Option, +} + +/// The settings for inlay hints. +#[skip_serializing_none] +#[derive(Clone, Default, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct InlayHintSettingsContent { + /// Global switch to toggle hints on and off. + /// + /// Default: false + pub enabled: Option, + /// Global switch to toggle inline values on and off when debugging. + /// + /// Default: true + pub show_value_hints: Option, + /// Whether type hints should be shown. + /// + /// Default: true + pub show_type_hints: Option, + /// Whether parameter hints should be shown. + /// + /// Default: true + pub show_parameter_hints: Option, + /// Whether other hints should be shown. + /// + /// Default: true + pub show_other_hints: Option, + /// Whether to show a background for inlay hints. + /// + /// If set to `true`, the background will use the `hint.background` color + /// from the current theme. + /// + /// Default: false + pub show_background: Option, + /// Whether or not to debounce inlay hints updates after buffer edits. + /// + /// Set to 0 to disable debouncing. + /// + /// Default: 700 + pub edit_debounce_ms: Option, + /// Whether or not to debounce inlay hints updates after buffer scrolls. + /// + /// Set to 0 to disable debouncing. + /// + /// Default: 50 + pub scroll_debounce_ms: Option, + /// Toggles inlay hints (hides or shows) when the user presses the modifiers specified. + /// If only a subset of the modifiers specified is pressed, hints are not toggled. + /// If no modifiers are specified, this is equivalent to `null`. + /// + /// Default: null + pub toggle_on_modifiers_press: Option, +} + +/// The kind of an inlay hint. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum InlayHintKind { + /// An inlay hint for a type. + Type, + /// An inlay hint for a parameter. + Parameter, +} + +impl InlayHintKind { + /// Returns the [`InlayHintKind`]fromthe given name. + /// + /// Returns `None` if `name` does not match any of the expected + /// string representations. + pub fn from_name(name: &str) -> Option { + match name { + "type" => Some(InlayHintKind::Type), + "parameter" => Some(InlayHintKind::Parameter), + _ => None, + } + } + + /// Returns the name of this [`InlayHintKind`]. + pub fn name(&self) -> &'static str { + match self { + InlayHintKind::Type => "type", + InlayHintKind::Parameter => "parameter", + } + } +} + +/// Controls how completions are processed for this language. +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom, Default)] +#[serde(rename_all = "snake_case")] +pub struct CompletionSettingsContent { + /// Controls how words are completed. + /// For large documents, not all words may be fetched for completion. + /// + /// Default: `fallback` + pub words: Option, + /// How many characters has to be in the completions query to automatically show the words-based completions. + /// Before that value, it's still possible to trigger the words-based completion manually with the corresponding editor command. + /// + /// Default: 3 + pub words_min_length: Option, + /// Whether to fetch LSP completions or not. + /// + /// Default: true + pub lsp: Option, + /// When fetching LSP completions, determines how long to wait for a response of a particular server. + /// When set to 0, waits indefinitely. + /// + /// Default: 0 + pub lsp_fetch_timeout_ms: Option, + /// Controls how LSP completions are inserted. + /// + /// Default: "replace_suffix" + pub lsp_insert_mode: Option, +} + +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum LspInsertMode { + /// Replaces text before the cursor, using the `insert` range described in the LSP specification. + Insert, + /// Replaces text before and after the cursor, using the `replace` range described in the LSP specification. + Replace, + /// Behaves like `"replace"` if the text that would be replaced is a subsequence of the completion text, + /// and like `"insert"` otherwise. + ReplaceSubsequence, + /// Behaves like `"replace"` if the text after the cursor is a suffix of the completion, and like + /// `"insert"` otherwise. + ReplaceSuffix, +} + +/// Controls how document's words are completed. +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum WordsCompletionMode { + /// Always fetch document's words for completions along with LSP completions. + Enabled, + /// Only if LSP response errors or times out, + /// use document's words to show completions. + Fallback, + /// Never fetch or complete document's words for completions. + /// (Word-based completions can still be queried via a separate action) + Disabled, +} + +/// Allows to enable/disable formatting with Prettier +/// and configure default Prettier, used when no project-level Prettier installation is found. +/// Prettier formatting is disabled by default. +#[skip_serializing_none] +#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct PrettierSettingsContent { + /// Enables or disables formatting with Prettier for a given language. + pub allowed: Option, + + /// Forces Prettier integration to use a specific parser name when formatting files with the language. + pub parser: Option, + + /// Forces Prettier integration to use specific plugins when formatting files with the language. + /// The default Prettier will be installed with these plugins. + pub plugins: Option>, + + /// Default Prettier options, in the format as in package.json section for Prettier. + /// If project installs Prettier via its package.json, these options will be ignored. + #[serde(flatten)] + pub options: Option>, +} + +/// TODO: this should just be a bool +/// Controls the behavior of formatting files when they are saved. +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "lowercase")] +pub enum FormatOnSave { + /// Files should be formatted on save. + On, + /// Files should not be formatted on save. + Off, +} + +/// Controls which formatter should be used when formatting code. +#[derive(Clone, Debug, Default, PartialEq, Eq, MergeFrom)] +pub enum SelectedFormatter { + /// Format files using Zed's Prettier integration (if applicable), + /// or falling back to formatting via language server. + #[default] + Auto, + List(FormatterList), +} + +impl JsonSchema for SelectedFormatter { + fn schema_name() -> Cow<'static, str> { + "Formatter".into() + } + + fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema { + let formatter_schema = Formatter::json_schema(generator); + + json_schema!({ + "oneOf": [ + { + "type": "array", + "items": formatter_schema + }, + { + "type": "string", + "enum": ["auto", "language_server"] + }, + formatter_schema + ] + }) + } +} + +impl Serialize for SelectedFormatter { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + match self { + SelectedFormatter::Auto => serializer.serialize_str("auto"), + SelectedFormatter::List(list) => list.serialize(serializer), + } + } +} + +impl<'de> Deserialize<'de> for SelectedFormatter { + fn deserialize(deserializer: D) -> std::result::Result + where + D: Deserializer<'de>, + { + struct FormatDeserializer; + + impl<'d> Visitor<'d> for FormatDeserializer { + type Value = SelectedFormatter; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a valid formatter kind") + } + fn visit_str(self, v: &str) -> std::result::Result + where + E: serde::de::Error, + { + if v == "auto" { + Ok(Self::Value::Auto) + } else if v == "language_server" { + Ok(Self::Value::List(FormatterList::Single( + Formatter::LanguageServer { name: None }, + ))) + } else { + let ret: Result = + Deserialize::deserialize(v.into_deserializer()); + ret.map(SelectedFormatter::List) + } + } + fn visit_map(self, map: A) -> Result + where + A: MapAccess<'d>, + { + let ret: Result = + Deserialize::deserialize(de::value::MapAccessDeserializer::new(map)); + ret.map(SelectedFormatter::List) + } + fn visit_seq(self, map: A) -> Result + where + A: SeqAccess<'d>, + { + let ret: Result = + Deserialize::deserialize(de::value::SeqAccessDeserializer::new(map)); + ret.map(SelectedFormatter::List) + } + } + deserializer.deserialize_any(FormatDeserializer) + } +} + +/// Controls which formatters should be used when formatting code. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(untagged)] +pub enum FormatterList { + Single(Formatter), + Vec(Vec), +} + +impl Default for FormatterList { + fn default() -> Self { + Self::Single(Formatter::default()) + } +} + +impl AsRef<[Formatter]> for FormatterList { + fn as_ref(&self) -> &[Formatter] { + match &self { + Self::Single(single) => std::slice::from_ref(single), + Self::Vec(v) => v, + } + } +} + +/// Controls which formatter should be used when formatting code. If there are multiple formatters, they are executed in the order of declaration. +#[derive(Clone, Default, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum Formatter { + /// Format code using the current language server. + LanguageServer { name: Option }, + /// Format code using Zed's Prettier integration. + #[default] + Prettier, + /// Format code using an external command. + External { + /// The external program to run. + command: Arc, + /// The arguments to pass to the program. + arguments: Option>, + }, + /// Files should be formatted using a code action executed by language servers. + CodeAction(String), +} + +/// The settings for indent guides. +#[skip_serializing_none] +#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct IndentGuideSettingsContent { + /// Whether to display indent guides in the editor. + /// + /// Default: true + pub enabled: Option, + /// The width of the indent guides in pixels, between 1 and 10. + /// + /// Default: 1 + pub line_width: Option, + /// The width of the active indent guide in pixels, between 1 and 10. + /// + /// Default: 1 + pub active_line_width: Option, + /// Determines how indent guides are colored. + /// + /// Default: Fixed + pub coloring: Option, + /// Determines how indent guide backgrounds are colored. + /// + /// Default: Disabled + pub background_coloring: Option, +} + +/// The task settings for a particular language. +#[skip_serializing_none] +#[derive(Debug, Clone, Default, Deserialize, PartialEq, Serialize, JsonSchema, MergeFrom)] +pub struct LanguageTaskSettingsContent { + /// Extra task variables to set for a particular language. + pub variables: Option>, + pub enabled: Option, + /// Use LSP tasks over Zed language extension ones. + /// If no LSP tasks are returned due to error/timeout or regular execution, + /// Zed language extension tasks will be used instead. + /// + /// Other Zed tasks will still be shown: + /// * Zed task from either of the task config file + /// * Zed task from history (e.g. one-off task was spawned before) + pub prefer_lsp: Option, +} + +/// Map from language name to settings. +#[skip_serializing_none] +#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct LanguageToSettingsMap(pub HashMap); + +/// Determines how indent guides are colored. +#[derive( + Default, + Debug, + Copy, + Clone, + PartialEq, + Eq, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum IndentGuideColoring { + /// Do not render any lines for indent guides. + Disabled, + /// Use the same color for all indentation levels. + #[default] + Fixed, + /// Use a different color for each indentation level. + IndentAware, +} + +/// Determines how indent guide backgrounds are colored. +#[derive( + Default, + Debug, + Copy, + Clone, + PartialEq, + Eq, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum IndentGuideBackgroundColoring { + /// Do not render any background for indent guides. + #[default] + Disabled, + /// Use a different color for each indentation level. + IndentAware, +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_formatter_deserialization() { + let raw_auto = "{\"formatter\": \"auto\"}"; + let settings: LanguageSettingsContent = serde_json::from_str(raw_auto).unwrap(); + assert_eq!(settings.formatter, Some(SelectedFormatter::Auto)); + let raw = "{\"formatter\": \"language_server\"}"; + let settings: LanguageSettingsContent = serde_json::from_str(raw).unwrap(); + assert_eq!( + settings.formatter, + Some(SelectedFormatter::List(FormatterList::Single( + Formatter::LanguageServer { name: None } + ))) + ); + let raw = "{\"formatter\": [{\"language_server\": {\"name\": null}}]}"; + let settings: LanguageSettingsContent = serde_json::from_str(raw).unwrap(); + assert_eq!( + settings.formatter, + Some(SelectedFormatter::List(FormatterList::Vec(vec![ + Formatter::LanguageServer { name: None } + ]))) + ); + let raw = "{\"formatter\": [{\"language_server\": {\"name\": null}}, \"prettier\"]}"; + let settings: LanguageSettingsContent = serde_json::from_str(raw).unwrap(); + assert_eq!( + settings.formatter, + Some(SelectedFormatter::List(FormatterList::Vec(vec![ + Formatter::LanguageServer { name: None }, + Formatter::Prettier + ]))) + ); + } + + #[test] + fn test_formatter_deserialization_invalid() { + let raw_auto = "{\"formatter\": {}}"; + let result: Result = serde_json::from_str(raw_auto); + assert!(result.is_err()); + } + + #[test] + fn test_prettier_options() { + let raw_prettier = r#"{"allowed": false, "tabWidth": 4, "semi": false}"#; + let result = serde_json::from_str::(raw_prettier) + .expect("Failed to parse prettier options"); + assert!( + result + .options + .as_ref() + .expect("options were flattened") + .contains_key("semi") + ); + assert!( + result + .options + .as_ref() + .expect("options were flattened") + .contains_key("tabWidth") + ); + } +} diff --git a/crates/settings/src/settings_content/language_model.rs b/crates/settings/src/settings_content/language_model.rs new file mode 100644 index 0000000000000000000000000000000000000000..7139aac5eaca5c521007b21dbbb665bb4855347a --- /dev/null +++ b/crates/settings/src/settings_content/language_model.rs @@ -0,0 +1,425 @@ +use collections::HashMap; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; + +use std::sync::Arc; + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct AllLanguageModelSettingsContent { + pub anthropic: Option, + pub bedrock: Option, + pub deepseek: Option, + pub google: Option, + pub lmstudio: Option, + pub mistral: Option, + pub ollama: Option, + pub open_router: Option, + pub openai: Option, + pub openai_compatible: Option, OpenAiCompatibleSettingsContent>>, + pub vercel: Option, + pub x_ai: Option, + #[serde(rename = "zed.dev")] + pub zed_dot_dev: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct AnthropicSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct AnthropicAvailableModel { + /// The model's name in the Anthropic API. e.g. claude-3-5-sonnet-latest, claude-3-opus-20240229, etc + pub name: String, + /// The model's name in Zed's UI, such as in the model selector dropdown menu in the assistant panel. + pub display_name: Option, + /// The model's context window size. + pub max_tokens: u64, + /// A model `name` to substitute when calling tools, in case the primary model doesn't support tool calling. + pub tool_override: Option, + /// Configuration of Anthropic's caching API. + pub cache_configuration: Option, + pub max_output_tokens: Option, + pub default_temperature: Option, + #[serde(default)] + pub extra_beta_headers: Vec, + /// The model's mode (e.g. thinking) + pub mode: Option, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct AmazonBedrockSettingsContent { + pub available_models: Option>, + pub endpoint_url: Option, + pub region: Option, + pub profile: Option, + pub authentication_method: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct BedrockAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub cache_configuration: Option, + pub max_output_tokens: Option, + pub default_temperature: Option, + pub mode: Option, +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub enum BedrockAuthMethodContent { + #[serde(rename = "named_profile")] + NamedProfile, + #[serde(rename = "sso")] + SingleSignOn, + /// IMDSv2, PodIdentity, env vars, etc. + #[serde(rename = "default")] + Automatic, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct OllamaSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct OllamaAvailableModel { + /// The model name in the Ollama API (e.g. "llama3.2:latest") + pub name: String, + /// The model's name in Zed's UI, such as in the model selector dropdown menu in the assistant panel. + pub display_name: Option, + /// The Context Length parameter to the model (aka num_ctx or n_ctx) + pub max_tokens: u64, + /// The number of seconds to keep the connection open after the last request + pub keep_alive: Option, + /// Whether the model supports tools + pub supports_tools: Option, + /// Whether the model supports vision + pub supports_images: Option, + /// Whether to enable think mode + pub supports_thinking: Option, +} + +#[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq, JsonSchema, MergeFrom)] +#[serde(untagged)] +pub enum KeepAlive { + /// Keep model alive for N seconds + Seconds(isize), + /// Keep model alive for a fixed duration. Accepts durations like "5m", "10m", "1h", "1d", etc. + Duration(String), +} + +impl KeepAlive { + /// Keep model alive until a new model is loaded or until Ollama shuts down + pub fn indefinite() -> Self { + Self::Seconds(-1) + } +} + +impl Default for KeepAlive { + fn default() -> Self { + Self::indefinite() + } +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct LmStudioSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct LmStudioAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub supports_tool_calls: bool, + pub supports_images: bool, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct DeepseekSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct DeepseekAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub max_output_tokens: Option, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct MistralSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct MistralAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub max_output_tokens: Option, + pub max_completion_tokens: Option, + pub supports_tools: Option, + pub supports_images: Option, + pub supports_thinking: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct OpenAiSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct OpenAiAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub max_output_tokens: Option, + pub max_completion_tokens: Option, + pub reasoning_effort: Option, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, JsonSchema, MergeFrom)] +#[serde(rename_all = "lowercase")] +pub enum OpenAiReasoningEffort { + Minimal, + Low, + Medium, + High, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct OpenAiCompatibleSettingsContent { + pub api_url: String, + pub available_models: Vec, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct OpenAiCompatibleAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub max_output_tokens: Option, + pub max_completion_tokens: Option, + #[serde(default)] + pub capabilities: OpenAiCompatibleModelCapabilities, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct OpenAiCompatibleModelCapabilities { + pub tools: bool, + pub images: bool, + pub parallel_tool_calls: bool, + pub prompt_cache_key: bool, +} + +impl Default for OpenAiCompatibleModelCapabilities { + fn default() -> Self { + Self { + tools: true, + images: false, + parallel_tool_calls: false, + prompt_cache_key: false, + } + } +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct VercelSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct VercelAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub max_output_tokens: Option, + pub max_completion_tokens: Option, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct GoogleSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct GoogleAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub mode: Option, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct XAiSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct XaiAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub max_output_tokens: Option, + pub max_completion_tokens: Option, + pub supports_images: Option, + pub supports_tools: Option, + pub parallel_tool_calls: Option, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct ZedDotDevSettingsContent { + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct ZedDotDevAvailableModel { + /// The provider of the language model. + pub provider: ZedDotDevAvailableProvider, + /// The model's name in the provider's API. e.g. claude-3-5-sonnet-20240620 + pub name: String, + /// The name displayed in the UI, such as in the assistant panel model dropdown menu. + pub display_name: Option, + /// The size of the context window, indicating the maximum number of tokens the model can process. + pub max_tokens: usize, + /// The maximum number of output tokens allowed by the model. + pub max_output_tokens: Option, + /// The maximum number of completion tokens allowed by the model (o1-* only) + pub max_completion_tokens: Option, + /// Override this model with a different Anthropic model for tool calls. + pub tool_override: Option, + /// Indicates whether this custom model supports caching. + pub cache_configuration: Option, + /// The default temperature to use for this model. + pub default_temperature: Option, + /// Any extra beta headers to provide when using the model. + #[serde(default)] + pub extra_beta_headers: Vec, + /// The model's mode (e.g. thinking) + pub mode: Option, +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "lowercase")] +pub enum ZedDotDevAvailableProvider { + Anthropic, + OpenAi, + Google, +} + +#[skip_serializing_none] +#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] +pub struct OpenRouterSettingsContent { + pub api_url: Option, + pub available_models: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct OpenRouterAvailableModel { + pub name: String, + pub display_name: Option, + pub max_tokens: u64, + pub max_output_tokens: Option, + pub max_completion_tokens: Option, + pub supports_tools: Option, + pub supports_images: Option, + pub mode: Option, + pub provider: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct OpenRouterProvider { + order: Option>, + #[serde(default = "default_true")] + allow_fallbacks: bool, + #[serde(default)] + require_parameters: bool, + #[serde(default)] + data_collection: DataCollection, + only: Option>, + ignore: Option>, + quantizations: Option>, + sort: Option, +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "lowercase")] +pub enum DataCollection { + Allow, + Disallow, +} + +impl Default for DataCollection { + fn default() -> Self { + Self::Allow + } +} + +fn default_true() -> bool { + true +} + +/// Configuration for caching language model messages. +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct LanguageModelCacheConfiguration { + pub max_cache_anchors: usize, + pub should_speculate: bool, + pub min_total_token: u64, +} + +#[derive( + Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom, +)] +#[serde(tag = "type", rename_all = "lowercase")] +pub enum ModelMode { + #[default] + Default, + Thinking { + /// The maximum number of tokens to use for reasoning. Must be lower than the model's `max_output_tokens`. + budget_tokens: Option, + }, +} diff --git a/crates/settings/src/settings_content/project.rs b/crates/settings/src/settings_content/project.rs new file mode 100644 index 0000000000000000000000000000000000000000..88d9f9803e1579a77d7140e826961ad01f5eedac --- /dev/null +++ b/crates/settings/src/settings_content/project.rs @@ -0,0 +1,499 @@ +use std::{path::PathBuf, sync::Arc}; + +use collections::{BTreeMap, HashMap}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; +use util::serde::default_true; + +use crate::{ + AllLanguageSettingsContent, ExtendingVec, ProjectTerminalSettingsContent, SlashCommandSettings, +}; + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct ProjectSettingsContent { + #[serde(flatten)] + pub all_languages: AllLanguageSettingsContent, + + #[serde(flatten)] + pub worktree: WorktreeSettingsContent, + + /// Configuration for language servers. + /// + /// The following settings can be overridden for specific language servers: + /// - initialization_options + /// + /// To override settings for a language, add an entry for that language server's + /// name to the lsp value. + /// Default: null + #[serde(default)] + pub lsp: HashMap, LspSettings>, + + #[serde(default)] + pub terminal: Option, + + /// Configuration for Debugger-related features + #[serde(default)] + pub dap: HashMap, DapSettingsContent>, + + /// Settings for context servers used for AI-related features. + #[serde(default)] + pub context_servers: HashMap, ContextServerSettingsContent>, + + /// Configuration for how direnv configuration should be loaded + pub load_direnv: Option, + + /// Settings for slash commands. + pub slash_commands: Option, + + /// The list of custom Git hosting providers. + pub git_hosting_providers: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct WorktreeSettingsContent { + /// The displayed name of this project. If not set or empty, the root directory name + /// will be displayed. + /// + /// Default: "" + pub project_name: Option, + + /// Completely ignore files matching globs from `file_scan_exclusions`. Overrides + /// `file_scan_inclusions`. + /// + /// Default: [ + /// "**/.git", + /// "**/.svn", + /// "**/.hg", + /// "**/.jj", + /// "**/CVS", + /// "**/.DS_Store", + /// "**/Thumbs.db", + /// "**/.classpath", + /// "**/.settings" + /// ] + pub file_scan_exclusions: Option>, + + /// Always include files that match these globs when scanning for files, even if they're + /// ignored by git. This setting is overridden by `file_scan_exclusions`. + /// Default: [ + /// ".env*", + /// "docker-compose.*.yml", + /// ] + pub file_scan_inclusions: Option>, + + /// Treat the files matching these globs as `.env` files. + /// Default: ["**/.env*", "**/*.pem", "**/*.key", "**/*.cert", "**/*.crt", "**/secrets.yml"] + pub private_files: Option>, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, Hash)] +#[serde(rename_all = "snake_case")] +pub struct LspSettings { + pub binary: Option, + pub initialization_options: Option, + pub settings: Option, + /// If the server supports sending tasks over LSP extensions, + /// this setting can be used to enable or disable them in Zed. + /// Default: true + #[serde(default = "default_true")] + pub enable_lsp_tasks: bool, + pub fetch: Option, +} + +impl Default for LspSettings { + fn default() -> Self { + Self { + binary: None, + initialization_options: None, + settings: None, + enable_lsp_tasks: true, + fetch: None, + } + } +} + +#[skip_serializing_none] +#[derive( + Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, Hash, +)] +pub struct BinarySettings { + pub path: Option, + pub arguments: Option>, + pub env: Option>, + pub ignore_system_version: Option, +} + +#[skip_serializing_none] +#[derive( + Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, Hash, +)] +pub struct FetchSettings { + // Whether to consider pre-releases for fetching + pub pre_release: Option, +} + +/// Common language server settings. +#[skip_serializing_none] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct GlobalLspSettingsContent { + /// Whether to show the LSP servers button in the status bar. + /// + /// Default: `true` + pub button: Option, +} + +#[skip_serializing_none] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub struct DapSettingsContent { + pub binary: Option, + #[serde(default)] + pub args: Option>, +} + +#[skip_serializing_none] +#[derive( + Default, Copy, Clone, PartialEq, Eq, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, +)] +pub struct SessionSettingsContent { + /// Whether or not to restore unsaved buffers on restart. + /// + /// If this is true, user won't be prompted whether to save/discard + /// dirty files when closing the application. + /// + /// Default: true + pub restore_unsaved_buffers: Option, +} + +#[derive(Deserialize, Serialize, Clone, PartialEq, Eq, JsonSchema, MergeFrom, Debug)] +#[serde(tag = "source", rename_all = "snake_case")] +pub enum ContextServerSettingsContent { + Custom { + /// Whether the context server is enabled. + #[serde(default = "default_true")] + enabled: bool, + + #[serde(flatten)] + command: ContextServerCommand, + }, + Extension { + /// Whether the context server is enabled. + #[serde(default = "default_true")] + enabled: bool, + /// The settings for this context server specified by the extension. + /// + /// Consult the documentation for the context server to see what settings + /// are supported. + settings: serde_json::Value, + }, +} +impl ContextServerSettingsContent { + pub fn set_enabled(&mut self, enabled: bool) { + match self { + ContextServerSettingsContent::Custom { + enabled: custom_enabled, + command: _, + } => { + *custom_enabled = enabled; + } + ContextServerSettingsContent::Extension { + enabled: ext_enabled, + settings: _, + } => *ext_enabled = enabled, + } + } +} + +#[skip_serializing_none] +#[derive(Deserialize, Serialize, Clone, PartialEq, Eq, JsonSchema, MergeFrom)] +pub struct ContextServerCommand { + #[serde(rename = "command")] + pub path: PathBuf, + pub args: Vec, + pub env: Option>, + /// Timeout for tool calls in milliseconds. Defaults to 60000 (60 seconds) if not specified. + pub timeout: Option, +} + +impl std::fmt::Debug for ContextServerCommand { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let filtered_env = self.env.as_ref().map(|env| { + env.iter() + .map(|(k, v)| { + ( + k, + if util::redact::should_redact(k) { + "[REDACTED]" + } else { + v + }, + ) + }) + .collect::>() + }); + + f.debug_struct("ContextServerCommand") + .field("path", &self.path) + .field("args", &self.args) + .field("env", &filtered_env) + .finish() + } +} + +#[skip_serializing_none] +#[derive(Copy, Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct GitSettings { + /// Whether or not to show the git gutter. + /// + /// Default: tracked_files + pub git_gutter: Option, + /// Sets the debounce threshold (in milliseconds) after which changes are reflected in the git gutter. + /// + /// Default: 0 + pub gutter_debounce: Option, + /// Whether or not to show git blame data inline in + /// the currently focused line. + /// + /// Default: on + pub inline_blame: Option, + /// Git blame settings. + pub blame: Option, + /// Which information to show in the branch picker. + /// + /// Default: on + pub branch_picker: Option, + /// How hunks are displayed visually in the editor. + /// + /// Default: staged_hollow + pub hunk_style: Option, +} + +#[derive( + Clone, + Copy, + Debug, + PartialEq, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum GitGutterSetting { + /// Show git gutter in tracked files. + #[default] + TrackedFiles, + /// Hide git gutter + Hide, +} + +#[skip_serializing_none] +#[derive(Clone, Copy, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub struct InlineBlameSettings { + /// Whether or not to show git blame data inline in + /// the currently focused line. + /// + /// Default: true + pub enabled: Option, + /// Whether to only show the inline blame information + /// after a delay once the cursor stops moving. + /// + /// Default: 0 + pub delay_ms: Option, + /// The amount of padding between the end of the source line and the start + /// of the inline blame in units of columns. + /// + /// Default: 7 + pub padding: Option, + /// The minimum column number to show the inline blame information at + /// + /// Default: 0 + pub min_column: Option, + /// Whether to show commit summary as part of the inline blame. + /// + /// Default: false + pub show_commit_summary: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Copy, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub struct BlameSettings { + /// Whether to show the avatar of the author of the commit. + /// + /// Default: true + pub show_avatar: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Copy, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub struct BranchPickerSettingsContent { + /// Whether to show author name as part of the commit information. + /// + /// Default: false + pub show_author_name: Option, +} + +#[derive( + Clone, + Copy, + PartialEq, + Debug, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum GitHunkStyleSetting { + /// Show unstaged hunks with a filled background and staged hunks hollow. + #[default] + StagedHollow, + /// Show unstaged hunks hollow and staged hunks with a filled background. + UnstagedHollow, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct DiagnosticsSettingsContent { + /// Whether to show the project diagnostics button in the status bar. + pub button: Option, + + /// Whether or not to include warning diagnostics. + pub include_warnings: Option, + + /// Settings for using LSP pull diagnostics mechanism in Zed. + pub lsp_pull_diagnostics: Option, + + /// Settings for showing inline diagnostics. + pub inline: Option, +} + +#[skip_serializing_none] +#[derive( + Clone, Copy, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, +)] +pub struct LspPullDiagnosticsSettingsContent { + /// Whether to pull for diagnostics or not. + /// + /// Default: true + pub enabled: Option, + /// Minimum time to wait before pulling diagnostics from the language server(s). + /// 0 turns the debounce off. + /// + /// Default: 50 + pub debounce_ms: Option, +} + +#[skip_serializing_none] +#[derive( + Clone, Copy, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Eq, +)] +pub struct InlineDiagnosticsSettingsContent { + /// Whether or not to show inline diagnostics + /// + /// Default: false + pub enabled: Option, + /// Whether to only show the inline diagnostics after a delay after the + /// last editor event. + /// + /// Default: 150 + pub update_debounce_ms: Option, + /// The amount of padding between the end of the source line and the start + /// of the inline diagnostic in units of columns. + /// + /// Default: 4 + pub padding: Option, + /// The minimum column to display inline diagnostics. This setting can be + /// used to horizontally align inline diagnostics at some position. Lines + /// longer than this value will still push diagnostics further to the right. + /// + /// Default: 0 + pub min_column: Option, + + pub max_severity: Option, +} + +#[skip_serializing_none] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct NodeBinarySettings { + /// The path to the Node binary. + pub path: Option, + /// The path to the npm binary Zed should use (defaults to `.path/../npm`). + pub npm_path: Option, + /// If enabled, Zed will download its own copy of Node. + pub ignore_system_version: Option, +} + +#[derive(Clone, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum DirenvSettings { + /// Load direnv configuration through a shell hook + ShellHook, + /// Load direnv configuration directly using `direnv export json` + #[default] + Direct, +} + +#[derive( + Clone, + Copy, + Debug, + Eq, + PartialEq, + Ord, + PartialOrd, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum DiagnosticSeverityContent { + // No diagnostics are shown. + Off, + Error, + Warning, + Info, + Hint, + All, +} + +/// A custom Git hosting provider. +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct GitHostingProviderConfig { + /// The type of the provider. + /// + /// Must be one of `github`, `gitlab`, or `bitbucket`. + pub provider: GitHostingProviderKind, + + /// The base URL for the provider (e.g., "https://code.corp.big.com"). + pub base_url: String, + + /// The display name for the provider (e.g., "BigCorp GitHub"). + pub name: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum GitHostingProviderKind { + Github, + Gitlab, + Bitbucket, +} diff --git a/crates/settings/src/settings_content/terminal.rs b/crates/settings/src/settings_content/terminal.rs new file mode 100644 index 0000000000000000000000000000000000000000..e5d3ba60b52073963115934afdd368c582ccfff2 --- /dev/null +++ b/crates/settings/src/settings_content/terminal.rs @@ -0,0 +1,421 @@ +use std::path::PathBuf; + +use collections::HashMap; +use gpui::{AbsoluteLength, FontFeatures, SharedString, px}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; + +use crate::FontFamilyName; + +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct ProjectTerminalSettingsContent { + /// What shell to use when opening a terminal. + /// + /// Default: system + pub shell: Option, + /// What working directory to use when launching the terminal + /// + /// Default: current_project_directory + pub working_directory: Option, + /// Any key-value pairs added to this list will be added to the terminal's + /// environment. Use `:` to separate multiple values. + /// + /// Default: {} + pub env: Option>, + /// Activates the python virtual environment, if one is found, in the + /// terminal's working directory (as resolved by the working_directory + /// setting). Set this to "off" to disable this behavior. + /// + /// Default: on + pub detect_venv: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct TerminalSettingsContent { + #[serde(flatten)] + pub project: ProjectTerminalSettingsContent, + /// Sets the terminal's font size. + /// + /// If this option is not included, + /// the terminal will default to matching the buffer's font size. + pub font_size: Option, + /// Sets the terminal's font family. + /// + /// If this option is not included, + /// the terminal will default to matching the buffer's font family. + pub font_family: Option, + + /// Sets the terminal's font fallbacks. + /// + /// If this option is not included, + /// the terminal will default to matching the buffer's font fallbacks. + #[schemars(extend("uniqueItems" = true))] + pub font_fallbacks: Option>, + + /// Sets the terminal's line height. + /// + /// Default: comfortable + pub line_height: Option, + pub font_features: Option, + /// Sets the terminal's font weight in CSS weight units 0-900. + pub font_weight: Option, + /// Default cursor shape for the terminal. + /// Can be "bar", "block", "underline", or "hollow". + /// + /// Default: "block" + pub cursor_shape: Option, + /// Sets the cursor blinking behavior in the terminal. + /// + /// Default: terminal_controlled + pub blinking: Option, + /// Sets whether Alternate Scroll mode (code: ?1007) is active by default. + /// Alternate Scroll mode converts mouse scroll events into up / down key + /// presses when in the alternate screen (e.g. when running applications + /// like vim or less). The terminal can still set and unset this mode. + /// + /// Default: on + pub alternate_scroll: Option, + /// Sets whether the option key behaves as the meta key. + /// + /// Default: false + pub option_as_meta: Option, + /// Whether or not selecting text in the terminal will automatically + /// copy to the system clipboard. + /// + /// Default: false + pub copy_on_select: Option, + /// Whether to keep the text selection after copying it to the clipboard. + /// + /// Default: true + pub keep_selection_on_copy: Option, + /// Whether to show the terminal button in the status bar. + /// + /// Default: true + pub button: Option, + pub dock: Option, + /// Default width when the terminal is docked to the left or right. + /// + /// Default: 640 + pub default_width: Option, + /// Default height when the terminal is docked to the bottom. + /// + /// Default: 320 + pub default_height: Option, + /// The maximum number of lines to keep in the scrollback history. + /// Maximum allowed value is 100_000, all values above that will be treated as 100_000. + /// 0 disables the scrolling. + /// Existing terminals will not pick up this change until they are recreated. + /// See Alacritty documentation for more information. + /// + /// Default: 10_000 + pub max_scroll_history_lines: Option, + /// Toolbar related settings + pub toolbar: Option, + /// Scrollbar-related settings + pub scrollbar: Option, + /// The minimum APCA perceptual contrast between foreground and background colors. + /// + /// APCA (Accessible Perceptual Contrast Algorithm) is more accurate than WCAG 2.x, + /// especially for dark mode. Values range from 0 to 106. + /// + /// Based on APCA Readability Criterion (ARC) Bronze Simple Mode: + /// https://readtech.org/ARC/tests/bronze-simple-mode/ + /// - 0: No contrast adjustment + /// - 45: Minimum for large fluent text (36px+) + /// - 60: Minimum for other content text + /// - 75: Minimum for body text + /// - 90: Preferred for body text + /// + /// Default: 45 + pub minimum_contrast: Option, +} + +/// Shell configuration to open the terminal with. +#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum Shell { + /// Use the system's default terminal configuration in /etc/passwd + #[default] + System, + /// Use a specific program with no arguments. + Program(String), + /// Use a specific program with arguments. + WithArguments { + /// The program to run. + program: String, + /// The arguments to pass to the program. + args: Vec, + /// An optional string to override the title of the terminal tab + title_override: Option, + }, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum WorkingDirectory { + /// Use the current file's project directory. Will Fallback to the + /// first project directory strategy if unsuccessful. + CurrentProjectDirectory, + /// Use the first project in this workspace's directory. + FirstProjectDirectory, + /// Always use this platform's home directory (if it can be found). + AlwaysHome, + /// Always use a specific directory. This value will be shell expanded. + /// If this path is not a valid directory the terminal will default to + /// this platform's home directory (if it can be found). + Always { directory: String }, +} + +#[skip_serializing_none] +#[derive( + Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default, +)] +pub struct ScrollbarSettingsContent { + /// When to show the scrollbar in the terminal. + /// + /// Default: inherits editor scrollbar settings + pub show: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom, Default)] +#[serde(rename_all = "snake_case")] +pub enum TerminalLineHeight { + /// Use a line height that's comfortable for reading, 1.618 + #[default] + Comfortable, + /// Use a standard line height, 1.3. This option is useful for TUIs, + /// particularly if they use box characters + Standard, + /// Use a custom line height. + Custom(f32), +} + +impl TerminalLineHeight { + pub fn value(&self) -> AbsoluteLength { + let value = match self { + TerminalLineHeight::Comfortable => 1.618, + TerminalLineHeight::Standard => 1.3, + TerminalLineHeight::Custom(line_height) => f32::max(*line_height, 1.), + }; + px(value).into() + } +} + +/// When to show the scrollbar. +/// +/// Default: auto +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum ShowScrollbar { + /// Show the scrollbar if there's important information or + /// follow the system's configured behavior. + #[default] + Auto, + /// Match the system's configured behavior. + System, + /// Always show the scrollbar. + Always, + /// Never show the scrollbar. + Never, +} + +#[derive( + Clone, + Copy, + Debug, + Default, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +// todo() -> combine with CursorShape +pub enum CursorShapeContent { + /// Cursor is a block like `█`. + #[default] + Block, + /// Cursor is an underscore like `_`. + Underline, + /// Cursor is a vertical bar like `⎸`. + Bar, + /// Cursor is a hollow box like `▯`. + Hollow, +} + +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum TerminalBlink { + /// Never blink the cursor, ignoring the terminal mode. + Off, + /// Default the cursor blink to off, but allow the terminal to + /// set blinking. + TerminalControlled, + /// Always blink the cursor, ignoring the terminal mode. + On, +} + +#[derive( + Clone, + Copy, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum AlternateScroll { + On, + Off, +} + +// Toolbar related settings +#[skip_serializing_none] +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +pub struct TerminalToolbarContent { + /// Whether to display the terminal title in breadcrumbs inside the terminal pane. + /// Only shown if the terminal title is not empty. + /// + /// The shell running in the terminal needs to be configured to emit the title. + /// Example: `echo -e "\e]2;New Title\007";` + /// + /// Default: true + pub breadcrumbs: Option, +} + +#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum VenvSettings { + #[default] + Off, + On { + /// Default directories to search for virtual environments, relative + /// to the current working directory. We recommend overriding this + /// in your project's settings, rather than globally. + activate_script: Option, + venv_name: Option, + directories: Option>, + }, +} +#[skip_serializing_none] +pub struct VenvSettingsContent<'a> { + pub activate_script: ActivateScript, + pub venv_name: &'a str, + pub directories: &'a [PathBuf], +} + +impl VenvSettings { + pub fn as_option(&self) -> Option> { + match self { + VenvSettings::Off => None, + VenvSettings::On { + activate_script, + venv_name, + directories, + } => Some(VenvSettingsContent { + activate_script: activate_script.unwrap_or(ActivateScript::Default), + venv_name: venv_name.as_deref().unwrap_or(""), + directories: directories.as_deref().unwrap_or(&[]), + }), + } + } +} + +#[derive( + Copy, + Clone, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum TerminalDockPosition { + Left, + Bottom, + Right, +} + +#[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum ActivateScript { + #[default] + Default, + Csh, + Fish, + Nushell, + PowerShell, + Pyenv, +} + +#[cfg(test)] +mod test { + use serde_json::json; + + use crate::{ProjectSettingsContent, Shell, UserSettingsContent}; + + #[test] + fn test_project_settings() { + let project_content = + json!({"terminal": {"shell": {"program": "/bin/project"}}, "option_as_meta": true}); + + let user_content = + json!({"terminal": {"shell": {"program": "/bin/user"}}, "option_as_meta": false}); + + let user_settings = serde_json::from_value::(user_content).unwrap(); + let project_settings = + serde_json::from_value::(project_content).unwrap(); + + assert_eq!( + user_settings.content.terminal.unwrap().project.shell, + Some(Shell::Program("/bin/user".to_owned())) + ); + assert_eq!(user_settings.content.project.terminal, None); + assert_eq!( + project_settings.terminal.unwrap().shell, + Some(Shell::Program("/bin/project".to_owned())) + ); + } +} diff --git a/crates/settings/src/settings_content/theme.rs b/crates/settings/src/settings_content/theme.rs new file mode 100644 index 0000000000000000000000000000000000000000..67cfff6da1051247b2f462c96febd0f09c882963 --- /dev/null +++ b/crates/settings/src/settings_content/theme.rs @@ -0,0 +1,1183 @@ +use collections::{HashMap, IndexMap}; +use gpui::{FontFallbacks, FontFeatures, FontStyle, FontWeight, SharedString}; +use schemars::{JsonSchema, JsonSchema_repr}; +use serde::{Deserialize, Deserializer, Serialize}; +use serde_json::Value; +use serde_repr::{Deserialize_repr, Serialize_repr}; +use settings_macros::MergeFrom; +use std::{fmt::Display, sync::Arc}; + +use serde_with::skip_serializing_none; + +/// Settings for rendering text in UI and text buffers. + +#[skip_serializing_none] +#[derive(Clone, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct ThemeSettingsContent { + /// The default font size for text in the UI. + #[serde(default)] + pub ui_font_size: Option, + /// The name of a font to use for rendering in the UI. + #[serde(default)] + pub ui_font_family: Option, + /// The font fallbacks to use for rendering in the UI. + #[serde(default)] + #[schemars(default = "default_font_fallbacks")] + #[schemars(extend("uniqueItems" = true))] + pub ui_font_fallbacks: Option>, + /// The OpenType features to enable for text in the UI. + #[serde(default)] + #[schemars(default = "default_font_features")] + pub ui_font_features: Option, + /// The weight of the UI font in CSS units from 100 to 900. + #[serde(default)] + #[schemars(default = "default_buffer_font_weight")] + pub ui_font_weight: Option, + /// The name of a font to use for rendering in text buffers. + #[serde(default)] + pub buffer_font_family: Option, + /// The font fallbacks to use for rendering in text buffers. + #[serde(default)] + #[schemars(extend("uniqueItems" = true))] + pub buffer_font_fallbacks: Option>, + /// The default font size for rendering in text buffers. + #[serde(default)] + pub buffer_font_size: Option, + /// The weight of the editor font in CSS units from 100 to 900. + #[serde(default)] + #[schemars(default = "default_buffer_font_weight")] + pub buffer_font_weight: Option, + /// The buffer's line height. + #[serde(default)] + pub buffer_line_height: Option, + /// The OpenType features to enable for rendering in text buffers. + #[serde(default)] + #[schemars(default = "default_font_features")] + pub buffer_font_features: Option, + /// The font size for agent responses in the agent panel. Falls back to the UI font size if unset. + #[serde(default)] + pub agent_ui_font_size: Option, + /// The font size for user messages in the agent panel. + #[serde(default)] + pub agent_buffer_font_size: Option, + /// The name of the Zed theme to use. + #[serde(default)] + pub theme: Option, + /// The name of the icon theme to use. + #[serde(default)] + pub icon_theme: Option, + + /// UNSTABLE: Expect many elements to be broken. + /// + // Controls the density of the UI. + #[serde(rename = "unstable.ui_density", default)] + pub ui_density: Option, + + /// How much to fade out unused code. + #[serde(default)] + #[schemars(range(min = 0.0, max = 0.9))] + pub unnecessary_code_fade: Option, + + /// EXPERIMENTAL: Overrides for the current theme. + /// + /// These values will override the ones on the current theme specified in `theme`. + #[serde(rename = "experimental.theme_overrides", default)] + pub experimental_theme_overrides: Option, + + /// Overrides per theme + /// + /// These values will override the ones on the specified theme + #[serde(default)] + pub theme_overrides: HashMap, +} + +#[derive( + Clone, + Copy, + Debug, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + PartialOrd, + derive_more::FromStr, +)] +#[serde(transparent)] +pub struct CodeFade(pub f32); + +impl Display for CodeFade { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:.2}", self.0) + } +} + +fn default_font_features() -> Option { + Some(FontFeatures::default()) +} + +fn default_font_fallbacks() -> Option { + Some(FontFallbacks::default()) +} + +fn default_buffer_font_weight() -> Option { + Some(FontWeight::default()) +} + +/// Represents the selection of a theme, which can be either static or dynamic. +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +#[serde(untagged)] +pub enum ThemeSelection { + /// A static theme selection, represented by a single theme name. + Static(ThemeName), + /// A dynamic theme selection, which can change based the [ThemeMode]. + Dynamic { + /// The mode used to determine which theme to use. + #[serde(default)] + mode: ThemeMode, + /// The theme to use for light mode. + light: ThemeName, + /// The theme to use for dark mode. + dark: ThemeName, + }, +} + +/// Represents the selection of an icon theme, which can be either static or dynamic. +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +#[serde(untagged)] +pub enum IconThemeSelection { + /// A static icon theme selection, represented by a single icon theme name. + Static(IconThemeName), + /// A dynamic icon theme selection, which can change based on the [`ThemeMode`]. + Dynamic { + /// The mode used to determine which theme to use. + #[serde(default)] + mode: ThemeMode, + /// The icon theme to use for light mode. + light: IconThemeName, + /// The icon theme to use for dark mode. + dark: IconThemeName, + }, +} + +// TODO: Rename ThemeMode -> ThemeAppearanceMode +/// The mode use to select a theme. +/// +/// `Light` and `Dark` will select their respective themes. +/// +/// `System` will select the theme based on the system's appearance. +#[derive( + Debug, PartialEq, Eq, Clone, Copy, Default, Serialize, Deserialize, JsonSchema, MergeFrom, +)] +#[serde(rename_all = "snake_case")] +pub enum ThemeMode { + /// Use the specified `light` theme. + Light, + + /// Use the specified `dark` theme. + Dark, + + /// Use the theme based on the system's appearance. + #[default] + System, +} + +/// Specifies the density of the UI. +/// Note: This setting is still experimental. See [this tracking issue](https://github.com/zed-industries/zed/issues/18078) +#[derive( + Debug, + Default, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Clone, + Copy, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, +)] +#[serde(rename_all = "snake_case")] +pub enum UiDensity { + /// A denser UI with tighter spacing and smaller elements. + #[serde(alias = "compact")] + Compact, + #[default] + #[serde(alias = "default")] + /// The default UI density. + Default, + #[serde(alias = "comfortable")] + /// A looser UI with more spacing and larger elements. + Comfortable, +} + +impl UiDensity { + /// The spacing ratio of a given density. + /// TODO: Standardize usage throughout the app or remove + pub fn spacing_ratio(self) -> f32 { + match self { + UiDensity::Compact => 0.75, + UiDensity::Default => 1.0, + UiDensity::Comfortable => 1.25, + } + } +} + +/// Font family name. +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +#[serde(transparent)] +pub struct FontFamilyName(pub Arc); + +impl AsRef for FontFamilyName { + fn as_ref(&self) -> &str { + &self.0 + } +} + +impl From for FontFamilyName { + fn from(value: SharedString) -> Self { + Self(Arc::from(value)) + } +} + +impl From for SharedString { + fn from(value: FontFamilyName) -> Self { + SharedString::new(value.0) + } +} + +impl From for FontFamilyName { + fn from(value: String) -> Self { + Self(Arc::from(value)) + } +} + +impl From for String { + fn from(value: FontFamilyName) -> Self { + value.0.to_string() + } +} + +/// The buffer's line height. +#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom, Default)] +#[serde(rename_all = "snake_case")] +pub enum BufferLineHeight { + /// A less dense line height. + #[default] + Comfortable, + /// The default line height. + Standard, + /// A custom line height, where 1.0 is the font's height. Must be at least 1.0. + Custom(#[serde(deserialize_with = "deserialize_line_height")] f32), +} + +fn deserialize_line_height<'de, D>(deserializer: D) -> Result +where + D: serde::Deserializer<'de>, +{ + let value = f32::deserialize(deserializer)?; + if value < 1.0 { + return Err(serde::de::Error::custom( + "buffer_line_height.custom must be at least 1.0", + )); + } + + Ok(value) +} + +/// The content of a serialized theme. +#[skip_serializing_none] +#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +#[serde(default)] +pub struct ThemeStyleContent { + #[serde(default, rename = "background.appearance")] + pub window_background_appearance: Option, + + #[serde(default)] + pub accents: Vec, + + #[serde(flatten, default)] + pub colors: ThemeColorsContent, + + #[serde(flatten, default)] + pub status: StatusColorsContent, + + #[serde(default)] + pub players: Vec, + + /// The styles for syntax nodes. + #[serde(default)] + pub syntax: IndexMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct AccentContent(pub Option); + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +pub struct PlayerColorContent { + pub cursor: Option, + pub background: Option, + pub selection: Option, +} + +/// Theme name. +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +#[serde(transparent)] +pub struct ThemeName(pub Arc); + +/// Icon Theme Name +#[skip_serializing_none] +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] +#[serde(transparent)] +pub struct IconThemeName(pub Arc); + +#[skip_serializing_none] +#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +#[serde(default)] +pub struct ThemeColorsContent { + /// Border color. Used for most borders, is usually a high contrast color. + #[serde(rename = "border")] + pub border: Option, + + /// Border color. Used for deemphasized borders, like a visual divider between two sections + #[serde(rename = "border.variant")] + pub border_variant: Option, + + /// Border color. Used for focused elements, like keyboard focused list item. + #[serde(rename = "border.focused")] + pub border_focused: Option, + + /// Border color. Used for selected elements, like an active search filter or selected checkbox. + #[serde(rename = "border.selected")] + pub border_selected: Option, + + /// Border color. Used for transparent borders. Used for placeholder borders when an element gains a border on state change. + #[serde(rename = "border.transparent")] + pub border_transparent: Option, + + /// Border color. Used for disabled elements, like a disabled input or button. + #[serde(rename = "border.disabled")] + pub border_disabled: Option, + + /// Background color. Used for elevated surfaces, like a context menu, popup, or dialog. + #[serde(rename = "elevated_surface.background")] + pub elevated_surface_background: Option, + + /// Background Color. Used for grounded surfaces like a panel or tab. + #[serde(rename = "surface.background")] + pub surface_background: Option, + + /// Background Color. Used for the app background and blank panels or windows. + #[serde(rename = "background")] + pub background: Option, + + /// Background Color. Used for the background of an element that should have a different background than the surface it's on. + /// + /// Elements might include: Buttons, Inputs, Checkboxes, Radio Buttons... + /// + /// For an element that should have the same background as the surface it's on, use `ghost_element_background`. + #[serde(rename = "element.background")] + pub element_background: Option, + + /// Background Color. Used for the hover state of an element that should have a different background than the surface it's on. + /// + /// Hover states are triggered by the mouse entering an element, or a finger touching an element on a touch screen. + #[serde(rename = "element.hover")] + pub element_hover: Option, + + /// Background Color. Used for the active state of an element that should have a different background than the surface it's on. + /// + /// Active states are triggered by the mouse button being pressed down on an element, or the Return button or other activator being pressed. + #[serde(rename = "element.active")] + pub element_active: Option, + + /// Background Color. Used for the selected state of an element that should have a different background than the surface it's on. + /// + /// Selected states are triggered by the element being selected (or "activated") by the user. + /// + /// This could include a selected checkbox, a toggleable button that is toggled on, etc. + #[serde(rename = "element.selected")] + pub element_selected: Option, + + /// Background Color. Used for the disabled state of an element that should have a different background than the surface it's on. + /// + /// Disabled states are shown when a user cannot interact with an element, like a disabled button or input. + #[serde(rename = "element.disabled")] + pub element_disabled: Option, + + /// Background Color. Used for the background of selections in a UI element. + #[serde(rename = "element.selection_background")] + pub element_selection_background: Option, + + /// Background Color. Used for the area that shows where a dragged element will be dropped. + #[serde(rename = "drop_target.background")] + pub drop_target_background: Option, + + /// Border Color. Used for the border that shows where a dragged element will be dropped. + #[serde(rename = "drop_target.border")] + pub drop_target_border: Option, + + /// Used for the background of a ghost element that should have the same background as the surface it's on. + /// + /// Elements might include: Buttons, Inputs, Checkboxes, Radio Buttons... + /// + /// For an element that should have a different background than the surface it's on, use `element_background`. + #[serde(rename = "ghost_element.background")] + pub ghost_element_background: Option, + + /// Background Color. Used for the hover state of a ghost element that should have the same background as the surface it's on. + /// + /// Hover states are triggered by the mouse entering an element, or a finger touching an element on a touch screen. + #[serde(rename = "ghost_element.hover")] + pub ghost_element_hover: Option, + + /// Background Color. Used for the active state of a ghost element that should have the same background as the surface it's on. + /// + /// Active states are triggered by the mouse button being pressed down on an element, or the Return button or other activator being pressed. + #[serde(rename = "ghost_element.active")] + pub ghost_element_active: Option, + + /// Background Color. Used for the selected state of a ghost element that should have the same background as the surface it's on. + /// + /// Selected states are triggered by the element being selected (or "activated") by the user. + /// + /// This could include a selected checkbox, a toggleable button that is toggled on, etc. + #[serde(rename = "ghost_element.selected")] + pub ghost_element_selected: Option, + + /// Background Color. Used for the disabled state of a ghost element that should have the same background as the surface it's on. + /// + /// Disabled states are shown when a user cannot interact with an element, like a disabled button or input. + #[serde(rename = "ghost_element.disabled")] + pub ghost_element_disabled: Option, + + /// Text Color. Default text color used for most text. + #[serde(rename = "text")] + pub text: Option, + + /// Text Color. Color of muted or deemphasized text. It is a subdued version of the standard text color. + #[serde(rename = "text.muted")] + pub text_muted: Option, + + /// Text Color. Color of the placeholder text typically shown in input fields to guide the user to enter valid data. + #[serde(rename = "text.placeholder")] + pub text_placeholder: Option, + + /// Text Color. Color used for text denoting disabled elements. Typically, the color is faded or grayed out to emphasize the disabled state. + #[serde(rename = "text.disabled")] + pub text_disabled: Option, + + /// Text Color. Color used for emphasis or highlighting certain text, like an active filter or a matched character in a search. + #[serde(rename = "text.accent")] + pub text_accent: Option, + + /// Fill Color. Used for the default fill color of an icon. + #[serde(rename = "icon")] + pub icon: Option, + + /// Fill Color. Used for the muted or deemphasized fill color of an icon. + /// + /// This might be used to show an icon in an inactive pane, or to deemphasize a series of icons to give them less visual weight. + #[serde(rename = "icon.muted")] + pub icon_muted: Option, + + /// Fill Color. Used for the disabled fill color of an icon. + /// + /// Disabled states are shown when a user cannot interact with an element, like a icon button. + #[serde(rename = "icon.disabled")] + pub icon_disabled: Option, + + /// Fill Color. Used for the placeholder fill color of an icon. + /// + /// This might be used to show an icon in an input that disappears when the user enters text. + #[serde(rename = "icon.placeholder")] + pub icon_placeholder: Option, + + /// Fill Color. Used for the accent fill color of an icon. + /// + /// This might be used to show when a toggleable icon button is selected. + #[serde(rename = "icon.accent")] + pub icon_accent: Option, + + /// Color used to accent some of the debuggers elements + /// Only accent breakpoint & breakpoint related symbols right now + #[serde(rename = "debugger.accent")] + pub debugger_accent: Option, + + #[serde(rename = "status_bar.background")] + pub status_bar_background: Option, + + #[serde(rename = "title_bar.background")] + pub title_bar_background: Option, + + #[serde(rename = "title_bar.inactive_background")] + pub title_bar_inactive_background: Option, + + #[serde(rename = "toolbar.background")] + pub toolbar_background: Option, + + #[serde(rename = "tab_bar.background")] + pub tab_bar_background: Option, + + #[serde(rename = "tab.inactive_background")] + pub tab_inactive_background: Option, + + #[serde(rename = "tab.active_background")] + pub tab_active_background: Option, + + #[serde(rename = "search.match_background")] + pub search_match_background: Option, + + #[serde(rename = "panel.background")] + pub panel_background: Option, + + #[serde(rename = "panel.focused_border")] + pub panel_focused_border: Option, + + #[serde(rename = "panel.indent_guide")] + pub panel_indent_guide: Option, + + #[serde(rename = "panel.indent_guide_hover")] + pub panel_indent_guide_hover: Option, + + #[serde(rename = "panel.indent_guide_active")] + pub panel_indent_guide_active: Option, + + #[serde(rename = "panel.overlay_background")] + pub panel_overlay_background: Option, + + #[serde(rename = "panel.overlay_hover")] + pub panel_overlay_hover: Option, + + #[serde(rename = "pane.focused_border")] + pub pane_focused_border: Option, + + #[serde(rename = "pane_group.border")] + pub pane_group_border: Option, + + /// The deprecated version of `scrollbar.thumb.background`. + /// + /// Don't use this field. + #[serde(rename = "scrollbar_thumb.background", skip_serializing)] + #[schemars(skip)] + pub deprecated_scrollbar_thumb_background: Option, + + /// The color of the scrollbar thumb. + #[serde(rename = "scrollbar.thumb.background")] + pub scrollbar_thumb_background: Option, + + /// The color of the scrollbar thumb when hovered over. + #[serde(rename = "scrollbar.thumb.hover_background")] + pub scrollbar_thumb_hover_background: Option, + + /// The color of the scrollbar thumb whilst being actively dragged. + #[serde(rename = "scrollbar.thumb.active_background")] + pub scrollbar_thumb_active_background: Option, + + /// The border color of the scrollbar thumb. + #[serde(rename = "scrollbar.thumb.border")] + pub scrollbar_thumb_border: Option, + + /// The background color of the scrollbar track. + #[serde(rename = "scrollbar.track.background")] + pub scrollbar_track_background: Option, + + /// The border color of the scrollbar track. + #[serde(rename = "scrollbar.track.border")] + pub scrollbar_track_border: Option, + + /// The color of the minimap thumb. + #[serde(rename = "minimap.thumb.background")] + pub minimap_thumb_background: Option, + + /// The color of the minimap thumb when hovered over. + #[serde(rename = "minimap.thumb.hover_background")] + pub minimap_thumb_hover_background: Option, + + /// The color of the minimap thumb whilst being actively dragged. + #[serde(rename = "minimap.thumb.active_background")] + pub minimap_thumb_active_background: Option, + + /// The border color of the minimap thumb. + #[serde(rename = "minimap.thumb.border")] + pub minimap_thumb_border: Option, + + #[serde(rename = "editor.foreground")] + pub editor_foreground: Option, + + #[serde(rename = "editor.background")] + pub editor_background: Option, + + #[serde(rename = "editor.gutter.background")] + pub editor_gutter_background: Option, + + #[serde(rename = "editor.subheader.background")] + pub editor_subheader_background: Option, + + #[serde(rename = "editor.active_line.background")] + pub editor_active_line_background: Option, + + #[serde(rename = "editor.highlighted_line.background")] + pub editor_highlighted_line_background: Option, + + /// Background of active line of debugger + #[serde(rename = "editor.debugger_active_line.background")] + pub editor_debugger_active_line_background: Option, + + /// Text Color. Used for the text of the line number in the editor gutter. + #[serde(rename = "editor.line_number")] + pub editor_line_number: Option, + + /// Text Color. Used for the text of the line number in the editor gutter when the line is highlighted. + #[serde(rename = "editor.active_line_number")] + pub editor_active_line_number: Option, + + /// Text Color. Used for the text of the line number in the editor gutter when the line is hovered over. + #[serde(rename = "editor.hover_line_number")] + pub editor_hover_line_number: Option, + + /// Text Color. Used to mark invisible characters in the editor. + /// + /// Example: spaces, tabs, carriage returns, etc. + #[serde(rename = "editor.invisible")] + pub editor_invisible: Option, + + #[serde(rename = "editor.wrap_guide")] + pub editor_wrap_guide: Option, + + #[serde(rename = "editor.active_wrap_guide")] + pub editor_active_wrap_guide: Option, + + #[serde(rename = "editor.indent_guide")] + pub editor_indent_guide: Option, + + #[serde(rename = "editor.indent_guide_active")] + pub editor_indent_guide_active: Option, + + /// Read-access of a symbol, like reading a variable. + /// + /// A document highlight is a range inside a text document which deserves + /// special attention. Usually a document highlight is visualized by changing + /// the background color of its range. + #[serde(rename = "editor.document_highlight.read_background")] + pub editor_document_highlight_read_background: Option, + + /// Read-access of a symbol, like reading a variable. + /// + /// A document highlight is a range inside a text document which deserves + /// special attention. Usually a document highlight is visualized by changing + /// the background color of its range. + #[serde(rename = "editor.document_highlight.write_background")] + pub editor_document_highlight_write_background: Option, + + /// Highlighted brackets background color. + /// + /// Matching brackets in the cursor scope are highlighted with this background color. + #[serde(rename = "editor.document_highlight.bracket_background")] + pub editor_document_highlight_bracket_background: Option, + + /// Terminal background color. + #[serde(rename = "terminal.background")] + pub terminal_background: Option, + + /// Terminal foreground color. + #[serde(rename = "terminal.foreground")] + pub terminal_foreground: Option, + + /// Terminal ANSI background color. + #[serde(rename = "terminal.ansi.background")] + pub terminal_ansi_background: Option, + + /// Bright terminal foreground color. + #[serde(rename = "terminal.bright_foreground")] + pub terminal_bright_foreground: Option, + + /// Dim terminal foreground color. + #[serde(rename = "terminal.dim_foreground")] + pub terminal_dim_foreground: Option, + + /// Black ANSI terminal color. + #[serde(rename = "terminal.ansi.black")] + pub terminal_ansi_black: Option, + + /// Bright black ANSI terminal color. + #[serde(rename = "terminal.ansi.bright_black")] + pub terminal_ansi_bright_black: Option, + + /// Dim black ANSI terminal color. + #[serde(rename = "terminal.ansi.dim_black")] + pub terminal_ansi_dim_black: Option, + + /// Red ANSI terminal color. + #[serde(rename = "terminal.ansi.red")] + pub terminal_ansi_red: Option, + + /// Bright red ANSI terminal color. + #[serde(rename = "terminal.ansi.bright_red")] + pub terminal_ansi_bright_red: Option, + + /// Dim red ANSI terminal color. + #[serde(rename = "terminal.ansi.dim_red")] + pub terminal_ansi_dim_red: Option, + + /// Green ANSI terminal color. + #[serde(rename = "terminal.ansi.green")] + pub terminal_ansi_green: Option, + + /// Bright green ANSI terminal color. + #[serde(rename = "terminal.ansi.bright_green")] + pub terminal_ansi_bright_green: Option, + + /// Dim green ANSI terminal color. + #[serde(rename = "terminal.ansi.dim_green")] + pub terminal_ansi_dim_green: Option, + + /// Yellow ANSI terminal color. + #[serde(rename = "terminal.ansi.yellow")] + pub terminal_ansi_yellow: Option, + + /// Bright yellow ANSI terminal color. + #[serde(rename = "terminal.ansi.bright_yellow")] + pub terminal_ansi_bright_yellow: Option, + + /// Dim yellow ANSI terminal color. + #[serde(rename = "terminal.ansi.dim_yellow")] + pub terminal_ansi_dim_yellow: Option, + + /// Blue ANSI terminal color. + #[serde(rename = "terminal.ansi.blue")] + pub terminal_ansi_blue: Option, + + /// Bright blue ANSI terminal color. + #[serde(rename = "terminal.ansi.bright_blue")] + pub terminal_ansi_bright_blue: Option, + + /// Dim blue ANSI terminal color. + #[serde(rename = "terminal.ansi.dim_blue")] + pub terminal_ansi_dim_blue: Option, + + /// Magenta ANSI terminal color. + #[serde(rename = "terminal.ansi.magenta")] + pub terminal_ansi_magenta: Option, + + /// Bright magenta ANSI terminal color. + #[serde(rename = "terminal.ansi.bright_magenta")] + pub terminal_ansi_bright_magenta: Option, + + /// Dim magenta ANSI terminal color. + #[serde(rename = "terminal.ansi.dim_magenta")] + pub terminal_ansi_dim_magenta: Option, + + /// Cyan ANSI terminal color. + #[serde(rename = "terminal.ansi.cyan")] + pub terminal_ansi_cyan: Option, + + /// Bright cyan ANSI terminal color. + #[serde(rename = "terminal.ansi.bright_cyan")] + pub terminal_ansi_bright_cyan: Option, + + /// Dim cyan ANSI terminal color. + #[serde(rename = "terminal.ansi.dim_cyan")] + pub terminal_ansi_dim_cyan: Option, + + /// White ANSI terminal color. + #[serde(rename = "terminal.ansi.white")] + pub terminal_ansi_white: Option, + + /// Bright white ANSI terminal color. + #[serde(rename = "terminal.ansi.bright_white")] + pub terminal_ansi_bright_white: Option, + + /// Dim white ANSI terminal color. + #[serde(rename = "terminal.ansi.dim_white")] + pub terminal_ansi_dim_white: Option, + + #[serde(rename = "link_text.hover")] + pub link_text_hover: Option, + + /// Added version control color. + #[serde(rename = "version_control.added")] + pub version_control_added: Option, + + /// Deleted version control color. + #[serde(rename = "version_control.deleted")] + pub version_control_deleted: Option, + + /// Modified version control color. + #[serde(rename = "version_control.modified")] + pub version_control_modified: Option, + + /// Renamed version control color. + #[serde(rename = "version_control.renamed")] + pub version_control_renamed: Option, + + /// Conflict version control color. + #[serde(rename = "version_control.conflict")] + pub version_control_conflict: Option, + + /// Ignored version control color. + #[serde(rename = "version_control.ignored")] + pub version_control_ignored: Option, + + /// Background color for row highlights of "ours" regions in merge conflicts. + #[serde(rename = "version_control.conflict_marker.ours")] + pub version_control_conflict_marker_ours: Option, + + /// Background color for row highlights of "theirs" regions in merge conflicts. + #[serde(rename = "version_control.conflict_marker.theirs")] + pub version_control_conflict_marker_theirs: Option, + + /// Deprecated in favor of `version_control_conflict_marker_ours`. + #[deprecated] + pub version_control_conflict_ours_background: Option, + + /// Deprecated in favor of `version_control_conflict_marker_theirs`. + #[deprecated] + pub version_control_conflict_theirs_background: Option, +} + +#[skip_serializing_none] +#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +#[serde(default)] +pub struct HighlightStyleContent { + pub color: Option, + + #[serde(deserialize_with = "treat_error_as_none")] + pub background_color: Option, + + #[serde(deserialize_with = "treat_error_as_none")] + pub font_style: Option, + + #[serde(deserialize_with = "treat_error_as_none")] + pub font_weight: Option, +} + +impl HighlightStyleContent { + pub fn is_empty(&self) -> bool { + self.color.is_none() + && self.background_color.is_none() + && self.font_style.is_none() + && self.font_weight.is_none() + } +} + +fn treat_error_as_none<'de, T, D>(deserializer: D) -> Result, D::Error> +where + T: Deserialize<'de>, + D: Deserializer<'de>, +{ + let value: Value = Deserialize::deserialize(deserializer)?; + Ok(T::deserialize(value).ok()) +} + +#[skip_serializing_none] +#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +#[serde(default)] +pub struct StatusColorsContent { + /// Indicates some kind of conflict, like a file changed on disk while it was open, or + /// merge conflicts in a Git repository. + #[serde(rename = "conflict")] + pub conflict: Option, + + #[serde(rename = "conflict.background")] + pub conflict_background: Option, + + #[serde(rename = "conflict.border")] + pub conflict_border: Option, + + /// Indicates something new, like a new file added to a Git repository. + #[serde(rename = "created")] + pub created: Option, + + #[serde(rename = "created.background")] + pub created_background: Option, + + #[serde(rename = "created.border")] + pub created_border: Option, + + /// Indicates that something no longer exists, like a deleted file. + #[serde(rename = "deleted")] + pub deleted: Option, + + #[serde(rename = "deleted.background")] + pub deleted_background: Option, + + #[serde(rename = "deleted.border")] + pub deleted_border: Option, + + /// Indicates a system error, a failed operation or a diagnostic error. + #[serde(rename = "error")] + pub error: Option, + + #[serde(rename = "error.background")] + pub error_background: Option, + + #[serde(rename = "error.border")] + pub error_border: Option, + + /// Represents a hidden status, such as a file being hidden in a file tree. + #[serde(rename = "hidden")] + pub hidden: Option, + + #[serde(rename = "hidden.background")] + pub hidden_background: Option, + + #[serde(rename = "hidden.border")] + pub hidden_border: Option, + + /// Indicates a hint or some kind of additional information. + #[serde(rename = "hint")] + pub hint: Option, + + #[serde(rename = "hint.background")] + pub hint_background: Option, + + #[serde(rename = "hint.border")] + pub hint_border: Option, + + /// Indicates that something is deliberately ignored, such as a file or operation ignored by Git. + #[serde(rename = "ignored")] + pub ignored: Option, + + #[serde(rename = "ignored.background")] + pub ignored_background: Option, + + #[serde(rename = "ignored.border")] + pub ignored_border: Option, + + /// Represents informational status updates or messages. + #[serde(rename = "info")] + pub info: Option, + + #[serde(rename = "info.background")] + pub info_background: Option, + + #[serde(rename = "info.border")] + pub info_border: Option, + + /// Indicates a changed or altered status, like a file that has been edited. + #[serde(rename = "modified")] + pub modified: Option, + + #[serde(rename = "modified.background")] + pub modified_background: Option, + + #[serde(rename = "modified.border")] + pub modified_border: Option, + + /// Indicates something that is predicted, like automatic code completion, or generated code. + #[serde(rename = "predictive")] + pub predictive: Option, + + #[serde(rename = "predictive.background")] + pub predictive_background: Option, + + #[serde(rename = "predictive.border")] + pub predictive_border: Option, + + /// Represents a renamed status, such as a file that has been renamed. + #[serde(rename = "renamed")] + pub renamed: Option, + + #[serde(rename = "renamed.background")] + pub renamed_background: Option, + + #[serde(rename = "renamed.border")] + pub renamed_border: Option, + + /// Indicates a successful operation or task completion. + #[serde(rename = "success")] + pub success: Option, + + #[serde(rename = "success.background")] + pub success_background: Option, + + #[serde(rename = "success.border")] + pub success_border: Option, + + /// Indicates some kind of unreachable status, like a block of code that can never be reached. + #[serde(rename = "unreachable")] + pub unreachable: Option, + + #[serde(rename = "unreachable.background")] + pub unreachable_background: Option, + + #[serde(rename = "unreachable.border")] + pub unreachable_border: Option, + + /// Represents a warning status, like an operation that is about to fail. + #[serde(rename = "warning")] + pub warning: Option, + + #[serde(rename = "warning.background")] + pub warning_background: Option, + + #[serde(rename = "warning.border")] + pub warning_border: Option, +} + +/// The background appearance of the window. +#[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum WindowBackgroundContent { + Opaque, + Transparent, + Blurred, +} + +impl Into for WindowBackgroundContent { + fn into(self) -> gpui::WindowBackgroundAppearance { + match self { + WindowBackgroundContent::Opaque => gpui::WindowBackgroundAppearance::Opaque, + WindowBackgroundContent::Transparent => gpui::WindowBackgroundAppearance::Transparent, + WindowBackgroundContent::Blurred => gpui::WindowBackgroundAppearance::Blurred, + } + } +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum FontStyleContent { + Normal, + Italic, + Oblique, +} + +impl From for FontStyle { + fn from(value: FontStyleContent) -> Self { + match value { + FontStyleContent::Normal => FontStyle::Normal, + FontStyleContent::Italic => FontStyle::Italic, + FontStyleContent::Oblique => FontStyle::Oblique, + } + } +} + +#[derive( + Debug, Clone, Copy, Serialize_repr, Deserialize_repr, JsonSchema_repr, PartialEq, MergeFrom, +)] +#[repr(u16)] +pub enum FontWeightContent { + Thin = 100, + ExtraLight = 200, + Light = 300, + Normal = 400, + Medium = 500, + Semibold = 600, + Bold = 700, + ExtraBold = 800, + Black = 900, +} + +impl From for FontWeight { + fn from(value: FontWeightContent) -> Self { + match value { + FontWeightContent::Thin => FontWeight::THIN, + FontWeightContent::ExtraLight => FontWeight::EXTRA_LIGHT, + FontWeightContent::Light => FontWeight::LIGHT, + FontWeightContent::Normal => FontWeight::NORMAL, + FontWeightContent::Medium => FontWeight::MEDIUM, + FontWeightContent::Semibold => FontWeight::SEMIBOLD, + FontWeightContent::Bold => FontWeight::BOLD, + FontWeightContent::ExtraBold => FontWeight::EXTRA_BOLD, + FontWeightContent::Black => FontWeight::BLACK, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + + #[test] + fn test_buffer_line_height_deserialize_valid() { + assert_eq!( + serde_json::from_value::(json!("comfortable")).unwrap(), + BufferLineHeight::Comfortable + ); + assert_eq!( + serde_json::from_value::(json!("standard")).unwrap(), + BufferLineHeight::Standard + ); + assert_eq!( + serde_json::from_value::(json!({"custom": 1.0})).unwrap(), + BufferLineHeight::Custom(1.0) + ); + assert_eq!( + serde_json::from_value::(json!({"custom": 1.5})).unwrap(), + BufferLineHeight::Custom(1.5) + ); + } + + #[test] + fn test_buffer_line_height_deserialize_invalid() { + assert!( + serde_json::from_value::(json!({"custom": 0.99})) + .err() + .unwrap() + .to_string() + .contains("buffer_line_height.custom must be at least 1.0") + ); + assert!( + serde_json::from_value::(json!({"custom": 0.0})) + .err() + .unwrap() + .to_string() + .contains("buffer_line_height.custom must be at least 1.0") + ); + assert!( + serde_json::from_value::(json!({"custom": -1.0})) + .err() + .unwrap() + .to_string() + .contains("buffer_line_height.custom must be at least 1.0") + ); + } + + #[test] + fn test_buffer_font_weight_schema_has_default() { + use schemars::schema_for; + + let schema = schema_for!(ThemeSettingsContent); + let schema_value = serde_json::to_value(&schema).unwrap(); + + let properties = &schema_value["properties"]; + let buffer_font_weight = &properties["buffer_font_weight"]; + + assert!( + buffer_font_weight.get("default").is_some(), + "buffer_font_weight should have a default value in the schema" + ); + + let default_value = &buffer_font_weight["default"]; + assert_eq!( + default_value.as_f64(), + Some(FontWeight::NORMAL.0 as f64), + "buffer_font_weight default should be 400.0 (FontWeight::NORMAL)" + ); + + let defs = &schema_value["$defs"]; + let font_weight_def = &defs["FontWeight"]; + + assert_eq!( + font_weight_def["minimum"].as_f64(), + Some(FontWeight::THIN.0 as f64), + "FontWeight should have minimum of 100.0" + ); + assert_eq!( + font_weight_def["maximum"].as_f64(), + Some(FontWeight::BLACK.0 as f64), + "FontWeight should have maximum of 900.0" + ); + assert_eq!( + font_weight_def["default"].as_f64(), + Some(FontWeight::NORMAL.0 as f64), + "FontWeight should have default of 400.0" + ); + } +} diff --git a/crates/settings/src/settings_content/workspace.rs b/crates/settings/src/settings_content/workspace.rs new file mode 100644 index 0000000000000000000000000000000000000000..65e1bec1c47b3934d6eef574a78b17a9a92985e2 --- /dev/null +++ b/crates/settings/src/settings_content/workspace.rs @@ -0,0 +1,576 @@ +use std::num::NonZeroUsize; + +use collections::HashMap; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use settings_macros::MergeFrom; + +use crate::{DockPosition, DockSide, ScrollbarSettingsContent, ShowIndentGuides}; + +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct WorkspaceSettingsContent { + /// Active pane styling settings. + pub active_pane_modifiers: Option, + /// Layout mode for the bottom dock + /// + /// Default: contained + pub bottom_dock_layout: Option, + /// Direction to split horizontally. + /// + /// Default: "up" + pub pane_split_direction_horizontal: Option, + /// Direction to split vertically. + /// + /// Default: "left" + pub pane_split_direction_vertical: Option, + /// Centered layout related settings. + pub centered_layout: Option, + /// Whether or not to prompt the user to confirm before closing the application. + /// + /// Default: false + pub confirm_quit: Option, + /// Whether or not to show the call status icon in the status bar. + /// + /// Default: true + pub show_call_status_icon: Option, + /// When to automatically save edited buffers. + /// + /// Default: off + pub autosave: Option, + /// Controls previous session restoration in freshly launched Zed instance. + /// Values: none, last_workspace, last_session + /// Default: last_session + pub restore_on_startup: Option, + /// Whether to attempt to restore previous file's state when opening it again. + /// The state is stored per pane. + /// When disabled, defaults are applied instead of the state restoration. + /// + /// E.g. for editors, selections, folds and scroll positions are restored, if the same file is closed and, later, opened again in the same pane. + /// When disabled, a single selection in the very beginning of the file, zero scroll position and no folds state is used as a default. + /// + /// Default: true + pub restore_on_file_reopen: Option, + /// The size of the workspace split drop targets on the outer edges. + /// Given as a fraction that will be multiplied by the smaller dimension of the workspace. + /// + /// Default: `0.2` (20% of the smaller dimension of the workspace) + pub drop_target_size: Option, + /// Whether to close the window when using 'close active item' on a workspace with no tabs + /// + /// Default: auto ("on" on macOS, "off" otherwise) + pub when_closing_with_no_tabs: Option, + /// Whether to use the system provided dialogs for Open and Save As. + /// When set to false, Zed will use the built-in keyboard-first pickers. + /// + /// Default: true + pub use_system_path_prompts: Option, + /// Whether to use the system provided prompts. + /// When set to false, Zed will use the built-in prompts. + /// Note that this setting has no effect on Linux, where Zed will always + /// use the built-in prompts. + /// + /// Default: true + pub use_system_prompts: Option, + /// Aliases for the command palette. When you type a key in this map, + /// it will be assumed to equal the value. + /// + /// Default: true + #[serde(default)] + pub command_aliases: HashMap, + /// Maximum open tabs in a pane. Will not close an unsaved + /// tab. Set to `None` for unlimited tabs. + /// + /// Default: none + pub max_tabs: Option, + /// What to do when the last window is closed + /// + /// Default: auto (nothing on macOS, "app quit" otherwise) + pub on_last_window_closed: Option, + /// Whether to resize all the panels in a dock when resizing the dock. + /// + /// Default: ["left"] + pub resize_all_panels_in_dock: Option>, + /// Whether to automatically close files that have been deleted on disk. + /// + /// Default: false + pub close_on_file_delete: Option, + /// Whether to allow windows to tab together based on the user’s tabbing preference (macOS only). + /// + /// Default: false + pub use_system_window_tabs: Option, + /// Whether to show padding for zoomed panels. + /// When enabled, zoomed bottom panels will have some top padding, + /// while zoomed left/right panels will have padding to the right/left (respectively). + /// + /// Default: true + pub zoomed_padding: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct ItemSettingsContent { + /// Whether to show the Git file status on a tab item. + /// + /// Default: false + pub git_status: Option, + /// Position of the close button in a tab. + /// + /// Default: right + pub close_position: Option, + /// Whether to show the file icon for a tab. + /// + /// Default: false + pub file_icons: Option, + /// What to do after closing the current tab. + /// + /// Default: history + pub activate_on_close: Option, + /// Which files containing diagnostic errors/warnings to mark in the tabs. + /// This setting can take the following three values: + /// + /// Default: off + pub show_diagnostics: Option, + /// Whether to always show the close button on tabs. + /// + /// Default: false + pub show_close_button: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] +pub struct PreviewTabsSettingsContent { + /// Whether to show opened editors as preview tabs. + /// Preview tabs do not stay open, are reused until explicitly set to be kept open opened (via double-click or editing) and show file names in italic. + /// + /// Default: true + pub enabled: Option, + /// Whether to open tabs in preview mode when selected from the file finder. + /// + /// Default: false + pub enable_preview_from_file_finder: Option, + /// Whether a preview tab gets replaced when code navigation is used to navigate away from the tab. + /// + /// Default: false + pub enable_preview_from_code_navigation: Option, +} + +#[derive( + Copy, + Clone, + Debug, + PartialEq, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "lowercase")] +pub enum ClosePosition { + Left, + #[default] + Right, +} + +#[derive( + Copy, + Clone, + Debug, + PartialEq, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "lowercase")] +pub enum ShowCloseButton { + Always, + #[default] + Hover, + Hidden, +} + +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum ShowDiagnostics { + #[default] + Off, + Errors, + All, +} + +#[derive( + Copy, + Clone, + Debug, + PartialEq, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum ActivateOnClose { + #[default] + History, + Neighbour, + LeftNeighbour, +} + +#[skip_serializing_none] +#[derive(Copy, Clone, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub struct ActivePanelModifiers { + /// Size of the border surrounding the active pane. + /// When set to 0, the active pane doesn't have any border. + /// The border is drawn inset. + /// + /// Default: `0.0` + pub border_size: Option, + /// Opacity of inactive panels. + /// When set to 1.0, the inactive panes have the same opacity as the active one. + /// If set to 0, the inactive panes content will not be visible at all. + /// Values are clamped to the [0.0, 1.0] range. + /// + /// Default: `1.0` + pub inactive_opacity: Option, +} + +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + PartialEq, + JsonSchema, + MergeFrom, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum BottomDockLayout { + /// Contained between the left and right docks + #[default] + Contained, + /// Takes up the full width of the window + Full, + /// Extends under the left dock while snapping to the right dock + LeftAligned, + /// Extends under the right dock while snapping to the left dock + RightAligned, +} + +#[derive( + Copy, + Clone, + PartialEq, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + Debug, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum CloseWindowWhenNoItems { + /// Match platform conventions by default, so "on" on macOS and "off" everywhere else + #[default] + PlatformDefault, + /// Close the window when there are no tabs + CloseWindow, + /// Leave the window open when there are no tabs + KeepWindowOpen, +} + +impl CloseWindowWhenNoItems { + pub fn should_close(&self) -> bool { + match self { + CloseWindowWhenNoItems::PlatformDefault => cfg!(target_os = "macos"), + CloseWindowWhenNoItems::CloseWindow => true, + CloseWindowWhenNoItems::KeepWindowOpen => false, + } + } +} + +#[derive( + Copy, + Clone, + PartialEq, + Eq, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + Debug, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum RestoreOnStartupBehavior { + /// Always start with an empty editor + None, + /// Restore the workspace that was closed last. + LastWorkspace, + /// Restore all workspaces that were open when quitting Zed. + #[default] + LastSession, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq)] +pub struct TabBarSettingsContent { + /// Whether or not to show the tab bar in the editor. + /// + /// Default: true + pub show: Option, + /// Whether or not to show the navigation history buttons in the tab bar. + /// + /// Default: true + pub show_nav_history_buttons: Option, + /// Whether or not to show the tab bar buttons. + /// + /// Default: true + pub show_tab_bar_buttons: Option, +} + +#[skip_serializing_none] +#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq, Eq)] +pub struct StatusBarSettingsContent { + /// Whether to show the status bar. + /// + /// Default: true + #[serde(rename = "experimental.show", default)] + pub show: Option, + /// Whether to display the active language button in the status bar. + /// + /// Default: true + pub active_language_button: Option, + /// Whether to show the cursor position button in the status bar. + /// + /// Default: true + pub cursor_position_button: Option, +} + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum AutosaveSetting { + /// Disable autosave. + Off, + /// Save after inactivity period of `milliseconds`. + AfterDelay { milliseconds: u64 }, + /// Autosave when focus changes. + OnFocusChange, + /// Autosave when the active window changes. + OnWindowChange, +} + +impl AutosaveSetting { + pub fn should_save_on_close(&self) -> bool { + matches!( + &self, + AutosaveSetting::OnFocusChange + | AutosaveSetting::OnWindowChange + | AutosaveSetting::AfterDelay { .. } + ) + } +} + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum PaneSplitDirectionHorizontal { + Up, + Down, +} + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)] +#[serde(rename_all = "snake_case")] +pub enum PaneSplitDirectionVertical { + Left, + Right, +} + +#[skip_serializing_none] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Default)] +#[serde(rename_all = "snake_case")] +pub struct CenteredLayoutSettings { + /// The relative width of the left padding of the central pane from the + /// workspace when the centered layout is used. + /// + /// Default: 0.2 + pub left_padding: Option, + // The relative width of the right padding of the central pane from the + // workspace when the centered layout is used. + /// + /// Default: 0.2 + pub right_padding: Option, +} + +#[derive( + Copy, + Clone, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Debug, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum OnLastWindowClosed { + /// Match platform conventions by default, so don't quit on macOS, and quit on other platforms + #[default] + PlatformDefault, + /// Quit the application the last window is closed + QuitApp, +} + +impl OnLastWindowClosed { + pub fn is_quit_app(&self) -> bool { + match self { + OnLastWindowClosed::PlatformDefault => false, + OnLastWindowClosed::QuitApp => true, + } + } +} + +#[skip_serializing_none] +#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)] +pub struct ProjectPanelSettingsContent { + /// Whether to show the project panel button in the status bar. + /// + /// Default: true + pub button: Option, + /// Whether to hide gitignore files in the project panel. + /// + /// Default: false + pub hide_gitignore: Option, + /// Customize default width (in pixels) taken by project panel + /// + /// Default: 240 + pub default_width: Option, + /// The position of project panel + /// + /// Default: left + pub dock: Option, + /// Spacing between worktree entries in the project panel. + /// + /// Default: comfortable + pub entry_spacing: Option, + /// Whether to show file icons in the project panel. + /// + /// Default: true + pub file_icons: Option, + /// Whether to show folder icons or chevrons for directories in the project panel. + /// + /// Default: true + pub folder_icons: Option, + /// Whether to show the git status in the project panel. + /// + /// Default: true + pub git_status: Option, + /// Amount of indentation (in pixels) for nested items. + /// + /// Default: 20 + pub indent_size: Option, + /// Whether to reveal it in the project panel automatically, + /// when a corresponding project entry becomes active. + /// Gitignored entries are never auto revealed. + /// + /// Default: true + pub auto_reveal_entries: Option, + /// Whether to fold directories automatically + /// when directory has only one directory inside. + /// + /// Default: true + pub auto_fold_dirs: Option, + /// Whether the project panel should open on startup. + /// + /// Default: true + pub starts_open: Option, + /// Scrollbar-related settings + pub scrollbar: Option, + /// Which files containing diagnostic errors/warnings to mark in the project panel. + /// + /// Default: all + pub show_diagnostics: Option, + /// Settings related to indent guides in the project panel. + pub indent_guides: Option, + /// Whether to hide the root entry when only one folder is open in the window. + /// + /// Default: false + pub hide_root: Option, + /// Whether to hide the hidden entries in the project panel. + /// + /// Default: false + pub hide_hidden: Option, + /// Whether to stick parent directories at top of the project panel. + /// + /// Default: true + pub sticky_scroll: Option, + /// Whether to enable drag-and-drop operations in the project panel. + /// + /// Default: true + pub drag_and_drop: Option, +} + +#[derive( + Copy, + Clone, + Debug, + Default, + Serialize, + Deserialize, + JsonSchema, + MergeFrom, + PartialEq, + Eq, + strum::VariantArray, + strum::VariantNames, +)] +#[serde(rename_all = "snake_case")] +pub enum ProjectPanelEntrySpacing { + /// Comfortable spacing of entries. + #[default] + Comfortable, + /// The standard spacing of entries. + Standard, +} + +#[skip_serializing_none] +#[derive( + Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default, +)] +pub struct ProjectPanelIndentGuidesSettings { + pub show: Option, +} diff --git a/crates/settings/src/settings_file.rs b/crates/settings/src/settings_file.rs index d31dd82da475744d9658bc8ecdc6ec2ad17732fb..df6aa8bbb4de45ae8b3f037396ed38faf20a0873 100644 --- a/crates/settings/src/settings_file.rs +++ b/crates/settings/src/settings_file.rs @@ -1,4 +1,4 @@ -use crate::{Settings, settings_store::SettingsStore}; +use crate::{settings_content::SettingsContent, settings_store::SettingsStore}; use collections::HashSet; use fs::{Fs, PathEventKind}; use futures::{StreamExt, channel::mpsc}; @@ -22,7 +22,7 @@ pub fn test_settings() -> String { "buffer_font_family": "Courier", "buffer_font_features": {}, "buffer_font_size": 14, - "buffer_font_fallback": [], + "buffer_font_fallbacks": [], "theme": EMPTY_THEME_NAME, }), &mut value, @@ -37,7 +37,7 @@ pub fn test_settings() -> String { "buffer_font_family": "Courier New", "buffer_font_features": {}, "buffer_font_size": 14, - "buffer_font_fallback": [], + "buffer_font_fallbacks": [], "theme": EMPTY_THEME_NAME, }), &mut value, @@ -126,10 +126,10 @@ pub fn watch_config_dir( rx } -pub fn update_settings_file( +pub fn update_settings_file( fs: Arc, cx: &App, - update: impl 'static + Send + FnOnce(&mut T::FileContent, &App), + update: impl 'static + Send + FnOnce(&mut SettingsContent, &App), ) { - SettingsStore::global(cx).update_settings_file::(fs, update); + SettingsStore::global(cx).update_settings_file(fs, update); } diff --git a/crates/settings/src/settings_json.rs b/crates/settings/src/settings_json.rs index 70c76e23c402b8debcb5e406cc86fa7125e78c5a..555a48e9f0972d708eaf9aaaaaf467852ccf7dd6 100644 --- a/crates/settings/src/settings_json.rs +++ b/crates/settings/src/settings_json.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use gpui::App; +use gpui::SharedString; use serde::{Serialize, de::DeserializeOwned}; use serde_json::Value; use std::{ops::Range, sync::LazyLock}; @@ -10,23 +10,16 @@ use util::RangeExt; pub struct SettingsJsonSchemaParams<'a> { pub language_names: &'a [String], pub font_names: &'a [String], + pub theme_names: &'a [SharedString], + pub icon_theme_names: &'a [SharedString], } -/// Value registered which specifies JSON schemas that are generated at runtime. -pub struct ParameterizedJsonSchema { - pub add_and_get_ref: - fn(&mut schemars::SchemaGenerator, &SettingsJsonSchemaParams, &App) -> schemars::Schema, -} - -inventory::collect!(ParameterizedJsonSchema); - pub fn update_value_in_json_text<'a>( text: &mut String, key_path: &mut Vec<&'a str>, tab_size: usize, old_value: &'a Value, new_value: &'a Value, - preserved_keys: &[&str], edits: &mut Vec<(Range, String)>, ) { // If the old and new values are both objects, then compare them key by key, @@ -43,7 +36,6 @@ pub fn update_value_in_json_text<'a>( tab_size, old_sub_value, new_sub_value, - preserved_keys, edits, ); } else { @@ -64,17 +56,12 @@ pub fn update_value_in_json_text<'a>( tab_size, &Value::Null, new_sub_value, - preserved_keys, edits, ); } key_path.pop(); } - } else if key_path - .last() - .is_some_and(|key| preserved_keys.contains(key)) - || old_value != new_value - { + } else if old_value != new_value { let mut new_value = new_value.clone(); if let Some(new_object) = new_value.as_object_mut() { new_object.retain(|_, v| !v.is_null()); @@ -140,8 +127,9 @@ pub fn replace_value_in_json_text>( let found_key = text .get(key_range.clone()) - .and_then(|key_text| { - serde_json::to_string(key_path[depth].as_ref()) + .zip(key_path.get(depth)) + .and_then(|(key_text, key_path_value)| { + serde_json::to_string(key_path_value.as_ref()) .ok() .map(|key_path| depth < key_path.len() && key_text == key_path) }) @@ -157,6 +145,18 @@ pub fn replace_value_in_json_text>( break; } + if let Some(array_replacement) = handle_possible_array_value( + &mat.captures[0].node, + &mat.captures[1].node, + text, + &key_path[depth..], + new_value, + replace_key, + tab_size, + ) { + return array_replacement; + } + first_key_start = None; } } @@ -227,17 +227,12 @@ pub fn replace_value_in_json_text>( (removal_start..removal_end, String::new()) } } else { - // We have key paths, construct the sub objects - let new_key = key_path[depth].as_ref(); - - // We don't have the key, construct the nested objects - let mut new_value = - serde_json::to_value(new_value.unwrap_or(&serde_json::Value::Null)).unwrap(); - for key in key_path[(depth + 1)..].iter().rev() { - new_value = serde_json::json!({ key.as_ref().to_string(): new_value }); - } - if let Some(first_key_start) = first_key_start { + // We have key paths, construct the sub objects + let new_key = key_path[depth].as_ref(); + // We don't have the key, construct the nested objects + let new_value = construct_json_value(&key_path[(depth + 1)..], new_value); + let mut row = 0; let mut column = 0; for (ix, char) in text.char_indices() { @@ -265,7 +260,8 @@ pub fn replace_value_in_json_text>( (first_key_start..first_key_start, content) } } else { - new_value = serde_json::json!({ new_key.to_string(): new_value }); + // We don't have the key, construct the nested objects + let new_value = construct_json_value(&key_path[depth..], new_value); let indent_prefix_len = 4 * depth; let mut new_val = to_pretty_json(&new_value, 4, indent_prefix_len); if depth == 0 { @@ -297,35 +293,124 @@ pub fn replace_value_in_json_text>( } } +fn construct_json_value( + key_path: &[impl AsRef], + new_value: Option<&serde_json::Value>, +) -> serde_json::Value { + let mut new_value = + serde_json::to_value(new_value.unwrap_or(&serde_json::Value::Null)).unwrap(); + for key in key_path.iter().rev() { + if parse_index_key(key.as_ref()).is_some() { + new_value = serde_json::json!([new_value]); + } else { + new_value = serde_json::json!({ key.as_ref().to_string(): new_value }); + } + } + return new_value; +} + +fn parse_index_key(index_key: &str) -> Option { + index_key.strip_prefix('#')?.parse().ok() +} + +fn handle_possible_array_value( + key_node: &tree_sitter::Node, + value_node: &tree_sitter::Node, + text: &str, + remaining_key_path: &[impl AsRef], + new_value: Option<&Value>, + replace_key: Option<&str>, + tab_size: usize, +) -> Option<(Range, String)> { + if remaining_key_path.is_empty() { + return None; + } + let key_path = remaining_key_path; + let index = parse_index_key(key_path[0].as_ref())?; + + let value_is_array = value_node.kind() == TS_ARRAY_KIND; + + let array_str = if value_is_array { + &text[value_node.byte_range()] + } else { + "" + }; + + let (mut replace_range, mut replace_value) = replace_top_level_array_value_in_json_text( + array_str, + &key_path[1..], + new_value, + replace_key, + index, + tab_size, + ); + + if value_is_array { + replace_range.start += value_node.start_byte(); + replace_range.end += value_node.start_byte(); + } else { + // replace the full value if it wasn't an array + replace_range = value_node.byte_range(); + } + let non_whitespace_char_count = replace_value.len() + - replace_value + .chars() + .filter(char::is_ascii_whitespace) + .count(); + let needs_indent = replace_value.ends_with('\n') + || (replace_value + .chars() + .zip(replace_value.chars().skip(1)) + .any(|(c, next_c)| c == '\n' && !next_c.is_ascii_whitespace())); + let contains_comment = (replace_value.contains("//") && replace_value.contains('\n')) + || (replace_value.contains("/*") && replace_value.contains("*/")); + if needs_indent { + let indent_width = key_node.start_position().column; + let increased_indent = format!("\n{space:width$}", space = ' ', width = indent_width); + replace_value = replace_value.replace('\n', &increased_indent); + } else if non_whitespace_char_count < 32 && !contains_comment { + // remove indentation + while let Some(idx) = replace_value.find("\n ") { + replace_value.remove(idx); + } + while let Some(idx) = replace_value.find(" ") { + replace_value.remove(idx); + } + } + return Some((replace_range, replace_value)); +} + const TS_DOCUMENT_KIND: &str = "document"; const TS_ARRAY_KIND: &str = "array"; const TS_COMMENT_KIND: &str = "comment"; pub fn replace_top_level_array_value_in_json_text( text: &str, - key_path: &[&str], + key_path: &[impl AsRef], new_value: Option<&Value>, replace_key: Option<&str>, array_index: usize, tab_size: usize, -) -> Result<(Range, String)> { +) -> (Range, String) { let mut parser = tree_sitter::Parser::new(); parser .set_language(&tree_sitter_json::LANGUAGE.into()) .unwrap(); + let syntax_tree = parser.parse(text, None).unwrap(); let mut cursor = syntax_tree.walk(); if cursor.node().kind() == TS_DOCUMENT_KIND { - anyhow::ensure!( - cursor.goto_first_child(), - "Document empty - No top level array" - ); + cursor.goto_first_child(); } while cursor.node().kind() != TS_ARRAY_KIND { - anyhow::ensure!(cursor.goto_next_sibling(), "EOF - No top level array"); + if !cursor.goto_next_sibling() { + let json_value = construct_json_value(key_path, new_value); + let json_value = serde_json::json!([json_value]); + return (0..text.len(), to_pretty_json(&json_value, tab_size, 0)); + } } // false if no children @@ -350,7 +435,7 @@ pub fn replace_top_level_array_value_in_json_text( if let Some(new_value) = new_value { return append_top_level_array_value_in_json_text(text, new_value, tab_size); } else { - return Ok((0..0, String::new())); + return (0..0, String::new()); } } } @@ -386,8 +471,19 @@ pub fn replace_top_level_array_value_in_json_text( remove_range.start = cursor.node().range().start_byte; } } - Ok((remove_range, String::new())) + (remove_range, String::new()) } else { + if let Some(array_replacement) = handle_possible_array_value( + &cursor.node(), + &cursor.node(), + text, + key_path, + new_value, + replace_key, + tab_size, + ) { + return array_replacement; + } let (mut replace_range, mut replace_value) = replace_value_in_json_text(value_str, key_path, tab_size, new_value, replace_key); @@ -397,7 +493,6 @@ pub fn replace_top_level_array_value_in_json_text( if needs_indent { let increased_indent = format!("\n{space:width$}", space = ' ', width = indent_width); replace_value = replace_value.replace('\n', &increased_indent); - // replace_value.push('\n'); } else { while let Some(idx) = replace_value.find("\n ") { replace_value.remove(idx + 1); @@ -407,7 +502,7 @@ pub fn replace_top_level_array_value_in_json_text( } } - Ok((replace_range, replace_value)) + (replace_range, replace_value) } } @@ -415,7 +510,7 @@ pub fn append_top_level_array_value_in_json_text( text: &str, new_value: &Value, tab_size: usize, -) -> Result<(Range, String)> { +) -> (Range, String) { let mut parser = tree_sitter::Parser::new(); parser .set_language(&tree_sitter_json::LANGUAGE.into()) @@ -425,21 +520,21 @@ pub fn append_top_level_array_value_in_json_text( let mut cursor = syntax_tree.walk(); if cursor.node().kind() == TS_DOCUMENT_KIND { - anyhow::ensure!( - cursor.goto_first_child(), - "Document empty - No top level array" - ); + cursor.goto_first_child(); } while cursor.node().kind() != TS_ARRAY_KIND { - anyhow::ensure!(cursor.goto_next_sibling(), "EOF - No top level array"); + if !cursor.goto_next_sibling() { + let json_value = serde_json::json!([new_value]); + return (0..text.len(), to_pretty_json(&json_value, tab_size, 0)); + } } - anyhow::ensure!( - cursor.goto_last_child(), + let went_to_last_child = cursor.goto_last_child(); + debug_assert!( + went_to_last_child && cursor.node().kind() == "]", "Malformed JSON syntax tree, expected `]` at end of array" ); - debug_assert_eq!(cursor.node().kind(), "]"); let close_bracket_start = cursor.node().start_byte(); while cursor.goto_previous_sibling() && (cursor.node().is_extra() || cursor.node().is_missing()) @@ -508,7 +603,7 @@ pub fn append_top_level_array_value_in_json_text( if comma_range.is_none() { replace_value.insert(0, ','); } - } else { + } else if replace_value.contains('\n') || text.contains('\n') { if let Some(prev_newline) = text[..replace_range.start].rfind('\n') && text[prev_newline..replace_range.start].trim().is_empty() { @@ -519,7 +614,7 @@ pub fn append_top_level_array_value_in_json_text( replace_value.insert_str(0, &indent); replace_value.push('\n'); } - return Ok((replace_range, replace_value)); + return (replace_range, replace_value); fn is_error_of_kind(cursor: &mut tree_sitter::TreeCursor<'_>, kind: &str) -> bool { if cursor.node().kind() != "ERROR" { @@ -1045,6 +1140,689 @@ mod tests { ); } + #[test] + fn object_replace_array() { + // Tests replacing values within arrays that are nested inside objects. + // Uses "#N" syntax in key paths to indicate array indices. + #[track_caller] + fn check_object_replace_array( + input: String, + key_path: &[&str], + value: Option, + expected: String, + ) { + let result = replace_value_in_json_text(&input, key_path, 4, value.as_ref(), None); + let mut result_str = input; + result_str.replace_range(result.0, &result.1); + pretty_assertions::assert_eq!(expected, result_str); + } + + // Basic array element replacement + check_object_replace_array( + r#"{ + "a": [1, 3], + }"# + .unindent(), + &["a", "#1"], + Some(json!(2)), + r#"{ + "a": [1, 2], + }"# + .unindent(), + ); + + // Replace first element + check_object_replace_array( + r#"{ + "items": [1, 2, 3] + }"# + .unindent(), + &["items", "#0"], + Some(json!(10)), + r#"{ + "items": [10, 2, 3] + }"# + .unindent(), + ); + + // Replace last element + check_object_replace_array( + r#"{ + "items": [1, 2, 3] + }"# + .unindent(), + &["items", "#2"], + Some(json!(30)), + r#"{ + "items": [1, 2, 30] + }"# + .unindent(), + ); + + // Replace string in array + check_object_replace_array( + r#"{ + "names": ["alice", "bob", "charlie"] + }"# + .unindent(), + &["names", "#1"], + Some(json!("robert")), + r#"{ + "names": ["alice", "robert", "charlie"] + }"# + .unindent(), + ); + + // Replace boolean + check_object_replace_array( + r#"{ + "flags": [true, false, true] + }"# + .unindent(), + &["flags", "#0"], + Some(json!(false)), + r#"{ + "flags": [false, false, true] + }"# + .unindent(), + ); + + // Replace null with value + check_object_replace_array( + r#"{ + "values": [null, 2, null] + }"# + .unindent(), + &["values", "#0"], + Some(json!(1)), + r#"{ + "values": [1, 2, null] + }"# + .unindent(), + ); + + // Replace value with null + check_object_replace_array( + r#"{ + "data": [1, 2, 3] + }"# + .unindent(), + &["data", "#1"], + Some(json!(null)), + r#"{ + "data": [1, null, 3] + }"# + .unindent(), + ); + + // Replace simple value with object + check_object_replace_array( + r#"{ + "list": [1, 2, 3] + }"# + .unindent(), + &["list", "#1"], + Some(json!({"value": 2, "label": "two"})), + r#"{ + "list": [1, { "value": 2, "label": "two" }, 3] + }"# + .unindent(), + ); + + // Replace simple value with nested array + check_object_replace_array( + r#"{ + "matrix": [1, 2, 3] + }"# + .unindent(), + &["matrix", "#1"], + Some(json!([20, 21, 22])), + r#"{ + "matrix": [1, [ 20, 21, 22 ], 3] + }"# + .unindent(), + ); + + // Replace object in array + check_object_replace_array( + r#"{ + "users": [ + {"name": "alice"}, + {"name": "bob"}, + {"name": "charlie"} + ] + }"# + .unindent(), + &["users", "#1"], + Some(json!({"name": "robert", "age": 30})), + r#"{ + "users": [ + {"name": "alice"}, + { "name": "robert", "age": 30 }, + {"name": "charlie"} + ] + }"# + .unindent(), + ); + + // Replace property within object in array + check_object_replace_array( + r#"{ + "users": [ + {"name": "alice", "age": 25}, + {"name": "bob", "age": 30}, + {"name": "charlie", "age": 35} + ] + }"# + .unindent(), + &["users", "#1", "age"], + Some(json!(31)), + r#"{ + "users": [ + {"name": "alice", "age": 25}, + {"name": "bob", "age": 31}, + {"name": "charlie", "age": 35} + ] + }"# + .unindent(), + ); + + // Add new property to object in array + check_object_replace_array( + r#"{ + "items": [ + {"id": 1}, + {"id": 2}, + {"id": 3} + ] + }"# + .unindent(), + &["items", "#1", "name"], + Some(json!("Item Two")), + r#"{ + "items": [ + {"id": 1}, + {"name": "Item Two", "id": 2}, + {"id": 3} + ] + }"# + .unindent(), + ); + + // Remove property from object in array + check_object_replace_array( + r#"{ + "items": [ + {"id": 1, "name": "one"}, + {"id": 2, "name": "two"}, + {"id": 3, "name": "three"} + ] + }"# + .unindent(), + &["items", "#1", "name"], + None, + r#"{ + "items": [ + {"id": 1, "name": "one"}, + {"id": 2}, + {"id": 3, "name": "three"} + ] + }"# + .unindent(), + ); + + // Deeply nested: array in object in array + check_object_replace_array( + r#"{ + "data": [ + { + "values": [1, 2, 3] + }, + { + "values": [4, 5, 6] + } + ] + }"# + .unindent(), + &["data", "#0", "values", "#1"], + Some(json!(20)), + r#"{ + "data": [ + { + "values": [1, 20, 3] + }, + { + "values": [4, 5, 6] + } + ] + }"# + .unindent(), + ); + + // Multiple levels of nesting + check_object_replace_array( + r#"{ + "root": { + "level1": [ + { + "level2": { + "level3": [10, 20, 30] + } + } + ] + } + }"# + .unindent(), + &["root", "level1", "#0", "level2", "level3", "#2"], + Some(json!(300)), + r#"{ + "root": { + "level1": [ + { + "level2": { + "level3": [10, 20, 300] + } + } + ] + } + }"# + .unindent(), + ); + + // Array with mixed types + check_object_replace_array( + r#"{ + "mixed": [1, "two", true, null, {"five": 5}] + }"# + .unindent(), + &["mixed", "#3"], + Some(json!({"four": 4})), + r#"{ + "mixed": [1, "two", true, { "four": 4 }, {"five": 5}] + }"# + .unindent(), + ); + + // Replace with complex object + check_object_replace_array( + r#"{ + "config": [ + "simple", + "values" + ] + }"# + .unindent(), + &["config", "#0"], + Some(json!({ + "type": "complex", + "settings": { + "enabled": true, + "level": 5 + } + })), + r#"{ + "config": [ + { + "type": "complex", + "settings": { + "enabled": true, + "level": 5 + } + }, + "values" + ] + }"# + .unindent(), + ); + + // Array with trailing comma + check_object_replace_array( + r#"{ + "items": [ + 1, + 2, + 3, + ] + }"# + .unindent(), + &["items", "#1"], + Some(json!(20)), + r#"{ + "items": [ + 1, + 20, + 3, + ] + }"# + .unindent(), + ); + + // Array with comments + check_object_replace_array( + r#"{ + "items": [ + 1, // first item + 2, // second item + 3 // third item + ] + }"# + .unindent(), + &["items", "#1"], + Some(json!(20)), + r#"{ + "items": [ + 1, // first item + 20, // second item + 3 // third item + ] + }"# + .unindent(), + ); + + // Multiple arrays in object + check_object_replace_array( + r#"{ + "first": [1, 2, 3], + "second": [4, 5, 6], + "third": [7, 8, 9] + }"# + .unindent(), + &["second", "#1"], + Some(json!(50)), + r#"{ + "first": [1, 2, 3], + "second": [4, 50, 6], + "third": [7, 8, 9] + }"# + .unindent(), + ); + + // Empty array - add first element + check_object_replace_array( + r#"{ + "empty": [] + }"# + .unindent(), + &["empty", "#0"], + Some(json!("first")), + r#"{ + "empty": ["first"] + }"# + .unindent(), + ); + + // Array of arrays + check_object_replace_array( + r#"{ + "matrix": [ + [1, 2], + [3, 4], + [5, 6] + ] + }"# + .unindent(), + &["matrix", "#1", "#0"], + Some(json!(30)), + r#"{ + "matrix": [ + [1, 2], + [30, 4], + [5, 6] + ] + }"# + .unindent(), + ); + + // Replace nested object property in array element + check_object_replace_array( + r#"{ + "users": [ + { + "name": "alice", + "address": { + "city": "NYC", + "zip": "10001" + } + } + ] + }"# + .unindent(), + &["users", "#0", "address", "city"], + Some(json!("Boston")), + r#"{ + "users": [ + { + "name": "alice", + "address": { + "city": "Boston", + "zip": "10001" + } + } + ] + }"# + .unindent(), + ); + + // Add element past end of array + check_object_replace_array( + r#"{ + "items": [1, 2] + }"# + .unindent(), + &["items", "#5"], + Some(json!(6)), + r#"{ + "items": [1, 2, 6] + }"# + .unindent(), + ); + + // Complex nested structure + check_object_replace_array( + r#"{ + "app": { + "modules": [ + { + "name": "auth", + "routes": [ + {"path": "/login", "method": "POST"}, + {"path": "/logout", "method": "POST"} + ] + }, + { + "name": "api", + "routes": [ + {"path": "/users", "method": "GET"}, + {"path": "/users", "method": "POST"} + ] + } + ] + } + }"# + .unindent(), + &["app", "modules", "#1", "routes", "#0", "method"], + Some(json!("PUT")), + r#"{ + "app": { + "modules": [ + { + "name": "auth", + "routes": [ + {"path": "/login", "method": "POST"}, + {"path": "/logout", "method": "POST"} + ] + }, + { + "name": "api", + "routes": [ + {"path": "/users", "method": "PUT"}, + {"path": "/users", "method": "POST"} + ] + } + ] + } + }"# + .unindent(), + ); + + // Escaped strings in array + check_object_replace_array( + r#"{ + "messages": ["hello", "world"] + }"# + .unindent(), + &["messages", "#0"], + Some(json!("hello \"quoted\" world")), + r#"{ + "messages": ["hello \"quoted\" world", "world"] + }"# + .unindent(), + ); + + // Block comments + check_object_replace_array( + r#"{ + "data": [ + /* first */ 1, + /* second */ 2, + /* third */ 3 + ] + }"# + .unindent(), + &["data", "#1"], + Some(json!(20)), + r#"{ + "data": [ + /* first */ 1, + /* second */ 20, + /* third */ 3 + ] + }"# + .unindent(), + ); + + // Inline array + check_object_replace_array( + r#"{"items": [1, 2, 3], "count": 3}"#.to_string(), + &["items", "#1"], + Some(json!(20)), + r#"{"items": [1, 20, 3], "count": 3}"#.to_string(), + ); + + // Single element array + check_object_replace_array( + r#"{ + "single": [42] + }"# + .unindent(), + &["single", "#0"], + Some(json!(100)), + r#"{ + "single": [100] + }"# + .unindent(), + ); + + // Inconsistent formatting + check_object_replace_array( + r#"{ + "messy": [1, + 2, + 3, + 4] + }"# + .unindent(), + &["messy", "#2"], + Some(json!(30)), + r#"{ + "messy": [1, + 2, + 30, + 4] + }"# + .unindent(), + ); + + // Creates array if has numbered key + check_object_replace_array( + r#"{ + "array": {"foo": "bar"} + }"# + .unindent(), + &["array", "#3"], + Some(json!(4)), + r#"{ + "array": [ + 4 + ] + }"# + .unindent(), + ); + + // Replace non-array element within array with array + check_object_replace_array( + r#"{ + "matrix": [ + [1, 2], + [3, 4], + [5, 6] + ] + }"# + .unindent(), + &["matrix", "#1", "#0"], + Some(json!(["foo", "bar"])), + r#"{ + "matrix": [ + [1, 2], + [[ "foo", "bar" ], 4], + [5, 6] + ] + }"# + .unindent(), + ); + // Replace non-array element within array with array + check_object_replace_array( + r#"{ + "matrix": [ + [1, 2], + [3, 4], + [5, 6] + ] + }"# + .unindent(), + &["matrix", "#1", "#0", "#3"], + Some(json!(["foo", "bar"])), + r#"{ + "matrix": [ + [1, 2], + [[ [ "foo", "bar" ] ], 4], + [5, 6] + ] + }"# + .unindent(), + ); + + // Create array in key that doesn't exist + check_object_replace_array( + r#"{ + "foo": {} + }"# + .unindent(), + &["foo", "bar", "#0"], + Some(json!({"is_object": true})), + r#"{ + "foo": { + "bar": [ + { + "is_object": true + } + ] + } + }"# + .unindent(), + ); + } + #[test] fn array_replace() { #[track_caller] @@ -1063,8 +1841,7 @@ mod tests { None, index, 4, - ) - .expect("replace succeeded"); + ); let mut result_str = input; result_str.replace_range(result.0, &result.1); pretty_assertions::assert_eq!(expected.to_string(), result_str); @@ -1228,10 +2005,7 @@ mod tests { 0, &[], Some(json!("first")), - r#"[ - "first" - ]"# - .unindent(), + r#"["first"]"#.unindent(), ); // Test array with leading comments @@ -1411,6 +2185,32 @@ mod tests { ]"# .unindent(), ); + + check_array_replace( + r#""#, + 2, + &[], + Some(json!(42)), + r#"[ + 42 + ]"# + .unindent(), + ); + + check_array_replace( + r#""#, + 2, + &["foo", "bar"], + Some(json!(42)), + r#"[ + { + "foo": { + "bar": 42 + } + } + ]"# + .unindent(), + ); } #[test] @@ -1418,8 +2218,7 @@ mod tests { #[track_caller] fn check_array_append(input: impl ToString, value: Value, expected: impl ToString) { let input = input.to_string(); - let result = append_top_level_array_value_in_json_text(&input, &value, 4) - .expect("append succeeded"); + let result = append_top_level_array_value_in_json_text(&input, &value, 4); let mut result_str = input; result_str.replace_range(result.0, &result.1); pretty_assertions::assert_eq!(expected.to_string(), result_str); @@ -1677,5 +2476,14 @@ mod tests { ]"# .unindent(), ); + + check_array_append( + r#""#, + json!(42), + r#"[ + 42 + ]"# + .unindent(), + ) } } diff --git a/crates/settings/src/settings_store.rs b/crates/settings/src/settings_store.rs index f2270711938c9bcbf27cdcb3d9271d5d2baeec27..33ad826482a21c61e83beaa06c723b0caf5b519a 100644 --- a/crates/settings/src/settings_store.rs +++ b/crates/settings/src/settings_store.rs @@ -7,33 +7,38 @@ use futures::{ channel::{mpsc, oneshot}, future::LocalBoxFuture, }; -use gpui::{App, AsyncApp, BorrowAppContext, Global, SharedString, Task, UpdateGlobal}; +use gpui::{App, AsyncApp, BorrowAppContext, Global, Task, UpdateGlobal}; use paths::{EDITORCONFIG_NAME, local_settings_file_relative_path, task_file_name}; -use schemars::JsonSchema; -use serde::{Serialize, de::DeserializeOwned}; -use serde_json::{Value, json}; +use schemars::{JsonSchema, json_schema}; +use serde_json::Value; use smallvec::SmallVec; use std::{ any::{Any, TypeId, type_name}, - env, fmt::Debug, ops::Range, - path::{Path, PathBuf}, + path::PathBuf, + rc::Rc, str::{self, FromStr}, sync::Arc, }; use util::{ - ResultExt as _, merge_non_null_json_value_into, - schemars::{DefaultDenyUnknownFields, add_new_subschema}, + ResultExt as _, + rel_path::RelPath, + schemars::{DefaultDenyUnknownFields, replace_subschema}, }; pub type EditorconfigProperties = ec4rs::Properties; use crate::{ - ActiveSettingsProfileName, ParameterizedJsonSchema, SettingsJsonSchemaParams, SettingsUiEntry, - VsCodeSettings, WorktreeId, parse_json_with_comments, replace_value_in_json_text, - settings_ui_core::SettingsUi, update_value_in_json_text, + ActiveSettingsProfileName, FontFamilyName, IconThemeName, LanguageSettingsContent, + LanguageToSettingsMap, SettingsJsonSchemaParams, ThemeName, VsCodeSettings, WorktreeId, + merge_from::MergeFrom, + parse_json_with_comments, + settings_content::{ + ExtensionsSettingsContent, ProjectSettingsContent, SettingsContent, UserSettingsContent, + }, + update_value_in_json_text, }; pub trait SettingsKey: 'static + Send + Sync { @@ -48,7 +53,7 @@ pub trait SettingsKey: 'static + Send + Sync { /// A value that can be defined as a user setting. /// /// Settings can be loaded from a combination of multiple JSON files. -pub trait Settings: 'static + Send + Sync { +pub trait Settings: 'static + Send + Sync + Sized { /// The name of the keys in the [`FileContent`](Self::FileContent) that should /// always be written to a settings file, even if their value matches the default /// value. @@ -58,46 +63,23 @@ pub trait Settings: 'static + Send + Sync { /// user settings match the current version of the settings. const PRESERVED_KEYS: Option<&'static [&'static str]> = None; - /// The type that is stored in an individual JSON file. - type FileContent: Clone - + Default - + Serialize - + DeserializeOwned - + JsonSchema - + SettingsUi - + SettingsKey; - - /* - * let path = Settings - * - * - */ - /// The logic for combining together values from one or more JSON files into the - /// final value for this setting. + /// Read the value from default.json. /// - /// # Warning - /// `Self::FileContent` deserialized field names should match with `Self` deserialized field names - /// otherwise the field won't be deserialized properly and you will get the error: - /// "A default setting must be added to the `default.json` file" - fn load(sources: SettingsSources, cx: &mut App) -> Result - where - Self: Sized; - - fn missing_default() -> anyhow::Error { - anyhow::anyhow!("missing default for: {}", std::any::type_name::()) - } + /// This function *should* panic if default values are missing, + /// and you should add a default to default.json for documentation. + fn from_settings(content: &SettingsContent) -> Self; /// Use [the helpers in the vscode_import module](crate::vscode_import) to apply known /// equivalent settings from a vscode config to our config - fn import_from_vscode(vscode: &VsCodeSettings, current: &mut Self::FileContent); + fn import_from_vscode(_vscode: &VsCodeSettings, _current: &mut SettingsContent) {} #[track_caller] fn register(cx: &mut App) where Self: Sized, { - SettingsStore::update_global(cx, |store, cx| { - store.register_setting::(cx); + SettingsStore::update_global(cx, |store, _| { + store.register_setting::(); }); } @@ -146,94 +128,40 @@ pub trait Settings: 'static + Send + Sync { } } -#[derive(Clone, Copy, Debug)] -pub struct SettingsSources<'a, T> { - /// The default Zed settings. - pub default: &'a T, - /// Global settings (loaded before user settings). - pub global: Option<&'a T>, - /// Settings provided by extensions. - pub extensions: Option<&'a T>, - /// The user settings. - pub user: Option<&'a T>, - /// The user settings for the current release channel. - pub release_channel: Option<&'a T>, - /// The user settings for the current operating system. - pub operating_system: Option<&'a T>, - /// The settings associated with an enabled settings profile - pub profile: Option<&'a T>, - /// The server's settings. - pub server: Option<&'a T>, - /// The project settings, ordered from least specific to most specific. - pub project: &'a [&'a T], -} - -impl<'a, T: Serialize> SettingsSources<'a, T> { - /// Returns an iterator over the default settings as well as all settings customizations. - pub fn defaults_and_customizations(&self) -> impl Iterator { - [self.default].into_iter().chain(self.customizations()) - } - - /// Returns an iterator over all of the settings customizations. - pub fn customizations(&self) -> impl Iterator { - self.global - .into_iter() - .chain(self.extensions) - .chain(self.user) - .chain(self.release_channel) - .chain(self.operating_system) - .chain(self.profile) - .chain(self.server) - .chain(self.project.iter().copied()) - } - - /// Returns the settings after performing a JSON merge of the provided customizations. - /// - /// Customizations later in the iterator win out over the earlier ones. - pub fn json_merge_with( - customizations: impl Iterator, - ) -> Result { - let mut merged = Value::Null; - for value in customizations { - merge_non_null_json_value_into(serde_json::to_value(value).unwrap(), &mut merged); - } - Ok(serde_json::from_value(merged)?) - } - - /// Returns the settings after performing a JSON merge of the customizations into the - /// default settings. - /// - /// More-specific customizations win out over the less-specific ones. - pub fn json_merge(&'a self) -> Result { - Self::json_merge_with(self.defaults_and_customizations()) - } -} - #[derive(Clone, Copy, Debug)] pub struct SettingsLocation<'a> { pub worktree_id: WorktreeId, - pub path: &'a Path, + pub path: &'a RelPath, } -/// A set of strongly-typed setting values defined via multiple config files. pub struct SettingsStore { setting_values: HashMap>, - raw_default_settings: Value, - raw_global_settings: Option, - raw_user_settings: Value, - raw_server_settings: Option, - raw_extension_settings: Value, - raw_local_settings: BTreeMap<(WorktreeId, Arc), Value>, - raw_editorconfig_settings: BTreeMap<(WorktreeId, Arc), (String, Option)>, - tab_size_callback: Option<( - TypeId, - Box Option + Send + Sync + 'static>, - )>, + default_settings: Rc, + user_settings: Option, + global_settings: Option>, + + extension_settings: Option>, + server_settings: Option>, + + merged_settings: Rc, + + local_settings: BTreeMap<(WorktreeId, Arc), SettingsContent>, + raw_editorconfig_settings: BTreeMap<(WorktreeId, Arc), (String, Option)>, + _setting_file_updates: Task<()>, setting_file_updates_tx: mpsc::UnboundedSender LocalBoxFuture<'static, Result<()>>>>, } +#[derive(Clone, PartialEq, Debug)] +pub enum SettingsFile { + User, + Server, + Default, + /// Represents project settings in ssh projects as well as local projects + Project((WorktreeId, Arc)), +} + #[derive(Clone)] pub struct Editorconfig { pub is_root: bool, @@ -267,55 +195,41 @@ impl Global for SettingsStore {} #[derive(Debug)] struct SettingValue { global_value: Option, - local_values: Vec<(WorktreeId, Arc, T)>, + local_values: Vec<(WorktreeId, Arc, T)>, } trait AnySettingValue: 'static + Send + Sync { - fn key(&self) -> Option<&'static str>; fn setting_type_name(&self) -> &'static str; - fn deserialize_setting(&self, json: &Value) -> Result { - self.deserialize_setting_with_key(json).1 - } - fn deserialize_setting_with_key( - &self, - json: &Value, - ) -> (Option<&'static str>, Result); - fn load_setting( - &self, - sources: SettingsSources, - cx: &mut App, - ) -> Result>; + + fn from_settings(&self, s: &SettingsContent) -> Box; + fn value_for_path(&self, path: Option) -> &dyn Any; - fn all_local_values(&self) -> Vec<(WorktreeId, Arc, &dyn Any)>; + fn all_local_values(&self) -> Vec<(WorktreeId, Arc, &dyn Any)>; fn set_global_value(&mut self, value: Box); - fn set_local_value(&mut self, root_id: WorktreeId, path: Arc, value: Box); - fn json_schema(&self, generator: &mut schemars::SchemaGenerator) -> schemars::Schema; - fn edits_for_update( + fn set_local_value(&mut self, root_id: WorktreeId, path: Arc, value: Box); + fn import_from_vscode( &self, - raw_settings: &serde_json::Value, - tab_size: usize, vscode_settings: &VsCodeSettings, - text: &mut String, - edits: &mut Vec<(Range, String)>, + settings_content: &mut SettingsContent, ); - fn settings_ui_item(&self) -> SettingsUiEntry; } -struct DeserializedSetting(Box); - impl SettingsStore { - pub fn new(cx: &App) -> Self { + pub fn new(cx: &App, default_settings: &str) -> Self { let (setting_file_updates_tx, mut setting_file_updates_rx) = mpsc::unbounded(); + let default_settings: Rc = + parse_json_with_comments(default_settings).unwrap(); Self { setting_values: Default::default(), - raw_default_settings: json!({}), - raw_global_settings: None, - raw_user_settings: json!({}), - raw_server_settings: None, - raw_extension_settings: json!({}), - raw_local_settings: Default::default(), + default_settings: default_settings.clone(), + global_settings: None, + server_settings: None, + user_settings: None, + extension_settings: None, + + merged_settings: default_settings, + local_settings: BTreeMap::default(), raw_editorconfig_settings: BTreeMap::default(), - tab_size_callback: Default::default(), setting_file_updates_tx, _setting_file_updates: cx.spawn(async move |cx| { while let Some(setting_file_update) = setting_file_updates_rx.next().await { @@ -341,7 +255,7 @@ impl SettingsStore { } /// Add a new type of setting to the store. - pub fn register_setting(&mut self, cx: &mut App) { + pub fn register_setting(&mut self) { let setting_type_id = TypeId::of::(); let entry = self.setting_values.entry(setting_type_id); @@ -353,72 +267,8 @@ impl SettingsStore { global_value: None, local_values: Vec::new(), })); - - if let Some(default_settings) = setting_value - .deserialize_setting(&self.raw_default_settings) - .log_err() - { - let user_value = setting_value - .deserialize_setting(&self.raw_user_settings) - .log_err(); - - let mut release_channel_value = None; - if let Some(release_settings) = &self - .raw_user_settings - .get(release_channel::RELEASE_CHANNEL.dev_name()) - { - release_channel_value = setting_value - .deserialize_setting(release_settings) - .log_err(); - } - - let mut os_settings_value = None; - if let Some(os_settings) = &self.raw_user_settings.get(env::consts::OS) { - os_settings_value = setting_value.deserialize_setting(os_settings).log_err(); - } - - let mut profile_value = None; - if let Some(active_profile) = cx.try_global::() - && let Some(profiles) = self.raw_user_settings.get("profiles") - && let Some(profile_settings) = profiles.get(&active_profile.0) - { - profile_value = setting_value - .deserialize_setting(profile_settings) - .log_err(); - } - - let server_value = self - .raw_server_settings - .as_ref() - .and_then(|server_setting| { - setting_value.deserialize_setting(server_setting).log_err() - }); - - let extension_value = setting_value - .deserialize_setting(&self.raw_extension_settings) - .log_err(); - - if let Some(setting) = setting_value - .load_setting( - SettingsSources { - default: &default_settings, - global: None, - extensions: extension_value.as_ref(), - user: user_value.as_ref(), - release_channel: release_channel_value.as_ref(), - operating_system: os_settings_value.as_ref(), - profile: profile_value.as_ref(), - server: server_value.as_ref(), - project: &[], - }, - cx, - ) - .context("A default setting must be added to the `default.json` file") - .log_err() - { - setting_value.set_global_value(setting); - } - } + let value = T::from_settings(&self.merged_settings); + setting_value.set_global_value(Box::new(value)); } /// Get the value of a setting. @@ -445,7 +295,7 @@ impl SettingsStore { } /// Get all values from project specific settings - pub fn get_all_locals(&self) -> Vec<(WorktreeId, Arc, &T)> { + pub fn get_all_locals(&self) -> Vec<(WorktreeId, Arc, &T)> { self.setting_values .get(&TypeId::of::()) .unwrap_or_else(|| panic!("unregistered setting type {}", type_name::())) @@ -472,48 +322,29 @@ impl SettingsStore { .set_global_value(Box::new(value)) } - /// Get the user's settings as a raw JSON value. + /// Get the user's settings content. /// /// For user-facing functionality use the typed setting interface. /// (e.g. ProjectSettings::get_global(cx)) - pub fn raw_user_settings(&self) -> &Value { - &self.raw_user_settings + pub fn raw_user_settings(&self) -> Option<&UserSettingsContent> { + self.user_settings.as_ref() } - /// Replaces current settings with the values from the given JSON. - pub fn set_raw_user_settings(&mut self, new_settings: Value, cx: &mut App) -> Result<()> { - self.raw_user_settings = new_settings; - self.recompute_values(None, cx)?; - Ok(()) + /// Get the default settings content as a raw JSON value. + pub fn raw_default_settings(&self) -> &SettingsContent { + &self.default_settings } /// Get the configured settings profile names. pub fn configured_settings_profiles(&self) -> impl Iterator { - self.raw_user_settings - .get("profiles") - .and_then(|v| v.as_object()) - .into_iter() - .flat_map(|obj| obj.keys()) - .map(|s| s.as_str()) - } - - /// Access the raw JSON value of the global settings. - pub fn raw_global_settings(&self) -> Option<&Value> { - self.raw_global_settings.as_ref() - } - - /// Access the raw JSON value of the default settings. - pub fn raw_default_settings(&self) -> &Value { - &self.raw_default_settings + self.user_settings + .iter() + .flat_map(|settings| settings.profiles.keys().map(|k| k.as_str())) } #[cfg(any(test, feature = "test-support"))] pub fn test(cx: &mut App) -> Self { - let mut this = Self::new(cx); - this.set_default_settings(&crate::test_settings(), cx) - .unwrap(); - this.set_user_settings("{}", cx).unwrap(); - this + Self::new(cx, &crate::test_settings()) } /// Updates the value of a setting in the user's global configuration. @@ -521,13 +352,18 @@ impl SettingsStore { /// This is only for tests. Normally, settings are only loaded from /// JSON files. #[cfg(any(test, feature = "test-support"))] - pub fn update_user_settings( + pub fn update_user_settings( &mut self, cx: &mut App, - update: impl FnOnce(&mut T::FileContent), + update: impl FnOnce(&mut SettingsContent), ) { - let old_text = serde_json::to_string(&self.raw_user_settings).unwrap(); - let new_text = self.new_text_for_update::(old_text, update); + let mut content = self.user_settings.clone().unwrap_or_default().content; + update(&mut content); + let new_text = serde_json::to_string(&UserSettingsContent { + content, + ..Default::default() + }) + .unwrap(); self.set_user_settings(&new_text, cx).unwrap(); } @@ -598,42 +434,14 @@ impl SettingsStore { return rx; } - pub fn update_settings_file_at_path( - &self, - fs: Arc, - path: &[impl AsRef], - new_value: serde_json::Value, - ) -> oneshot::Receiver> { - let key_path = path - .into_iter() - .map(AsRef::as_ref) - .map(SharedString::new) - .collect::>(); - let update = move |mut old_text: String, cx: AsyncApp| { - cx.read_global(|store: &SettingsStore, _cx| { - // todo(settings_ui) use `update_value_in_json_text` for merging new and old objects with comment preservation, needs old value though... - let (range, replacement) = replace_value_in_json_text( - &old_text, - key_path.as_slice(), - store.json_tab_size(), - Some(&new_value), - None, - ); - old_text.replace_range(range, &replacement); - old_text - }) - }; - self.update_settings_file_inner(fs, update) - } - - pub fn update_settings_file( + pub fn update_settings_file( &self, fs: Arc, - update: impl 'static + Send + FnOnce(&mut T::FileContent, &App), + update: impl 'static + Send + FnOnce(&mut SettingsContent, &App), ) { _ = self.update_settings_file_inner(fs, move |old_text: String, cx: AsyncApp| { cx.read_global(|store: &SettingsStore, cx| { - store.new_text_for_update::(old_text, |content| update(content, cx)) + store.new_text_for_update(old_text, |content| update(content, cx)) }) }); } @@ -650,22 +458,129 @@ impl SettingsStore { }) } - pub fn settings_ui_items(&self) -> impl IntoIterator { - self.setting_values - .values() - .map(|item| item.settings_ui_item()) + pub fn get_all_files(&self) -> Vec { + let mut files = Vec::from_iter( + self.local_settings + .keys() + // rev because these are sorted by path, so highest precedence is last + .rev() + .cloned() + .map(SettingsFile::Project), + ); + + if self.server_settings.is_some() { + files.push(SettingsFile::Server); + } + // ignoring profiles + // ignoring os profiles + // ignoring release channel profiles + // ignoring global + // ignoring extension + + if self.user_settings.is_some() { + files.push(SettingsFile::User); + } + files.push(SettingsFile::Default); + files + } + + fn get_content_for_file(&self, file: SettingsFile) -> Option<&SettingsContent> { + match file { + SettingsFile::User => self + .user_settings + .as_ref() + .map(|settings| settings.content.as_ref()), + SettingsFile::Default => Some(self.default_settings.as_ref()), + SettingsFile::Server => self.server_settings.as_deref(), + SettingsFile::Project(ref key) => self.local_settings.get(key), + } + } + + pub fn get_overrides_for_field( + &self, + target_file: SettingsFile, + get: fn(&SettingsContent) -> &Option, + ) -> Vec { + let all_files = self.get_all_files(); + let mut found_file = false; + let mut overrides = Vec::new(); + + for file in all_files.into_iter().rev() { + if !found_file { + found_file = file == target_file; + continue; + } + + if let SettingsFile::Project((wt_id, ref path)) = file + && let SettingsFile::Project((target_wt_id, ref target_path)) = target_file + && (wt_id != target_wt_id || !target_path.starts_with(path)) + { + // if requesting value from a local file, don't return values from local files in different worktrees + continue; + } + + let Some(content) = self.get_content_for_file(file.clone()) else { + continue; + }; + if get(content).is_some() { + overrides.push(file); + } + } + + overrides + } + + /// Checks the given file, and files that the passed file overrides for the given field. + /// Returns the first file found that contains the value. + /// The value will only be None if no file contains the value. + /// I.e. if no file contains the value, returns `(File::Default, None)` + pub fn get_value_from_file( + &self, + target_file: SettingsFile, + pick: fn(&SettingsContent) -> &Option, + ) -> (SettingsFile, Option<&T>) { + // todo(settings_ui): Add a metadata field for overriding the "overrides" tag, for contextually different settings + // e.g. disable AI isn't overridden, or a vec that gets extended instead or some such + + // todo(settings_ui) cache all files + let all_files = self.get_all_files(); + let mut found_file = false; + + for file in all_files.into_iter() { + if !found_file && file != target_file && file != SettingsFile::Default { + continue; + } + found_file = true; + + if let SettingsFile::Project((worktree_id, ref path)) = file + && let SettingsFile::Project((target_worktree_id, ref target_path)) = target_file + && (worktree_id != target_worktree_id || !target_path.starts_with(&path)) + { + // if requesting value from a local file, don't return values from local files in different worktrees + continue; + } + + let Some(content) = self.get_content_for_file(file.clone()) else { + continue; + }; + if let Some(value) = pick(content).as_ref() { + return (file, Some(value)); + } + } + + (SettingsFile::Default, None) } } impl SettingsStore { /// Updates the value of a setting in a JSON file, returning the new text /// for that JSON file. - pub fn new_text_for_update( + pub fn new_text_for_update( &self, old_text: String, - update: impl FnOnce(&mut T::FileContent), + update: impl FnOnce(&mut SettingsContent), ) -> String { - let edits = self.edits_for_update::(&old_text, update); + let edits = self.edits_for_update(&old_text, update); let mut new_text = old_text; for (range, replacement) in edits.into_iter() { new_text.replace_range(range, &replacement); @@ -673,52 +588,30 @@ impl SettingsStore { new_text } - pub fn get_vscode_edits(&self, mut old_text: String, vscode: &VsCodeSettings) -> String { - let mut new_text = old_text.clone(); - let mut edits: Vec<(Range, String)> = Vec::new(); - let raw_settings = parse_json_with_comments::(&old_text).unwrap_or_default(); - let tab_size = self.json_tab_size(); - for v in self.setting_values.values() { - v.edits_for_update(&raw_settings, tab_size, vscode, &mut old_text, &mut edits); - } - for (range, replacement) in edits.into_iter() { - new_text.replace_range(range, &replacement); - } - new_text + pub fn get_vscode_edits(&self, old_text: String, vscode: &VsCodeSettings) -> String { + self.new_text_for_update(old_text, |settings_content| { + for v in self.setting_values.values() { + v.import_from_vscode(vscode, settings_content) + } + }) } /// Updates the value of a setting in a JSON file, returning a list /// of edits to apply to the JSON file. - pub fn edits_for_update( + pub fn edits_for_update( &self, text: &str, - update: impl FnOnce(&mut T::FileContent), + update: impl FnOnce(&mut SettingsContent), ) -> Vec<(Range, String)> { - let setting_type_id = TypeId::of::(); - - let preserved_keys = T::PRESERVED_KEYS.unwrap_or_default(); - - let setting = self - .setting_values - .get(&setting_type_id) - .unwrap_or_else(|| panic!("unregistered setting type {}", type_name::())); - let raw_settings = parse_json_with_comments::(text).unwrap_or_default(); - let (key, deserialized_setting) = setting.deserialize_setting_with_key(&raw_settings); - let old_content = match deserialized_setting { - Ok(content) => content.0.downcast::().unwrap(), - Err(_) => Box::<::FileContent>::default(), - }; + let old_content: UserSettingsContent = + parse_json_with_comments(text).log_err().unwrap_or_default(); let mut new_content = old_content.clone(); - update(&mut new_content); + update(&mut new_content.content); let old_value = serde_json::to_value(&old_content).unwrap(); let new_value = serde_json::to_value(new_content).unwrap(); let mut key_path = Vec::new(); - if let Some(key) = key { - key_path.push(key); - } - let mut edits = Vec::new(); let tab_size = self.json_tab_size(); let mut text = text.to_string(); @@ -728,35 +621,13 @@ impl SettingsStore { tab_size, &old_value, &new_value, - preserved_keys, &mut edits, ); edits } - /// Configure the tab sized when updating JSON files. - pub fn set_json_tab_size_callback( - &mut self, - get_tab_size: fn(&T) -> Option, - ) { - self.tab_size_callback = Some(( - TypeId::of::(), - Box::new(move |value| get_tab_size(value.downcast_ref::().unwrap())), - )); - } - pub fn json_tab_size(&self) -> usize { - const DEFAULT_JSON_TAB_SIZE: usize = 2; - - if let Some((setting_type_id, callback)) = &self.tab_size_callback { - let setting_value = self.setting_values.get(setting_type_id).unwrap(); - let value = setting_value.value_for_path(None); - if let Some(value) = callback(value) { - return value; - } - } - - DEFAULT_JSON_TAB_SIZE + 2 } /// Sets the default settings via a JSON string. @@ -767,29 +638,22 @@ impl SettingsStore { default_settings_content: &str, cx: &mut App, ) -> Result<()> { - let settings: Value = parse_json_with_comments(default_settings_content)?; - anyhow::ensure!(settings.is_object(), "settings must be an object"); - self.raw_default_settings = settings; + self.default_settings = parse_json_with_comments(default_settings_content)?; self.recompute_values(None, cx)?; Ok(()) } /// Sets the user settings via a JSON string. - pub fn set_user_settings( - &mut self, - user_settings_content: &str, - cx: &mut App, - ) -> Result { - let settings: Value = if user_settings_content.is_empty() { + pub fn set_user_settings(&mut self, user_settings_content: &str, cx: &mut App) -> Result<()> { + let settings: UserSettingsContent = if user_settings_content.is_empty() { parse_json_with_comments("{}")? } else { parse_json_with_comments(user_settings_content)? }; - anyhow::ensure!(settings.is_object(), "settings must be an object"); - self.raw_user_settings = settings.clone(); + self.user_settings = Some(settings); self.recompute_values(None, cx)?; - Ok(settings) + Ok(()) } /// Sets the global settings via a JSON string. @@ -797,17 +661,16 @@ impl SettingsStore { &mut self, global_settings_content: &str, cx: &mut App, - ) -> Result { - let settings: Value = if global_settings_content.is_empty() { + ) -> Result<()> { + let settings: SettingsContent = if global_settings_content.is_empty() { parse_json_with_comments("{}")? } else { parse_json_with_comments(global_settings_content)? }; - anyhow::ensure!(settings.is_object(), "settings must be an object"); - self.raw_global_settings = Some(settings.clone()); + self.global_settings = Some(Box::new(settings)); self.recompute_values(None, cx)?; - Ok(settings) + Ok(()) } pub fn set_server_settings( @@ -815,20 +678,15 @@ impl SettingsStore { server_settings_content: &str, cx: &mut App, ) -> Result<()> { - let settings: Option = if server_settings_content.is_empty() { + let settings: Option = if server_settings_content.is_empty() { None } else { parse_json_with_comments(server_settings_content)? }; - anyhow::ensure!( - settings - .as_ref() - .map(|value| value.is_object()) - .unwrap_or(true), - "settings must be an object" - ); - self.raw_server_settings = settings; + // Rewrite the server settings into a content type + self.server_settings = settings.map(|settings| Box::new(settings)); + self.recompute_values(None, cx)?; Ok(()) } @@ -837,7 +695,7 @@ impl SettingsStore { pub fn set_local_settings( &mut self, root_id: WorktreeId, - directory_path: Arc, + directory_path: Arc, kind: LocalSettingsKind, settings_content: Option<&str>, cx: &mut App, @@ -852,19 +710,25 @@ impl SettingsStore { (LocalSettingsKind::Tasks, _) => { return Err(InvalidSettingsError::Tasks { message: "Attempted to submit tasks into the settings store".to_string(), - path: directory_path.join(task_file_name()), + path: directory_path + .join(RelPath::unix(task_file_name()).unwrap()) + .as_std_path() + .to_path_buf(), }); } (LocalSettingsKind::Debug, _) => { return Err(InvalidSettingsError::Debug { message: "Attempted to submit debugger config into the settings store" .to_string(), - path: directory_path.join(task_file_name()), + path: directory_path + .join(RelPath::unix(task_file_name()).unwrap()) + .as_std_path() + .to_path_buf(), }); } (LocalSettingsKind::Settings, None) => { zed_settings_changed = self - .raw_local_settings + .local_settings .remove(&(root_id, directory_path.clone())) .is_some() } @@ -873,24 +737,27 @@ impl SettingsStore { .remove(&(root_id, directory_path.clone())); } (LocalSettingsKind::Settings, Some(settings_contents)) => { - let new_settings = - parse_json_with_comments::(settings_contents).map_err(|e| { - InvalidSettingsError::LocalSettings { - path: directory_path.join(local_settings_file_relative_path()), - message: e.to_string(), - } - })?; - match self - .raw_local_settings - .entry((root_id, directory_path.clone())) - { + let new_settings = parse_json_with_comments::( + settings_contents, + ) + .map_err(|e| InvalidSettingsError::LocalSettings { + path: directory_path.join(local_settings_file_relative_path()), + message: e.to_string(), + })?; + match self.local_settings.entry((root_id, directory_path.clone())) { btree_map::Entry::Vacant(v) => { - v.insert(new_settings); + v.insert(SettingsContent { + project: new_settings, + ..Default::default() + }); zed_settings_changed = true; } btree_map::Entry::Occupied(mut o) => { - if o.get() != &new_settings { - o.insert(new_settings); + if &o.get().project != &new_settings { + o.insert(SettingsContent { + project: new_settings, + ..Default::default() + }); zed_settings_changed = true; } } @@ -909,7 +776,8 @@ impl SettingsStore { v.insert((editorconfig_contents.to_owned(), None)); return Err(InvalidSettingsError::Editorconfig { message: e.to_string(), - path: directory_path.join(EDITORCONFIG_NAME), + path: directory_path + .join(RelPath::unix(EDITORCONFIG_NAME).unwrap()), }); } }, @@ -926,7 +794,8 @@ impl SettingsStore { o.insert((editorconfig_contents.to_owned(), None)); return Err(InvalidSettingsError::Editorconfig { message: e.to_string(), - path: directory_path.join(EDITORCONFIG_NAME), + path: directory_path + .join(RelPath::unix(EDITORCONFIG_NAME).unwrap()), }); } } @@ -942,47 +811,55 @@ impl SettingsStore { Ok(()) } - pub fn set_extension_settings(&mut self, content: T, cx: &mut App) -> Result<()> { - let settings: Value = serde_json::to_value(content)?; - anyhow::ensure!(settings.is_object(), "settings must be an object"); - self.raw_extension_settings = settings; + pub fn set_extension_settings( + &mut self, + content: ExtensionsSettingsContent, + cx: &mut App, + ) -> Result<()> { + self.extension_settings = Some(Box::new(SettingsContent { + project: ProjectSettingsContent { + all_languages: content.all_languages, + ..Default::default() + }, + ..Default::default() + })); self.recompute_values(None, cx)?; Ok(()) } /// Add or remove a set of local settings via a JSON string. pub fn clear_local_settings(&mut self, root_id: WorktreeId, cx: &mut App) -> Result<()> { - self.raw_local_settings + self.local_settings .retain(|(worktree_id, _), _| worktree_id != &root_id); - self.recompute_values(Some((root_id, "".as_ref())), cx)?; + self.recompute_values(Some((root_id, RelPath::empty())), cx)?; Ok(()) } pub fn local_settings( &self, root_id: WorktreeId, - ) -> impl '_ + Iterator, String)> { - self.raw_local_settings + ) -> impl '_ + Iterator, &ProjectSettingsContent)> { + self.local_settings .range( - (root_id, Path::new("").into()) + (root_id, RelPath::empty().into()) ..( WorktreeId::from_usize(root_id.to_usize() + 1), - Path::new("").into(), + RelPath::empty().into(), ), ) - .map(|((_, path), content)| (path.clone(), serde_json::to_string(content).unwrap())) + .map(|((_, path), content)| (path.clone(), &content.project)) } pub fn local_editorconfig_settings( &self, root_id: WorktreeId, - ) -> impl '_ + Iterator, String, Option)> { + ) -> impl '_ + Iterator, String, Option)> { self.raw_editorconfig_settings .range( - (root_id, Path::new("").into()) + (root_id, RelPath::empty().into()) ..( WorktreeId::from_usize(root_id.to_usize() + 1), - Path::new("").into(), + RelPath::empty().into(), ), ) .map(|((_, path), (content, parsed_content))| { @@ -990,341 +867,122 @@ impl SettingsStore { }) } - pub fn json_schema(&self, schema_params: &SettingsJsonSchemaParams, cx: &App) -> Value { + pub fn json_schema(&self, params: &SettingsJsonSchemaParams) -> Value { let mut generator = schemars::generate::SchemaSettings::draft2019_09() .with_transform(DefaultDenyUnknownFields) .into_generator(); - let mut combined_schema = json!({ - "type": "object", - "properties": {} - }); - // Merge together settings schemas, similarly to json schema's "allOf". This merging is - // recursive, though at time of writing this recursive nature isn't used very much. An - // example of it is the schema for `jupyter` having contribution from both `EditorSettings` - // and `JupyterSettings`. - // - // This logic could be removed in favor of "allOf", but then there isn't the opportunity to - // validate and fully control the merge. - for setting_value in self.setting_values.values() { - let mut setting_schema = setting_value.json_schema(&mut generator); - - if let Some(key) = setting_value.key() { - if let Some(properties) = combined_schema.get_mut("properties") - && let Some(properties_obj) = properties.as_object_mut() - { - if let Some(target) = properties_obj.get_mut(key) { - merge_schema(target, setting_schema.to_value()); - } else { - properties_obj.insert(key.to_string(), setting_schema.to_value()); - } - } - } else { - setting_schema.remove("description"); - setting_schema.remove("additionalProperties"); - merge_schema(&mut combined_schema, setting_schema.to_value()); - } - } + UserSettingsContent::json_schema(&mut generator); - fn merge_schema(target: &mut serde_json::Value, source: serde_json::Value) { - let (Some(target_obj), serde_json::Value::Object(source_obj)) = - (target.as_object_mut(), source) - else { - return; - }; + let language_settings_content_ref = generator + .subschema_for::() + .to_value(); - for (source_key, source_value) in source_obj { - match source_key.as_str() { - "properties" => { - let serde_json::Value::Object(source_properties) = source_value else { - log::error!( - "bug: expected object for `{}` json schema field, but got: {}", - source_key, - source_value - ); - continue; - }; - let target_properties = - target_obj.entry(source_key.clone()).or_insert(json!({})); - let Some(target_properties) = target_properties.as_object_mut() else { - log::error!( - "bug: expected object for `{}` json schema field, but got: {}", - source_key, - target_properties - ); - continue; - }; - for (key, value) in source_properties { - if let Some(existing) = target_properties.get_mut(&key) { - merge_schema(existing, value); - } else { - target_properties.insert(key, value); - } - } - } - "allOf" | "anyOf" | "oneOf" => { - let serde_json::Value::Array(source_array) = source_value else { - log::error!( - "bug: expected array for `{}` json schema field, but got: {}", - source_key, - source_value, - ); - continue; - }; - let target_array = - target_obj.entry(source_key.clone()).or_insert(json!([])); - let Some(target_array) = target_array.as_array_mut() else { - log::error!( - "bug: expected array for `{}` json schema field, but got: {}", - source_key, - target_array, - ); - continue; - }; - target_array.extend(source_array); - } - "type" - | "$ref" - | "enum" - | "minimum" - | "maximum" - | "pattern" - | "description" - | "additionalProperties" => { - if let Some(old_value) = - target_obj.insert(source_key.clone(), source_value.clone()) - && old_value != source_value - { - log::error!( - "bug: while merging JSON schemas, \ - mismatch `\"{}\": {}` (before was `{}`)", - source_key, - old_value, - source_value - ); - } - } - _ => { - log::error!( - "bug: while merging settings JSON schemas, \ - encountered unexpected `\"{}\": {}`", - source_key, - source_value - ); - } - } - } - } + replace_subschema::(&mut generator, || { + json_schema!({ + "type": "object", + "properties": params + .language_names + .iter() + .map(|name| { + ( + name.clone(), + language_settings_content_ref.clone(), + ) + }) + .collect::>(), + "errorMessage": "No language with this name is installed." + }) + }); - // add schemas which are determined at runtime - for parameterized_json_schema in inventory::iter::() { - (parameterized_json_schema.add_and_get_ref)(&mut generator, schema_params, cx); - } + replace_subschema::(&mut generator, || { + json_schema!({ + "type": "string", + "enum": params.font_names, + }) + }); - // add merged settings schema to the definitions - const ZED_SETTINGS: &str = "ZedSettings"; - let zed_settings_ref = add_new_subschema(&mut generator, ZED_SETTINGS, combined_schema); - - // add `ZedSettingsOverride` which is the same as `ZedSettings` except that unknown - // fields are rejected. This is used for release stage settings and profiles. - let mut zed_settings_override = zed_settings_ref.clone(); - zed_settings_override.insert("unevaluatedProperties".to_string(), false.into()); - let zed_settings_override_ref = add_new_subschema( - &mut generator, - "ZedSettingsOverride", - zed_settings_override.to_value(), - ); + replace_subschema::(&mut generator, || { + json_schema!({ + "type": "string", + "enum": params.theme_names, + }) + }); - // Remove `"additionalProperties": false` added by `DefaultDenyUnknownFields` so that - // unknown fields can be handled by the root schema and `ZedSettingsOverride`. - let mut definitions = generator.take_definitions(true); - definitions - .get_mut(ZED_SETTINGS) - .unwrap() - .as_object_mut() - .unwrap() - .remove("additionalProperties"); + replace_subschema::(&mut generator, || { + json_schema!({ + "type": "string", + "enum": params.icon_theme_names, + }) + }); - let meta_schema = generator - .settings() - .meta_schema - .as_ref() - .expect("meta_schema should be present in schemars settings") - .to_string(); - - json!({ - "$schema": meta_schema, - "title": "Zed Settings", - "unevaluatedProperties": false, - // ZedSettings + settings overrides for each release stage / OS / profiles - "allOf": [ - zed_settings_ref, - { - "properties": { - "dev": zed_settings_override_ref, - "nightly": zed_settings_override_ref, - "stable": zed_settings_override_ref, - "preview": zed_settings_override_ref, - "linux": zed_settings_override_ref, - "macos": zed_settings_override_ref, - "windows": zed_settings_override_ref, - "profiles": { - "type": "object", - "description": "Configures any number of settings profiles.", - "additionalProperties": zed_settings_override_ref - } - } - } - ], - "$defs": definitions, - }) + generator + .root_schema_for::() + .to_value() } fn recompute_values( &mut self, - changed_local_path: Option<(WorktreeId, &Path)>, + changed_local_path: Option<(WorktreeId, &RelPath)>, cx: &mut App, ) -> std::result::Result<(), InvalidSettingsError> { // Reload the global and local values for every setting. - let mut project_settings_stack = Vec::::new(); - let mut paths_stack = Vec::>::new(); - for setting_value in self.setting_values.values_mut() { - let default_settings = setting_value - .deserialize_setting(&self.raw_default_settings) - .map_err(|e| InvalidSettingsError::DefaultSettings { - message: e.to_string(), - })?; - - let global_settings = self - .raw_global_settings - .as_ref() - .and_then(|setting| setting_value.deserialize_setting(setting).log_err()); - - let extension_settings = setting_value - .deserialize_setting(&self.raw_extension_settings) - .log_err(); - - let user_settings = match setting_value.deserialize_setting(&self.raw_user_settings) { - Ok(settings) => Some(settings), - Err(error) => { - return Err(InvalidSettingsError::UserSettings { - message: error.to_string(), - }); - } - }; - - let server_settings = self - .raw_server_settings - .as_ref() - .and_then(|setting| setting_value.deserialize_setting(setting).log_err()); - - let mut release_channel_settings = None; - if let Some(release_settings) = &self - .raw_user_settings - .get(release_channel::RELEASE_CHANNEL.dev_name()) - && let Some(release_settings) = setting_value - .deserialize_setting(release_settings) - .log_err() - { - release_channel_settings = Some(release_settings); + let mut project_settings_stack = Vec::::new(); + let mut paths_stack = Vec::>::new(); + + if changed_local_path.is_none() { + let mut merged = self.default_settings.as_ref().clone(); + merged.merge_from_option(self.extension_settings.as_deref()); + merged.merge_from_option(self.global_settings.as_deref()); + if let Some(user_settings) = self.user_settings.as_ref() { + merged.merge_from(&user_settings.content); + merged.merge_from_option(user_settings.for_release_channel()); + merged.merge_from_option(user_settings.for_os()); + merged.merge_from_option(user_settings.for_profile(cx)); } + merged.merge_from_option(self.server_settings.as_deref()); + self.merged_settings = Rc::new(merged); - let mut os_settings = None; - if let Some(settings) = &self.raw_user_settings.get(env::consts::OS) - && let Some(settings) = setting_value.deserialize_setting(settings).log_err() - { - os_settings = Some(settings); + for setting_value in self.setting_values.values_mut() { + let value = setting_value.from_settings(&self.merged_settings); + setting_value.set_global_value(value); } + } - let mut profile_settings = None; - if let Some(active_profile) = cx.try_global::() - && let Some(profiles) = self.raw_user_settings.get("profiles") - && let Some(profile_json) = profiles.get(&active_profile.0) - { - profile_settings = setting_value.deserialize_setting(profile_json).log_err(); + for ((root_id, directory_path), local_settings) in &self.local_settings { + // Build a stack of all of the local values for that setting. + while let Some(prev_entry) = paths_stack.last() { + if let Some((prev_root_id, prev_path)) = prev_entry + && (root_id != prev_root_id || !directory_path.starts_with(prev_path)) + { + paths_stack.pop(); + project_settings_stack.pop(); + continue; + } + break; } - // If the global settings file changed, reload the global value for the field. - if changed_local_path.is_none() - && let Some(value) = setting_value - .load_setting( - SettingsSources { - default: &default_settings, - global: global_settings.as_ref(), - extensions: extension_settings.as_ref(), - user: user_settings.as_ref(), - release_channel: release_channel_settings.as_ref(), - operating_system: os_settings.as_ref(), - profile: profile_settings.as_ref(), - server: server_settings.as_ref(), - project: &[], - }, - cx, - ) - .log_err() - { - setting_value.set_global_value(value); - } + paths_stack.push(Some((*root_id, directory_path.as_ref()))); + let mut merged_local_settings = if let Some(deepest) = project_settings_stack.last() { + (*deepest).clone() + } else { + self.merged_settings.as_ref().clone() + }; + merged_local_settings.merge_from(local_settings); - // Reload the local values for the setting. - paths_stack.clear(); - project_settings_stack.clear(); - for ((root_id, directory_path), local_settings) in &self.raw_local_settings { - // Build a stack of all of the local values for that setting. - while let Some(prev_entry) = paths_stack.last() { - if let Some((prev_root_id, prev_path)) = prev_entry - && (root_id != prev_root_id || !directory_path.starts_with(prev_path)) - { - paths_stack.pop(); - project_settings_stack.pop(); - continue; - } - break; - } + project_settings_stack.push(merged_local_settings); - match setting_value.deserialize_setting(local_settings) { - Ok(local_settings) => { - paths_stack.push(Some((*root_id, directory_path.as_ref()))); - project_settings_stack.push(local_settings); - - // If a local settings file changed, then avoid recomputing local - // settings for any path outside of that directory. - if changed_local_path.is_some_and( - |(changed_root_id, changed_local_path)| { - *root_id != changed_root_id - || !directory_path.starts_with(changed_local_path) - }, - ) { - continue; - } + // If a local settings file changed, then avoid recomputing local + // settings for any path outside of that directory. + if changed_local_path.is_some_and(|(changed_root_id, changed_local_path)| { + *root_id != changed_root_id || !directory_path.starts_with(changed_local_path) + }) { + continue; + } - if let Some(value) = setting_value - .load_setting( - SettingsSources { - default: &default_settings, - global: global_settings.as_ref(), - extensions: extension_settings.as_ref(), - user: user_settings.as_ref(), - release_channel: release_channel_settings.as_ref(), - operating_system: os_settings.as_ref(), - profile: profile_settings.as_ref(), - server: server_settings.as_ref(), - project: &project_settings_stack.iter().collect::>(), - }, - cx, - ) - .log_err() - { - setting_value.set_local_value(*root_id, directory_path.clone(), value); - } - } - Err(error) => { - return Err(InvalidSettingsError::LocalSettings { - path: directory_path.join(local_settings_file_relative_path()), - message: error.to_string(), - }); - } - } + for setting_value in self.setting_values.values_mut() { + let value = setting_value.from_settings(&project_settings_stack.last().unwrap()); + setting_value.set_local_value(*root_id, directory_path.clone(), value); } } Ok(()) @@ -1333,7 +991,7 @@ impl SettingsStore { pub fn editorconfig_properties( &self, for_worktree: WorktreeId, - for_path: &Path, + for_path: &RelPath, ) -> Option { let mut properties = EditorconfigProperties::new(); @@ -1349,7 +1007,9 @@ impl SettingsStore { properties = EditorconfigProperties::new(); } for section in parsed_editorconfig.sections { - section.apply_to(&mut properties, for_path).log_err()?; + section + .apply_to(&mut properties, for_path.as_std_path()) + .log_err()?; } } @@ -1360,11 +1020,11 @@ impl SettingsStore { #[derive(Debug, Clone, PartialEq)] pub enum InvalidSettingsError { - LocalSettings { path: PathBuf, message: String }, + LocalSettings { path: Arc, message: String }, UserSettings { message: String }, ServerSettings { message: String }, DefaultSettings { message: String }, - Editorconfig { path: PathBuf, message: String }, + Editorconfig { path: Arc, message: String }, Tasks { path: PathBuf, message: String }, Debug { path: PathBuf, message: String }, } @@ -1397,111 +1057,23 @@ impl Debug for SettingsStore { .map(|value| value.setting_type_name()) .collect::>(), ) - .field("default_settings", &self.raw_default_settings) - .field("user_settings", &self.raw_user_settings) - .field("local_settings", &self.raw_local_settings) + .field("default_settings", &self.default_settings) + .field("user_settings", &self.user_settings) + .field("local_settings", &self.local_settings) .finish_non_exhaustive() } } impl AnySettingValue for SettingValue { - fn key(&self) -> Option<&'static str> { - T::FileContent::KEY + fn from_settings(&self, s: &SettingsContent) -> Box { + Box::new(T::from_settings(s)) as _ } fn setting_type_name(&self) -> &'static str { type_name::() } - fn load_setting( - &self, - values: SettingsSources, - cx: &mut App, - ) -> Result> { - Ok(Box::new(T::load( - SettingsSources { - default: values.default.0.downcast_ref::().unwrap(), - global: values - .global - .map(|value| value.0.downcast_ref::().unwrap()), - extensions: values - .extensions - .map(|value| value.0.downcast_ref::().unwrap()), - user: values - .user - .map(|value| value.0.downcast_ref::().unwrap()), - release_channel: values - .release_channel - .map(|value| value.0.downcast_ref::().unwrap()), - operating_system: values - .operating_system - .map(|value| value.0.downcast_ref::().unwrap()), - profile: values - .profile - .map(|value| value.0.downcast_ref::().unwrap()), - server: values - .server - .map(|value| value.0.downcast_ref::().unwrap()), - project: values - .project - .iter() - .map(|value| value.0.downcast_ref().unwrap()) - .collect::>() - .as_slice(), - }, - cx, - )?)) - } - - fn deserialize_setting_with_key( - &self, - mut json: &Value, - ) -> (Option<&'static str>, Result) { - let mut key = None; - if let Some(k) = T::FileContent::KEY { - if let Some(value) = json.get(k) { - json = value; - key = Some(k); - } else if let Some((k, value)) = - T::FileContent::FALLBACK_KEY.and_then(|k| Some((k, json.get(k)?))) - { - json = value; - key = Some(k); - } else { - let value = T::FileContent::default(); - return ( - T::FileContent::KEY, - Ok(DeserializedSetting(Box::new(value))), - ); - } - } - let value = serde_path_to_error::deserialize::<_, T::FileContent>(json) - .map(|value| DeserializedSetting(Box::new(value))) - .map_err(|err| { - // construct a path using the key and reported error path if possible. - // Unfortunately, serde_path_to_error does not expose the necessary - // methods and data to simply add the key to the path - let mut path = String::new(); - if let Some(key) = key { - path.push_str(key); - } - let err_path = err.path().to_string(); - // when the path is empty, serde_path_to_error stringifies the path as ".", - // when the path is unknown, serde_path_to_error stringifies the path as an empty string - if !err_path.is_empty() && !err_path.starts_with(".") { - path.push('.'); - path.push_str(&err_path); - } - if path.is_empty() { - anyhow::Error::from(err.into_inner()) - } else { - anyhow::anyhow!("'{}': {}", err.into_inner(), path) - } - }); - (key, value) - } - - fn all_local_values(&self) -> Vec<(WorktreeId, Arc, &dyn Any)> { + fn all_local_values(&self) -> Vec<(WorktreeId, Arc, &dyn Any)> { self.local_values .iter() .map(|(id, path, value)| (*id, path.clone(), value as _)) @@ -1526,7 +1098,7 @@ impl AnySettingValue for SettingValue { self.global_value = Some(*value.downcast().unwrap()); } - fn set_local_value(&mut self, root_id: WorktreeId, path: Arc, value: Box) { + fn set_local_value(&mut self, root_id: WorktreeId, path: Arc, value: Box) { let value = *value.downcast().unwrap(); match self .local_values @@ -1537,134 +1109,176 @@ impl AnySettingValue for SettingValue { } } - fn json_schema(&self, generator: &mut schemars::SchemaGenerator) -> schemars::Schema { - T::FileContent::json_schema(generator) - } - - fn edits_for_update( + fn import_from_vscode( &self, - raw_settings: &serde_json::Value, - tab_size: usize, vscode_settings: &VsCodeSettings, - text: &mut String, - edits: &mut Vec<(Range, String)>, + settings_content: &mut SettingsContent, ) { - let (key, deserialized_setting) = self.deserialize_setting_with_key(raw_settings); - let old_content = match deserialized_setting { - Ok(content) => content.0.downcast::().unwrap(), - Err(_) => Box::<::FileContent>::default(), - }; - let mut new_content = old_content.clone(); - T::import_from_vscode(vscode_settings, &mut new_content); - - let old_value = serde_json::to_value(&old_content).unwrap(); - let new_value = serde_json::to_value(new_content).unwrap(); - - let mut key_path = Vec::new(); - if let Some(key) = key { - key_path.push(key); - } - - update_value_in_json_text( - text, - &mut key_path, - tab_size, - &old_value, - &new_value, - T::PRESERVED_KEYS.unwrap_or_default(), - edits, - ); - } - - fn settings_ui_item(&self) -> SettingsUiEntry { - <::FileContent as SettingsUi>::settings_ui_entry() + T::import_from_vscode(vscode_settings, settings_content); } } #[cfg(test)] mod tests { - use crate::VsCodeSettingsSource; + use std::num::NonZeroU32; + + use crate::{ + ClosePosition, ItemSettingsContent, VsCodeSettingsSource, default_settings, + settings_content::LanguageSettingsContent, test_settings, + }; use super::*; - // This is so the SettingsUi macro can still work properly - use crate as settings; - use serde_derive::Deserialize; - use settings_ui_macros::{SettingsKey, SettingsUi}; use unindent::Unindent; + use util::rel_path::rel_path; - #[gpui::test] - fn test_settings_store_basic(cx: &mut App) { - let mut store = SettingsStore::new(cx); - store.register_setting::(cx); - store.register_setting::(cx); - store.register_setting::(cx); - store - .set_default_settings( - r#"{ - "turbo": false, - "user": { - "name": "John Doe", - "age": 30, - "staff": false - } - }"#, - cx, - ) - .unwrap(); + #[derive(Debug, PartialEq)] + struct AutoUpdateSetting { + auto_update: bool, + } - assert_eq!(store.get::(None), &TurboSetting(false)); - assert_eq!( - store.get::(None), - &UserSettings { - name: "John Doe".to_string(), - age: 30, - staff: false, + impl Settings for AutoUpdateSetting { + fn from_settings(content: &SettingsContent) -> Self { + AutoUpdateSetting { + auto_update: content.auto_update.unwrap(), + } + } + } + + #[derive(Debug, PartialEq)] + struct ItemSettings { + close_position: ClosePosition, + git_status: bool, + } + + impl Settings for ItemSettings { + fn from_settings(content: &SettingsContent) -> Self { + let content = content.tabs.clone().unwrap(); + ItemSettings { + close_position: content.close_position.unwrap(), + git_status: content.git_status.unwrap(), + } + } + + fn import_from_vscode(vscode: &VsCodeSettings, content: &mut SettingsContent) { + let mut show = None; + + vscode.bool_setting("workbench.editor.decorations.colors", &mut show); + if let Some(show) = show { + content + .tabs + .get_or_insert_default() + .git_status + .replace(show); + } + } + } + + #[derive(Debug, PartialEq)] + struct DefaultLanguageSettings { + tab_size: NonZeroU32, + preferred_line_length: u32, + } + + impl Settings for DefaultLanguageSettings { + fn from_settings(content: &SettingsContent) -> Self { + let content = &content.project.all_languages.defaults; + DefaultLanguageSettings { + tab_size: content.tab_size.unwrap(), + preferred_line_length: content.preferred_line_length.unwrap(), + } + } + + fn import_from_vscode(vscode: &VsCodeSettings, content: &mut SettingsContent) { + let content = &mut content.project.all_languages.defaults; + + if let Some(size) = vscode + .read_value("editor.tabSize") + .and_then(|v| v.as_u64()) + .and_then(|n| NonZeroU32::new(n as u32)) + { + content.tab_size = Some(size); + } + } + } + + #[derive(Debug, PartialEq)] + struct ThemeSettings { + buffer_font_family: FontFamilyName, + buffer_font_fallbacks: Vec, + } + + impl Settings for ThemeSettings { + fn from_settings(content: &SettingsContent) -> Self { + let content = content.theme.clone(); + ThemeSettings { + buffer_font_family: content.buffer_font_family.unwrap(), + buffer_font_fallbacks: content.buffer_font_fallbacks.unwrap(), } + } + + fn import_from_vscode(vscode: &VsCodeSettings, content: &mut SettingsContent) { + let content = &mut content.theme; + + vscode.font_family_setting( + "editor.fontFamily", + &mut content.buffer_font_family, + &mut content.buffer_font_fallbacks, + ); + } + } + + #[gpui::test] + fn test_settings_store_basic(cx: &mut App) { + let mut store = SettingsStore::new(cx, &default_settings()); + store.register_setting::(); + store.register_setting::(); + store.register_setting::(); + + assert_eq!( + store.get::(None), + &AutoUpdateSetting { auto_update: true } ); assert_eq!( - store.get::(None), - &MultiKeySettings { - key1: String::new(), - key2: String::new(), - } + store.get::(None).close_position, + ClosePosition::Right ); store .set_user_settings( r#"{ - "turbo": true, - "user": { "age": 31 }, - "key1": "a" + "auto_update": false, + "tabs": { + "close_position": "left" + } }"#, cx, ) .unwrap(); - assert_eq!(store.get::(None), &TurboSetting(true)); assert_eq!( - store.get::(None), - &UserSettings { - name: "John Doe".to_string(), - age: 31, - staff: false - } + store.get::(None), + &AutoUpdateSetting { auto_update: false } + ); + assert_eq!( + store.get::(None).close_position, + ClosePosition::Left ); store .set_local_settings( WorktreeId::from_usize(1), - Path::new("/root1").into(), + rel_path("root1").into(), LocalSettingsKind::Settings, - Some(r#"{ "user": { "staff": true } }"#), + Some(r#"{ "tab_size": 5 }"#), cx, ) .unwrap(); store .set_local_settings( WorktreeId::from_usize(1), - Path::new("/root1/subdir").into(), + rel_path("root1/subdir").into(), LocalSettingsKind::Settings, - Some(r#"{ "user": { "name": "Jane Doe" } }"#), + Some(r#"{ "preferred_line_length": 50 }"#), cx, ) .unwrap(); @@ -1672,110 +1286,76 @@ mod tests { store .set_local_settings( WorktreeId::from_usize(1), - Path::new("/root2").into(), + rel_path("root2").into(), LocalSettingsKind::Settings, - Some(r#"{ "user": { "age": 42 }, "key2": "b" }"#), + Some(r#"{ "tab_size": 9, "auto_update": true}"#), cx, ) .unwrap(); assert_eq!( - store.get::(Some(SettingsLocation { + store.get::(Some(SettingsLocation { worktree_id: WorktreeId::from_usize(1), - path: Path::new("/root1/something"), + path: rel_path("root1/something"), })), - &UserSettings { - name: "John Doe".to_string(), - age: 31, - staff: true + &DefaultLanguageSettings { + preferred_line_length: 80, + tab_size: 5.try_into().unwrap(), } ); assert_eq!( - store.get::(Some(SettingsLocation { + store.get::(Some(SettingsLocation { worktree_id: WorktreeId::from_usize(1), - path: Path::new("/root1/subdir/something") + path: rel_path("root1/subdir/something"), })), - &UserSettings { - name: "Jane Doe".to_string(), - age: 31, - staff: true + &DefaultLanguageSettings { + preferred_line_length: 50, + tab_size: 5.try_into().unwrap(), } ); assert_eq!( - store.get::(Some(SettingsLocation { + store.get::(Some(SettingsLocation { worktree_id: WorktreeId::from_usize(1), - path: Path::new("/root2/something") + path: rel_path("root2/something"), })), - &UserSettings { - name: "John Doe".to_string(), - age: 42, - staff: false + &DefaultLanguageSettings { + preferred_line_length: 80, + tab_size: 9.try_into().unwrap(), } ); assert_eq!( - store.get::(Some(SettingsLocation { + store.get::(Some(SettingsLocation { worktree_id: WorktreeId::from_usize(1), - path: Path::new("/root2/something") + path: rel_path("root2/something") })), - &MultiKeySettings { - key1: "a".to_string(), - key2: "b".to_string(), - } + &AutoUpdateSetting { auto_update: false } ); } #[gpui::test] fn test_setting_store_assign_json_before_register(cx: &mut App) { - let mut store = SettingsStore::new(cx); - store - .set_default_settings( - r#"{ - "turbo": true, - "user": { - "name": "John Doe", - "age": 30, - "staff": false - }, - "key1": "x" - }"#, - cx, - ) - .unwrap(); + let mut store = SettingsStore::new(cx, &test_settings()); store - .set_user_settings(r#"{ "turbo": false }"#, cx) + .set_user_settings(r#"{ "auto_update": false }"#, cx) .unwrap(); - store.register_setting::(cx); - store.register_setting::(cx); + store.register_setting::(); - assert_eq!(store.get::(None), &TurboSetting(false)); assert_eq!( - store.get::(None), - &UserSettings { - name: "John Doe".to_string(), - age: 30, - staff: false, - } - ); - - store.register_setting::(cx); - assert_eq!( - store.get::(None), - &MultiKeySettings { - key1: "x".into(), - key2: String::new(), - } + store.get::(None), + &AutoUpdateSetting { auto_update: false } ); } - fn check_settings_update( + #[track_caller] + fn check_settings_update( store: &mut SettingsStore, old_json: String, - update: fn(&mut T::FileContent), + update: fn(&mut SettingsContent), expected_new_json: String, cx: &mut App, ) { store.set_user_settings(&old_json, cx).ok(); - let edits = store.edits_for_update::(&old_json, update); + let edits = store.edits_for_update(&old_json, update); let mut new_json = old_json; for (range, replacement) in edits.into_iter() { new_json.replace_range(range, &replacement); @@ -1785,32 +1365,30 @@ mod tests { #[gpui::test] fn test_setting_store_update(cx: &mut App) { - let mut store = SettingsStore::new(cx); - store.register_setting::(cx); - store.register_setting::(cx); - store.register_setting::(cx); + let mut store = SettingsStore::new(cx, &test_settings()); // entries added and updated - check_settings_update::( + check_settings_update( &mut store, r#"{ "languages": { "JSON": { - "language_setting_1": true + "auto_indent": true } } }"# .unindent(), |settings| { settings - .languages + .languages_mut() .get_mut("JSON") .unwrap() - .language_setting_1 = Some(false); - settings.languages.insert( + .auto_indent = Some(false); + + settings.languages_mut().insert( "Rust".into(), - LanguageSettingEntry { - language_setting_2: Some(true), + LanguageSettingsContent { + auto_indent: Some(true), ..Default::default() }, ); @@ -1818,10 +1396,10 @@ mod tests { r#"{ "languages": { "Rust": { - "language_setting_2": true + "auto_indent": true }, "JSON": { - "language_setting_1": false + "auto_indent": false } } }"# @@ -1830,7 +1408,7 @@ mod tests { ); // entries removed - check_settings_update::( + check_settings_update( &mut store, r#"{ "languages": { @@ -1844,7 +1422,7 @@ mod tests { }"# .unindent(), |settings| { - settings.languages.remove("JSON").unwrap(); + settings.languages_mut().remove("JSON").unwrap(); }, r#"{ "languages": { @@ -1857,7 +1435,7 @@ mod tests { cx, ); - check_settings_update::( + check_settings_update( &mut store, r#"{ "languages": { @@ -1871,7 +1449,7 @@ mod tests { }"# .unindent(), |settings| { - settings.languages.remove("Rust").unwrap(); + settings.languages_mut().remove("Rust").unwrap(); }, r#"{ "languages": { @@ -1885,40 +1463,42 @@ mod tests { ); // weird formatting - check_settings_update::( + check_settings_update( &mut store, r#"{ - "user": { "age": 36, "name": "Max", "staff": true } + "tabs": { "close_position": "left", "name": "Max" } }"# .unindent(), - |settings| settings.age = Some(37), + |settings| { + settings.tabs.as_mut().unwrap().close_position = Some(ClosePosition::Left); + }, r#"{ - "user": { "age": 37, "name": "Max", "staff": true } + "tabs": { "close_position": "left", "name": "Max" } }"# .unindent(), cx, ); // single-line formatting, other keys - check_settings_update::( + check_settings_update( &mut store, - r#"{ "one": 1, "two": 2 }"#.unindent(), - |settings| settings.key1 = Some("x".into()), - r#"{ "key1": "x", "one": 1, "two": 2 }"#.unindent(), + r#"{ "one": 1, "two": 2 }"#.to_owned(), + |settings| settings.auto_update = Some(true), + r#"{ "auto_update": true, "one": 1, "two": 2 }"#.to_owned(), cx, ); // empty object - check_settings_update::( + check_settings_update( &mut store, r#"{ - "user": {} + "tabs": {} }"# .unindent(), - |settings| settings.age = Some(37), + |settings| settings.tabs.as_mut().unwrap().close_position = Some(ClosePosition::Left), r#"{ - "user": { - "age": 37 + "tabs": { + "close_position": "left" } }"# .unindent(), @@ -1926,13 +1506,18 @@ mod tests { ); // no content - check_settings_update::( + check_settings_update( &mut store, r#""#.unindent(), - |settings| settings.age = Some(37), + |settings| { + settings.tabs = Some(ItemSettingsContent { + git_status: Some(true), + ..Default::default() + }) + }, r#"{ - "user": { - "age": 37 + "tabs": { + "git_status": true } } "# @@ -1940,16 +1525,16 @@ mod tests { cx, ); - check_settings_update::( + check_settings_update( &mut store, r#"{ } "# .unindent(), - |settings| settings.age = Some(37), + |settings| settings.title_bar.get_or_insert_default().show_branch_name = Some(true), r#"{ - "user": { - "age": 37 + "title_bar": { + "show_branch_name": true } } "# @@ -1960,11 +1545,11 @@ mod tests { #[gpui::test] fn test_vscode_import(cx: &mut App) { - let mut store = SettingsStore::new(cx); - store.register_setting::(cx); - store.register_setting::(cx); - store.register_setting::(cx); - store.register_setting::(cx); + let mut store = SettingsStore::new(cx, &test_settings()); + store.register_setting::(); + store.register_setting::(); + store.register_setting::(); + store.register_setting::(); // create settings that werent present check_vscode_import( @@ -1973,11 +1558,9 @@ mod tests { } "# .unindent(), - r#" { "user.age": 37 } "#.to_owned(), + r#" { "editor.tabSize": 37 } "#.to_owned(), r#"{ - "user": { - "age": 37 - } + "tab_size": 37 } "# .unindent(), @@ -1988,19 +1571,14 @@ mod tests { check_vscode_import( &mut store, r#"{ - "user": { - "staff": true, - "age": 37 - } + "preferred_line_length": 99, } "# .unindent(), - r#"{ "user.age": 42 }"#.to_owned(), + r#"{ "editor.tabSize": 42 }"#.to_owned(), r#"{ - "user": { - "staff": true, - "age": 42 - } + "tab_size": 42, + "preferred_line_length": 99, } "# .unindent(), @@ -2011,19 +1589,15 @@ mod tests { check_vscode_import( &mut store, r#"{ - "user": { - "staff": true, - "age": 37 - } + "preferred_line_length": 99, + "tab_size": 42 } "# .unindent(), r#"{}"#.to_owned(), r#"{ - "user": { - "staff": true, - "age": 37 - } + "preferred_line_length": 99, + "tab_size": 42 } "# .unindent(), @@ -2034,16 +1608,13 @@ mod tests { check_vscode_import( &mut store, r#"{ - "journal": { - "hour_format": "hour12" - } } "# .unindent(), - r#"{ "time_format": "24" }"#.to_owned(), + r#"{ "workbench.editor.decorations.colors": true }"#.to_owned(), r#"{ - "journal": { - "hour_format": "hour24" + "tabs": { + "git_status": true } } "# @@ -2051,72 +1622,28 @@ mod tests { cx, ); - // Multiple keys for one setting + // font-family check_vscode_import( &mut store, r#"{ - "key1": "value" } "# .unindent(), + r#"{ "editor.fontFamily": "Cascadia Code, 'Consolas', Courier New" }"#.to_owned(), r#"{ - "key_1_first": "hello", - "key_1_second": "world" - }"# - .to_owned(), - r#"{ - "key1": "hello world" + "buffer_font_fallbacks": [ + "Consolas", + "Courier New" + ], + "buffer_font_family": "Cascadia Code" } "# .unindent(), cx, ); - - // Merging lists together entries added and updated - check_vscode_import( - &mut store, - r#"{ - "languages": { - "JSON": { - "language_setting_1": true - }, - "Rust": { - "language_setting_2": true - } - } - }"# - .unindent(), - r#"{ - "vscode_languages": [ - { - "name": "JavaScript", - "language_setting_1": true - }, - { - "name": "Rust", - "language_setting_2": false - } - ] - }"# - .to_owned(), - r#"{ - "languages": { - "JavaScript": { - "language_setting_1": true - }, - "JSON": { - "language_setting_1": true - }, - "Rust": { - "language_setting_2": false - } - } - }"# - .unindent(), - cx, - ); } + #[track_caller] fn check_vscode_import( store: &mut SettingsStore, old: String, @@ -2132,251 +1659,389 @@ mod tests { pretty_assertions::assert_eq!(new, expected); } - #[derive(Debug, PartialEq, Deserialize, SettingsUi)] - struct UserSettings { - name: String, - age: u32, - staff: bool, + #[gpui::test] + fn test_update_git_settings(cx: &mut App) { + let store = SettingsStore::new(cx, &test_settings()); + + let actual = store.new_text_for_update("{}".to_string(), |current| { + current + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .enabled = Some(true); + }); + assert_eq!( + actual, + r#"{ + "git": { + "inline_blame": { + "enabled": true + } + } + } + "# + .unindent() + ); } - #[derive(Default, Clone, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] - #[settings_key(key = "user")] - struct UserSettingsContent { - name: Option, - age: Option, - staff: Option, - } + #[gpui::test] + fn test_global_settings(cx: &mut App) { + let mut store = SettingsStore::new(cx, &test_settings()); + store.register_setting::(); - impl Settings for UserSettings { - type FileContent = UserSettingsContent; + // Set global settings - these should override defaults but not user settings + store + .set_global_settings( + r#"{ + "tabs": { + "close_position": "right", + "git_status": true, + } + }"#, + cx, + ) + .unwrap(); - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() - } + // Before user settings, global settings should apply + assert_eq!( + store.get::(None), + &ItemSettings { + close_position: ClosePosition::Right, + git_status: true, + } + ); - fn import_from_vscode(vscode: &VsCodeSettings, current: &mut Self::FileContent) { - vscode.u32_setting("user.age", &mut current.age); - } + // Set user settings - these should override both defaults and global + store + .set_user_settings( + r#"{ + "tabs": { + "close_position": "left" + } + }"#, + cx, + ) + .unwrap(); + + // User settings should override global settings + assert_eq!( + store.get::(None), + &ItemSettings { + close_position: ClosePosition::Left, + git_status: true, // Staff from global settings + } + ); } - #[derive(Debug, Deserialize, PartialEq)] - struct TurboSetting(bool); - - #[derive( - Copy, - Clone, - PartialEq, - Eq, - Debug, - Default, - serde::Serialize, - serde::Deserialize, - SettingsUi, - SettingsKey, - JsonSchema, - )] - #[serde(default)] - #[settings_key(None)] - pub struct TurboSettingContent { - turbo: Option, - } - - impl Settings for TurboSetting { - type FileContent = TurboSettingContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - Ok(Self( - sources - .user - .or(sources.server) - .unwrap_or(sources.default) - .turbo - .unwrap_or_default(), - )) + #[gpui::test] + fn test_get_value_for_field_basic(cx: &mut App) { + let mut store = SettingsStore::new(cx, &test_settings()); + store.register_setting::(); + + store + .set_user_settings(r#"{"preferred_line_length": 0}"#, cx) + .unwrap(); + let local = (WorktreeId::from_usize(0), RelPath::empty().into_arc()); + store + .set_local_settings( + local.0, + local.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{}"#), + cx, + ) + .unwrap(); + + fn get(content: &SettingsContent) -> &Option { + &content.project.all_languages.defaults.preferred_line_length } - fn import_from_vscode(_vscode: &VsCodeSettings, _current: &mut Self::FileContent) {} - } + let default_value = get(&store.default_settings).unwrap(); - #[derive(Clone, Debug, PartialEq, Deserialize)] - struct MultiKeySettings { - #[serde(default)] - key1: String, - #[serde(default)] - key2: String, + assert_eq!( + store.get_value_from_file(SettingsFile::Project(local.clone()), get), + (SettingsFile::User, Some(&0)) + ); + assert_eq!( + store.get_value_from_file(SettingsFile::User, get), + (SettingsFile::User, Some(&0)) + ); + store.set_user_settings(r#"{}"#, cx).unwrap(); + assert_eq!( + store.get_value_from_file(SettingsFile::Project(local.clone()), get), + (SettingsFile::Default, Some(&default_value)) + ); + store + .set_local_settings( + local.0, + local.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 80}"#), + cx, + ) + .unwrap(); + assert_eq!( + store.get_value_from_file(SettingsFile::Project(local.clone()), get), + (SettingsFile::Project(local), Some(&80)) + ); + assert_eq!( + store.get_value_from_file(SettingsFile::User, get), + (SettingsFile::Default, Some(&default_value)) + ); } - #[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] - #[settings_key(None)] - struct MultiKeySettingsJson { - key1: Option, - key2: Option, - } + #[gpui::test] + fn test_get_value_for_field_local_worktrees_dont_interfere(cx: &mut App) { + let mut store = SettingsStore::new(cx, &test_settings()); + store.register_setting::(); + store.register_setting::(); + + let local_1 = (WorktreeId::from_usize(0), RelPath::empty().into_arc()); + + let local_1_child = ( + WorktreeId::from_usize(0), + RelPath::new( + std::path::Path::new("child1"), + util::paths::PathStyle::Posix, + ) + .unwrap() + .into_arc(), + ); - impl Settings for MultiKeySettings { - type FileContent = MultiKeySettingsJson; + let local_2 = (WorktreeId::from_usize(1), RelPath::empty().into_arc()); + let local_2_child = ( + WorktreeId::from_usize(1), + RelPath::new( + std::path::Path::new("child2"), + util::paths::PathStyle::Posix, + ) + .unwrap() + .into_arc(), + ); - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() + fn get(content: &SettingsContent) -> &Option { + &content.project.all_languages.defaults.preferred_line_length } - fn import_from_vscode(vscode: &VsCodeSettings, current: &mut Self::FileContent) { - let first_value = vscode.read_string("key_1_first"); - let second_value = vscode.read_string("key_1_second"); + store + .set_local_settings( + local_1.0, + local_1.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 1}"#), + cx, + ) + .unwrap(); + store + .set_local_settings( + local_1_child.0, + local_1_child.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{}"#), + cx, + ) + .unwrap(); + store + .set_local_settings( + local_2.0, + local_2.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 2}"#), + cx, + ) + .unwrap(); + store + .set_local_settings( + local_2_child.0, + local_2_child.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{}"#), + cx, + ) + .unwrap(); - if let Some((first, second)) = first_value.zip(second_value) { - current.key1 = Some(format!("{} {}", first, second)); - } - } - } + // each local child should only inherit from it's parent + assert_eq!( + store.get_value_from_file(SettingsFile::Project(local_2_child), get), + (SettingsFile::Project(local_2), Some(&2)) + ); + assert_eq!( + store.get_value_from_file(SettingsFile::Project(local_1_child.clone()), get), + (SettingsFile::Project(local_1.clone()), Some(&1)) + ); - #[derive(Debug, Deserialize)] - struct JournalSettings { - pub path: String, - pub hour_format: HourFormat, - } + // adjacent children should be treated as siblings not inherit from each other + let local_1_adjacent_child = (local_1.0, rel_path("adjacent_child").into_arc()); + store + .set_local_settings( + local_1_adjacent_child.0, + local_1_adjacent_child.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{}"#), + cx, + ) + .unwrap(); + store + .set_local_settings( + local_1_child.0, + local_1_child.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 3}"#), + cx, + ) + .unwrap(); - #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] - #[serde(rename_all = "snake_case")] - enum HourFormat { - Hour12, - Hour24, + assert_eq!( + store.get_value_from_file(SettingsFile::Project(local_1_adjacent_child.clone()), get), + (SettingsFile::Project(local_1.clone()), Some(&1)) + ); + store + .set_local_settings( + local_1_adjacent_child.0, + local_1_adjacent_child.1, + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 3}"#), + cx, + ) + .unwrap(); + store + .set_local_settings( + local_1_child.0, + local_1_child.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{}"#), + cx, + ) + .unwrap(); + assert_eq!( + store.get_value_from_file(SettingsFile::Project(local_1_child), get), + (SettingsFile::Project(local_1), Some(&1)) + ); } - #[derive( - Clone, Default, Debug, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey, - )] - #[settings_key(key = "journal")] - struct JournalSettingsJson { - pub path: Option, - pub hour_format: Option, - } + #[gpui::test] + fn test_get_overrides_for_field(cx: &mut App) { + let mut store = SettingsStore::new(cx, &test_settings()); + store.register_setting::(); - impl Settings for JournalSettings { - type FileContent = JournalSettingsJson; + let wt0_root = (WorktreeId::from_usize(0), RelPath::empty().into_arc()); + let wt0_child1 = (WorktreeId::from_usize(0), rel_path("child1").into_arc()); + let wt0_child2 = (WorktreeId::from_usize(0), rel_path("child2").into_arc()); - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() - } + let wt1_root = (WorktreeId::from_usize(1), RelPath::empty().into_arc()); + let wt1_subdir = (WorktreeId::from_usize(1), rel_path("subdir").into_arc()); - fn import_from_vscode(vscode: &VsCodeSettings, current: &mut Self::FileContent) { - vscode.enum_setting("time_format", &mut current.hour_format, |s| match s { - "12" => Some(HourFormat::Hour12), - "24" => Some(HourFormat::Hour24), - _ => None, - }); + fn get(content: &SettingsContent) -> &Option { + &content.project.all_languages.defaults.preferred_line_length } - } - #[gpui::test] - fn test_global_settings(cx: &mut App) { - let mut store = SettingsStore::new(cx); - store.register_setting::(cx); store - .set_default_settings( - r#"{ - "user": { - "name": "John Doe", - "age": 30, - "staff": false - } - }"#, + .set_user_settings(r#"{"preferred_line_length": 100}"#, cx) + .unwrap(); + + store + .set_local_settings( + wt0_root.0, + wt0_root.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 80}"#), cx, ) .unwrap(); - - // Set global settings - these should override defaults but not user settings store - .set_global_settings( - r#"{ - "user": { - "name": "Global User", - "age": 35, - "staff": true - } - }"#, + .set_local_settings( + wt0_child1.0, + wt0_child1.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 120}"#), + cx, + ) + .unwrap(); + store + .set_local_settings( + wt0_child2.0, + wt0_child2.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{}"#), cx, ) .unwrap(); - // Before user settings, global settings should apply - assert_eq!( - store.get::(None), - &UserSettings { - name: "Global User".to_string(), - age: 35, - staff: true, - } - ); - - // Set user settings - these should override both defaults and global store - .set_user_settings( - r#"{ - "user": { - "age": 40 - } - }"#, + .set_local_settings( + wt1_root.0, + wt1_root.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 90}"#), + cx, + ) + .unwrap(); + store + .set_local_settings( + wt1_subdir.0, + wt1_subdir.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{}"#), cx, ) .unwrap(); - // User settings should override global settings + let overrides = store.get_overrides_for_field(SettingsFile::Default, get); assert_eq!( - store.get::(None), - &UserSettings { - name: "Global User".to_string(), // Name from global settings - age: 40, // Age from user settings - staff: true, // Staff from global settings - } + overrides, + vec![ + SettingsFile::User, + SettingsFile::Project(wt0_root.clone()), + SettingsFile::Project(wt0_child1.clone()), + SettingsFile::Project(wt1_root.clone()), + ] ); - } - #[derive( - Clone, Debug, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey, - )] - #[settings_key(None)] - struct LanguageSettings { - #[serde(default)] - languages: HashMap, - } + let overrides = store.get_overrides_for_field(SettingsFile::User, get); + assert_eq!( + overrides, + vec![ + SettingsFile::Project(wt0_root.clone()), + SettingsFile::Project(wt0_child1.clone()), + SettingsFile::Project(wt1_root.clone()), + ] + ); - #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] - struct LanguageSettingEntry { - language_setting_1: Option, - language_setting_2: Option, - } + let overrides = store.get_overrides_for_field(SettingsFile::Project(wt0_root), get); + assert_eq!(overrides, vec![]); - impl Settings for LanguageSettings { - type FileContent = Self; + let overrides = + store.get_overrides_for_field(SettingsFile::Project(wt0_child1.clone()), get); + assert_eq!(overrides, vec![]); - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() - } + let overrides = store.get_overrides_for_field(SettingsFile::Project(wt0_child2), get); + assert_eq!(overrides, vec![]); - fn import_from_vscode(vscode: &VsCodeSettings, current: &mut Self::FileContent) { - current.languages.extend( - vscode - .read_value("vscode_languages") - .and_then(|value| value.as_array()) - .map(|languages| { - languages - .iter() - .filter_map(|value| value.as_object()) - .filter_map(|item| { - let mut rest = item.clone(); - let name = rest.remove("name")?.as_str()?.to_string(); - let entry = serde_json::from_value::( - serde_json::Value::Object(rest), - ) - .ok()?; - - Some((name, entry)) - }) - }) - .into_iter() - .flatten(), - ); - } + let overrides = store.get_overrides_for_field(SettingsFile::Project(wt1_root), get); + assert_eq!(overrides, vec![]); + + let overrides = store.get_overrides_for_field(SettingsFile::Project(wt1_subdir), get); + assert_eq!(overrides, vec![]); + + let wt0_deep_child = ( + WorktreeId::from_usize(0), + rel_path("child1/subdir").into_arc(), + ); + store + .set_local_settings( + wt0_deep_child.0, + wt0_deep_child.1.clone(), + LocalSettingsKind::Settings, + Some(r#"{"preferred_line_length": 140}"#), + cx, + ) + .unwrap(); + + let overrides = store.get_overrides_for_field(SettingsFile::Project(wt0_deep_child), get); + assert_eq!(overrides, vec![]); + + let overrides = store.get_overrides_for_field(SettingsFile::Project(wt0_child1), get); + assert_eq!(overrides, vec![]); } } diff --git a/crates/settings/src/settings_ui_core.rs b/crates/settings/src/settings_ui_core.rs deleted file mode 100644 index d4f49785a6442134aba8a639183d082d52ab3baf..0000000000000000000000000000000000000000 --- a/crates/settings/src/settings_ui_core.rs +++ /dev/null @@ -1,237 +0,0 @@ -use std::{ - any::TypeId, - num::{NonZeroU32, NonZeroUsize}, - rc::Rc, -}; - -use anyhow::Context as _; -use fs::Fs; -use gpui::{AnyElement, App, AppContext as _, ReadGlobal as _, SharedString, Window}; -use smallvec::SmallVec; - -use crate::SettingsStore; - -pub trait SettingsUi { - fn settings_ui_item() -> SettingsUiItem { - // todo(settings_ui): remove this default impl, only entry should have a default impl - // because it's expected that the macro or custom impl use the item and the known paths to create the entry - SettingsUiItem::None - } - - fn settings_ui_entry() -> SettingsUiEntry { - SettingsUiEntry { - path: None, - title: "None entry", - item: SettingsUiItem::None, - documentation: None, - } - } -} - -#[derive(Clone)] -pub struct SettingsUiEntry { - /// The path in the settings JSON file for this setting. Relative to parent - /// None implies `#[serde(flatten)]` or `Settings::KEY.is_none()` for top level settings - pub path: Option<&'static str>, - /// What is displayed for the text for this entry - pub title: &'static str, - /// documentation for this entry. Constructed from the documentation comment above the struct or field - pub documentation: Option<&'static str>, - pub item: SettingsUiItem, -} - -#[derive(Clone)] -pub enum SettingsUiItemSingle { - SwitchField, - TextField, - /// A numeric stepper for a specific type of number - NumericStepper(NumType), - ToggleGroup { - /// Must be the same length as `labels` - variants: &'static [&'static str], - /// Must be the same length as `variants` - labels: &'static [&'static str], - }, - /// This should be used when toggle group size > 6 - DropDown { - /// Must be the same length as `labels` - variants: &'static [&'static str], - /// Must be the same length as `variants` - labels: &'static [&'static str], - }, - Custom(Rc, &mut Window, &mut App) -> AnyElement>), -} - -pub struct SettingsValue { - pub title: SharedString, - pub documentation: Option, - pub path: SmallVec<[SharedString; 1]>, - pub value: Option, - pub default_value: T, -} - -impl SettingsValue { - pub fn read(&self) -> &T { - match &self.value { - Some(value) => value, - None => &self.default_value, - } - } -} - -impl SettingsValue { - pub fn write_value(path: &SmallVec<[SharedString; 1]>, value: serde_json::Value, cx: &mut App) { - let settings_store = SettingsStore::global(cx); - let fs = ::global(cx); - - let rx = settings_store.update_settings_file_at_path(fs.clone(), path.as_slice(), value); - - let path = path.clone(); - cx.background_spawn(async move { - rx.await? - .with_context(|| format!("Failed to update setting at path `{:?}`", path.join("."))) - }) - .detach_and_log_err(cx); - } -} - -impl SettingsValue { - pub fn write( - path: &SmallVec<[SharedString; 1]>, - value: T, - cx: &mut App, - ) -> Result<(), serde_json::Error> { - SettingsValue::write_value(path, serde_json::to_value(value)?, cx); - Ok(()) - } -} - -#[derive(Clone)] -pub struct SettingsUiItemUnion { - /// Must be the same length as `labels` and `options` - pub defaults: Box<[serde_json::Value]>, - /// Must be the same length as defaults` and `options` - pub labels: &'static [&'static str], - /// Must be the same length as `defaults` and `labels` - pub options: Box<[Option]>, - pub determine_option: fn(&serde_json::Value, &App) -> usize, -} - -// todo(settings_ui): use in ToggleGroup and Dropdown -#[derive(Clone)] -pub struct SettingsEnumVariants {} - -pub struct SettingsUiEntryMetaData { - pub title: SharedString, - pub path: SharedString, - pub documentation: Option, -} - -#[derive(Clone)] -pub struct SettingsUiItemDynamicMap { - pub item: fn() -> SettingsUiItem, - pub determine_items: fn(&serde_json::Value, &App) -> Vec, - pub defaults_path: &'static [&'static str], -} - -#[derive(Clone)] -pub struct SettingsUiItemGroup { - pub items: Vec, -} - -#[derive(Clone)] -pub enum SettingsUiItem { - Group(SettingsUiItemGroup), - Single(SettingsUiItemSingle), - Union(SettingsUiItemUnion), - DynamicMap(SettingsUiItemDynamicMap), - // Array(SettingsUiItemArray), // code-actions: array of objects, array of string - None, -} - -impl SettingsUi for bool { - fn settings_ui_item() -> SettingsUiItem { - SettingsUiItem::Single(SettingsUiItemSingle::SwitchField) - } -} - -impl SettingsUi for Option { - fn settings_ui_item() -> SettingsUiItem { - SettingsUiItem::Single(SettingsUiItemSingle::SwitchField) - } -} - -impl SettingsUi for String { - fn settings_ui_item() -> SettingsUiItem { - SettingsUiItem::Single(SettingsUiItemSingle::TextField) - } -} - -impl SettingsUi for SettingsUiItem { - fn settings_ui_item() -> SettingsUiItem { - SettingsUiItem::Single(SettingsUiItemSingle::TextField) - } -} - -#[repr(u8)] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum NumType { - U64 = 0, - U32 = 1, - F32 = 2, - USIZE = 3, - U32NONZERO = 4, -} - -pub static NUM_TYPE_NAMES: std::sync::LazyLock<[&'static str; NumType::COUNT]> = - std::sync::LazyLock::new(|| NumType::ALL.map(NumType::type_name)); -pub static NUM_TYPE_IDS: std::sync::LazyLock<[TypeId; NumType::COUNT]> = - std::sync::LazyLock::new(|| NumType::ALL.map(NumType::type_id)); - -impl NumType { - const COUNT: usize = 3; - const ALL: [NumType; Self::COUNT] = [NumType::U64, NumType::U32, NumType::F32]; - - pub fn type_id(self) -> TypeId { - match self { - NumType::U64 => TypeId::of::(), - NumType::U32 => TypeId::of::(), - NumType::F32 => TypeId::of::(), - NumType::USIZE => TypeId::of::(), - NumType::U32NONZERO => TypeId::of::(), - } - } - - pub fn type_name(self) -> &'static str { - match self { - NumType::U64 => std::any::type_name::(), - NumType::U32 => std::any::type_name::(), - NumType::F32 => std::any::type_name::(), - NumType::USIZE => std::any::type_name::(), - NumType::U32NONZERO => std::any::type_name::(), - } - } -} - -macro_rules! numeric_stepper_for_num_type { - ($type:ty, $num_type:ident) => { - impl SettingsUi for $type { - fn settings_ui_item() -> SettingsUiItem { - SettingsUiItem::Single(SettingsUiItemSingle::NumericStepper(NumType::$num_type)) - } - } - - impl SettingsUi for Option<$type> { - fn settings_ui_item() -> SettingsUiItem { - SettingsUiItem::Single(SettingsUiItemSingle::NumericStepper(NumType::$num_type)) - } - } - }; -} - -numeric_stepper_for_num_type!(u64, U64); -numeric_stepper_for_num_type!(u32, U32); -// todo(settings_ui) is there a better ui for f32? -numeric_stepper_for_num_type!(f32, F32); -numeric_stepper_for_num_type!(usize, USIZE); -numeric_stepper_for_num_type!(NonZeroUsize, U32NONZERO); diff --git a/crates/settings/src/vscode_import.rs b/crates/settings/src/vscode_import.rs index 53fbf797c3d9e56e49b1d96e7dabcac19ddde8e2..c0c1085684b448dbd3d4ef83faabf21ca1cfbf7f 100644 --- a/crates/settings/src/vscode_import.rs +++ b/crates/settings/src/vscode_import.rs @@ -4,6 +4,8 @@ use paths::{cursor_settings_file_paths, vscode_settings_file_paths}; use serde_json::{Map, Value}; use std::{path::Path, sync::Arc}; +use crate::FontFamilyName; + #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum VsCodeSettingsSource { VsCode, @@ -51,7 +53,7 @@ impl VsCodeSettings { "No settings file found, expected to find it in one of the following paths:\n{}", candidate_paths .into_iter() - .map(|path| path.to_string_lossy().to_string()) + .map(|path| path.to_string_lossy().into_owned()) .collect::>() .join("\n") )); @@ -78,12 +80,7 @@ impl VsCodeSettings { } pub fn read_value(&self, setting: &str) -> Option<&Value> { - if let Some(value) = self.content.get(setting) { - return Some(value); - } - // TODO: maybe check if it's in [platform] settings for current platform as a fallback - // TODO: deal with language specific settings - None + self.content.get(setting) } pub fn read_string(&self, setting: &str) -> Option<&str> { @@ -130,6 +127,12 @@ impl VsCodeSettings { } } + pub fn from_f32_setting>(&self, key: &str, setting: &mut Option) { + if let Some(s) = self.content.get(key).and_then(Value::as_f64) { + *setting = Some(T::from(s as f32)) + } + } + pub fn enum_setting( &self, key: &str, @@ -140,4 +143,57 @@ impl VsCodeSettings { *setting = Some(s) } } + + pub fn read_enum(&self, key: &str, f: impl FnOnce(&str) -> Option) -> Option { + self.content.get(key).and_then(Value::as_str).and_then(f) + } + + pub fn font_family_setting( + &self, + key: &str, + font_family: &mut Option, + font_fallbacks: &mut Option>, + ) { + let Some(css_name) = self.content.get(key).and_then(Value::as_str) else { + return; + }; + + let mut name_buffer = String::new(); + let mut quote_char: Option = None; + let mut fonts = Vec::new(); + let mut add_font = |buffer: &mut String| { + let trimmed = buffer.trim(); + if !trimmed.is_empty() { + fonts.push(trimmed.to_string().into()); + } + + buffer.clear(); + }; + + for ch in css_name.chars() { + match (ch, quote_char) { + ('"' | '\'', None) => { + quote_char = Some(ch); + } + (_, Some(q)) if ch == q => { + quote_char = None; + } + (',', None) => { + add_font(&mut name_buffer); + } + _ => { + name_buffer.push(ch); + } + } + } + + add_font(&mut name_buffer); + + let mut iter = fonts.into_iter(); + *font_family = iter.next(); + let fallbacks: Vec<_> = iter.collect(); + if !fallbacks.is_empty() { + *font_fallbacks = Some(fallbacks); + } + } } diff --git a/crates/settings_ui_macros/Cargo.toml b/crates/settings_macros/Cargo.toml similarity index 73% rename from crates/settings_ui_macros/Cargo.toml rename to crates/settings_macros/Cargo.toml index ece6269f5999ad3ed7e08e34d3ff4c7cb97c9f63..06ce1d01e5fa9d25b5c0d3c742a2d325ec996e39 100644 --- a/crates/settings_ui_macros/Cargo.toml +++ b/crates/settings_macros/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "settings_ui_macros" +name = "settings_macros" version = "0.1.0" edition.workspace = true publish.workspace = true license = "GPL-3.0-or-later" [lib] -path = "src/settings_ui_macros.rs" +path = "src/settings_macros.rs" proc-macro = true [lints] @@ -16,8 +16,6 @@ workspace = true default = [] [dependencies] -heck.workspace = true -proc-macro2.workspace = true quote.workspace = true syn.workspace = true workspace-hack.workspace = true diff --git a/crates/settings_macros/LICENSE-GPL b/crates/settings_macros/LICENSE-GPL new file mode 120000 index 0000000000000000000000000000000000000000..89e542f750cd3860a0598eff0dc34b56d7336dc4 --- /dev/null +++ b/crates/settings_macros/LICENSE-GPL @@ -0,0 +1 @@ +../../LICENSE-GPL \ No newline at end of file diff --git a/crates/settings_macros/src/settings_macros.rs b/crates/settings_macros/src/settings_macros.rs new file mode 100644 index 0000000000000000000000000000000000000000..1a7c391847e5093754f241ffccb079cc5ddd1a6b --- /dev/null +++ b/crates/settings_macros/src/settings_macros.rs @@ -0,0 +1,78 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{Data, DeriveInput, Fields, parse_macro_input}; + +/// Derives the `MergeFrom` trait for a struct. +/// +/// This macro automatically implements `MergeFrom` by calling `merge_from` +/// on all fields in the struct. +/// +/// # Example +/// +/// ```ignore +/// #[derive(Clone, MergeFrom)] +/// struct MySettings { +/// field1: Option, +/// field2: SomeOtherSettings, +/// } +/// ``` +#[proc_macro_derive(MergeFrom)] +pub fn derive_merge_from(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + let name = &input.ident; + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + let merge_body = match &input.data { + Data::Struct(data_struct) => match &data_struct.fields { + Fields::Named(fields) => { + let field_merges = fields.named.iter().map(|field| { + let field_name = &field.ident; + quote! { + self.#field_name.merge_from(&other.#field_name); + } + }); + + quote! { + #(#field_merges)* + } + } + Fields::Unnamed(fields) => { + let field_merges = fields.unnamed.iter().enumerate().map(|(i, _)| { + let field_index = syn::Index::from(i); + quote! { + self.#field_index.merge_from(&other.#field_index); + } + }); + + quote! { + #(#field_merges)* + } + } + Fields::Unit => { + quote! { + // No fields to merge for unit structs + } + } + }, + Data::Enum(_) => { + quote! { + *self = other.clone(); + } + } + Data::Union(_) => { + panic!("MergeFrom cannot be derived for unions"); + } + }; + + let expanded = quote! { + impl #impl_generics crate::merge_from::MergeFrom for #name #ty_generics #where_clause { + fn merge_from(&mut self, other: &Self) { + use crate::merge_from::MergeFrom as _; + #merge_body + } + } + }; + + TokenStream::from(expanded) +} diff --git a/crates/settings_profile_selector/src/settings_profile_selector.rs b/crates/settings_profile_selector/src/settings_profile_selector.rs index 0bba83beafb2ddc1c20767aefd15cc2095ca71ba..4eecf3b290d37548d4fe3a1312f5572164b89907 100644 --- a/crates/settings_profile_selector/src/settings_profile_selector.rs +++ b/crates/settings_profile_selector/src/settings_profile_selector.rs @@ -302,7 +302,6 @@ mod tests { cx.set_global(settings_store); settings::init(cx); theme::init(theme::LoadThemes::JustBase, cx); - ThemeSettings::register(cx); client::init_settings(cx); language::init(cx); super::init(cx); @@ -332,7 +331,7 @@ mod tests { cx.update(|_, cx| { assert!(!cx.has_global::()); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 10.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(10.0)); }); (workspace, cx) @@ -385,7 +384,7 @@ mod tests { assert_eq!(picker.delegate.selected_profile_name, None); assert_eq!(cx.try_global::(), None); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 10.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(10.0)); }); cx.dispatch_action(Confirm); @@ -411,14 +410,14 @@ mod tests { Some(classroom_and_streaming_profile_name.clone()) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 20.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(20.0)); }); cx.dispatch_action(Cancel); cx.update(|_, cx| { assert_eq!(cx.try_global::(), None); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 10.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(10.0)); }); cx.dispatch_action(settings_profile_selector::Toggle); @@ -439,7 +438,7 @@ mod tests { Some(classroom_and_streaming_profile_name.clone()) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 20.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(20.0)); }); cx.dispatch_action(SelectNext); @@ -457,7 +456,7 @@ mod tests { Some(demo_videos_profile_name.clone()) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 15.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(15.0)); }); cx.dispatch_action(Confirm); @@ -468,7 +467,7 @@ mod tests { .map(|p| p.0.clone()), Some(demo_videos_profile_name.clone()) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 15.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(15.0)); }); cx.dispatch_action(settings_profile_selector::Toggle); @@ -486,7 +485,7 @@ mod tests { .map(|p| p.0.clone()), Some(demo_videos_profile_name.clone()) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 15.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(15.0)); }); cx.dispatch_action(SelectPrevious); @@ -504,7 +503,7 @@ mod tests { Some(classroom_and_streaming_profile_name.clone()) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 20.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(20.0)); }); cx.dispatch_action(Cancel); @@ -516,7 +515,7 @@ mod tests { Some(demo_videos_profile_name.clone()) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 15.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(15.0)); }); cx.dispatch_action(settings_profile_selector::Toggle); @@ -535,7 +534,7 @@ mod tests { Some(demo_videos_profile_name) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 15.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(15.0)); }); cx.dispatch_action(SelectPrevious); @@ -553,7 +552,7 @@ mod tests { Some(classroom_and_streaming_profile_name) ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 20.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(20.0)); }); cx.dispatch_action(SelectPrevious); @@ -568,14 +567,52 @@ mod tests { None ); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 10.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(10.0)); }); cx.dispatch_action(Confirm); cx.update(|_, cx| { assert_eq!(cx.try_global::(), None); - assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx).0, 10.0); + assert_eq!(ThemeSettings::get_global(cx).buffer_font_size(cx), px(10.0)); + }); + } + + #[gpui::test] + async fn test_settings_profile_selector_is_in_user_configuration_order( + cx: &mut TestAppContext, + ) { + // Must be unique names (HashMap) + let profiles_json = json!({ + "z": {}, + "e": {}, + "d": {}, + " ": {}, + "r": {}, + "u": {}, + "l": {}, + "3": {}, + "s": {}, + "!": {}, + }); + let (workspace, cx) = init_test(profiles_json.clone(), cx).await; + + cx.dispatch_action(settings_profile_selector::Toggle); + let picker = active_settings_profile_picker(&workspace, cx); + + picker.read_with(cx, |picker, _| { + assert_eq!(picker.delegate.matches.len(), 11); + assert_eq!(picker.delegate.matches[0].string, display_name(&None)); + assert_eq!(picker.delegate.matches[1].string, "z"); + assert_eq!(picker.delegate.matches[2].string, "e"); + assert_eq!(picker.delegate.matches[3].string, "d"); + assert_eq!(picker.delegate.matches[4].string, " "); + assert_eq!(picker.delegate.matches[5].string, "r"); + assert_eq!(picker.delegate.matches[6].string, "u"); + assert_eq!(picker.delegate.matches[7].string, "l"); + assert_eq!(picker.delegate.matches[8].string, "3"); + assert_eq!(picker.delegate.matches[9].string, "s"); + assert_eq!(picker.delegate.matches[10].string, "!"); }); } } diff --git a/crates/settings_ui/Cargo.toml b/crates/settings_ui/Cargo.toml index 1d8e5e11226103e2ef7778816f5c1b41cd934b05..ab5e1b839510a990e17e7abea63e6412e4a10e4b 100644 --- a/crates/settings_ui/Cargo.toml +++ b/crates/settings_ui/Cargo.toml @@ -17,26 +17,40 @@ test-support = [] [dependencies] anyhow.workspace = true -command_palette_hooks.workspace = true +bm25 = "2.3.2" +heck.workspace = true editor.workspace = true feature_flags.workspace = true +fs.workspace = true +fuzzy.workspace = true gpui.workspace = true menu.workspace = true +paths.workspace = true +project.workspace = true +schemars.workspace = true +search.workspace = true serde.workspace = true -serde_json.workspace = true settings.workspace = true -smallvec.workspace = true +strum.workspace = true theme.workspace = true +ui_input.workspace = true ui.workspace = true -workspace.workspace = true +util.workspace = true workspace-hack.workspace = true - +workspace.workspace = true +zed_actions.workspace = true +log.workspace = true +title_bar.workspace = true [dev-dependencies] -debugger_ui.workspace = true - -# Uncomment other workspace dependencies as needed -# assistant.workspace = true -# client.workspace = true -# project.workspace = true -# settings.workspace = true +assets.workspace = true +client.workspace = true +futures.workspace = true +gpui = { workspace = true, features = ["test-support"] } +language.workspace = true +node_runtime.workspace = true +paths.workspace = true +session.workspace = true +settings.workspace = true +zlog.workspace = true +pretty_assertions.workspace = true diff --git a/crates/settings_ui/src/appearance_settings_controls.rs b/crates/settings_ui/src/appearance_settings_controls.rs deleted file mode 100644 index 255f5a36b5868b3fd36085e8c980eb7a17fdc163..0000000000000000000000000000000000000000 --- a/crates/settings_ui/src/appearance_settings_controls.rs +++ /dev/null @@ -1,387 +0,0 @@ -use std::sync::Arc; - -use gpui::{App, FontFeatures, FontWeight}; -use settings::{EditableSettingControl, Settings}; -use theme::{ - FontFamilyCache, FontFamilyName, SystemAppearance, ThemeMode, ThemeRegistry, ThemeSettings, -}; -use ui::{ - CheckboxWithLabel, ContextMenu, DropdownMenu, NumericStepper, SettingsContainer, SettingsGroup, - ToggleButton, prelude::*, -}; - -#[derive(IntoElement)] -pub struct AppearanceSettingsControls {} - -impl AppearanceSettingsControls { - pub fn new() -> Self { - Self {} - } -} - -impl RenderOnce for AppearanceSettingsControls { - fn render(self, _window: &mut Window, _cx: &mut App) -> impl IntoElement { - SettingsContainer::new() - .child( - SettingsGroup::new("Theme").child( - h_flex() - .gap_2() - .justify_between() - .child(ThemeControl) - .child(ThemeModeControl), - ), - ) - .child( - SettingsGroup::new("Font") - .child( - h_flex() - .gap_2() - .justify_between() - .child(UiFontFamilyControl) - .child(UiFontWeightControl), - ) - .child(UiFontSizeControl) - .child(UiFontLigaturesControl), - ) - } -} - -#[derive(IntoElement)] -struct ThemeControl; - -impl EditableSettingControl for ThemeControl { - type Value = String; - type Settings = ThemeSettings; - - fn name(&self) -> SharedString { - "Theme".into() - } - - fn read(cx: &App) -> Self::Value { - let settings = ThemeSettings::get_global(cx); - let appearance = SystemAppearance::global(cx); - settings - .theme_selection - .as_ref() - .map(|selection| selection.theme(appearance.0).to_string()) - .unwrap_or_else(|| ThemeSettings::default_theme(*appearance).to_string()) - } - - fn apply( - settings: &mut ::FileContent, - value: Self::Value, - cx: &App, - ) { - let appearance = SystemAppearance::global(cx); - settings.set_theme(value, appearance.0); - } -} - -impl RenderOnce for ThemeControl { - fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement { - let value = Self::read(cx); - - DropdownMenu::new( - "theme", - value, - ContextMenu::build(window, cx, |mut menu, _, cx| { - let theme_registry = ThemeRegistry::global(cx); - - for theme in theme_registry.list_names() { - menu = menu.custom_entry( - { - let theme = theme.clone(); - move |_window, _cx| Label::new(theme.clone()).into_any_element() - }, - { - let theme = theme.clone(); - move |_window, cx| { - Self::write(theme.to_string(), cx); - } - }, - ) - } - - menu - }), - ) - .full_width(true) - } -} - -#[derive(IntoElement)] -struct ThemeModeControl; - -impl EditableSettingControl for ThemeModeControl { - type Value = ThemeMode; - type Settings = ThemeSettings; - - fn name(&self) -> SharedString { - "Theme Mode".into() - } - - fn read(cx: &App) -> Self::Value { - let settings = ThemeSettings::get_global(cx); - settings - .theme_selection - .as_ref() - .and_then(|selection| selection.mode()) - .unwrap_or_default() - } - - fn apply( - settings: &mut ::FileContent, - value: Self::Value, - _cx: &App, - ) { - settings.set_mode(value); - } -} - -impl RenderOnce for ThemeModeControl { - fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement { - let value = Self::read(cx); - - h_flex() - .child( - ToggleButton::new("light", "Light") - .style(ButtonStyle::Filled) - .size(ButtonSize::Large) - .toggle_state(value == ThemeMode::Light) - .on_click(|_, _, cx| Self::write(ThemeMode::Light, cx)) - .first(), - ) - .child( - ToggleButton::new("system", "System") - .style(ButtonStyle::Filled) - .size(ButtonSize::Large) - .toggle_state(value == ThemeMode::System) - .on_click(|_, _, cx| Self::write(ThemeMode::System, cx)) - .middle(), - ) - .child( - ToggleButton::new("dark", "Dark") - .style(ButtonStyle::Filled) - .size(ButtonSize::Large) - .toggle_state(value == ThemeMode::Dark) - .on_click(|_, _, cx| Self::write(ThemeMode::Dark, cx)) - .last(), - ) - } -} - -#[derive(IntoElement)] -struct UiFontFamilyControl; - -impl EditableSettingControl for UiFontFamilyControl { - type Value = SharedString; - type Settings = ThemeSettings; - - fn name(&self) -> SharedString { - "UI Font Family".into() - } - - fn read(cx: &App) -> Self::Value { - let settings = ThemeSettings::get_global(cx); - settings.ui_font.family.clone() - } - - fn apply( - settings: &mut ::FileContent, - value: Self::Value, - _cx: &App, - ) { - settings.ui_font_family = Some(FontFamilyName(value.into())); - } -} - -impl RenderOnce for UiFontFamilyControl { - fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement { - let value = Self::read(cx); - - h_flex() - .gap_2() - .child(Icon::new(IconName::Font)) - .child(DropdownMenu::new( - "ui-font-family", - value, - ContextMenu::build(window, cx, |mut menu, _, cx| { - let font_family_cache = FontFamilyCache::global(cx); - - for font_name in font_family_cache.list_font_families(cx) { - menu = menu.custom_entry( - { - let font_name = font_name.clone(); - move |_window, _cx| Label::new(font_name.clone()).into_any_element() - }, - { - let font_name = font_name.clone(); - move |_window, cx| { - Self::write(font_name.clone(), cx); - } - }, - ) - } - - menu - }), - )) - } -} - -#[derive(IntoElement)] -struct UiFontSizeControl; - -impl EditableSettingControl for UiFontSizeControl { - type Value = Pixels; - type Settings = ThemeSettings; - - fn name(&self) -> SharedString { - "UI Font Size".into() - } - - fn read(cx: &App) -> Self::Value { - ThemeSettings::get_global(cx).ui_font_size(cx) - } - - fn apply( - settings: &mut ::FileContent, - value: Self::Value, - _cx: &App, - ) { - settings.ui_font_size = Some(value.into()); - } -} - -impl RenderOnce for UiFontSizeControl { - fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement { - let value = Self::read(cx); - - h_flex() - .gap_2() - .child(Icon::new(IconName::FontSize)) - .child(NumericStepper::new( - "ui-font-size", - value.to_string(), - move |_, _, cx| { - Self::write(value - px(1.), cx); - }, - move |_, _, cx| { - Self::write(value + px(1.), cx); - }, - )) - } -} - -#[derive(IntoElement)] -struct UiFontWeightControl; - -impl EditableSettingControl for UiFontWeightControl { - type Value = FontWeight; - type Settings = ThemeSettings; - - fn name(&self) -> SharedString { - "UI Font Weight".into() - } - - fn read(cx: &App) -> Self::Value { - let settings = ThemeSettings::get_global(cx); - settings.ui_font.weight - } - - fn apply( - settings: &mut ::FileContent, - value: Self::Value, - _cx: &App, - ) { - settings.ui_font_weight = Some(value.0); - } -} - -impl RenderOnce for UiFontWeightControl { - fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement { - let value = Self::read(cx); - - h_flex() - .gap_2() - .child(Icon::new(IconName::FontWeight)) - .child(DropdownMenu::new( - "ui-font-weight", - value.0.to_string(), - ContextMenu::build(window, cx, |mut menu, _window, _cx| { - for weight in FontWeight::ALL { - menu = menu.custom_entry( - move |_window, _cx| Label::new(weight.0.to_string()).into_any_element(), - { - move |_window, cx| { - Self::write(weight, cx); - } - }, - ) - } - - menu - }), - )) - } -} - -#[derive(IntoElement)] -struct UiFontLigaturesControl; - -impl EditableSettingControl for UiFontLigaturesControl { - type Value = bool; - type Settings = ThemeSettings; - - fn name(&self) -> SharedString { - "UI Font Ligatures".into() - } - - fn read(cx: &App) -> Self::Value { - let settings = ThemeSettings::get_global(cx); - settings.ui_font.features.is_calt_enabled().unwrap_or(true) - } - - fn apply( - settings: &mut ::FileContent, - value: Self::Value, - _cx: &App, - ) { - let value = if value { 1 } else { 0 }; - - let mut features = settings - .ui_font_features - .as_ref() - .map(|features| features.tag_value_list().to_vec()) - .unwrap_or_default(); - - if let Some(calt_index) = features.iter().position(|(tag, _)| tag == "calt") { - features[calt_index].1 = value; - } else { - features.push(("calt".into(), value)); - } - - settings.ui_font_features = Some(FontFeatures(Arc::new(features))); - } -} - -impl RenderOnce for UiFontLigaturesControl { - fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement { - let value = Self::read(cx); - - CheckboxWithLabel::new( - "ui-font-ligatures", - Label::new(self.name()), - value.into(), - |selection, _, cx| { - Self::write( - match selection { - ToggleState::Selected => true, - ToggleState::Unselected | ToggleState::Indeterminate => false, - }, - cx, - ); - }, - ) - } -} diff --git a/crates/settings_ui/src/components.rs b/crates/settings_ui/src/components.rs new file mode 100644 index 0000000000000000000000000000000000000000..a29aae3bb1f2ef086e6d3289b03fbe29000d0f45 --- /dev/null +++ b/crates/settings_ui/src/components.rs @@ -0,0 +1,95 @@ +use editor::Editor; +use gpui::{Focusable, div}; +use ui::{ + ActiveTheme as _, App, FluentBuilder as _, InteractiveElement as _, IntoElement, + ParentElement as _, RenderOnce, Styled as _, Window, +}; + +#[derive(IntoElement)] +pub struct SettingsEditor { + initial_text: Option, + placeholder: Option<&'static str>, + confirm: Option, &mut App)>>, + tab_index: Option, +} + +impl SettingsEditor { + pub fn new() -> Self { + Self { + initial_text: None, + placeholder: None, + confirm: None, + tab_index: None, + } + } + + pub fn with_initial_text(mut self, initial_text: String) -> Self { + self.initial_text = Some(initial_text); + self + } + + pub fn with_placeholder(mut self, placeholder: &'static str) -> Self { + self.placeholder = Some(placeholder); + self + } + + pub fn on_confirm(mut self, confirm: impl Fn(Option, &mut App) + 'static) -> Self { + self.confirm = Some(Box::new(confirm)); + self + } + + pub(crate) fn tab_index(mut self, arg: isize) -> Self { + self.tab_index = Some(arg); + self + } +} + +impl RenderOnce for SettingsEditor { + fn render(self, window: &mut Window, cx: &mut App) -> impl ui::IntoElement { + let editor = window.use_state(cx, { + move |window, cx| { + let mut editor = Editor::single_line(window, cx); + if let Some(text) = self.initial_text { + editor.set_text(text, window, cx); + } + + if let Some(placeholder) = self.placeholder { + editor.set_placeholder_text(placeholder, window, cx); + } + // todo(settings_ui): We should have an observe global use for settings store + // so whenever a settings file is updated, the settings ui updates too + editor + } + }); + + if let Some(tab_index) = self.tab_index { + editor.focus_handle(cx).tab_index(tab_index); + } + + let weak_editor = editor.downgrade(); + + let theme_colors = cx.theme().colors(); + + div() + .py_1() + .px_2() + .min_w_64() + .rounded_md() + .border_1() + .border_color(theme_colors.border) + .bg(theme_colors.editor_background) + .child(editor) + .when_some(self.confirm, |this, confirm| { + this.on_action::({ + move |_, _, cx| { + let Some(editor) = weak_editor.upgrade() else { + return; + }; + let new_value = editor.read_with(cx, |editor, cx| editor.text(cx)); + let new_value = (!new_value.is_empty()).then_some(new_value); + confirm(new_value, cx); + } + }) + }) + } +} diff --git a/crates/settings_ui/src/page_data.rs b/crates/settings_ui/src/page_data.rs new file mode 100644 index 0000000000000000000000000000000000000000..b407e88cd5619cbf7bff82575c6adda407959da2 --- /dev/null +++ b/crates/settings_ui/src/page_data.rs @@ -0,0 +1,5651 @@ +use settings::{LanguageSettingsContent, SettingsContent}; +use std::sync::Arc; +use ui::{IntoElement, SharedString}; + +use crate::{ + LOCAL, SettingField, SettingItem, SettingsFieldMetadata, SettingsPage, SettingsPageItem, + SubPageLink, USER, sub_page_stack, +}; + +pub(crate) fn settings_data() -> Vec { + vec![ + SettingsPage { + title: "General", + items: vec![ + SettingsPageItem::SectionHeader("General Settings"), + SettingsPageItem::SettingItem(SettingItem { + title: "Confirm Quit", + description: "Confirm before quitting Zed", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.confirm_quit, + pick_mut: |settings_content| &mut settings_content.workspace.confirm_quit, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Restore On Startup", + description: "Restore previous session when opening Zed", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.restore_on_startup, + pick_mut: |settings_content| { + &mut settings_content.workspace.restore_on_startup + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "When Closing With No Tabs", + description: "What to do when using the 'close active item' action with no tabs", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.workspace.when_closing_with_no_tabs + }, + pick_mut: |settings_content| { + &mut settings_content.workspace.when_closing_with_no_tabs + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "On Last Window Closed", + description: "What to do when the last window is closed", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.on_last_window_closed, + pick_mut: |settings_content| { + &mut settings_content.workspace.on_last_window_closed + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Use System Path Prompts", + description: "Use native OS dialogs for 'Open' and 'Save As'", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.workspace.use_system_path_prompts + }, + pick_mut: |settings_content| { + &mut settings_content.workspace.use_system_path_prompts + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Use System Prompts", + description: "Use native OS dialogs for confirmations", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.use_system_prompts, + pick_mut: |settings_content| { + &mut settings_content.workspace.use_system_prompts + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Redact Private Values", + description: "Hide the values of variables in private files", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.redact_private_values, + pick_mut: |settings_content| { + &mut settings_content.editor.redact_private_values + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Scoped Settings"), + SettingsPageItem::SettingItem(SettingItem { + // todo(settings_ui): Implement another setting item type that just shows an edit in settings.json + files: USER, + title: "Preview Channel", + description: "Which settings should be activated only in Preview build of Zed", + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.workspace.use_system_prompts, + pick_mut: |settings_content| { + &mut settings_content.workspace.use_system_prompts + }, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Settings Profiles", + description: "Any number of settings profiles that are temporarily applied on top of your existing user settings", + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.workspace.use_system_prompts, + pick_mut: |settings_content| { + &mut settings_content.workspace.use_system_prompts + }, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SectionHeader("Privacy"), + SettingsPageItem::SettingItem(SettingItem { + title: "Telemetry Diagnostics", + description: "Send debug information like crash reports", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(telemetry) = &settings_content.telemetry { + &telemetry.diagnostics + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .telemetry + .get_or_insert_default() + .diagnostics + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Telemetry Metrics", + description: "Send anonymized usage data like what languages you're using Zed with", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(telemetry) = &settings_content.telemetry { + &telemetry.metrics + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.telemetry.get_or_insert_default().metrics + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "Appearance & Behavior", + items: vec![ + SettingsPageItem::SectionHeader("Theme"), + // todo(settings_ui): Figure out how we want to add these + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Theme Mode", + description: "How to select the theme", + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.theme.theme, + pick_mut: |settings_content| &mut settings_content.theme.theme, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Icon Theme", + // todo(settings_ui) + // This description is misleading because the icon theme is used in more places than the file explorer) + description: "Choose the icon theme for file explorer", + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.theme.icon_theme, + pick_mut: |settings_content| &mut settings_content.theme.icon_theme, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SectionHeader("Fonts"), + SettingsPageItem::SettingItem(SettingItem { + title: "Buffer Font Family", + description: "Font family for editor text", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.theme.buffer_font_family, + pick_mut: |settings_content| &mut settings_content.theme.buffer_font_family, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Buffer Font Size", + description: "Font size for editor text", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.theme.buffer_font_size, + pick_mut: |settings_content| &mut settings_content.theme.buffer_font_size, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Buffer Font Weight", + description: "Font weight for editor text (100-900)", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.theme.buffer_font_weight, + pick_mut: |settings_content| &mut settings_content.theme.buffer_font_weight, + }), + metadata: None, + files: USER, + }), + // todo(settings_ui): This needs custom ui + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Buffer Line Height", + description: "Line height for editor text", + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.theme.buffer_line_height, + pick_mut: |settings_content| { + &mut settings_content.theme.buffer_line_height + }, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "UI Font Family", + description: "Font family for UI elements", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.theme.ui_font_family, + pick_mut: |settings_content| &mut settings_content.theme.ui_font_family, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "UI Font Size", + description: "Font size for UI elements", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.theme.ui_font_size, + pick_mut: |settings_content| &mut settings_content.theme.ui_font_size, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "UI Font Weight", + description: "Font weight for UI elements (100-900)", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.theme.ui_font_weight, + pick_mut: |settings_content| &mut settings_content.theme.ui_font_weight, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Agent Panel UI Font Size", + description: "Font size for agent response text in the agent panel. Falls back to the regular UI font size.", + field: Box::new(SettingField { + pick: |settings_content| { + if settings_content.theme.agent_ui_font_size.is_some() { + &settings_content.theme.agent_ui_font_size + } else { + &settings_content.theme.ui_font_size + } + }, + pick_mut: |settings_content| &mut settings_content.theme.agent_ui_font_size, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Agent Panel Buffer Font Size", + description: "Font size for user messages text in the agent panel", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.theme.agent_buffer_font_size, + pick_mut: |settings_content| { + &mut settings_content.theme.agent_buffer_font_size + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Keymap"), + SettingsPageItem::SettingItem(SettingItem { + title: "Base Keymap", + description: "The name of a base set of key bindings to use", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.base_keymap, + pick_mut: |settings_content| &mut settings_content.base_keymap, + }), + metadata: None, + files: USER, + }), + // todo(settings_ui): Vim/Helix Mode should be apart of one type because it's undefined + // behavior to have them both enabled at the same time + SettingsPageItem::SettingItem(SettingItem { + title: "Vim Mode", + description: "Enable vim modes and key bindings", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.vim_mode, + pick_mut: |settings_content| &mut settings_content.vim_mode, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Helix Mode", + description: "Enable helix modes and key bindings", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.helix_mode, + pick_mut: |settings_content| &mut settings_content.helix_mode, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Multi Cursor Modifier", + description: "Modifier key for adding multiple cursors", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.multi_cursor_modifier, + pick_mut: |settings_content| { + &mut settings_content.editor.multi_cursor_modifier + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Cursor"), + SettingsPageItem::SettingItem(SettingItem { + title: "Cursor Blink", + description: "Whether the cursor blinks in the editor", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.cursor_blink, + pick_mut: |settings_content| &mut settings_content.editor.cursor_blink, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Cursor Shape", + description: "Cursor shape for the editor", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.cursor_shape, + pick_mut: |settings_content| &mut settings_content.editor.cursor_shape, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Hide Mouse", + description: "When to hide the mouse cursor", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.hide_mouse, + pick_mut: |settings_content| &mut settings_content.editor.hide_mouse, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Highlighting"), + SettingsPageItem::SettingItem(SettingItem { + title: "Unnecessary Code Fade", + description: "How much to fade out unused code (0.0 - 0.9)", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.theme.unnecessary_code_fade, + pick_mut: |settings_content| { + &mut settings_content.theme.unnecessary_code_fade + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Current Line Highlight", + description: "How to highlight the current line", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.current_line_highlight, + pick_mut: |settings_content| { + &mut settings_content.editor.current_line_highlight + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Selection Highlight", + description: "Highlight all occurrences of selected text", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.selection_highlight, + pick_mut: |settings_content| { + &mut settings_content.editor.selection_highlight + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Rounded Selection", + description: "Whether the text selection should have rounded corners", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.rounded_selection, + pick_mut: |settings_content| &mut settings_content.editor.rounded_selection, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Minimum Contrast For Highlights", + description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.minimum_contrast_for_highlights + }, + pick_mut: |settings_content| { + &mut settings_content.editor.minimum_contrast_for_highlights + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Guides"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Wrap Guides", + description: "Show wrap guides (vertical rulers)", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content + .project + .all_languages + .defaults + .show_wrap_guides + }, + pick_mut: |settings_content| { + &mut settings_content + .project + .all_languages + .defaults + .show_wrap_guides + }, + }), + metadata: None, + files: USER | LOCAL, + }), + // todo(settings_ui): This needs a custom component + SettingsPageItem::SettingItem(SettingItem { + title: "Wrap Guides", + description: "Character counts at which to show wrap guides", + field: Box::new( + SettingField { + pick: |settings_content| { + &settings_content.project.all_languages.defaults.wrap_guides + }, + pick_mut: |settings_content| { + &mut settings_content.project.all_languages.defaults.wrap_guides + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Layout"), + SettingsPageItem::SettingItem(SettingItem { + title: "Bottom Dock Layout", + description: "Layout mode for the bottom dock", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.bottom_dock_layout, + pick_mut: |settings_content| { + &mut settings_content.workspace.bottom_dock_layout + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Centered Layout Left Padding", + description: "Left padding for centered layout", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(centered_layout) = + &settings_content.workspace.centered_layout + { + ¢ered_layout.left_padding + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .workspace + .centered_layout + .get_or_insert_default() + .left_padding + }, + }), + metadata: None, + }), + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Centered Layout Right Padding", + description: "Right padding for centered layout", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(centered_layout) = + &settings_content.workspace.centered_layout + { + ¢ered_layout.right_padding + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .workspace + .centered_layout + .get_or_insert_default() + .right_padding + }, + }), + metadata: None, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Zoomed Padding", + description: "Show padding for zoomed panels", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.zoomed_padding, + pick_mut: |settings_content| &mut settings_content.workspace.zoomed_padding, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Window"), + // todo(settings_ui): Should we filter by platform? + SettingsPageItem::SettingItem(SettingItem { + title: "Use System Window Tabs", + description: "(macOS only) Whether to allow windows to tab together", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.use_system_window_tabs, + pick_mut: |settings_content| { + &mut settings_content.workspace.use_system_window_tabs + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "Editor", + items: { + let mut items = vec![ + SettingsPageItem::SectionHeader("Multibuffer"), + SettingsPageItem::SettingItem(SettingItem { + title: "Double Click In Multibuffer", + description: "What to do when multibuffer is double-clicked in some of its excerpts", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.double_click_in_multibuffer + }, + pick_mut: |settings_content| { + &mut settings_content.editor.double_click_in_multibuffer + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Expand Excerpt Lines", + description: "How many lines to expand the multibuffer excerpts by default", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.expand_excerpt_lines, + pick_mut: |settings_content| { + &mut settings_content.editor.expand_excerpt_lines + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Excerpt Context Lines", + description: "How many lines of context to provide in multibuffer excerpts by default", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.excerpt_context_lines, + pick_mut: |settings_content| { + &mut settings_content.editor.excerpt_context_lines + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Scrolling"), + SettingsPageItem::SettingItem(SettingItem { + title: "Scroll Beyond Last Line", + description: "Whether the editor will scroll beyond the last line", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.scroll_beyond_last_line + }, + pick_mut: |settings_content| { + &mut settings_content.editor.scroll_beyond_last_line + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Vertical Scroll Margin", + description: "The number of lines to keep above/below the cursor when auto-scrolling", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.vertical_scroll_margin + }, + pick_mut: |settings_content| { + &mut settings_content.editor.vertical_scroll_margin + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Horizontal Scroll Margin", + description: "The number of characters to keep on either side when scrolling with the mouse", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.horizontal_scroll_margin + }, + pick_mut: |settings_content| { + &mut settings_content.editor.horizontal_scroll_margin + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Scroll Sensitivity", + description: "Scroll sensitivity multiplier for both horizontal and vertical scrolling", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.scroll_sensitivity, + pick_mut: |settings_content| { + &mut settings_content.editor.scroll_sensitivity + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Fast Scroll Sensitivity", + description: "Fast Scroll sensitivity multiplier for both horizontal and vertical scrolling", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.fast_scroll_sensitivity + }, + pick_mut: |settings_content| { + &mut settings_content.editor.fast_scroll_sensitivity + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Autoscroll On Clicks", + description: "Whether to scroll when clicking near the edge of the visible text area", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.autoscroll_on_clicks, + pick_mut: |settings_content| { + &mut settings_content.editor.autoscroll_on_clicks + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Signature Help"), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Signature Help", + description: "Automatically show a signature help pop-up", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.auto_signature_help, + pick_mut: |settings_content| { + &mut settings_content.editor.auto_signature_help + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Signature Help After Edits", + description: "Show the signature help pop-up after completions or bracket pairs are inserted", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.show_signature_help_after_edits + }, + pick_mut: |settings_content| { + &mut settings_content.editor.show_signature_help_after_edits + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Snippet Sort Order", + description: "Determines how snippets are sorted relative to other completion items", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.snippet_sort_order, + pick_mut: |settings_content| { + &mut settings_content.editor.snippet_sort_order + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Hover"), + SettingsPageItem::SettingItem(SettingItem { + title: "Hover Popover Enabled", + description: "Show the informational hover box when moving the mouse over symbols in the editor", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.hover_popover_enabled, + pick_mut: |settings_content| { + &mut settings_content.editor.hover_popover_enabled + }, + }), + metadata: None, + files: USER, + }), + // todo(settings ui): add units to this number input + SettingsPageItem::SettingItem(SettingItem { + title: "Hover Popover Delay", + description: "Time to wait in milliseconds before showing the informational hover box", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.hover_popover_delay, + pick_mut: |settings_content| { + &mut settings_content.editor.hover_popover_delay + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Code Actions & Selection"), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Code Actions", + description: "Show code action button at start of buffer line", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.inline_code_actions, + pick_mut: |settings_content| { + &mut settings_content.editor.inline_code_actions + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Drag And Drop Selection", + description: "Enable drag and drop selection", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(drag_and_drop) = + &settings_content.editor.drag_and_drop_selection + { + &drag_and_drop.enabled + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .drag_and_drop_selection + .get_or_insert_default() + .enabled + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Drag And Drop Selection Delay", + description: "Delay in milliseconds before drag and drop selection starts", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(drag_and_drop) = + &settings_content.editor.drag_and_drop_selection + { + &drag_and_drop.delay + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .drag_and_drop_selection + .get_or_insert_default() + .delay + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Gutter"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Line Numbers", + description: "Show line numbers in the gutter", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(gutter) = &settings_content.editor.gutter { + &gutter.line_numbers + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .gutter + .get_or_insert_default() + .line_numbers + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Relative Line Numbers", + description: "Whether the line numbers in the editor's gutter are relative or not", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.relative_line_numbers, + pick_mut: |settings_content| { + &mut settings_content.editor.relative_line_numbers + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Runnables", + description: "Show runnable buttons in the gutter", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(gutter) = &settings_content.editor.gutter { + &gutter.runnables + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .gutter + .get_or_insert_default() + .runnables + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Breakpoints", + description: "Show breakpoints in the gutter", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(gutter) = &settings_content.editor.gutter { + &gutter.breakpoints + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .gutter + .get_or_insert_default() + .breakpoints + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Folds", + description: "Show code folding controls in the gutter", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(gutter) = &settings_content.editor.gutter { + &gutter.folds + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.editor.gutter.get_or_insert_default().folds + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Min Line Number Digits", + description: "Minimum number of characters to reserve space for in the gutter", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(gutter) = &settings_content.editor.gutter { + &gutter.min_line_number_digits + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .gutter + .get_or_insert_default() + .min_line_number_digits + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Scrollbar"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show", + description: "When to show the scrollbar in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.show + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .show + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Cursors", + description: "Show cursor positions in the scrollbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.cursors + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .cursors + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Git Diff", + description: "Show git diff indicators in the scrollbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.git_diff + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .git_diff + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Search Results", + description: "Show buffer search result indicators in the scrollbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.search_results + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .search_results + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Selected Text", + description: "Show selected text occurrences in the scrollbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.selected_text + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .selected_text + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Selected Symbol", + description: "Show selected symbol occurrences in the scrollbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.selected_symbol + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .selected_symbol + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Diagnostics", + description: "Which diagnostic indicators to show in the scrollbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.diagnostics + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .diagnostics + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Horizontal Scrollbar", + description: "When false, forcefully disables the horizontal scrollbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + if let Some(axes) = &scrollbar.axes { + &axes.horizontal + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .axes + .get_or_insert_default() + .horizontal + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Vertical Scrollbar", + description: "When false, forcefully disables the vertical scrollbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(scrollbar) = &settings_content.editor.scrollbar { + if let Some(axes) = &scrollbar.axes { + &axes.vertical + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .scrollbar + .get_or_insert_default() + .axes + .get_or_insert_default() + .vertical + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Minimap"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show", + description: "When to show the minimap in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(minimap) = &settings_content.editor.minimap { + &minimap.show + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.editor.minimap.get_or_insert_default().show + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Display In", + description: "Where to show the minimap in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(minimap) = &settings_content.editor.minimap { + &minimap.display_in + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .minimap + .get_or_insert_default() + .display_in + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Thumb", + description: "When to show the minimap thumb", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(minimap) = &settings_content.editor.minimap { + &minimap.thumb + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .minimap + .get_or_insert_default() + .thumb + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Thumb Border", + description: "Border style for the minimap's scrollbar thumb", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(minimap) = &settings_content.editor.minimap { + &minimap.thumb_border + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .minimap + .get_or_insert_default() + .thumb_border + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Current Line Highlight", + description: "How to highlight the current line in the minimap", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(minimap) = &settings_content.editor.minimap + && minimap.current_line_highlight.is_some() + { + &minimap.current_line_highlight + } else { + &settings_content.editor.current_line_highlight + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .minimap + .get_or_insert_default() + .current_line_highlight + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Max Width Columns", + description: "Maximum number of columns to display in the minimap", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(minimap) = &settings_content.editor.minimap { + &minimap.max_width_columns + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .minimap + .get_or_insert_default() + .max_width_columns + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Toolbar"), + SettingsPageItem::SettingItem(SettingItem { + title: "Breadcrumbs", + description: "Show breadcrumbs", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(toolbar) = &settings_content.editor.toolbar { + &toolbar.breadcrumbs + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .toolbar + .get_or_insert_default() + .breadcrumbs + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Quick Actions", + description: "Show quick action buttons (e.g., search, selection, editor controls, etc.)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(toolbar) = &settings_content.editor.toolbar { + &toolbar.quick_actions + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .toolbar + .get_or_insert_default() + .quick_actions + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Selections Menu", + description: "Show the selections menu in the editor toolbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(toolbar) = &settings_content.editor.toolbar { + &toolbar.selections_menu + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .toolbar + .get_or_insert_default() + .selections_menu + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Agent Review", + description: "Show agent review buttons in the editor toolbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(toolbar) = &settings_content.editor.toolbar { + &toolbar.agent_review + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .toolbar + .get_or_insert_default() + .agent_review + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Code Actions", + description: "Show code action buttons in the editor toolbar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(toolbar) = &settings_content.editor.toolbar { + &toolbar.code_actions + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .toolbar + .get_or_insert_default() + .code_actions + }, + }), + metadata: None, + files: USER, + }), + ]; + items.extend(language_settings_data()); + items + }, + }, + SettingsPage { + title: "Languages", + items: vec![ + SettingsPageItem::SectionHeader(LANGUAGES_SECTION_HEADER), + SettingsPageItem::SubPageLink(SubPageLink { + title: "JSON", + files: USER | LOCAL, + render: Arc::new(|this, window, cx| { + this.render_page_items( + language_settings_data().iter().enumerate(), + None, + window, + cx, + ) + .into_any_element() + }), + }), + SettingsPageItem::SubPageLink(SubPageLink { + title: "JSONC", + files: USER | LOCAL, + render: Arc::new(|this, window, cx| { + this.render_page_items( + language_settings_data().iter().enumerate(), + None, + window, + cx, + ) + .into_any_element() + }), + }), + SettingsPageItem::SubPageLink(SubPageLink { + title: "Rust", + files: USER | LOCAL, + render: Arc::new(|this, window, cx| { + this.render_page_items( + language_settings_data().iter().enumerate(), + None, + window, + cx, + ) + .into_any_element() + }), + }), + SettingsPageItem::SubPageLink(SubPageLink { + title: "Python", + files: USER | LOCAL, + render: Arc::new(|this, window, cx| { + this.render_page_items( + language_settings_data().iter().enumerate(), + None, + window, + cx, + ) + .into_any_element() + }), + }), + SettingsPageItem::SubPageLink(SubPageLink { + title: "TSX", + files: USER | LOCAL, + render: Arc::new(|this, window, cx| { + this.render_page_items( + language_settings_data().iter().enumerate(), + None, + window, + cx, + ) + .into_any_element() + }), + }), + ], + }, + SettingsPage { + title: "Search & Files", + items: vec![ + SettingsPageItem::SectionHeader("Search"), + SettingsPageItem::SettingItem(SettingItem { + title: "Whole Word", + description: "Search for whole words by default", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(search) = &settings_content.editor.search { + &search.whole_word + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .search + .get_or_insert_default() + .whole_word + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Case Sensitive", + description: "Search case-sensitively by default", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(search) = &settings_content.editor.search { + &search.case_sensitive + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .search + .get_or_insert_default() + .case_sensitive + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Include Ignored", + description: "Include ignored files in search results by default", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(search) = &settings_content.editor.search { + &search.include_ignored + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .search + .get_or_insert_default() + .include_ignored + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Regex", + description: "Use regex search by default", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(search) = &settings_content.editor.search { + &search.regex + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.editor.search.get_or_insert_default().regex + }, + }), + metadata: None, + files: USER, + }), + // todo: null by default + SettingsPageItem::SettingItem(SettingItem { + title: "Include Ignored in Search", + description: "Use gitignored files when searching", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.include_ignored + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .file_finder + .get_or_insert_default() + .include_ignored + }, + } + .unimplemented(), + ), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Search Wrap", + description: "Whether the editor search results will loop", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.search_wrap, + pick_mut: |settings_content| &mut settings_content.editor.search_wrap, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Seed Search Query From Cursor", + description: "When to populate a new search's query based on the text under the cursor", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.seed_search_query_from_cursor + }, + pick_mut: |settings_content| { + &mut settings_content.editor.seed_search_query_from_cursor + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Use Smartcase Search", + description: "Use smartcase (i.e., case-sensitive) search", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.use_smartcase_search, + pick_mut: |settings_content| { + &mut settings_content.editor.use_smartcase_search + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("File Management"), + SettingsPageItem::SettingItem(SettingItem { + title: "File Icons", + description: "Show file icons in the file finder", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.file_icons + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .file_finder + .get_or_insert_default() + .file_icons + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Modal Max Width", + description: "Determines how much space the file finder can take up in relation to the available window width", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.modal_max_width + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .file_finder + .get_or_insert_default() + .modal_max_width + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Restore File State", + description: "Restore previous file state when reopening", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.restore_on_file_reopen, + pick_mut: |settings_content| { + &mut settings_content.workspace.restore_on_file_reopen + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Close on File Delete", + description: "Automatically close files that have been deleted", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.close_on_file_delete, + pick_mut: |settings_content| { + &mut settings_content.workspace.close_on_file_delete + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Skip Focus For Active In Search", + description: "Whether the file finder should skip focus for the active file in search results", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.skip_focus_for_active_in_search + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .file_finder + .get_or_insert_default() + .skip_focus_for_active_in_search + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Git Status", + description: "Show the git status in the file finder", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.git_status + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .file_finder + .get_or_insert_default() + .git_status + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("File Scan"), + ], + }, + SettingsPage { + title: "Workbench & Window", + items: vec![ + SettingsPageItem::SectionHeader("Status Bar"), + SettingsPageItem::SettingItem(SettingItem { + title: "Project Panel Button", + description: "Show the project panel button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Active Language Button", + description: "Show the active language button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(status_bar) = &settings_content.status_bar { + &status_bar.active_language_button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .status_bar + .get_or_insert_default() + .active_language_button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Cursor Position Button", + description: "Show the cursor position button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(status_bar) = &settings_content.status_bar { + &status_bar.cursor_position_button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .status_bar + .get_or_insert_default() + .cursor_position_button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Terminal Button", + description: "Show the terminal button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.terminal.get_or_insert_default().button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Diagnostics Button", + description: "Show the project diagnostics button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + &diagnostics.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.diagnostics.get_or_insert_default().button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Project Search Button", + description: "Show the project search button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(search) = &settings_content.editor.search { + &search.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .editor + .search + .get_or_insert_default() + .button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Debugger Button", + description: "Show the debugger button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(debugger) = &settings_content.debugger { + &debugger.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.debugger.get_or_insert_default().button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Title Bar"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Branch Icon", + description: "Show the branch icon beside branch switcher in the titlebar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_branch_icon + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .title_bar + .get_or_insert_default() + .show_branch_icon + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Branch Name", + description: "Show the branch name button in the titlebar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_branch_name + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .title_bar + .get_or_insert_default() + .show_branch_name + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Project Items", + description: "Show the project host and name in the titlebar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_project_items + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .title_bar + .get_or_insert_default() + .show_project_items + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Onboarding Banner", + description: "Show banners announcing new features in the titlebar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_onboarding_banner + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .title_bar + .get_or_insert_default() + .show_onboarding_banner + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show User Picture", + description: "Show user picture in the titlebar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_user_picture + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .title_bar + .get_or_insert_default() + .show_user_picture + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Sign In", + description: "Show the sign in button in the titlebar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_sign_in + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .title_bar + .get_or_insert_default() + .show_sign_in + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Menus", + description: "Show the menus in the titlebar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_menus + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .title_bar + .get_or_insert_default() + .show_menus + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Tab Bar"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Tab Bar", + description: "Show the tab bar in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tab_bar) = &settings_content.tab_bar { + &tab_bar.show + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.tab_bar.get_or_insert_default().show + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Editor Tabs", + description: "Show the tab bar in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tab_bar) = &settings_content.tab_bar { + &tab_bar.show + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.tab_bar.get_or_insert_default().show + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Git Status In Tabs", + description: "Show the Git file status on a tab item", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tabs) = &settings_content.tabs { + &tabs.git_status + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.tabs.get_or_insert_default().git_status + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show File Icons In Tabs", + description: "Show the file icon for a tab", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tabs) = &settings_content.tabs { + &tabs.file_icons + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.tabs.get_or_insert_default().file_icons + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Tab Close Position", + description: "Position of the close button in a tab", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tabs) = &settings_content.tabs { + &tabs.close_position + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.tabs.get_or_insert_default().close_position + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Maximum Tabs", + description: "Maximum open tabs in a pane. Will not close an unsaved tab", + // todo(settings_ui): The default for this value is null and it's use in code + // is complex, so I'm going to come back to this later + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.workspace.max_tabs, + pick_mut: |settings_content| &mut settings_content.workspace.max_tabs, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Navigation History Buttons", + description: "Show the navigation history buttons in the tab bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tab_bar) = &settings_content.tab_bar { + &tab_bar.show_nav_history_buttons + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .tab_bar + .get_or_insert_default() + .show_nav_history_buttons + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Tab Settings"), + SettingsPageItem::SettingItem(SettingItem { + title: "Activate On Close", + description: "What to do after closing the current tab", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tabs) = &settings_content.tabs { + &tabs.activate_on_close + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .tabs + .get_or_insert_default() + .activate_on_close + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Tab Show Diagnostics", + description: "Which files containing diagnostic errors/warnings to mark in the tabs", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tabs) = &settings_content.tabs { + &tabs.show_diagnostics + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .tabs + .get_or_insert_default() + .show_diagnostics + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Close Button", + description: "Controls the appearance behavior of the tab's close button", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tabs) = &settings_content.tabs { + &tabs.show_close_button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .tabs + .get_or_insert_default() + .show_close_button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Preview Tabs"), + SettingsPageItem::SettingItem(SettingItem { + title: "Preview Tabs Enabled", + description: "Show opened editors as preview tabs", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(preview_tabs) = &settings_content.preview_tabs { + &preview_tabs.enabled + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .preview_tabs + .get_or_insert_default() + .enabled + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Enable Preview From File Finder", + description: "Whether to open tabs in preview mode when selected from the file finder", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(preview_tabs) = &settings_content.preview_tabs { + &preview_tabs.enable_preview_from_file_finder + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .preview_tabs + .get_or_insert_default() + .enable_preview_from_file_finder + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Enable Preview From Code Navigation", + description: "Whether a preview tab gets replaced when code navigation is used to navigate away from the tab", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(preview_tabs) = &settings_content.preview_tabs { + &preview_tabs.enable_preview_from_code_navigation + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .preview_tabs + .get_or_insert_default() + .enable_preview_from_code_navigation + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "Panels", + items: vec![ + SettingsPageItem::SectionHeader("Project Panel"), + SettingsPageItem::SettingItem(SettingItem { + title: "Project Panel Dock", + description: "Where to dock the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.dock + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.project_panel.get_or_insert_default().dock + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Project Panel Default Width", + description: "Default width of the project panel in pixels", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.default_width + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .default_width + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Hide .gitignore", + description: "Whether to hide the gitignore entries in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.hide_gitignore + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .hide_gitignore + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Entry Spacing", + description: "Spacing between worktree entries in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.entry_spacing + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .entry_spacing + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "File Icons", + description: "Show file icons in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.file_icons + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .file_icons + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Folder Icons", + description: "Whether to show folder icons or chevrons for directories in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.folder_icons + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .folder_icons + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Git Status", + description: "Show the git status in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.git_status + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .git_status + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Indent Size", + description: "Amount of indentation for nested items", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.indent_size + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .indent_size + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Reveal Entries", + description: "Whether to reveal entries in the project panel automatically when a corresponding project entry becomes active", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.auto_reveal_entries + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .auto_reveal_entries + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Starts Open", + description: "Whether the project panel should open on startup", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.starts_open + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .starts_open + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Fold Directories", + description: "Whether to fold directories automatically and show compact folders when a directory has only one subdirectory inside", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.auto_fold_dirs + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .auto_fold_dirs + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Scrollbar Show", + description: "Show the scrollbar in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel + && let Some(scrollbar) = &project_panel.scrollbar + && scrollbar.show.is_some() + { + &scrollbar.show + } else if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.show + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .scrollbar + .get_or_insert_default() + .show + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Diagnostics", + description: "Which files containing diagnostic errors/warnings to mark in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.show_diagnostics + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .show_diagnostics + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Sticky Scroll", + description: "Whether to stick parent directories at top of the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.sticky_scroll + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .sticky_scroll + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Indent Guides Show", + description: "Show indent guides in the project panel", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + if let Some(indent_guides) = &project_panel.indent_guides { + &indent_guides.show + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .indent_guides + .get_or_insert_default() + .show + }, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Drag and Drop", + description: "Whether to enable drag-and-drop operations in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.drag_and_drop + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .drag_and_drop + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Hide Root", + description: "Whether to hide the root entry when only one folder is open in the window", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.hide_root + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .hide_root + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Hide Hidden", + description: "Whether to hide the hidden entries in the project panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.hide_hidden + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .project_panel + .get_or_insert_default() + .hide_hidden + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Terminal Panel"), + SettingsPageItem::SettingItem(SettingItem { + title: "Terminal Dock", + description: "Where to dock the terminal panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.dock + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.terminal.get_or_insert_default().dock + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Outline Panel"), + SettingsPageItem::SettingItem(SettingItem { + title: "Outline Panel Button", + description: "Show the outline panel button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Outline Panel Dock", + description: "Where to dock the outline panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.dock + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.outline_panel.get_or_insert_default().dock + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Outline Panel Default Width", + description: "Default width of the outline panel in pixels", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.default_width + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .default_width + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "File Icons", + description: "Show file icons in the outline panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.file_icons + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .file_icons + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Folder Icons", + description: "Whether to show folder icons or chevrons for directories in the outline panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.folder_icons + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .folder_icons + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Git Status", + description: "Show the git status in the outline panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.git_status + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .git_status + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Indent Size", + description: "Amount of indentation for nested items", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.indent_size + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .indent_size + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Reveal Entries", + description: "Whether to reveal when a corresponding outline entry becomes active", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.auto_reveal_entries + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .auto_reveal_entries + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Fold Directories", + description: "Whether to fold directories automatically when a directory contains only one subdirectory", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + &outline_panel.auto_fold_dirs + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .auto_fold_dirs + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Indent Guides Show", + description: "When to show indent guides in the outline panel", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(outline_panel) = &settings_content.outline_panel { + if let Some(indent_guides) = &outline_panel.indent_guides { + &indent_guides.show + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .outline_panel + .get_or_insert_default() + .indent_guides + .get_or_insert_default() + .show + }, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SectionHeader("Git Panel"), + SettingsPageItem::SettingItem(SettingItem { + title: "Git Panel Button", + description: "Show the Git panel button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git_panel) = &settings_content.git_panel { + &git_panel.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.git_panel.get_or_insert_default().button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Git Panel Dock", + description: "Where to dock the Git panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git_panel) = &settings_content.git_panel { + &git_panel.dock + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.git_panel.get_or_insert_default().dock + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Git Panel Default Width", + description: "Default width of the Git panel in pixels", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git_panel) = &settings_content.git_panel { + &git_panel.default_width + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git_panel + .get_or_insert_default() + .default_width + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Debugger Panel"), + SettingsPageItem::SettingItem(SettingItem { + title: "Debugger Panel Dock", + description: "The dock position of the debug panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(debugger) = &settings_content.debugger { + &debugger.dock + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.debugger.get_or_insert_default().dock + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Notification Panel"), + SettingsPageItem::SettingItem(SettingItem { + title: "Notification Panel Button", + description: "Show the notification panel button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(notification_panel) = &settings_content.notification_panel { + ¬ification_panel.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .notification_panel + .get_or_insert_default() + .button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Notification Panel Dock", + description: "Where to dock the notification panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(notification_panel) = &settings_content.notification_panel { + ¬ification_panel.dock + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .notification_panel + .get_or_insert_default() + .dock + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Notification Panel Default Width", + description: "Default width of the notification panel in pixels", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(notification_panel) = &settings_content.notification_panel { + ¬ification_panel.default_width + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .notification_panel + .get_or_insert_default() + .default_width + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Collaboration Panel"), + SettingsPageItem::SettingItem(SettingItem { + title: "Collaboration Panel Button", + description: "Show the collaboration panel button in the status bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(collaboration_panel) = &settings_content.collaboration_panel + { + &collaboration_panel.button + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .collaboration_panel + .get_or_insert_default() + .button + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Collaboration Panel Dock", + description: "Where to dock the collaboration panel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(collaboration_panel) = &settings_content.collaboration_panel + { + &collaboration_panel.dock + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .collaboration_panel + .get_or_insert_default() + .dock + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Collaboration Panel Default Width", + description: "Default width of the collaboration panel in pixels", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(collaboration_panel) = &settings_content.collaboration_panel + { + &collaboration_panel.default_width + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .collaboration_panel + .get_or_insert_default() + .default_width + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "Debugger", + items: vec![ + SettingsPageItem::SectionHeader("General"), + SettingsPageItem::SettingItem(SettingItem { + title: "Stepping Granularity", + description: "Determines the stepping granularity for debug operations", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(debugger) = &settings_content.debugger { + &debugger.stepping_granularity + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .debugger + .get_or_insert_default() + .stepping_granularity + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Save Breakpoints", + description: "Whether breakpoints should be reused across Zed sessions", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(debugger) = &settings_content.debugger { + &debugger.save_breakpoints + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .debugger + .get_or_insert_default() + .save_breakpoints + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Timeout", + description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(debugger) = &settings_content.debugger { + &debugger.timeout + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.debugger.get_or_insert_default().timeout + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Log DAP Communications", + description: "Whether to log messages between active debug adapters and Zed", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(debugger) = &settings_content.debugger { + &debugger.log_dap_communications + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .debugger + .get_or_insert_default() + .log_dap_communications + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Format DAP Log Messages", + description: "Whether to format DAP messages when adding them to debug adapter logger", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(debugger) = &settings_content.debugger { + &debugger.format_dap_log_messages + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .debugger + .get_or_insert_default() + .format_dap_log_messages + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "Terminal", + items: vec![ + SettingsPageItem::SectionHeader("Environment"), + SettingsPageItem::SettingItem(SettingItem { + title: "Shell", + description: "What shell to use when opening a terminal", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.project.shell + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .project + .shell + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Working Directory", + description: "What working directory to use when launching the terminal", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.project.working_directory + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .project + .working_directory + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Environment Variables", + description: "Key-value pairs to add to the terminal's environment", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.project.env + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .project + .env + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Detect Virtual Environment", + description: "Activates the python virtual environment, if one is found, in the terminal's working directory", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.project.detect_venv + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .project + .detect_venv + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Font"), + SettingsPageItem::SettingItem(SettingItem { + title: "Font Size", + description: "Font size for terminal text. If not set, defaults to buffer font size", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.font_size + } else if settings_content.theme.buffer_font_size.is_some() { + &settings_content.theme.buffer_font_size + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.terminal.get_or_insert_default().font_size + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Font Family", + description: "Font family for terminal text. If not set, defaults to buffer font family", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal + && terminal.font_family.is_some() + { + &terminal.font_family + } else if settings_content.theme.buffer_font_family.is_some() { + &settings_content.theme.buffer_font_family + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .font_family + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Font Fallbacks", + description: "Font fallbacks for terminal text. If not set, defaults to buffer font fallbacks", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.font_fallbacks + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .font_fallbacks + }, + } + .unimplemented(), + ), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Font Weight", + description: "Font weight for terminal text in CSS weight units (100-900)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.font_weight + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .font_weight + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Font Features", + description: "Font features for terminal text", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.font_features + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .font_features + }, + } + .unimplemented(), + ), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Display Settings"), + SettingsPageItem::SettingItem(SettingItem { + title: "Line Height", + description: "Line height for terminal text", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.line_height + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .line_height + }, + } + .unimplemented(), + ), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Cursor Shape", + description: "Default cursor shape for the terminal (bar, block, underline, or hollow)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.cursor_shape + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .cursor_shape + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Cursor Blinking", + description: "Sets the cursor blinking behavior in the terminal", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.blinking + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.terminal.get_or_insert_default().blinking + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Alternate Scroll", + description: "Whether Alternate Scroll mode is active by default (converts mouse scroll to arrow keys in apps like vim)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.alternate_scroll + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .alternate_scroll + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Minimum Contrast", + description: "The minimum APCA perceptual contrast between foreground and background colors (0-106)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.minimum_contrast + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .minimum_contrast + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Behavior Settings"), + SettingsPageItem::SettingItem(SettingItem { + title: "Option As Meta", + description: "Whether the option key behaves as the meta key", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.option_as_meta + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .option_as_meta + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Copy On Select", + description: "Whether selecting text in the terminal automatically copies to the system clipboard", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.copy_on_select + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .copy_on_select + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Keep Selection On Copy", + description: "Whether to keep the text selection after copying it to the clipboard", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.keep_selection_on_copy + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .keep_selection_on_copy + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Layout Settings"), + SettingsPageItem::SettingItem(SettingItem { + title: "Default Width", + description: "Default width when the terminal is docked to the left or right (in pixels)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.default_width + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .default_width + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Default Height", + description: "Default height when the terminal is docked to the bottom (in pixels)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.default_height + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .default_height + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Advanced Settings"), + SettingsPageItem::SettingItem(SettingItem { + title: "Max Scroll History Lines", + description: "Maximum number of lines to keep in scrollback history (max: 100,000; 0 disables scrolling)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.max_scroll_history_lines + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .max_scroll_history_lines + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Toolbar"), + SettingsPageItem::SettingItem(SettingItem { + title: "Breadcrumbs", + description: "Display the terminal title in breadcrumbs inside the terminal pane", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + if let Some(toolbar) = &terminal.toolbar { + &toolbar.breadcrumbs + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .toolbar + .get_or_insert_default() + .breadcrumbs + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Scrollbar"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Scrollbar", + description: "When to show the scrollbar in the terminal", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal + && let Some(scrollbar) = &terminal.scrollbar + && scrollbar.show.is_some() + { + &scrollbar.show + } else if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.show + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .scrollbar + .get_or_insert_default() + .show + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "Version Control", + items: vec![ + SettingsPageItem::SectionHeader("Git"), + SettingsPageItem::SettingItem(SettingItem { + title: "Git Gutter", + description: "Control whether git status is shown in the editor's gutter", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + &git.git_gutter + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.git.get_or_insert_default().git_gutter + }, + }), + metadata: None, + files: USER, + }), + // todo(settings_ui): Figure out the right default for this value in default.json + SettingsPageItem::SettingItem(SettingItem { + title: "Gutter Debounce", + description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + &git.gutter_debounce + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.git.get_or_insert_default().gutter_debounce + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Git Blame", + description: "Whether or not to show git blame data inline in the currently focused line", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.enabled + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .enabled + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Git Blame Delay", + description: "The delay after which the inline blame information is shown", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.delay_ms + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .delay_ms + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Git Blame Padding", + description: "Padding between the end of the source line and the start of the inline blame in columns", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.padding + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .padding + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Git Blame Min Column", + description: "The minimum column number to show the inline blame information at", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.min_column + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .min_column + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Commit Summary", + description: "Show commit summary as part of the inline blame", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.show_commit_summary + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .show_commit_summary + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Avatar", + description: "Show the avatar of the author of the commit", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(blame) = &git.blame { + &blame.show_avatar + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .blame + .get_or_insert_default() + .show_avatar + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Author Name In Branch Picker", + description: "Show author name as part of the commit information in branch picker", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(branch_picker) = &git.branch_picker { + &branch_picker.show_author_name + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .branch_picker + .get_or_insert_default() + .show_author_name + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Hunk Style", + description: "How git hunks are displayed visually in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + &git.hunk_style + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.git.get_or_insert_default().hunk_style + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "Diagnostics & Errors", + items: vec![ + SettingsPageItem::SectionHeader("Filtering"), + SettingsPageItem::SettingItem(SettingItem { + title: "Max Severity", + description: "Which level to use to filter out diagnostics displayed in the editor", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.diagnostics_max_severity, + pick_mut: |settings_content| { + &mut settings_content.editor.diagnostics_max_severity + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Include Warnings", + description: "Whether to show warnings or not by default", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + &diagnostics.include_warnings + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .include_warnings + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Inline"), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Diagnostics Enabled", + description: "Whether to show diagnostics inline or not", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(inline) = &diagnostics.inline { + &inline.enabled + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .inline + .get_or_insert_default() + .enabled + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Update Debounce", + description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(inline) = &diagnostics.inline { + &inline.update_debounce_ms + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .inline + .get_or_insert_default() + .update_debounce_ms + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Padding", + description: "The amount of padding between the end of the source line and the start of the inline diagnostic", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(inline) = &diagnostics.inline { + &inline.padding + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .inline + .get_or_insert_default() + .padding + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Inline Min Column", + description: "The minimum column to display inline diagnostics", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(inline) = &diagnostics.inline { + &inline.min_column + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .inline + .get_or_insert_default() + .min_column + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Performance"), + SettingsPageItem::SettingItem(SettingItem { + title: "LSP Pull Diagnostics Enabled", + description: "Whether to pull for language server-powered diagnostics or not", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics { + &lsp_pull.enabled + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .lsp_pull_diagnostics + .get_or_insert_default() + .enabled + }, + }), + metadata: None, + files: USER, + }), + // todo(settings_ui): Needs unit + SettingsPageItem::SettingItem(SettingItem { + title: "LSP Pull Debounce", + description: "Minimum time to wait before pulling diagnostics from the language server(s)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics { + &lsp_pull.debounce_ms + } else { + &None + } + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .lsp_pull_diagnostics + .get_or_insert_default() + .debounce_ms + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "Collaboration", + items: vec![ + SettingsPageItem::SectionHeader("Calls"), + SettingsPageItem::SettingItem(SettingItem { + title: "Mute On Join", + description: "Whether the microphone should be muted when joining a channel or a call", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(calls) = &settings_content.calls { + &calls.mute_on_join + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.calls.get_or_insert_default().mute_on_join + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Share On Join", + description: "Whether your current project should be shared when joining an empty channel", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(calls) = &settings_content.calls { + &calls.share_on_join + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.calls.get_or_insert_default().share_on_join + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Experimental"), + SettingsPageItem::SettingItem(SettingItem { + title: "Rodio Audio", + description: "Opt into the new audio system", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(audio) = &settings_content.audio { + &audio.rodio_audio + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.audio.get_or_insert_default().rodio_audio + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Microphone Volume", + description: "Automatically adjust microphone volume (requires Rodio Audio)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(audio) = &settings_content.audio { + &audio.auto_microphone_volume + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .audio + .get_or_insert_default() + .auto_microphone_volume + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Speaker Volume", + description: "Automatically adjust volume of other call members (requires Rodio Audio)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(audio) = &settings_content.audio { + &audio.auto_speaker_volume + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .audio + .get_or_insert_default() + .auto_speaker_volume + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Denoise", + description: "Remove background noises (requires Rodio Audio)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(audio) = &settings_content.audio { + &audio.denoise + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.audio.get_or_insert_default().denoise + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Legacy Audio Compatible", + description: "Use audio parameters compatible with previous versions (requires Rodio Audio)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(audio) = &settings_content.audio { + &audio.legacy_audio_compatible + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .audio + .get_or_insert_default() + .legacy_audio_compatible + }, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "AI", + items: vec![ + SettingsPageItem::SectionHeader("General"), + SettingsPageItem::SettingItem(SettingItem { + title: "Disable AI", + description: "Whether to disable all AI features in Zed", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.disable_ai, + pick_mut: |settings_content| &mut settings_content.disable_ai, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "System & Network", + items: vec![ + SettingsPageItem::SectionHeader("Network"), + // todo(settings_ui): Proxy needs a default + SettingsPageItem::SettingItem(SettingItem { + title: "Proxy", + description: "The proxy to use for network requests", + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.proxy, + pick_mut: |settings_content| &mut settings_content.proxy, + } + .unimplemented(), + ), + metadata: Some(Box::new(SettingsFieldMetadata { + placeholder: Some("socks5h://localhost:10808"), + })), + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Server URL", + description: "The URL of the Zed server to connect to", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.server_url, + pick_mut: |settings_content| &mut settings_content.server_url, + }), + metadata: Some(Box::new(SettingsFieldMetadata { + placeholder: Some("https://zed.dev"), + })), + files: USER, + }), + SettingsPageItem::SectionHeader("System"), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Update", + description: "Whether or not to automatically check for updates", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.auto_update, + pick_mut: |settings_content| &mut settings_content.auto_update, + }), + metadata: None, + files: USER, + }), + ], + }, + ] +} + +const LANGUAGES_SECTION_HEADER: &'static str = "Languages"; + +fn language_settings_data() -> Vec { + fn current_language() -> Option { + sub_page_stack().iter().find_map(|page| { + (page.section_header == LANGUAGES_SECTION_HEADER) + .then(|| SharedString::new_static(page.link.title)) + }) + } + + fn language_settings_field( + settings_content: &SettingsContent, + get: fn(&LanguageSettingsContent) -> &Option, + ) -> &Option { + let all_languages = &settings_content.project.all_languages; + if let Some(current_language_name) = current_language() { + if let Some(current_language) = all_languages.languages.0.get(¤t_language_name) { + let value = get(current_language); + if value.is_some() { + return value; + } + } + } + let default_value = get(&all_languages.defaults); + return default_value; + } + + fn language_settings_field_mut( + settings_content: &mut SettingsContent, + get: fn(&mut LanguageSettingsContent) -> &mut Option, + ) -> &mut Option { + let all_languages = &mut settings_content.project.all_languages; + let language_content = if let Some(current_language) = current_language() { + all_languages + .languages + .0 + .entry(current_language) + .or_default() + } else { + &mut all_languages.defaults + }; + return get(language_content); + } + + vec![ + SettingsPageItem::SectionHeader("Indentation"), + SettingsPageItem::SettingItem(SettingItem { + title: "Tab Size", + description: "How many columns a tab should occupy", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.tab_size) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| &mut language.tab_size) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Hard Tabs", + description: "Whether to indent lines using tab characters, as opposed to multiple spaces", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.hard_tabs) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.hard_tabs + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Indent", + description: "Whether indentation should be adjusted based on the context whilst typing", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.auto_indent) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.auto_indent + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Indent On Paste", + description: "Whether indentation of pasted content should be adjusted based on the context", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.auto_indent_on_paste + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.auto_indent_on_paste + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Wrapping"), + SettingsPageItem::SettingItem(SettingItem { + title: "Soft Wrap", + description: "How to soft-wrap long lines of text", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.soft_wrap) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.soft_wrap + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Wrap Guides", + description: "Show wrap guides in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.show_wrap_guides) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.show_wrap_guides + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Preferred Line Length", + description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.preferred_line_length + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.preferred_line_length + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Wrap Guides", + description: "Character counts at which to show wrap guides in the editor", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.wrap_guides) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.wrap_guides + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Allow Rewrap", + description: "Controls where the `editor::Rewrap` action is allowed for this language", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.allow_rewrap) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.allow_rewrap + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Indent Guides"), + SettingsPageItem::SettingItem(SettingItem { + title: "Enabled", + description: "Display indent guides in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(indent_guides) = &language.indent_guides { + &indent_guides.enabled + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.indent_guides.get_or_insert_default().enabled + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Line Width", + description: "The width of the indent guides in pixels, between 1 and 10", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(indent_guides) = &language.indent_guides { + &indent_guides.line_width + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.indent_guides.get_or_insert_default().line_width + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Active Line Width", + description: "The width of the active indent guide in pixels, between 1 and 10", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(indent_guides) = &language.indent_guides { + &indent_guides.active_line_width + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .indent_guides + .get_or_insert_default() + .active_line_width + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Coloring", + description: "Determines how indent guides are colored", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(indent_guides) = &language.indent_guides { + &indent_guides.coloring + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.indent_guides.get_or_insert_default().coloring + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Background Coloring", + description: "Determines how indent guide backgrounds are colored", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(indent_guides) = &language.indent_guides { + &indent_guides.background_coloring + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .indent_guides + .get_or_insert_default() + .background_coloring + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Formatting"), + SettingsPageItem::SettingItem(SettingItem { + title: "Format On Save", + description: "Whether or not to perform a buffer format before saving", + field: Box::new( + // TODO(settings_ui): this setting should just be a bool + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.format_on_save + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.format_on_save + }) + }, + }, + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Remove Trailing Whitespace On Save", + description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.remove_trailing_whitespace_on_save + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.remove_trailing_whitespace_on_save + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Ensure Final Newline On Save", + description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.ensure_final_newline_on_save + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.ensure_final_newline_on_save + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Formatter", + description: "How to perform a buffer format", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.formatter) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.formatter + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Use On Type Format", + description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.use_on_type_format + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.use_on_type_format + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Prettier"), + SettingsPageItem::SettingItem(SettingItem { + title: "Allowed", + description: "Enables or disables formatting with Prettier for a given language", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(prettier) = &language.prettier { + &prettier.allowed + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.prettier.get_or_insert_default().allowed + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Parser", + description: "Forces Prettier integration to use a specific parser name when formatting files with the language", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(prettier) = &language.prettier { + &prettier.parser + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.prettier.get_or_insert_default().parser + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Plugins", + description: "Forces Prettier integration to use specific plugins when formatting files with the language", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(prettier) = &language.prettier { + &prettier.plugins + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.prettier.get_or_insert_default().plugins + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Options", + description: "Default Prettier options, in the format as in package.json section for Prettier", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(prettier) = &language.prettier { + &prettier.options + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.prettier.get_or_insert_default().options + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Autoclose"), + SettingsPageItem::SettingItem(SettingItem { + title: "Use Autoclose", + description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.use_autoclose) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.use_autoclose + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Use Auto Surround", + description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.use_auto_surround + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.use_auto_surround + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Always Treat Brackets As Autoclosed", + description: "Controls whether the closing characters are always skipped over and auto-removed no matter how they were inserted", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.always_treat_brackets_as_autoclosed + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.always_treat_brackets_as_autoclosed + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Jsx Tag Auto Close", + description: "Whether to automatically close JSX tags", + field: Box::new(SettingField { + // TODO(settings_ui): this setting should just be a bool + pick: |settings_content| { + language_settings_field(settings_content, |language| { + match language.jsx_tag_auto_close.as_ref() { + Some(s) => &s.enabled, + None => &None, + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.jsx_tag_auto_close.get_or_insert_default().enabled + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("LSP"), + SettingsPageItem::SettingItem(SettingItem { + title: "Enable Language Server", + description: "Whether to use language servers to provide code intelligence", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.enable_language_server + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.enable_language_server + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Language Servers", + description: "The list of language servers to use (or disable) for this language", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.language_servers + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.language_servers + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Linked Edits", + description: "Whether to perform linked edits of associated ranges, if the LS supports it. For example, when editing opening tag, the contents of the closing tag will be edited as well", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.linked_edits) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.linked_edits + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Go To Definition Fallback", + description: "Whether to follow-up empty go to definition responses from the language server", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.go_to_definition_fallback, + pick_mut: |settings_content| &mut settings_content.editor.go_to_definition_fallback, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("Edit Predictions"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Edit Predictions", + description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.show_edit_predictions + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.show_edit_predictions + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Edit Predictions Disabled In", + description: "Controls whether edit predictions are shown in the given language scopes", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.edit_predictions_disabled_in + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.edit_predictions_disabled_in + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Whitespace"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Whitespaces", + description: "Whether to show tabs and spaces in the editor", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.show_whitespaces) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.show_whitespaces + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Space Whitespace Indicator", + description: "Visible character used to render space characters when show_whitespaces is enabled (default: \"•\")", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(whitespace_map) = &language.whitespace_map { + &whitespace_map.space + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.whitespace_map.get_or_insert_default().space + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Tab Whitespace Indicator", + description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"→\")", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(whitespace_map) = &language.whitespace_map { + &whitespace_map.tab + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.whitespace_map.get_or_insert_default().tab + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Completions"), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Completions On Input", + description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.show_completions_on_input + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.show_completions_on_input + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Completion Documentation", + description: "Whether to display inline and alongside documentation for items in the completions menu", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.show_completion_documentation + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.show_completion_documentation + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Words", + description: "Controls how words are completed", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(completions) = &language.completions { + &completions.words + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.completions.get_or_insert_default().words + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Words Min Length", + description: "How many characters has to be in the completions query to automatically show the words-based completions", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(completions) = &language.completions { + &completions.words_min_length + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .completions + .get_or_insert_default() + .words_min_length + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Lsp", + description: "Whether to fetch LSP completions or not", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(completions) = &language.completions { + &completions.lsp + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.completions.get_or_insert_default().lsp + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Lsp Fetch Timeout Ms", + description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(completions) = &language.completions { + &completions.lsp_fetch_timeout_ms + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .completions + .get_or_insert_default() + .lsp_fetch_timeout_ms + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Lsp Insert Mode", + description: "Controls how LSP completions are inserted", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(completions) = &language.completions { + &completions.lsp_insert_mode + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.completions.get_or_insert_default().lsp_insert_mode + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Inlay Hints"), + SettingsPageItem::SettingItem(SettingItem { + title: "Enabled", + description: "Global switch to toggle hints on and off", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.enabled + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.inlay_hints.get_or_insert_default().enabled + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Value Hints", + description: "Global switch to toggle inline values on and off when debugging", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.show_value_hints + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .inlay_hints + .get_or_insert_default() + .show_value_hints + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Type Hints", + description: "Whether type hints should be shown", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.show_type_hints + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.inlay_hints.get_or_insert_default().show_type_hints + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Parameter Hints", + description: "Whether parameter hints should be shown", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.show_parameter_hints + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .inlay_hints + .get_or_insert_default() + .show_parameter_hints + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Other Hints", + description: "Whether other hints should be shown", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.show_other_hints + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .inlay_hints + .get_or_insert_default() + .show_other_hints + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Background", + description: "Show a background for inlay hints", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.show_background + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.inlay_hints.get_or_insert_default().show_background + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Edit Debounce Ms", + description: "Whether or not to debounce inlay hints updates after buffer edits (set to 0 to disable debouncing)", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.edit_debounce_ms + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .inlay_hints + .get_or_insert_default() + .edit_debounce_ms + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Scroll Debounce Ms", + description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.scroll_debounce_ms + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .inlay_hints + .get_or_insert_default() + .scroll_debounce_ms + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Toggle On Modifiers Press", + description: "Toggles inlay hints (hides or shows) when the user presses the modifiers specified", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(inlay_hints) = &language.inlay_hints { + &inlay_hints.toggle_on_modifiers_press + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language + .inlay_hints + .get_or_insert_default() + .toggle_on_modifiers_press + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Tasks"), + SettingsPageItem::SettingItem(SettingItem { + title: "Enabled", + description: "Whether tasks are enabled for this language", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(tasks) = &language.tasks { + &tasks.enabled + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.tasks.get_or_insert_default().enabled + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Variables", + description: "Extra task variables to set for a particular language", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(tasks) = &language.tasks { + &tasks.variables + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.tasks.get_or_insert_default().variables + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Prefer Lsp", + description: "Use LSP tasks over Zed language extension ones", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + if let Some(tasks) = &language.tasks { + &tasks.prefer_lsp + } else { + &None + } + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.tasks.get_or_insert_default().prefer_lsp + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Miscellaneous"), + SettingsPageItem::SettingItem(SettingItem { + title: "Debuggers", + description: "Preferred debuggers for this language", + field: Box::new( + SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| &language.debuggers) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.debuggers + }) + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Middle Click Paste", + description: "Enable middle-click paste on Linux", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.middle_click_paste, + pick_mut: |settings_content| &mut settings_content.editor.middle_click_paste, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Extend Comment On Newline", + description: "Whether to start a new line with a comment when a previous line is a comment as well", + field: Box::new(SettingField { + pick: |settings_content| { + language_settings_field(settings_content, |language| { + &language.extend_comment_on_newline + }) + }, + pick_mut: |settings_content| { + language_settings_field_mut(settings_content, |language| { + &mut language.extend_comment_on_newline + }) + }, + }), + metadata: None, + files: USER | LOCAL, + }), + ] +} diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index 6d79b838743bb23f1bce7b409360f04929431df6..0ad5cb647e58f70242c593d5cd85fe18bc22a820 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -1,1017 +1,2719 @@ -mod appearance_settings_controls; - -use std::{ - num::NonZeroU32, - ops::{Not, Range}, - rc::Rc, +//! # settings_ui +mod components; +mod page_data; + +use anyhow::Result; +use editor::{Editor, EditorEvent}; +use feature_flags::FeatureFlag; +use fuzzy::StringMatchCandidate; +use gpui::{ + Action, App, Div, Entity, FocusHandle, Focusable, FontWeight, Global, ReadGlobal as _, + ScrollHandle, Stateful, Subscription, Task, TitlebarOptions, UniformListScrollHandle, Window, + WindowBounds, WindowHandle, WindowOptions, actions, div, point, prelude::*, px, size, + uniform_list, }; - -use anyhow::Context as _; -use editor::{Editor, EditorSettingsControls}; -use feature_flags::{FeatureFlag, FeatureFlagAppExt}; -use gpui::{App, Entity, EventEmitter, FocusHandle, Focusable, ReadGlobal, ScrollHandle, actions}; +use heck::ToTitleCase as _; +use project::WorktreeId; +use schemars::JsonSchema; +use serde::Deserialize; use settings::{ - NumType, SettingsStore, SettingsUiEntry, SettingsUiEntryMetaData, SettingsUiItem, - SettingsUiItemDynamicMap, SettingsUiItemGroup, SettingsUiItemSingle, SettingsUiItemUnion, - SettingsValue, + BottomDockLayout, CloseWindowWhenNoItems, CodeFade, CursorShape, OnLastWindowClosed, + RestoreOnStartupBehavior, SaturatingBool, SettingsContent, SettingsStore, }; -use smallvec::SmallVec; +use std::{ + any::{Any, TypeId, type_name}, + cell::RefCell, + collections::HashMap, + num::{NonZero, NonZeroU32}, + ops::Range, + rc::Rc, + sync::{Arc, LazyLock, RwLock}, +}; +use title_bar::platform_title_bar::PlatformTitleBar; use ui::{ - ContextMenu, DropdownMenu, NumericStepper, SwitchField, ToggleButtonGroup, ToggleButtonSimple, + ContextMenu, Divider, DividerColor, DropdownMenu, DropdownStyle, IconButtonShape, KeyBinding, + KeybindingHint, PopoverMenu, Switch, SwitchColor, Tooltip, TreeViewItem, WithScrollbar, prelude::*, }; -use workspace::{ - Workspace, - item::{Item, ItemEvent}, -}; +use ui_input::{NumberField, NumberFieldType}; +use util::{ResultExt as _, paths::PathStyle, rel_path::RelPath}; +use workspace::{OpenOptions, OpenVisible, Workspace, client_side_decorations}; +use zed_actions::OpenSettings; -use crate::appearance_settings_controls::AppearanceSettingsControls; +use crate::components::SettingsEditor; -pub struct SettingsUiFeatureFlag; +const NAVBAR_CONTAINER_TAB_INDEX: isize = 0; +const NAVBAR_GROUP_TAB_INDEX: isize = 1; -impl FeatureFlag for SettingsUiFeatureFlag { - const NAME: &'static str = "settings-ui"; -} +const HEADER_CONTAINER_TAB_INDEX: isize = 2; +const HEADER_GROUP_TAB_INDEX: isize = 3; + +const CONTENT_CONTAINER_TAB_INDEX: isize = 4; +const CONTENT_GROUP_TAB_INDEX: isize = 5; actions!( - zed, + settings_editor, [ - /// Opens settings UI. - OpenSettingsUi + /// Minimizes the settings UI window. + Minimize, + /// Toggles focus between the navbar and the main content. + ToggleFocusNav, + /// Expands the navigation entry. + ExpandNavEntry, + /// Collapses the navigation entry. + CollapseNavEntry, + /// Focuses the next file in the file list. + FocusNextFile, + /// Focuses the previous file in the file list. + FocusPreviousFile, + /// Opens an editor for the current file + OpenCurrentFile, + /// Focuses the previous root navigation entry. + FocusPreviousRootNavEntry, + /// Focuses the next root navigation entry. + FocusNextRootNavEntry, + /// Focuses the first navigation entry. + FocusFirstNavEntry, + /// Focuses the last navigation entry. + FocusLastNavEntry ] ); -pub fn open_settings_editor( - workspace: &mut Workspace, - _: &OpenSettingsUi, - window: &mut Window, - cx: &mut Context, -) { - // todo(settings_ui) open in a local workspace if this is remote. - let existing = workspace - .active_pane() - .read(cx) - .items() - .find_map(|item| item.downcast::()); - - if let Some(existing) = existing { - workspace.activate_item(&existing, true, true, window, cx); - } else { - let settings_page = SettingsPage::new(workspace, cx); - workspace.add_item_to_active_pane(Box::new(settings_page), None, true, window, cx) +#[derive(Action, PartialEq, Eq, Clone, Copy, Debug, JsonSchema, Deserialize)] +#[action(namespace = settings_editor)] +struct FocusFile(pub u32); + +struct SettingField { + pick: fn(&SettingsContent) -> &Option, + pick_mut: fn(&mut SettingsContent) -> &mut Option, +} + +impl Clone for SettingField { + fn clone(&self) -> Self { + *self } } -pub fn init(cx: &mut App) { - cx.observe_new(|workspace: &mut Workspace, _, _| { - workspace.register_action_renderer(|div, _, _, cx| { - let settings_ui_actions = [std::any::TypeId::of::()]; - let has_flag = cx.has_flag::(); - command_palette_hooks::CommandPaletteFilter::update_global(cx, |filter, _| { - if has_flag { - filter.show_action_types(&settings_ui_actions); - } else { - filter.hide_action_types(&settings_ui_actions); - } - }); - if has_flag { - div.on_action(cx.listener(open_settings_editor)) - } else { - div - } - }); - }) - .detach(); +// manual impl because derive puts a Copy bound on T, which is inaccurate in our case +impl Copy for SettingField {} + +/// Helper for unimplemented settings, used in combination with `SettingField::unimplemented` +/// to keep the setting around in the UI with valid pick and pick_mut implementations, but don't actually try to render it. +/// TODO(settings_ui): In non-dev builds (`#[cfg(not(debug_assertions))]`) make this render as edit-in-json +struct UnimplementedSettingField; + +impl SettingField { + /// Helper for settings with types that are not yet implemented. + #[allow(unused)] + fn unimplemented(self) -> SettingField { + SettingField { + pick: |_| &Some(UnimplementedSettingField), + pick_mut: |_| unreachable!(), + } + } } -pub struct SettingsPage { - focus_handle: FocusHandle, - settings_tree: SettingsUiTree, +trait AnySettingField { + fn as_any(&self) -> &dyn Any; + fn type_name(&self) -> &'static str; + fn type_id(&self) -> TypeId; + // Returns the file this value was set in and true, or File::Default and false to indicate it was not found in any file (missing default) + fn file_set_in(&self, file: SettingsUiFile, cx: &App) -> (settings::SettingsFile, bool); } -impl SettingsPage { - pub fn new(_workspace: &Workspace, cx: &mut Context) -> Entity { - cx.new(|cx| Self { - focus_handle: cx.focus_handle(), - settings_tree: SettingsUiTree::new(cx), - }) +impl AnySettingField for SettingField { + fn as_any(&self) -> &dyn Any { + self + } + + fn type_name(&self) -> &'static str { + type_name::() } -} -impl EventEmitter for SettingsPage {} + fn type_id(&self) -> TypeId { + TypeId::of::() + } -impl Focusable for SettingsPage { - fn focus_handle(&self, _cx: &App) -> FocusHandle { - self.focus_handle.clone() + fn file_set_in(&self, file: SettingsUiFile, cx: &App) -> (settings::SettingsFile, bool) { + let (file, value) = cx + .global::() + .get_value_from_file(file.to_settings(), self.pick); + return (file, value.is_some()); } } -impl Item for SettingsPage { - type Event = ItemEvent; +#[derive(Default, Clone)] +struct SettingFieldRenderer { + renderers: Rc< + RefCell< + HashMap< + TypeId, + Box< + dyn Fn( + &SettingsWindow, + &SettingItem, + SettingsUiFile, + Option<&SettingsFieldMetadata>, + &mut Window, + &mut Context, + ) -> Stateful
, + >, + >, + >, + >, +} - fn tab_icon(&self, _window: &Window, _cx: &App) -> Option { - Some(Icon::new(IconName::Settings)) +impl Global for SettingFieldRenderer {} + +impl SettingFieldRenderer { + fn add_basic_renderer( + &mut self, + render_control: impl Fn( + SettingField, + SettingsUiFile, + Option<&SettingsFieldMetadata>, + &mut Window, + &mut App, + ) -> AnyElement + + 'static, + ) -> &mut Self { + self.add_renderer( + move |settings_window: &SettingsWindow, + item: &SettingItem, + field: SettingField, + settings_file: SettingsUiFile, + metadata: Option<&SettingsFieldMetadata>, + window: &mut Window, + cx: &mut Context| { + render_settings_item( + settings_window, + item, + settings_file.clone(), + render_control(field, settings_file, metadata, window, cx), + window, + cx, + ) + }, + ) } - fn tab_content_text(&self, _detail: usize, _cx: &App) -> SharedString { - "Settings".into() + fn add_renderer( + &mut self, + renderer: impl Fn( + &SettingsWindow, + &SettingItem, + SettingField, + SettingsUiFile, + Option<&SettingsFieldMetadata>, + &mut Window, + &mut Context, + ) -> Stateful
+ + 'static, + ) -> &mut Self { + let key = TypeId::of::(); + let renderer = Box::new( + move |settings_window: &SettingsWindow, + item: &SettingItem, + settings_file: SettingsUiFile, + metadata: Option<&SettingsFieldMetadata>, + window: &mut Window, + cx: &mut Context| { + let field = *item + .field + .as_ref() + .as_any() + .downcast_ref::>() + .unwrap(); + renderer( + settings_window, + item, + field, + settings_file, + metadata, + window, + cx, + ) + }, + ); + self.renderers.borrow_mut().insert(key, renderer); + self } +} - fn show_toolbar(&self) -> bool { - false +struct NonFocusableHandle { + handle: FocusHandle, + _subscription: Subscription, +} + +impl NonFocusableHandle { + fn new(tab_index: isize, tab_stop: bool, window: &mut Window, cx: &mut App) -> Entity { + let handle = cx.focus_handle().tab_index(tab_index).tab_stop(tab_stop); + Self::from_handle(handle, window, cx) } - fn to_item_events(event: &Self::Event, mut f: impl FnMut(ItemEvent)) { - f(*event) + fn from_handle(handle: FocusHandle, window: &mut Window, cx: &mut App) -> Entity { + cx.new(|cx| { + let _subscription = cx.on_focus(&handle, window, { + move |_, window, _| { + window.focus_next(); + } + }); + Self { + handle, + _subscription, + } + }) } } -// We want to iterate over the side bar with root groups -// - this is a loop over top level groups, and if any are expanded, recursively displaying their items -// - Should be able to get all items from a group (flatten a group) -// - Should be able to toggle/untoggle groups in UI (at least in sidebar) -// - Search should be available -// - there should be an index of text -> item mappings, for using fuzzy::match -// - Do we want to show the parent groups when a item is matched? +impl Focusable for NonFocusableHandle { + fn focus_handle(&self, _: &App) -> FocusHandle { + self.handle.clone() + } +} -struct UiEntry { - title: SharedString, - path: Option, - documentation: Option, - _depth: usize, - // a - // b < a descendant range < a total descendant range - // f | | - // g | | - // c < | - // d | - // e < - descendant_range: Range, - total_descendant_range: Range, - next_sibling: Option, - // expanded: bool, - render: Option, - dynamic_render: Option, - generate_items: Option<( - SettingsUiItem, - fn(&serde_json::Value, &App) -> Vec, - SmallVec<[SharedString; 1]>, - )>, +struct SettingsFieldMetadata { + placeholder: Option<&'static str>, } -impl UiEntry { - fn first_descendant_index(&self) -> Option { - return self - .descendant_range - .is_empty() - .not() - .then_some(self.descendant_range.start); - } +pub struct SettingsUiFeatureFlag; - fn nth_descendant_index(&self, tree: &[UiEntry], n: usize) -> Option { - let first_descendant_index = self.first_descendant_index()?; - let mut current_index = 0; - let mut current_descendant_index = Some(first_descendant_index); - while let Some(descendant_index) = current_descendant_index - && current_index < n - { - current_index += 1; - current_descendant_index = tree[descendant_index].next_sibling; - } - current_descendant_index - } +impl FeatureFlag for SettingsUiFeatureFlag { + const NAME: &'static str = "settings-ui"; +} + +pub fn init(cx: &mut App) { + init_renderers(cx); + + cx.observe_new(|workspace: &mut workspace::Workspace, _, _| { + workspace.register_action(|workspace, _: &OpenSettings, window, cx| { + let window_handle = window + .window_handle() + .downcast::() + .expect("Workspaces are root Windows"); + open_settings_editor(workspace, window_handle, cx); + }); + }) + .detach(); } -pub struct SettingsUiTree { - root_entry_indices: Vec, - entries: Vec, - active_entry_index: usize, +fn init_renderers(cx: &mut App) { + cx.default_global::() + .add_basic_renderer::(|_, _, _, _, _| { + Button::new("open-in-settings-file", "Edit in settings.json") + .style(ButtonStyle::Outlined) + .size(ButtonSize::Medium) + .tab_index(0_isize) + .on_click(|_, window, cx| { + window.dispatch_action(Box::new(OpenCurrentFile), cx); + }) + .into_any_element() + }) + .add_basic_renderer::(render_toggle_button) + .add_basic_renderer::(render_text_field) + .add_basic_renderer::(render_toggle_button) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_font_picker) + // todo(settings_ui): This needs custom ui + // .add_renderer::(|settings_field, file, _, window, cx| { + // // todo(settings_ui): Do we want to expose the custom variant of buffer line height? + // // right now there's a manual impl of strum::VariantArray + // render_dropdown(*settings_field, file, window, cx) + // }) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_number_field) + .add_basic_renderer::(render_number_field) + .add_basic_renderer::(render_number_field) + .add_basic_renderer::(render_number_field) + .add_basic_renderer::>(render_number_field) + .add_basic_renderer::(render_number_field) + .add_basic_renderer::(render_number_field) + .add_basic_renderer::(render_number_field) + .add_basic_renderer::(render_number_field) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown) + .add_basic_renderer::(render_dropdown); + // .add_renderer::(|settings_field, file, _, window, cx| { + // render_dropdown(*settings_field, file, window, cx) + // }); } -fn build_tree_item( - tree: &mut Vec, - entry: SettingsUiEntry, - depth: usize, - prev_index: Option, +pub fn open_settings_editor( + _workspace: &mut Workspace, + workspace_handle: WindowHandle, + cx: &mut App, ) { - // let tree: HashMap; - let index = tree.len(); - tree.push(UiEntry { - title: entry.title.into(), - path: entry.path.map(SharedString::new_static), - documentation: entry.documentation.map(SharedString::new_static), - _depth: depth, - descendant_range: index + 1..index + 1, - total_descendant_range: index + 1..index + 1, - render: None, - next_sibling: None, - dynamic_render: None, - generate_items: None, - }); - if let Some(prev_index) = prev_index { - tree[prev_index].next_sibling = Some(index); - } - match entry.item { - SettingsUiItem::Group(SettingsUiItemGroup { items: group_items }) => { - for group_item in group_items { - let prev_index = tree[index] - .descendant_range - .is_empty() - .not() - .then_some(tree[index].descendant_range.end - 1); - tree[index].descendant_range.end = tree.len() + 1; - build_tree_item(tree, group_item, depth + 1, prev_index); - tree[index].total_descendant_range.end = tree.len(); - } - } - SettingsUiItem::Single(item) => { - tree[index].render = Some(item); - } - SettingsUiItem::Union(dynamic_render) => { - // todo(settings_ui) take from item and store other fields instead of clone - // will also require replacing usage in render_recursive so it can know - // which options were actually rendered - let options = dynamic_render.options.clone(); - tree[index].dynamic_render = Some(dynamic_render); - for option in options { - let Some(option) = option else { continue }; - let prev_index = tree[index] - .descendant_range - .is_empty() - .not() - .then_some(tree[index].descendant_range.end - 1); - tree[index].descendant_range.end = tree.len() + 1; - build_tree_item(tree, option, depth + 1, prev_index); - tree[index].total_descendant_range.end = tree.len(); - } - } - SettingsUiItem::DynamicMap(SettingsUiItemDynamicMap { - item: generate_settings_ui_item, - determine_items, - defaults_path, - }) => { - tree[index].generate_items = Some(( - generate_settings_ui_item(), - determine_items, - defaults_path - .into_iter() - .copied() - .map(SharedString::new_static) - .collect(), - )); - } - SettingsUiItem::None => { - return; - } + let existing_window = cx + .windows() + .into_iter() + .find_map(|window| window.downcast::()); + + if let Some(existing_window) = existing_window { + existing_window + .update(cx, |settings_window, window, _| { + settings_window.original_window = Some(workspace_handle); + window.activate_window(); + }) + .ok(); + return; } + + // We have to defer this to get the workspace off the stack. + + cx.defer(move |cx| { + cx.open_window( + WindowOptions { + titlebar: Some(TitlebarOptions { + title: Some("Settings Window".into()), + appears_transparent: true, + traffic_light_position: Some(point(px(12.0), px(12.0))), + }), + focus: true, + show: true, + is_movable: true, + kind: gpui::WindowKind::Floating, + window_background: cx.theme().window_background_appearance(), + window_min_size: Some(size(px(900.), px(750.))), // 4:3 Aspect Ratio + window_bounds: Some(WindowBounds::centered(size(px(900.), px(750.)), cx)), + ..Default::default() + }, + |window, cx| cx.new(|cx| SettingsWindow::new(Some(workspace_handle), window, cx)), + ) + .log_err(); + }); } -impl SettingsUiTree { - pub fn new(cx: &App) -> Self { - let settings_store = SettingsStore::global(cx); - let mut tree = vec![]; - let mut root_entry_indices = vec![]; - for item in settings_store.settings_ui_items() { - if matches!(item.item, SettingsUiItem::None) - // todo(settings_ui): How to handle top level single items? BaseKeymap is in this category. Probably need a way to - // link them to other groups - || matches!(item.item, SettingsUiItem::Single(_)) - { - continue; - } +/// The current sub page path that is selected. +/// If this is empty the selected page is rendered, +/// otherwise the last sub page gets rendered. +/// +/// Global so that `pick` and `pick_mut` callbacks can access it +/// and use it to dynamically render sub pages (e.g. for language settings) +static SUB_PAGE_STACK: LazyLock>> = LazyLock::new(|| RwLock::new(Vec::new())); + +fn sub_page_stack() -> std::sync::RwLockReadGuard<'static, Vec> { + SUB_PAGE_STACK + .read() + .expect("SUB_PAGE_STACK is never poisoned") +} - let prev_root_entry_index = root_entry_indices.last().copied(); - root_entry_indices.push(tree.len()); - build_tree_item(&mut tree, item, 0, prev_root_entry_index); - } +fn sub_page_stack_mut() -> std::sync::RwLockWriteGuard<'static, Vec> { + SUB_PAGE_STACK + .write() + .expect("SUB_PAGE_STACK is never poisoned") +} - root_entry_indices.sort_by_key(|i| &tree[*i].title); +pub struct SettingsWindow { + title_bar: Option>, + original_window: Option>, + files: Vec<(SettingsUiFile, FocusHandle)>, + worktree_root_dirs: HashMap, + current_file: SettingsUiFile, + pages: Vec, + search_bar: Entity, + search_task: Option>, + /// Index into navbar_entries + navbar_entry: usize, + navbar_entries: Vec, + navbar_scroll_handle: UniformListScrollHandle, + /// [page_index][page_item_index] will be false + /// when the item is filtered out either by searches + /// or by the current file + filter_table: Vec>, + has_query: bool, + content_handles: Vec>>, + page_scroll_handle: ScrollHandle, + focus_handle: FocusHandle, + navbar_focus_handle: Entity, + content_focus_handle: Entity, + files_focus_handle: FocusHandle, + search_index: Option>, +} - let active_entry_index = root_entry_indices[0]; - Self { - entries: tree, - root_entry_indices, - active_entry_index, - } - } +struct SearchIndex { + bm25_engine: bm25::SearchEngine, + fuzzy_match_candidates: Vec, + key_lut: Vec, +} - // todo(settings_ui): Make sure `Item::None` paths are added to the paths tree, - // so that we can keep none/skip and still test in CI that all settings have - #[cfg(feature = "test-support")] - pub fn all_paths(&self, cx: &App) -> Vec> { - fn all_paths_rec( - tree: &[UiEntry], - paths: &mut Vec>, - current_path: &mut Vec, - idx: usize, - cx: &App, - ) { - let child = &tree[idx]; - let mut pushed_path = false; - if let Some(path) = child.path.as_ref() { - current_path.push(path.clone()); - paths.push(current_path.clone()); - pushed_path = true; - } - // todo(settings_ui): handle dynamic nodes here - let selected_descendant_index = child - .dynamic_render - .as_ref() - .map(|dynamic_render| { - read_settings_value_from_path( - SettingsStore::global(cx).raw_default_settings(), - ¤t_path, - ) - .map(|value| (dynamic_render.determine_option)(value, cx)) - }) - .and_then(|selected_descendant_index| { - selected_descendant_index.map(|index| child.nth_descendant_index(tree, index)) - }); +struct SearchItemKey { + page_index: usize, + header_index: usize, + item_index: usize, +} - if let Some(selected_descendant_index) = selected_descendant_index { - // just silently fail if we didn't find a setting value for the path - if let Some(descendant_index) = selected_descendant_index { - all_paths_rec(tree, paths, current_path, descendant_index, cx); - } - } else if let Some(desc_idx) = child.first_descendant_index() { - let mut desc_idx = Some(desc_idx); - while let Some(descendant_index) = desc_idx { - all_paths_rec(&tree, paths, current_path, descendant_index, cx); - desc_idx = tree[descendant_index].next_sibling; - } +struct SubPage { + link: SubPageLink, + section_header: &'static str, +} + +#[derive(Debug)] +struct NavBarEntry { + title: &'static str, + is_root: bool, + expanded: bool, + page_index: usize, + item_index: Option, + focus_handle: FocusHandle, +} + +struct SettingsPage { + title: &'static str, + items: Vec, +} + +#[derive(PartialEq)] +enum SettingsPageItem { + SectionHeader(&'static str), + SettingItem(SettingItem), + SubPageLink(SubPageLink), +} + +impl std::fmt::Debug for SettingsPageItem { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + SettingsPageItem::SectionHeader(header) => write!(f, "SectionHeader({})", header), + SettingsPageItem::SettingItem(setting_item) => { + write!(f, "SettingItem({})", setting_item.title) } - if pushed_path { - current_path.pop(); + SettingsPageItem::SubPageLink(sub_page_link) => { + write!(f, "SubPageLink({})", sub_page_link.title) } } + } +} + +impl SettingsPageItem { + fn render( + &self, + settings_window: &SettingsWindow, + section_header: &'static str, + is_last: bool, + window: &mut Window, + cx: &mut Context, + ) -> AnyElement { + let file = settings_window.current_file.clone(); + match self { + SettingsPageItem::SectionHeader(header) => v_flex() + .w_full() + .gap_1p5() + .child( + Label::new(SharedString::new_static(header)) + .size(LabelSize::Small) + .color(Color::Muted) + .buffer_font(cx), + ) + .child(Divider::horizontal().color(DividerColor::BorderFaded)) + .into_any_element(), + SettingsPageItem::SettingItem(setting_item) => { + let renderer = cx.default_global::().clone(); + let (_, found) = setting_item.field.file_set_in(file.clone(), cx); + + let renderers = renderer.renderers.borrow(); + let field_renderer = + renderers.get(&AnySettingField::type_id(setting_item.field.as_ref())); + let field_renderer_or_warning = + field_renderer.ok_or("NO RENDERER").and_then(|renderer| { + if cfg!(debug_assertions) && !found { + Err("NO DEFAULT") + } else { + Ok(renderer) + } + }); + + let field = match field_renderer_or_warning { + Ok(field_renderer) => field_renderer( + settings_window, + setting_item, + file, + setting_item.metadata.as_deref(), + window, + cx, + ), + Err(warning) => render_settings_item( + settings_window, + setting_item, + file, + Button::new("error-warning", warning) + .style(ButtonStyle::Outlined) + .size(ButtonSize::Medium) + .icon(Some(IconName::Debug)) + .icon_position(IconPosition::Start) + .icon_color(Color::Error) + .tab_index(0_isize) + .tooltip(Tooltip::text(setting_item.field.type_name())) + .into_any_element(), + window, + cx, + ), + }; - let mut paths = Vec::new(); - for &index in &self.root_entry_indices { - all_paths_rec(&self.entries, &mut paths, &mut Vec::new(), index, cx); + field + .pt_4() + .map(|this| { + if is_last { + this.pb_10() + } else { + this.pb_4() + .border_b_1() + .border_color(cx.theme().colors().border_variant) + } + }) + .into_any_element() + } + SettingsPageItem::SubPageLink(sub_page_link) => h_flex() + .id(sub_page_link.title) + .w_full() + .min_w_0() + .gap_2() + .justify_between() + .pt_4() + .when(!is_last, |this| { + this.pb_4() + .border_b_1() + .border_color(cx.theme().colors().border_variant) + }) + .child( + v_flex() + .w_full() + .max_w_1_2() + .child(Label::new(SharedString::new_static(sub_page_link.title))), + ) + .child( + Button::new(("sub-page".into(), sub_page_link.title), "Configure") + .icon(IconName::ChevronRight) + .tab_index(0_isize) + .icon_position(IconPosition::End) + .icon_color(Color::Muted) + .icon_size(IconSize::Small) + .style(ButtonStyle::Outlined) + .size(ButtonSize::Medium), + ) + .on_click({ + let sub_page_link = sub_page_link.clone(); + cx.listener(move |this, _, _, cx| { + this.push_sub_page(sub_page_link.clone(), section_header, cx) + }) + }) + .into_any_element(), } - paths } } -fn render_nav(tree: &SettingsUiTree, _window: &mut Window, cx: &mut Context) -> Div { - let mut nav = v_flex().p_4().gap_2(); - for &index in &tree.root_entry_indices { - nav = nav.child( - div() - .id(index) - .on_click(cx.listener(move |settings, _, _, _| { - settings.settings_tree.active_entry_index = index; - })) +fn render_settings_item( + settings_window: &SettingsWindow, + setting_item: &SettingItem, + file: SettingsUiFile, + control: AnyElement, + _window: &mut Window, + cx: &mut Context<'_, SettingsWindow>, +) -> Stateful
{ + let (found_in_file, _) = setting_item.field.file_set_in(file.clone(), cx); + let file_set_in = SettingsUiFile::from_settings(found_in_file); + + h_flex() + .id(setting_item.title) + .min_w_0() + .gap_2() + .justify_between() + .child( + v_flex() + .w_1_2() .child( - Label::new(tree.entries[index].title.clone()) - .size(LabelSize::Large) - .when(tree.active_entry_index == index, |this| { - this.color(Color::Selected) - }), + h_flex() + .w_full() + .gap_1() + .child(Label::new(SharedString::new_static(setting_item.title))) + .when_some( + file_set_in.filter(|file_set_in| file_set_in != &file), + |this, file_set_in| { + this.child( + Label::new(format!( + "— set in {}", + settings_window + .display_name(&file_set_in) + .expect("File name should exist") + )) + .color(Color::Muted) + .size(LabelSize::Small), + ) + }, + ), + ) + .child( + Label::new(SharedString::new_static(setting_item.description)) + .size(LabelSize::Small) + .color(Color::Muted), ), - ); - } - nav + ) + .child(control) } -fn render_content( - tree: &SettingsUiTree, - window: &mut Window, - cx: &mut Context, -) -> Div { - let content = v_flex().size_full().gap_4(); - - let mut path = smallvec::smallvec![]; - - return render_recursive( - &tree.entries, - tree.active_entry_index, - &mut path, - content, - &mut None, - true, - window, - cx, - ); +struct SettingItem { + title: &'static str, + description: &'static str, + field: Box, + metadata: Option>, + files: FileMask, } -fn render_recursive( - tree: &[UiEntry], - index: usize, - path: &mut SmallVec<[SharedString; 1]>, - mut element: Div, - fallback_path: &mut Option>, - render_next_title: bool, - window: &mut Window, - cx: &mut App, -) -> Div { - let Some(child) = tree.get(index) else { - return element - .child(Label::new(SharedString::new_static("No settings found")).color(Color::Error)); - }; +#[derive(PartialEq, Eq, Clone, Copy)] +struct FileMask(u8); - if render_next_title { - element = element.child(Label::new(child.title.clone()).size(LabelSize::Large)); - } +impl std::fmt::Debug for FileMask { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "FileMask(")?; + let mut items = vec![]; - // todo(settings_ui): subgroups? - let mut pushed_path = false; - if let Some(child_path) = child.path.as_ref() { - path.push(child_path.clone()); - if let Some(fallback_path) = fallback_path.as_mut() { - fallback_path.push(child_path.clone()); - } - pushed_path = true; - } - let settings_value = settings_value_from_settings_and_path( - path.clone(), - fallback_path.as_ref().map(|path| path.as_slice()), - child.title.clone(), - child.documentation.clone(), - // PERF: how to structure this better? There feels like there's a way to avoid the clone - // and every value lookup - SettingsStore::global(cx).raw_user_settings(), - SettingsStore::global(cx).raw_default_settings(), - ); - if let Some(dynamic_render) = child.dynamic_render.as_ref() { - let value = settings_value.read(); - let selected_index = (dynamic_render.determine_option)(value, cx); - element = element.child(div().child(render_toggle_button_group_inner( - settings_value.title.clone(), - dynamic_render.labels, - Some(selected_index), - { - let path = settings_value.path.clone(); - let defaults = dynamic_render.defaults.clone(); - move |idx, cx| { - if idx == selected_index { - return; - } - let default = defaults.get(idx).cloned().unwrap_or_default(); - SettingsValue::write_value(&path, default, cx); - } - }, - ))); - // we don't add descendants for unit options, so we adjust the selected index - // by the number of options we didn't add descendants for, to get the descendant index - let selected_descendant_index = selected_index - - dynamic_render.options[..selected_index] - .iter() - .filter(|option| option.is_none()) - .count(); - if dynamic_render.options[selected_index].is_some() - && let Some(descendant_index) = - child.nth_descendant_index(tree, selected_descendant_index) - { - element = render_recursive( - tree, - descendant_index, - path, - element, - fallback_path, - false, - window, - cx, - ); + if self.contains(USER) { + items.push("USER"); } - } else if let Some((settings_ui_item, generate_items, defaults_path)) = - child.generate_items.as_ref() - { - let generated_items = generate_items(settings_value.read(), cx); - let mut ui_items = Vec::with_capacity(generated_items.len()); - for item in generated_items { - let settings_ui_entry = SettingsUiEntry { - path: None, - title: "", - documentation: None, - item: settings_ui_item.clone(), - }; - let prev_index = if ui_items.is_empty() { - None - } else { - Some(ui_items.len() - 1) - }; - let item_index = ui_items.len(); - build_tree_item( - &mut ui_items, - settings_ui_entry, - child._depth + 1, - prev_index, - ); - if item_index < ui_items.len() { - ui_items[item_index].path = None; - ui_items[item_index].title = item.title.clone(); - ui_items[item_index].documentation = item.documentation.clone(); - - // push path instead of setting path on ui item so that the path isn't pushed to default_path as well - // when we recurse - path.push(item.path.clone()); - element = render_recursive( - &ui_items, - item_index, - path, - element, - &mut Some(defaults_path.clone()), - true, - window, - cx, - ); - path.pop(); - } + if self.contains(LOCAL) { + items.push("LOCAL"); } - } else if let Some(child_render) = child.render.as_ref() { - element = element.child(div().child(render_item_single( - settings_value, - child_render, - window, - cx, - ))); - } else if let Some(child_index) = child.first_descendant_index() { - let mut index = Some(child_index); - while let Some(sub_child_index) = index { - element = render_recursive( - tree, - sub_child_index, - path, - element, - fallback_path, - true, - window, - cx, - ); - index = tree[sub_child_index].next_sibling; + if self.contains(SERVER) { + items.push("SERVER"); } - } else { - element = element.child(div().child(Label::new("// skipped (for now)").color(Color::Muted))) - } - if pushed_path { - path.pop(); - if let Some(fallback_path) = fallback_path.as_mut() { - fallback_path.pop(); - } + write!(f, "{})", items.join(" | ")) } - return element; } -impl Render for SettingsPage { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - let scroll_handle = window.use_state(cx, |_, _| ScrollHandle::new()); - div() - .grid() - .grid_cols(16) - .p_4() - .bg(cx.theme().colors().editor_background) - .size_full() - .child( - div() - .id("settings-ui-nav") - .col_span(2) - .h_full() - .child(render_nav(&self.settings_tree, window, cx)), - ) - .child( - div().col_span(6).h_full().child( - render_content(&self.settings_tree, window, cx) - .id("settings-ui-content") - .track_scroll(scroll_handle.read(cx)) - .overflow_y_scroll(), - ), - ) +const USER: FileMask = FileMask(1 << 0); +const LOCAL: FileMask = FileMask(1 << 2); +const SERVER: FileMask = FileMask(1 << 3); + +impl std::ops::BitAnd for FileMask { + type Output = Self; + + fn bitand(self, other: Self) -> Self { + Self(self.0 & other.0) } } -// todo(settings_ui): remove, only here as inspiration -#[allow(dead_code)] -fn render_old_appearance_settings(cx: &mut App) -> impl IntoElement { - v_flex() - .p_4() - .size_full() - .gap_4() - .child(Label::new("Settings").size(LabelSize::Large)) - .child( - v_flex().gap_1().child(Label::new("Appearance")).child( - v_flex() - .elevation_2(cx) - .child(AppearanceSettingsControls::new()), - ), - ) - .child( - v_flex().gap_1().child(Label::new("Editor")).child( - v_flex() - .elevation_2(cx) - .child(EditorSettingsControls::new()), - ), - ) +impl std::ops::BitOr for FileMask { + type Output = Self; + + fn bitor(self, other: Self) -> Self { + Self(self.0 | other.0) + } } -fn element_id_from_path(path: &[SharedString]) -> ElementId { - if path.len() == 0 { - panic!("Path length must not be zero"); - } else if path.len() == 1 { - ElementId::Name(path[0].clone()) - } else { - ElementId::from(( - ElementId::from(path[path.len() - 2].clone()), - path[path.len() - 1].clone(), - )) +impl FileMask { + fn contains(&self, other: FileMask) -> bool { + self.0 & other.0 != 0 } } -fn render_item_single( - settings_value: SettingsValue, - item: &SettingsUiItemSingle, - window: &mut Window, - cx: &mut App, -) -> AnyElement { - match item { - SettingsUiItemSingle::Custom(_) => div() - .child(format!("Item: {}", settings_value.path.join("."))) - .into_any_element(), - SettingsUiItemSingle::SwitchField => { - render_any_item(settings_value, render_switch_field, window, cx) - } - SettingsUiItemSingle::NumericStepper(num_type) => { - render_any_numeric_stepper(settings_value, *num_type, window, cx) - } - SettingsUiItemSingle::ToggleGroup { - variants: values, - labels: titles, - } => render_toggle_button_group(settings_value, values, titles, window, cx), - SettingsUiItemSingle::DropDown { variants, labels } => { - render_dropdown(settings_value, variants, labels, window, cx) - } - SettingsUiItemSingle::TextField => render_text_field(settings_value, window, cx), - } -} - -pub fn read_settings_value_from_path<'a>( - settings_contents: &'a serde_json::Value, - path: &[impl AsRef], -) -> Option<&'a serde_json::Value> { - // todo(settings_ui) make non recursive, and move to `settings` alongside SettingsValue, and add method to SettingsValue to get nested - let Some((key, remaining)) = path.split_first() else { - return Some(settings_contents); - }; - let Some(value) = settings_contents.get(key.as_ref()) else { - return None; - }; +impl PartialEq for SettingItem { + fn eq(&self, other: &Self) -> bool { + self.title == other.title + && self.description == other.description + && (match (&self.metadata, &other.metadata) { + (None, None) => true, + (Some(m1), Some(m2)) => m1.placeholder == m2.placeholder, + _ => false, + }) + } +} - read_settings_value_from_path(value, remaining) +#[derive(Clone)] +struct SubPageLink { + title: &'static str, + files: FileMask, + render: Arc< + dyn Fn(&mut SettingsWindow, &mut Window, &mut Context) -> AnyElement + + 'static + + Send + + Sync, + >, } -fn downcast_any_item( - settings_value: SettingsValue, -) -> SettingsValue { - let value = settings_value.value.map(|value| { - serde_json::from_value::(value.clone()) - .with_context(|| format!("path: {:?}", settings_value.path.join("."))) - .with_context(|| format!("value is not a {}: {}", std::any::type_name::(), value)) - .unwrap() - }); - // todo(settings_ui) Create test that constructs UI tree, and asserts that all elements have default values - let default_value = serde_json::from_value::(settings_value.default_value) - .with_context(|| format!("path: {:?}", settings_value.path.join("."))) - .with_context(|| format!("value is not a {}", std::any::type_name::())) - .unwrap(); - let deserialized_setting_value = SettingsValue { - title: settings_value.title, - path: settings_value.path, - documentation: settings_value.documentation, - value, - default_value, - }; - deserialized_setting_value +impl PartialEq for SubPageLink { + fn eq(&self, other: &Self) -> bool { + self.title == other.title + } } -fn render_any_item( - settings_value: SettingsValue, - render_fn: impl Fn(SettingsValue, &mut Window, &mut App) -> AnyElement + 'static, - window: &mut Window, - cx: &mut App, -) -> AnyElement { - let deserialized_setting_value = downcast_any_item(settings_value); - render_fn(deserialized_setting_value, window, cx) +#[allow(unused)] +#[derive(Clone, PartialEq)] +enum SettingsUiFile { + User, // Uses all settings. + Project((WorktreeId, Arc)), // Has a special name, and special set of settings + Server(&'static str), // Uses a special name, and the user settings } -fn render_any_numeric_stepper( - settings_value: SettingsValue, - num_type: NumType, - window: &mut Window, - cx: &mut App, -) -> AnyElement { - match num_type { - NumType::U64 => render_numeric_stepper::( - downcast_any_item(settings_value), - |n| u64::saturating_sub(n, 1), - |n| u64::saturating_add(n, 1), - |n| { - serde_json::Number::try_from(n) - .context("Failed to convert u64 to serde_json::Number") - }, - window, - cx, - ), - NumType::U32 => render_numeric_stepper::( - downcast_any_item(settings_value), - |n| u32::saturating_sub(n, 1), - |n| u32::saturating_add(n, 1), - |n| { - serde_json::Number::try_from(n) - .context("Failed to convert u32 to serde_json::Number") - }, - window, - cx, - ), - NumType::F32 => render_numeric_stepper::( - downcast_any_item(settings_value), - |a| a - 1.0, - |a| a + 1.0, - |n| { - serde_json::Number::from_f64(n as f64) - .context("Failed to convert f32 to serde_json::Number") - }, - window, - cx, - ), - NumType::USIZE => render_numeric_stepper::( - downcast_any_item(settings_value), - |n| usize::saturating_sub(n, 1), - |n| usize::saturating_add(n, 1), - |n| { - serde_json::Number::try_from(n) - .context("Failed to convert usize to serde_json::Number") - }, - window, - cx, - ), - NumType::U32NONZERO => render_numeric_stepper::( - downcast_any_item(settings_value), - |a| NonZeroU32::new(u32::saturating_sub(a.get(), 1)).unwrap_or(NonZeroU32::MIN), - |a| NonZeroU32::new(u32::saturating_add(a.get(), 1)).unwrap_or(NonZeroU32::MAX), - |n| { - serde_json::Number::try_from(n.get()) - .context("Failed to convert usize to serde_json::Number") - }, - window, - cx, - ), +impl SettingsUiFile { + fn is_server(&self) -> bool { + matches!(self, SettingsUiFile::Server(_)) + } + + fn worktree_id(&self) -> Option { + match self { + SettingsUiFile::User => None, + SettingsUiFile::Project((worktree_id, _)) => Some(*worktree_id), + SettingsUiFile::Server(_) => None, + } + } + + fn from_settings(file: settings::SettingsFile) -> Option { + Some(match file { + settings::SettingsFile::User => SettingsUiFile::User, + settings::SettingsFile::Project(location) => SettingsUiFile::Project(location), + settings::SettingsFile::Server => SettingsUiFile::Server("todo: server name"), + settings::SettingsFile::Default => return None, + }) + } + + fn to_settings(&self) -> settings::SettingsFile { + match self { + SettingsUiFile::User => settings::SettingsFile::User, + SettingsUiFile::Project(location) => settings::SettingsFile::Project(location.clone()), + SettingsUiFile::Server(_) => settings::SettingsFile::Server, + } + } + + fn mask(&self) -> FileMask { + match self { + SettingsUiFile::User => USER, + SettingsUiFile::Project(_) => LOCAL, + SettingsUiFile::Server(_) => SERVER, + } } } -fn render_numeric_stepper( - value: SettingsValue, - saturating_sub_1: fn(T) -> T, - saturating_add_1: fn(T) -> T, - to_serde_number: fn(T) -> anyhow::Result, - _window: &mut Window, - _cx: &mut App, -) -> AnyElement { - let id = element_id_from_path(&value.path); - let path = value.path.clone(); - let num = *value.read(); +impl SettingsWindow { + pub fn new( + original_window: Option>, + window: &mut Window, + cx: &mut Context, + ) -> Self { + let font_family_cache = theme::FontFamilyCache::global(cx); + + cx.spawn(async move |this, cx| { + font_family_cache.prefetch(cx).await; + this.update(cx, |_, cx| { + cx.notify(); + }) + }) + .detach(); - NumericStepper::new( - id, - num.to_string(), - { - let path = value.path; - move |_, _, cx| { - let Some(number) = to_serde_number(saturating_sub_1(num)).ok() else { - return; - }; - let new_value = serde_json::Value::Number(number); - SettingsValue::write_value(&path, new_value, cx); - } - }, - move |_, _, cx| { - let Some(number) = to_serde_number(saturating_add_1(num)).ok() else { + let current_file = SettingsUiFile::User; + let search_bar = cx.new(|cx| { + let mut editor = Editor::single_line(window, cx); + editor.set_placeholder_text("Search settings…", window, cx); + editor + }); + + cx.subscribe(&search_bar, |this, _, event: &EditorEvent, cx| { + let EditorEvent::Edited { transaction_id: _ } = event else { return; }; - let new_value = serde_json::Value::Number(number); + this.update_matches(cx); + }) + .detach(); - SettingsValue::write_value(&path, new_value, cx); - }, - ) - .style(ui::NumericStepperStyle::Outlined) - .into_any_element() -} + cx.observe_global_in::(window, move |this, window, cx| { + this.fetch_files(window, cx); + cx.notify(); + }) + .detach(); -fn render_switch_field( - value: SettingsValue, - _window: &mut Window, - _cx: &mut App, -) -> AnyElement { - let id = element_id_from_path(&value.path); - let path = value.path.clone(); - SwitchField::new( - id, - value.title.clone(), - value.documentation.clone(), - match value.read() { - true => ToggleState::Selected, - false => ToggleState::Unselected, - }, - move |toggle_state, _, cx| { - let new_value = serde_json::Value::Bool(match toggle_state { - ToggleState::Indeterminate => { - return; + let title_bar = if !cfg!(target_os = "macos") { + Some(cx.new(|cx| PlatformTitleBar::new("settings-title-bar", cx))) + } else { + None + }; + + let mut this = Self { + title_bar, + original_window, + worktree_root_dirs: HashMap::default(), + files: vec![], + current_file: current_file, + pages: vec![], + navbar_entries: vec![], + navbar_entry: 0, + navbar_scroll_handle: UniformListScrollHandle::default(), + search_bar, + search_task: None, + filter_table: vec![], + has_query: false, + content_handles: vec![], + page_scroll_handle: ScrollHandle::new(), + focus_handle: cx.focus_handle(), + navbar_focus_handle: NonFocusableHandle::new( + NAVBAR_CONTAINER_TAB_INDEX, + false, + window, + cx, + ), + content_focus_handle: NonFocusableHandle::new( + CONTENT_CONTAINER_TAB_INDEX, + false, + window, + cx, + ), + files_focus_handle: cx + .focus_handle() + .tab_index(HEADER_CONTAINER_TAB_INDEX) + .tab_stop(false), + search_index: None, + }; + + this.fetch_files(window, cx); + this.build_ui(window, cx); + this.build_search_index(); + + this.search_bar.update(cx, |editor, cx| { + editor.focus_handle(cx).focus(window); + }); + + this + } + + fn toggle_navbar_entry(&mut self, nav_entry_index: usize) { + // We can only toggle root entries + if !self.navbar_entries[nav_entry_index].is_root { + return; + } + + let expanded = &mut self.navbar_entries[nav_entry_index].expanded; + *expanded = !*expanded; + let expanded = *expanded; + + let toggle_page_index = self.page_index_from_navbar_index(nav_entry_index); + let selected_page_index = self.page_index_from_navbar_index(self.navbar_entry); + // if currently selected page is a child of the parent page we are folding, + // set the current page to the parent page + if !expanded && selected_page_index == toggle_page_index { + self.navbar_entry = nav_entry_index; + // note: not opening page. Toggling does not change content just selected page + } + } + + fn build_navbar(&mut self, cx: &App) { + let mut navbar_entries = Vec::with_capacity(self.navbar_entries.len()); + for (page_index, page) in self.pages.iter().enumerate() { + navbar_entries.push(NavBarEntry { + title: page.title, + is_root: true, + expanded: false, + page_index, + item_index: None, + focus_handle: cx.focus_handle().tab_index(0).tab_stop(true), + }); + + for (item_index, item) in page.items.iter().enumerate() { + let SettingsPageItem::SectionHeader(title) = item else { + continue; + }; + navbar_entries.push(NavBarEntry { + title, + is_root: false, + expanded: false, + page_index, + item_index: Some(item_index), + focus_handle: cx.focus_handle().tab_index(0).tab_stop(true), + }); + } + } + + self.navbar_entries = navbar_entries; + } + + fn visible_navbar_entries(&self) -> impl Iterator { + let mut index = 0; + let entries = &self.navbar_entries; + let search_matches = &self.filter_table; + let has_query = self.has_query; + std::iter::from_fn(move || { + while index < entries.len() { + let entry = &entries[index]; + let included_in_search = if let Some(item_index) = entry.item_index { + search_matches[entry.page_index][item_index] + } else { + search_matches[entry.page_index].iter().any(|b| *b) + || search_matches[entry.page_index].is_empty() + }; + if included_in_search { + break; + } + index += 1; + } + if index >= self.navbar_entries.len() { + return None; + } + let entry = &entries[index]; + let entry_index = index; + + index += 1; + if entry.is_root && !entry.expanded && !has_query { + while index < entries.len() { + if entries[index].is_root { + break; + } + index += 1; } - ToggleState::Selected => true, - ToggleState::Unselected => false, + } + + return Some((entry_index, entry)); + }) + } + + fn filter_matches_to_file(&mut self) { + let current_file = self.current_file.mask(); + for (page, page_filter) in std::iter::zip(&self.pages, &mut self.filter_table) { + let mut header_index = 0; + let mut any_found_since_last_header = true; + + for (index, item) in page.items.iter().enumerate() { + match item { + SettingsPageItem::SectionHeader(_) => { + if !any_found_since_last_header { + page_filter[header_index] = false; + } + header_index = index; + any_found_since_last_header = false; + } + SettingsPageItem::SettingItem(setting_item) => { + if !setting_item.files.contains(current_file) { + page_filter[index] = false; + } else { + any_found_since_last_header = true; + } + } + SettingsPageItem::SubPageLink(sub_page_link) => { + if !sub_page_link.files.contains(current_file) { + page_filter[index] = false; + } else { + any_found_since_last_header = true; + } + } + } + } + if let Some(last_header) = page_filter.get_mut(header_index) + && !any_found_since_last_header + { + *last_header = false; + } + } + } + + fn update_matches(&mut self, cx: &mut Context) { + self.search_task.take(); + let query = self.search_bar.read(cx).text(cx); + if query.is_empty() || self.search_index.is_none() { + for page in &mut self.filter_table { + page.fill(true); + } + self.has_query = false; + self.filter_matches_to_file(); + cx.notify(); + return; + } + + let search_index = self.search_index.as_ref().unwrap().clone(); + + fn update_matches_inner( + this: &mut SettingsWindow, + search_index: &SearchIndex, + match_indices: impl Iterator, + cx: &mut Context, + ) { + for page in &mut this.filter_table { + page.fill(false); + } + + for match_index in match_indices { + let SearchItemKey { + page_index, + header_index, + item_index, + } = search_index.key_lut[match_index]; + let page = &mut this.filter_table[page_index]; + page[header_index] = true; + page[item_index] = true; + } + this.has_query = true; + this.filter_matches_to_file(); + this.open_first_nav_page(); + cx.notify(); + } + + self.search_task = Some(cx.spawn(async move |this, cx| { + let bm25_task = cx.background_spawn({ + let search_index = search_index.clone(); + let max_results = search_index.key_lut.len(); + let query = query.clone(); + async move { search_index.bm25_engine.search(&query, max_results) } }); + let cancel_flag = std::sync::atomic::AtomicBool::new(false); + let fuzzy_search_task = fuzzy::match_strings( + search_index.fuzzy_match_candidates.as_slice(), + &query, + false, + true, + search_index.fuzzy_match_candidates.len(), + &cancel_flag, + cx.background_executor().clone(), + ); - SettingsValue::write_value(&path, new_value, cx); - }, - ) - .into_any_element() -} + let fuzzy_matches = fuzzy_search_task.await; + + _ = this + .update(cx, |this, cx| { + // For tuning the score threshold + // for fuzzy_match in &fuzzy_matches { + // let SearchItemKey { + // page_index, + // header_index, + // item_index, + // } = search_index.key_lut[fuzzy_match.candidate_id]; + // let SettingsPageItem::SectionHeader(header) = + // this.pages[page_index].items[header_index] + // else { + // continue; + // }; + // let SettingsPageItem::SettingItem(SettingItem { + // title, description, .. + // }) = this.pages[page_index].items[item_index] + // else { + // continue; + // }; + // let score = fuzzy_match.score; + // eprint!("# {header} :: QUERY = {query} :: SCORE = {score}\n{title}\n{description}\n\n"); + // } + update_matches_inner( + this, + search_index.as_ref(), + fuzzy_matches + .into_iter() + // MAGIC NUMBER: Was found to have right balance between not too many weird matches, but also + // flexible enough to catch misspellings and <4 letter queries + // More flexible is good for us here because fuzzy matches will only be used for things that don't + // match using bm25 + .take_while(|fuzzy_match| fuzzy_match.score >= 0.3) + .map(|fuzzy_match| fuzzy_match.candidate_id), + cx, + ); + }) + .ok(); -fn render_text_field( - value: SettingsValue, - window: &mut Window, - cx: &mut App, -) -> AnyElement { - let value = downcast_any_item::(value); - let path = value.path.clone(); - let editor = window.use_state(cx, { - let path = path.clone(); - move |window, cx| { - let mut editor = Editor::single_line(window, cx); + let bm25_matches = bm25_task.await; - cx.observe_global_in::(window, move |editor, window, cx| { - let user_settings = SettingsStore::global(cx).raw_user_settings(); - if let Some(value) = read_settings_value_from_path(&user_settings, &path).cloned() - && let Some(value) = value.as_str() - { - editor.set_text(value, window, cx); + _ = this + .update(cx, |this, cx| { + if bm25_matches.is_empty() { + return; + } + update_matches_inner( + this, + search_index.as_ref(), + bm25_matches + .into_iter() + .map(|bm25_match| bm25_match.document.id), + cx, + ); + }) + .ok(); + })); + } + + fn build_filter_table(&mut self) { + self.filter_table = self + .pages + .iter() + .map(|page| vec![true; page.items.len()]) + .collect::>(); + } + + fn build_search_index(&mut self) { + let mut key_lut: Vec = vec![]; + let mut documents = Vec::default(); + let mut fuzzy_match_candidates = Vec::default(); + + fn push_candidates( + fuzzy_match_candidates: &mut Vec, + key_index: usize, + input: &str, + ) { + for word in input.split_ascii_whitespace() { + fuzzy_match_candidates.push(StringMatchCandidate::new(key_index, word)); + } + } + + // PERF: We are currently searching all items even in project files + // where many settings are filtered out, using the logic in filter_matches_to_file + // we could only search relevant items based on the current file + for (page_index, page) in self.pages.iter().enumerate() { + let mut header_index = 0; + let mut header_str = ""; + for (item_index, item) in page.items.iter().enumerate() { + let key_index = key_lut.len(); + match item { + SettingsPageItem::SettingItem(item) => { + documents.push(bm25::Document { + id: key_index, + contents: [page.title, header_str, item.title, item.description] + .join("\n"), + }); + push_candidates(&mut fuzzy_match_candidates, key_index, item.title); + push_candidates(&mut fuzzy_match_candidates, key_index, item.description); + } + SettingsPageItem::SectionHeader(header) => { + documents.push(bm25::Document { + id: key_index, + contents: header.to_string(), + }); + push_candidates(&mut fuzzy_match_candidates, key_index, header); + header_index = item_index; + header_str = *header; + } + SettingsPageItem::SubPageLink(sub_page_link) => { + documents.push(bm25::Document { + id: key_index, + contents: [page.title, header_str, sub_page_link.title].join("\n"), + }); + push_candidates( + &mut fuzzy_match_candidates, + key_index, + sub_page_link.title, + ); + } } + push_candidates(&mut fuzzy_match_candidates, key_index, page.title); + push_candidates(&mut fuzzy_match_candidates, key_index, header_str); + + key_lut.push(SearchItemKey { + page_index, + header_index, + item_index, + }); + } + } + let engine = + bm25::SearchEngineBuilder::with_documents(bm25::Language::English, documents).build(); + self.search_index = Some(Arc::new(SearchIndex { + bm25_engine: engine, + key_lut, + fuzzy_match_candidates, + })); + } + + fn build_content_handles(&mut self, window: &mut Window, cx: &mut Context) { + self.content_handles = self + .pages + .iter() + .map(|page| { + std::iter::repeat_with(|| NonFocusableHandle::new(0, false, window, cx)) + .take(page.items.len()) + .collect() }) - .detach(); + .collect::>(); + } - editor.set_text(value.read().clone(), window, cx); - editor + fn build_ui(&mut self, window: &mut Window, cx: &mut Context) { + if self.pages.is_empty() { + self.pages = page_data::settings_data(); + self.build_navbar(cx); + self.build_content_handles(window, cx); } - }); + sub_page_stack_mut().clear(); + // PERF: doesn't have to be rebuilt, can just be filled with true. pages is constant once it is built + self.build_filter_table(); + self.update_matches(cx); + + cx.notify(); + } + + fn fetch_files(&mut self, window: &mut Window, cx: &mut Context) { + self.worktree_root_dirs.clear(); + let prev_files = self.files.clone(); + let settings_store = cx.global::(); + let mut ui_files = vec![]; + let all_files = settings_store.get_all_files(); + for file in all_files { + let Some(settings_ui_file) = SettingsUiFile::from_settings(file) else { + continue; + }; + if settings_ui_file.is_server() { + continue; + } + + if let Some(worktree_id) = settings_ui_file.worktree_id() { + let directory_name = all_projects(cx) + .find_map(|project| project.read(cx).worktree_for_id(worktree_id, cx)) + .and_then(|worktree| worktree.read(cx).root_dir()) + .and_then(|root_dir| { + root_dir + .file_name() + .map(|os_string| os_string.to_string_lossy().to_string()) + }); + + let Some(directory_name) = directory_name else { + log::error!( + "No directory name found for settings file at worktree ID: {}", + worktree_id + ); + continue; + }; + + self.worktree_root_dirs.insert(worktree_id, directory_name); + } + + let focus_handle = prev_files + .iter() + .find_map(|(prev_file, handle)| { + (prev_file == &settings_ui_file).then(|| handle.clone()) + }) + .unwrap_or_else(|| cx.focus_handle().tab_index(0).tab_stop(true)); + ui_files.push((settings_ui_file, focus_handle)); + } + ui_files.reverse(); + self.files = ui_files; + let current_file_still_exists = self + .files + .iter() + .any(|(file, _)| file == &self.current_file); + if !current_file_still_exists { + self.change_file(0, window, cx); + } + } + + fn open_navbar_entry_page(&mut self, navbar_entry: usize) { + if !self.is_nav_entry_visible(navbar_entry) { + self.open_first_nav_page(); + } + self.navbar_entry = navbar_entry; + sub_page_stack_mut().clear(); + } + + fn open_first_nav_page(&mut self) { + let Some(first_navbar_entry_index) = self.visible_navbar_entries().next().map(|e| e.0) + else { + return; + }; + self.open_navbar_entry_page(first_navbar_entry_index); + } + + fn change_file(&mut self, ix: usize, window: &mut Window, cx: &mut Context) { + if ix >= self.files.len() { + self.current_file = SettingsUiFile::User; + self.build_ui(window, cx); + return; + } + if self.files[ix].0 == self.current_file { + return; + } + self.current_file = self.files[ix].0.clone(); + + self.build_ui(window, cx); + + if self + .visible_navbar_entries() + .any(|(index, _)| index == self.navbar_entry) + { + self.open_and_scroll_to_navbar_entry(self.navbar_entry, window, cx); + } else { + self.open_first_nav_page(); + }; + } + + fn render_files_header( + &self, + _window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + h_flex() + .w_full() + .pb_4() + .gap_1() + .justify_between() + .tab_group() + .track_focus(&self.files_focus_handle) + .tab_index(HEADER_GROUP_TAB_INDEX) + .child( + h_flex() + .id("file_buttons_container") + .w_64() // Temporary fix until long-term solution is a fixed set of buttons representing a file location (User, Project, and Remote) + .gap_1() + .overflow_x_scroll() + .children( + self.files + .iter() + .enumerate() + .map(|(ix, (file, focus_handle))| { + Button::new( + ix, + self.display_name(&file) + .expect("Files should always have a name"), + ) + .toggle_state(file == &self.current_file) + .selected_style(ButtonStyle::Tinted(ui::TintColor::Accent)) + .track_focus(focus_handle) + .on_click(cx.listener({ + let focus_handle = focus_handle.clone(); + move |this, _: &gpui::ClickEvent, window, cx| { + this.change_file(ix, window, cx); + focus_handle.focus(window); + } + })) + }), + ), + ) + .child( + Button::new("edit-in-json", "Edit in settings.json") + .tab_index(0_isize) + .style(ButtonStyle::OutlinedGhost) + .on_click(cx.listener(|this, _, _, cx| { + this.open_current_settings_file(cx); + })), + ) + } + + pub(crate) fn display_name(&self, file: &SettingsUiFile) -> Option { + match file { + SettingsUiFile::User => Some("User".to_string()), + SettingsUiFile::Project((worktree_id, path)) => self + .worktree_root_dirs + .get(&worktree_id) + .map(|directory_name| { + let path_style = PathStyle::local(); + if path.is_empty() { + directory_name.clone() + } else { + format!( + "{}{}{}", + directory_name, + path_style.separator(), + path.display(path_style) + ) + } + }), + SettingsUiFile::Server(file) => Some(file.to_string()), + } + } + + // TODO: + // Reconsider this after preview launch + // fn file_location_str(&self) -> String { + // match &self.current_file { + // SettingsUiFile::User => "settings.json".to_string(), + // SettingsUiFile::Project((worktree_id, path)) => self + // .worktree_root_dirs + // .get(&worktree_id) + // .map(|directory_name| { + // let path_style = PathStyle::local(); + // let file_path = path.join(paths::local_settings_file_relative_path()); + // format!( + // "{}{}{}", + // directory_name, + // path_style.separator(), + // file_path.display(path_style) + // ) + // }) + // .expect("Current file should always be present in root dir map"), + // SettingsUiFile::Server(file) => file.to_string(), + // } + // } + + fn render_search(&self, _window: &mut Window, cx: &mut App) -> Div { + h_flex() + .py_1() + .px_1p5() + .mb_3() + .gap_1p5() + .rounded_sm() + .bg(cx.theme().colors().editor_background) + .border_1() + .border_color(cx.theme().colors().border) + .child(Icon::new(IconName::MagnifyingGlass).color(Color::Muted)) + .child(self.search_bar.clone()) + } + + fn render_nav( + &self, + window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + let visible_count = self.visible_navbar_entries().count(); + + let focus_keybind_label = if self + .navbar_focus_handle + .read(cx) + .handle + .contains_focused(window, cx) + { + "Focus Content" + } else { + "Focus Navbar" + }; + + v_flex() + .w_64() + .p_2p5() + .when(cfg!(target_os = "macos"), |c| c.pt_10()) + .h_full() + .flex_none() + .border_r_1() + .key_context("NavigationMenu") + .on_action(cx.listener(|this, _: &CollapseNavEntry, window, cx| { + let Some(focused_entry) = this.focused_nav_entry(window, cx) else { + return; + }; + let focused_entry_parent = this.root_entry_containing(focused_entry); + if this.navbar_entries[focused_entry_parent].expanded { + this.toggle_navbar_entry(focused_entry_parent); + window.focus(&this.navbar_entries[focused_entry_parent].focus_handle); + } + cx.notify(); + })) + .on_action(cx.listener(|this, _: &ExpandNavEntry, window, cx| { + let Some(focused_entry) = this.focused_nav_entry(window, cx) else { + return; + }; + if !this.navbar_entries[focused_entry].is_root { + return; + } + if !this.navbar_entries[focused_entry].expanded { + this.toggle_navbar_entry(focused_entry); + } + cx.notify(); + })) + .on_action( + cx.listener(|this, _: &FocusPreviousRootNavEntry, window, cx| { + let entry_index = this + .focused_nav_entry(window, cx) + .unwrap_or(this.navbar_entry); + let mut root_index = None; + for (index, entry) in this.visible_navbar_entries() { + if index >= entry_index { + break; + } + if entry.is_root { + root_index = Some(index); + } + } + let Some(previous_root_index) = root_index else { + return; + }; + this.focus_and_scroll_to_nav_entry(previous_root_index, window, cx); + }), + ) + .on_action(cx.listener(|this, _: &FocusNextRootNavEntry, window, cx| { + let entry_index = this + .focused_nav_entry(window, cx) + .unwrap_or(this.navbar_entry); + let mut root_index = None; + for (index, entry) in this.visible_navbar_entries() { + if index <= entry_index { + continue; + } + if entry.is_root { + root_index = Some(index); + break; + } + } + let Some(next_root_index) = root_index else { + return; + }; + this.focus_and_scroll_to_nav_entry(next_root_index, window, cx); + })) + .on_action(cx.listener(|this, _: &FocusFirstNavEntry, window, cx| { + if let Some((first_entry_index, _)) = this.visible_navbar_entries().next() { + this.focus_and_scroll_to_nav_entry(first_entry_index, window, cx); + } + })) + .on_action(cx.listener(|this, _: &FocusLastNavEntry, window, cx| { + if let Some((last_entry_index, _)) = this.visible_navbar_entries().last() { + this.focus_and_scroll_to_nav_entry(last_entry_index, window, cx); + } + })) + .border_color(cx.theme().colors().border) + .bg(cx.theme().colors().panel_background) + .child(self.render_search(window, cx)) + .child( + v_flex() + .flex_1() + .overflow_hidden() + .track_focus(&self.navbar_focus_handle.focus_handle(cx)) + .tab_group() + .tab_index(NAVBAR_GROUP_TAB_INDEX) + .child( + uniform_list( + "settings-ui-nav-bar", + visible_count + 1, + cx.processor(move |this, range: Range, _, cx| { + this.visible_navbar_entries() + .skip(range.start.saturating_sub(1)) + .take(range.len()) + .map(|(ix, entry)| { + TreeViewItem::new( + ("settings-ui-navbar-entry", ix), + entry.title, + ) + .track_focus(&entry.focus_handle) + .root_item(entry.is_root) + .toggle_state(this.is_navbar_entry_selected(ix)) + .when(entry.is_root, |item| { + item.expanded(entry.expanded || this.has_query) + .on_toggle(cx.listener( + move |this, _, window, cx| { + this.toggle_navbar_entry(ix); + window.focus( + &this.navbar_entries[ix].focus_handle, + ); + cx.notify(); + }, + )) + }) + .on_click( + cx.listener(move |this, _, window, cx| { + this.open_and_scroll_to_navbar_entry( + ix, window, cx, + ); + }), + ) + }) + .collect() + }), + ) + .size_full() + .track_scroll(self.navbar_scroll_handle.clone()), + ) + .vertical_scrollbar_for(self.navbar_scroll_handle.clone(), window, cx), + ) + .child( + h_flex() + .w_full() + .h_8() + .p_2() + .pb_0p5() + .flex_shrink_0() + .border_t_1() + .border_color(cx.theme().colors().border_variant) + .children( + KeyBinding::for_action(&ToggleFocusNav, window, cx).map(|this| { + KeybindingHint::new( + this, + cx.theme().colors().surface_background.opacity(0.5), + ) + .suffix(focus_keybind_label) + }), + ), + ) + } + + fn open_and_scroll_to_navbar_entry( + &mut self, + navbar_entry_index: usize, + window: &mut Window, + cx: &mut Context, + ) { + self.open_navbar_entry_page(navbar_entry_index); + cx.notify(); + + if self.navbar_entries[navbar_entry_index].is_root + || !self.is_nav_entry_visible(navbar_entry_index) + { + let Some(first_item_index) = self.visible_page_items().next().map(|(index, _)| index) + else { + return; + }; + self.focus_content_element(first_item_index, window, cx); + self.page_scroll_handle.set_offset(point(px(0.), px(0.))); + } else { + let entry_item_index = self.navbar_entries[navbar_entry_index] + .item_index + .expect("Non-root items should have an item index"); + let Some(selected_item_index) = self + .visible_page_items() + .position(|(index, _)| index == entry_item_index) + else { + return; + }; + self.page_scroll_handle + .scroll_to_top_of_item(selected_item_index); + self.focus_content_element(entry_item_index, window, cx); + } + + // Page scroll handle updates the active item index + // in it's next paint call after using scroll_handle.scroll_to_top_of_item + // The call after that updates the offset of the scroll handle. So to + // ensure the scroll handle doesn't lag behind we need to render three frames + // back to back. + cx.on_next_frame(window, |_, window, cx| { + cx.on_next_frame(window, |_, _, cx| { + cx.notify(); + }); + cx.notify(); + }); + cx.notify(); + } + + fn is_nav_entry_visible(&self, nav_entry_index: usize) -> bool { + self.visible_navbar_entries() + .any(|(index, _)| index == nav_entry_index) + } + + fn focus_and_scroll_to_nav_entry( + &self, + nav_entry_index: usize, + window: &mut Window, + cx: &mut Context, + ) { + let Some(position) = self + .visible_navbar_entries() + .position(|(index, _)| index == nav_entry_index) + else { + return; + }; + self.navbar_scroll_handle + .scroll_to_item(position, gpui::ScrollStrategy::Top); + window.focus(&self.navbar_entries[nav_entry_index].focus_handle); + cx.notify(); + } + + fn visible_page_items(&self) -> impl Iterator { + let page_idx = self.current_page_index(); + + self.current_page() + .items + .iter() + .enumerate() + .filter_map(move |(item_index, item)| { + self.filter_table[page_idx][item_index].then_some((item_index, item)) + }) + } + + fn render_sub_page_breadcrumbs(&self) -> impl IntoElement { + let mut items = vec![]; + items.push(self.current_page().title); + items.extend( + sub_page_stack() + .iter() + .flat_map(|page| [page.section_header, page.link.title]), + ); + + let last = items.pop().unwrap(); + h_flex() + .gap_1() + .children( + items + .into_iter() + .flat_map(|item| [item, "/"]) + .map(|item| Label::new(item).color(Color::Muted)), + ) + .child(Label::new(last)) + } + + fn render_page_items<'a, Items: Iterator>( + &self, + items: Items, + page_index: Option, + window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + let mut page_content = v_flex() + .id("settings-ui-page") + .size_full() + .overflow_y_scroll() + .track_scroll(&self.page_scroll_handle); + + let items: Vec<_> = items.collect(); + let items_len = items.len(); + let mut section_header = None; - let weak_editor = editor.downgrade(); - let theme_colors = cx.theme().colors(); - - div() - .child(editor) - .bg(theme_colors.editor_background) - .border_1() - .rounded_lg() - .border_color(theme_colors.border) - .on_action::({ - move |_, _, cx| { - let new_value = weak_editor.read_with(cx, |editor, cx| editor.text(cx)).ok(); - - if let Some(new_value) = new_value { - SettingsValue::write_value(&path, serde_json::Value::String(new_value), cx); + let has_active_search = !self.search_bar.read(cx).is_empty(cx); + let has_no_results = items_len == 0 && has_active_search; + + if has_no_results { + let search_query = self.search_bar.read(cx).text(cx); + page_content = page_content.child( + v_flex() + .size_full() + .items_center() + .justify_center() + .gap_1() + .child(div().child("No Results")) + .child( + div() + .text_sm() + .text_color(cx.theme().colors().text_muted) + .child(format!("No settings match \"{}\"", search_query)), + ), + ) + } else { + let last_non_header_index = items + .iter() + .enumerate() + .rev() + .find(|(_, (_, item))| !matches!(item, SettingsPageItem::SectionHeader(_))) + .map(|(index, _)| index); + + let root_nav_label = self + .navbar_entries + .iter() + .find(|entry| entry.is_root && entry.page_index == self.current_page_index()) + .map(|entry| entry.title); + + page_content = page_content + .when(sub_page_stack().is_empty(), |this| { + this.when_some(root_nav_label, |this, title| { + this.child(Label::new(title).size(LabelSize::Large).mt_2().mb_3()) + }) + }) + .children(items.clone().into_iter().enumerate().map( + |(index, (actual_item_index, item))| { + let no_bottom_border = items + .get(index + 1) + .map(|(_, next_item)| { + matches!(next_item, SettingsPageItem::SectionHeader(_)) + }) + .unwrap_or(false); + let is_last = Some(index) == last_non_header_index; + + if let SettingsPageItem::SectionHeader(header) = item { + section_header = Some(*header); + } + v_flex() + .w_full() + .min_w_0() + .id(("settings-page-item", actual_item_index)) + .when_some(page_index, |element, page_index| { + element.track_focus( + &self.content_handles[page_index][actual_item_index] + .focus_handle(cx), + ) + }) + .child(item.render( + self, + section_header.expect("All items rendered after a section header"), + no_bottom_border || is_last, + window, + cx, + )) + }, + )) + } + page_content + } + + fn render_page( + &mut self, + window: &mut Window, + cx: &mut Context, + ) -> impl IntoElement { + let page_header; + let page_content; + + if sub_page_stack().is_empty() { + page_header = self.render_files_header(window, cx).into_any_element(); + + page_content = self + .render_page_items( + self.visible_page_items(), + Some(self.current_page_index()), + window, + cx, + ) + .into_any_element(); + } else { + page_header = h_flex() + .ml_neg_1p5() + .pb_4() + .gap_1() + .child( + IconButton::new("back-btn", IconName::ArrowLeft) + .icon_size(IconSize::Small) + .shape(IconButtonShape::Square) + .on_click(cx.listener(|this, _, _, cx| { + this.pop_sub_page(cx); + })), + ) + .child(self.render_sub_page_breadcrumbs()) + .into_any_element(); + + let active_page_render_fn = sub_page_stack().last().unwrap().link.render.clone(); + page_content = (active_page_render_fn)(self, window, cx); + } + + return v_flex() + .size_full() + .pt_6() + .pb_8() + .px_8() + .bg(cx.theme().colors().editor_background) + .child(page_header) + .vertical_scrollbar_for(self.page_scroll_handle.clone(), window, cx) + .track_focus(&self.content_focus_handle.focus_handle(cx)) + .child( + div() + .size_full() + .tab_group() + .tab_index(CONTENT_GROUP_TAB_INDEX) + .child(page_content), + ); + } + + fn open_current_settings_file(&mut self, cx: &mut Context) { + match &self.current_file { + SettingsUiFile::User => { + let Some(original_window) = self.original_window else { + return; + }; + original_window + .update(cx, |workspace, window, cx| { + workspace + .with_local_workspace(window, cx, |workspace, window, cx| { + let create_task = workspace.project().update(cx, |project, cx| { + project.find_or_create_worktree( + paths::config_dir().as_path(), + false, + cx, + ) + }); + let open_task = workspace.open_paths( + vec![paths::settings_file().to_path_buf()], + OpenOptions { + visible: Some(OpenVisible::None), + ..Default::default() + }, + None, + window, + cx, + ); + + cx.spawn_in(window, async move |workspace, cx| { + create_task.await.ok(); + open_task.await; + + workspace.update_in(cx, |_, window, cx| { + window.activate_window(); + cx.notify(); + }) + }) + .detach(); + }) + .detach(); + }) + .ok(); + } + SettingsUiFile::Project((worktree_id, path)) => { + let mut corresponding_workspace: Option> = None; + let settings_path = path.join(paths::local_settings_file_relative_path()); + let Some(app_state) = workspace::AppState::global(cx).upgrade() else { + return; + }; + for workspace in app_state.workspace_store.read(cx).workspaces() { + let contains_settings_file = workspace + .read_with(cx, |workspace, cx| { + workspace.project().read(cx).contains_local_settings_file( + *worktree_id, + settings_path.as_ref(), + cx, + ) + }) + .ok(); + if Some(true) == contains_settings_file { + corresponding_workspace = Some(*workspace); + + break; + } } + + let Some(corresponding_workspace) = corresponding_workspace else { + log::error!( + "No corresponding workspace found for settings file {}", + settings_path.as_std_path().display() + ); + + return; + }; + + // TODO: move zed::open_local_file() APIs to this crate, and + // re-implement the "initial_contents" behavior + corresponding_workspace + .update(cx, |workspace, window, cx| { + let open_task = workspace.open_path( + (*worktree_id, settings_path.clone()), + None, + true, + window, + cx, + ); + + cx.spawn_in(window, async move |workspace, cx| { + if open_task.await.log_err().is_some() { + workspace + .update_in(cx, |_, window, cx| { + window.activate_window(); + cx.notify(); + }) + .ok(); + } + }) + .detach(); + }) + .ok(); + } + SettingsUiFile::Server(_) => { + return; + } + }; + } + + fn current_page_index(&self) -> usize { + self.page_index_from_navbar_index(self.navbar_entry) + } + + fn current_page(&self) -> &SettingsPage { + &self.pages[self.current_page_index()] + } + + fn page_index_from_navbar_index(&self, index: usize) -> usize { + if self.navbar_entries.is_empty() { + return 0; + } + + self.navbar_entries[index].page_index + } + + fn is_navbar_entry_selected(&self, ix: usize) -> bool { + ix == self.navbar_entry + } + + fn push_sub_page( + &mut self, + sub_page_link: SubPageLink, + section_header: &'static str, + cx: &mut Context, + ) { + sub_page_stack_mut().push(SubPage { + link: sub_page_link, + section_header, + }); + cx.notify(); + } + + fn pop_sub_page(&mut self, cx: &mut Context) { + sub_page_stack_mut().pop(); + cx.notify(); + } + + fn focus_file_at_index(&mut self, index: usize, window: &mut Window) { + if let Some((_, handle)) = self.files.get(index) { + handle.focus(window); + } + } + + fn focused_file_index(&self, window: &Window, cx: &Context) -> usize { + if self.files_focus_handle.contains_focused(window, cx) + && let Some(index) = self + .files + .iter() + .position(|(_, handle)| handle.is_focused(window)) + { + return index; + } + if let Some(current_file_index) = self + .files + .iter() + .position(|(file, _)| file == &self.current_file) + { + return current_file_index; + } + 0 + } + + fn focus_content_element(&self, item_index: usize, window: &mut Window, cx: &mut App) { + if !sub_page_stack().is_empty() { + return; + } + let page_index = self.current_page_index(); + window.focus(&self.content_handles[page_index][item_index].focus_handle(cx)); + } + + fn focused_nav_entry(&self, window: &Window, cx: &App) -> Option { + if !self + .navbar_focus_handle + .focus_handle(cx) + .contains_focused(window, cx) + { + return None; + } + for (index, entry) in self.navbar_entries.iter().enumerate() { + if entry.focus_handle.is_focused(window) { + return Some(index); } + } + None + } + + fn root_entry_containing(&self, nav_entry_index: usize) -> usize { + let mut index = Some(nav_entry_index); + while let Some(prev_index) = index + && !self.navbar_entries[prev_index].is_root + { + index = prev_index.checked_sub(1); + } + return index.expect("No root entry found"); + } +} + +impl Render for SettingsWindow { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + let ui_font = theme::setup_ui_font(window, cx); + + client_side_decorations( + v_flex() + .text_color(cx.theme().colors().text) + .size_full() + .children(self.title_bar.clone()) + .child( + div() + .id("settings-window") + .key_context("SettingsWindow") + .track_focus(&self.focus_handle) + .on_action(cx.listener(|this, _: &OpenCurrentFile, _, cx| { + this.open_current_settings_file(cx); + })) + .on_action(|_: &Minimize, window, _cx| { + window.minimize_window(); + }) + .on_action(cx.listener(|this, _: &search::FocusSearch, window, cx| { + this.search_bar.focus_handle(cx).focus(window); + })) + .on_action(cx.listener(|this, _: &ToggleFocusNav, window, cx| { + if this + .navbar_focus_handle + .focus_handle(cx) + .contains_focused(window, cx) + { + this.open_and_scroll_to_navbar_entry(this.navbar_entry, window, cx); + } else { + this.focus_and_scroll_to_nav_entry(this.navbar_entry, window, cx); + } + })) + .on_action(cx.listener( + |this, FocusFile(file_index): &FocusFile, window, _| { + this.focus_file_at_index(*file_index as usize, window); + }, + )) + .on_action(cx.listener(|this, _: &FocusNextFile, window, cx| { + let next_index = usize::min( + this.focused_file_index(window, cx) + 1, + this.files.len().saturating_sub(1), + ); + this.focus_file_at_index(next_index, window); + })) + .on_action(cx.listener(|this, _: &FocusPreviousFile, window, cx| { + let prev_index = this.focused_file_index(window, cx).saturating_sub(1); + this.focus_file_at_index(prev_index, window); + })) + .on_action(|_: &menu::SelectNext, window, _| { + window.focus_next(); + }) + .on_action(|_: &menu::SelectPrevious, window, _| { + window.focus_prev(); + }) + .flex() + .flex_row() + .flex_1() + .min_h_0() + .font(ui_font) + .bg(cx.theme().colors().background) + .text_color(cx.theme().colors().text) + .child(self.render_nav(window, cx)) + .child(self.render_page(window, cx)), + ), + window, + cx, + ) + } +} + +fn all_projects(cx: &App) -> impl Iterator> { + workspace::AppState::global(cx) + .upgrade() + .map(|app_state| { + app_state + .workspace_store + .read(cx) + .workspaces() + .iter() + .filter_map(|workspace| Some(workspace.read(cx).ok()?.project().clone())) }) - .into_any_element() + .into_iter() + .flatten() } -fn render_toggle_button_group( - value: SettingsValue, - variants: &'static [&'static str], - labels: &'static [&'static str], - _: &mut Window, - _: &mut App, -) -> AnyElement { - let value = downcast_any_item::(value); - let active_value = value.read(); - let selected_idx = variants.iter().position(|v| v == &active_value); - - return render_toggle_button_group_inner(value.title, labels, selected_idx, { - let path = value.path.clone(); - move |variant_index, cx| { - SettingsValue::write_value( - &path, - serde_json::Value::String(variants[variant_index].to_string()), - cx, - ); +fn update_settings_file( + file: SettingsUiFile, + cx: &mut App, + update: impl 'static + Send + FnOnce(&mut SettingsContent, &App), +) -> Result<()> { + match file { + SettingsUiFile::Project((worktree_id, rel_path)) => { + let rel_path = rel_path.join(paths::local_settings_file_relative_path()); + let project = all_projects(cx).find(|project| { + project.read_with(cx, |project, cx| { + project.contains_local_settings_file(worktree_id, &rel_path, cx) + }) + }); + let Some(project) = project else { + anyhow::bail!( + "Could not find worktree containing settings file: {}", + &rel_path.display(PathStyle::local()) + ); + }; + project.update(cx, |project, cx| { + project.update_local_settings_file(worktree_id, rel_path, cx, update); + }); + return Ok(()); } - }); + SettingsUiFile::User => { + // todo(settings_ui) error? + SettingsStore::global(cx).update_settings_file(::global(cx), update); + Ok(()) + } + SettingsUiFile::Server(_) => unimplemented!(), + } } -fn render_dropdown( - value: SettingsValue, - variants: &'static [&'static str], - labels: &'static [&'static str], - window: &mut Window, +fn render_text_field + Into + AsRef + Clone>( + field: SettingField, + file: SettingsUiFile, + metadata: Option<&SettingsFieldMetadata>, + _window: &mut Window, cx: &mut App, ) -> AnyElement { - let value = downcast_any_item::(value); - let id = element_id_from_path(&value.path); + let (_, initial_text) = + SettingsStore::global(cx).get_value_from_file(file.to_settings(), field.pick); + let initial_text = initial_text.filter(|s| !s.as_ref().is_empty()); + + SettingsEditor::new() + .tab_index(0) + .when_some(initial_text, |editor, text| { + editor.with_initial_text(text.as_ref().to_string()) + }) + .when_some( + metadata.and_then(|metadata| metadata.placeholder), + |editor, placeholder| editor.with_placeholder(placeholder), + ) + .on_confirm({ + move |new_text, cx| { + update_settings_file(file.clone(), cx, move |settings, _cx| { + *(field.pick_mut)(settings) = new_text.map(Into::into); + }) + .log_err(); // todo(settings_ui) don't log err + } + }) + .into_any_element() +} - let menu = window.use_keyed_state(id.clone(), cx, |window, cx| { - let path = value.path.clone(); - let handler = Rc::new(move |variant: &'static str, cx: &mut App| { - SettingsValue::write_value(&path, serde_json::Value::String(variant.to_string()), cx); - }); +fn render_toggle_button + From + Copy>( + field: SettingField, + file: SettingsUiFile, + _metadata: Option<&SettingsFieldMetadata>, + _window: &mut Window, + cx: &mut App, +) -> AnyElement { + let (_, value) = SettingsStore::global(cx).get_value_from_file(file.to_settings(), field.pick); - ContextMenu::build(window, cx, |mut menu, _, _| { - for (label, variant) in labels.iter().zip(variants) { - menu = menu.entry(*label, None, { - let handler = handler.clone(); - move |_, cx| { - handler(variant, cx); - } - }); - } + let toggle_state = if value.copied().map_or(false, Into::into) { + ToggleState::Selected + } else { + ToggleState::Unselected + }; - menu + Switch::new("toggle_button", toggle_state) + .color(ui::SwitchColor::Accent) + .on_click({ + move |state, _window, cx| { + let state = *state == ui::ToggleState::Selected; + update_settings_file(file.clone(), cx, move |settings, _cx| { + *(field.pick_mut)(settings) = Some(state.into()); + }) + .log_err(); // todo(settings_ui) don't log err + } }) + .tab_index(0_isize) + .color(SwitchColor::Accent) + .into_any_element() +} + +fn render_font_picker( + field: SettingField, + file: SettingsUiFile, + _metadata: Option<&SettingsFieldMetadata>, + window: &mut Window, + cx: &mut App, +) -> AnyElement { + let current_value = SettingsStore::global(cx) + .get_value_from_file(file.to_settings(), field.pick) + .1 + .cloned() + .unwrap_or_else(|| SharedString::default().into()); + + let font_picker = cx.new(|cx| { + ui_input::font_picker( + current_value.clone().into(), + move |font_name, cx| { + update_settings_file(file.clone(), cx, move |settings, _cx| { + *(field.pick_mut)(settings) = Some(font_name.into()); + }) + .log_err(); // todo(settings_ui) don't log err + }, + window, + cx, + ) }); - DropdownMenu::new(id, value.read(), menu.read(cx).clone()) - .style(ui::DropdownStyle::Outlined) + PopoverMenu::new("font-picker") + .menu(move |_window, _cx| Some(font_picker.clone())) + .trigger( + Button::new("font-family-button", current_value) + .tab_index(0_isize) + .style(ButtonStyle::Outlined) + .size(ButtonSize::Medium) + .icon(IconName::ChevronUpDown) + .icon_color(Color::Muted) + .icon_size(IconSize::Small) + .icon_position(IconPosition::End), + ) + .anchor(gpui::Corner::TopLeft) + .offset(gpui::Point { + x: px(0.0), + y: px(2.0), + }) + .with_handle(ui::PopoverMenuHandle::default()) .into_any_element() } -fn render_toggle_button_group_inner( - title: SharedString, - labels: &'static [&'static str], - selected_idx: Option, - on_write: impl Fn(usize, &mut App) + 'static, +fn render_number_field( + field: SettingField, + file: SettingsUiFile, + _metadata: Option<&SettingsFieldMetadata>, + window: &mut Window, + cx: &mut App, ) -> AnyElement { - fn make_toggle_group( - title: SharedString, - selected_idx: Option, - on_write: Rc, - labels: &'static [&'static str], - ) -> AnyElement { - let labels_array: [&'static str; LEN] = { - let mut arr = ["unused"; LEN]; - arr.copy_from_slice(labels); - arr - }; - - let mut idx = 0; - ToggleButtonGroup::single_row( - title, - labels_array.map(|label| { - idx += 1; - let on_write = on_write.clone(); - ToggleButtonSimple::new(label, move |_, _, cx| { - on_write(idx - 1, cx); + let (_, value) = SettingsStore::global(cx).get_value_from_file(file.to_settings(), field.pick); + let value = value.copied().unwrap_or_else(T::min_value); + NumberField::new("numeric_stepper", value, window, cx) + .on_change({ + move |value, _window, cx| { + let value = *value; + update_settings_file(file.clone(), cx, move |settings, _cx| { + *(field.pick_mut)(settings) = Some(value); }) - }), - ) - .when_some(selected_idx, |this, ix| this.selected_index(ix)) - .style(ui::ToggleButtonGroupStyle::Filled) + .log_err(); // todo(settings_ui) don't log err + } + }) .into_any_element() +} + +fn render_dropdown( + field: SettingField, + file: SettingsUiFile, + _metadata: Option<&SettingsFieldMetadata>, + window: &mut Window, + cx: &mut App, +) -> AnyElement +where + T: strum::VariantArray + strum::VariantNames + Copy + PartialEq + Send + Sync + 'static, +{ + let variants = || -> &'static [T] { ::VARIANTS }; + let labels = || -> &'static [&'static str] { ::VARIANTS }; + + let (_, current_value) = + SettingsStore::global(cx).get_value_from_file(file.to_settings(), field.pick); + let current_value = current_value.copied().unwrap_or(variants()[0]); + + let current_value_label = + labels()[variants().iter().position(|v| *v == current_value).unwrap()]; + + DropdownMenu::new( + "dropdown", + current_value_label.to_title_case(), + ContextMenu::build(window, cx, move |mut menu, _, _| { + for (&value, &label) in std::iter::zip(variants(), labels()) { + let file = file.clone(); + menu = menu.toggleable_entry( + label.to_title_case(), + value == current_value, + IconPosition::End, + None, + move |_, cx| { + if value == current_value { + return; + } + update_settings_file(file.clone(), cx, move |settings, _cx| { + *(field.pick_mut)(settings) = Some(value); + }) + .log_err(); // todo(settings_ui) don't log err + }, + ); + } + menu + }), + ) + .trigger_size(ButtonSize::Medium) + .style(DropdownStyle::Outlined) + .offset(gpui::Point { + x: px(0.0), + y: px(2.0), + }) + .tab_index(0) + .into_any_element() +} + +#[cfg(test)] +mod test { + + use super::*; + + impl SettingsWindow { + fn navbar_entry(&self) -> usize { + self.navbar_entry + } + } + + impl PartialEq for NavBarEntry { + fn eq(&self, other: &Self) -> bool { + self.title == other.title + && self.is_root == other.is_root + && self.expanded == other.expanded + && self.page_index == other.page_index + && self.item_index == other.item_index + // ignoring focus_handle + } + } + + fn register_settings(cx: &mut App) { + settings::init(cx); + theme::init(theme::LoadThemes::JustBase, cx); + workspace::init_settings(cx); + project::Project::init_settings(cx); + language::init(cx); + editor::init(cx); + menu::init(); + } + + fn parse(input: &'static str, window: &mut Window, cx: &mut App) -> SettingsWindow { + let mut pages: Vec = Vec::new(); + let mut expanded_pages = Vec::new(); + let mut selected_idx = None; + let mut index = 0; + let mut in_expanded_section = false; + + for mut line in input + .lines() + .map(|line| line.trim()) + .filter(|line| !line.is_empty()) + { + if let Some(pre) = line.strip_suffix('*') { + assert!(selected_idx.is_none(), "Only one selected entry allowed"); + selected_idx = Some(index); + line = pre; + } + let (kind, title) = line.split_once(" ").unwrap(); + assert_eq!(kind.len(), 1); + let kind = kind.chars().next().unwrap(); + if kind == 'v' { + let page_idx = pages.len(); + expanded_pages.push(page_idx); + pages.push(SettingsPage { + title, + items: vec![], + }); + index += 1; + in_expanded_section = true; + } else if kind == '>' { + pages.push(SettingsPage { + title, + items: vec![], + }); + index += 1; + in_expanded_section = false; + } else if kind == '-' { + pages + .last_mut() + .unwrap() + .items + .push(SettingsPageItem::SectionHeader(title)); + if selected_idx == Some(index) && !in_expanded_section { + panic!("Items in unexpanded sections cannot be selected"); + } + index += 1; + } else { + panic!( + "Entries must start with one of 'v', '>', or '-'\n line: {}", + line + ); + } + } + + let mut settings_window = SettingsWindow { + title_bar: None, + original_window: None, + worktree_root_dirs: HashMap::default(), + files: Vec::default(), + current_file: crate::SettingsUiFile::User, + pages, + search_bar: cx.new(|cx| Editor::single_line(window, cx)), + navbar_entry: selected_idx.expect("Must have a selected navbar entry"), + navbar_entries: Vec::default(), + navbar_scroll_handle: UniformListScrollHandle::default(), + filter_table: vec![], + has_query: false, + content_handles: vec![], + search_task: None, + page_scroll_handle: ScrollHandle::new(), + focus_handle: cx.focus_handle(), + navbar_focus_handle: NonFocusableHandle::new( + NAVBAR_CONTAINER_TAB_INDEX, + false, + window, + cx, + ), + content_focus_handle: NonFocusableHandle::new( + CONTENT_CONTAINER_TAB_INDEX, + false, + window, + cx, + ), + files_focus_handle: cx.focus_handle(), + search_index: None, + }; + + settings_window.build_filter_table(); + settings_window.build_navbar(cx); + for expanded_page_index in expanded_pages { + for entry in &mut settings_window.navbar_entries { + if entry.page_index == expanded_page_index && entry.is_root { + entry.expanded = true; + } + } + } + settings_window } - let on_write = Rc::new(on_write); + #[track_caller] + fn check_navbar_toggle( + before: &'static str, + toggle_page: &'static str, + after: &'static str, + window: &mut Window, + cx: &mut App, + ) { + let mut settings_window = parse(before, window, cx); + let toggle_page_idx = settings_window + .pages + .iter() + .position(|page| page.title == toggle_page) + .expect("page not found"); + let toggle_idx = settings_window + .navbar_entries + .iter() + .position(|entry| entry.page_index == toggle_page_idx) + .expect("page not found"); + settings_window.toggle_navbar_entry(toggle_idx); + + let expected_settings_window = parse(after, window, cx); + + pretty_assertions::assert_eq!( + settings_window + .visible_navbar_entries() + .map(|(_, entry)| entry) + .collect::>(), + expected_settings_window + .visible_navbar_entries() + .map(|(_, entry)| entry) + .collect::>(), + ); + pretty_assertions::assert_eq!( + settings_window.navbar_entries[settings_window.navbar_entry()], + expected_settings_window.navbar_entries[expected_settings_window.navbar_entry()], + ); + } - macro_rules! templ_toggl_with_const_param { - ($len:expr) => { - if labels.len() == $len { - return make_toggle_group::<$len>(title.clone(), selected_idx, on_write, labels); + macro_rules! check_navbar_toggle { + ($name:ident, before: $before:expr, toggle_page: $toggle_page:expr, after: $after:expr) => { + #[gpui::test] + fn $name(cx: &mut gpui::TestAppContext) { + let window = cx.add_empty_window(); + window.update(|window, cx| { + register_settings(cx); + check_navbar_toggle($before, $toggle_page, $after, window, cx); + }); } }; } - templ_toggl_with_const_param!(1); - templ_toggl_with_const_param!(2); - templ_toggl_with_const_param!(3); - templ_toggl_with_const_param!(4); - templ_toggl_with_const_param!(5); - templ_toggl_with_const_param!(6); - unreachable!("Too many variants"); -} - -fn settings_value_from_settings_and_path( - path: SmallVec<[SharedString; 1]>, - fallback_path: Option<&[SharedString]>, - title: SharedString, - documentation: Option, - user_settings: &serde_json::Value, - default_settings: &serde_json::Value, -) -> SettingsValue { - let default_value = read_settings_value_from_path(default_settings, &path) - .or_else(|| { - fallback_path.and_then(|fallback_path| { - read_settings_value_from_path(default_settings, fallback_path) - }) - }) - .with_context(|| format!("No default value for item at path {:?}", path.join("."))) - .expect("Default value set for item") - .clone(); - - let value = read_settings_value_from_path(user_settings, &path).cloned(); - let settings_value = SettingsValue { - default_value, - value, - documentation, - path, - // todo(settings_ui) is title required inside SettingsValue? - title, - }; - return settings_value; + + check_navbar_toggle!( + navbar_basic_open, + before: r" + v General + - General + - Privacy* + v Project + - Project Settings + ", + toggle_page: "General", + after: r" + > General* + v Project + - Project Settings + " + ); + + check_navbar_toggle!( + navbar_basic_close, + before: r" + > General* + - General + - Privacy + v Project + - Project Settings + ", + toggle_page: "General", + after: r" + v General* + - General + - Privacy + v Project + - Project Settings + " + ); + + check_navbar_toggle!( + navbar_basic_second_root_entry_close, + before: r" + > General + - General + - Privacy + v Project + - Project Settings* + ", + toggle_page: "Project", + after: r" + > General + > Project* + " + ); + + check_navbar_toggle!( + navbar_toggle_subroot, + before: r" + v General Page + - General + - Privacy + v Project + - Worktree Settings Content* + v AI + - General + > Appearance & Behavior + ", + toggle_page: "Project", + after: r" + v General Page + - General + - Privacy + > Project* + v AI + - General + > Appearance & Behavior + " + ); + + check_navbar_toggle!( + navbar_toggle_close_propagates_selected_index, + before: r" + v General Page + - General + - Privacy + v Project + - Worktree Settings Content + v AI + - General* + > Appearance & Behavior + ", + toggle_page: "General Page", + after: r" + > General Page + v Project + - Worktree Settings Content + v AI + - General* + > Appearance & Behavior + " + ); + + check_navbar_toggle!( + navbar_toggle_expand_propagates_selected_index, + before: r" + > General Page + - General + - Privacy + v Project + - Worktree Settings Content + v AI + - General* + > Appearance & Behavior + ", + toggle_page: "General Page", + after: r" + v General Page + - General + - Privacy + v Project + - Worktree Settings Content + v AI + - General* + > Appearance & Behavior + " + ); } diff --git a/crates/settings_ui_macros/src/settings_ui_macros.rs b/crates/settings_ui_macros/src/settings_ui_macros.rs deleted file mode 100644 index 971adbfe4dd2356a8e19185767a121810cadd991..0000000000000000000000000000000000000000 --- a/crates/settings_ui_macros/src/settings_ui_macros.rs +++ /dev/null @@ -1,612 +0,0 @@ -use heck::{ToSnakeCase as _, ToTitleCase as _}; -use proc_macro2::TokenStream; -use quote::{ToTokens, quote}; -use syn::{Data, DeriveInput, LitStr, Token, parse_macro_input}; - -/// Derive macro for the `SettingsUi` marker trait. -/// -/// This macro automatically implements the `SettingsUi` trait for the annotated type. -/// The `SettingsUi` trait is a marker trait used to indicate that a type can be -/// displayed in the settings UI. -/// -/// # Example -/// -/// ``` -/// use settings_ui_macros::SettingsUi; -/// -/// #[derive(SettingsUi)] -/// #[settings_ui(group = "Standard")] -/// struct MySettings { -/// enabled: bool, -/// count: usize, -/// } -/// ``` -#[proc_macro_derive(SettingsUi, attributes(settings_ui))] -pub fn derive_settings_ui(input: proc_macro::TokenStream) -> proc_macro::TokenStream { - let input = parse_macro_input!(input as DeriveInput); - let name = &input.ident; - - // Handle generic parameters if present - let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); - - let mut group_name = Option::::None; - let mut path_name = Option::::None; - - for attr in &input.attrs { - if attr.path().is_ident("settings_ui") { - attr.parse_nested_meta(|meta| { - if meta.path.is_ident("group") { - if group_name.is_some() { - return Err(meta.error("Only one 'group' path can be specified")); - } - meta.input.parse::()?; - let lit: LitStr = meta.input.parse()?; - group_name = Some(lit.value()); - } else if meta.path.is_ident("path") { - // todo(settings_ui) rely entirely on settings_key, remove path attribute - if path_name.is_some() { - return Err(meta.error("Only one 'path' can be specified, either with `path` in `settings_ui` or with `settings_key`")); - } - meta.input.parse::()?; - let lit: LitStr = meta.input.parse()?; - path_name = Some(lit.value()); - } else if meta.path.is_ident("render") { - // Just consume the tokens even if we don't use them here - meta.input.parse::()?; - let _lit: LitStr = meta.input.parse()?; - } - Ok(()) - }) - .unwrap_or_else(|e| panic!("in #[settings_ui] attribute: {}", e)); - } else if let Some(settings_key) = parse_setting_key_attr(attr) { - // todo(settings_ui) either remove fallback key or handle it here - if path_name.is_some() && settings_key.key.is_some() { - panic!("Both 'path' and 'settings_key' are specified. Must specify only one"); - } - path_name = settings_key.key; - } - } - - let doc_str = parse_documentation_from_attrs(&input.attrs); - - let ui_item_fn_body = generate_ui_item_body(group_name.as_ref(), &input); - - // todo(settings_ui): make group name optional, repurpose group as tag indicating item is group, and have "title" tag for custom title - let title = group_name.unwrap_or(input.ident.to_string().to_title_case()); - - let ui_entry_fn_body = map_ui_item_to_entry( - path_name.as_deref(), - &title, - doc_str.as_deref(), - quote! { Self }, - ); - - let expanded = quote! { - impl #impl_generics settings::SettingsUi for #name #ty_generics #where_clause { - fn settings_ui_item() -> settings::SettingsUiItem { - #ui_item_fn_body - } - - fn settings_ui_entry() -> settings::SettingsUiEntry { - #ui_entry_fn_body - } - } - }; - - proc_macro::TokenStream::from(expanded) -} - -fn extract_type_from_option(ty: TokenStream) -> TokenStream { - match option_inner_type(ty.clone()) { - Some(inner_type) => inner_type, - None => ty, - } -} - -fn option_inner_type(ty: TokenStream) -> Option { - let ty = syn::parse2::(ty).ok()?; - let syn::Type::Path(path) = ty else { - return None; - }; - let segment = path.path.segments.last()?; - if segment.ident != "Option" { - return None; - } - let syn::PathArguments::AngleBracketed(args) = &segment.arguments else { - return None; - }; - let arg = args.args.first()?; - let syn::GenericArgument::Type(ty) = arg else { - return None; - }; - return Some(ty.to_token_stream()); -} - -fn map_ui_item_to_entry( - path: Option<&str>, - title: &str, - doc_str: Option<&str>, - ty: TokenStream, -) -> TokenStream { - // todo(settings_ui): does quote! just work with options? - let path = path.map_or_else(|| quote! {None}, |path| quote! {Some(#path)}); - let doc_str = doc_str.map_or_else(|| quote! {None}, |doc_str| quote! {Some(#doc_str)}); - let item = ui_item_from_type(ty); - quote! { - settings::SettingsUiEntry { - title: #title, - path: #path, - item: #item, - documentation: #doc_str, - } - } -} - -fn ui_item_from_type(ty: TokenStream) -> TokenStream { - let ty = extract_type_from_option(ty); - return trait_method_call(ty, quote! {settings::SettingsUi}, quote! {settings_ui_item}); -} - -fn trait_method_call( - ty: TokenStream, - trait_name: TokenStream, - method_name: TokenStream, -) -> TokenStream { - // doing the makes the error message better: - // -> "#ty Doesn't implement settings::SettingsUi" instead of "no item "settings_ui_item" for #ty" - // and ensures safety against name conflicts - // - // todo(settings_ui): Turn `Vec` into `Vec::` here as well - quote! { - <#ty as #trait_name>::#method_name() - } -} - -fn generate_ui_item_body(group_name: Option<&String>, input: &syn::DeriveInput) -> TokenStream { - match (group_name, &input.data) { - (_, Data::Union(_)) => unimplemented!("Derive SettingsUi for Unions"), - (None, Data::Struct(_)) => quote! { - settings::SettingsUiItem::None - }, - (Some(_), Data::Struct(data_struct)) => { - let parent_serde_attrs = parse_serde_attributes(&input.attrs); - item_group_from_fields(&data_struct.fields, &parent_serde_attrs) - } - (None, Data::Enum(data_enum)) => { - let serde_attrs = parse_serde_attributes(&input.attrs); - let render_as = parse_render_as(&input.attrs); - let length = data_enum.variants.len(); - - let mut variants = Vec::with_capacity(length); - let mut labels = Vec::with_capacity(length); - - for variant in &data_enum.variants { - // todo(settings_ui): Can #[serde(rename = )] be on enum variants? - let ident = variant.ident.clone().to_string(); - let variant_name = serde_attrs.rename_all.apply(&ident); - let title = variant_name.to_title_case(); - - variants.push(variant_name); - labels.push(title); - } - - let is_not_union = data_enum.variants.iter().all(|v| v.fields.is_empty()); - if is_not_union { - return match render_as { - RenderAs::ToggleGroup if length > 6 => { - panic!("Can't set toggle group with more than six entries"); - } - RenderAs::ToggleGroup => { - quote! { - settings::SettingsUiItem::Single(settings::SettingsUiItemSingle::ToggleGroup{ variants: &[#(#variants),*], labels: &[#(#labels),*] }) - } - } - RenderAs::Default => { - quote! { - settings::SettingsUiItem::Single(settings::SettingsUiItemSingle::DropDown{ variants: &[#(#variants),*], labels: &[#(#labels),*] }) - } - } - }; - } - // else: Union! - let enum_name = &input.ident; - - let options = data_enum.variants.iter().map(|variant| { - if variant.fields.is_empty() { - return quote! {None}; - } - let name = &variant.ident; - let item = item_group_from_fields(&variant.fields, &serde_attrs); - // todo(settings_ui): documentation - return quote! { - Some(settings::SettingsUiEntry { - path: None, - title: stringify!(#name), - documentation: None, - item: #item, - }) - }; - }); - let defaults = data_enum.variants.iter().map(|variant| { - let variant_name = &variant.ident; - if variant.fields.is_empty() { - quote! { - serde_json::to_value(#enum_name::#variant_name).expect("Failed to serialize default value for #enum_name::#variant_name") - } - } else { - let fields = variant.fields.iter().enumerate().map(|(index, field)| { - let field_name = field.ident.as_ref().map_or_else(|| syn::Index::from(index).into_token_stream(), |ident| ident.to_token_stream()); - let field_type_is_option = option_inner_type(field.ty.to_token_stream()).is_some(); - let field_default = if field_type_is_option { - quote! { - None - } - } else { - quote! { - ::std::default::Default::default() - } - }; - - quote!{ - #field_name: #field_default - } - }); - quote! { - serde_json::to_value(#enum_name::#variant_name { - #(#fields),* - }).expect("Failed to serialize default value for #enum_name::#variant_name") - } - } - }); - // todo(settings_ui): Identify #[default] attr and use it for index, defaulting to 0 - let default_variant_index: usize = 0; - let determine_option_fn = { - let match_arms = data_enum - .variants - .iter() - .enumerate() - .map(|(index, variant)| { - let variant_name = &variant.ident; - quote! { - Ok(#variant_name {..}) => #index - } - }); - quote! { - |value: &serde_json::Value, _cx: &gpui::App| -> usize { - use #enum_name::*; - match serde_json::from_value::<#enum_name>(value.clone()) { - #(#match_arms),*, - Err(_) => #default_variant_index, - } - } - } - }; - // todo(settings_ui) should probably always use toggle group for unions, dropdown makes less sense - return quote! { - settings::SettingsUiItem::Union(settings::SettingsUiItemUnion { - defaults: Box::new([#(#defaults),*]), - labels: &[#(#labels),*], - options: Box::new([#(#options),*]), - determine_option: #determine_option_fn, - }) - }; - // panic!("Unhandled"); - } - // todo(settings_ui) discriminated unions - (_, Data::Enum(_)) => quote! { - settings::SettingsUiItem::None - }, - } -} - -fn item_group_from_fields(fields: &syn::Fields, parent_serde_attrs: &SerdeOptions) -> TokenStream { - let group_items = fields - .iter() - .filter(|field| { - !field.attrs.iter().any(|attr| { - let mut has_skip = false; - if attr.path().is_ident("settings_ui") { - let _ = attr.parse_nested_meta(|meta| { - if meta.path.is_ident("skip") { - has_skip = true; - } - Ok(()) - }); - } - - has_skip - }) - }) - .map(|field| { - let field_serde_attrs = parse_serde_attributes(&field.attrs); - let name = field.ident.as_ref().map(ToString::to_string); - let title = name.as_ref().map_or_else( - || "todo(settings_ui): Titles for tuple fields".to_string(), - |name| name.to_title_case(), - ); - let doc_str = parse_documentation_from_attrs(&field.attrs); - - ( - title, - doc_str, - name.filter(|_| !field_serde_attrs.flatten).map(|name| { - parent_serde_attrs.apply_rename_to_field(&field_serde_attrs, &name) - }), - field.ty.to_token_stream(), - ) - }) - // todo(settings_ui): Re-format field name as nice title, and support setting different title with attr - .map(|(title, doc_str, path, ty)| { - map_ui_item_to_entry(path.as_deref(), &title, doc_str.as_deref(), ty) - }); - - quote! { - settings::SettingsUiItem::Group(settings::SettingsUiItemGroup{ items: vec![#(#group_items),*] }) - } -} - -struct SerdeOptions { - rename_all: SerdeRenameAll, - rename: Option, - flatten: bool, - untagged: bool, - _alias: Option, // todo(settings_ui) -} - -#[derive(PartialEq)] -enum SerdeRenameAll { - Lowercase, - SnakeCase, - None, -} - -impl SerdeRenameAll { - fn apply(&self, name: &str) -> String { - match self { - SerdeRenameAll::Lowercase => name.to_lowercase(), - SerdeRenameAll::SnakeCase => name.to_snake_case(), - SerdeRenameAll::None => name.to_string(), - } - } -} - -impl SerdeOptions { - fn apply_rename_to_field(&self, field_options: &Self, name: &str) -> String { - // field renames take precedence over struct rename all cases - if let Some(rename) = &field_options.rename { - return rename.clone(); - } - return self.rename_all.apply(name); - } -} - -enum RenderAs { - ToggleGroup, - Default, -} - -fn parse_render_as(attrs: &[syn::Attribute]) -> RenderAs { - let mut render_as = RenderAs::Default; - - for attr in attrs { - if !attr.path().is_ident("settings_ui") { - continue; - } - - attr.parse_nested_meta(|meta| { - if meta.path.is_ident("render") { - meta.input.parse::()?; - let lit = meta.input.parse::()?.value(); - - if lit == "toggle_group" { - render_as = RenderAs::ToggleGroup; - } else { - return Err(meta.error(format!("invalid `render` attribute: {}", lit))); - } - } - Ok(()) - }) - .unwrap(); - } - - render_as -} - -fn parse_serde_attributes(attrs: &[syn::Attribute]) -> SerdeOptions { - let mut options = SerdeOptions { - rename_all: SerdeRenameAll::None, - rename: None, - flatten: false, - untagged: false, - _alias: None, - }; - - for attr in attrs { - if !attr.path().is_ident("serde") { - continue; - } - attr.parse_nested_meta(|meta| { - if meta.path.is_ident("rename_all") { - meta.input.parse::()?; - let lit = meta.input.parse::()?.value(); - - if options.rename_all != SerdeRenameAll::None { - return Err(meta.error("duplicate `rename_all` attribute")); - } else if lit == "lowercase" { - options.rename_all = SerdeRenameAll::Lowercase; - } else if lit == "snake_case" { - options.rename_all = SerdeRenameAll::SnakeCase; - } else { - return Err(meta.error(format!("invalid `rename_all` attribute: {}", lit))); - } - // todo(settings_ui): Other options? - } else if meta.path.is_ident("flatten") { - options.flatten = true; - } else if meta.path.is_ident("rename") { - if options.rename.is_some() { - return Err(meta.error("Can only have one rename attribute")); - } - - meta.input.parse::()?; - let lit = meta.input.parse::()?.value(); - options.rename = Some(lit); - } else if meta.path.is_ident("untagged") { - options.untagged = true; - } - Ok(()) - }) - .unwrap(); - } - - return options; -} - -fn parse_documentation_from_attrs(attrs: &[syn::Attribute]) -> Option { - let mut doc_str = Option::::None; - for attr in attrs { - if attr.path().is_ident("doc") { - // /// ... - // becomes - // #[doc = "..."] - use syn::{Expr::Lit, ExprLit, Lit::Str, Meta, MetaNameValue}; - if let Meta::NameValue(MetaNameValue { - value: - Lit(ExprLit { - lit: Str(ref lit_str), - .. - }), - .. - }) = attr.meta - { - let doc = lit_str.value(); - let doc_str = doc_str.get_or_insert_default(); - doc_str.push_str(doc.trim()); - doc_str.push('\n'); - } - } - } - return doc_str; -} - -struct SettingsKey { - key: Option, - fallback_key: Option, -} - -fn parse_setting_key_attr(attr: &syn::Attribute) -> Option { - if !attr.path().is_ident("settings_key") { - return None; - } - - let mut settings_key = SettingsKey { - key: None, - fallback_key: None, - }; - - let mut found_none = false; - - attr.parse_nested_meta(|meta| { - if meta.path.is_ident("None") { - found_none = true; - } else if meta.path.is_ident("key") { - if settings_key.key.is_some() { - return Err(meta.error("Only one 'group' path can be specified")); - } - meta.input.parse::()?; - let lit: LitStr = meta.input.parse()?; - settings_key.key = Some(lit.value()); - } else if meta.path.is_ident("fallback_key") { - if found_none { - return Err(meta.error("Cannot specify 'fallback_key' and 'None'")); - } - - if settings_key.fallback_key.is_some() { - return Err(meta.error("Only one 'fallback_key' can be specified")); - } - - meta.input.parse::()?; - let lit: LitStr = meta.input.parse()?; - settings_key.fallback_key = Some(lit.value()); - } - Ok(()) - }) - .unwrap_or_else(|e| panic!("in #[settings_key] attribute: {}", e)); - - if found_none && settings_key.fallback_key.is_some() { - panic!("in #[settings_key] attribute: Cannot specify 'None' and 'fallback_key'"); - } - if found_none && settings_key.key.is_some() { - panic!("in #[settings_key] attribute: Cannot specify 'None' and 'key'"); - } - if !found_none && settings_key.key.is_none() { - panic!("in #[settings_key] attribute: 'key' must be specified"); - } - - return Some(settings_key); -} - -#[proc_macro_derive(SettingsKey, attributes(settings_key))] -pub fn derive_settings_key(input: proc_macro::TokenStream) -> proc_macro::TokenStream { - let input = parse_macro_input!(input as DeriveInput); - let name = &input.ident; - - // Handle generic parameters if present - let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); - - let mut settings_key = Option::::None; - - for attr in &input.attrs { - let parsed_settings_key = parse_setting_key_attr(attr); - if parsed_settings_key.is_some() && settings_key.is_some() { - panic!("Duplicate #[settings_key] attribute"); - } - settings_key = settings_key.or(parsed_settings_key); - } - - let Some(SettingsKey { key, fallback_key }) = settings_key else { - panic!("Missing #[settings_key] attribute"); - }; - - let key = key.map_or_else(|| quote! {None}, |key| quote! {Some(#key)}); - let fallback_key = fallback_key.map_or_else( - || quote! {None}, - |fallback_key| quote! {Some(#fallback_key)}, - ); - - let expanded = quote! { - impl #impl_generics settings::SettingsKey for #name #ty_generics #where_clause { - const KEY: Option<&'static str> = #key; - - const FALLBACK_KEY: Option<&'static str> = #fallback_key; - }; - }; - - proc_macro::TokenStream::from(expanded) -} - -#[cfg(test)] -mod tests { - use syn::{Attribute, parse_quote}; - - use super::*; - - #[test] - fn test_extract_key() { - let input: Attribute = parse_quote!( - #[settings_key(key = "my_key")] - ); - let settings_key = parse_setting_key_attr(&input).unwrap(); - assert_eq!(settings_key.key, Some("my_key".to_string())); - assert_eq!(settings_key.fallback_key, None); - } - - #[test] - fn test_empty_key() { - let input: Attribute = parse_quote!( - #[settings_key(None)] - ); - let settings_key = parse_setting_key_attr(&input).unwrap(); - assert_eq!(settings_key.key, None); - assert_eq!(settings_key.fallback_key, None); - } -} diff --git a/crates/snippet_provider/Cargo.toml b/crates/snippet_provider/Cargo.toml index 3e47c96c66c0fdea2975b168922b24c1dba775e7..af7ffcf30ef71a21a6cdfd2efaf1ce3cf763016b 100644 --- a/crates/snippet_provider/Cargo.toml +++ b/crates/snippet_provider/Cargo.toml @@ -18,6 +18,7 @@ gpui.workspace = true parking_lot.workspace = true paths.workspace = true serde.workspace = true +serde_json.workspace = true serde_json_lenient.workspace = true snippet.workspace = true util.workspace = true diff --git a/crates/snippet_provider/src/format.rs b/crates/snippet_provider/src/format.rs index 1a390aa2e17dfed69cf3b298b0d1f8dfe4e2cd1d..0bbf137aed506f4cc7793f5dbe80ee144b620bf4 100644 --- a/crates/snippet_provider/src/format.rs +++ b/crates/snippet_provider/src/format.rs @@ -1,7 +1,6 @@ use collections::HashMap; use schemars::{JsonSchema, json_schema}; use serde::Deserialize; -use serde_json_lenient::Value; use std::borrow::Cow; use util::schemars::DefaultDenyUnknownFields; @@ -12,13 +11,13 @@ pub struct VsSnippetsFile { } impl VsSnippetsFile { - pub fn generate_json_schema() -> Value { + pub fn generate_json_schema() -> serde_json::Value { let schema = schemars::generate::SchemaSettings::draft2019_09() .with_transform(DefaultDenyUnknownFields) .into_generator() .root_schema_for::(); - serde_json_lenient::to_value(schema).unwrap() + serde_json::to_value(schema).unwrap() } } diff --git a/crates/snippets_ui/src/snippets_ui.rs b/crates/snippets_ui/src/snippets_ui.rs index 7f2689f0be7a805e6b80a9b7c320cdaa13cc46ac..cfe41144ba955f34ac527f605940835015e1d218 100644 --- a/crates/snippets_ui/src/snippets_ui.rs +++ b/crates/snippets_ui/src/snippets_ui.rs @@ -221,15 +221,19 @@ impl PickerDelegate for ScopeSelectorDelegate { workspace.update_in(cx, |workspace, window, cx| { workspace - .open_abs_path( - snippets_dir().join(scope_file_name.with_extension()), - OpenOptions { - visible: Some(OpenVisible::None), - ..Default::default() - }, - window, - cx, - ) + .with_local_workspace(window, cx, |workspace, window, cx| { + workspace + .open_abs_path( + snippets_dir().join(scope_file_name.with_extension()), + OpenOptions { + visible: Some(OpenVisible::None), + ..Default::default() + }, + window, + cx, + ) + .detach(); + }) .detach(); }) }) diff --git a/crates/sqlez/src/thread_safe_connection.rs b/crates/sqlez/src/thread_safe_connection.rs index 482905ac817bf94fcb64cb858b784c94283b686c..966f14a9c2f244780da7190aebac88e95c7ac068 100644 --- a/crates/sqlez/src/thread_safe_connection.rs +++ b/crates/sqlez/src/thread_safe_connection.rs @@ -249,11 +249,14 @@ pub fn background_thread_queue() -> WriteQueueConstructor { Box::new(|| { let (sender, receiver) = channel::(); - thread::spawn(move || { - while let Ok(write) = receiver.recv() { - write() - } - }); + thread::Builder::new() + .name("sqlezWorker".to_string()) + .spawn(move || { + while let Ok(write) = receiver.recv() { + write() + } + }) + .unwrap(); let sender = UnboundedSyncSender::new(sender); Box::new(move |queued_write| { diff --git a/crates/storybook/src/stories/with_rem_size.rs b/crates/storybook/src/stories/with_rem_size.rs index 81677c0502021c22e013d4b734ec95843b3b88cb..eeca3fb89f6382dbc13d696f2701f0c6b28027ee 100644 --- a/crates/storybook/src/stories/with_rem_size.rs +++ b/crates/storybook/src/stories/with_rem_size.rs @@ -54,7 +54,7 @@ impl RenderOnce for Example { .p_2() .border_2() .border_color(self.border_color) - .child(Label::new(format!("1rem = {}px", self.rem_size.0))) + .child(Label::new(format!("1rem = {}px", f32::from(self.rem_size)))) .children(self.children), ) } diff --git a/crates/storybook/src/storybook.rs b/crates/storybook/src/storybook.rs index ac01e6c5c88d042353a17f18281cd4d467c7c491..592ee7bc7ac5cc92125fc7b4aa5846b4338884d7 100644 --- a/crates/storybook/src/storybook.rs +++ b/crates/storybook/src/storybook.rs @@ -19,7 +19,7 @@ use reqwest_client::ReqwestClient; use settings::{KeymapFile, Settings}; use simplelog::SimpleLogger; use strum::IntoEnumIterator; -use theme::{ThemeRegistry, ThemeSettings}; +use theme::ThemeSettings; use ui::prelude::*; use workspace; @@ -80,9 +80,9 @@ fn main() { let selector = story_selector; - let theme_registry = ThemeRegistry::global(cx); let mut theme_settings = ThemeSettings::get_global(cx).clone(); - theme_settings.active_theme = theme_registry.get(&theme_name).unwrap(); + theme_settings.theme = + theme::ThemeSelection::Static(settings::ThemeName(theme_name.into())); ThemeSettings::override_global(theme_settings, cx); language::init(cx); diff --git a/crates/sum_tree/Cargo.toml b/crates/sum_tree/Cargo.toml index 63542b0615493125af4a72a8ab2bbe613e364ff3..2e95bc8a5f60b7431ed5d75d57c3f2e2afbe2724 100644 --- a/crates/sum_tree/Cargo.toml +++ b/crates/sum_tree/Cargo.toml @@ -1,9 +1,10 @@ [package] -name = "sum_tree" +name = "zed-sum-tree" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "A sum tree data structure, a concurrency-friendly B-tree" [lints] workspace = true diff --git a/crates/sum_tree/src/cursor.rs b/crates/sum_tree/src/cursor.rs index 53458b65ec313ca56c5decfcd4650825285d0733..6df1d3da41556dc7eb93f7460b960ccddbe52de6 100644 --- a/crates/sum_tree/src/cursor.rs +++ b/crates/sum_tree/src/cursor.rs @@ -5,10 +5,17 @@ use std::{cmp::Ordering, mem, sync::Arc}; #[derive(Clone)] struct StackEntry<'a, T: Item, D> { tree: &'a SumTree, - index: usize, + index: u32, position: D, } +impl<'a, T: Item, D> StackEntry<'a, T, D> { + #[inline] + fn index(&self) -> usize { + self.index as usize + } +} + impl fmt::Debug for StackEntry<'_, T, D> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("StackEntry") @@ -19,16 +26,16 @@ impl fmt::Debug for StackEntry<'_, T, D> { } #[derive(Clone)] -pub struct Cursor<'a, T: Item, D> { +pub struct Cursor<'a, 'b, T: Item, D> { tree: &'a SumTree, stack: ArrayVec, 16>, position: D, did_seek: bool, at_end: bool, - cx: &'a ::Context, + cx: ::Context<'b>, } -impl fmt::Debug for Cursor<'_, T, D> +impl fmt::Debug for Cursor<'_, '_, T, D> where T::Summary: fmt::Debug, { @@ -48,12 +55,12 @@ pub struct Iter<'a, T: Item> { stack: ArrayVec, 16>, } -impl<'a, T, D> Cursor<'a, T, D> +impl<'a, 'b, T, D> Cursor<'a, 'b, T, D> where T: Item, D: Dimension<'a, T::Summary>, { - pub fn new(tree: &'a SumTree, cx: &'a ::Context) -> Self { + pub fn new(tree: &'a SumTree, cx: ::Context<'b>) -> Self { Self { tree, stack: ArrayVec::new(), @@ -93,10 +100,10 @@ where if let Some(entry) = self.stack.last() { match *entry.tree.0 { Node::Leaf { ref items, .. } => { - if entry.index == items.len() { + if entry.index() == items.len() { None } else { - Some(&items[entry.index]) + Some(&items[entry.index()]) } } _ => unreachable!(), @@ -114,10 +121,10 @@ where Node::Leaf { ref item_summaries, .. } => { - if entry.index == item_summaries.len() { + if entry.index() == item_summaries.len() { None } else { - Some(&item_summaries[entry.index]) + Some(&item_summaries[entry.index()]) } } _ => unreachable!(), @@ -131,7 +138,7 @@ where pub fn next_item(&self) -> Option<&'a T> { self.assert_did_seek(); if let Some(entry) = self.stack.last() { - if entry.index == entry.tree.0.items().len() - 1 { + if entry.index() == entry.tree.0.items().len() - 1 { if let Some(next_leaf) = self.next_leaf() { Some(next_leaf.0.items().first().unwrap()) } else { @@ -139,7 +146,7 @@ where } } else { match *entry.tree.0 { - Node::Leaf { ref items, .. } => Some(&items[entry.index + 1]), + Node::Leaf { ref items, .. } => Some(&items[entry.index() + 1]), _ => unreachable!(), } } @@ -153,11 +160,11 @@ where #[track_caller] fn next_leaf(&self) -> Option<&'a SumTree> { for entry in self.stack.iter().rev().skip(1) { - if entry.index < entry.tree.0.child_trees().len() - 1 { + if entry.index() < entry.tree.0.child_trees().len() - 1 { match *entry.tree.0 { Node::Internal { ref child_trees, .. - } => return Some(child_trees[entry.index + 1].leftmost_leaf()), + } => return Some(child_trees[entry.index() + 1].leftmost_leaf()), Node::Leaf { .. } => unreachable!(), }; } @@ -169,7 +176,7 @@ where pub fn prev_item(&self) -> Option<&'a T> { self.assert_did_seek(); if let Some(entry) = self.stack.last() { - if entry.index == 0 { + if entry.index() == 0 { if let Some(prev_leaf) = self.prev_leaf() { Some(prev_leaf.0.items().last().unwrap()) } else { @@ -177,7 +184,7 @@ where } } else { match *entry.tree.0 { - Node::Leaf { ref items, .. } => Some(&items[entry.index - 1]), + Node::Leaf { ref items, .. } => Some(&items[entry.index() - 1]), _ => unreachable!(), } } @@ -191,11 +198,11 @@ where #[track_caller] fn prev_leaf(&self) -> Option<&'a SumTree> { for entry in self.stack.iter().rev().skip(1) { - if entry.index != 0 { + if entry.index() != 0 { match *entry.tree.0 { Node::Internal { ref child_trees, .. - } => return Some(child_trees[entry.index - 1].rightmost_leaf()), + } => return Some(child_trees[entry.index() - 1].rightmost_leaf()), Node::Leaf { .. } => unreachable!(), }; } @@ -224,7 +231,7 @@ where if !self.tree.is_empty() { self.stack.push(StackEntry { tree: self.tree, - index: self.tree.0.child_summaries().len(), + index: self.tree.0.child_summaries().len() as u32, position: D::from_summary(self.tree.summary(), self.cx), }); } @@ -240,7 +247,7 @@ where let entry = self.stack.last_mut().unwrap(); if !descending { - if entry.index == 0 { + if entry.index() == 0 { self.stack.pop(); continue; } else { @@ -248,20 +255,20 @@ where } } - for summary in &entry.tree.0.child_summaries()[..entry.index] { + for summary in &entry.tree.0.child_summaries()[..entry.index()] { self.position.add_summary(summary, self.cx); } entry.position = self.position.clone(); - descending = filter_node(&entry.tree.0.child_summaries()[entry.index]); + descending = filter_node(&entry.tree.0.child_summaries()[entry.index()]); match entry.tree.0.as_ref() { Node::Internal { child_trees, .. } => { if descending { - let tree = &child_trees[entry.index]; + let tree = &child_trees[entry.index()]; self.stack.push(StackEntry { position: D::zero(self.cx), tree, - index: tree.0.child_summaries().len() - 1, + index: tree.0.child_summaries().len() as u32 - 1, }) } } @@ -312,8 +319,8 @@ where entry.position = self.position.clone(); } - while entry.index < child_summaries.len() { - let next_summary = &child_summaries[entry.index]; + while entry.index() < child_summaries.len() { + let next_summary = &child_summaries[entry.index()]; if filter_node(next_summary) { break; } else { @@ -323,18 +330,18 @@ where } } - child_trees.get(entry.index) + child_trees.get(entry.index()) } Node::Leaf { item_summaries, .. } => { if !descend { - let item_summary = &item_summaries[entry.index]; + let item_summary = &item_summaries[entry.index()]; entry.index += 1; entry.position.add_summary(item_summary, self.cx); self.position.add_summary(item_summary, self.cx); } loop { - if let Some(next_item_summary) = item_summaries.get(entry.index) { + if let Some(next_item_summary) = item_summaries.get(entry.index()) { if filter_node(next_item_summary) { return; } else { @@ -376,7 +383,7 @@ where } } -impl<'a, T, D> Cursor<'a, T, D> +impl<'a, 'b, T, D> Cursor<'a, 'b, T, D> where T: Item, D: Dimension<'a, T::Summary>, @@ -465,9 +472,9 @@ where entry.position = self.position.clone(); } - for (child_tree, child_summary) in child_trees[entry.index..] + for (child_tree, child_summary) in child_trees[entry.index()..] .iter() - .zip(&child_summaries[entry.index..]) + .zip(&child_summaries[entry.index()..]) { let mut child_end = self.position.clone(); child_end.add_summary(child_summary, self.cx); @@ -498,9 +505,9 @@ where } => { aggregate.begin_leaf(); - for (item, item_summary) in items[entry.index..] + for (item, item_summary) in items[entry.index()..] .iter() - .zip(&item_summaries[entry.index..]) + .zip(&item_summaries[entry.index()..]) { let mut child_end = self.position.clone(); child_end.add_summary(item_summary, self.cx); @@ -572,14 +579,14 @@ impl<'a, T: Item> Iterator for Iter<'a, T> { if !descend { entry.index += 1; } - child_trees.get(entry.index) + child_trees.get(entry.index()) } Node::Leaf { items, .. } => { if !descend { entry.index += 1; } - if let Some(next_item) = items.get(entry.index) { + if let Some(next_item) = items.get(entry.index()) { return Some(next_item); } else { None @@ -605,7 +612,7 @@ impl<'a, T: Item> Iterator for Iter<'a, T> { } } -impl<'a, T: Item, D> Iterator for Cursor<'a, T, D> +impl<'a, 'b, T: Item, D> Iterator for Cursor<'a, 'b, T, D> where D: Dimension<'a, T::Summary>, { @@ -625,12 +632,12 @@ where } } -pub struct FilterCursor<'a, F, T: Item, D> { - cursor: Cursor<'a, T, D>, +pub struct FilterCursor<'a, 'b, F, T: Item, D> { + cursor: Cursor<'a, 'b, T, D>, filter_node: F, } -impl<'a, F, T: Item, D> FilterCursor<'a, F, T, D> +impl<'a, 'b, F, T: Item, D> FilterCursor<'a, 'b, F, T, D> where F: FnMut(&T::Summary) -> bool, T: Item, @@ -638,7 +645,7 @@ where { pub fn new( tree: &'a SumTree, - cx: &'a ::Context, + cx: ::Context<'b>, filter_node: F, ) -> Self { let cursor = tree.cursor::(cx); @@ -673,7 +680,7 @@ where } } -impl<'a, F, T: Item, U> Iterator for FilterCursor<'a, F, T, U> +impl<'a, 'b, F, T: Item, U> Iterator for FilterCursor<'a, 'b, F, T, U> where F: FnMut(&T::Summary) -> bool, U: Dimension<'a, T::Summary>, @@ -696,18 +703,18 @@ where trait SeekAggregate<'a, T: Item> { fn begin_leaf(&mut self); - fn end_leaf(&mut self, cx: &::Context); + fn end_leaf(&mut self, cx: ::Context<'_>); fn push_item( &mut self, item: &'a T, summary: &'a T::Summary, - cx: &::Context, + cx: ::Context<'_>, ); fn push_tree( &mut self, tree: &'a SumTree, summary: &'a T::Summary, - cx: &::Context, + cx: ::Context<'_>, ); } @@ -722,14 +729,20 @@ struct SummarySeekAggregate(D); impl SeekAggregate<'_, T> for () { fn begin_leaf(&mut self) {} - fn end_leaf(&mut self, _: &::Context) {} - fn push_item(&mut self, _: &T, _: &T::Summary, _: &::Context) {} - fn push_tree(&mut self, _: &SumTree, _: &T::Summary, _: &::Context) {} + fn end_leaf(&mut self, _: ::Context<'_>) {} + fn push_item(&mut self, _: &T, _: &T::Summary, _: ::Context<'_>) {} + fn push_tree( + &mut self, + _: &SumTree, + _: &T::Summary, + _: ::Context<'_>, + ) { + } } impl SeekAggregate<'_, T> for SliceSeekAggregate { fn begin_leaf(&mut self) {} - fn end_leaf(&mut self, cx: &::Context) { + fn end_leaf(&mut self, cx: ::Context<'_>) { self.tree.append( SumTree(Arc::new(Node::Leaf { summary: mem::replace(&mut self.leaf_summary, ::zero(cx)), @@ -739,7 +752,12 @@ impl SeekAggregate<'_, T> for SliceSeekAggregate { cx, ); } - fn push_item(&mut self, item: &T, summary: &T::Summary, cx: &::Context) { + fn push_item( + &mut self, + item: &T, + summary: &T::Summary, + cx: ::Context<'_>, + ) { self.leaf_items.push(item.clone()); self.leaf_item_summaries.push(summary.clone()); Summary::add_summary(&mut self.leaf_summary, summary, cx); @@ -748,7 +766,7 @@ impl SeekAggregate<'_, T> for SliceSeekAggregate { &mut self, tree: &SumTree, _: &T::Summary, - cx: &::Context, + cx: ::Context<'_>, ) { self.tree.append(tree.clone(), cx); } @@ -759,15 +777,20 @@ where D: Dimension<'a, T::Summary>, { fn begin_leaf(&mut self) {} - fn end_leaf(&mut self, _: &::Context) {} - fn push_item(&mut self, _: &T, summary: &'a T::Summary, cx: &::Context) { + fn end_leaf(&mut self, _: ::Context<'_>) {} + fn push_item( + &mut self, + _: &T, + summary: &'a T::Summary, + cx: ::Context<'_>, + ) { self.0.add_summary(summary, cx); } fn push_tree( &mut self, _: &SumTree, summary: &'a T::Summary, - cx: &::Context, + cx: ::Context<'_>, ) { self.0.add_summary(summary, cx); } @@ -782,7 +805,7 @@ impl End { } impl<'a, S: Summary, D: Dimension<'a, S>> SeekTarget<'a, S, D> for End { - fn cmp(&self, _: &D, _: &S::Context) -> Ordering { + fn cmp(&self, _: &D, _: S::Context<'_>) -> Ordering { Ordering::Greater } } diff --git a/crates/sum_tree/src/sum_tree.rs b/crates/sum_tree/src/sum_tree.rs index 64814ad09148cc0eb318c306132f2e296fcb3cab..bfd2423c9230ea4246509e164d7a03f4890cbf4a 100644 --- a/crates/sum_tree/src/sum_tree.rs +++ b/crates/sum_tree/src/sum_tree.rs @@ -20,7 +20,7 @@ pub const TREE_BASE: usize = 6; pub trait Item: Clone { type Summary: Summary; - fn summary(&self, cx: &::Context) -> Self::Summary; + fn summary(&self, cx: ::Context<'_>) -> Self::Summary; } /// An [`Item`] whose summary has a specific key that can be used to identify it @@ -35,23 +35,40 @@ pub trait KeyedItem: Item { /// Each Summary type can have multiple [`Dimension`]s that it measures, /// which can be used to navigate the tree pub trait Summary: Clone { - type Context; + type Context<'a>: Copy; + fn zero<'a>(cx: Self::Context<'a>) -> Self; + fn add_summary<'a>(&mut self, summary: &Self, cx: Self::Context<'a>); +} - fn zero(cx: &Self::Context) -> Self; - fn add_summary(&mut self, summary: &Self, cx: &Self::Context); +pub trait ContextLessSummary: Clone { + fn zero() -> Self; + fn add_summary(&mut self, summary: &Self); } +impl Summary for T { + type Context<'a> = (); + + fn zero<'a>((): ()) -> Self { + T::zero() + } + + fn add_summary<'a>(&mut self, summary: &Self, (): ()) { + T::add_summary(self, summary) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct NoSummary; + /// Catch-all implementation for when you need something that implements [`Summary`] without a specific type. -/// We implement it on a &'static, as that avoids blanket impl collisions with `impl Dimension for T` +/// We implement it on a `NoSummary` instead of re-using `()`, as that avoids blanket impl collisions with `impl Dimension for T` /// (as we also need unit type to be a fill-in dimension) -impl Summary for &'static () { - type Context = (); - - fn zero(_: &()) -> Self { - &() +impl ContextLessSummary for NoSummary { + fn zero() -> Self { + NoSummary } - fn add_summary(&mut self, _: &Self, _: &()) {} + fn add_summary(&mut self, _: &Self) {} } /// Each [`Summary`] type can have more than one [`Dimension`] type that it measures. @@ -62,11 +79,11 @@ impl Summary for &'static () { /// Zed's rope has a `TextSummary` type that summarizes lines, characters, and bytes. /// Each of these are different dimensions we may want to seek to pub trait Dimension<'a, S: Summary>: Clone { - fn zero(cx: &S::Context) -> Self; + fn zero(cx: S::Context<'_>) -> Self; - fn add_summary(&mut self, summary: &'a S, cx: &S::Context); + fn add_summary(&mut self, summary: &'a S, cx: S::Context<'_>); - fn from_summary(summary: &'a S, cx: &S::Context) -> Self { + fn from_summary(summary: &'a S, cx: S::Context<'_>) -> Self { let mut dimension = Self::zero(cx); dimension.add_summary(summary, cx); dimension @@ -74,29 +91,29 @@ pub trait Dimension<'a, S: Summary>: Clone { } impl<'a, T: Summary> Dimension<'a, T> for T { - fn zero(cx: &T::Context) -> Self { + fn zero(cx: T::Context<'_>) -> Self { Summary::zero(cx) } - fn add_summary(&mut self, summary: &'a T, cx: &T::Context) { + fn add_summary(&mut self, summary: &'a T, cx: T::Context<'_>) { Summary::add_summary(self, summary, cx); } } pub trait SeekTarget<'a, S: Summary, D: Dimension<'a, S>> { - fn cmp(&self, cursor_location: &D, cx: &S::Context) -> Ordering; + fn cmp(&self, cursor_location: &D, cx: S::Context<'_>) -> Ordering; } impl<'a, S: Summary, D: Dimension<'a, S> + Ord> SeekTarget<'a, S, D> for D { - fn cmp(&self, cursor_location: &Self, _: &S::Context) -> Ordering { + fn cmp(&self, cursor_location: &Self, _: S::Context<'_>) -> Ordering { Ord::cmp(self, cursor_location) } } impl<'a, T: Summary> Dimension<'a, T> for () { - fn zero(_: &T::Context) -> Self {} + fn zero(_: T::Context<'_>) -> Self {} - fn add_summary(&mut self, _: &'a T, _: &T::Context) {} + fn add_summary(&mut self, _: &'a T, _: T::Context<'_>) {} } #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] @@ -105,11 +122,11 @@ pub struct Dimensions(pub D1, pub D2, pub D3); impl<'a, T: Summary, D1: Dimension<'a, T>, D2: Dimension<'a, T>, D3: Dimension<'a, T>> Dimension<'a, T> for Dimensions { - fn zero(cx: &T::Context) -> Self { + fn zero(cx: T::Context<'_>) -> Self { Dimensions(D1::zero(cx), D2::zero(cx), D3::zero(cx)) } - fn add_summary(&mut self, summary: &'a T, cx: &T::Context) { + fn add_summary(&mut self, summary: &'a T, cx: T::Context<'_>) { self.0.add_summary(summary, cx); self.1.add_summary(summary, cx); self.2.add_summary(summary, cx); @@ -123,7 +140,7 @@ where D2: Dimension<'a, S>, D3: Dimension<'a, S>, { - fn cmp(&self, cursor_location: &Dimensions, cx: &S::Context) -> Ordering { + fn cmp(&self, cursor_location: &Dimensions, cx: S::Context<'_>) -> Ordering { self.cmp(&cursor_location.0, cx) } } @@ -187,7 +204,7 @@ where } impl SumTree { - pub fn new(cx: &::Context) -> Self { + pub fn new(cx: ::Context<'_>) -> Self { SumTree(Arc::new(Node::Leaf { summary: ::zero(cx), items: ArrayVec::new(), @@ -204,7 +221,7 @@ impl SumTree { })) } - pub fn from_item(item: T, cx: &::Context) -> Self { + pub fn from_item(item: T, cx: ::Context<'_>) -> Self { let mut tree = Self::new(cx); tree.push(item, cx); tree @@ -212,7 +229,7 @@ impl SumTree { pub fn from_iter>( iter: I, - cx: &::Context, + cx: ::Context<'_>, ) -> Self { let mut nodes = Vec::new(); @@ -276,13 +293,13 @@ impl SumTree { } } - pub fn from_par_iter(iter: I, cx: &::Context) -> Self + pub fn from_par_iter(iter: I, cx: ::Context<'_>) -> Self where I: IntoParallelIterator, Iter: IndexedParallelIterator, T: Send + Sync, T::Summary: Send + Sync, - ::Context: Sync, + for<'a> ::Context<'a>: Sync, { let mut nodes = iter .into_par_iter() @@ -339,7 +356,7 @@ impl SumTree { } #[allow(unused)] - pub fn items(&self, cx: &::Context) -> Vec { + pub fn items<'a>(&'a self, cx: ::Context<'a>) -> Vec { let mut items = Vec::new(); let mut cursor = self.cursor::<()>(cx); cursor.next(); @@ -354,7 +371,10 @@ impl SumTree { Iter::new(self) } - pub fn cursor<'a, S>(&'a self, cx: &'a ::Context) -> Cursor<'a, T, S> + pub fn cursor<'a, 'b, S>( + &'a self, + cx: ::Context<'b>, + ) -> Cursor<'a, 'b, T, S> where S: Dimension<'a, T::Summary>, { @@ -363,11 +383,11 @@ impl SumTree { /// Note: If the summary type requires a non `()` context, then the filter cursor /// that is returned cannot be used with Rust's iterators. - pub fn filter<'a, F, U>( + pub fn filter<'a, 'b, F, U>( &'a self, - cx: &'a ::Context, + cx: ::Context<'b>, filter_node: F, - ) -> FilterCursor<'a, F, T, U> + ) -> FilterCursor<'a, 'b, F, T, U> where F: FnMut(&T::Summary) -> bool, U: Dimension<'a, T::Summary>, @@ -384,14 +404,18 @@ impl SumTree { self.rightmost_leaf().0.items().last() } - pub fn update_last(&mut self, f: impl FnOnce(&mut T), cx: &::Context) { + pub fn update_last( + &mut self, + f: impl FnOnce(&mut T), + cx: ::Context<'_>, + ) { self.update_last_recursive(f, cx); } fn update_last_recursive( &mut self, f: impl FnOnce(&mut T), - cx: &::Context, + cx: ::Context<'_>, ) -> Option { match Arc::make_mut(&mut self.0) { Node::Internal { @@ -426,7 +450,7 @@ impl SumTree { pub fn extent<'a, D: Dimension<'a, T::Summary>>( &'a self, - cx: &::Context, + cx: ::Context<'_>, ) -> D { let mut extent = D::zero(cx); match self.0.as_ref() { @@ -451,25 +475,25 @@ impl SumTree { } } - pub fn extend(&mut self, iter: I, cx: &::Context) + pub fn extend(&mut self, iter: I, cx: ::Context<'_>) where I: IntoIterator, { self.append(Self::from_iter(iter, cx), cx); } - pub fn par_extend(&mut self, iter: I, cx: &::Context) + pub fn par_extend(&mut self, iter: I, cx: ::Context<'_>) where I: IntoParallelIterator, Iter: IndexedParallelIterator, T: Send + Sync, T::Summary: Send + Sync, - ::Context: Sync, + for<'a> ::Context<'a>: Sync, { self.append(Self::from_par_iter(iter, cx), cx); } - pub fn push(&mut self, item: T, cx: &::Context) { + pub fn push(&mut self, item: T, cx: ::Context<'_>) { let summary = item.summary(cx); self.append( SumTree(Arc::new(Node::Leaf { @@ -481,7 +505,7 @@ impl SumTree { ); } - pub fn append(&mut self, other: Self, cx: &::Context) { + pub fn append(&mut self, other: Self, cx: ::Context<'_>) { if self.is_empty() { *self = other; } else if !other.0.is_leaf() || !other.0.items().is_empty() { @@ -498,7 +522,7 @@ impl SumTree { fn push_tree_recursive( &mut self, other: SumTree, - cx: &::Context, + cx: ::Context<'_>, ) -> Option> { match Arc::make_mut(&mut self.0) { Node::Internal { @@ -618,7 +642,7 @@ impl SumTree { fn from_child_trees( left: SumTree, right: SumTree, - cx: &::Context, + cx: ::Context<'_>, ) -> Self { let height = left.0.height() + 1; let mut child_summaries = ArrayVec::new(); @@ -663,13 +687,13 @@ impl PartialEq for SumTree { impl Eq for SumTree {} impl SumTree { - pub fn insert_or_replace( - &mut self, + pub fn insert_or_replace<'a, 'b>( + &'a mut self, item: T, - cx: &::Context, + cx: ::Context<'b>, ) -> Option { let mut replaced = None; - *self = { + { let mut cursor = self.cursor::(cx); let mut new_tree = cursor.slice(&item.key(), Bias::Left); if let Some(cursor_item) = cursor.item() @@ -680,12 +704,13 @@ impl SumTree { } new_tree.push(item, cx); new_tree.append(cursor.suffix(), cx); - new_tree + drop(cursor); + *self = new_tree }; replaced } - pub fn remove(&mut self, key: &T::Key, cx: &::Context) -> Option { + pub fn remove(&mut self, key: &T::Key, cx: ::Context<'_>) -> Option { let mut removed = None; *self = { let mut cursor = self.cursor::(cx); @@ -705,7 +730,7 @@ impl SumTree { pub fn edit( &mut self, mut edits: Vec>, - cx: &::Context, + cx: ::Context<'_>, ) -> Vec { if edits.is_empty() { return Vec::new(); @@ -760,7 +785,7 @@ impl SumTree { pub fn get<'a>( &'a self, key: &T::Key, - cx: &'a ::Context, + cx: ::Context<'a>, ) -> Option<&'a T> { let mut cursor = self.cursor::(cx); if cursor.seek(key, Bias::Left) { @@ -774,10 +799,10 @@ impl SumTree { impl Default for SumTree where T: Item, - S: Summary, + S: for<'a> Summary = ()>, { fn default() -> Self { - Self::new(&()) + Self::new(()) } } @@ -894,7 +919,7 @@ impl Edit { } } -fn sum<'a, T, I>(iter: I, cx: &T::Context) -> T +fn sum<'a, T, I>(iter: I, cx: T::Context<'_>) -> T where T: 'a + Summary, I: Iterator, @@ -920,16 +945,13 @@ mod tests { #[test] fn test_extend_and_push_tree() { let mut tree1 = SumTree::default(); - tree1.extend(0..20, &()); + tree1.extend(0..20, ()); let mut tree2 = SumTree::default(); - tree2.extend(50..100, &()); + tree2.extend(50..100, ()); - tree1.append(tree2, &()); - assert_eq!( - tree1.items(&()), - (0..20).chain(50..100).collect::>() - ); + tree1.append(tree2, ()); + assert_eq!(tree1.items(()), (0..20).chain(50..100).collect::>()); } #[test] @@ -953,53 +975,53 @@ mod tests { let mut tree = SumTree::::default(); let count = rng.random_range(0..10); if rng.random() { - tree.extend(rng.sample_iter(StandardUniform).take(count), &()); + tree.extend(rng.sample_iter(StandardUniform).take(count), ()); } else { let items = rng .sample_iter(StandardUniform) .take(count) .collect::>(); - tree.par_extend(items, &()); + tree.par_extend(items, ()); } for _ in 0..num_operations { - let splice_end = rng.random_range(0..tree.extent::(&()).0 + 1); + let splice_end = rng.random_range(0..tree.extent::(()).0 + 1); let splice_start = rng.random_range(0..splice_end + 1); let count = rng.random_range(0..10); - let tree_end = tree.extent::(&()); + let tree_end = tree.extent::(()); let new_items = rng .sample_iter(StandardUniform) .take(count) .collect::>(); - let mut reference_items = tree.items(&()); + let mut reference_items = tree.items(()); reference_items.splice(splice_start..splice_end, new_items.clone()); tree = { - let mut cursor = tree.cursor::(&()); + let mut cursor = tree.cursor::(()); let mut new_tree = cursor.slice(&Count(splice_start), Bias::Right); if rng.random() { - new_tree.extend(new_items, &()); + new_tree.extend(new_items, ()); } else { - new_tree.par_extend(new_items, &()); + new_tree.par_extend(new_items, ()); } cursor.seek(&Count(splice_end), Bias::Right); - new_tree.append(cursor.slice(&tree_end, Bias::Right), &()); + new_tree.append(cursor.slice(&tree_end, Bias::Right), ()); new_tree }; - assert_eq!(tree.items(&()), reference_items); + assert_eq!(tree.items(()), reference_items); assert_eq!( tree.iter().collect::>(), - tree.cursor::<()>(&()).collect::>() + tree.cursor::<()>(()).collect::>() ); - log::info!("tree items: {:?}", tree.items(&())); + log::info!("tree items: {:?}", tree.items(())); let mut filter_cursor = - tree.filter::<_, Count>(&(), |summary| summary.contains_even); + tree.filter::<_, Count>((), |summary| summary.contains_even); let expected_filtered_items = tree - .items(&()) + .items(()) .into_iter() .enumerate() .filter(|(_, item)| (item & 1) == 0) @@ -1038,7 +1060,7 @@ mod tests { assert_eq!(filter_cursor.item(), None); let mut before_start = false; - let mut cursor = tree.cursor::(&()); + let mut cursor = tree.cursor::(()); let start_pos = rng.random_range(0..=reference_items.len()); cursor.seek(&Count(start_pos), Bias::Right); let mut pos = rng.random_range(start_pos..=reference_items.len()); @@ -1084,7 +1106,7 @@ mod tests { } for _ in 0..10 { - let end = rng.random_range(0..tree.extent::(&()).0 + 1); + let end = rng.random_range(0..tree.extent::(()).0 + 1); let start = rng.random_range(0..end + 1); let start_bias = if rng.random() { Bias::Left @@ -1097,7 +1119,7 @@ mod tests { Bias::Right }; - let mut cursor = tree.cursor::(&()); + let mut cursor = tree.cursor::(()); cursor.seek(&Count(start), start_bias); let slice = cursor.slice(&Count(end), end_bias); @@ -1113,9 +1135,9 @@ mod tests { fn test_cursor() { // Empty tree let tree = SumTree::::default(); - let mut cursor = tree.cursor::(&()); + let mut cursor = tree.cursor::(()); assert_eq!( - cursor.slice(&Count(0), Bias::Right).items(&()), + cursor.slice(&Count(0), Bias::Right).items(()), Vec::::new() ); assert_eq!(cursor.item(), None); @@ -1135,10 +1157,10 @@ mod tests { // Single-element tree let mut tree = SumTree::::default(); - tree.extend(vec![1], &()); - let mut cursor = tree.cursor::(&()); + tree.extend(vec![1], ()); + let mut cursor = tree.cursor::(()); assert_eq!( - cursor.slice(&Count(0), Bias::Right).items(&()), + cursor.slice(&Count(0), Bias::Right).items(()), Vec::::new() ); assert_eq!(cursor.item(), Some(&1)); @@ -1158,8 +1180,8 @@ mod tests { assert_eq!(cursor.next_item(), None); assert_eq!(cursor.start().sum, 0); - let mut cursor = tree.cursor::(&()); - assert_eq!(cursor.slice(&Count(1), Bias::Right).items(&()), [1]); + let mut cursor = tree.cursor::(()); + assert_eq!(cursor.slice(&Count(1), Bias::Right).items(()), [1]); assert_eq!(cursor.item(), None); assert_eq!(cursor.prev_item(), Some(&1)); assert_eq!(cursor.next_item(), None); @@ -1168,8 +1190,8 @@ mod tests { cursor.seek(&Count(0), Bias::Right); assert_eq!( cursor - .slice(&tree.extent::(&()), Bias::Right) - .items(&()), + .slice(&tree.extent::(()), Bias::Right) + .items(()), [1] ); assert_eq!(cursor.item(), None); @@ -1179,10 +1201,10 @@ mod tests { // Multiple-element tree let mut tree = SumTree::default(); - tree.extend(vec![1, 2, 3, 4, 5, 6], &()); - let mut cursor = tree.cursor::(&()); + tree.extend(vec![1, 2, 3, 4, 5, 6], ()); + let mut cursor = tree.cursor::(()); - assert_eq!(cursor.slice(&Count(2), Bias::Right).items(&()), [1, 2]); + assert_eq!(cursor.slice(&Count(2), Bias::Right).items(()), [1, 2]); assert_eq!(cursor.item(), Some(&3)); assert_eq!(cursor.prev_item(), Some(&2)); assert_eq!(cursor.next_item(), Some(&4)); @@ -1261,12 +1283,12 @@ mod tests { assert_eq!(cursor.next_item(), Some(&2)); assert_eq!(cursor.start().sum, 0); - let mut cursor = tree.cursor::(&()); + let mut cursor = tree.cursor::(()); assert_eq!( cursor - .slice(&tree.extent::(&()), Bias::Right) - .items(&()), - tree.items(&()) + .slice(&tree.extent::(()), Bias::Right) + .items(()), + tree.items(()) ); assert_eq!(cursor.item(), None); assert_eq!(cursor.prev_item(), Some(&6)); @@ -1276,8 +1298,8 @@ mod tests { cursor.seek(&Count(3), Bias::Right); assert_eq!( cursor - .slice(&tree.extent::(&()), Bias::Right) - .items(&()), + .slice(&tree.extent::(()), Bias::Right) + .items(()), [4, 5, 6] ); assert_eq!(cursor.item(), None); @@ -1293,36 +1315,36 @@ mod tests { // Slicing without resetting starts from where the cursor is parked at. cursor.seek(&Count(1), Bias::Right); - assert_eq!(cursor.slice(&Count(3), Bias::Right).items(&()), vec![2, 3]); - assert_eq!(cursor.slice(&Count(6), Bias::Left).items(&()), vec![4, 5]); - assert_eq!(cursor.slice(&Count(6), Bias::Right).items(&()), vec![6]); + assert_eq!(cursor.slice(&Count(3), Bias::Right).items(()), vec![2, 3]); + assert_eq!(cursor.slice(&Count(6), Bias::Left).items(()), vec![4, 5]); + assert_eq!(cursor.slice(&Count(6), Bias::Right).items(()), vec![6]); } #[test] fn test_edit() { let mut tree = SumTree::::default(); - let removed = tree.edit(vec![Edit::Insert(1), Edit::Insert(2), Edit::Insert(0)], &()); - assert_eq!(tree.items(&()), vec![0, 1, 2]); + let removed = tree.edit(vec![Edit::Insert(1), Edit::Insert(2), Edit::Insert(0)], ()); + assert_eq!(tree.items(()), vec![0, 1, 2]); assert_eq!(removed, Vec::::new()); - assert_eq!(tree.get(&0, &()), Some(&0)); - assert_eq!(tree.get(&1, &()), Some(&1)); - assert_eq!(tree.get(&2, &()), Some(&2)); - assert_eq!(tree.get(&4, &()), None); + assert_eq!(tree.get(&0, ()), Some(&0)); + assert_eq!(tree.get(&1, ()), Some(&1)); + assert_eq!(tree.get(&2, ()), Some(&2)); + assert_eq!(tree.get(&4, ()), None); - let removed = tree.edit(vec![Edit::Insert(2), Edit::Insert(4), Edit::Remove(0)], &()); - assert_eq!(tree.items(&()), vec![1, 2, 4]); + let removed = tree.edit(vec![Edit::Insert(2), Edit::Insert(4), Edit::Remove(0)], ()); + assert_eq!(tree.items(()), vec![1, 2, 4]); assert_eq!(removed, vec![0, 2]); - assert_eq!(tree.get(&0, &()), None); - assert_eq!(tree.get(&1, &()), Some(&1)); - assert_eq!(tree.get(&2, &()), Some(&2)); - assert_eq!(tree.get(&4, &()), Some(&4)); + assert_eq!(tree.get(&0, ()), None); + assert_eq!(tree.get(&1, ()), Some(&1)); + assert_eq!(tree.get(&2, ()), Some(&2)); + assert_eq!(tree.get(&4, ()), Some(&4)); } #[test] fn test_from_iter() { assert_eq!( - SumTree::from_iter(0..100, &()).items(&()), + SumTree::from_iter(0..100, ()).items(()), (0..100).collect::>() ); @@ -1333,7 +1355,7 @@ mod tests { ix = (ix + 1) % 2; if ix == 1 { Some(1) } else { None } }); - assert_eq!(SumTree::from_iter(iterator, &()).items(&()), vec![1]); + assert_eq!(SumTree::from_iter(iterator, ()).items(()), vec![1]); } #[derive(Clone, Default, Debug)] @@ -1353,7 +1375,7 @@ mod tests { impl Item for u8 { type Summary = IntegersSummary; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { IntegersSummary { count: 1, sum: *self as usize, @@ -1371,14 +1393,12 @@ mod tests { } } - impl Summary for IntegersSummary { - type Context = (); - - fn zero(_cx: &()) -> Self { + impl ContextLessSummary for IntegersSummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, other: &Self, _: &()) { + fn add_summary(&mut self, other: &Self) { self.count += other.count; self.sum += other.sum; self.contains_even |= other.contains_even; @@ -1387,37 +1407,37 @@ mod tests { } impl Dimension<'_, IntegersSummary> for u8 { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &IntegersSummary, _: &()) { + fn add_summary(&mut self, summary: &IntegersSummary, _: ()) { *self = summary.max; } } impl Dimension<'_, IntegersSummary> for Count { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &IntegersSummary, _: &()) { + fn add_summary(&mut self, summary: &IntegersSummary, _: ()) { self.0 += summary.count; } } impl SeekTarget<'_, IntegersSummary, IntegersSummary> for Count { - fn cmp(&self, cursor_location: &IntegersSummary, _: &()) -> Ordering { + fn cmp(&self, cursor_location: &IntegersSummary, _: ()) -> Ordering { self.0.cmp(&cursor_location.count) } } impl Dimension<'_, IntegersSummary> for Sum { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &IntegersSummary, _: &()) { + fn add_summary(&mut self, summary: &IntegersSummary, _: ()) { self.0 += summary.sum; } } diff --git a/crates/sum_tree/src/tree_map.rs b/crates/sum_tree/src/tree_map.rs index 818214e4024497e20f1f7cc208421ffbbb1d0401..62630407083fc34d74fef0ebf5e17a44ce40f68e 100644 --- a/crates/sum_tree/src/tree_map.rs +++ b/crates/sum_tree/src/tree_map.rs @@ -1,6 +1,6 @@ use std::{cmp::Ordering, fmt::Debug}; -use crate::{Bias, Dimension, Edit, Item, KeyedItem, SeekTarget, SumTree, Summary}; +use crate::{Bias, ContextLessSummary, Dimension, Edit, Item, KeyedItem, SeekTarget, SumTree}; /// A cheaply-cloneable ordered map based on a [SumTree](crate::SumTree). #[derive(Clone, PartialEq, Eq)] @@ -44,7 +44,7 @@ impl TreeMap { entries .into_iter() .map(|(key, value)| MapEntry { key, value }), - &(), + (), ); Self(tree) } @@ -54,7 +54,7 @@ impl TreeMap { } pub fn get(&self, key: &K) -> Option<&V> { - let mut cursor = self.0.cursor::>(&()); + let mut cursor = self.0.cursor::>(()); cursor.seek(&MapKeyRef(Some(key)), Bias::Left); if let Some(item) = cursor.item() { if Some(key) == item.key().0.as_ref() { @@ -68,7 +68,7 @@ impl TreeMap { } pub fn insert(&mut self, key: K, value: V) { - self.0.insert_or_replace(MapEntry { key, value }, &()); + self.0.insert_or_replace(MapEntry { key, value }, ()); } pub fn extend(&mut self, iter: impl IntoIterator) { @@ -76,7 +76,7 @@ impl TreeMap { .into_iter() .map(|(key, value)| Edit::Insert(MapEntry { key, value })) .collect(); - self.0.edit(edits, &()); + self.0.edit(edits, ()); } pub fn clear(&mut self) { @@ -85,14 +85,14 @@ impl TreeMap { pub fn remove(&mut self, key: &K) -> Option { let mut removed = None; - let mut cursor = self.0.cursor::>(&()); + let mut cursor = self.0.cursor::>(()); let key = MapKeyRef(Some(key)); let mut new_tree = cursor.slice(&key, Bias::Left); - if key.cmp(&cursor.end(), &()) == Ordering::Equal { + if key.cmp(&cursor.end(), ()) == Ordering::Equal { removed = Some(cursor.item().unwrap().value.clone()); cursor.next(); } - new_tree.append(cursor.suffix(), &()); + new_tree.append(cursor.suffix(), ()); drop(cursor); self.0 = new_tree; removed @@ -101,17 +101,17 @@ impl TreeMap { pub fn remove_range(&mut self, start: &impl MapSeekTarget, end: &impl MapSeekTarget) { let start = MapSeekTargetAdaptor(start); let end = MapSeekTargetAdaptor(end); - let mut cursor = self.0.cursor::>(&()); + let mut cursor = self.0.cursor::>(()); let mut new_tree = cursor.slice(&start, Bias::Left); cursor.seek(&end, Bias::Left); - new_tree.append(cursor.suffix(), &()); + new_tree.append(cursor.suffix(), ()); drop(cursor); self.0 = new_tree; } /// Returns the key-value pair with the greatest key less than or equal to the given key. pub fn closest(&self, key: &K) -> Option<(&K, &V)> { - let mut cursor = self.0.cursor::>(&()); + let mut cursor = self.0.cursor::>(()); let key = MapKeyRef(Some(key)); cursor.seek(&key, Bias::Right); cursor.prev(); @@ -119,7 +119,7 @@ impl TreeMap { } pub fn iter_from<'a>(&'a self, from: &K) -> impl Iterator + 'a { - let mut cursor = self.0.cursor::>(&()); + let mut cursor = self.0.cursor::>(()); let from_key = MapKeyRef(Some(from)); cursor.seek(&from_key, Bias::Left); @@ -130,17 +130,17 @@ impl TreeMap { where F: FnOnce(&mut V) -> T, { - let mut cursor = self.0.cursor::>(&()); + let mut cursor = self.0.cursor::>(()); let key = MapKeyRef(Some(key)); let mut new_tree = cursor.slice(&key, Bias::Left); let mut result = None; - if key.cmp(&cursor.end(), &()) == Ordering::Equal { + if key.cmp(&cursor.end(), ()) == Ordering::Equal { let mut updated = cursor.item().unwrap().clone(); result = Some(f(&mut updated.value)); - new_tree.push(updated, &()); + new_tree.push(updated, ()); cursor.next(); } - new_tree.append(cursor.suffix(), &()); + new_tree.append(cursor.suffix(), ()); drop(cursor); self.0 = new_tree; result @@ -149,11 +149,11 @@ impl TreeMap { pub fn retain bool>(&mut self, mut predicate: F) { let mut new_map = SumTree::>::default(); - let mut cursor = self.0.cursor::>(&()); + let mut cursor = self.0.cursor::>(()); cursor.next(); while let Some(item) = cursor.item() { if predicate(&item.key, &item.value) { - new_map.push(item.clone(), &()); + new_map.push(item.clone(), ()); } cursor.next(); } @@ -189,7 +189,7 @@ impl TreeMap { }) .collect(); - self.0.edit(edits, &()); + self.0.edit(edits, ()); } } @@ -209,7 +209,7 @@ struct MapSeekTargetAdaptor<'a, T>(&'a T); impl<'a, K: Clone + Ord, T: MapSeekTarget> SeekTarget<'a, MapKey, MapKeyRef<'a, K>> for MapSeekTargetAdaptor<'_, T> { - fn cmp(&self, cursor_location: &MapKeyRef, _: &()) -> Ordering { + fn cmp(&self, cursor_location: &MapKeyRef, _: ()) -> Ordering { if let Some(key) = &cursor_location.0 { MapSeekTarget::cmp_cursor(self.0, key) } else { @@ -245,7 +245,7 @@ where { type Summary = MapKey; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { self.key() } } @@ -262,17 +262,15 @@ where } } -impl Summary for MapKey +impl ContextLessSummary for MapKey where K: Clone, { - type Context = (); - - fn zero(_cx: &()) -> Self { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &()) { + fn add_summary(&mut self, summary: &Self) { *self = summary.clone() } } @@ -281,11 +279,11 @@ impl<'a, K> Dimension<'a, MapKey> for MapKeyRef<'a, K> where K: Clone + Ord, { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a MapKey, _: &()) { + fn add_summary(&mut self, summary: &'a MapKey, _: ()) { self.0 = summary.0.as_ref(); } } @@ -294,7 +292,7 @@ impl<'a, K> SeekTarget<'a, MapKey, MapKeyRef<'a, K>> for MapKeyRef<'_, K> where K: Clone + Ord, { - fn cmp(&self, cursor_location: &MapKeyRef, _: &()) -> Ordering { + fn cmp(&self, cursor_location: &MapKeyRef, _: ()) -> Ordering { Ord::cmp(&self.0, &cursor_location.0) } } diff --git a/crates/supermaven/Cargo.toml b/crates/supermaven/Cargo.toml index 4fc6a618ff1b585d9365357dc3a33c1b148feb99..1ee8ca4ffc094210dd1edf231d9160556829745a 100644 --- a/crates/supermaven/Cargo.toml +++ b/crates/supermaven/Cargo.toml @@ -22,7 +22,6 @@ gpui.workspace = true language.workspace = true log.workspace = true postage.workspace = true -project.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true diff --git a/crates/supermaven/src/supermaven_completion_provider.rs b/crates/supermaven/src/supermaven_completion_provider.rs index 89c5129822d94229cd1644587f15f4a4de2bf86a..32177aaa427e8616a2767410a7a6ec84c05abbee 100644 --- a/crates/supermaven/src/supermaven_completion_provider.rs +++ b/crates/supermaven/src/supermaven_completion_provider.rs @@ -4,7 +4,6 @@ use edit_prediction::{Direction, EditPrediction, EditPredictionProvider}; use futures::StreamExt as _; use gpui::{App, Context, Entity, EntityId, Task}; use language::{Anchor, Buffer, BufferSnapshot}; -use project::Project; use std::{ ops::{AddAssign, Range}, path::Path, @@ -94,7 +93,7 @@ fn completion_from_diff( edits.push((edit_range, edit_text)); } - EditPrediction { + EditPrediction::Local { id: None, edits, edit_preview: None, @@ -132,7 +131,6 @@ impl EditPredictionProvider for SupermavenCompletionProvider { fn refresh( &mut self, - _project: Option>, buffer_handle: Entity, cursor_position: Anchor, debounce: bool, diff --git a/crates/supermaven_api/src/supermaven_api.rs b/crates/supermaven_api/src/supermaven_api.rs index c4b1409d646b0d402684d3c883a0ea633d12bbb5..539826c8176d0adf0e8ed1fb11ffdec8c15347a9 100644 --- a/crates/supermaven_api/src/supermaven_api.rs +++ b/crates/supermaven_api/src/supermaven_api.rs @@ -56,7 +56,15 @@ pub struct SupermavenDownloadResponse { #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct SupermavenUser { + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] id: String, + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] email: String, api_key: String, } diff --git a/crates/svg_preview/src/svg_preview_view.rs b/crates/svg_preview/src/svg_preview_view.rs index dfc346704e58c6f82c2dfbffc7822ad37156131f..432e91648cf751744168e89823fc59bc168c6714 100644 --- a/crates/svg_preview/src/svg_preview_view.rs +++ b/crates/svg_preview/src/svg_preview_view.rs @@ -240,7 +240,6 @@ impl SvgPreviewView { return file .path() .extension() - .and_then(|ext| ext.to_str()) .map(|ext| ext.eq_ignore_ascii_case("svg")) .unwrap_or(false); } diff --git a/crates/system_specs/src/system_specs.rs b/crates/system_specs/src/system_specs.rs index 731d335232cd5f7c2b9190e458aae9f1b96722b6..38f6ff4f0f57d27e55200c0855cdd212bac61e9e 100644 --- a/crates/system_specs/src/system_specs.rs +++ b/crates/system_specs/src/system_specs.rs @@ -146,6 +146,10 @@ impl Display for SystemSpecs { fn try_determine_available_gpus() -> Option { #[cfg(any(target_os = "linux", target_os = "freebsd"))] { + #[allow( + clippy::disallowed_methods, + reason = "we are not running in an executor" + )] std::process::Command::new("vulkaninfo") .args(&["--summary"]) .output() diff --git a/crates/tab_switcher/src/tab_switcher_tests.rs b/crates/tab_switcher/src/tab_switcher_tests.rs index e227a0e453d587db49076356ba0599706588bad7..43ce58496445fcc3936fe62b2fc0ac108652d382 100644 --- a/crates/tab_switcher/src/tab_switcher_tests.rs +++ b/crates/tab_switcher/src/tab_switcher_tests.rs @@ -4,8 +4,7 @@ use gpui::{TestAppContext, VisualTestContext}; use menu::SelectPrevious; use project::{Project, ProjectPath}; use serde_json::json; -use std::path::Path; -use util::path; +use util::{path, rel_path::rel_path}; use workspace::{AppState, Workspace}; #[ctor::ctor] @@ -331,7 +330,7 @@ async fn open_buffer( }); let project_path = ProjectPath { worktree_id, - path: Arc::from(Path::new(file_path)), + path: rel_path(file_path).into(), }; workspace .update_in(cx, move |workspace, window, cx| { diff --git a/crates/task/src/shell_builder.rs b/crates/task/src/shell_builder.rs index 4688ac0eb9dd306d0dedbe07c98adbfb5df4f45b..d6091997b27e89ff43b421e4ae5e58470510636f 100644 --- a/crates/task/src/shell_builder.rs +++ b/crates/task/src/shell_builder.rs @@ -1,207 +1,8 @@ -use std::fmt; - -use util::get_system_shell; +use util::shell::get_system_shell; use crate::Shell; -#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] -pub enum ShellKind { - #[default] - Posix, - Csh, - Fish, - Powershell, - Nushell, - Cmd, -} - -impl fmt::Display for ShellKind { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ShellKind::Posix => write!(f, "sh"), - ShellKind::Csh => write!(f, "csh"), - ShellKind::Fish => write!(f, "fish"), - ShellKind::Powershell => write!(f, "powershell"), - ShellKind::Nushell => write!(f, "nu"), - ShellKind::Cmd => write!(f, "cmd"), - } - } -} - -impl ShellKind { - pub fn system() -> Self { - Self::new(&get_system_shell()) - } - - pub fn new(program: &str) -> Self { - #[cfg(windows)] - let (_, program) = program.rsplit_once('\\').unwrap_or(("", program)); - #[cfg(not(windows))] - let (_, program) = program.rsplit_once('/').unwrap_or(("", program)); - if program == "powershell" - || program.ends_with("powershell.exe") - || program == "pwsh" - || program.ends_with("pwsh.exe") - { - ShellKind::Powershell - } else if program == "cmd" || program.ends_with("cmd.exe") { - ShellKind::Cmd - } else if program == "nu" { - ShellKind::Nushell - } else if program == "fish" { - ShellKind::Fish - } else if program == "csh" { - ShellKind::Csh - } else { - // Some other shell detected, the user might install and use a - // unix-like shell. - ShellKind::Posix - } - } - - fn to_shell_variable(self, input: &str) -> String { - match self { - Self::Powershell => Self::to_powershell_variable(input), - Self::Cmd => Self::to_cmd_variable(input), - Self::Posix => input.to_owned(), - Self::Fish => input.to_owned(), - Self::Csh => input.to_owned(), - Self::Nushell => Self::to_nushell_variable(input), - } - } - - fn to_cmd_variable(input: &str) -> String { - if let Some(var_str) = input.strip_prefix("${") { - if var_str.find(':').is_none() { - // If the input starts with "${", remove the trailing "}" - format!("%{}%", &var_str[..var_str.len() - 1]) - } else { - // `${SOME_VAR:-SOME_DEFAULT}`, we currently do not handle this situation, - // which will result in the task failing to run in such cases. - input.into() - } - } else if let Some(var_str) = input.strip_prefix('$') { - // If the input starts with "$", directly append to "$env:" - format!("%{}%", var_str) - } else { - // If no prefix is found, return the input as is - input.into() - } - } - fn to_powershell_variable(input: &str) -> String { - if let Some(var_str) = input.strip_prefix("${") { - if var_str.find(':').is_none() { - // If the input starts with "${", remove the trailing "}" - format!("$env:{}", &var_str[..var_str.len() - 1]) - } else { - // `${SOME_VAR:-SOME_DEFAULT}`, we currently do not handle this situation, - // which will result in the task failing to run in such cases. - input.into() - } - } else if let Some(var_str) = input.strip_prefix('$') { - // If the input starts with "$", directly append to "$env:" - format!("$env:{}", var_str) - } else { - // If no prefix is found, return the input as is - input.into() - } - } - - fn to_nushell_variable(input: &str) -> String { - let mut result = String::new(); - let mut source = input; - let mut is_start = true; - - loop { - match source.chars().next() { - None => return result, - Some('$') => { - source = Self::parse_nushell_var(&source[1..], &mut result, is_start); - is_start = false; - } - Some(_) => { - is_start = false; - let chunk_end = source.find('$').unwrap_or(source.len()); - let (chunk, rest) = source.split_at(chunk_end); - result.push_str(chunk); - source = rest; - } - } - } - } - - fn parse_nushell_var<'a>(source: &'a str, text: &mut String, is_start: bool) -> &'a str { - if source.starts_with("env.") { - text.push('$'); - return source; - } - - match source.chars().next() { - Some('{') => { - let source = &source[1..]; - if let Some(end) = source.find('}') { - let var_name = &source[..end]; - if !var_name.is_empty() { - if !is_start { - text.push_str("("); - } - text.push_str("$env."); - text.push_str(var_name); - if !is_start { - text.push_str(")"); - } - &source[end + 1..] - } else { - text.push_str("${}"); - &source[end + 1..] - } - } else { - text.push_str("${"); - source - } - } - Some(c) if c.is_alphabetic() || c == '_' => { - let end = source - .find(|c: char| !c.is_alphanumeric() && c != '_') - .unwrap_or(source.len()); - let var_name = &source[..end]; - if !is_start { - text.push_str("("); - } - text.push_str("$env."); - text.push_str(var_name); - if !is_start { - text.push_str(")"); - } - &source[end..] - } - _ => { - text.push('$'); - source - } - } - } - - fn args_for_shell(&self, interactive: bool, combined_command: String) -> Vec { - match self { - ShellKind::Powershell => vec!["-C".to_owned(), combined_command], - ShellKind::Cmd => vec!["/C".to_owned(), combined_command], - ShellKind::Posix | ShellKind::Nushell | ShellKind::Fish | ShellKind::Csh => interactive - .then(|| "-i".to_owned()) - .into_iter() - .chain(["-c".to_owned(), combined_command]) - .collect(), - } - } - - pub fn command_prefix(&self) -> Option { - match self { - ShellKind::Powershell => Some('&'), - ShellKind::Nushell => Some('^'), - _ => None, - } - } -} +pub use util::shell::ShellKind; /// ShellBuilder is used to turn a user-requested task into a /// program that can be executed by the shell. @@ -210,19 +11,18 @@ pub struct ShellBuilder { program: String, args: Vec, interactive: bool, + /// Whether to redirect stdin to /dev/null for the spawned command as a subshell. + redirect_stdin: bool, kind: ShellKind, } impl ShellBuilder { /// Create a new ShellBuilder as configured. - pub fn new(remote_system_shell: Option<&str>, shell: &Shell) -> Self { - let (program, args) = match remote_system_shell { - Some(program) => (program.to_string(), Vec::new()), - None => match shell { - Shell::System => (get_system_shell(), Vec::new()), - Shell::Program(shell) => (shell.clone(), Vec::new()), - Shell::WithArguments { program, args, .. } => (program.clone(), args.clone()), - }, + pub fn new(shell: &Shell) -> Self { + let (program, args) = match shell { + Shell::System => (get_system_shell(), Vec::new()), + Shell::Program(shell) => (shell.clone(), Vec::new()), + Shell::WithArguments { program, args, .. } => (program.clone(), args.clone()), }; let kind = ShellKind::new(&program); @@ -231,6 +31,7 @@ impl ShellBuilder { args, interactive: true, kind, + redirect_stdin: false, } } pub fn non_interactive(mut self) -> Self { @@ -239,23 +40,39 @@ impl ShellBuilder { } /// Returns the label to show in the terminal tab - pub fn command_label(&self, command_label: &str) -> String { - match self.kind { - ShellKind::Powershell => { - format!("{} -C '{}'", self.program, command_label) - } - ShellKind::Cmd => { - format!("{} /C '{}'", self.program, command_label) - } - ShellKind::Posix | ShellKind::Nushell | ShellKind::Fish | ShellKind::Csh => { - let interactivity = self.interactive.then_some("-i ").unwrap_or_default(); - format!( - "{} {interactivity}-c '$\"{}\"'", - self.program, command_label - ) + pub fn command_label(&self, command_to_use_in_label: &str) -> String { + if command_to_use_in_label.trim().is_empty() { + self.program.clone() + } else { + match self.kind { + ShellKind::PowerShell => { + format!("{} -C '{}'", self.program, command_to_use_in_label) + } + ShellKind::Cmd => { + format!("{} /C \"{}\"", self.program, command_to_use_in_label) + } + ShellKind::Posix + | ShellKind::Nushell + | ShellKind::Fish + | ShellKind::Csh + | ShellKind::Tcsh + | ShellKind::Rc + | ShellKind::Xonsh => { + let interactivity = self.interactive.then_some("-i ").unwrap_or_default(); + format!( + "{PROGRAM} {interactivity}-c '{command_to_use_in_label}'", + PROGRAM = self.program + ) + } } } } + + pub fn redirect_stdin_to_dev_null(mut self) -> Self { + self.redirect_stdin = true; + self + } + /// Returns the program and arguments to run this task in a shell. pub fn build( mut self, @@ -263,11 +80,35 @@ impl ShellBuilder { task_args: &[String], ) -> (String, Vec) { if let Some(task_command) = task_command { - let combined_command = task_args.iter().fold(task_command, |mut command, arg| { + let mut combined_command = task_args.iter().fold(task_command, |mut command, arg| { command.push(' '); command.push_str(&self.kind.to_shell_variable(arg)); command }); + if self.redirect_stdin { + match self.kind { + ShellKind::Fish => { + combined_command.insert_str(0, "begin; "); + combined_command.push_str("; end { + combined_command.insert(0, '('); + combined_command.push_str(") { + combined_command.insert_str(0, "$null | & {"); + combined_command.push_str("}"); + } + ShellKind::Cmd => { + combined_command.push_str("< NUL"); + } + } + } self.args .extend(self.kind.args_for_shell(self.interactive, combined_command)); @@ -284,7 +125,7 @@ mod test { #[test] fn test_nu_shell_variable_substitution() { let shell = Shell::Program("nu".to_owned()); - let shell_builder = ShellBuilder::new(None, &shell); + let shell_builder = ShellBuilder::new(&shell); let (program, args) = shell_builder.build( Some("echo".into()), @@ -308,4 +149,30 @@ mod test { ] ); } + + #[test] + fn redirect_stdin_to_dev_null_precedence() { + let shell = Shell::Program("nu".to_owned()); + let shell_builder = ShellBuilder::new(&shell); + + let (program, args) = shell_builder + .redirect_stdin_to_dev_null() + .build(Some("echo".into()), &["nothing".to_string()]); + + assert_eq!(program, "nu"); + assert_eq!(args, vec!["-i", "-c", "(echo nothing) String { + match self { + Shell::Program(program) => program.clone(), + Shell::WithArguments { program, .. } => program.clone(), + Shell::System => get_system_shell(), + } + } + + pub fn program_and_args(&self) -> (String, &[String]) { + match self { + Shell::Program(program) => (program.clone(), &[]), + Shell::WithArguments { program, args, .. } => (program.clone(), args), + Shell::System => (get_system_shell(), &[]), + } + } + + pub fn shell_kind(&self) -> ShellKind { + match self { + Shell::Program(program) => ShellKind::new(program), + Shell::WithArguments { program, .. } => ShellKind::new(program), + Shell::System => ShellKind::system(), + } + } +} + type VsCodeEnvVariable = String; type ZedEnvVariable = String; diff --git a/crates/task/src/task_template.rs b/crates/task/src/task_template.rs index a57f5a175af3fd79ce6b8ef818e3fb97acdc32c2..33ff610b6e1ba509c75138ad4bf35478e69deaf1 100644 --- a/crates/task/src/task_template.rs +++ b/crates/task/src/task_template.rs @@ -115,13 +115,13 @@ pub struct TaskTemplates(pub Vec); impl TaskTemplates { /// Generates JSON schema of Tasks JSON template format. - pub fn generate_json_schema() -> serde_json_lenient::Value { + pub fn generate_json_schema() -> serde_json::Value { let schema = schemars::generate::SchemaSettings::draft2019_09() .with_transform(DefaultDenyUnknownFields) .into_generator() .root_schema_for::(); - serde_json_lenient::to_value(schema).unwrap() + serde_json::to_value(schema).unwrap() } } diff --git a/crates/task/src/vscode_debug_format.rs b/crates/task/src/vscode_debug_format.rs index 5e21cd65302a11a8106881077b0f08c118ed215e..9b3f2e808b750e60d494c0b92abf78bb8c698227 100644 --- a/crates/task/src/vscode_debug_format.rs +++ b/crates/task/src/vscode_debug_format.rs @@ -6,13 +6,6 @@ use crate::{ DebugScenario, DebugTaskFile, EnvVariableReplacer, TcpArgumentsTemplate, VariableName, }; -#[derive(Clone, Debug, Deserialize, PartialEq)] -#[serde(rename_all = "camelCase")] -enum Request { - Launch, - Attach, -} - // TODO support preLaunchTask linkage with other tasks #[derive(Clone, Debug, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] diff --git a/crates/tasks_ui/src/modal.rs b/crates/tasks_ui/src/modal.rs index d87de1d1b3f1dc863baeb0c4136ba9e9b657eb19..db639b08bcc045c85ceec211cf206239a4669cbe 100644 --- a/crates/tasks_ui/src/modal.rs +++ b/crates/tasks_ui/src/modal.rs @@ -182,7 +182,7 @@ impl TasksModal { id: _, directory_in_worktree: dir, id_base: _, - } => dir.ends_with(".zed"), + } => dir.file_name().is_some_and(|name| name == ".zed"), _ => false, }); // todo(debugger): We're always adding lsp tasks here even if prefer_lsp is false @@ -193,7 +193,7 @@ impl TasksModal { TaskSourceKind::Worktree { directory_in_worktree: dir, .. - } => !(hide_vscode && dir.ends_with(".vscode")), + } => !(hide_vscode && dir.file_name().is_some_and(|name| name == ".vscode")), TaskSourceKind::Language { .. } => add_current_language_tasks, _ => true, } @@ -481,7 +481,6 @@ impl PickerDelegate for TasksModalDelegate { let highlighted_location = HighlightedMatch { text: hit.string.clone(), highlight_positions: hit.positions.clone(), - char_count: hit.string.chars().count(), color: Color::Default, }; let icon = match source_kind { @@ -492,7 +491,7 @@ impl PickerDelegate for TasksModalDelegate { language_name: name, .. } - | TaskSourceKind::Language { name } => file_icons::FileIcons::get(cx) + | TaskSourceKind::Language { name, .. } => file_icons::FileIcons::get(cx) .get_icon_for_type(&name.to_lowercase(), cx) .map(Icon::from_path), } diff --git a/crates/tasks_ui/src/tasks_ui.rs b/crates/tasks_ui/src/tasks_ui.rs index 3f3a4cc11660633df75c0dd896b19910cc06d680..ce925cdd7e2f60497fb9e6d37c44332958875530 100644 --- a/crates/tasks_ui/src/tasks_ui.rs +++ b/crates/tasks_ui/src/tasks_ui.rs @@ -379,7 +379,7 @@ fn worktree_context(worktree_abs_path: &Path) -> TaskContext { let mut task_variables = TaskVariables::default(); task_variables.insert( VariableName::WorktreeRoot, - worktree_abs_path.to_string_lossy().to_string(), + worktree_abs_path.to_string_lossy().into_owned(), ); TaskContext { cwd: Some(worktree_abs_path.to_path_buf()), @@ -399,7 +399,7 @@ mod tests { use serde_json::json; use task::{TaskContext, TaskVariables, VariableName}; use ui::VisualContext; - use util::path; + use util::{path, rel_path::rel_path}; use workspace::{AppState, Workspace}; use crate::task_contexts; @@ -479,8 +479,9 @@ mod tests { let buffer1 = workspace .update(cx, |this, cx| { - this.project() - .update(cx, |this, cx| this.open_buffer((worktree_id, "a.ts"), cx)) + this.project().update(cx, |this, cx| { + this.open_buffer((worktree_id, rel_path("a.ts")), cx) + }) }) .await .unwrap(); @@ -493,7 +494,7 @@ mod tests { let buffer2 = workspace .update(cx, |this, cx| { this.project().update(cx, |this, cx| { - this.open_buffer((worktree_id, "rust/b.rs"), cx) + this.open_buffer((worktree_id, rel_path("rust/b.rs")), cx) }) }) .await diff --git a/crates/terminal/Cargo.toml b/crates/terminal/Cargo.toml index de27b5e11746576c5923b8a2fca584b39161234d..3c08c1b8617b0ae9c9ca1ec02a25243070e6f4db 100644 --- a/crates/terminal/Cargo.toml +++ b/crates/terminal/Cargo.toml @@ -26,10 +26,10 @@ collections.workspace = true futures.workspace = true gpui.workspace = true libc.workspace = true +log.workspace = true release_channel.workspace = true schemars.workspace = true serde.workspace = true -serde_derive.workspace = true settings.workspace = true sysinfo.workspace = true smol.workspace = true diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index d926faaf484b84dc7cf17b1ef0b816f5773ff02c..0d1073b41bc19e01ac03de24b40e93a13488baca 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -25,7 +25,8 @@ use alacritty_terminal::{ ClearMode, CursorStyle as AlacCursorStyle, Handler, NamedPrivateMode, PrivateMode, }, }; -use anyhow::{Result, bail}; +use anyhow::{Context as _, Result, bail}; +use log::trace; use futures::{ FutureExt, @@ -40,11 +41,11 @@ use mappings::mouse::{ use collections::{HashMap, VecDeque}; use futures::StreamExt; -use pty_info::PtyProcessInfo; +use pty_info::{ProcessIdGetter, PtyProcessInfo}; use serde::{Deserialize, Serialize}; use settings::Settings; use smol::channel::{Receiver, Sender}; -use task::{HideStrategy, Shell, TaskId}; +use task::{HideStrategy, Shell, SpawnInTerminal}; use terminal_hyperlinks::RegexSearches; use terminal_settings::{AlternateScroll, CursorShape, TerminalSettings}; use theme::{ActiveTheme, Theme}; @@ -120,7 +121,7 @@ const DEBUG_CELL_WIDTH: Pixels = px(5.); const DEBUG_LINE_HEIGHT: Pixels = px(5.); ///Upward flowing events, for changing the title and such -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum Event { TitleChanged, BreadcrumbsChanged, @@ -133,7 +134,7 @@ pub enum Event { Open(MaybeNavigationTarget), } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct PathLikeTarget { /// File system path, absolute or relative, existing or not. /// Might have line and column number(s) attached as `file.rs:1:23` @@ -143,7 +144,7 @@ pub struct PathLikeTarget { } /// A string inside terminal, potentially useful as a URI that can be opened. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum MaybeNavigationTarget { /// HTTP, git, etc. string determined by the `URL_REGEX` regex. Url(String), @@ -338,6 +339,77 @@ pub struct TerminalBuilder { } impl TerminalBuilder { + pub fn new_display_only( + cursor_shape: CursorShape, + alternate_scroll: AlternateScroll, + max_scroll_history_lines: Option, + window_id: u64, + ) -> Result { + // Create a display-only terminal (no actual PTY). + let default_cursor_style = AlacCursorStyle::from(cursor_shape); + let scrolling_history = max_scroll_history_lines + .unwrap_or(DEFAULT_SCROLL_HISTORY_LINES) + .min(MAX_SCROLL_HISTORY_LINES); + let config = Config { + scrolling_history, + default_cursor_style, + ..Config::default() + }; + + let (events_tx, events_rx) = unbounded(); + let mut term = Term::new( + config.clone(), + &TerminalBounds::default(), + ZedListener(events_tx), + ); + + if let AlternateScroll::Off = alternate_scroll { + term.unset_private_mode(PrivateMode::Named(NamedPrivateMode::AlternateScroll)); + } + + let term = Arc::new(FairMutex::new(term)); + + let terminal = Terminal { + task: None, + terminal_type: TerminalType::DisplayOnly, + completion_tx: None, + term, + term_config: config, + title_override: None, + events: VecDeque::with_capacity(10), + last_content: Default::default(), + last_mouse: None, + matches: Vec::new(), + selection_head: None, + breadcrumb_text: String::new(), + scroll_px: px(0.), + next_link_id: 0, + selection_phase: SelectionPhase::Ended, + hyperlink_regex_searches: RegexSearches::new(), + vi_mode_enabled: false, + is_ssh_terminal: false, + last_mouse_move_time: Instant::now(), + last_hyperlink_search_position: None, + #[cfg(windows)] + shell_program: None, + activation_script: Vec::new(), + template: CopyTemplate { + shell: Shell::System, + env: HashMap::default(), + cursor_shape, + alternate_scroll, + max_scroll_history_lines, + window_id, + }, + child_exited: None, + }; + + Ok(TerminalBuilder { + terminal, + events_rx, + }) + } + pub fn new( working_directory: Option, task: Option, @@ -364,6 +436,7 @@ impl TerminalBuilder { env.insert("ZED_TERM".to_string(), "true".to_string()); env.insert("TERM_PROGRAM".to_string(), "zed".to_string()); env.insert("TERM".to_string(), "xterm-256color".to_string()); + env.insert("COLORTERM".to_string(), "truecolor".to_string()); env.insert( "TERM_PROGRAM_VERSION".to_string(), release_channel::AppVersion::global(cx).to_string(), @@ -376,31 +449,40 @@ impl TerminalBuilder { title_override: Option, } + impl ShellParams { + fn new( + program: String, + args: Option>, + title_override: Option, + ) -> Self { + log::info!("Using {program} as shell"); + Self { + program, + args, + title_override, + } + } + } + let shell_params = match shell.clone() { Shell::System => { #[cfg(target_os = "windows")] { - Some(ShellParams { - program: util::get_windows_system_shell(), - ..Default::default() - }) + Some(ShellParams::new( + util::shell::get_windows_system_shell(), + None, + None, + )) } #[cfg(not(target_os = "windows"))] None } - Shell::Program(program) => Some(ShellParams { - program, - ..Default::default() - }), + Shell::Program(program) => Some(ShellParams::new(program, None, None)), Shell::WithArguments { program, args, title_override, - } => Some(ShellParams { - program, - args: Some(args), - title_override, - }), + } => Some(ShellParams::new(program, Some(args), title_override)), }; let terminal_title_override = shell_params.as_ref().and_then(|e| e.title_override.clone()); @@ -413,6 +495,8 @@ impl TerminalBuilder { .unwrap_or(params.program.clone()) }); + let shell_kind = shell.shell_kind(); + let pty_options = { let alac_shell = shell_params.as_ref().map(|params| { alacritty_terminal::tty::Shell::new( @@ -426,6 +510,10 @@ impl TerminalBuilder { working_directory: working_directory.clone(), drain_on_exit: true, env: env.clone().into_iter().collect(), + // We do not want to escape arguments if we are using CMD as our shell. + // If we do we end up with too many quotes/escaped quotes for CMD to handle. + #[cfg(windows)] + escape_args: shell_kind != util::shell::ShellKind::Cmd, } }; @@ -486,7 +574,8 @@ impl TerminalBuilder { pty, pty_options.drain_on_exit, false, - )?; + ) + .context("failed to create event loop")?; //Kick things off let pty_tx = event_loop.channel(); @@ -494,9 +583,12 @@ impl TerminalBuilder { let no_task = task.is_none(); - let mut terminal = Terminal { + let terminal = Terminal { task, - pty_tx: Notifier(pty_tx), + terminal_type: TerminalType::Pty { + pty_tx: Notifier(pty_tx), + info: pty_info, + }, completion_tx, term, term_config: config, @@ -506,12 +598,10 @@ impl TerminalBuilder { last_mouse: None, matches: Vec::new(), selection_head: None, - pty_info, breadcrumb_text: String::new(), scroll_px: px(0.), next_link_id: 0, selection_phase: SelectionPhase::Ended, - // hovered_word: false, hyperlink_regex_searches: RegexSearches::new(), vi_mode_enabled: false, is_ssh_terminal, @@ -528,18 +618,28 @@ impl TerminalBuilder { max_scroll_history_lines, window_id, }, + child_exited: None, }; if !activation_script.is_empty() && no_task { for activation_script in activation_script { - terminal.input(activation_script.into_bytes()); - terminal.write_to_pty(if cfg!(windows) { - &b"\r\n"[..] - } else { - &b"\n"[..] - }); + terminal.write_to_pty(activation_script.into_bytes()); + // Simulate enter key press + // NOTE(PowerShell): using `\r\n` will put PowerShell in a continuation mode (infamous >> character) + // and generally mess up the rendering. + terminal.write_to_pty(b"\x0d"); } - terminal.clear(); + // In order to clear the screen at this point, we have two options: + // 1. We can send a shell-specific command such as "clear" or "cls" + // 2. We can "echo" a marker message that we will then catch when handling a Wakeup event + // and clear the screen using `terminal.clear()` method + // We cannot issue a `terminal.clear()` command at this point as alacritty is evented + // and while we have sent the activation script to the pty, it will be executed asynchronously. + // Therefore, we somehow need to wait for the activation script to finish executing before we + // can proceed with clearing the screen. + terminal.write_to_pty(shell_kind.clear_screen_command().as_bytes()); + // Simulate enter key press + terminal.write_to_pty(b"\x0d"); } Ok(TerminalBuilder { @@ -699,8 +799,16 @@ pub enum SelectionPhase { Ended, } +enum TerminalType { + Pty { + pty_tx: Notifier, + info: PtyProcessInfo, + }, + DisplayOnly, +} + pub struct Terminal { - pty_tx: Notifier, + terminal_type: TerminalType, completion_tx: Option>>, term: Arc>>, term_config: Config, @@ -711,7 +819,6 @@ pub struct Terminal { pub last_content: TerminalContent, pub selection_head: Option, pub breadcrumb_text: String, - pub pty_info: PtyProcessInfo, title_override: Option, scroll_px: Pixels, next_link_id: usize, @@ -726,6 +833,7 @@ pub struct Terminal { shell_program: Option, template: CopyTemplate, activation_script: Vec, + child_exited: Option, } struct CopyTemplate { @@ -737,17 +845,11 @@ struct CopyTemplate { window_id: u64, } +#[derive(Debug)] pub struct TaskState { - pub id: TaskId, - pub full_label: String, - pub label: String, - pub command_label: String, pub status: TaskStatus, pub completion_rx: Receiver>, - pub hide: HideStrategy, - pub show_summary: bool, - pub show_command: bool, - pub show_rerun: bool, + pub spawned_task: SpawnInTerminal, } /// A status of the current terminal tab's task. @@ -833,8 +935,10 @@ impl Terminal { AlacTermEvent::Wakeup => { cx.emit(Event::Wakeup); - if self.pty_info.has_changed() { - cx.emit(Event::TitleChanged); + if let TerminalType::Pty { info, .. } = &mut self.terminal_type { + if info.has_changed() { + cx.emit(Event::TitleChanged); + } } } AlacTermEvent::ColorRequest(index, format) => { @@ -869,17 +973,21 @@ impl Terminal { ) { match event { &InternalEvent::Resize(mut new_bounds) => { + trace!("Resizing: new_bounds={new_bounds:?}"); new_bounds.bounds.size.height = cmp::max(new_bounds.line_height, new_bounds.height()); new_bounds.bounds.size.width = cmp::max(new_bounds.cell_width, new_bounds.width()); self.last_content.terminal_bounds = new_bounds; - self.pty_tx.0.send(Msg::Resize(new_bounds.into())).ok(); + if let TerminalType::Pty { pty_tx, .. } = &self.terminal_type { + pty_tx.0.send(Msg::Resize(new_bounds.into())).ok(); + } term.resize(new_bounds); } InternalEvent::Clear => { + trace!("Clearing"); // Clear back buffer term.clear_screen(ClearMode::Saved); @@ -912,6 +1020,7 @@ impl Terminal { cx.emit(Event::Wakeup); } InternalEvent::Scroll(scroll) => { + trace!("Scrolling: scroll={scroll:?}"); term.scroll_display(*scroll); self.refresh_hovered_word(window); @@ -953,6 +1062,7 @@ impl Terminal { } } InternalEvent::SetSelection(selection) => { + trace!("Setting selection: selection={selection:?}"); term.selection = selection.as_ref().map(|(sel, _)| sel.clone()); #[cfg(any(target_os = "linux", target_os = "freebsd"))] @@ -966,6 +1076,7 @@ impl Terminal { cx.emit(Event::SelectionsChanged) } InternalEvent::UpdateSelection(position) => { + trace!("Updating selection: position={position:?}"); if let Some(mut selection) = term.selection.take() { let (point, side) = grid_point_and_side( *position, @@ -987,6 +1098,7 @@ impl Terminal { } InternalEvent::Copy(keep_selection) => { + trace!("Copying selection: keep_selection={keep_selection:?}"); if let Some(txt) = term.selection_to_string() { cx.write_to_clipboard(ClipboardItem::new_string(txt)); if !keep_selection.unwrap_or_else(|| { @@ -998,21 +1110,26 @@ impl Terminal { } } InternalEvent::ScrollToAlacPoint(point) => { + trace!("Scrolling to point: point={point:?}"); term.scroll_to_point(*point); self.refresh_hovered_word(window); } InternalEvent::MoveViCursorToAlacPoint(point) => { + trace!("Move vi cursor to point: point={point:?}"); term.vi_goto_point(*point); self.refresh_hovered_word(window); } InternalEvent::ToggleViMode => { + trace!("Toggling vi mode"); self.vi_mode_enabled = !self.vi_mode_enabled; term.toggle_vi_mode(); } InternalEvent::ViMotion(motion) => { + trace!("Performing vi motion: motion={motion:?}"); term.vi_motion(*motion); } InternalEvent::FindHyperlink(position, open) => { + trace!("Finding hyperlink at position: position={position:?}, open={open:?}"); let prev_hovered_word = self.last_content.last_hovered_word.take(); let point = grid_point( @@ -1115,6 +1232,37 @@ impl Terminal { self.term.lock().set_options(self.term_config.clone()); } + pub fn write_output(&mut self, bytes: &[u8], cx: &mut Context) { + // Inject bytes directly into the terminal emulator and refresh the UI. + // This bypasses the PTY/event loop for display-only terminals. + // + // We first convert LF to CRLF, to get the expected line wrapping in Alacritty. + // When output comes from piped commands (not a PTY) such as codex-acp, and that + // output only contains LF (\n) without a CR (\r) after it, such as the output + // of the `ls` command when running outside a PTY, Alacritty moves the cursor + // cursor down a line but does not move it back to the initial column. This makes + // the rendered output look ridiculous. To prevent this, we insert a CR (\r) before + // each LF that didn't already have one. (Alacritty doesn't have a setting for this.) + let mut converted = Vec::with_capacity(bytes.len()); + let mut prev_byte = 0u8; + for &byte in bytes { + if byte == b'\n' && prev_byte != b'\r' { + converted.push(b'\r'); + } + converted.push(byte); + prev_byte = byte; + } + + let mut processor = alacritty_terminal::vte::ansi::Processor::< + alacritty_terminal::vte::ansi::StdSyncHandler, + >::new(); + { + let mut term = self.term.lock(); + processor.advance(&mut *term, &converted); + } + cx.emit(Event::Wakeup); + } + pub fn total_lines(&self) -> usize { let term = self.term.clone(); let terminal = term.lock_unfair(); @@ -1235,9 +1383,12 @@ impl Terminal { } } - ///Write the Input payload to the tty. + /// Write the Input payload to the PTY, if applicable. + /// (This is a no-op for display-only terminals.) fn write_to_pty(&self, input: impl Into>) { - self.pty_tx.notify(input.into()); + if let TerminalType::Pty { pty_tx, .. } = &self.terminal_type { + pty_tx.notify(input.into()); + } } pub fn input(&mut self, input: impl Into>) { @@ -1541,7 +1692,7 @@ impl Terminal { && let Some(bytes) = mouse_moved_report(point, e.pressed_button, e.modifiers, self.last_content.mode) { - self.pty_tx.notify(bytes); + self.write_to_pty(bytes); } } else if e.modifiers.secondary() { self.word_from_position(e.position); @@ -1648,7 +1799,7 @@ impl Terminal { if let Some(bytes) = mouse_button_report(point, e.button, e.modifiers, true, self.last_content.mode) { - self.pty_tx.notify(bytes); + self.write_to_pty(bytes); } } else { match e.button { @@ -1707,7 +1858,7 @@ impl Terminal { if let Some(bytes) = mouse_button_report(point, e.button, e.modifiers, false, self.last_content.mode) { - self.pty_tx.notify(bytes); + self.write_to_pty(bytes); } } else { if e.button == MouseButton::Left && setting.copy_on_select { @@ -1746,7 +1897,7 @@ impl Terminal { if let Some(scrolls) = scroll_report(point, scroll_lines, e, self.last_content.mode) { for scroll in scrolls { - self.pty_tx.notify(scroll); + self.write_to_pty(scroll); } }; } else if self @@ -1755,7 +1906,7 @@ impl Terminal { .contains(TermMode::ALT_SCREEN | TermMode::ALTERNATE_SCROLL) && !e.shift { - self.pty_tx.notify(alt_scroll(scroll_lines)) + self.write_to_pty(alt_scroll(scroll_lines)); } else if scroll_lines != 0 { let scroll = AlacScroll::Delta(scroll_lines); @@ -1826,10 +1977,12 @@ impl Terminal { /// This does *not* return the working directory of the shell that runs on the /// remote host, in case Zed is connected to a remote host. fn client_side_working_directory(&self) -> Option { - self.pty_info - .current - .as_ref() - .map(|process| process.cwd.clone()) + match &self.terminal_type { + TerminalType::Pty { info, .. } => { + info.current.as_ref().map(|process| process.cwd.clone()) + } + TerminalType::DisplayOnly => None, + } } pub fn title(&self, truncate: bool) -> String { @@ -1837,24 +1990,24 @@ impl Terminal { match &self.task { Some(task_state) => { if truncate { - truncate_and_trailoff(&task_state.label, MAX_CHARS) + truncate_and_trailoff(&task_state.spawned_task.label, MAX_CHARS) } else { - task_state.full_label.clone() + task_state.spawned_task.full_label.clone() } } None => self .title_override .as_ref() .map(|title_override| title_override.to_string()) - .unwrap_or_else(|| { - self.pty_info + .unwrap_or_else(|| match &self.terminal_type { + TerminalType::Pty { info, .. } => info .current .as_ref() .map(|fpi| { let process_file = fpi .cwd .file_name() - .map(|name| name.to_string_lossy().to_string()) + .map(|name| name.to_string_lossy().into_owned()) .unwrap_or_default(); let argv = fpi.argv.as_slice(); @@ -1877,7 +2030,8 @@ impl Terminal { }; format!("{process_file} — {process_name}") }) - .unwrap_or_else(|| "Terminal".to_string()) + .unwrap_or_else(|| "Terminal".to_string()), + TerminalType::DisplayOnly => "Terminal".to_string(), }), } } @@ -1886,7 +2040,23 @@ impl Terminal { if let Some(task) = self.task() && task.status == TaskStatus::Running { - self.pty_info.kill_current_process(); + if let TerminalType::Pty { info, .. } = &mut self.terminal_type { + info.kill_current_process(); + } + } + } + + pub fn pid(&self) -> Option { + match &self.terminal_type { + TerminalType::Pty { info, .. } => info.pid(), + TerminalType::DisplayOnly => None, + } + } + + pub fn pid_getter(&self) -> Option<&ProcessIdGetter> { + match &self.terminal_type { + TerminalType::Pty { info, .. } => Some(info.pid_getter()), + TerminalType::DisplayOnly => None, } } @@ -1921,10 +2091,13 @@ impl Terminal { if let Some(tx) = &self.completion_tx { tx.try_send(e).ok(); } + if let Some(e) = e { + self.child_exited = Some(e); + } let task = match &mut self.task { Some(task) => task, None => { - if error_code.is_none() { + if self.child_exited.is_none_or(|e| e.code() == Some(0)) { cx.emit(Event::CloseTerminal); } return; @@ -1944,10 +2117,10 @@ impl Terminal { let (finished_successfully, task_line, command_line) = task_summary(task, error_code); let mut lines_to_show = Vec::new(); - if task.show_summary { + if task.spawned_task.show_summary { lines_to_show.push(task_line.as_str()); } - if task.show_command { + if task.spawned_task.show_command { lines_to_show.push(command_line.as_str()); } @@ -1959,7 +2132,7 @@ impl Terminal { unsafe { append_text_to_term(&mut self.term.lock(), &lines_to_show) }; } - match task.hide { + match task.spawned_task.hide { HideStrategy::Never => {} HideStrategy::Always => { cx.emit(Event::CloseTerminal); @@ -1976,12 +2149,8 @@ impl Terminal { self.vi_mode_enabled } - pub fn clone_builder( - &self, - cx: &App, - cwd: impl FnOnce() -> Option, - ) -> Result { - let working_directory = self.working_directory().or_else(cwd); + pub fn clone_builder(&self, cx: &App, cwd: Option) -> Result { + let working_directory = self.working_directory().or_else(|| cwd); TerminalBuilder::new( working_directory, None, @@ -2009,7 +2178,11 @@ pub fn row_to_string(row: &Row) -> String { const TASK_DELIMITER: &str = "⏵ "; fn task_summary(task: &TaskState, error_code: Option) -> (bool, String, String) { - let escaped_full_label = task.full_label.replace("\r\n", "\r").replace('\n', "\r"); + let escaped_full_label = task + .spawned_task + .full_label + .replace("\r\n", "\r") + .replace('\n', "\r"); let (success, task_line) = match error_code { Some(0) => ( true, @@ -2026,7 +2199,11 @@ fn task_summary(task: &TaskState, error_code: Option) -> (bool, String, Str format!("{TASK_DELIMITER}Task `{escaped_full_label}` finished"), ), }; - let escaped_command_label = task.command_label.replace("\r\n", "\r").replace('\n', "\r"); + let escaped_command_label = task + .spawned_task + .command_label + .replace("\r\n", "\r") + .replace('\n', "\r"); let command_line = format!("{TASK_DELIMITER}Command: {escaped_command_label}"); (success, task_line, command_line) } @@ -2070,7 +2247,9 @@ unsafe fn append_text_to_term(term: &mut Term, text_lines: &[&str]) impl Drop for Terminal { fn drop(&mut self) { - self.pty_tx.0.send(Msg::Shutdown).ok(); + if let TerminalType::Pty { pty_tx, .. } = &self.terminal_type { + pty_tx.0.send(Msg::Shutdown).ok(); + } } } @@ -2191,6 +2370,8 @@ pub fn rgba_color(r: u8, g: u8, b: u8) -> Hsla { #[cfg(test)] mod tests { + use std::time::Duration; + use super::*; use crate::{ IndexedCell, TerminalBounds, TerminalBuilder, TerminalContent, content_index_for_mouse, @@ -2201,7 +2382,7 @@ mod tests { term::cell::Cell, }; use collections::HashMap; - use gpui::{Pixels, Point, TestAppContext, bounds, point, size}; + use gpui::{Pixels, Point, TestAppContext, bounds, point, size, smol_timeout}; use rand::{Rng, distr, rngs::ThreadRng}; use task::ShellBuilder; @@ -2210,8 +2391,8 @@ mod tests { cx.executor().allow_parking(); let (completion_tx, completion_rx) = smol::channel::unbounded(); - let (program, args) = ShellBuilder::new(None, &Shell::System) - .build(Some("echo".to_owned()), &["hello".to_owned()]); + let (program, args) = + ShellBuilder::new(&Shell::System).build(Some("echo".to_owned()), &["hello".to_owned()]); let terminal = cx.new(|cx| { TerminalBuilder::new( None, @@ -2242,6 +2423,162 @@ mod tests { terminal.update(cx, |term, _| term.get_content()).trim(), "hello" ); + + // Inject additional output directly into the emulator (display-only path) + terminal.update(cx, |term, cx| { + term.write_output(b"\nfrom_injection", cx); + }); + + let content_after = terminal.update(cx, |term, _| term.get_content()); + assert!( + content_after.contains("from_injection"), + "expected injected output to appear, got: {content_after}" + ); + } + + // TODO should be tested on Linux too, but does not work there well + #[cfg(target_os = "macos")] + #[gpui::test(iterations = 10)] + async fn test_terminal_eof(cx: &mut TestAppContext) { + cx.executor().allow_parking(); + + let (completion_tx, completion_rx) = smol::channel::unbounded(); + // Build an empty command, which will result in a tty shell spawned. + let terminal = cx.new(|cx| { + TerminalBuilder::new( + None, + None, + task::Shell::System, + HashMap::default(), + CursorShape::default(), + AlternateScroll::On, + None, + false, + 0, + Some(completion_tx), + cx, + Vec::new(), + ) + .unwrap() + .subscribe(cx) + }); + + let (event_tx, event_rx) = smol::channel::unbounded::(); + cx.update(|cx| { + cx.subscribe(&terminal, move |_, e, _| { + event_tx.send_blocking(e.clone()).unwrap(); + }) + }) + .detach(); + cx.background_spawn(async move { + assert_eq!( + completion_rx.recv().await.unwrap(), + Some(ExitStatus::default()), + "EOF should result in the tty shell exiting successfully", + ); + }) + .detach(); + + let first_event = Event::Wakeup; + let wakeup = event_rx.recv().await.expect("No wakeup event received"); + assert_eq!(wakeup, first_event, "Expected wakeup, got {wakeup:?}"); + + terminal.update(cx, |terminal, _| { + let success = terminal.try_keystroke(&Keystroke::parse("ctrl-c").unwrap(), false); + assert!(success, "Should have registered ctrl-c sequence"); + }); + terminal.update(cx, |terminal, _| { + let success = terminal.try_keystroke(&Keystroke::parse("ctrl-d").unwrap(), false); + assert!(success, "Should have registered ctrl-d sequence"); + }); + + let mut all_events = vec![first_event]; + while let Ok(Ok(new_event)) = smol_timeout(Duration::from_secs(1), event_rx.recv()).await { + all_events.push(new_event.clone()); + if new_event == Event::CloseTerminal { + break; + } + } + assert!( + all_events.contains(&Event::CloseTerminal), + "EOF command sequence should have triggered a TTY terminal exit, but got events: {all_events:?}", + ); + } + + #[gpui::test(iterations = 10)] + async fn test_terminal_no_exit_on_spawn_failure(cx: &mut TestAppContext) { + cx.executor().allow_parking(); + + let (completion_tx, completion_rx) = smol::channel::unbounded(); + let (program, args) = ShellBuilder::new(&Shell::System) + .build(Some("asdasdasdasd".to_owned()), &["@@@@@".to_owned()]); + let terminal = cx.new(|cx| { + TerminalBuilder::new( + None, + None, + task::Shell::WithArguments { + program, + args, + title_override: None, + }, + HashMap::default(), + CursorShape::default(), + AlternateScroll::On, + None, + false, + 0, + Some(completion_tx), + cx, + Vec::new(), + ) + .unwrap() + .subscribe(cx) + }); + + let (event_tx, event_rx) = smol::channel::unbounded::(); + cx.update(|cx| { + cx.subscribe(&terminal, move |_, e, _| { + event_tx.send_blocking(e.clone()).unwrap(); + }) + }) + .detach(); + cx.background_spawn(async move { + #[cfg(target_os = "windows")] + { + let exit_status = completion_rx.recv().await.ok().flatten(); + if let Some(exit_status) = exit_status { + assert!( + !exit_status.success(), + "Wrong shell command should result in a failure" + ); + assert_eq!(exit_status.code(), Some(1)); + } + } + #[cfg(not(target_os = "windows"))] + { + let exit_status = completion_rx.recv().await.unwrap().unwrap(); + assert!( + !exit_status.success(), + "Wrong shell command should result in a failure" + ); + assert_eq!(exit_status.code(), None); + } + }) + .detach(); + + let mut all_events = Vec::new(); + while let Ok(Ok(new_event)) = + smol_timeout(Duration::from_millis(500), event_rx.recv()).await + { + all_events.push(new_event.clone()); + } + + assert!( + !all_events + .iter() + .any(|event| event == &Event::CloseTerminal), + "Wrong shell command should update the title but not should not close the terminal to show the error message, but got events: {all_events:?}", + ); } #[test] @@ -2376,4 +2713,116 @@ mod tests { ..Default::default() } } + + #[gpui::test] + async fn test_write_output_converts_lf_to_crlf(cx: &mut TestAppContext) { + let terminal = cx.new(|cx| { + TerminalBuilder::new_display_only(CursorShape::default(), AlternateScroll::On, None, 0) + .unwrap() + .subscribe(cx) + }); + + // Test simple LF conversion + terminal.update(cx, |terminal, cx| { + terminal.write_output(b"line1\nline2\n", cx); + }); + + // Get the content by directly accessing the term + let content = terminal.update(cx, |terminal, _cx| { + let term = terminal.term.lock_unfair(); + Terminal::make_content(&term, &terminal.last_content) + }); + + // If LF is properly converted to CRLF, each line should start at column 0 + // The diagonal staircase bug would cause increasing column positions + + // Get the cells and check that lines start at column 0 + let cells = &content.cells; + let mut line1_col0 = false; + let mut line2_col0 = false; + + for cell in cells { + if cell.c == 'l' && cell.point.column.0 == 0 { + if cell.point.line.0 == 0 && !line1_col0 { + line1_col0 = true; + } else if cell.point.line.0 == 1 && !line2_col0 { + line2_col0 = true; + } + } + } + + assert!(line1_col0, "First line should start at column 0"); + assert!(line2_col0, "Second line should start at column 0"); + } + + #[gpui::test] + async fn test_write_output_preserves_existing_crlf(cx: &mut TestAppContext) { + let terminal = cx.new(|cx| { + TerminalBuilder::new_display_only(CursorShape::default(), AlternateScroll::On, None, 0) + .unwrap() + .subscribe(cx) + }); + + // Test that existing CRLF doesn't get doubled + terminal.update(cx, |terminal, cx| { + terminal.write_output(b"line1\r\nline2\r\n", cx); + }); + + // Get the content by directly accessing the term + let content = terminal.update(cx, |terminal, _cx| { + let term = terminal.term.lock_unfair(); + Terminal::make_content(&term, &terminal.last_content) + }); + + let cells = &content.cells; + + // Check that both lines start at column 0 + let mut found_lines_at_column_0 = 0; + for cell in cells { + if cell.c == 'l' && cell.point.column.0 == 0 { + found_lines_at_column_0 += 1; + } + } + + assert!( + found_lines_at_column_0 >= 2, + "Both lines should start at column 0" + ); + } + + #[gpui::test] + async fn test_write_output_preserves_bare_cr(cx: &mut TestAppContext) { + let terminal = cx.new(|cx| { + TerminalBuilder::new_display_only(CursorShape::default(), AlternateScroll::On, None, 0) + .unwrap() + .subscribe(cx) + }); + + // Test that bare CR (without LF) is preserved + terminal.update(cx, |terminal, cx| { + terminal.write_output(b"hello\rworld", cx); + }); + + // Get the content by directly accessing the term + let content = terminal.update(cx, |terminal, _cx| { + let term = terminal.term.lock_unfair(); + Terminal::make_content(&term, &terminal.last_content) + }); + + let cells = &content.cells; + + // Check that we have "world" at the beginning of the line + let mut text = String::new(); + for cell in cells.iter().take(5) { + if cell.point.line.0 == 0 { + text.push(cell.c); + } + } + + assert!( + text.starts_with("world"), + "Bare CR should allow overwriting: got '{}'", + text + ); + } } diff --git a/crates/terminal/src/terminal_hyperlinks.rs b/crates/terminal/src/terminal_hyperlinks.rs index 2d3d356b4663a8aa271dda8d36d5fab720228527..d3b50674204884e168d8cee39110a5b05ce13f54 100644 --- a/crates/terminal/src/terminal_hyperlinks.rs +++ b/crates/terminal/src/terminal_hyperlinks.rs @@ -261,8 +261,8 @@ mod tests { use super::*; use alacritty_terminal::{ event::VoidListener, - index::{Boundary, Column, Line, Point as AlacPoint}, - term::{Config, cell::Flags, search::Match, test::TermSize}, + index::{Boundary, Point as AlacPoint}, + term::{Config, cell::Flags, test::TermSize}, vte::ansi::Handler, }; use std::{cell::RefCell, ops::RangeInclusive, path::PathBuf}; @@ -468,17 +468,6 @@ mod tests { ) } }; - ($($columns:literal),+; $($lines:expr),+; $hyperlink_kind:ident) => { { - use crate::terminal_hyperlinks::tests::line_cells_count; - - let test_lines = vec![$($lines),+]; - let total_cells = test_lines.iter().copied().map(line_cells_count).sum(); - - test_hyperlink!( - [ $($columns),+ ]; total_cells; test_lines.iter().copied(); $hyperlink_kind - ) - } }; - ([ $($columns:expr),+ ]; $total_cells:expr; $lines:expr; $hyperlink_kind:ident) => { { use crate::terminal_hyperlinks::tests::{ test_hyperlink, HyperlinkKind }; @@ -504,9 +493,6 @@ mod tests { /// macro_rules! test_path { ($($lines:literal),+) => { test_hyperlink!($($lines),+; Path) }; - ($($columns:literal),+; $($lines:literal),+) => { - test_hyperlink!($($columns),+; $($lines),+; Path) - }; } #[test] @@ -572,39 +558,52 @@ mod tests { test_path!("‹«/test/co👉ol.rs»(«1»,«618»)›::"); } + #[test] + fn quotes_and_brackets() { + test_path!("\"‹«/test/co👉ol.rs»:«4»›\""); + test_path!("'‹«/test/co👉ol.rs»:«4»›'"); + test_path!("`‹«/test/co👉ol.rs»:«4»›`"); + + test_path!("[‹«/test/co👉ol.rs»:«4»›]"); + test_path!("(‹«/test/co👉ol.rs»:«4»›)"); + test_path!("{‹«/test/co👉ol.rs»:«4»›}"); + test_path!("<‹«/test/co👉ol.rs»:«4»›>"); + + test_path!("[\"‹«/test/co👉ol.rs»:«4»›\"]"); + test_path!("'(‹«/test/co👉ol.rs»:«4»›)'"); + } + #[test] fn word_wide_chars() { // Rust paths - test_path!(4, 6, 12; "‹«/👉例/cool.rs»›"); - test_path!(4, 6, 12; "‹«/例👈/cool.rs»›"); - test_path!(4, 8, 16; "‹«/例/cool.rs»:«👉4»›"); - test_path!(4, 8, 16; "‹«/例/cool.rs»:«4»:«👉2»›"); + test_path!("‹«/👉例/cool.rs»›"); + test_path!("‹«/例👈/cool.rs»›"); + test_path!("‹«/例/cool.rs»:«👉4»›"); + test_path!("‹«/例/cool.rs»:«4»:«👉2»›"); // Cargo output - test_path!(4, 27, 30; " Compiling Cool (‹«/👉例/Cool»›)"); - test_path!(4, 27, 30; " Compiling Cool (‹«/例👈/Cool»›)"); + test_path!(" Compiling Cool (‹«/👉例/Cool»›)"); + test_path!(" Compiling Cool (‹«/例👈/Cool»›)"); // Python - test_path!(4, 11; "‹«👉例wesome.py»›"); - test_path!(4, 11; "‹«例👈wesome.py»›"); - test_path!(6, 17, 40; " ‹File \"«/👉例wesome.py»\", line «42»›: Wat?"); - test_path!(6, 17, 40; " ‹File \"«/例👈wesome.py»\", line «42»›: Wat?"); + test_path!("‹«👉例wesome.py»›"); + test_path!("‹«例👈wesome.py»›"); + test_path!(" ‹File \"«/👉例wesome.py»\", line «42»›: Wat?"); + test_path!(" ‹File \"«/例👈wesome.py»\", line «42»›: Wat?"); } #[test] fn non_word_wide_chars() { // Mojo diagnostic message - test_path!(4, 18, 38; " ‹File \"«/awe👉some.🔥»\", line «42»›: Wat?"); - test_path!(4, 18, 38; " ‹File \"«/awesome👉.🔥»\", line «42»›: Wat?"); - test_path!(4, 18, 38; " ‹File \"«/awesome.👉🔥»\", line «42»›: Wat?"); - test_path!(4, 18, 38; " ‹File \"«/awesome.🔥👈»\", line «42»›: Wat?"); + test_path!(" ‹File \"«/awe👉some.🔥»\", line «42»›: Wat?"); + test_path!(" ‹File \"«/awesome👉.🔥»\", line «42»›: Wat?"); + test_path!(" ‹File \"«/awesome.👉🔥»\", line «42»›: Wat?"); + test_path!(" ‹File \"«/awesome.🔥👈»\", line «42»›: Wat?"); } /// These likely rise to the level of being worth fixing. mod issues { #[test] - #[cfg_attr(not(target_os = "windows"), should_panic(expected = "Path = «例»"))] - #[cfg_attr(target_os = "windows", should_panic(expected = r#"Path = «C:\\例»"#))] // fn issue_alacritty_8586() { // Rust paths @@ -689,21 +688,13 @@ mod tests { /// Minor issues arguably not important enough to fix/workaround... mod nits { #[test] - #[cfg_attr( - not(target_os = "windows"), - should_panic(expected = "Path = «/test/cool.rs(4»") - )] - #[cfg_attr( - target_os = "windows", - should_panic(expected = r#"Path = «C:\\test\\cool.rs(4»"#) - )] fn alacritty_bugs_with_two_columns() { - test_path!(2; "‹«/👉test/cool.rs»(«4»)›"); - test_path!(2; "‹«/test/cool.rs»(«👉4»)›"); - test_path!(2; "‹«/test/cool.rs»(«4»,«👉2»)›"); + test_path!("‹«/👉test/cool.rs»(«4»)›"); + test_path!("‹«/test/cool.rs»(«👉4»)›"); + test_path!("‹«/test/cool.rs»(«4»,«👉2»)›"); // Python - test_path!(2; "‹«awe👉some.py»›"); + test_path!("‹«awe👉some.py»›"); } #[test] @@ -791,9 +782,6 @@ mod tests { /// macro_rules! test_file_iri { ($file_iri:literal) => { { test_hyperlink!(concat!("‹«👉", $file_iri, "»›"); FileIri) } }; - ($($columns:literal),+; $file_iri:literal) => { { - test_hyperlink!($($columns),+; concat!("‹«👉", $file_iri, "»›"); FileIri) - } }; } #[cfg(not(target_os = "windows"))] @@ -865,9 +853,6 @@ mod tests { /// macro_rules! test_iri { ($iri:literal) => { { test_hyperlink!(concat!("‹«👉", $iri, "»›"); Iri) } }; - ($($columns:literal),+; $iri:literal) => { { - test_hyperlink!($($columns),+; concat!("‹«👉", $iri, "»›"); Iri) - } }; } #[test] @@ -898,26 +883,26 @@ mod tests { #[test] fn wide_chars() { // In the order they appear in URL_REGEX, except 'file://' which is treated as a path - test_iri!(4, 20; "ipfs://例🏃🦀/cool.ipfs"); - test_iri!(4, 20; "ipns://例🏃🦀/cool.ipns"); - test_iri!(6, 20; "magnet://例🏃🦀/cool.git"); - test_iri!(4, 20; "mailto:someone@somewhere.here"); - test_iri!(4, 20; "gemini://somewhere.here"); - test_iri!(4, 20; "gopher://somewhere.here"); - test_iri!(4, 20; "http://例🏃🦀/cool/index.html"); - test_iri!(4, 20; "http://10.10.10.10:1111/cool.html"); - test_iri!(4, 20; "http://例🏃🦀/cool/index.html?amazing=1"); - test_iri!(4, 20; "http://例🏃🦀/cool/index.html#right%20here"); - test_iri!(4, 20; "http://例🏃🦀/cool/index.html?amazing=1#right%20here"); - test_iri!(4, 20; "https://例🏃🦀/cool/index.html"); - test_iri!(4, 20; "https://10.10.10.10:1111/cool.html"); - test_iri!(4, 20; "https://例🏃🦀/cool/index.html?amazing=1"); - test_iri!(4, 20; "https://例🏃🦀/cool/index.html#right%20here"); - test_iri!(4, 20; "https://例🏃🦀/cool/index.html?amazing=1#right%20here"); - test_iri!(4, 20; "news://例🏃🦀/cool.news"); - test_iri!(5, 20; "git://例/cool.git"); - test_iri!(5, 20; "ssh://user@somewhere.over.here:12345/例🏃🦀/cool.git"); - test_iri!(7, 20; "ftp://例🏃🦀/cool.ftp"); + test_iri!("ipfs://例🏃🦀/cool.ipfs"); + test_iri!("ipns://例🏃🦀/cool.ipns"); + test_iri!("magnet://例🏃🦀/cool.git"); + test_iri!("mailto:someone@somewhere.here"); + test_iri!("gemini://somewhere.here"); + test_iri!("gopher://somewhere.here"); + test_iri!("http://例🏃🦀/cool/index.html"); + test_iri!("http://10.10.10.10:1111/cool.html"); + test_iri!("http://例🏃🦀/cool/index.html?amazing=1"); + test_iri!("http://例🏃🦀/cool/index.html#right%20here"); + test_iri!("http://例🏃🦀/cool/index.html?amazing=1#right%20here"); + test_iri!("https://例🏃🦀/cool/index.html"); + test_iri!("https://10.10.10.10:1111/cool.html"); + test_iri!("https://例🏃🦀/cool/index.html?amazing=1"); + test_iri!("https://例🏃🦀/cool/index.html#right%20here"); + test_iri!("https://例🏃🦀/cool/index.html?amazing=1#right%20here"); + test_iri!("news://例🏃🦀/cool.news"); + test_iri!("git://例/cool.git"); + test_iri!("ssh://user@somewhere.over.here:12345/例🏃🦀/cool.git"); + test_iri!("ftp://例🏃🦀/cool.ftp"); } // There are likely more tests needed for IRI vs URI @@ -1006,6 +991,22 @@ mod tests { point } + fn end_point_from_prev_input_point( + term: &Term, + prev_input_point: AlacPoint, + ) -> AlacPoint { + if term + .grid() + .index(prev_input_point) + .flags + .contains(Flags::WIDE_CHAR) + { + prev_input_point.add(term, Boundary::Grid, 1) + } else { + prev_input_point + } + } + let mut hovered_grid_point: Option = None; let mut hyperlink_match = AlacPoint::default()..=AlacPoint::default(); let mut iri_or_path = String::default(); @@ -1040,7 +1041,10 @@ mod tests { panic!("Should have been handled by char input") } CapturesState::Path(start_point) => { - iri_or_path = term.bounds_to_string(start_point, prev_input_point); + iri_or_path = term.bounds_to_string( + start_point, + end_point_from_prev_input_point(&term, prev_input_point), + ); CapturesState::RowScan } CapturesState::RowScan => CapturesState::Row(String::new()), @@ -1065,7 +1069,8 @@ mod tests { panic!("Should have been handled by char input") } MatchState::Match(start_point) => { - hyperlink_match = start_point..=prev_input_point; + hyperlink_match = start_point + ..=end_point_from_prev_input_point(&term, prev_input_point); MatchState::Done } MatchState::Done => { @@ -1122,7 +1127,7 @@ mod tests { let Ok(path) = url.to_file_path() else { panic!("Failed to interpret file IRI `{iri_or_path}` as a path"); }; - iri_or_path = path.to_string_lossy().to_string(); + iri_or_path = path.to_string_lossy().into_owned(); } if cfg!(windows) { diff --git a/crates/terminal/src/terminal_settings.rs b/crates/terminal/src/terminal_settings.rs index 0ab92a0f26d35710da7fd0a2e88542a98c7affed..27cccea126fecd7d015b21cec6d18809b756bdf8 100644 --- a/crates/terminal/src/terminal_settings.rs +++ b/crates/terminal/src/terminal_settings.rs @@ -2,23 +2,19 @@ use alacritty_terminal::vte::ansi::{ CursorShape as AlacCursorShape, CursorStyle as AlacCursorStyle, }; use collections::HashMap; -use gpui::{AbsoluteLength, App, FontFallbacks, FontFeatures, FontWeight, Pixels, px}; +use gpui::{FontFallbacks, FontFeatures, FontWeight, Pixels, px}; use schemars::JsonSchema; -use serde_derive::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; -use settings::{SettingsKey, SettingsSources, SettingsUi}; -use std::path::PathBuf; +pub use settings::AlternateScroll; +use settings::{ + CursorShapeContent, SettingsContent, ShowScrollbar, TerminalBlink, TerminalDockPosition, + TerminalLineHeight, TerminalSettingsContent, VenvSettings, WorkingDirectory, + merge_from::MergeFrom, +}; use task::Shell; use theme::FontFamilyName; -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum TerminalDockPosition { - Left, - Bottom, - Right, -} - #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] pub struct Toolbar { pub breadcrumbs: bool, @@ -28,14 +24,14 @@ pub struct Toolbar { pub struct TerminalSettings { pub shell: Shell, pub working_directory: WorkingDirectory, - pub font_size: Option, + pub font_size: Option, // todo(settings_refactor) can be non-optional... pub font_family: Option, pub font_fallbacks: Option, pub font_features: Option, pub font_weight: Option, pub line_height: TerminalLineHeight, pub env: HashMap, - pub cursor_shape: Option, + pub cursor_shape: CursorShape, pub blinking: TerminalBlink, pub alternate_scroll: AlternateScroll, pub option_as_meta: bool, @@ -60,224 +56,78 @@ pub struct ScrollbarSettings { pub show: Option, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -pub struct ScrollbarSettingsContent { - /// When to show the scrollbar in the terminal. - /// - /// Default: inherits editor scrollbar settings - pub show: Option>, -} - -/// When to show the scrollbar in the terminal. -/// -/// Default: auto -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum ShowScrollbar { - /// Show the scrollbar if there's important information or - /// follow the system's configured behavior. - Auto, - /// Match the system's configured behavior. - System, - /// Always show the scrollbar. - Always, - /// Never show the scrollbar. - Never, -} - -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum VenvSettings { - #[default] - Off, - On { - /// Default directories to search for virtual environments, relative - /// to the current working directory. We recommend overriding this - /// in your project's settings, rather than globally. - activate_script: Option, - venv_name: Option, - directories: Option>, - }, -} - -pub struct VenvSettingsContent<'a> { - pub activate_script: ActivateScript, - pub venv_name: &'a str, - pub directories: &'a [PathBuf], -} - -impl VenvSettings { - pub fn as_option(&self) -> Option> { - match self { - VenvSettings::Off => None, - VenvSettings::On { - activate_script, - venv_name, - directories, - } => Some(VenvSettingsContent { - activate_script: activate_script.unwrap_or(ActivateScript::Default), - venv_name: venv_name.as_deref().unwrap_or(""), - directories: directories.as_deref().unwrap_or(&[]), - }), - } +fn settings_shell_to_task_shell(shell: settings::Shell) -> Shell { + match shell { + settings::Shell::System => Shell::System, + settings::Shell::Program(program) => Shell::Program(program), + settings::Shell::WithArguments { + program, + args, + title_override, + } => Shell::WithArguments { + program, + args, + title_override, + }, } } -#[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum ActivateScript { - #[default] - Default, - Csh, - Fish, - Nushell, - PowerShell, - Pyenv, -} - -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(key = "terminal")] -pub struct TerminalSettingsContent { - /// What shell to use when opening a terminal. - /// - /// Default: system - pub shell: Option, - /// What working directory to use when launching the terminal - /// - /// Default: current_project_directory - pub working_directory: Option, - /// Sets the terminal's font size. - /// - /// If this option is not included, - /// the terminal will default to matching the buffer's font size. - pub font_size: Option, - /// Sets the terminal's font family. - /// - /// If this option is not included, - /// the terminal will default to matching the buffer's font family. - pub font_family: Option, - - /// Sets the terminal's font fallbacks. - /// - /// If this option is not included, - /// the terminal will default to matching the buffer's font fallbacks. - #[schemars(extend("uniqueItems" = true))] - pub font_fallbacks: Option>, - - /// Sets the terminal's line height. - /// - /// Default: comfortable - pub line_height: Option, - pub font_features: Option, - /// Sets the terminal's font weight in CSS weight units 0-900. - pub font_weight: Option, - /// Any key-value pairs added to this list will be added to the terminal's - /// environment. Use `:` to separate multiple values. - /// - /// Default: {} - pub env: Option>, - /// Default cursor shape for the terminal. - /// Can be "bar", "block", "underline", or "hollow". - /// - /// Default: None - pub cursor_shape: Option, - /// Sets the cursor blinking behavior in the terminal. - /// - /// Default: terminal_controlled - pub blinking: Option, - /// Sets whether Alternate Scroll mode (code: ?1007) is active by default. - /// Alternate Scroll mode converts mouse scroll events into up / down key - /// presses when in the alternate screen (e.g. when running applications - /// like vim or less). The terminal can still set and unset this mode. - /// - /// Default: on - pub alternate_scroll: Option, - /// Sets whether the option key behaves as the meta key. - /// - /// Default: false - pub option_as_meta: Option, - /// Whether or not selecting text in the terminal will automatically - /// copy to the system clipboard. - /// - /// Default: false - pub copy_on_select: Option, - /// Whether to keep the text selection after copying it to the clipboard. - /// - /// Default: false - pub keep_selection_on_copy: Option, - /// Whether to show the terminal button in the status bar. - /// - /// Default: true - pub button: Option, - pub dock: Option, - /// Default width when the terminal is docked to the left or right. - /// - /// Default: 640 - pub default_width: Option, - /// Default height when the terminal is docked to the bottom. - /// - /// Default: 320 - pub default_height: Option, - /// Activates the python virtual environment, if one is found, in the - /// terminal's working directory (as resolved by the working_directory - /// setting). Set this to "off" to disable this behavior. - /// - /// Default: on - pub detect_venv: Option, - /// The maximum number of lines to keep in the scrollback history. - /// Maximum allowed value is 100_000, all values above that will be treated as 100_000. - /// 0 disables the scrolling. - /// Existing terminals will not pick up this change until they are recreated. - /// See Alacritty documentation for more information. - /// - /// Default: 10_000 - pub max_scroll_history_lines: Option, - /// Toolbar related settings - pub toolbar: Option, - /// Scrollbar-related settings - pub scrollbar: Option, - /// The minimum APCA perceptual contrast between foreground and background colors. - /// - /// APCA (Accessible Perceptual Contrast Algorithm) is more accurate than WCAG 2.x, - /// especially for dark mode. Values range from 0 to 106. - /// - /// Based on APCA Readability Criterion (ARC) Bronze Simple Mode: - /// https://readtech.org/ARC/tests/bronze-simple-mode/ - /// - 0: No contrast adjustment - /// - 45: Minimum for large fluent text (36px+) - /// - 60: Minimum for other content text - /// - 75: Minimum for body text - /// - 90: Preferred for body text - /// - /// Default: 45 - pub minimum_contrast: Option, -} - impl settings::Settings for TerminalSettings { - type FileContent = TerminalSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> anyhow::Result { - let settings: Self = sources.json_merge()?; - - // Validate minimum_contrast for APCA - if settings.minimum_contrast < 0.0 || settings.minimum_contrast > 106.0 { - anyhow::bail!( - "terminal.minimum_contrast must be between 0 and 106, but got {}. \ - APCA values: 0 = no adjustment, 75 = recommended for body text, 106 = maximum contrast.", - settings.minimum_contrast - ); + fn from_settings(content: &settings::SettingsContent) -> Self { + let user_content = content.terminal.clone().unwrap(); + // Note: we allow a subset of "terminal" settings in the project files. + let mut project_content = user_content.project.clone(); + project_content.merge_from_option(content.project.terminal.as_ref()); + TerminalSettings { + shell: settings_shell_to_task_shell(project_content.shell.unwrap()), + working_directory: project_content.working_directory.unwrap(), + font_size: user_content.font_size.map(px), + font_family: user_content.font_family, + font_fallbacks: user_content.font_fallbacks.map(|fallbacks| { + FontFallbacks::from_fonts( + fallbacks + .into_iter() + .map(|family| family.0.to_string()) + .collect(), + ) + }), + font_features: user_content.font_features, + font_weight: user_content.font_weight.map(FontWeight), + line_height: user_content.line_height.unwrap(), + env: project_content.env.unwrap(), + cursor_shape: user_content.cursor_shape.unwrap().into(), + blinking: user_content.blinking.unwrap(), + alternate_scroll: user_content.alternate_scroll.unwrap(), + option_as_meta: user_content.option_as_meta.unwrap(), + copy_on_select: user_content.copy_on_select.unwrap(), + keep_selection_on_copy: user_content.keep_selection_on_copy.unwrap(), + button: user_content.button.unwrap(), + dock: user_content.dock.unwrap(), + default_width: px(user_content.default_width.unwrap()), + default_height: px(user_content.default_height.unwrap()), + detect_venv: project_content.detect_venv.unwrap(), + max_scroll_history_lines: user_content.max_scroll_history_lines, + toolbar: Toolbar { + breadcrumbs: user_content.toolbar.unwrap().breadcrumbs.unwrap(), + }, + scrollbar: ScrollbarSettings { + show: user_content.scrollbar.unwrap().show, + }, + minimum_contrast: user_content.minimum_contrast.unwrap(), } - - Ok(settings) } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { + fn import_from_vscode(vscode: &settings::VsCodeSettings, content: &mut SettingsContent) { + let mut default = TerminalSettingsContent::default(); + let current = content.terminal.as_mut().unwrap_or(&mut default); let name = |s| format!("terminal.integrated.{s}"); vscode.f32_setting(&name("fontSize"), &mut current.font_size); - if let Some(font_family) = vscode.read_string(&name("fontFamily")) { - current.font_family = Some(FontFamilyName(font_family.into())); - } + vscode.font_family_setting( + &name("fontFamily"), + &mut current.font_family, + &mut current.font_fallbacks, + ); vscode.bool_setting(&name("copyOnSelection"), &mut current.copy_on_select); vscode.bool_setting("macOptionIsMeta", &mut current.option_as_meta); vscode.usize_setting("scrollback", &mut current.max_scroll_history_lines); @@ -290,9 +140,9 @@ impl settings::Settings for TerminalSettings { &name("cursorStyle"), &mut current.cursor_shape, |s| match s { - "block" => Some(CursorShape::Block), - "line" => Some(CursorShape::Bar), - "underline" => Some(CursorShape::Underline), + "block" => Some(CursorShapeContent::Block), + "line" => Some(CursorShapeContent::Bar), + "underline" => Some(CursorShapeContent::Underline), _ => None, }, ); @@ -316,7 +166,7 @@ impl settings::Settings for TerminalSettings { // TODO: handle arguments let shell_name = format!("{platform}Exec"); if let Some(s) = vscode.read_string(&name(&shell_name)) { - current.shell = Some(Shell::Program(s.to_owned())) + current.project.shell = Some(settings::Shell::Program(s.to_owned())) } if let Some(env) = vscode @@ -325,93 +175,24 @@ impl settings::Settings for TerminalSettings { { for (k, v) in env { if v.is_null() - && let Some(zed_env) = current.env.as_mut() + && let Some(zed_env) = current.project.env.as_mut() { zed_env.remove(k); } let Some(v) = v.as_str() else { continue }; - if let Some(zed_env) = current.env.as_mut() { + if let Some(zed_env) = current.project.env.as_mut() { zed_env.insert(k.clone(), v.to_owned()); } else { - current.env = Some([(k.clone(), v.to_owned())].into_iter().collect()) + current.project.env = Some([(k.clone(), v.to_owned())].into_iter().collect()) } } } + if content.terminal.is_none() && default != TerminalSettingsContent::default() { + content.terminal = Some(default) + } } } -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, Default)] -#[serde(rename_all = "snake_case")] -pub enum TerminalLineHeight { - /// Use a line height that's comfortable for reading, 1.618 - #[default] - Comfortable, - /// Use a standard line height, 1.3. This option is useful for TUIs, - /// particularly if they use box characters - Standard, - /// Use a custom line height. - Custom(f32), -} - -impl TerminalLineHeight { - pub fn value(&self) -> AbsoluteLength { - let value = match self { - TerminalLineHeight::Comfortable => 1.618, - TerminalLineHeight::Standard => 1.3, - TerminalLineHeight::Custom(line_height) => f32::max(*line_height, 1.), - }; - px(value).into() - } -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum TerminalBlink { - /// Never blink the cursor, ignoring the terminal mode. - Off, - /// Default the cursor blink to off, but allow the terminal to - /// set blinking. - TerminalControlled, - /// Always blink the cursor, ignoring the terminal mode. - On, -} - -#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum AlternateScroll { - On, - Off, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum WorkingDirectory { - /// Use the current file's project directory. Will Fallback to the - /// first project directory strategy if unsuccessful. - CurrentProjectDirectory, - /// Use the first project in this workspace's directory. - FirstProjectDirectory, - /// Always use this platform's home directory (if it can be found). - AlwaysHome, - /// Always use a specific directory. This value will be shell expanded. - /// If this path is not a valid directory the terminal will default to - /// this platform's home directory (if it can be found). - Always { directory: String }, -} - -// Toolbar related settings -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -pub struct ToolbarContent { - /// Whether to display the terminal title in breadcrumbs inside the terminal pane. - /// Only shown if the terminal title is not empty. - /// - /// The shell running in the terminal needs to be configured to emit the title. - /// Example: `echo -e "\e]2;New Title\007";` - /// - /// Default: true - pub breadcrumbs: Option, -} - #[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum CursorShape { @@ -426,6 +207,17 @@ pub enum CursorShape { Hollow, } +impl From for CursorShape { + fn from(value: settings::CursorShapeContent) -> Self { + match value { + settings::CursorShapeContent::Block => CursorShape::Block, + settings::CursorShapeContent::Underline => CursorShape::Underline, + settings::CursorShapeContent::Bar => CursorShape::Bar, + settings::CursorShapeContent::Hollow => CursorShape::Hollow, + } + } +} + impl From for AlacCursorShape { fn from(value: CursorShape) -> Self { match value { diff --git a/crates/terminal_view/Cargo.toml b/crates/terminal_view/Cargo.toml index e424d89917bc02b3398f1457a676ab03cdd1b179..85ee506d69444fa7d58b536acac3a00088e3f047 100644 --- a/crates/terminal_view/Cargo.toml +++ b/crates/terminal_view/Cargo.toml @@ -29,6 +29,7 @@ gpui.workspace = true itertools.workspace = true language.workspace = true log.workspace = true +pretty_assertions.workspace = true project.workspace = true regex.workspace = true task.workspace = true diff --git a/crates/terminal_view/src/persistence.rs b/crates/terminal_view/src/persistence.rs index 9759fe8337bc4a870fb6fe0a903edf5c542f5d4f..14606d4ed58054cca70ca16d420e90083bcbcc14 100644 --- a/crates/terminal_view/src/persistence.rs +++ b/crates/terminal_view/src/persistence.rs @@ -458,7 +458,10 @@ impl TerminalDb { let mut next_index = statement.bind(&item_id, 1)?; next_index = statement.bind(&workspace_id, next_index)?; next_index = statement.bind(&working_directory, next_index)?; - statement.bind(&working_directory.to_string_lossy().to_string(), next_index)?; + statement.bind( + &working_directory.to_string_lossy().into_owned(), + next_index, + )?; statement.exec() }) .await diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index a786aa20e60f28b1f22bd1c9e8d993098aa96de4..e06e8e9c63633746f336d308614ed9963740c4f8 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -114,8 +114,20 @@ impl BatchedTextRun { } fn append_char(&mut self, c: char) { + self.append_char_internal(c, true); + } + + fn append_zero_width_chars(&mut self, chars: &[char]) { + for &c in chars { + self.append_char_internal(c, false); + } + } + + fn append_char_internal(&mut self, c: char, counts_cell: bool) { self.text.push(c); - self.cell_count += 1; + if counts_cell { + self.cell_count += 1; + } self.style.len += c.len_utf8(); } @@ -380,7 +392,8 @@ impl TerminalElement { continue; } // Update tracking for next iteration - previous_cell_had_extras = cell.extra.is_some(); + previous_cell_had_extras = + matches!(cell.zerowidth(), Some(chars) if !chars.is_empty()); //Layout current cell text { @@ -397,6 +410,7 @@ impl TerminalElement { ); let cell_point = AlacPoint::new(alac_line, cell.point.column.0 as i32); + let zero_width_chars = cell.zerowidth(); // Try to batch with existing run if let Some(ref mut batch) = current_batch { @@ -406,25 +420,36 @@ impl TerminalElement { == cell_point.column { batch.append_char(cell.c); + if let Some(chars) = zero_width_chars { + batch.append_zero_width_chars(chars); + } } else { // Flush current batch and start new one let old_batch = current_batch.take().unwrap(); batched_runs.push(old_batch); - current_batch = Some(BatchedTextRun::new_from_char( + let mut new_batch = BatchedTextRun::new_from_char( cell_point, cell.c, cell_style, text_style.font_size, - )); + ); + if let Some(chars) = zero_width_chars { + new_batch.append_zero_width_chars(chars); + } + current_batch = Some(new_batch); } } else { // Start new batch - current_batch = Some(BatchedTextRun::new_from_char( + let mut new_batch = BatchedTextRun::new_from_char( cell_point, cell.c, cell_style, text_style.font_size, - )); + ); + if let Some(chars) = zero_width_chars { + new_batch.append_zero_width_chars(chars); + } + current_batch = Some(new_batch); } }; } @@ -809,12 +834,11 @@ impl Element for TerminalElement { total_lines: _, } => { let rem_size = window.rem_size(); - let line_height = window.text_style().font_size.to_pixels(rem_size) + let line_height = f32::from(window.text_style().font_size.to_pixels(rem_size)) * TerminalSettings::get_global(cx) .line_height .value() - .to_pixels(rem_size) - .0; + .to_pixels(rem_size); (displayed_lines * line_height).into() } ContentMode::Scrollable => { @@ -939,7 +963,7 @@ impl Element for TerminalElement { let rem_size = window.rem_size(); let font_pixels = text_style.font_size.to_pixels(rem_size); // TODO: line_height should be an f32 not an AbsoluteLength. - let line_height = font_pixels * line_height.to_pixels(rem_size).0; + let line_height = f32::from(font_pixels) * line_height.to_pixels(rem_size); let font_id = cx.text_system().resolve_font(&text_style.font()); let cell_width = text_system @@ -1914,6 +1938,28 @@ mod tests { assert_eq!(batch.style.len, 6); // 1 + 1 + 4 bytes for emoji } + #[test] + fn test_batched_text_run_append_zero_width_char() { + let style = TextRun { + len: 1, + font: font("Helvetica"), + color: Hsla::red(), + background_color: None, + underline: None, + strikethrough: None, + }; + + let font_size = AbsoluteLength::Pixels(px(12.0)); + let mut batch = BatchedTextRun::new_from_char(AlacPoint::new(0, 0), 'x', style, font_size); + + let combining = '\u{0301}'; + batch.append_zero_width_chars(&[combining]); + + assert_eq!(batch.text, format!("x{}", combining)); + assert_eq!(batch.cell_count, 1); + assert_eq!(batch.style.len, 1 + combining.len_utf8()); + } + #[test] fn test_background_region_can_merge() { let color1 = Hsla::red(); diff --git a/crates/terminal_view/src/terminal_panel.rs b/crates/terminal_view/src/terminal_panel.rs index 1213a328db8108d399418d70602300c5f5fdc96b..9a75cc10d5fb7b70c097a99b4b06d4fd4023b74c 100644 --- a/crates/terminal_view/src/terminal_panel.rs +++ b/crates/terminal_view/src/terminal_panel.rs @@ -18,12 +18,9 @@ use gpui::{ use itertools::Itertools; use project::{Fs, Project, ProjectEntryId}; use search::{BufferSearchBar, buffer_search::DivRegistrar}; -use settings::Settings; -use task::{RevealStrategy, RevealTarget, SpawnInTerminal, TaskId}; -use terminal::{ - Terminal, - terminal_settings::{TerminalDockPosition, TerminalSettings}, -}; +use settings::{Settings, TerminalDockPosition}; +use task::{RevealStrategy, RevealTarget, Shell, ShellBuilder, SpawnInTerminal, TaskId}; +use terminal::{Terminal, terminal_settings::TerminalSettings}; use ui::{ ButtonCommon, Clickable, ContextMenu, FluentBuilder, PopoverMenu, Toggleable, Tooltip, prelude::*, @@ -450,12 +447,16 @@ impl TerminalPanel { .read(cx) .active_item() .and_then(|item| item.downcast::()); - let working_directory = terminal_view.as_ref().and_then(|terminal_view| { - let terminal = terminal_view.read(cx).terminal().read(cx); - terminal - .working_directory() - .or_else(|| default_working_directory(workspace, cx)) - }); + let working_directory = terminal_view + .as_ref() + .and_then(|terminal_view| { + terminal_view + .read(cx) + .terminal() + .read(cx) + .working_directory() + }) + .or_else(|| default_working_directory(workspace, cx)); let is_zoomed = active_pane.read(cx).is_zoomed(); cx.spawn_in(window, async move |panel, cx| { let terminal = project @@ -463,13 +464,13 @@ impl TerminalPanel { Some(view) => Task::ready(project.clone_terminal( &view.read(cx).terminal.clone(), cx, - || working_directory, + working_directory, )), None => project.create_terminal_shell(working_directory, cx), }) .ok()? .await - .ok()?; + .log_err()?; panel .update_in(cx, move |terminal_panel, window, cx| { @@ -519,10 +520,50 @@ impl TerminalPanel { pub fn spawn_task( &mut self, - task: SpawnInTerminal, + task: &SpawnInTerminal, window: &mut Window, cx: &mut Context, ) -> Task>> { + let remote_client = self + .workspace + .update(cx, |workspace, cx| { + let project = workspace.project().read(cx); + if project.is_via_collab() { + Err(anyhow!("cannot spawn tasks as a guest")) + } else { + Ok(project.remote_client()) + } + }) + .flatten(); + + let remote_client = match remote_client { + Ok(remote_client) => remote_client, + Err(e) => return Task::ready(Err(e)), + }; + + let remote_shell = remote_client + .as_ref() + .and_then(|remote_client| remote_client.read(cx).shell()); + + let shell = if let Some(remote_shell) = remote_shell + && task.shell == Shell::System + { + Shell::Program(remote_shell) + } else { + task.shell.clone() + }; + + let builder = ShellBuilder::new(&shell); + let command_label = builder.command_label(task.command.as_deref().unwrap_or("")); + let (command, args) = builder.build(task.command.clone(), &task.args); + + let task = SpawnInTerminal { + command_label, + command: Some(command), + args, + ..task.clone() + }; + if task.allow_concurrent_runs && task.use_new_terminal { return self.spawn_in_new_terminal(task, window, cx); } @@ -633,7 +674,7 @@ impl TerminalPanel { .filter_map(|(index, item)| Some((index, item.act_as::(cx)?))) .filter_map(|(index, terminal_view)| { let task_state = terminal_view.read(cx).terminal().read(cx).task()?; - if &task_state.full_label == label { + if &task_state.spawned_task.full_label == label { Some((index, terminal_view)) } else { None @@ -767,7 +808,7 @@ impl TerminalPanel { }) } - pub fn add_terminal_shell( + fn add_terminal_shell( &mut self, cwd: Option, reveal_strategy: RevealStrategy, @@ -777,7 +818,7 @@ impl TerminalPanel { let workspace = self.workspace.clone(); cx.spawn_in(window, async move |terminal_panel, cx| { if workspace.update(cx, |workspace, cx| !is_enabled_in_workspace(workspace, cx))? { - anyhow::bail!("terminal not yet supported for remote projects"); + anyhow::bail!("terminal not yet supported for collaborative projects"); } let pane = terminal_panel.update(cx, |terminal_panel, _| { terminal_panel.pending_terminals_to_add += 1; @@ -1431,18 +1472,14 @@ impl Panel for TerminalPanel { _window: &mut Window, cx: &mut Context, ) { - settings::update_settings_file::( - self.fs.clone(), - cx, - move |settings, _| { - let dock = match position { - DockPosition::Left => TerminalDockPosition::Left, - DockPosition::Bottom => TerminalDockPosition::Bottom, - DockPosition::Right => TerminalDockPosition::Right, - }; - settings.dock = Some(dock); - }, - ); + settings::update_settings_file(self.fs.clone(), cx, move |settings, _| { + let dock = match position { + DockPosition::Left => TerminalDockPosition::Left, + DockPosition::Bottom => TerminalDockPosition::Bottom, + DockPosition::Right => TerminalDockPosition::Right, + }; + settings.terminal.get_or_insert_default().dock = Some(dock); + }); } fn size(&self, window: &Window, cx: &App) -> Pixels { @@ -1556,7 +1593,7 @@ impl workspace::TerminalProvider for TerminalProvider { window.spawn(cx, async move |cx| { let terminal = terminal_panel .update_in(cx, |terminal_panel, window, cx| { - terminal_panel.spawn_task(task, window, cx) + terminal_panel.spawn_task(&task, window, cx) }) .ok()? .await; @@ -1596,3 +1633,139 @@ impl Render for InlineAssistTabBarButton { }) } } + +#[cfg(test)] +mod tests { + use super::*; + use gpui::TestAppContext; + use pretty_assertions::assert_eq; + use project::FakeFs; + use settings::SettingsStore; + + #[gpui::test] + async fn test_spawn_an_empty_task(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + let project = Project::test(fs, [], cx).await; + let workspace = cx.add_window(|window, cx| Workspace::test_new(project, window, cx)); + + let (window_handle, terminal_panel) = workspace + .update(cx, |workspace, window, cx| { + let window_handle = window.window_handle(); + let terminal_panel = cx.new(|cx| TerminalPanel::new(workspace, window, cx)); + (window_handle, terminal_panel) + }) + .unwrap(); + + let task = window_handle + .update(cx, |_, window, cx| { + terminal_panel.update(cx, |terminal_panel, cx| { + terminal_panel.spawn_task(&SpawnInTerminal::default(), window, cx) + }) + }) + .unwrap(); + + let terminal = task.await.unwrap(); + let expected_shell = util::get_system_shell(); + terminal + .update(cx, |terminal, _| { + let task_metadata = terminal + .task() + .expect("When spawning a task, should have the task metadata") + .spawned_task + .clone(); + assert_eq!(task_metadata.env, HashMap::default()); + assert_eq!(task_metadata.cwd, None); + assert_eq!(task_metadata.shell, task::Shell::System); + assert_eq!( + task_metadata.command, + Some(expected_shell.clone()), + "Empty tasks should spawn a -i shell" + ); + assert_eq!(task_metadata.args, Vec::::new()); + assert_eq!( + task_metadata.command_label, expected_shell, + "We show the shell launch for empty commands" + ); + }) + .unwrap(); + } + + // A complex Unix command won't be properly parsed by the Windows terminal hence omit the test there. + #[cfg(unix)] + #[gpui::test] + async fn test_spawn_script_like_task(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + let project = Project::test(fs, [], cx).await; + let workspace = cx.add_window(|window, cx| Workspace::test_new(project, window, cx)); + + let (window_handle, terminal_panel) = workspace + .update(cx, |workspace, window, cx| { + let window_handle = window.window_handle(); + let terminal_panel = cx.new(|cx| TerminalPanel::new(workspace, window, cx)); + (window_handle, terminal_panel) + }) + .unwrap(); + + let user_command = r#"REPO_URL=$(git remote get-url origin | sed -e \"s/^git@\\(.*\\):\\(.*\\)\\.git$/https:\\/\\/\\1\\/\\2/\"); COMMIT_SHA=$(git log -1 --format=\"%H\" -- \"${ZED_RELATIVE_FILE}\"); echo \"${REPO_URL}/blob/${COMMIT_SHA}/${ZED_RELATIVE_FILE}#L${ZED_ROW}-$(echo $(($(wc -l <<< \"$ZED_SELECTED_TEXT\") + $ZED_ROW - 1)))\" | xclip -selection clipboard"#.to_string(); + + let expected_cwd = PathBuf::from("/some/work"); + let task = window_handle + .update(cx, |_, window, cx| { + terminal_panel.update(cx, |terminal_panel, cx| { + terminal_panel.spawn_task( + &SpawnInTerminal { + command: Some(user_command.clone()), + cwd: Some(expected_cwd.clone()), + ..SpawnInTerminal::default() + }, + window, + cx, + ) + }) + }) + .unwrap(); + + let terminal = task.await.unwrap(); + let shell = util::get_system_shell(); + terminal + .update(cx, |terminal, _| { + let task_metadata = terminal + .task() + .expect("When spawning a task, should have the task metadata") + .spawned_task + .clone(); + assert_eq!(task_metadata.env, HashMap::default()); + assert_eq!(task_metadata.cwd, Some(expected_cwd)); + assert_eq!(task_metadata.shell, task::Shell::System); + assert_eq!(task_metadata.command, Some(shell.clone())); + assert_eq!( + task_metadata.args, + vec!["-i".to_string(), "-c".to_string(), user_command.clone(),], + "Use command should have been moved into the arguments, as we're spawning a new -i shell", + ); + assert_eq!( + task_metadata.command_label, + format!("{shell} {interactive}-c '{user_command}'", interactive = if cfg!(windows) {""} else {"-i "}), + "We want to show to the user the entire command spawned"); + }) + .unwrap(); + } + + pub fn init_test(cx: &mut TestAppContext) { + cx.update(|cx| { + let store = SettingsStore::test(cx); + cx.set_global(store); + theme::init(theme::LoadThemes::JustBase, cx); + client::init_settings(cx); + language::init(cx); + Project::init_settings(cx); + workspace::init_settings(cx); + editor::init(cx); + crate::init(cx); + }); + } +} diff --git a/crates/terminal_view/src/terminal_path_like_target.rs b/crates/terminal_view/src/terminal_path_like_target.rs index eb236125a940e1c102233ce81dda491cecfc9c6f..8a9b824286508f26c824b18c6ba9a0dbc16e90bd 100644 --- a/crates/terminal_view/src/terminal_path_like_target.rs +++ b/crates/terminal_view/src/terminal_path_like_target.rs @@ -4,9 +4,13 @@ use editor::Editor; use gpui::{App, AppContext, Context, Task, WeakEntity, Window}; use itertools::Itertools; use project::{Entry, Metadata}; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use terminal::PathLikeTarget; -use util::{ResultExt, debug_panic, paths::PathWithPosition}; +use util::{ + ResultExt, debug_panic, + paths::{PathStyle, PathWithPosition}, + rel_path::RelPath, +}; use workspace::{OpenOptions, OpenVisible, Workspace}; /// The way we found the open target. This is important to have for test assertions. @@ -105,7 +109,7 @@ fn possible_hover_target( .update(cx, |terminal_view, _| match file_to_open { Some(OpenTarget::File(path, _) | OpenTarget::Worktree(path, ..)) => { terminal_view.hover = Some(HoverTarget { - tooltip: path.to_string(|path| path.to_string_lossy().to_string()), + tooltip: path.to_string(|path| path.to_string_lossy().into_owned()), hovered_word, }); } @@ -179,8 +183,9 @@ fn possible_open_target( let mut paths_to_check = Vec::with_capacity(potential_paths.len()); let relative_cwd = cwd .and_then(|cwd| cwd.strip_prefix(&worktree_root).ok()) + .and_then(|cwd| RelPath::new(cwd, PathStyle::local()).ok()) .and_then(|cwd_stripped| { - (cwd_stripped != Path::new("")).then(|| { + (cwd_stripped.as_ref() != RelPath::empty()).then(|| { is_cwd_in_worktree = true; cwd_stripped }) @@ -217,19 +222,21 @@ fn possible_open_target( } }; - if path_to_check.path.is_relative() + if let Ok(relative_path_to_check) = + RelPath::new(&path_to_check.path, PathStyle::local()) && !worktree.read(cx).is_single_file() && let Some(entry) = relative_cwd + .clone() .and_then(|relative_cwd| { worktree .read(cx) - .entry_for_path(&relative_cwd.join(&path_to_check.path)) + .entry_for_path(&relative_cwd.join(&relative_path_to_check)) }) - .or_else(|| worktree.read(cx).entry_for_path(&path_to_check.path)) + .or_else(|| worktree.read(cx).entry_for_path(&relative_path_to_check)) { open_target = Some(OpenTarget::Worktree( PathWithPosition { - path: worktree_root.join(&entry.path), + path: worktree.read(cx).absolutize(&entry.path), row: path_to_check.row, column: path_to_check.column, }, @@ -357,16 +364,18 @@ fn possible_open_target( for (worktree, worktree_paths_to_check) in worktree_paths_to_check { let found_entry = worktree .update(cx, |worktree, _| -> Option { - let worktree_root = worktree.abs_path(); - let traversal = worktree.traverse_from_path(true, true, false, "".as_ref()); + let traversal = + worktree.traverse_from_path(true, true, false, RelPath::empty()); for entry in traversal { - if let Some(path_in_worktree) = worktree_paths_to_check - .iter() - .find(|path_to_check| entry.path.ends_with(&path_to_check.path)) + if let Some(path_in_worktree) = + worktree_paths_to_check.iter().find(|path_to_check| { + RelPath::new(&path_to_check.path, PathStyle::local()) + .is_ok_and(|path| entry.path.ends_with(&path)) + }) { return Some(OpenTarget::Worktree( PathWithPosition { - path: worktree_root.join(&entry.path), + path: worktree.absolutize(&entry.path), row: path_in_worktree.row, column: path_in_worktree.column, }, @@ -536,7 +545,7 @@ mod tests { fs.insert_tree(path, tree).await; } - let project = Project::test( + let project: gpui::Entity = Project::test( fs.clone(), worktree_roots.into_iter().map(Path::new), app_cx, @@ -1005,30 +1014,32 @@ mod tests { test_local!( "foo/./bar.txt", "/tmp/issue28339/foo/bar.txt", - "/tmp/issue28339" + "/tmp/issue28339", + WorktreeExact ); test_local!( "foo/../foo/bar.txt", "/tmp/issue28339/foo/bar.txt", "/tmp/issue28339", - FileSystemBackground + WorktreeExact ); test_local!( "foo/..///foo/bar.txt", "/tmp/issue28339/foo/bar.txt", "/tmp/issue28339", - FileSystemBackground + WorktreeExact ); test_local!( "issue28339/../issue28339/foo/../foo/bar.txt", "/tmp/issue28339/foo/bar.txt", "/tmp/issue28339", - FileSystemBackground + WorktreeExact ); test_local!( "./bar.txt", "/tmp/issue28339/foo/bar.txt", - "/tmp/issue28339/foo" + "/tmp/issue28339/foo", + WorktreeExact ); test_local!( "../foo/bar.txt", diff --git a/crates/terminal_view/src/terminal_scrollbar.rs b/crates/terminal_view/src/terminal_scrollbar.rs index c8565a42bee0858e0928e557b9fae590dba319fb..871bb602306cccc92b8cffe62c4912c42b7a87e2 100644 --- a/crates/terminal_view/src/terminal_scrollbar.rs +++ b/crates/terminal_view/src/terminal_scrollbar.rs @@ -62,14 +62,14 @@ impl ScrollableHandle for TerminalScrollHandle { let state = self.state.borrow(); let scroll_offset = state.total_lines - state.viewport_lines - state.display_offset; Point::new( - px(0.), - -px(scroll_offset as f32 * self.state.borrow().line_height.0), + Pixels::ZERO, + -(scroll_offset as f32 * self.state.borrow().line_height), ) } fn set_offset(&self, point: Point) { let state = self.state.borrow(); - let offset_delta = (point.y.0 / state.line_height.0).round() as i32; + let offset_delta = (point.y / state.line_height).round() as i32; let max_offset = state.total_lines - state.viewport_lines; let display_offset = (max_offset as i32 + offset_delta).clamp(0, max_offset as i32); @@ -83,8 +83,8 @@ impl ScrollableHandle for TerminalScrollHandle { Bounds::new( Point::new(px(0.), px(0.)), size( - px(0.), - px(state.viewport_lines as f32 * state.line_height.0), + Pixels::ZERO, + state.viewport_lines as f32 * state.line_height, ), ) } diff --git a/crates/terminal_view/src/terminal_tab_tooltip.rs b/crates/terminal_view/src/terminal_tab_tooltip.rs index 2e25e4798ff4ad9326d76897c56edc9937375793..6324c0999a8231bb1e633ef39343944783029895 100644 --- a/crates/terminal_view/src/terminal_tab_tooltip.rs +++ b/crates/terminal_view/src/terminal_tab_tooltip.rs @@ -16,8 +16,8 @@ impl TerminalTooltip { } impl Render for TerminalTooltip { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - tooltip_container(window, cx, move |this, _window, _cx| { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + tooltip_container(cx, move |this, _cx| { this.occlude() .on_mouse_move(|_, _window, cx| cx.stop_propagation()) .child( diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index 5bc66468ea7f0e3e09e47bb2e949146b31aff31a..7d66ee6d366d2fd03bacc727321128c139be839c 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -25,7 +25,7 @@ use terminal::{ index::Point, term::{TermMode, point_to_viewport, search::RegexSearch}, }, - terminal_settings::{self, CursorShape, TerminalBlink, TerminalSettings, WorkingDirectory}, + terminal_settings::{CursorShape, TerminalSettings}, }; use terminal_element::TerminalElement; use terminal_panel::TerminalPanel; @@ -50,7 +50,7 @@ use workspace::{ }; use serde::Deserialize; -use settings::{Settings, SettingsStore}; +use settings::{Settings, SettingsStore, TerminalBlink, WorkingDirectory}; use smol::Timer; use zed_actions::assistant::InlineAssist; @@ -234,9 +234,7 @@ impl TerminalView { terminal_view.focus_out(window, cx); }, ); - let cursor_shape = TerminalSettings::get_global(cx) - .cursor_shape - .unwrap_or_default(); + let cursor_shape = TerminalSettings::get_global(cx).cursor_shape; let scroll_handle = TerminalScrollHandle::new(terminal.read(cx)); @@ -427,7 +425,7 @@ impl TerminalView { let breadcrumb_visibility_changed = self.show_breadcrumbs != settings.toolbar.breadcrumbs; self.show_breadcrumbs = settings.toolbar.breadcrumbs; - let new_cursor_shape = settings.cursor_shape.unwrap_or_default(); + let new_cursor_shape = settings.cursor_shape; let old_cursor_shape = self.cursor_shape; if old_cursor_shape != new_cursor_shape { self.cursor_shape = new_cursor_shape; @@ -476,7 +474,7 @@ impl TerminalView { .terminal .read(cx) .task() - .map(|task| terminal_rerun_override(&task.id)) + .map(|task| terminal_rerun_override(&task.spawned_task.id)) .unwrap_or_default(); window.dispatch_action(Box::new(task), cx); } @@ -831,11 +829,11 @@ impl TerminalView { } fn rerun_button(task: &TaskState) -> Option { - if !task.show_rerun { + if !task.spawned_task.show_rerun { return None; } - let task_id = task.id.clone(); + let task_id = task.spawned_task.id.clone(); Some( IconButton::new("rerun-icon", IconName::Rerun) .size(ButtonSize::Compact) @@ -996,12 +994,7 @@ impl ScrollbarVisibility for TerminalScrollbarSettingsWrapper { TerminalSettings::get_global(cx) .scrollbar .show - .map(|value| match value { - terminal_settings::ShowScrollbar::Auto => scrollbars::ShowScrollbar::Auto, - terminal_settings::ShowScrollbar::System => scrollbars::ShowScrollbar::System, - terminal_settings::ShowScrollbar::Always => scrollbars::ShowScrollbar::Always, - terminal_settings::ShowScrollbar::Never => scrollbars::ShowScrollbar::Never, - }) + .map(Into::into) .unwrap_or_else(|| EditorSettings::get_global(cx).scrollbar.show) } } @@ -1118,7 +1111,10 @@ impl Render for TerminalView { div.custom_scrollbars( Scrollbars::for_settings::() .show_along(ScrollAxes::Vertical) - .with_track_along(ScrollAxes::Vertical) + .with_track_along( + ScrollAxes::Vertical, + cx.theme().colors().editor_background, + ) .tracked_scroll_handle(self.scroll_handle.clone()), window, cx, @@ -1143,7 +1139,7 @@ impl Item for TerminalView { fn tab_tooltip_content(&self, cx: &App) -> Option { let terminal = self.terminal().read(cx); let title = terminal.title(false); - let pid = terminal.pty_info.pid_getter().fallback_pid(); + let pid = terminal.pid_getter()?.fallback_pid(); Some(TabTooltipContent::Custom(Box::new(move |_window, cx| { cx.new(|_| TerminalTooltip::new(title.clone(), pid)).into() @@ -1226,7 +1222,7 @@ impl Item for TerminalView { let cwd = project .active_project_directory(cx) .map(|it| it.to_path_buf()); - project.clone_terminal(self.terminal(), cx, || cwd) + project.clone_terminal(self.terminal(), cx, cwd) }) .ok()? .log_err()?; @@ -1258,10 +1254,6 @@ impl Item for TerminalView { false } - fn is_singleton(&self, _cx: &App) -> bool { - true - } - fn as_searchable(&self, handle: &Entity) -> Option> { Some(Box::new(handle.clone())) } @@ -1575,6 +1567,7 @@ mod tests { use gpui::TestAppContext; use project::{Entry, Project, ProjectPath, Worktree}; use std::path::Path; + use util::rel_path::RelPath; use workspace::AppState; // Working directory calculation tests @@ -1736,7 +1729,7 @@ mod tests { let entry = cx .update(|cx| { wt.update(cx, |wt, cx| { - wt.create_entry(Path::new(""), is_dir, None, cx) + wt.create_entry(RelPath::empty().into(), is_dir, None, cx) }) }) .await diff --git a/crates/text/src/anchor.rs b/crates/text/src/anchor.rs index becc5d9c0a113acf64c4b2d331432bea6d00a5c9..a05da1243faa05f33708fe6858fc9dada3c0a1e0 100644 --- a/crates/text/src/anchor.rs +++ b/crates/text/src/anchor.rs @@ -62,26 +62,23 @@ impl Anchor { } pub fn bias(&self, bias: Bias, buffer: &BufferSnapshot) -> Anchor { - if bias == Bias::Left { - self.bias_left(buffer) - } else { - self.bias_right(buffer) + match bias { + Bias::Left => self.bias_left(buffer), + Bias::Right => self.bias_right(buffer), } } pub fn bias_left(&self, buffer: &BufferSnapshot) -> Anchor { - if self.bias == Bias::Left { - *self - } else { - buffer.anchor_before(self) + match self.bias { + Bias::Left => *self, + Bias::Right => buffer.anchor_before(self), } } pub fn bias_right(&self, buffer: &BufferSnapshot) -> Anchor { - if self.bias == Bias::Right { - *self - } else { - buffer.anchor_after(self) + match self.bias { + Bias::Left => buffer.anchor_after(self), + Bias::Right => *self, } } @@ -96,7 +93,7 @@ impl Anchor { pub fn is_valid(&self, buffer: &BufferSnapshot) -> bool { if *self == Anchor::MIN || *self == Anchor::MAX { true - } else if self.buffer_id != Some(buffer.remote_id) { + } else if self.buffer_id.is_none_or(|id| id != buffer.remote_id) { false } else { let Some(fragment_id) = buffer.try_fragment_id_for_anchor(self) else { diff --git a/crates/text/src/locator.rs b/crates/text/src/locator.rs index 7363d5bdd3424b202bd92b4e6d98e2d678f0829f..cc94441a3d1ea2654875cd286d91b9dc2334ab53 100644 --- a/crates/text/src/locator.rs +++ b/crates/text/src/locator.rs @@ -67,7 +67,7 @@ impl Default for Locator { impl sum_tree::Item for Locator { type Summary = Locator; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { self.clone() } } @@ -80,14 +80,12 @@ impl sum_tree::KeyedItem for Locator { } } -impl sum_tree::Summary for Locator { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl sum_tree::ContextLessSummary for Locator { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &()) { + fn add_summary(&mut self, summary: &Self) { self.assign(summary); } } diff --git a/crates/text/src/operation_queue.rs b/crates/text/src/operation_queue.rs index 38864e66c8751806aa78e68a4d8663a8e18a11f4..6604817edfe2dcc243ba837a770b361bd505a7ef 100644 --- a/crates/text/src/operation_queue.rs +++ b/crates/text/src/operation_queue.rs @@ -1,5 +1,5 @@ use std::{fmt::Debug, ops::Add}; -use sum_tree::{Dimension, Edit, Item, KeyedItem, SumTree, Summary}; +use sum_tree::{ContextLessSummary, Dimension, Edit, Item, KeyedItem, SumTree}; pub trait Operation: Clone + Debug { fn lamport_timestamp(&self) -> clock::Lamport; @@ -52,7 +52,7 @@ impl OperationQueue { ops.into_iter() .map(|op| Edit::Insert(OperationItem(op))) .collect(), - &(), + (), ); } @@ -67,14 +67,12 @@ impl OperationQueue { } } -impl Summary for OperationSummary { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl ContextLessSummary for OperationSummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, other: &Self, _: &()) { + fn add_summary(&mut self, other: &Self) { assert!(self.key < other.key); self.key = other.key; self.len += other.len; @@ -94,11 +92,11 @@ impl Add<&Self> for OperationSummary { } impl Dimension<'_, OperationSummary> for OperationKey { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &OperationSummary, _: &()) { + fn add_summary(&mut self, summary: &OperationSummary, _: ()) { assert!(*self <= summary.key); *self = summary.key; } @@ -107,7 +105,7 @@ impl Dimension<'_, OperationSummary> for OperationKey { impl Item for OperationItem { type Summary = OperationSummary; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { OperationSummary { key: OperationKey::new(self.0.lamport_timestamp()), len: 1, diff --git a/crates/text/src/selection.rs b/crates/text/src/selection.rs index d3c280bde803b392767eecd13e65a70aafc5b1a5..e690792d0c903031f8fc7e8bf81215bf0db0e336 100644 --- a/crates/text/src/selection.rs +++ b/crates/text/src/selection.rs @@ -5,8 +5,8 @@ use std::ops::Range; #[derive(Copy, Clone, Debug, PartialEq)] pub enum SelectionGoal { None, - HorizontalPosition(f32), - HorizontalRange { start: f32, end: f32 }, + HorizontalPosition(f64), + HorizontalRange { start: f64, end: f64 }, WrappedHorizontalPosition((u32, f32)), } diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index 8fb6f56222b503360a3d2dd6f4a6b27d1ac728e3..d61038d746fa1bebbf0b92a99b0a59f650bc5704 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -482,7 +482,7 @@ impl History { struct Edits<'a, D: TextDimension, F: FnMut(&FragmentSummary) -> bool> { visible_cursor: rope::Cursor<'a>, deleted_cursor: rope::Cursor<'a>, - fragments_cursor: Option>, + fragments_cursor: Option>, undos: &'a UndoMap, since: &'a clock::Global, old_end: D, @@ -747,7 +747,7 @@ impl Buffer { deletions: Default::default(), max_undos: Default::default(), }; - insertions.push(InsertionFragment::new(&fragment), &()); + insertions.push(InsertionFragment::new(&fragment), ()); fragments.push(fragment, &None); } @@ -992,7 +992,7 @@ impl Buffer { drop(old_fragments); self.snapshot.fragments = new_fragments; - self.snapshot.insertions.edit(new_insertions, &()); + self.snapshot.insertions.edit(new_insertions, ()); self.snapshot.visible_text = visible_text; self.snapshot.deleted_text = deleted_text; self.subscriptions.publish_mut(&edits_patch); @@ -1240,7 +1240,7 @@ impl Buffer { self.snapshot.fragments = new_fragments; self.snapshot.visible_text = visible_text; self.snapshot.deleted_text = deleted_text; - self.snapshot.insertions.edit(new_insertions, &()); + self.snapshot.insertions.edit(new_insertions, ()); self.snapshot.insertion_slices.extend(insertion_slices); self.subscriptions.publish_mut(&edits_patch) } @@ -1269,7 +1269,7 @@ impl Buffer { // Get all of the fragments corresponding to these insertion slices. let mut fragment_ids = Vec::new(); - let mut insertions_cursor = self.insertions.cursor::(&()); + let mut insertions_cursor = self.insertions.cursor::(()); for insertion_slice in &insertion_slices { if insertion_slice.insertion_id != insertions_cursor.start().timestamp || insertion_slice.range.start > insertions_cursor.start().split_offset @@ -1597,7 +1597,7 @@ impl Buffer { }); // convert to the desired text dimension. - let mut position = D::zero(&()); + let mut position = D::zero(()); let mut rope_cursor = self.visible_text.cursor(0); disjoint_ranges.map(move |range| { position.add_assign(&rope_cursor.summary(range.start)); @@ -1782,7 +1782,7 @@ impl Buffer { timestamp: fragment.timestamp, split_offset: fragment.insertion_offset, }, - &(), + (), ) .unwrap(); assert_eq!( @@ -1793,7 +1793,7 @@ impl Buffer { } let mut cursor = self.snapshot.fragments.cursor::>(&None); - for insertion_fragment in self.snapshot.insertions.cursor::<()>(&()) { + for insertion_fragment in self.snapshot.insertions.cursor::<()>(()) { cursor.seek(&Some(&insertion_fragment.fragment_id), Bias::Left); let fragment = cursor.item().unwrap(); assert_eq!(insertion_fragment.fragment_id, fragment.id); @@ -2128,7 +2128,7 @@ impl BufferSnapshot { let row_end_offset = if row >= self.max_point().row { self.len() } else { - Point::new(row + 1, 0).to_offset(self) - 1 + Point::new(row + 1, 0).to_previous_offset(self) }; (row_end_offset - row_start_offset) as u32 } @@ -2237,16 +2237,16 @@ impl BufferSnapshot { A: 'a + IntoIterator, { let anchors = anchors.into_iter(); - let mut insertion_cursor = self.insertions.cursor::(&()); + let mut insertion_cursor = self.insertions.cursor::(()); let mut fragment_cursor = self .fragments .cursor::, usize>>(&None); let mut text_cursor = self.visible_text.cursor(0); - let mut position = D::zero(&()); + let mut position = D::zero(()); anchors.map(move |(anchor, payload)| { if *anchor == Anchor::MIN { - return (D::zero(&()), payload); + return (D::zero(()), payload); } else if *anchor == Anchor::MAX { return (D::from_text_summary(&self.visible_text.summary()), payload); } @@ -2301,7 +2301,7 @@ impl BufferSnapshot { timestamp: anchor.timestamp, split_offset: anchor.offset, }; - let mut insertion_cursor = self.insertions.cursor::(&()); + let mut insertion_cursor = self.insertions.cursor::(()); insertion_cursor.seek(&anchor_key, anchor.bias); if let Some(insertion) = insertion_cursor.item() { let comparison = sum_tree::KeyedItem::key(insertion).cmp(&anchor_key); @@ -2358,7 +2358,7 @@ impl BufferSnapshot { timestamp: anchor.timestamp, split_offset: anchor.offset, }; - let mut insertion_cursor = self.insertions.cursor::(&()); + let mut insertion_cursor = self.insertions.cursor::(()); insertion_cursor.seek(&anchor_key, anchor.bias); if let Some(insertion) = insertion_cursor.item() { let comparison = sum_tree::KeyedItem::key(insertion).cmp(&anchor_key); @@ -2400,6 +2400,17 @@ impl BufferSnapshot { } else if bias == Bias::Right && offset == self.len() { Anchor::MAX } else { + if !self.visible_text.is_char_boundary(offset) { + // find the character + let char_start = self.visible_text.floor_char_boundary(offset); + // `char_start` must be less than len and a char boundary + let ch = self.visible_text.chars_at(char_start).next().unwrap(); + let char_range = char_start..char_start + ch.len_utf8(); + panic!( + "byte index {} is not a char boundary; it is inside {:?} (bytes {:?})", + offset, ch, char_range, + ); + } let mut fragment_cursor = self.fragments.cursor::(&None); fragment_cursor.seek(&offset, bias); let fragment = fragment_cursor.item().unwrap(); @@ -2508,8 +2519,8 @@ impl BufferSnapshot { fragments_cursor, undos: &self.undo_map, since, - old_end: D::zero(&()), - new_end: D::zero(&()), + old_end: D::zero(()), + new_end: D::zero(()), range: (start_fragment_id, range.start.offset)..(end_fragment_id, range.end.offset), buffer_id: self.remote_id, } @@ -2593,6 +2604,38 @@ impl BufferSnapshot { last_old_end + new_offset.saturating_sub(last_new_end) }) } + + /// Visually annotates a position or range with the `Debug` representation of a value. The + /// callsite of this function is used as a key - previous annotations will be removed. + #[cfg(debug_assertions)] + #[track_caller] + pub fn debug(&self, ranges: &R, value: V) + where + R: debug::ToDebugRanges, + V: std::fmt::Debug, + { + self.debug_with_key(std::panic::Location::caller(), ranges, value); + } + + /// Visually annotates a position or range with the `Debug` representation of a value. Previous + /// debug annotations with the same key will be removed. The key is also used to determine the + /// annotation's color. + #[cfg(debug_assertions)] + pub fn debug_with_key(&self, key: &K, ranges: &R, value: V) + where + K: std::hash::Hash + 'static, + R: debug::ToDebugRanges, + V: std::fmt::Debug, + { + let ranges = ranges + .to_debug_ranges(self) + .into_iter() + .map(|range| self.anchor_after(range.start)..self.anchor_before(range.end)) + .collect(); + debug::GlobalDebugRanges::with_locked(|debug_ranges| { + debug_ranges.insert(key, ranges, format!("{value:?}").into()); + }); + } } struct RopeBuilder<'a> { @@ -2808,13 +2851,13 @@ impl sum_tree::Item for Fragment { } impl sum_tree::Summary for FragmentSummary { - type Context = Option; + type Context<'a> = &'a Option; - fn zero(_cx: &Self::Context) -> Self { + fn zero(_cx: Self::Context<'_>) -> Self { Default::default() } - fn add_summary(&mut self, other: &Self, _: &Self::Context) { + fn add_summary(&mut self, other: &Self, _: Self::Context<'_>) { self.max_id.assign(&other.max_id); self.text.visible += &other.text.visible; self.text.deleted += &other.text.deleted; @@ -2841,7 +2884,7 @@ impl Default for FragmentSummary { impl sum_tree::Item for InsertionFragment { type Summary = InsertionFragmentKey; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { InsertionFragmentKey { timestamp: self.timestamp, split_offset: self.split_offset, @@ -2853,7 +2896,7 @@ impl sum_tree::KeyedItem for InsertionFragment { type Key = InsertionFragmentKey; fn key(&self) -> Self::Key { - sum_tree::Item::summary(self, &()) + sum_tree::Item::summary(self, ()) } } @@ -2871,14 +2914,12 @@ impl InsertionFragment { } } -impl sum_tree::Summary for InsertionFragmentKey { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl sum_tree::ContextLessSummary for InsertionFragmentKey { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &()) { + fn add_summary(&mut self, summary: &Self) { *self = *summary; } } @@ -3033,6 +3074,18 @@ impl operation_queue::Operation for Operation { pub trait ToOffset { fn to_offset(&self, snapshot: &BufferSnapshot) -> usize; + /// Turns this point into the next offset in the buffer that comes after this, respecting utf8 boundaries. + fn to_next_offset(&self, snapshot: &BufferSnapshot) -> usize { + snapshot + .visible_text + .ceil_char_boundary(self.to_offset(snapshot) + 1) + } + /// Turns this point into the previous offset in the buffer that comes before this, respecting utf8 boundaries. + fn to_previous_offset(&self, snapshot: &BufferSnapshot) -> usize { + snapshot + .visible_text + .floor_char_boundary(self.to_offset(snapshot).saturating_sub(1)) + } } impl ToOffset for Point { @@ -3046,7 +3099,7 @@ impl ToOffset for usize { fn to_offset(&self, snapshot: &BufferSnapshot) -> usize { assert!( *self <= snapshot.len(), - "offset {} is out of range, max allowed is {}", + "offset {} is out of range, snapshot length is {}", self, snapshot.len() ); @@ -3247,3 +3300,160 @@ impl LineEnding { } } } + +#[cfg(debug_assertions)] +pub mod debug { + use super::*; + use parking_lot::Mutex; + use std::any::TypeId; + use std::hash::{Hash, Hasher}; + + static GLOBAL_DEBUG_RANGES: Mutex> = Mutex::new(None); + + pub struct GlobalDebugRanges { + pub ranges: Vec, + key_to_occurrence_index: HashMap, + next_occurrence_index: usize, + } + + pub struct DebugRange { + key: Key, + pub ranges: Vec>, + pub value: Arc, + pub occurrence_index: usize, + } + + #[derive(Debug, Clone, PartialEq, Eq, Hash)] + struct Key { + type_id: TypeId, + hash: u64, + } + + impl GlobalDebugRanges { + pub fn with_locked(f: impl FnOnce(&mut Self) -> R) -> R { + let mut state = GLOBAL_DEBUG_RANGES.lock(); + if state.is_none() { + *state = Some(GlobalDebugRanges { + ranges: Vec::new(), + key_to_occurrence_index: HashMap::default(), + next_occurrence_index: 0, + }); + } + if let Some(global_debug_ranges) = state.as_mut() { + f(global_debug_ranges) + } else { + unreachable!() + } + } + + pub fn insert( + &mut self, + key: &K, + ranges: Vec>, + value: Arc, + ) { + let occurrence_index = *self + .key_to_occurrence_index + .entry(Key::new(key)) + .or_insert_with(|| { + let occurrence_index = self.next_occurrence_index; + self.next_occurrence_index += 1; + occurrence_index + }); + let key = Key::new(key); + let existing = self + .ranges + .iter() + .enumerate() + .rfind(|(_, existing)| existing.key == key); + if let Some((existing_ix, _)) = existing { + self.ranges.remove(existing_ix); + } + self.ranges.push(DebugRange { + ranges, + key, + value, + occurrence_index, + }); + } + + pub fn remove(&mut self, key: &K) { + self.remove_impl(&Key::new(key)); + } + + fn remove_impl(&mut self, key: &Key) { + let existing = self + .ranges + .iter() + .enumerate() + .rfind(|(_, existing)| &existing.key == key); + if let Some((existing_ix, _)) = existing { + self.ranges.remove(existing_ix); + } + } + + pub fn remove_all_with_key_type(&mut self) { + self.ranges + .retain(|item| item.key.type_id != TypeId::of::()); + } + } + + impl Key { + fn new(key: &K) -> Self { + let type_id = TypeId::of::(); + let mut hasher = collections::FxHasher::default(); + key.hash(&mut hasher); + Key { + type_id, + hash: hasher.finish(), + } + } + } + + pub trait ToDebugRanges { + fn to_debug_ranges(&self, snapshot: &BufferSnapshot) -> Vec>; + } + + impl ToDebugRanges for T { + fn to_debug_ranges(&self, snapshot: &BufferSnapshot) -> Vec> { + [self.to_offset(snapshot)].to_debug_ranges(snapshot) + } + } + + impl ToDebugRanges for Range { + fn to_debug_ranges(&self, snapshot: &BufferSnapshot) -> Vec> { + [self.clone()].to_debug_ranges(snapshot) + } + } + + impl ToDebugRanges for Vec { + fn to_debug_ranges(&self, snapshot: &BufferSnapshot) -> Vec> { + self.as_slice().to_debug_ranges(snapshot) + } + } + + impl ToDebugRanges for Vec> { + fn to_debug_ranges(&self, snapshot: &BufferSnapshot) -> Vec> { + self.as_slice().to_debug_ranges(snapshot) + } + } + + impl ToDebugRanges for [T] { + fn to_debug_ranges(&self, snapshot: &BufferSnapshot) -> Vec> { + self.iter() + .map(|item| { + let offset = item.to_offset(snapshot); + offset..offset + }) + .collect() + } + } + + impl ToDebugRanges for [Range] { + fn to_debug_ranges(&self, snapshot: &BufferSnapshot) -> Vec> { + self.iter() + .map(|range| range.start.to_offset(snapshot)..range.end.to_offset(snapshot)) + .collect() + } + } +} diff --git a/crates/text/src/undo_map.rs b/crates/text/src/undo_map.rs index 6a409189fa8d2a9bd3bc821e37b9923b5ed884dd..60b22a9edba70b65d30c60a0b9ca15b8f286cc85 100644 --- a/crates/text/src/undo_map.rs +++ b/crates/text/src/undo_map.rs @@ -11,7 +11,7 @@ struct UndoMapEntry { impl sum_tree::Item for UndoMapEntry { type Summary = UndoMapKey; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { self.key } } @@ -30,14 +30,12 @@ struct UndoMapKey { undo_id: clock::Lamport, } -impl sum_tree::Summary for UndoMapKey { - type Context = (); - - fn zero(_cx: &Self::Context) -> Self { +impl sum_tree::ContextLessSummary for UndoMapKey { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &Self::Context) { + fn add_summary(&mut self, summary: &Self) { *self = cmp::max(*self, *summary); } } @@ -60,14 +58,14 @@ impl UndoMap { }) }) .collect::>(); - self.0.edit(edits, &()); + self.0.edit(edits, ()); } pub fn is_undone(&self, edit_id: clock::Lamport) -> bool { self.undo_count(edit_id) % 2 == 1 } pub fn was_undone(&self, edit_id: clock::Lamport, version: &clock::Global) -> bool { - let mut cursor = self.0.cursor::(&()); + let mut cursor = self.0.cursor::(()); cursor.seek( &UndoMapKey { edit_id, @@ -91,7 +89,7 @@ impl UndoMap { } pub fn undo_count(&self, edit_id: clock::Lamport) -> u32 { - let mut cursor = self.0.cursor::(&()); + let mut cursor = self.0.cursor::(()); cursor.seek( &UndoMapKey { edit_id, diff --git a/crates/theme/Cargo.toml b/crates/theme/Cargo.toml index 998d31bb3c5473de324dbfd34a3b276c81d95aba..306733bf3496ae0c122b73fbd109eb46f3662b8a 100644 --- a/crates/theme/Cargo.toml +++ b/crates/theme/Cargo.toml @@ -23,18 +23,14 @@ derive_more.workspace = true fs.workspace = true futures.workspace = true gpui.workspace = true -indexmap.workspace = true -inventory.workspace = true log.workspace = true palette = { workspace = true, default-features = false, features = ["std"] } parking_lot.workspace = true refineable.workspace = true schemars = { workspace = true, features = ["indexmap2"] } serde.workspace = true -serde_derive.workspace = true serde_json.workspace = true serde_json_lenient.workspace = true -serde_repr.workspace = true settings.workspace = true strum.workspace = true thiserror.workspace = true diff --git a/crates/theme/src/fallback_themes.rs b/crates/theme/src/fallback_themes.rs index 13786aca57aab50b503da48d0d4f54fdd78b88c2..4fb8069bc16d1967dfe10b2e6a577b990d942db7 100644 --- a/crates/theme/src/fallback_themes.rs +++ b/crates/theme/src/fallback_themes.rs @@ -3,9 +3,9 @@ use std::sync::Arc; use gpui::{FontStyle, FontWeight, HighlightStyle, Hsla, WindowBackgroundAppearance, hsla}; use crate::{ - AccentColors, Appearance, PlayerColors, StatusColors, StatusColorsRefinement, SyntaxTheme, - SystemColors, Theme, ThemeColors, ThemeColorsRefinement, ThemeFamily, ThemeStyles, - default_color_scales, + AccentColors, Appearance, DEFAULT_DARK_THEME, PlayerColors, StatusColors, + StatusColorsRefinement, SyntaxTheme, SystemColors, Theme, ThemeColors, ThemeColorsRefinement, + ThemeFamily, ThemeStyles, default_color_scales, }; /// The default theme family for Zed. @@ -92,7 +92,7 @@ pub(crate) fn zed_default_dark() -> Theme { let player = PlayerColors::dark(); Theme { id: "one_dark".to_string(), - name: "One Dark".into(), + name: DEFAULT_DARK_THEME.into(), appearance: Appearance::Dark, styles: ThemeStyles { window_background_appearance: WindowBackgroundAppearance::Opaque, diff --git a/crates/theme/src/registry.rs b/crates/theme/src/registry.rs index 8bf8481c84c9c48cbbd03c472b785a776aa07dac..c362b62704257fefde125e81ca1c056490263b0b 100644 --- a/crates/theme/src/registry.rs +++ b/crates/theme/src/registry.rs @@ -73,6 +73,11 @@ impl ThemeRegistry { cx.default_global::().0.clone() } + /// Returns the global [`ThemeRegistry`] if it exists. + pub fn try_global(cx: &mut App) -> Option> { + cx.try_global::().map(|t| t.0.clone()) + } + /// Sets the global [`ThemeRegistry`]. pub(crate) fn set_global(assets: Box, cx: &mut App) { cx.set_global(GlobalThemeRegistry(Arc::new(ThemeRegistry::new(assets)))); diff --git a/crates/theme/src/schema.rs b/crates/theme/src/schema.rs index d2bdbb616a5b6f65f905375769e14dd2a2312ea9..2d7e1ff9d823eae0d48b375592c6d1f91318f472 100644 --- a/crates/theme/src/schema.rs +++ b/crates/theme/src/schema.rs @@ -1,31 +1,13 @@ #![allow(missing_docs)] -use anyhow::Result; -use gpui::{FontStyle, FontWeight, HighlightStyle, Hsla, WindowBackgroundAppearance}; -use indexmap::IndexMap; +use gpui::{FontStyle, FontWeight, HighlightStyle, Hsla}; use palette::FromColor; -use schemars::{JsonSchema, JsonSchema_repr}; -use serde::{Deserialize, Deserializer, Serialize}; -use serde_json::Value; -use serde_repr::{Deserialize_repr, Serialize_repr}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +pub use settings::{FontWeightContent, WindowBackgroundContent}; use crate::{StatusColorsRefinement, ThemeColorsRefinement}; -pub(crate) fn try_parse_color(color: &str) -> Result { - let rgba = gpui::Rgba::try_from(color)?; - let rgba = palette::rgb::Srgba::from_components((rgba.r, rgba.g, rgba.b, rgba.a)); - let hsla = palette::Hsla::from_color(rgba); - - let hsla = gpui::hsla( - hsla.hue.into_positive_degrees() / 360., - hsla.saturation, - hsla.lightness, - hsla.alpha, - ); - - Ok(hsla) -} - fn ensure_non_opaque(color: Hsla) -> Hsla { const MAXIMUM_OPACITY: f32 = 0.7; if color.a <= MAXIMUM_OPACITY { @@ -49,25 +31,6 @@ pub enum AppearanceContent { Dark, } -/// The background appearance of the window. -#[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum WindowBackgroundContent { - Opaque, - Transparent, - Blurred, -} - -impl From for WindowBackgroundAppearance { - fn from(value: WindowBackgroundContent) -> Self { - match value { - WindowBackgroundContent::Opaque => WindowBackgroundAppearance::Opaque, - WindowBackgroundContent::Transparent => WindowBackgroundAppearance::Transparent, - WindowBackgroundContent::Blurred => WindowBackgroundAppearance::Blurred, - } - } -} - /// The content of a serialized theme family. #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] pub struct ThemeFamilyContent { @@ -81,1502 +44,732 @@ pub struct ThemeFamilyContent { pub struct ThemeContent { pub name: String, pub appearance: AppearanceContent, - pub style: ThemeStyleContent, + pub style: settings::ThemeStyleContent, } -/// The content of a serialized theme. -#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq)] -#[serde(default)] -pub struct ThemeStyleContent { - #[serde(default, rename = "background.appearance")] - pub window_background_appearance: Option, - - #[serde(default)] - pub accents: Vec, - - #[serde(flatten, default)] - pub colors: ThemeColorsContent, - - #[serde(flatten, default)] - pub status: StatusColorsContent, - - #[serde(default)] - pub players: Vec, - - /// The styles for syntax nodes. - #[serde(default)] - pub syntax: IndexMap, +/// Returns the syntax style overrides in the [`ThemeContent`]. +pub fn syntax_overrides(this: &settings::ThemeStyleContent) -> Vec<(String, HighlightStyle)> { + this.syntax + .iter() + .map(|(key, style)| { + ( + key.clone(), + HighlightStyle { + color: style + .color + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + background_color: style + .background_color + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + font_style: style.font_style.map(FontStyle::from), + font_weight: style.font_weight.map(FontWeight::from), + ..Default::default() + }, + ) + }) + .collect() } -impl ThemeStyleContent { - /// Returns a [`ThemeColorsRefinement`] based on the colors in the [`ThemeContent`]. - #[inline(always)] - pub fn theme_colors_refinement(&self) -> ThemeColorsRefinement { - self.colors - .theme_colors_refinement(&self.status_colors_refinement()) - } - - /// Returns a [`StatusColorsRefinement`] based on the colors in the [`ThemeContent`]. - #[inline(always)] - pub fn status_colors_refinement(&self) -> StatusColorsRefinement { - self.status.status_colors_refinement() - } - - /// Returns the syntax style overrides in the [`ThemeContent`]. - pub fn syntax_overrides(&self) -> Vec<(String, HighlightStyle)> { - self.syntax - .iter() - .map(|(key, style)| { - ( - key.clone(), - HighlightStyle { - color: style - .color - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - background_color: style - .background_color - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - font_style: style.font_style.map(FontStyle::from), - font_weight: style.font_weight.map(FontWeight::from), - ..Default::default() - }, - ) - }) - .collect() +pub fn status_colors_refinement(colors: &settings::StatusColorsContent) -> StatusColorsRefinement { + StatusColorsRefinement { + conflict: colors + .conflict + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + conflict_background: colors + .conflict_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + conflict_border: colors + .conflict_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + created: colors + .created + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + created_background: colors + .created_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + created_border: colors + .created_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + deleted: colors + .deleted + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + deleted_background: colors + .deleted_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + deleted_border: colors + .deleted_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + error: colors + .error + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + error_background: colors + .error_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + error_border: colors + .error_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + hidden: colors + .hidden + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + hidden_background: colors + .hidden_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + hidden_border: colors + .hidden_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + hint: colors + .hint + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + hint_background: colors + .hint_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + hint_border: colors + .hint_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + ignored: colors + .ignored + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + ignored_background: colors + .ignored_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + ignored_border: colors + .ignored_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + info: colors + .info + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + info_background: colors + .info_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + info_border: colors + .info_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + modified: colors + .modified + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + modified_background: colors + .modified_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + modified_border: colors + .modified_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + predictive: colors + .predictive + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + predictive_background: colors + .predictive_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + predictive_border: colors + .predictive_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + renamed: colors + .renamed + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + renamed_background: colors + .renamed_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + renamed_border: colors + .renamed_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + success: colors + .success + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + success_background: colors + .success_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + success_border: colors + .success_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + unreachable: colors + .unreachable + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + unreachable_background: colors + .unreachable_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + unreachable_border: colors + .unreachable_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + warning: colors + .warning + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + warning_background: colors + .warning_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + warning_border: colors + .warning_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), } } -#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq)] -#[serde(default)] -pub struct ThemeColorsContent { - /// Border color. Used for most borders, is usually a high contrast color. - #[serde(rename = "border")] - pub border: Option, - - /// Border color. Used for deemphasized borders, like a visual divider between two sections - #[serde(rename = "border.variant")] - pub border_variant: Option, - - /// Border color. Used for focused elements, like keyboard focused list item. - #[serde(rename = "border.focused")] - pub border_focused: Option, - - /// Border color. Used for selected elements, like an active search filter or selected checkbox. - #[serde(rename = "border.selected")] - pub border_selected: Option, - - /// Border color. Used for transparent borders. Used for placeholder borders when an element gains a border on state change. - #[serde(rename = "border.transparent")] - pub border_transparent: Option, - - /// Border color. Used for disabled elements, like a disabled input or button. - #[serde(rename = "border.disabled")] - pub border_disabled: Option, - - /// Background color. Used for elevated surfaces, like a context menu, popup, or dialog. - #[serde(rename = "elevated_surface.background")] - pub elevated_surface_background: Option, - - /// Background Color. Used for grounded surfaces like a panel or tab. - #[serde(rename = "surface.background")] - pub surface_background: Option, - - /// Background Color. Used for the app background and blank panels or windows. - #[serde(rename = "background")] - pub background: Option, - - /// Background Color. Used for the background of an element that should have a different background than the surface it's on. - /// - /// Elements might include: Buttons, Inputs, Checkboxes, Radio Buttons... - /// - /// For an element that should have the same background as the surface it's on, use `ghost_element_background`. - #[serde(rename = "element.background")] - pub element_background: Option, - - /// Background Color. Used for the hover state of an element that should have a different background than the surface it's on. - /// - /// Hover states are triggered by the mouse entering an element, or a finger touching an element on a touch screen. - #[serde(rename = "element.hover")] - pub element_hover: Option, - - /// Background Color. Used for the active state of an element that should have a different background than the surface it's on. - /// - /// Active states are triggered by the mouse button being pressed down on an element, or the Return button or other activator being pressed. - #[serde(rename = "element.active")] - pub element_active: Option, - - /// Background Color. Used for the selected state of an element that should have a different background than the surface it's on. - /// - /// Selected states are triggered by the element being selected (or "activated") by the user. - /// - /// This could include a selected checkbox, a toggleable button that is toggled on, etc. - #[serde(rename = "element.selected")] - pub element_selected: Option, - - /// Background Color. Used for the disabled state of an element that should have a different background than the surface it's on. - /// - /// Disabled states are shown when a user cannot interact with an element, like a disabled button or input. - #[serde(rename = "element.disabled")] - pub element_disabled: Option, - - /// Background Color. Used for the background of selections in a UI element. - #[serde(rename = "element.selection_background")] - pub element_selection_background: Option, - - /// Background Color. Used for the area that shows where a dragged element will be dropped. - #[serde(rename = "drop_target.background")] - pub drop_target_background: Option, - - /// Border Color. Used for the border that shows where a dragged element will be dropped. - #[serde(rename = "drop_target.border")] - pub drop_target_border: Option, - - /// Used for the background of a ghost element that should have the same background as the surface it's on. - /// - /// Elements might include: Buttons, Inputs, Checkboxes, Radio Buttons... - /// - /// For an element that should have a different background than the surface it's on, use `element_background`. - #[serde(rename = "ghost_element.background")] - pub ghost_element_background: Option, - - /// Background Color. Used for the hover state of a ghost element that should have the same background as the surface it's on. - /// - /// Hover states are triggered by the mouse entering an element, or a finger touching an element on a touch screen. - #[serde(rename = "ghost_element.hover")] - pub ghost_element_hover: Option, - - /// Background Color. Used for the active state of a ghost element that should have the same background as the surface it's on. - /// - /// Active states are triggered by the mouse button being pressed down on an element, or the Return button or other activator being pressed. - #[serde(rename = "ghost_element.active")] - pub ghost_element_active: Option, - - /// Background Color. Used for the selected state of a ghost element that should have the same background as the surface it's on. - /// - /// Selected states are triggered by the element being selected (or "activated") by the user. - /// - /// This could include a selected checkbox, a toggleable button that is toggled on, etc. - #[serde(rename = "ghost_element.selected")] - pub ghost_element_selected: Option, - - /// Background Color. Used for the disabled state of a ghost element that should have the same background as the surface it's on. - /// - /// Disabled states are shown when a user cannot interact with an element, like a disabled button or input. - #[serde(rename = "ghost_element.disabled")] - pub ghost_element_disabled: Option, - - /// Text Color. Default text color used for most text. - #[serde(rename = "text")] - pub text: Option, - - /// Text Color. Color of muted or deemphasized text. It is a subdued version of the standard text color. - #[serde(rename = "text.muted")] - pub text_muted: Option, - - /// Text Color. Color of the placeholder text typically shown in input fields to guide the user to enter valid data. - #[serde(rename = "text.placeholder")] - pub text_placeholder: Option, - - /// Text Color. Color used for text denoting disabled elements. Typically, the color is faded or grayed out to emphasize the disabled state. - #[serde(rename = "text.disabled")] - pub text_disabled: Option, - - /// Text Color. Color used for emphasis or highlighting certain text, like an active filter or a matched character in a search. - #[serde(rename = "text.accent")] - pub text_accent: Option, - - /// Fill Color. Used for the default fill color of an icon. - #[serde(rename = "icon")] - pub icon: Option, - - /// Fill Color. Used for the muted or deemphasized fill color of an icon. - /// - /// This might be used to show an icon in an inactive pane, or to deemphasize a series of icons to give them less visual weight. - #[serde(rename = "icon.muted")] - pub icon_muted: Option, - - /// Fill Color. Used for the disabled fill color of an icon. - /// - /// Disabled states are shown when a user cannot interact with an element, like a icon button. - #[serde(rename = "icon.disabled")] - pub icon_disabled: Option, - - /// Fill Color. Used for the placeholder fill color of an icon. - /// - /// This might be used to show an icon in an input that disappears when the user enters text. - #[serde(rename = "icon.placeholder")] - pub icon_placeholder: Option, - - /// Fill Color. Used for the accent fill color of an icon. - /// - /// This might be used to show when a toggleable icon button is selected. - #[serde(rename = "icon.accent")] - pub icon_accent: Option, - - /// Color used to accent some of the debuggers elements - /// Only accent breakpoint & breakpoint related symbols right now - #[serde(rename = "debugger.accent")] - pub debugger_accent: Option, - - #[serde(rename = "status_bar.background")] - pub status_bar_background: Option, - - #[serde(rename = "title_bar.background")] - pub title_bar_background: Option, - - #[serde(rename = "title_bar.inactive_background")] - pub title_bar_inactive_background: Option, - - #[serde(rename = "toolbar.background")] - pub toolbar_background: Option, - - #[serde(rename = "tab_bar.background")] - pub tab_bar_background: Option, - - #[serde(rename = "tab.inactive_background")] - pub tab_inactive_background: Option, - - #[serde(rename = "tab.active_background")] - pub tab_active_background: Option, - - #[serde(rename = "search.match_background")] - pub search_match_background: Option, - - #[serde(rename = "panel.background")] - pub panel_background: Option, - - #[serde(rename = "panel.focused_border")] - pub panel_focused_border: Option, - - #[serde(rename = "panel.indent_guide")] - pub panel_indent_guide: Option, - - #[serde(rename = "panel.indent_guide_hover")] - pub panel_indent_guide_hover: Option, - - #[serde(rename = "panel.indent_guide_active")] - pub panel_indent_guide_active: Option, - - #[serde(rename = "panel.overlay_background")] - pub panel_overlay_background: Option, - - #[serde(rename = "panel.overlay_hover")] - pub panel_overlay_hover: Option, - - #[serde(rename = "pane.focused_border")] - pub pane_focused_border: Option, - - #[serde(rename = "pane_group.border")] - pub pane_group_border: Option, - - /// The deprecated version of `scrollbar.thumb.background`. - /// - /// Don't use this field. - #[serde(rename = "scrollbar_thumb.background", skip_serializing)] - #[schemars(skip)] - pub deprecated_scrollbar_thumb_background: Option, - - /// The color of the scrollbar thumb. - #[serde(rename = "scrollbar.thumb.background")] - pub scrollbar_thumb_background: Option, - - /// The color of the scrollbar thumb when hovered over. - #[serde(rename = "scrollbar.thumb.hover_background")] - pub scrollbar_thumb_hover_background: Option, - - /// The color of the scrollbar thumb whilst being actively dragged. - #[serde(rename = "scrollbar.thumb.active_background")] - pub scrollbar_thumb_active_background: Option, - - /// The border color of the scrollbar thumb. - #[serde(rename = "scrollbar.thumb.border")] - pub scrollbar_thumb_border: Option, - - /// The background color of the scrollbar track. - #[serde(rename = "scrollbar.track.background")] - pub scrollbar_track_background: Option, - - /// The border color of the scrollbar track. - #[serde(rename = "scrollbar.track.border")] - pub scrollbar_track_border: Option, - - /// The color of the minimap thumb. - #[serde(rename = "minimap.thumb.background")] - pub minimap_thumb_background: Option, - - /// The color of the minimap thumb when hovered over. - #[serde(rename = "minimap.thumb.hover_background")] - pub minimap_thumb_hover_background: Option, - - /// The color of the minimap thumb whilst being actively dragged. - #[serde(rename = "minimap.thumb.active_background")] - pub minimap_thumb_active_background: Option, - - /// The border color of the minimap thumb. - #[serde(rename = "minimap.thumb.border")] - pub minimap_thumb_border: Option, - - #[serde(rename = "editor.foreground")] - pub editor_foreground: Option, - - #[serde(rename = "editor.background")] - pub editor_background: Option, - - #[serde(rename = "editor.gutter.background")] - pub editor_gutter_background: Option, - - #[serde(rename = "editor.subheader.background")] - pub editor_subheader_background: Option, - - #[serde(rename = "editor.active_line.background")] - pub editor_active_line_background: Option, - - #[serde(rename = "editor.highlighted_line.background")] - pub editor_highlighted_line_background: Option, - - /// Background of active line of debugger - #[serde(rename = "editor.debugger_active_line.background")] - pub editor_debugger_active_line_background: Option, - - /// Text Color. Used for the text of the line number in the editor gutter. - #[serde(rename = "editor.line_number")] - pub editor_line_number: Option, - - /// Text Color. Used for the text of the line number in the editor gutter when the line is highlighted. - #[serde(rename = "editor.active_line_number")] - pub editor_active_line_number: Option, - - /// Text Color. Used for the text of the line number in the editor gutter when the line is hovered over. - #[serde(rename = "editor.hover_line_number")] - pub editor_hover_line_number: Option, - - /// Text Color. Used to mark invisible characters in the editor. - /// - /// Example: spaces, tabs, carriage returns, etc. - #[serde(rename = "editor.invisible")] - pub editor_invisible: Option, - - #[serde(rename = "editor.wrap_guide")] - pub editor_wrap_guide: Option, - - #[serde(rename = "editor.active_wrap_guide")] - pub editor_active_wrap_guide: Option, - - #[serde(rename = "editor.indent_guide")] - pub editor_indent_guide: Option, - - #[serde(rename = "editor.indent_guide_active")] - pub editor_indent_guide_active: Option, - - /// Read-access of a symbol, like reading a variable. - /// - /// A document highlight is a range inside a text document which deserves - /// special attention. Usually a document highlight is visualized by changing - /// the background color of its range. - #[serde(rename = "editor.document_highlight.read_background")] - pub editor_document_highlight_read_background: Option, - - /// Read-access of a symbol, like reading a variable. - /// - /// A document highlight is a range inside a text document which deserves - /// special attention. Usually a document highlight is visualized by changing - /// the background color of its range. - #[serde(rename = "editor.document_highlight.write_background")] - pub editor_document_highlight_write_background: Option, - - /// Highlighted brackets background color. - /// - /// Matching brackets in the cursor scope are highlighted with this background color. - #[serde(rename = "editor.document_highlight.bracket_background")] - pub editor_document_highlight_bracket_background: Option, - - /// Terminal background color. - #[serde(rename = "terminal.background")] - pub terminal_background: Option, - - /// Terminal foreground color. - #[serde(rename = "terminal.foreground")] - pub terminal_foreground: Option, - - /// Terminal ANSI background color. - #[serde(rename = "terminal.ansi.background")] - pub terminal_ansi_background: Option, - - /// Bright terminal foreground color. - #[serde(rename = "terminal.bright_foreground")] - pub terminal_bright_foreground: Option, - - /// Dim terminal foreground color. - #[serde(rename = "terminal.dim_foreground")] - pub terminal_dim_foreground: Option, - - /// Black ANSI terminal color. - #[serde(rename = "terminal.ansi.black")] - pub terminal_ansi_black: Option, - - /// Bright black ANSI terminal color. - #[serde(rename = "terminal.ansi.bright_black")] - pub terminal_ansi_bright_black: Option, - - /// Dim black ANSI terminal color. - #[serde(rename = "terminal.ansi.dim_black")] - pub terminal_ansi_dim_black: Option, - - /// Red ANSI terminal color. - #[serde(rename = "terminal.ansi.red")] - pub terminal_ansi_red: Option, - - /// Bright red ANSI terminal color. - #[serde(rename = "terminal.ansi.bright_red")] - pub terminal_ansi_bright_red: Option, - - /// Dim red ANSI terminal color. - #[serde(rename = "terminal.ansi.dim_red")] - pub terminal_ansi_dim_red: Option, - - /// Green ANSI terminal color. - #[serde(rename = "terminal.ansi.green")] - pub terminal_ansi_green: Option, - - /// Bright green ANSI terminal color. - #[serde(rename = "terminal.ansi.bright_green")] - pub terminal_ansi_bright_green: Option, - - /// Dim green ANSI terminal color. - #[serde(rename = "terminal.ansi.dim_green")] - pub terminal_ansi_dim_green: Option, - - /// Yellow ANSI terminal color. - #[serde(rename = "terminal.ansi.yellow")] - pub terminal_ansi_yellow: Option, - - /// Bright yellow ANSI terminal color. - #[serde(rename = "terminal.ansi.bright_yellow")] - pub terminal_ansi_bright_yellow: Option, - - /// Dim yellow ANSI terminal color. - #[serde(rename = "terminal.ansi.dim_yellow")] - pub terminal_ansi_dim_yellow: Option, - - /// Blue ANSI terminal color. - #[serde(rename = "terminal.ansi.blue")] - pub terminal_ansi_blue: Option, - - /// Bright blue ANSI terminal color. - #[serde(rename = "terminal.ansi.bright_blue")] - pub terminal_ansi_bright_blue: Option, - - /// Dim blue ANSI terminal color. - #[serde(rename = "terminal.ansi.dim_blue")] - pub terminal_ansi_dim_blue: Option, - - /// Magenta ANSI terminal color. - #[serde(rename = "terminal.ansi.magenta")] - pub terminal_ansi_magenta: Option, - - /// Bright magenta ANSI terminal color. - #[serde(rename = "terminal.ansi.bright_magenta")] - pub terminal_ansi_bright_magenta: Option, - - /// Dim magenta ANSI terminal color. - #[serde(rename = "terminal.ansi.dim_magenta")] - pub terminal_ansi_dim_magenta: Option, - - /// Cyan ANSI terminal color. - #[serde(rename = "terminal.ansi.cyan")] - pub terminal_ansi_cyan: Option, - - /// Bright cyan ANSI terminal color. - #[serde(rename = "terminal.ansi.bright_cyan")] - pub terminal_ansi_bright_cyan: Option, - - /// Dim cyan ANSI terminal color. - #[serde(rename = "terminal.ansi.dim_cyan")] - pub terminal_ansi_dim_cyan: Option, - - /// White ANSI terminal color. - #[serde(rename = "terminal.ansi.white")] - pub terminal_ansi_white: Option, - - /// Bright white ANSI terminal color. - #[serde(rename = "terminal.ansi.bright_white")] - pub terminal_ansi_bright_white: Option, - - /// Dim white ANSI terminal color. - #[serde(rename = "terminal.ansi.dim_white")] - pub terminal_ansi_dim_white: Option, - - #[serde(rename = "link_text.hover")] - pub link_text_hover: Option, - - /// Added version control color. - #[serde(rename = "version_control.added")] - pub version_control_added: Option, - - /// Deleted version control color. - #[serde(rename = "version_control.deleted")] - pub version_control_deleted: Option, - - /// Modified version control color. - #[serde(rename = "version_control.modified")] - pub version_control_modified: Option, - - /// Renamed version control color. - #[serde(rename = "version_control.renamed")] - pub version_control_renamed: Option, - - /// Conflict version control color. - #[serde(rename = "version_control.conflict")] - pub version_control_conflict: Option, - - /// Ignored version control color. - #[serde(rename = "version_control.ignored")] - pub version_control_ignored: Option, - - /// Background color for row highlights of "ours" regions in merge conflicts. - #[serde(rename = "version_control.conflict_marker.ours")] - pub version_control_conflict_marker_ours: Option, - - /// Background color for row highlights of "theirs" regions in merge conflicts. - #[serde(rename = "version_control.conflict_marker.theirs")] - pub version_control_conflict_marker_theirs: Option, - - /// Deprecated in favor of `version_control_conflict_marker_ours`. - #[deprecated] - pub version_control_conflict_ours_background: Option, - - /// Deprecated in favor of `version_control_conflict_marker_theirs`. - #[deprecated] - pub version_control_conflict_theirs_background: Option, -} - -impl ThemeColorsContent { - /// Returns a [`ThemeColorsRefinement`] based on the colors in the [`ThemeColorsContent`]. - pub fn theme_colors_refinement( - &self, - status_colors: &StatusColorsRefinement, - ) -> ThemeColorsRefinement { - let border = self - .border - .as_ref() - .and_then(|color| try_parse_color(color).ok()); - let editor_document_highlight_read_background = self - .editor_document_highlight_read_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()); - let scrollbar_thumb_background = self - .scrollbar_thumb_background +pub fn theme_colors_refinement( + this: &settings::ThemeColorsContent, + status_colors: &StatusColorsRefinement, +) -> ThemeColorsRefinement { + let border = this + .border + .as_ref() + .and_then(|color| try_parse_color(color).ok()); + let editor_document_highlight_read_background = this + .editor_document_highlight_read_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()); + let scrollbar_thumb_background = this + .scrollbar_thumb_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + .or_else(|| { + this.deprecated_scrollbar_thumb_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + }); + let scrollbar_thumb_hover_background = this + .scrollbar_thumb_hover_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()); + let scrollbar_thumb_active_background = this + .scrollbar_thumb_active_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + .or(scrollbar_thumb_background); + let scrollbar_thumb_border = this + .scrollbar_thumb_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()); + let element_hover = this + .element_hover + .as_ref() + .and_then(|color| try_parse_color(color).ok()); + let panel_background = this + .panel_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()); + ThemeColorsRefinement { + border, + border_variant: this + .border_variant + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + border_focused: this + .border_focused + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + border_selected: this + .border_selected + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + border_transparent: this + .border_transparent + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + border_disabled: this + .border_disabled + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + elevated_surface_background: this + .elevated_surface_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + surface_background: this + .surface_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + background: this + .background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + element_background: this + .element_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + element_hover, + element_active: this + .element_active + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + element_selected: this + .element_selected + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + element_disabled: this + .element_disabled + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + element_selection_background: this + .element_selection_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + drop_target_background: this + .drop_target_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + drop_target_border: this + .drop_target_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + ghost_element_background: this + .ghost_element_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + ghost_element_hover: this + .ghost_element_hover + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + ghost_element_active: this + .ghost_element_active + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + ghost_element_selected: this + .ghost_element_selected + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + ghost_element_disabled: this + .ghost_element_disabled + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + text: this + .text + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + text_muted: this + .text_muted + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + text_placeholder: this + .text_placeholder + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + text_disabled: this + .text_disabled + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + text_accent: this + .text_accent + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + icon: this + .icon + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + icon_muted: this + .icon_muted + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + icon_disabled: this + .icon_disabled + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + icon_placeholder: this + .icon_placeholder + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + icon_accent: this + .icon_accent + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + debugger_accent: this + .debugger_accent + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + status_bar_background: this + .status_bar_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + title_bar_background: this + .title_bar_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + title_bar_inactive_background: this + .title_bar_inactive_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + toolbar_background: this + .toolbar_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + tab_bar_background: this + .tab_bar_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + tab_inactive_background: this + .tab_inactive_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + tab_active_background: this + .tab_active_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + search_match_background: this + .search_match_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + panel_background, + panel_focused_border: this + .panel_focused_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + panel_indent_guide: this + .panel_indent_guide + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + panel_indent_guide_hover: this + .panel_indent_guide_hover + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + panel_indent_guide_active: this + .panel_indent_guide_active + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + panel_overlay_background: this + .panel_overlay_background .as_ref() .and_then(|color| try_parse_color(color).ok()) - .or_else(|| { - self.deprecated_scrollbar_thumb_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - }); - let scrollbar_thumb_hover_background = self - .scrollbar_thumb_hover_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()); - let scrollbar_thumb_active_background = self - .scrollbar_thumb_active_background + .or(panel_background.map(ensure_opaque)), + panel_overlay_hover: this + .panel_overlay_hover .as_ref() .and_then(|color| try_parse_color(color).ok()) - .or(scrollbar_thumb_background); - let scrollbar_thumb_border = self - .scrollbar_thumb_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()); - let element_hover = self - .element_hover - .as_ref() - .and_then(|color| try_parse_color(color).ok()); - let panel_background = self - .panel_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()); - ThemeColorsRefinement { - border, - border_variant: self - .border_variant - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - border_focused: self - .border_focused - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - border_selected: self - .border_selected - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - border_transparent: self - .border_transparent - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - border_disabled: self - .border_disabled - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - elevated_surface_background: self - .elevated_surface_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - surface_background: self - .surface_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - background: self - .background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - element_background: self - .element_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - element_hover, - element_active: self - .element_active - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - element_selected: self - .element_selected - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - element_disabled: self - .element_disabled - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - element_selection_background: self - .element_selection_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - drop_target_background: self - .drop_target_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - drop_target_border: self - .drop_target_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - ghost_element_background: self - .ghost_element_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - ghost_element_hover: self - .ghost_element_hover - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - ghost_element_active: self - .ghost_element_active - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - ghost_element_selected: self - .ghost_element_selected - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - ghost_element_disabled: self - .ghost_element_disabled - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - text: self - .text - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - text_muted: self - .text_muted - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - text_placeholder: self - .text_placeholder - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - text_disabled: self - .text_disabled - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - text_accent: self - .text_accent - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - icon: self - .icon - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - icon_muted: self - .icon_muted - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - icon_disabled: self - .icon_disabled - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - icon_placeholder: self - .icon_placeholder - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - icon_accent: self - .icon_accent - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - debugger_accent: self - .debugger_accent - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - status_bar_background: self - .status_bar_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - title_bar_background: self - .title_bar_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - title_bar_inactive_background: self - .title_bar_inactive_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - toolbar_background: self - .toolbar_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - tab_bar_background: self - .tab_bar_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - tab_inactive_background: self - .tab_inactive_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - tab_active_background: self - .tab_active_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - search_match_background: self - .search_match_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - panel_background, - panel_focused_border: self - .panel_focused_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - panel_indent_guide: self - .panel_indent_guide - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - panel_indent_guide_hover: self - .panel_indent_guide_hover - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - panel_indent_guide_active: self - .panel_indent_guide_active - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - panel_overlay_background: self - .panel_overlay_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - .or(panel_background.map(ensure_opaque)), - panel_overlay_hover: self - .panel_overlay_hover - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - .or(panel_background - .zip(element_hover) - .map(|(panel_bg, hover_bg)| panel_bg.blend(hover_bg)) - .map(ensure_opaque)), - pane_focused_border: self - .pane_focused_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - pane_group_border: self - .pane_group_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - .or(border), - scrollbar_thumb_background, - scrollbar_thumb_hover_background, - scrollbar_thumb_active_background, - scrollbar_thumb_border, - scrollbar_track_background: self - .scrollbar_track_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - scrollbar_track_border: self - .scrollbar_track_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - minimap_thumb_background: self - .minimap_thumb_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - .or(scrollbar_thumb_background.map(ensure_non_opaque)), - minimap_thumb_hover_background: self - .minimap_thumb_hover_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - .or(scrollbar_thumb_hover_background.map(ensure_non_opaque)), - minimap_thumb_active_background: self - .minimap_thumb_active_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - .or(scrollbar_thumb_active_background.map(ensure_non_opaque)), - minimap_thumb_border: self - .minimap_thumb_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - .or(scrollbar_thumb_border), - editor_foreground: self - .editor_foreground - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_background: self - .editor_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_gutter_background: self - .editor_gutter_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_subheader_background: self - .editor_subheader_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_active_line_background: self - .editor_active_line_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_highlighted_line_background: self - .editor_highlighted_line_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_debugger_active_line_background: self - .editor_debugger_active_line_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_line_number: self - .editor_line_number - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_hover_line_number: self - .editor_hover_line_number - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_active_line_number: self - .editor_active_line_number - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_invisible: self - .editor_invisible - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_wrap_guide: self - .editor_wrap_guide - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_active_wrap_guide: self - .editor_active_wrap_guide - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_indent_guide: self - .editor_indent_guide - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_indent_guide_active: self - .editor_indent_guide_active - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_document_highlight_read_background, - editor_document_highlight_write_background: self - .editor_document_highlight_write_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - editor_document_highlight_bracket_background: self - .editor_document_highlight_bracket_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - // Fall back to `editor.document_highlight.read_background`, for backwards compatibility. - .or(editor_document_highlight_read_background), - terminal_background: self - .terminal_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_background: self - .terminal_ansi_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_foreground: self - .terminal_foreground - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_bright_foreground: self - .terminal_bright_foreground - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_dim_foreground: self - .terminal_dim_foreground - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_black: self - .terminal_ansi_black - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_bright_black: self - .terminal_ansi_bright_black - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_dim_black: self - .terminal_ansi_dim_black - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_red: self - .terminal_ansi_red - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_bright_red: self - .terminal_ansi_bright_red - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_dim_red: self - .terminal_ansi_dim_red - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_green: self - .terminal_ansi_green - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_bright_green: self - .terminal_ansi_bright_green - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_dim_green: self - .terminal_ansi_dim_green - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_yellow: self - .terminal_ansi_yellow - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_bright_yellow: self - .terminal_ansi_bright_yellow - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_dim_yellow: self - .terminal_ansi_dim_yellow - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_blue: self - .terminal_ansi_blue - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_bright_blue: self - .terminal_ansi_bright_blue - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_dim_blue: self - .terminal_ansi_dim_blue - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_magenta: self - .terminal_ansi_magenta - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_bright_magenta: self - .terminal_ansi_bright_magenta - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_dim_magenta: self - .terminal_ansi_dim_magenta - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_cyan: self - .terminal_ansi_cyan - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_bright_cyan: self - .terminal_ansi_bright_cyan - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_dim_cyan: self - .terminal_ansi_dim_cyan - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_white: self - .terminal_ansi_white - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_bright_white: self - .terminal_ansi_bright_white - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - terminal_ansi_dim_white: self - .terminal_ansi_dim_white - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - link_text_hover: self - .link_text_hover - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - version_control_added: self - .version_control_added - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - // Fall back to `created`, for backwards compatibility. - .or(status_colors.created), - version_control_deleted: self - .version_control_deleted - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - // Fall back to `deleted`, for backwards compatibility. - .or(status_colors.deleted), - version_control_modified: self - .version_control_modified - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - // Fall back to `modified`, for backwards compatibility. - .or(status_colors.modified), - version_control_renamed: self - .version_control_renamed - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - // Fall back to `modified`, for backwards compatibility. - .or(status_colors.modified), - version_control_conflict: self - .version_control_conflict - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - // Fall back to `ignored`, for backwards compatibility. - .or(status_colors.ignored), - version_control_ignored: self - .version_control_ignored - .as_ref() - .and_then(|color| try_parse_color(color).ok()) - // Fall back to `conflict`, for backwards compatibility. - .or(status_colors.ignored), - #[allow(deprecated)] - version_control_conflict_marker_ours: self - .version_control_conflict_marker_ours - .as_ref() - .or(self.version_control_conflict_ours_background.as_ref()) - .and_then(|color| try_parse_color(color).ok()), - #[allow(deprecated)] - version_control_conflict_marker_theirs: self - .version_control_conflict_marker_theirs - .as_ref() - .or(self.version_control_conflict_theirs_background.as_ref()) - .and_then(|color| try_parse_color(color).ok()), - } - } -} - -#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq)] -#[serde(default)] -pub struct StatusColorsContent { - /// Indicates some kind of conflict, like a file changed on disk while it was open, or - /// merge conflicts in a Git repository. - #[serde(rename = "conflict")] - pub conflict: Option, - - #[serde(rename = "conflict.background")] - pub conflict_background: Option, - - #[serde(rename = "conflict.border")] - pub conflict_border: Option, - - /// Indicates something new, like a new file added to a Git repository. - #[serde(rename = "created")] - pub created: Option, - - #[serde(rename = "created.background")] - pub created_background: Option, - - #[serde(rename = "created.border")] - pub created_border: Option, - - /// Indicates that something no longer exists, like a deleted file. - #[serde(rename = "deleted")] - pub deleted: Option, - - #[serde(rename = "deleted.background")] - pub deleted_background: Option, - - #[serde(rename = "deleted.border")] - pub deleted_border: Option, - - /// Indicates a system error, a failed operation or a diagnostic error. - #[serde(rename = "error")] - pub error: Option, - - #[serde(rename = "error.background")] - pub error_background: Option, - - #[serde(rename = "error.border")] - pub error_border: Option, - - /// Represents a hidden status, such as a file being hidden in a file tree. - #[serde(rename = "hidden")] - pub hidden: Option, - - #[serde(rename = "hidden.background")] - pub hidden_background: Option, - - #[serde(rename = "hidden.border")] - pub hidden_border: Option, - - /// Indicates a hint or some kind of additional information. - #[serde(rename = "hint")] - pub hint: Option, - - #[serde(rename = "hint.background")] - pub hint_background: Option, - - #[serde(rename = "hint.border")] - pub hint_border: Option, - - /// Indicates that something is deliberately ignored, such as a file or operation ignored by Git. - #[serde(rename = "ignored")] - pub ignored: Option, - - #[serde(rename = "ignored.background")] - pub ignored_background: Option, - - #[serde(rename = "ignored.border")] - pub ignored_border: Option, - - /// Represents informational status updates or messages. - #[serde(rename = "info")] - pub info: Option, - - #[serde(rename = "info.background")] - pub info_background: Option, - - #[serde(rename = "info.border")] - pub info_border: Option, - - /// Indicates a changed or altered status, like a file that has been edited. - #[serde(rename = "modified")] - pub modified: Option, - - #[serde(rename = "modified.background")] - pub modified_background: Option, - - #[serde(rename = "modified.border")] - pub modified_border: Option, - - /// Indicates something that is predicted, like automatic code completion, or generated code. - #[serde(rename = "predictive")] - pub predictive: Option, - - #[serde(rename = "predictive.background")] - pub predictive_background: Option, - - #[serde(rename = "predictive.border")] - pub predictive_border: Option, - - /// Represents a renamed status, such as a file that has been renamed. - #[serde(rename = "renamed")] - pub renamed: Option, - - #[serde(rename = "renamed.background")] - pub renamed_background: Option, - - #[serde(rename = "renamed.border")] - pub renamed_border: Option, - - /// Indicates a successful operation or task completion. - #[serde(rename = "success")] - pub success: Option, - - #[serde(rename = "success.background")] - pub success_background: Option, - - #[serde(rename = "success.border")] - pub success_border: Option, - - /// Indicates some kind of unreachable status, like a block of code that can never be reached. - #[serde(rename = "unreachable")] - pub unreachable: Option, - - #[serde(rename = "unreachable.background")] - pub unreachable_background: Option, - - #[serde(rename = "unreachable.border")] - pub unreachable_border: Option, - - /// Represents a warning status, like an operation that is about to fail. - #[serde(rename = "warning")] - pub warning: Option, - - #[serde(rename = "warning.background")] - pub warning_background: Option, - - #[serde(rename = "warning.border")] - pub warning_border: Option, -} - -impl StatusColorsContent { - /// Returns a [`StatusColorsRefinement`] based on the colors in the [`StatusColorsContent`]. - pub fn status_colors_refinement(&self) -> StatusColorsRefinement { - StatusColorsRefinement { - conflict: self - .conflict - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - conflict_background: self - .conflict_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - conflict_border: self - .conflict_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - created: self - .created - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - created_background: self - .created_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - created_border: self - .created_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - deleted: self - .deleted - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - deleted_background: self - .deleted_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - deleted_border: self - .deleted_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - error: self - .error - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - error_background: self - .error_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - error_border: self - .error_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - hidden: self - .hidden - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - hidden_background: self - .hidden_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - hidden_border: self - .hidden_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - hint: self - .hint - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - hint_background: self - .hint_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - hint_border: self - .hint_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - ignored: self - .ignored - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - ignored_background: self - .ignored_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - ignored_border: self - .ignored_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - info: self - .info - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - info_background: self - .info_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - info_border: self - .info_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - modified: self - .modified - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - modified_background: self - .modified_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - modified_border: self - .modified_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - predictive: self - .predictive - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - predictive_background: self - .predictive_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - predictive_border: self - .predictive_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - renamed: self - .renamed - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - renamed_background: self - .renamed_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - renamed_border: self - .renamed_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - success: self - .success - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - success_background: self - .success_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - success_border: self - .success_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - unreachable: self - .unreachable - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - unreachable_background: self - .unreachable_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - unreachable_border: self - .unreachable_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - warning: self - .warning - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - warning_background: self - .warning_background - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - warning_border: self - .warning_border - .as_ref() - .and_then(|color| try_parse_color(color).ok()), - } - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -pub struct AccentContent(pub Option); - -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)] -pub struct PlayerColorContent { - pub cursor: Option, - pub background: Option, - pub selection: Option, -} - -#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema, PartialEq)] -#[serde(rename_all = "snake_case")] -pub enum FontStyleContent { - Normal, - Italic, - Oblique, -} - -impl From for FontStyle { - fn from(value: FontStyleContent) -> Self { - match value { - FontStyleContent::Normal => FontStyle::Normal, - FontStyleContent::Italic => FontStyle::Italic, - FontStyleContent::Oblique => FontStyle::Oblique, - } - } -} - -#[derive(Debug, Clone, Copy, Serialize_repr, Deserialize_repr, JsonSchema_repr, PartialEq)] -#[repr(u16)] -pub enum FontWeightContent { - Thin = 100, - ExtraLight = 200, - Light = 300, - Normal = 400, - Medium = 500, - Semibold = 600, - Bold = 700, - ExtraBold = 800, - Black = 900, -} - -impl From for FontWeight { - fn from(value: FontWeightContent) -> Self { - match value { - FontWeightContent::Thin => FontWeight::THIN, - FontWeightContent::ExtraLight => FontWeight::EXTRA_LIGHT, - FontWeightContent::Light => FontWeight::LIGHT, - FontWeightContent::Normal => FontWeight::NORMAL, - FontWeightContent::Medium => FontWeight::MEDIUM, - FontWeightContent::Semibold => FontWeight::SEMIBOLD, - FontWeightContent::Bold => FontWeight::BOLD, - FontWeightContent::ExtraBold => FontWeight::EXTRA_BOLD, - FontWeightContent::Black => FontWeight::BLACK, - } + .or(panel_background + .zip(element_hover) + .map(|(panel_bg, hover_bg)| panel_bg.blend(hover_bg)) + .map(ensure_opaque)), + pane_focused_border: this + .pane_focused_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + pane_group_border: this + .pane_group_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + .or(border), + scrollbar_thumb_background, + scrollbar_thumb_hover_background, + scrollbar_thumb_active_background, + scrollbar_thumb_border, + scrollbar_track_background: this + .scrollbar_track_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + scrollbar_track_border: this + .scrollbar_track_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + minimap_thumb_background: this + .minimap_thumb_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + .or(scrollbar_thumb_background.map(ensure_non_opaque)), + minimap_thumb_hover_background: this + .minimap_thumb_hover_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + .or(scrollbar_thumb_hover_background.map(ensure_non_opaque)), + minimap_thumb_active_background: this + .minimap_thumb_active_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + .or(scrollbar_thumb_active_background.map(ensure_non_opaque)), + minimap_thumb_border: this + .minimap_thumb_border + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + .or(scrollbar_thumb_border), + editor_foreground: this + .editor_foreground + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_background: this + .editor_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_gutter_background: this + .editor_gutter_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_subheader_background: this + .editor_subheader_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_active_line_background: this + .editor_active_line_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_highlighted_line_background: this + .editor_highlighted_line_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_debugger_active_line_background: this + .editor_debugger_active_line_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_line_number: this + .editor_line_number + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_hover_line_number: this + .editor_hover_line_number + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_active_line_number: this + .editor_active_line_number + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_invisible: this + .editor_invisible + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_wrap_guide: this + .editor_wrap_guide + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_active_wrap_guide: this + .editor_active_wrap_guide + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_indent_guide: this + .editor_indent_guide + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_indent_guide_active: this + .editor_indent_guide_active + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_document_highlight_read_background, + editor_document_highlight_write_background: this + .editor_document_highlight_write_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + editor_document_highlight_bracket_background: this + .editor_document_highlight_bracket_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + // Fall back to `editor.document_highlight.read_background`, for backwards compatibility. + .or(editor_document_highlight_read_background), + terminal_background: this + .terminal_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_background: this + .terminal_ansi_background + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_foreground: this + .terminal_foreground + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_bright_foreground: this + .terminal_bright_foreground + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_dim_foreground: this + .terminal_dim_foreground + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_black: this + .terminal_ansi_black + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_bright_black: this + .terminal_ansi_bright_black + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_dim_black: this + .terminal_ansi_dim_black + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_red: this + .terminal_ansi_red + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_bright_red: this + .terminal_ansi_bright_red + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_dim_red: this + .terminal_ansi_dim_red + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_green: this + .terminal_ansi_green + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_bright_green: this + .terminal_ansi_bright_green + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_dim_green: this + .terminal_ansi_dim_green + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_yellow: this + .terminal_ansi_yellow + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_bright_yellow: this + .terminal_ansi_bright_yellow + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_dim_yellow: this + .terminal_ansi_dim_yellow + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_blue: this + .terminal_ansi_blue + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_bright_blue: this + .terminal_ansi_bright_blue + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_dim_blue: this + .terminal_ansi_dim_blue + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_magenta: this + .terminal_ansi_magenta + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_bright_magenta: this + .terminal_ansi_bright_magenta + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_dim_magenta: this + .terminal_ansi_dim_magenta + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_cyan: this + .terminal_ansi_cyan + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_bright_cyan: this + .terminal_ansi_bright_cyan + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_dim_cyan: this + .terminal_ansi_dim_cyan + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_white: this + .terminal_ansi_white + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_bright_white: this + .terminal_ansi_bright_white + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + terminal_ansi_dim_white: this + .terminal_ansi_dim_white + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + link_text_hover: this + .link_text_hover + .as_ref() + .and_then(|color| try_parse_color(color).ok()), + version_control_added: this + .version_control_added + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + // Fall back to `created`, for backwards compatibility. + .or(status_colors.created), + version_control_deleted: this + .version_control_deleted + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + // Fall back to `deleted`, for backwards compatibility. + .or(status_colors.deleted), + version_control_modified: this + .version_control_modified + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + // Fall back to `modified`, for backwards compatibility. + .or(status_colors.modified), + version_control_renamed: this + .version_control_renamed + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + // Fall back to `modified`, for backwards compatibility. + .or(status_colors.modified), + version_control_conflict: this + .version_control_conflict + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + // Fall back to `ignored`, for backwards compatibility. + .or(status_colors.ignored), + version_control_ignored: this + .version_control_ignored + .as_ref() + .and_then(|color| try_parse_color(color).ok()) + // Fall back to `conflict`, for backwards compatibility. + .or(status_colors.ignored), + #[allow(deprecated)] + version_control_conflict_marker_ours: this + .version_control_conflict_marker_ours + .as_ref() + .or(this.version_control_conflict_ours_background.as_ref()) + .and_then(|color| try_parse_color(color).ok()), + #[allow(deprecated)] + version_control_conflict_marker_theirs: this + .version_control_conflict_marker_theirs + .as_ref() + .or(this.version_control_conflict_theirs_background.as_ref()) + .and_then(|color| try_parse_color(color).ok()), } } -#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq)] -#[serde(default)] -pub struct HighlightStyleContent { - pub color: Option, - - #[serde(deserialize_with = "treat_error_as_none")] - pub background_color: Option, - - #[serde(deserialize_with = "treat_error_as_none")] - pub font_style: Option, - - #[serde(deserialize_with = "treat_error_as_none")] - pub font_weight: Option, -} +pub(crate) fn try_parse_color(color: &str) -> anyhow::Result { + let rgba = gpui::Rgba::try_from(color)?; + let rgba = palette::rgb::Srgba::from_components((rgba.r, rgba.g, rgba.b, rgba.a)); + let hsla = palette::Hsla::from_color(rgba); -impl HighlightStyleContent { - pub fn is_empty(&self) -> bool { - self.color.is_none() - && self.background_color.is_none() - && self.font_style.is_none() - && self.font_weight.is_none() - } -} + let hsla = gpui::hsla( + hsla.hue.into_positive_degrees() / 360., + hsla.saturation, + hsla.lightness, + hsla.alpha, + ); -fn treat_error_as_none<'de, T, D>(deserializer: D) -> Result, D::Error> -where - T: Deserialize<'de>, - D: Deserializer<'de>, -{ - let value: Value = Deserialize::deserialize(deserializer)?; - Ok(T::deserialize(value).ok()) + Ok(hsla) } diff --git a/crates/theme/src/settings.rs b/crates/theme/src/settings.rs index 8409c60b22b03b8d917b84ae20229dc2db63fe4a..9f753d5a034466631d2324e52fbad7bd858e8c5c 100644 --- a/crates/theme/src/settings.rs +++ b/crates/theme/src/settings.rs @@ -1,22 +1,19 @@ -use crate::fallback_themes::zed_default_dark; use crate::{ - Appearance, DEFAULT_ICON_THEME_NAME, IconTheme, IconThemeNotFoundError, SyntaxTheme, Theme, - ThemeNotFoundError, ThemeRegistry, ThemeStyleContent, + Appearance, DEFAULT_ICON_THEME_NAME, SyntaxTheme, Theme, status_colors_refinement, + syntax_overrides, theme_colors_refinement, }; -use anyhow::Result; use collections::HashMap; use derive_more::{Deref, DerefMut}; use gpui::{ - App, Context, Font, FontFallbacks, FontFeatures, FontStyle, FontWeight, Global, Pixels, - SharedString, Subscription, Window, px, + App, Context, Font, FontFallbacks, FontStyle, FontWeight, Global, Pixels, Subscription, Window, + px, }; use refineable::Refineable; -use schemars::{JsonSchema, json_schema}; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{ParameterizedJsonSchema, Settings, SettingsKey, SettingsSources, SettingsUi}; +pub use settings::{FontFamilyName, IconThemeName, ThemeMode, ThemeName}; +use settings::{Settings, SettingsContent}; use std::sync::Arc; -use util::ResultExt as _; -use util::schemars::replace_subschema; const MIN_FONT_SIZE: Pixels = px(6.0); const MAX_FONT_SIZE: Pixels = px(100.0); @@ -86,6 +83,16 @@ impl From for String { } } +impl From for UiDensity { + fn from(val: settings::UiDensity) -> Self { + match val { + settings::UiDensity::Compact => Self::Compact, + settings::UiDensity::Default => Self::Default, + settings::UiDensity::Comfortable => Self::Comfortable, + } + } +} + /// Customizable settings for the UI and theme system. #[derive(Clone, PartialEq)] pub struct ThemeSettings { @@ -105,7 +112,9 @@ pub struct ThemeSettings { /// The terminal font family can be overridden using it's own setting. pub buffer_font: Font, /// The agent font size. Determines the size of text in the agent panel. Falls back to the UI font size if unset. - agent_font_size: Option, + agent_ui_font_size: Option, + /// The agent buffer font size. Determines the size of user messages in the agent panel. + agent_buffer_font_size: Option, /// The line height for buffers, and the terminal. /// /// Changing this may affect the spacing of some UI elements. @@ -113,19 +122,15 @@ pub struct ThemeSettings { /// The terminal font family can be overridden using it's own setting. pub buffer_line_height: BufferLineHeight, /// The current theme selection. - pub theme_selection: Option, - /// The active theme. - pub active_theme: Arc, + pub theme: ThemeSelection, /// Manual overrides for the active theme. /// /// Note: This setting is still experimental. See [this tracking issue](https://github.com/zed-industries/zed/issues/18078) - pub experimental_theme_overrides: Option, + pub experimental_theme_overrides: Option, /// Manual overrides per theme - pub theme_overrides: HashMap, + pub theme_overrides: HashMap, /// The current icon theme selection. - pub icon_theme_selection: Option, - /// The active icon theme. - pub active_icon_theme: Arc, + pub icon_theme: IconThemeSelection, /// The density of the UI. /// Note: This setting is still experimental. See [this tracking issue]( pub ui_density: UiDensity, @@ -133,73 +138,14 @@ pub struct ThemeSettings { pub unnecessary_code_fade: f32, } -impl ThemeSettings { - const DEFAULT_LIGHT_THEME: &'static str = "One Light"; - const DEFAULT_DARK_THEME: &'static str = "One Dark"; - - /// Returns the name of the default theme for the given [`Appearance`]. - pub fn default_theme(appearance: Appearance) -> &'static str { - match appearance { - Appearance::Light => Self::DEFAULT_LIGHT_THEME, - Appearance::Dark => Self::DEFAULT_DARK_THEME, - } - } +pub(crate) const DEFAULT_LIGHT_THEME: &'static str = "One Light"; +pub(crate) const DEFAULT_DARK_THEME: &'static str = "One Dark"; - /// Reloads the current theme. - /// - /// Reads the [`ThemeSettings`] to know which theme should be loaded, - /// taking into account the current [`SystemAppearance`]. - pub fn reload_current_theme(cx: &mut App) { - let mut theme_settings = ThemeSettings::get_global(cx).clone(); - let system_appearance = SystemAppearance::global(cx); - - if let Some(theme_selection) = theme_settings.theme_selection.clone() { - let mut theme_name = theme_selection.theme(*system_appearance); - - // If the selected theme doesn't exist, fall back to a default theme - // based on the system appearance. - let theme_registry = ThemeRegistry::global(cx); - if let Err(err @ ThemeNotFoundError(_)) = theme_registry.get(theme_name) { - if theme_registry.extensions_loaded() { - log::error!("{err}"); - } - - theme_name = Self::default_theme(*system_appearance); - }; - - if let Some(_theme) = theme_settings.switch_theme(theme_name, cx) { - ThemeSettings::override_global(theme_settings, cx); - } - } - } - - /// Reloads the current icon theme. - /// - /// Reads the [`ThemeSettings`] to know which icon theme should be loaded, - /// taking into account the current [`SystemAppearance`]. - pub fn reload_current_icon_theme(cx: &mut App) { - let mut theme_settings = ThemeSettings::get_global(cx).clone(); - let system_appearance = SystemAppearance::global(cx); - - if let Some(icon_theme_selection) = theme_settings.icon_theme_selection.clone() { - let mut icon_theme_name = icon_theme_selection.icon_theme(*system_appearance); - - // If the selected icon theme doesn't exist, fall back to the default theme. - let theme_registry = ThemeRegistry::global(cx); - if let Err(err @ IconThemeNotFoundError(_)) = - theme_registry.get_icon_theme(icon_theme_name) - { - if theme_registry.extensions_loaded() { - log::error!("{err}"); - } - - icon_theme_name = DEFAULT_ICON_THEME_NAME; - }; - - if let Some(_theme) = theme_settings.switch_icon_theme(icon_theme_name, cx) { - ThemeSettings::override_global(theme_settings, cx); - } - } +/// Returns the name of the default theme for the given [`Appearance`]. +pub fn default_theme(appearance: Appearance) -> &'static str { + match appearance { + Appearance::Light => DEFAULT_LIGHT_THEME, + Appearance::Dark => DEFAULT_DARK_THEME, } } @@ -225,13 +171,6 @@ impl SystemAppearance { GlobalSystemAppearance(SystemAppearance(cx.window_appearance().into())); } - /// Returns the global [`SystemAppearance`]. - /// - /// Inserts a default [`SystemAppearance`] if one does not yet exist. - pub(crate) fn default_global(cx: &mut App) -> Self { - cx.default_global::().0 - } - /// Returns the global [`SystemAppearance`]. pub fn global(cx: &App) -> Self { cx.global::().0 @@ -277,37 +216,28 @@ pub enum ThemeSelection { }, } -// TODO: Rename ThemeMode -> ThemeAppearanceMode -/// The mode use to select a theme. -/// -/// `Light` and `Dark` will select their respective themes. -/// -/// `System` will select the theme based on the system's appearance. -#[derive(Debug, PartialEq, Eq, Clone, Copy, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum ThemeMode { - /// Use the specified `light` theme. - Light, - - /// Use the specified `dark` theme. - Dark, - - /// Use the theme based on the system's appearance. - #[default] - System, +impl From for ThemeSelection { + fn from(selection: settings::ThemeSelection) -> Self { + match selection { + settings::ThemeSelection::Static(theme) => ThemeSelection::Static(theme), + settings::ThemeSelection::Dynamic { mode, light, dark } => { + ThemeSelection::Dynamic { mode, light, dark } + } + } + } } impl ThemeSelection { /// Returns the theme name for the selected [ThemeMode]. - pub fn theme(&self, system_appearance: Appearance) -> &str { + pub fn name(&self, system_appearance: Appearance) -> ThemeName { match self { - Self::Static(theme) => &theme.0, + Self::Static(theme) => theme.clone(), Self::Dynamic { mode, light, dark } => match mode { - ThemeMode::Light => &light.0, - ThemeMode::Dark => &dark.0, + ThemeMode::Light => light.clone(), + ThemeMode::Dark => dark.clone(), ThemeMode::System => match system_appearance { - Appearance::Light => &light.0, - Appearance::Dark => &dark.0, + Appearance::Light => light.clone(), + Appearance::Dark => dark.clone(), }, }, } @@ -323,15 +253,13 @@ impl ThemeSelection { } /// Represents the selection of an icon theme, which can be either static or dynamic. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(untagged)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum IconThemeSelection { /// A static icon theme selection, represented by a single icon theme name. Static(IconThemeName), /// A dynamic icon theme selection, which can change based on the [`ThemeMode`]. Dynamic { /// The mode used to determine which theme to use. - #[serde(default)] mode: ThemeMode, /// The icon theme to use for light mode. light: IconThemeName, @@ -340,17 +268,28 @@ pub enum IconThemeSelection { }, } +impl From for IconThemeSelection { + fn from(selection: settings::IconThemeSelection) -> Self { + match selection { + settings::IconThemeSelection::Static(theme) => IconThemeSelection::Static(theme), + settings::IconThemeSelection::Dynamic { mode, light, dark } => { + IconThemeSelection::Dynamic { mode, light, dark } + } + } + } +} + impl IconThemeSelection { /// Returns the icon theme name based on the given [`Appearance`]. - pub fn icon_theme(&self, system_appearance: Appearance) -> &str { + pub fn name(&self, system_appearance: Appearance) -> IconThemeName { match self { - Self::Static(theme) => &theme.0, + Self::Static(theme) => theme.clone(), Self::Dynamic { mode, light, dark } => match mode { - ThemeMode::Light => &light.0, - ThemeMode::Dark => &dark.0, + ThemeMode::Light => light.clone(), + ThemeMode::Dark => dark.clone(), ThemeMode::System => match system_appearance { - Appearance::Light => &light.0, - Appearance::Dark => &dark.0, + Appearance::Light => light.clone(), + Appearance::Dark => dark.clone(), }, }, } @@ -365,189 +304,115 @@ impl IconThemeSelection { } } -/// Settings for rendering text in UI and text buffers. -#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] -pub struct ThemeSettingsContent { - /// The default font size for text in the UI. - #[serde(default)] - pub ui_font_size: Option, - /// The name of a font to use for rendering in the UI. - #[serde(default)] - pub ui_font_family: Option, - /// The font fallbacks to use for rendering in the UI. - #[serde(default)] - #[schemars(default = "default_font_fallbacks")] - #[schemars(extend("uniqueItems" = true))] - pub ui_font_fallbacks: Option>, - /// The OpenType features to enable for text in the UI. - #[serde(default)] - #[schemars(default = "default_font_features")] - pub ui_font_features: Option, - /// The weight of the UI font in CSS units from 100 to 900. - #[serde(default)] - pub ui_font_weight: Option, - /// The name of a font to use for rendering in text buffers. - #[serde(default)] - pub buffer_font_family: Option, - /// The font fallbacks to use for rendering in text buffers. - #[serde(default)] - #[schemars(extend("uniqueItems" = true))] - pub buffer_font_fallbacks: Option>, - /// The default font size for rendering in text buffers. - #[serde(default)] - pub buffer_font_size: Option, - /// The weight of the editor font in CSS units from 100 to 900. - #[serde(default)] - pub buffer_font_weight: Option, - /// The buffer's line height. - #[serde(default)] - pub buffer_line_height: Option, - /// The OpenType features to enable for rendering in text buffers. - #[serde(default)] - #[schemars(default = "default_font_features")] - pub buffer_font_features: Option, - /// The font size for the agent panel. Falls back to the UI font size if unset. - #[serde(default)] - pub agent_font_size: Option>, - /// The name of the Zed theme to use. - #[serde(default)] - pub theme: Option, - /// The name of the icon theme to use. - #[serde(default)] - pub icon_theme: Option, - - /// UNSTABLE: Expect many elements to be broken. - /// - // Controls the density of the UI. - #[serde(rename = "unstable.ui_density", default)] - pub ui_density: Option, - - /// How much to fade out unused code. - #[serde(default)] - pub unnecessary_code_fade: Option, - - /// EXPERIMENTAL: Overrides for the current theme. - /// - /// These values will override the ones on the current theme specified in `theme`. - #[serde(rename = "experimental.theme_overrides", default)] - pub experimental_theme_overrides: Option, - - /// Overrides per theme - /// - /// These values will override the ones on the specified theme - #[serde(default)] - pub theme_overrides: HashMap, -} - -fn default_font_features() -> Option { - Some(FontFeatures::default()) -} - -fn default_font_fallbacks() -> Option { - Some(FontFallbacks::default()) -} - -impl ThemeSettingsContent { - /// Sets the theme for the given appearance to the theme with the specified name. - pub fn set_theme(&mut self, theme_name: impl Into>, appearance: Appearance) { - if let Some(selection) = self.theme.as_mut() { - let theme_to_update = match selection { - ThemeSelection::Static(theme) => theme, - ThemeSelection::Dynamic { mode, light, dark } => match mode { - ThemeMode::Light => light, - ThemeMode::Dark => dark, - ThemeMode::System => match appearance { - Appearance::Light => light, - Appearance::Dark => dark, - }, +// impl ThemeSettingsContent { +/// Sets the theme for the given appearance to the theme with the specified name. +pub fn set_theme( + current: &mut SettingsContent, + theme_name: impl Into>, + appearance: Appearance, +) { + if let Some(selection) = current.theme.theme.as_mut() { + let theme_to_update = match selection { + settings::ThemeSelection::Static(theme) => theme, + settings::ThemeSelection::Dynamic { mode, light, dark } => match mode { + ThemeMode::Light => light, + ThemeMode::Dark => dark, + ThemeMode::System => match appearance { + Appearance::Light => light, + Appearance::Dark => dark, }, - }; - - *theme_to_update = ThemeName(theme_name.into()); - } else { - self.theme = Some(ThemeSelection::Static(ThemeName(theme_name.into()))); - } - } + }, + }; - /// Sets the icon theme for the given appearance to the icon theme with the specified name. - pub fn set_icon_theme(&mut self, icon_theme_name: String, appearance: Appearance) { - if let Some(selection) = self.icon_theme.as_mut() { - let icon_theme_to_update = match selection { - IconThemeSelection::Static(theme) => theme, - IconThemeSelection::Dynamic { mode, light, dark } => match mode { - ThemeMode::Light => light, - ThemeMode::Dark => dark, - ThemeMode::System => match appearance { - Appearance::Light => light, - Appearance::Dark => dark, - }, + *theme_to_update = ThemeName(theme_name.into()); + } else { + current.theme.theme = Some(settings::ThemeSelection::Static(ThemeName( + theme_name.into(), + ))); + } +} + +/// Sets the icon theme for the given appearance to the icon theme with the specified name. +pub fn set_icon_theme( + current: &mut SettingsContent, + icon_theme_name: IconThemeName, + appearance: Appearance, +) { + if let Some(selection) = current.theme.icon_theme.as_mut() { + let icon_theme_to_update = match selection { + settings::IconThemeSelection::Static(theme) => theme, + settings::IconThemeSelection::Dynamic { mode, light, dark } => match mode { + ThemeMode::Light => light, + ThemeMode::Dark => dark, + ThemeMode::System => match appearance { + Appearance::Light => light, + Appearance::Dark => dark, }, - }; + }, + }; - *icon_theme_to_update = IconThemeName(icon_theme_name.into()); - } else { - self.icon_theme = Some(IconThemeSelection::Static(IconThemeName( - icon_theme_name.into(), - ))); - } + *icon_theme_to_update = icon_theme_name; + } else { + current.theme.icon_theme = Some(settings::IconThemeSelection::Static(icon_theme_name)); } +} + +/// Sets the mode for the theme. +pub fn set_mode(content: &mut SettingsContent, mode: ThemeMode) { + let theme = content.theme.as_mut(); - /// Sets the mode for the theme. - pub fn set_mode(&mut self, mode: ThemeMode) { - if let Some(selection) = self.theme.as_mut() { - match selection { - ThemeSelection::Static(theme) => { - // If the theme was previously set to a single static theme, - // we don't know whether it was a light or dark theme, so we - // just use it for both. - self.theme = Some(ThemeSelection::Dynamic { - mode, - light: theme.clone(), - dark: theme.clone(), - }); - } - ThemeSelection::Dynamic { - mode: mode_to_update, - .. - } => *mode_to_update = mode, + if let Some(selection) = theme.theme.as_mut() { + match selection { + settings::ThemeSelection::Static(theme) => { + // If the theme was previously set to a single static theme, + // we don't know whether it was a light or dark theme, so we + // just use it for both. + *selection = settings::ThemeSelection::Dynamic { + mode, + light: theme.clone(), + dark: theme.clone(), + }; } - } else { - self.theme = Some(ThemeSelection::Dynamic { - mode, - light: ThemeName(ThemeSettings::DEFAULT_LIGHT_THEME.into()), - dark: ThemeName(ThemeSettings::DEFAULT_DARK_THEME.into()), - }); + settings::ThemeSelection::Dynamic { + mode: mode_to_update, + .. + } => *mode_to_update = mode, } - - if let Some(selection) = self.icon_theme.as_mut() { - match selection { - IconThemeSelection::Static(icon_theme) => { - // If the icon theme was previously set to a single static - // theme, we don't know whether it was a light or dark - // theme, so we just use it for both. - self.icon_theme = Some(IconThemeSelection::Dynamic { - mode, - light: icon_theme.clone(), - dark: icon_theme.clone(), - }); - } - IconThemeSelection::Dynamic { - mode: mode_to_update, - .. - } => *mode_to_update = mode, + } else { + theme.theme = Some(settings::ThemeSelection::Dynamic { + mode, + light: ThemeName(DEFAULT_LIGHT_THEME.into()), + dark: ThemeName(DEFAULT_DARK_THEME.into()), + }); + } + + if let Some(selection) = theme.icon_theme.as_mut() { + match selection { + settings::IconThemeSelection::Static(icon_theme) => { + // If the icon theme was previously set to a single static + // theme, we don't know whether it was a light or dark + // theme, so we just use it for both. + *selection = settings::IconThemeSelection::Dynamic { + mode, + light: icon_theme.clone(), + dark: icon_theme.clone(), + }; } - } else { - self.icon_theme = Some(IconThemeSelection::Static(IconThemeName( - DEFAULT_ICON_THEME_NAME.into(), - ))); + settings::IconThemeSelection::Dynamic { + mode: mode_to_update, + .. + } => *mode_to_update = mode, } + } else { + theme.icon_theme = Some(settings::IconThemeSelection::Static(IconThemeName( + DEFAULT_ICON_THEME_NAME.into(), + ))); } } +// } /// The buffer's line height. -#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, JsonSchema, Default)] -#[serde(rename_all = "snake_case")] +#[derive(Clone, Copy, Debug, PartialEq, Default)] pub enum BufferLineHeight { /// A less dense line height. #[default] @@ -555,21 +420,19 @@ pub enum BufferLineHeight { /// The default line height. Standard, /// A custom line height, where 1.0 is the font's height. Must be at least 1.0. - Custom(#[serde(deserialize_with = "deserialize_line_height")] f32), + Custom(f32), } -fn deserialize_line_height<'de, D>(deserializer: D) -> Result -where - D: serde::Deserializer<'de>, -{ - let value = f32::deserialize(deserializer)?; - if value < 1.0 { - return Err(serde::de::Error::custom( - "buffer_line_height.custom must be at least 1.0", - )); +impl From for BufferLineHeight { + fn from(value: settings::BufferLineHeight) -> Self { + match value { + settings::BufferLineHeight::Comfortable => BufferLineHeight::Comfortable, + settings::BufferLineHeight::Standard => BufferLineHeight::Standard, + settings::BufferLineHeight::Custom(line_height) => { + BufferLineHeight::Custom(line_height) + } + } } - - Ok(value) } impl BufferLineHeight { @@ -603,14 +466,23 @@ impl ThemeSettings { } /// Returns the agent panel font size. Falls back to the UI font size if unset. - pub fn agent_font_size(&self, cx: &App) -> Pixels { + pub fn agent_ui_font_size(&self, cx: &App) -> Pixels { cx.try_global::() .map(|size| size.0) - .or(self.agent_font_size) + .or(self.agent_ui_font_size) .map(clamp_font_size) .unwrap_or_else(|| self.ui_font_size(cx)) } + /// Returns the agent panel buffer font size. + pub fn agent_buffer_font_size(&self, cx: &App) -> Pixels { + cx.try_global::() + .map(|size| size.0) + .or(self.agent_buffer_font_size) + .map(clamp_font_size) + .unwrap_or_else(|| self.buffer_font_size(cx)) + } + /// Returns the buffer font size, read from the settings. /// /// The real buffer font size is stored in-memory, to support temporary font size changes. @@ -630,9 +502,17 @@ impl ThemeSettings { /// Returns the agent font size, read from the settings. /// /// The real agent font size is stored in-memory, to support temporary font size changes. - /// Use [`Self::agent_font_size`] to get the real font size. - pub fn agent_font_size_settings(&self) -> Option { - self.agent_font_size + /// Use [`Self::agent_ui_font_size`] to get the real font size. + pub fn agent_ui_font_size_settings(&self) -> Option { + self.agent_ui_font_size + } + + /// Returns the agent buffer font size, read from the settings. + /// + /// The real agent buffer font size is stored in-memory, to support temporary font size changes. + /// Use [`Self::agent_buffer_font_size`] to get the real font size. + pub fn agent_buffer_font_size_settings(&self) -> Option { + self.agent_buffer_font_size } // TODO: Rename: `line_height` -> `buffer_line_height` @@ -641,84 +521,42 @@ impl ThemeSettings { f32::max(self.buffer_line_height.value(), MIN_LINE_HEIGHT) } - /// Switches to the theme with the given name, if it exists. - /// - /// Returns a `Some` containing the new theme if it was successful. - /// Returns `None` otherwise. - pub fn switch_theme(&mut self, theme: &str, cx: &mut App) -> Option> { - let themes = ThemeRegistry::default_global(cx); - - let mut new_theme = None; - - match themes.get(theme) { - Ok(theme) => { - self.active_theme = theme.clone(); - new_theme = Some(theme); - } - Err(err @ ThemeNotFoundError(_)) => { - log::error!("{err}"); - } - } - - self.apply_theme_overrides(); - - new_theme - } - /// Applies the theme overrides, if there are any, to the current theme. - pub fn apply_theme_overrides(&mut self) { + pub fn apply_theme_overrides(&self, mut arc_theme: Arc) -> Arc { // Apply the old overrides setting first, so that the new setting can override those. if let Some(experimental_theme_overrides) = &self.experimental_theme_overrides { - let mut theme = (*self.active_theme).clone(); + let mut theme = (*arc_theme).clone(); ThemeSettings::modify_theme(&mut theme, experimental_theme_overrides); - self.active_theme = Arc::new(theme); + arc_theme = Arc::new(theme); } - if let Some(theme_overrides) = self.theme_overrides.get(self.active_theme.name.as_ref()) { - let mut theme = (*self.active_theme).clone(); + if let Some(theme_overrides) = self.theme_overrides.get(arc_theme.name.as_ref()) { + let mut theme = (*arc_theme).clone(); ThemeSettings::modify_theme(&mut theme, theme_overrides); - self.active_theme = Arc::new(theme); + arc_theme = Arc::new(theme); } + + arc_theme } - fn modify_theme(base_theme: &mut Theme, theme_overrides: &ThemeStyleContent) { + fn modify_theme(base_theme: &mut Theme, theme_overrides: &settings::ThemeStyleContent) { if let Some(window_background_appearance) = theme_overrides.window_background_appearance { base_theme.styles.window_background_appearance = window_background_appearance.into(); } + let status_color_refinement = status_colors_refinement(&theme_overrides.status); - base_theme - .styles - .colors - .refine(&theme_overrides.theme_colors_refinement()); - base_theme - .styles - .status - .refine(&theme_overrides.status_colors_refinement()); + base_theme.styles.colors.refine(&theme_colors_refinement( + &theme_overrides.colors, + &status_color_refinement, + )); + base_theme.styles.status.refine(&status_color_refinement); base_theme.styles.player.merge(&theme_overrides.players); base_theme.styles.accents.merge(&theme_overrides.accents); base_theme.styles.syntax = SyntaxTheme::merge( base_theme.styles.syntax.clone(), - theme_overrides.syntax_overrides(), + syntax_overrides(&theme_overrides), ); } - - /// Switches to the icon theme with the given name, if it exists. - /// - /// Returns a `Some` containing the new icon theme if it was successful. - /// Returns `None` otherwise. - pub fn switch_icon_theme(&mut self, icon_theme: &str, cx: &mut App) -> Option> { - let themes = ThemeRegistry::default_global(cx); - - let mut new_icon_theme = None; - - if let Some(icon_theme) = themes.get_icon_theme(icon_theme).log_err() { - self.active_icon_theme = icon_theme.clone(); - new_icon_theme = Some(icon_theme); - cx.refresh_windows(); - } - - new_icon_theme - } } /// Observe changes to the adjusted buffer font size. @@ -791,18 +629,36 @@ pub fn reset_ui_font_size(cx: &mut App) { } } -/// Sets the adjusted agent panel font size. -pub fn adjust_agent_font_size(cx: &mut App, f: impl FnOnce(Pixels) -> Pixels) { - let agent_font_size = ThemeSettings::get_global(cx).agent_font_size(cx); +/// Sets the adjusted font size of agent responses in the agent panel. +pub fn adjust_agent_ui_font_size(cx: &mut App, f: impl FnOnce(Pixels) -> Pixels) { + let agent_ui_font_size = ThemeSettings::get_global(cx).agent_ui_font_size(cx); + let adjusted_size = cx + .try_global::() + .map_or(agent_ui_font_size, |adjusted_size| adjusted_size.0); + cx.set_global(AgentFontSize(clamp_font_size(f(adjusted_size)))); + cx.refresh_windows(); +} + +/// Resets the agent response font size in the agent panel to the default value. +pub fn reset_agent_ui_font_size(cx: &mut App) { + if cx.has_global::() { + cx.remove_global::(); + cx.refresh_windows(); + } +} + +/// Sets the adjusted font size of user messages in the agent panel. +pub fn adjust_agent_buffer_font_size(cx: &mut App, f: impl FnOnce(Pixels) -> Pixels) { + let agent_buffer_font_size = ThemeSettings::get_global(cx).agent_buffer_font_size(cx); let adjusted_size = cx .try_global::() - .map_or(agent_font_size, |adjusted_size| adjusted_size.0); + .map_or(agent_buffer_font_size, |adjusted_size| adjusted_size.0); cx.set_global(AgentFontSize(clamp_font_size(f(adjusted_size)))); cx.refresh_windows(); } -/// Resets the agent panel font size to the default value. -pub fn reset_agent_font_size(cx: &mut App) { +/// Resets the user message font size in the agent panel to the default value. +pub fn reset_agent_buffer_font_size(cx: &mut App) { if cx.has_global::() { cx.remove_global::(); cx.refresh_windows(); @@ -818,294 +674,68 @@ fn clamp_font_weight(weight: f32) -> FontWeight { FontWeight(weight.clamp(100., 950.)) } -impl settings::Settings for ThemeSettings { - type FileContent = ThemeSettingsContent; - - fn load(sources: SettingsSources, cx: &mut App) -> Result { - let themes = ThemeRegistry::default_global(cx); - let system_appearance = SystemAppearance::default_global(cx); - - fn font_fallbacks_from_settings( - fallbacks: Option>, - ) -> Option { - fallbacks.map(|fallbacks| { - FontFallbacks::from_fonts( - fallbacks - .into_iter() - .map(|font_family| font_family.0.to_string()) - .collect(), - ) - }) - } +/// font fallback from settings +pub fn font_fallbacks_from_settings( + fallbacks: Option>, +) -> Option { + fallbacks.map(|fallbacks| { + FontFallbacks::from_fonts( + fallbacks + .into_iter() + .map(|font_family| font_family.0.to_string()) + .collect(), + ) + }) +} - let defaults = sources.default; - let mut this = Self { - ui_font_size: defaults.ui_font_size.unwrap().into(), +impl settings::Settings for ThemeSettings { + fn from_settings(content: &settings::SettingsContent) -> Self { + let content = &content.theme; + let theme_selection: ThemeSelection = content.theme.clone().unwrap().into(); + let icon_theme_selection: IconThemeSelection = content.icon_theme.clone().unwrap().into(); + Self { + ui_font_size: clamp_font_size(content.ui_font_size.unwrap().into()), ui_font: Font { - family: defaults.ui_font_family.as_ref().unwrap().0.clone().into(), - features: defaults.ui_font_features.clone().unwrap(), - fallbacks: font_fallbacks_from_settings(defaults.ui_font_fallbacks.clone()), - weight: defaults.ui_font_weight.map(FontWeight).unwrap(), + family: content.ui_font_family.as_ref().unwrap().0.clone().into(), + features: content.ui_font_features.clone().unwrap(), + fallbacks: font_fallbacks_from_settings(content.ui_font_fallbacks.clone()), + weight: clamp_font_weight(content.ui_font_weight.unwrap().0), style: Default::default(), }, buffer_font: Font { - family: defaults + family: content .buffer_font_family .as_ref() .unwrap() .0 .clone() .into(), - features: defaults.buffer_font_features.clone().unwrap(), - fallbacks: font_fallbacks_from_settings(defaults.buffer_font_fallbacks.clone()), - weight: defaults.buffer_font_weight.map(FontWeight).unwrap(), + features: content.buffer_font_features.clone().unwrap(), + fallbacks: font_fallbacks_from_settings(content.buffer_font_fallbacks.clone()), + weight: clamp_font_weight(content.buffer_font_weight.unwrap().0), style: FontStyle::default(), }, - buffer_font_size: defaults.buffer_font_size.unwrap().into(), - buffer_line_height: defaults.buffer_line_height.unwrap(), - agent_font_size: defaults.agent_font_size.flatten().map(Into::into), - theme_selection: defaults.theme.clone(), - active_theme: themes - .get(defaults.theme.as_ref().unwrap().theme(*system_appearance)) - .or(themes.get(&zed_default_dark().name)) - .unwrap(), - experimental_theme_overrides: None, - theme_overrides: HashMap::default(), - icon_theme_selection: defaults.icon_theme.clone(), - active_icon_theme: defaults - .icon_theme - .as_ref() - .and_then(|selection| { - themes - .get_icon_theme(selection.icon_theme(*system_appearance)) - .ok() - }) - .unwrap_or_else(|| themes.get_icon_theme(DEFAULT_ICON_THEME_NAME).unwrap()), - ui_density: defaults.ui_density.unwrap_or(UiDensity::Default), - unnecessary_code_fade: defaults.unnecessary_code_fade.unwrap_or(0.0), - }; - - for value in sources - .user - .into_iter() - .chain(sources.release_channel) - .chain(sources.operating_system) - .chain(sources.profile) - .chain(sources.server) - { - if let Some(value) = value.ui_density { - this.ui_density = value; - } - - if let Some(value) = value.buffer_font_family.clone() { - this.buffer_font.family = value.0.into(); - } - if let Some(value) = value.buffer_font_features.clone() { - this.buffer_font.features = value; - } - if let Some(value) = value.buffer_font_fallbacks.clone() { - this.buffer_font.fallbacks = font_fallbacks_from_settings(Some(value)); - } - if let Some(value) = value.buffer_font_weight { - this.buffer_font.weight = clamp_font_weight(value); - } - - if let Some(value) = value.ui_font_family.clone() { - this.ui_font.family = value.0.into(); - } - if let Some(value) = value.ui_font_features.clone() { - this.ui_font.features = value; - } - if let Some(value) = value.ui_font_fallbacks.clone() { - this.ui_font.fallbacks = font_fallbacks_from_settings(Some(value)); - } - if let Some(value) = value.ui_font_weight { - this.ui_font.weight = clamp_font_weight(value); - } - - if let Some(value) = &value.theme { - this.theme_selection = Some(value.clone()); - - let theme_name = value.theme(*system_appearance); - - match themes.get(theme_name) { - Ok(theme) => { - this.active_theme = theme; - } - Err(err @ ThemeNotFoundError(_)) => { - if themes.extensions_loaded() { - log::error!("{err}"); - } - } - } - } - - this.experimental_theme_overrides - .clone_from(&value.experimental_theme_overrides); - this.theme_overrides.clone_from(&value.theme_overrides); - this.apply_theme_overrides(); - - if let Some(value) = &value.icon_theme { - this.icon_theme_selection = Some(value.clone()); - - let icon_theme_name = value.icon_theme(*system_appearance); - - match themes.get_icon_theme(icon_theme_name) { - Ok(icon_theme) => { - this.active_icon_theme = icon_theme; - } - Err(err @ IconThemeNotFoundError(_)) => { - if themes.extensions_loaded() { - log::error!("{err}"); - } - } - } - } - - merge( - &mut this.ui_font_size, - value.ui_font_size.map(Into::into).map(clamp_font_size), - ); - merge( - &mut this.buffer_font_size, - value.buffer_font_size.map(Into::into).map(clamp_font_size), - ); - merge( - &mut this.agent_font_size, - value - .agent_font_size - .map(|value| value.map(Into::into).map(clamp_font_size)), - ); - - merge(&mut this.buffer_line_height, value.buffer_line_height); - - // Clamp the `unnecessary_code_fade` to ensure text can't disappear entirely. - merge(&mut this.unnecessary_code_fade, value.unnecessary_code_fade); - this.unnecessary_code_fade = this.unnecessary_code_fade.clamp(0.0, 0.9); + buffer_font_size: clamp_font_size(content.buffer_font_size.unwrap().into()), + buffer_line_height: content.buffer_line_height.unwrap().into(), + agent_ui_font_size: content.agent_ui_font_size.map(Into::into), + agent_buffer_font_size: content.agent_buffer_font_size.map(Into::into), + theme: theme_selection, + experimental_theme_overrides: content.experimental_theme_overrides.clone(), + theme_overrides: content.theme_overrides.clone(), + icon_theme: icon_theme_selection, + ui_density: content.ui_density.unwrap_or_default().into(), + unnecessary_code_fade: content.unnecessary_code_fade.unwrap().0.clamp(0.0, 0.9), } - - Ok(this) } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { - vscode.f32_setting("editor.fontWeight", &mut current.buffer_font_weight); - vscode.f32_setting("editor.fontSize", &mut current.buffer_font_size); - if let Some(font) = vscode.read_string("editor.font") { - current.buffer_font_family = Some(FontFamilyName(font.into())); - } + fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut SettingsContent) { + vscode.from_f32_setting("editor.fontWeight", &mut current.theme.buffer_font_weight); + vscode.from_f32_setting("editor.fontSize", &mut current.theme.buffer_font_size); + vscode.font_family_setting( + "editor.fontFamily", + &mut current.theme.buffer_font_family, + &mut current.theme.buffer_font_fallbacks, + ) // TODO: possibly map editor.fontLigatures to buffer_font_features? } } - -/// Newtype for a theme name. Its `ParameterizedJsonSchema` lists the theme names known at runtime. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(transparent)] -pub struct ThemeName(pub Arc); - -inventory::submit! { - ParameterizedJsonSchema { - add_and_get_ref: |generator, _params, cx| { - replace_subschema::(generator, || json_schema!({ - "type": "string", - "enum": ThemeRegistry::global(cx).list_names(), - })) - } - } -} - -/// Newtype for a icon theme name. Its `ParameterizedJsonSchema` lists the icon theme names known at -/// runtime. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(transparent)] -pub struct IconThemeName(pub Arc); - -inventory::submit! { - ParameterizedJsonSchema { - add_and_get_ref: |generator, _params, cx| { - replace_subschema::(generator, || json_schema!({ - "type": "string", - "enum": ThemeRegistry::global(cx) - .list_icon_themes() - .into_iter() - .map(|icon_theme| icon_theme.name) - .collect::>(), - })) - } - } -} - -/// Newtype for font family name. Its `ParameterizedJsonSchema` lists the font families known at -/// runtime. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(transparent)] -pub struct FontFamilyName(pub Arc); - -inventory::submit! { - ParameterizedJsonSchema { - add_and_get_ref: |generator, params, _cx| { - replace_subschema::(generator, || { - json_schema!({ - "type": "string", - "enum": params.font_names, - }) - }) - } - } -} - -fn merge(target: &mut T, value: Option) { - if let Some(value) = value { - *target = value; - } -} - -#[cfg(test)] -mod tests { - use super::*; - use serde_json::json; - - #[test] - fn test_buffer_line_height_deserialize_valid() { - assert_eq!( - serde_json::from_value::(json!("comfortable")).unwrap(), - BufferLineHeight::Comfortable - ); - assert_eq!( - serde_json::from_value::(json!("standard")).unwrap(), - BufferLineHeight::Standard - ); - assert_eq!( - serde_json::from_value::(json!({"custom": 1.0})).unwrap(), - BufferLineHeight::Custom(1.0) - ); - assert_eq!( - serde_json::from_value::(json!({"custom": 1.5})).unwrap(), - BufferLineHeight::Custom(1.5) - ); - } - - #[test] - fn test_buffer_line_height_deserialize_invalid() { - assert!( - serde_json::from_value::(json!({"custom": 0.99})) - .err() - .unwrap() - .to_string() - .contains("buffer_line_height.custom must be at least 1.0") - ); - assert!( - serde_json::from_value::(json!({"custom": 0.0})) - .err() - .unwrap() - .to_string() - .contains("buffer_line_height.custom must be at least 1.0") - ); - assert!( - serde_json::from_value::(json!({"custom": -1.0})) - .err() - .unwrap() - .to_string() - .contains("buffer_line_height.custom must be at least 1.0") - ); - } -} diff --git a/crates/theme/src/styles/accents.rs b/crates/theme/src/styles/accents.rs index cda0ef778a6b974d715cfbdb8b0c8f9067b411cc..49ae755bf811da4f5cbd53eb521ae3b300278c99 100644 --- a/crates/theme/src/styles/accents.rs +++ b/crates/theme/src/styles/accents.rs @@ -1,9 +1,9 @@ use gpui::Hsla; -use serde_derive::Deserialize; +use serde::Deserialize; use crate::{ - AccentContent, amber, blue, cyan, gold, grass, indigo, iris, jade, lime, orange, pink, purple, - tomato, try_parse_color, + amber, blue, cyan, gold, grass, indigo, iris, jade, lime, orange, pink, purple, tomato, + try_parse_color, }; /// A collection of colors that are used to color indent aware lines in the editor. @@ -66,7 +66,7 @@ impl AccentColors { } /// Merges the given accent colors into this [`AccentColors`] instance. - pub fn merge(&mut self, accent_colors: &[AccentContent]) { + pub fn merge(&mut self, accent_colors: &[settings::AccentContent]) { if accent_colors.is_empty() { return; } diff --git a/crates/theme/src/styles/players.rs b/crates/theme/src/styles/players.rs index 4b1f0976b64b28a06bb7873b994d636a159bb396..439dbdd437aa64e034004a4495e64a96e76ce87e 100644 --- a/crates/theme/src/styles/players.rs +++ b/crates/theme/src/styles/players.rs @@ -1,11 +1,9 @@ #![allow(missing_docs)] use gpui::Hsla; -use serde_derive::Deserialize; +use serde::Deserialize; -use crate::{ - PlayerColorContent, amber, blue, jade, lime, orange, pink, purple, red, try_parse_color, -}; +use crate::{amber, blue, jade, lime, orange, pink, purple, red, try_parse_color}; #[derive(Debug, Clone, Copy, Deserialize, Default, PartialEq)] pub struct PlayerColor { @@ -152,7 +150,7 @@ impl PlayerColors { } /// Merges the given player colors into this [`PlayerColors`] instance. - pub fn merge(&mut self, user_player_colors: &[PlayerColorContent]) { + pub fn merge(&mut self, user_player_colors: &[settings::PlayerColorContent]) { if user_player_colors.is_empty() { return; } diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index c54010b4b0c6fe56168c3e15271d3423921b15da..c18719efe0d2665928bb0c6003cc69a85da49b83 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -27,6 +27,8 @@ use ::settings::SettingsStore; use anyhow::Result; use fallback_themes::apply_status_color_defaults; use fs::Fs; +use gpui::BorrowAppContext; +use gpui::Global; use gpui::{ App, AssetSource, HighlightStyle, Hsla, Pixels, Refineable, SharedString, WindowAppearance, WindowBackgroundAppearance, px, @@ -44,6 +46,10 @@ pub use crate::scale::*; pub use crate::schema::*; pub use crate::settings::*; pub use crate::styles::*; +pub use ::settings::{ + FontStyleContent, HighlightStyleContent, StatusColorsContent, ThemeColorsContent, + ThemeStyleContent, +}; /// Defines window border radius for platforms that use client side decorations. pub const CLIENT_SIDE_DECORATION_ROUNDING: Pixels = px(10.0); @@ -91,6 +97,7 @@ pub enum LoadThemes { /// Initialize the theme system. pub fn init(themes_to_load: LoadThemes, cx: &mut App) { + SystemAppearance::init(cx); let (assets, load_user_themes) = match themes_to_load { LoadThemes::JustBase => (Box::new(()) as Box, false), LoadThemes::All(assets) => (assets, true), @@ -104,28 +111,66 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut App) { ThemeSettings::register(cx); FontFamilyCache::init_global(cx); - let mut prev_buffer_font_size_settings = - ThemeSettings::get_global(cx).buffer_font_size_settings(); - let mut prev_ui_font_size_settings = ThemeSettings::get_global(cx).ui_font_size_settings(); - let mut prev_agent_font_size_settings = - ThemeSettings::get_global(cx).agent_font_size_settings(); + let theme = GlobalTheme::configured_theme(cx); + let icon_theme = GlobalTheme::configured_icon_theme(cx); + cx.set_global(GlobalTheme { theme, icon_theme }); + + let settings = ThemeSettings::get_global(cx); + + let mut prev_buffer_font_size_settings = settings.buffer_font_size_settings(); + let mut prev_ui_font_size_settings = settings.ui_font_size_settings(); + let mut prev_agent_ui_font_size_settings = settings.agent_ui_font_size_settings(); + let mut prev_agent_buffer_font_size_settings = settings.agent_buffer_font_size_settings(); + let mut prev_theme_name = settings.theme.name(SystemAppearance::global(cx).0); + let mut prev_icon_theme_name = settings.icon_theme.name(SystemAppearance::global(cx).0); + let mut prev_theme_overrides = ( + settings.experimental_theme_overrides.clone(), + settings.theme_overrides.clone(), + ); + cx.observe_global::(move |cx| { - let buffer_font_size_settings = ThemeSettings::get_global(cx).buffer_font_size_settings(); + let settings = ThemeSettings::get_global(cx); + + let buffer_font_size_settings = settings.buffer_font_size_settings(); + let ui_font_size_settings = settings.ui_font_size_settings(); + let agent_ui_font_size_settings = settings.agent_ui_font_size_settings(); + let agent_buffer_font_size_settings = settings.agent_buffer_font_size_settings(); + let theme_name = settings.theme.name(SystemAppearance::global(cx).0); + let icon_theme_name = settings.icon_theme.name(SystemAppearance::global(cx).0); + let theme_overrides = ( + settings.experimental_theme_overrides.clone(), + settings.theme_overrides.clone(), + ); + if buffer_font_size_settings != prev_buffer_font_size_settings { prev_buffer_font_size_settings = buffer_font_size_settings; reset_buffer_font_size(cx); } - let ui_font_size_settings = ThemeSettings::get_global(cx).ui_font_size_settings(); if ui_font_size_settings != prev_ui_font_size_settings { prev_ui_font_size_settings = ui_font_size_settings; reset_ui_font_size(cx); } - let agent_font_size_settings = ThemeSettings::get_global(cx).agent_font_size_settings(); - if agent_font_size_settings != prev_agent_font_size_settings { - prev_agent_font_size_settings = agent_font_size_settings; - reset_agent_font_size(cx); + if agent_ui_font_size_settings != prev_agent_ui_font_size_settings { + prev_agent_ui_font_size_settings = agent_ui_font_size_settings; + reset_agent_ui_font_size(cx); + } + + if agent_buffer_font_size_settings != prev_agent_buffer_font_size_settings { + prev_agent_buffer_font_size_settings = agent_buffer_font_size_settings; + reset_agent_buffer_font_size(cx); + } + + if theme_name != prev_theme_name || theme_overrides != prev_theme_overrides { + prev_theme_name = theme_name; + prev_theme_overrides = theme_overrides; + GlobalTheme::reload_theme(cx); + } + + if icon_theme_name != prev_icon_theme_name { + prev_icon_theme_name = icon_theme_name; + GlobalTheme::reload_icon_theme(cx); } }) .detach(); @@ -139,7 +184,7 @@ pub trait ActiveTheme { impl ActiveTheme for App { fn theme(&self) -> &Arc { - &ThemeSettings::get_global(self).active_theme + GlobalTheme::theme(self) } } @@ -178,7 +223,7 @@ impl ThemeFamily { AppearanceContent::Light => StatusColors::light(), AppearanceContent::Dark => StatusColors::dark(), }; - let mut status_colors_refinement = theme.style.status_colors_refinement(); + let mut status_colors_refinement = status_colors_refinement(&theme.style.status); apply_status_color_defaults(&mut status_colors_refinement); refined_status_colors.refine(&status_colors_refinement); @@ -192,7 +237,8 @@ impl ThemeFamily { AppearanceContent::Light => ThemeColors::light(), AppearanceContent::Dark => ThemeColors::dark(), }; - let mut theme_colors_refinement = theme.style.theme_colors_refinement(); + let mut theme_colors_refinement = + theme_colors_refinement(&theme.style.colors, &status_colors_refinement); apply_theme_color_defaults(&mut theme_colors_refinement, &refined_player_colors); refined_theme_colors.refine(&theme_colors_refinement); @@ -392,3 +438,82 @@ pub async fn read_icon_theme( Ok(icon_theme_family) } + +/// The active theme +pub struct GlobalTheme { + theme: Arc, + icon_theme: Arc, +} +impl Global for GlobalTheme {} + +impl GlobalTheme { + fn configured_theme(cx: &mut App) -> Arc { + let themes = ThemeRegistry::default_global(cx); + let theme_settings = ThemeSettings::get_global(cx); + let system_appearance = SystemAppearance::global(cx); + + let theme_name = theme_settings.theme.name(*system_appearance); + + let theme = match themes.get(&theme_name.0) { + Ok(theme) => theme, + Err(err) => { + if themes.extensions_loaded() { + log::error!("{err}"); + } + themes + .get(default_theme(*system_appearance)) + // fallback for tests. + .unwrap_or_else(|_| themes.get(DEFAULT_DARK_THEME).unwrap()) + } + }; + theme_settings.apply_theme_overrides(theme) + } + + /// Reloads the current theme. + /// + /// Reads the [`ThemeSettings`] to know which theme should be loaded, + /// taking into account the current [`SystemAppearance`]. + pub fn reload_theme(cx: &mut App) { + let theme = Self::configured_theme(cx); + cx.update_global::(|this, _| this.theme = theme); + cx.refresh_windows(); + } + + fn configured_icon_theme(cx: &mut App) -> Arc { + let themes = ThemeRegistry::default_global(cx); + let theme_settings = ThemeSettings::get_global(cx); + let system_appearance = SystemAppearance::global(cx); + + let icon_theme_name = theme_settings.icon_theme.name(*system_appearance); + + match themes.get_icon_theme(&icon_theme_name.0) { + Ok(theme) => theme, + Err(err) => { + if themes.extensions_loaded() { + log::error!("{err}"); + } + themes.get_icon_theme(DEFAULT_ICON_THEME_NAME).unwrap() + } + } + } + + /// Reloads the current icon theme. + /// + /// Reads the [`ThemeSettings`] to know which icon theme should be loaded, + /// taking into account the current [`SystemAppearance`]. + pub fn reload_icon_theme(cx: &mut App) { + let icon_theme = Self::configured_icon_theme(cx); + cx.update_global::(|this, _| this.icon_theme = icon_theme); + cx.refresh_windows(); + } + + /// the active theme + pub fn theme(cx: &App) -> &Arc { + &cx.global::().theme + } + + /// the active icon theme + pub fn icon_theme(cx: &App) -> &Arc { + &cx.global::().icon_theme + } +} diff --git a/crates/theme_extension/src/theme_extension.rs b/crates/theme_extension/src/theme_extension.rs index b9c6ed6d4b9c5b1ddf5ce0066e1b6b729ba7ee7f..10df2349c86decbadaa010778a95d04af36a6aab 100644 --- a/crates/theme_extension/src/theme_extension.rs +++ b/crates/theme_extension/src/theme_extension.rs @@ -5,7 +5,7 @@ use anyhow::Result; use extension::{ExtensionHostProxy, ExtensionThemeProxy}; use fs::Fs; use gpui::{App, BackgroundExecutor, SharedString, Task}; -use theme::{ThemeRegistry, ThemeSettings}; +use theme::{GlobalTheme, ThemeRegistry}; pub fn init( extension_host_proxy: Arc, @@ -46,7 +46,7 @@ impl ExtensionThemeProxy for ThemeRegistryProxy { } fn reload_current_theme(&self, cx: &mut App) { - ThemeSettings::reload_current_theme(cx) + GlobalTheme::reload_theme(cx) } fn list_icon_theme_names( @@ -83,6 +83,6 @@ impl ExtensionThemeProxy for ThemeRegistryProxy { } fn reload_current_icon_theme(&self, cx: &mut App) { - ThemeSettings::reload_current_icon_theme(cx) + GlobalTheme::reload_icon_theme(cx) } } diff --git a/crates/theme_importer/Cargo.toml b/crates/theme_importer/Cargo.toml index f9f7daa5b3bd7d48ce0631d26d6a3c21767e5d5e..2fef5a62498d9ac0abfef3913edbd1dc711e5e64 100644 --- a/crates/theme_importer/Cargo.toml +++ b/crates/theme_importer/Cargo.toml @@ -11,6 +11,7 @@ workspace = true [dependencies] anyhow.workspace = true clap = { workspace = true, features = ["derive"] } +collections.workspace = true gpui.workspace = true indexmap.workspace = true log.workspace = true diff --git a/crates/theme_importer/src/main.rs b/crates/theme_importer/src/main.rs index ebb2840d0401d05b2bcac4e8c001dc30424f0fe5..0ea6bbc4bcfba6196031b705f92771c753b9dc50 100644 --- a/crates/theme_importer/src/main.rs +++ b/crates/theme_importer/src/main.rs @@ -7,7 +7,7 @@ use std::path::PathBuf; use anyhow::{Context as _, Result}; use clap::Parser; -use indexmap::IndexMap; +use collections::IndexMap; use log::LevelFilter; use serde::Deserialize; use simplelog::ColorChoice; @@ -19,21 +19,6 @@ use crate::vscode::VsCodeThemeConverter; const ZED_THEME_SCHEMA_URL: &str = "https://zed.dev/schema/themes/v0.2.0.json"; -#[derive(Debug, Deserialize)] -struct FamilyMetadata { - pub name: String, - pub author: String, - pub themes: Vec, - - /// Overrides for specific syntax tokens. - /// - /// Use this to ensure certain Zed syntax tokens are matched - /// to an exact set of scopes when it is not otherwise possible - /// to rely on the default mappings in the theme importer. - #[serde(default)] - pub syntax: IndexMap>, -} - #[derive(Debug, Clone, Copy, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ThemeAppearanceJson { @@ -121,7 +106,7 @@ fn main() -> Result<()> { file_name: "".to_string(), }; - let converter = VsCodeThemeConverter::new(vscode_theme, theme_metadata, IndexMap::new()); + let converter = VsCodeThemeConverter::new(vscode_theme, theme_metadata, IndexMap::default()); let theme = converter.convert()?; let mut theme = serde_json::to_value(theme).unwrap(); diff --git a/crates/theme_importer/src/vscode/converter.rs b/crates/theme_importer/src/vscode/converter.rs index b3b846d91d5ac3a7e3d88983787d23fe9f0adece..e4a9769978e7f2b987c1404474d0f029bec7977b 100644 --- a/crates/theme_importer/src/vscode/converter.rs +++ b/crates/theme_importer/src/vscode/converter.rs @@ -1,9 +1,9 @@ use anyhow::Result; -use indexmap::IndexMap; +use collections::IndexMap; use strum::IntoEnumIterator; use theme::{ FontStyleContent, FontWeightContent, HighlightStyleContent, StatusColorsContent, - ThemeColorsContent, ThemeContent, ThemeStyleContent, + ThemeColorsContent, ThemeContent, ThemeStyleContent, WindowBackgroundContent, }; use crate::ThemeMetadata; @@ -56,7 +56,7 @@ impl VsCodeThemeConverter { name: self.theme_metadata.name, appearance, style: ThemeStyleContent { - window_background_appearance: Some(theme::WindowBackgroundContent::Opaque), + window_background_appearance: Some(WindowBackgroundContent::Opaque), accents: Vec::new(), //TODO can we read this from the theme? colors: theme_colors, status: status_colors, @@ -212,7 +212,7 @@ impl VsCodeThemeConverter { } fn convert_syntax_theme(&self) -> Result> { - let mut highlight_styles = IndexMap::new(); + let mut highlight_styles = IndexMap::default(); for syntax_token in ZedSyntaxToken::iter() { let override_match = self diff --git a/crates/theme_importer/src/vscode/theme.rs b/crates/theme_importer/src/vscode/theme.rs index b6b073b4467fa412e023babd8ef3459827ae4083..2479dd312ecc231096e9a26c3a5babd8649133a1 100644 --- a/crates/theme_importer/src/vscode/theme.rs +++ b/crates/theme_importer/src/vscode/theme.rs @@ -6,12 +6,32 @@ use crate::vscode::VsCodeTokenColor; #[derive(Deserialize, Debug)] pub struct VsCodeTheme { #[serde(rename = "$schema")] + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] pub schema: Option, pub name: Option, + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] pub author: Option, + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] pub maintainers: Option>, #[serde(rename = "semanticClass")] + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] pub semantic_class: Option, + #[expect( + unused, + reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove" + )] #[serde(rename = "semanticHighlighting")] pub semantic_highlighting: Option, pub colors: Colors, diff --git a/crates/theme_selector/src/icon_theme_selector.rs b/crates/theme_selector/src/icon_theme_selector.rs index 5b26124079d9bf20edac38baa3dd49f2bb579456..2ea3436d43cd2d2a4bda392384ff51f962824143 100644 --- a/crates/theme_selector/src/icon_theme_selector.rs +++ b/crates/theme_selector/src/icon_theme_selector.rs @@ -7,7 +7,10 @@ use gpui::{ use picker::{Picker, PickerDelegate}; use settings::{Settings as _, SettingsStore, update_settings_file}; use std::sync::Arc; -use theme::{Appearance, IconTheme, ThemeMeta, ThemeRegistry, ThemeSettings}; +use theme::{ + Appearance, IconThemeName, IconThemeSelection, SystemAppearance, ThemeMeta, ThemeRegistry, + ThemeSettings, +}; use ui::{ListItem, ListItemSpacing, prelude::*, v_flex}; use util::ResultExt; use workspace::{ModalView, ui::HighlightedLabel}; @@ -51,9 +54,9 @@ pub(crate) struct IconThemeSelectorDelegate { fs: Arc, themes: Vec, matches: Vec, - original_theme: Arc, + original_theme: IconThemeName, selection_completed: bool, - selected_theme: Option>, + selected_theme: Option, selected_index: usize, selector: WeakEntity, } @@ -66,7 +69,9 @@ impl IconThemeSelectorDelegate { cx: &mut Context, ) -> Self { let theme_settings = ThemeSettings::get_global(cx); - let original_theme = theme_settings.active_icon_theme.clone(); + let original_theme = theme_settings + .icon_theme + .name(SystemAppearance::global(cx).0); let registry = ThemeRegistry::global(cx); let mut themes = registry @@ -107,29 +112,18 @@ impl IconThemeSelectorDelegate { selector, }; - this.select_if_matching(&original_theme.name); + this.select_if_matching(&original_theme.0); this } fn show_selected_theme( &mut self, cx: &mut Context>, - ) -> Option> { - if let Some(mat) = self.matches.get(self.selected_index) { - let registry = ThemeRegistry::global(cx); - match registry.get_icon_theme(&mat.string) { - Ok(theme) => { - Self::set_icon_theme(theme.clone(), cx); - Some(theme) - } - Err(err) => { - log::error!("error loading icon theme {}: {err}", mat.string); - None - } - } - } else { - None - } + ) -> Option { + let mat = self.matches.get(self.selected_index)?; + let name = IconThemeName(mat.string.clone().into()); + Self::set_icon_theme(name.clone(), cx); + Some(name) } fn select_if_matching(&mut self, theme_name: &str) { @@ -140,12 +134,11 @@ impl IconThemeSelectorDelegate { .unwrap_or(self.selected_index); } - fn set_icon_theme(theme: Arc, cx: &mut App) { - SettingsStore::update_global(cx, |store, cx| { + fn set_icon_theme(name: IconThemeName, cx: &mut App) { + SettingsStore::update_global(cx, |store, _| { let mut theme_settings = store.get::(None).clone(); - theme_settings.active_icon_theme = theme; + theme_settings.icon_theme = IconThemeSelection::Static(name); store.override_global(theme_settings); - cx.refresh_windows(); }); } } @@ -170,7 +163,9 @@ impl PickerDelegate for IconThemeSelectorDelegate { self.selection_completed = true; let theme_settings = ThemeSettings::get_global(cx); - let theme_name = theme_settings.active_icon_theme.name.clone(); + let theme_name = theme_settings + .icon_theme + .name(SystemAppearance::global(cx).0); telemetry::event!( "Settings Changed", @@ -180,8 +175,8 @@ impl PickerDelegate for IconThemeSelectorDelegate { let appearance = Appearance::from(window.appearance()); - update_settings_file::(self.fs.clone(), cx, move |settings, _| { - settings.set_icon_theme(theme_name.to_string(), appearance); + update_settings_file(self.fs.clone(), cx, move |settings, _| { + theme::set_icon_theme(settings, theme_name, appearance); }); self.selector @@ -268,7 +263,7 @@ impl PickerDelegate for IconThemeSelectorDelegate { .matches .iter() .enumerate() - .find(|(_, mtch)| mtch.string == selected.name) + .find(|(_, mtch)| mtch.string.as_str() == selected.0.as_ref()) .map(|(ix, _)| ix) .unwrap_or_default(); } else { diff --git a/crates/theme_selector/src/theme_selector.rs b/crates/theme_selector/src/theme_selector.rs index 8cc450c97fb1fe0b8bdf7866156880471d0673d4..d3e21d5bd51613ef496fa9dbea52502688fc1f16 100644 --- a/crates/theme_selector/src/theme_selector.rs +++ b/crates/theme_selector/src/theme_selector.rs @@ -203,12 +203,11 @@ impl ThemeSelectorDelegate { } fn set_theme(theme: Arc, cx: &mut App) { - SettingsStore::update_global(cx, |store, cx| { + SettingsStore::update_global(cx, |store, _| { let mut theme_settings = store.get::(None).clone(); - theme_settings.active_theme = theme; - theme_settings.apply_theme_overrides(); + let name = theme.as_ref().name.clone().into(); + theme_settings.theme = theme::ThemeSelection::Static(theme::ThemeName(name)); store.override_global(theme_settings); - cx.refresh_windows(); }); } } @@ -238,8 +237,8 @@ impl PickerDelegate for ThemeSelectorDelegate { let appearance = Appearance::from(window.appearance()); - update_settings_file::(self.fs.clone(), cx, move |settings, _| { - settings.set_theme(theme_name.to_string(), appearance); + update_settings_file(self.fs.clone(), cx, move |settings, _| { + theme::set_theme(settings, theme_name.to_string(), appearance); }); self.selector diff --git a/crates/title_bar/src/collab.rs b/crates/title_bar/src/collab.rs index b1b509821a35e1e61244254d024e0a62f7cb8424..f24212493dafcffe8c4f45ab8344b3e0945b205a 100644 --- a/crates/title_bar/src/collab.rs +++ b/crates/title_bar/src/collab.rs @@ -118,7 +118,7 @@ fn render_color_ribbon(color: Hsla) -> impl Element { move |bounds, _, window, _| { let height = bounds.size.height; let horizontal_offset = height; - let vertical_offset = px(height.0 / 2.0); + let vertical_offset = height / 2.0; let mut path = Path::new(bounds.bottom_left()); path.curve_to( bounds.origin + point(horizontal_offset, vertical_offset), diff --git a/crates/title_bar/src/platform_title_bar.rs b/crates/title_bar/src/platform_title_bar.rs index bc1057a4d4bd98a21031cb93d71d9f654d090b2c..c816f0930ca48bdb7f66233a95dfd7b08c1adf09 100644 --- a/crates/title_bar/src/platform_title_bar.rs +++ b/crates/title_bar/src/platform_title_bar.rs @@ -109,6 +109,7 @@ impl Render for PlatformTitleBar { .flex_row() .items_center() .justify_between() + .overflow_x_hidden() .w_full() // Note: On Windows the title bar behavior is handled by the platform implementation. .when(self.platform_style == PlatformStyle::Mac, |this| { diff --git a/crates/title_bar/src/title_bar.rs b/crates/title_bar/src/title_bar.rs index 7b8e03ac09158e85808497f2e31939398f0e7cf8..be3ee9c4415465de74e42aec0c889ea3e6931d85 100644 --- a/crates/title_bar/src/title_bar.rs +++ b/crates/title_bar/src/title_bar.rs @@ -30,17 +30,20 @@ use gpui::{ Subscription, WeakEntity, Window, actions, div, }; use onboarding_banner::OnboardingBanner; -use project::{Project, WorktreeSettings}; +use project::{ + Project, WorktreeSettings, + git_store::{GitStoreEvent, RepositoryEvent}, +}; use remote::RemoteConnectionOptions; use settings::{Settings, SettingsLocation}; -use std::{path::Path, sync::Arc}; +use std::sync::Arc; use theme::ActiveTheme; use title_bar_settings::TitleBarSettings; use ui::{ Avatar, Button, ButtonLike, ButtonStyle, Chip, ContextMenu, Icon, IconName, IconSize, IconWithIndicator, Indicator, PopoverMenu, PopoverMenuHandle, Tooltip, h_flex, prelude::*, }; -use util::ResultExt; +use util::{ResultExt, rel_path::RelPath}; use workspace::{Workspace, notifications::NotifyResultExt}; use zed_actions::{OpenRecent, OpenRemote}; @@ -197,9 +200,7 @@ impl Render for TitleBar { user.is_none() && TitleBarSettings::get_global(cx).show_sign_in, |el| el.child(self.render_sign_in_button(cx)), ) - .when(user.is_some(), |parent| { - parent.child(self.render_user_menu_button(cx)) - }) + .child(self.render_app_menu_button(cx)) .into_any_element(), ); @@ -247,6 +248,7 @@ impl TitleBar { cx: &mut Context, ) -> Self { let project = workspace.project().clone(); + let git_store = project.read(cx).git_store().clone(); let user_store = workspace.app_state().user_store.clone(); let client = workspace.app_state().client.clone(); let active_call = ActiveCall::global(cx); @@ -274,6 +276,17 @@ impl TitleBar { subscriptions.push(cx.subscribe(&project, |_, _, _: &project::Event, cx| cx.notify())); subscriptions.push(cx.observe(&active_call, |this, _, cx| this.active_call_changed(cx))); subscriptions.push(cx.observe_window_activation(window, Self::window_activation_changed)); + subscriptions.push( + cx.subscribe(&git_store, move |_, _, event, cx| match event { + GitStoreEvent::ActiveRepositoryChanged(_) + | GitStoreEvent::RepositoryUpdated(_, RepositoryEvent::Updated { .. }, _) + | GitStoreEvent::RepositoryAdded(_) + | GitStoreEvent::RepositoryRemoved(_) => { + cx.notify(); + } + _ => {} + }), + ); subscriptions.push(cx.observe(&user_store, |_, _, cx| cx.notify())); let banner = cx.new(|cx| { @@ -308,10 +321,11 @@ impl TitleBar { let options = self.project.read(cx).remote_connection_options(cx)?; let host: SharedString = options.display_name().into(); - let nickname = if let RemoteConnectionOptions::Ssh(options) = options { - options.nickname.map(|nick| nick.into()) - } else { - None + let (nickname, icon) = match options { + RemoteConnectionOptions::Ssh(options) => { + (options.nickname.map(|nick| nick.into()), IconName::Server) + } + RemoteConnectionOptions::Wsl(_) => (None, IconName::Linux), }; let nickname = nickname.unwrap_or_else(|| host.clone()); @@ -349,9 +363,7 @@ impl TitleBar { .max_w_32() .child( IconWithIndicator::new( - Icon::new(IconName::Server) - .size(IconSize::Small) - .color(icon_color), + Icon::new(icon).size(IconSize::Small).color(icon_color), Some(Indicator::dot().color(indicator_color)), ) .indicator_border_color(Some(cx.theme().colors().title_bar_background)) @@ -440,13 +452,13 @@ impl TitleBar { let worktree = worktree.read(cx); let settings_location = SettingsLocation { worktree_id: worktree.id(), - path: Path::new(""), + path: RelPath::empty(), }; let settings = WorktreeSettings::get(Some(settings_location), cx); match &settings.project_name { Some(name) => name.as_str(), - None => worktree.root_name(), + None => worktree.root_name_str(), } }) .next(); @@ -483,24 +495,24 @@ impl TitleBar { } pub fn render_project_branch(&self, cx: &mut Context) -> Option { + let settings = TitleBarSettings::get_global(cx); let repository = self.project.read(cx).active_repository(cx)?; let workspace = self.workspace.upgrade()?; - let branch_name = { - let repo = repository.read(cx); - repo.branch - .as_ref() - .map(|branch| branch.name()) - .map(|name| util::truncate_and_trailoff(name, MAX_BRANCH_NAME_LENGTH)) - .or_else(|| { - repo.head_commit.as_ref().map(|commit| { - commit - .sha - .chars() - .take(MAX_SHORT_SHA_LENGTH) - .collect::() - }) + let repo = repository.read(cx); + let branch_name = repo + .branch + .as_ref() + .map(|branch| branch.name()) + .map(|name| util::truncate_and_trailoff(name, MAX_BRANCH_NAME_LENGTH)) + .or_else(|| { + repo.head_commit.as_ref().map(|commit| { + commit + .sha + .chars() + .take(MAX_SHORT_SHA_LENGTH) + .collect::() }) - }?; + })?; Some( Button::new("project_branch_trigger", branch_name) @@ -522,16 +534,29 @@ impl TitleBar { window.dispatch_action(zed_actions::git::Branch.boxed_clone(), cx); }); }) - .when( - TitleBarSettings::get_global(cx).show_branch_icon, - |branch_button| { - branch_button - .icon(IconName::GitBranch) - .icon_position(IconPosition::Start) - .icon_color(Color::Muted) - .icon_size(IconSize::Indicator) - }, - ), + .when(settings.show_branch_icon, |branch_button| { + let (icon, icon_color) = { + let status = repo.status_summary(); + let tracked = status.index + status.worktree; + if status.conflict > 0 { + (IconName::Warning, Color::VersionControlConflict) + } else if tracked.modified > 0 { + (IconName::SquareDot, Color::VersionControlModified) + } else if tracked.added > 0 || status.untracked > 0 { + (IconName::SquarePlus, Color::VersionControlAdded) + } else if tracked.deleted > 0 { + (IconName::SquareMinus, Color::VersionControlDeleted) + } else { + (IconName::GitBranch, Color::Muted) + } + }; + + branch_button + .icon(icon) + .icon_position(IconPosition::Start) + .icon_color(icon_color) + .icon_size(IconSize::Indicator) + }), ) } @@ -596,9 +621,9 @@ impl TitleBar { Some(AutoUpdateStatus::Installing { .. }) | Some(AutoUpdateStatus::Downloading { .. }) | Some(AutoUpdateStatus::Checking) => "Updating...", - Some(AutoUpdateStatus::Idle) | Some(AutoUpdateStatus::Errored) | None => { - "Please update Zed to Collaborate" - } + Some(AutoUpdateStatus::Idle) + | Some(AutoUpdateStatus::Errored { .. }) + | None => "Please update Zed to Collaborate", }; Some( @@ -637,51 +662,57 @@ impl TitleBar { }) } - pub fn render_user_menu_button(&mut self, cx: &mut Context) -> impl Element { + pub fn render_app_menu_button(&mut self, cx: &mut Context) -> impl Element { let user_store = self.user_store.read(cx); - if let Some(user) = user_store.current_user() { - let has_subscription_period = user_store.subscription_period().is_some(); - let plan = user_store.plan().filter(|_| { - // Since the user might be on the legacy free plan we filter based on whether we have a subscription period. - has_subscription_period - }); + let user = user_store.current_user(); - let user_avatar = user.avatar_uri.clone(); - let free_chip_bg = cx - .theme() - .colors() - .editor_background - .opacity(0.5) - .blend(cx.theme().colors().text_accent.opacity(0.05)); - - let pro_chip_bg = cx - .theme() - .colors() - .editor_background - .opacity(0.5) - .blend(cx.theme().colors().text_accent.opacity(0.2)); - - PopoverMenu::new("user-menu") - .anchor(Corner::TopRight) - .menu(move |window, cx| { - ContextMenu::build(window, cx, |menu, _, _cx| { - let user_login = user.github_login.clone(); - - let (plan_name, label_color, bg_color) = match plan { - None | Some(Plan::V1(PlanV1::ZedFree) | Plan::V2(PlanV2::ZedFree)) => { - ("Free", Color::Default, free_chip_bg) - } - Some(Plan::V1(PlanV1::ZedProTrial) | Plan::V2(PlanV2::ZedProTrial)) => { - ("Pro Trial", Color::Accent, pro_chip_bg) - } - Some(Plan::V1(PlanV1::ZedPro) | Plan::V2(PlanV2::ZedPro)) => { - ("Pro", Color::Accent, pro_chip_bg) - } - }; + let user_avatar = user.as_ref().map(|u| u.avatar_uri.clone()); + let user_login = user.as_ref().map(|u| u.github_login.clone()); + + let is_signed_in = user.is_some(); - menu.custom_entry( + let has_subscription_period = user_store.subscription_period().is_some(); + let plan = user_store.plan().filter(|_| { + // Since the user might be on the legacy free plan we filter based on whether we have a subscription period. + has_subscription_period + }); + + let free_chip_bg = cx + .theme() + .colors() + .editor_background + .opacity(0.5) + .blend(cx.theme().colors().text_accent.opacity(0.05)); + + let pro_chip_bg = cx + .theme() + .colors() + .editor_background + .opacity(0.5) + .blend(cx.theme().colors().text_accent.opacity(0.2)); + + PopoverMenu::new("user-menu") + .anchor(Corner::TopRight) + .menu(move |window, cx| { + ContextMenu::build(window, cx, |menu, _, _cx| { + let user_login = user_login.clone(); + + let (plan_name, label_color, bg_color) = match plan { + None | Some(Plan::V1(PlanV1::ZedFree) | Plan::V2(PlanV2::ZedFree)) => { + ("Free", Color::Default, free_chip_bg) + } + Some(Plan::V1(PlanV1::ZedProTrial) | Plan::V2(PlanV2::ZedProTrial)) => { + ("Pro Trial", Color::Accent, pro_chip_bg) + } + Some(Plan::V1(PlanV1::ZedPro) | Plan::V2(PlanV2::ZedPro)) => { + ("Pro", Color::Accent, pro_chip_bg) + } + }; + + menu.when(is_signed_in, |this| { + this.custom_entry( move |_window, _cx| { - let user_login = user_login.clone(); + let user_login = user_login.clone().unwrap_or_default(); h_flex() .w_full() @@ -699,79 +730,59 @@ impl TitleBar { }, ) .separator() - .action("Settings", zed_actions::OpenSettings.boxed_clone()) - .action( - "Settings Profiles", - zed_actions::settings_profile_selector::Toggle.boxed_clone(), - ) - .action("Keymap Editor", Box::new(zed_actions::OpenKeymapEditor)) - .action( - "Themes…", - zed_actions::theme_selector::Toggle::default().boxed_clone(), - ) - .action( - "Icon Themes…", - zed_actions::icon_theme_selector::Toggle::default().boxed_clone(), - ) - .action( - "Extensions", - zed_actions::Extensions::default().boxed_clone(), - ) - .separator() - .action("Sign Out", client::SignOut.boxed_clone()) }) - .into() - }) - .trigger_with_tooltip( - ButtonLike::new("user-menu") - .child( - h_flex() - .gap_0p5() - .children( - TitleBarSettings::get_global(cx) - .show_user_picture - .then(|| Avatar::new(user_avatar)), - ) - .child( - Icon::new(IconName::ChevronDown) - .size(IconSize::Small) - .color(Color::Muted), - ), - ) - .style(ButtonStyle::Subtle), - Tooltip::text("Toggle User Menu"), - ) - .anchor(gpui::Corner::TopRight) - } else { - PopoverMenu::new("user-menu") - .anchor(Corner::TopRight) - .menu(|window, cx| { - ContextMenu::build(window, cx, |menu, _, _| { - menu.action("Settings", zed_actions::OpenSettings.boxed_clone()) - .action( - "Settings Profiles", - zed_actions::settings_profile_selector::Toggle.boxed_clone(), - ) - .action("Key Bindings", Box::new(zed_actions::OpenKeymapEditor)) - .action( - "Themes…", - zed_actions::theme_selector::Toggle::default().boxed_clone(), - ) - .action( - "Icon Themes…", - zed_actions::icon_theme_selector::Toggle::default().boxed_clone(), - ) - .action( - "Extensions", - zed_actions::Extensions::default().boxed_clone(), - ) + .action("Settings", zed_actions::OpenSettings.boxed_clone()) + .action("Keymap", Box::new(zed_actions::OpenKeymap)) + .action( + "Themes…", + zed_actions::theme_selector::Toggle::default().boxed_clone(), + ) + .action( + "Icon Themes…", + zed_actions::icon_theme_selector::Toggle::default().boxed_clone(), + ) + .action( + "Extensions", + zed_actions::Extensions::default().boxed_clone(), + ) + .when(is_signed_in, |this| { + this.separator() + .action("Sign Out", client::SignOut.boxed_clone()) }) - .into() }) - .trigger_with_tooltip( - IconButton::new("user-menu", IconName::ChevronDown), - Tooltip::text("Toggle User Menu"), - ) - } + .into() + }) + .map(|this| { + if is_signed_in { + this.trigger_with_tooltip( + ButtonLike::new("user-menu") + .child( + h_flex() + .gap_0p5() + .children( + TitleBarSettings::get_global(cx) + .show_user_picture + .then(|| user_avatar.clone()) + .flatten() + .map(|avatar| Avatar::new(avatar)), + ) + .child( + Icon::new(IconName::ChevronDown) + .size(IconSize::Small) + .color(Color::Muted), + ), + ) + .style(ButtonStyle::Subtle), + Tooltip::text("Toggle User Menu"), + ) + } else { + this.trigger_with_tooltip( + IconButton::new("user-menu", IconName::ChevronDown) + .icon_size(IconSize::Small), + Tooltip::text("Toggle User Menu"), + ) + } + }) + .anchor(gpui::Corner::TopRight) } } diff --git a/crates/title_bar/src/title_bar_settings.rs b/crates/title_bar/src/title_bar_settings.rs index 38e529098bd3e97a11ecefac684c1734302f4261..bc9b1acbaa06cf60396e61ff68470c8a544e3f5d 100644 --- a/crates/title_bar/src/title_bar_settings.rs +++ b/crates/title_bar/src/title_bar_settings.rs @@ -1,9 +1,6 @@ -use db::anyhow; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::{Settings, SettingsContent}; -#[derive(Copy, Clone, Deserialize, Debug)] +#[derive(Copy, Clone, Debug)] pub struct TitleBarSettings { pub show_branch_icon: bool, pub show_onboarding_banner: bool, @@ -14,51 +11,17 @@ pub struct TitleBarSettings { pub show_menus: bool, } -#[derive( - Copy, Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey, -)] -#[settings_ui(group = "Title Bar")] -#[settings_key(key = "title_bar")] -pub struct TitleBarSettingsContent { - /// Whether to show the branch icon beside branch switcher in the title bar. - /// - /// Default: false - pub show_branch_icon: Option, - /// Whether to show onboarding banners in the title bar. - /// - /// Default: true - pub show_onboarding_banner: Option, - /// Whether to show user avatar in the title bar. - /// - /// Default: true - pub show_user_picture: Option, - /// Whether to show the branch name button in the titlebar. - /// - /// Default: true - pub show_branch_name: Option, - /// Whether to show the project host and name in the titlebar. - /// - /// Default: true - pub show_project_items: Option, - /// Whether to show the sign in button in the title bar. - /// - /// Default: true - pub show_sign_in: Option, - /// Whether to show the menus in the title bar. - /// - /// Default: false - pub show_menus: Option, -} - impl Settings for TitleBarSettings { - type FileContent = TitleBarSettingsContent; - - fn load(sources: SettingsSources, _: &mut gpui::App) -> anyhow::Result - where - Self: Sized, - { - sources.json_merge() + fn from_settings(s: &SettingsContent) -> Self { + let content = s.title_bar.clone().unwrap(); + TitleBarSettings { + show_branch_icon: content.show_branch_icon.unwrap(), + show_onboarding_banner: content.show_onboarding_banner.unwrap(), + show_user_picture: content.show_user_picture.unwrap(), + show_branch_name: content.show_branch_name.unwrap(), + show_project_items: content.show_project_items.unwrap(), + show_sign_in: content.show_sign_in.unwrap(), + show_menus: content.show_menus.unwrap(), + } } - - fn import_from_vscode(_: &settings::VsCodeSettings, _: &mut Self::FileContent) {} } diff --git a/crates/toolchain_selector/src/active_toolchain.rs b/crates/toolchain_selector/src/active_toolchain.rs index 3e26f3ad6c3d23c4b0e00c4c9f67e37fd9c33d32..1c6cbe5235e22a15ffb5a6a7e1f6a3f3e15deb43 100644 --- a/crates/toolchain_selector/src/active_toolchain.rs +++ b/crates/toolchain_selector/src/active_toolchain.rs @@ -1,4 +1,4 @@ -use std::{path::Path, sync::Arc}; +use std::sync::Arc; use editor::Editor; use gpui::{ @@ -8,7 +8,7 @@ use gpui::{ use language::{Buffer, BufferEvent, LanguageName, Toolchain, ToolchainScope}; use project::{Project, ProjectPath, Toolchains, WorktreeId, toolchain_store::ToolchainStoreEvent}; use ui::{Button, ButtonCommon, Clickable, FluentBuilder, LabelSize, SharedString, Tooltip}; -use util::maybe; +use util::{maybe, rel_path::RelPath}; use workspace::{StatusItemView, Workspace, item::ItemHandle}; use crate::ToolchainSelector; @@ -83,10 +83,7 @@ impl ActiveToolchain { let (worktree_id, path) = active_file .update(cx, |this, cx| { this.file().and_then(|file| { - Some(( - file.worktree_id(cx), - Arc::::from(file.path().parent()?), - )) + Some((file.worktree_id(cx), file.path().parent()?.into())) }) }) .ok() @@ -142,7 +139,7 @@ impl ActiveToolchain { fn active_toolchain( workspace: WeakEntity, worktree_id: WorktreeId, - relative_path: Arc, + relative_path: Arc, language_name: LanguageName, cx: &mut AsyncWindowContext, ) -> Task> { @@ -205,7 +202,7 @@ impl ActiveToolchain { .set_toolchain( workspace_id, worktree_id, - relative_path.to_string_lossy().into_owned(), + relative_path.clone(), toolchain.clone(), ) .await diff --git a/crates/toolchain_selector/src/toolchain_selector.rs b/crates/toolchain_selector/src/toolchain_selector.rs index 3804238634a1dc35212698b323baf04929f1675f..3ebf7670d34851949a55a85ba04cabb4f115bfbd 100644 --- a/crates/toolchain_selector/src/toolchain_selector.rs +++ b/crates/toolchain_selector/src/toolchain_selector.rs @@ -24,7 +24,7 @@ use ui::{ Divider, HighlightedLabel, KeyBinding, List, ListItem, ListItemSpacing, Navigable, NavigableEntry, prelude::*, }; -use util::{ResultExt, maybe, paths::PathStyle}; +use util::{ResultExt, maybe, paths::PathStyle, rel_path::RelPath}; use workspace::{ModalView, Workspace}; actions!( @@ -48,7 +48,7 @@ pub struct ToolchainSelector { project: Entity, language_name: LanguageName, worktree_id: WorktreeId, - relative_path: Arc, + relative_path: Arc, } #[derive(Clone)] @@ -132,7 +132,7 @@ impl AddToolchainState { tx, DirectoryLister::Project(project), false, - PathStyle::current(), + PathStyle::local(), ) .show_hidden() .with_footer(Arc::new(move |_, cx| { @@ -241,9 +241,7 @@ impl AddToolchainState { // Suggest a default scope based on the applicability. let scope = if let Some(project_path) = resolved_toolchain_path { - if root_path.path.as_ref() != Path::new("") - && project_path.starts_with(&root_path) - { + if !root_path.path.as_ref().is_empty() && project_path.starts_with(&root_path) { ToolchainScope::Subproject(root_path.worktree_id, root_path.path) } else { ToolchainScope::Project @@ -584,7 +582,7 @@ impl ToolchainSelector { let language_name = buffer.read(cx).language()?.name(); let worktree_id = buffer.read(cx).file()?.worktree_id(cx); - let relative_path: Arc = Arc::from(buffer.read(cx).file()?.path().parent()?); + let relative_path: Arc = buffer.read(cx).file()?.path().parent()?.into(); let worktree_root_path = project .read(cx) .worktree_for_id(worktree_id, cx)? @@ -593,9 +591,13 @@ impl ToolchainSelector { let workspace_id = workspace.database_id()?; let weak = workspace.weak_handle(); cx.spawn_in(window, async move |workspace, cx| { - let as_str = relative_path.to_string_lossy().into_owned(); let active_toolchain = workspace::WORKSPACE_DB - .toolchain(workspace_id, worktree_id, as_str, language_name.clone()) + .toolchain( + workspace_id, + worktree_id, + relative_path.clone(), + language_name.clone(), + ) .await .ok() .flatten(); @@ -628,7 +630,7 @@ impl ToolchainSelector { active_toolchain: Option, worktree_id: WorktreeId, worktree_root: Arc, - relative_path: Arc, + relative_path: Arc, language_name: LanguageName, window: &mut Window, cx: &mut Context, @@ -741,7 +743,7 @@ pub struct ToolchainSelectorDelegate { workspace: WeakEntity, worktree_id: WorktreeId, worktree_abs_path_root: Arc, - relative_path: Arc, + relative_path: Arc, placeholder_text: Arc, add_toolchain_text: Arc, project: Entity, @@ -757,12 +759,13 @@ impl ToolchainSelectorDelegate { worktree_id: WorktreeId, worktree_abs_path_root: Arc, project: Entity, - relative_path: Arc, + relative_path: Arc, language_name: LanguageName, window: &mut Window, cx: &mut Context>, ) -> Self { let _project = project.clone(); + let path_style = project.read(cx).path_style(cx); let _fetch_candidates_task = cx.spawn_in(window, { async move |this, cx| { @@ -802,11 +805,10 @@ impl ToolchainSelectorDelegate { .ok()? .await?; let pretty_path = { - let path = relative_path.to_string_lossy(); - if path.is_empty() { + if relative_path.is_empty() { Cow::Borrowed("worktree root") } else { - Cow::Owned(format!("`{}`", path)) + Cow::Owned(format!("`{}`", relative_path.display(path_style))) } }; let placeholder_text = @@ -898,7 +900,7 @@ impl PickerDelegate for ToolchainSelectorDelegate { let workspace = self.workspace.clone(); let worktree_id = self.worktree_id; let path = self.relative_path.clone(); - let relative_path = self.relative_path.to_string_lossy().into_owned(); + let relative_path = self.relative_path.clone(); cx.spawn_in(window, async move |_, cx| { workspace::WORKSPACE_DB .set_toolchain(workspace_id, worktree_id, relative_path, toolchain.clone()) @@ -1045,8 +1047,8 @@ impl PickerDelegate for ToolchainSelectorDelegate { let toolchain = toolchain.clone(); let scope = scope.clone(); - this.end_slot(IconButton::new(id, IconName::Trash)) - .on_click(cx.listener(move |this, _, _, cx| { + this.end_slot(IconButton::new(id, IconName::Trash).on_click(cx.listener( + move |this, _, _, cx| { this.delegate.project.update(cx, |this, cx| { this.remove_toolchain(toolchain.clone(), scope.clone(), cx) }); @@ -1074,7 +1076,8 @@ impl PickerDelegate for ToolchainSelectorDelegate { } cx.stop_propagation(); cx.notify(); - })) + }, + ))) }), ) } diff --git a/crates/ui/src/components.rs b/crates/ui/src/components.rs index 486673e73354b488753cead1f187a5f7ce7687cc..fae444c0ef81d0f7b631769112f4286f8e75ea23 100644 --- a/crates/ui/src/components.rs +++ b/crates/ui/src/components.rs @@ -6,6 +6,7 @@ mod callout; mod chip; mod content_group; mod context_menu; +mod data_table; mod disclosure; mod divider; mod dropdown_menu; @@ -22,7 +23,6 @@ mod list; mod modal; mod navigable; mod notification; -mod numeric_stepper; mod popover; mod popover_menu; mod progress; @@ -37,6 +37,7 @@ mod tab; mod tab_bar; mod toggle; mod tooltip; +mod tree_view_item; #[cfg(feature = "stories")] mod stories; @@ -49,6 +50,7 @@ pub use callout::*; pub use chip::*; pub use content_group::*; pub use context_menu::*; +pub use data_table::*; pub use disclosure::*; pub use divider::*; pub use dropdown_menu::*; @@ -65,7 +67,6 @@ pub use list::*; pub use modal::*; pub use navigable::*; pub use notification::*; -pub use numeric_stepper::*; pub use popover::*; pub use popover_menu::*; pub use progress::*; @@ -80,6 +81,7 @@ pub use tab::*; pub use tab_bar::*; pub use toggle::*; pub use tooltip::*; +pub use tree_view_item::*; #[cfg(feature = "stories")] pub use stories::*; diff --git a/crates/ui/src/components/badge.rs b/crates/ui/src/components/badge.rs index f36e03291c5915f70e8370c6cc1e037d097622b0..9db6fd616f56769b03d1856cfda3fdeef66e446f 100644 --- a/crates/ui/src/components/badge.rs +++ b/crates/ui/src/components/badge.rs @@ -58,7 +58,7 @@ impl RenderOnce for Badge { .child(Divider::vertical().color(DividerColor::Border)) .child(Label::new(self.label.clone()).size(LabelSize::Small).ml_1()) .when_some(tooltip, |this, tooltip| { - this.tooltip(move |window, cx| tooltip(window, cx)) + this.hoverable_tooltip(move |window, cx| tooltip(window, cx)) }) } } diff --git a/crates/ui/src/components/button/button.rs b/crates/ui/src/components/button/button.rs index e0104bf54f59694eb96aa2ba43be658ebc182d2a..b09b58b3e993eacca1b5ab6cf219bbf60d081b69 100644 --- a/crates/ui/src/components/button/button.rs +++ b/crates/ui/src/components/button/button.rs @@ -402,6 +402,11 @@ impl ButtonCommon for Button { self.base = self.base.layer(elevation); self } + + fn track_focus(mut self, focus_handle: &gpui::FocusHandle) -> Self { + self.base = self.base.track_focus(focus_handle); + self + } } impl RenderOnce for Button { @@ -469,7 +474,6 @@ impl RenderOnce for Button { } } -// View this component preview using `workspace: open component-preview` impl Component for Button { fn scope() -> ComponentScope { ComponentScope::Input diff --git a/crates/ui/src/components/button/button_like.rs b/crates/ui/src/components/button/button_like.rs index 477fc57b22f9178edc2123a76fcaf68701f8fb4d..0c8893e2cccb64243f373126429a823b919bca42 100644 --- a/crates/ui/src/components/button/button_like.rs +++ b/crates/ui/src/components/button/button_like.rs @@ -1,6 +1,6 @@ use documented::Documented; use gpui::{ - AnyElement, AnyView, ClickEvent, CursorStyle, DefiniteLength, Hsla, MouseButton, + AnyElement, AnyView, ClickEvent, CursorStyle, DefiniteLength, FocusHandle, Hsla, MouseButton, MouseClickEvent, MouseDownEvent, MouseUpEvent, Rems, StyleRefinement, relative, transparent_black, }; @@ -41,6 +41,8 @@ pub trait ButtonCommon: Clickable + Disableable { fn tab_index(self, tab_index: impl Into) -> Self; fn layer(self, elevation: ElevationIndex) -> Self; + + fn track_focus(self, focus_handle: &FocusHandle) -> Self; } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)] @@ -133,6 +135,9 @@ pub enum ButtonStyle { /// a fully transparent button. Outlined, + /// A more de-emphasized version of the outlined button. + OutlinedGhost, + /// The default button style, used for most buttons. Has a transparent background, /// but has a background color to indicate states like hover and active. #[default] @@ -144,11 +149,38 @@ pub enum ButtonStyle { Transparent, } +/// Rounding for a button that may have straight edges. #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] -pub(crate) enum ButtonLikeRounding { - All, - Left, - Right, +pub(crate) struct ButtonLikeRounding { + /// Top-left corner rounding + pub top_left: bool, + /// Top-right corner rounding + pub top_right: bool, + /// Bottom-right corner rounding + pub bottom_right: bool, + /// Bottom-left corner rounding + pub bottom_left: bool, +} + +impl ButtonLikeRounding { + pub const ALL: Self = Self { + top_left: true, + top_right: true, + bottom_right: true, + bottom_left: true, + }; + pub const LEFT: Self = Self { + top_left: true, + top_right: false, + bottom_right: false, + bottom_left: true, + }; + pub const RIGHT: Self = Self { + top_left: false, + top_right: true, + bottom_right: true, + bottom_left: false, + }; } #[derive(Debug, Clone)] @@ -193,6 +225,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::OutlinedGhost => ButtonLikeStyles { + background: transparent_black(), + border_color: cx.theme().colors().border_variant, + label_color: Color::Default.color(cx), + icon_color: Color::Default.color(cx), + }, ButtonStyle::Subtle => ButtonLikeStyles { background: cx.theme().colors().ghost_element_background, border_color: transparent_black(), @@ -217,7 +255,7 @@ impl ButtonStyle { match self { ButtonStyle::Filled => { let mut filled_background = element_bg_from_elevation(elevation, cx); - filled_background.fade_out(0.92); + filled_background.fade_out(0.5); ButtonLikeStyles { background: filled_background, @@ -238,6 +276,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::OutlinedGhost => ButtonLikeStyles { + background: cx.theme().colors().ghost_element_hover, + border_color: cx.theme().colors().border, + label_color: Color::Default.color(cx), + icon_color: Color::Default.color(cx), + }, ButtonStyle::Subtle => ButtonLikeStyles { background: cx.theme().colors().ghost_element_hover, border_color: transparent_black(), @@ -276,6 +320,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::OutlinedGhost => ButtonLikeStyles { + background: transparent_black(), + border_color: cx.theme().colors().border_variant, + label_color: Color::Default.color(cx), + icon_color: Color::Default.color(cx), + }, ButtonStyle::Transparent => ButtonLikeStyles { background: transparent_black(), border_color: transparent_black(), @@ -309,6 +359,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::OutlinedGhost => ButtonLikeStyles { + background: transparent_black(), + border_color: cx.theme().colors().border, + label_color: Color::Default.color(cx), + icon_color: Color::Default.color(cx), + }, ButtonStyle::Transparent => ButtonLikeStyles { background: transparent_black(), border_color: cx.theme().colors().border_focused, @@ -345,6 +401,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::OutlinedGhost => ButtonLikeStyles { + background: transparent_black(), + border_color: cx.theme().colors().border_disabled, + label_color: Color::Default.color(cx), + icon_color: Color::Default.color(cx), + }, ButtonStyle::Transparent => ButtonLikeStyles { background: transparent_black(), border_color: transparent_black(), @@ -405,6 +467,7 @@ pub struct ButtonLike { on_click: Option>, on_right_click: Option>, children: SmallVec<[AnyElement; 2]>, + focus_handle: Option, } impl ButtonLike { @@ -419,7 +482,7 @@ impl ButtonLike { width: None, height: None, size: ButtonSize::Default, - rounding: Some(ButtonLikeRounding::All), + rounding: Some(ButtonLikeRounding::ALL), tooltip: None, hoverable_tooltip: None, children: SmallVec::new(), @@ -428,19 +491,20 @@ impl ButtonLike { on_right_click: None, layer: None, tab_index: None, + focus_handle: None, } } pub fn new_rounded_left(id: impl Into) -> Self { - Self::new(id).rounding(ButtonLikeRounding::Left) + Self::new(id).rounding(ButtonLikeRounding::LEFT) } pub fn new_rounded_right(id: impl Into) -> Self { - Self::new(id).rounding(ButtonLikeRounding::Right) + Self::new(id).rounding(ButtonLikeRounding::RIGHT) } pub fn new_rounded_all(id: impl Into) -> Self { - Self::new(id).rounding(ButtonLikeRounding::All) + Self::new(id).rounding(ButtonLikeRounding::ALL) } pub fn opacity(mut self, opacity: f32) -> Self { @@ -549,6 +613,11 @@ impl ButtonCommon for ButtonLike { self.layer = Some(elevation); self } + + fn track_focus(mut self, focus_handle: &gpui::FocusHandle) -> Self { + self.focus_handle = Some(focus_handle.clone()); + self + } } impl VisibleOnHover for ButtonLike { @@ -575,6 +644,9 @@ impl RenderOnce for ButtonLike { .h_flex() .id(self.id.clone()) .when_some(self.tab_index, |this, tab_index| this.tab_index(tab_index)) + .when_some(self.focus_handle, |this, focus_handle| { + this.track_focus(&focus_handle) + }) .font_ui(cx) .group("") .flex_none() @@ -582,21 +654,26 @@ impl RenderOnce for ButtonLike { .when_some(self.width, |this, width| { this.w(width).justify_center().text_center() }) - .when(matches!(self.style, ButtonStyle::Outlined), |this| { - this.border_1() - }) - .when_some(self.rounding, |this, rounding| match rounding { - ButtonLikeRounding::All => this.rounded_sm(), - ButtonLikeRounding::Left => this.rounded_l_sm(), - ButtonLikeRounding::Right => this.rounded_r_sm(), + .when( + matches!( + self.style, + ButtonStyle::Outlined | ButtonStyle::OutlinedGhost + ), + |this| this.border_1(), + ) + .when_some(self.rounding, |this, rounding| { + this.when(rounding.top_left, |this| this.rounded_tl_sm()) + .when(rounding.top_right, |this| this.rounded_tr_sm()) + .when(rounding.bottom_right, |this| this.rounded_br_sm()) + .when(rounding.bottom_left, |this| this.rounded_bl_sm()) }) .gap(DynamicSpacing::Base04.rems(cx)) .map(|this| match self.size { - ButtonSize::Large | ButtonSize::Medium => this.px(DynamicSpacing::Base06.rems(cx)), + ButtonSize::Large | ButtonSize::Medium => this.px(DynamicSpacing::Base08.rems(cx)), ButtonSize::Default | ButtonSize::Compact => { this.px(DynamicSpacing::Base04.rems(cx)) } - ButtonSize::None => this, + ButtonSize::None => this.px_px(), }) .border_color(style.enabled(self.layer, cx).border_color) .bg(style.enabled(self.layer, cx).background) @@ -613,7 +690,13 @@ impl RenderOnce for ButtonLike { |refinement: StyleRefinement| refinement.bg(hovered_style.background); this.cursor(self.cursor_style) .hover(focus_color) - .focus(focus_color) + .map(|this| { + if matches!(self.style, ButtonStyle::Outlined) { + this.focus(|s| s.border_color(cx.theme().colors().border_focused)) + } else { + this.focus(focus_color) + } + }) .active(|active| active.bg(style.active(cx).background)) }) .when_some( diff --git a/crates/ui/src/components/button/icon_button.rs b/crates/ui/src/components/button/icon_button.rs index 689dbceb63b17fc3850f025eaaf01eb12e3f3720..3a4f029b6a776daaabda1813ff1490f6f456caa4 100644 --- a/crates/ui/src/components/button/icon_button.rs +++ b/crates/ui/src/components/button/icon_button.rs @@ -173,6 +173,11 @@ impl ButtonCommon for IconButton { self.base = self.base.layer(elevation); self } + + fn track_focus(mut self, focus_handle: &gpui::FocusHandle) -> Self { + self.base = self.base.track_focus(focus_handle); + self + } } impl VisibleOnHover for IconButton { diff --git a/crates/ui/src/components/button/toggle_button.rs b/crates/ui/src/components/button/toggle_button.rs index a50918b1094eaf75661c91d070d2d8cd8b364eb9..2a3db701d15d12361ebe623d8d56fa35ae0016a7 100644 --- a/crates/ui/src/components/button/toggle_button.rs +++ b/crates/ui/src/components/button/toggle_button.rs @@ -6,15 +6,41 @@ use crate::{ButtonLike, ButtonLikeRounding, ElevationIndex, TintColor, Tooltip, /// The position of a [`ToggleButton`] within a group of buttons. #[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub enum ToggleButtonPosition { - /// The toggle button is first in the group. - First, - - /// The toggle button is in the middle of the group (i.e., it is not the first or last toggle button). - Middle, +pub struct ToggleButtonPosition { + /// The toggle button is one of the leftmost of the group. + leftmost: bool, + /// The toggle button is one of the rightmost of the group. + rightmost: bool, + /// The toggle button is one of the topmost of the group. + topmost: bool, + /// The toggle button is one of the bottommost of the group. + bottommost: bool, +} - /// The toggle button is last in the group. - Last, +impl ToggleButtonPosition { + pub const HORIZONTAL_FIRST: Self = Self { + leftmost: true, + ..Self::HORIZONTAL_MIDDLE + }; + pub const HORIZONTAL_MIDDLE: Self = Self { + leftmost: false, + rightmost: false, + topmost: true, + bottommost: true, + }; + pub const HORIZONTAL_LAST: Self = Self { + rightmost: true, + ..Self::HORIZONTAL_MIDDLE + }; + + pub(crate) fn to_rounding(self) -> ButtonLikeRounding { + ButtonLikeRounding { + top_left: self.topmost && self.leftmost, + top_right: self.topmost && self.rightmost, + bottom_right: self.bottommost && self.rightmost, + bottom_left: self.bottommost && self.leftmost, + } + } } #[derive(IntoElement, RegisterComponent)] @@ -46,15 +72,15 @@ impl ToggleButton { } pub fn first(self) -> Self { - self.position_in_group(ToggleButtonPosition::First) + self.position_in_group(ToggleButtonPosition::HORIZONTAL_FIRST) } pub fn middle(self) -> Self { - self.position_in_group(ToggleButtonPosition::Middle) + self.position_in_group(ToggleButtonPosition::HORIZONTAL_MIDDLE) } pub fn last(self) -> Self { - self.position_in_group(ToggleButtonPosition::Last) + self.position_in_group(ToggleButtonPosition::HORIZONTAL_LAST) } } @@ -132,6 +158,11 @@ impl ButtonCommon for ToggleButton { self.base = self.base.layer(elevation); self } + + fn track_focus(mut self, focus_handle: &gpui::FocusHandle) -> Self { + self.base = self.base.track_focus(focus_handle); + self + } } impl RenderOnce for ToggleButton { @@ -148,10 +179,8 @@ impl RenderOnce for ToggleButton { }; self.base - .when_some(self.position_in_group, |this, position| match position { - ToggleButtonPosition::First => this.rounding(ButtonLikeRounding::Left), - ToggleButtonPosition::Middle => this.rounding(None), - ToggleButtonPosition::Last => this.rounding(ButtonLikeRounding::Right), + .when_some(self.position_in_group, |this, position| { + this.rounding(position.to_rounding()) }) .child( Label::new(self.label) @@ -530,7 +559,15 @@ impl RenderOnce ButtonLike::new((group_name.clone(), entry_index)) .full_width() - .rounding(None) + .rounding(Some( + ToggleButtonPosition { + leftmost: col_index == 0, + rightmost: col_index == COLS - 1, + topmost: row_index == 0, + bottommost: row_index == ROWS - 1, + } + .to_rounding(), + )) .when_some(self.tab_index, |this, tab_index| { this.tab_index(tab_index + entry_index as isize) }) diff --git a/crates/ui/src/components/context_menu.rs b/crates/ui/src/components/context_menu.rs index 534c70de7e8717bf2c45e27eb410b320c5b63577..ac0615d1c90af922754d1144147560a76aef7e9b 100644 --- a/crates/ui/src/components/context_menu.rs +++ b/crates/ui/src/components/context_menu.rs @@ -180,9 +180,9 @@ pub enum DocumentationEdge { #[derive(Clone)] pub struct DocumentationAside { - side: DocumentationSide, - edge: DocumentationEdge, - render: Rc AnyElement>, + pub side: DocumentationSide, + pub edge: DocumentationEdge, + pub render: Rc AnyElement>, } impl DocumentationAside { diff --git a/crates/keymap_editor/src/ui_components/table.rs b/crates/ui/src/components/data_table.rs similarity index 94% rename from crates/keymap_editor/src/ui_components/table.rs rename to crates/ui/src/components/data_table.rs index cb0332c868032724d555f3fc5c57e33eaeda624b..4a1f4939cca2eb85bb7a549d06af1e9ea8cf04d0 100644 --- a/crates/keymap_editor/src/ui_components/table.rs +++ b/crates/ui/src/components/data_table.rs @@ -1,14 +1,12 @@ use std::{ops::Range, rc::Rc}; -use editor::EditorSettings; use gpui::{ AbsoluteLength, AppContext, Context, DefiniteLength, DragMoveEvent, Entity, EntityId, FocusHandle, Length, ListHorizontalSizingBehavior, ListSizingBehavior, Point, Stateful, UniformListScrollHandle, WeakEntity, transparent_black, uniform_list, }; -use itertools::intersperse_with; -use ui::{ +use crate::{ ActiveTheme as _, AnyElement, App, Button, ButtonCommon as _, ButtonStyle, Color, Component, ComponentScope, Div, ElementId, FixedWidth as _, FluentBuilder as _, Indicator, InteractiveElement, IntoElement, ParentElement, Pixels, RegisterComponent, RenderOnce, @@ -16,6 +14,7 @@ use ui::{ StyledTypography, Window, WithScrollbar, div, example_group_with_title, h_flex, px, single_example, v_flex, }; +use itertools::intersperse_with; const RESIZE_COLUMN_WIDTH: f32 = 8.0; @@ -56,14 +55,21 @@ impl TableContents { pub struct TableInteractionState { pub focus_handle: FocusHandle, pub scroll_handle: UniformListScrollHandle, + pub custom_scrollbar: Option, } impl TableInteractionState { - pub fn new(cx: &mut App) -> Entity { - cx.new(|cx| Self { + pub fn new(cx: &mut App) -> Self { + Self { focus_handle: cx.focus_handle(), scroll_handle: UniformListScrollHandle::new(), - }) + custom_scrollbar: None, + } + } + + pub fn with_custom_scrollbar(mut self, custom_scrollbar: Scrollbars) -> Self { + self.custom_scrollbar = Some(custom_scrollbar); + self } pub fn scroll_offset(&self) -> Point { @@ -87,9 +93,9 @@ impl TableInteractionState { fn render_resize_handles( &self, column_widths: &[Length; COLS], - resizable_columns: &[ResizeBehavior; COLS], + resizable_columns: &[TableResizeBehavior; COLS], initial_sizes: [DefiniteLength; COLS], - columns: Option>>, + columns: Option>>, window: &mut Window, cx: &mut App, ) -> AnyElement { @@ -121,7 +127,7 @@ impl TableInteractionState { if resizable_columns .next() - .is_some_and(ResizeBehavior::is_resizable) + .is_some_and(TableResizeBehavior::is_resizable) { let hovered = window.use_state(cx, |_window, _cx| false); @@ -169,34 +175,34 @@ impl TableInteractionState { } #[derive(Debug, Copy, Clone, PartialEq)] -pub enum ResizeBehavior { +pub enum TableResizeBehavior { None, Resizable, MinSize(f32), } -impl ResizeBehavior { +impl TableResizeBehavior { pub fn is_resizable(&self) -> bool { - *self != ResizeBehavior::None + *self != TableResizeBehavior::None } pub fn min_size(&self) -> Option { match self { - ResizeBehavior::None => None, - ResizeBehavior::Resizable => Some(0.05), - ResizeBehavior::MinSize(min_size) => Some(*min_size), + TableResizeBehavior::None => None, + TableResizeBehavior::Resizable => Some(0.05), + TableResizeBehavior::MinSize(min_size) => Some(*min_size), } } } -pub struct ColumnWidths { +pub struct TableColumnWidths { widths: [DefiniteLength; COLS], visible_widths: [DefiniteLength; COLS], cached_bounds_width: Pixels, initialized: bool, } -impl ColumnWidths { +impl TableColumnWidths { pub fn new(_: &mut App) -> Self { Self { widths: [DefiniteLength::default(); COLS], @@ -220,7 +226,7 @@ impl ColumnWidths { &mut self, double_click_position: usize, initial_sizes: &[DefiniteLength; COLS], - resize_behavior: &[ResizeBehavior; COLS], + resize_behavior: &[TableResizeBehavior; COLS], window: &mut Window, ) { let bounds_width = self.cached_bounds_width; @@ -245,7 +251,7 @@ impl ColumnWidths { col_idx: usize, mut widths: [f32; COLS], initial_sizes: [f32; COLS], - resize_behavior: &[ResizeBehavior; COLS], + resize_behavior: &[TableResizeBehavior; COLS], ) -> [f32; COLS] { // RESET: // Part 1: @@ -331,7 +337,7 @@ impl ColumnWidths { fn on_drag_move( &mut self, drag_event: &DragMoveEvent, - resize_behavior: &[ResizeBehavior; COLS], + resize_behavior: &[TableResizeBehavior; COLS], window: &mut Window, cx: &mut Context, ) { @@ -376,7 +382,7 @@ impl ColumnWidths { diff: f32, col_idx: usize, widths: &mut [f32; COLS], - resize_behavior: &[ResizeBehavior; COLS], + resize_behavior: &[TableResizeBehavior; COLS], ) { // if diff > 0.0 then go right if diff > 0.0 { @@ -390,7 +396,7 @@ impl ColumnWidths { diff: f32, col_idx: usize, widths: &mut [f32; COLS], - resize_behavior: &[ResizeBehavior; COLS], + resize_behavior: &[TableResizeBehavior; COLS], direction: i8, ) -> f32 { let mut diff_remaining = diff; @@ -446,8 +452,8 @@ impl ColumnWidths { pub struct TableWidths { initial: [DefiniteLength; COLS], - current: Option>>, - resizable: [ResizeBehavior; COLS], + current: Option>>, + resizable: [TableResizeBehavior; COLS], } impl TableWidths { @@ -457,7 +463,7 @@ impl TableWidths { TableWidths { initial: widths, current: None, - resizable: [ResizeBehavior::None; COLS], + resizable: [TableResizeBehavior::None; COLS], } } @@ -563,8 +569,8 @@ impl Table { pub fn resizable_columns( mut self, - resizable: [ResizeBehavior; COLS], - column_widths: &Entity>, + resizable: [TableResizeBehavior; COLS], + column_widths: &Entity>, cx: &mut App, ) -> Self { if let Some(table_widths) = self.col_widths.as_mut() { @@ -616,7 +622,7 @@ fn base_cell_style_text(width: Option, cx: &App) -> Div { base_cell_style(width).text_ui(cx) } -pub fn render_row( +pub fn render_table_row( row_index: usize, items: [impl IntoElement; COLS], table_context: TableRenderContext, @@ -663,12 +669,12 @@ pub fn render_row( div().size_full().child(row).into_any_element() } -pub fn render_header( +pub fn render_table_header( headers: [impl IntoElement; COLS], table_context: TableRenderContext, columns_widths: Option<( - WeakEntity>, - [ResizeBehavior; COLS], + WeakEntity>, + [TableResizeBehavior; COLS], [DefiniteLength; COLS], )>, entity_id: Option, @@ -771,7 +777,7 @@ impl RenderOnce for Table { .h_full() .v_flex() .when_some(self.headers.take(), |this, headers| { - this.child(render_header( + this.child(render_table_header( headers, table_context.clone(), current_widths_with_initial_sizes, @@ -822,7 +828,13 @@ impl RenderOnce for Table { .map(|parent| match self.rows { TableContents::Vec(items) => { parent.children(items.into_iter().enumerate().map(|(index, row)| { - render_row(index, row, table_context.clone(), window, cx) + div().child(render_table_row( + index, + row, + table_context.clone(), + window, + cx, + )) })) } TableContents::UniformList(uniform_list_data) => parent.child( @@ -837,7 +849,7 @@ impl RenderOnce for Table { .into_iter() .zip(range) .map(|(row, row_index)| { - render_row( + render_table_row( row_index, row, table_context.clone(), @@ -888,10 +900,14 @@ impl RenderOnce for Table { ); if let Some(state) = interaction_state.as_ref() { + let scrollbars = state + .read(cx) + .custom_scrollbar + .clone() + .unwrap_or_else(|| Scrollbars::new(super::ScrollAxes::Both)); content .custom_scrollbars( - Scrollbars::for_settings::() - .tracked_scroll_handle(state.read(cx).scroll_handle.clone()), + scrollbars.tracked_scroll_handle(state.read(cx).scroll_handle.clone()), window, cx, ) @@ -1055,14 +1071,15 @@ mod test { fn parse_resize_behavior( input: &str, total_size: f32, - ) -> [ResizeBehavior; COLS] { - let mut resize_behavior = [ResizeBehavior::None; COLS]; + ) -> [TableResizeBehavior; COLS] { + let mut resize_behavior = [TableResizeBehavior::None; COLS]; let mut max_index = 0; for (index, col) in input.split('|').enumerate() { if col.starts_with('X') || col.is_empty() { - resize_behavior[index] = ResizeBehavior::None; + resize_behavior[index] = TableResizeBehavior::None; } else if col.starts_with('*') { - resize_behavior[index] = ResizeBehavior::MinSize(col.len() as f32 / total_size); + resize_behavior[index] = + TableResizeBehavior::MinSize(col.len() as f32 / total_size); } else { panic!("invalid test input: unrecognized resize behavior: {}", col); } @@ -1123,7 +1140,7 @@ mod test { "invalid test input: total width not the same" ); let resize_behavior = parse_resize_behavior::(resize_behavior, total_1); - let result = ColumnWidths::reset_to_initial_size( + let result = TableColumnWidths::reset_to_initial_size( column_index, widths, initial_sizes, @@ -1301,7 +1318,7 @@ mod test { let distance = distance as f32 / total_1; - let result = ColumnWidths::drag_column_handle( + let result = TableColumnWidths::drag_column_handle( distance, column_index, &mut widths, diff --git a/crates/ui/src/components/disclosure.rs b/crates/ui/src/components/disclosure.rs index 6cfa502608bcc5ac75bf09e427f128089c188bc5..e11c38e2ca0537eb9cd7cbeb6970a3b28f0b66cc 100644 --- a/crates/ui/src/components/disclosure.rs +++ b/crates/ui/src/components/disclosure.rs @@ -10,7 +10,7 @@ pub struct Disclosure { is_open: bool, selected: bool, disabled: bool, - on_toggle: Option>, + on_toggle_expanded: Option>, cursor_style: CursorStyle, opened_icon: IconName, closed_icon: IconName, @@ -24,7 +24,7 @@ impl Disclosure { is_open, selected: false, disabled: false, - on_toggle: None, + on_toggle_expanded: None, cursor_style: CursorStyle::PointingHand, opened_icon: IconName::ChevronDown, closed_icon: IconName::ChevronRight, @@ -32,11 +32,11 @@ impl Disclosure { } } - pub fn on_toggle( + pub fn on_toggle_expanded( mut self, handler: impl Into>>, ) -> Self { - self.on_toggle = handler.into(); + self.on_toggle_expanded = handler.into(); self } @@ -65,7 +65,7 @@ impl Toggleable for Disclosure { impl Clickable for Disclosure { fn on_click(mut self, handler: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static) -> Self { - self.on_toggle = Some(Arc::new(handler)); + self.on_toggle_expanded = Some(Arc::new(handler)); self } @@ -97,7 +97,7 @@ impl RenderOnce for Disclosure { .when_some(self.visible_on_hover.clone(), |this, group_name| { this.visible_on_hover(group_name) }) - .when_some(self.on_toggle, move |this, on_toggle| { + .when_some(self.on_toggle_expanded, move |this, on_toggle| { this.on_click(move |event, window, cx| on_toggle(event, window, cx)) }) } diff --git a/crates/ui/src/components/divider.rs b/crates/ui/src/components/divider.rs index e2bb2341192cd44708f851fc0e64055ba8a25523..98eb45fd1dc1845284d63952eac684790d73bec4 100644 --- a/crates/ui/src/components/divider.rs +++ b/crates/ui/src/components/divider.rs @@ -36,6 +36,7 @@ enum DividerDirection { #[derive(Default)] pub enum DividerColor { Border, + BorderFaded, #[default] BorderVariant, } @@ -44,6 +45,7 @@ impl DividerColor { pub fn hsla(self, cx: &mut App) -> Hsla { match self { DividerColor::Border => cx.theme().colors().border, + DividerColor::BorderFaded => cx.theme().colors().border.opacity(0.6), DividerColor::BorderVariant => cx.theme().colors().border_variant, } } diff --git a/crates/ui/src/components/dropdown_menu.rs b/crates/ui/src/components/dropdown_menu.rs index f276d483a6fb391ac0a56f6c4322fc7c8dad221f..8a1abc312748bdd1fdb087973708d58579ffbc1d 100644 --- a/crates/ui/src/components/dropdown_menu.rs +++ b/crates/ui/src/components/dropdown_menu.rs @@ -1,4 +1,4 @@ -use gpui::{ClickEvent, Corner, CursorStyle, Entity, Hsla, MouseButton}; +use gpui::{Corner, Entity, Pixels, Point}; use crate::{ContextMenu, PopoverMenu, prelude::*}; @@ -21,11 +21,15 @@ enum LabelKind { pub struct DropdownMenu { id: ElementId, label: LabelKind, + trigger_size: ButtonSize, style: DropdownStyle, menu: Entity, full_width: bool, disabled: bool, handle: Option>, + attach: Option, + offset: Option>, + tab_index: Option, } impl DropdownMenu { @@ -37,11 +41,15 @@ impl DropdownMenu { Self { id: id.into(), label: LabelKind::Text(label.into()), + trigger_size: ButtonSize::Default, style: DropdownStyle::default(), menu, full_width: false, disabled: false, handle: None, + attach: None, + offset: None, + tab_index: None, } } @@ -53,14 +61,23 @@ impl DropdownMenu { Self { id: id.into(), label: LabelKind::Element(label), + trigger_size: ButtonSize::Default, style: DropdownStyle::default(), menu, full_width: false, disabled: false, handle: None, + attach: None, + offset: None, + tab_index: None, } } + pub fn trigger_size(mut self, size: ButtonSize) -> Self { + self.trigger_size = size; + self + } + pub fn style(mut self, style: DropdownStyle) -> Self { self.style = style; self @@ -75,6 +92,23 @@ impl DropdownMenu { self.handle = Some(handle); self } + + /// Defines which corner of the handle to attach the menu's anchor to. + pub fn attach(mut self, attach: Corner) -> Self { + self.attach = Some(attach); + self + } + + /// Offsets the position of the menu by that many pixels. + pub fn offset(mut self, offset: Point) -> Self { + self.offset = Some(offset); + self + } + + pub fn tab_index(mut self, arg: isize) -> Self { + self.tab_index = Some(arg); + self + } } impl Disableable for DropdownMenu { @@ -86,17 +120,47 @@ impl Disableable for DropdownMenu { impl RenderOnce for DropdownMenu { fn render(self, _window: &mut Window, _cx: &mut App) -> impl IntoElement { - PopoverMenu::new(self.id) + let button_style = match self.style { + DropdownStyle::Solid => ButtonStyle::Filled, + DropdownStyle::Outlined => ButtonStyle::Outlined, + DropdownStyle::Ghost => ButtonStyle::Transparent, + }; + + let full_width = self.full_width; + let trigger_size = self.trigger_size; + + let button = match self.label { + LabelKind::Text(text) => Button::new(self.id.clone(), text) + .style(button_style) + .icon(IconName::ChevronUpDown) + .icon_position(IconPosition::End) + .icon_size(IconSize::XSmall) + .icon_color(Color::Muted) + .when(full_width, |this| this.full_width()) + .size(trigger_size) + .disabled(self.disabled), + LabelKind::Element(_element) => Button::new(self.id.clone(), "") + .style(button_style) + .icon(IconName::ChevronUpDown) + .icon_position(IconPosition::End) + .icon_size(IconSize::XSmall) + .icon_color(Color::Muted) + .when(full_width, |this| this.full_width()) + .size(trigger_size) + .disabled(self.disabled), + } + .when_some(self.tab_index, |this, tab_index| this.tab_index(tab_index)); + + PopoverMenu::new((self.id.clone(), "popover")) .full_width(self.full_width) .menu(move |_window, _cx| Some(self.menu.clone())) - .trigger( - DropdownMenuTrigger::new(self.label) - .full_width(self.full_width) - .disabled(self.disabled) - .style(self.style), - ) - .attach(Corner::BottomLeft) - .when_some(self.handle, |el, handle| el.with_handle(handle)) + .trigger(button) + .attach(match self.attach { + Some(attach) => attach, + None => Corner::BottomRight, + }) + .when_some(self.offset, |this, offset| this.offset(offset)) + .when_some(self.handle, |this, handle| this.with_handle(handle)) } } @@ -179,149 +243,3 @@ impl Component for DropdownMenu { ) } } - -#[derive(Debug, Clone, Copy)] -pub struct DropdownTriggerStyle { - pub bg: Hsla, -} - -impl DropdownTriggerStyle { - pub fn for_style(style: DropdownStyle, cx: &App) -> Self { - let colors = cx.theme().colors(); - - let bg = match style { - DropdownStyle::Solid => colors.editor_background, - DropdownStyle::Outlined => colors.surface_background, - DropdownStyle::Ghost => colors.ghost_element_background, - }; - - Self { bg } - } -} - -#[derive(IntoElement)] -struct DropdownMenuTrigger { - label: LabelKind, - full_width: bool, - selected: bool, - disabled: bool, - style: DropdownStyle, - cursor_style: CursorStyle, - on_click: Option>, -} - -impl DropdownMenuTrigger { - pub fn new(label: LabelKind) -> Self { - Self { - label, - full_width: false, - selected: false, - disabled: false, - style: DropdownStyle::default(), - cursor_style: CursorStyle::default(), - on_click: None, - } - } - - pub fn full_width(mut self, full_width: bool) -> Self { - self.full_width = full_width; - self - } - - pub fn style(mut self, style: DropdownStyle) -> Self { - self.style = style; - self - } -} - -impl Disableable for DropdownMenuTrigger { - fn disabled(mut self, disabled: bool) -> Self { - self.disabled = disabled; - self - } -} - -impl Toggleable for DropdownMenuTrigger { - fn toggle_state(mut self, selected: bool) -> Self { - self.selected = selected; - self - } -} - -impl Clickable for DropdownMenuTrigger { - fn on_click(mut self, handler: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static) -> Self { - self.on_click = Some(Box::new(handler)); - self - } - - fn cursor_style(mut self, cursor_style: CursorStyle) -> Self { - self.cursor_style = cursor_style; - self - } -} - -impl RenderOnce for DropdownMenuTrigger { - fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement { - let disabled = self.disabled; - - let style = DropdownTriggerStyle::for_style(self.style, cx); - let is_outlined = matches!(self.style, DropdownStyle::Outlined); - - h_flex() - .id("dropdown-menu-trigger") - .min_w_20() - .pl_2() - .pr_1p5() - .py_0p5() - .gap_2() - .justify_between() - .rounded_sm() - .map(|this| { - if self.full_width { - this.w_full() - } else { - this.flex_none().w_auto() - } - }) - .when(is_outlined, |this| { - this.border_1() - .border_color(cx.theme().colors().border) - .overflow_hidden() - }) - .map(|this| { - if disabled { - this.cursor_not_allowed() - .bg(cx.theme().colors().element_disabled) - } else { - this.bg(style.bg) - .hover(|s| s.bg(cx.theme().colors().element_hover)) - } - }) - .child(match self.label { - LabelKind::Text(text) => Label::new(text) - .color(if disabled { - Color::Disabled - } else { - Color::Default - }) - .into_any_element(), - LabelKind::Element(element) => element, - }) - .child( - Icon::new(IconName::ChevronUpDown) - .size(IconSize::XSmall) - .color(if disabled { - Color::Disabled - } else { - Color::Muted - }), - ) - .when_some(self.on_click.filter(|_| !disabled), |el, on_click| { - el.on_mouse_down(MouseButton::Left, |_, window, _| window.prevent_default()) - .on_click(move |event, window, cx| { - cx.stop_propagation(); - (on_click)(event, window, cx) - }) - }) - } -} diff --git a/crates/ui/src/components/keybinding.rs b/crates/ui/src/components/keybinding.rs index 98703f65f4cf3ccec9e483c70f5a43ac8d53a280..f8ac85528ec3317bb003d3f8763f8c57a7d4bba2 100644 --- a/crates/ui/src/components/keybinding.rs +++ b/crates/ui/src/components/keybinding.rs @@ -392,7 +392,7 @@ pub fn text_for_action(action: &dyn Action, window: &Window, cx: &App) -> Option pub fn text_for_keystrokes(keystrokes: &[Keystroke], cx: &App) -> String { let platform_style = PlatformStyle::platform(); - let vim_enabled = cx.try_global::().is_some(); + let vim_enabled = KeyBinding::is_vim_mode(cx); keystrokes .iter() .map(|keystroke| { @@ -408,7 +408,7 @@ pub fn text_for_keystrokes(keystrokes: &[Keystroke], cx: &App) -> String { pub fn text_for_keybinding_keystrokes(keystrokes: &[KeybindingKeystroke], cx: &App) -> String { let platform_style = PlatformStyle::platform(); - let vim_enabled = cx.try_global::().is_some(); + let vim_enabled = KeyBinding::is_vim_mode(cx); keystrokes .iter() .map(|keystroke| { @@ -424,8 +424,7 @@ pub fn text_for_keybinding_keystrokes(keystrokes: &[KeybindingKeystroke], cx: &A pub fn text_for_keystroke(modifiers: &Modifiers, key: &str, cx: &App) -> String { let platform_style = PlatformStyle::platform(); - let vim_enabled = cx.try_global::().is_some(); - keystroke_text(modifiers, key, platform_style, vim_enabled) + keystroke_text(modifiers, key, platform_style, KeyBinding::is_vim_mode(cx)) } /// Returns a textual representation of the given [`Keystroke`]. @@ -473,6 +472,7 @@ fn keystroke_text( if modifiers.alt { match (platform_style, vim_mode) { (PlatformStyle::Mac, false) => text.push_str("Option"), + (PlatformStyle::Mac, true) => text.push_str("option"), (PlatformStyle::Linux | PlatformStyle::Windows, false) => text.push_str("Alt"), (_, true) => text.push_str("alt"), } diff --git a/crates/ui/src/components/keybinding_hint.rs b/crates/ui/src/components/keybinding_hint.rs index b24749778cba0b6398bdfc2b455ff41535a4ed2b..58f2793ea0ee29b55eace9e7fe9e53c606ca0a43 100644 --- a/crates/ui/src/components/keybinding_hint.rs +++ b/crates/ui/src/components/keybinding_hint.rs @@ -1,5 +1,5 @@ use crate::KeyBinding; -use crate::{h_flex, prelude::*}; +use crate::prelude::*; use gpui::{AnyElement, App, BoxShadow, FontStyle, Hsla, IntoElement, Window, point}; use theme::Appearance; @@ -206,20 +206,23 @@ impl KeybindingHint { impl RenderOnce for KeybindingHint { fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement { - let colors = cx.theme().colors().clone(); + let colors = cx.theme().colors(); let is_light = cx.theme().appearance() == Appearance::Light; let border_color = self.background_color .blend(colors.text.alpha(if is_light { 0.08 } else { 0.16 })); - let bg_color = - self.background_color - .blend(colors.text.alpha(if is_light { 0.06 } else { 0.12 })); + + let bg_color = self + .background_color + .blend(colors.text_accent.alpha(if is_light { 0.05 } else { 0.1 })); + let shadow_color = colors.text.alpha(if is_light { 0.04 } else { 0.08 }); let size = self .size .unwrap_or(TextSize::Small.rems(cx).to_pixels(window.rem_size())); + let kb_size = size - px(2.0); let mut base = h_flex(); @@ -228,15 +231,13 @@ impl RenderOnce for KeybindingHint { .get_or_insert_with(Default::default) .font_style = Some(FontStyle::Italic); - base.items_center() - .gap_0p5() + base.gap_1() .font_buffer(cx) .text_size(size) .text_color(colors.text_disabled) .children(self.prefix) .child( h_flex() - .items_center() .rounded_sm() .px_0p5() .mr_0p5() @@ -249,7 +250,7 @@ impl RenderOnce for KeybindingHint { blur_radius: px(0.), spread_radius: px(0.), }]) - .child(self.keybinding.size(rems_from_px(kb_size.0))), + .child(self.keybinding.size(rems_from_px(kb_size))), ) .children(self.suffix) } diff --git a/crates/ui/src/components/label/highlighted_label.rs b/crates/ui/src/components/label/highlighted_label.rs index 576d47eda5b802ce4cf2fc97b8dac0b20b43e883..a3cbc33553f701b1c744b04d4e0481a2bd9de129 100644 --- a/crates/ui/src/components/label/highlighted_label.rs +++ b/crates/ui/src/components/label/highlighted_label.rs @@ -21,6 +21,14 @@ impl HighlightedLabel { highlight_indices, } } + + pub fn text(&self) -> &str { + self.label.as_str() + } + + pub fn highlight_indices(&self) -> &[usize] { + &self.highlight_indices + } } impl LabelCommon for HighlightedLabel { @@ -97,15 +105,10 @@ pub fn highlight_ranges( let mut end_ix = start_ix; loop { - end_ix = end_ix + text[end_ix..].chars().next().unwrap().len_utf8(); - if let Some(&next_ix) = highlight_indices.peek() - && next_ix == end_ix - { - end_ix = next_ix; - highlight_indices.next(); - continue; + end_ix += text[end_ix..].chars().next().map_or(0, |c| c.len_utf8()); + if highlight_indices.next_if(|&ix| ix == end_ix).is_none() { + break; } - break; } highlights.push((start_ix..end_ix, style)); diff --git a/crates/ui/src/components/list/list_bullet_item.rs b/crates/ui/src/components/list/list_bullet_item.rs index 6e079d9f112f74e5198ad174d823643ea923f822..9ac2095b5757d90bd22496052b806f41a5f8d163 100644 --- a/crates/ui/src/components/list/list_bullet_item.rs +++ b/crates/ui/src/components/list/list_bullet_item.rs @@ -16,7 +16,7 @@ impl ListBulletItem { impl RenderOnce for ListBulletItem { fn render(self, window: &mut Window, _cx: &mut App) -> impl IntoElement { - let line_height = 0.85 * window.line_height(); + let line_height = window.line_height() * 0.85; ListItem::new("list-item") .selectable(false) diff --git a/crates/ui/src/components/list/list_header.rs b/crates/ui/src/components/list/list_header.rs index d64f5c7263a4c395a48591a9454c0b518e541a82..d59af07fa5271c070fca8433156b94301cc134aa 100644 --- a/crates/ui/src/components/list/list_header.rs +++ b/crates/ui/src/components/list/list_header.rs @@ -107,7 +107,8 @@ impl RenderOnce for ListHeader { h_flex() .gap(DynamicSpacing::Base04.rems(cx)) .children(self.toggle.map(|is_open| { - Disclosure::new("toggle", is_open).on_toggle(self.on_toggle.clone()) + Disclosure::new("toggle", is_open) + .on_toggle_expanded(self.on_toggle.clone()) })) .child( div() diff --git a/crates/ui/src/components/list/list_item.rs b/crates/ui/src/components/list/list_item.rs index 6356930aee8cc38a9d793428544b8ca33f3966ff..a58291438a1d10bb1b61149f412151375b6b0a1f 100644 --- a/crates/ui/src/components/list/list_item.rs +++ b/crates/ui/src/components/list/list_item.rs @@ -308,7 +308,10 @@ impl RenderOnce for ListItem { .when(is_open && !self.always_show_disclosure_icon, |this| { this.visible_on_hover("") }) - .child(Disclosure::new("toggle", is_open).on_toggle(self.on_toggle)) + .child( + Disclosure::new("toggle", is_open) + .on_toggle_expanded(self.on_toggle), + ) })) .child( h_flex() diff --git a/crates/ui/src/components/numeric_stepper.rs b/crates/ui/src/components/numeric_stepper.rs deleted file mode 100644 index 2ddb86d9a0d595edffc76319b415f9f68f9c6b9c..0000000000000000000000000000000000000000 --- a/crates/ui/src/components/numeric_stepper.rs +++ /dev/null @@ -1,237 +0,0 @@ -use gpui::ClickEvent; - -use crate::{IconButtonShape, prelude::*}; - -#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] -pub enum NumericStepperStyle { - Outlined, - #[default] - Ghost, -} - -#[derive(IntoElement, RegisterComponent)] -pub struct NumericStepper { - id: ElementId, - value: SharedString, - style: NumericStepperStyle, - on_decrement: Box, - on_increment: Box, - /// Whether to reserve space for the reset button. - reserve_space_for_reset: bool, - on_reset: Option>, - tab_index: Option, -} - -impl NumericStepper { - pub fn new( - id: impl Into, - value: impl Into, - on_decrement: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static, - on_increment: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static, - ) -> Self { - Self { - id: id.into(), - value: value.into(), - style: NumericStepperStyle::default(), - on_decrement: Box::new(on_decrement), - on_increment: Box::new(on_increment), - reserve_space_for_reset: false, - on_reset: None, - tab_index: None, - } - } - - pub fn style(mut self, style: NumericStepperStyle) -> Self { - self.style = style; - self - } - - pub fn reserve_space_for_reset(mut self, reserve_space_for_reset: bool) -> Self { - self.reserve_space_for_reset = reserve_space_for_reset; - self - } - - pub fn on_reset( - mut self, - on_reset: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static, - ) -> Self { - self.on_reset = Some(Box::new(on_reset)); - self - } - - pub fn tab_index(mut self, tab_index: isize) -> Self { - self.tab_index = Some(tab_index); - self - } -} - -impl RenderOnce for NumericStepper { - fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement { - let shape = IconButtonShape::Square; - let icon_size = IconSize::Small; - - let is_outlined = matches!(self.style, NumericStepperStyle::Outlined); - let mut tab_index = self.tab_index; - - h_flex() - .id(self.id) - .gap_1() - .map(|element| { - if let Some(on_reset) = self.on_reset { - element.child( - IconButton::new("reset", IconName::RotateCcw) - .shape(shape) - .icon_size(icon_size) - .when_some(tab_index.as_mut(), |this, tab_index| { - *tab_index += 1; - this.tab_index(*tab_index - 1) - }) - .on_click(on_reset), - ) - } else if self.reserve_space_for_reset { - element.child( - h_flex() - .size(icon_size.square(window, cx)) - .flex_none() - .into_any_element(), - ) - } else { - element - } - }) - .child( - h_flex() - .gap_1() - .rounded_sm() - .map(|this| { - if is_outlined { - this.overflow_hidden() - .bg(cx.theme().colors().surface_background) - .border_1() - .border_color(cx.theme().colors().border_variant) - } else { - this.px_1().bg(cx.theme().colors().editor_background) - } - }) - .map(|decrement| { - if is_outlined { - decrement.child( - h_flex() - .id("decrement_button") - .p_1p5() - .size_full() - .justify_center() - .hover(|s| s.bg(cx.theme().colors().element_hover)) - .border_r_1() - .border_color(cx.theme().colors().border_variant) - .child(Icon::new(IconName::Dash).size(IconSize::Small)) - .when_some(tab_index.as_mut(), |this, tab_index| { - *tab_index += 1; - this.tab_index(*tab_index - 1).focus(|style| { - style.bg(cx.theme().colors().element_hover) - }) - }) - .on_click(self.on_decrement), - ) - } else { - decrement.child( - IconButton::new("decrement", IconName::Dash) - .shape(shape) - .icon_size(icon_size) - .when_some(tab_index.as_mut(), |this, tab_index| { - *tab_index += 1; - this.tab_index(*tab_index - 1) - }) - .on_click(self.on_decrement), - ) - } - }) - .child(Label::new(self.value).mx_3()) - .map(|increment| { - if is_outlined { - increment.child( - h_flex() - .id("increment_button") - .p_1p5() - .size_full() - .justify_center() - .hover(|s| s.bg(cx.theme().colors().element_hover)) - .border_l_1() - .border_color(cx.theme().colors().border_variant) - .child(Icon::new(IconName::Plus).size(IconSize::Small)) - .when_some(tab_index.as_mut(), |this, tab_index| { - *tab_index += 1; - this.tab_index(*tab_index - 1).focus(|style| { - style.bg(cx.theme().colors().element_hover) - }) - }) - .on_click(self.on_increment), - ) - } else { - increment.child( - IconButton::new("increment", IconName::Dash) - .shape(shape) - .icon_size(icon_size) - .when_some(tab_index.as_mut(), |this, tab_index| { - *tab_index += 1; - this.tab_index(*tab_index - 1) - }) - .on_click(self.on_increment), - ) - } - }), - ) - } -} - -impl Component for NumericStepper { - fn scope() -> ComponentScope { - ComponentScope::Input - } - - fn name() -> &'static str { - "Numeric Stepper" - } - - fn sort_name() -> &'static str { - Self::name() - } - - fn description() -> Option<&'static str> { - Some("A button used to increment or decrement a numeric value.") - } - - fn preview(_window: &mut Window, _cx: &mut App) -> Option { - Some( - v_flex() - .gap_6() - .children(vec![example_group_with_title( - "Styles", - vec![ - single_example( - "Default", - NumericStepper::new( - "numeric-stepper-component-preview", - "10", - move |_, _, _| {}, - move |_, _, _| {}, - ) - .into_any_element(), - ), - single_example( - "Outlined", - NumericStepper::new( - "numeric-stepper-with-border-component-preview", - "10", - move |_, _, _| {}, - move |_, _, _| {}, - ) - .style(NumericStepperStyle::Outlined) - .into_any_element(), - ), - ], - )]) - .into_any_element(), - ) - } -} diff --git a/crates/ui/src/components/scrollbar.rs b/crates/ui/src/components/scrollbar.rs index 35dd52e357480d0a82c1c474b609c49bf2c53db0..bfcaa93eb41f22c36d106273f6da98da38981f62 100644 --- a/crates/ui/src/components/scrollbar.rs +++ b/crates/ui/src/components/scrollbar.rs @@ -1,13 +1,19 @@ -use std::{any::Any, fmt::Debug, marker::PhantomData, ops::Not, time::Duration}; +use std::{ + any::Any, + fmt::Debug, + ops::Not, + time::{Duration, Instant}, +}; use gpui::{ Along, App, AppContext as _, Axis as ScrollbarAxis, BorderStyle, Bounds, ContentMask, Context, - Corner, Corners, CursorStyle, Div, Edges, Element, ElementId, Entity, EntityId, + Corner, Corners, CursorStyle, DispatchPhase, Div, Edges, Element, ElementId, Entity, EntityId, GlobalElementId, Hitbox, HitboxBehavior, Hsla, InteractiveElement, IntoElement, IsZero, LayoutId, ListState, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Negate, ParentElement, Pixels, Point, Position, Render, ScrollHandle, ScrollWheelEvent, Size, Stateful, StatefulInteractiveElement, Style, Styled, Task, UniformListDecoration, - UniformListScrollHandle, Window, prelude::FluentBuilder as _, px, quad, relative, size, + UniformListScrollHandle, Window, ease_in_out, prelude::FluentBuilder as _, px, quad, relative, + size, }; use settings::SettingsStore; use smallvec::SmallVec; @@ -16,9 +22,12 @@ use util::ResultExt; use std::ops::Range; -use crate::scrollbars::{ScrollbarVisibility, ShowScrollbar}; +use crate::scrollbars::{ScrollbarAutoHide, ScrollbarVisibility, ShowScrollbar}; + +const SCROLLBAR_HIDE_DELAY_INTERVAL: Duration = Duration::from_secs(1); +const SCROLLBAR_HIDE_DURATION: Duration = Duration::from_millis(400); +const SCROLLBAR_SHOW_DURATION: Duration = Duration::from_millis(50); -const SCROLLBAR_SHOW_INTERVAL: Duration = Duration::from_millis(1500); const SCROLLBAR_PADDING: Pixels = px(4.); pub mod scrollbars { @@ -30,11 +39,12 @@ pub mod scrollbars { /// When to show the scrollbar in the editor. /// /// Default: auto - #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] + #[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[serde(rename_all = "snake_case")] pub enum ShowScrollbar { /// Show the scrollbar if there's important information or /// follow the system's configured behavior. + #[default] Auto, /// Match the system's configured behavior. System, @@ -44,16 +54,13 @@ pub mod scrollbars { Never, } - impl ShowScrollbar { - pub(super) fn show(&self) -> bool { - *self != Self::Never - } - - pub(super) fn should_auto_hide(&self, cx: &mut App) -> bool { - match self { - Self::Auto => true, - Self::System => cx.default_global::().should_hide(), - _ => false, + impl From for ShowScrollbar { + fn from(value: settings::ShowScrollbar) -> Self { + match value { + settings::ShowScrollbar::Auto => ShowScrollbar::Auto, + settings::ShowScrollbar::System => ShowScrollbar::System, + settings::ShowScrollbar::Always => ShowScrollbar::Always, + settings::ShowScrollbar::Never => ShowScrollbar::Never, } } } @@ -68,22 +75,10 @@ pub mod scrollbars { } } - impl GlobalSetting for ShowScrollbar { - fn get_value(_cx: &App) -> &Self { - &ShowScrollbar::Always - } - } - pub trait ScrollbarVisibility: GlobalSetting + 'static { fn visibility(&self, cx: &App) -> ShowScrollbar; } - impl ScrollbarVisibility for ShowScrollbar { - fn visibility(&self, cx: &App) -> ShowScrollbar { - *ShowScrollbar::get_value(cx) - } - } - #[derive(Default)] pub struct ScrollbarAutoHide(pub bool); @@ -96,14 +91,13 @@ pub mod scrollbars { impl Global for ScrollbarAutoHide {} } -fn get_scrollbar_state( - mut config: Scrollbars, +fn get_scrollbar_state( + mut config: Scrollbars, caller_location: &'static std::panic::Location, window: &mut Window, cx: &mut App, -) -> Entity> +) -> Entity> where - S: ScrollbarVisibility, T: ScrollableHandle, { let element_id = config.id.take().unwrap_or_else(|| caller_location.into()); @@ -119,33 +113,33 @@ where pub trait WithScrollbar: Sized { type Output; - fn custom_scrollbars( + fn custom_scrollbars( self, - config: Scrollbars, + config: Scrollbars, window: &mut Window, cx: &mut App, ) -> Self::Output where - S: ScrollbarVisibility, T: ScrollableHandle; - #[track_caller] - fn horizontal_scrollbar(self, window: &mut Window, cx: &mut App) -> Self::Output { - self.custom_scrollbars( - Scrollbars::new(ScrollAxes::Horizontal).ensure_id(core::panic::Location::caller()), - window, - cx, - ) - } - - #[track_caller] - fn vertical_scrollbar(self, window: &mut Window, cx: &mut App) -> Self::Output { - self.custom_scrollbars( - Scrollbars::new(ScrollAxes::Vertical).ensure_id(core::panic::Location::caller()), - window, - cx, - ) - } + // TODO: account for these cases properly + // #[track_caller] + // fn horizontal_scrollbar(self, window: &mut Window, cx: &mut App) -> Self::Output { + // self.custom_scrollbars( + // Scrollbars::new(ScrollAxes::Horizontal).ensure_id(core::panic::Location::caller()), + // window, + // cx, + // ) + // } + + // #[track_caller] + // fn vertical_scrollbar(self, window: &mut Window, cx: &mut App) -> Self::Output { + // self.custom_scrollbars( + // Scrollbars::new(ScrollAxes::Vertical).ensure_id(core::panic::Location::caller()), + // window, + // cx, + // ) + // } #[track_caller] fn vertical_scrollbar_for( @@ -168,14 +162,13 @@ impl WithScrollbar for Stateful
{ type Output = Self; #[track_caller] - fn custom_scrollbars( + fn custom_scrollbars( self, - config: Scrollbars, + config: Scrollbars, window: &mut Window, cx: &mut App, ) -> Self::Output where - S: ScrollbarVisibility, T: ScrollableHandle, { render_scrollbar( @@ -190,14 +183,13 @@ impl WithScrollbar for Div { type Output = Stateful
; #[track_caller] - fn custom_scrollbars( + fn custom_scrollbars( self, - config: Scrollbars, + config: Scrollbars, window: &mut Window, cx: &mut App, ) -> Self::Output where - S: ScrollbarVisibility, T: ScrollableHandle, { let scrollbar = get_scrollbar_state(config, std::panic::Location::caller(), window, cx); @@ -213,13 +205,12 @@ impl WithScrollbar for Div { } } -fn render_scrollbar( - scrollbar: Entity>, +fn render_scrollbar( + scrollbar: Entity>, div: Stateful
, cx: &App, ) -> Stateful
where - S: ScrollbarVisibility, T: ScrollableHandle, { let state = &scrollbar.read(cx).0; @@ -247,9 +238,7 @@ where .child(state.clone()) } -impl UniformListDecoration - for ScrollbarStateWrapper -{ +impl UniformListDecoration for ScrollbarStateWrapper { fn compute( &self, _visible_range: Range, @@ -297,6 +286,30 @@ impl UniformListDecoration // } // } +#[derive(Copy, Clone, PartialEq, Eq)] +enum ShowBehavior { + Always, + Autohide, + Never, +} + +impl ShowBehavior { + fn from_setting(setting: ShowScrollbar, cx: &mut App) -> Self { + match setting { + ShowScrollbar::Never => Self::Never, + ShowScrollbar::Auto => Self::Autohide, + ShowScrollbar::System => { + if cx.default_global::().should_hide() { + Self::Autohide + } else { + Self::Always + } + } + ShowScrollbar::Always => Self::Always, + } + } +} + pub enum ScrollAxes { Horizontal, Vertical, @@ -321,7 +334,7 @@ enum ReservedSpace { #[default] None, Thumb, - Track, + Track(Hsla), } impl ReservedSpace { @@ -330,11 +343,18 @@ impl ReservedSpace { } fn needs_scroll_track(&self) -> bool { - *self == ReservedSpace::Track + matches!(self, ReservedSpace::Track(_)) + } + + fn track_color(&self) -> Option { + match self { + ReservedSpace::Track(color) => Some(*color), + _ => None, + } } } -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone, Copy)] enum ScrollbarWidth { #[default] Normal, @@ -352,33 +372,38 @@ impl ScrollbarWidth { } } -pub struct Scrollbars { +#[derive(Clone)] +enum Handle { + Tracked(T), + Untracked(fn() -> T), +} + +#[derive(Clone)] +pub struct Scrollbars { id: Option, - tracked_setting: PhantomData, + get_visibility: fn(&App) -> ShowScrollbar, tracked_entity: Option>, - scrollable_handle: Box T>, - handle_was_added: bool, + scrollable_handle: Handle, visibility: Point, scrollbar_width: ScrollbarWidth, } impl Scrollbars { pub fn new(show_along: ScrollAxes) -> Self { - Self::new_with_setting(show_along) + Self::new_with_setting(show_along, |_| ShowScrollbar::default()) } - pub fn for_settings() -> Scrollbars { - Scrollbars::::new_with_setting(ScrollAxes::Both) + pub fn for_settings() -> Scrollbars { + Scrollbars::new_with_setting(ScrollAxes::Both, |cx| S::get_value(cx).visibility(cx)) } } -impl Scrollbars { - fn new_with_setting(show_along: ScrollAxes) -> Self { +impl Scrollbars { + fn new_with_setting(show_along: ScrollAxes, get_visibility: fn(&App) -> ShowScrollbar) -> Self { Self { id: None, - tracked_setting: PhantomData, - handle_was_added: false, - scrollable_handle: Box::new(ScrollHandle::new), + get_visibility, + scrollable_handle: Handle::Untracked(ScrollHandle::new), tracked_entity: None, visibility: show_along.apply_to(Default::default(), ReservedSpace::Thumb), scrollbar_width: ScrollbarWidth::Normal, @@ -386,9 +411,7 @@ impl Scrollbars { } } -impl - Scrollbars -{ +impl Scrollbars { pub fn id(mut self, id: impl Into) -> Self { self.id = Some(id.into()); self @@ -416,24 +439,23 @@ impl pub fn tracked_scroll_handle( self, tracked_scroll_handle: TrackedHandle, - ) -> Scrollbars { + ) -> Scrollbars { let Self { id, - tracked_setting, tracked_entity: tracked_entity_id, scrollbar_width, visibility, + get_visibility, .. } = self; Scrollbars { - handle_was_added: true, - scrollable_handle: Box::new(|| tracked_scroll_handle), + scrollable_handle: Handle::Tracked(tracked_scroll_handle), id, - tracked_setting, tracked_entity: tracked_entity_id, visibility, scrollbar_width, + get_visibility, } } @@ -442,8 +464,8 @@ impl self } - pub fn with_track_along(mut self, along: ScrollAxes) -> Self { - self.visibility = along.apply_to(self.visibility, ReservedSpace::Track); + pub fn with_track_along(mut self, along: ScrollAxes, background_color: Hsla) -> Self { + self.visibility = along.apply_to(self.visibility, ReservedSpace::Track(background_color)); self } @@ -458,52 +480,118 @@ impl } } -#[derive(PartialEq, Eq)] +#[derive(PartialEq, Clone, Debug)] enum VisibilityState { Visible, + Animating { showing: bool, delta: f32 }, Hidden, Disabled, } +const DELTA_MAX: f32 = 1.0; + impl VisibilityState { - fn from_show_setting(show_setting: ShowScrollbar) -> Self { - if show_setting.show() { - Self::Visible - } else { - Self::Disabled + fn from_behavior(behavior: ShowBehavior) -> Self { + match behavior { + ShowBehavior::Always => Self::Visible, + ShowBehavior::Never => Self::Disabled, + ShowBehavior::Autohide => Self::for_show(), + } + } + + fn for_show() -> Self { + Self::Animating { + showing: true, + delta: Default::default(), + } + } + + fn for_autohide() -> Self { + Self::Animating { + showing: Default::default(), + delta: Default::default(), } } fn is_visible(&self) -> bool { - *self == VisibilityState::Visible + matches!(self, Self::Visible | Self::Animating { .. }) } #[inline] fn is_disabled(&self) -> bool { *self == VisibilityState::Disabled } + + fn animation_progress(&self) -> Option<(f32, Duration, bool)> { + match self { + Self::Animating { showing, delta } => Some(( + *delta, + if *showing { + SCROLLBAR_SHOW_DURATION + } else { + SCROLLBAR_HIDE_DURATION + }, + *showing, + )), + _ => None, + } + } + + fn set_delta(&mut self, new_delta: f32) { + match self { + Self::Animating { showing, .. } if new_delta >= DELTA_MAX => { + if *showing { + *self = Self::Visible; + } else { + *self = Self::Hidden; + } + } + Self::Animating { delta, .. } => *delta = new_delta, + _ => {} + } + } + + fn toggle_visible(&self, show_behavior: ShowBehavior) -> Self { + match self { + Self::Hidden => { + if show_behavior == ShowBehavior::Autohide { + Self::for_show() + } else { + Self::Visible + } + } + Self::Animating { + showing: false, + delta: progress, + } => Self::Animating { + showing: true, + delta: DELTA_MAX - progress, + }, + _ => self.clone(), + } + } } -enum ParentHovered { - Yes(bool), - No(bool), +enum ParentHoverEvent { + Within, + Entered, + Exited, + Outside, } /// This is used to ensure notifies within the state do not notify the parent /// unintentionally. -struct ScrollbarStateWrapper( - Entity>, -); +struct ScrollbarStateWrapper(Entity>); /// A scrollbar state that should be persisted across frames. -struct ScrollbarState { +struct ScrollbarState { thumb_state: ThumbState, notify_id: Option, manually_added: bool, scroll_handle: T, width: ScrollbarWidth, - tracked_setting: PhantomData, - show_setting: ShowScrollbar, + show_behavior: ShowBehavior, + get_visibility: fn(&App) -> ShowScrollbar, visibility: Point, show_state: VisibilityState, mouse_in_parent: bool, @@ -511,9 +599,9 @@ struct ScrollbarState>, } -impl ScrollbarState { +impl ScrollbarState { fn new_from_config( - config: Scrollbars, + config: Scrollbars, parent_id: EntityId, window: &mut Window, cx: &mut Context, @@ -521,16 +609,22 @@ impl ScrollbarState { cx.observe_global_in::(window, Self::settings_changed) .detach(); + let (manually_added, scroll_handle) = match config.scrollable_handle { + Handle::Tracked(handle) => (true, handle), + Handle::Untracked(func) => (false, func()), + }; + + let show_behavior = ShowBehavior::from_setting((config.get_visibility)(cx), cx); ScrollbarState { thumb_state: Default::default(), notify_id: config.tracked_entity.map(|id| id.unwrap_or(parent_id)), - manually_added: config.handle_was_added, - scroll_handle: (config.scrollable_handle)(), + manually_added, + scroll_handle, width: config.scrollbar_width, visibility: config.visibility, - tracked_setting: PhantomData, - show_setting: S::get_value(cx).visibility(cx), - show_state: VisibilityState::Visible, + show_behavior, + get_visibility: config.get_visibility, + show_state: VisibilityState::from_behavior(show_behavior), mouse_in_parent: true, last_prepaint_state: None, _auto_hide_task: None, @@ -538,22 +632,28 @@ impl ScrollbarState { } fn settings_changed(&mut self, window: &mut Window, cx: &mut Context) { - self.set_show_scrollbar(S::get_value(cx).visibility(cx), window, cx); + self.set_show_behavior( + ShowBehavior::from_setting((self.get_visibility)(cx), cx), + window, + cx, + ); } /// Schedules a scrollbar auto hide if no auto hide is currently in progress yet. fn schedule_auto_hide(&mut self, window: &mut Window, cx: &mut Context) { if self._auto_hide_task.is_none() { - self._auto_hide_task = - (self.visible() && self.show_setting.should_auto_hide(cx)).then(|| { + self._auto_hide_task = (self.visible() && self.show_behavior == ShowBehavior::Autohide) + .then(|| { cx.spawn_in(window, async move |scrollbar_state, cx| { cx.background_executor() - .timer(SCROLLBAR_SHOW_INTERVAL) + .timer(SCROLLBAR_HIDE_DELAY_INTERVAL) .await; scrollbar_state .update(cx, |state, cx| { - state.set_visibility(VisibilityState::Hidden, cx); - state._auto_hide_task.take() + if state.thumb_state == ThumbState::Inactive { + state.set_visibility(VisibilityState::for_autohide(), cx); + } + state._auto_hide_task.take(); }) .log_err(); }) @@ -562,20 +662,21 @@ impl ScrollbarState { } fn show_scrollbars(&mut self, window: &mut Window, cx: &mut Context) { - self.set_visibility(VisibilityState::Visible, cx); + let visibility = self.show_state.toggle_visible(self.show_behavior); + self.set_visibility(visibility, cx); self._auto_hide_task.take(); self.schedule_auto_hide(window, cx); } - fn set_show_scrollbar( + fn set_show_behavior( &mut self, - show: ShowScrollbar, + behavior: ShowBehavior, window: &mut Window, cx: &mut Context, ) { - if self.show_setting != show { - self.show_setting = show; - self.set_visibility(VisibilityState::from_show_setting(show), cx); + if self.show_behavior != behavior { + self.show_behavior = behavior; + self.set_visibility(VisibilityState::from_behavior(behavior), cx); self.schedule_auto_hide(window, cx); cx.notify(); } @@ -599,8 +700,15 @@ impl ScrollbarState { } fn space_to_reserve_for(&self, axis: ScrollbarAxis) -> Option { - (self.show_state.is_disabled().not() && self.visibility.along(axis).needs_scroll_track()) - .then(|| self.space_to_reserve()) + (self.show_state.is_disabled().not() + && self.visibility.along(axis).needs_scroll_track() + && self + .scroll_handle() + .max_offset() + .along(axis) + .is_zero() + .not()) + .then(|| self.space_to_reserve()) } fn space_to_reserve(&self) -> Pixels { @@ -645,10 +753,12 @@ impl ScrollbarState { cx: &mut Context, ) { self.set_thumb_state( - if let Some(&ScrollbarLayout { axis, .. }) = self - .last_prepaint_state - .as_ref() - .and_then(|state| state.thumb_for_position(position)) + if let Some(&ScrollbarLayout { axis, .. }) = + self.last_prepaint_state.as_ref().and_then(|state| { + state + .thumb_for_position(position) + .filter(|thumb| thumb.cursor_hitbox.is_hovered(window)) + }) { ThumbState::Hover(axis) } else { @@ -664,27 +774,30 @@ impl ScrollbarState { if state == ThumbState::Inactive { self.schedule_auto_hide(window, cx); } else { - self.show_scrollbars(window, cx); + self.set_visibility(self.show_state.toggle_visible(self.show_behavior), cx); + self._auto_hide_task.take(); } self.thumb_state = state; cx.notify(); } } - fn update_parent_hovered(&mut self, position: &Point) -> ParentHovered { + fn update_parent_hovered(&mut self, window: &Window) -> ParentHoverEvent { let last_parent_hovered = self.mouse_in_parent; - self.mouse_in_parent = self.parent_hovered(position); + self.mouse_in_parent = self.parent_hovered(window); let state_changed = self.mouse_in_parent != last_parent_hovered; - match self.mouse_in_parent { - true => ParentHovered::Yes(state_changed), - false => ParentHovered::No(state_changed), + match (self.mouse_in_parent, state_changed) { + (true, true) => ParentHoverEvent::Entered, + (true, false) => ParentHoverEvent::Within, + (false, true) => ParentHoverEvent::Exited, + (false, false) => ParentHoverEvent::Outside, } } - fn parent_hovered(&self, position: &Point) -> bool { + fn parent_hovered(&self, window: &Window) -> bool { self.last_prepaint_state .as_ref() - .is_some_and(|state| state.parent_bounds.contains(position)) + .is_some_and(|state| state.parent_bounds_hitbox.is_hovered(window)) } fn hit_for_position(&self, position: &Point) -> Option<&ScrollbarLayout> { @@ -753,7 +866,7 @@ impl ScrollbarState { } } -impl Render for ScrollbarState { +impl Render for ScrollbarState { fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { ScrollbarElement { state: cx.entity(), @@ -762,9 +875,9 @@ impl Render for ScrollbarState { +struct ScrollbarElement { origin: Point, - state: Entity>, + state: Entity>, } #[derive(Default, Debug, PartialEq, Eq)] @@ -869,6 +982,7 @@ struct ScrollbarLayout { track_bounds: Bounds, cursor_hitbox: Hitbox, reserved_space: ReservedSpace, + track_background: Option<(Bounds, Hsla)>, axis: ScrollbarAxis, } @@ -916,7 +1030,7 @@ impl PartialEq for ScrollbarLayout { } pub struct ScrollbarPrepaintState { - parent_bounds: Bounds, + parent_bounds_hitbox: Hitbox, thumbs: SmallVec<[ScrollbarLayout; 2]>, } @@ -944,12 +1058,12 @@ impl PartialEq for ScrollbarPrepaintState { } } -impl Element for ScrollbarElement { +impl Element for ScrollbarElement { type RequestLayoutState = (); - type PrepaintState = Option; + type PrepaintState = Option<(ScrollbarPrepaintState, Option)>; fn id(&self) -> Option { - None + Some(("scrollbar_animation", self.state.entity_id()).into()) } fn source_location(&self) -> Option<&'static core::panic::Location<'static>> { @@ -975,7 +1089,7 @@ impl Element for ScrollbarElement, + id: Option<&GlobalElementId>, _inspector_id: Option<&gpui::InspectorElementId>, bounds: Bounds, _request_layout: &mut Self::RequestLayoutState, @@ -988,7 +1102,6 @@ impl Element for ScrollbarElement>(); let width = self.state.read(cx).width.to_pixels(); @@ -1056,11 +1169,15 @@ impl Element for ScrollbarElement Element for ScrollbarElement Element for ScrollbarElement Element for ScrollbarElement { (colors.scrollbar_thumb_active_background, false) @@ -1113,18 +1264,35 @@ impl Element for ScrollbarElement Element for ScrollbarElement Element for ScrollbarElement Element for ScrollbarElement Element for ScrollbarElement Element for ScrollbarElement state.update(cx, |state, cx| { - match state.update_parent_hovered(&event.position) { - ParentHovered::Yes(state_changed) + match state.update_parent_hovered(window) { + hover @ ParentHoverEvent::Entered + | hover @ ParentHoverEvent::Within if event.pressed_button.is_none() => { - if state_changed { + if matches!(hover, ParentHoverEvent::Entered) { state.show_scrollbars(window, cx); } state.update_hovered_thumb(&event.position, window, cx); @@ -1230,7 +1401,7 @@ impl Element for ScrollbarElement { + ParentHoverEvent::Exited => { state.set_thumb_state(ThumbState::Inactive, window, cx); } _ => {} @@ -1243,7 +1414,7 @@ impl Element for ScrollbarElement Element for ScrollbarElement Element for ScrollbarElement IntoElement for ScrollbarElement { +impl IntoElement for ScrollbarElement { type Element = Self; fn into_element(self) -> Self::Element { diff --git a/crates/ui/src/components/toggle.rs b/crates/ui/src/components/toggle.rs index ae74f76b9cef8075c07dfe45e27b735e98939f8f..8d582c11e77f4469bb959ec656c9d6800603a72e 100644 --- a/crates/ui/src/components/toggle.rs +++ b/crates/ui/src/components/toggle.rs @@ -585,7 +585,7 @@ impl RenderOnce for Switch { /// /// let switch_field = SwitchField::new( /// "feature-toggle", -/// "Enable feature", +/// Some("Enable feature"), /// Some("This feature adds new functionality to the app.".into()), /// ToggleState::Unselected, /// |state, window, cx| { @@ -596,7 +596,7 @@ impl RenderOnce for Switch { #[derive(IntoElement, RegisterComponent)] pub struct SwitchField { id: ElementId, - label: SharedString, + label: Option, description: Option, toggle_state: ToggleState, on_click: Arc, @@ -609,14 +609,14 @@ pub struct SwitchField { impl SwitchField { pub fn new( id: impl Into, - label: impl Into, + label: Option>, description: Option, toggle_state: impl Into, on_click: impl Fn(&ToggleState, &mut Window, &mut App) + 'static, ) -> Self { Self { id: id.into(), - label: label.into(), + label: label.map(Into::into), description, toggle_state: toggle_state.into(), on_click: Arc::new(on_click), @@ -657,11 +657,11 @@ impl SwitchField { impl RenderOnce for SwitchField { fn render(self, _window: &mut Window, _cx: &mut App) -> impl IntoElement { - let tooltip = self.tooltip.map(|tooltip_fn| { - h_flex() - .gap_0p5() - .child(Label::new(self.label.clone())) - .child( + let tooltip = self + .tooltip + .zip(self.label.clone()) + .map(|(tooltip_fn, label)| { + h_flex().gap_0p5().child(Label::new(label)).child( IconButton::new("tooltip_button", IconName::Info) .icon_size(IconSize::XSmall) .icon_color(Color::Muted) @@ -673,7 +673,7 @@ impl RenderOnce for SwitchField { }) .on_click(|_, _, _| {}), // Intentional empty on click handler so that clicking on the info tooltip icon doesn't trigger the switch toggle ) - }); + }); h_flex() .id((self.id.clone(), "container")) @@ -694,11 +694,17 @@ impl RenderOnce for SwitchField { (Some(description), None) => v_flex() .gap_0p5() .max_w_5_6() - .child(Label::new(self.label.clone())) + .when_some(self.label, |this, label| this.child(Label::new(label))) .child(Label::new(description.clone()).color(Color::Muted)) .into_any_element(), (None, Some(tooltip)) => tooltip.into_any_element(), - (None, None) => Label::new(self.label.clone()).into_any_element(), + (None, None) => { + if let Some(label) = self.label.clone() { + Label::new(label).into_any_element() + } else { + gpui::Empty.into_any_element() + } + } }) .child( Switch::new((self.id.clone(), "switch"), self.toggle_state) @@ -748,7 +754,7 @@ impl Component for SwitchField { "Unselected", SwitchField::new( "switch_field_unselected", - "Enable notifications", + Some("Enable notifications"), Some("Receive notifications when new messages arrive.".into()), ToggleState::Unselected, |_, _, _| {}, @@ -759,7 +765,7 @@ impl Component for SwitchField { "Selected", SwitchField::new( "switch_field_selected", - "Enable notifications", + Some("Enable notifications"), Some("Receive notifications when new messages arrive.".into()), ToggleState::Selected, |_, _, _| {}, @@ -775,7 +781,7 @@ impl Component for SwitchField { "Default", SwitchField::new( "switch_field_default", - "Default color", + Some("Default color"), Some("This uses the default switch color.".into()), ToggleState::Selected, |_, _, _| {}, @@ -786,7 +792,7 @@ impl Component for SwitchField { "Accent", SwitchField::new( "switch_field_accent", - "Accent color", + Some("Accent color"), Some("This uses the accent color scheme.".into()), ToggleState::Selected, |_, _, _| {}, @@ -802,7 +808,7 @@ impl Component for SwitchField { "Disabled", SwitchField::new( "switch_field_disabled", - "Disabled field", + Some("Disabled field"), Some("This field is disabled and cannot be toggled.".into()), ToggleState::Selected, |_, _, _| {}, @@ -817,7 +823,7 @@ impl Component for SwitchField { "No Description", SwitchField::new( "switch_field_disabled", - "Disabled field", + Some("Disabled field"), None, ToggleState::Selected, |_, _, _| {}, @@ -832,7 +838,7 @@ impl Component for SwitchField { "Tooltip with Description", SwitchField::new( "switch_field_tooltip_with_desc", - "Nice Feature", + Some("Nice Feature"), Some("Enable advanced configuration options.".into()), ToggleState::Unselected, |_, _, _| {}, @@ -844,7 +850,7 @@ impl Component for SwitchField { "Tooltip without Description", SwitchField::new( "switch_field_tooltip_no_desc", - "Nice Feature", + Some("Nice Feature"), None, ToggleState::Selected, |_, _, _| {}, diff --git a/crates/ui/src/components/tooltip.rs b/crates/ui/src/components/tooltip.rs index 65ed2f2b6848a2b0c74c6102499027badce935a9..4bfb7d2fc3e38ba5af2d1734d28de75a51096811 100644 --- a/crates/ui/src/components/tooltip.rs +++ b/crates/ui/src/components/tooltip.rs @@ -1,6 +1,7 @@ +use std::borrow::Borrow; use std::rc::Rc; -use gpui::{Action, AnyElement, AnyView, AppContext as _, FocusHandle, IntoElement, Render}; +use gpui::{Action, AnyElement, AnyView, AppContext, FocusHandle, IntoElement, Render}; use settings::Settings; use theme::ThemeSettings; @@ -195,8 +196,8 @@ impl Tooltip { } impl Render for Tooltip { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - tooltip_container(window, cx, |el, _, _| { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + tooltip_container(cx, |el, _| { el.child( h_flex() .gap_4() @@ -216,23 +217,23 @@ impl Render for Tooltip { } } -pub fn tooltip_container) -> Div>( - window: &mut Window, - cx: &mut Context, - f: ContentsBuilder, -) -> impl IntoElement + use { - let ui_font = ThemeSettings::get_global(cx).ui_font.clone(); +pub fn tooltip_container(cx: &mut C, f: impl FnOnce(Div, &mut C) -> Div) -> impl IntoElement +where + C: AppContext + Borrow, +{ + let app = (*cx).borrow(); + let ui_font = ThemeSettings::get_global(app).ui_font.clone(); // padding to avoid tooltip appearing right below the mouse cursor div().pl_2().pt_2p5().child( v_flex() - .elevation_2(cx) + .elevation_2(app) .font(ui_font) - .text_ui(cx) - .text_color(cx.theme().colors().text) + .text_ui(app) + .text_color(app.theme().colors().text) .py_1() .px_2() - .map(|el| f(el, window, cx)), + .map(|el| f(el, cx)), ) } @@ -261,8 +262,8 @@ impl LinkPreview { } impl Render for LinkPreview { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - tooltip_container(window, cx, |el, _, _| { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + tooltip_container(cx, |el, _| { el.child( Label::new(self.link.clone()) .size(LabelSize::XSmall) diff --git a/crates/ui/src/components/tree_view_item.rs b/crates/ui/src/components/tree_view_item.rs new file mode 100644 index 0000000000000000000000000000000000000000..8647b13a65dee64fd825c814303815241547cd75 --- /dev/null +++ b/crates/ui/src/components/tree_view_item.rs @@ -0,0 +1,294 @@ +use std::sync::Arc; + +use gpui::{AnyElement, AnyView, ClickEvent, MouseButton, MouseDownEvent}; + +use crate::{Disclosure, prelude::*}; + +#[derive(IntoElement, RegisterComponent)] +pub struct TreeViewItem { + id: ElementId, + group_name: Option, + label: SharedString, + expanded: bool, + selected: bool, + disabled: bool, + focused: bool, + default_expanded: bool, + root_item: bool, + tooltip: Option AnyView + 'static>>, + on_click: Option>, + on_hover: Option>, + on_toggle: Option>, + on_secondary_mouse_down: Option>, + tab_index: Option, + focus_handle: Option, +} + +impl TreeViewItem { + pub fn new(id: impl Into, label: impl Into) -> Self { + Self { + id: id.into(), + group_name: None, + label: label.into(), + expanded: false, + selected: false, + disabled: false, + focused: false, + default_expanded: false, + root_item: false, + tooltip: None, + on_click: None, + on_hover: None, + on_toggle: None, + on_secondary_mouse_down: None, + tab_index: None, + focus_handle: None, + } + } + + pub fn group_name(mut self, group_name: impl Into) -> Self { + self.group_name = Some(group_name.into()); + self + } + + pub fn on_click( + mut self, + handler: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static, + ) -> Self { + self.on_click = Some(Box::new(handler)); + self + } + + pub fn on_hover(mut self, handler: impl Fn(&bool, &mut Window, &mut App) + 'static) -> Self { + self.on_hover = Some(Box::new(handler)); + self + } + + pub fn on_secondary_mouse_down( + mut self, + handler: impl Fn(&MouseDownEvent, &mut Window, &mut App) + 'static, + ) -> Self { + self.on_secondary_mouse_down = Some(Box::new(handler)); + self + } + + pub fn tooltip(mut self, tooltip: impl Fn(&mut Window, &mut App) -> AnyView + 'static) -> Self { + self.tooltip = Some(Box::new(tooltip)); + self + } + + pub fn tab_index(mut self, tab_index: isize) -> Self { + self.tab_index = Some(tab_index); + self + } + + pub fn expanded(mut self, toggle: bool) -> Self { + self.expanded = toggle; + self + } + + pub fn default_expanded(mut self, default_expanded: bool) -> Self { + self.default_expanded = default_expanded; + self + } + + pub fn on_toggle( + mut self, + on_toggle: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static, + ) -> Self { + self.on_toggle = Some(Arc::new(on_toggle)); + self + } + + pub fn root_item(mut self, root_item: bool) -> Self { + self.root_item = root_item; + self + } + + pub fn focused(mut self, focused: bool) -> Self { + self.focused = focused; + self + } + + pub fn track_focus(mut self, focus_handle: &gpui::FocusHandle) -> Self { + self.focus_handle = Some(focus_handle.clone()); + self + } +} + +impl Disableable for TreeViewItem { + fn disabled(mut self, disabled: bool) -> Self { + self.disabled = disabled; + self + } +} + +impl Toggleable for TreeViewItem { + fn toggle_state(mut self, selected: bool) -> Self { + self.selected = selected; + self + } +} + +impl RenderOnce for TreeViewItem { + fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement { + let selected_bg = cx.theme().colors().element_active.opacity(0.5); + + let transparent_border = cx.theme().colors().border.opacity(0.); + let selected_border = cx.theme().colors().border.opacity(0.4); + let focused_border = cx.theme().colors().border_focused; + + let item_size = rems_from_px(28.); + let indentation_line = h_flex().size(item_size).flex_none().justify_center().child( + div() + .w_px() + .h_full() + .bg(cx.theme().colors().border.opacity(0.5)), + ); + + h_flex() + .id(self.id) + .when_some(self.group_name, |this, group| this.group(group)) + .w_full() + .child( + h_flex() + .id("inner_tree_view_item") + .cursor_pointer() + .size_full() + .h(item_size) + .rounded_sm() + .border_1() + .border_color(transparent_border) + .focus(|s| s.border_color(focused_border)) + .when(self.selected, |this| { + this.border_color(selected_border).bg(selected_bg) + }) + .hover(|s| s.bg(cx.theme().colors().element_hover)) + .map(|this| { + let label = self.label; + + if self.root_item { + this.px_1() + .gap_2p5() + .child( + Disclosure::new("toggle", self.expanded) + .when_some( + self.on_toggle.clone(), + |disclosure, on_toggle| { + disclosure.on_toggle_expanded(on_toggle) + }, + ) + .opened_icon(IconName::ChevronDown) + .closed_icon(IconName::ChevronRight), + ) + .child( + Label::new(label) + .when(!self.selected, |this| this.color(Color::Muted)), + ) + } else { + this.child(indentation_line).child( + h_flex() + .id("nested_inner_tree_view_item") + .w_full() + .flex_grow() + .px_1() + .child( + Label::new(label) + .when(!self.selected, |this| this.color(Color::Muted)), + ), + ) + } + }) + .when_some(self.focus_handle, |this, handle| this.track_focus(&handle)) + .when_some(self.tab_index, |this, index| this.tab_index(index)) + .when_some(self.on_hover, |this, on_hover| this.on_hover(on_hover)) + .when_some( + self.on_click.filter(|_| !self.disabled), + |this, on_click| this.on_click(on_click), + ) + .when_some(self.on_secondary_mouse_down, |this, on_mouse_down| { + this.on_mouse_down(MouseButton::Right, move |event, window, cx| { + (on_mouse_down)(event, window, cx) + }) + }) + .when_some(self.tooltip, |this, tooltip| this.tooltip(tooltip)), + ) + } +} + +impl Component for TreeViewItem { + fn scope() -> ComponentScope { + ComponentScope::Navigation + } + + fn description() -> Option<&'static str> { + Some( + "A hierarchical list of items that may have a parent-child relationship where children can be toggled into view by expanding or collapsing their parent item.", + ) + } + + fn preview(_window: &mut Window, cx: &mut App) -> Option { + let container = || { + v_flex() + .p_2() + .w_64() + .border_1() + .border_color(cx.theme().colors().border_variant) + .bg(cx.theme().colors().panel_background) + }; + + Some( + example_group(vec![ + single_example( + "Basic Tree View", + container() + .child( + TreeViewItem::new("index-1", "Tree Item Root #1") + .root_item(true) + .toggle_state(true), + ) + .child(TreeViewItem::new("index-2", "Tree Item #2")) + .child(TreeViewItem::new("index-3", "Tree Item #3")) + .child(TreeViewItem::new("index-4", "Tree Item Root #2").root_item(true)) + .child(TreeViewItem::new("index-5", "Tree Item #5")) + .child(TreeViewItem::new("index-6", "Tree Item #6")) + .into_any_element(), + ), + single_example( + "Active Child", + container() + .child(TreeViewItem::new("index-1", "Tree Item Root #1").root_item(true)) + .child(TreeViewItem::new("index-2", "Tree Item #2").toggle_state(true)) + .child(TreeViewItem::new("index-3", "Tree Item #3")) + .into_any_element(), + ), + single_example( + "Focused Parent", + container() + .child( + TreeViewItem::new("index-1", "Tree Item Root #1") + .root_item(true) + .focused(true) + .toggle_state(true), + ) + .child(TreeViewItem::new("index-2", "Tree Item #2")) + .child(TreeViewItem::new("index-3", "Tree Item #3")) + .into_any_element(), + ), + single_example( + "Focused Child", + container() + .child( + TreeViewItem::new("index-1", "Tree Item Root #1") + .root_item(true) + .toggle_state(true), + ) + .child(TreeViewItem::new("index-2", "Tree Item #2").focused(true)) + .child(TreeViewItem::new("index-3", "Tree Item #3")) + .into_any_element(), + ), + ]) + .into_any_element(), + ) + } +} diff --git a/crates/ui/src/styles/typography.rs b/crates/ui/src/styles/typography.rs index 79eb1b8cf72814ca21c76bdb629b2d5f3f795aee..0d7d5af9e74f11f7d77c9d03362f6be41dc9b2ec 100644 --- a/crates/ui/src/styles/typography.rs +++ b/crates/ui/src/styles/typography.rs @@ -140,8 +140,8 @@ impl TextSize { Self::Default => rems_from_px(14.), Self::Small => rems_from_px(12.), Self::XSmall => rems_from_px(10.), - Self::Ui => rems_from_px(theme_settings.ui_font_size(cx).into()), - Self::Editor => rems_from_px(theme_settings.buffer_font_size(cx).into()), + Self::Ui => rems_from_px(theme_settings.ui_font_size(cx)), + Self::Editor => rems_from_px(theme_settings.buffer_font_size(cx)), } } } diff --git a/crates/ui/src/styles/units.rs b/crates/ui/src/styles/units.rs index c859b459c677e58c76019b7e25fa17bb9ab7422d..3fa65202045bb14a2e221a4cdd240b0f3561dd6c 100644 --- a/crates/ui/src/styles/units.rs +++ b/crates/ui/src/styles/units.rs @@ -10,8 +10,8 @@ pub const BASE_REM_SIZE_IN_PX: f32 = 16.; /// /// For instance, instead of writing `rems(0.875)` you can write `rems_from_px(14.)` #[inline(always)] -pub fn rems_from_px(px: f32) -> Rems { - rems(px / BASE_REM_SIZE_IN_PX) +pub fn rems_from_px(px: impl Into) -> Rems { + rems(px.into() / BASE_REM_SIZE_IN_PX) } /// Returns a [`Length`] corresponding to the specified percentage of the viewport's width. diff --git a/crates/ui/src/utils/apca_contrast.rs b/crates/ui/src/utils/apca_contrast.rs index 522dca3e91341adf9056b3d03e3b5536cfcdc695..341b44670d867072ef7f7ac10fba098128cdc8af 100644 --- a/crates/ui/src/utils/apca_contrast.rs +++ b/crates/ui/src/utils/apca_contrast.rs @@ -393,6 +393,13 @@ mod tests { ); } + #[test] + fn test_srgb_to_y_nan_issue() { + let dark_red = hsla_from_hex(0x5f0000); + let y_dark_red = srgb_to_y(dark_red, &APCAConstants::default()); + assert!(!y_dark_red.is_nan()); + } + #[test] fn test_ensure_minimum_contrast() { let white_bg = hsla(0.0, 0.0, 1.0, 1.0); diff --git a/crates/ui/src/utils/search_input.rs b/crates/ui/src/utils/search_input.rs index 0413e9d89a54daa27653ed902be452e0b0b24c8e..c677b203d5a9e567eda20b6f62d7220eae8b6f2c 100644 --- a/crates/ui/src/utils/search_input.rs +++ b/crates/ui/src/utils/search_input.rs @@ -1,20 +1,20 @@ -use gpui::Pixels; +use gpui::{Pixels, px}; pub struct SearchInputWidth; impl SearchInputWidth { /// The container size in which the input stops filling the whole width. - pub const THRESHOLD_WIDTH: f32 = 1200.0; + pub const THRESHOLD_WIDTH: Pixels = px(1200.0); /// The maximum width for the search input when the container is larger than the threshold. - pub const MAX_WIDTH: f32 = 1200.0; + pub const MAX_WIDTH: Pixels = px(1200.0); /// Calculates the actual width in pixels based on the container width. pub fn calc_width(container_width: Pixels) -> Pixels { - if container_width.0 < Self::THRESHOLD_WIDTH { + if container_width < Self::THRESHOLD_WIDTH { container_width } else { - Pixels(container_width.0.min(Self::MAX_WIDTH)) + container_width.min(Self::MAX_WIDTH) } } } diff --git a/crates/ui_input/Cargo.toml b/crates/ui_input/Cargo.toml index 0f337597f0fbac925d2cc2a41fdf6a07ebf831b1..0f107e42c382d55c2e2d6725336bc3af569a222d 100644 --- a/crates/ui_input/Cargo.toml +++ b/crates/ui_input/Cargo.toml @@ -14,7 +14,10 @@ path = "src/ui_input.rs" [dependencies] component.workspace = true editor.workspace = true +fuzzy.workspace = true gpui.workspace = true +menu.workspace = true +picker.workspace = true settings.workspace = true theme.workspace = true ui.workspace = true diff --git a/crates/ui_input/src/font_picker.rs b/crates/ui_input/src/font_picker.rs new file mode 100644 index 0000000000000000000000000000000000000000..7a79009efdf38ba81f8b165c62a51e7d7fd5d1dc --- /dev/null +++ b/crates/ui_input/src/font_picker.rs @@ -0,0 +1,181 @@ +use std::sync::Arc; + +use fuzzy::{StringMatch, StringMatchCandidate}; +use gpui::{AnyElement, App, Context, DismissEvent, SharedString, Task, Window}; +use picker::{Picker, PickerDelegate}; +use theme::FontFamilyCache; +use ui::{ListItem, ListItemSpacing, prelude::*}; + +type FontPicker = Picker; + +pub struct FontPickerDelegate { + fonts: Vec, + filtered_fonts: Vec, + selected_index: usize, + current_font: SharedString, + on_font_changed: Arc, +} + +impl FontPickerDelegate { + fn new( + current_font: SharedString, + on_font_changed: impl Fn(SharedString, &mut App) + 'static, + cx: &mut Context, + ) -> Self { + let font_family_cache = FontFamilyCache::global(cx); + + let fonts = font_family_cache + .try_list_font_families() + .unwrap_or_else(|| vec![current_font.clone()]); + let selected_index = fonts + .iter() + .position(|font| *font == current_font) + .unwrap_or(0); + + let filtered_fonts = fonts + .iter() + .enumerate() + .map(|(index, font)| StringMatch { + candidate_id: index, + string: font.to_string(), + positions: Vec::new(), + score: 0.0, + }) + .collect(); + + Self { + fonts, + filtered_fonts, + selected_index, + current_font, + on_font_changed: Arc::new(on_font_changed), + } + } +} + +impl PickerDelegate for FontPickerDelegate { + type ListItem = AnyElement; + + fn match_count(&self) -> usize { + self.filtered_fonts.len() + } + + fn selected_index(&self) -> usize { + self.selected_index + } + + fn set_selected_index(&mut self, ix: usize, _: &mut Window, cx: &mut Context) { + self.selected_index = ix.min(self.filtered_fonts.len().saturating_sub(1)); + cx.notify(); + } + + fn placeholder_text(&self, _window: &mut Window, _cx: &mut App) -> Arc { + "Search fonts…".into() + } + + fn update_matches( + &mut self, + query: String, + _window: &mut Window, + cx: &mut Context, + ) -> Task<()> { + let fonts = self.fonts.clone(); + let current_font = self.current_font.clone(); + + let matches: Vec = if query.is_empty() { + fonts + .iter() + .enumerate() + .map(|(index, font)| StringMatch { + candidate_id: index, + string: font.to_string(), + positions: Vec::new(), + score: 0.0, + }) + .collect() + } else { + let _candidates: Vec = fonts + .iter() + .enumerate() + .map(|(id, font)| StringMatchCandidate::new(id, font.as_ref())) + .collect(); + + fonts + .iter() + .enumerate() + .filter(|(_, font)| font.to_lowercase().contains(&query.to_lowercase())) + .map(|(index, font)| StringMatch { + candidate_id: index, + string: font.to_string(), + positions: Vec::new(), + score: 0.0, + }) + .collect() + }; + + let selected_index = if query.is_empty() { + fonts + .iter() + .position(|font| *font == current_font) + .unwrap_or(0) + } else { + matches + .iter() + .position(|m| fonts[m.candidate_id] == current_font) + .unwrap_or(0) + }; + + self.filtered_fonts = matches; + self.selected_index = selected_index; + cx.notify(); + + Task::ready(()) + } + + fn confirm(&mut self, _secondary: bool, _window: &mut Window, cx: &mut Context) { + if let Some(font_match) = self.filtered_fonts.get(self.selected_index) { + let font = font_match.string.clone(); + (self.on_font_changed)(font.into(), cx); + } + } + + fn dismissed(&mut self, window: &mut Window, cx: &mut Context) { + cx.defer_in(window, |picker, window, cx| { + picker.set_query("", window, cx); + }); + cx.emit(DismissEvent); + } + + fn render_match( + &self, + ix: usize, + selected: bool, + _window: &mut Window, + _cx: &mut Context, + ) -> Option { + let font_match = self.filtered_fonts.get(ix)?; + + Some( + ListItem::new(ix) + .inset(true) + .spacing(ListItemSpacing::Sparse) + .toggle_state(selected) + .child(Label::new(font_match.string.clone())) + .into_any_element(), + ) + } +} + +pub fn font_picker( + current_font: SharedString, + on_font_changed: impl Fn(SharedString, &mut App) + 'static, + window: &mut Window, + cx: &mut Context, +) -> FontPicker { + let delegate = FontPickerDelegate::new(current_font, on_font_changed, cx); + + Picker::uniform_list(delegate, window, cx) + .show_scrollbar(true) + .width(rems_from_px(210.)) + .max_height(Some(rems(18.).into())) +} diff --git a/crates/ui_input/src/number_field.rs b/crates/ui_input/src/number_field.rs new file mode 100644 index 0000000000000000000000000000000000000000..b3f50584d69d9adc965028400c26fa68074b9b84 --- /dev/null +++ b/crates/ui_input/src/number_field.rs @@ -0,0 +1,567 @@ +use std::{ + fmt::Display, + num::{NonZero, NonZeroU32, NonZeroU64}, + rc::Rc, + str::FromStr, +}; + +use editor::{Editor, EditorStyle}; +use gpui::{ClickEvent, Entity, FocusHandle, Focusable, FontWeight, Modifiers}; + +use settings::{CodeFade, MinimumContrast}; +use ui::prelude::*; + +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] +pub enum NumberFieldMode { + #[default] + Read, + Edit, +} + +pub trait NumberFieldType: Display + Copy + Clone + Sized + PartialOrd + FromStr + 'static { + fn default_format(value: &Self) -> String { + format!("{}", value) + } + fn default_step() -> Self; + fn large_step() -> Self; + fn small_step() -> Self; + fn min_value() -> Self; + fn max_value() -> Self; + fn saturating_add(self, rhs: Self) -> Self; + fn saturating_sub(self, rhs: Self) -> Self; +} + +impl NumberFieldType for gpui::FontWeight { + fn default_step() -> Self { + FontWeight(10.0) + } + fn large_step() -> Self { + FontWeight(50.0) + } + fn small_step() -> Self { + FontWeight(5.0) + } + fn min_value() -> Self { + gpui::FontWeight::THIN + } + fn max_value() -> Self { + gpui::FontWeight::BLACK + } + fn saturating_add(self, rhs: Self) -> Self { + FontWeight((self.0 + rhs.0).min(Self::max_value().0)) + } + fn saturating_sub(self, rhs: Self) -> Self { + FontWeight((self.0 - rhs.0).max(Self::min_value().0)) + } +} + +impl NumberFieldType for settings::CodeFade { + fn default_step() -> Self { + CodeFade(0.10) + } + fn large_step() -> Self { + CodeFade(0.20) + } + fn small_step() -> Self { + CodeFade(0.05) + } + fn min_value() -> Self { + CodeFade(0.0) + } + fn max_value() -> Self { + CodeFade(0.9) + } + fn saturating_add(self, rhs: Self) -> Self { + CodeFade((self.0 + rhs.0).min(Self::max_value().0)) + } + fn saturating_sub(self, rhs: Self) -> Self { + CodeFade((self.0 - rhs.0).max(Self::min_value().0)) + } +} + +impl NumberFieldType for settings::MinimumContrast { + fn default_step() -> Self { + MinimumContrast(1.0) + } + fn large_step() -> Self { + MinimumContrast(10.0) + } + fn small_step() -> Self { + MinimumContrast(0.5) + } + fn min_value() -> Self { + MinimumContrast(0.0) + } + fn max_value() -> Self { + MinimumContrast(106.0) + } + fn saturating_add(self, rhs: Self) -> Self { + MinimumContrast((self.0 + rhs.0).min(Self::max_value().0)) + } + fn saturating_sub(self, rhs: Self) -> Self { + MinimumContrast((self.0 - rhs.0).max(Self::min_value().0)) + } +} + +macro_rules! impl_numeric_stepper_int { + ($type:ident) => { + impl NumberFieldType for $type { + fn default_step() -> Self { + 1 + } + + fn large_step() -> Self { + 10 + } + + fn small_step() -> Self { + 1 + } + + fn min_value() -> Self { + <$type>::MIN + } + + fn max_value() -> Self { + <$type>::MAX + } + + fn saturating_add(self, rhs: Self) -> Self { + self.saturating_add(rhs) + } + + fn saturating_sub(self, rhs: Self) -> Self { + self.saturating_sub(rhs) + } + } + }; +} + +macro_rules! impl_numeric_stepper_nonzero_int { + ($nonzero:ty, $inner:ty) => { + impl NumberFieldType for $nonzero { + fn default_step() -> Self { + <$nonzero>::new(1).unwrap() + } + + fn large_step() -> Self { + <$nonzero>::new(10).unwrap() + } + + fn small_step() -> Self { + <$nonzero>::new(1).unwrap() + } + + fn min_value() -> Self { + <$nonzero>::MIN + } + + fn max_value() -> Self { + <$nonzero>::MAX + } + + fn saturating_add(self, rhs: Self) -> Self { + let result = self.get().saturating_add(rhs.get()); + <$nonzero>::new(result.max(1)).unwrap() + } + + fn saturating_sub(self, rhs: Self) -> Self { + let result = self.get().saturating_sub(rhs.get()).max(1); + <$nonzero>::new(result).unwrap() + } + } + }; +} + +macro_rules! impl_numeric_stepper_float { + ($type:ident) => { + impl NumberFieldType for $type { + fn default_format(value: &Self) -> String { + format!("{:.2}", value) + } + + fn default_step() -> Self { + 1.0 + } + + fn large_step() -> Self { + 10.0 + } + + fn small_step() -> Self { + 0.1 + } + + fn min_value() -> Self { + <$type>::MIN + } + + fn max_value() -> Self { + <$type>::MAX + } + + fn saturating_add(self, rhs: Self) -> Self { + (self + rhs).clamp(Self::min_value(), Self::max_value()) + } + + fn saturating_sub(self, rhs: Self) -> Self { + (self - rhs).clamp(Self::min_value(), Self::max_value()) + } + } + }; +} + +impl_numeric_stepper_float!(f32); +impl_numeric_stepper_float!(f64); +impl_numeric_stepper_int!(isize); +impl_numeric_stepper_int!(usize); +impl_numeric_stepper_int!(i32); +impl_numeric_stepper_int!(u32); +impl_numeric_stepper_int!(i64); +impl_numeric_stepper_int!(u64); + +impl_numeric_stepper_nonzero_int!(NonZeroU32, u32); +impl_numeric_stepper_nonzero_int!(NonZeroU64, u64); +impl_numeric_stepper_nonzero_int!(NonZero, usize); + +#[derive(RegisterComponent)] +pub struct NumberField { + id: ElementId, + value: T, + focus_handle: FocusHandle, + mode: Entity, + format: Box String>, + large_step: T, + small_step: T, + step: T, + min_value: T, + max_value: T, + on_reset: Option>, + on_change: Rc, + tab_index: Option, +} + +impl NumberField { + pub fn new(id: impl Into, value: T, window: &mut Window, cx: &mut App) -> Self { + let id = id.into(); + + let (mode, focus_handle) = window.with_id(id.clone(), |window| { + let mode = window.use_state(cx, |_, _| NumberFieldMode::default()); + let focus_handle = window.use_state(cx, |_, cx| cx.focus_handle()); + (mode, focus_handle) + }); + + Self { + id, + mode, + value, + focus_handle: focus_handle.read(cx).clone(), + format: Box::new(T::default_format), + large_step: T::large_step(), + step: T::default_step(), + small_step: T::small_step(), + min_value: T::min_value(), + max_value: T::max_value(), + on_reset: None, + on_change: Rc::new(|_, _, _| {}), + tab_index: None, + } + } + + pub fn format(mut self, format: impl FnOnce(&T) -> String + 'static) -> Self { + self.format = Box::new(format); + self + } + + pub fn small_step(mut self, step: T) -> Self { + self.small_step = step; + self + } + + pub fn normal_step(mut self, step: T) -> Self { + self.step = step; + self + } + + pub fn large_step(mut self, step: T) -> Self { + self.large_step = step; + self + } + + pub fn min(mut self, min: T) -> Self { + self.min_value = min; + self + } + + pub fn max(mut self, max: T) -> Self { + self.max_value = max; + self + } + + pub fn on_reset( + mut self, + on_reset: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static, + ) -> Self { + self.on_reset = Some(Box::new(on_reset)); + self + } + + pub fn tab_index(mut self, tab_index: isize) -> Self { + self.tab_index = Some(tab_index); + self + } + + pub fn on_change(mut self, on_change: impl Fn(&T, &mut Window, &mut App) + 'static) -> Self { + self.on_change = Rc::new(on_change); + self + } +} + +impl IntoElement for NumberField { + type Element = gpui::Component; + + fn into_element(self) -> Self::Element { + gpui::Component::new(self) + } +} + +impl RenderOnce for NumberField { + fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement { + let mut tab_index = self.tab_index; + + let get_step = { + let large_step = self.large_step; + let step = self.step; + let small_step = self.small_step; + move |modifiers: Modifiers| -> T { + if modifiers.shift { + large_step + } else if modifiers.alt { + small_step + } else { + step + } + } + }; + + let bg_color = cx.theme().colors().surface_background; + let hover_bg_color = cx.theme().colors().element_hover; + + let border_color = cx.theme().colors().border_variant; + let focus_border_color = cx.theme().colors().border_focused; + + let base_button = |icon: IconName| { + h_flex() + .cursor_pointer() + .p_1p5() + .size_full() + .justify_center() + .overflow_hidden() + .border_1() + .border_color(border_color) + .bg(bg_color) + .hover(|s| s.bg(hover_bg_color)) + .focus(|s| s.border_color(focus_border_color).bg(hover_bg_color)) + .child(Icon::new(icon).size(IconSize::Small)) + }; + + h_flex() + .id(self.id.clone()) + .track_focus(&self.focus_handle) + .gap_1() + .when_some(self.on_reset, |this, on_reset| { + this.child( + IconButton::new("reset", IconName::RotateCcw) + .icon_size(IconSize::Small) + .when_some(tab_index.as_mut(), |this, tab_index| { + *tab_index += 1; + this.tab_index(*tab_index - 1) + }) + .on_click(on_reset), + ) + }) + .child( + h_flex() + .map(|decrement| { + let decrement_handler = { + let value = self.value; + let on_change = self.on_change.clone(); + let min = self.min_value; + move |click: &ClickEvent, window: &mut Window, cx: &mut App| { + let step = get_step(click.modifiers()); + let new_value = value.saturating_sub(step); + let new_value = if new_value < min { min } else { new_value }; + on_change(&new_value, window, cx); + window.focus_prev(); + } + }; + + decrement.child( + base_button(IconName::Dash) + .id("decrement_button") + .rounded_tl_sm() + .rounded_bl_sm() + .tab_index( + tab_index + .as_mut() + .map(|tab_index| { + *tab_index += 1; + *tab_index - 1 + }) + .unwrap_or(0), + ) + .on_click(decrement_handler), + ) + }) + .child( + h_flex() + .min_w_16() + .size_full() + .border_y_1() + .border_color(border_color) + .bg(bg_color) + .in_focus(|this| this.border_color(focus_border_color)) + .child(match *self.mode.read(cx) { + NumberFieldMode::Read => h_flex() + .px_1() + .flex_1() + .justify_center() + .child(Label::new((self.format)(&self.value))) + .into_any_element(), + // Edit mode is disabled until we implement center text alignment for editor + // mode.write(cx, NumberFieldMode::Edit); + // + // When we get to making Edit mode work, we shouldn't even focus the decrement/increment buttons. + // Focus should go instead straight to the editor, avoiding any double-step focus. + // In this world, the buttons become a mouse-only interaction, given users should be able + // to do everything they'd do with the buttons straight in the editor anyway. + NumberFieldMode::Edit => h_flex() + .flex_1() + .child(window.use_state(cx, { + |window, cx| { + let previous_focus_handle = window.focused(cx); + let mut editor = Editor::single_line(window, cx); + let mut style = EditorStyle::default(); + style.text.text_align = gpui::TextAlign::Right; + editor.set_style(style, window, cx); + + editor.set_text(format!("{}", self.value), window, cx); + cx.on_focus_out(&editor.focus_handle(cx), window, { + let mode = self.mode.clone(); + let min = self.min_value; + let max = self.max_value; + let on_change = self.on_change.clone(); + move |this, _, window, cx| { + if let Ok(new_value) = + this.text(cx).parse::() + { + let new_value = if new_value < min { + min + } else if new_value > max { + max + } else { + new_value + }; + + if let Some(previous) = + previous_focus_handle.as_ref() + { + window.focus(previous); + } + on_change(&new_value, window, cx); + }; + mode.write(cx, NumberFieldMode::Read); + } + }) + .detach(); + + window.focus(&editor.focus_handle(cx)); + + editor + } + })) + .on_action::({ + move |_, window, _| { + window.blur(); + } + }) + .into_any_element(), + }), + ) + .map(|increment| { + let increment_handler = { + let value = self.value; + let on_change = self.on_change.clone(); + let max = self.max_value; + move |click: &ClickEvent, window: &mut Window, cx: &mut App| { + let step = get_step(click.modifiers()); + let new_value = value.saturating_add(step); + let new_value = if new_value > max { max } else { new_value }; + on_change(&new_value, window, cx); + } + }; + + increment.child( + base_button(IconName::Plus) + .id("increment_button") + .rounded_tr_sm() + .rounded_br_sm() + .tab_index( + tab_index + .as_mut() + .map(|tab_index| { + *tab_index += 1; + *tab_index - 1 + }) + .unwrap_or(0), + ) + .on_click(increment_handler), + ) + }), + ) + } +} + +impl Component for NumberField { + fn scope() -> ComponentScope { + ComponentScope::Input + } + + fn name() -> &'static str { + "Number Field" + } + + fn sort_name() -> &'static str { + Self::name() + } + + fn description() -> Option<&'static str> { + Some("A numeric input element with increment and decrement buttons.") + } + + fn preview(window: &mut Window, cx: &mut App) -> Option { + let stepper_example = window.use_state(cx, |_, _| 100.0); + + Some( + v_flex() + .gap_6() + .children(vec![single_example( + "Default Numeric Stepper", + NumberField::new( + "numeric-stepper-component-preview", + *stepper_example.read(cx), + window, + cx, + ) + .on_change({ + let stepper_example = stepper_example.clone(); + move |value, _, cx| stepper_example.write(cx, *value) + }) + .min(1.0) + .max(100.0) + .into_any_element(), + )]) + .into_any_element(), + ) + } +} diff --git a/crates/ui_input/src/ui_input.rs b/crates/ui_input/src/ui_input.rs index 86a569b53200cc5ef3ed144841e76cecd94ef94e..56f0626f0a502c2bbf5471491441f69e7820e86e 100644 --- a/crates/ui_input/src/ui_input.rs +++ b/crates/ui_input/src/ui_input.rs @@ -4,11 +4,16 @@ //! //! It can't be located in the `ui` crate because it depends on `editor`. //! +mod font_picker; +mod number_field; use component::{example_group, single_example}; use editor::{Editor, EditorElement, EditorStyle}; -use gpui::{App, Entity, FocusHandle, Focusable, FontStyle, Hsla, TextStyle}; +pub use font_picker::*; +use gpui::{App, Entity, FocusHandle, Focusable, FontStyle, Hsla, Length, TextStyle}; +pub use number_field::*; use settings::Settings; +use std::sync::Arc; use theme::ThemeSettings; use ui::prelude::*; @@ -41,6 +46,8 @@ pub struct SingleLineInput { start_icon: Option, /// Whether the text field is disabled. disabled: bool, + /// The minimum width of for the input + min_width: Length, } impl Focusable for SingleLineInput { @@ -66,6 +73,7 @@ impl SingleLineInput { editor, start_icon: None, disabled: false, + min_width: px(192.).into(), } } @@ -84,6 +92,11 @@ impl SingleLineInput { self } + pub fn label_min_width(mut self, width: impl Into) -> Self { + self.min_width = width.into(); + self + } + pub fn set_disabled(&mut self, disabled: bool, cx: &mut Context) { self.disabled = disabled; self.editor @@ -101,6 +114,11 @@ impl SingleLineInput { pub fn text(&self, cx: &App) -> String { self.editor().read(cx).text(cx) } + + pub fn set_text(&self, text: impl Into>, window: &mut Window, cx: &mut App) { + self.editor() + .update(cx, |editor, cx| editor.set_text(text, window, cx)) + } } impl Render for SingleLineInput { @@ -161,7 +179,7 @@ impl Render for SingleLineInput { }) .child( h_flex() - .min_w_48() + .min_w(self.min_width) .min_h_8() .w_full() .px_2() diff --git a/crates/ui_macros/src/derive_register_component.rs b/crates/ui_macros/src/derive_register_component.rs index 27248e2aacdee89757ee1cce1dbd42360a155cd7..64ab132cc01748f0899a788534e65a9129dc2712 100644 --- a/crates/ui_macros/src/derive_register_component.rs +++ b/crates/ui_macros/src/derive_register_component.rs @@ -4,6 +4,7 @@ use syn::{DeriveInput, parse_macro_input}; pub fn derive_register_component(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); + let name = input.ident; let register_fn_name = syn::Ident::new( &format!("__component_registry_internal_register_{}", name), diff --git a/crates/ui_macros/src/dynamic_spacing.rs b/crates/ui_macros/src/dynamic_spacing.rs index bd7c72e90eda94508e627781043bb23b63ba576a..15ba3e241ec43d02b83e4143eb620505a0a2f02e 100644 --- a/crates/ui_macros/src/dynamic_spacing.rs +++ b/crates/ui_macros/src/dynamic_spacing.rs @@ -66,9 +66,9 @@ pub fn derive_spacing(input: TokenStream) -> TokenStream { let n = n.base10_parse::().unwrap(); quote! { DynamicSpacing::#variant => match ThemeSettings::get_global(cx).ui_density { - UiDensity::Compact => (#n - 4.0).max(0.0) / BASE_REM_SIZE_IN_PX, - UiDensity::Default => #n / BASE_REM_SIZE_IN_PX, - UiDensity::Comfortable => (#n + 4.0) / BASE_REM_SIZE_IN_PX, + ::theme::UiDensity::Compact => (#n - 4.0).max(0.0) / BASE_REM_SIZE_IN_PX, + ::theme::UiDensity::Default => #n / BASE_REM_SIZE_IN_PX, + ::theme::UiDensity::Comfortable => (#n + 4.0) / BASE_REM_SIZE_IN_PX, } } } @@ -78,9 +78,9 @@ pub fn derive_spacing(input: TokenStream) -> TokenStream { let c = c.base10_parse::().unwrap(); quote! { DynamicSpacing::#variant => match ThemeSettings::get_global(cx).ui_density { - UiDensity::Compact => #a / BASE_REM_SIZE_IN_PX, - UiDensity::Default => #b / BASE_REM_SIZE_IN_PX, - UiDensity::Comfortable => #c / BASE_REM_SIZE_IN_PX, + ::theme::UiDensity::Compact => #a / BASE_REM_SIZE_IN_PX, + ::theme::UiDensity::Default => #b / BASE_REM_SIZE_IN_PX, + ::theme::UiDensity::Comfortable => #c / BASE_REM_SIZE_IN_PX, } } } diff --git a/crates/ui_prompt/src/ui_prompt.rs b/crates/ui_prompt/src/ui_prompt.rs index fe6dc5b3f4afc6d2d0097292555baaea4f077642..3b2716fd92ea7889668767d66e47e5c43792f39e 100644 --- a/crates/ui_prompt/src/ui_prompt.rs +++ b/crates/ui_prompt/src/ui_prompt.rs @@ -1,16 +1,12 @@ use gpui::{ - App, AppContext as _, Context, Entity, EventEmitter, FocusHandle, Focusable, FontWeight, - InteractiveElement, IntoElement, ParentElement, PromptButton, PromptHandle, PromptLevel, - PromptResponse, Refineable, Render, RenderablePromptHandle, SharedString, Styled, - TextStyleRefinement, Window, div, + App, Entity, EventEmitter, FocusHandle, Focusable, PromptButton, PromptHandle, PromptLevel, + PromptResponse, RenderablePromptHandle, SharedString, TextStyleRefinement, Window, div, + prelude::*, }; use markdown::{Markdown, MarkdownElement, MarkdownStyle}; use settings::{Settings, SettingsStore}; use theme::ThemeSettings; -use ui::{ - ActiveTheme, ButtonCommon, ButtonStyle, Clickable, ElevationIndex, FluentBuilder, LabelSize, - StyledExt, TintColor, h_flex, v_flex, -}; +use ui::{FluentBuilder, TintColor, prelude::*}; use workspace::WorkspaceSettings; pub fn init(cx: &mut App) { @@ -92,11 +88,7 @@ impl ZedPromptRenderer { } fn select_next(&mut self, _: &menu::SelectNext, _window: &mut Window, cx: &mut Context) { - if self.active_action_id > 0 { - self.active_action_id -= 1; - } else { - self.active_action_id = self.actions.len().saturating_sub(1); - } + self.active_action_id = (self.active_action_id + 1) % self.actions.len(); cx.notify(); } @@ -106,7 +98,11 @@ impl ZedPromptRenderer { _window: &mut Window, cx: &mut Context, ) { - self.active_action_id = (self.active_action_id + 1) % self.actions.len(); + if self.active_action_id > 0 { + self.active_action_id -= 1; + } else { + self.active_action_id = self.actions.len().saturating_sub(1); + } cx.notify(); } } @@ -114,8 +110,8 @@ impl ZedPromptRenderer { impl Render for ZedPromptRenderer { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { let settings = ThemeSettings::get_global(cx); - let font_size = settings.ui_font_size(cx).into(); - let prompt = v_flex() + + let dialog = v_flex() .key_context("Prompt") .cursor_default() .track_focus(&self.focus) @@ -125,96 +121,81 @@ impl Render for ZedPromptRenderer { .on_action(cx.listener(Self::select_previous)) .on_action(cx.listener(Self::select_first)) .on_action(cx.listener(Self::select_last)) - .elevation_3(cx) - .w_72() - .overflow_hidden() + .w_80() .p_4() .gap_4() + .elevation_3(cx) + .overflow_hidden() .font_family(settings.ui_font.family.clone()) - .child( - div() - .w_full() - .child(MarkdownElement::new(self.message.clone(), { - let mut base_text_style = window.text_style(); - base_text_style.refine(&TextStyleRefinement { - font_family: Some(settings.ui_font.family.clone()), - font_size: Some(font_size), - font_weight: Some(FontWeight::BOLD), - color: Some(ui::Color::Default.color(cx)), - ..Default::default() - }); - MarkdownStyle { - base_text_style, - selection_background_color: cx - .theme() - .colors() - .element_selection_background, - ..Default::default() - } - })), - ) + .child(div().w_full().child(MarkdownElement::new( + self.message.clone(), + markdown_style(true, window, cx), + ))) .children(self.detail.clone().map(|detail| { - div() - .w_full() - .text_xs() - .child(MarkdownElement::new(detail, { - let mut base_text_style = window.text_style(); - base_text_style.refine(&TextStyleRefinement { - font_family: Some(settings.ui_font.family.clone()), - font_size: Some(font_size), - color: Some(ui::Color::Muted.color(cx)), - ..Default::default() - }); - MarkdownStyle { - base_text_style, - selection_background_color: cx - .theme() - .colors() - .element_selection_background, - ..Default::default() - } - })) + div().w_full().text_xs().child(MarkdownElement::new( + detail, + markdown_style(false, window, cx), + )) })) - .child(h_flex().justify_end().gap_2().children( - self.actions.iter().enumerate().rev().map(|(ix, action)| { - ui::Button::new(ix, action.clone()) - .label_size(LabelSize::Large) - .style(ButtonStyle::Filled) - .when(ix == self.active_action_id, |el| { - el.style(ButtonStyle::Tinted(TintColor::Accent)) - }) - .layer(ElevationIndex::ModalSurface) - .on_click(cx.listener(move |_, _, _window, cx| { - cx.emit(PromptResponse(ix)); - })) - }), - )); + .child( + v_flex() + .gap_1() + .children(self.actions.iter().enumerate().map(|(ix, action)| { + Button::new(ix, action.clone()) + .full_width() + .style(ButtonStyle::Outlined) + .when(ix == self.active_action_id, |s| { + s.style(ButtonStyle::Tinted(TintColor::Accent)) + }) + .tab_index(ix as isize) + .on_click(cx.listener(move |_, _, _window, cx| { + cx.emit(PromptResponse(ix)); + })) + })), + ); div() .size_full() .occlude() .bg(gpui::black().opacity(0.2)) .child( - div() + v_flex() .size_full() .absolute() .top_0() .left_0() - .flex() - .flex_col() - .justify_around() - .child( - div() - .w_full() - .flex() - .flex_row() - .justify_around() - .child(prompt), - ), + .items_center() + .justify_center() + .child(dialog), ) } } +fn markdown_style(main_message: bool, window: &Window, cx: &App) -> MarkdownStyle { + let mut base_text_style = window.text_style(); + let settings = ThemeSettings::get_global(cx); + let font_size = settings.ui_font_size(cx).into(); + + let color = if main_message { + Color::Default.color(cx) + } else { + Color::Muted.color(cx) + }; + + base_text_style.refine(&TextStyleRefinement { + font_family: Some(settings.ui_font.family.clone()), + font_size: Some(font_size), + color: Some(color), + ..Default::default() + }); + + MarkdownStyle { + base_text_style, + selection_background_color: cx.theme().colors().element_selection_background, + ..Default::default() + } +} + impl EventEmitter for ZedPromptRenderer {} impl Focusable for ZedPromptRenderer { diff --git a/crates/util/Cargo.toml b/crates/util/Cargo.toml index 825d6471b2d0585803d2f5567eadef11ffdc9d1b..da500edd1bd6bfcb608804468fdc56c56c35395f 100644 --- a/crates/util/Cargo.toml +++ b/crates/util/Cargo.toml @@ -1,9 +1,11 @@ [package] -name = "util" +name = "zed-util" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "A collection of utility structs and functions used by Zed and GPUI" + [lints] workspace = true @@ -21,6 +23,7 @@ async-fs.workspace = true async_zip.workspace = true collections.workspace = true dirs.workspace = true +dunce = "1.0" futures-lite.workspace = true futures.workspace = true git2 = { workspace = true, optional = true } @@ -41,6 +44,7 @@ tempfile.workspace = true unicase.workspace = true util_macros = { workspace = true, optional = true } walkdir.workspace = true +which.workspace = true workspace-hack.workspace = true [target.'cfg(unix)'.dependencies] @@ -50,10 +54,10 @@ nix = { workspace = true, features = ["user"] } [target.'cfg(windows)'.dependencies] tendril = "0.4.3" -dunce = "1.0" [dev-dependencies] git2.workspace = true indoc.workspace = true rand.workspace = true util_macros.workspace = true +pretty_assertions.workspace = true diff --git a/crates/util/src/paths.rs b/crates/util/src/paths.rs index 1658052e6f4894b54c83fecf29e729959c9cfe6e..d31828eb568978fdcddbf1030badb5911c730004 100644 --- a/crates/util/src/paths.rs +++ b/crates/util/src/paths.rs @@ -1,7 +1,10 @@ +use anyhow::Context; use globset::{Glob, GlobSet, GlobSetBuilder}; +use itertools::Itertools; use regex::Regex; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; +use std::error::Error; use std::fmt::{Display, Formatter}; use std::mem; use std::path::StripPrefixError; @@ -12,6 +15,8 @@ use std::{ sync::LazyLock, }; +use crate::rel_path::RelPath; + static HOME_DIR: OnceLock = OnceLock::new(); /// Returns the path to the user's home directory. @@ -31,17 +36,20 @@ pub fn home_dir() -> &'static PathBuf { }) } -#[cfg(any(test, feature = "test-support"))] -pub fn set_home_dir(path: PathBuf) { - HOME_DIR - .set(path) - .expect("set_home_dir called after home_dir was already accessed"); -} - pub trait PathExt { + /// Compacts a given file path by replacing the user's home directory + /// prefix with a tilde (`~`). + /// + /// # Returns + /// + /// * A `PathBuf` containing the compacted file path. If the input path + /// does not have the user's home directory prefix, or if we are not on + /// Linux or macOS, the original path is returned unchanged. fn compact(&self) -> PathBuf; + + /// Returns a file's extension or, if the file is hidden, its name without the leading dot fn extension_or_hidden_file_name(&self) -> Option<&str>; - fn to_sanitized_string(&self) -> String; + fn try_from_bytes<'a>(bytes: &'a [u8]) -> anyhow::Result where Self: From<&'a Path>, @@ -53,7 +61,6 @@ pub trait PathExt { } #[cfg(windows)] { - use anyhow::Context as _; use tendril::fmt::{Format, WTF8}; WTF8::validate(bytes) .then(|| { @@ -65,17 +72,24 @@ pub trait PathExt { .with_context(|| format!("Invalid WTF-8 sequence: {bytes:?}")) } } -} -impl> PathExt for T { - /// Compacts a given file path by replacing the user's home directory - /// prefix with a tilde (`~`). + /// Converts a local path to one that can be used inside of WSL. + /// Returns `None` if the path cannot be converted into a WSL one (network share). + fn local_to_wsl(&self) -> Option; + + /// Returns a file's "full" joined collection of extensions, in the case where a file does not + /// just have a singular extension but instead has multiple (e.g File.tar.gz, Component.stories.tsx) /// - /// # Returns + /// Will provide back the extensions joined together such as tar.gz or stories.tsx + fn multiple_extensions(&self) -> Option; + + /// Try to make a shell-safe representation of the path. /// - /// * A `PathBuf` containing the compacted file path. If the input path - /// does not have the user's home directory prefix, or if we are not on - /// Linux or macOS, the original path is returned unchanged. + /// For Unix, the path is escaped to be safe for POSIX shells + fn try_shell_safe(&self) -> anyhow::Result; +} + +impl> PathExt for T { fn compact(&self) -> PathBuf { if cfg!(any(target_os = "linux", target_os = "freebsd")) || cfg!(target_os = "macos") { match self.as_ref().strip_prefix(home_dir().as_path()) { @@ -92,7 +106,6 @@ impl> PathExt for T { } } - /// Returns a file's extension or, if the file is hidden, its name without the leading dot fn extension_or_hidden_file_name(&self) -> Option<&str> { let path = self.as_ref(); let file_name = path.file_name()?.to_str()?; @@ -105,19 +118,96 @@ impl> PathExt for T { .or_else(|| path.file_stem()?.to_str()) } - /// Returns a sanitized string representation of the path. - /// Note, on Windows, this assumes that the path is a valid UTF-8 string and - /// is not a UNC path. - fn to_sanitized_string(&self) -> String { + fn local_to_wsl(&self) -> Option { + // quite sketchy to convert this back to path at the end, but a lot of functions only accept paths + // todo: ideally rework them..? + let mut new_path = std::ffi::OsString::new(); + for component in self.as_ref().components() { + match component { + std::path::Component::Prefix(prefix) => { + let drive_letter = prefix.as_os_str().to_string_lossy().to_lowercase(); + let drive_letter = drive_letter.strip_suffix(':')?; + + new_path.push(format!("/mnt/{}", drive_letter)); + } + std::path::Component::RootDir => {} + std::path::Component::CurDir => { + new_path.push("/."); + } + std::path::Component::ParentDir => { + new_path.push("/.."); + } + std::path::Component::Normal(os_str) => { + new_path.push("/"); + new_path.push(os_str); + } + } + } + + Some(new_path.into()) + } + + fn multiple_extensions(&self) -> Option { + let path = self.as_ref(); + let file_name = path.file_name()?.to_str()?; + + let parts: Vec<&str> = file_name + .split('.') + // Skip the part with the file name extension + .skip(1) + .collect(); + + if parts.len() < 2 { + return None; + } + + Some(parts.into_iter().join(".")) + } + + fn try_shell_safe(&self) -> anyhow::Result { #[cfg(target_os = "windows")] { - self.as_ref().to_string_lossy().replace("/", "\\") + Ok(self.as_ref().to_string_lossy().to_string()) } + #[cfg(not(target_os = "windows"))] { - self.as_ref().to_string_lossy().to_string() + let path_str = self + .as_ref() + .to_str() + .with_context(|| "Path contains invalid UTF-8")?; + + // As of writing, this can only be fail if the path contains a null byte, which shouldn't be possible + // but shlex has annotated the error as #[non_exhaustive] so we can't make it a compile error if other + // errors are introduced in the future :( + Ok(shlex::try_quote(path_str)?.into_owned()) + } + } +} + +pub fn path_ends_with(base: &Path, suffix: &Path) -> bool { + strip_path_suffix(base, suffix).is_some() +} + +pub fn strip_path_suffix<'a>(base: &'a Path, suffix: &Path) -> Option<&'a Path> { + if let Some(remainder) = base + .as_os_str() + .as_encoded_bytes() + .strip_suffix(suffix.as_os_str().as_encoded_bytes()) + { + if remainder + .last() + .is_none_or(|last_byte| std::path::is_separator(*last_byte as char)) + { + let os_str = unsafe { + OsStr::from_encoded_bytes_unchecked( + &remainder[0..remainder.len().saturating_sub(1)], + ) + }; + return Some(Path::new(os_str)); } } + None } /// In memory, this is identical to `Path`. On non-Windows conversions to this type are no-ops. On @@ -199,17 +289,6 @@ impl SanitizedPath { pub fn to_path_buf(&self) -> PathBuf { self.0.to_path_buf() } - - pub fn to_glob_string(&self) -> String { - #[cfg(target_os = "windows")] - { - self.0.to_string_lossy().replace("/", "\\") - } - #[cfg(not(target_os = "windows"))] - { - self.0.to_string_lossy().to_string() - } - } } impl std::fmt::Debug for SanitizedPath { @@ -244,7 +323,7 @@ impl AsRef for SanitizedPath { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum PathStyle { Posix, Windows, @@ -252,83 +331,80 @@ pub enum PathStyle { impl PathStyle { #[cfg(target_os = "windows")] - pub const fn current() -> Self { + pub const fn local() -> Self { PathStyle::Windows } #[cfg(not(target_os = "windows"))] - pub const fn current() -> Self { + pub const fn local() -> Self { PathStyle::Posix } #[inline] - pub fn separator(&self) -> &str { + pub fn separator(&self) -> &'static str { match self { PathStyle::Posix => "/", PathStyle::Windows => "\\", } } + + pub fn is_windows(&self) -> bool { + *self == PathStyle::Windows + } + + pub fn join(self, left: impl AsRef, right: impl AsRef) -> Option { + let right = right.as_ref().to_str()?; + if is_absolute(right, self) { + return None; + } + let left = left.as_ref().to_str()?; + if left.is_empty() { + Some(right.into()) + } else { + Some(format!( + "{left}{}{right}", + if left.ends_with(self.separator()) { + "" + } else { + self.separator() + } + )) + } + } + + pub fn split(self, path_like: &str) -> (Option<&str>, &str) { + let Some(pos) = path_like.rfind(self.separator()) else { + return (None, path_like); + }; + let filename_start = pos + self.separator().len(); + ( + Some(&path_like[..filename_start]), + &path_like[filename_start..], + ) + } } #[derive(Debug, Clone)] pub struct RemotePathBuf { - inner: PathBuf, style: PathStyle, - string: String, // Cached string representation + string: String, } impl RemotePathBuf { - pub fn new(path: PathBuf, style: PathStyle) -> Self { - #[cfg(target_os = "windows")] - let string = match style { - PathStyle::Posix => path.to_string_lossy().replace('\\', "/"), - PathStyle::Windows => path.to_string_lossy().into(), - }; - #[cfg(not(target_os = "windows"))] - let string = match style { - PathStyle::Posix => path.to_string_lossy().to_string(), - PathStyle::Windows => path.to_string_lossy().replace('/', "\\"), - }; - Self { - inner: path, - style, - string, - } + pub fn new(string: String, style: PathStyle) -> Self { + Self { style, string } } pub fn from_str(path: &str, style: PathStyle) -> Self { - let path_buf = PathBuf::from(path); - Self::new(path_buf, style) - } - - #[cfg(target_os = "windows")] - pub fn to_proto(&self) -> String { - match self.path_style() { - PathStyle::Posix => self.to_string(), - PathStyle::Windows => self.inner.to_string_lossy().replace('\\', "/"), - } - } - - #[cfg(not(target_os = "windows"))] - pub fn to_proto(&self) -> String { - match self.path_style() { - PathStyle::Posix => self.inner.to_string_lossy().to_string(), - PathStyle::Windows => self.to_string(), - } - } - - pub fn as_path(&self) -> &Path { - &self.inner + Self::new(path.to_string(), style) } pub fn path_style(&self) -> PathStyle { self.style } - pub fn parent(&self) -> Option { - self.inner - .parent() - .map(|p| RemotePathBuf::new(p.to_path_buf(), self.style)) + pub fn to_proto(self) -> String { + self.string } } @@ -338,6 +414,95 @@ impl Display for RemotePathBuf { } } +pub fn is_absolute(path_like: &str, path_style: PathStyle) -> bool { + path_like.starts_with('/') + || path_style == PathStyle::Windows + && (path_like.starts_with('\\') + || path_like + .chars() + .next() + .is_some_and(|c| c.is_ascii_alphabetic()) + && path_like[1..] + .strip_prefix(':') + .is_some_and(|path| path.starts_with('/') || path.starts_with('\\'))) +} + +#[derive(Debug, PartialEq)] +#[non_exhaustive] +pub struct NormalizeError; + +impl Error for NormalizeError {} + +impl std::fmt::Display for NormalizeError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("parent reference `..` points outside of base directory") + } +} + +/// Copied from stdlib where it's unstable. +/// +/// Normalize a path, including `..` without traversing the filesystem. +/// +/// Returns an error if normalization would leave leading `..` components. +/// +///
+/// +/// This function always resolves `..` to the "lexical" parent. +/// That is "a/b/../c" will always resolve to `a/c` which can change the meaning of the path. +/// In particular, `a/c` and `a/b/../c` are distinct on many systems because `b` may be a symbolic link, so its parent isn't `a`. +/// +///
+/// +/// [`path::absolute`](absolute) is an alternative that preserves `..`. +/// Or [`Path::canonicalize`] can be used to resolve any `..` by querying the filesystem. +pub fn normalize_lexically(path: &Path) -> Result { + use std::path::Component; + + let mut lexical = PathBuf::new(); + let mut iter = path.components().peekable(); + + // Find the root, if any, and add it to the lexical path. + // Here we treat the Windows path "C:\" as a single "root" even though + // `components` splits it into two: (Prefix, RootDir). + let root = match iter.peek() { + Some(Component::ParentDir) => return Err(NormalizeError), + Some(p @ Component::RootDir) | Some(p @ Component::CurDir) => { + lexical.push(p); + iter.next(); + lexical.as_os_str().len() + } + Some(Component::Prefix(prefix)) => { + lexical.push(prefix.as_os_str()); + iter.next(); + if let Some(p @ Component::RootDir) = iter.peek() { + lexical.push(p); + iter.next(); + } + lexical.as_os_str().len() + } + None => return Ok(PathBuf::new()), + Some(Component::Normal(_)) => 0, + }; + + for component in iter { + match component { + Component::RootDir => unreachable!(), + Component::Prefix(_) => return Err(NormalizeError), + Component::CurDir => continue, + Component::ParentDir => { + // It's an error if ParentDir causes us to go above the "root". + if lexical.as_os_str().len() == root { + return Err(NormalizeError); + } else { + lexical.pop(); + } + } + Component::Normal(path) => lexical.push(path), + } + } + Ok(lexical) +} + /// A delimiter to use in `path_query:row_number:column_number` strings parsing. pub const FILE_ROW_COLUMN_DELIMITER: char = ':'; @@ -358,6 +523,8 @@ const ROW_COL_CAPTURE_REGEX: &str = r"(?xs) \:+(\d+)\:(\d+)\:*$ # filename:row:column | \:+(\d+)\:*()$ # filename:row + | + \:+()()$ )"; /// A representation of a path-like string with optional row and column numbers. @@ -391,7 +558,7 @@ impl PathWithPosition { /// # Examples /// /// ``` - /// # use util::paths::PathWithPosition; + /// # use zed_util::paths::PathWithPosition; /// # use std::path::PathBuf; /// assert_eq!(PathWithPosition::parse_str("test_file"), PathWithPosition { /// path: PathBuf::from("test_file"), @@ -422,7 +589,7 @@ impl PathWithPosition { /// /// # Expected parsing results when encounter ill-formatted inputs. /// ``` - /// # use util::paths::PathWithPosition; + /// # use zed_util::paths::PathWithPosition; /// # use std::path::PathBuf; /// assert_eq!(PathWithPosition::parse_str("test_file.rs:a"), PathWithPosition { /// path: PathBuf::from("test_file.rs:a"), @@ -434,8 +601,8 @@ impl PathWithPosition { /// row: None, /// column: None, /// }); - /// assert_eq!(PathWithPosition::parse_str("test_file.rs::"), PathWithPosition { - /// path: PathBuf::from("test_file.rs::"), + /// assert_eq!(PathWithPosition::parse_str("test_file.rs"), PathWithPosition { + /// path: PathBuf::from("test_file.rs"), /// row: None, /// column: None, /// }); @@ -566,10 +733,11 @@ impl PathWithPosition { } } -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug)] pub struct PathMatcher { sources: Vec, glob: GlobSet, + path_style: PathStyle, } // impl std::fmt::Display for PathMatcher { @@ -587,7 +755,10 @@ impl PartialEq for PathMatcher { impl Eq for PathMatcher {} impl PathMatcher { - pub fn new(globs: impl IntoIterator>) -> Result { + pub fn new( + globs: impl IntoIterator>, + path_style: PathStyle, + ) -> Result { let globs = globs .into_iter() .map(|as_str| Glob::new(as_str.as_ref())) @@ -598,7 +769,11 @@ impl PathMatcher { glob_builder.add(single_glob); } let glob = glob_builder.build()?; - Ok(PathMatcher { glob, sources }) + Ok(PathMatcher { + glob, + sources, + path_style, + }) } pub fn sources(&self) -> &[String] { @@ -616,7 +791,7 @@ impl PathMatcher { fn check_with_end_separator(&self, path: &Path) -> bool { let path_str = path.to_string_lossy(); - let separator = std::path::MAIN_SEPARATOR_STR; + let separator = self.path_style.separator(); if path_str.ends_with(separator) { false } else { @@ -625,6 +800,16 @@ impl PathMatcher { } } +impl Default for PathMatcher { + fn default() -> Self { + Self { + path_style: PathStyle::local(), + glob: GlobSet::empty(), + sources: vec![], + } + } +} + /// Custom character comparison that prioritizes lowercase for same letters fn compare_chars(a: char, b: char) -> Ordering { // First compare case-insensitive @@ -777,6 +962,81 @@ fn natural_sort(a: &str, b: &str) -> Ordering { } } } +pub fn compare_rel_paths( + (path_a, a_is_file): (&RelPath, bool), + (path_b, b_is_file): (&RelPath, bool), +) -> Ordering { + let mut components_a = path_a.components(); + let mut components_b = path_b.components(); + + fn stem_and_extension(filename: &str) -> (Option<&str>, Option<&str>) { + if filename.is_empty() { + return (None, None); + } + + match filename.rsplit_once('.') { + // Case 1: No dot was found. The entire name is the stem. + None => (Some(filename), None), + + // Case 2: A dot was found. + Some((before, after)) => { + // This is the crucial check for dotfiles like ".bashrc". + // If `before` is empty, the dot was the first character. + // In that case, we revert to the "whole name is the stem" logic. + if before.is_empty() { + (Some(filename), None) + } else { + // Otherwise, we have a standard stem and extension. + (Some(before), Some(after)) + } + } + } + } + loop { + match (components_a.next(), components_b.next()) { + (Some(component_a), Some(component_b)) => { + let a_is_file = a_is_file && components_a.rest().is_empty(); + let b_is_file = b_is_file && components_b.rest().is_empty(); + + let ordering = a_is_file.cmp(&b_is_file).then_with(|| { + let (a_stem, a_extension) = a_is_file + .then(|| stem_and_extension(component_a)) + .unwrap_or_default(); + let path_string_a = if a_is_file { a_stem } else { Some(component_a) }; + + let (b_stem, b_extension) = b_is_file + .then(|| stem_and_extension(component_b)) + .unwrap_or_default(); + let path_string_b = if b_is_file { b_stem } else { Some(component_b) }; + + let compare_components = match (path_string_a, path_string_b) { + (Some(a), Some(b)) => natural_sort(&a, &b), + (Some(_), None) => Ordering::Greater, + (None, Some(_)) => Ordering::Less, + (None, None) => Ordering::Equal, + }; + + compare_components.then_with(|| { + if a_is_file && b_is_file { + let ext_a = a_extension.unwrap_or_default(); + let ext_b = b_extension.unwrap_or_default(); + ext_a.cmp(ext_b) + } else { + Ordering::Equal + } + }) + }); + + if !ordering.is_eq() { + return ordering; + } + } + (Some(_), None) => break Ordering::Greater, + (None, Some(_)) => break Ordering::Less, + (None, None) => break Ordering::Equal, + } + } +} pub fn compare_paths( (path_a, a_is_file): (&Path, bool), @@ -840,8 +1100,9 @@ pub fn compare_paths( #[cfg(test)] mod tests { use super::*; + use util_macros::perf; - #[test] + #[perf] fn compare_paths_with_dots() { let mut paths = vec![ (Path::new("test_dirs"), false), @@ -879,7 +1140,7 @@ mod tests { ); } - #[test] + #[perf] fn compare_paths_with_same_name_different_extensions() { let mut paths = vec![ (Path::new("test_dirs/file.rs"), true), @@ -901,7 +1162,7 @@ mod tests { ); } - #[test] + #[perf] fn compare_paths_case_semi_sensitive() { let mut paths = vec![ (Path::new("test_DIRS"), false), @@ -933,7 +1194,7 @@ mod tests { ); } - #[test] + #[perf] fn path_with_position_parse_posix_path() { // Test POSIX filename edge cases // Read more at https://en.wikipedia.org/wiki/Filename @@ -977,7 +1238,7 @@ mod tests { assert_eq!( PathWithPosition::parse_str("test_file.rs:"), PathWithPosition { - path: PathBuf::from("test_file.rs:"), + path: PathBuf::from("test_file.rs"), row: None, column: None } @@ -1020,7 +1281,7 @@ mod tests { ); } - #[test] + #[perf] #[cfg(not(target_os = "windows"))] fn path_with_position_parse_posix_path_with_suffix() { assert_eq!( @@ -1076,7 +1337,7 @@ mod tests { ); } - #[test] + #[perf] #[cfg(target_os = "windows")] fn path_with_position_parse_windows_path() { assert_eq!( @@ -1098,7 +1359,7 @@ mod tests { ); } - #[test] + #[perf] #[cfg(target_os = "windows")] fn path_with_position_parse_windows_path_with_suffix() { assert_eq!( @@ -1211,10 +1472,10 @@ mod tests { ); } - #[test] + #[perf] fn test_path_compact() { let path: PathBuf = [ - home_dir().to_string_lossy().to_string(), + home_dir().to_string_lossy().into_owned(), "some_file.txt".to_string(), ] .iter() @@ -1226,7 +1487,7 @@ mod tests { } } - #[test] + #[perf] fn test_extension_or_hidden_file_name() { // No dots in name let path = Path::new("/a/b/c/file_name.rs"); @@ -1249,27 +1510,29 @@ mod tests { assert_eq!(path.extension_or_hidden_file_name(), Some("eslintrc.js")); } - #[test] + #[perf] fn edge_of_glob() { let path = Path::new("/work/node_modules"); - let path_matcher = PathMatcher::new(&["**/node_modules/**".to_owned()]).unwrap(); + let path_matcher = + PathMatcher::new(&["**/node_modules/**".to_owned()], PathStyle::Posix).unwrap(); assert!( path_matcher.is_match(path), "Path matcher should match {path:?}" ); } - #[test] + #[perf] fn project_search() { let path = Path::new("/Users/someonetoignore/work/zed/zed.dev/node_modules"); - let path_matcher = PathMatcher::new(&["**/node_modules/**".to_owned()]).unwrap(); + let path_matcher = + PathMatcher::new(&["**/node_modules/**".to_owned()], PathStyle::Posix).unwrap(); assert!( path_matcher.is_match(path), "Path matcher should match {path:?}" ); } - #[test] + #[perf] #[cfg(target_os = "windows")] fn test_sanitized_path() { let path = Path::new("C:\\Users\\someone\\test_file.rs"); @@ -1287,7 +1550,7 @@ mod tests { ); } - #[test] + #[perf] fn test_compare_numeric_segments() { // Helper function to create peekable iterators and test fn compare(a: &str, b: &str) -> Ordering { @@ -1355,7 +1618,7 @@ mod tests { assert_eq!(b_iter.collect::(), "def"); } - #[test] + #[perf] fn test_natural_sort() { // Basic alphanumeric assert_eq!(natural_sort("a", "b"), Ordering::Less); @@ -1409,7 +1672,7 @@ mod tests { assert_eq!(natural_sort("File_a1", "File_A1"), Ordering::Less); } - #[test] + #[perf] fn test_compare_paths() { // Helper function for cleaner tests fn compare(a: &str, is_a_file: bool, b: &str, is_b_file: bool) -> Ordering { @@ -1495,8 +1758,9 @@ mod tests { ); } - #[test] + #[perf] fn test_natural_sort_case_sensitivity() { + std::thread::sleep(std::time::Duration::from_millis(100)); // Same letter different case - lowercase should come first assert_eq!(natural_sort("a", "A"), Ordering::Less); assert_eq!(natural_sort("A", "a"), Ordering::Greater); @@ -1514,7 +1778,7 @@ mod tests { assert_eq!(natural_sort("a", "B"), Ordering::Less); } - #[test] + #[perf] fn test_natural_sort_with_numbers() { // Basic number ordering assert_eq!(natural_sort("file1", "file2"), Ordering::Less); @@ -1592,7 +1856,7 @@ mod tests { assert_eq!(natural_sort("file1", "File2"), Ordering::Less); } - #[test] + #[perf] fn test_natural_sort_edge_cases() { // Empty strings assert_eq!(natural_sort("", ""), Ordering::Equal); @@ -1617,4 +1881,54 @@ mod tests { assert_eq!(natural_sort("file-1.2", "file-1.10"), Ordering::Less); assert_eq!(natural_sort("file-1.10", "file-1.2"), Ordering::Greater); } + + #[test] + fn test_multiple_extensions() { + // No extensions + let path = Path::new("/a/b/c/file_name"); + assert_eq!(path.multiple_extensions(), None); + + // Only one extension + let path = Path::new("/a/b/c/file_name.tsx"); + assert_eq!(path.multiple_extensions(), None); + + // Stories sample extension + let path = Path::new("/a/b/c/file_name.stories.tsx"); + assert_eq!(path.multiple_extensions(), Some("stories.tsx".to_string())); + + // Longer sample extension + let path = Path::new("/a/b/c/long.app.tar.gz"); + assert_eq!(path.multiple_extensions(), Some("app.tar.gz".to_string())); + } + + #[test] + fn test_strip_path_suffix() { + let base = Path::new("/a/b/c/file_name"); + let suffix = Path::new("file_name"); + assert_eq!(strip_path_suffix(base, suffix), Some(Path::new("/a/b/c"))); + + let base = Path::new("/a/b/c/file_name.tsx"); + let suffix = Path::new("file_name.tsx"); + assert_eq!(strip_path_suffix(base, suffix), Some(Path::new("/a/b/c"))); + + let base = Path::new("/a/b/c/file_name.stories.tsx"); + let suffix = Path::new("c/file_name.stories.tsx"); + assert_eq!(strip_path_suffix(base, suffix), Some(Path::new("/a/b"))); + + let base = Path::new("/a/b/c/long.app.tar.gz"); + let suffix = Path::new("b/c/long.app.tar.gz"); + assert_eq!(strip_path_suffix(base, suffix), Some(Path::new("/a"))); + + let base = Path::new("/a/b/c/long.app.tar.gz"); + let suffix = Path::new("/a/b/c/long.app.tar.gz"); + assert_eq!(strip_path_suffix(base, suffix), Some(Path::new(""))); + + let base = Path::new("/a/b/c/long.app.tar.gz"); + let suffix = Path::new("/a/b/c/no_match.app.tar.gz"); + assert_eq!(strip_path_suffix(base, suffix), None); + + let base = Path::new("/a/b/c/long.app.tar.gz"); + let suffix = Path::new("app.tar.gz"); + assert_eq!(strip_path_suffix(base, suffix), None); + } } diff --git a/crates/util/src/rel_path.rs b/crates/util/src/rel_path.rs new file mode 100644 index 0000000000000000000000000000000000000000..b360297f209c54c6a33b174a738ed1876fbc16a0 --- /dev/null +++ b/crates/util/src/rel_path.rs @@ -0,0 +1,579 @@ +use crate::paths::{PathStyle, is_absolute}; +use anyhow::{Context as _, Result, anyhow}; +use serde::{Deserialize, Serialize}; +use std::{ + borrow::{Borrow, Cow}, + fmt, + ops::Deref, + path::{Path, PathBuf}, + sync::Arc, +}; + +/// A file system path that is guaranteed to be relative and normalized. +/// +/// This type can be used to represent paths in a uniform way, regardless of +/// whether they refer to Windows or POSIX file systems, and regardless of +/// the host platform. +/// +/// Internally, paths are stored in POSIX ('/'-delimited) format, but they can +/// be displayed in either POSIX or Windows format. +/// +/// Relative paths are also guaranteed to be valid unicode. +#[repr(transparent)] +#[derive(PartialEq, Eq, Hash, Serialize)] +pub struct RelPath(str); + +/// An owned representation of a file system path that is guaranteed to be +/// relative and normalized. +/// +/// This type is to [`RelPath`] as [`std::path::PathBuf`] is to [`std::path::Path`] +#[derive(Clone, Serialize, Deserialize)] +pub struct RelPathBuf(String); + +impl RelPath { + /// Creates an empty [`RelPath`]. + pub fn empty() -> &'static Self { + Self::new_unchecked("") + } + + /// Converts a path with a given style into a [`RelPath`]. + /// + /// Returns an error if the path is absolute, or is not valid unicode. + /// + /// This method will normalize the path by removing `.` components, + /// processing `..` components, and removing trailing separators. It does + /// not allocate unless it's necessary to reformat the path. + #[track_caller] + pub fn new<'a>(path: &'a Path, path_style: PathStyle) -> Result> { + let mut path = path.to_str().context("non utf-8 path")?; + + let (prefixes, suffixes): (&[_], &[_]) = match path_style { + PathStyle::Posix => (&["./"], &['/']), + PathStyle::Windows => (&["./", ".\\"], &['/', '\\']), + }; + + while prefixes.iter().any(|prefix| path.starts_with(prefix)) { + path = &path[prefixes[0].len()..]; + } + while let Some(prefix) = path.strip_suffix(suffixes) + && !prefix.is_empty() + { + path = prefix; + } + + if is_absolute(&path, path_style) { + return Err(anyhow!("absolute path not allowed: {path:?}")); + } + + let mut string = Cow::Borrowed(path); + if path_style == PathStyle::Windows && path.contains('\\') { + string = Cow::Owned(string.as_ref().replace('\\', "/")) + } + + let mut result = match string { + Cow::Borrowed(string) => Cow::Borrowed(Self::new_unchecked(string)), + Cow::Owned(string) => Cow::Owned(RelPathBuf(string)), + }; + + if result + .components() + .any(|component| component == "" || component == "." || component == "..") + { + let mut normalized = RelPathBuf::new(); + for component in result.components() { + match component { + "" => {} + "." => {} + ".." => { + if !normalized.pop() { + return Err(anyhow!("path is not relative: {result:?}")); + } + } + other => normalized.push(RelPath::new_unchecked(other)), + } + } + result = Cow::Owned(normalized) + } + + Ok(result) + } + + /// Converts a path that is already normalized and uses '/' separators + /// into a [`RelPath`] . + /// + /// Returns an error if the path is not already in the correct format. + #[track_caller] + pub fn unix + ?Sized>(path: &S) -> anyhow::Result<&Self> { + let path = path.as_ref(); + match Self::new(path, PathStyle::Posix)? { + Cow::Borrowed(path) => Ok(path), + Cow::Owned(_) => Err(anyhow!("invalid relative path {path:?}")), + } + } + + fn new_unchecked(s: &str) -> &Self { + // Safety: `RelPath` is a transparent wrapper around `str`. + unsafe { &*(s as *const str as *const Self) } + } + + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + pub fn components(&self) -> RelPathComponents<'_> { + RelPathComponents(&self.0) + } + + pub fn ancestors(&self) -> RelPathAncestors<'_> { + RelPathAncestors(Some(&self.0)) + } + + pub fn file_name(&self) -> Option<&str> { + self.components().next_back() + } + + pub fn file_stem(&self) -> Option<&str> { + Some(self.as_std_path().file_stem()?.to_str().unwrap()) + } + + pub fn extension(&self) -> Option<&str> { + Some(self.as_std_path().extension()?.to_str().unwrap()) + } + + pub fn parent(&self) -> Option<&Self> { + let mut components = self.components(); + components.next_back()?; + Some(components.rest()) + } + + pub fn starts_with(&self, other: &Self) -> bool { + self.strip_prefix(other).is_ok() + } + + pub fn ends_with(&self, other: &Self) -> bool { + if let Some(suffix) = self.0.strip_suffix(&other.0) { + if suffix.ends_with('/') { + return true; + } else if suffix.is_empty() { + return true; + } + } + false + } + + pub fn strip_prefix<'a>(&'a self, other: &Self) -> Result<&'a Self> { + if other.is_empty() { + return Ok(self); + } + if let Some(suffix) = self.0.strip_prefix(&other.0) { + if let Some(suffix) = suffix.strip_prefix('/') { + return Ok(Self::new_unchecked(suffix)); + } else if suffix.is_empty() { + return Ok(Self::empty()); + } + } + Err(anyhow!("failed to strip prefix: {other:?} from {self:?}")) + } + + pub fn len(&self) -> usize { + self.0.matches('/').count() + 1 + } + + pub fn last_n_components(&self, count: usize) -> Option<&Self> { + let len = self.len(); + if len >= count { + let mut components = self.components(); + for _ in 0..(len - count) { + components.next()?; + } + Some(components.rest()) + } else { + None + } + } + + pub fn join(&self, other: &Self) -> Arc { + let result = if self.0.is_empty() { + Cow::Borrowed(&other.0) + } else if other.0.is_empty() { + Cow::Borrowed(&self.0) + } else { + Cow::Owned(format!("{}/{}", &self.0, &other.0)) + }; + Arc::from(Self::new_unchecked(result.as_ref())) + } + + pub fn to_rel_path_buf(&self) -> RelPathBuf { + RelPathBuf(self.0.to_string()) + } + + pub fn into_arc(&self) -> Arc { + Arc::from(self) + } + + /// Convert the path into the wire representation. + pub fn to_proto(&self) -> String { + self.as_unix_str().to_owned() + } + + /// Load the path from its wire representation. + pub fn from_proto(path: &str) -> Result> { + Ok(Arc::from(Self::unix(path)?)) + } + + /// Convert the path into a string with the given path style. + /// + /// Whenever a path is presented to the user, it should be converted to + /// a string via this method. + pub fn display(&self, style: PathStyle) -> Cow<'_, str> { + match style { + PathStyle::Posix => Cow::Borrowed(&self.0), + PathStyle::Windows => Cow::Owned(self.0.replace('/', "\\")), + } + } + + /// Get the internal unix-style representation of the path. + /// + /// This should not be shown to the user. + pub fn as_unix_str(&self) -> &str { + &self.0 + } + + /// Interprets the path as a [`std::path::Path`], suitable for file system calls. + /// + /// This is guaranteed to be a valid path regardless of the host platform, because + /// the `/` is accepted as a path separator on windows. + /// + /// This should not be shown to the user. + pub fn as_std_path(&self) -> &Path { + Path::new(&self.0) + } +} + +impl ToOwned for RelPath { + type Owned = RelPathBuf; + + fn to_owned(&self) -> Self::Owned { + self.to_rel_path_buf() + } +} + +impl Borrow for RelPathBuf { + fn borrow(&self) -> &RelPath { + self.as_rel_path() + } +} + +impl PartialOrd for RelPath { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for RelPath { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.components().cmp(other.components()) + } +} + +impl fmt::Debug for RelPath { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Debug::fmt(&self.0, f) + } +} + +impl fmt::Debug for RelPathBuf { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Debug::fmt(&self.0, f) + } +} + +impl RelPathBuf { + pub fn new() -> Self { + Self(String::new()) + } + + pub fn pop(&mut self) -> bool { + if let Some(ix) = self.0.rfind('/') { + self.0.truncate(ix); + true + } else if !self.is_empty() { + self.0.clear(); + true + } else { + false + } + } + + pub fn push(&mut self, path: &RelPath) { + if !self.is_empty() { + self.0.push('/'); + } + self.0.push_str(&path.0); + } + + pub fn as_rel_path(&self) -> &RelPath { + RelPath::new_unchecked(self.0.as_str()) + } + + pub fn set_extension(&mut self, extension: &str) -> bool { + if let Some(filename) = self.file_name() { + let mut filename = PathBuf::from(filename); + filename.set_extension(extension); + self.pop(); + self.0.push_str(filename.to_str().unwrap()); + true + } else { + false + } + } +} + +impl Into> for RelPathBuf { + fn into(self) -> Arc { + Arc::from(self.as_rel_path()) + } +} + +impl AsRef for RelPathBuf { + fn as_ref(&self) -> &RelPath { + self.as_rel_path() + } +} + +impl Deref for RelPathBuf { + type Target = RelPath; + + fn deref(&self) -> &Self::Target { + self.as_ref() + } +} + +impl<'a> From<&'a RelPath> for Cow<'a, RelPath> { + fn from(value: &'a RelPath) -> Self { + Self::Borrowed(value) + } +} + +impl From<&RelPath> for Arc { + fn from(rel_path: &RelPath) -> Self { + let bytes: Arc = Arc::from(&rel_path.0); + unsafe { Arc::from_raw(Arc::into_raw(bytes) as *const RelPath) } + } +} + +#[cfg(any(test, feature = "test-support"))] +#[track_caller] +pub fn rel_path(path: &str) -> &RelPath { + RelPath::unix(path).unwrap() +} + +impl PartialEq for RelPath { + fn eq(&self, other: &str) -> bool { + self.0 == *other + } +} + +pub struct RelPathComponents<'a>(&'a str); + +pub struct RelPathAncestors<'a>(Option<&'a str>); + +const SEPARATOR: char = '/'; + +impl<'a> RelPathComponents<'a> { + pub fn rest(&self) -> &'a RelPath { + RelPath::new_unchecked(self.0) + } +} + +impl<'a> Iterator for RelPathComponents<'a> { + type Item = &'a str; + + fn next(&mut self) -> Option { + if let Some(sep_ix) = self.0.find(SEPARATOR) { + let (head, tail) = self.0.split_at(sep_ix); + self.0 = &tail[1..]; + Some(head) + } else if self.0.is_empty() { + None + } else { + let result = self.0; + self.0 = ""; + Some(result) + } + } +} + +impl<'a> Iterator for RelPathAncestors<'a> { + type Item = &'a RelPath; + + fn next(&mut self) -> Option { + let result = self.0?; + if let Some(sep_ix) = result.rfind(SEPARATOR) { + self.0 = Some(&result[..sep_ix]); + } else if !result.is_empty() { + self.0 = Some(""); + } else { + self.0 = None; + } + Some(RelPath::new_unchecked(result)) + } +} + +impl<'a> DoubleEndedIterator for RelPathComponents<'a> { + fn next_back(&mut self) -> Option { + if let Some(sep_ix) = self.0.rfind(SEPARATOR) { + let (head, tail) = self.0.split_at(sep_ix); + self.0 = head; + Some(&tail[1..]) + } else if self.0.is_empty() { + None + } else { + let result = self.0; + self.0 = ""; + Some(result) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use itertools::Itertools; + use pretty_assertions::assert_matches; + + #[test] + fn test_rel_path_new() { + assert!(RelPath::new(Path::new("/"), PathStyle::local()).is_err()); + assert!(RelPath::new(Path::new("//"), PathStyle::local()).is_err()); + assert!(RelPath::new(Path::new("/foo/"), PathStyle::local()).is_err()); + + let path = RelPath::new("foo/".as_ref(), PathStyle::local()).unwrap(); + assert_eq!(path, rel_path("foo").into()); + assert_matches!(path, Cow::Borrowed(_)); + + let path = RelPath::new("foo\\".as_ref(), PathStyle::Windows).unwrap(); + assert_eq!(path, rel_path("foo").into()); + assert_matches!(path, Cow::Borrowed(_)); + + assert_eq!( + RelPath::new("foo/bar/../baz/./quux/".as_ref(), PathStyle::local()) + .unwrap() + .as_ref(), + rel_path("foo/baz/quux") + ); + + let path = RelPath::new("./foo/bar".as_ref(), PathStyle::Posix).unwrap(); + assert_eq!(path.as_ref(), rel_path("foo/bar")); + assert_matches!(path, Cow::Borrowed(_)); + + let path = RelPath::new(".\\foo".as_ref(), PathStyle::Windows).unwrap(); + assert_eq!(path, rel_path("foo").into()); + assert_matches!(path, Cow::Borrowed(_)); + + let path = RelPath::new("./.\\./foo/\\/".as_ref(), PathStyle::Windows).unwrap(); + assert_eq!(path, rel_path("foo").into()); + assert_matches!(path, Cow::Borrowed(_)); + + let path = RelPath::new("foo/./bar".as_ref(), PathStyle::Posix).unwrap(); + assert_eq!(path.as_ref(), rel_path("foo/bar")); + assert_matches!(path, Cow::Owned(_)); + + let path = RelPath::new("./foo/bar".as_ref(), PathStyle::Windows).unwrap(); + assert_eq!(path.as_ref(), rel_path("foo/bar")); + assert_matches!(path, Cow::Borrowed(_)); + + let path = RelPath::new(".\\foo\\bar".as_ref(), PathStyle::Windows).unwrap(); + assert_eq!(path.as_ref(), rel_path("foo/bar")); + assert_matches!(path, Cow::Owned(_)); + } + + #[test] + fn test_rel_path_components() { + let path = rel_path("foo/bar/baz"); + assert_eq!( + path.components().collect::>(), + vec!["foo", "bar", "baz"] + ); + assert_eq!( + path.components().rev().collect::>(), + vec!["baz", "bar", "foo"] + ); + + let path = rel_path(""); + let mut components = path.components(); + assert_eq!(components.next(), None); + } + + #[test] + fn test_rel_path_ancestors() { + let path = rel_path("foo/bar/baz"); + let mut ancestors = path.ancestors(); + assert_eq!(ancestors.next(), Some(rel_path("foo/bar/baz"))); + assert_eq!(ancestors.next(), Some(rel_path("foo/bar"))); + assert_eq!(ancestors.next(), Some(rel_path("foo"))); + assert_eq!(ancestors.next(), Some(rel_path(""))); + assert_eq!(ancestors.next(), None); + + let path = rel_path("foo"); + let mut ancestors = path.ancestors(); + assert_eq!(ancestors.next(), Some(rel_path("foo"))); + assert_eq!(ancestors.next(), Some(RelPath::empty())); + assert_eq!(ancestors.next(), None); + + let path = RelPath::empty(); + let mut ancestors = path.ancestors(); + assert_eq!(ancestors.next(), Some(RelPath::empty())); + assert_eq!(ancestors.next(), None); + } + + #[test] + fn test_rel_path_parent() { + assert_eq!(rel_path("foo/bar/baz").parent(), Some(rel_path("foo/bar"))); + assert_eq!(rel_path("foo").parent(), Some(RelPath::empty())); + assert_eq!(rel_path("").parent(), None); + } + + #[test] + fn test_rel_path_partial_ord_is_compatible_with_std() { + let test_cases = ["a/b/c", "relative/path/with/dot.", "relative/path/with.dot"]; + for [lhs, rhs] in test_cases.iter().array_combinations::<2>() { + assert_eq!( + Path::new(lhs).cmp(Path::new(rhs)), + RelPath::unix(lhs) + .unwrap() + .cmp(&RelPath::unix(rhs).unwrap()) + ); + } + } + + #[test] + fn test_strip_prefix() { + let parent = rel_path(""); + let child = rel_path(".foo"); + + assert!(child.starts_with(parent)); + assert_eq!(child.strip_prefix(parent).unwrap(), child); + } + + #[test] + fn test_rel_path_constructors_absolute_path() { + assert!(RelPath::new(Path::new("/a/b"), PathStyle::Windows).is_err()); + assert!(RelPath::new(Path::new("\\a\\b"), PathStyle::Windows).is_err()); + assert!(RelPath::new(Path::new("/a/b"), PathStyle::Posix).is_err()); + assert!(RelPath::new(Path::new("C:/a/b"), PathStyle::Windows).is_err()); + assert!(RelPath::new(Path::new("C:\\a\\b"), PathStyle::Windows).is_err()); + assert!(RelPath::new(Path::new("C:/a/b"), PathStyle::Posix).is_ok()); + } + + #[test] + fn test_pop() { + let mut path = rel_path("a/b").to_rel_path_buf(); + path.pop(); + assert_eq!(path.as_rel_path().as_unix_str(), "a"); + path.pop(); + assert_eq!(path.as_rel_path().as_unix_str(), ""); + path.pop(); + assert_eq!(path.as_rel_path().as_unix_str(), ""); + } +} diff --git a/crates/util/src/schemars.rs b/crates/util/src/schemars.rs index 22e0570cdb85efa82904153eda619b84b430eb61..9314eda4ac4d5003d7186c3115137e2e54c66794 100644 --- a/crates/util/src/schemars.rs +++ b/crates/util/src/schemars.rs @@ -18,9 +18,8 @@ pub fn replace_subschema( let schema_name = T::schema_name(); let definitions = generator.definitions_mut(); assert!(!definitions.contains_key(&format!("{schema_name}2"))); - if definitions.contains_key(schema_name.as_ref()) { - definitions.insert(schema_name.to_string(), schema().to_value()); - } + assert!(definitions.contains_key(schema_name.as_ref())); + definitions.insert(schema_name.to_string(), schema().to_value()); schemars::Schema::new_ref(format!("{DEFS_PATH}{schema_name}")) } diff --git a/crates/util/src/shell.rs b/crates/util/src/shell.rs new file mode 100644 index 0000000000000000000000000000000000000000..f61a2ee50f459e088371b61f0d8a584633d963a0 --- /dev/null +++ b/crates/util/src/shell.rs @@ -0,0 +1,406 @@ +use std::{borrow::Cow, fmt, path::Path, sync::LazyLock}; + +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] +pub enum ShellKind { + #[default] + Posix, + Csh, + Tcsh, + Rc, + Fish, + PowerShell, + Nushell, + Cmd, + Xonsh, +} + +pub fn get_system_shell() -> String { + if cfg!(windows) { + get_windows_system_shell() + } else { + std::env::var("SHELL").unwrap_or("/bin/sh".to_string()) + } +} + +pub fn get_default_system_shell() -> String { + if cfg!(windows) { + get_windows_system_shell() + } else { + "/bin/sh".to_string() + } +} + +/// Get the default system shell, preferring git-bash on Windows. +pub fn get_default_system_shell_preferring_bash() -> String { + if cfg!(windows) { + get_windows_git_bash().unwrap_or_else(|| get_windows_system_shell()) + } else { + "/bin/sh".to_string() + } +} + +pub fn get_windows_git_bash() -> Option { + static GIT_BASH: LazyLock> = LazyLock::new(|| { + // /path/to/git/cmd/git.exe/../../bin/bash.exe + let git = which::which("git").ok()?; + let git_bash = git.parent()?.parent()?.join("bin").join("bash.exe"); + if git_bash.is_file() { + Some(git_bash.to_string_lossy().to_string()) + } else { + None + } + }); + + (*GIT_BASH).clone() +} + +pub fn get_windows_system_shell() -> String { + use std::path::PathBuf; + + fn find_pwsh_in_programfiles(find_alternate: bool, find_preview: bool) -> Option { + #[cfg(target_pointer_width = "64")] + let env_var = if find_alternate { + "ProgramFiles(x86)" + } else { + "ProgramFiles" + }; + + #[cfg(target_pointer_width = "32")] + let env_var = if find_alternate { + "ProgramW6432" + } else { + "ProgramFiles" + }; + + let install_base_dir = PathBuf::from(std::env::var_os(env_var)?).join("PowerShell"); + install_base_dir + .read_dir() + .ok()? + .filter_map(Result::ok) + .filter(|entry| matches!(entry.file_type(), Ok(ft) if ft.is_dir())) + .filter_map(|entry| { + let dir_name = entry.file_name(); + let dir_name = dir_name.to_string_lossy(); + + let version = if find_preview { + let dash_index = dir_name.find('-')?; + if &dir_name[dash_index + 1..] != "preview" { + return None; + }; + dir_name[..dash_index].parse::().ok()? + } else { + dir_name.parse::().ok()? + }; + + let exe_path = entry.path().join("pwsh.exe"); + if exe_path.exists() { + Some((version, exe_path)) + } else { + None + } + }) + .max_by_key(|(version, _)| *version) + .map(|(_, path)| path) + } + + fn find_pwsh_in_msix(find_preview: bool) -> Option { + let msix_app_dir = + PathBuf::from(std::env::var_os("LOCALAPPDATA")?).join("Microsoft\\WindowsApps"); + if !msix_app_dir.exists() { + return None; + } + + let prefix = if find_preview { + "Microsoft.PowerShellPreview_" + } else { + "Microsoft.PowerShell_" + }; + msix_app_dir + .read_dir() + .ok()? + .filter_map(|entry| { + let entry = entry.ok()?; + if !matches!(entry.file_type(), Ok(ft) if ft.is_dir()) { + return None; + } + + if !entry.file_name().to_string_lossy().starts_with(prefix) { + return None; + } + + let exe_path = entry.path().join("pwsh.exe"); + exe_path.exists().then_some(exe_path) + }) + .next() + } + + fn find_pwsh_in_scoop() -> Option { + let pwsh_exe = + PathBuf::from(std::env::var_os("USERPROFILE")?).join("scoop\\shims\\pwsh.exe"); + pwsh_exe.exists().then_some(pwsh_exe) + } + + static SYSTEM_SHELL: LazyLock = LazyLock::new(|| { + find_pwsh_in_programfiles(false, false) + .or_else(|| find_pwsh_in_programfiles(true, false)) + .or_else(|| find_pwsh_in_msix(false)) + .or_else(|| find_pwsh_in_programfiles(false, true)) + .or_else(|| find_pwsh_in_msix(true)) + .or_else(|| find_pwsh_in_programfiles(true, true)) + .or_else(find_pwsh_in_scoop) + .map(|p| p.to_string_lossy().into_owned()) + .unwrap_or("powershell.exe".to_string()) + }); + + (*SYSTEM_SHELL).clone() +} + +impl fmt::Display for ShellKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ShellKind::Posix => write!(f, "sh"), + ShellKind::Csh => write!(f, "csh"), + ShellKind::Tcsh => write!(f, "tcsh"), + ShellKind::Fish => write!(f, "fish"), + ShellKind::PowerShell => write!(f, "powershell"), + ShellKind::Nushell => write!(f, "nu"), + ShellKind::Cmd => write!(f, "cmd"), + ShellKind::Rc => write!(f, "rc"), + ShellKind::Xonsh => write!(f, "xonsh"), + } + } +} + +impl ShellKind { + pub fn system() -> Self { + Self::new(&get_system_shell()) + } + + pub fn new(program: impl AsRef) -> Self { + let program = program.as_ref(); + let Some(program) = program.file_stem().and_then(|s| s.to_str()) else { + return if cfg!(windows) { + ShellKind::PowerShell + } else { + ShellKind::Posix + }; + }; + if program == "powershell" || program == "pwsh" { + ShellKind::PowerShell + } else if program == "cmd" { + ShellKind::Cmd + } else if program == "nu" { + ShellKind::Nushell + } else if program == "fish" { + ShellKind::Fish + } else if program == "csh" { + ShellKind::Csh + } else if program == "tcsh" { + ShellKind::Tcsh + } else if program == "rc" { + ShellKind::Rc + } else if program == "xonsh" { + ShellKind::Xonsh + } else if program == "sh" || program == "bash" { + ShellKind::Posix + } else { + if cfg!(windows) { + ShellKind::PowerShell + } else { + // Some other shell detected, the user might install and use a + // unix-like shell. + ShellKind::Posix + } + } + } + + pub fn to_shell_variable(self, input: &str) -> String { + match self { + Self::PowerShell => Self::to_powershell_variable(input), + Self::Cmd => Self::to_cmd_variable(input), + Self::Posix => input.to_owned(), + Self::Fish => input.to_owned(), + Self::Csh => input.to_owned(), + Self::Tcsh => input.to_owned(), + Self::Rc => input.to_owned(), + Self::Nushell => Self::to_nushell_variable(input), + Self::Xonsh => input.to_owned(), + } + } + + fn to_cmd_variable(input: &str) -> String { + if let Some(var_str) = input.strip_prefix("${") { + if var_str.find(':').is_none() { + // If the input starts with "${", remove the trailing "}" + format!("%{}%", &var_str[..var_str.len() - 1]) + } else { + // `${SOME_VAR:-SOME_DEFAULT}`, we currently do not handle this situation, + // which will result in the task failing to run in such cases. + input.into() + } + } else if let Some(var_str) = input.strip_prefix('$') { + // If the input starts with "$", directly append to "$env:" + format!("%{}%", var_str) + } else { + // If no prefix is found, return the input as is + input.into() + } + } + + fn to_powershell_variable(input: &str) -> String { + if let Some(var_str) = input.strip_prefix("${") { + if var_str.find(':').is_none() { + // If the input starts with "${", remove the trailing "}" + format!("$env:{}", &var_str[..var_str.len() - 1]) + } else { + // `${SOME_VAR:-SOME_DEFAULT}`, we currently do not handle this situation, + // which will result in the task failing to run in such cases. + input.into() + } + } else if let Some(var_str) = input.strip_prefix('$') { + // If the input starts with "$", directly append to "$env:" + format!("$env:{}", var_str) + } else { + // If no prefix is found, return the input as is + input.into() + } + } + + fn to_nushell_variable(input: &str) -> String { + let mut result = String::new(); + let mut source = input; + let mut is_start = true; + + loop { + match source.chars().next() { + None => return result, + Some('$') => { + source = Self::parse_nushell_var(&source[1..], &mut result, is_start); + is_start = false; + } + Some(_) => { + is_start = false; + let chunk_end = source.find('$').unwrap_or(source.len()); + let (chunk, rest) = source.split_at(chunk_end); + result.push_str(chunk); + source = rest; + } + } + } + } + + fn parse_nushell_var<'a>(source: &'a str, text: &mut String, is_start: bool) -> &'a str { + if source.starts_with("env.") { + text.push('$'); + return source; + } + + match source.chars().next() { + Some('{') => { + let source = &source[1..]; + if let Some(end) = source.find('}') { + let var_name = &source[..end]; + if !var_name.is_empty() { + if !is_start { + text.push_str("("); + } + text.push_str("$env."); + text.push_str(var_name); + if !is_start { + text.push_str(")"); + } + &source[end + 1..] + } else { + text.push_str("${}"); + &source[end + 1..] + } + } else { + text.push_str("${"); + source + } + } + Some(c) if c.is_alphabetic() || c == '_' => { + let end = source + .find(|c: char| !c.is_alphanumeric() && c != '_') + .unwrap_or(source.len()); + let var_name = &source[..end]; + if !is_start { + text.push_str("("); + } + text.push_str("$env."); + text.push_str(var_name); + if !is_start { + text.push_str(")"); + } + &source[end..] + } + _ => { + text.push('$'); + source + } + } + } + + pub fn args_for_shell(&self, interactive: bool, combined_command: String) -> Vec { + match self { + ShellKind::PowerShell => vec!["-C".to_owned(), combined_command], + ShellKind::Cmd => vec!["/C".to_owned(), combined_command], + ShellKind::Posix + | ShellKind::Nushell + | ShellKind::Fish + | ShellKind::Csh + | ShellKind::Tcsh + | ShellKind::Rc + | ShellKind::Xonsh => interactive + .then(|| "-i".to_owned()) + .into_iter() + .chain(["-c".to_owned(), combined_command]) + .collect(), + } + } + + pub const fn command_prefix(&self) -> Option { + match self { + ShellKind::PowerShell => Some('&'), + ShellKind::Nushell => Some('^'), + _ => None, + } + } + + pub const fn sequential_commands_separator(&self) -> char { + match self { + ShellKind::Cmd => '&', + _ => ';', + } + } + + pub fn try_quote<'a>(&self, arg: &'a str) -> Option> { + shlex::try_quote(arg).ok().map(|arg| match self { + // If we are running in PowerShell, we want to take extra care when escaping strings. + // In particular, we want to escape strings with a backtick (`) rather than a backslash (\). + // TODO double escaping backslashes is not necessary in PowerShell and probably CMD + ShellKind::PowerShell => Cow::Owned(arg.replace("\\\"", "`\"")), + _ => arg, + }) + } + + pub const fn activate_keyword(&self) -> &'static str { + match self { + ShellKind::Cmd => "", + ShellKind::Nushell => "overlay use", + ShellKind::PowerShell => ".", + ShellKind::Fish => "source", + ShellKind::Csh => "source", + ShellKind::Tcsh => "source", + ShellKind::Posix | ShellKind::Rc => "source", + ShellKind::Xonsh => "source", + } + } + + pub const fn clear_screen_command(&self) -> &'static str { + match self { + ShellKind::Cmd => "cls", + _ => "clear", + } + } +} diff --git a/crates/util/src/shell_env.rs b/crates/util/src/shell_env.rs index 2b1063316fa1d08ba3fa6e4c945b30175ff2cfdc..9d097d91658d69e420599856ef67efe22f685d4d 100644 --- a/crates/util/src/shell_env.rs +++ b/crates/util/src/shell_env.rs @@ -1,65 +1,90 @@ -#![cfg_attr(not(unix), allow(unused))] +use std::path::Path; use anyhow::{Context as _, Result}; use collections::HashMap; -/// Capture all environment variables from the login shell. +use crate::shell::ShellKind; + +pub fn print_env() { + let env_vars: HashMap = std::env::vars().collect(); + let json = serde_json::to_string_pretty(&env_vars).unwrap_or_else(|err| { + eprintln!("Error serializing environment variables: {}", err); + std::process::exit(1); + }); + println!("{}", json); +} + +/// Capture all environment variables from the login shell in the given directory. +pub async fn capture( + shell_path: impl AsRef, + args: &[String], + directory: impl AsRef, +) -> Result> { + #[cfg(windows)] + return capture_windows(shell_path.as_ref(), args, directory.as_ref()).await; + #[cfg(unix)] + return capture_unix(shell_path.as_ref(), args, directory.as_ref()).await; +} + #[cfg(unix)] -pub fn capture(directory: &std::path::Path) -> Result> { +async fn capture_unix( + shell_path: &Path, + args: &[String], + directory: &Path, +) -> Result> { use std::os::unix::process::CommandExt; use std::process::Stdio; let zed_path = super::get_shell_safe_zed_path()?; - let shell_path = std::env::var("SHELL").map(std::path::PathBuf::from)?; - let shell_name = shell_path.file_name().and_then(std::ffi::OsStr::to_str); + let shell_kind = ShellKind::new(shell_path); let mut command_string = String::new(); - let mut command = std::process::Command::new(&shell_path); + let mut command = std::process::Command::new(shell_path); + command.args(args); // In some shells, file descriptors greater than 2 cannot be used in interactive mode, // so file descriptor 0 (stdin) is used instead. This impacts zsh, old bash; perhaps others. // See: https://github.com/zed-industries/zed/pull/32136#issuecomment-2999645482 const FD_STDIN: std::os::fd::RawFd = 0; const FD_STDOUT: std::os::fd::RawFd = 1; - - let (fd_num, redir) = match shell_name { - Some("rc") => (FD_STDIN, format!(">[1={}]", FD_STDIN)), // `[1=0]` - Some("nu") | Some("tcsh") => (FD_STDOUT, "".to_string()), + const FD_STDERR: std::os::fd::RawFd = 2; + + let (fd_num, redir) = match shell_kind { + ShellKind::Rc => (FD_STDIN, format!(">[1={}]", FD_STDIN)), // `[1=0]` + ShellKind::Nushell | ShellKind::Tcsh => (FD_STDOUT, "".to_string()), + // xonsh doesn't support redirecting to stdin, and control sequences are printed to + // stdout on startup + ShellKind::Xonsh => (FD_STDERR, "o>e".to_string()), _ => (FD_STDIN, format!(">&{}", FD_STDIN)), // `>&0` }; command.stdin(Stdio::null()); command.stdout(Stdio::piped()); command.stderr(Stdio::piped()); - let mut command_prefix = String::new(); - match shell_name { - Some("tcsh" | "csh") => { + match shell_kind { + ShellKind::Csh | ShellKind::Tcsh => { // For csh/tcsh, login shell requires passing `-` as 0th argument (instead of `-l`) command.arg0("-"); } - Some("fish") => { + ShellKind::Fish => { // in fish, asdf, direnv attach to the `fish_prompt` event command_string.push_str("emit fish_prompt;"); command.arg("-l"); } - Some("nu") => { - // nu needs special handling for -- options. - command_prefix = String::from("^"); - } _ => { command.arg("-l"); } } // cd into the directory, triggering directory specific side-effects (asdf, direnv, etc) command_string.push_str(&format!("cd '{}';", directory.display())); - command_string.push_str(&format!( - "{}{} --printenv {}", - command_prefix, zed_path, redir - )); + if let Some(prefix) = shell_kind.command_prefix() { + command_string.push(prefix); + } + command_string.push_str(&format!("{} --printenv {}", zed_path, redir)); command.args(["-i", "-c", &command_string]); super::set_pre_exec_to_start_new_session(&mut command); - let (env_output, process_output) = spawn_and_read_fd(command, fd_num)?; + let (env_output, process_output) = spawn_and_read_fd(command, fd_num).await?; let env_output = String::from_utf8_lossy(&env_output); anyhow::ensure!( @@ -77,7 +102,7 @@ pub fn capture(directory: &std::path::Path) -> Result anyhow::Result<(Vec, std::process::Output)> { @@ -91,21 +116,117 @@ fn spawn_and_read_fd( child_fd, }])?; - let process = command.spawn()?; - drop(command); + let process = smol::process::Command::from(command).spawn()?; let mut buffer = Vec::new(); reader.read_to_end(&mut buffer)?; - Ok((buffer, process.wait_with_output()?)) + Ok((buffer, process.output().await?)) } -pub fn print_env() { - let env_vars: HashMap = std::env::vars().collect(); - let json = serde_json::to_string_pretty(&env_vars).unwrap_or_else(|err| { - eprintln!("Error serializing environment variables: {}", err); - std::process::exit(1); - }); - println!("{}", json); - std::process::exit(0); +#[cfg(windows)] +async fn capture_windows( + shell_path: &Path, + _args: &[String], + directory: &Path, +) -> Result> { + use std::process::Stdio; + + let zed_path = + std::env::current_exe().context("Failed to determine current zed executable path.")?; + + let shell_kind = ShellKind::new(shell_path); + let env_output = match shell_kind { + ShellKind::Posix + | ShellKind::Csh + | ShellKind::Tcsh + | ShellKind::Rc + | ShellKind::Fish + | ShellKind::Xonsh => { + return Err(anyhow::anyhow!("unsupported shell kind")); + } + ShellKind::PowerShell => { + let output = crate::command::new_smol_command(shell_path) + .args([ + "-NonInteractive", + "-NoProfile", + "-Command", + &format!( + "Set-Location '{}'; & '{}' --printenv", + directory.display(), + zed_path.display() + ), + ]) + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output() + .await?; + + anyhow::ensure!( + output.status.success(), + "PowerShell command failed with {}. stdout: {:?}, stderr: {:?}", + output.status, + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr), + ); + output + } + ShellKind::Nushell => { + let output = crate::command::new_smol_command(shell_path) + .args([ + "-c", + &format!( + "cd '{}'; {} --printenv", + directory.display(), + zed_path.display() + ), + ]) + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output() + .await?; + + anyhow::ensure!( + output.status.success(), + "Nushell command failed with {}. stdout: {:?}, stderr: {:?}", + output.status, + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr), + ); + output + } + ShellKind::Cmd => { + let output = crate::command::new_smol_command(shell_path) + .args([ + "/c", + &format!( + "cd '{}'; {} --printenv", + directory.display(), + zed_path.display() + ), + ]) + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output() + .await?; + + anyhow::ensure!( + output.status.success(), + "Cmd command failed with {}. stdout: {:?}, stderr: {:?}", + output.status, + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr), + ); + output + } + }; + + let env_output = String::from_utf8_lossy(&env_output.stdout); + + // Parse the JSON output from zed --printenv + serde_json::from_str(&env_output) + .with_context(|| "Failed to deserialize environment variables from json") } diff --git a/crates/util/src/util.rs b/crates/util/src/util.rs index 90f5be1c92875ac0b9b2d3e7352ae858371b3686..f2efc4532a594eb156f742483f804906314a7d73 100644 --- a/crates/util/src/util.rs +++ b/crates/util/src/util.rs @@ -5,18 +5,22 @@ pub mod fs; pub mod markdown; pub mod paths; pub mod redact; +pub mod rel_path; pub mod schemars; pub mod serde; +pub mod shell; pub mod shell_env; pub mod size; #[cfg(any(test, feature = "test-support"))] pub mod test; pub mod time; -use anyhow::Result; +use anyhow::{Context as _, Result}; use futures::Future; use itertools::Either; +use paths::PathExt; use regex::Regex; +use std::path::PathBuf; use std::sync::{LazyLock, OnceLock}; use std::{ borrow::Cow, @@ -286,28 +290,58 @@ fn load_shell_from_passwd() -> Result<()> { Ok(()) } -#[cfg(unix)] /// Returns a shell escaped path for the current zed executable pub fn get_shell_safe_zed_path() -> anyhow::Result { - use anyhow::Context; + let zed_path = + std::env::current_exe().context("Failed to determine current zed executable path.")?; - let zed_path = std::env::current_exe() - .context("Failed to determine current zed executable path.")? - .to_string_lossy() - .trim_end_matches(" (deleted)") // see https://github.com/rust-lang/rust/issues/69343 - .to_string(); + zed_path + .try_shell_safe() + .context("Failed to shell-escape Zed executable path.") +} - // As of writing, this can only be fail if the path contains a null byte, which shouldn't be possible - // but shlex has annotated the error as #[non_exhaustive] so we can't make it a compile error if other - // errors are introduced in the future :( - let zed_path_escaped = - shlex::try_quote(&zed_path).context("Failed to shell-escape Zed executable path.")?; +/// Returns a path for the zed cli executable, this function +/// should be called from the zed executable, not zed-cli. +pub fn get_zed_cli_path() -> Result { + let zed_path = + std::env::current_exe().context("Failed to determine current zed executable path.")?; + let parent = zed_path + .parent() + .context("Failed to determine parent directory of zed executable path.")?; + + let possible_locations: &[&str] = if cfg!(target_os = "macos") { + // On macOS, the zed executable and zed-cli are inside the app bundle, + // so here ./cli is for both installed and development builds. + &["./cli"] + } else if cfg!(target_os = "windows") { + // bin/zed.exe is for installed builds, ./cli.exe is for development builds. + &["bin/zed.exe", "./cli.exe"] + } else if cfg!(target_os = "linux") || cfg!(target_os = "freebsd") { + // bin is the standard, ./cli is for the target directory in development builds. + &["../bin/zed", "./cli"] + } else { + anyhow::bail!("unsupported platform for determining zed-cli path"); + }; - Ok(zed_path_escaped.to_string()) + possible_locations + .iter() + .find_map(|p| { + parent + .join(p) + .canonicalize() + .ok() + .filter(|p| p != &zed_path) + }) + .with_context(|| { + format!( + "could not find zed-cli from any of: {}", + possible_locations.join(", ") + ) + }) } #[cfg(unix)] -pub fn load_login_shell_environment() -> Result<()> { +pub async fn load_login_shell_environment() -> Result<()> { load_shell_from_passwd().log_err(); // If possible, we want to `cd` in the user's `$HOME` to trigger programs @@ -315,7 +349,7 @@ pub fn load_login_shell_environment() -> Result<()> { // into shell's `cd` command (and hooks) to manipulate env. // We do this so that we get the env a user would have when spawning a shell // in home directory. - for (name, value) in shell_env::capture(paths::home_dir())? { + for (name, value) in shell_env::capture(get_system_shell(), &[], paths::home_dir()).await? { unsafe { env::set_var(&name, &value) }; } @@ -503,108 +537,6 @@ pub fn wrapped_usize_outward_from( }) } -#[cfg(target_os = "windows")] -pub fn get_windows_system_shell() -> String { - use std::path::PathBuf; - - fn find_pwsh_in_programfiles(find_alternate: bool, find_preview: bool) -> Option { - #[cfg(target_pointer_width = "64")] - let env_var = if find_alternate { - "ProgramFiles(x86)" - } else { - "ProgramFiles" - }; - - #[cfg(target_pointer_width = "32")] - let env_var = if find_alternate { - "ProgramW6432" - } else { - "ProgramFiles" - }; - - let install_base_dir = PathBuf::from(std::env::var_os(env_var)?).join("PowerShell"); - install_base_dir - .read_dir() - .ok()? - .filter_map(Result::ok) - .filter(|entry| matches!(entry.file_type(), Ok(ft) if ft.is_dir())) - .filter_map(|entry| { - let dir_name = entry.file_name(); - let dir_name = dir_name.to_string_lossy(); - - let version = if find_preview { - let dash_index = dir_name.find('-')?; - if &dir_name[dash_index + 1..] != "preview" { - return None; - }; - dir_name[..dash_index].parse::().ok()? - } else { - dir_name.parse::().ok()? - }; - - let exe_path = entry.path().join("pwsh.exe"); - if exe_path.exists() { - Some((version, exe_path)) - } else { - None - } - }) - .max_by_key(|(version, _)| *version) - .map(|(_, path)| path) - } - - fn find_pwsh_in_msix(find_preview: bool) -> Option { - let msix_app_dir = - PathBuf::from(std::env::var_os("LOCALAPPDATA")?).join("Microsoft\\WindowsApps"); - if !msix_app_dir.exists() { - return None; - } - - let prefix = if find_preview { - "Microsoft.PowerShellPreview_" - } else { - "Microsoft.PowerShell_" - }; - msix_app_dir - .read_dir() - .ok()? - .filter_map(|entry| { - let entry = entry.ok()?; - if !matches!(entry.file_type(), Ok(ft) if ft.is_dir()) { - return None; - } - - if !entry.file_name().to_string_lossy().starts_with(prefix) { - return None; - } - - let exe_path = entry.path().join("pwsh.exe"); - exe_path.exists().then_some(exe_path) - }) - .next() - } - - fn find_pwsh_in_scoop() -> Option { - let pwsh_exe = - PathBuf::from(std::env::var_os("USERPROFILE")?).join("scoop\\shims\\pwsh.exe"); - pwsh_exe.exists().then_some(pwsh_exe) - } - - static SYSTEM_SHELL: LazyLock = LazyLock::new(|| { - find_pwsh_in_programfiles(false, false) - .or_else(|| find_pwsh_in_programfiles(true, false)) - .or_else(|| find_pwsh_in_msix(false)) - .or_else(|| find_pwsh_in_programfiles(false, true)) - .or_else(|| find_pwsh_in_msix(true)) - .or_else(|| find_pwsh_in_programfiles(true, true)) - .or_else(find_pwsh_in_scoop) - .map(|p| p.to_string_lossy().to_string()) - .unwrap_or("powershell.exe".to_string()) - }); - - (*SYSTEM_SHELL).clone() -} - pub trait ResultExt { type Ok; @@ -673,13 +605,15 @@ where // so discard the prefix up to that segment to find the crate name let target = file .split_once("crates/") - .and_then(|(_, s)| s.split_once('/')) - .map(|(p, _)| p); + .and_then(|(_, s)| s.split_once("/src/")); + let module_path = target.map(|(krate, module)| { + krate.to_owned() + "::" + &module.trim_end_matches(".rs").replace('/', "::") + }); log::logger().log( &log::Record::builder() - .target(target.unwrap_or("")) - .module_path(target) + .target(target.map_or("", |(krate, _)| krate)) + .module_path(module_path.as_deref()) .args(format_args!("{:?}", error)) .file(Some(caller.file())) .line(Some(caller.line())) @@ -989,7 +923,7 @@ impl PartialOrd for NumericPrefixWithSuffix<'_> { /// # Examples /// /// ``` -/// use util::capitalize; +/// use zed_util::capitalize; /// /// assert_eq!(capitalize("hello"), "Hello"); /// assert_eq!(capitalize("WORLD"), "WORLD"); @@ -1048,29 +982,9 @@ pub fn default() -> D { Default::default() } -pub fn get_system_shell() -> String { - #[cfg(target_os = "windows")] - { - get_windows_system_shell() - } - - #[cfg(not(target_os = "windows"))] - { - std::env::var("SHELL").unwrap_or("/bin/sh".to_string()) - } -} - -pub fn get_default_system_shell() -> String { - #[cfg(target_os = "windows")] - { - get_windows_system_shell() - } - - #[cfg(not(target_os = "windows"))] - { - "/bin/sh".to_string() - } -} +pub use self::shell::{ + get_default_system_shell, get_default_system_shell_preferring_bash, get_system_shell, +}; #[derive(Debug)] pub enum ConnectionResult { @@ -1095,6 +1009,15 @@ impl From> for ConnectionResult { } } +#[track_caller] +pub fn some_or_debug_panic(option: Option) -> Option { + #[cfg(debug_assertions)] + if option.is_none() { + panic!("Unexpected None"); + } + option +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/util_macros/Cargo.toml b/crates/util_macros/Cargo.toml index 996eefcb303ee5959f0e7fa920f1a91a509407eb..b1c0334c870f7fee799ddc8b208ba9ad8d48fc53 100644 --- a/crates/util_macros/Cargo.toml +++ b/crates/util_macros/Cargo.toml @@ -1,9 +1,10 @@ [package] -name = "util_macros" +name = "zed-util-macros" version = "0.1.0" edition.workspace = true -publish.workspace = true +publish = true license = "Apache-2.0" +description = "Utility macros for Zed" [lints] workspace = true @@ -16,4 +17,8 @@ doctest = false [dependencies] quote.workspace = true syn.workspace = true +perf.workspace = true workspace-hack.workspace = true + +[features] +perf-enabled = [] diff --git a/crates/util_macros/src/util_macros.rs b/crates/util_macros/src/util_macros.rs index 9d0b06ab10a7454d6c0d19fd54722fd98db4ac25..2cdc7f46f5f0f015498b90e736a7cbe7863f2784 100644 --- a/crates/util_macros/src/util_macros.rs +++ b/crates/util_macros/src/util_macros.rs @@ -1,8 +1,10 @@ #![cfg_attr(not(target_os = "windows"), allow(unused))] +#![allow(clippy::test_attr_in_doctest)] +use perf::*; use proc_macro::TokenStream; -use quote::quote; -use syn::{LitStr, parse_macro_input}; +use quote::{ToTokens, quote}; +use syn::{ItemFn, LitStr, parse_macro_input, parse_quote}; /// A macro used in tests for cross-platform path string literals in tests. On Windows it replaces /// `/` with `\\` and adds `C:` to the beginning of absolute paths. On other platforms, the path is @@ -10,7 +12,7 @@ use syn::{LitStr, parse_macro_input}; /// /// # Example /// ```rust -/// use util_macros::path; +/// use zed_util_macros::path; /// /// let path = path!("/Users/user/file.txt"); /// #[cfg(target_os = "windows")] @@ -41,7 +43,7 @@ pub fn path(input: TokenStream) -> TokenStream { /// /// # Example /// ```rust -/// use util_macros::uri; +/// use zed_util_macros::uri; /// /// let uri = uri!("file:///path/to/file"); /// #[cfg(target_os = "windows")] @@ -67,7 +69,7 @@ pub fn uri(input: TokenStream) -> TokenStream { /// /// # Example /// ```rust -/// use util_macros::line_endings; +/// use zed_util_macros::line_endings; /// /// let text = line_endings!("Hello\nWorld"); /// #[cfg(target_os = "windows")] @@ -87,3 +89,198 @@ pub fn line_endings(input: TokenStream) -> TokenStream { #text }) } + +/// Inner data for the perf macro. +#[derive(Default)] +struct PerfArgs { + /// How many times to loop a test before rerunning the test binary. If left + /// empty, the test harness will auto-determine this value. + iterations: Option, + /// How much this test's results should be weighed when comparing across runs. + /// If unspecified, defaults to `WEIGHT_DEFAULT` (50). + weight: Option, + /// How relevant a benchmark is to overall performance. See docs on the enum + /// for details. If unspecified, `Average` is selected. + importance: Importance, +} + +#[warn(clippy::all, clippy::pedantic)] +impl PerfArgs { + /// Parses attribute arguments into a `PerfArgs`. + fn parse_into(&mut self, meta: syn::meta::ParseNestedMeta) -> syn::Result<()> { + if meta.path.is_ident("iterations") { + self.iterations = Some(meta.value()?.parse()?); + } else if meta.path.is_ident("weight") { + self.weight = Some(meta.value()?.parse()?); + } else if meta.path.is_ident("critical") { + self.importance = Importance::Critical; + } else if meta.path.is_ident("important") { + self.importance = Importance::Important; + } else if meta.path.is_ident("average") { + // This shouldn't be specified manually, but oh well. + self.importance = Importance::Average; + } else if meta.path.is_ident("iffy") { + self.importance = Importance::Iffy; + } else if meta.path.is_ident("fluff") { + self.importance = Importance::Fluff; + } else { + return Err(syn::Error::new_spanned(meta.path, "unexpected identifier")); + } + Ok(()) + } +} + +/// Marks a test as perf-sensitive, to be triaged when checking the performance +/// of a build. This also automatically applies `#[test]`. +/// +/// # Usage +/// Applying this attribute to a test marks it as average importance by default. +/// There are 5 levels of importance (`Critical`, `Important`, `Average`, `Iffy`, +/// `Fluff`); see the documentation on `Importance` for details. Add the importance +/// as a parameter to override the default (e.g. `#[perf(important)]`). +/// +/// Each test also has a weight factor. This is irrelevant on its own, but is considered +/// when comparing results across different runs. By default, this is set to 50; +/// pass `weight = n` as a parameter to override this. Note that this value is only +/// relevant within its importance category. +/// +/// By default, the number of iterations when profiling this test is auto-determined. +/// If this needs to be overwritten, pass the desired iteration count as a parameter +/// (`#[perf(iterations = n)]`). Note that the actual profiler may still run the test +/// an arbitrary number times; this flag just sets the number of executions before the +/// process is restarted and global state is reset. +/// +/// This attribute should probably not be applied to tests that do any significant +/// disk IO, as locks on files may not be released in time when repeating a test many +/// times. This might lead to spurious failures. +/// +/// # Examples +/// ```rust +/// use zed_util_macros::perf; +/// +/// #[perf] +/// fn generic_test() { +/// // Test goes here. +/// } +/// +/// #[perf(fluff, weight = 30)] +/// fn cold_path_test() { +/// // Test goes here. +/// } +/// ``` +/// +/// This also works with `#[gpui::test]`s, though in most cases it shouldn't +/// be used with automatic iterations. +/// ```rust,ignore +/// use zed_util_macros::perf; +/// +/// #[perf(iterations = 1, critical)] +/// #[gpui::test] +/// fn oneshot_test(_cx: &mut gpui::TestAppContext) { +/// // Test goes here. +/// } +/// ``` +#[proc_macro_attribute] +#[warn(clippy::all, clippy::pedantic)] +pub fn perf(our_attr: TokenStream, input: TokenStream) -> TokenStream { + let mut args = PerfArgs::default(); + let parser = syn::meta::parser(|meta| PerfArgs::parse_into(&mut args, meta)); + parse_macro_input!(our_attr with parser); + + let ItemFn { + attrs: mut attrs_main, + vis, + sig: mut sig_main, + block, + } = parse_macro_input!(input as ItemFn); + if !attrs_main + .iter() + .any(|a| Some(&parse_quote!(test)) == a.path().segments.last()) + { + attrs_main.push(parse_quote!(#[test])); + } + attrs_main.push(parse_quote!(#[allow(non_snake_case)])); + + let fns = if cfg!(perf_enabled) { + #[allow(clippy::wildcard_imports, reason = "We control the other side")] + use consts::*; + + // Make the ident obvious when calling, for the test parser. + // Also set up values for the second metadata-returning "test". + let mut new_ident_main = sig_main.ident.to_string(); + let mut new_ident_meta = new_ident_main.clone(); + new_ident_main.push_str(SUF_NORMAL); + new_ident_meta.push_str(SUF_MDATA); + + let new_ident_main = syn::Ident::new(&new_ident_main, sig_main.ident.span()); + sig_main.ident = new_ident_main; + + // We don't want any nonsense if the original test had a weird signature. + let new_ident_meta = syn::Ident::new(&new_ident_meta, sig_main.ident.span()); + let sig_meta = parse_quote!(fn #new_ident_meta()); + let attrs_meta = parse_quote!(#[test] #[allow(non_snake_case)]); + + // Make the test loop as the harness instructs it to. + let block_main = { + // The perf harness will pass us the value in an env var. Even if we + // have a preset value, just do this to keep the code paths unified. + parse_quote!({ + let iter_count = std::env::var(#ITER_ENV_VAR).unwrap().parse::().unwrap(); + for _ in 0..iter_count { + #block + } + }) + }; + let importance = format!("{}", args.importance); + let block_meta = { + // This function's job is to just print some relevant info to stdout, + // based on the params this attr is passed. It's not an actual test. + // Since we use a custom attr set on our metadata fn, it shouldn't + // cause problems with xfail tests. + let q_iter = if let Some(iter) = args.iterations { + quote! { + println!("{} {} {}", #MDATA_LINE_PREF, #ITER_COUNT_LINE_NAME, #iter); + } + } else { + quote! {} + }; + let weight = args + .weight + .unwrap_or_else(|| parse_quote! { #WEIGHT_DEFAULT }); + parse_quote!({ + #q_iter + println!("{} {} {}", #MDATA_LINE_PREF, #WEIGHT_LINE_NAME, #weight); + println!("{} {} {}", #MDATA_LINE_PREF, #IMPORTANCE_LINE_NAME, #importance); + println!("{} {} {}", #MDATA_LINE_PREF, #VERSION_LINE_NAME, #MDATA_VER); + }) + }; + + vec![ + // The real test. + ItemFn { + attrs: attrs_main, + vis: vis.clone(), + sig: sig_main, + block: block_main, + }, + // The fake test. + ItemFn { + attrs: attrs_meta, + vis, + sig: sig_meta, + block: block_meta, + }, + ] + } else { + vec![ItemFn { + attrs: attrs_main, + vis, + sig: sig_main, + block, + }] + }; + + fns.into_iter() + .flat_map(|f| TokenStream::from(f.into_token_stream())) + .collect() +} diff --git a/crates/vim/Cargo.toml b/crates/vim/Cargo.toml index 434b14b07cd64f6ed1e8e658fde68cff855ec633..ad84eecd91ddfc4b300b437936aba0ac21b4e41c 100644 --- a/crates/vim/Cargo.toml +++ b/crates/vim/Cargo.toml @@ -34,19 +34,21 @@ multi_buffer.workspace = true nvim-rs = { git = "https://github.com/KillTheMule/nvim-rs", rev = "764dd270c642f77f10f3e19d05cc178a6cbe69f3", features = ["use_tokio"], optional = true } picker.workspace = true project.workspace = true +project_panel.workspace = true regex.workspace = true schemars.workspace = true search.workspace = true serde.workspace = true -serde_derive.workspace = true serde_json.workspace = true settings.workspace = true task.workspace = true text.workspace = true theme.workspace = true +menu.workspace = true tokio = { version = "1.15", features = ["full"], optional = true } ui.workspace = true util.workspace = true +util_macros.workspace = true vim_mode_setting.workspace = true workspace.workspace = true zed_actions.workspace = true @@ -66,5 +68,6 @@ parking_lot.workspace = true project_panel.workspace = true release_channel.workspace = true settings.workspace = true +perf.workspace = true util = { workspace = true, features = ["test-support"] } workspace = { workspace = true, features = ["test-support"] } diff --git a/crates/vim/src/command.rs b/crates/vim/src/command.rs index 5fee0b95f11d94e8a448a8a11a43cc158786d190..ef19d41ed88f7f6a9dfc64521041a41d2238da31 100644 --- a/crates/vim/src/command.rs +++ b/crates/vim/src/command.rs @@ -1,12 +1,13 @@ -use anyhow::Result; +use anyhow::{Result, anyhow}; use collections::{HashMap, HashSet}; use command_palette_hooks::CommandInterceptResult; use editor::{ - Bias, Editor, SelectionEffects, ToPoint, + Bias, Editor, EditorSettings, SelectionEffects, ToPoint, actions::{SortLinesCaseInsensitive, SortLinesCaseSensitive}, display_map::ToDisplayPoint, }; -use gpui::{Action, App, AppContext as _, Context, Global, Keystroke, Window, actions}; +use futures::AsyncWriteExt as _; +use gpui::{Action, App, AppContext as _, Context, Global, Keystroke, Task, Window, actions}; use itertools::Itertools; use language::Point; use multi_buffer::MultiBufferRow; @@ -15,19 +16,19 @@ use regex::Regex; use schemars::JsonSchema; use search::{BufferSearchBar, SearchOptions}; use serde::Deserialize; +use settings::{Settings, SettingsStore}; use std::{ - io::Write, iter::Peekable, ops::{Deref, Range}, path::Path, process::Stdio, str::Chars, - sync::{Arc, OnceLock}, + sync::OnceLock, time::Instant, }; use task::{HideStrategy, RevealStrategy, SpawnInTerminal, TaskId}; use ui::ActiveTheme; -use util::ResultExt; +use util::{ResultExt, rel_path::RelPath}; use workspace::{Item, SaveIntent, notifications::NotifyResultExt}; use workspace::{SplitDirection, notifications::DetachAndPromptErr}; use zed_actions::{OpenDocs, RevealTarget}; @@ -80,6 +81,7 @@ pub enum VimOption { Wrap(bool), Number(bool), RelativeNumber(bool), + IgnoreCase(bool), } impl VimOption { @@ -122,6 +124,10 @@ impl VimOption { (None, VimOption::RelativeNumber(false)), (Some("rnu"), VimOption::RelativeNumber(true)), (Some("nornu"), VimOption::RelativeNumber(false)), + (None, VimOption::IgnoreCase(true)), + (None, VimOption::IgnoreCase(false)), + (Some("ic"), VimOption::IgnoreCase(true)), + (Some("noic"), VimOption::IgnoreCase(false)), ] .into_iter() .filter(move |(prefix, option)| prefix.unwrap_or(option.to_string()).starts_with(query)) @@ -143,6 +149,11 @@ impl VimOption { "norelativenumber" => Some(Self::RelativeNumber(false)), "nornu" => Some(Self::RelativeNumber(false)), + "ignorecase" => Some(Self::IgnoreCase(true)), + "ic" => Some(Self::IgnoreCase(true)), + "noignorecase" => Some(Self::IgnoreCase(false)), + "noic" => Some(Self::IgnoreCase(false)), + _ => None, } } @@ -155,6 +166,8 @@ impl VimOption { VimOption::Number(false) => "nonumber", VimOption::RelativeNumber(true) => "relativenumber", VimOption::RelativeNumber(false) => "norelativenumber", + VimOption::IgnoreCase(true) => "ignorecase", + VimOption::IgnoreCase(false) => "noignorecase", } } } @@ -257,6 +270,13 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { VimOption::RelativeNumber(enabled) => { editor.set_relative_line_number(Some(*enabled), cx); } + VimOption::IgnoreCase(enabled) => { + let mut settings = EditorSettings::get_global(cx).clone(); + settings.search.case_sensitive = !*enabled; + SettingsStore::update(cx, |store, _| { + store.override_global(settings); + }); + } }); } }); @@ -305,31 +325,54 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { let Some(worktree) = project.read(cx).visible_worktrees(cx).next() else { return; }; - let project_path = ProjectPath { - worktree_id: worktree.read(cx).id(), - path: Arc::from(Path::new(&action.filename)), + let path_style = worktree.read(cx).path_style(); + let Ok(project_path) = + RelPath::new(Path::new(&action.filename), path_style).map(|path| ProjectPath { + worktree_id: worktree.read(cx).id(), + path: path.into_arc(), + }) + else { + // TODO implement save_as with absolute path + Task::ready(Err::<(), _>(anyhow!( + "Cannot save buffer with absolute path" + ))) + .detach_and_prompt_err( + "Failed to save", + window, + cx, + |_, _, _| None, + ); + return; }; - if project.read(cx).entry_for_path(&project_path, cx).is_some() && action.save_intent != Some(SaveIntent::Overwrite) { + if project.read(cx).entry_for_path(&project_path, cx).is_some() + && action.save_intent != Some(SaveIntent::Overwrite) + { let answer = window.prompt( gpui::PromptLevel::Critical, - &format!("{} already exists. Do you want to replace it?", project_path.path.to_string_lossy()), + &format!( + "{} already exists. Do you want to replace it?", + project_path.path.display(path_style) + ), Some( - "A file or folder with the same name already exists. Replacing it will overwrite its current contents.", + "A file or folder with the same name already exists. \ + Replacing it will overwrite its current contents.", ), &["Replace", "Cancel"], - cx); + cx, + ); cx.spawn_in(window, async move |editor, cx| { if answer.await.ok() != Some(0) { return; } - let _ = editor.update_in(cx, |editor, window, cx|{ + let _ = editor.update_in(cx, |editor, window, cx| { editor .save_as(project, project_path, window, cx) .detach_and_prompt_err("Failed to :w", window, cx, |_, _, _| None); }); - }).detach(); + }) + .detach(); } else { editor .save_as(project, project_path, window, cx) @@ -348,9 +391,13 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { let Some(worktree) = project.read(cx).visible_worktrees(cx).next() else { return; }; + let path_style = worktree.read(cx).path_style(); + let Some(path) = RelPath::new(Path::new(&action.filename), path_style).log_err() else { + return; + }; let project_path = ProjectPath { worktree_id: worktree.read(cx).id(), - path: Arc::from(Path::new(&action.filename)), + path: path.into_arc(), }; let direction = if action.vertical { @@ -442,9 +489,13 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { let Some(worktree) = project.read(cx).visible_worktrees(cx).next() else { return; }; + let path_style = worktree.read(cx).path_style(); + let Some(path) = RelPath::new(Path::new(&action.filename), path_style).log_err() else { + return; + }; let project_path = ProjectPath { worktree_id: worktree.read(cx).id(), - path: Arc::from(Path::new(&action.filename)), + path: path.into_arc(), }; let _ = workspace.update(cx, |workspace, cx| { @@ -463,7 +514,7 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { .collect(); vim.switch_mode(Mode::Normal, true, window, cx); let initial_selections = - vim.update_editor(cx, |_, editor, _| editor.selections.disjoint_anchors()); + vim.update_editor(cx, |_, editor, _| editor.selections.disjoint_anchors_arc()); if let Some(range) = &action.range { let result = vim.update_editor(cx, |vim, editor, cx| { let range = range.buffer_range(vim, editor, window, cx)?; @@ -515,7 +566,7 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { .buffer() .update(cx, |multi, cx| multi.last_transaction_id(cx)) { - let last_sel = editor.selections.disjoint_anchors(); + let last_sel = editor.selections.disjoint_anchors_arc(); editor.modify_transaction_selection_history(tx_id, |old| { old.0 = first_sel; old.1 = Some(last_sel); @@ -551,7 +602,7 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { let buffer_row = action.range.head().buffer_row(vim, editor, window, cx)?; let current = editor.selections.newest::(cx); let target = snapshot - .buffer_snapshot + .buffer_snapshot() .clip_point(Point::new(buffer_row.0, current.head().column), Bias::Left); editor.change_selections(Default::default(), window, cx, |s| { s.select_ranges([target..target]); @@ -573,10 +624,10 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { vim.update_editor(cx, |vim, editor, cx| { let snapshot = editor.snapshot(window, cx); if let Ok(range) = action.range.buffer_range(vim, editor, window, cx) { - let end = if range.end < snapshot.buffer_snapshot.max_row() { + let end = if range.end < snapshot.buffer_snapshot().max_row() { Point::new(range.end.0 + 1, 0) } else { - snapshot.buffer_snapshot.max_point() + snapshot.buffer_snapshot().max_point() }; vim.copy_ranges( editor, @@ -912,7 +963,7 @@ impl Position { ) }) { anchor - .to_point(&snapshot.buffer_snapshot) + .to_point(&snapshot.buffer_snapshot()) .row .saturating_add_signed(*offset) } else { @@ -928,12 +979,12 @@ impl Position { let Some(mark) = anchors.last() else { anyhow::bail!("mark {name} contains empty anchors"); }; - mark.to_point(&snapshot.buffer_snapshot) + mark.to_point(&snapshot.buffer_snapshot()) .row .saturating_add_signed(*offset) } Position::LastLine { offset } => snapshot - .buffer_snapshot + .buffer_snapshot() .max_row() .0 .saturating_add_signed(*offset), @@ -941,12 +992,12 @@ impl Position { .selections .newest_anchor() .head() - .to_point(&snapshot.buffer_snapshot) + .to_point(&snapshot.buffer_snapshot()) .row .saturating_add_signed(*offset), }; - Ok(MultiBufferRow(target).min(snapshot.buffer_snapshot.max_row())) + Ok(MultiBufferRow(target).min(snapshot.buffer_snapshot().max_row())) } } @@ -1601,7 +1652,7 @@ impl OnMatchingLines { let point_range = Point::new(range.start.0, 0) ..snapshot - .buffer_snapshot + .buffer_snapshot() .clip_point(Point::new(range.end.0 + 1, 0), Bias::Left); cx.spawn_in(window, async move |editor, cx| { let new_selections = cx @@ -1609,7 +1660,7 @@ impl OnMatchingLines { let mut line = String::new(); let mut new_selections = Vec::new(); let chunks = snapshot - .buffer_snapshot + .buffer_snapshot() .text_for_range(point_range) .chain(["\n"]); @@ -1710,9 +1761,8 @@ impl Vim { if let Some((_, buffer, _)) = editor.active_excerpt(cx) && let Some(file) = buffer.read(cx).file() && let Some(local) = file.as_local() - && let Some(str) = local.path().to_str() { - ret.push_str(str) + ret.push_str(&local.path().display(local.path_style(cx))); } }); } @@ -1936,7 +1986,6 @@ impl ShellExec { process.stdin(Stdio::null()); }; - util::set_pre_exec_to_start_new_session(&mut process); let is_read = self.is_read; let task = cx.spawn_in(window, async move |vim, cx| { @@ -1954,18 +2003,16 @@ impl ShellExec { let range = range.clone(); cx.background_spawn(async move { for chunk in snapshot.text_for_range(range) { - if stdin.write_all(chunk.as_bytes()).log_err().is_none() { + if stdin.write_all(chunk.as_bytes()).await.log_err().is_none() { return; } } - stdin.flush().log_err(); + stdin.flush().await.log_err(); }) .detach(); }; - let output = cx - .background_spawn(async move { running.wait_with_output() }) - .await; + let output = cx.background_spawn(running.output()).await; let Some(output) = output.log_err() else { vim.update_in(cx, |vim, window, cx| { @@ -2018,9 +2065,10 @@ mod test { state::Mode, test::{NeovimBackedTestContext, VimTestContext}, }; - use editor::Editor; + use editor::{Editor, EditorSettings}; use gpui::{Context, TestAppContext}; use indoc::indoc; + use settings::Settings; use util::path; use workspace::Workspace; @@ -2578,4 +2626,52 @@ mod test { assert_active_item(workspace, path!("/root/dir/file_3.rs"), "", cx); }); } + + #[gpui::test] + async fn test_ignorecase_command(cx: &mut TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + cx.read(|cx| { + assert_eq!( + EditorSettings::get_global(cx).search.case_sensitive, + false, + "The `case_sensitive` setting should be `false` by default." + ); + }); + cx.simulate_keystrokes(": set space noignorecase"); + cx.simulate_keystrokes("enter"); + cx.read(|cx| { + assert_eq!( + EditorSettings::get_global(cx).search.case_sensitive, + true, + "The `case_sensitive` setting should have been enabled with `:set noignorecase`." + ); + }); + cx.simulate_keystrokes(": set space ignorecase"); + cx.simulate_keystrokes("enter"); + cx.read(|cx| { + assert_eq!( + EditorSettings::get_global(cx).search.case_sensitive, + false, + "The `case_sensitive` setting should have been disabled with `:set ignorecase`." + ); + }); + cx.simulate_keystrokes(": set space noic"); + cx.simulate_keystrokes("enter"); + cx.read(|cx| { + assert_eq!( + EditorSettings::get_global(cx).search.case_sensitive, + true, + "The `case_sensitive` setting should have been enabled with `:set noic`." + ); + }); + cx.simulate_keystrokes(": set space ic"); + cx.simulate_keystrokes("enter"); + cx.read(|cx| { + assert_eq!( + EditorSettings::get_global(cx).search.case_sensitive, + false, + "The `case_sensitive` setting should have been disabled with `:set ic`." + ); + }); + } } diff --git a/crates/vim/src/digraph.rs b/crates/vim/src/digraph.rs index 796dad94c0329ed56c2e1c39f1cc2e2fc102fe4d..7a2ae08cace066bd6fa73d9914aac847b0fb1136 100644 --- a/crates/vim/src/digraph.rs +++ b/crates/vim/src/digraph.rs @@ -224,7 +224,6 @@ mod test { use settings::SettingsStore; use crate::{ - VimSettings, state::Mode, test::{NeovimBackedTestContext, VimTestContext}, }; @@ -294,11 +293,11 @@ mod test { let mut cx: VimTestContext = VimTestContext::new(cx, true).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { + store.update_user_settings(cx, |s| { let mut custom_digraphs = HashMap::default(); custom_digraphs.insert("|-".into(), "⊢".into()); custom_digraphs.insert(":)".into(), "👨‍💻".into()); - s.custom_digraphs = Some(custom_digraphs); + s.vim.get_or_insert_default().custom_digraphs = Some(custom_digraphs); }); }); diff --git a/crates/vim/src/helix.rs b/crates/vim/src/helix.rs index 9f5580d75cc4f3588e4211d1ef2bbfb7df49c92f..d2c270e5239204b169c55483fdd6ac3185dd4529 100644 --- a/crates/vim/src/helix.rs +++ b/crates/vim/src/helix.rs @@ -1,17 +1,24 @@ mod boundary; mod object; +mod paste; mod select; use editor::display_map::DisplaySnapshot; use editor::{ - DisplayPoint, Editor, HideMouseCursorOrigin, SelectionEffects, ToOffset, ToPoint, movement, + DisplayPoint, Editor, EditorSettings, HideMouseCursorOrigin, SelectionEffects, ToOffset, + ToPoint, movement, }; use gpui::actions; use gpui::{Context, Window}; use language::{CharClassifier, CharKind, Point}; +use search::{BufferSearchBar, SearchOptions}; +use settings::Settings; use text::{Bias, SelectionGoal}; +use workspace::searchable; +use workspace::searchable::FilteredSearchRange; use crate::motion; +use crate::state::SearchState; use crate::{ Vim, motion::{Motion, right}, @@ -31,6 +38,8 @@ actions!( HelixGotoLastModification, /// Select entire line or multiple lines, extending downwards. HelixSelectLine, + /// Select all matches of a given pattern within the current selection. + HelixSelectRegex, ] ); @@ -40,6 +49,8 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { Vim::action(editor, cx, Vim::helix_append); Vim::action(editor, cx, Vim::helix_yank); Vim::action(editor, cx, Vim::helix_goto_last_modification); + Vim::action(editor, cx, Vim::helix_paste); + Vim::action(editor, cx, Vim::helix_select_regex); } impl Vim { @@ -53,6 +64,35 @@ impl Vim { self.helix_move_cursor(motion, times, window, cx); } + pub fn helix_select_motion( + &mut self, + motion: Motion, + times: Option, + window: &mut Window, + cx: &mut Context, + ) { + self.update_editor(cx, |_, editor, cx| { + let text_layout_details = editor.text_layout_details(window); + editor.change_selections(Default::default(), window, cx, |s| { + s.move_with(|map, selection| { + let current_head = selection.head(); + + let Some((new_head, goal)) = motion.move_point( + map, + current_head, + selection.goal, + times, + &text_layout_details, + ) else { + return; + }; + + selection.set_head(new_head, goal); + }) + }); + }); + } + /// Updates all selections based on where the cursors are. fn helix_new_selections( &mut self, @@ -93,7 +133,7 @@ impl Vim { self.helix_new_selections(window, cx, |cursor, map| { let mut head = movement::right(map, cursor); let mut tail = cursor; - let classifier = map.buffer_snapshot.char_classifier_at(head.to_point(map)); + let classifier = map.buffer_snapshot().char_classifier_at(head.to_point(map)); if head == map.max_point() { return None; } @@ -130,7 +170,7 @@ impl Vim { // but the search starts from the left side of it, // so to include that space the selection must end one character to the right. let mut tail = movement::right(map, cursor); - let classifier = map.buffer_snapshot.char_classifier_at(head.to_point(map)); + let classifier = map.buffer_snapshot().char_classifier_at(head.to_point(map)); if head == DisplayPoint::zero() { return None; } @@ -317,6 +357,9 @@ impl Vim { ); } }); + + // Drop back to normal mode after yanking + self.switch_mode(Mode::HelixNormal, true, window, cx); } fn helix_insert(&mut self, _: &HelixInsert, window: &mut Window, cx: &mut Context) { @@ -334,6 +377,64 @@ impl Vim { self.switch_mode(Mode::Insert, false, window, cx); } + fn helix_select_regex( + &mut self, + _: &HelixSelectRegex, + window: &mut Window, + cx: &mut Context, + ) { + Vim::take_forced_motion(cx); + let Some(pane) = self.pane(window, cx) else { + return; + }; + let prior_selections = self.editor_selections(window, cx); + pane.update(cx, |pane, cx| { + if let Some(search_bar) = pane.toolbar().read(cx).item_of_type::() { + search_bar.update(cx, |search_bar, cx| { + if !search_bar.show(window, cx) { + return; + } + + search_bar.select_query(window, cx); + cx.focus_self(window); + + search_bar.set_replacement(None, cx); + let mut options = SearchOptions::NONE; + options |= SearchOptions::REGEX; + if EditorSettings::get_global(cx).search.case_sensitive { + options |= SearchOptions::CASE_SENSITIVE; + } + search_bar.set_search_options(options, cx); + if let Some(search) = search_bar.set_search_within_selection( + Some(FilteredSearchRange::Selection), + window, + cx, + ) { + cx.spawn_in(window, async move |search_bar, cx| { + if search.await.is_ok() { + search_bar.update_in(cx, |search_bar, window, cx| { + search_bar.activate_current_match(window, cx) + }) + } else { + Ok(()) + } + }) + .detach_and_log_err(cx); + } + self.search = SearchState { + direction: searchable::Direction::Next, + count: 1, + prior_selections, + prior_operator: self.operator_stack.last().cloned(), + prior_mode: self.mode, + helix_select: true, + } + }); + } + }); + self.start_recording(cx); + } + fn helix_append(&mut self, _: &HelixAppend, window: &mut Window, cx: &mut Context) { self.start_recording(cx); self.switch_mode(Mode::Insert, false, window, cx); @@ -366,7 +467,7 @@ impl Vim { let was_empty = range.is_empty(); let was_reversed = selection.reversed; ( - map.buffer_snapshot.anchor_at(start_offset, Bias::Left), + map.buffer_snapshot().anchor_before(start_offset), end_offset - start_offset, was_empty, was_reversed, @@ -445,8 +546,8 @@ impl Vim { editor.hide_mouse_cursor(HideMouseCursorOrigin::MovementAction, cx); let display_map = editor.display_map.update(cx, |map, cx| map.snapshot(cx)); let mut selections = editor.selections.all::(cx); - let max_point = display_map.buffer_snapshot.max_point(); - let buffer_snapshot = &display_map.buffer_snapshot; + let max_point = display_map.buffer_snapshot().max_point(); + let buffer_snapshot = &display_map.buffer_snapshot(); for selection in &mut selections { // Start always goes to column 0 of the first selected line @@ -813,7 +914,16 @@ mod test { cx.simulate_keystrokes("y"); cx.shared_clipboard().assert_eq("worl"); cx.assert_state("hello «worlˇ»d", Mode::HelixNormal); + + // Test yanking in select mode character by character + cx.set_state("hello ˇworld", Mode::HelixNormal); + cx.simulate_keystroke("v"); + cx.assert_state("hello «wˇ»orld", Mode::HelixSelect); + cx.simulate_keystroke("y"); + cx.assert_state("hello «wˇ»orld", Mode::HelixNormal); + cx.shared_clipboard().assert_eq("w"); } + #[gpui::test] async fn test_shift_r_paste(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -1033,4 +1143,73 @@ mod test { Mode::HelixNormal, ); } + + #[gpui::test] + async fn test_helix_select_mode_motion(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + assert_eq!(cx.mode(), Mode::Normal); + cx.enable_helix(); + + cx.set_state("ˇhello", Mode::HelixNormal); + cx.simulate_keystrokes("l v l l"); + cx.assert_state("h«ellˇ»o", Mode::HelixSelect); + } + + #[gpui::test] + async fn test_helix_select_mode_motion_multiple_cursors(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + assert_eq!(cx.mode(), Mode::Normal); + cx.enable_helix(); + + // Start with multiple cursors (no selections) + cx.set_state("ˇhello\nˇworld", Mode::HelixNormal); + + // Enter select mode and move right twice + cx.simulate_keystrokes("v l l"); + + // Each cursor should independently create and extend its own selection + cx.assert_state("«helˇ»lo\n«worˇ»ld", Mode::HelixSelect); + } + + #[gpui::test] + async fn test_helix_select_word_motions(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + cx.set_state("ˇone two", Mode::Normal); + cx.simulate_keystrokes("v w"); + cx.assert_state("«one tˇ»wo", Mode::Visual); + + // In Vim, this selects "t". In helix selections stops just before "t" + + cx.enable_helix(); + cx.set_state("ˇone two", Mode::HelixNormal); + cx.simulate_keystrokes("v w"); + cx.assert_state("«one ˇ»two", Mode::HelixSelect); + } + + #[gpui::test] + async fn test_helix_select_regex(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + cx.enable_helix(); + + cx.set_state("ˇone two one", Mode::HelixNormal); + cx.simulate_keystrokes("x"); + cx.assert_state("«one two oneˇ»", Mode::HelixNormal); + cx.simulate_keystrokes("s o n e"); + cx.run_until_parked(); + cx.simulate_keystrokes("enter"); + cx.assert_state("«oneˇ» two «oneˇ»", Mode::HelixNormal); + + cx.simulate_keystrokes("x"); + cx.simulate_keystrokes("s"); + cx.run_until_parked(); + cx.simulate_keystrokes("enter"); + cx.assert_state("«oneˇ» two «oneˇ»", Mode::HelixNormal); + + cx.set_state("ˇone two one", Mode::HelixNormal); + cx.simulate_keystrokes("s o n e enter"); + cx.assert_state("ˇone two one", Mode::HelixNormal); + } } diff --git a/crates/vim/src/helix/boundary.rs b/crates/vim/src/helix/boundary.rs index 77d31eea3327a853d21a68065e0adc6230ad2c5a..a6de926bc5a10415dad6584f3d07476b2bf0e5d7 100644 --- a/crates/vim/src/helix/boundary.rs +++ b/crates/vim/src/helix/boundary.rs @@ -166,14 +166,16 @@ impl DerefMut for Offset { } impl Offset { fn next(self, map: &DisplaySnapshot) -> Option { - let next = Self(map.buffer_snapshot.clip_offset(*self + 1, Bias::Right)); + let next = Self(map.buffer_snapshot().clip_offset(*self + 1, Bias::Right)); (*next > *self).then(|| next) } fn previous(self, map: &DisplaySnapshot) -> Option { if *self == 0 { return None; } - Some(Self(map.buffer_snapshot.clip_offset(*self - 1, Bias::Left))) + Some(Self( + map.buffer_snapshot().clip_offset(*self - 1, Bias::Left), + )) } fn range( start: (DisplayPoint, Bias), @@ -388,7 +390,7 @@ impl ImmediateBoundary { impl BoundedObject for ImmediateBoundary { fn next_start(&self, map: &DisplaySnapshot, from: Offset, outer: bool) -> Option { try_find_boundary(map, from, |left, right| { - let classifier = map.buffer_snapshot.char_classifier_at(*from); + let classifier = map.buffer_snapshot().char_classifier_at(*from); if outer { self.is_outer_start(left, right, classifier) } else { @@ -398,7 +400,7 @@ impl BoundedObject for ImmediateBoundary { } fn next_end(&self, map: &DisplaySnapshot, from: Offset, outer: bool) -> Option { try_find_boundary(map, from, |left, right| { - let classifier = map.buffer_snapshot.char_classifier_at(*from); + let classifier = map.buffer_snapshot().char_classifier_at(*from); if outer { self.is_outer_end(left, right, classifier) } else { @@ -408,7 +410,7 @@ impl BoundedObject for ImmediateBoundary { } fn previous_start(&self, map: &DisplaySnapshot, from: Offset, outer: bool) -> Option { try_find_preceding_boundary(map, from, |left, right| { - let classifier = map.buffer_snapshot.char_classifier_at(*from); + let classifier = map.buffer_snapshot().char_classifier_at(*from); if outer { self.is_outer_start(left, right, classifier) } else { @@ -418,7 +420,7 @@ impl BoundedObject for ImmediateBoundary { } fn previous_end(&self, map: &DisplaySnapshot, from: Offset, outer: bool) -> Option { try_find_preceding_boundary(map, from, |left, right| { - let classifier = map.buffer_snapshot.char_classifier_at(*from); + let classifier = map.buffer_snapshot().char_classifier_at(*from); if outer { self.is_outer_end(left, right, classifier) } else { @@ -570,7 +572,7 @@ impl FuzzyBoundary { boundary_kind: Boundary, ) -> Option { let generate_boundary_data = |left, right, point: Offset| { - let classifier = map.buffer_snapshot.char_classifier_at(*from); + let classifier = map.buffer_snapshot().char_classifier_at(*from); let reach_boundary = if outer && boundary_kind == Boundary::Start { self.is_near_potential_outer_start(left, right, &classifier) } else if !outer && boundary_kind == Boundary::Start { @@ -659,12 +661,12 @@ fn try_find_boundary_data( boundary_information: impl Fn(char, char, Offset) -> Option, ) -> Option { let mut prev_ch = map - .buffer_snapshot + .buffer_snapshot() .reversed_chars_at(*from) .next() .unwrap_or('\0'); - for ch in map.buffer_snapshot.chars_at(*from).chain(['\0']) { + for ch in map.buffer_snapshot().chars_at(*from).chain(['\0']) { if let Some(boundary_information) = boundary_information(prev_ch, ch, from) { return Some(boundary_information); } @@ -700,9 +702,9 @@ fn try_find_preceding_boundary_data( mut from: Offset, is_boundary: impl Fn(char, char, Offset) -> Option, ) -> Option { - let mut prev_ch = map.buffer_snapshot.chars_at(*from).next().unwrap_or('\0'); + let mut prev_ch = map.buffer_snapshot().chars_at(*from).next().unwrap_or('\0'); - for ch in map.buffer_snapshot.reversed_chars_at(*from).chain(['\0']) { + for ch in map.buffer_snapshot().reversed_chars_at(*from).chain(['\0']) { if let Some(boundary_information) = is_boundary(ch, prev_ch, from) { return Some(boundary_information); } diff --git a/crates/vim/src/helix/paste.rs b/crates/vim/src/helix/paste.rs new file mode 100644 index 0000000000000000000000000000000000000000..9b6b6e454ac1e8d3a47009fcd85db0d2da00261e --- /dev/null +++ b/crates/vim/src/helix/paste.rs @@ -0,0 +1,454 @@ +use editor::{ToOffset, movement}; +use gpui::{Action, Context, Window}; +use schemars::JsonSchema; +use serde::Deserialize; + +use crate::{Vim, state::Mode}; + +/// Pastes text from the specified register at the cursor position. +#[derive(Clone, Deserialize, JsonSchema, PartialEq, Action)] +#[action(namespace = vim)] +#[serde(deny_unknown_fields)] +pub struct HelixPaste { + #[serde(default)] + before: bool, +} + +impl Vim { + pub fn helix_paste( + &mut self, + action: &HelixPaste, + window: &mut Window, + cx: &mut Context, + ) { + self.record_current_action(cx); + self.store_visual_marks(window, cx); + let count = Vim::take_count(cx).unwrap_or(1); + // TODO: vim paste calls take_forced_motion here, but I don't know what that does + // (none of the other helix_ methods call it) + + self.update_editor(cx, |vim, editor, cx| { + editor.transact(window, cx, |editor, window, cx| { + editor.set_clip_at_line_ends(false, cx); + + let selected_register = vim.selected_register.take(); + + let Some((text, clipboard_selections)) = Vim::update_globals(cx, |globals, cx| { + globals.read_register(selected_register, Some(editor), cx) + }) + .and_then(|reg| { + (!reg.text.is_empty()) + .then_some(reg.text) + .zip(reg.clipboard_selections) + }) else { + return; + }; + + let (display_map, current_selections) = editor.selections.all_adjusted_display(cx); + + // The clipboard can have multiple selections, and there can + // be multiple selections. Helix zips them together, so the first + // clipboard entry gets pasted at the first selection, the second + // entry gets pasted at the second selection, and so on. If there + // are more clipboard selections than selections, the extra ones + // don't get pasted anywhere. If there are more selections than + // clipboard selections, the last clipboard selection gets + // pasted at all remaining selections. + + let mut edits = Vec::new(); + let mut new_selections = Vec::new(); + let mut start_offset = 0; + + let mut replacement_texts: Vec = Vec::new(); + + for ix in 0..current_selections.len() { + let to_insert = if let Some(clip_sel) = clipboard_selections.get(ix) { + let end_offset = start_offset + clip_sel.len; + let text = text[start_offset..end_offset].to_string(); + start_offset = end_offset + 1; + text + } else if let Some(last_text) = replacement_texts.last() { + // We have more current selections than clipboard selections: repeat the last one. + last_text.to_owned() + } else { + text.to_string() + }; + replacement_texts.push(to_insert); + } + + let line_mode = replacement_texts.iter().any(|text| text.ends_with('\n')); + + for (to_insert, sel) in replacement_texts.into_iter().zip(current_selections) { + // Helix doesn't care about the head/tail of the selection. + // Pasting before means pasting before the whole selection. + let display_point = if line_mode { + if action.before { + movement::line_beginning(&display_map, sel.start, false) + } else { + if sel.start == sel.end { + movement::right( + &display_map, + movement::line_end(&display_map, sel.end, false), + ) + } else { + sel.end + } + } + } else if action.before { + sel.start + } else if sel.start == sel.end { + // Helix and Zed differ in how they understand + // single-point cursors. In Helix, a single-point cursor + // is "on top" of some character, and pasting after that + // cursor means that the pasted content should go after + // that character. (If the cursor is at the end of a + // line, the pasted content goes on the next line.) + movement::right(&display_map, sel.end) + } else { + sel.end + }; + let point = display_point.to_point(&display_map); + let anchor = if action.before { + display_map.buffer_snapshot().anchor_after(point) + } else { + display_map.buffer_snapshot().anchor_before(point) + }; + edits.push((point..point, to_insert.repeat(count))); + new_selections.push((anchor, to_insert.len() * count)); + } + + editor.edit(edits, cx); + + editor.change_selections(Default::default(), window, cx, |s| { + let snapshot = s.buffer().clone(); + s.select_ranges(new_selections.into_iter().map(|(anchor, len)| { + let offset = anchor.to_offset(&snapshot); + if action.before { + offset.saturating_sub(len)..offset + } else { + offset..(offset + len) + } + })); + }) + }); + }); + + self.switch_mode(Mode::HelixNormal, true, window, cx); + } +} + +#[cfg(test)] +mod test { + use indoc::indoc; + + use crate::{state::Mode, test::VimTestContext}; + + #[gpui::test] + async fn test_paste(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + cx.enable_helix(); + cx.set_state( + indoc! {" + The «quiˇ»ck brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + cx.simulate_keystrokes("y w p"); + + cx.assert_state( + indoc! {" + The quick «quiˇ»brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + // Pasting before the selection: + cx.set_state( + indoc! {" + The quick brown + fox «jumpsˇ» over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("shift-p"); + cx.assert_state( + indoc! {" + The quick brown + fox «quiˇ»jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + } + + #[gpui::test] + async fn test_point_selection_paste(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + cx.enable_helix(); + cx.set_state( + indoc! {" + The quiˇck brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + cx.simulate_keystrokes("y"); + + // Pasting before the selection: + cx.set_state( + indoc! {" + The quick brown + fox jumpsˇ over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("shift-p"); + cx.assert_state( + indoc! {" + The quick brown + fox jumps«cˇ» over + the lazy dog."}, + Mode::HelixNormal, + ); + + // Pasting after the selection: + cx.set_state( + indoc! {" + The quick brown + fox jumpsˇ over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("p"); + cx.assert_state( + indoc! {" + The quick brown + fox jumps «cˇ»over + the lazy dog."}, + Mode::HelixNormal, + ); + + // Pasting after the selection at the end of a line: + cx.set_state( + indoc! {" + The quick brown + fox jumps overˇ + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("p"); + cx.assert_state( + indoc! {" + The quick brown + fox jumps over + «cˇ»the lazy dog."}, + Mode::HelixNormal, + ); + } + + #[gpui::test] + async fn test_multi_cursor_paste(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + cx.enable_helix(); + // Select two blocks of text. + cx.set_state( + indoc! {" + The «quiˇ»ck brown + fox ju«mpsˇ» over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("y"); + + // Only one cursor: only the first block gets pasted. + cx.set_state( + indoc! {" + ˇThe quick brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("shift-p"); + cx.assert_state( + indoc! {" + «quiˇ»The quick brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + // Two cursors: both get pasted. + cx.set_state( + indoc! {" + ˇThe ˇquick brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("shift-p"); + cx.assert_state( + indoc! {" + «quiˇ»The «mpsˇ»quick brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + // Three cursors: the second yanked block is duplicated. + cx.set_state( + indoc! {" + ˇThe ˇquick brown + fox jumpsˇ over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("shift-p"); + cx.assert_state( + indoc! {" + «quiˇ»The «mpsˇ»quick brown + fox jumps«mpsˇ» over + the lazy dog."}, + Mode::HelixNormal, + ); + + // Again with three cursors. All three should be pasted twice. + cx.set_state( + indoc! {" + ˇThe ˇquick brown + fox jumpsˇ over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("2 shift-p"); + cx.assert_state( + indoc! {" + «quiquiˇ»The «mpsmpsˇ»quick brown + fox jumps«mpsmpsˇ» over + the lazy dog."}, + Mode::HelixNormal, + ); + } + + #[gpui::test] + async fn test_line_mode_paste(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + cx.enable_helix(); + cx.set_state( + indoc! {" + The quick brow«n + ˇ»fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + cx.simulate_keystrokes("y shift-p"); + + cx.assert_state( + indoc! {" + «n + ˇ»The quick brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + // In line mode, if we're in the middle of a line then pasting before pastes on + // the line before. + cx.set_state( + indoc! {" + The quick brown + fox jumpsˇ over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("shift-p"); + cx.assert_state( + indoc! {" + The quick brown + «n + ˇ»fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + // In line mode, if we're in the middle of a line then pasting after pastes on + // the line after. + cx.set_state( + indoc! {" + The quick brown + fox jumpsˇ over + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("p"); + cx.assert_state( + indoc! {" + The quick brown + fox jumps over + «n + ˇ»the lazy dog."}, + Mode::HelixNormal, + ); + + // If we're currently at the end of a line, "the line after" + // means right after the cursor. + cx.set_state( + indoc! {" + The quick brown + fox jumps overˇ + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("p"); + cx.assert_state( + indoc! {" + The quick brown + fox jumps over + «n + ˇ»the lazy dog."}, + Mode::HelixNormal, + ); + + cx.set_state( + indoc! {" + + The quick brown + fox jumps overˇ + the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("x y up up p"); + cx.assert_state( + indoc! {" + + «fox jumps over + ˇ»The quick brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + + cx.set_state( + indoc! {" + «The quick brown + fox jumps over + ˇ»the lazy dog."}, + Mode::HelixNormal, + ); + cx.simulate_keystrokes("y p p"); + cx.assert_state( + indoc! {" + The quick brown + fox jumps over + The quick brown + fox jumps over + «The quick brown + fox jumps over + ˇ»the lazy dog."}, + Mode::HelixNormal, + ); + } +} diff --git a/crates/vim/src/motion.rs b/crates/vim/src/motion.rs index e2dfb24008c2f23044ca1f3633dcc02930b41e54..666d2573a53cbf74ed1c2edee02c8561167038c3 100644 --- a/crates/vim/src/motion.rs +++ b/crates/vim/src/motion.rs @@ -726,9 +726,8 @@ impl Vim { self.visual_motion(motion, count, window, cx) } - Mode::HelixNormal | Mode::HelixSelect => { - self.helix_normal_motion(motion, count, window, cx) - } + Mode::HelixNormal => self.helix_normal_motion(motion, count, window, cx), + Mode::HelixSelect => self.helix_select_motion(motion, count, window, cx), } self.clear_operator(window, cx); if let Some(operator) = waiting_operator { @@ -1388,7 +1387,7 @@ impl Motion { let end = selection.end.to_point(map); let start_row = MultiBufferRow(selection.start.to_point(map).row); if end.row > start.row { - selection.end = Point::new(start_row.0, map.buffer_snapshot.line_len(start_row)) + selection.end = Point::new(start_row.0, map.buffer_snapshot().line_len(start_row)) .to_display_point(map); // a bit of a hack, we need `cw` on a blank line to not delete the newline, @@ -1526,6 +1525,11 @@ fn wrapping_right_single(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayP } } +/// Given a point, returns the start of the buffer row that is a given number of +/// buffer rows away from the current position. +/// +/// This moves by buffer rows instead of display rows, a distinction that is +/// important when soft wrapping is enabled. pub(crate) fn start_of_relative_buffer_row( map: &DisplaySnapshot, point: DisplayPoint, @@ -1533,11 +1537,11 @@ pub(crate) fn start_of_relative_buffer_row( ) -> DisplayPoint { let start = map.display_point_to_fold_point(point, Bias::Left); let target = start.row() as isize + times; - let new_row = (target.max(0) as u32).min(map.fold_snapshot.max_point().row()); + let new_row = (target.max(0) as u32).min(map.fold_snapshot().max_point().row()); map.clip_point( map.fold_point_to_display_point( - map.fold_snapshot + map.fold_snapshot() .clip_point(FoldPoint::new(new_row, 0), Bias::Right), ), Bias::Right, @@ -1567,27 +1571,27 @@ fn up_down_buffer_rows( let start = map.display_point_to_fold_point(point, Bias::Left); let begin_folded_line = map.fold_point_to_display_point( - map.fold_snapshot + map.fold_snapshot() .clip_point(FoldPoint::new(start.row(), 0), Bias::Left), ); let select_nth_wrapped_row = point.row().0 - begin_folded_line.row().0; let (goal_wrap, goal_x) = match goal { SelectionGoal::WrappedHorizontalPosition((row, x)) => (row, x), - SelectionGoal::HorizontalRange { end, .. } => (select_nth_wrapped_row, end), - SelectionGoal::HorizontalPosition(x) => (select_nth_wrapped_row, x), + SelectionGoal::HorizontalRange { end, .. } => (select_nth_wrapped_row, end as f32), + SelectionGoal::HorizontalPosition(x) => (select_nth_wrapped_row, x as f32), _ => { let x = map.x_for_display_point(point, text_layout_details); - goal = SelectionGoal::WrappedHorizontalPosition((select_nth_wrapped_row, x.0)); - (select_nth_wrapped_row, x.0) + goal = SelectionGoal::WrappedHorizontalPosition((select_nth_wrapped_row, x.into())); + (select_nth_wrapped_row, x.into()) } }; let target = start.row() as isize + times; - let new_row = (target.max(0) as u32).min(map.fold_snapshot.max_point().row()); + let new_row = (target.max(0) as u32).min(map.fold_snapshot().max_point().row()); let mut begin_folded_line = map.fold_point_to_display_point( - map.fold_snapshot + map.fold_snapshot() .clip_point(FoldPoint::new(new_row, 0), bias), ); @@ -1693,7 +1697,7 @@ pub(crate) fn next_word_start( times: usize, ) -> DisplayPoint { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(point.to_point(map)) .ignore_punctuation(ignore_punctuation); for _ in 0..times { @@ -1727,7 +1731,7 @@ pub(crate) fn next_word_end( always_advance: bool, ) -> DisplayPoint { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(point.to_point(map)) .ignore_punctuation(ignore_punctuation); for _ in 0..times { @@ -1775,7 +1779,7 @@ fn previous_word_start( times: usize, ) -> DisplayPoint { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(point.to_point(map)) .ignore_punctuation(ignore_punctuation); for _ in 0..times { @@ -1807,19 +1811,19 @@ fn previous_word_end( times: usize, ) -> DisplayPoint { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(point.to_point(map)) .ignore_punctuation(ignore_punctuation); let mut point = point.to_point(map); - if point.column < map.buffer_snapshot.line_len(MultiBufferRow(point.row)) - && let Some(ch) = map.buffer_snapshot.chars_at(point).next() + if point.column < map.buffer_snapshot().line_len(MultiBufferRow(point.row)) + && let Some(ch) = map.buffer_snapshot().chars_at(point).next() { point.column += ch.len_utf8() as u32; } for _ in 0..times { let new_point = movement::find_preceding_boundary_point( - &map.buffer_snapshot, + &map.buffer_snapshot(), point, FindRange::MultiLine, |left, right| { @@ -1850,7 +1854,7 @@ fn next_subword_start( times: usize, ) -> DisplayPoint { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(point.to_point(map)) .ignore_punctuation(ignore_punctuation); for _ in 0..times { @@ -1887,7 +1891,7 @@ pub(crate) fn next_subword_end( allow_cross_newline: bool, ) -> DisplayPoint { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(point.to_point(map)) .ignore_punctuation(ignore_punctuation); for _ in 0..times { @@ -1938,7 +1942,7 @@ fn previous_subword_start( times: usize, ) -> DisplayPoint { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(point.to_point(map)) .ignore_punctuation(ignore_punctuation); for _ in 0..times { @@ -1982,19 +1986,19 @@ fn previous_subword_end( times: usize, ) -> DisplayPoint { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(point.to_point(map)) .ignore_punctuation(ignore_punctuation); let mut point = point.to_point(map); - if point.column < map.buffer_snapshot.line_len(MultiBufferRow(point.row)) - && let Some(ch) = map.buffer_snapshot.chars_at(point).next() + if point.column < map.buffer_snapshot().line_len(MultiBufferRow(point.row)) + && let Some(ch) = map.buffer_snapshot().chars_at(point).next() { point.column += ch.len_utf8() as u32; } for _ in 0..times { let new_point = movement::find_preceding_boundary_point( - &map.buffer_snapshot, + &map.buffer_snapshot(), point, FindRange::MultiLine, |left, right| { @@ -2030,7 +2034,7 @@ pub(crate) fn first_non_whitespace( from: DisplayPoint, ) -> DisplayPoint { let mut start_offset = start_of_line(map, display_lines, from).to_offset(map, Bias::Left); - let classifier = map.buffer_snapshot.char_classifier_at(from.to_point(map)); + let classifier = map.buffer_snapshot().char_classifier_at(from.to_point(map)); for (ch, offset) in map.buffer_chars_at(start_offset) { if ch == '\n' { return from; @@ -2052,7 +2056,7 @@ pub(crate) fn last_non_whitespace( count: usize, ) -> DisplayPoint { let mut end_of_line = end_of_line(map, false, from, count).to_offset(map, Bias::Left); - let classifier = map.buffer_snapshot.char_classifier_at(from.to_point(map)); + let classifier = map.buffer_snapshot().char_classifier_at(from.to_point(map)); // NOTE: depending on clip_at_line_end we may already be one char back from the end. if let Some((ch, _)) = map.buffer_chars_at(end_of_line).next() @@ -2108,7 +2112,7 @@ pub(crate) fn middle_of_line( } else { let mut buffer_point = point.to_point(map); buffer_point.column = (map - .buffer_snapshot + .buffer_snapshot() .line_len(MultiBufferRow(buffer_point.row)) as f64 * percent) as u32; @@ -2140,7 +2144,7 @@ pub(crate) fn sentence_backwards( point: DisplayPoint, mut times: usize, ) -> DisplayPoint { - let mut start = point.to_point(map).to_offset(&map.buffer_snapshot); + let mut start = point.to_point(map).to_offset(&map.buffer_snapshot()); let mut chars = map.reverse_buffer_chars_at(start).peekable(); let mut was_newline = map @@ -2166,7 +2170,7 @@ pub(crate) fn sentence_backwards( if times == 0 || offset == 0 { return map.clip_point( start_of_next_sentence - .to_offset(&map.buffer_snapshot) + .to_offset(&map.buffer_snapshot()) .to_display_point(map), Bias::Left, ); @@ -2186,7 +2190,7 @@ pub(crate) fn sentence_forwards( point: DisplayPoint, mut times: usize, ) -> DisplayPoint { - let start = point.to_point(map).to_offset(&map.buffer_snapshot); + let start = point.to_point(map).to_offset(&map.buffer_snapshot()); let mut chars = map.buffer_chars_at(start).peekable(); let mut was_newline = map @@ -2214,7 +2218,7 @@ pub(crate) fn sentence_forwards( if times == 0 { return map.clip_point( start_of_next_sentence - .to_offset(&map.buffer_snapshot) + .to_offset(&map.buffer_snapshot()) .to_display_point(map), Bias::Right, ); @@ -2234,7 +2238,7 @@ fn next_non_blank(map: &DisplaySnapshot, start: usize) -> usize { } } - map.buffer_snapshot.len() + map.buffer_snapshot().len() } // given the offset after a ., !, or ? find the start of the next sentence. @@ -2259,12 +2263,12 @@ fn start_of_next_sentence(map: &DisplaySnapshot, end_of_sentence: usize) -> Opti } } - Some(map.buffer_snapshot.len()) + Some(map.buffer_snapshot().len()) } fn go_to_line(map: &DisplaySnapshot, display_point: DisplayPoint, line: usize) -> DisplayPoint { let point = map.display_point_to_point(display_point, Bias::Left); - let Some(mut excerpt) = map.buffer_snapshot.excerpt_containing(point..point) else { + let Some(mut excerpt) = map.buffer_snapshot().excerpt_containing(point..point) else { return display_point; }; let offset = excerpt.buffer().point_to_offset( @@ -2275,12 +2279,12 @@ fn go_to_line(map: &DisplaySnapshot, display_point: DisplayPoint, line: usize) - let buffer_range = excerpt.buffer_range(); if offset >= buffer_range.start && offset <= buffer_range.end { let point = map - .buffer_snapshot + .buffer_snapshot() .offset_to_point(excerpt.map_offset_from_buffer(offset)); return map.clip_point(map.point_to_display_point(point, Bias::Left), Bias::Left); } let mut last_position = None; - for (excerpt, buffer, range) in map.buffer_snapshot.excerpts() { + for (excerpt, buffer, range) in map.buffer_snapshot().excerpts() { let excerpt_range = language::ToOffset::to_offset(&range.context.start, buffer) ..language::ToOffset::to_offset(&range.context.end, buffer); if offset >= excerpt_range.start && offset <= excerpt_range.end { @@ -2299,12 +2303,12 @@ fn go_to_line(map: &DisplaySnapshot, display_point: DisplayPoint, line: usize) - } } - let mut last_point = last_position.unwrap().to_point(&map.buffer_snapshot); + let mut last_point = last_position.unwrap().to_point(&map.buffer_snapshot()); last_point.column = point.column; map.clip_point( map.point_to_display_point( - map.buffer_snapshot.clip_point(point, Bias::Left), + map.buffer_snapshot().clip_point(point, Bias::Left), Bias::Left, ), Bias::Left, @@ -2326,7 +2330,7 @@ fn start_of_document( map.clip_point( map.point_to_display_point( - map.buffer_snapshot.clip_point(first_point, Bias::Left), + map.buffer_snapshot().clip_point(first_point, Bias::Left), Bias::Left, ), Bias::Left, @@ -2342,12 +2346,12 @@ fn end_of_document( return go_to_line(map, display_point, times); }; let point = map.display_point_to_point(display_point, Bias::Left); - let mut last_point = map.buffer_snapshot.max_point(); + let mut last_point = map.buffer_snapshot().max_point(); last_point.column = point.column; map.clip_point( map.point_to_display_point( - map.buffer_snapshot.clip_point(last_point, Bias::Left), + map.buffer_snapshot().clip_point(last_point, Bias::Left), Bias::Left, ), Bias::Left, @@ -2360,7 +2364,7 @@ fn matching_tag(map: &DisplaySnapshot, head: DisplayPoint) -> Option outer.start && head < inner.start { let mut offset = inner.end.to_offset(map, Bias::Left); - for c in map.buffer_snapshot.chars_at(offset) { + for c in map.buffer_snapshot().chars_at(offset) { if c == '/' || c == '\n' || c == '>' { return Some(offset.to_display_point(map)); } @@ -2368,7 +2372,7 @@ fn matching_tag(map: &DisplaySnapshot, head: DisplayPoint) -> Option DisplayPoint // https://github.com/vim/vim/blob/1d87e11a1ef201b26ed87585fba70182ad0c468a/runtime/doc/motion.txt#L1200 let display_point = map.clip_at_line_end(display_point); let point = display_point.to_point(map); - let offset = point.to_offset(&map.buffer_snapshot); + let offset = point.to_offset(&map.buffer_snapshot()); + let snapshot = map.buffer_snapshot(); // Ensure the range is contained by the current line. let mut line_end = map.next_line_boundary(point).0; @@ -2391,10 +2396,19 @@ fn matching(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint line_end = map.max_point().to_point(map); } - if let Some((opening_range, closing_range)) = map - .buffer_snapshot - .innermost_enclosing_bracket_ranges(offset..offset, None) - { + // Attempt to find the smallest enclosing bracket range that also contains + // the offset, which only happens if the cursor is currently in a bracket. + let range_filter = |_buffer: &language::BufferSnapshot, + opening_range: Range, + closing_range: Range| { + opening_range.contains(&offset) || closing_range.contains(&offset) + }; + + let bracket_ranges = snapshot + .innermost_enclosing_bracket_ranges(offset..offset, Some(&range_filter)) + .or_else(|| snapshot.innermost_enclosing_bracket_ranges(offset..offset, None)); + + if let Some((opening_range, closing_range)) = bracket_ranges { if opening_range.contains(&offset) { return closing_range.start.to_display_point(map); } else if closing_range.contains(&offset) { @@ -2405,17 +2419,17 @@ fn matching(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint let line_range = map.prev_line_boundary(point).0..line_end; let visible_line_range = line_range.start..Point::new(line_range.end.row, line_range.end.column.saturating_sub(1)); - let ranges = map.buffer_snapshot.bracket_ranges(visible_line_range); + let ranges = map.buffer_snapshot().bracket_ranges(visible_line_range); if let Some(ranges) = ranges { - let line_range = line_range.start.to_offset(&map.buffer_snapshot) - ..line_range.end.to_offset(&map.buffer_snapshot); + let line_range = line_range.start.to_offset(&map.buffer_snapshot()) + ..line_range.end.to_offset(&map.buffer_snapshot()); let mut closest_pair_destination = None; let mut closest_distance = usize::MAX; for (open_range, close_range) in ranges { - if map.buffer_snapshot.chars_at(open_range.start).next() == Some('<') { + if map.buffer_snapshot().chars_at(open_range.start).next() == Some('<') { if offset > open_range.start && offset < close_range.start { - let mut chars = map.buffer_snapshot.chars_at(close_range.start); + let mut chars = map.buffer_snapshot().chars_at(close_range.start); if (Some('/'), Some('>')) == (chars.next(), chars.next()) { return display_point; } @@ -2436,7 +2450,6 @@ fn matching(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint if distance < closest_distance { closest_pair_destination = Some(close_range.start); closest_distance = distance; - continue; } } @@ -2447,7 +2460,6 @@ fn matching(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint if distance < closest_distance { closest_pair_destination = Some(open_range.start); closest_distance = distance; - continue; } } @@ -2469,7 +2481,7 @@ fn matching(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint // // https://neovim.io/doc/user/motion.html#N%25 fn go_to_percentage(map: &DisplaySnapshot, point: DisplayPoint, count: usize) -> DisplayPoint { - let total_lines = map.buffer_snapshot.max_point().row + 1; + let total_lines = map.buffer_snapshot().max_point().row + 1; let target_line = (count * total_lines as usize).div_ceil(100); let target_point = DisplayPoint::new( DisplayRow(target_line.saturating_sub(1) as u32), @@ -2487,16 +2499,16 @@ fn unmatched_forward( for _ in 0..times { // https://github.com/vim/vim/blob/1d87e11a1ef201b26ed87585fba70182ad0c468a/runtime/doc/motion.txt#L1245 let point = display_point.to_point(map); - let offset = point.to_offset(&map.buffer_snapshot); + let offset = point.to_offset(&map.buffer_snapshot()); - let ranges = map.buffer_snapshot.enclosing_bracket_ranges(point..point); + let ranges = map.buffer_snapshot().enclosing_bracket_ranges(point..point); let Some(ranges) = ranges else { break }; let mut closest_closing_destination = None; let mut closest_distance = usize::MAX; for (_, close_range) in ranges { if close_range.start > offset { - let mut chars = map.buffer_snapshot.chars_at(close_range.start); + let mut chars = map.buffer_snapshot().chars_at(close_range.start); if Some(char) == chars.next() { let distance = close_range.start - offset; if distance < closest_distance { @@ -2528,9 +2540,9 @@ fn unmatched_backward( for _ in 0..times { // https://github.com/vim/vim/blob/1d87e11a1ef201b26ed87585fba70182ad0c468a/runtime/doc/motion.txt#L1239 let point = display_point.to_point(map); - let offset = point.to_offset(&map.buffer_snapshot); + let offset = point.to_offset(&map.buffer_snapshot()); - let ranges = map.buffer_snapshot.enclosing_bracket_ranges(point..point); + let ranges = map.buffer_snapshot().enclosing_bracket_ranges(point..point); let Some(ranges) = ranges else { break; }; @@ -2540,7 +2552,7 @@ fn unmatched_backward( for (start_range, _) in ranges { if start_range.start < offset { - let mut chars = map.buffer_snapshot.chars_at(start_range.start); + let mut chars = map.buffer_snapshot().chars_at(start_range.start); if Some(char) == chars.next() { let distance = offset - start_range.start; if distance < closest_distance { @@ -2625,7 +2637,7 @@ fn find_backward( to = new_to; } - let next = map.buffer_snapshot.chars_at(to.to_point(map)).next(); + let next = map.buffer_snapshot().chars_at(to.to_point(map)).next(); if next.is_some() && is_character_match(target, next.unwrap(), smartcase) { if after { *to.column_mut() += 1; @@ -2846,13 +2858,13 @@ fn method_motion( direction: Direction, is_start: bool, ) -> DisplayPoint { - let Some((_, _, buffer)) = map.buffer_snapshot.as_singleton() else { + let Some((_, _, buffer)) = map.buffer_snapshot().as_singleton() else { return display_point; }; for _ in 0..times { let point = map.display_point_to_point(display_point, Bias::Left); - let offset = point.to_offset(&map.buffer_snapshot); + let offset = point.to_offset(&map.buffer_snapshot()); let range = if direction == Direction::Prev { 0..offset } else { @@ -2896,13 +2908,13 @@ fn comment_motion( times: usize, direction: Direction, ) -> DisplayPoint { - let Some((_, _, buffer)) = map.buffer_snapshot.as_singleton() else { + let Some((_, _, buffer)) = map.buffer_snapshot().as_singleton() else { return display_point; }; for _ in 0..times { let point = map.display_point_to_point(display_point, Bias::Left); - let offset = point.to_offset(&map.buffer_snapshot); + let offset = point.to_offset(&map.buffer_snapshot()); let range = if direction == Direction::Prev { 0..offset } else { @@ -2952,22 +2964,22 @@ fn section_motion( direction: Direction, is_start: bool, ) -> DisplayPoint { - if map.buffer_snapshot.as_singleton().is_some() { + if map.buffer_snapshot().as_singleton().is_some() { for _ in 0..times { let offset = map .display_point_to_point(display_point, Bias::Left) - .to_offset(&map.buffer_snapshot); + .to_offset(&map.buffer_snapshot()); let range = if direction == Direction::Prev { 0..offset } else { - offset..map.buffer_snapshot.len() + offset..map.buffer_snapshot().len() }; // we set a max start depth here because we want a section to only be "top level" // similar to vim's default of '{' in the first column. // (and without it, ]] at the start of editor.rs is -very- slow) let mut possibilities = map - .buffer_snapshot + .buffer_snapshot() .text_object_ranges(range, language::TreeSitterOptions::max_start_depth(3)) .filter(|(_, object)| { matches!( @@ -2999,7 +3011,7 @@ fn section_motion( let offset = if direction == Direction::Prev { possibilities.max().unwrap_or(0) } else { - possibilities.min().unwrap_or(map.buffer_snapshot.len()) + possibilities.min().unwrap_or(map.buffer_snapshot().len()) }; let new_point = map.clip_point(offset.to_display_point(map), Bias::Left); @@ -3387,6 +3399,22 @@ mod test { }"}); } + #[gpui::test] + async fn test_matching_nested_brackets(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new_tsx(cx).await; + + cx.set_shared_state(indoc! {r""}) + .await; + cx.simulate_shared_keystrokes("%").await; + cx.shared_state() + .await + .assert_eq(indoc! {r""}); + cx.simulate_shared_keystrokes("%").await; + cx.shared_state() + .await + .assert_eq(indoc! {r""}); + } + #[gpui::test] async fn test_comma_semicolon(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; diff --git a/crates/vim/src/normal.rs b/crates/vim/src/normal.rs index b8d1325a8b19aaa2dcbc2611b2ff66df721c17f3..9386eab58a389b4917cdf33078ac7397ffd01796 100644 --- a/crates/vim/src/normal.rs +++ b/crates/vim/src/normal.rs @@ -28,7 +28,7 @@ use editor::Editor; use editor::{Anchor, SelectionEffects}; use editor::{Bias, ToPoint}; use editor::{display_map::ToDisplayPoint, movement}; -use gpui::{Context, Window, actions}; +use gpui::{Action, Context, Window, actions}; use language::{Point, SelectionGoal}; use log::error; use multi_buffer::MultiBufferRow; @@ -74,6 +74,8 @@ actions!( Yank, /// Yanks the entire line. YankLine, + /// Yanks from cursor to end of line. + YankToEndOfLine, /// Toggles the case of selected text. ChangeCase, /// Converts selected text to uppercase. @@ -94,6 +96,10 @@ actions!( Redo, /// Undoes all changes to the most recently changed line. UndoLastLine, + /// Go to tab page (with count support). + GoToTab, + /// Go to previous tab page (with count support). + GoToPreviousTab, ] ); @@ -113,9 +119,12 @@ pub(crate) fn register(editor: &mut Editor, cx: &mut Context) { Vim::action(editor, cx, Vim::convert_to_rot13); Vim::action(editor, cx, Vim::convert_to_rot47); Vim::action(editor, cx, Vim::yank_line); + Vim::action(editor, cx, Vim::yank_to_end_of_line); Vim::action(editor, cx, Vim::toggle_comments); Vim::action(editor, cx, Vim::paste); Vim::action(editor, cx, Vim::show_location); + Vim::action(editor, cx, Vim::go_to_tab); + Vim::action(editor, cx, Vim::go_to_previous_tab); Vim::action(editor, cx, |vim, _: &DeleteLeft, window, cx| { vim.record_current_action(cx); @@ -441,6 +450,7 @@ impl Vim { &mut self, object: Object, times: Option, + opening: bool, window: &mut Window, cx: &mut Context, ) { @@ -511,10 +521,11 @@ impl Vim { Some(Operator::DeleteSurrounds) => { waiting_operator = Some(Operator::DeleteSurrounds); } - Some(Operator::ChangeSurrounds { target: None }) => { + Some(Operator::ChangeSurrounds { target: None, .. }) => { if self.check_and_move_to_valid_bracket_pair(object, window, cx) { waiting_operator = Some(Operator::ChangeSurrounds { target: Some(object), + opening, }); } } @@ -837,6 +848,25 @@ impl Vim { ) } + fn yank_to_end_of_line( + &mut self, + _: &YankToEndOfLine, + window: &mut Window, + cx: &mut Context, + ) { + let count = Vim::take_count(cx); + let forced_motion = Vim::take_forced_motion(cx); + self.yank_motion( + motion::Motion::EndOfLine { + display_lines: false, + }, + count, + forced_motion, + window, + cx, + ) + } + fn show_location(&mut self, _: &ShowLocation, _: &mut Window, cx: &mut Context) { let count = Vim::take_count(cx); Vim::take_forced_motion(cx); @@ -852,12 +882,12 @@ impl Vim { let filename = if let Some(file) = buffer.read(cx).file() { if count.is_some() { if let Some(local) = file.as_local() { - local.abs_path(cx).to_string_lossy().to_string() + local.abs_path(cx).to_string_lossy().into_owned() } else { - file.full_path(cx).to_string_lossy().to_string() + file.full_path(cx).to_string_lossy().into_owned() } } else { - file.path().to_string_lossy().to_string() + file.path().display(file.path_style(cx)).into_owned() } } else { "[No Name]".into() @@ -984,16 +1014,63 @@ impl Vim { self.switch_mode(Mode::Insert, true, window, cx); } } + + fn go_to_tab(&mut self, _: &GoToTab, window: &mut Window, cx: &mut Context) { + let count = Vim::take_count(cx); + Vim::take_forced_motion(cx); + + if let Some(tab_index) = count { + // gt goes to tab (1-based). + let zero_based_index = tab_index.saturating_sub(1); + window.dispatch_action( + workspace::pane::ActivateItem(zero_based_index).boxed_clone(), + cx, + ); + } else { + // If no count is provided, go to the next tab. + window.dispatch_action(workspace::pane::ActivateNextItem.boxed_clone(), cx); + } + } + + fn go_to_previous_tab( + &mut self, + _: &GoToPreviousTab, + window: &mut Window, + cx: &mut Context, + ) { + let count = Vim::take_count(cx); + Vim::take_forced_motion(cx); + + if let Some(count) = count { + // gT with count goes back that many tabs with wraparound (not the same as gt!). + if let Some(workspace) = self.workspace(window) { + let pane = workspace.read(cx).active_pane().read(cx); + let item_count = pane.items().count(); + if item_count > 0 { + let current_index = pane.active_item_index(); + let target_index = (current_index as isize - count as isize) + .rem_euclid(item_count as isize) + as usize; + window.dispatch_action( + workspace::pane::ActivateItem(target_index).boxed_clone(), + cx, + ); + } + } + } else { + // No count provided, go to the previous tab. + window.dispatch_action(workspace::pane::ActivatePreviousItem.boxed_clone(), cx); + } + } } #[cfg(test)] mod test { use gpui::{KeyBinding, TestAppContext, UpdateGlobal}; use indoc::indoc; - use language::language_settings::AllLanguageSettings; use settings::SettingsStore; use crate::{ - VimSettings, motion, + motion, state::Mode::{self}, test::{NeovimBackedTestContext, VimTestContext}, }; @@ -1724,8 +1801,8 @@ mod test { async fn test_f_and_t_smartcase(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.use_smartcase_find = Some(true); + store.update_user_settings(cx, |s| { + s.vim.get_or_insert_default().use_smartcase_find = Some(true); }); }); @@ -1891,8 +1968,12 @@ mod test { cx.update(|_, cx| { SettingsStore::update_global(cx, |settings, cx| { - settings.update_user_settings::(cx, |settings| { - settings.defaults.preferred_line_length = Some(5); + settings.update_user_settings(cx, |settings| { + settings + .project + .all_languages + .defaults + .preferred_line_length = Some(5); }); }) }); @@ -2116,4 +2197,80 @@ mod test { Mode::Normal, ); } + + #[gpui::test] + async fn test_go_to_tab_with_count(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + // Open 4 tabs. + cx.simulate_keystrokes(": tabnew"); + cx.simulate_keystrokes("enter"); + cx.simulate_keystrokes(": tabnew"); + cx.simulate_keystrokes("enter"); + cx.simulate_keystrokes(": tabnew"); + cx.simulate_keystrokes("enter"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.items(cx).count(), 4); + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 3); + }); + + cx.simulate_keystrokes("1 g t"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 0); + }); + + cx.simulate_keystrokes("3 g t"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 2); + }); + + cx.simulate_keystrokes("4 g t"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 3); + }); + + cx.simulate_keystrokes("1 g t"); + cx.simulate_keystrokes("g t"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 1); + }); + } + + #[gpui::test] + async fn test_go_to_previous_tab_with_count(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + // Open 4 tabs. + cx.simulate_keystrokes(": tabnew"); + cx.simulate_keystrokes("enter"); + cx.simulate_keystrokes(": tabnew"); + cx.simulate_keystrokes("enter"); + cx.simulate_keystrokes(": tabnew"); + cx.simulate_keystrokes("enter"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.items(cx).count(), 4); + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 3); + }); + + cx.simulate_keystrokes("2 g shift-t"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 1); + }); + + cx.simulate_keystrokes("g shift-t"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 0); + }); + + // Wraparound: gT from first tab should go to last. + cx.simulate_keystrokes("g shift-t"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 3); + }); + + cx.simulate_keystrokes("6 g shift-t"); + cx.workspace(|workspace, _, cx| { + assert_eq!(workspace.active_pane().read(cx).active_item_index(), 1); + }); + } } diff --git a/crates/vim/src/normal/change.rs b/crates/vim/src/normal/change.rs index 2af22bf050b805a75ad6bfff1e68fef9480e94c3..4735c64792f3639b2c0d6581e6179484e842f386 100644 --- a/crates/vim/src/normal/change.rs +++ b/crates/vim/src/normal/change.rs @@ -69,7 +69,7 @@ impl Vim { let mut start_offset = selection.start.to_offset(map, Bias::Left); let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(selection.start.to_point(map)); for (ch, offset) in map.buffer_chars_at(start_offset) { if ch == '\n' || !classifier.is_whitespace(ch) { @@ -153,7 +153,7 @@ fn expand_changed_word_selection( ) -> Option { let is_in_word = || { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(selection.start.to_point(map)); map.buffer_chars_at(selection.head().to_offset(map, Bias::Left)) diff --git a/crates/vim/src/normal/convert.rs b/crates/vim/src/normal/convert.rs index d5875fe963778756daf5cd78f452b3436b53642f..11d040850d341155bf428ebc337cc9e3f4cc42c3 100644 --- a/crates/vim/src/normal/convert.rs +++ b/crates/vim/src/normal/convert.rs @@ -214,11 +214,10 @@ impl Vim { Mode::HelixNormal | Mode::HelixSelect => { if selection.is_empty() { - // Handle empty selection by operating on the whole word - let (word_range, _) = snapshot.surrounding_word(selection.start, false); - let word_start = snapshot.offset_to_point(word_range.start); - let word_end = snapshot.offset_to_point(word_range.end); - ranges.push(word_start..word_end); + // Handle empty selection by operating on single character + let start = selection.start; + let end = snapshot.clip_point(start + Point::new(0, 1), Bias::Right); + ranges.push(start..end); cursor_positions.push(selection.start..selection.start); } else { ranges.push(selection.start..selection.end); @@ -445,15 +444,26 @@ mod test { cx.simulate_keystrokes("~"); cx.assert_state("«HELLO WORLDˇ»", Mode::HelixNormal); - // Cursor-only (empty) selection + // Cursor-only (empty) selection - switch case cx.set_state("The ˇquick brown", Mode::HelixNormal); cx.simulate_keystrokes("~"); - cx.assert_state("The ˇQUICK brown", Mode::HelixNormal); + cx.assert_state("The ˇQuick brown", Mode::HelixNormal); + cx.simulate_keystrokes("~"); + cx.assert_state("The ˇquick brown", Mode::HelixNormal); + + // Cursor-only (empty) selection - switch to uppercase and lowercase explicitly + cx.set_state("The ˇquick brown", Mode::HelixNormal); + cx.simulate_keystrokes("alt-`"); + cx.assert_state("The ˇQuick brown", Mode::HelixNormal); + cx.simulate_keystrokes("`"); + cx.assert_state("The ˇquick brown", Mode::HelixNormal); // With `e` motion (which extends selection to end of word in Helix) cx.set_state("The ˇquick brown fox", Mode::HelixNormal); cx.simulate_keystrokes("e"); cx.simulate_keystrokes("~"); cx.assert_state("The «QUICKˇ» brown fox", Mode::HelixNormal); + + // Cursor-only } } diff --git a/crates/vim/src/normal/delete.rs b/crates/vim/src/normal/delete.rs index 6f406d0c44ab45189ddf39bbf5e905f2950d36aa..b1c41315a82df7646531c16a5b701d46a8ba82fd 100644 --- a/crates/vim/src/normal/delete.rs +++ b/crates/vim/src/normal/delete.rs @@ -50,12 +50,13 @@ impl Vim { if kind == Some(MotionKind::Linewise) { let start = selection.start.to_point(map); let end = selection.end.to_point(map); - if end.row < map.buffer_snapshot.max_point().row { + if end.row < map.buffer_snapshot().max_point().row { selection.end = Point::new(end.row + 1, 0).to_display_point(map) } else if start.row > 0 { selection.start = Point::new( start.row - 1, - map.buffer_snapshot.line_len(MultiBufferRow(start.row - 1)), + map.buffer_snapshot() + .line_len(MultiBufferRow(start.row - 1)), ) .to_display_point(map) } @@ -183,7 +184,7 @@ impl Vim { let mut cursor_point = cursor.to_point(map); cursor_point.column = *column; cursor = map - .buffer_snapshot + .buffer_snapshot() .clip_point(cursor_point, Bias::Left) .to_display_point(map); } @@ -203,7 +204,7 @@ fn move_selection_end_to_next_line(map: &DisplaySnapshot, selection: &mut Select } fn ends_at_eof(map: &DisplaySnapshot, selection: &mut Selection) -> bool { - selection.end.to_point(map) == map.buffer_snapshot.max_point() + selection.end.to_point(map) == map.buffer_snapshot().max_point() } #[cfg(test)] diff --git a/crates/vim/src/normal/mark.rs b/crates/vim/src/normal/mark.rs index 619769d41adc690014a2872eff9a18d6f0250ae6..ea9aafe1315d3d89afe9d258f4e736717ffe789f 100644 --- a/crates/vim/src/normal/mark.rs +++ b/crates/vim/src/normal/mark.rs @@ -22,7 +22,7 @@ impl Vim { self.update_editor(cx, |vim, editor, cx| { let anchors = editor .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .map(|s| s.head()) .collect::>(); @@ -54,11 +54,11 @@ impl Vim { for selection in selections { let end = movement::saturating_left(&map, selection.end); ends.push( - map.buffer_snapshot + map.buffer_snapshot() .anchor_before(end.to_offset(&map, Bias::Left)), ); starts.push( - map.buffer_snapshot + map.buffer_snapshot() .anchor_before(selection.start.to_offset(&map, Bias::Left)), ); reversed.push(selection.reversed) @@ -106,7 +106,7 @@ impl Vim { point = motion::first_non_whitespace(&map.display_snapshot, false, point); anchor = map .display_snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(point.to_point(&map.display_snapshot)); } @@ -239,7 +239,7 @@ impl Vim { point = motion::first_non_whitespace(&map.display_snapshot, false, point); anchor = map .display_snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(point.to_point(&map.display_snapshot)); } @@ -312,7 +312,7 @@ impl Vim { ")" => motion::sentence_forwards(&map, selection.head(), 1), _ => unreachable!(), }; - map.buffer_snapshot + map.buffer_snapshot() .anchor_before(point.to_offset(&map, Bias::Left)) }) .collect::>(); diff --git a/crates/vim/src/normal/paste.rs b/crates/vim/src/normal/paste.rs index 933b119d3794540681cc096b0fe22b7f70da00cb..2a45695928ec3fe87a8f26c5161bb1f095186c53 100644 --- a/crates/vim/src/normal/paste.rs +++ b/crates/vim/src/normal/paste.rs @@ -159,9 +159,11 @@ impl Vim { let point_range = display_range.start.to_point(&display_map) ..display_range.end.to_point(&display_map); let anchor = if is_multiline || vim.mode == Mode::VisualLine { - display_map.buffer_snapshot.anchor_before(point_range.start) + display_map + .buffer_snapshot() + .anchor_before(point_range.start) } else { - display_map.buffer_snapshot.anchor_after(point_range.end) + display_map.buffer_snapshot().anchor_after(point_range.end) }; if *preserve { @@ -311,17 +313,13 @@ impl Vim { #[cfg(test)] mod test { use crate::{ - UseSystemClipboard, VimSettings, state::{Mode, Register}, test::{NeovimBackedTestContext, VimTestContext}, }; use gpui::ClipboardItem; use indoc::indoc; - use language::{ - LanguageName, - language_settings::{AllLanguageSettings, LanguageSettingsContent}, - }; - use settings::SettingsStore; + use language::{LanguageName, language_settings::LanguageSettingsContent}; + use settings::{SettingsStore, UseSystemClipboard}; #[gpui::test] async fn test_paste(cx: &mut gpui::TestAppContext) { @@ -408,8 +406,8 @@ mod test { let mut cx = VimTestContext::new(cx, true).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.use_system_clipboard = Some(UseSystemClipboard::Never) + store.update_user_settings(cx, |s| { + s.vim.get_or_insert_default().use_system_clipboard = Some(UseSystemClipboard::Never) }); }); @@ -444,8 +442,9 @@ mod test { let mut cx = VimTestContext::new(cx, true).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.use_system_clipboard = Some(UseSystemClipboard::OnYank) + store.update_user_settings(cx, |s| { + s.vim.get_or_insert_default().use_system_clipboard = + Some(UseSystemClipboard::OnYank) }); }); @@ -709,9 +708,9 @@ mod test { Mode::Normal, ); cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |settings| { - settings.languages.0.insert( - LanguageName::new("Rust"), + store.update_user_settings(cx, |settings| { + settings.project.all_languages.languages.0.insert( + LanguageName::new("Rust").0, LanguageSettingsContent { auto_indent_on_paste: Some(false), ..Default::default() @@ -772,8 +771,8 @@ mod test { let mut cx = NeovimBackedTestContext::new(cx).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.use_system_clipboard = Some(UseSystemClipboard::Never) + store.update_user_settings(cx, |s| { + s.vim.get_or_insert_default().use_system_clipboard = Some(UseSystemClipboard::Never) }); }); @@ -818,8 +817,8 @@ mod test { let mut cx = NeovimBackedTestContext::new(cx).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.use_system_clipboard = Some(UseSystemClipboard::Never) + store.update_user_settings(cx, |s| { + s.vim.get_or_insert_default().use_system_clipboard = Some(UseSystemClipboard::Never) }); }); @@ -847,8 +846,8 @@ mod test { let mut cx = NeovimBackedTestContext::new(cx).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.use_system_clipboard = Some(UseSystemClipboard::Never) + store.update_user_settings(cx, |s| { + s.vim.get_or_insert_default().use_system_clipboard = Some(UseSystemClipboard::Never) }); }); @@ -906,8 +905,8 @@ mod test { let mut cx = VimTestContext::new(cx, true).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.use_system_clipboard = Some(UseSystemClipboard::Never) + store.update_user_settings(cx, |s| { + s.vim.get_or_insert_default().use_system_clipboard = Some(UseSystemClipboard::Never) }); }); diff --git a/crates/vim/src/normal/scroll.rs b/crates/vim/src/normal/scroll.rs index eeb98692bc30c5c8c39c0be23ba17b3276b708df..edb3d7f2157aec8d23faee5fa1a069a10974360f 100644 --- a/crates/vim/src/normal/scroll.rs +++ b/crates/vim/src/normal/scroll.rs @@ -121,9 +121,9 @@ fn scroll_editor( let amount = match (amount.is_full_page(), editor.visible_line_count()) { (true, Some(visible_line_count)) => { if amount.direction().is_upwards() { - ScrollAmount::Line(amount.lines(visible_line_count) + 1.0) + ScrollAmount::Line((amount.lines(visible_line_count) + 1.0) as f32) } else { - ScrollAmount::Line(amount.lines(visible_line_count) - 1.0) + ScrollAmount::Line((amount.lines(visible_line_count) - 1.0) as f32) } } _ => amount, @@ -271,7 +271,7 @@ mod test { state::Mode, test::{NeovimBackedTestContext, VimTestContext}, }; - use editor::{EditorSettings, ScrollBeyondLastLine}; + use editor::ScrollBeyondLastLine; use gpui::{AppContext as _, point, px, size}; use indoc::indoc; use language::Point; @@ -308,7 +308,7 @@ mod test { let window = cx.window; let margin = cx .update_window(window, |_, window, _cx| { - window.viewport_size().height - line_height * visible_line_count + window.viewport_size().height - line_height * visible_line_count as f32 }) .unwrap(); cx.simulate_window_resize( @@ -427,9 +427,7 @@ mod test { // First test without vertical scroll margin cx.neovim.set_option(&format!("scrolloff={}", 0)).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.vertical_scroll_margin = Some(0.0) - }); + store.update_user_settings(cx, |s| s.editor.vertical_scroll_margin = Some(0.0)); }); let content = "ˇ".to_owned() + &sample_text(26, 2, 'a'); @@ -455,9 +453,7 @@ mod test { cx.neovim.set_option(&format!("scrolloff={}", 3)).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.vertical_scroll_margin = Some(3.0) - }); + store.update_user_settings(cx, |s| s.editor.vertical_scroll_margin = Some(3.0)); }); // scroll down: ctrl-f @@ -485,9 +481,8 @@ mod test { cx.set_shared_state(&content).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { - s.scroll_beyond_last_line = Some(ScrollBeyondLastLine::Off); - // s.vertical_scroll_margin = Some(0.); + store.update_user_settings(cx, |s| { + s.editor.scroll_beyond_last_line = Some(ScrollBeyondLastLine::Off); }); }); diff --git a/crates/vim/src/normal/search.rs b/crates/vim/src/normal/search.rs index 43ec12d9cde762804a2b5c6bfc1cbae08b545403..6c4294a474dad13c9d00e58ab117a4a6a74c28d3 100644 --- a/crates/vim/src/normal/search.rs +++ b/crates/vim/src/normal/search.rs @@ -3,7 +3,7 @@ use gpui::{Action, Context, Window, actions}; use language::Point; use schemars::JsonSchema; use search::{BufferSearchBar, SearchOptions, buffer_search}; -use serde_derive::Deserialize; +use serde::Deserialize; use settings::Settings; use std::{iter::Peekable, str::Chars}; use util::serde::default_true; @@ -195,6 +195,7 @@ impl Vim { prior_selections, prior_operator: self.operator_stack.last().cloned(), prior_mode, + helix_select: false, } }); } @@ -218,11 +219,17 @@ impl Vim { let new_selections = self.editor_selections(window, cx); let result = pane.update(cx, |pane, cx| { let search_bar = pane.toolbar().read(cx).item_of_type::()?; + if self.search.helix_select { + search_bar.update(cx, |search_bar, cx| { + search_bar.select_all_matches(&Default::default(), window, cx) + }); + return None; + } search_bar.update(cx, |search_bar, cx| { let mut count = self.search.count; let direction = self.search.direction; search_bar.has_active_match(); - let new_head = new_selections.last().unwrap().start; + let new_head = new_selections.last()?.start; let is_different_head = self .search .prior_selections @@ -256,7 +263,7 @@ impl Vim { if prior_selections.iter().any(|s| { self.update_editor(cx, |_, editor, cx| { !s.start - .is_valid(&editor.snapshot(window, cx).buffer_snapshot) + .is_valid(&editor.snapshot(window, cx).buffer_snapshot()) }) .unwrap_or(true) }) { @@ -462,7 +469,8 @@ impl Vim { }; if let Some(result) = self.update_editor(cx, |vim, editor, cx| { let range = action.range.buffer_range(vim, editor, window, cx)?; - let snapshot = &editor.snapshot(window, cx).buffer_snapshot; + let snapshot = editor.snapshot(window, cx); + let snapshot = snapshot.buffer_snapshot(); let end_point = Point::new(range.end.0, snapshot.line_len(range.end)); let range = snapshot.anchor_before(Point::new(range.start.0, 0)) ..snapshot.anchor_after(end_point); @@ -645,7 +653,6 @@ mod test { state::Mode, test::{NeovimBackedTestContext, VimTestContext}, }; - use editor::EditorSettings; use editor::{DisplayPoint, display_map::DisplayRow}; use indoc::indoc; @@ -694,7 +701,7 @@ mod test { let mut cx = VimTestContext::new(cx, true).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| s.search_wrap = Some(false)); + store.update_user_settings(cx, |s| s.editor.search_wrap = Some(false)); }); cx.set_state("ˇhi\nhigh\nhi\n", Mode::Normal); @@ -815,7 +822,7 @@ mod test { // check that searching with unable search wrap cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| s.search_wrap = Some(false)); + store.update_user_settings(cx, |s| s.editor.search_wrap = Some(false)); }); cx.set_state("aa\nbˇb\ncc\ncc\ncc\n", Mode::Normal); cx.simulate_keystrokes("/ c c enter"); diff --git a/crates/vim/src/object.rs b/crates/vim/src/object.rs index e6eb46c0faeba8a80608259189577d73fcbb2599..5d0ac722872f3c39067a668c4ed5d56847c61898 100644 --- a/crates/vim/src/object.rs +++ b/crates/vim/src/object.rs @@ -85,6 +85,41 @@ pub struct CandidateWithRanges { close_range: Range, } +/// Selects text at the same indentation level. +#[derive(Clone, Deserialize, JsonSchema, PartialEq, Action)] +#[action(namespace = vim)] +#[serde(deny_unknown_fields)] +struct Parentheses { + #[serde(default)] + opening: bool, +} + +/// Selects text at the same indentation level. +#[derive(Clone, Deserialize, JsonSchema, PartialEq, Action)] +#[action(namespace = vim)] +#[serde(deny_unknown_fields)] +struct SquareBrackets { + #[serde(default)] + opening: bool, +} + +/// Selects text at the same indentation level. +#[derive(Clone, Deserialize, JsonSchema, PartialEq, Action)] +#[action(namespace = vim)] +#[serde(deny_unknown_fields)] +struct AngleBrackets { + #[serde(default)] + opening: bool, +} +/// Selects text at the same indentation level. +#[derive(Clone, Deserialize, JsonSchema, PartialEq, Action)] +#[action(namespace = vim)] +#[serde(deny_unknown_fields)] +struct CurlyBrackets { + #[serde(default)] + opening: bool, +} + fn cover_or_next, Range)>>( candidates: Option, caret: DisplayPoint, @@ -94,7 +129,7 @@ fn cover_or_next, Range)>>( let caret_offset = caret.to_offset(map, Bias::Left); let mut covering = vec![]; let mut next_ones = vec![]; - let snapshot = &map.buffer_snapshot; + let snapshot = &map.buffer_snapshot(); if let Some(ranges) = candidates { for (open_range, close_range) in ranges { @@ -173,12 +208,12 @@ fn find_mini_delimiters( is_valid_delimiter: &DelimiterPredicate, ) -> Option> { let point = map.clip_at_line_end(display_point).to_point(map); - let offset = point.to_offset(&map.buffer_snapshot); + let offset = point.to_offset(&map.buffer_snapshot()); let line_range = get_line_range(map, point); let visible_line_range = get_visible_line_range(&line_range); - let snapshot = &map.buffer_snapshot; + let snapshot = &map.buffer_snapshot(); let excerpt = snapshot.excerpt_containing(offset..offset)?; let buffer = excerpt.buffer(); @@ -187,7 +222,7 @@ fn find_mini_delimiters( }; // Try to find delimiters in visible range first - let ranges = map.buffer_snapshot.bracket_ranges(visible_line_range); + let ranges = map.buffer_snapshot().bracket_ranges(visible_line_range); if let Some(candidate) = cover_or_next(ranges, display_point, map, Some(&bracket_filter)) { return Some( DelimiterRange { @@ -275,18 +310,10 @@ actions!( DoubleQuotes, /// Selects text within vertical bars (pipes). VerticalBars, - /// Selects text within parentheses. - Parentheses, /// Selects text within the nearest brackets. MiniBrackets, /// Selects text within any type of brackets. AnyBrackets, - /// Selects text within square brackets. - SquareBrackets, - /// Selects text within curly brackets. - CurlyBrackets, - /// Selects text within angle brackets. - AngleBrackets, /// Selects a function argument. Argument, /// Selects an HTML/XML tag. @@ -350,17 +377,17 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { Vim::action(editor, cx, |vim, _: &DoubleQuotes, window, cx| { vim.object(Object::DoubleQuotes, window, cx) }); - Vim::action(editor, cx, |vim, _: &Parentheses, window, cx| { - vim.object(Object::Parentheses, window, cx) + Vim::action(editor, cx, |vim, action: &Parentheses, window, cx| { + vim.object_impl(Object::Parentheses, action.opening, window, cx) }); - Vim::action(editor, cx, |vim, _: &SquareBrackets, window, cx| { - vim.object(Object::SquareBrackets, window, cx) + Vim::action(editor, cx, |vim, action: &SquareBrackets, window, cx| { + vim.object_impl(Object::SquareBrackets, action.opening, window, cx) }); - Vim::action(editor, cx, |vim, _: &CurlyBrackets, window, cx| { - vim.object(Object::CurlyBrackets, window, cx) + Vim::action(editor, cx, |vim, action: &CurlyBrackets, window, cx| { + vim.object_impl(Object::CurlyBrackets, action.opening, window, cx) }); - Vim::action(editor, cx, |vim, _: &AngleBrackets, window, cx| { - vim.object(Object::AngleBrackets, window, cx) + Vim::action(editor, cx, |vim, action: &AngleBrackets, window, cx| { + vim.object_impl(Object::AngleBrackets, action.opening, window, cx) }); Vim::action(editor, cx, |vim, _: &VerticalBars, window, cx| { vim.object(Object::VerticalBars, window, cx) @@ -394,10 +421,22 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { impl Vim { fn object(&mut self, object: Object, window: &mut Window, cx: &mut Context) { + self.object_impl(object, false, window, cx); + } + + fn object_impl( + &mut self, + object: Object, + opening: bool, + window: &mut Window, + cx: &mut Context, + ) { let count = Self::take_count(cx); match self.mode { - Mode::Normal | Mode::HelixNormal => self.normal_object(object, count, window, cx), + Mode::Normal | Mode::HelixNormal => { + self.normal_object(object, count, opening, window, cx) + } Mode::Visual | Mode::VisualLine | Mode::VisualBlock | Mode::HelixSelect => { self.visual_object(object, count, window, cx) } @@ -740,7 +779,7 @@ fn in_word( ) -> Option> { // Use motion::right so that we consider the character under the cursor when looking for the start let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(relative_to.to_point(map)) .ignore_punctuation(ignore_punctuation); let start = movement::find_preceding_boundary_display_point( @@ -765,7 +804,7 @@ fn in_subword( let offset = relative_to.to_offset(map, Bias::Left); // Use motion::right so that we consider the character under the cursor when looking for the start let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(relative_to.to_point(map)) .ignore_punctuation(ignore_punctuation); let in_subword = map @@ -838,7 +877,7 @@ pub fn surrounding_html_tag( Some(read_tag(chars)) } - let snapshot = &map.buffer_snapshot; + let snapshot = &map.buffer_snapshot(); let offset = head.to_offset(map, Bias::Left); let mut excerpt = snapshot.excerpt_containing(offset..offset)?; let buffer = excerpt.buffer(); @@ -909,7 +948,7 @@ fn around_word( ) -> Option> { let offset = relative_to.to_offset(map, Bias::Left); let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(offset) .ignore_punctuation(ignore_punctuation); let in_word = map @@ -932,7 +971,7 @@ fn around_subword( ) -> Option> { // Use motion::right so that we consider the character under the cursor when looking for the start let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(relative_to.to_point(map)) .ignore_punctuation(ignore_punctuation); let start = movement::find_preceding_boundary_display_point( @@ -991,7 +1030,7 @@ fn around_next_word( ignore_punctuation: bool, ) -> Option> { let classifier = map - .buffer_snapshot + .buffer_snapshot() .char_classifier_at(relative_to.to_point(map)) .ignore_punctuation(ignore_punctuation); // Get the start of the word @@ -1028,7 +1067,7 @@ fn text_object( relative_to: DisplayPoint, target: TextObject, ) -> Option> { - let snapshot = &map.buffer_snapshot; + let snapshot = &map.buffer_snapshot(); let offset = relative_to.to_offset(map, Bias::Left); let mut excerpt = snapshot.excerpt_containing(offset..offset)?; @@ -1039,7 +1078,7 @@ fn text_object( .text_object_ranges(offset..offset, TreeSitterOptions::default()) .filter_map(|(r, m)| if m == target { Some(r) } else { None }) .collect(); - matches.sort_by_key(|r| (r.end - r.start)); + matches.sort_by_key(|r| r.end - r.start); if let Some(buffer_range) = matches.first() { let range = excerpt.map_range_from_buffer(buffer_range.clone()); return Some(range.start.to_display_point(map)..range.end.to_display_point(map)); @@ -1050,7 +1089,7 @@ fn text_object( .text_object_ranges(offset..offset, TreeSitterOptions::default()) .filter_map(|(r, m)| if m == around { Some(r) } else { None }) .collect(); - matches.sort_by_key(|r| (r.end - r.start)); + matches.sort_by_key(|r| r.end - r.start); let around_range = matches.first()?; let mut matches: Vec> = buffer @@ -1073,7 +1112,7 @@ fn argument( relative_to: DisplayPoint, around: bool, ) -> Option> { - let snapshot = &map.buffer_snapshot; + let snapshot = &map.buffer_snapshot(); let offset = relative_to.to_offset(map, Bias::Left); // The `argument` vim text object uses the syntax tree, so we operate at the buffer level and map back to the display level @@ -1247,7 +1286,7 @@ fn indent( // Loop forwards until we find a non-blank line with less indent let mut end_row = row; - let max_rows = map.buffer_snapshot.max_row().0; + let max_rows = map.buffer_snapshot().max_row().0; for next_row in (row + 1)..=max_rows { let indent = map.line_indent_for_buffer_row(MultiBufferRow(next_row)); if indent.is_line_empty() { @@ -1263,7 +1302,7 @@ fn indent( end_row = next_row; } - let end_len = map.buffer_snapshot.line_len(MultiBufferRow(end_row)); + let end_len = map.buffer_snapshot().line_len(MultiBufferRow(end_row)); let start = map.point_to_display_point(Point::new(start_row, 0), Bias::Right); let end = map.point_to_display_point(Point::new(end_row, end_len), Bias::Left); Some(start..end) @@ -1434,7 +1473,9 @@ fn paragraph( let paragraph_end_row = paragraph_end.row(); let paragraph_ends_with_eof = paragraph_end_row == map.max_point().row(); let point = relative_to.to_point(map); - let current_line_is_empty = map.buffer_snapshot.is_line_blank(MultiBufferRow(point.row)); + let current_line_is_empty = map + .buffer_snapshot() + .is_line_blank(MultiBufferRow(point.row)); if around { if paragraph_ends_with_eof { @@ -1472,10 +1513,12 @@ pub fn start_of_paragraph(map: &DisplaySnapshot, display_point: DisplayPoint) -> return DisplayPoint::zero(); } - let is_current_line_blank = map.buffer_snapshot.is_line_blank(MultiBufferRow(point.row)); + let is_current_line_blank = map + .buffer_snapshot() + .is_line_blank(MultiBufferRow(point.row)); for row in (0..point.row).rev() { - let blank = map.buffer_snapshot.is_line_blank(MultiBufferRow(row)); + let blank = map.buffer_snapshot().is_line_blank(MultiBufferRow(row)); if blank != is_current_line_blank { return Point::new(row + 1, 0).to_display_point(map); } @@ -1489,19 +1532,21 @@ pub fn start_of_paragraph(map: &DisplaySnapshot, display_point: DisplayPoint) -> /// The trailing newline is excluded from the paragraph. pub fn end_of_paragraph(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint { let point = display_point.to_point(map); - if point.row == map.buffer_snapshot.max_row().0 { + if point.row == map.buffer_snapshot().max_row().0 { return map.max_point(); } - let is_current_line_blank = map.buffer_snapshot.is_line_blank(MultiBufferRow(point.row)); + let is_current_line_blank = map + .buffer_snapshot() + .is_line_blank(MultiBufferRow(point.row)); - for row in point.row + 1..map.buffer_snapshot.max_row().0 + 1 { - let blank = map.buffer_snapshot.is_line_blank(MultiBufferRow(row)); + for row in point.row + 1..map.buffer_snapshot().max_row().0 + 1 { + let blank = map.buffer_snapshot().is_line_blank(MultiBufferRow(row)); if blank != is_current_line_blank { let previous_row = row - 1; return Point::new( previous_row, - map.buffer_snapshot.line_len(MultiBufferRow(previous_row)), + map.buffer_snapshot().line_len(MultiBufferRow(previous_row)), ) .to_display_point(map); } diff --git a/crates/vim/src/replace.rs b/crates/vim/src/replace.rs index eaa9fd5062021d0f2f9884125421495d9ac74e9d..40fe4f213e205569129775a2e495ec2b3bee14b6 100644 --- a/crates/vim/src/replace.rs +++ b/crates/vim/src/replace.rs @@ -65,12 +65,12 @@ impl Vim { // we don't do a replace, we need insert a "\n" if !is_new_line { range.end.column += 1; - range.end = map.buffer_snapshot.clip_point(range.end, Bias::Right); + range.end = map.buffer_snapshot().clip_point(range.end, Bias::Right); } - let replace_range = map.buffer_snapshot.anchor_before(range.start) - ..map.buffer_snapshot.anchor_after(range.end); + let replace_range = map.buffer_snapshot().anchor_before(range.start) + ..map.buffer_snapshot().anchor_after(range.end); let current_text = map - .buffer_snapshot + .buffer_snapshot() .text_for_range(replace_range.clone()) .collect(); vim.replacements.push((replace_range.clone(), current_text)); @@ -111,15 +111,15 @@ impl Vim { ) .to_point(&map); new_selections.push( - map.buffer_snapshot.anchor_before(start) - ..map.buffer_snapshot.anchor_before(start), + map.buffer_snapshot().anchor_before(start) + ..map.buffer_snapshot().anchor_before(start), ); let mut undo = None; let edit_range = start..end; for (i, (range, inverse)) in vim.replacements.iter().rev().enumerate() { - if range.start.to_point(&map.buffer_snapshot) <= edit_range.start - && range.end.to_point(&map.buffer_snapshot) >= edit_range.end + if range.start.to_point(&map.buffer_snapshot()) <= edit_range.start + && range.end.to_point(&map.buffer_snapshot()) >= edit_range.end { undo = Some(inverse.clone()); vim.replacements.remove(vim.replacements.len() - i - 1); @@ -154,10 +154,10 @@ impl Vim { let snapshot = editor.snapshot(window, cx); object.expand_selection(&snapshot, &mut selection, around, None); let start = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(selection.start.to_point(&snapshot)); let end = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(selection.end.to_point(&snapshot)); let new_range = start..end; vim.exchange_impl(new_range, editor, &snapshot, window, cx); @@ -206,10 +206,10 @@ impl Vim { forced_motion, ); let start = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(selection.start.to_point(&snapshot)); let end = snapshot - .buffer_snapshot + .buffer_snapshot() .anchor_before(selection.end.to_point(&snapshot)); let new_range = start..end; vim.exchange_impl(new_range, editor, &snapshot, window, cx); @@ -228,14 +228,14 @@ impl Vim { if let Some((_, ranges)) = editor.clear_background_highlights::(cx) { let previous_range = ranges[0].clone(); - let new_range_start = new_range.start.to_offset(&snapshot.buffer_snapshot); - let new_range_end = new_range.end.to_offset(&snapshot.buffer_snapshot); - let previous_range_end = previous_range.end.to_offset(&snapshot.buffer_snapshot); - let previous_range_start = previous_range.start.to_offset(&snapshot.buffer_snapshot); + let new_range_start = new_range.start.to_offset(&snapshot.buffer_snapshot()); + let new_range_end = new_range.end.to_offset(&snapshot.buffer_snapshot()); + let previous_range_end = previous_range.end.to_offset(&snapshot.buffer_snapshot()); + let previous_range_start = previous_range.start.to_offset(&snapshot.buffer_snapshot()); let text_for = |range: Range| { snapshot - .buffer_snapshot + .buffer_snapshot() .text_for_range(range) .collect::() }; diff --git a/crates/vim/src/state.rs b/crates/vim/src/state.rs index f81299169058b430b6ea6557f3d66762a6705a82..88a100fc2abb90005256548395959c596167c148 100644 --- a/crates/vim/src/state.rs +++ b/crates/vim/src/state.rs @@ -34,6 +34,7 @@ use ui::{ StyledTypography, Window, h_flex, rems, }; use util::ResultExt; +use util::rel_path::RelPath; use workspace::searchable::Direction; use workspace::{Workspace, WorkspaceDb, WorkspaceId}; @@ -58,8 +59,8 @@ impl Display for Mode { Mode::Visual => write!(f, "VISUAL"), Mode::VisualLine => write!(f, "VISUAL LINE"), Mode::VisualBlock => write!(f, "VISUAL BLOCK"), - Mode::HelixNormal => write!(f, "HELIX NORMAL"), - Mode::HelixSelect => write!(f, "HELIX SELECT"), + Mode::HelixNormal => write!(f, "NORMAL"), + Mode::HelixSelect => write!(f, "SELECT"), } } } @@ -108,6 +109,9 @@ pub enum Operator { }, ChangeSurrounds { target: Option, + /// Represents whether the opening bracket was used for the target + /// object. + opening: bool, }, DeleteSurrounds, Mark, @@ -343,9 +347,10 @@ impl MarksState { .worktrees(cx) .filter_map(|worktree| { let relative = path.strip_prefix(worktree.read(cx).abs_path()).ok()?; + let path = RelPath::new(relative, worktree.read(cx).path_style()).log_err()?; Some(ProjectPath { worktree_id: worktree.read(cx).id(), - path: relative.into(), + path: path.into_arc(), }) }) .next(); @@ -805,11 +810,10 @@ impl VimGlobals { self.last_yank.replace(content.text.clone()); cx.write_to_clipboard(content.clone().into()); } else { - self.last_yank = cx - .read_from_clipboard() - .and_then(|item| item.text().map(|string| string.into())); + if let Some(text) = cx.read_from_clipboard().and_then(|i| i.text()) { + self.last_yank.replace(text.into()); + } } - self.registers.insert('"', content.clone()); if is_yank { self.registers.insert('0', content); @@ -872,7 +876,7 @@ impl VimGlobals { buffer .read(cx) .file() - .map(|file| file.path().to_string_lossy().to_string().into()) + .map(|file| file.path().display(file.path_style(cx)).into_owned().into()) } else { None } @@ -883,10 +887,10 @@ impl VimGlobals { fn system_clipboard_is_newer(&self, cx: &App) -> bool { cx.read_from_clipboard().is_some_and(|item| { - if let Some(last_state) = &self.last_yank { - Some(last_state.as_ref()) != item.text().as_deref() - } else { - true + match (item.text().as_deref(), &self.last_yank) { + (Some(new), Some(last)) => last.as_ref() != new, + (Some(_), None) => true, + (None, _) => false, } }) } @@ -988,6 +992,7 @@ pub struct SearchState { pub prior_selections: Vec>, pub prior_operator: Option, pub prior_mode: Mode, + pub helix_select: bool, } impl Operator { @@ -1075,7 +1080,9 @@ impl Operator { | Operator::Replace | Operator::Digraph { .. } | Operator::Literal { .. } - | Operator::ChangeSurrounds { target: Some(_) } + | Operator::ChangeSurrounds { + target: Some(_), .. + } | Operator::DeleteSurrounds => true, Operator::Change | Operator::Delete @@ -1092,7 +1099,7 @@ impl Operator { | Operator::ReplaceWithRegister | Operator::Exchange | Operator::Object { .. } - | Operator::ChangeSurrounds { target: None } + | Operator::ChangeSurrounds { target: None, .. } | Operator::OppositeCase | Operator::ToggleComments | Operator::HelixMatch @@ -1119,7 +1126,7 @@ impl Operator { | Operator::Rewrap | Operator::ShellCommand | Operator::AddSurrounds { target: None } - | Operator::ChangeSurrounds { target: None } + | Operator::ChangeSurrounds { target: None, .. } | Operator::DeleteSurrounds | Operator::Exchange | Operator::HelixNext { .. } @@ -1607,7 +1614,7 @@ impl PickerDelegate for MarksViewDelegate { let (right_output, right_runs): (String, Vec<_>) = match &mark_match.info { MarksMatchInfo::Path(path) => { - let s = path.to_string_lossy().to_string(); + let s = path.to_string_lossy().into_owned(); ( s.clone(), vec![(0..s.len(), HighlightStyle::color(cx.theme().colors().text))], diff --git a/crates/vim/src/surrounds.rs b/crates/vim/src/surrounds.rs index 7c36ebe6747488376d2264e4984175fb536fed4f..e1b46f56a9e8b934e8c8e55d144b8eb325352375 100644 --- a/crates/vim/src/surrounds.rs +++ b/crates/vim/src/surrounds.rs @@ -94,14 +94,14 @@ impl Vim { format!("{}{}", maybe_space, pair.end), ) }; - let start_anchor = display_map.buffer_snapshot.anchor_before(start); + let start_anchor = display_map.buffer_snapshot().anchor_before(start); edits.push((start..start, start_cursor_str)); edits.push((end..end, end_cursor_str)); anchors.push(start_anchor..start_anchor); } else { let start_anchor = display_map - .buffer_snapshot + .buffer_snapshot() .anchor_before(selection.head().to_offset(&display_map, Bias::Left)); anchors.push(start_anchor..start_anchor); } @@ -221,6 +221,7 @@ impl Vim { &mut self, text: Arc, target: Object, + opening: bool, window: &mut Window, cx: &mut Context, ) { @@ -241,22 +242,19 @@ impl Vim { }, }; - // Determines whether space should be added/removed after - // and before the surround pairs. - // For example, using `cs{[` will add a space before and - // after the pair, while using `cs{]` will not, notice the - // use of the closing bracket instead of the opening bracket - // on the target object. - // In the case of quotes, the opening and closing is the - // same, so no space will ever be added or removed. - let surround = match target { - Object::Quotes - | Object::BackQuotes - | Object::AnyQuotes - | Object::MiniQuotes - | Object::DoubleQuotes => true, - _ => pair.end != surround_alias((*text).as_ref()), - }; + // A single space should be added if the new surround is a + // bracket and not a quote (pair.start != pair.end) and if + // the bracket used is the opening bracket. + let add_space = + !(pair.start == pair.end) && (pair.end != surround_alias((*text).as_ref())); + + // Space should be preserved if either the surrounding + // characters being updated are quotes + // (will_replace_pair.start == will_replace_pair.end) or if + // the bracket used in the command is not an opening + // bracket. + let preserve_space = + will_replace_pair.start == will_replace_pair.end || !opening; let (display_map, selections) = editor.selections.all_adjusted_display(cx); let mut edits = Vec::new(); @@ -275,23 +273,36 @@ impl Vim { continue; } } + + // Keeps track of the length of the string that is + // going to be edited on the start so we can ensure + // that the end replacement string does not exceed + // this value. Helpful when dealing with newlines. + let mut edit_len = 0; let mut chars_and_offset = display_map .buffer_chars_at(range.start.to_offset(&display_map, Bias::Left)) .peekable(); + while let Some((ch, offset)) = chars_and_offset.next() { if ch.to_string() == will_replace_pair.start { let mut open_str = pair.start.clone(); let start = offset; let mut end = start + 1; - if let Some((next_ch, _)) = chars_and_offset.peek() { - // If the next position is already a space or line break, - // we don't need to splice another space even under around - if surround && !next_ch.is_whitespace() { - open_str.push(' '); - } else if !surround && next_ch.to_string() == " " { - end += 1; + while let Some((next_ch, _)) = chars_and_offset.next() + && next_ch.to_string() == " " + { + end += 1; + + if preserve_space { + open_str.push(next_ch); } } + + if add_space { + open_str.push(' '); + }; + + edit_len = end - start; edits.push((start..end, open_str)); anchors.push(start..start); break; @@ -305,16 +316,25 @@ impl Vim { .peekable(); while let Some((ch, offset)) = reverse_chars_and_offsets.next() { if ch.to_string() == will_replace_pair.end { - let mut close_str = pair.end.clone(); + let mut close_str = String::new(); let mut start = offset; let end = start + 1; - if let Some((next_ch, _)) = reverse_chars_and_offsets.peek() { - if surround && !next_ch.is_whitespace() { - close_str.insert(0, ' ') - } else if !surround && next_ch.to_string() == " " { - start -= 1; + while let Some((next_ch, _)) = reverse_chars_and_offsets.next() + && next_ch.to_string() == " " + && close_str.len() < edit_len - 1 + { + start -= 1; + + if preserve_space { + close_str.push(next_ch); } } + + if add_space { + close_str.push(' '); + }; + + close_str.push_str(&pair.end); edits.push((start..end, close_str)); break; } @@ -326,10 +346,10 @@ impl Vim { let stable_anchors = editor .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .map(|selection| { - let start = selection.start.bias_left(&display_map.buffer_snapshot); + let start = selection.start.bias_left(&display_map.buffer_snapshot()); start..start }) .collect::>(); @@ -454,7 +474,7 @@ impl Vim { surround: true, newline: false, }), - Object::CurlyBrackets => Some(BracketPair { + Object::CurlyBrackets { .. } => Some(BracketPair { start: "{".to_string(), end: "}".to_string(), close: true, @@ -608,13 +628,6 @@ fn all_support_surround_pair() -> Vec { surround: true, newline: false, }, - BracketPair { - start: "{".into(), - end: "}".into(), - close: true, - surround: true, - newline: false, - }, BracketPair { start: "<".into(), end: ">".into(), @@ -1207,7 +1220,30 @@ mod test { };"}, Mode::Normal, ); - cx.simulate_keystrokes("c s { ["); + cx.simulate_keystrokes("c s } ]"); + cx.assert_state( + indoc! {" + fn test_surround() ˇ[ + if 2 > 1 ˇ[ + println!(\"it is fine\"); + ] + ];"}, + Mode::Normal, + ); + + // Currently, the same test case but using the closing bracket `]` + // actually removes a whitespace before the closing bracket, something + // that might need to be fixed? + cx.set_state( + indoc! {" + fn test_surround() { + ifˇ 2 > 1 { + ˇprintln!(\"it is fine\"); + } + };"}, + Mode::Normal, + ); + cx.simulate_keystrokes("c s { ]"); cx.assert_state( indoc! {" fn test_surround() ˇ[ @@ -1241,6 +1277,15 @@ mod test { "}, Mode::Normal, ); + + // test quote to bracket spacing. + cx.set_state(indoc! {"'ˇfoobar'"}, Mode::Normal); + cx.simulate_keystrokes("c s ' {"); + cx.assert_state(indoc! {"ˇ{ foobar }"}, Mode::Normal); + + cx.set_state(indoc! {"'ˇfoobar'"}, Mode::Normal); + cx.simulate_keystrokes("c s ' }"); + cx.assert_state(indoc! {"ˇ{foobar}"}, Mode::Normal); } #[gpui::test] @@ -1274,7 +1319,7 @@ mod test { cx.assert_state(indoc! {"ˇ[ bracketed ]"}, Mode::Normal); cx.set_state(indoc! {"(< name: ˇ'Zed' >)"}, Mode::Normal); - cx.simulate_keystrokes("c s b {"); + cx.simulate_keystrokes("c s b }"); cx.assert_state(indoc! {"(ˇ{ name: 'Zed' })"}, Mode::Normal); cx.set_state( @@ -1294,6 +1339,66 @@ mod test { ); } + // The following test cases all follow tpope/vim-surround's behaviour + // and are more focused on how whitespace is handled. + #[gpui::test] + async fn test_change_surrounds_vim(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + // Changing quote to quote should never change the surrounding + // whitespace. + cx.set_state(indoc! {"' ˇa '"}, Mode::Normal); + cx.simulate_keystrokes("c s ' \""); + cx.assert_state(indoc! {"ˇ\" a \""}, Mode::Normal); + + cx.set_state(indoc! {"\" ˇa \""}, Mode::Normal); + cx.simulate_keystrokes("c s \" '"); + cx.assert_state(indoc! {"ˇ' a '"}, Mode::Normal); + + // Changing quote to bracket adds one more space when the opening + // bracket is used, does not affect whitespace when the closing bracket + // is used. + cx.set_state(indoc! {"' ˇa '"}, Mode::Normal); + cx.simulate_keystrokes("c s ' {"); + cx.assert_state(indoc! {"ˇ{ a }"}, Mode::Normal); + + cx.set_state(indoc! {"' ˇa '"}, Mode::Normal); + cx.simulate_keystrokes("c s ' }"); + cx.assert_state(indoc! {"ˇ{ a }"}, Mode::Normal); + + // Changing bracket to quote should remove all space when the + // opening bracket is used and preserve all space when the + // closing one is used. + cx.set_state(indoc! {"{ ˇa }"}, Mode::Normal); + cx.simulate_keystrokes("c s { '"); + cx.assert_state(indoc! {"ˇ'a'"}, Mode::Normal); + + cx.set_state(indoc! {"{ ˇa }"}, Mode::Normal); + cx.simulate_keystrokes("c s } '"); + cx.assert_state(indoc! {"ˇ' a '"}, Mode::Normal); + + // Changing bracket to bracket follows these rules: + // * opening → opening – keeps only one space. + // * opening → closing – removes all space. + // * closing → opening – adds one space. + // * closing → closing – does not change space. + cx.set_state(indoc! {"{ ˇa }"}, Mode::Normal); + cx.simulate_keystrokes("c s { ["); + cx.assert_state(indoc! {"ˇ[ a ]"}, Mode::Normal); + + cx.set_state(indoc! {"{ ˇa }"}, Mode::Normal); + cx.simulate_keystrokes("c s { ]"); + cx.assert_state(indoc! {"ˇ[a]"}, Mode::Normal); + + cx.set_state(indoc! {"{ ˇa }"}, Mode::Normal); + cx.simulate_keystrokes("c s } ["); + cx.assert_state(indoc! {"ˇ[ a ]"}, Mode::Normal); + + cx.set_state(indoc! {"{ ˇa }"}, Mode::Normal); + cx.simulate_keystrokes("c s } ]"); + cx.assert_state(indoc! {"ˇ[ a ]"}, Mode::Normal); + } + #[gpui::test] async fn test_surrounds(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; diff --git a/crates/vim/src/test.rs b/crates/vim/src/test.rs index 84376719d141fa4862a3e7a1b0f6116dd809bfe5..2f130356a70c0ee8cff1803112a1caec87c45469 100644 --- a/crates/vim/src/test.rs +++ b/crates/vim/src/test.rs @@ -22,10 +22,12 @@ pub use vim_test_context::*; use indoc::indoc; use search::BufferSearchBar; -use workspace::WorkspaceSettings; use crate::{PushSneak, PushSneakBackward, insert::NormalBefore, motion, state::Mode}; +use util_macros::perf; + +#[perf] #[gpui::test] async fn test_initially_disabled(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, false).await; @@ -33,6 +35,7 @@ async fn test_initially_disabled(cx: &mut gpui::TestAppContext) { cx.assert_editor_state("hjklˇ"); } +#[perf] #[gpui::test] async fn test_neovim(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -45,6 +48,7 @@ async fn test_neovim(cx: &mut gpui::TestAppContext) { cx.assert_editor_state("ˇtest"); } +#[perf] #[gpui::test] async fn test_toggle_through_settings(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -81,6 +85,7 @@ async fn test_toggle_through_settings(cx: &mut gpui::TestAppContext) { assert_eq!(cx.mode(), Mode::Normal); } +#[perf] #[gpui::test] async fn test_cancel_selection(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -105,6 +110,7 @@ async fn test_cancel_selection(cx: &mut gpui::TestAppContext) { cx.assert_editor_state("The quick brown fox juˇmps over the lazy dog"); } +#[perf] #[gpui::test] async fn test_buffer_search(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -133,6 +139,7 @@ async fn test_buffer_search(cx: &mut gpui::TestAppContext) { }) } +#[perf] #[gpui::test] async fn test_count_down(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -144,6 +151,7 @@ async fn test_count_down(cx: &mut gpui::TestAppContext) { cx.assert_editor_state("aa\nbb\ncc\ndd\neˇe"); } +#[perf] #[gpui::test] async fn test_end_of_document_710(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -158,6 +166,7 @@ async fn test_end_of_document_710(cx: &mut gpui::TestAppContext) { cx.assert_editor_state("aˇa\nbb\ncc"); } +#[perf] #[gpui::test] async fn test_end_of_line_with_times(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -176,6 +185,7 @@ async fn test_end_of_line_with_times(cx: &mut gpui::TestAppContext) { cx.assert_editor_state("aa\nbb\ncˇc"); } +#[perf] #[gpui::test] async fn test_indent_outdent(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -224,6 +234,7 @@ async fn test_indent_outdent(cx: &mut gpui::TestAppContext) { cx.assert_editor_state(" a\nbˇ\nccc\n"); } +#[perf] #[gpui::test] async fn test_escape_command_palette(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -242,6 +253,7 @@ async fn test_escape_command_palette(cx: &mut gpui::TestAppContext) { cx.assert_state("aˇbc\n", Mode::Insert); } +#[perf] #[gpui::test] async fn test_escape_cancels(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -252,6 +264,7 @@ async fn test_escape_cancels(cx: &mut gpui::TestAppContext) { cx.assert_state("aˇbc", Mode::Normal); } +#[perf] #[gpui::test] async fn test_selection_on_search(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -290,6 +303,7 @@ async fn test_selection_on_search(cx: &mut gpui::TestAppContext) { cx.assert_state(indoc! {"aa\nbb\nˇcc\ncc\ncc\n"}, Mode::Normal); } +#[perf] #[gpui::test] async fn test_word_characters(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new_typescript(cx).await; @@ -316,6 +330,7 @@ async fn test_word_characters(cx: &mut gpui::TestAppContext) { ) } +#[perf] #[gpui::test] async fn test_kebab_case(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new_html(cx).await; @@ -335,6 +350,7 @@ async fn test_kebab_case(cx: &mut gpui::TestAppContext) { ) } +#[perf] #[gpui::test] async fn test_join_lines(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -421,6 +437,7 @@ async fn test_join_lines(cx: &mut gpui::TestAppContext) { } #[cfg(target_os = "macos")] +#[perf] #[gpui::test] async fn test_wrapped_lines(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -572,6 +589,7 @@ async fn test_wrapped_lines(cx: &mut gpui::TestAppContext) { "}); } +#[perf] #[gpui::test] async fn test_folds(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -637,6 +655,7 @@ async fn test_folds(cx: &mut gpui::TestAppContext) { "}); } +#[perf] #[gpui::test] async fn test_folds_panic(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -672,6 +691,7 @@ async fn test_folds_panic(cx: &mut gpui::TestAppContext) { ˇ"}); } +#[perf] #[gpui::test] async fn test_clear_counts(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -689,6 +709,7 @@ async fn test_clear_counts(cx: &mut gpui::TestAppContext) { the lazy dog"}); } +#[perf] #[gpui::test] async fn test_zero(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -712,6 +733,7 @@ async fn test_zero(cx: &mut gpui::TestAppContext) { the lazy dog"}); } +#[perf] #[gpui::test] async fn test_selection_goal(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -728,6 +750,7 @@ async fn test_selection_goal(cx: &mut gpui::TestAppContext) { } #[cfg(target_os = "macos")] +#[perf] #[gpui::test] async fn test_wrapped_motions(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -781,6 +804,7 @@ async fn test_wrapped_motions(cx: &mut gpui::TestAppContext) { }); } +#[perf] #[gpui::test] async fn test_wrapped_delete_end_document(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -799,6 +823,7 @@ async fn test_wrapped_delete_end_document(cx: &mut gpui::TestAppContext) { }); } +#[perf] #[gpui::test] async fn test_paragraphs_dont_wrap(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -822,6 +847,7 @@ async fn test_paragraphs_dont_wrap(cx: &mut gpui::TestAppContext) { two"}); } +#[perf] #[gpui::test] async fn test_select_all_issue_2170(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -845,6 +871,7 @@ async fn test_select_all_issue_2170(cx: &mut gpui::TestAppContext) { ); } +#[perf] #[gpui::test] async fn test_jk(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -875,13 +902,14 @@ fn assert_pending_input(cx: &mut VimTestContext, expected: &str) { assert_eq!( highlights .iter() - .map(|highlight| highlight.to_offset(&snapshot.buffer_snapshot)) + .map(|highlight| highlight.to_offset(&snapshot.buffer_snapshot())) .collect::>(), ranges ) }); } +#[perf] #[gpui::test] async fn test_jk_multi(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -906,6 +934,7 @@ async fn test_jk_multi(cx: &mut gpui::TestAppContext) { cx.assert_state("jkˇoone jkˇoone jkˇoone", Mode::Normal); } +#[perf] #[gpui::test] async fn test_jk_delay(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -933,7 +962,7 @@ async fn test_jk_delay(cx: &mut gpui::TestAppContext) { assert_eq!( highlights .iter() - .map(|highlight| highlight.to_offset(&snapshot.buffer_snapshot)) + .map(|highlight| highlight.to_offset(&snapshot.buffer_snapshot())) .collect::>(), vec![0..1] ) @@ -945,6 +974,7 @@ async fn test_jk_delay(cx: &mut gpui::TestAppContext) { cx.assert_state("jˇkhello", Mode::Normal); } +#[perf] #[gpui::test] async fn test_comma_w(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -973,6 +1003,7 @@ async fn test_comma_w(cx: &mut gpui::TestAppContext) { .assert_eq("hellˇo hello\nhello hello"); } +#[perf] #[gpui::test] async fn test_completion_menu_scroll_aside(cx: &mut TestAppContext) { let mut cx = VimTestContext::new_typescript(cx).await; @@ -1054,6 +1085,7 @@ async fn test_completion_menu_scroll_aside(cx: &mut TestAppContext) { }); } +#[perf] #[gpui::test] async fn test_rename(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new_typescript(cx).await; @@ -1089,6 +1121,7 @@ async fn test_rename(cx: &mut gpui::TestAppContext) { cx.assert_state("const afterˇ = 2; console.log(after)", Mode::Normal) } +#[perf] #[gpui::test] async fn test_remap(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -1166,6 +1199,7 @@ async fn test_remap(cx: &mut gpui::TestAppContext) { cx.assert_state("12ˇ 34", Mode::Normal); } +#[perf] #[gpui::test] async fn test_undo(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1211,6 +1245,7 @@ async fn test_undo(cx: &mut gpui::TestAppContext) { 3"}); } +#[perf] #[gpui::test] async fn test_mouse_selection(cx: &mut TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -1227,6 +1262,7 @@ async fn test_mouse_selection(cx: &mut TestAppContext) { cx.assert_state("one «ˇtwo» three", Mode::Visual) } +#[perf] #[gpui::test] async fn test_lowercase_marks(cx: &mut TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1247,6 +1283,7 @@ async fn test_lowercase_marks(cx: &mut TestAppContext) { .assert_eq("line one\nˇtwo\nline three"); } +#[perf] #[gpui::test] async fn test_lt_gt_marks(cx: &mut TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1323,6 +1360,7 @@ async fn test_lt_gt_marks(cx: &mut TestAppContext) { }); } +#[perf] #[gpui::test] async fn test_caret_mark(cx: &mut TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1373,6 +1411,7 @@ async fn test_caret_mark(cx: &mut TestAppContext) { } #[cfg(target_os = "macos")] +#[perf] #[gpui::test] async fn test_dw_eol(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1386,6 +1425,7 @@ async fn test_dw_eol(cx: &mut gpui::TestAppContext) { .assert_eq("twelve ˇtwelve char\ntwelve char"); } +#[perf] #[gpui::test] async fn test_toggle_comments(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -1464,6 +1504,7 @@ async fn test_toggle_comments(cx: &mut gpui::TestAppContext) { ); } +#[perf] #[gpui::test] async fn test_find_multibyte(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1477,6 +1518,7 @@ async fn test_find_multibyte(cx: &mut gpui::TestAppContext) { .assert_eq(r#""#); } +#[perf] #[gpui::test] async fn test_sneak(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -1539,6 +1581,7 @@ async fn test_sneak(cx: &mut gpui::TestAppContext) { cx.assert_state(r#"11ˇ 12 13 14"#, Mode::Normal); } +#[perf] #[gpui::test] async fn test_plus_minus(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1558,14 +1601,15 @@ async fn test_plus_minus(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_matches(); } +#[perf] #[gpui::test] async fn test_command_alias(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| { + store.update_user_settings(cx, |s| { let mut aliases = HashMap::default(); aliases.insert("Q".to_string(), "upper".to_string()); - s.command_aliases = Some(aliases) + s.workspace.command_aliases = aliases }); }); @@ -1574,6 +1618,7 @@ async fn test_command_alias(cx: &mut gpui::TestAppContext) { cx.set_state("ˇHello world", Mode::Normal); } +#[perf] #[gpui::test] async fn test_remap_adjacent_dog_cat(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1607,6 +1652,7 @@ async fn test_remap_adjacent_dog_cat(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("do🐱ˇ"); } +#[perf] #[gpui::test] async fn test_remap_nested_pineapple(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1650,6 +1696,7 @@ async fn test_remap_nested_pineapple(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("🍍ˇ"); } +#[perf] #[gpui::test] async fn test_remap_recursion(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1676,6 +1723,7 @@ async fn test_remap_recursion(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("ˇlo"); } +#[perf] #[gpui::test] async fn test_escape_while_waiting(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1684,6 +1732,7 @@ async fn test_escape_while_waiting(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("ˇi"); } +#[perf] #[gpui::test] async fn test_ctrl_w_override(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1696,6 +1745,7 @@ async fn test_ctrl_w_override(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("ˇ"); } +#[perf] #[gpui::test] async fn test_visual_indent_count(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -1706,6 +1756,7 @@ async fn test_visual_indent_count(cx: &mut gpui::TestAppContext) { cx.assert_state(" ˇhi", Mode::Normal); } +#[perf] #[gpui::test] async fn test_record_replay_recursion(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1718,6 +1769,7 @@ async fn test_record_replay_recursion(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("ˇhello world"); } +#[perf] #[gpui::test] async fn test_blackhole_register(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1728,6 +1780,7 @@ async fn test_blackhole_register(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("hellˇo"); } +#[perf] #[gpui::test] async fn test_sentence_backwards(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1803,6 +1856,7 @@ async fn test_sentence_backwards(cx: &mut gpui::TestAppContext) { }); } +#[perf] #[gpui::test] async fn test_sentence_forwards(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1818,6 +1872,7 @@ async fn test_sentence_forwards(cx: &mut gpui::TestAppContext) { cx.set_shared_state("helˇlo.\n\n\nworld.").await; } +#[perf] #[gpui::test] async fn test_ctrl_o_visual(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1829,6 +1884,7 @@ async fn test_ctrl_o_visual(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("ˇorld."); } +#[perf] #[gpui::test] async fn test_ctrl_o_position(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1840,6 +1896,7 @@ async fn test_ctrl_o_position(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq(" helloˇworld."); } +#[perf] #[gpui::test] async fn test_ctrl_o_dot(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -1851,6 +1908,7 @@ async fn test_ctrl_o_dot(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq("hellˇllo world."); } +#[perf(iterations = 1)] #[gpui::test] async fn test_folded_multibuffer_excerpts(cx: &mut gpui::TestAppContext) { VimTestContext::init(cx); @@ -2043,6 +2101,7 @@ async fn test_folded_multibuffer_excerpts(cx: &mut gpui::TestAppContext) { }); } +#[perf] #[gpui::test] async fn test_delete_paragraph_motion(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -2073,6 +2132,7 @@ async fn test_delete_paragraph_motion(cx: &mut gpui::TestAppContext) { cx.shared_clipboard().await.assert_eq("lo world."); } +#[perf] #[gpui::test] async fn test_delete_unmatched_brace(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -2111,6 +2171,7 @@ async fn test_delete_unmatched_brace(cx: &mut gpui::TestAppContext) { .assert_eq(" oth(wow)\n oth(wow)\n"); } +#[perf] #[gpui::test] async fn test_paragraph_multi_delete(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -2151,6 +2212,7 @@ async fn test_paragraph_multi_delete(cx: &mut gpui::TestAppContext) { cx.shared_state().await.assert_eq(indoc! {"ˇ"}); } +#[perf] #[gpui::test] async fn test_multi_cursor_replay(cx: &mut gpui::TestAppContext) { let mut cx = VimTestContext::new(cx, true).await; @@ -2189,3 +2251,52 @@ async fn test_multi_cursor_replay(cx: &mut gpui::TestAppContext) { Mode::Normal, ); } + +#[gpui::test] +async fn test_clipping_on_mode_change(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + cx.set_state( + indoc! { + " + ˇverylongline + andsomelinebelow + " + }, + Mode::Normal, + ); + + cx.simulate_keystrokes("v e"); + cx.assert_state( + indoc! { + " + «verylonglineˇ» + andsomelinebelow + " + }, + Mode::Visual, + ); + + let mut pixel_position = cx.update_editor(|editor, window, cx| { + let snapshot = editor.snapshot(window, cx); + let current_head = editor.selections.newest_display(cx).end; + editor.last_bounds().unwrap().origin + + editor + .display_to_pixel_point(current_head, &snapshot, window) + .unwrap() + }); + pixel_position.x += px(100.); + // click beyond end of the line + cx.simulate_click(pixel_position, Modifiers::default()); + cx.run_until_parked(); + + cx.assert_state( + indoc! { + " + verylonglinˇe + andsomelinebelow + " + }, + Mode::Normal, + ); +} diff --git a/crates/vim/src/test/neovim_backed_test_context.rs b/crates/vim/src/test/neovim_backed_test_context.rs index 6c9df164e0fe880c81960a412519347aff5959bd..9d2452ab20a6a99138c4b0d86f597f084a0876d6 100644 --- a/crates/vim/src/test/neovim_backed_test_context.rs +++ b/crates/vim/src/test/neovim_backed_test_context.rs @@ -6,7 +6,7 @@ use std::{ panic, thread, }; -use language::language_settings::{AllLanguageSettings, SoftWrap}; +use language::language_settings::SoftWrap; use util::test::marked_text_offsets; use super::{VimTestContext, neovim_connection::NeovimConnection}; @@ -207,6 +207,26 @@ impl NeovimBackedTestContext { } } + pub async fn new_tsx(cx: &mut gpui::TestAppContext) -> NeovimBackedTestContext { + #[cfg(feature = "neovim")] + cx.executor().allow_parking(); + let thread = thread::current(); + let test_name = thread + .name() + .expect("thread is not named") + .split(':') + .next_back() + .unwrap() + .to_string(); + Self { + cx: VimTestContext::new_tsx(cx).await, + neovim: NeovimConnection::new(test_name).await, + + last_set_state: None, + recent_keystrokes: Default::default(), + } + } + pub async fn set_shared_state(&mut self, marked_text: &str) { let mode = if marked_text.contains('»') { Mode::Visual @@ -245,9 +265,14 @@ impl NeovimBackedTestContext { self.update(|_, cx| { SettingsStore::update_global(cx, |settings, cx| { - settings.update_user_settings::(cx, |settings| { - settings.defaults.soft_wrap = Some(SoftWrap::PreferredLineLength); - settings.defaults.preferred_line_length = Some(columns); + settings.update_user_settings(cx, |settings| { + settings.project.all_languages.defaults.soft_wrap = + Some(SoftWrap::PreferredLineLength); + settings + .project + .all_languages + .defaults + .preferred_line_length = Some(columns); }); }) }) @@ -272,7 +297,7 @@ impl NeovimBackedTestContext { let window = self.window; let margin = self .update_window(window, |_, window, _cx| { - window.viewport_size().height - line_height * visible_line_count + window.viewport_size().height - line_height * (visible_line_count as f32) }) .unwrap(); diff --git a/crates/vim/src/test/neovim_connection.rs b/crates/vim/src/test/neovim_connection.rs index 4b0cc5b0c5377854b3c6c9950283f68f0c79b66c..dbc406850757e8987013df2b24f9e4107b890f98 100644 --- a/crates/vim/src/test/neovim_connection.rs +++ b/crates/vim/src/test/neovim_connection.rs @@ -59,7 +59,13 @@ pub struct NeovimConnection { } impl NeovimConnection { - pub async fn new(test_case_id: String) -> Self { + pub async fn new(mut test_case_id: String) -> Self { + // When running under perf, don't create duplicate files. + if cfg!(perf_enabled) { + if test_case_id.ends_with(perf::consts::SUF_NORMAL) { + test_case_id.truncate(test_case_id.len() - perf::consts::SUF_NORMAL.len()); + } + } #[cfg(feature = "neovim")] let handler = NvimHandler {}; #[cfg(feature = "neovim")] diff --git a/crates/vim/src/test/vim_test_context.rs b/crates/vim/src/test/vim_test_context.rs index 3e6c96ac72f1e6dee568dafbfda6956c1dd5970c..8dfc0c392d98073746e894bd4569f0edbf19e469 100644 --- a/crates/vim/src/test/vim_test_context.rs +++ b/crates/vim/src/test/vim_test_context.rs @@ -66,9 +66,31 @@ impl VimTestContext { ) } + pub async fn new_tsx(cx: &mut gpui::TestAppContext) -> VimTestContext { + Self::init(cx); + Self::new_with_lsp( + EditorLspTestContext::new_tsx( + lsp::ServerCapabilities { + completion_provider: Some(lsp::CompletionOptions { + trigger_characters: Some(vec![".".to_string()]), + ..Default::default() + }), + rename_provider: Some(lsp::OneOf::Right(lsp::RenameOptions { + prepare_provider: Some(true), + work_done_progress_options: Default::default(), + })), + ..Default::default() + }, + cx, + ) + .await, + true, + ) + } + pub fn init_keybindings(enabled: bool, cx: &mut App) { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |s| s.vim_mode = Some(enabled)); + store.update_user_settings(cx, |s| s.vim_mode = Some(enabled)); }); let mut default_key_bindings = settings::KeymapFile::load_asset_allow_partial_failure( "keymaps/default-macos.json", @@ -137,7 +159,7 @@ impl VimTestContext { pub fn enable_vim(&mut self) { self.cx.update(|_, cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |s| s.vim_mode = Some(true)); + store.update_user_settings(cx, |s| s.vim_mode = Some(true)); }); }) } @@ -145,7 +167,7 @@ impl VimTestContext { pub fn disable_vim(&mut self) { self.cx.update(|_, cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |s| s.vim_mode = Some(false)); + store.update_user_settings(cx, |s| s.vim_mode = Some(false)); }); }) } @@ -153,9 +175,7 @@ impl VimTestContext { pub fn enable_helix(&mut self) { self.cx.update(|_, cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |s| { - s.helix_mode = Some(true) - }); + store.update_user_settings(cx, |s| s.helix_mode = Some(true)); }); }) } diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index 7f388acd0c4bb342a4a7f1e39142cf70c9047f95..4999a4b04c2005ad2371b4e82c7f23578269c7bc 100644 --- a/crates/vim/src/vim.rs +++ b/crates/vim/src/vim.rs @@ -19,7 +19,6 @@ mod state; mod surrounds; mod visual; -use anyhow::Result; use collections::HashMap; use editor::{ Anchor, Bias, Editor, EditorEvent, EditorSettings, HideMouseCursorOrigin, SelectionEffects, @@ -31,16 +30,17 @@ use gpui::{ Render, Subscription, Task, WeakEntity, Window, actions, }; use insert::{NormalBefore, TemporaryNormal}; -use language::{CharKind, CursorShape, Point, Selection, SelectionGoal, TransactionId}; +use language::{ + CharKind, CharScopeContext, CursorShape, Point, Selection, SelectionGoal, TransactionId, +}; pub use mode_indicator::ModeIndicator; use motion::Motion; use normal::search::SearchSubmit; use object::Object; use schemars::JsonSchema; use serde::Deserialize; -use serde_derive::Serialize; -use settings::{ - Settings, SettingsKey, SettingsSources, SettingsStore, SettingsUi, update_settings_file, +pub use settings::{ + ModeContent, Settings, SettingsStore, UseSystemClipboard, update_settings_file, }; use state::{Mode, Operator, RecordedSelection, SearchState, VimGlobals}; use std::{mem, ops::Range, sync::Arc}; @@ -240,6 +240,12 @@ actions!( PushReplaceWithRegister, /// Toggles comments. PushToggleComments, + /// Selects (count) next menu item + MenuSelectNext, + /// Selects (count) previous menu item + MenuSelectPrevious, + /// Clears count or toggles project panel focus + ToggleProjectPanelFocus, /// Starts a match operation. PushHelixMatch, ] @@ -266,11 +272,58 @@ pub fn init(cx: &mut App) { workspace.register_action(|workspace, _: &ToggleVimMode, _, cx| { let fs = workspace.app_state().fs.clone(); let currently_enabled = Vim::enabled(cx); - update_settings_file::(fs, cx, move |setting, _| { + update_settings_file(fs, cx, move |setting, _| { setting.vim_mode = Some(!currently_enabled) }) }); + workspace.register_action(|_, _: &MenuSelectNext, window, cx| { + let count = Vim::take_count(cx).unwrap_or(1); + + for _ in 0..count { + window.dispatch_action(menu::SelectNext.boxed_clone(), cx); + } + }); + + workspace.register_action(|_, _: &MenuSelectPrevious, window, cx| { + let count = Vim::take_count(cx).unwrap_or(1); + + for _ in 0..count { + window.dispatch_action(menu::SelectPrevious.boxed_clone(), cx); + } + }); + + workspace.register_action(|_, _: &ToggleProjectPanelFocus, window, cx| { + if Vim::take_count(cx).is_none() { + window.dispatch_action(project_panel::ToggleFocus.boxed_clone(), cx); + } + }); + + workspace.register_action(|workspace, n: &Number, window, cx| { + let vim = workspace + .focused_pane(window, cx) + .read(cx) + .active_item() + .and_then(|item| item.act_as::(cx)) + .and_then(|editor| editor.read(cx).addon::().cloned()); + if let Some(vim) = vim { + let digit = n.0; + vim.entity.update(cx, |_, cx| { + cx.defer_in(window, move |vim, window, cx| { + vim.push_count_digit(digit, window, cx) + }) + }); + } else { + let count = Vim::globals(cx).pre_count.unwrap_or(0); + Vim::globals(cx).pre_count = Some( + count + .checked_mul(10) + .and_then(|c| c.checked_add(n.0)) + .unwrap_or(count), + ); + }; + }); + workspace.register_action(|_, _: &OpenDefaultKeymap, _, cx| { cx.emit(workspace::Event::OpenBundledFile { text: settings::vim_keymap(), @@ -424,14 +477,23 @@ impl Vim { pub fn new(window: &mut Window, cx: &mut Context) -> Entity { let editor = cx.entity(); - let mut initial_mode = VimSettings::get_global(cx).default_mode; - if initial_mode == Mode::Normal && HelixModeSetting::get_global(cx).0 { - initial_mode = Mode::HelixNormal; - } + let initial_vim_mode = VimSettings::get_global(cx).default_mode; + let (mode, last_mode) = if HelixModeSetting::get_global(cx).0 { + let initial_helix_mode = match initial_vim_mode { + Mode::Normal => Mode::HelixNormal, + Mode::Insert => Mode::Insert, + // Otherwise, we panic with a note that we should never get there due to the + // possible values of VimSettings::get_global(cx).default_mode being either Mode::Normal or Mode::Insert. + _ => unreachable!("Invalid default mode"), + }; + (initial_helix_mode, Mode::HelixNormal) + } else { + (initial_vim_mode, Mode::Normal) + }; cx.new(|cx| Vim { - mode: initial_mode, - last_mode: Mode::Normal, + mode, + last_mode, temp_mode: false, exit_temporary_mode: false, operator_stack: Vec::new(), @@ -616,6 +678,7 @@ impl Vim { vim.push_operator( Operator::ChangeSurrounds { target: action.target, + opening: false, }, window, cx, @@ -822,7 +885,7 @@ impl Vim { editor.set_collapse_matches(false); editor.set_input_enabled(true); editor.set_autoindent(true); - editor.selections.line_mode = false; + editor.selections.set_line_mode(false); editor.unregister_addon::(); editor.set_relative_line_number(None, cx); if let Some(vim) = Vim::globals(cx).focused_vim() @@ -883,6 +946,7 @@ impl Vim { self.update_editor(cx, |_, editor, cx| { editor.hide_mouse_cursor(HideMouseCursorOrigin::MovementAction, cx) }); + return; } } else if window.has_pending_keystrokes() || keystroke_event.keystroke.is_ime_in_progress() @@ -1075,16 +1139,16 @@ impl Vim { } let snapshot = s.display_map(); - if let Some(pending) = s.pending.as_mut() - && pending.selection.reversed + if let Some(pending) = s.pending_anchor_mut() + && pending.reversed && mode.is_visual() && !last_mode.is_visual() { - let mut end = pending.selection.end.to_point(&snapshot.buffer_snapshot); + let mut end = pending.end.to_point(&snapshot.buffer_snapshot()); end = snapshot - .buffer_snapshot + .buffer_snapshot() .clip_point(end + Point::new(0, 1), Bias::Right); - pending.selection.end = snapshot.buffer_snapshot.anchor_before(end); + pending.end = snapshot.buffer_snapshot().anchor_before(end); } s.move_with(|map, selection| { @@ -1092,6 +1156,8 @@ impl Vim { let mut point = selection.head(); if !selection.reversed && !selection.is_empty() { point = movement::left(map, selection.head()); + } else if selection.is_empty() { + point = map.clip_point(point, Bias::Left); } selection.collapse_to(point, selection.goal) } else if !last_mode.is_visual() && mode.is_visual() && selection.is_empty() { @@ -1332,7 +1398,7 @@ impl Vim { self.update_editor(cx, |_, editor, _| { editor .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .map(|selection| selection.tail()..selection.head()) .collect() @@ -1348,8 +1414,10 @@ impl Vim { self.update_editor(cx, |_, editor, cx| { let selection = editor.selections.newest::(cx); - let snapshot = &editor.snapshot(window, cx).buffer_snapshot; - let (range, kind) = snapshot.surrounding_word(selection.start, true); + let snapshot = editor.snapshot(window, cx); + let snapshot = snapshot.buffer_snapshot(); + let (range, kind) = + snapshot.surrounding_word(selection.start, Some(CharScopeContext::Completion)); if kind == Some(CharKind::Word) { let text: String = snapshot.text_for_range(range).collect(); if !text.trim().is_empty() { @@ -1607,7 +1675,7 @@ impl Vim { && !is_multicursor && [Mode::Visual, Mode::VisualLine, Mode::VisualBlock].contains(&self.mode) { - self.switch_mode(Mode::Normal, true, window, cx); + self.switch_mode(Mode::Normal, false, window, cx); } } @@ -1714,10 +1782,10 @@ impl Vim { } _ => self.clear_operator(window, cx), }, - Some(Operator::ChangeSurrounds { target }) => match self.mode { + Some(Operator::ChangeSurrounds { target, opening }) => match self.mode { Mode::Normal => { if let Some(target) = target { - self.change_surrounds(text, target, window, cx); + self.change_surrounds(text, target, opening, window, cx); self.clear_operator(window, cx); } } @@ -1784,7 +1852,9 @@ impl Vim { editor.set_collapse_matches(true); editor.set_input_enabled(vim.editor_input_enabled()); editor.set_autoindent(vim.should_autoindent()); - editor.selections.line_mode = matches!(vim.mode, Mode::VisualLine); + editor + .selections + .set_line_mode(matches!(vim.mode, Mode::VisualLine)); let hide_edit_predictions = !matches!(vim.mode, Mode::Insert | Mode::Replace); editor.set_edit_predictions_hidden_for_vim_mode(hide_edit_predictions, window, cx); @@ -1793,21 +1863,19 @@ impl Vim { } } -/// Controls when to use system clipboard. -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum UseSystemClipboard { - /// Don't use system clipboard. - Never, - /// Use system clipboard. - Always, - /// Use system clipboard for yank operations. - OnYank, +struct VimSettings { + pub default_mode: Mode, + pub toggle_relative_line_numbers: bool, + pub use_system_clipboard: settings::UseSystemClipboard, + pub use_smartcase_find: bool, + pub custom_digraphs: HashMap>, + pub highlight_on_yank_duration: u64, + pub cursor_shape: CursorShapeSettings, } /// The settings for cursor shape. -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -struct CursorShapeSettings { +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub struct CursorShapeSettings { /// Cursor shape for the normal mode. /// /// Default: block @@ -1826,85 +1894,37 @@ struct CursorShapeSettings { pub insert: Option, } -#[derive(Deserialize)] -struct VimSettings { - pub default_mode: Mode, - pub toggle_relative_line_numbers: bool, - pub use_system_clipboard: UseSystemClipboard, - pub use_smartcase_find: bool, - pub custom_digraphs: HashMap>, - pub highlight_on_yank_duration: u64, - pub cursor_shape: CursorShapeSettings, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(key = "vim")] -struct VimSettingsContent { - pub default_mode: Option, - pub toggle_relative_line_numbers: Option, - pub use_system_clipboard: Option, - pub use_smartcase_find: Option, - pub custom_digraphs: Option>>, - pub highlight_on_yank_duration: Option, - pub cursor_shape: Option, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum ModeContent { - #[default] - Normal, - Insert, - Replace, - Visual, - VisualLine, - VisualBlock, - HelixNormal, +impl From for CursorShapeSettings { + fn from(settings: settings::CursorShapeSettings) -> Self { + Self { + normal: settings.normal.map(Into::into), + replace: settings.replace.map(Into::into), + visual: settings.visual.map(Into::into), + insert: settings.insert.map(Into::into), + } + } } -impl From for Mode { +impl From for Mode { fn from(mode: ModeContent) -> Self { match mode { ModeContent::Normal => Self::Normal, ModeContent::Insert => Self::Insert, - ModeContent::Replace => Self::Replace, - ModeContent::Visual => Self::Visual, - ModeContent::VisualLine => Self::VisualLine, - ModeContent::VisualBlock => Self::VisualBlock, - ModeContent::HelixNormal => Self::HelixNormal, } } } impl Settings for VimSettings { - type FileContent = VimSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - let settings: VimSettingsContent = sources.json_merge()?; - - Ok(Self { - default_mode: settings - .default_mode - .ok_or_else(Self::missing_default)? - .into(), - toggle_relative_line_numbers: settings - .toggle_relative_line_numbers - .ok_or_else(Self::missing_default)?, - use_system_clipboard: settings - .use_system_clipboard - .ok_or_else(Self::missing_default)?, - use_smartcase_find: settings - .use_smartcase_find - .ok_or_else(Self::missing_default)?, - custom_digraphs: settings.custom_digraphs.ok_or_else(Self::missing_default)?, - highlight_on_yank_duration: settings - .highlight_on_yank_duration - .ok_or_else(Self::missing_default)?, - cursor_shape: settings.cursor_shape.ok_or_else(Self::missing_default)?, - }) - } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) { - // TODO: translate vim extension settings + fn from_settings(content: &settings::SettingsContent) -> Self { + let vim = content.vim.clone().unwrap(); + Self { + default_mode: vim.default_mode.unwrap().into(), + toggle_relative_line_numbers: vim.toggle_relative_line_numbers.unwrap(), + use_system_clipboard: vim.use_system_clipboard.unwrap(), + use_smartcase_find: vim.use_smartcase_find.unwrap(), + custom_digraphs: vim.custom_digraphs.unwrap(), + highlight_on_yank_duration: vim.highlight_on_yank_duration.unwrap(), + cursor_shape: vim.cursor_shape.unwrap().into(), + } } } diff --git a/crates/vim/src/visual.rs b/crates/vim/src/visual.rs index 5fbc04fbee9570db95cc95a4ce023e8e82c3183c..f8ef8e32586ca11800b5d3872aafaead3275bd37 100644 --- a/crates/vim/src/visual.rs +++ b/crates/vim/src/visual.rs @@ -15,7 +15,10 @@ use workspace::searchable::Direction; use crate::{ Vim, - motion::{Motion, MotionKind, first_non_whitespace, next_line_end, start_of_line}, + motion::{ + Motion, MotionKind, first_non_whitespace, next_line_end, start_of_line, + start_of_relative_buffer_row, + }, object::Object, state::{Mark, Mode, Operator}, }; @@ -314,7 +317,7 @@ impl Vim { let (start, end) = match s.newest_anchor().goal { SelectionGoal::HorizontalRange { start, end } if preserve_goal => (start, end), SelectionGoal::HorizontalPosition(start) if preserve_goal => (start, start), - _ => (tail_x.0, head_x.0), + _ => (tail_x.into(), head_x.into()), }; let mut goal = SelectionGoal::HorizontalRange { start, end }; @@ -359,8 +362,8 @@ impl Vim { if !preserve_goal { goal = SelectionGoal::HorizontalRange { - start: positions.start.0, - end: positions.end.0, + start: f64::from(positions.start), + end: f64::from(positions.end), }; } @@ -399,12 +402,13 @@ impl Vim { if row == head.row() { break; } - if tail.row() > head.row() { - row.0 -= 1 - } else { - row.0 += 1 - } + + // Move to the next or previous buffer row, ensuring that + // wrapped lines are handled correctly. + let direction = if tail.row() > head.row() { -1 } else { 1 }; + row = start_of_relative_buffer_row(map, DisplayPoint::new(row, 0), direction).row(); } + s.select(selections); }) } @@ -481,7 +485,7 @@ impl Vim { if object == Object::Paragraph && range.start != range.end { let row_of_selection_end_line = selection.end.to_point(map).row; let new_selection_end = if map - .buffer_snapshot + .buffer_snapshot() .line_len(MultiBufferRow(row_of_selection_end_line)) == 0 { @@ -501,7 +505,7 @@ impl Vim { if selection.end.to_point(map).row > new_start_point.row { if original_point.column == map - .buffer_snapshot + .buffer_snapshot() .line_len(MultiBufferRow(original_point.row)) { selection.start = movement::saturating_left( @@ -609,8 +613,8 @@ impl Vim { self.store_visual_marks(window, cx); self.update_editor(cx, |vim, editor, cx| { let mut original_columns: HashMap<_, _> = Default::default(); - let line_mode = line_mode || editor.selections.line_mode; - editor.selections.line_mode = false; + let line_mode = line_mode || editor.selections.line_mode(); + editor.selections.set_line_mode(false); editor.transact(window, cx, |editor, window, cx| { editor.change_selections(Default::default(), window, cx, |s| { @@ -631,7 +635,7 @@ impl Vim { let row = end.row.saturating_sub(1); selection.end = Point::new( row, - map.buffer_snapshot.line_len(MultiBufferRow(row)), + map.buffer_snapshot().line_len(MultiBufferRow(row)), ) .to_display_point(map) } else { @@ -654,12 +658,13 @@ impl Vim { s.move_with(|map, selection| { let end = selection.end.to_point(map); let start = selection.start.to_point(map); - if end.row < map.buffer_snapshot.max_point().row { + if end.row < map.buffer_snapshot().max_point().row { selection.end = Point::new(end.row + 1, 0).to_display_point(map) } else if start.row > 0 { selection.start = Point::new( start.row - 1, - map.buffer_snapshot.line_len(MultiBufferRow(start.row - 1)), + map.buffer_snapshot() + .line_len(MultiBufferRow(start.row - 1)), ) .to_display_point(map) } @@ -692,7 +697,7 @@ impl Vim { pub fn visual_yank(&mut self, line_mode: bool, window: &mut Window, cx: &mut Context) { self.store_visual_marks(window, cx); self.update_editor(cx, |vim, editor, cx| { - let line_mode = line_mode || editor.selections.line_mode; + let line_mode = line_mode || editor.selections.line_mode(); // For visual line mode, adjust selections to avoid yanking the next line when on \n if line_mode && vim.mode != Mode::VisualBlock { @@ -702,15 +707,17 @@ impl Vim { let end = selection.end.to_point(map); if end.column == 0 && end > start { let row = end.row.saturating_sub(1); - selection.end = - Point::new(row, map.buffer_snapshot.line_len(MultiBufferRow(row))) - .to_display_point(map); + selection.end = Point::new( + row, + map.buffer_snapshot().line_len(MultiBufferRow(row)), + ) + .to_display_point(map); } }); }); } - editor.selections.line_mode = line_mode; + editor.selections.set_line_mode(line_mode); let kind = if line_mode { MotionKind::Linewise } else { @@ -748,10 +755,10 @@ impl Vim { // after the change let stable_anchors = editor .selections - .disjoint_anchors() + .disjoint_anchors_arc() .iter() .map(|selection| { - let start = selection.start.bias_left(&display_map.buffer_snapshot); + let start = selection.start.bias_left(&display_map.buffer_snapshot()); start..start }) .collect::>(); @@ -1533,6 +1540,63 @@ mod test { }); } + #[gpui::test] + async fn test_visual_block_wrapping_selection(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + // Ensure that the editor is wrapping lines at 12 columns so that each + // of the lines ends up being wrapped. + cx.set_shared_wrap(12).await; + cx.set_shared_state(indoc! { + "ˇ12345678901234567890 + 12345678901234567890 + 12345678901234567890 + " + }) + .await; + cx.simulate_shared_keystrokes("ctrl-v j").await; + cx.shared_state().await.assert_eq(indoc! { + "«1ˇ»2345678901234567890 + «1ˇ»2345678901234567890 + 12345678901234567890 + " + }); + + // Test with lines taking up different amounts of display rows to ensure + // that, even in that case, only the buffer rows are taken into account. + cx.set_shared_state(indoc! { + "ˇ123456789012345678901234567890123456789012345678901234567890 + 1234567890123456789012345678901234567890 + 12345678901234567890 + " + }) + .await; + cx.simulate_shared_keystrokes("ctrl-v 2 j").await; + cx.shared_state().await.assert_eq(indoc! { + "«1ˇ»23456789012345678901234567890123456789012345678901234567890 + «1ˇ»234567890123456789012345678901234567890 + «1ˇ»2345678901234567890 + " + }); + + // Same scenario as above, but using the up motion to ensure that the + // result is the same. + cx.set_shared_state(indoc! { + "123456789012345678901234567890123456789012345678901234567890 + 1234567890123456789012345678901234567890 + ˇ12345678901234567890 + " + }) + .await; + cx.simulate_shared_keystrokes("ctrl-v 2 k").await; + cx.shared_state().await.assert_eq(indoc! { + "«1ˇ»23456789012345678901234567890123456789012345678901234567890 + «1ˇ»234567890123456789012345678901234567890 + «1ˇ»2345678901234567890 + " + }); + } + #[gpui::test] async fn test_visual_object(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; diff --git a/crates/vim/test_data/test_matching_nested_brackets.json b/crates/vim/test_data/test_matching_nested_brackets.json new file mode 100644 index 0000000000000000000000000000000000000000..d90b38416e62d1824779cd7a1cb194670fdb00ab --- /dev/null +++ b/crates/vim/test_data/test_matching_nested_brackets.json @@ -0,0 +1,5 @@ +{"Put":{"state":""}} +{"Key":"%"} +{"Get":{"state":"","mode":"Normal"}} +{"Key":"%"} +{"Get":{"state":"","mode":"Normal"}} diff --git a/crates/vim/test_data/test_visual_block_wrapping_selection.json b/crates/vim/test_data/test_visual_block_wrapping_selection.json new file mode 100644 index 0000000000000000000000000000000000000000..bbe945cfef76737df06410e70f8a5215ec6f01c5 --- /dev/null +++ b/crates/vim/test_data/test_visual_block_wrapping_selection.json @@ -0,0 +1,16 @@ +{"SetOption":{"value":"wrap"}} +{"SetOption":{"value":"columns=12"}} +{"Put":{"state":"ˇ12345678901234567890\n12345678901234567890\n12345678901234567890\n"}} +{"Key":"ctrl-v"} +{"Key":"j"} +{"Get":{"state":"«1ˇ»2345678901234567890\n«1ˇ»2345678901234567890\n12345678901234567890\n","mode":"VisualBlock"}} +{"Put":{"state":"ˇ123456789012345678901234567890123456789012345678901234567890\n1234567890123456789012345678901234567890\n12345678901234567890\n"}} +{"Key":"ctrl-v"} +{"Key":"2"} +{"Key":"j"} +{"Get":{"state":"«1ˇ»23456789012345678901234567890123456789012345678901234567890\n«1ˇ»234567890123456789012345678901234567890\n«1ˇ»2345678901234567890\n","mode":"VisualBlock"}} +{"Put":{"state":"123456789012345678901234567890123456789012345678901234567890\n1234567890123456789012345678901234567890\nˇ12345678901234567890\n"}} +{"Key":"ctrl-v"} +{"Key":"2"} +{"Key":"k"} +{"Get":{"state":"«1ˇ»23456789012345678901234567890123456789012345678901234567890\n«1ˇ»234567890123456789012345678901234567890\n«1ˇ»2345678901234567890\n","mode":"VisualBlock"}} diff --git a/crates/vim_mode_setting/Cargo.toml b/crates/vim_mode_setting/Cargo.toml index 61d265b958b10fac700bd78577ac5fefb19b7d09..8371cca401fa77c63cba6748dc428645340f48b6 100644 --- a/crates/vim_mode_setting/Cargo.toml +++ b/crates/vim_mode_setting/Cargo.toml @@ -12,9 +12,6 @@ workspace = true path = "src/vim_mode_setting.rs" [dependencies] -anyhow.workspace = true gpui.workspace = true -schemars.workspace = true -serde.workspace = true settings.workspace = true workspace-hack.workspace = true diff --git a/crates/vim_mode_setting/src/vim_mode_setting.rs b/crates/vim_mode_setting/src/vim_mode_setting.rs index 7d0f8aa7fe3766f18ef163ce882e55ebb73aa03a..d9495c556646f9b9f12dc0b52b9530796a5ad5e3 100644 --- a/crates/vim_mode_setting/src/vim_mode_setting.rs +++ b/crates/vim_mode_setting/src/vim_mode_setting.rs @@ -4,10 +4,8 @@ //! disable Vim/Helix modes without having to depend on the `vim` crate in its //! entirety. -use anyhow::Result; use gpui::App; -use schemars::JsonSchema; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::{Settings, SettingsContent}; /// Initializes the `vim_mode_setting` crate. pub fn init(cx: &mut App) { @@ -17,97 +15,22 @@ pub fn init(cx: &mut App) { pub struct VimModeSetting(pub bool); -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Debug, - Default, - serde::Serialize, - serde::Deserialize, - SettingsUi, - SettingsKey, - JsonSchema, -)] -#[settings_key(None)] -pub struct VimModeSettingContent { - /// Whether or not to enable Vim mode. - /// - /// Default: false - pub vim_mode: Option, -} - impl Settings for VimModeSetting { - type FileContent = VimModeSettingContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - Ok(Self( - [ - sources.profile, - sources.release_channel, - sources.user, - sources.server, - Some(sources.default), - ] - .into_iter() - .flatten() - .filter_map(|mode| mode.vim_mode) - .next() - .ok_or_else(Self::missing_default)?, - )) + fn from_settings(content: &SettingsContent) -> Self { + Self(content.vim_mode.unwrap()) } - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) { + fn import_from_vscode(_vscode: &settings::VsCodeSettings, _content: &mut SettingsContent) { // TODO: could possibly check if any of the `vim.` keys are set? } } -#[derive(Debug)] pub struct HelixModeSetting(pub bool); -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Debug, - Default, - serde::Serialize, - serde::Deserialize, - SettingsUi, - SettingsKey, - JsonSchema, -)] -#[settings_key(None)] -pub struct HelixModeSettingContent { - /// Whether or not to enable Helix mode. - /// - /// Default: false - pub helix_mode: Option, -} - impl Settings for HelixModeSetting { - type FileContent = HelixModeSettingContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - Ok(Self( - [ - sources.profile, - sources.release_channel, - sources.user, - sources.server, - Some(sources.default), - ] - .into_iter() - .flatten() - .filter_map(|mode| mode.helix_mode) - .next() - .ok_or_else(Self::missing_default)?, - )) + fn from_settings(content: &SettingsContent) -> Self { + Self(content.helix_mode.unwrap()) } - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) { - // TODO: could possibly check if any of the `helix.` keys are set? - } + fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut SettingsContent) {} } diff --git a/crates/workspace/src/dock.rs b/crates/workspace/src/dock.rs index d32f9cb66bc074636a681df73cd28150c43df883..b24942c272ffcfd4b8ea4645a7509b655a537cdb 100644 --- a/crates/workspace/src/dock.rs +++ b/crates/workspace/src/dock.rs @@ -9,14 +9,12 @@ use gpui::{ Render, SharedString, StyleRefinement, Styled, Subscription, WeakEntity, Window, deferred, div, px, }; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; use settings::SettingsStore; use std::sync::Arc; use ui::{ContextMenu, Divider, DividerColor, IconButton, Tooltip, h_flex}; use ui::{prelude::*, right_click_menu}; -pub(crate) const RESIZE_HANDLE_SIZE: Pixels = Pixels(6.); +pub(crate) const RESIZE_HANDLE_SIZE: Pixels = px(6.); pub enum PanelEvent { ZoomIn, @@ -210,14 +208,33 @@ impl Focusable for Dock { } } -#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] -#[serde(rename_all = "lowercase")] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum DockPosition { Left, Bottom, Right, } +impl From for DockPosition { + fn from(value: settings::DockPosition) -> Self { + match value { + settings::DockPosition::Left => Self::Left, + settings::DockPosition::Bottom => Self::Bottom, + settings::DockPosition::Right => Self::Right, + } + } +} + +impl Into for DockPosition { + fn into(self) -> settings::DockPosition { + match self { + Self::Left => settings::DockPosition::Left, + Self::Bottom => settings::DockPosition::Bottom, + Self::Right => settings::DockPosition::Right, + } + } +} + impl DockPosition { fn label(&self) -> &'static str { match self { @@ -715,7 +732,7 @@ impl Dock { } pub fn clamp_panel_size(&mut self, max_size: Pixels, window: &mut Window, cx: &mut App) { - let max_size = px((max_size.0 - RESIZE_HANDLE_SIZE.0).abs()); + let max_size = (max_size - RESIZE_HANDLE_SIZE).abs(); for panel in self.panel_entries.iter().map(|entry| &entry.panel) { if panel.size(window, cx) > max_size { panel.set_size(Some(max_size.max(RESIZE_HANDLE_SIZE)), window, cx); diff --git a/crates/workspace/src/item.rs b/crates/workspace/src/item.rs index 23fbec470c4d2e305bf7b51679bbe56f6dfeaa95..f868547dbf1da85bce8cf90c4bca266f941f78d9 100644 --- a/crates/workspace/src/item.rs +++ b/crates/workspace/src/item.rs @@ -15,9 +15,9 @@ use gpui::{ Focusable, Font, HighlightStyle, Pixels, Point, Render, SharedString, Task, WeakEntity, Window, }; use project::{Project, ProjectEntryId, ProjectPath}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsLocation, SettingsSources, SettingsUi}; +pub use settings::{ + ActivateOnClose, ClosePosition, Settings, SettingsLocation, ShowCloseButton, ShowDiagnostics, +}; use smallvec::SmallVec; use std::{ any::{Any, TypeId}, @@ -49,7 +49,6 @@ impl Default for SaveOptions { } } -#[derive(Deserialize)] pub struct ItemSettings { pub git_status: bool, pub close_position: ClosePosition, @@ -59,150 +58,95 @@ pub struct ItemSettings { pub show_close_button: ShowCloseButton, } -#[derive(Deserialize)] pub struct PreviewTabsSettings { pub enabled: bool, pub enable_preview_from_file_finder: bool, pub enable_preview_from_code_navigation: bool, } -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "lowercase")] -pub enum ClosePosition { - Left, - #[default] - Right, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "lowercase")] -pub enum ShowCloseButton { - Always, - #[default] - Hover, - Hidden, -} - -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum ShowDiagnostics { - #[default] - Off, - Errors, - All, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum ActivateOnClose { - #[default] - History, - Neighbour, - LeftNeighbour, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(key = "tabs")] -pub struct ItemSettingsContent { - /// Whether to show the Git file status on a tab item. - /// - /// Default: false - git_status: Option, - /// Position of the close button in a tab. - /// - /// Default: right - close_position: Option, - /// Whether to show the file icon for a tab. - /// - /// Default: false - file_icons: Option, - /// What to do after closing the current tab. - /// - /// Default: history - pub activate_on_close: Option, - /// Which files containing diagnostic errors/warnings to mark in the tabs. - /// This setting can take the following three values: - /// - /// Default: off - show_diagnostics: Option, - /// Whether to always show the close button on tabs. - /// - /// Default: false - show_close_button: Option, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(key = "preview_tabs")] -pub struct PreviewTabsSettingsContent { - /// Whether to show opened editors as preview tabs. - /// Preview tabs do not stay open, are reused until explicitly set to be kept open opened (via double-click or editing) and show file names in italic. - /// - /// Default: true - enabled: Option, - /// Whether to open tabs in preview mode when selected from the file finder. - /// - /// Default: false - enable_preview_from_file_finder: Option, - /// Whether a preview tab gets replaced when code navigation is used to navigate away from the tab. - /// - /// Default: false - enable_preview_from_code_navigation: Option, -} - impl Settings for ItemSettings { - type FileContent = ItemSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let tabs = content.tabs.as_ref().unwrap(); + Self { + git_status: tabs.git_status.unwrap(), + close_position: tabs.close_position.unwrap(), + activate_on_close: tabs.activate_on_close.unwrap(), + file_icons: tabs.file_icons.unwrap(), + show_diagnostics: tabs.show_diagnostics.unwrap(), + show_close_button: tabs.show_close_button.unwrap(), + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { + fn import_from_vscode( + vscode: &settings::VsCodeSettings, + current: &mut settings::SettingsContent, + ) { if let Some(b) = vscode.read_bool("workbench.editor.tabActionCloseVisibility") { - current.show_close_button = Some(if b { + current.tabs.get_or_insert_default().show_close_button = Some(if b { ShowCloseButton::Always } else { ShowCloseButton::Hidden }) } - vscode.enum_setting( - "workbench.editor.tabActionLocation", - &mut current.close_position, - |s| match s { - "right" => Some(ClosePosition::Right), - "left" => Some(ClosePosition::Left), - _ => None, - }, - ); + if let Some(s) = vscode.read_enum("workbench.editor.tabActionLocation", |s| match s { + "right" => Some(ClosePosition::Right), + "left" => Some(ClosePosition::Left), + _ => None, + }) { + current.tabs.get_or_insert_default().close_position = Some(s) + } if let Some(b) = vscode.read_bool("workbench.editor.focusRecentEditorAfterClose") { - current.activate_on_close = Some(if b { + current.tabs.get_or_insert_default().activate_on_close = Some(if b { ActivateOnClose::History } else { ActivateOnClose::LeftNeighbour }) } - vscode.bool_setting("workbench.editor.showIcons", &mut current.file_icons); - vscode.bool_setting("git.decorations.enabled", &mut current.git_status); + if let Some(b) = vscode.read_bool("workbench.editor.showIcons") { + current.tabs.get_or_insert_default().file_icons = Some(b); + }; + if let Some(b) = vscode.read_bool("git.decorations.enabled") { + current.tabs.get_or_insert_default().git_status = Some(b); + } } } impl Settings for PreviewTabsSettings { - type FileContent = PreviewTabsSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let preview_tabs = content.preview_tabs.as_ref().unwrap(); + Self { + enabled: preview_tabs.enabled.unwrap(), + enable_preview_from_file_finder: preview_tabs.enable_preview_from_file_finder.unwrap(), + enable_preview_from_code_navigation: preview_tabs + .enable_preview_from_code_navigation + .unwrap(), + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { - vscode.bool_setting("workbench.editor.enablePreview", &mut current.enabled); - vscode.bool_setting( - "workbench.editor.enablePreviewFromCodeNavigation", - &mut current.enable_preview_from_code_navigation, - ); - vscode.bool_setting( - "workbench.editor.enablePreviewFromQuickOpen", - &mut current.enable_preview_from_file_finder, - ); + fn import_from_vscode( + vscode: &settings::VsCodeSettings, + current: &mut settings::SettingsContent, + ) { + if let Some(enabled) = vscode.read_bool("workbench.editor.enablePreview") { + current.preview_tabs.get_or_insert_default().enabled = Some(enabled); + } + if let Some(enable_preview_from_code_navigation) = + vscode.read_bool("workbench.editor.enablePreviewFromCodeNavigation") + { + current + .preview_tabs + .get_or_insert_default() + .enable_preview_from_code_navigation = Some(enable_preview_from_code_navigation) + } + if let Some(enable_preview_from_file_finder) = + vscode.read_bool("workbench.editor.enablePreviewFromQuickOpen") + { + current + .preview_tabs + .get_or_insert_default() + .enable_preview_from_file_finder = Some(enable_preview_from_file_finder) + } } } @@ -252,6 +196,13 @@ pub enum TabTooltipContent { Custom(Box AnyView>), } +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum ItemBufferKind { + Multibuffer, + Singleton, + None, +} + pub trait Item: Focusable + EventEmitter + Render + Sized { type Event; @@ -316,8 +267,8 @@ pub trait Item: Focusable + EventEmitter + Render + Sized { _: &mut dyn FnMut(EntityId, &dyn project::ProjectItem), ) { } - fn is_singleton(&self, _cx: &App) -> bool { - false + fn buffer_kind(&self, _cx: &App) -> ItemBufferKind { + ItemBufferKind::None } fn set_nav_history(&mut self, _: ItemNavHistory, _window: &mut Window, _: &mut Context) {} fn clone_on_split( @@ -523,7 +474,7 @@ pub trait ItemHandle: 'static + Send { _: &App, _: &mut dyn FnMut(EntityId, &dyn project::ProjectItem), ); - fn is_singleton(&self, cx: &App) -> bool; + fn buffer_kind(&self, cx: &App) -> ItemBufferKind; fn boxed_clone(&self) -> Box; fn clone_on_split( &self, @@ -672,7 +623,7 @@ impl ItemHandle for Entity { fn project_path(&self, cx: &App) -> Option { let this = self.read(cx); let mut result = None; - if this.is_singleton(cx) { + if this.buffer_kind(cx) == ItemBufferKind::Singleton { this.for_each_project_item(cx, &mut |_, item| { result = item.project_path(cx); }); @@ -730,8 +681,8 @@ impl ItemHandle for Entity { self.read(cx).for_each_project_item(cx, f) } - fn is_singleton(&self, cx: &App) -> bool { - self.read(cx).is_singleton(cx) + fn buffer_kind(&self, cx: &App) -> ItemBufferKind { + self.read(cx).buffer_kind(cx) } fn boxed_clone(&self) -> Box { @@ -1348,13 +1299,17 @@ impl WeakFollowableItemHandle for WeakEntity { #[cfg(any(test, feature = "test-support"))] pub mod test { use super::{Item, ItemEvent, SerializableItem, TabContentParams}; - use crate::{ItemId, ItemNavHistory, Workspace, WorkspaceId, item::SaveOptions}; + use crate::{ + ItemId, ItemNavHistory, Workspace, WorkspaceId, + item::{ItemBufferKind, SaveOptions}, + }; use gpui::{ AnyElement, App, AppContext as _, Context, Entity, EntityId, EventEmitter, Focusable, InteractiveElement, IntoElement, Render, SharedString, Task, WeakEntity, Window, }; use project::{Project, ProjectEntryId, ProjectPath, WorktreeId}; - use std::{any::Any, cell::Cell, path::Path}; + use std::{any::Any, cell::Cell}; + use util::rel_path::rel_path; pub struct TestProjectItem { pub entry_id: Option, @@ -1370,7 +1325,7 @@ pub mod test { pub save_as_count: usize, pub reload_count: usize, pub is_dirty: bool, - pub is_singleton: bool, + pub buffer_kind: ItemBufferKind, pub has_conflict: bool, pub has_deleted_file: bool, pub project_items: Vec>, @@ -1411,7 +1366,7 @@ pub mod test { let entry_id = Some(ProjectEntryId::from_proto(id)); let project_path = Some(ProjectPath { worktree_id: WorktreeId::from_usize(0), - path: Path::new(path).into(), + path: rel_path(path).into(), }); cx.new(|_| Self { entry_id, @@ -1432,7 +1387,7 @@ pub mod test { let entry_id = Some(ProjectEntryId::from_proto(id)); let project_path = Some(ProjectPath { worktree_id: WorktreeId::from_usize(0), - path: Path::new(path).into(), + path: rel_path(path).into(), }); cx.new(|_| Self { entry_id, @@ -1454,7 +1409,7 @@ pub mod test { has_conflict: false, has_deleted_file: false, project_items: Vec::new(), - is_singleton: true, + buffer_kind: ItemBufferKind::Singleton, nav_history: None, tab_descriptions: None, tab_detail: Default::default(), @@ -1475,8 +1430,8 @@ pub mod test { self } - pub fn with_singleton(mut self, singleton: bool) -> Self { - self.is_singleton = singleton; + pub fn with_buffer_kind(mut self, buffer_kind: ItemBufferKind) -> Self { + self.buffer_kind = buffer_kind; self } @@ -1571,8 +1526,8 @@ pub mod test { .for_each(|item| f(item.entity_id(), item.read(cx))) } - fn is_singleton(&self, _: &App) -> bool { - self.is_singleton + fn buffer_kind(&self, _: &App) -> ItemBufferKind { + self.buffer_kind } fn set_nav_history( @@ -1619,7 +1574,7 @@ pub mod test { save_as_count: self.save_as_count, reload_count: self.reload_count, is_dirty: self.is_dirty, - is_singleton: self.is_singleton, + buffer_kind: self.buffer_kind, has_conflict: self.has_conflict, has_deleted_file: self.has_deleted_file, project_items: self.project_items.clone(), @@ -1653,7 +1608,7 @@ pub mod test { } fn can_save_as(&self, _cx: &App) -> bool { - self.is_singleton + self.buffer_kind == ItemBufferKind::Singleton } fn save( diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index 6946c74324ff5abaa0a85c21e6b5c5c5abf7124c..118cff340ad90240563d0406ea57f65a693fd1cd 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -4,9 +4,9 @@ use crate::{ WorkspaceItemBuilder, invalid_buffer_view::InvalidBufferView, item::{ - ActivateOnClose, ClosePosition, Item, ItemHandle, ItemSettings, PreviewTabsSettings, - ProjectItemKind, SaveOptions, ShowCloseButton, ShowDiagnostics, TabContentParams, - TabTooltipContent, WeakItemHandle, + ActivateOnClose, ClosePosition, Item, ItemBufferKind, ItemHandle, ItemSettings, + PreviewTabsSettings, ProjectItemKind, SaveOptions, ShowCloseButton, ShowDiagnostics, + TabContentParams, TabTooltipContent, WeakItemHandle, }, move_item, notifications::NotifyResultExt, @@ -49,7 +49,7 @@ use ui::{ IconDecoration, IconDecorationKind, IconName, IconSize, Indicator, Label, PopoverMenu, PopoverMenuHandle, Tab, TabBar, TabPosition, Tooltip, prelude::*, right_click_menu, }; -use util::{ResultExt, debug_panic, maybe, truncate_and_remove_front}; +use util::{ResultExt, debug_panic, maybe, paths::PathStyle, truncate_and_remove_front}; /// A selected entry in e.g. project panel. #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -124,6 +124,17 @@ pub struct CloseOtherItems { pub close_pinned: bool, } +/// Closes all multibuffers in the pane. +#[derive(Clone, PartialEq, Debug, Deserialize, JsonSchema, Default, Action)] +#[action(namespace = pane)] +#[serde(deny_unknown_fields)] +pub struct CloseMultibufferItems { + #[serde(default)] + pub save_intent: Option, + #[serde(default)] + pub close_pinned: bool, +} + /// Closes all items in the pane. #[derive(Clone, PartialEq, Debug, Deserialize, JsonSchema, Default, Action)] #[action(namespace = pane)] @@ -366,6 +377,9 @@ pub struct Pane { max_tabs: Option, _subscriptions: Vec, tab_bar_scroll_handle: ScrollHandle, + /// This is set to true if a user scroll has occurred more recently than a system scroll + /// We want to suppress certain system scrolls when the user has intentionally scrolled + suppress_scroll: bool, /// Is None if navigation buttons are permanently turned off (and should not react to setting changes). /// Otherwise, when `display_nav_history_buttons` is Some, it determines whether nav buttons should be displayed. display_nav_history_buttons: Option, @@ -496,6 +510,7 @@ impl Pane { }))), toolbar: cx.new(|_| Toolbar::new()), tab_bar_scroll_handle: ScrollHandle::new(), + suppress_scroll: false, drag_split_direction: None, workspace, project: project.downgrade(), @@ -572,6 +587,9 @@ impl Pane { if !self.was_focused { self.was_focused = true; self.update_history(self.active_item_index); + if !self.suppress_scroll && self.items.get(self.active_item_index).is_some() { + self.update_active_tab(self.active_item_index); + } cx.emit(Event::Focus); cx.notify(); } @@ -617,6 +635,7 @@ impl Pane { self.toolbar.update(cx, |toolbar, cx| { toolbar.focus_changed(false, window, cx); }); + cx.notify(); } @@ -891,7 +910,7 @@ impl Pane { let mut existing_item = None; if let Some(project_entry_id) = project_entry_id { for (index, item) in self.items.iter().enumerate() { - if item.is_singleton(cx) + if item.buffer_kind(cx) == ItemBufferKind::Singleton && item.project_entry_ids(cx).as_slice() == [project_entry_id] { let item = item.boxed_clone(); @@ -901,7 +920,9 @@ impl Pane { } } else { for (index, item) in self.items.iter().enumerate() { - if item.is_singleton(cx) && item.project_path(cx).as_ref() == Some(&project_path) { + if item.buffer_kind(cx) == ItemBufferKind::Singleton + && item.project_path(cx).as_ref() == Some(&project_path) + { let item = item.boxed_clone(); existing_item = Some((index, item)); break; @@ -1037,7 +1058,7 @@ impl Pane { self.close_items_on_item_open(window, cx); } - if item.is_singleton(cx) + if item.buffer_kind(cx) == ItemBufferKind::Singleton && let Some(&entry_id) = item.project_entry_ids(cx).first() { let Some(project) = self.project.upgrade() else { @@ -1068,7 +1089,7 @@ impl Pane { }; // Does the item already exist? - let project_entry_id = if item.is_singleton(cx) { + let project_entry_id = if item.buffer_kind(cx) == ItemBufferKind::Singleton { item.project_entry_ids(cx).first().copied() } else { None @@ -1077,7 +1098,7 @@ impl Pane { let existing_item_index = self.items.iter().position(|existing_item| { if existing_item.item_id() == item.item_id() { true - } else if existing_item.is_singleton(cx) { + } else if existing_item.buffer_kind(cx) == ItemBufferKind::Singleton { existing_item .project_entry_ids(cx) .first() @@ -1123,6 +1144,7 @@ impl Pane { } } else { self.items.insert(insertion_index, item.clone()); + cx.notify(); if activate { if insertion_index <= self.active_item_index @@ -1133,7 +1155,6 @@ impl Pane { self.activate_item(insertion_index, activate_pane, focus_item, window, cx); } - cx.notify(); } cx.emit(Event::AddItem { item }); @@ -1193,7 +1214,9 @@ impl Pane { cx: &App, ) -> Option> { self.items.iter().find_map(|item| { - if item.is_singleton(cx) && (item.project_entry_ids(cx).as_slice() == [entry_id]) { + if item.buffer_kind(cx) == ItemBufferKind::Singleton + && (item.project_entry_ids(cx).as_slice() == [entry_id]) + { Some(item.boxed_clone()) } else { None @@ -1207,7 +1230,8 @@ impl Pane { cx: &App, ) -> Option> { self.items.iter().find_map(move |item| { - if item.is_singleton(cx) && (item.project_path(cx).as_slice() == [project_path.clone()]) + if item.buffer_kind(cx) == ItemBufferKind::Singleton + && (item.project_path(cx).as_slice() == [project_path.clone()]) { Some(item.boxed_clone()) } else { @@ -1271,15 +1295,18 @@ impl Pane { focus_changed: focus_item, }); - if !self.is_tab_pinned(index) { - self.tab_bar_scroll_handle - .scroll_to_item(index - self.pinned_tab_count); - } - + self.update_active_tab(index); cx.notify(); } } + fn update_active_tab(&mut self, index: usize) { + if !self.is_tab_pinned(index) { + self.suppress_scroll = false; + self.tab_bar_scroll_handle.scroll_to_item(index); + } + } + fn update_history(&mut self, index: usize) { if let Some(newly_active_item) = self.items.get(index) { self.activation_history @@ -1463,6 +1490,30 @@ impl Pane { ) } + pub fn close_multibuffer_items( + &mut self, + action: &CloseMultibufferItems, + window: &mut Window, + cx: &mut Context, + ) -> Task> { + if self.items.is_empty() { + return Task::ready(Ok(())); + } + + let pinned_item_ids = self.pinned_item_ids(); + let multibuffer_items = self.multibuffer_item_ids(cx); + + self.close_items( + window, + cx, + action.save_intent.unwrap_or(SaveIntent::Close), + move |item_id| { + (action.close_pinned || !pinned_item_ids.contains(&item_id)) + && multibuffer_items.contains(&item_id) + }, + ) + } + pub fn close_clean_items( &mut self, action: &CloseCleanItems, @@ -1625,14 +1676,14 @@ impl Pane { } }); if dirty_project_item_ids.is_empty() { - return !(item.is_singleton(cx) && item.is_dirty(cx)); + return !(item.buffer_kind(cx) == ItemBufferKind::Singleton && item.is_dirty(cx)); } for open_item in workspace.items(cx) { if open_item.item_id() == item.item_id() { continue; } - if !open_item.is_singleton(cx) { + if open_item.buffer_kind(cx) != ItemBufferKind::Singleton { continue; } let other_project_item_ids = open_item.project_item_model_ids(cx); @@ -1651,11 +1702,9 @@ impl Pane { if !project_item.is_dirty() { return; } - let filename = project_item.project_path(cx).and_then(|path| { - path.path - .file_name() - .and_then(|name| name.to_str().map(ToOwned::to_owned)) - }); + let filename = project_item + .project_path(cx) + .and_then(|path| path.path.file_name().map(ToOwned::to_owned)); file_names.insert(filename.unwrap_or("untitled".to_string())); }); } @@ -1964,9 +2013,10 @@ impl Pane { const DELETED_MESSAGE: &str = "This file has been deleted on disk since you started editing it. Do you want to recreate it?"; + let path_style = project.read_with(cx, |project, cx| project.path_style(cx))?; if save_intent == SaveIntent::Skip { return Ok(true); - } + }; let Some(item_ix) = pane .read_with(cx, |pane, _| pane.index_for_item(item)) .ok() @@ -1988,7 +2038,7 @@ impl Pane { item.is_dirty(cx), item.can_save(cx), item.can_save_as(cx), - item.is_singleton(cx), + item.buffer_kind(cx) == ItemBufferKind::Singleton, item.has_deleted_file(cx), ) })?; @@ -2081,17 +2131,15 @@ impl Pane { } else if is_dirty && (can_save || can_save_as) { if save_intent == SaveIntent::Close { let will_autosave = cx.update(|_window, cx| { - matches!( - item.workspace_settings(cx).autosave, - AutosaveSetting::OnFocusChange | AutosaveSetting::OnWindowChange - ) && item.can_autosave(cx) + item.can_autosave(cx) + && item.workspace_settings(cx).autosave.should_save_on_close() })?; if !will_autosave { let item_id = item.item_id(); let answer_task = pane.update_in(cx, |pane, window, cx| { if pane.save_modals_spawned.insert(item_id) { pane.activate_item(item_ix, true, true, window, cx); - let prompt = dirty_message_for(item.project_path(cx)); + let prompt = dirty_message_for(item.project_path(cx), path_style); Some(window.prompt( PromptLevel::Warning, &prompt, @@ -2185,7 +2233,7 @@ impl Pane { let worktree_id = worktree.read_with(cx, |worktree, _| worktree.id())?; let new_path = ProjectPath { worktree_id, - path: path.into(), + path: path, }; pane.update_in(cx, |pane, window, cx| { @@ -2272,7 +2320,9 @@ impl Pane { cx: &mut Context, ) -> Option<()> { let item_id = self.items().find_map(|item| { - if item.is_singleton(cx) && item.project_entry_ids(cx).as_slice() == [entry_id] { + if item.buffer_kind(cx) == ItemBufferKind::Singleton + && item.project_entry_ids(cx).as_slice() == [entry_id] + { Some(item.item_id()) } else { None @@ -2322,10 +2372,10 @@ impl Pane { .worktree_for_entry(entry, cx)? .read(cx); let entry = worktree.entry_for_id(entry)?; - match &entry.canonical_path { - Some(canonical_path) => Some(canonical_path.to_path_buf()), - None => worktree.absolutize(&entry.path).ok(), - } + Some(match &entry.canonical_path { + Some(canonical_path) => canonical_path.to_path_buf(), + None => worktree.absolutize(&entry.path), + }) } pub fn icon_color(selected: bool) -> Color { @@ -2690,12 +2740,15 @@ impl Pane { .child(label), ); - let single_entry_to_resolve = self.items[ix] - .is_singleton(cx) + let single_entry_to_resolve = (self.items[ix].buffer_kind(cx) == ItemBufferKind::Singleton) .then(|| self.items[ix].project_entry_ids(cx).get(0).copied()) .flatten(); let total_items = self.items.len(); + let has_multibuffer_items = self + .items + .iter() + .any(|item| item.buffer_kind(cx) == ItemBufferKind::Multibuffer); let has_items_to_left = ix > 0; let has_items_to_right = ix < total_items - 1; let has_clean_items = self.items.iter().any(|item| !item.is_dirty(cx)); @@ -2716,6 +2769,10 @@ impl Pane { save_intent: None, close_pinned: false, }; + let close_multibuffers_action = CloseMultibufferItems { + save_intent: None, + close_pinned: false, + }; let close_items_to_the_left_action = CloseItemsToTheLeft { close_pinned: false, }; @@ -2753,6 +2810,24 @@ impl Pane { .detach_and_log_err(cx); })), )) + // We make this optional, instead of using disabled as to not overwhelm the context menu unnecessarily + .extend(has_multibuffer_items.then(|| { + ContextMenuItem::Entry( + ContextMenuEntry::new("Close Multibuffers") + .action(Box::new(close_multibuffers_action.clone())) + .handler(window.handler_for( + &pane, + move |pane, window, cx| { + pane.close_multibuffer_items( + &close_multibuffers_action, + window, + cx, + ) + .detach_and_log_err(cx); + }, + )), + ) + })) .separator() .item(ContextMenuItem::Entry( ContextMenuEntry::new("Close Left") @@ -2865,7 +2940,7 @@ impl Pane { Some(Box::new(zed_actions::workspace::CopyPath)), window.handler_for(&pane, move |_, _, cx| { cx.write_to_clipboard(ClipboardItem::new_string( - abs_path.to_string_lossy().to_string(), + abs_path.to_string_lossy().into_owned(), )); }), ) @@ -2874,9 +2949,14 @@ impl Pane { menu.entry( "Copy Relative Path", Some(Box::new(zed_actions::workspace::CopyRelativePath)), - window.handler_for(&pane, move |_, _, cx| { + window.handler_for(&pane, move |this, _, cx| { + let Some(project) = this.project.upgrade() else { + return; + }; + let path_style = project + .update(cx, |project, cx| project.path_style(cx)); cx.write_to_clipboard(ClipboardItem::new_string( - relative_path.to_string_lossy().to_string(), + relative_path.display(path_style).to_string(), )); }), ) @@ -3023,6 +3103,9 @@ impl Pane { .overflow_x_scroll() .w_full() .track_scroll(&self.tab_bar_scroll_handle) + .on_scroll_wheel(cx.listener(|this, _, _, _| { + this.suppress_scroll = true; + })) .children(unpinned_tabs) .child( div() @@ -3466,6 +3549,13 @@ impl Pane { } } + fn multibuffer_item_ids(&self, cx: &mut Context) -> Vec { + self.items() + .filter(|item| item.buffer_kind(cx) == ItemBufferKind::Multibuffer) + .map(|item| item.item_id()) + .collect() + } + pub fn drag_split_direction(&self) -> Option { self.drag_split_direction } @@ -3687,6 +3777,12 @@ impl Render for Pane { .detach_and_log_err(cx) }), ) + .on_action(cx.listener( + |pane: &mut Self, action: &CloseMultibufferItems, window, cx| { + pane.close_multibuffer_items(action, window, cx) + .detach_and_log_err(cx) + }, + )) .on_action( cx.listener(|pane: &mut Self, action: &RevealInProjectPanel, _, cx| { let entry_id = action @@ -4006,16 +4102,15 @@ impl NavHistoryState { } } -fn dirty_message_for(buffer_path: Option) -> String { +fn dirty_message_for(buffer_path: Option, path_style: PathStyle) -> String { let path = buffer_path .as_ref() .and_then(|p| { - p.path - .to_str() - .and_then(|s| if s.is_empty() { None } else { Some(s) }) + let path = p.path.display(path_style); + if path.is_empty() { None } else { Some(path) } }) - .unwrap_or("This buffer"); - let path = truncate_and_remove_front(path, 80); + .unwrap_or("This buffer".into()); + let path = truncate_and_remove_front(&path, 80); format!("{path} contains unsaved edits. Do you want to save it?") } @@ -4091,7 +4186,7 @@ mod tests { use super::*; use crate::item::test::{TestItem, TestProjectItem}; - use gpui::{TestAppContext, VisualTestContext}; + use gpui::{TestAppContext, VisualTestContext, size}; use project::FakeFs; use settings::SettingsStore; use theme::LoadThemes; @@ -5637,7 +5732,7 @@ mod tests { pane.add_item( Box::new(cx.new(|cx| { TestItem::new(cx) - .with_singleton(true) + .with_buffer_kind(ItemBufferKind::Singleton) .with_label("buffer 1") .with_project_items(&[TestProjectItem::new(1, "one.txt", cx)]) })), @@ -5655,7 +5750,7 @@ mod tests { pane.add_item( Box::new(cx.new(|cx| { TestItem::new(cx) - .with_singleton(true) + .with_buffer_kind(ItemBufferKind::Singleton) .with_label("buffer 1") .with_project_items(&[TestProjectItem::new(1, "1.txt", cx)]) })), @@ -5673,7 +5768,7 @@ mod tests { pane.add_item( Box::new(cx.new(|cx| { TestItem::new(cx) - .with_singleton(true) + .with_buffer_kind(ItemBufferKind::Singleton) .with_label("buffer 2") .with_project_items(&[TestProjectItem::new(2, "2.txt", cx)]) })), @@ -5691,7 +5786,7 @@ mod tests { pane.add_item( Box::new(cx.new(|cx| { TestItem::new(cx) - .with_singleton(false) + .with_buffer_kind(ItemBufferKind::Multibuffer) .with_label("multibuffer 1") .with_project_items(&[TestProjectItem::new(1, "1.txt", cx)]) })), @@ -5709,7 +5804,7 @@ mod tests { pane.add_item( Box::new(cx.new(|cx| { TestItem::new(cx) - .with_singleton(false) + .with_buffer_kind(ItemBufferKind::Multibuffer) .with_label("multibuffer 1b") .with_project_items(&[TestProjectItem::new(1, "1.txt", cx)]) })), @@ -5815,8 +5910,8 @@ mod tests { async fn test_remove_item_ordering_neighbour(cx: &mut TestAppContext) { init_test(cx); cx.update_global::(|s, cx| { - s.update_user_settings::(cx, |s| { - s.activate_on_close = Some(ActivateOnClose::Neighbour); + s.update_user_settings(cx, |s| { + s.tabs.get_or_insert_default().activate_on_close = Some(ActivateOnClose::Neighbour); }); }); let fs = FakeFs::new(cx.executor()); @@ -5904,8 +5999,9 @@ mod tests { async fn test_remove_item_ordering_left_neighbour(cx: &mut TestAppContext) { init_test(cx); cx.update_global::(|s, cx| { - s.update_user_settings::(cx, |s| { - s.activate_on_close = Some(ActivateOnClose::LeftNeighbour); + s.update_user_settings(cx, |s| { + s.tabs.get_or_insert_default().activate_on_close = + Some(ActivateOnClose::LeftNeighbour); }); }); let fs = FakeFs::new(cx.executor()); @@ -6262,6 +6358,139 @@ mod tests { assert_item_labels(&pane, [], cx); } + #[gpui::test] + async fn test_close_multibuffer_items(cx: &mut TestAppContext) { + init_test(cx); + let fs = FakeFs::new(cx.executor()); + + let project = Project::test(fs, None, cx).await; + let (workspace, cx) = + cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx)); + let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone()); + + let add_labeled_item = |pane: &Entity, + label, + is_dirty, + kind: ItemBufferKind, + cx: &mut VisualTestContext| { + pane.update_in(cx, |pane, window, cx| { + let labeled_item = Box::new(cx.new(|cx| { + TestItem::new(cx) + .with_label(label) + .with_dirty(is_dirty) + .with_buffer_kind(kind) + })); + pane.add_item(labeled_item.clone(), false, false, None, window, cx); + labeled_item + }) + }; + + let item_a = add_labeled_item(&pane, "A", false, ItemBufferKind::Multibuffer, cx); + add_labeled_item(&pane, "B", false, ItemBufferKind::Multibuffer, cx); + add_labeled_item(&pane, "C", false, ItemBufferKind::Singleton, cx); + assert_item_labels(&pane, ["A", "B", "C*"], cx); + + pane.update_in(cx, |pane, window, cx| { + let ix = pane.index_for_item_id(item_a.item_id()).unwrap(); + pane.pin_tab_at(ix, window, cx); + pane.close_multibuffer_items( + &CloseMultibufferItems { + save_intent: None, + close_pinned: false, + }, + window, + cx, + ) + }) + .await + .unwrap(); + assert_item_labels(&pane, ["A!", "C*"], cx); + + pane.update_in(cx, |pane, window, cx| { + let ix = pane.index_for_item_id(item_a.item_id()).unwrap(); + pane.unpin_tab_at(ix, window, cx); + pane.close_multibuffer_items( + &CloseMultibufferItems { + save_intent: None, + close_pinned: false, + }, + window, + cx, + ) + }) + .await + .unwrap(); + + assert_item_labels(&pane, ["C*"], cx); + + add_labeled_item(&pane, "A", true, ItemBufferKind::Singleton, cx).update(cx, |item, cx| { + item.project_items + .push(TestProjectItem::new_dirty(1, "A.txt", cx)) + }); + add_labeled_item(&pane, "B", true, ItemBufferKind::Multibuffer, cx).update( + cx, + |item, cx| { + item.project_items + .push(TestProjectItem::new_dirty(2, "B.txt", cx)) + }, + ); + add_labeled_item(&pane, "D", true, ItemBufferKind::Multibuffer, cx).update( + cx, + |item, cx| { + item.project_items + .push(TestProjectItem::new_dirty(3, "D.txt", cx)) + }, + ); + assert_item_labels(&pane, ["C", "A^", "B^", "D*^"], cx); + + let save = pane.update_in(cx, |pane, window, cx| { + pane.close_multibuffer_items( + &CloseMultibufferItems { + save_intent: None, + close_pinned: false, + }, + window, + cx, + ) + }); + + cx.executor().run_until_parked(); + cx.simulate_prompt_answer("Save all"); + save.await.unwrap(); + assert_item_labels(&pane, ["C", "A*^"], cx); + + add_labeled_item(&pane, "B", true, ItemBufferKind::Multibuffer, cx).update( + cx, + |item, cx| { + item.project_items + .push(TestProjectItem::new_dirty(2, "B.txt", cx)) + }, + ); + add_labeled_item(&pane, "D", true, ItemBufferKind::Multibuffer, cx).update( + cx, + |item, cx| { + item.project_items + .push(TestProjectItem::new_dirty(3, "D.txt", cx)) + }, + ); + assert_item_labels(&pane, ["C", "A^", "B^", "D*^"], cx); + let save = pane.update_in(cx, |pane, window, cx| { + pane.close_multibuffer_items( + &CloseMultibufferItems { + save_intent: None, + close_pinned: false, + }, + window, + cx, + ) + }); + + cx.executor().run_until_parked(); + cx.simulate_prompt_answer("Discard all"); + save.await.unwrap(); + assert_item_labels(&pane, ["C", "A*^"], cx); + } + #[gpui::test] async fn test_close_with_save_intent(cx: &mut TestAppContext) { init_test(cx); @@ -6305,6 +6534,42 @@ mod tests { }); } + #[gpui::test] + async fn test_new_tab_scrolls_into_view_completely(cx: &mut TestAppContext) { + // Arrange + init_test(cx); + let fs = FakeFs::new(cx.executor()); + + let project = Project::test(fs, None, cx).await; + let (workspace, cx) = + cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx)); + let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone()); + + cx.simulate_resize(size(px(300.), px(300.))); + + add_labeled_item(&pane, "untitled", false, cx); + add_labeled_item(&pane, "untitled", false, cx); + add_labeled_item(&pane, "untitled", false, cx); + add_labeled_item(&pane, "untitled", false, cx); + // Act: this should trigger a scroll + add_labeled_item(&pane, "untitled", false, cx); + // Assert + let tab_bar_scroll_handle = + pane.update_in(cx, |pane, _window, _cx| pane.tab_bar_scroll_handle.clone()); + assert_eq!(tab_bar_scroll_handle.children_count(), 6); + let tab_bounds = cx.debug_bounds("TAB-3").unwrap(); + let new_tab_button_bounds = cx.debug_bounds("ICON-Plus").unwrap(); + let scroll_bounds = tab_bar_scroll_handle.bounds(); + let scroll_offset = tab_bar_scroll_handle.offset(); + assert!(tab_bounds.right() <= scroll_bounds.right() + scroll_offset.x); + // -39.5 is the magic number for this setup + assert_eq!(scroll_offset.x, px(-39.5)); + assert!( + !tab_bounds.intersects(&new_tab_button_bounds), + "Tab should not overlap with the new tab button, if this is failing check if there's been a redesign!" + ); + } + #[gpui::test] async fn test_close_all_items_including_pinned(cx: &mut TestAppContext) { init_test(cx); @@ -6557,8 +6822,8 @@ mod tests { fn set_max_tabs(cx: &mut TestAppContext, value: Option) { cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |settings| { - settings.max_tabs = value.map(|v| NonZero::new(v).unwrap()) + store.update_user_settings(cx, |settings| { + settings.workspace.max_tabs = value.map(|v| NonZero::new(v).unwrap()) }); }); } diff --git a/crates/workspace/src/pane_group.rs b/crates/workspace/src/pane_group.rs index 9c2d09fd26308b95ab145b557a516b5e6603a0e4..127eae6de07670c265597a6f6df3a286487a9c64 100644 --- a/crates/workspace/src/pane_group.rs +++ b/crates/workspace/src/pane_group.rs @@ -1259,11 +1259,11 @@ mod element { origin: child .bounds .origin - .apply_along(Axis::Horizontal, |val| val + Pixels(1.)), + .apply_along(Axis::Horizontal, |val| val + px(1.)), size: child .bounds .size - .apply_along(Axis::Horizontal, |val| val - Pixels(1.)), + .apply_along(Axis::Horizontal, |val| val - px(1.)), }; if overlay_opacity.is_some() diff --git a/crates/workspace/src/persistence.rs b/crates/workspace/src/persistence.rs index 797c4796830ff767a0213058c417bb3a764c6bec..efd5116dc39d3ca615112c503ea135b7da076264 100644 --- a/crates/workspace/src/persistence.rs +++ b/crates/workspace/src/persistence.rs @@ -28,7 +28,7 @@ use sqlez::{ }; use ui::{App, SharedString, px}; -use util::{ResultExt, maybe}; +use util::{ResultExt, maybe, rel_path::RelPath}; use uuid::Uuid; use crate::{ @@ -252,7 +252,7 @@ impl sqlez::bindable::Bind for SerializedPixels { statement: &sqlez::statement::Statement, start_index: i32, ) -> anyhow::Result { - let this: i32 = self.0.0 as i32; + let this: i32 = u32::from(self.0) as _; this.bind(statement, start_index) } } @@ -915,10 +915,13 @@ impl WorkspaceDb { relative_worktree_path == String::default() ); + let Some(relative_path) = RelPath::unix(&relative_worktree_path).log_err() else { + continue; + }; if worktree_id != u64::MAX && relative_worktree_path != String::default() { ToolchainScope::Subproject( WorktreeId::from_usize(worktree_id as usize), - Arc::from(relative_worktree_path.as_ref()), + relative_path.into(), ) } else { ToolchainScope::Project @@ -994,11 +997,18 @@ impl WorkspaceDb { } } } + + conn.exec_bound( + sql!( + DELETE FROM user_toolchains WHERE workspace_id = ?1; + ) + )?(workspace.id).context("Clearing old user toolchains")?; + for (scope, toolchains) in workspace.user_toolchains { for toolchain in toolchains { let query = sql!(INSERT OR REPLACE INTO user_toolchains(remote_connection_id, workspace_id, worktree_id, relative_worktree_path, language_name, name, path, raw_json) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)); let (workspace_id, worktree_id, relative_worktree_path) = match scope { - ToolchainScope::Subproject(worktree_id, ref path) => (Some(workspace.id), Some(worktree_id), Some(path.to_string_lossy().into_owned())), + ToolchainScope::Subproject(worktree_id, ref path) => (Some(workspace.id), Some(worktree_id), Some(path.as_unix_str().to_owned())), ToolchainScope::Project => (Some(workspace.id), None, None), ToolchainScope::Global => (None, None, None), }; @@ -1637,25 +1647,41 @@ impl WorkspaceDb { &self, workspace_id: WorkspaceId, worktree_id: WorktreeId, - relative_worktree_path: String, + relative_worktree_path: Arc, language_name: LanguageName, ) -> Result> { self.write(move |this| { let mut select = this .select_bound(sql!( - SELECT name, path, raw_json FROM toolchains WHERE workspace_id = ? AND language_name = ? AND worktree_id = ? AND relative_worktree_path = ? + SELECT + name, path, raw_json + FROM toolchains + WHERE + workspace_id = ? AND + language_name = ? AND + worktree_id = ? AND + relative_worktree_path = ? )) .context("select toolchain")?; - let toolchain: Vec<(String, String, String)> = - select((workspace_id, language_name.as_ref().to_string(), worktree_id.to_usize(), relative_worktree_path))?; + let toolchain: Vec<(String, String, String)> = select(( + workspace_id, + language_name.as_ref().to_string(), + worktree_id.to_usize(), + relative_worktree_path.as_unix_str().to_string(), + ))?; - Ok(toolchain.into_iter().next().and_then(|(name, path, raw_json)| Some(Toolchain { - name: name.into(), - path: path.into(), - language_name, - as_json: serde_json::Value::from_str(&raw_json).ok()?, - }))) + Ok(toolchain + .into_iter() + .next() + .and_then(|(name, path, raw_json)| { + Some(Toolchain { + name: name.into(), + path: path.into(), + language_name, + as_json: serde_json::Value::from_str(&raw_json).ok()?, + }) + })) }) .await } @@ -1663,31 +1689,46 @@ impl WorkspaceDb { pub(crate) async fn toolchains( &self, workspace_id: WorkspaceId, - ) -> Result)>> { + ) -> Result)>> { self.write(move |this| { let mut select = this .select_bound(sql!( - SELECT name, path, worktree_id, relative_worktree_path, language_name, raw_json FROM toolchains WHERE workspace_id = ? + SELECT + name, path, worktree_id, relative_worktree_path, language_name, raw_json + FROM toolchains + WHERE workspace_id = ? )) .context("select toolchains")?; let toolchain: Vec<(String, String, u64, String, String, String)> = select(workspace_id)?; - Ok(toolchain.into_iter().filter_map(|(name, path, worktree_id, relative_worktree_path, language_name, raw_json)| Some((Toolchain { - name: name.into(), - path: path.into(), - language_name: LanguageName::new(&language_name), - as_json: serde_json::Value::from_str(&raw_json).ok()?, - }, WorktreeId::from_proto(worktree_id), Arc::from(relative_worktree_path.as_ref())))).collect()) + Ok(toolchain + .into_iter() + .filter_map( + |(name, path, worktree_id, relative_worktree_path, language, json)| { + Some(( + Toolchain { + name: name.into(), + path: path.into(), + language_name: LanguageName::new(&language), + as_json: serde_json::Value::from_str(&json).ok()?, + }, + WorktreeId::from_proto(worktree_id), + RelPath::from_proto(&relative_worktree_path).log_err()?, + )) + }, + ) + .collect()) }) .await } + pub async fn set_toolchain( &self, workspace_id: WorkspaceId, worktree_id: WorktreeId, - relative_worktree_path: String, + relative_worktree_path: Arc, toolchain: Toolchain, ) -> Result<()> { log::debug!( @@ -1709,7 +1750,7 @@ impl WorkspaceDb { insert(( workspace_id, worktree_id.to_usize(), - relative_worktree_path, + relative_worktree_path.as_unix_str(), toolchain.language_name.as_ref(), toolchain.name.as_ref(), toolchain.path.as_ref(), diff --git a/crates/workspace/src/searchable.rs b/crates/workspace/src/searchable.rs index b21ba7a4b1a2ec7cc80521e91b4e5935333615f5..310fae908dbd6864c1636ebd393e4920d0f9ad02 100644 --- a/crates/workspace/src/searchable.rs +++ b/crates/workspace/src/searchable.rs @@ -45,6 +45,16 @@ pub struct SearchOptions { pub find_in_results: bool, } +// Whether to always select the current selection (even if empty) +// or to use the default (restoring the previous search ranges if some, +// otherwise using the whole file). +#[derive(Clone, Copy, Debug, Default, PartialEq)] +pub enum FilteredSearchRange { + Selection, + #[default] + Default, +} + pub trait SearchableItem: Item + EventEmitter { type Match: Any + Sync + Send + Clone; @@ -73,7 +83,7 @@ pub trait SearchableItem: Item + EventEmitter { fn toggle_filtered_search_ranges( &mut self, - _enabled: bool, + _enabled: Option, _window: &mut Window, _cx: &mut Context, ) { @@ -216,7 +226,12 @@ pub trait SearchableItemHandle: ItemHandle { ) -> Option; fn search_bar_visibility_changed(&self, visible: bool, window: &mut Window, cx: &mut App); - fn toggle_filtered_search_ranges(&mut self, enabled: bool, window: &mut Window, cx: &mut App); + fn toggle_filtered_search_ranges( + &mut self, + enabled: Option, + window: &mut Window, + cx: &mut App, + ); } impl SearchableItemHandle for Entity { @@ -362,7 +377,12 @@ impl SearchableItemHandle for Entity { }); } - fn toggle_filtered_search_ranges(&mut self, enabled: bool, window: &mut Window, cx: &mut App) { + fn toggle_filtered_search_ranges( + &mut self, + enabled: Option, + window: &mut Window, + cx: &mut App, + ) { self.update(cx, |this, cx| { this.toggle_filtered_search_ranges(enabled, window, cx) }); diff --git a/crates/workspace/src/status_bar.rs b/crates/workspace/src/status_bar.rs index 187e720d9c01fb471d91781435912b6502e2a0a9..9087cbba42b054c1b247bdf3d9402688de4b7add 100644 --- a/crates/workspace/src/status_bar.rs +++ b/crates/workspace/src/status_bar.rs @@ -9,6 +9,7 @@ use ui::{h_flex, prelude::*}; use util::ResultExt; pub trait StatusItemView: Render { + /// Event callback that is triggered when the active pane item changes. fn set_active_pane_item( &mut self, active_pane_item: Option<&dyn crate::ItemHandle>, diff --git a/crates/workspace/src/tasks.rs b/crates/workspace/src/tasks.rs index 71394c874ae988d7b8fef3e3a224d25e1c290640..5f52cb49e74d67619b9ba7c033a33fe8a7ad51c8 100644 --- a/crates/workspace/src/tasks.rs +++ b/crates/workspace/src/tasks.rs @@ -8,7 +8,7 @@ use remote::ConnectionState; use task::{DebugScenario, ResolvedTask, SpawnInTerminal, TaskContext, TaskTemplate}; use ui::Window; -use crate::Workspace; +use crate::{Toast, Workspace, notifications::NotificationId}; impl Workspace { pub fn schedule_task( @@ -73,8 +73,10 @@ impl Workspace { if let Some(terminal_provider) = self.terminal_provider.as_ref() { let task_status = terminal_provider.spawn(spawn_in_terminal, window, cx); - let task = cx.background_spawn(async move { - match task_status.await { + + let task = cx.spawn(async |w, cx| { + let res = cx.background_spawn(task_status).await; + match res { Some(Ok(status)) => { if status.success() { log::debug!("Task spawn succeeded"); @@ -82,9 +84,15 @@ impl Workspace { log::debug!("Task spawn failed, code: {:?}", status.code()); } } - Some(Err(e)) => log::error!("Task spawn failed: {e:#}"), + Some(Err(e)) => { + log::error!("Task spawn failed: {e:#}"); + _ = w.update(cx, |w, cx| { + let id = NotificationId::unique::(); + w.show_toast(Toast::new(id, format!("Task spawn failed: {e}")), cx); + }) + } None => log::debug!("Task spawn got cancelled"), - } + }; }); self.scheduled_tasks.push(task); } diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index e6a30e92d977ecf4781f48ce92f5f7483fe810b2..0be758efb7a4622361b5dfe4785e44eb16fe1d4f 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -52,10 +52,7 @@ pub use item::{ ProjectItem, SerializableItem, SerializableItemHandle, WeakItemHandle, }; use itertools::Itertools; -use language::{ - Buffer, LanguageRegistry, Rope, - language_settings::{AllLanguageSettings, all_language_settings}, -}; +use language::{Buffer, LanguageRegistry, Rope, language_settings::all_language_settings}; pub use modal_layer::*; use node_runtime::NodeRuntime; use notifications::{ @@ -63,7 +60,10 @@ use notifications::{ simple_message_notification::MessageNotification, }; pub use pane::*; -pub use pane_group::*; +pub use pane_group::{ + ActivePaneDecorator, HANDLE_HITBOX_SIZE, Member, PaneAxis, PaneGroup, PaneRenderContext, + SplitDirection, +}; use persistence::{DB, SerializedWindowBounds, model::SerializedWorkspace}; pub use persistence::{ DB as WORKSPACE_DB, WorkspaceDb, delete_unloaded_items, @@ -103,22 +103,28 @@ use std::{ time::Duration, }; use task::{DebugScenario, SpawnInTerminal, TaskContext}; -use theme::{ActiveTheme, SystemAppearance, ThemeSettings}; +use theme::{ActiveTheme, GlobalTheme, SystemAppearance, ThemeSettings}; pub use toolbar::{Toolbar, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView}; pub use ui; use ui::{Window, prelude::*}; -use util::{ResultExt, TryFutureExt, paths::SanitizedPath, serde::default_true}; +use util::{ + ResultExt, TryFutureExt, + paths::{PathStyle, SanitizedPath}, + rel_path::RelPath, + serde::default_true, +}; use uuid::Uuid; pub use workspace_settings::{ - AutosaveSetting, BottomDockLayout, RestoreOnStartupBehavior, TabBarSettings, WorkspaceSettings, + AutosaveSetting, BottomDockLayout, RestoreOnStartupBehavior, StatusBarSettings, TabBarSettings, + WorkspaceSettings, }; use zed_actions::{Spawn, feedback::FileBugReport}; -use crate::notifications::NotificationId; use crate::persistence::{ SerializedAxis, model::{DockData, DockStructure, SerializedItem, SerializedPane, SerializedPaneGroup}, }; +use crate::{item::ItemBufferKind, notifications::NotificationId}; pub const SERIALIZATION_THROTTLE_TIME: Duration = Duration::from_millis(200); @@ -504,6 +510,7 @@ pub fn init_settings(cx: &mut App) { ItemSettings::register(cx); PreviewTabsSettings::register(cx); TabBarSettings::register(cx); + StatusBarSettings::register(cx); } fn prompt_and_open_paths(app_state: Arc, options: PathPromptOptions, cx: &mut App) { @@ -628,7 +635,7 @@ impl ProjectItemRegistry { match project_item.await.with_context(|| { format!( "opening project path {:?}", - entry_abs_path.as_deref().unwrap_or(&project_path.path) + entry_abs_path.as_deref().unwrap_or(&project_path.path.as_std_path()) ) }) { Ok(project_item) => { @@ -1428,8 +1435,8 @@ impl Workspace { *SystemAppearance::global_mut(cx) = SystemAppearance(window_appearance.into()); - ThemeSettings::reload_current_theme(cx); - ThemeSettings::reload_current_icon_theme(cx); + GlobalTheme::reload_theme(cx); + GlobalTheme::reload_icon_theme(cx); }), cx.on_release(move |this, cx| { this.app_state.workspace_store.update(cx, move |store, _| { @@ -1695,8 +1702,8 @@ impl Workspace { cx: &mut Context, ) { let fs = self.project().read(cx).fs(); - settings::update_settings_file::(fs.clone(), cx, move |content, _cx| { - content.bottom_dock_layout = Some(layout); + settings::update_settings_file(fs.clone(), cx, move |content, _cx| { + content.workspace.bottom_dock_layout = Some(layout); }); cx.notify(); @@ -1741,10 +1748,27 @@ impl Workspace { }); } + pub fn remove_panel( + &mut self, + panel: &Entity, + window: &mut Window, + cx: &mut Context, + ) { + for dock in [&self.left_dock, &self.bottom_dock, &self.right_dock] { + dock.update(cx, |dock, cx| { + dock.remove_panel(panel, window, cx); + }) + } + } + pub fn status_bar(&self) -> &Entity { &self.status_bar } + pub fn status_bar_visible(&self, cx: &App) -> bool { + StatusBarSettings::get_global(cx).show + } + pub fn app_state(&self) -> &Arc { &self.app_state } @@ -1757,6 +1781,10 @@ impl Workspace { &self.project } + pub fn path_style(&self, cx: &App) -> PathStyle { + self.project.read(cx).path_style(cx) + } + pub fn recently_activated_items(&self, cx: &App) -> HashMap { let mut history: HashMap = HashMap::default(); @@ -2509,8 +2537,12 @@ impl Workspace { }; for (pane, item) in dirty_items { - let (singleton, project_entry_ids) = - cx.update(|_, cx| (item.is_singleton(cx), item.project_entry_ids(cx)))?; + let (singleton, project_entry_ids) = cx.update(|_, cx| { + ( + item.buffer_kind(cx) == ItemBufferKind::Singleton, + item.project_entry_ids(cx), + ) + })?; if (singleton || !project_entry_ids.is_empty()) && !Pane::save_item(project.clone(), &pane, &*item, save_intent, cx).await? { @@ -2625,7 +2657,10 @@ impl Workspace { .strip_prefix(worktree_abs_path.as_ref()) .ok() .and_then(|relative_path| { - worktree.entry_for_path(relative_path) + let relative_path = + RelPath::new(relative_path, PathStyle::local()) + .log_err()?; + worktree.entry_for_path(&relative_path) }) } .map(|entry| entry.id); @@ -2671,7 +2706,7 @@ impl Workspace { self.open_path(project_path, None, true, window, cx) } ResolvedPath::AbsPath { path, .. } => self.open_abs_path( - path, + PathBuf::from(path), OpenOptions { visible: Some(OpenVisible::None), ..Default::default() @@ -2760,7 +2795,7 @@ impl Workspace { worktree, ProjectPath { worktree_id, - path: path.into(), + path: path, }, )) }) @@ -4084,11 +4119,11 @@ impl Workspace { pane.add_item(clone, true, true, None, window, cx) }); self.center.split(&pane, &new_pane, direction).unwrap(); + cx.notify(); Some(new_pane) } else { None }; - cx.notify(); maybe_pane_handle } @@ -4167,7 +4202,6 @@ impl Workspace { pub fn adjacent_pane(&mut self, window: &mut Window, cx: &mut Context) -> Entity { self.find_pane_in_direction(SplitDirection::Right, cx) - .or_else(|| self.find_pane_in_direction(SplitDirection::Left, cx)) .unwrap_or_else(|| { self.split_pane(self.active_pane.clone(), SplitDirection::Right, window, cx) }) @@ -4392,8 +4426,16 @@ impl Workspace { fn active_item_path_changed(&mut self, window: &mut Window, cx: &mut Context) { cx.emit(Event::ActiveItemChanged); let active_entry = self.active_project_path(cx); - self.project - .update(cx, |project, cx| project.set_active_path(active_entry, cx)); + self.project.update(cx, |project, cx| { + project.set_active_path(active_entry.clone(), cx) + }); + + if let Some(project_path) = &active_entry { + let git_store_entity = self.project.read(cx).git_store().clone(); + git_store_entity.update(cx, |git_store, cx| { + git_store.set_active_repo_for_path(project_path, cx); + }); + } self.update_window_title(window, cx); } @@ -4402,17 +4444,17 @@ impl Workspace { let project = self.project().read(cx); let mut title = String::new(); - for (i, worktree) in project.worktrees(cx).enumerate() { + for (i, worktree) in project.visible_worktrees(cx).enumerate() { let name = { let settings_location = SettingsLocation { worktree_id: worktree.read(cx).id(), - path: Path::new(""), + path: RelPath::empty(), }; let settings = WorktreeSettings::get(Some(settings_location), cx); match &settings.project_name { Some(name) => name.as_str(), - None => worktree.read(cx).root_name(), + None => worktree.read(cx).root_name_str(), } }; if i > 0 { @@ -4426,18 +4468,14 @@ impl Workspace { } if let Some(path) = self.active_item(cx).and_then(|item| item.project_path(cx)) { - let filename = path - .path - .file_name() - .map(|s| s.to_string_lossy()) - .or_else(|| { - Some(Cow::Borrowed( - project - .worktree_for_id(path.worktree_id, cx)? - .read(cx) - .root_name(), - )) - }); + let filename = path.path.file_name().or_else(|| { + Some( + project + .worktree_for_id(path.worktree_id, cx)? + .read(cx) + .root_name_str(), + ) + }); if let Some(filename) = filename { title.push_str(" — "); @@ -4787,7 +4825,7 @@ impl Workspace { .items() .find_map(|item| { let item = item.to_followable_item_handle(cx)?; - if item.is_singleton(cx) + if item.buffer_kind(cx) == ItemBufferKind::Singleton && item.project_item_model_ids(cx).as_slice() == [buffer_entity_id] { @@ -5549,6 +5587,13 @@ impl Workspace { fn actions(&self, div: Div, window: &mut Window, cx: &mut Context) -> Div { self.add_workspace_actions_listeners(div, window, cx) + .on_action(cx.listener( + |_workspace, action_sequence: &settings::ActionSequence, window, cx| { + for action in &action_sequence.0 { + window.dispatch_action(action.boxed_clone(), cx); + } + }, + )) .on_action(cx.listener(Self::close_inactive_items_and_panes)) .on_action(cx.listener(Self::close_all_items_and_panes)) .on_action(cx.listener(Self::save_all)) @@ -5970,7 +6015,7 @@ impl Workspace { self.left_dock.read_with(cx, |left_dock, cx| { let left_dock_size = left_dock .active_panel_size(window, cx) - .unwrap_or(Pixels(0.0)); + .unwrap_or(Pixels::ZERO); if left_dock_size + size > self.bounds.right() { size = self.bounds.right() - left_dock_size } @@ -6009,8 +6054,8 @@ impl Workspace { ) { let fs = self.project().read(cx).fs().clone(); let show_edit_predictions = all_language_settings(None, cx).show_edit_predictions(None, cx); - update_settings_file::(fs, cx, move |file, _| { - file.defaults.show_edit_predictions = Some(!show_edit_predictions) + update_settings_file(fs, cx, move |file, _| { + file.project.all_languages.defaults.show_edit_predictions = Some(!show_edit_predictions) }); } } @@ -6710,7 +6755,9 @@ impl Render for Workspace { })) .children(self.render_notifications(window, cx)), ) - .child(self.status_bar.clone()) + .when(self.status_bar_visible(cx), |parent| { + parent.child(self.status_bar.clone()) + }) .child(self.modal_layer.clone()) .child(self.toast_layer.clone()), ), @@ -8165,7 +8212,7 @@ mod tests { use crate::{ dock::{PanelEvent, test::TestPanel}, item::{ - ItemEvent, + ItemBufferKind, ItemEvent, test::{TestItem, TestProjectItem}, }, }; @@ -8177,6 +8224,7 @@ mod tests { use project::{Project, ProjectEntryId}; use serde_json::json; use settings::SettingsStore; + use util::rel_path::rel_path; #[gpui::test] async fn test_tab_disambiguation(cx: &mut TestAppContext) { @@ -8271,7 +8319,7 @@ mod tests { assert_eq!( project.active_entry(), project - .entry_for_path(&(worktree_id, "one.txt").into(), cx) + .entry_for_path(&(worktree_id, rel_path("one.txt")).into(), cx) .map(|e| e.id) ); }); @@ -8286,7 +8334,7 @@ mod tests { assert_eq!( project.active_entry(), project - .entry_for_path(&(worktree_id, "two.txt").into(), cx) + .entry_for_path(&(worktree_id, rel_path("two.txt")).into(), cx) .map(|e| e.id) ); }); @@ -8302,7 +8350,7 @@ mod tests { assert_eq!( project.active_entry(), project - .entry_for_path(&(worktree_id, "one.txt").into(), cx) + .entry_for_path(&(worktree_id, rel_path("one.txt")).into(), cx) .map(|e| e.id) ); }); @@ -8525,7 +8573,7 @@ mod tests { let item_2_3 = cx.new(|cx| { TestItem::new(cx) .with_dirty(true) - .with_singleton(false) + .with_buffer_kind(ItemBufferKind::Multibuffer) .with_project_items(&[ single_entry_items[2].read(cx).project_items[0].clone(), single_entry_items[3].read(cx).project_items[0].clone(), @@ -8534,7 +8582,7 @@ mod tests { let item_3_4 = cx.new(|cx| { TestItem::new(cx) .with_dirty(true) - .with_singleton(false) + .with_buffer_kind(ItemBufferKind::Multibuffer) .with_project_items(&[ single_entry_items[3].read(cx).project_items[0].clone(), single_entry_items[4].read(cx).project_items[0].clone(), @@ -8673,8 +8721,8 @@ mod tests { // Autosave on window change. item.update(cx, |item, cx| { SettingsStore::update_global(cx, |settings, cx| { - settings.update_user_settings::(cx, |settings| { - settings.autosave = Some(AutosaveSetting::OnWindowChange); + settings.update_user_settings(cx, |settings| { + settings.workspace.autosave = Some(AutosaveSetting::OnWindowChange); }) }); item.is_dirty = true; @@ -8693,13 +8741,12 @@ mod tests { item.update_in(cx, |item, window, cx| { cx.focus_self(window); SettingsStore::update_global(cx, |settings, cx| { - settings.update_user_settings::(cx, |settings| { - settings.autosave = Some(AutosaveSetting::OnFocusChange); + settings.update_user_settings(cx, |settings| { + settings.workspace.autosave = Some(AutosaveSetting::OnFocusChange); }) }); item.is_dirty = true; }); - // Blurring the item saves the file. item.update_in(cx, |_, window, _| window.blur()); cx.executor().run_until_parked(); @@ -8716,8 +8763,9 @@ mod tests { // Autosave after delay. item.update(cx, |item, cx| { SettingsStore::update_global(cx, |settings, cx| { - settings.update_user_settings::(cx, |settings| { - settings.autosave = Some(AutosaveSetting::AfterDelay { milliseconds: 500 }); + settings.update_user_settings(cx, |settings| { + settings.workspace.autosave = + Some(AutosaveSetting::AfterDelay { milliseconds: 500 }); }) }); item.is_dirty = true; @@ -8732,11 +8780,41 @@ mod tests { cx.executor().advance_clock(Duration::from_millis(250)); item.read_with(cx, |item, _| assert_eq!(item.save_count, 4)); + // Autosave after delay, should save earlier than delay if tab is closed + item.update(cx, |item, cx| { + item.is_dirty = true; + cx.emit(ItemEvent::Edit); + }); + cx.executor().advance_clock(Duration::from_millis(250)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 4)); + + // // Ensure auto save with delay saves the item on close, even if the timer hasn't yet run out. + pane.update_in(cx, |pane, window, cx| { + pane.close_items(window, cx, SaveIntent::Close, move |id| id == item_id) + }) + .await + .unwrap(); + assert!(!cx.has_pending_prompt()); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 5)); + + // Add the item again, ensuring autosave is prevented if the underlying file has been deleted. + workspace.update_in(cx, |workspace, window, cx| { + workspace.add_item_to_active_pane(Box::new(item.clone()), None, true, window, cx); + }); + item.update_in(cx, |item, _window, cx| { + item.is_dirty = true; + for project_item in &mut item.project_items { + project_item.update(cx, |project_item, _| project_item.is_dirty = true); + } + }); + cx.run_until_parked(); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 5)); + // Autosave on focus change, ensuring closing the tab counts as such. item.update(cx, |item, cx| { SettingsStore::update_global(cx, |settings, cx| { - settings.update_user_settings::(cx, |settings| { - settings.autosave = Some(AutosaveSetting::OnFocusChange); + settings.update_user_settings(cx, |settings| { + settings.workspace.autosave = Some(AutosaveSetting::OnFocusChange); }) }); item.is_dirty = true; @@ -8751,7 +8829,7 @@ mod tests { .await .unwrap(); assert!(!cx.has_pending_prompt()); - item.read_with(cx, |item, _| assert_eq!(item.save_count, 5)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 6)); // Add the item again, ensuring autosave is prevented if the underlying file has been deleted. workspace.update_in(cx, |workspace, window, cx| { @@ -8765,7 +8843,7 @@ mod tests { window.blur(); }); cx.run_until_parked(); - item.read_with(cx, |item, _| assert_eq!(item.save_count, 5)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 6)); // Ensure autosave is prevented for deleted files also when closing the buffer. let _close_items = pane.update_in(cx, |pane, window, cx| { @@ -8773,7 +8851,7 @@ mod tests { }); cx.run_until_parked(); assert!(cx.has_pending_prompt()); - item.read_with(cx, |item, _| assert_eq!(item.save_count, 5)); + item.read_with(cx, |item, _| assert_eq!(item.save_count, 6)); } #[gpui::test] @@ -9525,7 +9603,7 @@ mod tests { let dirty_multi_buffer_with_both = cx.new(|cx| { TestItem::new(cx) .with_dirty(true) - .with_singleton(false) + .with_buffer_kind(ItemBufferKind::Multibuffer) .with_label("Fake Project Search") .with_project_items(&[ dirty_regular_buffer.read(cx).project_items[0].clone(), @@ -9676,7 +9754,7 @@ mod tests { let dirty_multi_buffer_with_both = cx.new(|cx| { TestItem::new(cx) .with_dirty(true) - .with_singleton(false) + .with_buffer_kind(ItemBufferKind::Multibuffer) .with_label("Fake Project Search") .with_project_items(&[ dirty_regular_buffer.read(cx).project_items[0].clone(), @@ -9739,8 +9817,8 @@ mod tests { // Enable the close_on_disk_deletion setting cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |settings| { - settings.close_on_file_delete = Some(true); + store.update_user_settings(cx, |settings| { + settings.workspace.close_on_file_delete = Some(true); }); }); @@ -9807,8 +9885,8 @@ mod tests { // Ensure close_on_disk_deletion is disabled (default) cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |settings| { - settings.close_on_file_delete = Some(false); + store.update_user_settings(cx, |settings| { + settings.workspace.close_on_file_delete = Some(false); }); }); @@ -9884,8 +9962,8 @@ mod tests { // Enable the close_on_file_delete setting cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |settings| { - settings.close_on_file_delete = Some(true); + store.update_user_settings(cx, |settings| { + settings.workspace.close_on_file_delete = Some(true); }); }); @@ -9957,8 +10035,8 @@ mod tests { // Enable the close_on_file_delete setting cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |settings| { - settings.close_on_file_delete = Some(true); + store.update_user_settings(cx, |settings| { + settings.workspace.close_on_file_delete = Some(true); }); }); @@ -10090,7 +10168,7 @@ mod tests { let dirty_multi_buffer = cx.new(|cx| { TestItem::new(cx) .with_dirty(true) - .with_singleton(false) + .with_buffer_kind(ItemBufferKind::Multibuffer) .with_label("Fake Project Search") .with_project_items(&[ dirty_regular_buffer.read(cx).project_items[0].clone(), @@ -10638,7 +10716,7 @@ mod tests { let handle = workspace .update_in(cx, |workspace, window, cx| { - let project_path = (worktree_id, "one.png"); + let project_path = (worktree_id, rel_path("one.png")); workspace.open_path(project_path, None, true, window, cx) }) .await @@ -10652,7 +10730,7 @@ mod tests { let handle = workspace .update_in(cx, |workspace, window, cx| { - let project_path = (worktree_id, "two.ipynb"); + let project_path = (worktree_id, rel_path("two.ipynb")); workspace.open_path(project_path, None, true, window, cx) }) .await @@ -10665,7 +10743,7 @@ mod tests { let handle = workspace .update_in(cx, |workspace, window, cx| { - let project_path = (worktree_id, "three.txt"); + let project_path = (worktree_id, rel_path("three.txt")); workspace.open_path(project_path, None, true, window, cx) }) .await; @@ -10700,7 +10778,7 @@ mod tests { let handle = workspace .update_in(cx, |workspace, window, cx| { - let project_path = (worktree_id, "one.png"); + let project_path = (worktree_id, rel_path("one.png")); workspace.open_path(project_path, None, true, window, cx) }) .await @@ -10714,7 +10792,7 @@ mod tests { let handle = workspace .update_in(cx, |workspace, window, cx| { - let project_path = (worktree_id, "three.txt"); + let project_path = (worktree_id, rel_path("three.txt")); workspace.open_path(project_path, None, true, window, cx) }) .await; @@ -10722,13 +10800,53 @@ mod tests { } } + #[gpui::test] + async fn test_status_bar_visibility(cx: &mut TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.executor()); + let project = Project::test(fs, [], cx).await; + let (workspace, _cx) = + cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx)); + + // Test with status bar shown (default) + workspace.read_with(cx, |workspace, cx| { + let visible = workspace.status_bar_visible(cx); + assert!(visible, "Status bar should be visible by default"); + }); + + // Test with status bar hidden + cx.update_global(|store: &mut SettingsStore, cx| { + store.update_user_settings(cx, |settings| { + settings.status_bar.get_or_insert_default().show = Some(false); + }); + }); + + workspace.read_with(cx, |workspace, cx| { + let visible = workspace.status_bar_visible(cx); + assert!(!visible, "Status bar should be hidden when show is false"); + }); + + // Test with status bar shown explicitly + cx.update_global(|store: &mut SettingsStore, cx| { + store.update_user_settings(cx, |settings| { + settings.status_bar.get_or_insert_default().show = Some(true); + }); + }); + + workspace.read_with(cx, |workspace, cx| { + let visible = workspace.status_bar_visible(cx); + assert!(visible, "Status bar should be visible when show is true"); + }); + } + fn pane_items_paths(pane: &Entity, cx: &App) -> Vec { pane.read(cx) .items() .flat_map(|item| { item.project_paths(cx) .into_iter() - .map(|path| path.path.to_string_lossy().to_string()) + .map(|path| path.path.display(PathStyle::local()).into_owned()) }) .collect() } diff --git a/crates/workspace/src/workspace_settings.rs b/crates/workspace/src/workspace_settings.rs index 8868f3190575ac4b861e0619732890f477d83b69..541194b0044dd897723c89763abc7d3a2abc20f3 100644 --- a/crates/workspace/src/workspace_settings.rs +++ b/crates/workspace/src/workspace_settings.rs @@ -1,65 +1,47 @@ use std::num::NonZeroUsize; use crate::DockPosition; -use anyhow::Result; use collections::HashMap; -use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use serde::Deserialize; +pub use settings::AutosaveSetting; +use settings::Settings; +pub use settings::{ + BottomDockLayout, PaneSplitDirectionHorizontal, PaneSplitDirectionVertical, + RestoreOnStartupBehavior, +}; -#[derive(Deserialize)] pub struct WorkspaceSettings { pub active_pane_modifiers: ActivePanelModifiers, - pub bottom_dock_layout: BottomDockLayout, - pub pane_split_direction_horizontal: PaneSplitDirectionHorizontal, - pub pane_split_direction_vertical: PaneSplitDirectionVertical, - pub centered_layout: CenteredLayoutSettings, + pub bottom_dock_layout: settings::BottomDockLayout, + pub pane_split_direction_horizontal: settings::PaneSplitDirectionHorizontal, + pub pane_split_direction_vertical: settings::PaneSplitDirectionVertical, + pub centered_layout: settings::CenteredLayoutSettings, pub confirm_quit: bool, pub show_call_status_icon: bool, pub autosave: AutosaveSetting, - pub restore_on_startup: RestoreOnStartupBehavior, + pub restore_on_startup: settings::RestoreOnStartupBehavior, pub restore_on_file_reopen: bool, pub drop_target_size: f32, pub use_system_path_prompts: bool, pub use_system_prompts: bool, pub command_aliases: HashMap, pub max_tabs: Option, - pub when_closing_with_no_tabs: CloseWindowWhenNoItems, - pub on_last_window_closed: OnLastWindowClosed, + pub when_closing_with_no_tabs: settings::CloseWindowWhenNoItems, + pub on_last_window_closed: settings::OnLastWindowClosed, pub resize_all_panels_in_dock: Vec, pub close_on_file_delete: bool, pub use_system_window_tabs: bool, pub zoomed_padding: bool, } -#[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum OnLastWindowClosed { - /// Match platform conventions by default, so don't quit on macOS, and quit on other platforms - #[default] - PlatformDefault, - /// Quit the application the last window is closed - QuitApp, -} - -impl OnLastWindowClosed { - pub fn is_quit_app(&self) -> bool { - match self { - OnLastWindowClosed::PlatformDefault => false, - OnLastWindowClosed::QuitApp => true, - } - } -} - -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] +#[derive(Copy, Clone, PartialEq, Debug, Default)] pub struct ActivePanelModifiers { /// Size of the border surrounding the active pane. /// When set to 0, the active pane doesn't have any border. /// The border is drawn inset. /// /// Default: `0.0` + // TODO: make this not an option, it is never None pub border_size: Option, /// Opacity of inactive panels. /// When set to 1.0, the inactive panes have the same opacity as the active one. @@ -67,156 +49,10 @@ pub struct ActivePanelModifiers { /// Values are clamped to the [0.0, 1.0] range. /// /// Default: `1.0` + // TODO: make this not an option, it is never None pub inactive_opacity: Option, } -#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum BottomDockLayout { - /// Contained between the left and right docks - #[default] - Contained, - /// Takes up the full width of the window - Full, - /// Extends under the left dock while snapping to the right dock - LeftAligned, - /// Extends under the right dock while snapping to the left dock - RightAligned, -} - -#[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum CloseWindowWhenNoItems { - /// Match platform conventions by default, so "on" on macOS and "off" everywhere else - #[default] - PlatformDefault, - /// Close the window when there are no tabs - CloseWindow, - /// Leave the window open when there are no tabs - KeepWindowOpen, -} - -impl CloseWindowWhenNoItems { - pub fn should_close(&self) -> bool { - match self { - CloseWindowWhenNoItems::PlatformDefault => cfg!(target_os = "macos"), - CloseWindowWhenNoItems::CloseWindow => true, - CloseWindowWhenNoItems::KeepWindowOpen => false, - } - } -} - -#[derive(Copy, Clone, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum RestoreOnStartupBehavior { - /// Always start with an empty editor - None, - /// Restore the workspace that was closed last. - LastWorkspace, - /// Restore all workspaces that were open when quitting Zed. - #[default] - LastSession, -} - -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] -pub struct WorkspaceSettingsContent { - /// Active pane styling settings. - pub active_pane_modifiers: Option, - /// Layout mode for the bottom dock - /// - /// Default: contained - pub bottom_dock_layout: Option, - /// Direction to split horizontally. - /// - /// Default: "up" - pub pane_split_direction_horizontal: Option, - /// Direction to split vertically. - /// - /// Default: "left" - pub pane_split_direction_vertical: Option, - /// Centered layout related settings. - pub centered_layout: Option, - /// Whether or not to prompt the user to confirm before closing the application. - /// - /// Default: false - pub confirm_quit: Option, - /// Whether or not to show the call status icon in the status bar. - /// - /// Default: true - pub show_call_status_icon: Option, - /// When to automatically save edited buffers. - /// - /// Default: off - pub autosave: Option, - /// Controls previous session restoration in freshly launched Zed instance. - /// Values: none, last_workspace, last_session - /// Default: last_session - pub restore_on_startup: Option, - /// Whether to attempt to restore previous file's state when opening it again. - /// The state is stored per pane. - /// When disabled, defaults are applied instead of the state restoration. - /// - /// E.g. for editors, selections, folds and scroll positions are restored, if the same file is closed and, later, opened again in the same pane. - /// When disabled, a single selection in the very beginning of the file, zero scroll position and no folds state is used as a default. - /// - /// Default: true - pub restore_on_file_reopen: Option, - /// The size of the workspace split drop targets on the outer edges. - /// Given as a fraction that will be multiplied by the smaller dimension of the workspace. - /// - /// Default: `0.2` (20% of the smaller dimension of the workspace) - pub drop_target_size: Option, - /// Whether to close the window when using 'close active item' on a workspace with no tabs - /// - /// Default: auto ("on" on macOS, "off" otherwise) - pub when_closing_with_no_tabs: Option, - /// Whether to use the system provided dialogs for Open and Save As. - /// When set to false, Zed will use the built-in keyboard-first pickers. - /// - /// Default: true - pub use_system_path_prompts: Option, - /// Whether to use the system provided prompts. - /// When set to false, Zed will use the built-in prompts. - /// Note that this setting has no effect on Linux, where Zed will always - /// use the built-in prompts. - /// - /// Default: true - pub use_system_prompts: Option, - /// Aliases for the command palette. When you type a key in this map, - /// it will be assumed to equal the value. - /// - /// Default: true - pub command_aliases: Option>, - /// Maximum open tabs in a pane. Will not close an unsaved - /// tab. Set to `None` for unlimited tabs. - /// - /// Default: none - pub max_tabs: Option, - /// What to do when the last window is closed - /// - /// Default: auto (nothing on macOS, "app quit" otherwise) - pub on_last_window_closed: Option, - /// Whether to resize all the panels in a dock when resizing the dock. - /// - /// Default: ["left"] - pub resize_all_panels_in_dock: Option>, - /// Whether to automatically close files that have been deleted on disk. - /// - /// Default: false - pub close_on_file_delete: Option, - /// Whether to allow windows to tab together based on the user’s tabbing preference (macOS only). - /// - /// Default: false - pub use_system_window_tabs: Option, - /// Whether to show padding for zoomed panels. - /// When enabled, zoomed bottom panels will have some top padding, - /// while zoomed left/right panels will have padding to the right/left (respectively). - /// - /// Default: true - pub zoomed_padding: Option, -} - #[derive(Deserialize)] pub struct TabBarSettings { pub show: bool, @@ -224,73 +60,59 @@ pub struct TabBarSettings { pub show_tab_bar_buttons: bool, } -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(key = "tab_bar")] -pub struct TabBarSettingsContent { - /// Whether or not to show the tab bar in the editor. - /// - /// Default: true - pub show: Option, - /// Whether or not to show the navigation history buttons in the tab bar. - /// - /// Default: true - pub show_nav_history_buttons: Option, - /// Whether or not to show the tab bar buttons. - /// - /// Default: true - pub show_tab_bar_buttons: Option, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum AutosaveSetting { - /// Disable autosave. - Off, - /// Save after inactivity period of `milliseconds`. - AfterDelay { milliseconds: u64 }, - /// Autosave when focus changes. - OnFocusChange, - /// Autosave when the active window changes. - OnWindowChange, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum PaneSplitDirectionHorizontal { - Up, - Down, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum PaneSplitDirectionVertical { - Left, - Right, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, SettingsUi)] -#[serde(rename_all = "snake_case")] -pub struct CenteredLayoutSettings { - /// The relative width of the left padding of the central pane from the - /// workspace when the centered layout is used. - /// - /// Default: 0.2 - pub left_padding: Option, - // The relative width of the right padding of the central pane from the - // workspace when the centered layout is used. - /// - /// Default: 0.2 - pub right_padding: Option, -} - impl Settings for WorkspaceSettings { - type FileContent = WorkspaceSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let workspace = &content.workspace; + Self { + active_pane_modifiers: ActivePanelModifiers { + border_size: Some( + workspace + .active_pane_modifiers + .unwrap() + .border_size + .unwrap(), + ), + inactive_opacity: Some( + workspace + .active_pane_modifiers + .unwrap() + .inactive_opacity + .unwrap(), + ), + }, + bottom_dock_layout: workspace.bottom_dock_layout.unwrap(), + pane_split_direction_horizontal: workspace.pane_split_direction_horizontal.unwrap(), + pane_split_direction_vertical: workspace.pane_split_direction_vertical.unwrap(), + centered_layout: workspace.centered_layout.unwrap(), + confirm_quit: workspace.confirm_quit.unwrap(), + show_call_status_icon: workspace.show_call_status_icon.unwrap(), + autosave: workspace.autosave.unwrap(), + restore_on_startup: workspace.restore_on_startup.unwrap(), + restore_on_file_reopen: workspace.restore_on_file_reopen.unwrap(), + drop_target_size: workspace.drop_target_size.unwrap(), + use_system_path_prompts: workspace.use_system_path_prompts.unwrap(), + use_system_prompts: workspace.use_system_prompts.unwrap(), + command_aliases: workspace.command_aliases.clone(), + max_tabs: workspace.max_tabs, + when_closing_with_no_tabs: workspace.when_closing_with_no_tabs.unwrap(), + on_last_window_closed: workspace.on_last_window_closed.unwrap(), + resize_all_panels_in_dock: workspace + .resize_all_panels_in_dock + .clone() + .unwrap() + .into_iter() + .map(Into::into) + .collect(), + close_on_file_delete: workspace.close_on_file_delete.unwrap(), + use_system_window_tabs: workspace.use_system_window_tabs.unwrap(), + zoomed_padding: workspace.zoomed_padding.unwrap(), + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { + fn import_from_vscode( + vscode: &settings::VsCodeSettings, + current: &mut settings::SettingsContent, + ) { if vscode .read_bool("accessibility.dimUnfocused.enabled") .unwrap_or_default() @@ -298,19 +120,16 @@ impl Settings for WorkspaceSettings { .read_value("accessibility.dimUnfocused.opacity") .and_then(|v| v.as_f64()) { - if let Some(settings) = current.active_pane_modifiers.as_mut() { - settings.inactive_opacity = Some(opacity as f32) - } else { - current.active_pane_modifiers = Some(ActivePanelModifiers { - inactive_opacity: Some(opacity as f32), - ..Default::default() - }) - } + current + .workspace + .active_pane_modifiers + .get_or_insert_default() + .inactive_opacity = Some(opacity as f32); } vscode.enum_setting( "window.confirmBeforeClose", - &mut current.confirm_quit, + &mut current.workspace.confirm_quit, |s| match s { "always" | "keyboardOnly" => Some(true), "never" => Some(false), @@ -320,22 +139,22 @@ impl Settings for WorkspaceSettings { vscode.bool_setting( "workbench.editor.restoreViewState", - &mut current.restore_on_file_reopen, + &mut current.workspace.restore_on_file_reopen, ); if let Some(b) = vscode.read_bool("window.closeWhenEmpty") { - current.when_closing_with_no_tabs = Some(if b { - CloseWindowWhenNoItems::CloseWindow + current.workspace.when_closing_with_no_tabs = Some(if b { + settings::CloseWindowWhenNoItems::CloseWindow } else { - CloseWindowWhenNoItems::KeepWindowOpen - }) + settings::CloseWindowWhenNoItems::KeepWindowOpen + }); } if let Some(b) = vscode.read_bool("files.simpleDialog.enable") { - current.use_system_path_prompts = Some(!b); + current.workspace.use_system_path_prompts = Some(!b); } - vscode.enum_setting("files.autoSave", &mut current.autosave, |s| match s { + if let Some(v) = vscode.read_enum("files.autoSave", |s| match s { "off" => Some(AutosaveSetting::Off), "afterDelay" => Some(AutosaveSetting::AfterDelay { milliseconds: vscode @@ -346,7 +165,9 @@ impl Settings for WorkspaceSettings { "onFocusChange" => Some(AutosaveSetting::OnFocusChange), "onWindowChange" => Some(AutosaveSetting::OnWindowChange), _ => None, - }); + }) { + current.workspace.autosave = Some(v); + } // workbench.editor.limit contains "enabled", "value", and "perEditorGroup" // our semantics match if those are set to true, some N, and true respectively. @@ -359,10 +180,12 @@ impl Settings for WorkspaceSettings { .read_bool("workbench.editor.limit.enabled") .unwrap_or_default() { - current.max_tabs = Some(n) + current.workspace.max_tabs = Some(n) } - vscode.bool_setting("window.nativeTabs", &mut current.use_system_window_tabs); + if let Some(b) = vscode.read_bool("window.nativeTabs") { + current.workspace.use_system_window_tabs = Some(b); + } // some combination of "window.restoreWindows" and "workbench.startupEditor" might // map to our "restore_on_startup" @@ -373,24 +196,55 @@ impl Settings for WorkspaceSettings { } impl Settings for TabBarSettings { - type FileContent = TabBarSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + let tab_bar = content.tab_bar.clone().unwrap(); + TabBarSettings { + show: tab_bar.show.unwrap(), + show_nav_history_buttons: tab_bar.show_nav_history_buttons.unwrap(), + show_tab_bar_buttons: tab_bar.show_tab_bar_buttons.unwrap(), + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { - vscode.enum_setting( - "workbench.editor.showTabs", - &mut current.show, - |s| match s { - "multiple" => Some(true), - "single" | "none" => Some(false), - _ => None, - }, - ); + fn import_from_vscode( + vscode: &settings::VsCodeSettings, + current: &mut settings::SettingsContent, + ) { + if let Some(b) = vscode.read_enum("workbench.editor.showTabs", |s| match s { + "multiple" => Some(true), + "single" | "none" => Some(false), + _ => None, + }) { + current.tab_bar.get_or_insert_default().show = Some(b); + } if Some("hidden") == vscode.read_string("workbench.editor.editorActionsLocation") { - current.show_tab_bar_buttons = Some(false) + current.tab_bar.get_or_insert_default().show_tab_bar_buttons = Some(false) + } + } +} + +#[derive(Deserialize)] +pub struct StatusBarSettings { + pub show: bool, + pub active_language_button: bool, + pub cursor_position_button: bool, +} + +impl Settings for StatusBarSettings { + fn from_settings(content: &settings::SettingsContent) -> Self { + let status_bar = content.status_bar.clone().unwrap(); + StatusBarSettings { + show: status_bar.show.unwrap(), + active_language_button: status_bar.active_language_button.unwrap(), + cursor_position_button: status_bar.cursor_position_button.unwrap(), + } + } + + fn import_from_vscode( + vscode: &settings::VsCodeSettings, + current: &mut settings::SettingsContent, + ) { + if let Some(show) = vscode.read_bool("workbench.statusBar.visible") { + current.status_bar.get_or_insert_default().show = Some(show); } } } diff --git a/crates/worktree/Cargo.toml b/crates/worktree/Cargo.toml index 507b95c00d52435411e307f8d68dafd718177598..fdeca37b7ac73759fe9851f722985349e0a183b7 100644 --- a/crates/worktree/Cargo.toml +++ b/crates/worktree/Cargo.toml @@ -38,7 +38,6 @@ parking_lot.workspace = true paths.workspace = true postage.workspace = true rpc = { workspace = true, features = ["gpui"] } -schemars.workspace = true serde.workspace = true serde_json.workspace = true settings.workspace = true diff --git a/crates/worktree/src/worktree.rs b/crates/worktree/src/worktree.rs index a0a48782ede132c9c1e31439c156fbbe4dcca1d8..0327c345a1ee90c51751fdc71fda668511b9fd16 100644 --- a/crates/worktree/src/worktree.rs +++ b/crates/worktree/src/worktree.rs @@ -19,8 +19,7 @@ use futures::{ }; use fuzzy::CharBag; use git::{ - COMMIT_MESSAGE, DOT_GIT, FSMONITOR_DAEMON, GITIGNORE, INDEX_LOCK, LFS_DIR, - repository::RepoPath, status::GitSummary, + COMMIT_MESSAGE, DOT_GIT, FSMONITOR_DAEMON, GITIGNORE, INDEX_LOCK, LFS_DIR, status::GitSummary, }; use gpui::{ App, AppContext as _, AsyncApp, BackgroundExecutor, Context, Entity, EventEmitter, Task, @@ -29,7 +28,7 @@ use ignore::IgnoreStack; use language::DiskState; use parking_lot::Mutex; -use paths::{local_settings_folder_relative_path, local_vscode_folder_relative_path}; +use paths::{local_settings_folder_name, local_vscode_folder_name}; use postage::{ barrier, prelude::{Sink as _, Stream as _}, @@ -37,7 +36,7 @@ use postage::{ }; use rpc::{ AnyProtoClient, - proto::{self, FromProto, ToProto, split_worktree_update}, + proto::{self, split_worktree_update}, }; pub use settings::WorktreeId; use settings::{Settings, SettingsLocation, SettingsStore}; @@ -54,7 +53,7 @@ use std::{ future::Future, mem::{self}, ops::{Deref, DerefMut}, - path::{Component, Path, PathBuf}, + path::{Path, PathBuf}, pin::Pin, sync::{ Arc, @@ -66,7 +65,8 @@ use sum_tree::{Bias, Dimensions, Edit, KeyedItem, SeekTarget, SumTree, Summary, use text::{LineEnding, Rope}; use util::{ ResultExt, debug_panic, - paths::{PathMatcher, SanitizedPath, home_dir}, + paths::{PathMatcher, PathStyle, SanitizedPath, home_dir}, + rel_path::RelPath, }; pub use worktree_settings::WorktreeSettings; @@ -132,12 +132,12 @@ pub struct LocalWorktree { } pub struct PathPrefixScanRequest { - path: Arc, + path: Arc, done: SmallVec<[barrier::Sender; 1]>, } struct ScanRequest { - relative_paths: Vec>, + relative_paths: Vec>, done: SmallVec<[barrier::Sender; 1]>, } @@ -158,12 +158,14 @@ pub struct RemoteWorktree { #[derive(Clone)] pub struct Snapshot { id: WorktreeId, + /// The absolute path of the worktree root. abs_path: Arc, - root_name: String, + path_style: PathStyle, + root_name: Arc, root_char_bag: CharBag, entries_by_path: SumTree, entries_by_id: SumTree, - always_included_entries: Vec>, + always_included_entries: Vec>, /// A number that increases every time the worktree begins scanning /// a set of paths from the filesystem. This scanning could be caused @@ -186,7 +188,7 @@ pub struct Snapshot { #[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] pub enum WorkDirectory { InProject { - relative_path: Arc, + relative_path: Arc, }, AboveProject { absolute_path: Arc, @@ -195,34 +197,10 @@ pub enum WorkDirectory { } impl WorkDirectory { - #[cfg(test)] - fn in_project(path: &str) -> Self { - let path = Path::new(path); - Self::InProject { - relative_path: path.into(), - } - } - - //#[cfg(test)] - //fn canonicalize(&self) -> Self { - // match self { - // WorkDirectory::InProject { relative_path } => WorkDirectory::InProject { - // relative_path: relative_path.clone(), - // }, - // WorkDirectory::AboveProject { - // absolute_path, - // location_in_repo, - // } => WorkDirectory::AboveProject { - // absolute_path: absolute_path.canonicalize().unwrap().into(), - // location_in_repo: location_in_repo.clone(), - // }, - // } - //} - fn path_key(&self) -> PathKey { match self { WorkDirectory::InProject { relative_path } => PathKey(relative_path.clone()), - WorkDirectory::AboveProject { .. } => PathKey(Path::new("").into()), + WorkDirectory::AboveProject { .. } => PathKey(RelPath::empty().into()), } } @@ -232,106 +210,18 @@ impl WorkDirectory { /// is a repository in a directory between these two paths /// external .git folder in a parent folder of the project root. #[track_caller] - pub fn directory_contains(&self, path: impl AsRef) -> bool { - let path = path.as_ref(); - debug_assert!(path.is_relative()); + pub fn directory_contains(&self, path: &RelPath) -> bool { match self { WorkDirectory::InProject { relative_path } => path.starts_with(relative_path), WorkDirectory::AboveProject { .. } => true, } } - - /// relativize returns the given project path relative to the root folder of the - /// repository. - /// If the root of the repository (and its .git folder) are located in a parent folder - /// of the project root folder, then the returned RepoPath is relative to the root - /// of the repository and not a valid path inside the project. - pub fn relativize(&self, path: &Path) -> Result { - // path is assumed to be relative to worktree root. - debug_assert!(path.is_relative()); - match self { - WorkDirectory::InProject { relative_path } => Ok(path - .strip_prefix(relative_path) - .map_err(|_| anyhow!("could not relativize {path:?} against {relative_path:?}"))? - .into()), - WorkDirectory::AboveProject { - location_in_repo, .. - } => { - // Avoid joining a `/` to location_in_repo in the case of a single-file worktree. - if path == Path::new("") { - Ok(RepoPath(location_in_repo.clone())) - } else { - Ok(location_in_repo.join(path).into()) - } - } - } - } - - /// This is the opposite operation to `relativize` above - pub fn try_unrelativize(&self, path: &RepoPath) -> Option> { - match self { - WorkDirectory::InProject { relative_path } => Some(relative_path.join(path).into()), - WorkDirectory::AboveProject { - location_in_repo, .. - } => { - // If we fail to strip the prefix, that means this status entry is - // external to this worktree, and we definitely won't have an entry_id - path.strip_prefix(location_in_repo).ok().map(Into::into) - } - } - } - - pub fn unrelativize(&self, path: &RepoPath) -> Arc { - match self { - WorkDirectory::InProject { relative_path } => relative_path.join(path).into(), - WorkDirectory::AboveProject { - location_in_repo, .. - } => { - if &path.0 == location_in_repo { - // Single-file worktree - return location_in_repo - .file_name() - .map(Path::new) - .unwrap_or(Path::new("")) - .into(); - } - let mut location_in_repo = &**location_in_repo; - let mut parents = PathBuf::new(); - loop { - if let Ok(segment) = path.strip_prefix(location_in_repo) { - return parents.join(segment).into(); - } - location_in_repo = location_in_repo.parent().unwrap_or(Path::new("")); - parents.push(Component::ParentDir); - } - } - } - } - - pub fn display_name(&self) -> String { - match self { - WorkDirectory::InProject { relative_path } => relative_path.display().to_string(), - WorkDirectory::AboveProject { - absolute_path, - location_in_repo, - } => { - let num_of_dots = location_in_repo.components().count(); - - "../".repeat(num_of_dots) - + &absolute_path - .file_name() - .map(|s| s.to_string_lossy()) - .unwrap_or_default() - + "/" - } - } - } } impl Default for WorkDirectory { fn default() -> Self { Self::InProject { - relative_path: Arc::from(Path::new("")), + relative_path: Arc::from(RelPath::empty()), } } } @@ -340,13 +230,13 @@ impl Default for WorkDirectory { pub struct LocalSnapshot { snapshot: Snapshot, global_gitignore: Option>, - /// All of the gitignore files in the worktree, indexed by their relative path. + /// All of the gitignore files in the worktree, indexed by their absolute path. /// The boolean indicates whether the gitignore needs to be updated. ignores_by_parent_abs_path: HashMap, (Arc, bool)>, /// All of the git repositories in the worktree, indexed by the project entry /// id of their parent directory. git_repositories: TreeMap, - /// The file handle of the root dir + /// The file handle of the worktree root. `None` if the worktree is a directory. /// (so we can find it after it's been moved) root_file_handle: Option>, } @@ -354,14 +244,14 @@ pub struct LocalSnapshot { struct BackgroundScannerState { snapshot: LocalSnapshot, scanned_dirs: HashSet, - path_prefixes_to_scan: HashSet>, - paths_to_scan: HashSet>, + path_prefixes_to_scan: HashSet>, + paths_to_scan: HashSet>, /// The ids of all of the entries that were removed from the snapshot /// as part of the current update. These entry ids may be re-used /// if the same inode is discovered at a new path, or if the given /// path is re-created after being deleted. removed_entries: HashMap, - changed_paths: Vec>, + changed_paths: Vec>, prev_snapshot: Snapshot, } @@ -391,12 +281,12 @@ struct LocalRepositoryEntry { } impl sum_tree::Item for LocalRepositoryEntry { - type Summary = PathSummary<&'static ()>; + type Summary = PathSummary; - fn summary(&self, _: &::Context) -> Self::Summary { + fn summary(&self, _: ::Context<'_>) -> Self::Summary { PathSummary { max_path: self.work_directory.path_key().0, - item_summary: &(), + item_summary: sum_tree::NoSummary, } } } @@ -441,7 +331,7 @@ enum ScanState { scanning: bool, }, RootUpdated { - new_path: Option>, + new_path: Arc, }, } @@ -458,8 +348,6 @@ pub enum Event { DeletedEntry(ProjectEntryId), } -const EMPTY_PATH: &str = ""; - impl EventEmitter for Worktree {} impl Worktree { @@ -483,7 +371,19 @@ impl Worktree { true }); - let root_file_handle = fs.open_handle(&abs_path).await.log_err(); + let root_file_handle = if metadata.as_ref().is_some() { + fs.open_handle(&abs_path) + .await + .with_context(|| { + format!( + "failed to open local worktree root at {}", + abs_path.display() + ) + }) + .log_err() + } else { + None + }; cx.new(move |cx: &mut Context| { let mut snapshot = LocalSnapshot { @@ -494,8 +394,12 @@ impl Worktree { cx.entity_id().as_u64(), abs_path .file_name() - .map_or(String::new(), |f| f.to_string_lossy().to_string()), + .and_then(|f| f.to_str()) + .map_or(RelPath::empty().into(), |f| { + RelPath::unix(f).unwrap().into() + }), abs_path.clone(), + PathStyle::local(), ), root_file_handle, }; @@ -503,7 +407,7 @@ impl Worktree { let worktree_id = snapshot.id(); let settings_location = Some(SettingsLocation { worktree_id, - path: Path::new(EMPTY_PATH), + path: RelPath::empty(), }); let settings = WorktreeSettings::get(settings_location, cx).clone(); @@ -521,16 +425,24 @@ impl Worktree { let share_private_files = false; if let Some(metadata) = metadata { let mut entry = Entry::new( - Arc::from(Path::new("")), + RelPath::empty().into(), &metadata, &next_entry_id, snapshot.root_char_bag, None, ); if !metadata.is_dir { - entry.is_private = !share_private_files - && settings.is_path_private(abs_path.file_name().unwrap().as_ref()); + if let Some(file_name) = abs_path.file_name() + && let Some(file_name) = file_name.to_str() + && let Ok(path) = RelPath::unix(file_name) + { + entry.is_private = !share_private_files && settings.is_path_private(path); + } } + entry.is_hidden = abs_path + .file_name() + .and_then(|name| name.to_str()) + .map_or(false, |name| is_path_hidden(name)); snapshot.insert_entry(entry, fs.as_ref()); } @@ -560,13 +472,16 @@ impl Worktree { replica_id: ReplicaId, worktree: proto::WorktreeMetadata, client: AnyProtoClient, + path_style: PathStyle, cx: &mut App, ) -> Entity { cx.new(|cx: &mut Context| { let snapshot = Snapshot::new( worktree.id, - worktree.root_name, - Arc::::from_proto(worktree.abs_path), + RelPath::from_proto(&worktree.root_name) + .unwrap_or_else(|_| RelPath::empty().into()), + Path::new(&worktree.abs_path).into(), + path_style, ); let background_snapshot = Arc::new(Mutex::new(( @@ -580,7 +495,7 @@ impl Worktree { let worktree_id = snapshot.id(); let settings_location = Some(SettingsLocation { worktree_id, - path: Path::new(EMPTY_PATH), + path: RelPath::empty(), }); let settings = WorktreeSettings::get(settings_location, cx).clone(); @@ -605,8 +520,7 @@ impl Worktree { { let mut lock = background_snapshot.lock(); lock.0 - .apply_remote_update(update.clone(), &settings.file_scan_inclusions) - .log_err(); + .apply_remote_update(update.clone(), &settings.file_scan_inclusions); lock.1.push(update); } snapshot_updated_tx.send(()).await.ok(); @@ -698,7 +612,7 @@ impl Worktree { pub fn settings_location(&self, _: &Context) -> SettingsLocation<'static> { SettingsLocation { worktree_id: self.id(), - path: Path::new(EMPTY_PATH), + path: RelPath::empty(), } } @@ -719,9 +633,9 @@ impl Worktree { pub fn metadata_proto(&self) -> proto::WorktreeMetadata { proto::WorktreeMetadata { id: self.id().to_proto(), - root_name: self.root_name().to_string(), + root_name: self.root_name().to_proto(), visible: self.is_visible(), - abs_path: self.abs_path().to_proto(), + abs_path: self.abs_path().to_string_lossy().into_owned(), } } @@ -788,7 +702,7 @@ impl Worktree { } } - pub fn load_file(&self, path: &Path, cx: &Context) -> Task> { + pub fn load_file(&self, path: &RelPath, cx: &Context) -> Task> { match self { Worktree::Local(this) => this.load_file(path, cx), Worktree::Remote(_) => { @@ -799,7 +713,7 @@ impl Worktree { pub fn load_binary_file( &self, - path: &Path, + path: &RelPath, cx: &Context, ) -> Task> { match self { @@ -812,7 +726,7 @@ impl Worktree { pub fn write_file( &self, - path: &Path, + path: Arc, text: Rope, line_ending: LineEnding, cx: &Context, @@ -827,12 +741,11 @@ impl Worktree { pub fn create_entry( &mut self, - path: impl Into>, + path: Arc, is_directory: bool, content: Option>, cx: &Context, ) -> Task> { - let path: Arc = path.into(); let worktree_id = self.id(); match self { Worktree::Local(this) => this.create_entry(path, is_directory, content, cx), @@ -859,11 +772,8 @@ impl Worktree { .await .map(CreatedEntry::Included), None => { - let abs_path = this.read_with(cx, |worktree, _| { - worktree - .absolutize(&path) - .with_context(|| format!("absolutizing {path:?}")) - })??; + let abs_path = + this.read_with(cx, |worktree, _| worktree.absolutize(&path))?; Ok(CreatedEntry::Excluded { abs_path }) } } @@ -899,7 +809,7 @@ impl Worktree { Some(task) } - fn get_children_ids_recursive(&self, path: &Path, ids: &mut Vec) { + fn get_children_ids_recursive(&self, path: &RelPath, ids: &mut Vec) { let children_iter = self.child_entries(path); for child in children_iter { ids.push(child.id); @@ -907,63 +817,21 @@ impl Worktree { } } - pub fn rename_entry( - &mut self, - entry_id: ProjectEntryId, - new_path: impl Into>, - cx: &Context, - ) -> Task> { - let new_path = new_path.into(); - match self { - Worktree::Local(this) => this.rename_entry(entry_id, new_path, cx), - Worktree::Remote(this) => this.rename_entry(entry_id, new_path, cx), - } - } - - pub fn copy_entry( - &mut self, - entry_id: ProjectEntryId, - relative_worktree_source_path: Option, - new_path: impl Into>, - cx: &Context, - ) -> Task>> { - let new_path: Arc = new_path.into(); - match self { - Worktree::Local(this) => { - this.copy_entry(entry_id, relative_worktree_source_path, new_path, cx) - } - Worktree::Remote(this) => { - let relative_worktree_source_path = relative_worktree_source_path - .map(|relative_worktree_source_path| relative_worktree_source_path.to_proto()); - let response = this.client.request(proto::CopyProjectEntry { - project_id: this.project_id, - entry_id: entry_id.to_proto(), - relative_worktree_source_path, - new_path: new_path.to_proto(), - }); - cx.spawn(async move |this, cx| { - let response = response.await?; - match response.entry { - Some(entry) => this - .update(cx, |worktree, cx| { - worktree.as_remote_mut().unwrap().insert_entry( - entry, - response.worktree_scan_id as usize, - cx, - ) - })? - .await - .map(Some), - None => Ok(None), - } - }) - } - } - } + // pub fn rename_entry( + // &mut self, + // entry_id: ProjectEntryId, + // new_path: Arc, + // cx: &Context, + // ) -> Task> { + // match self { + // Worktree::Local(this) => this.rename_entry(entry_id, new_path, cx), + // Worktree::Remote(this) => this.rename_entry(entry_id, new_path, cx), + // } + // } pub fn copy_external_entries( &mut self, - target_directory: Arc, + target_directory: Arc, paths: Vec>, fs: Arc, cx: &Context, @@ -1032,16 +900,18 @@ impl Worktree { mut cx: AsyncApp, ) -> Result { let (scan_id, entry) = this.update(&mut cx, |this, cx| { - ( + anyhow::Ok(( this.scan_id(), this.create_entry( - Arc::::from_proto(request.path), + RelPath::from_proto(&request.path).with_context(|| { + format!("received invalid relative path {:?}", request.path) + })?, request.is_directory, request.content, cx, ), - ) - })?; + )) + })??; Ok(proto::ProjectEntryResponse { entry: match &entry.await? { CreatedEntry::Included(entry) => Some(entry.into()), @@ -1103,91 +973,38 @@ impl Worktree { }) } - pub async fn handle_rename_entry( - this: Entity, - request: proto::RenameProjectEntry, - mut cx: AsyncApp, - ) -> Result { - let (scan_id, task) = this.update(&mut cx, |this, cx| { - ( - this.scan_id(), - this.rename_entry( - ProjectEntryId::from_proto(request.entry_id), - Arc::::from_proto(request.new_path), - cx, - ), - ) - })?; - Ok(proto::ProjectEntryResponse { - entry: match &task.await? { - CreatedEntry::Included(entry) => Some(entry.into()), - CreatedEntry::Excluded { .. } => None, - }, - worktree_scan_id: scan_id as u64, - }) - } - - pub async fn handle_copy_entry( - this: Entity, - request: proto::CopyProjectEntry, - mut cx: AsyncApp, - ) -> Result { - let (scan_id, task) = this.update(&mut cx, |this, cx| { - let relative_worktree_source_path = request - .relative_worktree_source_path - .map(PathBuf::from_proto); - ( - this.scan_id(), - this.copy_entry( - ProjectEntryId::from_proto(request.entry_id), - relative_worktree_source_path, - PathBuf::from_proto(request.new_path), - cx, - ), - ) - })?; - Ok(proto::ProjectEntryResponse { - entry: task.await?.as_ref().map(|e| e.into()), - worktree_scan_id: scan_id as u64, - }) - } - - pub fn dot_git_abs_path(&self, work_directory: &WorkDirectory) -> PathBuf { - let mut path = match work_directory { - WorkDirectory::InProject { relative_path } => self.abs_path().join(relative_path), - WorkDirectory::AboveProject { absolute_path, .. } => absolute_path.as_ref().to_owned(), - }; - path.push(".git"); - path - } - pub fn is_single_file(&self) -> bool { self.root_dir().is_none() } /// For visible worktrees, returns the path with the worktree name as the first component. /// Otherwise, returns an absolute path. - pub fn full_path(&self, worktree_relative_path: &Path) -> PathBuf { - let mut full_path = PathBuf::new(); - + pub fn full_path(&self, worktree_relative_path: &RelPath) -> PathBuf { if self.is_visible() { - full_path.push(self.root_name()); + self.root_name() + .join(worktree_relative_path) + .display(self.path_style) + .to_string() + .into() } else { - let path = self.abs_path(); - - if self.is_local() && path.starts_with(home_dir().as_path()) { - full_path.push("~"); - full_path.push(path.strip_prefix(home_dir().as_path()).unwrap()); + let full_path = self.abs_path(); + let mut full_path_string = if self.is_local() + && let Ok(stripped) = full_path.strip_prefix(home_dir()) + { + self.path_style + .join("~", &*stripped.to_string_lossy()) + .unwrap() } else { - full_path.push(path) + full_path.to_string_lossy().into_owned() + }; + + if worktree_relative_path.components().next().is_some() { + full_path_string.push_str(self.path_style.separator()); + full_path_string.push_str(&worktree_relative_path.display(self.path_style)); } - } - if worktree_relative_path.components().next().is_some() { - full_path.push(&worktree_relative_path); + full_path_string.into() } - - full_path } } @@ -1196,10 +1013,14 @@ impl LocalWorktree { &self.fs } - pub fn is_path_private(&self, path: &Path) -> bool { + pub fn is_path_private(&self, path: &RelPath) -> bool { !self.share_private_files && self.settings.is_path_private(path) } + pub fn fs_is_case_sensitive(&self) -> bool { + self.fs_case_sensitive + } + fn restart_background_scanners(&mut self, cx: &Context) { let (scan_requests_tx, scan_requests_rx) = channel::unbounded(); let (path_prefixes_to_scan_tx, path_prefixes_to_scan_rx) = channel::unbounded(); @@ -1295,7 +1116,7 @@ impl LocalWorktree { } }); self._background_scanner_tasks = vec![background_scanner, scan_state_updater]; - self.is_scanning = watch::channel_with(true); + *self.is_scanning.0.borrow_mut() = true; } fn set_snapshot( @@ -1446,18 +1267,17 @@ impl LocalWorktree { fn load_binary_file( &self, - path: &Path, + path: &RelPath, cx: &Context, ) -> Task> { let path = Arc::from(path); let abs_path = self.absolutize(&path); let fs = self.fs.clone(); let entry = self.refresh_entry(path.clone(), None, cx); - let is_private = self.is_path_private(path.as_ref()); + let is_private = self.is_path_private(&path); let worktree = cx.weak_entity(); cx.background_spawn(async move { - let abs_path = abs_path?; let content = fs.load_bytes(&abs_path).await?; let worktree = worktree.upgrade().context("worktree was dropped")?; @@ -1490,7 +1310,7 @@ impl LocalWorktree { }) } - fn load_file(&self, path: &Path, cx: &Context) -> Task> { + fn load_file(&self, path: &RelPath, cx: &Context) -> Task> { let path = Arc::from(path); let abs_path = self.absolutize(&path); let fs = self.fs.clone(); @@ -1498,7 +1318,6 @@ impl LocalWorktree { let is_private = self.is_path_private(path.as_ref()); cx.spawn(async move |this, _cx| { - let abs_path = abs_path?; // WARN: Temporary workaround for #27283. // We are not efficient with our memory usage per file, and use in excess of 64GB for a 10GB file // Therefore, as a temporary workaround to prevent system freezes, we just bail before opening a file @@ -1546,31 +1365,27 @@ impl LocalWorktree { } /// Find the lowest path in the worktree's datastructures that is an ancestor - fn lowest_ancestor(&self, path: &Path) -> PathBuf { + fn lowest_ancestor(&self, path: &RelPath) -> Arc { let mut lowest_ancestor = None; for path in path.ancestors() { if self.entry_for_path(path).is_some() { - lowest_ancestor = Some(path.to_path_buf()); + lowest_ancestor = Some(path.into()); break; } } - lowest_ancestor.unwrap_or_else(|| PathBuf::from("")) + lowest_ancestor.unwrap_or_else(|| RelPath::empty().into()) } fn create_entry( &self, - path: impl Into>, + path: Arc, is_dir: bool, content: Option>, cx: &Context, ) -> Task> { - let path = path.into(); - let abs_path = match self.absolutize(&path) { - Ok(path) => path, - Err(e) => return Task::ready(Err(e.context(format!("absolutizing path {path:?}")))), - }; - let path_excluded = self.settings.is_path_excluded(&abs_path); + let abs_path = self.absolutize(&path); + let path_excluded = self.settings.is_path_excluded(&path); let fs = self.fs.clone(); let task_abs_path = abs_path.clone(); let write = cx.background_spawn(async move { @@ -1596,13 +1411,13 @@ impl LocalWorktree { let mut refreshes = Vec::new(); let refresh_paths = path.strip_prefix(&lowest_ancestor).unwrap(); for refresh_path in refresh_paths.ancestors() { - if refresh_path == Path::new("") { + if refresh_path == RelPath::empty() { continue; } let refresh_full_path = lowest_ancestor.join(refresh_path); refreshes.push(this.as_local_mut().unwrap().refresh_entry( - refresh_full_path.into(), + refresh_full_path, None, cx, )); @@ -1625,17 +1440,14 @@ impl LocalWorktree { fn write_file( &self, - path: impl Into>, + path: Arc, text: Rope, line_ending: LineEnding, cx: &Context, ) -> Task>> { - let path = path.into(); let fs = self.fs.clone(); let is_private = self.is_path_private(&path); - let Ok(abs_path) = self.absolutize(&path) else { - return Task::ready(Err(anyhow!("invalid path {path:?}"))); - }; + let abs_path = self.absolutize(&path); let write = cx.background_spawn({ let fs = fs.clone(); @@ -1692,13 +1504,13 @@ impl LocalWorktree { let delete = cx.background_spawn(async move { if entry.is_file() { if trash { - fs.trash_file(&abs_path?, Default::default()).await?; + fs.trash_file(&abs_path, Default::default()).await?; } else { - fs.remove_file(&abs_path?, Default::default()).await?; + fs.remove_file(&abs_path, Default::default()).await?; } } else if trash { fs.trash_dir( - &abs_path?, + &abs_path, RemoveOptions { recursive: true, ignore_if_not_exists: false, @@ -1707,7 +1519,7 @@ impl LocalWorktree { .await?; } else { fs.remove_dir( - &abs_path?, + &abs_path, RemoveOptions { recursive: true, ignore_if_not_exists: false, @@ -1731,160 +1543,13 @@ impl LocalWorktree { })) } - /// Rename an entry. - /// - /// `new_path` is the new relative path to the worktree root. - /// If the root entry is renamed then `new_path` is the new root name instead. - fn rename_entry( - &self, - entry_id: ProjectEntryId, - new_path: impl Into>, - cx: &Context, - ) -> Task> { - let old_path = match self.entry_for_id(entry_id) { - Some(entry) => entry.path.clone(), - None => return Task::ready(Err(anyhow!("no entry to rename for id {entry_id:?}"))), - }; - let new_path = new_path.into(); - let abs_old_path = self.absolutize(&old_path); - - let is_root_entry = self.root_entry().is_some_and(|e| e.id == entry_id); - let abs_new_path = if is_root_entry { - let Some(root_parent_path) = self.abs_path().parent() else { - return Task::ready(Err(anyhow!("no parent for path {:?}", self.abs_path))); - }; - root_parent_path.join(&new_path) - } else { - let Ok(absolutize_path) = self.absolutize(&new_path) else { - return Task::ready(Err(anyhow!("absolutizing path {new_path:?}"))); - }; - absolutize_path - }; - - let fs = self.fs.clone(); - let abs_path = abs_new_path.clone(); - let case_sensitive = self.fs_case_sensitive; - - let do_rename = async move |fs: &dyn Fs, old_path: &Path, new_path: &Path, overwrite| { - fs.rename( - &old_path, - &new_path, - fs::RenameOptions { - overwrite, - ..fs::RenameOptions::default() - }, - ) - .await - .with_context(|| format!("renaming {old_path:?} into {new_path:?}")) - }; - - let rename_task = cx.background_spawn(async move { - let abs_old_path = abs_old_path?; - - // If we're on a case-insensitive FS and we're doing a case-only rename (i.e. `foobar` to `FOOBAR`) - // we want to overwrite, because otherwise we run into a file-already-exists error. - let overwrite = !case_sensitive - && abs_old_path != abs_new_path - && abs_old_path.to_str().map(|p| p.to_lowercase()) - == abs_new_path.to_str().map(|p| p.to_lowercase()); - - // The directory we're renaming into might not exist yet - if let Err(e) = do_rename(fs.as_ref(), &abs_old_path, &abs_new_path, overwrite).await { - if let Some(err) = e.downcast_ref::() - && err.kind() == std::io::ErrorKind::NotFound - { - if let Some(parent) = abs_new_path.parent() { - fs.create_dir(parent) - .await - .with_context(|| format!("creating parent directory {parent:?}"))?; - return do_rename(fs.as_ref(), &abs_old_path, &abs_new_path, overwrite) - .await; - } - } - return Err(e); - } - Ok(()) - }); - - cx.spawn(async move |this, cx| { - rename_task.await?; - Ok(this - .update(cx, |this, cx| { - let local = this.as_local_mut().unwrap(); - if is_root_entry { - // We eagerly update `abs_path` and refresh this worktree. - // Otherwise, the FS watcher would do it on the `RootUpdated` event, - // but with a noticeable delay, so we handle it proactively. - local.update_abs_path_and_refresh( - Some(SanitizedPath::new_arc(&abs_path)), - cx, - ); - Task::ready(Ok(this.root_entry().cloned())) - } else { - // First refresh the parent directory (in case it was newly created) - if let Some(parent) = new_path.parent() { - let _ = local.refresh_entries_for_paths(vec![parent.into()]); - } - // Then refresh the new path - local.refresh_entry(new_path.clone(), Some(old_path), cx) - } - })? - .await? - .map(CreatedEntry::Included) - .unwrap_or_else(|| CreatedEntry::Excluded { abs_path })) - }) - } - - fn copy_entry( - &self, - entry_id: ProjectEntryId, - relative_worktree_source_path: Option, - new_path: impl Into>, - cx: &Context, - ) -> Task>> { - let old_path = match self.entry_for_id(entry_id) { - Some(entry) => entry.path.clone(), - None => return Task::ready(Ok(None)), - }; - let new_path = new_path.into(); - let abs_old_path = - if let Some(relative_worktree_source_path) = relative_worktree_source_path { - Ok(self.abs_path().join(relative_worktree_source_path)) - } else { - self.absolutize(&old_path) - }; - let abs_new_path = self.absolutize(&new_path); - let fs = self.fs.clone(); - let copy = cx.background_spawn(async move { - copy_recursive( - fs.as_ref(), - &abs_old_path?, - &abs_new_path?, - Default::default(), - ) - .await - }); - - cx.spawn(async move |this, cx| { - copy.await?; - this.update(cx, |this, cx| { - this.as_local_mut() - .unwrap() - .refresh_entry(new_path.clone(), None, cx) - })? - .await - }) - } - pub fn copy_external_entries( &self, - target_directory: Arc, + target_directory: Arc, paths: Vec>, cx: &Context, ) -> Task>> { - let Ok(target_directory) = self.absolutize(&target_directory) else { - return Task::ready(Err(anyhow!("invalid target path"))); - }; + let target_directory = self.absolutize(&target_directory); let worktree_path = self.abs_path().clone(); let fs = self.fs.clone(); let paths = paths @@ -1905,7 +1570,14 @@ impl LocalWorktree { let paths_to_refresh = paths .iter() - .filter_map(|(_, target)| Some(target.strip_prefix(&worktree_path).ok()?.into())) + .filter_map(|(_, target)| { + RelPath::new( + target.strip_prefix(&worktree_path).ok()?, + PathStyle::local(), + ) + .ok() + .map(|path| path.into_arc()) + }) .collect::>(); cx.spawn(async move |this, cx| { @@ -1983,7 +1655,7 @@ impl LocalWorktree { })) } - fn refresh_entries_for_paths(&self, paths: Vec>) -> barrier::Receiver { + pub fn refresh_entries_for_paths(&self, paths: Vec>) -> barrier::Receiver { let (tx, rx) = barrier::channel(); self.scan_requests_tx .try_send(ScanRequest { @@ -1995,11 +1667,14 @@ impl LocalWorktree { } #[cfg(feature = "test-support")] - pub fn manually_refresh_entries_for_paths(&self, paths: Vec>) -> barrier::Receiver { + pub fn manually_refresh_entries_for_paths( + &self, + paths: Vec>, + ) -> barrier::Receiver { self.refresh_entries_for_paths(paths) } - pub fn add_path_prefix_to_scan(&self, path_prefix: Arc) -> barrier::Receiver { + pub fn add_path_prefix_to_scan(&self, path_prefix: Arc) -> barrier::Receiver { let (tx, rx) = barrier::channel(); self.path_prefixes_to_scan_tx .try_send(PathPrefixScanRequest { @@ -2010,10 +1685,10 @@ impl LocalWorktree { rx } - fn refresh_entry( + pub fn refresh_entry( &self, - path: Arc, - old_path: Option>, + path: Arc, + old_path: Option>, cx: &Context, ) -> Task>> { if self.settings.is_path_excluded(&path) { @@ -2030,7 +1705,7 @@ impl LocalWorktree { refresh.recv().await; log::trace!("refreshed entry {path:?} in {:?}", t0.elapsed()); let new_entry = this.read_with(cx, |this, _| { - this.entry_for_path(path) + this.entry_for_path(&path) .cloned() .context("reading path after update") })??; @@ -2096,20 +1771,21 @@ impl LocalWorktree { self.restart_background_scanners(cx); } - fn update_abs_path_and_refresh( + pub fn update_abs_path_and_refresh( &mut self, - new_path: Option>, + new_path: Arc, cx: &Context, ) { - if let Some(new_path) = new_path { - self.snapshot.git_repositories = Default::default(); - self.snapshot.ignores_by_parent_abs_path = Default::default(); - let root_name = new_path - .as_path() - .file_name() - .map_or(String::new(), |f| f.to_string_lossy().to_string()); - self.snapshot.update_abs_path(new_path, root_name); - } + self.snapshot.git_repositories = Default::default(); + self.snapshot.ignores_by_parent_abs_path = Default::default(); + let root_name = new_path + .as_path() + .file_name() + .and_then(|f| f.to_str()) + .map_or(RelPath::empty().into(), |f| { + RelPath::unix(f).unwrap().into() + }); + self.snapshot.update_abs_path(new_path, root_name); self.restart_background_scanners(cx); } } @@ -2202,7 +1878,7 @@ impl RemoteWorktree { } } - fn insert_entry( + pub fn insert_entry( &mut self, entry: proto::Entry, scan_id: usize, @@ -2250,46 +1926,44 @@ impl RemoteWorktree { })) } - fn rename_entry( - &self, - entry_id: ProjectEntryId, - new_path: impl Into>, - cx: &Context, - ) -> Task> { - let new_path: Arc = new_path.into(); - let response = self.client.request(proto::RenameProjectEntry { - project_id: self.project_id, - entry_id: entry_id.to_proto(), - new_path: new_path.as_ref().to_proto(), - }); - cx.spawn(async move |this, cx| { - let response = response.await?; - match response.entry { - Some(entry) => this - .update(cx, |this, cx| { - this.as_remote_mut().unwrap().insert_entry( - entry, - response.worktree_scan_id as usize, - cx, - ) - })? - .await - .map(CreatedEntry::Included), - None => { - let abs_path = this.read_with(cx, |worktree, _| { - worktree - .absolutize(&new_path) - .with_context(|| format!("absolutizing {new_path:?}")) - })??; - Ok(CreatedEntry::Excluded { abs_path }) - } - } - }) - } + // fn rename_entry( + // &self, + // entry_id: ProjectEntryId, + // new_path: impl Into>, + // cx: &Context, + // ) -> Task> { + // let new_path: Arc = new_path.into(); + // let response = self.client.request(proto::RenameProjectEntry { + // project_id: self.project_id, + // entry_id: entry_id.to_proto(), + // new_worktree_id: new_path.worktree_id, + // new_path: new_path.as_ref().to_proto(), + // }); + // cx.spawn(async move |this, cx| { + // let response = response.await?; + // match response.entry { + // Some(entry) => this + // .update(cx, |this, cx| { + // this.as_remote_mut().unwrap().insert_entry( + // entry, + // response.worktree_scan_id as usize, + // cx, + // ) + // })? + // .await + // .map(CreatedEntry::Included), + // None => { + // let abs_path = + // this.read_with(cx, |worktree, _| worktree.absolutize(&new_path))?; + // Ok(CreatedEntry::Excluded { abs_path }) + // } + // } + // }) + // } fn copy_external_entries( &self, - target_directory: Arc, + target_directory: Arc, paths_to_copy: Vec>, local_fs: Arc, cx: &Context, @@ -2301,13 +1975,22 @@ impl RemoteWorktree { cx.background_spawn(async move { let mut requests = Vec::new(); for root_path_to_copy in paths_to_copy { - let Some(filename) = root_path_to_copy.file_name() else { + let Some(filename) = root_path_to_copy + .file_name() + .and_then(|name| name.to_str()) + .and_then(|filename| RelPath::unix(filename).ok()) + else { continue; }; for (abs_path, is_directory) in read_dir_items(local_fs.as_ref(), &root_path_to_copy).await? { - let Ok(relative_path) = abs_path.strip_prefix(&root_path_to_copy) else { + let Some(relative_path) = abs_path + .strip_prefix(&root_path_to_copy) + .map_err(|e| anyhow::Error::from(e)) + .and_then(|relative_path| RelPath::new(relative_path, PathStyle::local())) + .log_err() + else { continue; }; let content = if is_directory { @@ -2318,13 +2001,13 @@ impl RemoteWorktree { let mut target_path = target_directory.join(filename); if relative_path.file_name().is_some() { - target_path.push(relative_path) + target_path = target_path.join(&relative_path); } requests.push(proto::CreateProjectEntry { project_id, worktree_id, - path: target_path.to_string_lossy().to_string(), + path: target_path.to_proto(), is_directory, content, }); @@ -2345,11 +2028,21 @@ impl RemoteWorktree { } impl Snapshot { - pub fn new(id: u64, root_name: String, abs_path: Arc) -> Self { + pub fn new( + id: u64, + root_name: Arc, + abs_path: Arc, + path_style: PathStyle, + ) -> Self { Snapshot { id: WorktreeId::from_usize(id as usize), abs_path: SanitizedPath::from_arc(abs_path), - root_char_bag: root_name.chars().map(|c| c.to_ascii_lowercase()).collect(), + path_style, + root_char_bag: root_name + .as_unix_str() + .chars() + .map(|c| c.to_ascii_lowercase()) + .collect(), root_name, always_included_entries: Default::default(), entries_by_path: Default::default(), @@ -2390,8 +2083,8 @@ impl Snapshot { proto::UpdateWorktree { project_id, worktree_id, - abs_path: self.abs_path().to_proto(), - root_name: self.root_name().to_string(), + abs_path: self.abs_path().to_string_lossy().into_owned(), + root_name: self.root_name().to_proto(), updated_entries, removed_entries: Vec::new(), scan_id: self.scan_id as u64, @@ -2402,31 +2095,30 @@ impl Snapshot { } } - pub fn work_directory_abs_path(&self, work_directory: &WorkDirectory) -> Result { + pub fn work_directory_abs_path(&self, work_directory: &WorkDirectory) -> PathBuf { match work_directory { WorkDirectory::InProject { relative_path } => self.absolutize(relative_path), - WorkDirectory::AboveProject { absolute_path, .. } => { - Ok(absolute_path.as_ref().to_owned()) - } + WorkDirectory::AboveProject { absolute_path, .. } => absolute_path.as_ref().to_owned(), } } - pub fn absolutize(&self, path: &Path) -> Result { - if path - .components() - .any(|component| !matches!(component, std::path::Component::Normal(_))) - { - anyhow::bail!("invalid path"); - } + pub fn absolutize(&self, path: &RelPath) -> PathBuf { if path.file_name().is_some() { - Ok(self.abs_path.as_path().join(path)) + let mut abs_path = self.abs_path.to_string(); + for component in path.components() { + if !abs_path.ends_with(self.path_style.separator()) { + abs_path.push_str(self.path_style.separator()); + } + abs_path.push_str(component); + } + PathBuf::from(abs_path) } else { - Ok(self.abs_path.as_path().to_path_buf()) + self.abs_path.as_path().to_path_buf() } } pub fn contains_entry(&self, entry_id: ProjectEntryId) -> bool { - self.entries_by_id.get(&entry_id, &()).is_some() + self.entries_by_id.get(&entry_id, ()).is_some() } fn insert_entry( @@ -2442,40 +2134,44 @@ impl Snapshot { is_ignored: entry.is_ignored, scan_id: 0, }, - &(), + (), ); if let Some(old_entry) = old_entry { - self.entries_by_path.remove(&PathKey(old_entry.path), &()); + self.entries_by_path.remove(&PathKey(old_entry.path), ()); } - self.entries_by_path.insert_or_replace(entry.clone(), &()); + self.entries_by_path.insert_or_replace(entry.clone(), ()); Ok(entry) } - fn delete_entry(&mut self, entry_id: ProjectEntryId) -> Option> { - let removed_entry = self.entries_by_id.remove(&entry_id, &())?; + fn delete_entry(&mut self, entry_id: ProjectEntryId) -> Option> { + let removed_entry = self.entries_by_id.remove(&entry_id, ())?; self.entries_by_path = { - let mut cursor = self.entries_by_path.cursor::(&()); + let mut cursor = self.entries_by_path.cursor::(()); let mut new_entries_by_path = cursor.slice(&TraversalTarget::path(&removed_entry.path), Bias::Left); while let Some(entry) = cursor.item() { if entry.path.starts_with(&removed_entry.path) { - self.entries_by_id.remove(&entry.id, &()); + self.entries_by_id.remove(&entry.id, ()); cursor.next(); } else { break; } } - new_entries_by_path.append(cursor.suffix(), &()); + new_entries_by_path.append(cursor.suffix(), ()); new_entries_by_path }; Some(removed_entry.path) } - fn update_abs_path(&mut self, abs_path: Arc, root_name: String) { + fn update_abs_path(&mut self, abs_path: Arc, root_name: Arc) { self.abs_path = abs_path; if root_name != self.root_name { - self.root_char_bag = root_name.chars().map(|c| c.to_ascii_lowercase()).collect(); + self.root_char_bag = root_name + .as_unix_str() + .chars() + .map(|c| c.to_ascii_lowercase()) + .collect(); self.root_name = root_name; } } @@ -2484,16 +2180,18 @@ impl Snapshot { &mut self, update: proto::UpdateWorktree, always_included_paths: &PathMatcher, - ) -> Result<()> { + ) { log::debug!( "applying remote worktree update. {} entries updated, {} removed", update.updated_entries.len(), update.removed_entries.len() ); - self.update_abs_path( - SanitizedPath::new_arc(&PathBuf::from_proto(update.abs_path)), - update.root_name, - ); + if let Some(root_name) = RelPath::from_proto(&update.root_name).log_err() { + self.update_abs_path( + SanitizedPath::new_arc(&Path::new(&update.abs_path)), + root_name, + ); + } let mut entries_by_path_edits = Vec::new(); let mut entries_by_id_edits = Vec::new(); @@ -2507,11 +2205,15 @@ impl Snapshot { } for entry in update.updated_entries { - let entry = Entry::try_from((&self.root_char_bag, always_included_paths, entry))?; - if let Some(PathEntry { path, .. }) = self.entries_by_id.get(&entry.id, &()) { + let Some(entry) = + Entry::try_from((&self.root_char_bag, always_included_paths, entry)).log_err() + else { + continue; + }; + if let Some(PathEntry { path, .. }) = self.entries_by_id.get(&entry.id, ()) { entries_by_path_edits.push(Edit::Remove(PathKey(path.clone()))); } - if let Some(old_entry) = self.entries_by_path.get(&PathKey(entry.path.clone()), &()) + if let Some(old_entry) = self.entries_by_path.get(&PathKey(entry.path.clone()), ()) && old_entry.id != entry.id { entries_by_id_edits.push(Edit::Remove(old_entry.id)); @@ -2525,15 +2227,13 @@ impl Snapshot { entries_by_path_edits.push(Edit::Insert(entry)); } - self.entries_by_path.edit(entries_by_path_edits, &()); - self.entries_by_id.edit(entries_by_id_edits, &()); + self.entries_by_path.edit(entries_by_path_edits, ()); + self.entries_by_id.edit(entries_by_id_edits, ()); self.scan_id = update.scan_id as usize; if update.is_last_update { self.completed_scan_id = update.scan_id as usize; } - - Ok(()) } pub fn entry_count(&self) -> usize { @@ -2569,7 +2269,7 @@ impl Snapshot { include_ignored: bool, start_offset: usize, ) -> Traversal<'_> { - let mut cursor = self.entries_by_path.cursor(&()); + let mut cursor = self.entries_by_path.cursor(()); cursor.seek( &TraversalTarget::Count { count: start_offset, @@ -2593,7 +2293,7 @@ impl Snapshot { include_files: bool, include_dirs: bool, include_ignored: bool, - path: &Path, + path: &RelPath, ) -> Traversal<'_> { Traversal::new(self, include_files, include_dirs, include_ignored, path) } @@ -2610,15 +2310,14 @@ impl Snapshot { self.traverse_from_offset(true, true, include_ignored, start) } - pub fn paths(&self) -> impl Iterator> { - let empty_path = Path::new(""); + pub fn paths(&self) -> impl Iterator { self.entries_by_path - .cursor::<()>(&()) - .filter(move |entry| entry.path.as_ref() != empty_path) - .map(|entry| &entry.path) + .cursor::<()>(()) + .filter(move |entry| !entry.path.is_empty()) + .map(|entry| entry.path.as_ref()) } - pub fn child_entries<'a>(&'a self, parent_path: &'a Path) -> ChildEntriesIter<'a> { + pub fn child_entries<'a>(&'a self, parent_path: &'a RelPath) -> ChildEntriesIter<'a> { let options = ChildEntriesOptions { include_files: true, include_dirs: true, @@ -2629,10 +2328,10 @@ impl Snapshot { pub fn child_entries_with_options<'a>( &'a self, - parent_path: &'a Path, + parent_path: &'a RelPath, options: ChildEntriesOptions, ) -> ChildEntriesIter<'a> { - let mut cursor = self.entries_by_path.cursor(&()); + let mut cursor = self.entries_by_path.cursor(()); cursor.seek(&TraversalTarget::path(parent_path), Bias::Right); let traversal = Traversal { snapshot: self, @@ -2659,17 +2358,19 @@ impl Snapshot { .map(|_| self.abs_path().clone()) } - pub fn root_name(&self) -> &str { + pub fn root_name(&self) -> &RelPath { &self.root_name } + pub fn root_name_str(&self) -> &str { + self.root_name.as_unix_str() + } + pub fn scan_id(&self) -> usize { self.scan_id } - pub fn entry_for_path(&self, path: impl AsRef) -> Option<&Entry> { - let path = path.as_ref(); - debug_assert!(path.is_relative()); + pub fn entry_for_path(&self, path: &RelPath) -> Option<&Entry> { self.traverse_from_path(true, true, true, path) .entry() .and_then(|entry| { @@ -2682,17 +2383,17 @@ impl Snapshot { } pub fn entry_for_id(&self, id: ProjectEntryId) -> Option<&Entry> { - let entry = self.entries_by_id.get(&id, &())?; + let entry = self.entries_by_id.get(&id, ())?; self.entry_for_path(&entry.path) } - pub fn inode_for_path(&self, path: impl AsRef) -> Option { - self.entry_for_path(path.as_ref()).map(|e| e.inode) + pub fn path_style(&self) -> PathStyle { + self.path_style } } impl LocalSnapshot { - fn local_repo_for_work_directory_path(&self, path: &Path) -> Option<&LocalRepositoryEntry> { + fn local_repo_for_work_directory_path(&self, path: &RelPath) -> Option<&LocalRepositoryEntry> { self.git_repositories .iter() .map(|(_, entry)| entry) @@ -2725,8 +2426,8 @@ impl LocalSnapshot { proto::UpdateWorktree { project_id, worktree_id, - abs_path: self.abs_path().to_proto(), - root_name: self.root_name().to_string(), + abs_path: self.abs_path().to_string_lossy().into_owned(), + root_name: self.root_name().to_proto(), updated_entries, removed_entries, scan_id: self.scan_id as u64, @@ -2739,7 +2440,7 @@ impl LocalSnapshot { fn insert_entry(&mut self, mut entry: Entry, fs: &dyn Fs) -> Entry { if entry.is_file() && entry.path.file_name() == Some(&GITIGNORE) { - let abs_path = self.abs_path.as_path().join(&entry.path); + let abs_path = self.absolutize(&entry.path); match smol::block_on(build_gitignore(&abs_path, fs)) { Ok(ignore) => { self.ignores_by_parent_abs_path @@ -2756,18 +2457,17 @@ impl LocalSnapshot { } if entry.kind == EntryKind::PendingDir - && let Some(existing_entry) = - self.entries_by_path.get(&PathKey(entry.path.clone()), &()) + && let Some(existing_entry) = self.entries_by_path.get(&PathKey(entry.path.clone()), ()) { entry.kind = existing_entry.kind; } let scan_id = self.scan_id; - let removed = self.entries_by_path.insert_or_replace(entry.clone(), &()); + let removed = self.entries_by_path.insert_or_replace(entry.clone(), ()); if let Some(removed) = removed && removed.id != entry.id { - self.entries_by_id.remove(&removed.id, &()); + self.entries_by_id.remove(&removed.id, ()); } self.entries_by_id.insert_or_replace( PathEntry { @@ -2776,13 +2476,13 @@ impl LocalSnapshot { is_ignored: entry.is_ignored, scan_id, }, - &(), + (), ); entry } - fn ancestor_inodes_for_path(&self, path: &Path) -> TreeSet { + fn ancestor_inodes_for_path(&self, path: &RelPath) -> TreeSet { let mut inodes = TreeSet::default(); for ancestor in path.ancestors().skip(1) { if let Some(entry) = self.entry_for_path(ancestor) { @@ -2803,7 +2503,7 @@ impl LocalSnapshot { new_ignores.push((ancestor, None)); } } - let metadata = smol::block_on(fs.metadata(&ancestor.join(*DOT_GIT))) + let metadata = smol::block_on(fs.metadata(&ancestor.join(DOT_GIT))) .ok() .flatten(); if metadata.is_some() { @@ -2837,7 +2537,7 @@ impl LocalSnapshot { #[cfg(test)] fn expanded_entries(&self) -> impl Iterator { self.entries_by_path - .cursor::<()>(&()) + .cursor::<()>(()) .filter(|entry| entry.kind == EntryKind::Dir && (entry.is_external || entry.is_ignored)) } @@ -2847,11 +2547,11 @@ impl LocalSnapshot { assert_eq!( self.entries_by_path - .cursor::<()>(&()) + .cursor::<()>(()) .map(|e| (&e.path, e.id)) .collect::>(), self.entries_by_id - .cursor::<()>(&()) + .cursor::<()>(()) .map(|e| (&e.path, e.id)) .collect::>() .into_iter() @@ -2861,7 +2561,7 @@ impl LocalSnapshot { let mut files = self.files(true, 0); let mut visible_files = self.files(false, 0); - for entry in self.entries_by_path.cursor::<()>(&()) { + for entry in self.entries_by_path.cursor::<()>(()) { if entry.is_file() { assert_eq!(files.next().unwrap().inode, entry.inode); if (!entry.is_ignored && !entry.is_external) || entry.is_always_included { @@ -2889,7 +2589,7 @@ impl LocalSnapshot { let dfs_paths_via_iter = self .entries_by_path - .cursor::<()>(&()) + .cursor::<()>(()) .map(|e| e.path.as_ref()) .collect::>(); assert_eq!(bfs_paths, dfs_paths_via_iter); @@ -2898,26 +2598,33 @@ impl LocalSnapshot { .entries(true, 0) .map(|e| e.path.as_ref()) .collect::>(); + assert_eq!(dfs_paths_via_traversal, dfs_paths_via_iter); if git_state { for ignore_parent_abs_path in self.ignores_by_parent_abs_path.keys() { - let ignore_parent_path = ignore_parent_abs_path - .strip_prefix(self.abs_path.as_path()) - .unwrap(); + let ignore_parent_path = &RelPath::new( + ignore_parent_abs_path + .strip_prefix(self.abs_path.as_path()) + .unwrap(), + PathStyle::local(), + ) + .unwrap(); assert!(self.entry_for_path(ignore_parent_path).is_some()); assert!( - self.entry_for_path(ignore_parent_path.join(*GITIGNORE)) - .is_some() + self.entry_for_path( + &ignore_parent_path.join(RelPath::unix(GITIGNORE).unwrap()) + ) + .is_some() ); } } } #[cfg(test)] - pub fn entries_without_ids(&self, include_ignored: bool) -> Vec<(&Path, u64, bool)> { + pub fn entries_without_ids(&self, include_ignored: bool) -> Vec<(&RelPath, u64, bool)> { let mut paths = Vec::new(); - for entry in self.entries_by_path.cursor::<()>(&()) { + for entry in self.entries_by_path.cursor::<()>(()) { if include_ignored || !entry.is_ignored { paths.push((entry.path.as_ref(), entry.inode, entry.is_ignored)); } @@ -2930,9 +2637,9 @@ impl LocalSnapshot { impl BackgroundScannerState { fn should_scan_directory(&self, entry: &Entry) -> bool { (!entry.is_external && (!entry.is_ignored || entry.is_always_included)) - || entry.path.file_name() == Some(*DOT_GIT) - || entry.path.file_name() == Some(local_settings_folder_relative_path().as_os_str()) - || entry.path.file_name() == Some(local_vscode_folder_relative_path().as_os_str()) + || entry.path.file_name() == Some(DOT_GIT) + || entry.path.file_name() == Some(local_settings_folder_name()) + || entry.path.file_name() == Some(local_vscode_folder_name()) || self.scanned_dirs.contains(&entry.id) // If we've ever scanned it, keep scanning || self .paths_to_scan @@ -2965,6 +2672,7 @@ impl BackgroundScannerState { scan_queue: scan_job_tx.clone(), ancestor_inodes, is_external: entry.is_external, + is_hidden: entry.is_hidden, }) .unwrap(); } @@ -3004,14 +2712,14 @@ impl BackgroundScannerState { fn populate_dir( &mut self, - parent_path: &Arc, + parent_path: Arc, entries: impl IntoIterator, ignore: Option>, ) { let mut parent_entry = if let Some(parent_entry) = self .snapshot .entries_by_path - .get(&PathKey(parent_path.clone()), &()) + .get(&PathKey(parent_path.clone()), ()) { parent_entry.clone() } else { @@ -3029,7 +2737,12 @@ impl BackgroundScannerState { } if let Some(ignore) = ignore { - let abs_parent_path = self.snapshot.abs_path.as_path().join(parent_path).into(); + let abs_parent_path = self + .snapshot + .abs_path + .as_path() + .join(parent_path.as_std_path()) + .into(); self.snapshot .ignores_by_parent_abs_path .insert(abs_parent_path, (ignore, false)); @@ -3052,10 +2765,10 @@ impl BackgroundScannerState { self.snapshot .entries_by_path - .edit(entries_by_path_edits, &()); - self.snapshot.entries_by_id.edit(entries_by_id_edits, &()); + .edit(entries_by_path_edits, ()); + self.snapshot.entries_by_id.edit(entries_by_id_edits, ()); - if let Err(ix) = self.changed_paths.binary_search(parent_path) { + if let Err(ix) = self.changed_paths.binary_search(&parent_path) { self.changed_paths.insert(ix, parent_path.clone()); } @@ -3063,7 +2776,7 @@ impl BackgroundScannerState { self.snapshot.check_invariants(false); } - fn remove_path(&mut self, path: &Path) { + fn remove_path(&mut self, path: &RelPath) { log::trace!("background scanner removing path {path:?}"); let mut new_entries; let removed_entries; @@ -3071,15 +2784,15 @@ impl BackgroundScannerState { let mut cursor = self .snapshot .entries_by_path - .cursor::(&()); + .cursor::(()); new_entries = cursor.slice(&TraversalTarget::path(path), Bias::Left); removed_entries = cursor.slice(&TraversalTarget::successor(path), Bias::Left); - new_entries.append(cursor.suffix(), &()); + new_entries.append(cursor.suffix(), ()); } self.snapshot.entries_by_path = new_entries; let mut removed_ids = Vec::with_capacity(removed_entries.summary().count); - for entry in removed_entries.cursor::<()>(&()) { + for entry in removed_entries.cursor::<()>(()) { match self.removed_entries.entry(entry.inode) { hash_map::Entry::Occupied(mut e) => { let prev_removed_entry = e.get_mut(); @@ -3092,12 +2805,8 @@ impl BackgroundScannerState { } } - if entry.path.file_name() == Some(&GITIGNORE) { - let abs_parent_path = self - .snapshot - .abs_path - .as_path() - .join(entry.path.parent().unwrap()); + if entry.path.file_name() == Some(GITIGNORE) { + let abs_parent_path = self.snapshot.absolutize(&entry.path.parent().unwrap()); if let Some((_, needs_update)) = self .snapshot .ignores_by_parent_abs_path @@ -3112,10 +2821,9 @@ impl BackgroundScannerState { } } - self.snapshot.entries_by_id.edit( - removed_ids.iter().map(|&id| Edit::Remove(id)).collect(), - &(), - ); + self.snapshot + .entries_by_id + .edit(removed_ids.iter().map(|&id| Edit::Remove(id)).collect(), ()); self.snapshot .git_repositories .retain(|id, _| removed_ids.binary_search(id).is_err()); @@ -3126,14 +2834,17 @@ impl BackgroundScannerState { fn insert_git_repository( &mut self, - dot_git_path: Arc, + dot_git_path: Arc, fs: &dyn Fs, watcher: &dyn Watcher, ) { - let work_dir_path: Arc = match dot_git_path.parent() { + let work_dir_path: Arc = match dot_git_path.parent() { Some(parent_dir) => { // Guard against repositories inside the repository metadata - if parent_dir.iter().any(|component| component == *DOT_GIT) { + if parent_dir + .components() + .any(|component| component == DOT_GIT) + { log::debug!( "not building git repository for nested `.git` directory, `.git` path in the worktree: {dot_git_path:?}" ); @@ -3152,42 +2863,51 @@ impl BackgroundScannerState { } }; + let dot_git_abs_path = Arc::from(self.snapshot.absolutize(&dot_git_path).as_ref()); + self.insert_git_repository_for_path( WorkDirectory::InProject { relative_path: work_dir_path, }, - dot_git_path, + dot_git_abs_path, fs, watcher, - ); + ) + .log_err(); } fn insert_git_repository_for_path( &mut self, work_directory: WorkDirectory, - dot_git_path: Arc, + dot_git_abs_path: Arc, fs: &dyn Fs, watcher: &dyn Watcher, - ) -> Option { - let work_dir_entry = self.snapshot.entry_for_path(work_directory.path_key().0)?; - let work_directory_abs_path = self + ) -> Result { + let work_dir_entry = self .snapshot - .work_directory_abs_path(&work_directory) - .log_err()?; - - let dot_git_abs_path: Arc = self - .snapshot - .abs_path - .as_path() - .join(&dot_git_path) - .as_path() - .into(); + .entry_for_path(&work_directory.path_key().0) + .with_context(|| { + format!( + "working directory `{}` not indexed", + work_directory + .path_key() + .0 + .display(self.snapshot.path_style) + ) + })?; + let work_directory_abs_path = self.snapshot.work_directory_abs_path(&work_directory); let (repository_dir_abs_path, common_dir_abs_path) = discover_git_paths(&dot_git_abs_path, fs); - watcher.add(&common_dir_abs_path).log_err(); + watcher + .add(&common_dir_abs_path) + .context("failed to add common directory to watcher") + .log_err(); if !repository_dir_abs_path.starts_with(&common_dir_abs_path) { - watcher.add(&repository_dir_abs_path).log_err(); + watcher + .add(&repository_dir_abs_path) + .context("failed to add repository directory to watcher") + .log_err(); } let work_directory_id = work_dir_entry.id; @@ -3207,12 +2927,14 @@ impl BackgroundScannerState { .insert(work_directory_id, local_repository.clone()); log::trace!("inserting new local git repository"); - Some(local_repository) + Ok(local_repository) } } async fn is_git_dir(path: &Path, fs: &dyn Fs) -> bool { - if path.file_name() == Some(*DOT_GIT) { + if let Some(file_name) = path.file_name() + && file_name == DOT_GIT + { return true; } @@ -3228,7 +2950,10 @@ async fn is_git_dir(path: &Path, fs: &dyn Fs) -> bool { } async fn build_gitignore(abs_path: &Path, fs: &dyn Fs) -> Result { - let contents = fs.load(abs_path).await?; + let contents = fs + .load(abs_path) + .await + .with_context(|| format!("failed to load gitignore file at {}", abs_path.display()))?; let parent = abs_path.parent().unwrap_or_else(|| Path::new("/")); let mut builder = GitignoreBuilder::new(parent); for line in contents.lines() { @@ -3301,7 +3026,7 @@ impl fmt::Debug for Snapshot { #[derive(Debug, Clone, PartialEq)] pub struct File { pub worktree: Entity, - pub path: Arc, + pub path: Arc, pub disk_state: DiskState, pub entry_id: Option, pub is_local: bool, @@ -3317,7 +3042,7 @@ impl language::File for File { self.disk_state } - fn path(&self) -> &Arc { + fn path(&self) -> &Arc { &self.path } @@ -3327,10 +3052,10 @@ impl language::File for File { /// Returns the last component of this handle's absolute path. If this handle refers to the root /// of its worktree, then this method will return the name of the worktree itself. - fn file_name<'a>(&'a self, cx: &'a App) -> &'a OsStr { + fn file_name<'a>(&'a self, cx: &'a App) -> &'a str { self.path .file_name() - .unwrap_or_else(|| OsStr::new(&self.worktree.read(cx).root_name)) + .unwrap_or_else(|| self.worktree.read(cx).root_name_str()) } fn worktree_id(&self, cx: &App) -> WorktreeId { @@ -3350,30 +3075,29 @@ impl language::File for File { fn is_private(&self) -> bool { self.is_private } + + fn path_style(&self, cx: &App) -> PathStyle { + self.worktree.read(cx).path_style() + } } impl language::LocalFile for File { fn abs_path(&self, cx: &App) -> PathBuf { - let worktree_path = &self.worktree.read(cx).abs_path(); - if self.path.as_ref() == Path::new("") { - worktree_path.to_path_buf() - } else { - worktree_path.join(&self.path) - } + self.worktree.read(cx).absolutize(&self.path) } fn load(&self, cx: &App) -> Task> { let worktree = self.worktree.read(cx).as_local().unwrap(); let abs_path = worktree.absolutize(&self.path); let fs = worktree.fs.clone(); - cx.background_spawn(async move { fs.load(&abs_path?).await }) + cx.background_spawn(async move { fs.load(&abs_path).await }) } fn load_bytes(&self, cx: &App) -> Task>> { let worktree = self.worktree.read(cx).as_local().unwrap(); let abs_path = worktree.absolutize(&self.path); let fs = worktree.fs.clone(); - cx.background_spawn(async move { fs.load_bytes(&abs_path?).await }) + cx.background_spawn(async move { fs.load_bytes(&abs_path).await }) } } @@ -3415,7 +3139,7 @@ impl File { Ok(Self { worktree, - path: Arc::::from_proto(proto.path), + path: RelPath::from_proto(&proto.path).context("invalid path in file protobuf")?, disk_state, entry_id: proto.entry_id.map(ProjectEntryId::from_proto), is_local: false, @@ -3435,7 +3159,7 @@ impl File { self.worktree.read(cx).id() } - pub fn project_entry_id(&self, _: &App) -> Option { + pub fn project_entry_id(&self) -> Option { match self.disk_state { DiskState::Deleted => None, _ => self.entry_id, @@ -3447,7 +3171,7 @@ impl File { pub struct Entry { pub id: ProjectEntryId, pub kind: EntryKind, - pub path: Arc, + pub path: Arc, pub inode: u64, pub mtime: Option, @@ -3458,6 +3182,11 @@ pub struct Entry { /// exclude them from searches. pub is_ignored: bool, + /// Whether this entry is hidden or inside hidden directory. + /// + /// We only scan hidden entries once the directory is expanded. + pub is_hidden: bool, + /// Whether this entry is always included in searches. /// /// This is used for entries that are always included in searches, even @@ -3521,58 +3250,58 @@ pub struct UpdatedGitRepository { pub common_dir_abs_path: Option>, } -pub type UpdatedEntriesSet = Arc<[(Arc, ProjectEntryId, PathChange)]>; +pub type UpdatedEntriesSet = Arc<[(Arc, ProjectEntryId, PathChange)]>; pub type UpdatedGitRepositoriesSet = Arc<[UpdatedGitRepository]>; #[derive(Clone, Debug)] pub struct PathProgress<'a> { - pub max_path: &'a Path, + pub max_path: &'a RelPath, } #[derive(Clone, Debug)] pub struct PathSummary { - pub max_path: Arc, + pub max_path: Arc, pub item_summary: S, } impl Summary for PathSummary { - type Context = S::Context; + type Context<'a> = S::Context<'a>; - fn zero(cx: &Self::Context) -> Self { + fn zero(cx: Self::Context<'_>) -> Self { Self { - max_path: Path::new("").into(), + max_path: RelPath::empty().into(), item_summary: S::zero(cx), } } - fn add_summary(&mut self, rhs: &Self, cx: &Self::Context) { + fn add_summary(&mut self, rhs: &Self, cx: Self::Context<'_>) { self.max_path = rhs.max_path.clone(); self.item_summary.add_summary(&rhs.item_summary, cx); } } impl<'a, S: Summary> sum_tree::Dimension<'a, PathSummary> for PathProgress<'a> { - fn zero(_: & as Summary>::Context) -> Self { + fn zero(_: as Summary>::Context<'_>) -> Self { Self { - max_path: Path::new(""), + max_path: RelPath::empty(), } } fn add_summary( &mut self, summary: &'a PathSummary, - _: & as Summary>::Context, + _: as Summary>::Context<'_>, ) { self.max_path = summary.max_path.as_ref() } } impl<'a> sum_tree::Dimension<'a, PathSummary> for GitSummary { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a PathSummary, _: &()) { + fn add_summary(&mut self, summary: &'a PathSummary, _: ()) { *self += summary.item_summary } } @@ -3584,35 +3313,35 @@ impl<'a> fn cmp( &self, cursor_location: &Dimensions, GitSummary>, - _: &(), + _: (), ) -> Ordering { self.cmp_path(cursor_location.0.max_path) } } impl<'a, S: Summary> sum_tree::Dimension<'a, PathSummary> for PathKey { - fn zero(_: &S::Context) -> Self { + fn zero(_: S::Context<'_>) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a PathSummary, _: &S::Context) { + fn add_summary(&mut self, summary: &'a PathSummary, _: S::Context<'_>) { self.0 = summary.max_path.clone(); } } impl<'a, S: Summary> sum_tree::Dimension<'a, PathSummary> for TraversalProgress<'a> { - fn zero(_cx: &S::Context) -> Self { + fn zero(_cx: S::Context<'_>) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a PathSummary, _: &S::Context) { + fn add_summary(&mut self, summary: &'a PathSummary, _: S::Context<'_>) { self.max_path = summary.max_path.as_ref(); } } impl Entry { fn new( - path: Arc, + path: Arc, metadata: &fs::Metadata, next_entry_id: &AtomicUsize, root_char_bag: CharBag, @@ -3632,6 +3361,7 @@ impl Entry { size: metadata.len, canonical_path, is_ignored: false, + is_hidden: false, is_always_included: false, is_external: false, is_private: false, @@ -3673,7 +3403,7 @@ impl EntryKind { impl sum_tree::Item for Entry { type Summary = EntrySummary; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { let non_ignored_count = if (self.is_ignored || self.is_external) && !self.is_always_included { 0 @@ -3710,7 +3440,7 @@ impl sum_tree::KeyedItem for Entry { #[derive(Clone, Debug)] pub struct EntrySummary { - max_path: Arc, + max_path: Arc, count: usize, non_ignored_count: usize, file_count: usize, @@ -3720,7 +3450,7 @@ pub struct EntrySummary { impl Default for EntrySummary { fn default() -> Self { Self { - max_path: Arc::from(Path::new("")), + max_path: Arc::from(RelPath::empty()), count: 0, non_ignored_count: 0, file_count: 0, @@ -3729,14 +3459,12 @@ impl Default for EntrySummary { } } -impl sum_tree::Summary for EntrySummary { - type Context = (); - - fn zero(_cx: &()) -> Self { +impl sum_tree::ContextLessSummary for EntrySummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, rhs: &Self, _: &()) { + fn add_summary(&mut self, rhs: &Self) { self.max_path = rhs.max_path.clone(); self.count += rhs.count; self.non_ignored_count += rhs.non_ignored_count; @@ -3748,7 +3476,7 @@ impl sum_tree::Summary for EntrySummary { #[derive(Clone, Debug)] struct PathEntry { id: ProjectEntryId, - path: Arc, + path: Arc, is_ignored: bool, scan_id: usize, } @@ -3756,7 +3484,7 @@ struct PathEntry { impl sum_tree::Item for PathEntry { type Summary = PathEntrySummary; - fn summary(&self, _cx: &()) -> Self::Summary { + fn summary(&self, _cx: ()) -> Self::Summary { PathEntrySummary { max_id: self.id } } } @@ -3774,43 +3502,41 @@ struct PathEntrySummary { max_id: ProjectEntryId, } -impl sum_tree::Summary for PathEntrySummary { - type Context = (); - - fn zero(_cx: &Self::Context) -> Self { +impl sum_tree::ContextLessSummary for PathEntrySummary { + fn zero() -> Self { Default::default() } - fn add_summary(&mut self, summary: &Self, _: &Self::Context) { + fn add_summary(&mut self, summary: &Self) { self.max_id = summary.max_id; } } impl<'a> sum_tree::Dimension<'a, PathEntrySummary> for ProjectEntryId { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a PathEntrySummary, _: &()) { + fn add_summary(&mut self, summary: &'a PathEntrySummary, _: ()) { *self = summary.max_id; } } #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] -pub struct PathKey(pub Arc); +pub struct PathKey(pub Arc); impl Default for PathKey { fn default() -> Self { - Self(Path::new("").into()) + Self(RelPath::empty().into()) } } impl<'a> sum_tree::Dimension<'a, EntrySummary> for PathKey { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a EntrySummary, _: &()) { + fn add_summary(&mut self, summary: &'a EntrySummary, _: ()) { self.0 = summary.max_path.clone(); } } @@ -3850,36 +3576,39 @@ impl BackgroundScanner { .ignores_by_parent_abs_path .extend(ignores); let containing_git_repository = repo.and_then(|(ancestor_dot_git, work_directory)| { - self.state.lock().insert_git_repository_for_path( - work_directory, - ancestor_dot_git.as_path().into(), - self.fs.as_ref(), - self.watcher.as_ref(), - )?; + self.state + .lock() + .insert_git_repository_for_path( + work_directory, + ancestor_dot_git.clone().into(), + self.fs.as_ref(), + self.watcher.as_ref(), + ) + .log_err()?; Some(ancestor_dot_git) }); log::trace!("containing git repository: {containing_git_repository:?}"); - let global_gitignore_path = paths::global_gitignore_path(); - self.state.lock().snapshot.global_gitignore = - if let Some(global_gitignore_path) = global_gitignore_path.as_ref() { - build_gitignore(global_gitignore_path, self.fs.as_ref()) + let mut global_gitignore_events = + if let Some(global_gitignore_path) = &paths::global_gitignore_path() { + self.state.lock().snapshot.global_gitignore = + if self.fs.is_file(&global_gitignore_path).await { + build_gitignore(global_gitignore_path, self.fs.as_ref()) + .await + .ok() + .map(Arc::new) + } else { + None + }; + self.fs + .watch(global_gitignore_path, FS_WATCH_LATENCY) .await - .log_err() - .map(Arc::new) + .0 } else { - None + self.state.lock().snapshot.global_gitignore = None; + Box::pin(futures::stream::empty()) }; - let mut global_gitignore_events = if let Some(global_gitignore_path) = global_gitignore_path - { - self.fs - .watch(&global_gitignore_path, FS_WATCH_LATENCY) - .await - .0 - } else { - Box::pin(futures::stream::empty()) - }; let (scan_job_tx, scan_job_rx) = channel::unbounded(); { @@ -3895,12 +3624,14 @@ impl BackgroundScanner { root_entry.is_ignored = true; state.insert_entry(root_entry.clone(), self.fs.as_ref(), self.watcher.as_ref()); } - state.enqueue_scan_dir( - SanitizedPath::cast_arc(root_abs_path), - &root_entry, - &scan_job_tx, - self.fs.as_ref(), - ); + if root_entry.is_dir() { + state.enqueue_scan_dir( + root_abs_path.as_path().into(), + &root_entry, + &scan_job_tx, + self.fs.as_ref(), + ); + } } }; @@ -3922,8 +3653,14 @@ impl BackgroundScanner { while let Poll::Ready(Some(more_paths)) = futures::poll!(fs_events_rx.next()) { paths.extend(more_paths); } - self.process_events(paths.into_iter().map(Into::into).collect()) - .await; + self.process_events( + paths + .into_iter() + .filter(|e| e.kind.is_some()) + .map(Into::into) + .collect(), + ) + .await; } if let Some(abs_path) = containing_git_repository { self.process_events(vec![abs_path]).await; @@ -3953,7 +3690,7 @@ impl BackgroundScanner { { let mut state = self.state.lock(); state.path_prefixes_to_scan.insert(request.path.clone()); - state.snapshot.abs_path.as_path().join(&request.path) + state.snapshot.absolutize(&request.path) }; if let Some(abs_path) = self.fs.canonicalize(&abs_path).await.log_err() { @@ -3968,7 +3705,7 @@ impl BackgroundScanner { while let Poll::Ready(Some(more_paths)) = futures::poll!(fs_events_rx.next()) { paths.extend(more_paths); } - self.process_events(paths.into_iter().map(Into::into).collect()).await; + self.process_events(paths.into_iter().filter(|e| e.kind.is_some()).map(Into::into).collect()).await; } paths = global_gitignore_events.next().fuse() => { @@ -4003,7 +3740,7 @@ impl BackgroundScanner { .iter() .map(|path| { if path.file_name().is_some() { - root_canonical_path.as_path().join(path) + root_canonical_path.as_path().join(path.as_std_path()) } else { root_canonical_path.as_path().to_path_buf() } @@ -4047,26 +3784,26 @@ impl BackgroundScanner { .map(|path| SanitizedPath::new_arc(&path)) .filter(|new_path| *new_path != root_path); - if let Some(new_path) = new_path.as_ref() { + if let Some(new_path) = new_path { log::info!( "root renamed from {} to {}", root_path.as_path().display(), new_path.as_path().display() - ) + ); + self.status_updates_tx + .unbounded_send(ScanState::RootUpdated { new_path }) + .ok(); } else { log::warn!("root path could not be canonicalized: {}", err); } - self.status_updates_tx - .unbounded_send(ScanState::RootUpdated { new_path }) - .ok(); return; } }; // Certain directories may have FS changes, but do not lead to git data changes that Zed cares about. // Ignore these, to avoid Zed unnecessarily rescanning git metadata. - let skipped_files_in_dot_git = HashSet::from_iter([*COMMIT_MESSAGE, *INDEX_LOCK]); - let skipped_dirs_in_dot_git = [*FSMONITOR_DAEMON, *LFS_DIR]; + let skipped_files_in_dot_git = [COMMIT_MESSAGE, INDEX_LOCK]; + let skipped_dirs_in_dot_git = [FSMONITOR_DAEMON, LFS_DIR]; let mut relative_paths = Vec::with_capacity(abs_paths.len()); let mut dot_git_abs_paths = Vec::new(); @@ -4081,7 +3818,10 @@ impl BackgroundScanner { let dot_git_paths = abs_path.as_path().ancestors().find_map(|ancestor| { if smol::block_on(is_git_dir(ancestor, self.fs.as_ref())) { - let path_in_git_dir = abs_path.as_path().strip_prefix(ancestor).expect("stripping off the ancestor"); + let path_in_git_dir = abs_path + .as_path() + .strip_prefix(ancestor) + .expect("stripping off the ancestor"); Some((ancestor.to_owned(), path_in_git_dir.to_owned())) } else { None @@ -4089,7 +3829,13 @@ impl BackgroundScanner { }); if let Some((dot_git_abs_path, path_in_git_dir)) = dot_git_paths { - if skipped_files_in_dot_git.contains(path_in_git_dir.as_os_str()) || skipped_dirs_in_dot_git.iter().any(|skipped_git_subdir| path_in_git_dir.starts_with(skipped_git_subdir)) { + if skipped_files_in_dot_git + .iter() + .any(|skipped| OsStr::new(skipped) == path_in_git_dir.as_path().as_os_str()) + || skipped_dirs_in_dot_git.iter().any(|skipped_git_subdir| { + path_in_git_dir.starts_with(skipped_git_subdir) + }) + { log::debug!("ignoring event {abs_path:?} as it's in the .git directory among skipped files or directories"); return false; } @@ -4100,25 +3846,33 @@ impl BackgroundScanner { } } - let relative_path: Arc = - if let Ok(path) = abs_path.strip_prefix(&root_canonical_path) { - path.into() + let relative_path = if let Ok(path) = + abs_path.strip_prefix(&root_canonical_path) + && let Ok(path) = RelPath::new(path, PathStyle::local()) + { + path + } else { + if is_git_related { + log::debug!( + "ignoring event {abs_path:?}, since it's in git dir outside of root path {root_canonical_path:?}", + ); } else { - if is_git_related { - log::debug!( - "ignoring event {abs_path:?}, since it's in git dir outside of root path {root_canonical_path:?}", - ); - } else { - log::error!( - "ignoring event {abs_path:?} outside of root path {root_canonical_path:?}", - ); - } - return false; - }; + log::error!( + "ignoring event {abs_path:?} outside of root path {root_canonical_path:?}", + ); + } + return false; + }; - if abs_path.file_name() == Some(*GITIGNORE) { - for (_, repo) in snapshot.git_repositories.iter().filter(|(_, repo)| repo.directory_contains(&relative_path)) { - if !dot_git_abs_paths.iter().any(|dot_git_abs_path| dot_git_abs_path == repo.common_dir_abs_path.as_ref()) { + if abs_path.file_name() == Some(OsStr::new(GITIGNORE)) { + for (_, repo) in snapshot + .git_repositories + .iter() + .filter(|(_, repo)| repo.directory_contains(&relative_path)) + { + if !dot_git_abs_paths.iter().any(|dot_git_abs_path| { + dot_git_abs_path == repo.common_dir_abs_path.as_ref() + }) { dot_git_abs_paths.push(repo.common_dir_abs_path.to_path_buf()); } } @@ -4141,7 +3895,7 @@ impl BackgroundScanner { return false; } - relative_paths.push(relative_path); + relative_paths.push(relative_path.into_arc()); true } }); @@ -4215,7 +3969,7 @@ impl BackgroundScanner { self.send_status_update(false, SmallVec::new()); } - async fn forcibly_load_paths(&self, paths: &[Arc]) -> bool { + async fn forcibly_load_paths(&self, paths: &[Arc]) -> bool { let (scan_job_tx, scan_job_rx) = channel::unbounded(); { let mut state = self.state.lock(); @@ -4225,7 +3979,7 @@ impl BackgroundScanner { if let Some(entry) = state.snapshot.entry_for_path(ancestor) && entry.kind == EntryKind::UnloadedDir { - let abs_path = root_path.as_path().join(ancestor); + let abs_path = root_path.join(ancestor.as_std_path()); state.enqueue_scan_dir( abs_path.into(), entry, @@ -4304,7 +4058,7 @@ impl BackgroundScanner { job = scan_jobs_rx.recv().fuse() => { let Ok(job) = job else { break }; if let Err(err) = self.scan_dir(&job).await - && job.path.as_ref() != Path::new("") { + && job.path.is_empty() { log::error!("error scanning directory {:?}: {}", job.abs_path, err); } } @@ -4379,11 +4133,11 @@ impl BackgroundScanner { .await; // Ensure that .git and .gitignore are processed first. - swap_to_front(&mut child_paths, *GITIGNORE); - swap_to_front(&mut child_paths, *DOT_GIT); + swap_to_front(&mut child_paths, GITIGNORE); + swap_to_front(&mut child_paths, DOT_GIT); if let Some(path) = child_paths.first() - && path.ends_with(*DOT_GIT) + && path.ends_with(DOT_GIT) { ignore_stack.repo_root = Some(job.abs_path.clone()); } @@ -4391,16 +4145,21 @@ impl BackgroundScanner { for child_abs_path in child_paths { let child_abs_path: Arc = child_abs_path.into(); let child_name = child_abs_path.file_name().unwrap(); - let child_path: Arc = job.path.join(child_name).into(); + let Some(child_path) = child_name + .to_str() + .and_then(|name| Some(job.path.join(RelPath::unix(name).ok()?))) + else { + continue; + }; - if child_name == *DOT_GIT { + if child_name == DOT_GIT { let mut state = self.state.lock(); state.insert_git_repository( child_path.clone(), self.fs.as_ref(), self.watcher.as_ref(), ); - } else if child_name == *GITIGNORE { + } else if child_name == GITIGNORE { match build_gitignore(&child_abs_path, self.fs.as_ref()).await { Ok(ignore) => { let ignore = Arc::new(ignore); @@ -4471,6 +4230,11 @@ impl BackgroundScanner { child_entry.canonical_path = Some(canonical_path.into()); } + child_entry.is_hidden = job.is_hidden + || child_name + .to_str() + .map_or(false, |name| is_path_hidden(name)); + if child_entry.is_dir() { child_entry.is_ignored = ignore_stack.is_abs_path_ignored(&child_abs_path, true); child_entry.is_always_included = self.settings.is_path_always_included(&child_path); @@ -4486,6 +4250,7 @@ impl BackgroundScanner { abs_path: child_abs_path.clone(), path: child_path, is_external: child_entry.is_external, + is_hidden: child_entry.is_hidden, ignore_stack: if child_entry.is_ignored { IgnoreStack::all() } else { @@ -4501,7 +4266,9 @@ impl BackgroundScanner { } { - let relative_path = job.path.join(child_name); + let relative_path = job + .path + .join(RelPath::unix(child_name.to_str().unwrap()).unwrap()); if self.is_path_private(&relative_path) { log::debug!("detected private file: {relative_path:?}"); child_entry.is_private = true; @@ -4534,7 +4301,7 @@ impl BackgroundScanner { } } - state.populate_dir(&job.path, new_entries, new_ignore); + state.populate_dir(job.path.clone(), new_entries, new_ignore); self.watcher.add(job.abs_path.as_ref()).log_err(); for new_job in new_jobs.into_iter().flatten() { @@ -4551,7 +4318,7 @@ impl BackgroundScanner { &self, root_abs_path: &SanitizedPath, root_canonical_path: &SanitizedPath, - relative_paths: &[Arc], + relative_paths: &[Arc], abs_paths: Vec, scan_queue_tx: Option>, ) { @@ -4587,10 +4354,7 @@ impl BackgroundScanner { ) .await; - let mut new_ancestor_repo = if relative_paths - .iter() - .any(|path| path.as_ref() == Path::new("")) - { + let mut new_ancestor_repo = if relative_paths.iter().any(|path| path.is_empty()) { Some(discover_ancestor_git_repo(self.fs.clone(), &root_abs_path).await) } else { None @@ -4610,7 +4374,7 @@ impl BackgroundScanner { } for (path, metadata) in relative_paths.iter().zip(metadata.into_iter()) { - let abs_path: Arc = root_abs_path.as_path().join(path).into(); + let abs_path: Arc = root_abs_path.join(path.as_std_path()).into(); match metadata { Ok(Some((metadata, canonical_path))) => { let ignore_stack = state.snapshot.ignore_stack_for_abs_path( @@ -4637,10 +4401,17 @@ impl BackgroundScanner { fs_entry.is_private = self.is_path_private(path); fs_entry.is_always_included = self.settings.is_path_always_included(path); + let parent_is_hidden = path + .parent() + .and_then(|parent| state.snapshot.entry_for_path(parent)) + .map_or(false, |parent_entry| parent_entry.is_hidden); + fs_entry.is_hidden = parent_is_hidden + || path.file_name().map_or(false, |name| is_path_hidden(name)); + if let (Some(scan_queue_tx), true) = (&scan_queue_tx, is_dir) { if state.should_scan_directory(&fs_entry) - || (fs_entry.path.as_os_str().is_empty() - && abs_path.file_name() == Some(*DOT_GIT)) + || (fs_entry.path.is_empty() + && abs_path.file_name() == Some(OsStr::new(DOT_GIT))) { state.enqueue_scan_dir( abs_path, @@ -4655,23 +4426,25 @@ impl BackgroundScanner { state.insert_entry(fs_entry.clone(), self.fs.as_ref(), self.watcher.as_ref()); - if path.as_ref() == Path::new("") + if path.is_empty() && let Some((ignores, repo)) = new_ancestor_repo.take() { log::trace!("updating ancestor git repository"); state.snapshot.ignores_by_parent_abs_path.extend(ignores); if let Some((ancestor_dot_git, work_directory)) = repo { - state.insert_git_repository_for_path( - work_directory, - ancestor_dot_git.as_path().into(), - self.fs.as_ref(), - self.watcher.as_ref(), - ); + state + .insert_git_repository_for_path( + work_directory, + ancestor_dot_git.into(), + self.fs.as_ref(), + self.watcher.as_ref(), + ) + .log_err(); } } } Ok(None) => { - self.remove_repo_path(path, &mut state.snapshot); + self.remove_repo_path(path.clone(), &mut state.snapshot); } Err(err) => { log::error!("error reading file {abs_path:?} on event: {err:#}"); @@ -4687,11 +4460,9 @@ impl BackgroundScanner { ); } - fn remove_repo_path(&self, path: &Arc, snapshot: &mut LocalSnapshot) -> Option<()> { - if !path - .components() - .any(|component| component.as_os_str() == *DOT_GIT) - && let Some(local_repo) = snapshot.local_repo_for_work_directory_path(path) + fn remove_repo_path(&self, path: Arc, snapshot: &mut LocalSnapshot) -> Option<()> { + if !path.components().any(|component| component == DOT_GIT) + && let Some(local_repo) = snapshot.local_repo_for_work_directory_path(&path) { let id = local_repo.work_directory_id; log::debug!("remove repo path: {:?}", path); @@ -4760,16 +4531,19 @@ impl BackgroundScanner { snapshot .ignores_by_parent_abs_path .retain(|parent_abs_path, (_, needs_update)| { - if let Ok(parent_path) = parent_abs_path.strip_prefix(abs_path.as_path()) { + if let Ok(parent_path) = parent_abs_path.strip_prefix(abs_path.as_path()) + && let Some(parent_path) = + RelPath::new(&parent_path, PathStyle::local()).log_err() + { if *needs_update { *needs_update = false; - if snapshot.snapshot.entry_for_path(parent_path).is_some() { + if snapshot.snapshot.entry_for_path(&parent_path).is_some() { ignores_to_update.push(parent_abs_path.clone()); } } - let ignore_path = parent_path.join(*GITIGNORE); - if snapshot.snapshot.entry_for_path(ignore_path).is_none() { + let ignore_path = parent_path.join(RelPath::unix(GITIGNORE).unwrap()); + if snapshot.snapshot.entry_for_path(&ignore_path).is_none() { return false; } } @@ -4812,20 +4586,34 @@ impl BackgroundScanner { let mut entries_by_id_edits = Vec::new(); let mut entries_by_path_edits = Vec::new(); - let path = job + let Some(path) = job .abs_path .strip_prefix(snapshot.abs_path.as_path()) - .unwrap(); + .map_err(|_| { + anyhow::anyhow!( + "Failed to strip prefix '{}' from path '{}'", + snapshot.abs_path.as_path().display(), + job.abs_path.display() + ) + }) + .log_err() + else { + return; + }; - if let Ok(Some(metadata)) = smol::block_on(self.fs.metadata(&job.abs_path.join(*DOT_GIT))) + let Some(path) = RelPath::new(&path, PathStyle::local()).log_err() else { + return; + }; + + if let Ok(Some(metadata)) = smol::block_on(self.fs.metadata(&job.abs_path.join(DOT_GIT))) && metadata.is_dir { ignore_stack.repo_root = Some(job.abs_path.clone()); } - for mut entry in snapshot.child_entries(path).cloned() { + for mut entry in snapshot.child_entries(&path).cloned() { let was_ignored = entry.is_ignored; - let abs_path: Arc = snapshot.abs_path().join(&entry.path).into(); + let abs_path: Arc = snapshot.absolutize(&entry.path).into(); entry.is_ignored = ignore_stack.is_abs_path_ignored(&abs_path, entry.is_dir()); if entry.is_dir() { @@ -4860,7 +4648,7 @@ impl BackgroundScanner { } if entry.is_ignored != was_ignored { - let mut path_entry = snapshot.entries_by_id.get(&entry.id, &()).unwrap().clone(); + let mut path_entry = snapshot.entries_by_id.get(&entry.id, ()).unwrap().clone(); path_entry.scan_id = snapshot.scan_id; path_entry.is_ignored = entry.is_ignored; entries_by_id_edits.push(Edit::Insert(path_entry)); @@ -4880,8 +4668,8 @@ impl BackgroundScanner { state .snapshot .entries_by_path - .edit(entries_by_path_edits, &()); - state.snapshot.entries_by_id.edit(entries_by_id_edits, &()); + .edit(entries_by_path_edits, ()); + state.snapshot.entries_by_id.edit(entries_by_id_edits, ()); } fn update_git_repositories(&self, dot_git_paths: Vec) -> Vec> { @@ -4917,7 +4705,9 @@ impl BackgroundScanner { }; affected_repo_roots.push(dot_git_dir.parent().unwrap().into()); state.insert_git_repository( - relative.into(), + RelPath::new(relative, PathStyle::local()) + .unwrap() + .into_arc(), self.fs.as_ref(), self.watcher.as_ref(), ); @@ -4937,9 +4727,14 @@ impl BackgroundScanner { let snapshot = &mut state.snapshot; let mut ids_to_preserve = HashSet::default(); for (&work_directory_id, entry) in snapshot.git_repositories.iter() { - let exists_in_snapshot = snapshot - .entry_for_id(work_directory_id) - .is_some_and(|entry| snapshot.entry_for_path(entry.path.join(*DOT_GIT)).is_some()); + let exists_in_snapshot = + snapshot + .entry_for_id(work_directory_id) + .is_some_and(|entry| { + snapshot + .entry_for_path(&entry.path.join(RelPath::unix(DOT_GIT).unwrap())) + .is_some() + }); if exists_in_snapshot || matches!( @@ -4977,7 +4772,7 @@ impl BackgroundScanner { smol::Timer::after(FS_WATCH_LATENCY).await; } - fn is_path_private(&self, path: &Path) -> bool { + fn is_path_private(&self, path: &RelPath) -> bool { !self.share_private_files && self.settings.is_path_private(path) } @@ -5005,14 +4800,13 @@ async fn discover_ancestor_git_repo( // Unless $HOME is itself the worktree root, don't consider it as a // containing git repository---expensive and likely unwanted. break; - } else if let Ok(ignore) = - build_gitignore(&ancestor.join(*GITIGNORE), fs.as_ref()).await + } else if let Ok(ignore) = build_gitignore(&ancestor.join(GITIGNORE), fs.as_ref()).await { ignores.insert(ancestor.into(), (ignore.into(), false)); } } - let ancestor_dot_git = ancestor.join(*DOT_GIT); + let ancestor_dot_git = ancestor.join(DOT_GIT); log::trace!("considering ancestor: {ancestor_dot_git:?}"); // Check whether the directory or file called `.git` exists (in the // case of worktrees it's a file.) @@ -5057,7 +4851,7 @@ fn build_diff( phase: BackgroundScannerPhase, old_snapshot: &Snapshot, new_snapshot: &Snapshot, - event_paths: &[Arc], + event_paths: &[Arc], ) -> UpdatedEntriesSet { use BackgroundScannerPhase::*; use PathChange::{Added, AddedOrUpdated, Loaded, Removed, Updated}; @@ -5065,8 +4859,8 @@ fn build_diff( // Identify which paths have changed. Use the known set of changed // parent paths to optimize the search. let mut changes = Vec::new(); - let mut old_paths = old_snapshot.entries_by_path.cursor::(&()); - let mut new_paths = new_snapshot.entries_by_path.cursor::(&()); + let mut old_paths = old_snapshot.entries_by_path.cursor::(()); + let mut new_paths = new_snapshot.entries_by_path.cursor::(()); let mut last_newly_loaded_dir_path = None; old_paths.next(); new_paths.next(); @@ -5159,7 +4953,7 @@ fn build_diff( changes.into() } -fn swap_to_front(child_paths: &mut Vec, file: &OsStr) { +fn swap_to_front(child_paths: &mut Vec, file: &str) { let position = child_paths .iter() .position(|path| path.file_name().unwrap() == file); @@ -5169,24 +4963,25 @@ fn swap_to_front(child_paths: &mut Vec, file: &OsStr) { } } -fn char_bag_for_path(root_char_bag: CharBag, path: &Path) -> CharBag { +fn char_bag_for_path(root_char_bag: CharBag, path: &RelPath) -> CharBag { let mut result = root_char_bag; - result.extend( - path.to_string_lossy() - .chars() - .map(|c| c.to_ascii_lowercase()), - ); + result.extend(path.as_unix_str().chars().map(|c| c.to_ascii_lowercase())); result } +fn is_path_hidden(name: &str) -> bool { + name.starts_with('.') +} + #[derive(Debug)] struct ScanJob { abs_path: Arc, - path: Arc, + path: Arc, ignore_stack: IgnoreStack, scan_queue: Sender, ancestor_inodes: TreeSet, is_external: bool, + is_hidden: bool, } struct UpdateIgnoreStatusJob { @@ -5227,7 +5022,7 @@ impl WorktreeModelHandle for Entity { let tree = self.clone(); let (fs, root_path) = self.read_with(cx, |tree, _| { let tree = tree.as_local().unwrap(); - (tree.fs.clone(), tree.abs_path().clone()) + (tree.fs.clone(), tree.abs_path.clone()) }); async move { @@ -5237,7 +5032,10 @@ impl WorktreeModelHandle for Entity { let mut events = cx.events(&tree); while events.next().await.is_some() { - if tree.read_with(cx, |tree, _| tree.entry_for_path(file_name).is_some()) { + if tree.read_with(cx, |tree, _| { + tree.entry_for_path(RelPath::unix(file_name).unwrap()) + .is_some() + }) { break; } } @@ -5246,7 +5044,10 @@ impl WorktreeModelHandle for Entity { .await .unwrap(); while events.next().await.is_some() { - if tree.read_with(cx, |tree, _| tree.entry_for_path(file_name).is_none()) { + if tree.read_with(cx, |tree, _| { + tree.entry_for_path(RelPath::unix(file_name).unwrap()) + .is_none() + }) { break; } } @@ -5333,7 +5134,7 @@ impl WorktreeModelHandle for Entity { #[derive(Clone, Debug)] struct TraversalProgress<'a> { - max_path: &'a Path, + max_path: &'a RelPath, count: usize, non_ignored_count: usize, file_count: usize, @@ -5355,11 +5156,11 @@ impl TraversalProgress<'_> { } impl<'a> sum_tree::Dimension<'a, EntrySummary> for TraversalProgress<'a> { - fn zero(_cx: &()) -> Self { + fn zero(_cx: ()) -> Self { Default::default() } - fn add_summary(&mut self, summary: &'a EntrySummary, _: &()) { + fn add_summary(&mut self, summary: &'a EntrySummary, _: ()) { self.max_path = summary.max_path.as_ref(); self.count += summary.count; self.non_ignored_count += summary.non_ignored_count; @@ -5371,7 +5172,7 @@ impl<'a> sum_tree::Dimension<'a, EntrySummary> for TraversalProgress<'a> { impl Default for TraversalProgress<'_> { fn default() -> Self { Self { - max_path: Path::new(""), + max_path: RelPath::empty(), count: 0, non_ignored_count: 0, file_count: 0, @@ -5383,7 +5184,7 @@ impl Default for TraversalProgress<'_> { #[derive(Debug)] pub struct Traversal<'a> { snapshot: &'a Snapshot, - cursor: sum_tree::Cursor<'a, Entry, TraversalProgress<'a>>, + cursor: sum_tree::Cursor<'a, 'static, Entry, TraversalProgress<'a>>, include_ignored: bool, include_files: bool, include_dirs: bool, @@ -5395,9 +5196,9 @@ impl<'a> Traversal<'a> { include_files: bool, include_dirs: bool, include_ignored: bool, - start_path: &Path, + start_path: &RelPath, ) -> Self { - let mut cursor = snapshot.entries_by_path.cursor(&()); + let mut cursor = snapshot.entries_by_path.cursor(()); cursor.seek(&TraversalTarget::path(start_path), Bias::Left); let mut traversal = Self { snapshot, @@ -5487,12 +5288,12 @@ impl<'a> Iterator for Traversal<'a> { #[derive(Debug, Clone, Copy)] pub enum PathTarget<'a> { - Path(&'a Path), - Successor(&'a Path), + Path(&'a RelPath), + Successor(&'a RelPath), } impl PathTarget<'_> { - fn cmp_path(&self, other: &Path) -> Ordering { + fn cmp_path(&self, other: &RelPath) -> Ordering { match self { PathTarget::Path(path) => path.cmp(&other), PathTarget::Successor(path) => { @@ -5507,13 +5308,13 @@ impl PathTarget<'_> { } impl<'a, S: Summary> SeekTarget<'a, PathSummary, PathProgress<'a>> for PathTarget<'_> { - fn cmp(&self, cursor_location: &PathProgress<'a>, _: &S::Context) -> Ordering { + fn cmp(&self, cursor_location: &PathProgress<'a>, _: S::Context<'_>) -> Ordering { self.cmp_path(cursor_location.max_path) } } impl<'a, S: Summary> SeekTarget<'a, PathSummary, TraversalProgress<'a>> for PathTarget<'_> { - fn cmp(&self, cursor_location: &TraversalProgress<'a>, _: &S::Context) -> Ordering { + fn cmp(&self, cursor_location: &TraversalProgress<'a>, _: S::Context<'_>) -> Ordering { self.cmp_path(cursor_location.max_path) } } @@ -5530,11 +5331,11 @@ enum TraversalTarget<'a> { } impl<'a> TraversalTarget<'a> { - fn path(path: &'a Path) -> Self { + fn path(path: &'a RelPath) -> Self { Self::Path(PathTarget::Path(path)) } - fn successor(path: &'a Path) -> Self { + fn successor(path: &'a RelPath) -> Self { Self::Path(PathTarget::Successor(path)) } @@ -5555,13 +5356,15 @@ impl<'a> TraversalTarget<'a> { } impl<'a> SeekTarget<'a, EntrySummary, TraversalProgress<'a>> for TraversalTarget<'_> { - fn cmp(&self, cursor_location: &TraversalProgress<'a>, _: &()) -> Ordering { + fn cmp(&self, cursor_location: &TraversalProgress<'a>, _: ()) -> Ordering { self.cmp_progress(cursor_location) } } -impl<'a> SeekTarget<'a, PathSummary<&'static ()>, TraversalProgress<'a>> for TraversalTarget<'_> { - fn cmp(&self, cursor_location: &TraversalProgress<'a>, _: &()) -> Ordering { +impl<'a> SeekTarget<'a, PathSummary, TraversalProgress<'a>> + for TraversalTarget<'_> +{ + fn cmp(&self, cursor_location: &TraversalProgress<'a>, _: ()) -> Ordering { self.cmp_progress(cursor_location) } } @@ -5573,7 +5376,7 @@ pub struct ChildEntriesOptions { } pub struct ChildEntriesIter<'a> { - parent_path: &'a Path, + parent_path: &'a RelPath, traversal: Traversal<'a>, } @@ -5600,22 +5403,23 @@ impl<'a> From<&'a Entry> for proto::Entry { inode: entry.inode, mtime: entry.mtime.map(|time| time.into()), is_ignored: entry.is_ignored, + is_hidden: entry.is_hidden, is_external: entry.is_external, is_fifo: entry.is_fifo, size: Some(entry.size), canonical_path: entry .canonical_path .as_ref() - .map(|path| path.as_ref().to_proto()), + .map(|path| path.to_string_lossy().into_owned()), } } } -impl<'a> TryFrom<(&'a CharBag, &PathMatcher, proto::Entry)> for Entry { +impl TryFrom<(&CharBag, &PathMatcher, proto::Entry)> for Entry { type Error = anyhow::Error; fn try_from( - (root_char_bag, always_included, entry): (&'a CharBag, &PathMatcher, proto::Entry), + (root_char_bag, always_included, entry): (&CharBag, &PathMatcher, proto::Entry), ) -> Result { let kind = if entry.is_dir { EntryKind::Dir @@ -5623,9 +5427,10 @@ impl<'a> TryFrom<(&'a CharBag, &PathMatcher, proto::Entry)> for Entry { EntryKind::File }; - let path = Arc::::from_proto(entry.path); + let path = + RelPath::from_proto(&entry.path).context("invalid relative path in proto message")?; let char_bag = char_bag_for_path(*root_char_bag, &path); - let is_always_included = always_included.is_match(path.as_ref()); + let is_always_included = always_included.is_match(path.as_std_path()); Ok(Entry { id: ProjectEntryId::from_proto(entry.id), kind, @@ -5635,8 +5440,9 @@ impl<'a> TryFrom<(&'a CharBag, &PathMatcher, proto::Entry)> for Entry { size: entry.size.unwrap_or(0), canonical_path: entry .canonical_path - .map(|path_string| Arc::from(PathBuf::from_proto(path_string))), + .map(|path_string| Arc::from(PathBuf::from(path_string))), is_ignored: entry.is_ignored, + is_hidden: entry.is_hidden, is_always_included, is_external: entry.is_external, is_private: false, diff --git a/crates/worktree/src/worktree_settings.rs b/crates/worktree/src/worktree_settings.rs index ca7714fa7315117a5c2e31b06d2f059ad43cb1a9..a9fcbf0909617986dd2d1d816ed513dd281f2940 100644 --- a/crates/worktree/src/worktree_settings.rs +++ b/crates/worktree/src/worktree_settings.rs @@ -1,11 +1,12 @@ use std::path::Path; use anyhow::Context as _; -use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; -use util::paths::PathMatcher; +use settings::{Settings, SettingsContent}; +use util::{ + ResultExt, + paths::{PathMatcher, PathStyle}, + rel_path::RelPath, +}; #[derive(Clone, PartialEq, Eq)] pub struct WorktreeSettings { @@ -16,73 +17,29 @@ pub struct WorktreeSettings { } impl WorktreeSettings { - pub fn is_path_private(&self, path: &Path) -> bool { + pub fn is_path_private(&self, path: &RelPath) -> bool { path.ancestors() - .any(|ancestor| self.private_files.is_match(ancestor)) + .any(|ancestor| self.private_files.is_match(ancestor.as_std_path())) } - pub fn is_path_excluded(&self, path: &Path) -> bool { + pub fn is_path_excluded(&self, path: &RelPath) -> bool { path.ancestors() - .any(|ancestor| self.file_scan_exclusions.is_match(&ancestor)) + .any(|ancestor| self.file_scan_exclusions.is_match(ancestor.as_std_path())) } - pub fn is_path_always_included(&self, path: &Path) -> bool { + pub fn is_path_always_included(&self, path: &RelPath) -> bool { path.ancestors() - .any(|ancestor| self.file_scan_inclusions.is_match(&ancestor)) + .any(|ancestor| self.file_scan_inclusions.is_match(ancestor.as_std_path())) } } -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] -pub struct WorktreeSettingsContent { - /// The displayed name of this project. If not set, the root directory name - /// will be displayed. - /// - /// Default: none - #[serde(default)] - pub project_name: Option, - - /// Completely ignore files matching globs from `file_scan_exclusions`. Overrides - /// `file_scan_inclusions`. - /// - /// Default: [ - /// "**/.git", - /// "**/.svn", - /// "**/.hg", - /// "**/.jj", - /// "**/CVS", - /// "**/.DS_Store", - /// "**/Thumbs.db", - /// "**/.classpath", - /// "**/.settings" - /// ] - #[serde(default)] - pub file_scan_exclusions: Option>, - - /// Always include files that match these globs when scanning for files, even if they're - /// ignored by git. This setting is overridden by `file_scan_exclusions`. - /// Default: [ - /// ".env*", - /// "docker-compose.*.yml", - /// ] - #[serde(default)] - pub file_scan_inclusions: Option>, - - /// Treat the files matching these globs as `.env` files. - /// Default: [ "**/.env*" ] - pub private_files: Option>, -} - impl Settings for WorktreeSettings { - type FileContent = WorktreeSettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> anyhow::Result { - let result: WorktreeSettingsContent = sources.json_merge()?; - let mut file_scan_exclusions = result.file_scan_exclusions.unwrap_or_default(); - let mut private_files = result.private_files.unwrap_or_default(); - let mut parsed_file_scan_inclusions: Vec = result - .file_scan_inclusions - .unwrap_or_default() + fn from_settings(content: &settings::SettingsContent) -> Self { + let worktree = content.project.worktree.clone(); + let file_scan_exclusions = worktree.file_scan_exclusions.unwrap(); + let file_scan_inclusions = worktree.file_scan_inclusions.unwrap(); + let private_files = worktree.private_files.unwrap().0; + let parsed_file_scan_inclusions: Vec = file_scan_inclusions .iter() .flat_map(|glob| { Path::new(glob) @@ -91,30 +48,33 @@ impl Settings for WorktreeSettings { }) .filter(|p: &String| !p.is_empty()) .collect(); - file_scan_exclusions.sort(); - private_files.sort(); - parsed_file_scan_inclusions.sort(); - Ok(Self { - file_scan_exclusions: path_matchers(&file_scan_exclusions, "file_scan_exclusions")?, - private_files: path_matchers(&private_files, "private_files")?, + + Self { + project_name: worktree.project_name.filter(|p| !p.is_empty()), + file_scan_exclusions: path_matchers(file_scan_exclusions, "file_scan_exclusions") + .log_err() + .unwrap_or_default(), file_scan_inclusions: path_matchers( - &parsed_file_scan_inclusions, + parsed_file_scan_inclusions, "file_scan_inclusions", - )?, - project_name: result.project_name, - }) + ) + .unwrap(), + private_files: path_matchers(private_files, "private_files") + .log_err() + .unwrap_or_default(), + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { + fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut SettingsContent) { if let Some(inclusions) = vscode .read_value("files.watcherInclude") .and_then(|v| v.as_array()) .and_then(|v| v.iter().map(|n| n.as_str().map(str::to_owned)).collect()) { - if let Some(old) = current.file_scan_inclusions.as_mut() { + if let Some(old) = current.project.worktree.file_scan_inclusions.as_mut() { old.extend(inclusions) } else { - current.file_scan_inclusions = Some(inclusions) + current.project.worktree.file_scan_inclusions = Some(inclusions) } } if let Some(exclusions) = vscode @@ -122,15 +82,17 @@ impl Settings for WorktreeSettings { .and_then(|v| v.as_array()) .and_then(|v| v.iter().map(|n| n.as_str().map(str::to_owned)).collect()) { - if let Some(old) = current.file_scan_exclusions.as_mut() { + if let Some(old) = current.project.worktree.file_scan_exclusions.as_mut() { old.extend(exclusions) } else { - current.file_scan_exclusions = Some(exclusions) + current.project.worktree.file_scan_exclusions = Some(exclusions) } } } } -fn path_matchers(values: &[String], context: &'static str) -> anyhow::Result { - PathMatcher::new(values).with_context(|| format!("Failed to parse globs from {}", context)) +fn path_matchers(mut values: Vec, context: &'static str) -> anyhow::Result { + values.sort(); + PathMatcher::new(values, PathStyle::local()) + .with_context(|| format!("Failed to parse globs from {}", context)) } diff --git a/crates/worktree/src/worktree_tests.rs b/crates/worktree/src/worktree_tests.rs index 796840367a0dca717fda7f3973eb8bcc17dc5f57..3c39d5c3ad70563f8f954ee9908c27cef17a752c 100644 --- a/crates/worktree/src/worktree_tests.rs +++ b/crates/worktree/src/worktree_tests.rs @@ -1,5 +1,5 @@ use crate::{ - Entry, EntryKind, Event, PathChange, WorkDirectory, Worktree, WorktreeModelHandle, + Entry, EntryKind, Event, PathChange, Worktree, WorktreeModelHandle, worktree_settings::WorktreeSettings, }; use anyhow::Result; @@ -20,7 +20,11 @@ use std::{ path::{Path, PathBuf}, sync::Arc, }; -use util::{ResultExt, path, test::TempTree}; +use util::{ + ResultExt, path, + rel_path::{RelPath, rel_path}, + test::TempTree, +}; #[gpui::test] async fn test_traversal(cx: &mut TestAppContext) { @@ -56,10 +60,10 @@ async fn test_traversal(cx: &mut TestAppContext) { .map(|entry| entry.path.as_ref()) .collect::>(), vec![ - Path::new(""), - Path::new(".gitignore"), - Path::new("a"), - Path::new("a/c"), + rel_path(""), + rel_path(".gitignore"), + rel_path("a"), + rel_path("a/c"), ] ); assert_eq!( @@ -67,11 +71,11 @@ async fn test_traversal(cx: &mut TestAppContext) { .map(|entry| entry.path.as_ref()) .collect::>(), vec![ - Path::new(""), - Path::new(".gitignore"), - Path::new("a"), - Path::new("a/b"), - Path::new("a/c"), + rel_path(""), + rel_path(".gitignore"), + rel_path("a"), + rel_path("a/b"), + rel_path("a/c"), ] ); }) @@ -121,14 +125,14 @@ async fn test_circular_symlinks(cx: &mut TestAppContext) { .map(|entry| entry.path.as_ref()) .collect::>(), vec![ - Path::new(""), - Path::new("lib"), - Path::new("lib/a"), - Path::new("lib/a/a.txt"), - Path::new("lib/a/lib"), - Path::new("lib/b"), - Path::new("lib/b/b.txt"), - Path::new("lib/b/lib"), + rel_path(""), + rel_path("lib"), + rel_path("lib/a"), + rel_path("lib/a/a.txt"), + rel_path("lib/a/lib"), + rel_path("lib/b"), + rel_path("lib/b/b.txt"), + rel_path("lib/b/lib"), ] ); }); @@ -147,14 +151,14 @@ async fn test_circular_symlinks(cx: &mut TestAppContext) { .map(|entry| entry.path.as_ref()) .collect::>(), vec![ - Path::new(""), - Path::new("lib"), - Path::new("lib/a"), - Path::new("lib/a/a.txt"), - Path::new("lib/a/lib-2"), - Path::new("lib/b"), - Path::new("lib/b/b.txt"), - Path::new("lib/b/lib"), + rel_path(""), + rel_path("lib"), + rel_path("lib/a"), + rel_path("lib/a/a.txt"), + rel_path("lib/a/lib-2"), + rel_path("lib/b"), + rel_path("lib/b/b.txt"), + rel_path("lib/b/lib"), ] ); }); @@ -236,18 +240,18 @@ async fn test_symlinks_pointing_outside(cx: &mut TestAppContext) { .map(|entry| (entry.path.as_ref(), entry.is_external)) .collect::>(), vec![ - (Path::new(""), false), - (Path::new("deps"), false), - (Path::new("deps/dep-dir2"), true), - (Path::new("deps/dep-dir3"), true), - (Path::new("src"), false), - (Path::new("src/a.rs"), false), - (Path::new("src/b.rs"), false), + (rel_path(""), false), + (rel_path("deps"), false), + (rel_path("deps/dep-dir2"), true), + (rel_path("deps/dep-dir3"), true), + (rel_path("src"), false), + (rel_path("src/a.rs"), false), + (rel_path("src/b.rs"), false), ] ); assert_eq!( - tree.entry_for_path("deps/dep-dir2").unwrap().kind, + tree.entry_for_path(rel_path("deps/dep-dir2")).unwrap().kind, EntryKind::UnloadedDir ); }); @@ -256,7 +260,7 @@ async fn test_symlinks_pointing_outside(cx: &mut TestAppContext) { tree.read_with(cx, |tree, _| { tree.as_local() .unwrap() - .refresh_entries_for_paths(vec![Path::new("deps/dep-dir3").into()]) + .refresh_entries_for_paths(vec![rel_path("deps/dep-dir3").into()]) }) .recv() .await; @@ -269,24 +273,24 @@ async fn test_symlinks_pointing_outside(cx: &mut TestAppContext) { .map(|entry| (entry.path.as_ref(), entry.is_external)) .collect::>(), vec![ - (Path::new(""), false), - (Path::new("deps"), false), - (Path::new("deps/dep-dir2"), true), - (Path::new("deps/dep-dir3"), true), - (Path::new("deps/dep-dir3/deps"), true), - (Path::new("deps/dep-dir3/src"), true), - (Path::new("src"), false), - (Path::new("src/a.rs"), false), - (Path::new("src/b.rs"), false), + (rel_path(""), false), + (rel_path("deps"), false), + (rel_path("deps/dep-dir2"), true), + (rel_path("deps/dep-dir3"), true), + (rel_path("deps/dep-dir3/deps"), true), + (rel_path("deps/dep-dir3/src"), true), + (rel_path("src"), false), + (rel_path("src/a.rs"), false), + (rel_path("src/b.rs"), false), ] ); }); assert_eq!( mem::take(&mut *tree_updates.lock()), &[ - (Path::new("deps/dep-dir3").into(), PathChange::Loaded), - (Path::new("deps/dep-dir3/deps").into(), PathChange::Loaded), - (Path::new("deps/dep-dir3/src").into(), PathChange::Loaded) + (rel_path("deps/dep-dir3").into(), PathChange::Loaded), + (rel_path("deps/dep-dir3/deps").into(), PathChange::Loaded), + (rel_path("deps/dep-dir3/src").into(), PathChange::Loaded) ] ); @@ -294,7 +298,7 @@ async fn test_symlinks_pointing_outside(cx: &mut TestAppContext) { tree.read_with(cx, |tree, _| { tree.as_local() .unwrap() - .refresh_entries_for_paths(vec![Path::new("deps/dep-dir3/src").into()]) + .refresh_entries_for_paths(vec![rel_path("deps/dep-dir3/src").into()]) }) .recv() .await; @@ -306,17 +310,17 @@ async fn test_symlinks_pointing_outside(cx: &mut TestAppContext) { .map(|entry| (entry.path.as_ref(), entry.is_external)) .collect::>(), vec![ - (Path::new(""), false), - (Path::new("deps"), false), - (Path::new("deps/dep-dir2"), true), - (Path::new("deps/dep-dir3"), true), - (Path::new("deps/dep-dir3/deps"), true), - (Path::new("deps/dep-dir3/src"), true), - (Path::new("deps/dep-dir3/src/e.rs"), true), - (Path::new("deps/dep-dir3/src/f.rs"), true), - (Path::new("src"), false), - (Path::new("src/a.rs"), false), - (Path::new("src/b.rs"), false), + (rel_path(""), false), + (rel_path("deps"), false), + (rel_path("deps/dep-dir2"), true), + (rel_path("deps/dep-dir3"), true), + (rel_path("deps/dep-dir3/deps"), true), + (rel_path("deps/dep-dir3/src"), true), + (rel_path("deps/dep-dir3/src/e.rs"), true), + (rel_path("deps/dep-dir3/src/f.rs"), true), + (rel_path("src"), false), + (rel_path("src/a.rs"), false), + (rel_path("src/b.rs"), false), ] ); }); @@ -324,13 +328,13 @@ async fn test_symlinks_pointing_outside(cx: &mut TestAppContext) { assert_eq!( mem::take(&mut *tree_updates.lock()), &[ - (Path::new("deps/dep-dir3/src").into(), PathChange::Loaded), + (rel_path("deps/dep-dir3/src").into(), PathChange::Loaded), ( - Path::new("deps/dep-dir3/src/e.rs").into(), + rel_path("deps/dep-dir3/src/e.rs").into(), PathChange::Loaded ), ( - Path::new("deps/dep-dir3/src/f.rs").into(), + rel_path("deps/dep-dir3/src/f.rs").into(), PathChange::Loaded ) ] @@ -368,7 +372,7 @@ async fn test_renaming_case_only(cx: &mut TestAppContext) { tree.entries(true, 0) .map(|entry| entry.path.as_ref()) .collect::>(), - vec![Path::new(""), Path::new(OLD_NAME)] + vec![rel_path(""), rel_path(OLD_NAME)] ); }); @@ -390,7 +394,7 @@ async fn test_renaming_case_only(cx: &mut TestAppContext) { tree.entries(true, 0) .map(|entry| entry.path.as_ref()) .collect::>(), - vec![Path::new(""), Path::new(NEW_NAME)] + vec![rel_path(""), rel_path(NEW_NAME)] ); }); } @@ -446,13 +450,13 @@ async fn test_open_gitignored_files(cx: &mut TestAppContext) { .map(|entry| (entry.path.as_ref(), entry.is_ignored)) .collect::>(), vec![ - (Path::new(""), false), - (Path::new(".gitignore"), false), - (Path::new("one"), false), - (Path::new("one/node_modules"), true), - (Path::new("two"), false), - (Path::new("two/x.js"), false), - (Path::new("two/y.js"), false), + (rel_path(""), false), + (rel_path(".gitignore"), false), + (rel_path("one"), false), + (rel_path("one/node_modules"), true), + (rel_path("two"), false), + (rel_path("two/x.js"), false), + (rel_path("two/y.js"), false), ] ); }); @@ -462,7 +466,7 @@ async fn test_open_gitignored_files(cx: &mut TestAppContext) { let prev_read_dir_count = fs.read_dir_call_count(); let loaded = tree .update(cx, |tree, cx| { - tree.load_file("one/node_modules/b/b1.js".as_ref(), cx) + tree.load_file(rel_path("one/node_modules/b/b1.js"), cx) }) .await .unwrap(); @@ -473,24 +477,24 @@ async fn test_open_gitignored_files(cx: &mut TestAppContext) { .map(|entry| (entry.path.as_ref(), entry.is_ignored)) .collect::>(), vec![ - (Path::new(""), false), - (Path::new(".gitignore"), false), - (Path::new("one"), false), - (Path::new("one/node_modules"), true), - (Path::new("one/node_modules/a"), true), - (Path::new("one/node_modules/b"), true), - (Path::new("one/node_modules/b/b1.js"), true), - (Path::new("one/node_modules/b/b2.js"), true), - (Path::new("one/node_modules/c"), true), - (Path::new("two"), false), - (Path::new("two/x.js"), false), - (Path::new("two/y.js"), false), + (rel_path(""), false), + (rel_path(".gitignore"), false), + (rel_path("one"), false), + (rel_path("one/node_modules"), true), + (rel_path("one/node_modules/a"), true), + (rel_path("one/node_modules/b"), true), + (rel_path("one/node_modules/b/b1.js"), true), + (rel_path("one/node_modules/b/b2.js"), true), + (rel_path("one/node_modules/c"), true), + (rel_path("two"), false), + (rel_path("two/x.js"), false), + (rel_path("two/y.js"), false), ] ); assert_eq!( loaded.file.path.as_ref(), - Path::new("one/node_modules/b/b1.js") + rel_path("one/node_modules/b/b1.js") ); // Only the newly-expanded directories are scanned. @@ -502,7 +506,7 @@ async fn test_open_gitignored_files(cx: &mut TestAppContext) { let prev_read_dir_count = fs.read_dir_call_count(); let loaded = tree .update(cx, |tree, cx| { - tree.load_file("one/node_modules/a/a2.js".as_ref(), cx) + tree.load_file(rel_path("one/node_modules/a/a2.js"), cx) }) .await .unwrap(); @@ -513,26 +517,26 @@ async fn test_open_gitignored_files(cx: &mut TestAppContext) { .map(|entry| (entry.path.as_ref(), entry.is_ignored)) .collect::>(), vec![ - (Path::new(""), false), - (Path::new(".gitignore"), false), - (Path::new("one"), false), - (Path::new("one/node_modules"), true), - (Path::new("one/node_modules/a"), true), - (Path::new("one/node_modules/a/a1.js"), true), - (Path::new("one/node_modules/a/a2.js"), true), - (Path::new("one/node_modules/b"), true), - (Path::new("one/node_modules/b/b1.js"), true), - (Path::new("one/node_modules/b/b2.js"), true), - (Path::new("one/node_modules/c"), true), - (Path::new("two"), false), - (Path::new("two/x.js"), false), - (Path::new("two/y.js"), false), + (rel_path(""), false), + (rel_path(".gitignore"), false), + (rel_path("one"), false), + (rel_path("one/node_modules"), true), + (rel_path("one/node_modules/a"), true), + (rel_path("one/node_modules/a/a1.js"), true), + (rel_path("one/node_modules/a/a2.js"), true), + (rel_path("one/node_modules/b"), true), + (rel_path("one/node_modules/b/b1.js"), true), + (rel_path("one/node_modules/b/b2.js"), true), + (rel_path("one/node_modules/c"), true), + (rel_path("two"), false), + (rel_path("two/x.js"), false), + (rel_path("two/y.js"), false), ] ); assert_eq!( loaded.file.path.as_ref(), - Path::new("one/node_modules/a/a2.js") + rel_path("one/node_modules/a/a2.js") ); // Only the newly-expanded directory is scanned. @@ -610,7 +614,7 @@ async fn test_dirs_no_longer_ignored(cx: &mut TestAppContext) { tree.read_with(cx, |tree, _| { tree.as_local() .unwrap() - .refresh_entries_for_paths(vec![Path::new("node_modules/d/d.js").into()]) + .refresh_entries_for_paths(vec![rel_path("node_modules/d/d.js").into()]) }) .recv() .await; @@ -622,18 +626,18 @@ async fn test_dirs_no_longer_ignored(cx: &mut TestAppContext) { .map(|e| (e.path.as_ref(), e.is_ignored)) .collect::>(), &[ - (Path::new(""), false), - (Path::new(".gitignore"), false), - (Path::new("a"), false), - (Path::new("a/a.js"), false), - (Path::new("b"), false), - (Path::new("b/b.js"), false), - (Path::new("node_modules"), true), - (Path::new("node_modules/c"), true), - (Path::new("node_modules/d"), true), - (Path::new("node_modules/d/d.js"), true), - (Path::new("node_modules/d/e"), true), - (Path::new("node_modules/d/f"), true), + (rel_path(""), false), + (rel_path(".gitignore"), false), + (rel_path("a"), false), + (rel_path("a/a.js"), false), + (rel_path("b"), false), + (rel_path("b/b.js"), false), + (rel_path("node_modules"), true), + (rel_path("node_modules/c"), true), + (rel_path("node_modules/d"), true), + (rel_path("node_modules/d/d.js"), true), + (rel_path("node_modules/d/e"), true), + (rel_path("node_modules/d/f"), true), ] ); }); @@ -654,23 +658,23 @@ async fn test_dirs_no_longer_ignored(cx: &mut TestAppContext) { .map(|e| (e.path.as_ref(), e.is_ignored)) .collect::>(), &[ - (Path::new(""), false), - (Path::new(".gitignore"), false), - (Path::new("a"), false), - (Path::new("a/a.js"), false), - (Path::new("b"), false), - (Path::new("b/b.js"), false), + (rel_path(""), false), + (rel_path(".gitignore"), false), + (rel_path("a"), false), + (rel_path("a/a.js"), false), + (rel_path("b"), false), + (rel_path("b/b.js"), false), // This directory is no longer ignored - (Path::new("node_modules"), false), - (Path::new("node_modules/c"), false), - (Path::new("node_modules/c/c.js"), false), - (Path::new("node_modules/d"), false), - (Path::new("node_modules/d/d.js"), false), + (rel_path("node_modules"), false), + (rel_path("node_modules/c"), false), + (rel_path("node_modules/c/c.js"), false), + (rel_path("node_modules/d"), false), + (rel_path("node_modules/d/d.js"), false), // This subdirectory is now ignored - (Path::new("node_modules/d/e"), true), - (Path::new("node_modules/d/f"), false), - (Path::new("node_modules/d/f/f1.js"), false), - (Path::new("node_modules/d/f/f2.js"), false), + (rel_path("node_modules/d/e"), true), + (rel_path("node_modules/d/f"), false), + (rel_path("node_modules/d/f/f1.js"), false), + (rel_path("node_modules/d/f/f2.js"), false), ] ); }); @@ -711,7 +715,7 @@ async fn test_write_file(cx: &mut TestAppContext) { worktree .update(cx, |tree, cx| { tree.write_file( - Path::new("tracked-dir/file.txt"), + rel_path("tracked-dir/file.txt").into(), "hello".into(), Default::default(), cx, @@ -722,7 +726,7 @@ async fn test_write_file(cx: &mut TestAppContext) { worktree .update(cx, |tree, cx| { tree.write_file( - Path::new("ignored-dir/file.txt"), + rel_path("ignored-dir/file.txt").into(), "world".into(), Default::default(), cx, @@ -732,8 +736,12 @@ async fn test_write_file(cx: &mut TestAppContext) { .unwrap(); worktree.read_with(cx, |tree, _| { - let tracked = tree.entry_for_path("tracked-dir/file.txt").unwrap(); - let ignored = tree.entry_for_path("ignored-dir/file.txt").unwrap(); + let tracked = tree + .entry_for_path(rel_path("tracked-dir/file.txt")) + .unwrap(); + let ignored = tree + .entry_for_path(rel_path("ignored-dir/file.txt")) + .unwrap(); assert!(!tracked.is_ignored); assert!(ignored.is_ignored); }); @@ -770,9 +778,9 @@ async fn test_file_scan_inclusions(cx: &mut TestAppContext) { })); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = Some(vec![]); - project_settings.file_scan_inclusions = Some(vec![ + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![]); + settings.project.worktree.file_scan_inclusions = Some(vec![ "node_modules/**/package.json".to_string(), "**/.DS_Store".to_string(), ]); @@ -836,9 +844,11 @@ async fn test_file_scan_exclusions_overrules_inclusions(cx: &mut TestAppContext) cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = Some(vec!["**/.DS_Store".to_string()]); - project_settings.file_scan_inclusions = Some(vec!["**/.DS_Store".to_string()]); + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = + Some(vec!["**/.DS_Store".to_string()]); + settings.project.worktree.file_scan_inclusions = + Some(vec!["**/.DS_Store".to_string()]); }); }); }); @@ -894,9 +904,10 @@ async fn test_file_scan_inclusions_reindexes_on_setting_change(cx: &mut TestAppC cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = Some(vec![]); - project_settings.file_scan_inclusions = Some(vec!["node_modules/**".to_string()]); + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![]); + settings.project.worktree.file_scan_inclusions = + Some(vec!["node_modules/**".to_string()]); }); }); }); @@ -915,20 +926,20 @@ async fn test_file_scan_inclusions_reindexes_on_setting_change(cx: &mut TestAppC tree.read_with(cx, |tree, _| { assert!( - tree.entry_for_path("node_modules") + tree.entry_for_path(rel_path("node_modules")) .is_some_and(|f| f.is_always_included) ); assert!( - tree.entry_for_path("node_modules/prettier/package.json") + tree.entry_for_path(rel_path("node_modules/prettier/package.json")) .is_some_and(|f| f.is_always_included) ); }); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = Some(vec![]); - project_settings.file_scan_inclusions = Some(vec![]); + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![]); + settings.project.worktree.file_scan_inclusions = Some(vec![]); }); }); }); @@ -938,11 +949,11 @@ async fn test_file_scan_inclusions_reindexes_on_setting_change(cx: &mut TestAppC tree.read_with(cx, |tree, _| { assert!( - tree.entry_for_path("node_modules") + tree.entry_for_path(rel_path("node_modules")) .is_some_and(|f| !f.is_always_included) ); assert!( - tree.entry_for_path("node_modules/prettier/package.json") + tree.entry_for_path(rel_path("node_modules/prettier/package.json")) .is_some_and(|f| !f.is_always_included) ); }); @@ -978,8 +989,8 @@ async fn test_file_scan_exclusions(cx: &mut TestAppContext) { })); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/foo/**".to_string(), "**/.DS_Store".to_string()]); }); }); @@ -1015,8 +1026,8 @@ async fn test_file_scan_exclusions(cx: &mut TestAppContext) { cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec!["**/node_modules/**".to_string()]); }); }); @@ -1080,8 +1091,8 @@ async fn test_fs_events_in_exclusions(cx: &mut TestAppContext) { })); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = Some(vec![ + store.update_user_settings(cx, |settings| { + settings.project.worktree.file_scan_exclusions = Some(vec![ "**/.git".to_string(), "node_modules/".to_string(), "build_output".to_string(), @@ -1258,8 +1269,7 @@ async fn test_create_directory_during_initial_scan(cx: &mut TestAppContext) { move |update| { snapshot .lock() - .apply_remote_update(update, &settings.file_scan_inclusions) - .unwrap(); + .apply_remote_update(update, &settings.file_scan_inclusions); async { true } } }); @@ -1270,7 +1280,7 @@ async fn test_create_directory_during_initial_scan(cx: &mut TestAppContext) { .update(cx, |tree, cx| { tree.as_local_mut() .unwrap() - .create_entry("a/e".as_ref(), true, None, cx) + .create_entry(rel_path("a/e").into(), true, None, cx) }) .await .unwrap() @@ -1280,7 +1290,10 @@ async fn test_create_directory_during_initial_scan(cx: &mut TestAppContext) { cx.executor().run_until_parked(); tree.read_with(cx, |tree, _| { - assert_eq!(tree.entry_for_path("a/e").unwrap().kind, EntryKind::Dir); + assert_eq!( + tree.entry_for_path(rel_path("a/e")).unwrap().kind, + EntryKind::Dir + ); }); let snapshot2 = tree.update(cx, |tree, _| tree.as_local().unwrap().snapshot()); @@ -1317,9 +1330,12 @@ async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { let entry = tree_fake .update(cx, |tree, cx| { - tree.as_local_mut() - .unwrap() - .create_entry("a/b/c/d.txt".as_ref(), false, None, cx) + tree.as_local_mut().unwrap().create_entry( + rel_path("a/b/c/d.txt").into(), + false, + None, + cx, + ) }) .await .unwrap() @@ -1329,9 +1345,13 @@ async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { cx.executor().run_until_parked(); tree_fake.read_with(cx, |tree, _| { - assert!(tree.entry_for_path("a/b/c/d.txt").unwrap().is_file()); - assert!(tree.entry_for_path("a/b/c/").unwrap().is_dir()); - assert!(tree.entry_for_path("a/b/").unwrap().is_dir()); + assert!( + tree.entry_for_path(rel_path("a/b/c/d.txt")) + .unwrap() + .is_file() + ); + assert!(tree.entry_for_path(rel_path("a/b/c")).unwrap().is_dir()); + assert!(tree.entry_for_path(rel_path("a/b")).unwrap().is_dir()); }); let fs_real = Arc::new(RealFs::new(None, cx.executor())); @@ -1351,9 +1371,12 @@ async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { let entry = tree_real .update(cx, |tree, cx| { - tree.as_local_mut() - .unwrap() - .create_entry("a/b/c/d.txt".as_ref(), false, None, cx) + tree.as_local_mut().unwrap().create_entry( + rel_path("a/b/c/d.txt").into(), + false, + None, + cx, + ) }) .await .unwrap() @@ -1363,17 +1386,24 @@ async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { cx.executor().run_until_parked(); tree_real.read_with(cx, |tree, _| { - assert!(tree.entry_for_path("a/b/c/d.txt").unwrap().is_file()); - assert!(tree.entry_for_path("a/b/c/").unwrap().is_dir()); - assert!(tree.entry_for_path("a/b/").unwrap().is_dir()); + assert!( + tree.entry_for_path(rel_path("a/b/c/d.txt")) + .unwrap() + .is_file() + ); + assert!(tree.entry_for_path(rel_path("a/b/c")).unwrap().is_dir()); + assert!(tree.entry_for_path(rel_path("a/b")).unwrap().is_dir()); }); // Test smallest change let entry = tree_real .update(cx, |tree, cx| { - tree.as_local_mut() - .unwrap() - .create_entry("a/b/c/e.txt".as_ref(), false, None, cx) + tree.as_local_mut().unwrap().create_entry( + rel_path("a/b/c/e.txt").into(), + false, + None, + cx, + ) }) .await .unwrap() @@ -1383,15 +1413,22 @@ async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { cx.executor().run_until_parked(); tree_real.read_with(cx, |tree, _| { - assert!(tree.entry_for_path("a/b/c/e.txt").unwrap().is_file()); + assert!( + tree.entry_for_path(rel_path("a/b/c/e.txt")) + .unwrap() + .is_file() + ); }); // Test largest change let entry = tree_real .update(cx, |tree, cx| { - tree.as_local_mut() - .unwrap() - .create_entry("d/e/f/g.txt".as_ref(), false, None, cx) + tree.as_local_mut().unwrap().create_entry( + rel_path("d/e/f/g.txt").into(), + false, + None, + cx, + ) }) .await .unwrap() @@ -1401,10 +1438,14 @@ async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { cx.executor().run_until_parked(); tree_real.read_with(cx, |tree, _| { - assert!(tree.entry_for_path("d/e/f/g.txt").unwrap().is_file()); - assert!(tree.entry_for_path("d/e/f").unwrap().is_dir()); - assert!(tree.entry_for_path("d/e/").unwrap().is_dir()); - assert!(tree.entry_for_path("d/").unwrap().is_dir()); + assert!( + tree.entry_for_path(rel_path("d/e/f/g.txt")) + .unwrap() + .is_file() + ); + assert!(tree.entry_for_path(rel_path("d/e/f")).unwrap().is_dir()); + assert!(tree.entry_for_path(rel_path("d/e")).unwrap().is_dir()); + assert!(tree.entry_for_path(rel_path("d")).unwrap().is_dir()); }); } @@ -1489,8 +1530,7 @@ async fn test_random_worktree_operations_during_initial_scan( for update in updates.lock().iter() { if update.scan_id >= updated_snapshot.scan_id() as u64 { updated_snapshot - .apply_remote_update(update.clone(), &settings.file_scan_inclusions) - .unwrap(); + .apply_remote_update(update.clone(), &settings.file_scan_inclusions); } } @@ -1625,9 +1665,7 @@ async fn test_random_worktree_changes(cx: &mut TestAppContext, mut rng: StdRng) for (i, mut prev_snapshot) in snapshots.into_iter().enumerate().rev() { for update in updates.lock().iter() { if update.scan_id >= prev_snapshot.scan_id() as u64 { - prev_snapshot - .apply_remote_update(update.clone(), &settings.file_scan_inclusions) - .unwrap(); + prev_snapshot.apply_remote_update(update.clone(), &settings.file_scan_inclusions); } } @@ -1702,37 +1740,13 @@ fn randomly_mutate_worktree( let entry = snapshot.entries(false, 0).choose(rng).unwrap(); match rng.random_range(0_u32..100) { - 0..=33 if entry.path.as_ref() != Path::new("") => { + 0..=33 if entry.path.as_ref() != RelPath::empty() => { log::info!("deleting entry {:?} ({})", entry.path, entry.id.0); worktree.delete_entry(entry.id, false, cx).unwrap() } - ..=66 if entry.path.as_ref() != Path::new("") => { - let other_entry = snapshot.entries(false, 0).choose(rng).unwrap(); - let new_parent_path = if other_entry.is_dir() { - other_entry.path.clone() - } else { - other_entry.path.parent().unwrap().into() - }; - let mut new_path = new_parent_path.join(random_filename(rng)); - if new_path.starts_with(&entry.path) { - new_path = random_filename(rng).into(); - } - - log::info!( - "renaming entry {:?} ({}) to {:?}", - entry.path, - entry.id.0, - new_path - ); - let task = worktree.rename_entry(entry.id, new_path, cx); - cx.background_spawn(async move { - task.await?.into_included().unwrap(); - Ok(()) - }) - } _ => { if entry.is_dir() { - let child_path = entry.path.join(random_filename(rng)); + let child_path = entry.path.join(rel_path(&random_filename(rng))); let is_dir = rng.random_bool(0.3); log::info!( "creating {} at {:?}", @@ -1745,7 +1759,7 @@ fn randomly_mutate_worktree( Ok(()) }) } else { - log::info!("overwriting file {:?} ({})", entry.path, entry.id.0); + log::info!("overwriting file {:?} ({})", &entry.path, entry.id.0); let task = worktree.write_file(entry.path.clone(), "".into(), Default::default(), cx); cx.background_spawn(async move { @@ -1795,7 +1809,7 @@ async fn randomly_mutate_fs( } } else if rng.random_bool(0.05) { let ignore_dir_path = dirs.choose(rng).unwrap(); - let ignore_path = ignore_dir_path.join(*GITIGNORE); + let ignore_path = ignore_dir_path.join(GITIGNORE); let subdirs = dirs .iter() @@ -1924,101 +1938,6 @@ fn random_filename(rng: &mut impl Rng) -> String { .collect() } -#[gpui::test] -async fn test_rename_file_to_new_directory(cx: &mut TestAppContext) { - init_test(cx); - let fs = FakeFs::new(cx.background_executor.clone()); - let expected_contents = "content"; - fs.as_fake() - .insert_tree( - "/root", - json!({ - "test.txt": expected_contents - }), - ) - .await; - let worktree = Worktree::local( - Path::new("/root"), - true, - fs.clone(), - Arc::default(), - &mut cx.to_async(), - ) - .await - .unwrap(); - cx.read(|cx| worktree.read(cx).as_local().unwrap().scan_complete()) - .await; - - let entry_id = worktree.read_with(cx, |worktree, _| { - worktree.entry_for_path("test.txt").unwrap().id - }); - let _result = worktree - .update(cx, |worktree, cx| { - worktree.rename_entry(entry_id, Path::new("dir1/dir2/dir3/test.txt"), cx) - }) - .await - .unwrap(); - worktree.read_with(cx, |worktree, _| { - assert!( - worktree.entry_for_path("test.txt").is_none(), - "Old file should have been removed" - ); - assert!( - worktree.entry_for_path("dir1/dir2/dir3/test.txt").is_some(), - "Whole directory hierarchy and the new file should have been created" - ); - }); - assert_eq!( - worktree - .update(cx, |worktree, cx| { - worktree.load_file("dir1/dir2/dir3/test.txt".as_ref(), cx) - }) - .await - .unwrap() - .text, - expected_contents, - "Moved file's contents should be preserved" - ); - - let entry_id = worktree.read_with(cx, |worktree, _| { - worktree - .entry_for_path("dir1/dir2/dir3/test.txt") - .unwrap() - .id - }); - let _result = worktree - .update(cx, |worktree, cx| { - worktree.rename_entry(entry_id, Path::new("dir1/dir2/test.txt"), cx) - }) - .await - .unwrap(); - worktree.read_with(cx, |worktree, _| { - assert!( - worktree.entry_for_path("test.txt").is_none(), - "First file should not reappear" - ); - assert!( - worktree.entry_for_path("dir1/dir2/dir3/test.txt").is_none(), - "Old file should have been removed" - ); - assert!( - worktree.entry_for_path("dir1/dir2/test.txt").is_some(), - "No error should have occurred after moving into existing directory" - ); - }); - assert_eq!( - worktree - .update(cx, |worktree, cx| { - worktree.load_file("dir1/dir2/test.txt".as_ref(), cx) - }) - .await - .unwrap() - .text, - expected_contents, - "Moved file's contents should be preserved" - ); -} - #[gpui::test] async fn test_private_single_file_worktree(cx: &mut TestAppContext) { init_test(cx); @@ -2037,48 +1956,11 @@ async fn test_private_single_file_worktree(cx: &mut TestAppContext) { cx.read(|cx| tree.read(cx).as_local().unwrap().scan_complete()) .await; tree.read_with(cx, |tree, _| { - let entry = tree.entry_for_path("").unwrap(); + let entry = tree.entry_for_path(rel_path("")).unwrap(); assert!(entry.is_private); }); } -#[gpui::test] -fn test_unrelativize() { - let work_directory = WorkDirectory::in_project(""); - pretty_assertions::assert_eq!( - work_directory.try_unrelativize(&"crates/gpui/gpui.rs".into()), - Some(Path::new("crates/gpui/gpui.rs").into()) - ); - - let work_directory = WorkDirectory::in_project("vendor/some-submodule"); - pretty_assertions::assert_eq!( - work_directory.try_unrelativize(&"src/thing.c".into()), - Some(Path::new("vendor/some-submodule/src/thing.c").into()) - ); - - let work_directory = WorkDirectory::AboveProject { - absolute_path: Path::new("/projects/zed").into(), - location_in_repo: Path::new("crates/gpui").into(), - }; - - pretty_assertions::assert_eq!( - work_directory.try_unrelativize(&"crates/util/util.rs".into()), - None, - ); - - pretty_assertions::assert_eq!( - work_directory.unrelativize(&"crates/util/util.rs".into()), - Path::new("../util/util.rs").into() - ); - - pretty_assertions::assert_eq!(work_directory.try_unrelativize(&"README.md".into()), None,); - - pretty_assertions::assert_eq!( - work_directory.unrelativize(&"README.md".into()), - Path::new("../../README.md").into() - ); -} - #[gpui::test] async fn test_repository_above_root(executor: BackgroundExecutor, cx: &mut TestAppContext) { init_test(cx); @@ -2260,7 +2142,7 @@ fn check_worktree_entries( expected_included_paths: &[&str], ) { for path in expected_excluded_paths { - let entry = tree.entry_for_path(path); + let entry = tree.entry_for_path(rel_path(path)); assert!( entry.is_none(), "expected path '{path}' to be excluded, but got entry: {entry:?}", @@ -2268,7 +2150,7 @@ fn check_worktree_entries( } for path in expected_ignored_paths { let entry = tree - .entry_for_path(path) + .entry_for_path(rel_path(path)) .unwrap_or_else(|| panic!("Missing entry for expected ignored path '{path}'")); assert!( entry.is_ignored, @@ -2277,7 +2159,7 @@ fn check_worktree_entries( } for path in expected_tracked_paths { let entry = tree - .entry_for_path(path) + .entry_for_path(rel_path(path)) .unwrap_or_else(|| panic!("Missing entry for expected tracked path '{path}'")); assert!( !entry.is_ignored || entry.is_always_included, @@ -2286,7 +2168,7 @@ fn check_worktree_entries( } for path in expected_included_paths { let entry = tree - .entry_for_path(path) + .entry_for_path(rel_path(path)) .unwrap_or_else(|| panic!("Missing entry for expected included path '{path}'")); assert!( entry.is_always_included, diff --git a/crates/x_ai/src/x_ai.rs b/crates/x_ai/src/x_ai.rs index 50f8681c31b5c95d2fc74351416512cbb539252f..aac231b511684db9e2bfc36c822a963e5f231161 100644 --- a/crates/x_ai/src/x_ai.rs +++ b/crates/x_ai/src/x_ai.rs @@ -18,9 +18,19 @@ pub enum Model { Grok3Fast, #[serde(rename = "grok-3-mini-fast-latest")] Grok3MiniFast, - #[serde(rename = "grok-4-latest")] + #[serde(rename = "grok-4", alias = "grok-4-latest")] Grok4, - #[serde(rename = "grok-code-fast-1")] + #[serde( + rename = "grok-4-fast-reasoning", + alias = "grok-4-fast-reasoning-latest" + )] + Grok4FastReasoning, + #[serde( + rename = "grok-4-fast-non-reasoning", + alias = "grok-4-fast-non-reasoning-latest" + )] + Grok4FastNonReasoning, + #[serde(rename = "grok-code-fast-1", alias = "grok-code-fast-1-0825")] GrokCodeFast1, #[serde(rename = "custom")] Custom { @@ -30,6 +40,9 @@ pub enum Model { max_tokens: u64, max_output_tokens: Option, max_completion_tokens: Option, + supports_images: Option, + supports_tools: Option, + parallel_tool_calls: Option, }, } @@ -40,6 +53,9 @@ impl Model { pub fn from_id(id: &str) -> Result { match id { + "grok-4" => Ok(Self::Grok4), + "grok-4-fast-reasoning" => Ok(Self::Grok4FastReasoning), + "grok-4-fast-non-reasoning" => Ok(Self::Grok4FastNonReasoning), "grok-2-vision" => Ok(Self::Grok2Vision), "grok-3" => Ok(Self::Grok3), "grok-3-mini" => Ok(Self::Grok3Mini), @@ -58,6 +74,8 @@ impl Model { Self::Grok3Fast => "grok-3-fast", Self::Grok3MiniFast => "grok-3-mini-fast", Self::Grok4 => "grok-4", + Self::Grok4FastReasoning => "grok-4-fast-reasoning", + Self::Grok4FastNonReasoning => "grok-4-fast-non-reasoning", Self::GrokCodeFast1 => "grok-code-fast-1", Self::Custom { name, .. } => name, } @@ -71,6 +89,8 @@ impl Model { Self::Grok3Fast => "Grok 3 Fast", Self::Grok3MiniFast => "Grok 3 Mini Fast", Self::Grok4 => "Grok 4", + Self::Grok4FastReasoning => "Grok 4 Fast", + Self::Grok4FastNonReasoning => "Grok 4 Fast (Non-Reasoning)", Self::GrokCodeFast1 => "Grok Code Fast 1", Self::Custom { name, display_name, .. @@ -82,6 +102,7 @@ impl Model { match self { Self::Grok3 | Self::Grok3Mini | Self::Grok3Fast | Self::Grok3MiniFast => 131_072, Self::Grok4 | Self::GrokCodeFast1 => 256_000, + Self::Grok4FastReasoning | Self::Grok4FastNonReasoning => 128_000, Self::Grok2Vision => 8_192, Self::Custom { max_tokens, .. } => *max_tokens, } @@ -90,7 +111,10 @@ impl Model { pub fn max_output_tokens(&self) -> Option { match self { Self::Grok3 | Self::Grok3Mini | Self::Grok3Fast | Self::Grok3MiniFast => Some(8_192), - Self::Grok4 | Self::GrokCodeFast1 => Some(64_000), + Self::Grok4 + | Self::Grok4FastReasoning + | Self::Grok4FastNonReasoning + | Self::GrokCodeFast1 => Some(64_000), Self::Grok2Vision => Some(4_096), Self::Custom { max_output_tokens, .. @@ -105,7 +129,13 @@ impl Model { | Self::Grok3Mini | Self::Grok3Fast | Self::Grok3MiniFast - | Self::Grok4 => true, + | Self::Grok4 + | Self::Grok4FastReasoning + | Self::Grok4FastNonReasoning => true, + Self::Custom { + parallel_tool_calls: Some(support), + .. + } => *support, Self::GrokCodeFast1 | Model::Custom { .. } => false, } } @@ -122,12 +152,25 @@ impl Model { | Self::Grok3Fast | Self::Grok3MiniFast | Self::Grok4 + | Self::Grok4FastReasoning + | Self::Grok4FastNonReasoning | Self::GrokCodeFast1 => true, + Self::Custom { + supports_tools: Some(support), + .. + } => *support, Model::Custom { .. } => false, } } pub fn supports_images(&self) -> bool { - matches!(self, Self::Grok2Vision) + match self { + Self::Grok2Vision => true, + Self::Custom { + supports_images: Some(support), + .. + } => *support, + _ => false, + } } } diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index e53dedafd2f27699645662155f154f1220c6cd85..abaeb40fa6dc1b78c93f24af21a186f1ef0bb0c3 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -2,7 +2,7 @@ description = "The fast, collaborative code editor." edition.workspace = true name = "zed" -version = "0.205.0" +version = "0.209.0" publish.workspace = true license = "GPL-3.0-or-later" authors = ["Zed Team "] @@ -19,11 +19,11 @@ name = "zed" path = "src/main.rs" [dependencies] -activity_indicator.workspace = true acp_tools.workspace = true +activity_indicator.workspace = true agent.workspace = true -agent_ui.workspace = true agent_settings.workspace = true +agent_ui.workspace = true anyhow.workspace = true askpass.workspace = true assets.workspace = true @@ -39,6 +39,7 @@ channel.workspace = true clap.workspace = true cli.workspace = true client.workspace = true +codestral.workspace = true collab_ui.workspace = true collections.workspace = true command_palette.workspace = true @@ -52,6 +53,7 @@ debugger_tools.workspace = true debugger_ui.workspace = true diagnostics.workspace = true editor.workspace = true +zeta2_tools.workspace = true env_logger.workspace = true extension.workspace = true extension_host.workspace = true @@ -59,13 +61,13 @@ extensions_ui.workspace = true feature_flags.workspace = true feedback.workspace = true file_finder.workspace = true -system_specs.workspace = true fs.workspace = true futures.workspace = true git.workspace = true git_hosting_providers.workspace = true git_ui.workspace = true go_to_line.workspace = true +system_specs.workspace = true gpui = { workspace = true, features = [ "wayland", "x11", @@ -74,13 +76,14 @@ gpui = { workspace = true, features = [ ] } gpui_tokio.workspace = true +edit_prediction_button.workspace = true http_client.workspace = true image_viewer.workspace = true -edit_prediction_button.workspace = true inspector_ui.workspace = true install_cli.workspace = true -jj_ui.workspace = true journal.workspace = true +json_schema_store.workspace = true +keymap_editor.workspace = true language.workspace = true language_extension.workspace = true language_model.workspace = true @@ -93,7 +96,6 @@ line_ending_selector.workspace = true log.workspace = true markdown.workspace = true markdown_preview.workspace = true -svg_preview.workspace = true menu.workspace = true migrator.workspace = true mimalloc = { version = "0.1", optional = true } @@ -107,7 +109,6 @@ outline_panel.workspace = true parking_lot.workspace = true paths.workspace = true picker.workspace = true -settings_profile_selector.workspace = true profiling.workspace = true project.workspace = true project_panel.workspace = true @@ -126,13 +127,14 @@ serde.workspace = true serde_json.workspace = true session.workspace = true settings.workspace = true +settings_profile_selector.workspace = true settings_ui.workspace = true -keymap_editor.workspace = true shellexpand.workspace = true smol.workspace = true snippet_provider.workspace = true snippets_ui.workspace = true supermaven.workspace = true +svg_preview.workspace = true sysinfo.workspace = true tab_switcher.workspace = true task.workspace = true @@ -163,6 +165,7 @@ workspace.workspace = true zed_actions.workspace = true zed_env_vars.workspace = true zeta.workspace = true +zeta2.workspace = true zlog.workspace = true zlog_settings.workspace = true @@ -185,7 +188,6 @@ itertools.workspace = true language = { workspace = true, features = ["test-support"] } pretty_assertions.workspace = true project = { workspace = true, features = ["test-support"] } -settings_ui = { workspace = true, features = ["test-support"] } terminal_view = { workspace = true, features = ["test-support"] } tree-sitter-md.workspace = true tree-sitter-rust.workspace = true diff --git a/crates/zed/build.rs b/crates/zed/build.rs index c6d943a4593f0341dfef7869582e58980ae4a5ea..be420defa3aba17a739ffe18b24512078fce2b3a 100644 --- a/crates/zed/build.rs +++ b/crates/zed/build.rs @@ -1,3 +1,4 @@ +#![allow(clippy::disallowed_methods, reason = "build scripts are exempt")] use std::process::Command; fn main() { diff --git a/crates/zed/resources/windows/zed.iss b/crates/zed/resources/windows/zed.iss index 2e76f35a0b7f1081d2bff988fad01bcb0e8cfd92..b726bb1c2117b1d53f560aaff83acb370c2f2cd4 100644 --- a/crates/zed/resources/windows/zed.iss +++ b/crates/zed/resources/windows/zed.iss @@ -63,6 +63,8 @@ Source: "{#ResourcesDir}\bin\*"; DestDir: "{code:GetInstallDir}\bin"; Flags: ign Source: "{#ResourcesDir}\tools\*"; DestDir: "{app}\tools"; Flags: ignoreversion Source: "{#ResourcesDir}\appx\*"; DestDir: "{app}\appx"; BeforeInstall: RemoveAppxPackage; AfterInstall: AddAppxPackage; Flags: ignoreversion; Check: IsWindows11OrLater Source: "{#ResourcesDir}\amd_ags_x64.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#ResourcesDir}\OpenConsole.exe"; DestDir: "{code:GetInstallDir}"; Flags: ignoreversion +Source: "{#ResourcesDir}\conpty.dll"; DestDir: "{code:GetInstallDir}"; Flags: ignoreversion [Icons] Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}.exe"; AppUserModelID: "{#AppUserId}" @@ -79,7 +81,7 @@ Root: HKCU; Subkey: "Software\Classes\.ascx\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.ascx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ascx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ASCX}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -87,7 +89,7 @@ Root: HKCU; Subkey: "Software\Classes\.asp\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.asp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.asp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ASP}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -95,7 +97,7 @@ Root: HKCU; Subkey: "Software\Classes\.aspx\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.aspx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.aspx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ASPX}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -103,7 +105,7 @@ Root: HKCU; Subkey: "Software\Classes\.bash\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.bash\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bash"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -111,7 +113,7 @@ Root: HKCU; Subkey: "Software\Classes\.bash_login\OpenWithProgids"; ValueType: n Root: HKCU; Subkey: "Software\Classes\.bash_login\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bash_login"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash Login}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -119,7 +121,7 @@ Root: HKCU; Subkey: "Software\Classes\.bash_logout\OpenWithProgids"; ValueType: Root: HKCU; Subkey: "Software\Classes\.bash_logout\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bash_logout"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash Logout}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -127,7 +129,7 @@ Root: HKCU; Subkey: "Software\Classes\.bash_profile\OpenWithProgids"; ValueType: Root: HKCU; Subkey: "Software\Classes\.bash_profile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bash_profile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash Profile}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -135,7 +137,7 @@ Root: HKCU; Subkey: "Software\Classes\.bashrc\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.bashrc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bashrc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash RC}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -143,7 +145,7 @@ Root: HKCU; Subkey: "Software\Classes\.bib\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.bib\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bib"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,BibTeX}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -151,7 +153,7 @@ Root: HKCU; Subkey: "Software\Classes\.bowerrc\OpenWithProgids"; ValueType: none Root: HKCU; Subkey: "Software\Classes\.bowerrc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bowerrc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bower RC}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\bower.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -159,14 +161,14 @@ Root: HKCU; Subkey: "Software\Classes\.c++\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.c++\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.c++"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\.c\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\.c\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.c"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\c.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -174,7 +176,7 @@ Root: HKCU; Subkey: "Software\Classes\.cc\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.cc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -182,7 +184,7 @@ Root: HKCU; Subkey: "Software\Classes\.cfg\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.cfg\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cfg"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Configuration}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -190,7 +192,7 @@ Root: HKCU; Subkey: "Software\Classes\.cjs\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.cjs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cjs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -198,7 +200,7 @@ Root: HKCU; Subkey: "Software\Classes\.clj\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.clj\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.clj"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Clojure}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -206,7 +208,7 @@ Root: HKCU; Subkey: "Software\Classes\.cljs\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.cljs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cljs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ClojureScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -214,7 +216,7 @@ Root: HKCU; Subkey: "Software\Classes\.cljx\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.cljx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cljx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CLJX}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -222,7 +224,7 @@ Root: HKCU; Subkey: "Software\Classes\.clojure\OpenWithProgids"; ValueType: none Root: HKCU; Subkey: "Software\Classes\.clojure\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.clojure"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Clojure}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -230,7 +232,7 @@ Root: HKCU; Subkey: "Software\Classes\.cls\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.cls\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cls"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,LaTeX}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -238,7 +240,7 @@ Root: HKCU; Subkey: "Software\Classes\.code-workspace\OpenWithProgids"; ValueTyp Root: HKCU; Subkey: "Software\Classes\.code-workspace\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.code-workspace"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Code Workspace}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -246,7 +248,7 @@ Root: HKCU; Subkey: "Software\Classes\.cmake\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.cmake\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cmake"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CMake}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -254,7 +256,7 @@ Root: HKCU; Subkey: "Software\Classes\.coffee\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.coffee\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.coffee"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CoffeeScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -262,7 +264,7 @@ Root: HKCU; Subkey: "Software\Classes\.config\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.config\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.config"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Configuration}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -270,14 +272,14 @@ Root: HKCU; Subkey: "Software\Classes\.containerfile\OpenWithProgids"; ValueType Root: HKCU; Subkey: "Software\Classes\.containerfile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.containerfile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Containerfile}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\.cpp\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\.cpp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cpp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -285,7 +287,7 @@ Root: HKCU; Subkey: "Software\Classes\.cs\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.cs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C#}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\csharp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -293,7 +295,7 @@ Root: HKCU; Subkey: "Software\Classes\.cshtml\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.cshtml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cshtml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CSHTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -301,7 +303,7 @@ Root: HKCU; Subkey: "Software\Classes\.csproj\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.csproj\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.csproj"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C# Project}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -309,7 +311,7 @@ Root: HKCU; Subkey: "Software\Classes\.css\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.css\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.css"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CSS}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\css.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -317,7 +319,7 @@ Root: HKCU; Subkey: "Software\Classes\.csv\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.csv\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.csv"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Comma Separated Values}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -325,7 +327,7 @@ Root: HKCU; Subkey: "Software\Classes\.csx\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.csx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.csx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C# Script}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\csharp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -333,7 +335,7 @@ Root: HKCU; Subkey: "Software\Classes\.ctp\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.ctp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ctp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CakePHP Template}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -341,7 +343,7 @@ Root: HKCU; Subkey: "Software\Classes\.cxx\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.cxx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cxx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -349,7 +351,7 @@ Root: HKCU; Subkey: "Software\Classes\.dart\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.dart\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.dart"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Dart}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -357,7 +359,7 @@ Root: HKCU; Subkey: "Software\Classes\.diff\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.diff\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.diff"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Diff}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -365,7 +367,7 @@ Root: HKCU; Subkey: "Software\Classes\.dockerfile\OpenWithProgids"; ValueType: n Root: HKCU; Subkey: "Software\Classes\.dockerfile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.dockerfile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Dockerfile}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -373,7 +375,7 @@ Root: HKCU; Subkey: "Software\Classes\.dot\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.dot\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.dot"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Dot}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -381,7 +383,7 @@ Root: HKCU; Subkey: "Software\Classes\.dtd\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.dtd\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.dtd"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Document Type Definition}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -389,7 +391,7 @@ Root: HKCU; Subkey: "Software\Classes\.editorconfig\OpenWithProgids"; ValueType: Root: HKCU; Subkey: "Software\Classes\.editorconfig\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.editorconfig"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Editor Config}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -397,7 +399,7 @@ Root: HKCU; Subkey: "Software\Classes\.edn\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.edn\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.edn"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Extensible Data Notation}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -405,7 +407,7 @@ Root: HKCU; Subkey: "Software\Classes\.erb\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.erb\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.erb"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Ruby}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\ruby.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -413,7 +415,7 @@ Root: HKCU; Subkey: "Software\Classes\.eyaml\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.eyaml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.eyaml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Hiera Eyaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\yaml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -421,7 +423,7 @@ Root: HKCU; Subkey: "Software\Classes\.eyml\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.eyml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.eyml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Hiera Eyaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\yaml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -429,7 +431,7 @@ Root: HKCU; Subkey: "Software\Classes\.fs\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.fs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.fs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,F#}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -437,7 +439,7 @@ Root: HKCU; Subkey: "Software\Classes\.fsi\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.fsi\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.fsi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,F# Signature}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -445,7 +447,7 @@ Root: HKCU; Subkey: "Software\Classes\.fsscript\OpenWithProgids"; ValueType: non Root: HKCU; Subkey: "Software\Classes\.fsscript\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.fsscript"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,F# Script}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -453,7 +455,7 @@ Root: HKCU; Subkey: "Software\Classes\.fsx\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.fsx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.fsx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,F# Script}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -461,7 +463,7 @@ Root: HKCU; Subkey: "Software\Classes\.gemspec\OpenWithProgids"; ValueType: none Root: HKCU; Subkey: "Software\Classes\.gemspec\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gemspec"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Gemspec}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\ruby.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -470,7 +472,7 @@ Root: HKCU; Subkey: "Software\Classes\.gitattributes\OpenWithProgids"; ValueType Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Attributes}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -479,7 +481,7 @@ Root: HKCU; Subkey: "Software\Classes\.gitconfig\OpenWithProgids"; ValueType: st Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Config}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -488,7 +490,7 @@ Root: HKCU; Subkey: "Software\Classes\.gitignore\OpenWithProgids"; ValueType: st Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Ignore}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -496,7 +498,7 @@ Root: HKCU; Subkey: "Software\Classes\.go\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.go\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.go"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Go}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\go.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -504,7 +506,7 @@ Root: HKCU; Subkey: "Software\Classes\.gradle\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.gradle\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gradle"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Gradle}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -512,7 +514,7 @@ Root: HKCU; Subkey: "Software\Classes\.groovy\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.groovy\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.groovy"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Groovy}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -520,7 +522,7 @@ Root: HKCU; Subkey: "Software\Classes\.h\OpenWithProgids"; ValueType: none; Valu Root: HKCU; Subkey: "Software\Classes\.h\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.h"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\c.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -528,7 +530,7 @@ Root: HKCU; Subkey: "Software\Classes\.handlebars\OpenWithProgids"; ValueType: n Root: HKCU; Subkey: "Software\Classes\.handlebars\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.handlebars"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Handlebars}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -536,7 +538,7 @@ Root: HKCU; Subkey: "Software\Classes\.hbs\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.hbs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.hbs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Handlebars}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -544,14 +546,14 @@ Root: HKCU; Subkey: "Software\Classes\.h++\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.h++\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.h++"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++ Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\.hh\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\.hh\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.hh"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++ Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -559,7 +561,7 @@ Root: HKCU; Subkey: "Software\Classes\.hpp\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.hpp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.hpp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++ Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -567,7 +569,7 @@ Root: HKCU; Subkey: "Software\Classes\.htm\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.htm\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.htm"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,HTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -575,7 +577,7 @@ Root: HKCU; Subkey: "Software\Classes\.html\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.html\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.html"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,HTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -583,7 +585,7 @@ Root: HKCU; Subkey: "Software\Classes\.hxx\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.hxx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.hxx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++ Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -591,7 +593,7 @@ Root: HKCU; Subkey: "Software\Classes\.ini\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.ini\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ini"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,INI}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -599,7 +601,7 @@ Root: HKCU; Subkey: "Software\Classes\.ipynb\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.ipynb\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ipynb"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Jupyter}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -607,7 +609,7 @@ Root: HKCU; Subkey: "Software\Classes\.jade\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.jade\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jade"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Jade}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\jade.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -615,7 +617,7 @@ Root: HKCU; Subkey: "Software\Classes\.jav\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.jav\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jav"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Java}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\java.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -623,7 +625,7 @@ Root: HKCU; Subkey: "Software\Classes\.java\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.java\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.java"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Java}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\java.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -631,7 +633,7 @@ Root: HKCU; Subkey: "Software\Classes\.js\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.js\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.js"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -639,7 +641,7 @@ Root: HKCU; Subkey: "Software\Classes\.jsx\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.jsx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jsx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\react.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -647,7 +649,7 @@ Root: HKCU; Subkey: "Software\Classes\.jscsrc\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.jscsrc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jscsrc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JSCS RC}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -655,7 +657,7 @@ Root: HKCU; Subkey: "Software\Classes\.jshintrc\OpenWithProgids"; ValueType: non Root: HKCU; Subkey: "Software\Classes\.jshintrc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jshintrc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JSHint RC}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -663,7 +665,7 @@ Root: HKCU; Subkey: "Software\Classes\.jshtm\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.jshtm\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jshtm"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript HTML Template}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -671,7 +673,7 @@ Root: HKCU; Subkey: "Software\Classes\.json\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.json\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.json"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JSON}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\json.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -679,7 +681,7 @@ Root: HKCU; Subkey: "Software\Classes\.jsp\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.jsp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jsp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Java Server Pages}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -687,7 +689,7 @@ Root: HKCU; Subkey: "Software\Classes\.less\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.less\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.less"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,LESS}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\less.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -695,7 +697,7 @@ Root: HKCU; Subkey: "Software\Classes\.log\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.log\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.log"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Log file}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -703,7 +705,7 @@ Root: HKCU; Subkey: "Software\Classes\.lua\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.lua\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.lua"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Lua}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -711,7 +713,7 @@ Root: HKCU; Subkey: "Software\Classes\.m\OpenWithProgids"; ValueType: none; Valu Root: HKCU; Subkey: "Software\Classes\.m\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.m"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Objective C}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -719,7 +721,7 @@ Root: HKCU; Subkey: "Software\Classes\.makefile\OpenWithProgids"; ValueType: non Root: HKCU; Subkey: "Software\Classes\.makefile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.makefile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Makefile}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -727,7 +729,7 @@ Root: HKCU; Subkey: "Software\Classes\.markdown\OpenWithProgids"; ValueType: non Root: HKCU; Subkey: "Software\Classes\.markdown\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.markdown"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -735,7 +737,7 @@ Root: HKCU; Subkey: "Software\Classes\.md\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.md\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.md"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -743,7 +745,7 @@ Root: HKCU; Subkey: "Software\Classes\.mdoc\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.mdoc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdoc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,MDoc}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -751,7 +753,7 @@ Root: HKCU; Subkey: "Software\Classes\.mdown\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.mdown\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdown"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -759,7 +761,7 @@ Root: HKCU; Subkey: "Software\Classes\.mdtext\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.mdtext\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdtext"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -767,7 +769,7 @@ Root: HKCU; Subkey: "Software\Classes\.mdtxt\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.mdtxt\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdtxt"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -775,7 +777,7 @@ Root: HKCU; Subkey: "Software\Classes\.mdwn\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.mdwn\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdwn"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -783,7 +785,7 @@ Root: HKCU; Subkey: "Software\Classes\.mk\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.mk\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mk"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Makefile}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -791,7 +793,7 @@ Root: HKCU; Subkey: "Software\Classes\.mkd\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.mkd\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mkd"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -799,7 +801,7 @@ Root: HKCU; Subkey: "Software\Classes\.mkdn\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.mkdn\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mkdn"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -807,7 +809,7 @@ Root: HKCU; Subkey: "Software\Classes\.ml\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.ml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,OCaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -815,7 +817,7 @@ Root: HKCU; Subkey: "Software\Classes\.mli\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.mli\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mli"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,OCaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -823,7 +825,7 @@ Root: HKCU; Subkey: "Software\Classes\.mjs\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.mjs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mjs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -832,7 +834,7 @@ Root: HKCU; Subkey: "Software\Classes\.npmignore\OpenWithProgids"; ValueType: st Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,NPM Ignore}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -840,7 +842,7 @@ Root: HKCU; Subkey: "Software\Classes\.php\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.php\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.php"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PHP}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\php.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -848,7 +850,7 @@ Root: HKCU; Subkey: "Software\Classes\.phtml\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.phtml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.phtml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PHP HTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -856,7 +858,7 @@ Root: HKCU; Subkey: "Software\Classes\.pl\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.pl\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pl"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -864,7 +866,7 @@ Root: HKCU; Subkey: "Software\Classes\.pl6\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.pl6\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pl6"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl 6}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -872,7 +874,7 @@ Root: HKCU; Subkey: "Software\Classes\.plist\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.plist\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.plist"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Properties file}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -880,7 +882,7 @@ Root: HKCU; Subkey: "Software\Classes\.pm\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.pm\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pm"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl Module}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -888,7 +890,7 @@ Root: HKCU; Subkey: "Software\Classes\.pm6\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.pm6\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pm6"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl 6 Module}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -896,7 +898,7 @@ Root: HKCU; Subkey: "Software\Classes\.pod\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.pod\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pod"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl POD}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -904,7 +906,7 @@ Root: HKCU; Subkey: "Software\Classes\.pp\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.pp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -912,7 +914,7 @@ Root: HKCU; Subkey: "Software\Classes\.profile\OpenWithProgids"; ValueType: none Root: HKCU; Subkey: "Software\Classes\.profile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.profile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Profile}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -920,7 +922,7 @@ Root: HKCU; Subkey: "Software\Classes\.properties\OpenWithProgids"; ValueType: n Root: HKCU; Subkey: "Software\Classes\.properties\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.properties"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Properties}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -928,7 +930,7 @@ Root: HKCU; Subkey: "Software\Classes\.ps1\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.ps1\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ps1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PowerShell}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\powershell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -936,7 +938,7 @@ Root: HKCU; Subkey: "Software\Classes\.psd1\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.psd1\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.psd1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PowerShell Module Manifest}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\powershell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -944,7 +946,7 @@ Root: HKCU; Subkey: "Software\Classes\.psgi\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.psgi\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.psgi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl CGI}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -952,7 +954,7 @@ Root: HKCU; Subkey: "Software\Classes\.psm1\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.psm1\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.psm1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PowerShell Module}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\powershell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -960,7 +962,7 @@ Root: HKCU; Subkey: "Software\Classes\.py\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.py\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.py"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Python}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\python.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -968,7 +970,7 @@ Root: HKCU; Subkey: "Software\Classes\.pyi\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.pyi\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pyi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Python}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\python.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -976,7 +978,7 @@ Root: HKCU; Subkey: "Software\Classes\.r\OpenWithProgids"; ValueType: none; Valu Root: HKCU; Subkey: "Software\Classes\.r\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.r"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,R}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -984,7 +986,7 @@ Root: HKCU; Subkey: "Software\Classes\.rb\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.rb\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rb"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Ruby}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\ruby.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -992,7 +994,7 @@ Root: HKCU; Subkey: "Software\Classes\.rhistory\OpenWithProgids"; ValueType: non Root: HKCU; Subkey: "Software\Classes\.rhistory\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rhistory"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,R History}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1000,7 +1002,7 @@ Root: HKCU; Subkey: "Software\Classes\.rprofile\OpenWithProgids"; ValueType: non Root: HKCU; Subkey: "Software\Classes\.rprofile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rprofile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,R Profile}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1008,7 +1010,7 @@ Root: HKCU; Subkey: "Software\Classes\.rs\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.rs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Rust}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1016,7 +1018,7 @@ Root: HKCU; Subkey: "Software\Classes\.rst\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.rst\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rst"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Restructured Text}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1024,7 +1026,7 @@ Root: HKCU; Subkey: "Software\Classes\.rt\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.rt\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rt"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Rich Text}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1032,7 +1034,7 @@ Root: HKCU; Subkey: "Software\Classes\.sass\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.sass\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.sass"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Sass}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\sass.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1040,7 +1042,7 @@ Root: HKCU; Subkey: "Software\Classes\.scss\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.scss\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.scss"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Sass}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\sass.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1048,7 +1050,7 @@ Root: HKCU; Subkey: "Software\Classes\.sh\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.sh\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.sh"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SH}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1056,7 +1058,7 @@ Root: HKCU; Subkey: "Software\Classes\.shtml\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.shtml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.shtml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SHTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1064,7 +1066,7 @@ Root: HKCU; Subkey: "Software\Classes\.sql\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.sql\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.sql"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SQL}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\sql.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1072,7 +1074,7 @@ Root: HKCU; Subkey: "Software\Classes\.svg\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.svg\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.svg"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SVG}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1080,7 +1082,7 @@ Root: HKCU; Subkey: "Software\Classes\.t\OpenWithProgids"; ValueType: none; Valu Root: HKCU; Subkey: "Software\Classes\.t\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.t"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1088,7 +1090,7 @@ Root: HKCU; Subkey: "Software\Classes\.tex\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.tex\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.tex"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,LaTeX}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1096,7 +1098,7 @@ Root: HKCU; Subkey: "Software\Classes\.ts\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.ts\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ts"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,TypeScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\typescript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1104,7 +1106,7 @@ Root: HKCU; Subkey: "Software\Classes\.toml\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.toml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.toml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Toml}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1112,7 +1114,7 @@ Root: HKCU; Subkey: "Software\Classes\.tsx\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.tsx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.tsx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,TypeScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\react.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1120,7 +1122,7 @@ Root: HKCU; Subkey: "Software\Classes\.txt\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.txt\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.txt"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Text}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1128,7 +1130,7 @@ Root: HKCU; Subkey: "Software\Classes\.vb\OpenWithProgids"; ValueType: none; Val Root: HKCU; Subkey: "Software\Classes\.vb\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.vb"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Visual Basic}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1136,7 +1138,7 @@ Root: HKCU; Subkey: "Software\Classes\.vue\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.vue\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.vue"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,VUE}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\vue.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1144,7 +1146,7 @@ Root: HKCU; Subkey: "Software\Classes\.wxi\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.wxi\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.wxi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,WiX Include}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1152,7 +1154,7 @@ Root: HKCU; Subkey: "Software\Classes\.wxl\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.wxl\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.wxl"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,WiX Localization}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1160,7 +1162,7 @@ Root: HKCU; Subkey: "Software\Classes\.wxs\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.wxs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.wxs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,WiX}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1168,7 +1170,7 @@ Root: HKCU; Subkey: "Software\Classes\.xaml\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.xaml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.xaml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,XAML}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1176,7 +1178,7 @@ Root: HKCU; Subkey: "Software\Classes\.xhtml\OpenWithProgids"; ValueType: none; Root: HKCU; Subkey: "Software\Classes\.xhtml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.xhtml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,HTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1184,7 +1186,7 @@ Root: HKCU; Subkey: "Software\Classes\.xml\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.xml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.xml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,XML}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1192,7 +1194,7 @@ Root: HKCU; Subkey: "Software\Classes\.yaml\OpenWithProgids"; ValueType: none; V Root: HKCU; Subkey: "Software\Classes\.yaml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.yaml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Yaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\yaml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1200,7 +1202,7 @@ Root: HKCU; Subkey: "Software\Classes\.yml\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.yml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.yml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Yaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\yaml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles @@ -1208,17 +1210,17 @@ Root: HKCU; Subkey: "Software\Classes\.zsh\OpenWithProgids"; ValueType: none; Va Root: HKCU; Subkey: "Software\Classes\.zsh\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.zsh"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ZSH}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh\DefaultIcon"; ValueType: none; Flags: deletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,{#AppName}}"; Flags: uninsdeletekey -Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico" +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile\DefaultIcon"; ValueType: none; Flags: deletekey Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile\shell\open"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe""" Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1""" Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe"; ValueType: none; ValueName: ""; Flags: uninsdeletekey -Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico" +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe\DefaultIcon"; ValueType: none; Flags: deletekey Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe""" Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1""" diff --git a/crates/zed/resources/zed.desktop.in b/crates/zed/resources/zed.desktop.in index 8da063f468381028ea0cad94fd978369124889a9..eaace153dd00d97894cf6d6458133ab845605c54 100644 --- a/crates/zed/resources/zed.desktop.in +++ b/crates/zed/resources/zed.desktop.in @@ -10,6 +10,9 @@ Exec=$APP_CLI $APP_ARGS Icon=$APP_ICON Categories=Utility;TextEditor;Development;IDE; Keywords=zed; +# To add Zed to "Open Folder With..." context menu, add `inode/directory` to the MimeType field (semicolon separated) +# Arch linux users have reported this setting Zed as default file browser. See https://github.com/zed-industries/zed/pull/39076 and related issues. +# If this happens to you, an unconfirmed fix may be to install Arch's `gnome-defaults-list` package. MimeType=text/plain;application/x-zerosize;x-scheme-handler/zed; Actions=NewWorkspace; diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 63ee30043b61fd55af2edad7cd4a7a407af743bd..cc05cdfd822bd41135034dbaa3c174fd0af667cb 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -12,14 +12,12 @@ use crashes::InitCrashHandler; use db::kvp::{GLOBAL_KEY_VALUE_STORE, KEY_VALUE_STORE}; use editor::Editor; use extension::ExtensionHostProxy; -use extension_host::ExtensionStore; use fs::{Fs, RealFs}; use futures::{StreamExt, channel::oneshot, future}; use git::GitHostingProviderRegistry; use gpui::{App, AppContext, Application, AsyncApp, Focusable as _, UpdateGlobal as _}; use gpui_tokio::Tokio; -use http_client::{Url, read_proxy_from_env}; use language::LanguageRegistry; use onboarding::{FIRST_OPEN, show_onboarding_view}; use prompt_store::PromptBuilder; @@ -41,10 +39,7 @@ use std::{ process, sync::Arc, }; -use theme::{ - ActiveTheme, IconThemeNotFoundError, SystemAppearance, ThemeNotFoundError, ThemeRegistry, - ThemeSettings, -}; +use theme::{ActiveTheme, GlobalTheme, ThemeRegistry}; use util::{ResultExt, TryFutureExt, maybe}; use uuid::Uuid; use workspace::{ @@ -58,7 +53,7 @@ use zed::{ initialize_workspace, open_paths_with_positions, }; -use crate::zed::OpenRequestKind; +use crate::zed::{OpenRequestKind, eager_load_active_theme_and_icon_theme}; #[cfg(feature = "mimalloc")] #[global_allocator] @@ -171,18 +166,19 @@ pub fn main() { let args = Args::parse(); - // `zed --crash-handler` Makes zed operate in minidump crash handler mode - if let Some(socket) = &args.crash_handler { - crashes::crash_server(socket.as_path()); - return; - } - // `zed --askpass` Makes zed operate in nc/netcat mode for use with askpass + #[cfg(not(target_os = "windows"))] if let Some(socket) = &args.askpass { askpass::main(socket); return; } + // `zed --crash-handler` Makes zed operate in minidump crash handler mode + if let Some(socket) = &args.crash_handler { + crashes::crash_server(socket.as_path()); + return; + } + // `zed --nc` Makes zed operate in nc/netcat mode for use with MCP if let Some(socket) = &args.nc { match nc::main(socket) { @@ -219,6 +215,17 @@ pub fn main() { } } + #[cfg(target_os = "windows")] + match util::get_zed_cli_path() { + Ok(path) => askpass::set_askpass_program(path), + Err(err) => { + eprintln!("Error: {}", err); + if std::option_env!("ZED_BUNDLE").is_some() { + process::exit(1); + } + } + } + let file_errors = init_paths(); if !file_errors.is_empty() { files_not_created_on_launch(file_errors); @@ -260,6 +267,9 @@ pub fn main() { .unwrap_or("unknown"), ); + #[cfg(windows)] + check_for_conpty_dll(); + let app = Application::new().with_assets(Assets); let system_id = app.background_executor().block(system_id()).ok(); @@ -271,6 +281,7 @@ pub fn main() { .spawn(crashes::init(InitCrashHandler { session_id: session_id.clone(), zed_version: app_version.to_string(), + binary: "zed".to_string(), release_channel: release_channel::RELEASE_CHANNEL_NAME.clone(), commit_sha: app_commit_sha .as_ref() @@ -340,7 +351,7 @@ pub fn main() { app.background_executor() .spawn(async { #[cfg(unix)] - util::load_login_shell_environment().log_err(); + util::load_login_shell_environment().await.log_err(); shell_env_loaded_tx.send(()).ok(); }) .detach() @@ -398,16 +409,7 @@ pub fn main() { std::env::consts::OS, std::env::consts::ARCH ); - let proxy_str = ProxySettings::get_global(cx).proxy.to_owned(); - let proxy_url = proxy_str - .as_ref() - .and_then(|input| { - input - .parse::() - .inspect_err(|e| log::error!("Error parsing proxy settings: {}", e)) - .ok() - }) - .or_else(read_proxy_from_env); + let proxy_url = ProxySettings::get_global(cx).proxy_url(); let http = { let _guard = Tokio::handle(cx).enter(); @@ -537,11 +539,18 @@ pub fn main() { system_id.as_ref().map(|id| id.to_string()), cx, ); + extension_host::init( + extension_host_proxy.clone(), + app_state.fs.clone(), + app_state.client.clone(), + app_state.node_runtime.clone(), + cx, + ); - SystemAppearance::init(cx); theme::init(theme::LoadThemes::All(Box::new(Assets)), cx); + eager_load_active_theme_and_icon_theme(fs.clone(), cx); theme_extension::init( - extension_host_proxy.clone(), + extension_host_proxy, ThemeRegistry::global(cx), cx.background_executor().clone(), ); @@ -559,6 +568,7 @@ pub fn main() { language_models::init(app_state.user_store.clone(), app_state.client.clone(), cx); agent_settings::init(cx); acp_tools::init(cx); + zeta2_tools::init(cx); web_search::init(cx); web_search_providers::init(app_state.client.clone(), cx); snippet_provider::init(cx); @@ -574,18 +584,10 @@ pub fn main() { ); assistant_tools::init(app_state.client.http_client(), cx); repl::init(app_state.fs.clone(), cx); - extension_host::init( - extension_host_proxy, - app_state.fs.clone(), - app_state.client.clone(), - app_state.node_runtime.clone(), - cx, - ); recent_projects::init(cx); load_embedded_fonts(cx); - app_state.languages.set_theme(cx.theme().clone()); editor::init(cx); image_viewer::init(cx); repl::notebook::init(cx); @@ -619,7 +621,6 @@ pub fn main() { notifications::init(app_state.client.clone(), app_state.user_store.clone(), cx); collab_ui::init(&app_state, cx); git_ui::init(cx); - jj_ui::init(cx); feedback::init(cx); markdown_preview::init(cx); svg_preview::init(cx); @@ -629,10 +630,9 @@ pub fn main() { extensions_ui::init(cx); zeta::init(cx); inspector_ui::init(app_state.clone(), cx); + json_schema_store::init(cx); cx.observe_global::({ - let fs = fs.clone(); - let languages = app_state.languages.clone(); let http = app_state.client.http_client(); let client = app_state.client.clone(); move |cx| { @@ -645,9 +645,6 @@ pub fn main() { .ok(); } - eager_load_active_theme_and_icon_theme(fs.clone(), cx); - - languages.set_theme(cx.theme().clone()); let new_host = &client::ClientSettings::get_global(cx).server_url; if &http.base_url() != new_host { http.set_base_url(new_host); @@ -658,6 +655,14 @@ pub fn main() { } }) .detach(); + app_state.languages.set_theme(cx.theme().clone()); + cx.observe_global::({ + let languages = app_state.languages.clone(); + move |cx| { + languages.set_theme(cx.theme().clone()); + } + }) + .detach(); telemetry::event!( "Settings Changed", setting = "theme", @@ -675,7 +680,8 @@ pub fn main() { watch_themes(fs.clone(), cx); watch_languages(fs.clone(), app_state.languages.clone(), cx); - cx.set_menus(app_menus()); + let menus = app_menus(cx); + cx.set_menus(menus); initialize_workspace(app_state.clone(), prompt_builder, cx); cx.activate(true); @@ -789,6 +795,59 @@ fn handle_open_request(request: OpenRequest, app_state: Arc, cx: &mut OpenRequestKind::DockMenuAction { index } => { cx.perform_dock_menu_action(index); } + OpenRequestKind::BuiltinJsonSchema { schema_path } => { + workspace::with_active_or_new_workspace(cx, |_workspace, window, cx| { + cx.spawn_in(window, async move |workspace, cx| { + let res = async move { + let json = app_state.languages.language_for_name("JSONC").await.ok(); + let json_schema_content = + json_schema_store::resolve_schema_request_inner( + &app_state.languages, + &schema_path, + cx, + )?; + let json_schema_content = + serde_json::to_string_pretty(&json_schema_content) + .context("Failed to serialize JSON Schema as JSON")?; + let buffer_task = workspace.update(cx, |workspace, cx| { + workspace + .project() + .update(cx, |project, cx| project.create_buffer(false, cx)) + })?; + + let buffer = buffer_task.await?; + + workspace.update_in(cx, |workspace, window, cx| { + buffer.update(cx, |buffer, cx| { + buffer.set_language(json, cx); + buffer.edit([(0..0, json_schema_content)], None, cx); + buffer.edit( + [(0..0, format!("// {} JSON Schema\n", schema_path))], + None, + cx, + ); + }); + + workspace.add_item_to_active_pane( + Box::new(cx.new(|cx| { + let mut editor = + editor::Editor::for_buffer(buffer, None, window, cx); + editor.set_read_only(true); + editor + })), + None, + true, + window, + cx, + ); + }) + } + .await; + res.context("Failed to open builtin JSON Schema").log_err(); + }) + .detach(); + }); + } } return; @@ -1201,11 +1260,6 @@ struct Args { #[arg(long)] system_specs: bool, - /// Used for SSH/Git password authentication, to remove the need for netcat as a dependency, - /// by having Zed act like netcat communicating over a Unix socket. - #[arg(long, hide = true)] - askpass: Option, - /// Used for the MCP Server, to remove the need for netcat as a dependency, /// by having Zed act like netcat communicating over a Unix socket. #[arg(long, hide = true)] @@ -1228,6 +1282,13 @@ struct Args { #[arg(hide = true)] dock_action: Option, + /// Used for SSH/Git password authentication, to remove the need for netcat as a dependency, + /// by having Zed act like netcat communicating over a Unix socket. + #[arg(long)] + #[cfg(not(target_os = "windows"))] + #[arg(hide = true)] + askpass: Option, + #[arg(long, hide = true)] dump_all_actions: bool, @@ -1291,63 +1352,6 @@ fn load_embedded_fonts(cx: &App) { .unwrap(); } -/// Eagerly loads the active theme and icon theme based on the selections in the -/// theme settings. -/// -/// This fast path exists to load these themes as soon as possible so the user -/// doesn't see the default themes while waiting on extensions to load. -fn eager_load_active_theme_and_icon_theme(fs: Arc, cx: &App) { - let extension_store = ExtensionStore::global(cx); - let theme_registry = ThemeRegistry::global(cx); - let theme_settings = ThemeSettings::get_global(cx); - let appearance = SystemAppearance::global(cx).0; - - if let Some(theme_selection) = theme_settings.theme_selection.as_ref() { - let theme_name = theme_selection.theme(appearance); - if matches!(theme_registry.get(theme_name), Err(ThemeNotFoundError(_))) - && let Some(theme_path) = extension_store.read(cx).path_to_extension_theme(theme_name) - { - cx.spawn({ - let theme_registry = theme_registry.clone(); - let fs = fs.clone(); - async move |cx| { - theme_registry.load_user_theme(&theme_path, fs).await?; - - cx.update(|cx| { - ThemeSettings::reload_current_theme(cx); - }) - } - }) - .detach_and_log_err(cx); - } - } - - if let Some(icon_theme_selection) = theme_settings.icon_theme_selection.as_ref() { - let icon_theme_name = icon_theme_selection.icon_theme(appearance); - if matches!( - theme_registry.get_icon_theme(icon_theme_name), - Err(IconThemeNotFoundError(_)) - ) && let Some((icon_theme_path, icons_root_path)) = extension_store - .read(cx) - .path_to_extension_icon_theme(icon_theme_name) - { - cx.spawn({ - let fs = fs.clone(); - async move |cx| { - theme_registry - .load_icon_theme(&icon_theme_path, &icons_root_path, fs) - .await?; - - cx.update(|cx| { - ThemeSettings::reload_current_icon_theme(cx); - }) - } - }) - .detach_and_log_err(cx); - } - } -} - /// Spawns a background task to load the user themes from the themes directory. fn load_user_themes_in_background(fs: Arc, cx: &mut App) { cx.spawn({ @@ -1372,7 +1376,7 @@ fn load_user_themes_in_background(fs: Arc, cx: &mut App) { } } theme_registry.load_user_themes(themes_dir, fs).await?; - cx.update(ThemeSettings::reload_current_theme)?; + cx.update(GlobalTheme::reload_theme)?; } anyhow::Ok(()) } @@ -1398,7 +1402,7 @@ fn watch_themes(fs: Arc, cx: &mut App) { .await .log_err() { - cx.update(ThemeSettings::reload_current_theme).log_err(); + cx.update(GlobalTheme::reload_theme).log_err(); } } } @@ -1469,3 +1473,21 @@ fn dump_all_gpui_actions() { ) .unwrap(); } + +#[cfg(target_os = "windows")] +fn check_for_conpty_dll() { + use windows::{ + Win32::{Foundation::FreeLibrary, System::LibraryLoader::LoadLibraryW}, + core::w, + }; + + if let Ok(hmodule) = unsafe { LoadLibraryW(w!("conpty.dll")) } { + unsafe { + FreeLibrary(hmodule) + .context("Failed to free conpty.dll") + .log_err(); + } + } else { + log::warn!("Failed to load conpty.dll. Terminal will work with reduced functionality."); + } +} diff --git a/crates/zed/src/reliability.rs b/crates/zed/src/reliability.rs index 4297f4c1c666d19fd184f03b62db17730c611356..dcabe93aab4ff35de44b77b87eb8495f537564fe 100644 --- a/crates/zed/src/reliability.rs +++ b/crates/zed/src/reliability.rs @@ -330,6 +330,7 @@ async fn upload_minidump( metadata.init.release_channel.clone(), ) .text("sentry[tags][version]", metadata.init.zed_version.clone()) + .text("sentry[tags][binary]", metadata.init.binary.clone()) .text("sentry[release]", metadata.init.commit_sha.clone()) .text("platform", "rust"); let mut panic_message = "".to_owned(); diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index 87664d20f0df08761ca6f5cc3a14ad59e978605f..58fb18ebd2b94c0f68cbe7e0de3128d5acedf491 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -20,7 +20,9 @@ use collections::VecDeque; use debugger_ui::debugger_panel::DebugPanel; use editor::ProposedChangesEditorToolbar; use editor::{Editor, MultiBuffer}; +use extension_host::ExtensionStore; use feature_flags::{FeatureFlagAppExt, PanicFeatureFlag}; +use fs::Fs; use futures::future::Either; use futures::{StreamExt, channel::mpsc, select_biased}; use git_ui::git_panel::GitPanel; @@ -46,7 +48,7 @@ use paths::{ local_debug_file_relative_path, local_settings_file_relative_path, local_tasks_file_relative_path, }; -use project::{DirectoryLister, ProjectItem}; +use project::{DirectoryLister, DisableAiSettings, ProjectItem}; use project_panel::ProjectPanel; use prompt_store::PromptBuilder; use quick_action_bar::QuickActionBar; @@ -68,9 +70,13 @@ use std::{ sync::atomic::{self, AtomicBool}, }; use terminal_view::terminal_panel::{self, TerminalPanel}; -use theme::{ActiveTheme, ThemeSettings}; +use theme::{ + ActiveTheme, GlobalTheme, IconThemeNotFoundError, SystemAppearance, ThemeNotFoundError, + ThemeRegistry, ThemeSettings, +}; use ui::{PopoverMenuHandle, prelude::*}; use util::markdown::MarkdownString; +use util::rel_path::RelPath; use util::{ResultExt, asset_str}; use uuid::Uuid; use vim_mode_setting::VimModeSetting; @@ -87,7 +93,8 @@ use workspace::{ }; use workspace::{Pane, notifications::DetachAndPromptErr}; use zed_actions::{ - OpenAccountSettings, OpenBrowser, OpenDocs, OpenServerSettings, OpenSettings, OpenZedUrl, Quit, + OpenAccountSettings, OpenBrowser, OpenDocs, OpenServerSettings, OpenSettingsFile, OpenZedUrl, + Quit, }; actions!( @@ -190,7 +197,7 @@ pub fn init(cx: &mut App) { open_telemetry_log_file(workspace, window, cx); }); }); - cx.on_action(|&zed_actions::OpenKeymap, cx| { + cx.on_action(|&zed_actions::OpenKeymapFile, cx| { with_active_or_new_workspace(cx, |_, window, cx| { open_settings_file( paths::keymap_file(), @@ -200,7 +207,7 @@ pub fn init(cx: &mut App) { ); }); }); - cx.on_action(|_: &OpenSettings, cx| { + cx.on_action(|_: &OpenSettingsFile, cx| { with_active_or_new_workspace(cx, |_, window, cx| { open_settings_file( paths::settings_file(), @@ -512,17 +519,30 @@ fn show_software_emulation_warning_if_needed( cx: &mut Context, ) { if specs.is_software_emulated && std::env::var("ZED_ALLOW_EMULATED_GPU").is_err() { + let (graphics_api, docs_url, open_url) = if cfg!(target_os = "windows") { + ( + "DirectX", + "https://zed.dev/docs/windows", + "https://zed.dev/docs/windows", + ) + } else { + ( + "Vulkan", + "https://zed.dev/docs/linux", + "https://zed.dev/docs/linux#zed-fails-to-open-windows", + ) + }; let message = format!( db::indoc! {r#" - Zed uses Vulkan for rendering and requires a compatible GPU. + Zed uses {} for rendering and requires a compatible GPU. Currently you are using a software emulated GPU ({}) which will result in awful performance. - For troubleshooting see: https://zed.dev/docs/linux + For troubleshooting see: {} Set ZED_ALLOW_EMULATED_GPU=1 env var to permanently override. "#}, - specs.device_name + graphics_api, specs.device_name, docs_url ); let prompt = window.prompt( PromptLevel::Critical, @@ -534,7 +554,7 @@ fn show_software_emulation_warning_if_needed( cx.spawn(async move |_, cx| { if prompt.await == Ok(1) { cx.update(|cx| { - cx.open_url("https://zed.dev/docs/linux#zed-fails-to-open-windows"); + cx.open_url(open_url); cx.quit(); }) .ok(); @@ -590,21 +610,55 @@ fn initialize_panels( workspace.add_panel(debug_panel, window, cx); })?; - let is_assistant2_enabled = !cfg!(test); - let agent_panel = if is_assistant2_enabled { - let agent_panel = - agent_ui::AgentPanel::load(workspace_handle.clone(), prompt_builder, cx.clone()) - .await?; + fn setup_or_teardown_agent_panel( + workspace: &mut Workspace, + prompt_builder: Arc, + window: &mut Window, + cx: &mut Context, + ) -> Task> { + let disable_ai = SettingsStore::global(cx) + .get::(None) + .disable_ai + || cfg!(test); + let existing_panel = workspace.panel::(cx); + match (disable_ai, existing_panel) { + (false, None) => cx.spawn_in(window, async move |workspace, cx| { + let panel = + agent_ui::AgentPanel::load(workspace.clone(), prompt_builder, cx.clone()) + .await?; + workspace.update_in(cx, |workspace, window, cx| { + let disable_ai = SettingsStore::global(cx) + .get::(None) + .disable_ai; + let have_panel = workspace.panel::(cx).is_some(); + if !disable_ai && !have_panel { + workspace.add_panel(panel, window, cx); + } + }) + }), + (true, Some(existing_panel)) => { + workspace.remove_panel::(&existing_panel, window, cx); + Task::ready(Ok(())) + } + _ => Task::ready(Ok(())), + } + } - Some(agent_panel) - } else { - None - }; + workspace_handle + .update_in(cx, |workspace, window, cx| { + setup_or_teardown_agent_panel(workspace, prompt_builder.clone(), window, cx) + })? + .await?; workspace_handle.update_in(cx, |workspace, window, cx| { - if let Some(agent_panel) = agent_panel { - workspace.add_panel(agent_panel, window, cx); - } + cx.observe_global_in::(window, { + let prompt_builder = prompt_builder.clone(); + move |workspace, window, cx| { + setup_or_teardown_agent_panel(workspace, prompt_builder.clone(), window, cx) + .detach_and_log_err(cx); + } + }) + .detach(); // Register the actions that are shared between `assistant` and `assistant2`. // @@ -612,7 +666,7 @@ fn initialize_panels( // functions so that we only register the actions once. // // Once we ship `assistant2` we can push this back down into `agent::agent_panel::init`. - if is_assistant2_enabled { + if !cfg!(test) { ::set_global( Arc::new(agent_ui::ConcreteAssistantPanelDelegate), cx, @@ -727,11 +781,12 @@ fn register_actions( let fs = app_state.fs.clone(); move |_, action: &zed_actions::IncreaseUiFontSize, _window, cx| { if action.persist { - update_settings_file::(fs.clone(), cx, move |settings, cx| { + update_settings_file(fs.clone(), cx, move |settings, cx| { let ui_font_size = ThemeSettings::get_global(cx).ui_font_size(cx) + px(1.0); let _ = settings + .theme .ui_font_size - .insert(theme::clamp_font_size(ui_font_size).0); + .insert(theme::clamp_font_size(ui_font_size).into()); }); } else { theme::adjust_ui_font_size(cx, |size| size + px(1.0)); @@ -742,11 +797,12 @@ fn register_actions( let fs = app_state.fs.clone(); move |_, action: &zed_actions::DecreaseUiFontSize, _window, cx| { if action.persist { - update_settings_file::(fs.clone(), cx, move |settings, cx| { + update_settings_file(fs.clone(), cx, move |settings, cx| { let ui_font_size = ThemeSettings::get_global(cx).ui_font_size(cx) - px(1.0); let _ = settings + .theme .ui_font_size - .insert(theme::clamp_font_size(ui_font_size).0); + .insert(theme::clamp_font_size(ui_font_size).into()); }); } else { theme::adjust_ui_font_size(cx, |size| size - px(1.0)); @@ -757,8 +813,8 @@ fn register_actions( let fs = app_state.fs.clone(); move |_, action: &zed_actions::ResetUiFontSize, _window, cx| { if action.persist { - update_settings_file::(fs.clone(), cx, move |settings, _| { - settings.ui_font_size = None; + update_settings_file(fs.clone(), cx, move |settings, _| { + settings.theme.ui_font_size = None; }); } else { theme::reset_ui_font_size(cx); @@ -769,12 +825,13 @@ fn register_actions( let fs = app_state.fs.clone(); move |_, action: &zed_actions::IncreaseBufferFontSize, _window, cx| { if action.persist { - update_settings_file::(fs.clone(), cx, move |settings, cx| { + update_settings_file(fs.clone(), cx, move |settings, cx| { let buffer_font_size = ThemeSettings::get_global(cx).buffer_font_size(cx) + px(1.0); let _ = settings + .theme .buffer_font_size - .insert(theme::clamp_font_size(buffer_font_size).0); + .insert(theme::clamp_font_size(buffer_font_size).into()); }); } else { theme::adjust_buffer_font_size(cx, |size| size + px(1.0)); @@ -785,12 +842,13 @@ fn register_actions( let fs = app_state.fs.clone(); move |_, action: &zed_actions::DecreaseBufferFontSize, _window, cx| { if action.persist { - update_settings_file::(fs.clone(), cx, move |settings, cx| { + update_settings_file(fs.clone(), cx, move |settings, cx| { let buffer_font_size = ThemeSettings::get_global(cx).buffer_font_size(cx) - px(1.0); let _ = settings + .theme .buffer_font_size - .insert(theme::clamp_font_size(buffer_font_size).0); + .insert(theme::clamp_font_size(buffer_font_size).into()); }); } else { theme::adjust_buffer_font_size(cx, |size| size - px(1.0)); @@ -801,8 +859,8 @@ fn register_actions( let fs = app_state.fs.clone(); move |_, action: &zed_actions::ResetBufferFontSize, _window, cx| { if action.persist { - update_settings_file::(fs.clone(), cx, move |settings, _| { - settings.buffer_font_size = None; + update_settings_file(fs.clone(), cx, move |settings, _| { + settings.theme.buffer_font_size = None; }); } else { theme::reset_buffer_font_size(cx); @@ -1213,31 +1271,60 @@ pub fn handle_settings_file_changes( MigrationNotification::set_global(cx.new(|_| MigrationNotification), cx); // Helper function to process settings content - let process_settings = - move |content: String, is_user: bool, store: &mut SettingsStore, cx: &mut App| -> bool { - // Apply migrations to both user and global settings - let (processed_content, content_migrated) = - if let Ok(Some(migrated_content)) = migrate_settings(&content) { + let process_settings = move |content: String, + is_user: bool, + store: &mut SettingsStore, + cx: &mut App| + -> bool { + let id = NotificationId::Named("failed-to-migrate-settings".into()); + // Apply migrations to both user and global settings + let (processed_content, content_migrated) = match migrate_settings(&content) { + Ok(result) => { + dismiss_app_notification(&id, cx); + if let Some(migrated_content) = result { (migrated_content, true) } else { (content, false) - }; + } + } + Err(err) => { + show_app_notification(id, cx, move |cx| { + cx.new(|cx| { + MessageNotification::new( + format!( + "Failed to migrate settings\n\ + {err}" + ), + cx, + ) + .primary_message("Open Settings File") + .primary_icon(IconName::Settings) + .primary_on_click(|window, cx| { + window.dispatch_action(zed_actions::OpenSettingsFile.boxed_clone(), cx); + cx.emit(DismissEvent); + }) + }) + }); + // notify user here + (content, false) + } + }; - let result = if is_user { - store.set_user_settings(&processed_content, cx) - } else { - store.set_global_settings(&processed_content, cx) - }; + let result = if is_user { + store.set_user_settings(&processed_content, cx) + } else { + store.set_global_settings(&processed_content, cx) + }; - if let Err(err) = &result { - let settings_type = if is_user { "user" } else { "global" }; - log::error!("Failed to load {} settings: {err}", settings_type); - } + if let Err(err) = &result { + let settings_type = if is_user { "user" } else { "global" }; + log::error!("Failed to load {} settings: {err}", settings_type); + } - settings_changed(result.err(), cx); + settings_changed(result.err(), cx); - content_migrated - }; + content_migrated + }; // Initial load of both settings files let global_content = cx @@ -1416,7 +1503,7 @@ fn show_keymap_file_json_error( MessageNotification::new(message.clone(), cx) .primary_message("Open Keymap File") .primary_on_click(|window, cx| { - window.dispatch_action(zed_actions::OpenKeymap.boxed_clone(), cx); + window.dispatch_action(zed_actions::OpenKeymapFile.boxed_clone(), cx); cx.emit(DismissEvent); }) }) @@ -1433,7 +1520,7 @@ fn show_keymap_file_load_error( error_message, "Open Keymap File".into(), |window, cx| { - window.dispatch_action(zed_actions::OpenKeymap.boxed_clone(), cx); + window.dispatch_action(zed_actions::OpenKeymapFile.boxed_clone(), cx); cx.emit(DismissEvent); }, cx, @@ -1501,7 +1588,8 @@ fn reload_keymaps(cx: &mut App, mut user_key_bindings: Vec) { } cx.bind_keys(user_key_bindings); - cx.set_menus(app_menus()); + let menus = app_menus(cx); + cx.set_menus(menus); // On Windows, this is set in the `update_jump_list` method of the `HistoryManager`. #[cfg(not(target_os = "windows"))] cx.set_dock_menu(vec![gpui::MenuItem::action( @@ -1551,7 +1639,7 @@ pub fn handle_settings_changed(error: Option, cx: &mut App) { .primary_message("Open Settings File") .primary_icon(IconName::Settings) .primary_on_click(|window, cx| { - window.dispatch_action(zed_actions::OpenSettings.boxed_clone(), cx); + window.dispatch_action(zed_actions::OpenSettingsFile.boxed_clone(), cx); cx.emit(DismissEvent); }) }) @@ -1636,7 +1724,7 @@ fn open_project_debug_tasks_file( fn open_local_file( workspace: &mut Workspace, - settings_relative_path: &'static Path, + settings_relative_path: &'static RelPath, initial_contents: Cow<'static, str>, window: &mut Window, cx: &mut Context, @@ -1651,8 +1739,9 @@ fn open_local_file( cx.spawn_in(window, async move |workspace, cx| { // Check if the file actually exists on disk (even if it's excluded from worktree) let file_exists = { - let full_path = worktree - .read_with(cx, |tree, _| tree.abs_path().join(settings_relative_path))?; + let full_path = worktree.read_with(cx, |tree, _| { + tree.abs_path().join(settings_relative_path.as_std_path()) + })?; let fs = project.read_with(cx, |project, _| project.fs().clone())?; @@ -1932,6 +2021,55 @@ fn capture_recent_audio(workspace: &mut Workspace, _: &mut Window, cx: &mut Cont ); } +/// Eagerly loads the active theme and icon theme based on the selections in the +/// theme settings. +/// +/// This fast path exists to load these themes as soon as possible so the user +/// doesn't see the default themes while waiting on extensions to load. +pub(crate) fn eager_load_active_theme_and_icon_theme(fs: Arc, cx: &mut App) { + let extension_store = ExtensionStore::global(cx); + let theme_registry = ThemeRegistry::global(cx); + let theme_settings = ThemeSettings::get_global(cx); + let appearance = SystemAppearance::global(cx).0; + + let theme_name = theme_settings.theme.name(appearance); + if matches!( + theme_registry.get(&theme_name.0), + Err(ThemeNotFoundError(_)) + ) && let Some(theme_path) = extension_store + .read(cx) + .path_to_extension_theme(&theme_name.0) + { + if cx + .background_executor() + .block(theme_registry.load_user_theme(&theme_path, fs.clone())) + .log_err() + .is_some() + { + GlobalTheme::reload_theme(cx); + } + } + + let theme_settings = ThemeSettings::get_global(cx); + let icon_theme_name = theme_settings.icon_theme.name(appearance); + if matches!( + theme_registry.get_icon_theme(&icon_theme_name.0), + Err(IconThemeNotFoundError(_)) + ) && let Some((icon_theme_path, icons_root_path)) = extension_store + .read(cx) + .path_to_extension_icon_theme(&icon_theme_name.0) + { + if cx + .background_executor() + .block(theme_registry.load_icon_theme(&icon_theme_path, &icons_root_path, fs)) + .log_err() + .is_some() + { + GlobalTheme::reload_icon_theme(cx); + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -1944,15 +2082,18 @@ mod tests { }; use language::{LanguageMatcher, LanguageRegistry}; use pretty_assertions::{assert_eq, assert_ne}; - use project::{Project, ProjectPath, WorktreeSettings, project_settings::ProjectSettings}; + use project::{Project, ProjectPath}; use serde_json::json; use settings::{SettingsStore, watch_config_file}; use std::{ path::{Path, PathBuf}, time::Duration, }; - use theme::{ThemeRegistry, ThemeSettings}; - use util::path; + use theme::ThemeRegistry; + use util::{ + path, + rel_path::{RelPath, rel_path}, + }; use workspace::{ NewFile, OpenOptions, OpenVisible, SERIALIZATION_THROTTLE_TIME, SaveIntent, SplitDirection, WorkspaceHandle, @@ -2249,8 +2390,11 @@ mod tests { cx.update(|cx| { SettingsStore::update_global(cx, |store, cx| { - store.update_user_settings::(cx, |settings| { - settings.session.restore_unsaved_buffers = false + store.update_user_settings(cx, |settings| { + settings + .session + .get_or_insert_default() + .restore_unsaved_buffers = Some(false) }); }); }); @@ -2721,6 +2865,7 @@ mod tests { }) .await .unwrap(); + cx.run_until_parked(); assert_eq!(cx.update(|cx| cx.windows().len()), 1); let window = cx.update(|cx| cx.windows()[0].downcast::().unwrap()); let workspace = window.root(cx).unwrap(); @@ -2729,7 +2874,7 @@ mod tests { fn assert_project_panel_selection( workspace: &Workspace, expected_worktree_path: &Path, - expected_entry_path: &Path, + expected_entry_path: &RelPath, cx: &App, ) { let project_panel = [ @@ -2772,12 +2917,13 @@ mod tests { }) .unwrap() .await; + cx.run_until_parked(); cx.read(|cx| { let workspace = workspace.read(cx); assert_project_panel_selection( workspace, Path::new(path!("/dir1")), - Path::new("a.txt"), + rel_path("a.txt"), cx, ); assert_eq!( @@ -2810,12 +2956,13 @@ mod tests { }) .unwrap() .await; + cx.run_until_parked(); cx.read(|cx| { let workspace = workspace.read(cx); assert_project_panel_selection( workspace, Path::new(path!("/dir2/b.txt")), - Path::new(""), + rel_path(""), cx, ); let worktree_roots = workspace @@ -2859,12 +3006,13 @@ mod tests { }) .unwrap() .await; + cx.run_until_parked(); cx.read(|cx| { let workspace = workspace.read(cx); assert_project_panel_selection( workspace, Path::new(path!("/dir3")), - Path::new("c.txt"), + rel_path("c.txt"), cx, ); let worktree_roots = workspace @@ -2908,14 +3056,10 @@ mod tests { }) .unwrap() .await; + cx.run_until_parked(); cx.read(|cx| { let workspace = workspace.read(cx); - assert_project_panel_selection( - workspace, - Path::new(path!("/d.txt")), - Path::new(""), - cx, - ); + assert_project_panel_selection(workspace, Path::new(path!("/d.txt")), rel_path(""), cx); let worktree_roots = workspace .worktrees(cx) .map(|w| w.read(cx).as_local().unwrap().abs_path().as_ref()) @@ -2965,8 +3109,8 @@ mod tests { let app_state = init_test(cx); cx.update(|cx| { cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |project_settings| { - project_settings.file_scan_exclusions = + store.update_user_settings(cx, |project_settings| { + project_settings.project.worktree.file_scan_exclusions = Some(vec!["excluded_dir".to_string(), "**/.git".to_string()]); }); }); @@ -3041,9 +3185,7 @@ mod tests { .zip(paths_to_open.iter()) .map(|(i, path)| { match i { - Some(Ok(i)) => { - Some(i.project_path(cx).map(|p| p.path.display().to_string())) - } + Some(Ok(i)) => Some(i.project_path(cx).map(|p| p.path)), Some(Err(e)) => panic!("Excluded file {path:?} failed to open: {e:?}"), None => None, } @@ -3056,8 +3198,8 @@ mod tests { opened_paths, vec![ None, - Some(path!(".git/HEAD").to_string()), - Some(path!("excluded_dir/file").to_string()), + Some(rel_path(".git/HEAD").into()), + Some(rel_path("excluded_dir/file").into()), ], "Excluded files should get opened, excluded dir should not get opened" ); @@ -3076,14 +3218,12 @@ mod tests { i.project_path(cx) .expect("all excluded files that got open should have a path") .path - .display() - .to_string() }) .collect::>(); opened_buffer_paths.sort(); assert_eq!( opened_buffer_paths, - vec![path!(".git/HEAD").to_string(), path!("excluded_dir/file").to_string()], + vec![rel_path(".git/HEAD").into(), rel_path("excluded_dir/file").into()], "Despite not being present in the worktrees, buffers for excluded files are opened and added to the pane" ); }); @@ -3276,7 +3416,7 @@ mod tests { cx, ); workspace.open_path( - (worktree.read(cx).id(), "the-new-name.rs"), + (worktree.read(cx).id(), rel_path("the-new-name.rs")), None, true, window, @@ -3836,7 +3976,7 @@ mod tests { fn active_location( workspace: &WindowHandle, cx: &mut TestAppContext, - ) -> (ProjectPath, DisplayPoint, f32) { + ) -> (ProjectPath, DisplayPoint, f64) { workspace .update(cx, |workspace, _, cx| { let item = workspace.active_item(cx).unwrap(); @@ -4380,8 +4520,10 @@ mod tests { | "workspace::OpenTerminal" | "workspace::SendKeystrokes" | "agent::NewNativeAgentThreadFromSummary" + | "action::Sequence" | "zed::OpenBrowser" - | "zed::OpenZedUrl" => {} + | "zed::OpenZedUrl" + | "settings_editor::FocusFile" => {} _ => { let result = cx.build_action(action, None); match &result { @@ -4441,6 +4583,7 @@ mod tests { assert_eq!(actions_without_namespace, Vec::<&str>::new()); let expected_namespaces = vec![ + "action", "activity_indicator", "agent", #[cfg(not(target_os = "macos"))] @@ -4472,7 +4615,6 @@ mod tests { "git_panel", "go_to_line", "icon_theme_selector", - "jj", "journal", "keymap_editor", "keystroke_input", @@ -4496,6 +4638,7 @@ mod tests { "repl", "rules_library", "search", + "settings_editor", "settings_profile_selector", "snippets", "stash_picker", @@ -4514,6 +4657,7 @@ mod tests { "window", "workspace", "zed", + "zed_actions", "zed_predict_onboarding", "zeta", ]; @@ -4550,7 +4694,7 @@ mod tests { for theme_name in themes.list().into_iter().map(|meta| meta.name) { let theme = themes.get(&theme_name).unwrap(); assert_eq!(theme.name, theme_name); - if theme.name == ThemeSettings::get(None, cx).active_theme.name { + if theme.name.as_ref() == "One Dark" { has_default_theme = true; } } @@ -4795,8 +4939,9 @@ mod tests { // 3. Add .zed to file scan exclusions in user settings cx.update_global::(|store, cx| { - store.update_user_settings::(cx, |worktree_settings| { - worktree_settings.file_scan_exclusions = Some(vec![".zed".to_string()]); + store.update_user_settings(cx, |worktree_settings| { + worktree_settings.project.worktree.file_scan_exclusions = + Some(vec![".zed".to_string()]); }); }); @@ -4808,7 +4953,8 @@ mod tests { // 5. Critical: Verify .zed is actually excluded from worktree let worktree = cx.update(|cx| project.read(cx).worktrees(cx).next().unwrap()); - let has_zed_entry = cx.update(|cx| worktree.read(cx).entry_for_path(".zed").is_some()); + let has_zed_entry = + cx.update(|cx| worktree.read(cx).entry_for_path(rel_path(".zed")).is_some()); eprintln!( "Is .zed directory visible in worktree after exclusion: {}", @@ -4856,34 +5002,4 @@ mod tests { "BUG FOUND: Project settings were overwritten when opening via command - original custom content was lost" ); } - - #[gpui::test] - fn test_settings_defaults(cx: &mut TestAppContext) { - cx.update(|cx| { - settings::init(cx); - workspace::init_settings(cx); - title_bar::init(cx); - editor::init_settings(cx); - debugger_ui::init(cx); - }); - let default_json = - cx.read(|cx| cx.global::().raw_default_settings().clone()); - - let all_paths = cx.read(|cx| settings_ui::SettingsUiTree::new(cx).all_paths(cx)); - let mut failures = Vec::new(); - for path in all_paths { - if settings_ui::read_settings_value_from_path(&default_json, &path).is_none() { - failures.push(path); - } - } - if !failures.is_empty() { - panic!( - "No default value found for paths: {:#?}", - failures - .into_iter() - .map(|path| path.join(".")) - .collect::>() - ); - } - } } diff --git a/crates/zed/src/zed/app_menus.rs b/crates/zed/src/zed/app_menus.rs index dea36e3ea2b2dd4319d9cb5bb156d5b0956c7535..cd18503f61be4a712caf5e4399f794b12c6bf889 100644 --- a/crates/zed/src/zed/app_menus.rs +++ b/crates/zed/src/zed/app_menus.rs @@ -1,37 +1,88 @@ use collab_ui::collab_panel; -use gpui::{Menu, MenuItem, OsAction}; +use gpui::{App, Menu, MenuItem, OsAction}; +use release_channel::ReleaseChannel; use terminal_view::terminal_panel; -use zed_actions::ToggleFocus as ToggleDebugPanel; +use zed_actions::{ToggleFocus as ToggleDebugPanel, dev}; -pub fn app_menus() -> Vec { +pub fn app_menus(cx: &mut App) -> Vec { use zed_actions::Quit; + let mut view_items = vec![ + MenuItem::action( + "Zoom In", + zed_actions::IncreaseBufferFontSize { persist: false }, + ), + MenuItem::action( + "Zoom Out", + zed_actions::DecreaseBufferFontSize { persist: false }, + ), + MenuItem::action( + "Reset Zoom", + zed_actions::ResetBufferFontSize { persist: false }, + ), + MenuItem::separator(), + MenuItem::action("Toggle Left Dock", workspace::ToggleLeftDock), + MenuItem::action("Toggle Right Dock", workspace::ToggleRightDock), + MenuItem::action("Toggle Bottom Dock", workspace::ToggleBottomDock), + MenuItem::action("Close All Docks", workspace::CloseAllDocks), + MenuItem::submenu(Menu { + name: "Editor Layout".into(), + items: vec![ + MenuItem::action("Split Up", workspace::SplitUp), + MenuItem::action("Split Down", workspace::SplitDown), + MenuItem::action("Split Left", workspace::SplitLeft), + MenuItem::action("Split Right", workspace::SplitRight), + ], + }), + MenuItem::separator(), + MenuItem::action("Project Panel", project_panel::ToggleFocus), + MenuItem::action("Outline Panel", outline_panel::ToggleFocus), + MenuItem::action("Collab Panel", collab_panel::ToggleFocus), + MenuItem::action("Terminal Panel", terminal_panel::ToggleFocus), + MenuItem::action("Debugger Panel", ToggleDebugPanel), + MenuItem::separator(), + MenuItem::action("Diagnostics", diagnostics::Deploy), + MenuItem::separator(), + ]; + + if ReleaseChannel::try_global(cx) == Some(ReleaseChannel::Dev) { + view_items.push(MenuItem::action( + "Toggle GPUI Inspector", + dev::ToggleInspector, + )); + view_items.push(MenuItem::separator()); + } + vec![ Menu { name: "Zed".into(), items: vec![ - MenuItem::action("About Zed…", zed_actions::About), + MenuItem::action("About Zed", zed_actions::About), MenuItem::action("Check for Updates", auto_update::Check), MenuItem::separator(), MenuItem::submenu(Menu { name: "Settings".into(), items: vec![ - MenuItem::action("Open Settings", super::OpenSettings), - MenuItem::action("Open Key Bindings", zed_actions::OpenKeymapEditor), + MenuItem::action("Open Settings", zed_actions::OpenSettings), + MenuItem::action("Open Settings File", super::OpenSettingsFile), + MenuItem::action("Open Project Settings", super::OpenProjectSettings), MenuItem::action("Open Default Settings", super::OpenDefaultSettings), + MenuItem::separator(), + MenuItem::action("Open Keymap", zed_actions::OpenKeymap), + MenuItem::action("Open Keymap File", zed_actions::OpenKeymapFile), MenuItem::action( "Open Default Key Bindings", zed_actions::OpenDefaultKeymap, ), - MenuItem::action("Open Project Settings", super::OpenProjectSettings), - MenuItem::action( - "Select Settings Profile...", - zed_actions::settings_profile_selector::Toggle, - ), + MenuItem::separator(), MenuItem::action( "Select Theme...", zed_actions::theme_selector::Toggle::default(), ), + MenuItem::action( + "Select Icon Theme...", + zed_actions::icon_theme_selector::Toggle::default(), + ), ], }), MenuItem::separator(), @@ -142,6 +193,13 @@ pub fn app_menus() -> Vec { replace_newest: false, }, ), + MenuItem::action( + "Select Previous Occurrence", + editor::actions::SelectPrevious { + replace_newest: false, + }, + ), + MenuItem::action("Select All Occurrences", editor::actions::SelectAllMatches), MenuItem::separator(), MenuItem::action("Move Line Up", editor::actions::MoveLineUp), MenuItem::action("Move Line Down", editor::actions::MoveLineDown), @@ -150,43 +208,7 @@ pub fn app_menus() -> Vec { }, Menu { name: "View".into(), - items: vec![ - MenuItem::action( - "Zoom In", - zed_actions::IncreaseBufferFontSize { persist: false }, - ), - MenuItem::action( - "Zoom Out", - zed_actions::DecreaseBufferFontSize { persist: false }, - ), - MenuItem::action( - "Reset Zoom", - zed_actions::ResetBufferFontSize { persist: false }, - ), - MenuItem::separator(), - MenuItem::action("Toggle Left Dock", workspace::ToggleLeftDock), - MenuItem::action("Toggle Right Dock", workspace::ToggleRightDock), - MenuItem::action("Toggle Bottom Dock", workspace::ToggleBottomDock), - MenuItem::action("Close All Docks", workspace::CloseAllDocks), - MenuItem::submenu(Menu { - name: "Editor Layout".into(), - items: vec![ - MenuItem::action("Split Up", workspace::SplitUp), - MenuItem::action("Split Down", workspace::SplitDown), - MenuItem::action("Split Left", workspace::SplitLeft), - MenuItem::action("Split Right", workspace::SplitRight), - ], - }), - MenuItem::separator(), - MenuItem::action("Project Panel", project_panel::ToggleFocus), - MenuItem::action("Outline Panel", outline_panel::ToggleFocus), - MenuItem::action("Collab Panel", collab_panel::ToggleFocus), - MenuItem::action("Terminal Panel", terminal_panel::ToggleFocus), - MenuItem::action("Debugger Panel", ToggleDebugPanel), - MenuItem::separator(), - MenuItem::action("Diagnostics", diagnostics::Deploy), - MenuItem::separator(), - ], + items: view_items, }, Menu { name: "Go".into(), @@ -252,13 +274,16 @@ pub fn app_menus() -> Vec { name: "Help".into(), items: vec![ MenuItem::action( - "View Release Notes", + "View Release Notes Locally", auto_update_ui::ViewReleaseNotesLocally, ), MenuItem::action("View Telemetry", zed_actions::OpenTelemetryLog), MenuItem::action("View Dependency Licenses", zed_actions::OpenLicenses), MenuItem::action("Show Welcome", onboarding::ShowWelcome), - MenuItem::action("Give Feedback...", zed_actions::feedback::GiveFeedback), + MenuItem::separator(), + MenuItem::action("File Bug Report...", zed_actions::feedback::FileBugReport), + MenuItem::action("Request Feature...", zed_actions::feedback::RequestFeature), + MenuItem::action("Email Us...", zed_actions::feedback::EmailZed), MenuItem::separator(), MenuItem::action( "Documentation", @@ -266,6 +291,7 @@ pub fn app_menus() -> Vec { url: "https://zed.dev/docs".into(), }, ), + MenuItem::action("Zed Repository", feedback::OpenZedRepo), MenuItem::action( "Zed Twitter", super::OpenBrowser { diff --git a/crates/zed/src/zed/component_preview.rs b/crates/zed/src/zed/component_preview.rs index 176b176d59b23ed7f605988cf682c9d52dfdb95b..7a287cf3d83f24e7f4d42221bda420053a975860 100644 --- a/crates/zed/src/zed/component_preview.rs +++ b/crates/zed/src/zed/component_preview.rs @@ -216,7 +216,7 @@ impl ComponentPreview { } fn scope_ordered_entries(&self) -> Vec { - use std::collections::HashMap; + use collections::HashMap; let mut scope_groups: HashMap< ComponentScope, diff --git a/crates/zed/src/zed/edit_prediction_registry.rs b/crates/zed/src/zed/edit_prediction_registry.rs index ae26427fc6547079b163235f5d1c3df26a489795..a9bd0395347dadcb9caa706fcbcc81f58d6af944 100644 --- a/crates/zed/src/zed/edit_prediction_registry.rs +++ b/crates/zed/src/zed/edit_prediction_registry.rs @@ -1,9 +1,11 @@ use client::{Client, UserStore}; +use codestral::CodestralCompletionProvider; use collections::HashMap; use copilot::{Copilot, CopilotCompletionProvider}; use editor::Editor; use gpui::{AnyWindowHandle, App, AppContext as _, Context, Entity, WeakEntity}; use language::language_settings::{EditPredictionProvider, all_language_settings}; +use language_models::MistralLanguageModelProvider; use settings::SettingsStore; use std::{cell::RefCell, rc::Rc, sync::Arc}; use supermaven::{Supermaven, SupermavenCompletionProvider}; @@ -97,6 +99,8 @@ pub fn init(client: Arc, user_store: Entity, cx: &mut App) { fn clear_zeta_edit_history(_: &zeta::ClearHistory, cx: &mut App) { if let Some(zeta) = zeta::Zeta::global(cx) { zeta.update(cx, |zeta, _| zeta.clear_history()); + } else if let Some(zeta) = zeta2::Zeta::try_global(cx) { + zeta.update(cx, |zeta, _| zeta.clear_history()); } } @@ -107,6 +111,10 @@ fn assign_edit_prediction_providers( user_store: Entity, cx: &mut App, ) { + if provider == EditPredictionProvider::Codestral { + let mistral = MistralLanguageModelProvider::global(client.http_client(), cx); + mistral.load_codestral_api_key(cx).detach(); + } for (editor, window) in editors.borrow().iter() { _ = window.update(cx, |_window, window, cx| { _ = editor.update(cx, |editor, cx| { @@ -187,6 +195,11 @@ fn assign_edit_prediction_provider( editor.set_edit_prediction_provider(Some(provider), window, cx); } } + EditPredictionProvider::Codestral => { + let http_client = client.http_client(); + let provider = cx.new(|_| CodestralCompletionProvider::new(http_client)); + editor.set_edit_prediction_provider(Some(provider), window, cx); + } EditPredictionProvider::Zed => { if user_store.read(cx).current_user().is_some() { let mut worktree = None; @@ -203,21 +216,49 @@ fn assign_edit_prediction_provider( } } - let zeta = zeta::Zeta::register(worktree, client.clone(), user_store, cx); + if let Some(project) = editor.project() { + if std::env::var("ZED_ZETA2").is_ok() { + let zeta = zeta2::Zeta::global(client, &user_store, cx); + let provider = cx.new(|cx| { + zeta2::ZetaEditPredictionProvider::new( + project.clone(), + &client, + &user_store, + cx, + ) + }); - if let Some(buffer) = &singleton_buffer - && buffer.read(cx).file().is_some() - && let Some(project) = editor.project() - { - zeta.update(cx, |zeta, cx| { - zeta.register_buffer(buffer, project, cx); - }); - } + // TODO [zeta2] handle multibuffers + if let Some(buffer) = &singleton_buffer + && buffer.read(cx).file().is_some() + { + zeta.update(cx, |zeta, cx| { + zeta.register_buffer(buffer, project, cx); + }); + } - let provider = - cx.new(|_| zeta::ZetaEditPredictionProvider::new(zeta, singleton_buffer)); + editor.set_edit_prediction_provider(Some(provider), window, cx); + } else { + let zeta = zeta::Zeta::register(worktree, client.clone(), user_store, cx); - editor.set_edit_prediction_provider(Some(provider), window, cx); + if let Some(buffer) = &singleton_buffer + && buffer.read(cx).file().is_some() + { + zeta.update(cx, |zeta, cx| { + zeta.register_buffer(buffer, project, cx); + }); + } + + let provider = cx.new(|_| { + zeta::ZetaEditPredictionProvider::new( + zeta, + project.clone(), + singleton_buffer, + ) + }); + editor.set_edit_prediction_provider(Some(provider), window, cx); + } + } } } } diff --git a/crates/zed/src/zed/mac_only_instance.rs b/crates/zed/src/zed/mac_only_instance.rs index cb9641e9dfe55660e301faa46d47e1a4b8511466..b7898fae176d3a68f0664a6ed4dddc0a59b87cec 100644 --- a/crates/zed/src/zed/mac_only_instance.rs +++ b/crates/zed/src/zed/mac_only_instance.rs @@ -107,18 +107,21 @@ pub fn ensure_only_instance() -> IsOnlyInstance { } }; - thread::spawn(move || { - for stream in listener.incoming() { - let mut stream = match stream { - Ok(stream) => stream, - Err(_) => return, - }; - - _ = stream.set_nodelay(true); - _ = stream.set_read_timeout(Some(SEND_TIMEOUT)); - _ = stream.write_all(instance_handshake().as_bytes()); - } - }); + thread::Builder::new() + .name("EnsureSingleton".to_string()) + .spawn(move || { + for stream in listener.incoming() { + let mut stream = match stream { + Ok(stream) => stream, + Err(_) => return, + }; + + _ = stream.set_nodelay(true); + _ = stream.set_read_timeout(Some(SEND_TIMEOUT)); + _ = stream.write_all(instance_handshake().as_bytes()); + } + }) + .unwrap(); IsOnlyInstance::Yes } diff --git a/crates/zed/src/zed/open_listener.rs b/crates/zed/src/zed/open_listener.rs index f2d8cd46c301c0f688d36e17ed1b7d0dcd31ec00..a8a998b6580269de150280c432c329cf59c30c22 100644 --- a/crates/zed/src/zed/open_listener.rs +++ b/crates/zed/src/zed/open_listener.rs @@ -46,6 +46,7 @@ pub enum OpenRequestKind { Extension { extension_id: String }, AgentPanel, DockMenuAction { index: usize }, + BuiltinJsonSchema { schema_path: String }, } impl OpenRequest { @@ -88,6 +89,10 @@ impl OpenRequest { }); } else if url == "zed://agent" { this.kind = Some(OpenRequestKind::AgentPanel); + } else if let Some(schema_path) = url.strip_prefix("zed://schemas/") { + this.kind = Some(OpenRequestKind::BuiltinJsonSchema { + schema_path: schema_path.to_string(), + }); } else if url.starts_with("ssh://") { this.parse_ssh_file_path(&url, cx)? } else if let Some(request_path) = parse_zed_link(&url, cx) { @@ -429,7 +434,7 @@ async fn open_workspaces( let workspace_paths = workspace_paths .paths() .iter() - .map(|path| path.to_string_lossy().to_string()) + .map(|path| path.to_string_lossy().into_owned()) .collect(); let workspace_failed_to_open = open_local_workspace( diff --git a/crates/zed/src/zed/quick_action_bar.rs b/crates/zed/src/zed/quick_action_bar.rs index de1979239dc6016c20351aebead7e84f3c8433a4..2c888d71cd7469e33dba7b59b3c3386531434166 100644 --- a/crates/zed/src/zed/quick_action_bar.rs +++ b/crates/zed/src/zed/quick_action_bar.rs @@ -15,7 +15,6 @@ use gpui::{ FocusHandle, Focusable, InteractiveElement, ParentElement, Render, Styled, Subscription, WeakEntity, Window, anchored, deferred, point, }; -use project::DisableAiSettings; use project::project_settings::DiagnosticSeverity; use search::{BufferSearchBar, buffer_search}; use settings::{Settings, SettingsStore}; @@ -24,6 +23,7 @@ use ui::{ IconName, IconSize, PopoverMenu, PopoverMenuHandle, Tooltip, prelude::*, }; use vim_mode_setting::VimModeSetting; +use workspace::item::ItemBufferKind; use workspace::{ ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace, item::ItemHandle, }; @@ -48,20 +48,15 @@ impl QuickActionBar { workspace: &Workspace, cx: &mut Context, ) -> Self { - let mut was_ai_disabled = DisableAiSettings::get_global(cx).disable_ai; - let mut was_agent_enabled = AgentSettings::get_global(cx).enabled; + let mut was_agent_enabled = AgentSettings::get_global(cx).enabled(cx); let mut was_agent_button = AgentSettings::get_global(cx).button; let ai_settings_subscription = cx.observe_global::(move |_, cx| { - let is_ai_disabled = DisableAiSettings::get_global(cx).disable_ai; let agent_settings = AgentSettings::get_global(cx); + let is_agent_enabled = agent_settings.enabled(cx); - if was_ai_disabled != is_ai_disabled - || was_agent_enabled != agent_settings.enabled - || was_agent_button != agent_settings.button - { - was_ai_disabled = is_ai_disabled; - was_agent_enabled = agent_settings.enabled; + if was_agent_enabled != is_agent_enabled || was_agent_button != agent_settings.button { + was_agent_enabled = is_agent_enabled; was_agent_button = agent_settings.button; cx.notify(); } @@ -137,7 +132,7 @@ impl Render for QuickActionBar { let code_action_enabled = editor_value.code_actions_enabled_for_toolbar(cx); let focus_handle = editor_value.focus_handle(cx); - let search_button = editor.is_singleton(cx).then(|| { + let search_button = (editor.buffer_kind(cx) == ItemBufferKind::Singleton).then(|| { QuickActionBarButton::new( "toggle buffer search", search::SEARCH_ICON, @@ -594,9 +589,7 @@ impl Render for QuickActionBar { .children(self.render_preview_button(self.workspace.clone(), cx)) .children(search_button) .when( - AgentSettings::get_global(cx).enabled - && AgentSettings::get_global(cx).button - && !DisableAiSettings::get_global(cx).disable_ai, + AgentSettings::get_global(cx).enabled(cx) && AgentSettings::get_global(cx).button, |bar| bar.child(assistant_button), ) .children(code_actions_dropdown) diff --git a/crates/zed/src/zed/windows_only_instance.rs b/crates/zed/src/zed/windows_only_instance.rs index 1dd51b5ffbd7c11cce0346142834581c022f512d..45f3cd158bb38156a0981f01e5331dc0aead91c9 100644 --- a/crates/zed/src/zed/windows_only_instance.rs +++ b/crates/zed/src/zed/windows_only_instance.rs @@ -42,14 +42,17 @@ pub fn handle_single_instance(opener: OpenListener, args: &Args) -> bool { let is_first_instance = is_first_instance(); if is_first_instance { // We are the first instance, listen for messages sent from other instances - std::thread::spawn(move || { - with_pipe(|url| { - opener.open(RawOpenRequest { - urls: vec![url], - ..Default::default() + std::thread::Builder::new() + .name("EnsureSingleton".to_owned()) + .spawn(move || { + with_pipe(|url| { + opener.open(RawOpenRequest { + urls: vec![url], + ..Default::default() + }) }) }) - }); + .unwrap(); } else if !args.foreground { // We are not the first instance, send args to the first instance send_args_to_instance(args).log_err(); @@ -101,7 +104,7 @@ fn retrieve_message_from_pipe_inner(pipe: HANDLE) -> anyhow::Result { ReadFile(pipe, Some(&mut buffer), None, None)?; } let message = std::ffi::CStr::from_bytes_until_nul(&buffer)?; - Ok(message.to_string_lossy().to_string()) + Ok(message.to_string_lossy().into_owned()) } // This part of code is mostly from crates/cli/src/main.rs @@ -121,7 +124,7 @@ fn send_args_to_instance(args: &Args) -> anyhow::Result<()> { let mut diff_paths = vec![]; for path in args.paths_or_urls.iter() { match std::fs::canonicalize(&path) { - Ok(path) => paths.push(path.to_string_lossy().to_string()), + Ok(path) => paths.push(path.to_string_lossy().into_owned()), Err(error) => { if path.starts_with("zed://") || path.starts_with("http://") @@ -142,8 +145,8 @@ fn send_args_to_instance(args: &Args) -> anyhow::Result<()> { let new = std::fs::canonicalize(&path[1]).log_err(); if let Some((old, new)) = old.zip(new) { diff_paths.push([ - old.to_string_lossy().to_string(), - new.to_string_lossy().to_string(), + old.to_string_lossy().into_owned(), + new.to_string_lossy().into_owned(), ]); } } @@ -161,28 +164,31 @@ fn send_args_to_instance(args: &Args) -> anyhow::Result<()> { }; let exit_status = Arc::new(Mutex::new(None)); - let sender: JoinHandle> = std::thread::spawn({ - let exit_status = exit_status.clone(); - move || { - let (_, handshake) = server.accept().context("Handshake after Zed spawn")?; - let (tx, rx) = (handshake.requests, handshake.responses); - - tx.send(request)?; - - while let Ok(response) = rx.recv() { - match response { - CliResponse::Ping => {} - CliResponse::Stdout { message } => log::info!("{message}"), - CliResponse::Stderr { message } => log::error!("{message}"), - CliResponse::Exit { status } => { - exit_status.lock().replace(status); - return Ok(()); + let sender: JoinHandle> = std::thread::Builder::new() + .name("CliReceiver".to_owned()) + .spawn({ + let exit_status = exit_status.clone(); + move || { + let (_, handshake) = server.accept().context("Handshake after Zed spawn")?; + let (tx, rx) = (handshake.requests, handshake.responses); + + tx.send(request)?; + + while let Ok(response) = rx.recv() { + match response { + CliResponse::Ping => {} + CliResponse::Stdout { message } => log::info!("{message}"), + CliResponse::Stderr { message } => log::error!("{message}"), + CliResponse::Exit { status } => { + exit_status.lock().replace(status); + return Ok(()); + } } } + Ok(()) } - Ok(()) - } - }); + }) + .unwrap(); write_message_to_instance_pipe(url.as_bytes())?; sender.join().unwrap()?; diff --git a/crates/zed_actions/src/lib.rs b/crates/zed_actions/src/lib.rs index fd979b3648b9a84aa89039386f8ac300e28d4771..d62de329c9af63ab8c15e1703b2517ac12594195 100644 --- a/crates/zed_actions/src/lib.rs +++ b/crates/zed_actions/src/lib.rs @@ -30,20 +30,26 @@ pub struct OpenZedUrl { actions!( zed, [ - /// Opens the settings editor. + #[action(deprecated_aliases = ["zed_actions::OpenSettingsEditor"])] OpenSettings, + /// Opens the settings JSON file. + #[action(deprecated_aliases = ["zed_actions::OpenSettings"])] + OpenSettingsFile, + /// Opens the settings editor. /// Opens the default keymap file. OpenDefaultKeymap, + /// Opens the user keymap file. + #[action(deprecated_aliases = ["zed_actions::OpenKeymap"])] + OpenKeymapFile, + /// Opens the keymap editor. + #[action(deprecated_aliases = ["zed_actions::OpenKeymapEditor"])] + OpenKeymap, /// Opens account settings. OpenAccountSettings, - /// Opens the keymap editor. - OpenKeymapEditor, /// Opens server settings. OpenServerSettings, /// Quits the application. Quit, - /// Opens the user keymap file. - OpenKeymap, /// Shows information about Zed. About, /// Opens the documentation website. @@ -187,18 +193,6 @@ pub mod git { ); } -pub mod jj { - use gpui::actions; - - actions!( - jj, - [ - /// Opens the Jujutsu bookmark list. - BookmarkList - ] - ); -} - pub mod toast { use gpui::actions; @@ -229,10 +223,12 @@ pub mod feedback { actions!( feedback, [ + /// Opens email client to send feedback to Zed support. + EmailZed, /// Opens the bug report form. FileBugReport, - /// Opens the feedback form. - GiveFeedback + /// Opens the feature request form. + RequestFeature ] ); } @@ -497,3 +493,28 @@ actions!( OpenProjectDebugTasks, ] ); + +#[cfg(target_os = "windows")] +pub mod wsl_actions { + use gpui::Action; + use schemars::JsonSchema; + use serde::Deserialize; + + /// Opens a folder inside Wsl. + #[derive(PartialEq, Clone, Deserialize, Default, JsonSchema, Action)] + #[action(namespace = projects)] + #[serde(deny_unknown_fields)] + pub struct OpenFolderInWsl { + #[serde(default)] + pub create_new_window: bool, + } + + /// Open a wsl distro. + #[derive(PartialEq, Clone, Deserialize, Default, JsonSchema, Action)] + #[action(namespace = projects)] + #[serde(deny_unknown_fields)] + pub struct OpenWsl { + #[serde(default)] + pub create_new_window: bool, + } +} diff --git a/crates/zed_env_vars/Cargo.toml b/crates/zed_env_vars/Cargo.toml index 9abfc410e7e74774c4e9e7608e8c1c3824ebc3c1..f56e3dd529cc7a8001d0021e96902f55034f88e2 100644 --- a/crates/zed_env_vars/Cargo.toml +++ b/crates/zed_env_vars/Cargo.toml @@ -16,3 +16,4 @@ default = [] [dependencies] workspace-hack.workspace = true +gpui.workspace = true diff --git a/crates/zed_env_vars/src/zed_env_vars.rs b/crates/zed_env_vars/src/zed_env_vars.rs index d1679a0518f2bae857364b0035b6184350ffca55..53b9c22bb207e81831d1d9ae6087d1a297331d3f 100644 --- a/crates/zed_env_vars/src/zed_env_vars.rs +++ b/crates/zed_env_vars/src/zed_env_vars.rs @@ -1,6 +1,44 @@ +use gpui::SharedString; use std::sync::LazyLock; /// Whether Zed is running in stateless mode. /// When true, Zed will use in-memory databases instead of persistent storage. -pub static ZED_STATELESS: LazyLock = - LazyLock::new(|| std::env::var("ZED_STATELESS").is_ok_and(|v| !v.is_empty())); +pub static ZED_STATELESS: LazyLock = bool_env_var!("ZED_STATELESS"); + +pub struct EnvVar { + pub name: SharedString, + /// Value of the environment variable. Also `None` when set to an empty string. + pub value: Option, +} + +impl EnvVar { + pub fn new(name: SharedString) -> Self { + let value = std::env::var(name.as_str()).ok(); + if value.as_ref().is_some_and(|v| v.is_empty()) { + Self { name, value: None } + } else { + Self { name, value } + } + } + + pub fn or(self, other: EnvVar) -> EnvVar { + if self.value.is_some() { self } else { other } + } +} + +/// Creates a `LazyLock` expression for use in a `static` declaration. +#[macro_export] +macro_rules! env_var { + ($name:expr) => { + LazyLock::new(|| $crate::EnvVar::new(($name).into())) + }; +} + +/// Generates a `LazyLock` expression for use in a `static` declaration. Checks if the +/// environment variable exists and is non-empty. +#[macro_export] +macro_rules! bool_env_var { + ($name:expr) => { + LazyLock::new(|| $crate::EnvVar::new(($name).into()).value.is_some()) + }; +} diff --git a/crates/zeta/src/init.rs b/crates/zeta/src/init.rs index f27667de6332bf4c3b8d2d705f281c9e3ba96a83..0167d878fa34976d7175a64269d9dfe29d18d8fe 100644 --- a/crates/zeta/src/init.rs +++ b/crates/zeta/src/init.rs @@ -3,7 +3,7 @@ use std::any::{Any, TypeId}; use command_palette_hooks::CommandPaletteFilter; use feature_flags::{FeatureFlagAppExt as _, PredictEditsRateCompletionsFeatureFlag}; use gpui::actions; -use language::language_settings::{AllLanguageSettings, EditPredictionProvider}; +use language::language_settings::EditPredictionProvider; use project::DisableAiSettings; use settings::{Settings, SettingsStore, update_settings_file}; use ui::App; @@ -44,15 +44,14 @@ pub fn init(cx: &mut App) { ); workspace.register_action(|workspace, _: &ResetOnboarding, _window, cx| { - update_settings_file::( - workspace.app_state().fs.clone(), - cx, - move |file, _| { - file.features - .get_or_insert(Default::default()) - .edit_prediction_provider = Some(EditPredictionProvider::None) - }, - ); + update_settings_file(workspace.app_state().fs.clone(), cx, move |settings, _| { + settings + .project + .all_languages + .features + .get_or_insert_default() + .edit_prediction_provider = Some(EditPredictionProvider::None) + }); }); }) .detach(); diff --git a/crates/zeta/src/license_detection.rs b/crates/zeta/src/license_detection.rs index 6f27e00022a922241182a3d0b6ea0031333daf7c..44dae09d0a18e5732b9c52ce73cdf71abecc81b0 100644 --- a/crates/zeta/src/license_detection.rs +++ b/crates/zeta/src/license_detection.rs @@ -2,7 +2,7 @@ use std::{ collections::BTreeSet, fmt::{Display, Formatter}, ops::Range, - path::{Path, PathBuf}, + path::PathBuf, sync::{Arc, LazyLock}, }; @@ -14,7 +14,7 @@ use itertools::Itertools; use postage::watch; use project::Worktree; use strum::VariantArray; -use util::{ResultExt as _, maybe}; +use util::{ResultExt as _, maybe, rel_path::RelPath}; use worktree::ChildEntriesOptions; /// Matches the most common license locations, with US and UK English spelling. @@ -283,15 +283,14 @@ impl LicenseDetectionWatcher { return Self::Remote; }; let fs = local_worktree.fs().clone(); - let worktree_abs_path = local_worktree.abs_path().clone(); let options = ChildEntriesOptions { include_files: true, include_dirs: false, include_ignored: true, }; - for top_file in local_worktree.child_entries_with_options(Path::new(""), options) { - let path_bytes = top_file.path.as_os_str().as_encoded_bytes(); + for top_file in local_worktree.child_entries_with_options(RelPath::empty(), options) { + let path_bytes = top_file.path.as_unix_str().as_bytes(); if top_file.is_created() && LICENSE_FILE_NAME_REGEX.is_match(path_bytes) { let rel_path = top_file.path.clone(); files_to_check_tx.unbounded_send(rel_path).ok(); @@ -303,7 +302,7 @@ impl LicenseDetectionWatcher { worktree::Event::UpdatedEntries(updated_entries) => { for updated_entry in updated_entries.iter() { let rel_path = &updated_entry.0; - let path_bytes = rel_path.as_os_str().as_encoded_bytes(); + let path_bytes = rel_path.as_unix_str().as_bytes(); if LICENSE_FILE_NAME_REGEX.is_match(path_bytes) { files_to_check_tx.unbounded_send(rel_path.clone()).ok(); } @@ -312,12 +311,13 @@ impl LicenseDetectionWatcher { worktree::Event::DeletedEntry(_) | worktree::Event::UpdatedGitRepositories(_) => {} }); + let worktree_snapshot = worktree.read(cx).snapshot(); let (mut is_open_source_tx, is_open_source_rx) = watch::channel_with::(false); let _is_open_source_task = cx.background_spawn(async move { let mut eligible_licenses = BTreeSet::new(); while let Some(rel_path) = files_to_check_rx.next().await { - let abs_path = worktree_abs_path.join(&rel_path); + let abs_path = worktree_snapshot.absolutize(&rel_path); let was_open_source = !eligible_licenses.is_empty(); if Self::is_path_eligible(&fs, abs_path).await.unwrap_or(false) { eligible_licenses.insert(rel_path); @@ -384,6 +384,8 @@ impl LicenseDetectionWatcher { #[cfg(test)] mod tests { + use std::path::Path; + use fs::FakeFs; use gpui::TestAppContext; use rand::Rng as _; @@ -433,7 +435,7 @@ mod tests { let Ok(contents) = std::fs::read_to_string(entry.path()) else { continue; }; - let path_string = entry.path().to_string_lossy().to_string(); + let path_string = entry.path().to_string_lossy().into_owned(); let license = detect_license(&contents); match license { Some(license) => detected.push((license, path_string)), diff --git a/crates/zeta/src/onboarding_modal.rs b/crates/zeta/src/onboarding_modal.rs index 6b743d95f2d2765be0d332e1aa8a03a9647131aa..94480add3053bece5017cf478e9f74065491639b 100644 --- a/crates/zeta/src/onboarding_modal.rs +++ b/crates/zeta/src/onboarding_modal.rs @@ -9,7 +9,7 @@ use gpui::{ ClickEvent, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, MouseDownEvent, Render, linear_color_stop, linear_gradient, }; -use language::language_settings::{AllLanguageSettings, EditPredictionProvider}; +use language::language_settings::EditPredictionProvider; use settings::update_settings_file; use ui::{Vector, VectorName, prelude::*}; use workspace::{ModalView, Workspace}; @@ -22,8 +22,10 @@ pub struct ZedPredictModal { pub(crate) fn set_edit_prediction_provider(provider: EditPredictionProvider, cx: &mut App) { let fs = ::global(cx); - update_settings_file::(fs, cx, move |settings, _| { + update_settings_file(fs, cx, move |settings, _| { settings + .project + .all_languages .features .get_or_insert(Default::default()) .edit_prediction_provider = Some(provider); diff --git a/crates/zeta/src/rate_completion_modal.rs b/crates/zeta/src/rate_completion_modal.rs index f572a0a1aa797a8afda72d9c86ad82c850cc6d9b..8028865b057f0c6c3b49efc3a5c3c640208e65aa 100644 --- a/crates/zeta/src/rate_completion_modal.rs +++ b/crates/zeta/src/rate_completion_modal.rs @@ -619,8 +619,8 @@ impl Render for RateCompletionModal { (false, false) => (IconName::FileDiff, Color::Accent, "Edits Available"), }; - let file_name = completion.path.file_name().map(|f| f.to_string_lossy().to_string()).unwrap_or("untitled".to_string()); - let file_path = completion.path.parent().map(|p| p.to_string_lossy().to_string()); + let file_name = completion.path.file_name().map(|f| f.to_string_lossy().into_owned()).unwrap_or("untitled".to_string()); + let file_path = completion.path.parent().map(|p| p.to_string_lossy().into_owned()); ListItem::new(completion.id) .inset(true) diff --git a/crates/zeta/src/zeta.rs b/crates/zeta/src/zeta.rs index dfcf98f025c2e020d6545efca64d4ab12579e370..1d48571d7b06f35d82934122919e75bbbd087ffa 100644 --- a/crates/zeta/src/zeta.rs +++ b/crates/zeta/src/zeta.rs @@ -51,6 +51,7 @@ use std::{ use telemetry_events::EditPredictionRating; use thiserror::Error; use util::ResultExt; +use util::rel_path::RelPath; use uuid::Uuid; use workspace::notifications::{ErrorMessagePrompt, NotificationId, show_app_notification}; use worktree::Worktree; @@ -150,56 +151,10 @@ impl EditPrediction { } fn interpolate(&self, new_snapshot: &BufferSnapshot) -> Option, String)>> { - interpolate(&self.snapshot, new_snapshot, self.edits.clone()) + edit_prediction::interpolate_edits(&self.snapshot, new_snapshot, &self.edits) } } -fn interpolate( - old_snapshot: &BufferSnapshot, - new_snapshot: &BufferSnapshot, - current_edits: Arc<[(Range, String)]>, -) -> Option, String)>> { - let mut edits = Vec::new(); - - let mut model_edits = current_edits.iter().peekable(); - for user_edit in new_snapshot.edits_since::(&old_snapshot.version) { - while let Some((model_old_range, _)) = model_edits.peek() { - let model_old_range = model_old_range.to_offset(old_snapshot); - if model_old_range.end < user_edit.old.start { - let (model_old_range, model_new_text) = model_edits.next().unwrap(); - edits.push((model_old_range.clone(), model_new_text.clone())); - } else { - break; - } - } - - if let Some((model_old_range, model_new_text)) = model_edits.peek() { - let model_old_offset_range = model_old_range.to_offset(old_snapshot); - if user_edit.old == model_old_offset_range { - let user_new_text = new_snapshot - .text_for_range(user_edit.new.clone()) - .collect::(); - - if let Some(model_suffix) = model_new_text.strip_prefix(&user_new_text) { - if !model_suffix.is_empty() { - let anchor = old_snapshot.anchor_after(user_edit.old.end); - edits.push((anchor..anchor, model_suffix.to_string())); - } - - model_edits.next(); - continue; - } - } - } - - return None; - } - - edits.extend(model_edits.cloned()); - - if edits.is_empty() { None } else { Some(edits) } -} - impl std::fmt::Debug for EditPrediction { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("EditPrediction") @@ -442,7 +397,7 @@ impl Zeta { .file() .map(|f| Arc::from(f.full_path(cx).as_path())) .unwrap_or_else(|| Arc::from(Path::new("untitled"))); - let full_path_str = full_path.to_string_lossy().to_string(); + let full_path_str = full_path.to_string_lossy().into_owned(); let cursor_point = cursor.to_point(&snapshot); let cursor_offset = cursor_point.to_offset(&snapshot); let prompt_for_events = { @@ -768,10 +723,11 @@ impl Zeta { let Some((edits, snapshot, edit_preview)) = buffer.read_with(cx, { let edits = edits.clone(); - |buffer, cx| { + move |buffer, cx| { let new_snapshot = buffer.snapshot(); let edits: Arc<[(Range, String)]> = - interpolate(&snapshot, &new_snapshot, edits)?.into(); + edit_prediction::interpolate_edits(&snapshot, &new_snapshot, &edits)? + .into(); Some((edits.clone(), new_snapshot, buffer.preview_edits(edits, cx))) } })? @@ -1180,11 +1136,11 @@ impl Event { let old_path = old_snapshot .file() .map(|f| f.path().as_ref()) - .unwrap_or(Path::new("untitled")); + .unwrap_or(RelPath::unix("untitled").unwrap()); let new_path = new_snapshot .file() .map(|f| f.path().as_ref()) - .unwrap_or(Path::new("untitled")); + .unwrap_or(RelPath::unix("untitled").unwrap()); if old_path != new_path { writeln!(prompt, "User renamed {:?} to {:?}\n", old_path, new_path).unwrap(); } @@ -1315,12 +1271,17 @@ pub struct ZetaEditPredictionProvider { next_pending_completion_id: usize, current_completion: Option, last_request_timestamp: Instant, + project: Entity, } impl ZetaEditPredictionProvider { pub const THROTTLE_TIMEOUT: Duration = Duration::from_millis(300); - pub fn new(zeta: Entity, singleton_buffer: Option>) -> Self { + pub fn new( + zeta: Entity, + project: Entity, + singleton_buffer: Option>, + ) -> Self { Self { zeta, singleton_buffer, @@ -1328,6 +1289,7 @@ impl ZetaEditPredictionProvider { next_pending_completion_id: 0, current_completion: None, last_request_timestamp: Instant::now(), + project, } } } @@ -1393,7 +1355,6 @@ impl edit_prediction::EditPredictionProvider for ZetaEditPredictionProvider { fn refresh( &mut self, - project: Option>, buffer: Entity, position: language::Anchor, _debounce: bool, @@ -1402,9 +1363,6 @@ impl edit_prediction::EditPredictionProvider for ZetaEditPredictionProvider { if self.zeta.read(cx).update_required { return; } - let Some(project) = project else { - return; - }; if self .zeta @@ -1432,6 +1390,7 @@ impl edit_prediction::EditPredictionProvider for ZetaEditPredictionProvider { self.next_pending_completion_id += 1; let last_request_timestamp = self.last_request_timestamp; + let project = self.project.clone(); let task = cx.spawn(async move |this, cx| { if let Some(timeout) = (last_request_timestamp + Self::THROTTLE_TIMEOUT) .checked_duration_since(Instant::now()) @@ -1603,7 +1562,7 @@ impl edit_prediction::EditPredictionProvider for ZetaEditPredictionProvider { } } - Some(edit_prediction::EditPrediction { + Some(edit_prediction::EditPrediction::Local { id: Some(completion.id.to_string().into()), edits: edits[edit_start_ix..edit_end_ix].to_vec(), edit_preview: Some(completion.edit_preview.clone()), @@ -1631,7 +1590,7 @@ mod tests { use parking_lot::Mutex; use serde_json::json; use settings::SettingsStore; - use util::path; + use util::{path, rel_path::rel_path}; use super::*; @@ -2026,7 +1985,7 @@ mod tests { .worktree_for_root_name("closed_source_worktree", cx) .unwrap(); worktree2.update(cx, |worktree2, cx| { - worktree2.load_file(Path::new("main.rs"), cx) + worktree2.load_file(rel_path("main.rs"), cx) }) }) .await diff --git a/crates/zeta2/Cargo.toml b/crates/zeta2/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..bce7e5987ccec635b335110a3a38298040c68e72 --- /dev/null +++ b/crates/zeta2/Cargo.toml @@ -0,0 +1,48 @@ +[package] +name = "zeta2" +version = "0.1.0" +edition.workspace = true +publish.workspace = true +license = "GPL-3.0-or-later" + +[lints] +workspace = true + +[lib] +path = "src/zeta2.rs" + +[dependencies] +anyhow.workspace = true +arrayvec.workspace = true +chrono.workspace = true +client.workspace = true +cloud_llm_client.workspace = true +cloud_zeta2_prompt.workspace = true +edit_prediction.workspace = true +edit_prediction_context.workspace = true +futures.workspace = true +gpui.workspace = true +indoc.workspace = true +language.workspace = true +language_model.workspace = true +log.workspace = true +project.workspace = true +release_channel.workspace = true +serde_json.workspace = true +thiserror.workspace = true +util.workspace = true +uuid.workspace = true +workspace-hack.workspace = true +workspace.workspace = true +worktree.workspace = true + +[dev-dependencies] +clock = { workspace = true, features = ["test-support"] } +cloud_llm_client = { workspace = true, features = ["test-support"] } +gpui = { workspace = true, features = ["test-support"] } +lsp.workspace = true +indoc.workspace = true +language_model = { workspace = true, features = ["test-support"] } +pretty_assertions.workspace = true +project = { workspace = true, features = ["test-support"] } +settings = { workspace = true, features = ["test-support"] } diff --git a/crates/zeta2/LICENSE-GPL b/crates/zeta2/LICENSE-GPL new file mode 120000 index 0000000000000000000000000000000000000000..89e542f750cd3860a0598eff0dc34b56d7336dc4 --- /dev/null +++ b/crates/zeta2/LICENSE-GPL @@ -0,0 +1 @@ +../../LICENSE-GPL \ No newline at end of file diff --git a/crates/zeta2/src/prediction.rs b/crates/zeta2/src/prediction.rs new file mode 100644 index 0000000000000000000000000000000000000000..d4832993b9ecd7c40f154f2ab696c66872073d5e --- /dev/null +++ b/crates/zeta2/src/prediction.rs @@ -0,0 +1,442 @@ +use std::{borrow::Cow, ops::Range, path::Path, sync::Arc}; + +use anyhow::Context as _; +use cloud_llm_client::predict_edits_v3; +use gpui::{App, AsyncApp, Entity}; +use language::{ + Anchor, Buffer, BufferSnapshot, EditPreview, OffsetRangeExt, TextBufferSnapshot, text_diff, +}; +use project::Project; +use util::ResultExt; +use uuid::Uuid; + +#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Hash)] +pub struct EditPredictionId(Uuid); + +impl From for gpui::ElementId { + fn from(value: EditPredictionId) -> Self { + gpui::ElementId::Uuid(value.0) + } +} + +impl std::fmt::Display for EditPredictionId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +#[derive(Clone)] +pub struct EditPrediction { + pub id: EditPredictionId, + pub path: Arc, + pub edits: Arc<[(Range, String)]>, + pub snapshot: BufferSnapshot, + pub edit_preview: EditPreview, + // We keep a reference to the buffer so that we do not need to reload it from disk when applying the prediction. + _buffer: Entity, +} + +impl EditPrediction { + pub async fn from_response( + response: predict_edits_v3::PredictEditsResponse, + active_buffer_old_snapshot: &TextBufferSnapshot, + active_buffer: &Entity, + project: &Entity, + cx: &mut AsyncApp, + ) -> Option { + // TODO only allow cloud to return one path + let Some(path) = response.edits.first().map(|e| e.path.clone()) else { + return None; + }; + + let is_same_path = active_buffer + .read_with(cx, |buffer, cx| buffer_path_eq(buffer, &path, cx)) + .ok()?; + + let (buffer, edits, snapshot, edit_preview_task) = if is_same_path { + active_buffer + .read_with(cx, |buffer, cx| { + let new_snapshot = buffer.snapshot(); + let edits = edits_from_response(&response.edits, &active_buffer_old_snapshot); + let edits: Arc<[_]> = + interpolate_edits(active_buffer_old_snapshot, &new_snapshot, edits)?.into(); + + Some(( + active_buffer.clone(), + edits.clone(), + new_snapshot, + buffer.preview_edits(edits, cx), + )) + }) + .ok()?? + } else { + let buffer_handle = project + .update(cx, |project, cx| { + let project_path = project + .find_project_path(&path, cx) + .context("Failed to find project path for zeta edit")?; + anyhow::Ok(project.open_buffer(project_path, cx)) + }) + .ok()? + .log_err()? + .await + .context("Failed to open buffer for zeta edit") + .log_err()?; + + buffer_handle + .read_with(cx, |buffer, cx| { + let snapshot = buffer.snapshot(); + let edits = edits_from_response(&response.edits, &snapshot); + if edits.is_empty() { + return None; + } + Some(( + buffer_handle.clone(), + edits.clone(), + snapshot, + buffer.preview_edits(edits, cx), + )) + }) + .ok()?? + }; + + let edit_preview = edit_preview_task.await; + + Some(EditPrediction { + id: EditPredictionId(response.request_id), + path, + edits, + snapshot, + edit_preview, + _buffer: buffer, + }) + } + + pub fn interpolate( + &self, + new_snapshot: &TextBufferSnapshot, + ) -> Option, String)>> { + interpolate_edits(&self.snapshot, new_snapshot, self.edits.clone()) + } + + pub fn targets_buffer(&self, buffer: &Buffer, cx: &App) -> bool { + buffer_path_eq(buffer, &self.path, cx) + } +} + +impl std::fmt::Debug for EditPrediction { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("EditPrediction") + .field("id", &self.id) + .field("path", &self.path) + .field("edits", &self.edits) + .finish() + } +} + +pub fn buffer_path_eq(buffer: &Buffer, path: &Path, cx: &App) -> bool { + buffer.file().map(|p| p.full_path(cx)).as_deref() == Some(path) +} + +pub fn interpolate_edits( + old_snapshot: &TextBufferSnapshot, + new_snapshot: &TextBufferSnapshot, + current_edits: Arc<[(Range, String)]>, +) -> Option, String)>> { + let mut edits = Vec::new(); + + let mut model_edits = current_edits.iter().peekable(); + for user_edit in new_snapshot.edits_since::(&old_snapshot.version) { + while let Some((model_old_range, _)) = model_edits.peek() { + let model_old_range = model_old_range.to_offset(old_snapshot); + if model_old_range.end < user_edit.old.start { + let (model_old_range, model_new_text) = model_edits.next().unwrap(); + edits.push((model_old_range.clone(), model_new_text.clone())); + } else { + break; + } + } + + if let Some((model_old_range, model_new_text)) = model_edits.peek() { + let model_old_offset_range = model_old_range.to_offset(old_snapshot); + if user_edit.old == model_old_offset_range { + let user_new_text = new_snapshot + .text_for_range(user_edit.new.clone()) + .collect::(); + + if let Some(model_suffix) = model_new_text.strip_prefix(&user_new_text) { + if !model_suffix.is_empty() { + let anchor = old_snapshot.anchor_after(user_edit.old.end); + edits.push((anchor..anchor, model_suffix.to_string())); + } + + model_edits.next(); + continue; + } + } + } + + return None; + } + + edits.extend(model_edits.cloned()); + + if edits.is_empty() { None } else { Some(edits) } +} + +fn edits_from_response( + edits: &[predict_edits_v3::Edit], + snapshot: &TextBufferSnapshot, +) -> Arc<[(Range, String)]> { + edits + .iter() + .flat_map(|edit| { + let old_text = snapshot.text_for_range(edit.range.clone()); + + excerpt_edits_from_response( + old_text.collect::>(), + &edit.content, + edit.range.start, + &snapshot, + ) + }) + .collect::>() + .into() +} + +fn excerpt_edits_from_response( + old_text: Cow, + new_text: &str, + offset: usize, + snapshot: &TextBufferSnapshot, +) -> impl Iterator, String)> { + text_diff(&old_text, new_text) + .into_iter() + .map(move |(mut old_range, new_text)| { + old_range.start += offset; + old_range.end += offset; + + let prefix_len = common_prefix( + snapshot.chars_for_range(old_range.clone()), + new_text.chars(), + ); + old_range.start += prefix_len; + + let suffix_len = common_prefix( + snapshot.reversed_chars_for_range(old_range.clone()), + new_text[prefix_len..].chars().rev(), + ); + old_range.end = old_range.end.saturating_sub(suffix_len); + + let new_text = new_text[prefix_len..new_text.len() - suffix_len].to_string(); + let range = if old_range.is_empty() { + let anchor = snapshot.anchor_after(old_range.start); + anchor..anchor + } else { + snapshot.anchor_after(old_range.start)..snapshot.anchor_before(old_range.end) + }; + (range, new_text) + }) +} + +fn common_prefix, T2: Iterator>(a: T1, b: T2) -> usize { + a.zip(b) + .take_while(|(a, b)| a == b) + .map(|(a, _)| a.len_utf8()) + .sum() +} + +#[cfg(test)] +mod tests { + use std::path::PathBuf; + + use super::*; + use cloud_llm_client::predict_edits_v3; + use gpui::{App, Entity, TestAppContext, prelude::*}; + use indoc::indoc; + use language::{Buffer, ToOffset as _}; + + #[gpui::test] + async fn test_compute_edits(cx: &mut TestAppContext) { + let old = indoc! {r#" + fn main() { + let args = + println!("{}", args[1]) + } + "#}; + + let new = indoc! {r#" + fn main() { + let args = std::env::args(); + println!("{}", args[1]); + } + "#}; + + let buffer = cx.new(|cx| Buffer::local(old, cx)); + let snapshot = buffer.read_with(cx, |buffer, _cx| buffer.snapshot()); + + // TODO cover more cases when multi-file is supported + let big_edits = vec![predict_edits_v3::Edit { + path: PathBuf::from("test.txt").into(), + range: 0..old.len(), + content: new.into(), + }]; + + let edits = edits_from_response(&big_edits, &snapshot); + assert_eq!(edits.len(), 2); + assert_eq!( + edits[0].0.to_point(&snapshot).start, + language::Point::new(1, 14) + ); + assert_eq!(edits[0].1, " std::env::args();"); + assert_eq!( + edits[1].0.to_point(&snapshot).start, + language::Point::new(2, 27) + ); + assert_eq!(edits[1].1, ";"); + } + + #[gpui::test] + async fn test_edit_prediction_basic_interpolation(cx: &mut TestAppContext) { + let buffer = cx.new(|cx| Buffer::local("Lorem ipsum dolor", cx)); + let edits: Arc<[(Range, String)]> = cx.update(|cx| { + to_prediction_edits( + [(2..5, "REM".to_string()), (9..11, "".to_string())], + &buffer, + cx, + ) + .into() + }); + + let edit_preview = cx + .read(|cx| buffer.read(cx).preview_edits(edits.clone(), cx)) + .await; + + let prediction = EditPrediction { + id: EditPredictionId(Uuid::new_v4()), + edits, + snapshot: cx.read(|cx| buffer.read(cx).snapshot()), + path: Path::new("test.txt").into(), + _buffer: buffer.clone(), + edit_preview, + }; + + cx.update(|cx| { + assert_eq!( + from_prediction_edits( + &prediction.interpolate(&buffer.read(cx).snapshot()).unwrap(), + &buffer, + cx + ), + vec![(2..5, "REM".to_string()), (9..11, "".to_string())] + ); + + buffer.update(cx, |buffer, cx| buffer.edit([(2..5, "")], None, cx)); + assert_eq!( + from_prediction_edits( + &prediction.interpolate(&buffer.read(cx).snapshot()).unwrap(), + &buffer, + cx + ), + vec![(2..2, "REM".to_string()), (6..8, "".to_string())] + ); + + buffer.update(cx, |buffer, cx| buffer.undo(cx)); + assert_eq!( + from_prediction_edits( + &prediction.interpolate(&buffer.read(cx).snapshot()).unwrap(), + &buffer, + cx + ), + vec![(2..5, "REM".to_string()), (9..11, "".to_string())] + ); + + buffer.update(cx, |buffer, cx| buffer.edit([(2..5, "R")], None, cx)); + assert_eq!( + from_prediction_edits( + &prediction.interpolate(&buffer.read(cx).snapshot()).unwrap(), + &buffer, + cx + ), + vec![(3..3, "EM".to_string()), (7..9, "".to_string())] + ); + + buffer.update(cx, |buffer, cx| buffer.edit([(3..3, "E")], None, cx)); + assert_eq!( + from_prediction_edits( + &prediction.interpolate(&buffer.read(cx).snapshot()).unwrap(), + &buffer, + cx + ), + vec![(4..4, "M".to_string()), (8..10, "".to_string())] + ); + + buffer.update(cx, |buffer, cx| buffer.edit([(4..4, "M")], None, cx)); + assert_eq!( + from_prediction_edits( + &prediction.interpolate(&buffer.read(cx).snapshot()).unwrap(), + &buffer, + cx + ), + vec![(9..11, "".to_string())] + ); + + buffer.update(cx, |buffer, cx| buffer.edit([(4..5, "")], None, cx)); + assert_eq!( + from_prediction_edits( + &prediction.interpolate(&buffer.read(cx).snapshot()).unwrap(), + &buffer, + cx + ), + vec![(4..4, "M".to_string()), (8..10, "".to_string())] + ); + + buffer.update(cx, |buffer, cx| buffer.edit([(8..10, "")], None, cx)); + assert_eq!( + from_prediction_edits( + &prediction.interpolate(&buffer.read(cx).snapshot()).unwrap(), + &buffer, + cx + ), + vec![(4..4, "M".to_string())] + ); + + buffer.update(cx, |buffer, cx| buffer.edit([(4..6, "")], None, cx)); + assert_eq!(prediction.interpolate(&buffer.read(cx).snapshot()), None); + }) + } + + fn to_prediction_edits( + iterator: impl IntoIterator, String)>, + buffer: &Entity, + cx: &App, + ) -> Vec<(Range, String)> { + let buffer = buffer.read(cx); + iterator + .into_iter() + .map(|(range, text)| { + ( + buffer.anchor_after(range.start)..buffer.anchor_before(range.end), + text, + ) + }) + .collect() + } + + fn from_prediction_edits( + editor_edits: &[(Range, String)], + buffer: &Entity, + cx: &App, + ) -> Vec<(Range, String)> { + let buffer = buffer.read(cx); + editor_edits + .iter() + .map(|(range, text)| { + ( + range.start.to_offset(buffer)..range.end.to_offset(buffer), + text.clone(), + ) + }) + .collect() + } +} diff --git a/crates/zeta2/src/provider.rs b/crates/zeta2/src/provider.rs new file mode 100644 index 0000000000000000000000000000000000000000..db637208aa88e8e3ebe4b30dc3d5639497cd0ac0 --- /dev/null +++ b/crates/zeta2/src/provider.rs @@ -0,0 +1,263 @@ +use std::{ + cmp, + sync::Arc, + time::{Duration, Instant}, +}; + +use arrayvec::ArrayVec; +use client::{Client, UserStore}; +use edit_prediction::{DataCollectionState, Direction, EditPredictionProvider}; +use gpui::{App, Entity, Task, prelude::*}; +use language::ToPoint as _; +use project::Project; +use util::ResultExt as _; + +use crate::{BufferEditPrediction, Zeta}; + +pub struct ZetaEditPredictionProvider { + zeta: Entity, + next_pending_prediction_id: usize, + pending_predictions: ArrayVec, + last_request_timestamp: Instant, + project: Entity, +} + +impl ZetaEditPredictionProvider { + pub const THROTTLE_TIMEOUT: Duration = Duration::from_millis(300); + + pub fn new( + project: Entity, + client: &Arc, + user_store: &Entity, + cx: &mut App, + ) -> Self { + let zeta = Zeta::global(client, user_store, cx); + zeta.update(cx, |zeta, cx| { + zeta.register_project(&project, cx); + }); + + Self { + zeta, + next_pending_prediction_id: 0, + pending_predictions: ArrayVec::new(), + last_request_timestamp: Instant::now(), + project: project, + } + } +} + +struct PendingPrediction { + id: usize, + _task: Task<()>, +} + +impl EditPredictionProvider for ZetaEditPredictionProvider { + fn name() -> &'static str { + "zed-predict2" + } + + fn display_name() -> &'static str { + "Zed's Edit Predictions 2" + } + + fn show_completions_in_menu() -> bool { + true + } + + fn show_tab_accept_marker() -> bool { + true + } + + fn data_collection_state(&self, _cx: &App) -> DataCollectionState { + // TODO [zeta2] + DataCollectionState::Unsupported + } + + fn toggle_data_collection(&mut self, _cx: &mut App) { + // TODO [zeta2] + } + + fn usage(&self, cx: &App) -> Option { + self.zeta.read(cx).usage(cx) + } + + fn is_enabled( + &self, + _buffer: &Entity, + _cursor_position: language::Anchor, + _cx: &App, + ) -> bool { + true + } + + fn is_refreshing(&self) -> bool { + !self.pending_predictions.is_empty() + } + + fn refresh( + &mut self, + buffer: Entity, + cursor_position: language::Anchor, + _debounce: bool, + cx: &mut Context, + ) { + let zeta = self.zeta.read(cx); + + if zeta.user_store.read_with(cx, |user_store, _cx| { + user_store.account_too_young() || user_store.has_overdue_invoices() + }) { + return; + } + + if let Some(current) = zeta.current_prediction_for_buffer(&buffer, &self.project, cx) + && let BufferEditPrediction::Local { prediction } = current + && prediction.interpolate(buffer.read(cx)).is_some() + { + return; + } + + let pending_prediction_id = self.next_pending_prediction_id; + self.next_pending_prediction_id += 1; + let last_request_timestamp = self.last_request_timestamp; + + let project = self.project.clone(); + let task = cx.spawn(async move |this, cx| { + if let Some(timeout) = (last_request_timestamp + Self::THROTTLE_TIMEOUT) + .checked_duration_since(Instant::now()) + { + cx.background_executor().timer(timeout).await; + } + + let refresh_task = this.update(cx, |this, cx| { + this.last_request_timestamp = Instant::now(); + this.zeta.update(cx, |zeta, cx| { + zeta.refresh_prediction(&project, &buffer, cursor_position, cx) + }) + }); + + if let Some(refresh_task) = refresh_task.ok() { + refresh_task.await.log_err(); + } + + this.update(cx, |this, cx| { + if this.pending_predictions[0].id == pending_prediction_id { + this.pending_predictions.remove(0); + } else { + this.pending_predictions.clear(); + } + + cx.notify(); + }) + .ok(); + }); + + // We always maintain at most two pending predictions. When we already + // have two, we replace the newest one. + if self.pending_predictions.len() <= 1 { + self.pending_predictions.push(PendingPrediction { + id: pending_prediction_id, + _task: task, + }); + } else if self.pending_predictions.len() == 2 { + self.pending_predictions.pop(); + self.pending_predictions.push(PendingPrediction { + id: pending_prediction_id, + _task: task, + }); + } + + cx.notify(); + } + + fn cycle( + &mut self, + _buffer: Entity, + _cursor_position: language::Anchor, + _direction: Direction, + _cx: &mut Context, + ) { + } + + fn accept(&mut self, cx: &mut Context) { + self.zeta.update(cx, |zeta, _cx| { + zeta.accept_current_prediction(&self.project); + }); + self.pending_predictions.clear(); + } + + fn discard(&mut self, cx: &mut Context) { + self.zeta.update(cx, |zeta, _cx| { + zeta.discard_current_prediction(&self.project); + }); + self.pending_predictions.clear(); + } + + fn suggest( + &mut self, + buffer: &Entity, + cursor_position: language::Anchor, + cx: &mut Context, + ) -> Option { + let prediction = + self.zeta + .read(cx) + .current_prediction_for_buffer(buffer, &self.project, cx)?; + + let prediction = match prediction { + BufferEditPrediction::Local { prediction } => prediction, + BufferEditPrediction::Jump { prediction } => { + return Some(edit_prediction::EditPrediction::Jump { + id: Some(prediction.id.to_string().into()), + snapshot: prediction.snapshot.clone(), + target: prediction.edits.first().unwrap().0.start, + }); + } + }; + + let buffer = buffer.read(cx); + let snapshot = buffer.snapshot(); + + let Some(edits) = prediction.interpolate(&snapshot) else { + self.zeta.update(cx, |zeta, _cx| { + zeta.discard_current_prediction(&self.project); + }); + return None; + }; + + let cursor_row = cursor_position.to_point(&snapshot).row; + let (closest_edit_ix, (closest_edit_range, _)) = + edits.iter().enumerate().min_by_key(|(_, (range, _))| { + let distance_from_start = cursor_row.abs_diff(range.start.to_point(&snapshot).row); + let distance_from_end = cursor_row.abs_diff(range.end.to_point(&snapshot).row); + cmp::min(distance_from_start, distance_from_end) + })?; + + let mut edit_start_ix = closest_edit_ix; + for (range, _) in edits[..edit_start_ix].iter().rev() { + let distance_from_closest_edit = closest_edit_range.start.to_point(&snapshot).row + - range.end.to_point(&snapshot).row; + if distance_from_closest_edit <= 1 { + edit_start_ix -= 1; + } else { + break; + } + } + + let mut edit_end_ix = closest_edit_ix + 1; + for (range, _) in &edits[edit_end_ix..] { + let distance_from_closest_edit = + range.start.to_point(buffer).row - closest_edit_range.end.to_point(&snapshot).row; + if distance_from_closest_edit <= 1 { + edit_end_ix += 1; + } else { + break; + } + } + + Some(edit_prediction::EditPrediction::Local { + id: Some(prediction.id.to_string().into()), + edits: edits[edit_start_ix..edit_end_ix].to_vec(), + edit_preview: Some(prediction.edit_preview.clone()), + }) + } +} diff --git a/crates/zeta2/src/zeta2.rs b/crates/zeta2/src/zeta2.rs new file mode 100644 index 0000000000000000000000000000000000000000..ab786fa80a6520f2b2ceb3cda177dab4b7120bc2 --- /dev/null +++ b/crates/zeta2/src/zeta2.rs @@ -0,0 +1,1413 @@ +use anyhow::{Context as _, Result, anyhow}; +use chrono::TimeDelta; +use client::{Client, EditPredictionUsage, UserStore}; +use cloud_llm_client::predict_edits_v3::{self, PromptFormat, Signature}; +use cloud_llm_client::{ + EXPIRED_LLM_TOKEN_HEADER_NAME, MINIMUM_REQUIRED_VERSION_HEADER_NAME, ZED_VERSION_HEADER_NAME, +}; +use cloud_zeta2_prompt::{DEFAULT_MAX_PROMPT_BYTES, PlannedPrompt}; +use edit_prediction_context::{ + DeclarationId, DeclarationStyle, EditPredictionContext, EditPredictionContextOptions, + EditPredictionExcerptOptions, EditPredictionScoreOptions, SyntaxIndex, SyntaxIndexState, +}; +use futures::AsyncReadExt as _; +use futures::channel::{mpsc, oneshot}; +use gpui::http_client::Method; +use gpui::{ + App, Entity, EntityId, Global, SemanticVersion, SharedString, Subscription, Task, WeakEntity, + http_client, prelude::*, +}; +use language::{Buffer, DiagnosticSet, LanguageServerId, ToOffset as _, ToPoint}; +use language::{BufferSnapshot, TextBufferSnapshot}; +use language_model::{LlmApiToken, RefreshLlmTokenListener}; +use project::Project; +use release_channel::AppVersion; +use std::collections::{HashMap, VecDeque, hash_map}; +use std::path::Path; +use std::str::FromStr as _; +use std::sync::Arc; +use std::time::{Duration, Instant}; +use thiserror::Error; +use util::rel_path::RelPathBuf; +use util::some_or_debug_panic; +use workspace::notifications::{ErrorMessagePrompt, NotificationId, show_app_notification}; + +mod prediction; +mod provider; + +use crate::prediction::EditPrediction; +pub use provider::ZetaEditPredictionProvider; + +const BUFFER_CHANGE_GROUPING_INTERVAL: Duration = Duration::from_secs(1); + +/// Maximum number of events to track. +const MAX_EVENT_COUNT: usize = 16; + +pub const DEFAULT_CONTEXT_OPTIONS: EditPredictionContextOptions = EditPredictionContextOptions { + use_imports: true, + excerpt: EditPredictionExcerptOptions { + max_bytes: 512, + min_bytes: 128, + target_before_cursor_over_total_bytes: 0.5, + }, + score: EditPredictionScoreOptions { + omit_excerpt_overlaps: true, + }, +}; + +pub const DEFAULT_OPTIONS: ZetaOptions = ZetaOptions { + context: DEFAULT_CONTEXT_OPTIONS, + max_prompt_bytes: DEFAULT_MAX_PROMPT_BYTES, + max_diagnostic_bytes: 2048, + prompt_format: PromptFormat::DEFAULT, + file_indexing_parallelism: 1, +}; + +#[derive(Clone)] +struct ZetaGlobal(Entity); + +impl Global for ZetaGlobal {} + +pub struct Zeta { + client: Arc, + user_store: Entity, + llm_token: LlmApiToken, + _llm_token_subscription: Subscription, + projects: HashMap, + options: ZetaOptions, + update_required: bool, + debug_tx: Option>, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct ZetaOptions { + pub context: EditPredictionContextOptions, + pub max_prompt_bytes: usize, + pub max_diagnostic_bytes: usize, + pub prompt_format: predict_edits_v3::PromptFormat, + pub file_indexing_parallelism: usize, +} + +pub struct PredictionDebugInfo { + pub context: EditPredictionContext, + pub retrieval_time: TimeDelta, + pub buffer: WeakEntity, + pub position: language::Anchor, + pub local_prompt: Result, + pub response_rx: oneshot::Receiver>, +} + +pub type RequestDebugInfo = predict_edits_v3::DebugInfo; + +struct ZetaProject { + syntax_index: Entity, + events: VecDeque, + registered_buffers: HashMap, + current_prediction: Option, +} + +#[derive(Clone)] +struct CurrentEditPrediction { + pub requested_by_buffer_id: EntityId, + pub prediction: EditPrediction, +} + +impl CurrentEditPrediction { + fn should_replace_prediction( + &self, + old_prediction: &Self, + snapshot: &TextBufferSnapshot, + ) -> bool { + if self.requested_by_buffer_id != old_prediction.requested_by_buffer_id { + return true; + } + + let Some(old_edits) = old_prediction.prediction.interpolate(snapshot) else { + return true; + }; + + let Some(new_edits) = self.prediction.interpolate(snapshot) else { + return false; + }; + if old_edits.len() == 1 && new_edits.len() == 1 { + let (old_range, old_text) = &old_edits[0]; + let (new_range, new_text) = &new_edits[0]; + new_range == old_range && new_text.starts_with(old_text) + } else { + true + } + } +} + +/// A prediction from the perspective of a buffer. +#[derive(Debug)] +enum BufferEditPrediction<'a> { + Local { prediction: &'a EditPrediction }, + Jump { prediction: &'a EditPrediction }, +} + +struct RegisteredBuffer { + snapshot: BufferSnapshot, + _subscriptions: [gpui::Subscription; 2], +} + +#[derive(Clone)] +pub enum Event { + BufferChange { + old_snapshot: BufferSnapshot, + new_snapshot: BufferSnapshot, + timestamp: Instant, + }, +} + +impl Zeta { + pub fn try_global(cx: &App) -> Option> { + cx.try_global::().map(|global| global.0.clone()) + } + + pub fn global( + client: &Arc, + user_store: &Entity, + cx: &mut App, + ) -> Entity { + cx.try_global::() + .map(|global| global.0.clone()) + .unwrap_or_else(|| { + let zeta = cx.new(|cx| Self::new(client.clone(), user_store.clone(), cx)); + cx.set_global(ZetaGlobal(zeta.clone())); + zeta + }) + } + + pub fn new(client: Arc, user_store: Entity, cx: &mut Context) -> Self { + let refresh_llm_token_listener = RefreshLlmTokenListener::global(cx); + + Self { + projects: HashMap::new(), + client, + user_store, + options: DEFAULT_OPTIONS, + llm_token: LlmApiToken::default(), + _llm_token_subscription: cx.subscribe( + &refresh_llm_token_listener, + |this, _listener, _event, cx| { + let client = this.client.clone(); + let llm_token = this.llm_token.clone(); + cx.spawn(async move |_this, _cx| { + llm_token.refresh(&client).await?; + anyhow::Ok(()) + }) + .detach_and_log_err(cx); + }, + ), + update_required: false, + debug_tx: None, + } + } + + pub fn debug_info(&mut self) -> mpsc::UnboundedReceiver { + let (debug_watch_tx, debug_watch_rx) = mpsc::unbounded(); + self.debug_tx = Some(debug_watch_tx); + debug_watch_rx + } + + pub fn options(&self) -> &ZetaOptions { + &self.options + } + + pub fn set_options(&mut self, options: ZetaOptions) { + self.options = options; + } + + pub fn clear_history(&mut self) { + for zeta_project in self.projects.values_mut() { + zeta_project.events.clear(); + } + } + + pub fn usage(&self, cx: &App) -> Option { + self.user_store.read(cx).edit_prediction_usage() + } + + pub fn register_project(&mut self, project: &Entity, cx: &mut App) { + self.get_or_init_zeta_project(project, cx); + } + + pub fn register_buffer( + &mut self, + buffer: &Entity, + project: &Entity, + cx: &mut Context, + ) { + let zeta_project = self.get_or_init_zeta_project(project, cx); + Self::register_buffer_impl(zeta_project, buffer, project, cx); + } + + fn get_or_init_zeta_project( + &mut self, + project: &Entity, + cx: &mut App, + ) -> &mut ZetaProject { + self.projects + .entry(project.entity_id()) + .or_insert_with(|| ZetaProject { + syntax_index: cx.new(|cx| { + SyntaxIndex::new(project, self.options.file_indexing_parallelism, cx) + }), + events: VecDeque::new(), + registered_buffers: HashMap::new(), + current_prediction: None, + }) + } + + fn register_buffer_impl<'a>( + zeta_project: &'a mut ZetaProject, + buffer: &Entity, + project: &Entity, + cx: &mut Context, + ) -> &'a mut RegisteredBuffer { + let buffer_id = buffer.entity_id(); + match zeta_project.registered_buffers.entry(buffer_id) { + hash_map::Entry::Occupied(entry) => entry.into_mut(), + hash_map::Entry::Vacant(entry) => { + let snapshot = buffer.read(cx).snapshot(); + let project_entity_id = project.entity_id(); + entry.insert(RegisteredBuffer { + snapshot, + _subscriptions: [ + cx.subscribe(buffer, { + let project = project.downgrade(); + move |this, buffer, event, cx| { + if let language::BufferEvent::Edited = event + && let Some(project) = project.upgrade() + { + this.report_changes_for_buffer(&buffer, &project, cx); + } + } + }), + cx.observe_release(buffer, move |this, _buffer, _cx| { + let Some(zeta_project) = this.projects.get_mut(&project_entity_id) + else { + return; + }; + zeta_project.registered_buffers.remove(&buffer_id); + }), + ], + }) + } + } + } + + fn report_changes_for_buffer( + &mut self, + buffer: &Entity, + project: &Entity, + cx: &mut Context, + ) -> BufferSnapshot { + let zeta_project = self.get_or_init_zeta_project(project, cx); + let registered_buffer = Self::register_buffer_impl(zeta_project, buffer, project, cx); + + let new_snapshot = buffer.read(cx).snapshot(); + if new_snapshot.version != registered_buffer.snapshot.version { + let old_snapshot = + std::mem::replace(&mut registered_buffer.snapshot, new_snapshot.clone()); + Self::push_event( + zeta_project, + Event::BufferChange { + old_snapshot, + new_snapshot: new_snapshot.clone(), + timestamp: Instant::now(), + }, + ); + } + + new_snapshot + } + + fn push_event(zeta_project: &mut ZetaProject, event: Event) { + let events = &mut zeta_project.events; + + if let Some(Event::BufferChange { + new_snapshot: last_new_snapshot, + timestamp: last_timestamp, + .. + }) = events.back_mut() + { + // Coalesce edits for the same buffer when they happen one after the other. + let Event::BufferChange { + old_snapshot, + new_snapshot, + timestamp, + } = &event; + + if timestamp.duration_since(*last_timestamp) <= BUFFER_CHANGE_GROUPING_INTERVAL + && old_snapshot.remote_id() == last_new_snapshot.remote_id() + && old_snapshot.version == last_new_snapshot.version + { + *last_new_snapshot = new_snapshot.clone(); + *last_timestamp = *timestamp; + return; + } + } + + if events.len() >= MAX_EVENT_COUNT { + // These are halved instead of popping to improve prompt caching. + events.drain(..MAX_EVENT_COUNT / 2); + } + + events.push_back(event); + } + + fn current_prediction_for_buffer( + &self, + buffer: &Entity, + project: &Entity, + cx: &App, + ) -> Option> { + let project_state = self.projects.get(&project.entity_id())?; + + let CurrentEditPrediction { + requested_by_buffer_id, + prediction, + } = project_state.current_prediction.as_ref()?; + + if prediction.targets_buffer(buffer.read(cx), cx) { + Some(BufferEditPrediction::Local { prediction }) + } else if *requested_by_buffer_id == buffer.entity_id() { + Some(BufferEditPrediction::Jump { prediction }) + } else { + None + } + } + + fn accept_current_prediction(&mut self, project: &Entity) { + if let Some(project_state) = self.projects.get_mut(&project.entity_id()) { + project_state.current_prediction.take(); + }; + // TODO report accepted + } + + fn discard_current_prediction(&mut self, project: &Entity) { + if let Some(project_state) = self.projects.get_mut(&project.entity_id()) { + project_state.current_prediction.take(); + }; + } + + pub fn refresh_prediction( + &mut self, + project: &Entity, + buffer: &Entity, + position: language::Anchor, + cx: &mut Context, + ) -> Task> { + let request_task = self.request_prediction(project, buffer, position, cx); + let buffer = buffer.clone(); + let project = project.clone(); + + cx.spawn(async move |this, cx| { + if let Some(prediction) = request_task.await? { + this.update(cx, |this, cx| { + let project_state = this + .projects + .get_mut(&project.entity_id()) + .context("Project not found")?; + + let new_prediction = CurrentEditPrediction { + requested_by_buffer_id: buffer.entity_id(), + prediction: prediction, + }; + + if project_state + .current_prediction + .as_ref() + .is_none_or(|old_prediction| { + new_prediction + .should_replace_prediction(&old_prediction, buffer.read(cx)) + }) + { + project_state.current_prediction = Some(new_prediction); + } + anyhow::Ok(()) + })??; + } + Ok(()) + }) + } + + fn request_prediction( + &mut self, + project: &Entity, + buffer: &Entity, + position: language::Anchor, + cx: &mut Context, + ) -> Task>> { + let project_state = self.projects.get(&project.entity_id()); + + let index_state = project_state.map(|state| { + state + .syntax_index + .read_with(cx, |index, _cx| index.state().clone()) + }); + let options = self.options.clone(); + let snapshot = buffer.read(cx).snapshot(); + let Some(excerpt_path) = snapshot.file().map(|path| path.full_path(cx).into()) else { + return Task::ready(Err(anyhow!("No file path for excerpt"))); + }; + let client = self.client.clone(); + let llm_token = self.llm_token.clone(); + let app_version = AppVersion::global(cx); + let worktree_snapshots = project + .read(cx) + .worktrees(cx) + .map(|worktree| worktree.read(cx).snapshot()) + .collect::>(); + let debug_tx = self.debug_tx.clone(); + + let events = project_state + .map(|state| { + state + .events + .iter() + .filter_map(|event| match event { + Event::BufferChange { + old_snapshot, + new_snapshot, + .. + } => { + let path = new_snapshot.file().map(|f| f.full_path(cx)); + + let old_path = old_snapshot.file().and_then(|f| { + let old_path = f.full_path(cx); + if Some(&old_path) != path.as_ref() { + Some(old_path) + } else { + None + } + }); + + // TODO [zeta2] move to bg? + let diff = + language::unified_diff(&old_snapshot.text(), &new_snapshot.text()); + + if path == old_path && diff.is_empty() { + None + } else { + Some(predict_edits_v3::Event::BufferChange { + old_path, + path, + diff, + //todo: Actually detect if this edit was predicted or not + predicted: false, + }) + } + } + }) + .collect::>() + }) + .unwrap_or_default(); + + let diagnostics = snapshot.diagnostic_sets().clone(); + + let parent_abs_path = project::File::from_dyn(buffer.read(cx).file()).and_then(|f| { + let mut path = f.worktree.read(cx).absolutize(&f.path); + if path.pop() { Some(path) } else { None } + }); + + let request_task = cx.background_spawn({ + let snapshot = snapshot.clone(); + let buffer = buffer.clone(); + async move { + let index_state = if let Some(index_state) = index_state { + Some(index_state.lock_owned().await) + } else { + None + }; + + let cursor_offset = position.to_offset(&snapshot); + let cursor_point = cursor_offset.to_point(&snapshot); + + let before_retrieval = chrono::Utc::now(); + + let Some(context) = EditPredictionContext::gather_context( + cursor_point, + &snapshot, + parent_abs_path.as_deref(), + &options.context, + index_state.as_deref(), + ) else { + return Ok(None); + }; + + let retrieval_time = chrono::Utc::now() - before_retrieval; + + let (diagnostic_groups, diagnostic_groups_truncated) = + Self::gather_nearby_diagnostics( + cursor_offset, + &diagnostics, + &snapshot, + options.max_diagnostic_bytes, + ); + + let debug_context = debug_tx.map(|tx| (tx, context.clone())); + + let request = make_cloud_request( + excerpt_path, + context, + events, + // TODO data collection + false, + diagnostic_groups, + diagnostic_groups_truncated, + None, + debug_context.is_some(), + &worktree_snapshots, + index_state.as_deref(), + Some(options.max_prompt_bytes), + options.prompt_format, + ); + + let debug_response_tx = if let Some((debug_tx, context)) = debug_context { + let (response_tx, response_rx) = oneshot::channel(); + + let local_prompt = PlannedPrompt::populate(&request) + .and_then(|p| p.to_prompt_string().map(|p| p.0)) + .map_err(|err| err.to_string()); + + debug_tx + .unbounded_send(PredictionDebugInfo { + context, + retrieval_time, + buffer: buffer.downgrade(), + local_prompt, + position, + response_rx, + }) + .ok(); + Some(response_tx) + } else { + None + }; + + if cfg!(debug_assertions) && std::env::var("ZED_ZETA2_SKIP_REQUEST").is_ok() { + if let Some(debug_response_tx) = debug_response_tx { + debug_response_tx + .send(Err("Request skipped".to_string())) + .ok(); + } + anyhow::bail!("Skipping request because ZED_ZETA2_SKIP_REQUEST is set") + } + + let response = Self::perform_request(client, llm_token, app_version, request).await; + + if let Some(debug_response_tx) = debug_response_tx { + debug_response_tx + .send(response.as_ref().map_err(|err| err.to_string()).and_then( + |response| match some_or_debug_panic(response.0.debug_info.clone()) { + Some(debug_info) => Ok(debug_info), + None => Err("Missing debug info".to_string()), + }, + )) + .ok(); + } + + anyhow::Ok(Some(response?)) + } + }); + + let buffer = buffer.clone(); + + cx.spawn({ + let project = project.clone(); + async move |this, cx| { + match request_task.await { + Ok(Some((response, usage))) => { + if let Some(usage) = usage { + this.update(cx, |this, cx| { + this.user_store.update(cx, |user_store, cx| { + user_store.update_edit_prediction_usage(usage, cx); + }); + }) + .ok(); + } + + let prediction = EditPrediction::from_response( + response, &snapshot, &buffer, &project, cx, + ) + .await; + + // TODO telemetry: duration, etc + Ok(prediction) + } + Ok(None) => Ok(None), + Err(err) => { + if err.is::() { + cx.update(|cx| { + this.update(cx, |this, _cx| { + this.update_required = true; + }) + .ok(); + + let error_message: SharedString = err.to_string().into(); + show_app_notification( + NotificationId::unique::(), + cx, + move |cx| { + cx.new(|cx| { + ErrorMessagePrompt::new(error_message.clone(), cx) + .with_link_button( + "Update Zed", + "https://zed.dev/releases", + ) + }) + }, + ); + }) + .ok(); + } + + Err(err) + } + } + } + }) + } + + async fn perform_request( + client: Arc, + llm_token: LlmApiToken, + app_version: SemanticVersion, + request: predict_edits_v3::PredictEditsRequest, + ) -> Result<( + predict_edits_v3::PredictEditsResponse, + Option, + )> { + let http_client = client.http_client(); + let mut token = llm_token.acquire(&client).await?; + let mut did_retry = false; + + loop { + let request_builder = http_client::Request::builder().method(Method::POST); + let request_builder = + if let Ok(predict_edits_url) = std::env::var("ZED_PREDICT_EDITS_URL") { + request_builder.uri(predict_edits_url) + } else { + request_builder.uri( + http_client + .build_zed_llm_url("/predict_edits/v3", &[])? + .as_ref(), + ) + }; + let request = request_builder + .header("Content-Type", "application/json") + .header("Authorization", format!("Bearer {}", token)) + .header(ZED_VERSION_HEADER_NAME, app_version.to_string()) + .body(serde_json::to_string(&request)?.into())?; + + let mut response = http_client.send(request).await?; + + if let Some(minimum_required_version) = response + .headers() + .get(MINIMUM_REQUIRED_VERSION_HEADER_NAME) + .and_then(|version| SemanticVersion::from_str(version.to_str().ok()?).ok()) + { + anyhow::ensure!( + app_version >= minimum_required_version, + ZedUpdateRequiredError { + minimum_version: minimum_required_version + } + ); + } + + if response.status().is_success() { + let usage = EditPredictionUsage::from_headers(response.headers()).ok(); + + let mut body = Vec::new(); + response.body_mut().read_to_end(&mut body).await?; + return Ok((serde_json::from_slice(&body)?, usage)); + } else if !did_retry + && response + .headers() + .get(EXPIRED_LLM_TOKEN_HEADER_NAME) + .is_some() + { + did_retry = true; + token = llm_token.refresh(&client).await?; + } else { + let mut body = String::new(); + response.body_mut().read_to_string(&mut body).await?; + anyhow::bail!( + "error predicting edits.\nStatus: {:?}\nBody: {}", + response.status(), + body + ); + } + } + } + + fn gather_nearby_diagnostics( + cursor_offset: usize, + diagnostic_sets: &[(LanguageServerId, DiagnosticSet)], + snapshot: &BufferSnapshot, + max_diagnostics_bytes: usize, + ) -> (Vec, bool) { + // TODO: Could make this more efficient + let mut diagnostic_groups = Vec::new(); + for (language_server_id, diagnostics) in diagnostic_sets { + let mut groups = Vec::new(); + diagnostics.groups(*language_server_id, &mut groups, &snapshot); + diagnostic_groups.extend( + groups + .into_iter() + .map(|(_, group)| group.resolve::(&snapshot)), + ); + } + + // sort by proximity to cursor + diagnostic_groups.sort_by_key(|group| { + let range = &group.entries[group.primary_ix].range; + if range.start >= cursor_offset { + range.start - cursor_offset + } else if cursor_offset >= range.end { + cursor_offset - range.end + } else { + (cursor_offset - range.start).min(range.end - cursor_offset) + } + }); + + let mut results = Vec::new(); + let mut diagnostic_groups_truncated = false; + let mut diagnostics_byte_count = 0; + for group in diagnostic_groups { + let raw_value = serde_json::value::to_raw_value(&group).unwrap(); + diagnostics_byte_count += raw_value.get().len(); + if diagnostics_byte_count > max_diagnostics_bytes { + diagnostic_groups_truncated = true; + break; + } + results.push(predict_edits_v3::DiagnosticGroup(raw_value)); + } + + (results, diagnostic_groups_truncated) + } + + // TODO: Dedupe with similar code in request_prediction? + pub fn cloud_request_for_zeta_cli( + &mut self, + project: &Entity, + buffer: &Entity, + position: language::Anchor, + cx: &mut Context, + ) -> Task> { + let project_state = self.projects.get(&project.entity_id()); + + let index_state = project_state.map(|state| { + state + .syntax_index + .read_with(cx, |index, _cx| index.state().clone()) + }); + let options = self.options.clone(); + let snapshot = buffer.read(cx).snapshot(); + let Some(excerpt_path) = snapshot.file().map(|path| path.full_path(cx)) else { + return Task::ready(Err(anyhow!("No file path for excerpt"))); + }; + let worktree_snapshots = project + .read(cx) + .worktrees(cx) + .map(|worktree| worktree.read(cx).snapshot()) + .collect::>(); + + let parent_abs_path = project::File::from_dyn(buffer.read(cx).file()).and_then(|f| { + let mut path = f.worktree.read(cx).absolutize(&f.path); + if path.pop() { Some(path) } else { None } + }); + + cx.background_spawn(async move { + let index_state = if let Some(index_state) = index_state { + Some(index_state.lock_owned().await) + } else { + None + }; + + let cursor_point = position.to_point(&snapshot); + + let debug_info = true; + EditPredictionContext::gather_context( + cursor_point, + &snapshot, + parent_abs_path.as_deref(), + &options.context, + index_state.as_deref(), + ) + .context("Failed to select excerpt") + .map(|context| { + make_cloud_request( + excerpt_path.into(), + context, + // TODO pass everything + Vec::new(), + false, + Vec::new(), + false, + None, + debug_info, + &worktree_snapshots, + index_state.as_deref(), + Some(options.max_prompt_bytes), + options.prompt_format, + ) + }) + }) + } + + pub fn wait_for_initial_indexing( + &mut self, + project: &Entity, + cx: &mut App, + ) -> Task> { + let zeta_project = self.get_or_init_zeta_project(project, cx); + zeta_project + .syntax_index + .read(cx) + .wait_for_initial_file_indexing(cx) + } +} + +#[derive(Error, Debug)] +#[error( + "You must update to Zed version {minimum_version} or higher to continue using edit predictions." +)] +pub struct ZedUpdateRequiredError { + minimum_version: SemanticVersion, +} + +fn make_cloud_request( + excerpt_path: Arc, + context: EditPredictionContext, + events: Vec, + can_collect_data: bool, + diagnostic_groups: Vec, + diagnostic_groups_truncated: bool, + git_info: Option, + debug_info: bool, + worktrees: &Vec, + index_state: Option<&SyntaxIndexState>, + prompt_max_bytes: Option, + prompt_format: PromptFormat, +) -> predict_edits_v3::PredictEditsRequest { + let mut signatures = Vec::new(); + let mut declaration_to_signature_index = HashMap::default(); + let mut referenced_declarations = Vec::new(); + + for snippet in context.declarations { + let project_entry_id = snippet.declaration.project_entry_id(); + let Some(path) = worktrees.iter().find_map(|worktree| { + worktree.entry_for_id(project_entry_id).map(|entry| { + let mut full_path = RelPathBuf::new(); + full_path.push(worktree.root_name()); + full_path.push(&entry.path); + full_path + }) + }) else { + continue; + }; + + let parent_index = index_state.and_then(|index_state| { + snippet.declaration.parent().and_then(|parent| { + add_signature( + parent, + &mut declaration_to_signature_index, + &mut signatures, + index_state, + ) + }) + }); + + let (text, text_is_truncated) = snippet.declaration.item_text(); + referenced_declarations.push(predict_edits_v3::ReferencedDeclaration { + path: path.as_std_path().into(), + text: text.into(), + range: snippet.declaration.item_range(), + text_is_truncated, + signature_range: snippet.declaration.signature_range_in_item_text(), + parent_index, + signature_score: snippet.score(DeclarationStyle::Signature), + declaration_score: snippet.score(DeclarationStyle::Declaration), + score_components: snippet.components, + }); + } + + let excerpt_parent = index_state.and_then(|index_state| { + context + .excerpt + .parent_declarations + .last() + .and_then(|(parent, _)| { + add_signature( + *parent, + &mut declaration_to_signature_index, + &mut signatures, + index_state, + ) + }) + }); + + predict_edits_v3::PredictEditsRequest { + excerpt_path, + excerpt: context.excerpt_text.body, + excerpt_range: context.excerpt.range, + cursor_offset: context.cursor_offset_in_excerpt, + referenced_declarations, + signatures, + excerpt_parent, + events, + can_collect_data, + diagnostic_groups, + diagnostic_groups_truncated, + git_info, + debug_info, + prompt_max_bytes, + prompt_format, + } +} + +fn add_signature( + declaration_id: DeclarationId, + declaration_to_signature_index: &mut HashMap, + signatures: &mut Vec, + index: &SyntaxIndexState, +) -> Option { + if let Some(signature_index) = declaration_to_signature_index.get(&declaration_id) { + return Some(*signature_index); + } + let Some(parent_declaration) = index.declaration(declaration_id) else { + log::error!("bug: missing parent declaration"); + return None; + }; + let parent_index = parent_declaration.parent().and_then(|parent| { + add_signature(parent, declaration_to_signature_index, signatures, index) + }); + let (text, text_is_truncated) = parent_declaration.signature_text(); + let signature_index = signatures.len(); + signatures.push(Signature { + text: text.into(), + text_is_truncated, + parent_index, + range: parent_declaration.signature_range(), + }); + declaration_to_signature_index.insert(declaration_id, signature_index); + Some(signature_index) +} + +#[cfg(test)] +mod tests { + use std::{ + path::{Path, PathBuf}, + sync::Arc, + }; + + use client::UserStore; + use clock::FakeSystemClock; + use cloud_llm_client::predict_edits_v3; + use futures::{ + AsyncReadExt, StreamExt, + channel::{mpsc, oneshot}, + }; + use gpui::{ + Entity, TestAppContext, + http_client::{FakeHttpClient, Response}, + prelude::*, + }; + use indoc::indoc; + use language::{LanguageServerId, OffsetRangeExt as _}; + use pretty_assertions::{assert_eq, assert_matches}; + use project::{FakeFs, Project}; + use serde_json::json; + use settings::SettingsStore; + use util::path; + use uuid::Uuid; + + use crate::{BufferEditPrediction, Zeta}; + + #[gpui::test] + async fn test_current_state(cx: &mut TestAppContext) { + let (zeta, mut req_rx) = init_test(cx); + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + "/root", + json!({ + "1.txt": "Hello!\nHow\nBye", + "2.txt": "Hola!\nComo\nAdios" + }), + ) + .await; + let project = Project::test(fs, vec![path!("/root").as_ref()], cx).await; + + zeta.update(cx, |zeta, cx| { + zeta.register_project(&project, cx); + }); + + let buffer1 = project + .update(cx, |project, cx| { + let path = project.find_project_path(path!("root/1.txt"), cx).unwrap(); + project.open_buffer(path, cx) + }) + .await + .unwrap(); + let snapshot1 = buffer1.read_with(cx, |buffer, _cx| buffer.snapshot()); + let position = snapshot1.anchor_before(language::Point::new(1, 3)); + + // Prediction for current file + + let prediction_task = zeta.update(cx, |zeta, cx| { + zeta.refresh_prediction(&project, &buffer1, position, cx) + }); + let (_request, respond_tx) = req_rx.next().await.unwrap(); + respond_tx + .send(predict_edits_v3::PredictEditsResponse { + request_id: Uuid::new_v4(), + edits: vec![predict_edits_v3::Edit { + path: Path::new(path!("root/1.txt")).into(), + range: 0..snapshot1.len(), + content: "Hello!\nHow are you?\nBye".into(), + }], + debug_info: None, + }) + .unwrap(); + prediction_task.await.unwrap(); + + zeta.read_with(cx, |zeta, cx| { + let prediction = zeta + .current_prediction_for_buffer(&buffer1, &project, cx) + .unwrap(); + assert_matches!(prediction, BufferEditPrediction::Local { .. }); + }); + + // Prediction for another file + + let prediction_task = zeta.update(cx, |zeta, cx| { + zeta.refresh_prediction(&project, &buffer1, position, cx) + }); + let (_request, respond_tx) = req_rx.next().await.unwrap(); + respond_tx + .send(predict_edits_v3::PredictEditsResponse { + request_id: Uuid::new_v4(), + edits: vec![predict_edits_v3::Edit { + path: Path::new(path!("root/2.txt")).into(), + range: 0..snapshot1.len(), + content: "Hola!\nComo estas?\nAdios".into(), + }], + debug_info: None, + }) + .unwrap(); + prediction_task.await.unwrap(); + + zeta.read_with(cx, |zeta, cx| { + let prediction = zeta + .current_prediction_for_buffer(&buffer1, &project, cx) + .unwrap(); + assert_matches!( + prediction, + BufferEditPrediction::Jump { prediction } if prediction.path.as_ref() == Path::new(path!("root/2.txt")) + ); + }); + + let buffer2 = project + .update(cx, |project, cx| { + let path = project.find_project_path(path!("root/2.txt"), cx).unwrap(); + project.open_buffer(path, cx) + }) + .await + .unwrap(); + + zeta.read_with(cx, |zeta, cx| { + let prediction = zeta + .current_prediction_for_buffer(&buffer2, &project, cx) + .unwrap(); + assert_matches!(prediction, BufferEditPrediction::Local { .. }); + }); + } + + #[gpui::test] + async fn test_simple_request(cx: &mut TestAppContext) { + let (zeta, mut req_rx) = init_test(cx); + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + "/root", + json!({ + "foo.md": "Hello!\nHow\nBye" + }), + ) + .await; + let project = Project::test(fs, vec![path!("/root").as_ref()], cx).await; + + let buffer = project + .update(cx, |project, cx| { + let path = project.find_project_path(path!("root/foo.md"), cx).unwrap(); + project.open_buffer(path, cx) + }) + .await + .unwrap(); + let snapshot = buffer.read_with(cx, |buffer, _cx| buffer.snapshot()); + let position = snapshot.anchor_before(language::Point::new(1, 3)); + + let prediction_task = zeta.update(cx, |zeta, cx| { + zeta.request_prediction(&project, &buffer, position, cx) + }); + + let (request, respond_tx) = req_rx.next().await.unwrap(); + assert_eq!( + request.excerpt_path.as_ref(), + Path::new(path!("root/foo.md")) + ); + assert_eq!(request.cursor_offset, 10); + + respond_tx + .send(predict_edits_v3::PredictEditsResponse { + request_id: Uuid::new_v4(), + edits: vec![predict_edits_v3::Edit { + path: Path::new(path!("root/foo.md")).into(), + range: 0..snapshot.len(), + content: "Hello!\nHow are you?\nBye".into(), + }], + debug_info: None, + }) + .unwrap(); + + let prediction = prediction_task.await.unwrap().unwrap(); + + assert_eq!(prediction.edits.len(), 1); + assert_eq!( + prediction.edits[0].0.to_point(&snapshot).start, + language::Point::new(1, 3) + ); + assert_eq!(prediction.edits[0].1, " are you?"); + } + + #[gpui::test] + async fn test_request_events(cx: &mut TestAppContext) { + let (zeta, mut req_rx) = init_test(cx); + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + "/root", + json!({ + "foo.md": "Hello!\n\nBye" + }), + ) + .await; + let project = Project::test(fs, vec![path!("/root").as_ref()], cx).await; + + let buffer = project + .update(cx, |project, cx| { + let path = project.find_project_path(path!("root/foo.md"), cx).unwrap(); + project.open_buffer(path, cx) + }) + .await + .unwrap(); + + zeta.update(cx, |zeta, cx| { + zeta.register_buffer(&buffer, &project, cx); + }); + + buffer.update(cx, |buffer, cx| { + buffer.edit(vec![(7..7, "How")], None, cx); + }); + + let snapshot = buffer.read_with(cx, |buffer, _cx| buffer.snapshot()); + let position = snapshot.anchor_before(language::Point::new(1, 3)); + + let prediction_task = zeta.update(cx, |zeta, cx| { + zeta.request_prediction(&project, &buffer, position, cx) + }); + + let (request, respond_tx) = req_rx.next().await.unwrap(); + + assert_eq!(request.events.len(), 1); + assert_eq!( + request.events[0], + predict_edits_v3::Event::BufferChange { + path: Some(PathBuf::from(path!("root/foo.md"))), + old_path: None, + diff: indoc! {" + @@ -1,3 +1,3 @@ + Hello! + - + +How + Bye + "} + .to_string(), + predicted: false + } + ); + + respond_tx + .send(predict_edits_v3::PredictEditsResponse { + request_id: Uuid::new_v4(), + edits: vec![predict_edits_v3::Edit { + path: Path::new(path!("root/foo.md")).into(), + range: 0..snapshot.len(), + content: "Hello!\nHow are you?\nBye".into(), + }], + debug_info: None, + }) + .unwrap(); + + let prediction = prediction_task.await.unwrap().unwrap(); + + assert_eq!(prediction.edits.len(), 1); + assert_eq!( + prediction.edits[0].0.to_point(&snapshot).start, + language::Point::new(1, 3) + ); + assert_eq!(prediction.edits[0].1, " are you?"); + } + + #[gpui::test] + async fn test_request_diagnostics(cx: &mut TestAppContext) { + let (zeta, mut req_rx) = init_test(cx); + let fs = FakeFs::new(cx.executor()); + fs.insert_tree( + "/root", + json!({ + "foo.md": "Hello!\nBye" + }), + ) + .await; + let project = Project::test(fs, vec![path!("/root").as_ref()], cx).await; + + let path_to_buffer_uri = lsp::Uri::from_file_path(path!("/root/foo.md")).unwrap(); + let diagnostic = lsp::Diagnostic { + range: lsp::Range::new(lsp::Position::new(1, 1), lsp::Position::new(1, 5)), + severity: Some(lsp::DiagnosticSeverity::ERROR), + message: "\"Hello\" deprecated. Use \"Hi\" instead".to_string(), + ..Default::default() + }; + + project.update(cx, |project, cx| { + project.lsp_store().update(cx, |lsp_store, cx| { + // Create some diagnostics + lsp_store + .update_diagnostics( + LanguageServerId(0), + lsp::PublishDiagnosticsParams { + uri: path_to_buffer_uri.clone(), + diagnostics: vec![diagnostic], + version: None, + }, + None, + language::DiagnosticSourceKind::Pushed, + &[], + cx, + ) + .unwrap(); + }); + }); + + let buffer = project + .update(cx, |project, cx| { + let path = project.find_project_path(path!("root/foo.md"), cx).unwrap(); + project.open_buffer(path, cx) + }) + .await + .unwrap(); + + let snapshot = buffer.read_with(cx, |buffer, _cx| buffer.snapshot()); + let position = snapshot.anchor_before(language::Point::new(0, 0)); + + let _prediction_task = zeta.update(cx, |zeta, cx| { + zeta.request_prediction(&project, &buffer, position, cx) + }); + + let (request, _respond_tx) = req_rx.next().await.unwrap(); + + assert_eq!(request.diagnostic_groups.len(), 1); + let value = serde_json::from_str::(request.diagnostic_groups[0].0.get()) + .unwrap(); + // We probably don't need all of this. TODO define a specific diagnostic type in predict_edits_v3 + assert_eq!( + value, + json!({ + "entries": [{ + "range": { + "start": 8, + "end": 10 + }, + "diagnostic": { + "source": null, + "code": null, + "code_description": null, + "severity": 1, + "message": "\"Hello\" deprecated. Use \"Hi\" instead", + "markdown": null, + "group_id": 0, + "is_primary": true, + "is_disk_based": false, + "is_unnecessary": false, + "source_kind": "Pushed", + "data": null, + "underline": true + } + }], + "primary_ix": 0 + }) + ); + } + + fn init_test( + cx: &mut TestAppContext, + ) -> ( + Entity, + mpsc::UnboundedReceiver<( + predict_edits_v3::PredictEditsRequest, + oneshot::Sender, + )>, + ) { + cx.update(move |cx| { + let settings_store = SettingsStore::test(cx); + cx.set_global(settings_store); + language::init(cx); + Project::init_settings(cx); + + let (req_tx, req_rx) = mpsc::unbounded(); + + let http_client = FakeHttpClient::create({ + move |req| { + let uri = req.uri().path().to_string(); + let mut body = req.into_body(); + let req_tx = req_tx.clone(); + async move { + let resp = match uri.as_str() { + "/client/llm_tokens" => serde_json::to_string(&json!({ + "token": "test" + })) + .unwrap(), + "/predict_edits/v3" => { + let mut buf = Vec::new(); + body.read_to_end(&mut buf).await.ok(); + let req = serde_json::from_slice(&buf).unwrap(); + + let (res_tx, res_rx) = oneshot::channel(); + req_tx.unbounded_send((req, res_tx)).unwrap(); + serde_json::to_string(&res_rx.await?).unwrap() + } + _ => { + panic!("Unexpected path: {}", uri) + } + }; + + Ok(Response::builder().body(resp.into()).unwrap()) + } + } + }); + + let client = client::Client::new(Arc::new(FakeSystemClock::new()), http_client, cx); + client.cloud_client().set_credentials(1, "test".into()); + + language_model::init(client.clone(), cx); + + let user_store = cx.new(|cx| UserStore::new(client.clone(), cx)); + let zeta = Zeta::global(&client, &user_store, cx); + + (zeta, req_rx) + }) + } +} diff --git a/crates/zeta2_tools/Cargo.toml b/crates/zeta2_tools/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..c600b3b86e4f3f8477431275d7f85591ccb22ac7 --- /dev/null +++ b/crates/zeta2_tools/Cargo.toml @@ -0,0 +1,48 @@ +[package] +name = "zeta2_tools" +version = "0.1.0" +edition.workspace = true +publish.workspace = true +license = "GPL-3.0-or-later" + +[lints] +workspace = true + +[lib] +path = "src/zeta2_tools.rs" + +[dependencies] +chrono.workspace = true +client.workspace = true +cloud_llm_client.workspace = true +collections.workspace = true +edit_prediction_context.workspace = true +editor.workspace = true +futures.workspace = true +gpui.workspace = true +language.workspace = true +log.workspace = true +multi_buffer.workspace = true +ordered-float.workspace = true +project.workspace = true +serde.workspace = true +text.workspace = true +ui.workspace = true +ui_input.workspace = true +util.workspace = true +workspace-hack.workspace = true +workspace.workspace = true +zeta2.workspace = true + +[dev-dependencies] +clap.workspace = true +gpui = { workspace = true, features = ["test-support"] } +indoc.workspace = true +language = { workspace = true, features = ["test-support"] } +pretty_assertions.workspace = true +project = { workspace = true, features = ["test-support"] } +serde_json.workspace = true +settings = { workspace = true, features = ["test-support"] } +text = { workspace = true, features = ["test-support"] } +util = { workspace = true, features = ["test-support"] } +zlog.workspace = true diff --git a/crates/zeta2_tools/LICENSE-GPL b/crates/zeta2_tools/LICENSE-GPL new file mode 120000 index 0000000000000000000000000000000000000000..89e542f750cd3860a0598eff0dc34b56d7336dc4 --- /dev/null +++ b/crates/zeta2_tools/LICENSE-GPL @@ -0,0 +1 @@ +../../LICENSE-GPL \ No newline at end of file diff --git a/crates/zeta2_tools/src/zeta2_tools.rs b/crates/zeta2_tools/src/zeta2_tools.rs new file mode 100644 index 0000000000000000000000000000000000000000..69536ad46806cb271ef987cadb4e95a2061ac953 --- /dev/null +++ b/crates/zeta2_tools/src/zeta2_tools.rs @@ -0,0 +1,886 @@ +use std::{ + cmp::Reverse, collections::hash_map::Entry, path::PathBuf, str::FromStr, sync::Arc, + time::Duration, +}; + +use chrono::TimeDelta; +use client::{Client, UserStore}; +use cloud_llm_client::predict_edits_v3::{DeclarationScoreComponents, PromptFormat}; +use collections::HashMap; +use editor::{Editor, EditorEvent, EditorMode, ExcerptRange, MultiBuffer}; +use futures::{StreamExt as _, channel::oneshot}; +use gpui::{ + CursorStyle, Entity, EventEmitter, FocusHandle, Focusable, Subscription, Task, WeakEntity, + actions, prelude::*, +}; +use language::{Buffer, DiskState}; +use ordered_float::OrderedFloat; +use project::{Project, WorktreeId}; +use ui::{ContextMenu, ContextMenuEntry, DropdownMenu, prelude::*}; +use ui_input::SingleLineInput; +use util::{ResultExt, paths::PathStyle, rel_path::RelPath}; +use workspace::{Item, SplitDirection, Workspace}; +use zeta2::{DEFAULT_CONTEXT_OPTIONS, PredictionDebugInfo, Zeta, ZetaOptions}; + +use edit_prediction_context::{DeclarationStyle, EditPredictionExcerptOptions}; + +actions!( + dev, + [ + /// Opens the language server protocol logs viewer. + OpenZeta2Inspector + ] +); + +pub fn init(cx: &mut App) { + cx.observe_new(move |workspace: &mut Workspace, _, _cx| { + workspace.register_action(move |workspace, _: &OpenZeta2Inspector, window, cx| { + let project = workspace.project(); + workspace.split_item( + SplitDirection::Right, + Box::new(cx.new(|cx| { + Zeta2Inspector::new( + &project, + workspace.client(), + workspace.user_store(), + window, + cx, + ) + })), + window, + cx, + ); + }); + }) + .detach(); +} + +// TODO show included diagnostics, and events + +pub struct Zeta2Inspector { + focus_handle: FocusHandle, + project: Entity, + last_prediction: Option, + max_excerpt_bytes_input: Entity, + min_excerpt_bytes_input: Entity, + cursor_context_ratio_input: Entity, + max_prompt_bytes_input: Entity, + active_view: ActiveView, + zeta: Entity, + _active_editor_subscription: Option, + _update_state_task: Task<()>, + _receive_task: Task<()>, +} + +#[derive(PartialEq)] +enum ActiveView { + Context, + Inference, +} + +struct LastPrediction { + context_editor: Entity, + prompt_editor: Entity, + retrieval_time: TimeDelta, + buffer: WeakEntity, + position: language::Anchor, + state: LastPredictionState, + _task: Option>, +} + +enum LastPredictionState { + Requested, + Success { + inference_time: TimeDelta, + parsing_time: TimeDelta, + prompt_planning_time: TimeDelta, + model_response_editor: Entity, + }, + Failed { + message: String, + }, +} + +impl Zeta2Inspector { + pub fn new( + project: &Entity, + client: &Arc, + user_store: &Entity, + window: &mut Window, + cx: &mut Context, + ) -> Self { + let zeta = Zeta::global(client, user_store, cx); + let mut request_rx = zeta.update(cx, |zeta, _cx| zeta.debug_info()); + + let receive_task = cx.spawn_in(window, async move |this, cx| { + while let Some(prediction) = request_rx.next().await { + this.update_in(cx, |this, window, cx| { + this.update_last_prediction(prediction, window, cx) + }) + .ok(); + } + }); + + let mut this = Self { + focus_handle: cx.focus_handle(), + project: project.clone(), + last_prediction: None, + active_view: ActiveView::Context, + max_excerpt_bytes_input: Self::number_input("Max Excerpt Bytes", window, cx), + min_excerpt_bytes_input: Self::number_input("Min Excerpt Bytes", window, cx), + cursor_context_ratio_input: Self::number_input("Cursor Context Ratio", window, cx), + max_prompt_bytes_input: Self::number_input("Max Prompt Bytes", window, cx), + zeta: zeta.clone(), + _active_editor_subscription: None, + _update_state_task: Task::ready(()), + _receive_task: receive_task, + }; + this.set_input_options(&zeta.read(cx).options().clone(), window, cx); + this + } + + fn set_input_options( + &mut self, + options: &ZetaOptions, + window: &mut Window, + cx: &mut Context, + ) { + self.max_excerpt_bytes_input.update(cx, |input, cx| { + input.set_text(options.context.excerpt.max_bytes.to_string(), window, cx); + }); + self.min_excerpt_bytes_input.update(cx, |input, cx| { + input.set_text(options.context.excerpt.min_bytes.to_string(), window, cx); + }); + self.cursor_context_ratio_input.update(cx, |input, cx| { + input.set_text( + format!( + "{:.2}", + options + .context + .excerpt + .target_before_cursor_over_total_bytes + ), + window, + cx, + ); + }); + self.max_prompt_bytes_input.update(cx, |input, cx| { + input.set_text(options.max_prompt_bytes.to_string(), window, cx); + }); + cx.notify(); + } + + fn set_options(&mut self, options: ZetaOptions, cx: &mut Context) { + self.zeta.update(cx, |this, _cx| this.set_options(options)); + + const THROTTLE_TIME: Duration = Duration::from_millis(100); + + if let Some(prediction) = self.last_prediction.as_mut() { + if let Some(buffer) = prediction.buffer.upgrade() { + let position = prediction.position; + let zeta = self.zeta.clone(); + let project = self.project.clone(); + prediction._task = Some(cx.spawn(async move |_this, cx| { + cx.background_executor().timer(THROTTLE_TIME).await; + if let Some(task) = zeta + .update(cx, |zeta, cx| { + zeta.refresh_prediction(&project, &buffer, position, cx) + }) + .ok() + { + task.await.log_err(); + } + })); + prediction.state = LastPredictionState::Requested; + } else { + self.last_prediction.take(); + } + } + + cx.notify(); + } + + fn number_input( + label: &'static str, + window: &mut Window, + cx: &mut Context, + ) -> Entity { + let input = cx.new(|cx| { + SingleLineInput::new(window, cx, "") + .label(label) + .label_min_width(px(64.)) + }); + + cx.subscribe_in( + &input.read(cx).editor().clone(), + window, + |this, _, event, _window, cx| { + let EditorEvent::BufferEdited = event else { + return; + }; + + fn number_input_value( + input: &Entity, + cx: &App, + ) -> T { + input + .read(cx) + .editor() + .read(cx) + .text(cx) + .parse::() + .unwrap_or_default() + } + + let mut context_options = DEFAULT_CONTEXT_OPTIONS.clone(); + context_options.excerpt = EditPredictionExcerptOptions { + max_bytes: number_input_value(&this.max_excerpt_bytes_input, cx), + min_bytes: number_input_value(&this.min_excerpt_bytes_input, cx), + target_before_cursor_over_total_bytes: number_input_value( + &this.cursor_context_ratio_input, + cx, + ), + }; + + let zeta_options = this.zeta.read(cx).options(); + this.set_options( + ZetaOptions { + context: context_options, + max_prompt_bytes: number_input_value(&this.max_prompt_bytes_input, cx), + max_diagnostic_bytes: zeta_options.max_diagnostic_bytes, + prompt_format: zeta_options.prompt_format, + file_indexing_parallelism: zeta_options.file_indexing_parallelism, + }, + cx, + ); + }, + ) + .detach(); + input + } + + fn update_last_prediction( + &mut self, + prediction: zeta2::PredictionDebugInfo, + window: &mut Window, + cx: &mut Context, + ) { + let project = self.project.read(cx); + let path_style = project.path_style(cx); + let Some(worktree_id) = project + .worktrees(cx) + .next() + .map(|worktree| worktree.read(cx).id()) + else { + log::error!("Open a worktree to use edit prediction debug view"); + self.last_prediction.take(); + return; + }; + + self._update_state_task = cx.spawn_in(window, { + let language_registry = self.project.read(cx).languages().clone(); + async move |this, cx| { + let mut languages = HashMap::default(); + for lang_id in prediction + .context + .declarations + .iter() + .map(|snippet| snippet.declaration.identifier().language_id) + .chain(prediction.context.excerpt_text.language_id) + { + if let Entry::Vacant(entry) = languages.entry(lang_id) { + // Most snippets are gonna be the same language, + // so we think it's fine to do this sequentially for now + entry.insert(language_registry.language_for_id(lang_id).await.ok()); + } + } + + let markdown_language = language_registry + .language_for_name("Markdown") + .await + .log_err(); + + this.update_in(cx, |this, window, cx| { + let context_editor = cx.new(|cx| { + let mut excerpt_score_components = HashMap::default(); + + let multibuffer = cx.new(|cx| { + let mut multibuffer = MultiBuffer::new(language::Capability::ReadOnly); + let excerpt_file = Arc::new(ExcerptMetadataFile { + title: RelPath::unix("Cursor Excerpt").unwrap().into(), + path_style, + worktree_id, + }); + + let excerpt_buffer = cx.new(|cx| { + let mut buffer = + Buffer::local(prediction.context.excerpt_text.body, cx); + if let Some(language) = prediction + .context + .excerpt_text + .language_id + .as_ref() + .and_then(|id| languages.get(id)) + { + buffer.set_language(language.clone(), cx); + } + buffer.file_updated(excerpt_file, cx); + buffer + }); + + multibuffer.push_excerpts( + excerpt_buffer, + [ExcerptRange::new(text::Anchor::MIN..text::Anchor::MAX)], + cx, + ); + + let mut declarations = prediction.context.declarations.clone(); + declarations.sort_unstable_by_key(|declaration| { + Reverse(OrderedFloat( + declaration.score(DeclarationStyle::Declaration), + )) + }); + + for snippet in &declarations { + let path = this + .project + .read(cx) + .path_for_entry(snippet.declaration.project_entry_id(), cx); + + let snippet_file = Arc::new(ExcerptMetadataFile { + title: RelPath::unix(&format!( + "{} (Score: {})", + path.map(|p| p.path.display(path_style).to_string()) + .unwrap_or_else(|| "".to_string()), + snippet.score(DeclarationStyle::Declaration) + )) + .unwrap() + .into(), + path_style, + worktree_id, + }); + + let excerpt_buffer = cx.new(|cx| { + let mut buffer = + Buffer::local(snippet.declaration.item_text().0, cx); + buffer.file_updated(snippet_file, cx); + if let Some(language) = + languages.get(&snippet.declaration.identifier().language_id) + { + buffer.set_language(language.clone(), cx); + } + buffer + }); + + let excerpt_ids = multibuffer.push_excerpts( + excerpt_buffer, + [ExcerptRange::new(text::Anchor::MIN..text::Anchor::MAX)], + cx, + ); + let excerpt_id = excerpt_ids.first().unwrap(); + + excerpt_score_components + .insert(*excerpt_id, snippet.components.clone()); + } + + multibuffer + }); + + let mut editor = + Editor::new(EditorMode::full(), multibuffer, None, window, cx); + editor.register_addon(ZetaContextAddon { + excerpt_score_components, + }); + editor + }); + + let PredictionDebugInfo { + response_rx, + position, + buffer, + retrieval_time, + local_prompt, + .. + } = prediction; + + let task = cx.spawn_in(window, { + let markdown_language = markdown_language.clone(); + async move |this, cx| { + let response = response_rx.await; + + this.update_in(cx, |this, window, cx| { + if let Some(prediction) = this.last_prediction.as_mut() { + prediction.state = match response { + Ok(Ok(response)) => { + prediction.prompt_editor.update( + cx, + |prompt_editor, cx| { + prompt_editor.set_text( + response.prompt, + window, + cx, + ); + }, + ); + + LastPredictionState::Success { + prompt_planning_time: response.prompt_planning_time, + inference_time: response.inference_time, + parsing_time: response.parsing_time, + model_response_editor: cx.new(|cx| { + let buffer = cx.new(|cx| { + let mut buffer = Buffer::local( + response.model_response, + cx, + ); + buffer.set_language(markdown_language, cx); + buffer + }); + let buffer = cx.new(|cx| { + MultiBuffer::singleton(buffer, cx) + }); + let mut editor = Editor::new( + EditorMode::full(), + buffer, + None, + window, + cx, + ); + editor.set_read_only(true); + editor.set_show_line_numbers(false, cx); + editor.set_show_gutter(false, cx); + editor.set_show_scrollbars(false, cx); + editor + }), + } + } + Ok(Err(err)) => { + LastPredictionState::Failed { message: err } + } + Err(oneshot::Canceled) => LastPredictionState::Failed { + message: "Canceled".to_string(), + }, + }; + } + }) + .ok(); + } + }); + + this.last_prediction = Some(LastPrediction { + context_editor, + prompt_editor: cx.new(|cx| { + let buffer = cx.new(|cx| { + let mut buffer = + Buffer::local(local_prompt.unwrap_or_else(|err| err), cx); + buffer.set_language(markdown_language.clone(), cx); + buffer + }); + let buffer = cx.new(|cx| MultiBuffer::singleton(buffer, cx)); + let mut editor = + Editor::new(EditorMode::full(), buffer, None, window, cx); + editor.set_read_only(true); + editor.set_show_line_numbers(false, cx); + editor.set_show_gutter(false, cx); + editor.set_show_scrollbars(false, cx); + editor + }), + retrieval_time, + buffer, + position, + state: LastPredictionState::Requested, + _task: Some(task), + }); + cx.notify(); + }) + .ok(); + } + }); + } + + fn render_options(&self, window: &mut Window, cx: &mut Context) -> Div { + v_flex() + .gap_2() + .child( + h_flex() + .child(Headline::new("Options").size(HeadlineSize::Small)) + .justify_between() + .child( + ui::Button::new("reset-options", "Reset") + .disabled(self.zeta.read(cx).options() == &zeta2::DEFAULT_OPTIONS) + .style(ButtonStyle::Outlined) + .size(ButtonSize::Large) + .on_click(cx.listener(|this, _, window, cx| { + this.set_input_options(&zeta2::DEFAULT_OPTIONS, window, cx); + })), + ), + ) + .child( + v_flex() + .gap_2() + .child( + h_flex() + .gap_2() + .items_end() + .child(self.max_excerpt_bytes_input.clone()) + .child(self.min_excerpt_bytes_input.clone()) + .child(self.cursor_context_ratio_input.clone()), + ) + .child( + h_flex() + .gap_2() + .items_end() + .child(self.max_prompt_bytes_input.clone()) + .child(self.render_prompt_format_dropdown(window, cx)), + ), + ) + } + + fn render_prompt_format_dropdown(&self, window: &mut Window, cx: &mut Context) -> Div { + let active_format = self.zeta.read(cx).options().prompt_format; + let this = cx.weak_entity(); + + v_flex() + .gap_1p5() + .child( + Label::new("Prompt Format") + .size(LabelSize::Small) + .color(Color::Muted), + ) + .child( + DropdownMenu::new( + "ep-prompt-format", + active_format.to_string(), + ContextMenu::build(window, cx, move |mut menu, _window, _cx| { + for prompt_format in PromptFormat::iter() { + menu = menu.item( + ContextMenuEntry::new(prompt_format.to_string()) + .toggleable(IconPosition::End, active_format == prompt_format) + .handler({ + let this = this.clone(); + move |_window, cx| { + this.update(cx, |this, cx| { + let current_options = + this.zeta.read(cx).options().clone(); + let options = ZetaOptions { + prompt_format, + ..current_options + }; + this.set_options(options, cx); + }) + .ok(); + } + }), + ) + } + menu + }), + ) + .style(ui::DropdownStyle::Outlined), + ) + } + + fn render_tabs(&self, cx: &mut Context) -> Option { + if self.last_prediction.is_none() { + return None; + }; + + Some( + ui::ToggleButtonGroup::single_row( + "prediction", + [ + ui::ToggleButtonSimple::new( + "Context", + cx.listener(|this, _, _, cx| { + this.active_view = ActiveView::Context; + cx.notify(); + }), + ), + ui::ToggleButtonSimple::new( + "Inference", + cx.listener(|this, _, _, cx| { + this.active_view = ActiveView::Inference; + cx.notify(); + }), + ), + ], + ) + .style(ui::ToggleButtonGroupStyle::Outlined) + .selected_index(if self.active_view == ActiveView::Context { + 0 + } else { + 1 + }) + .into_any_element(), + ) + } + + fn render_stats(&self) -> Option
{ + let Some(prediction) = self.last_prediction.as_ref() else { + return None; + }; + + let (prompt_planning_time, inference_time, parsing_time) = match &prediction.state { + LastPredictionState::Success { + inference_time, + parsing_time, + prompt_planning_time, + .. + } => ( + Some(*prompt_planning_time), + Some(*inference_time), + Some(*parsing_time), + ), + LastPredictionState::Requested | LastPredictionState::Failed { .. } => { + (None, None, None) + } + }; + + Some( + v_flex() + .p_4() + .gap_2() + .min_w(px(160.)) + .child(Headline::new("Stats").size(HeadlineSize::Small)) + .child(Self::render_duration( + "Context retrieval", + Some(prediction.retrieval_time), + )) + .child(Self::render_duration( + "Prompt planning", + prompt_planning_time, + )) + .child(Self::render_duration("Inference", inference_time)) + .child(Self::render_duration("Parsing", parsing_time)), + ) + } + + fn render_duration(name: &'static str, time: Option) -> Div { + h_flex() + .gap_1() + .child(Label::new(name).color(Color::Muted).size(LabelSize::Small)) + .child(match time { + Some(time) => Label::new(if time.num_microseconds().unwrap_or(0) >= 1000 { + format!("{} ms", time.num_milliseconds()) + } else { + format!("{} µs", time.num_microseconds().unwrap_or(0)) + }) + .size(LabelSize::Small), + None => Label::new("...").size(LabelSize::Small), + }) + } + + fn render_content(&self, cx: &mut Context) -> AnyElement { + match self.last_prediction.as_ref() { + None => v_flex() + .size_full() + .justify_center() + .items_center() + .child(Label::new("No prediction").size(LabelSize::Large)) + .into_any(), + Some(prediction) => self.render_last_prediction(prediction, cx).into_any(), + } + } + + fn render_last_prediction(&self, prediction: &LastPrediction, cx: &mut Context) -> Div { + match &self.active_view { + ActiveView::Context => div().size_full().child(prediction.context_editor.clone()), + ActiveView::Inference => h_flex() + .items_start() + .w_full() + .flex_1() + .border_t_1() + .border_color(cx.theme().colors().border) + .bg(cx.theme().colors().editor_background) + .child( + v_flex() + .flex_1() + .gap_2() + .p_4() + .h_full() + .child( + h_flex() + .justify_between() + .child(ui::Headline::new("Prompt").size(ui::HeadlineSize::XSmall)) + .child(match prediction.state { + LastPredictionState::Requested + | LastPredictionState::Failed { .. } => ui::Chip::new("Local") + .bg_color(cx.theme().status().warning_background) + .label_color(Color::Success), + LastPredictionState::Success { .. } => ui::Chip::new("Cloud") + .bg_color(cx.theme().status().success_background) + .label_color(Color::Success), + }), + ) + .child(prediction.prompt_editor.clone()), + ) + .child(ui::vertical_divider()) + .child( + v_flex() + .flex_1() + .gap_2() + .h_full() + .p_4() + .child(ui::Headline::new("Model Response").size(ui::HeadlineSize::XSmall)) + .child(match &prediction.state { + LastPredictionState::Success { + model_response_editor, + .. + } => model_response_editor.clone().into_any_element(), + LastPredictionState::Requested => v_flex() + .p_4() + .gap_2() + .child(Label::new("Loading...").buffer_font(cx)) + .into_any(), + LastPredictionState::Failed { message } => v_flex() + .p_4() + .gap_2() + .child(Label::new(message.clone()).buffer_font(cx)) + .into_any(), + }), + ), + } + } +} + +impl Focusable for Zeta2Inspector { + fn focus_handle(&self, _cx: &App) -> FocusHandle { + self.focus_handle.clone() + } +} + +impl Item for Zeta2Inspector { + type Event = (); + + fn tab_content_text(&self, _detail: usize, _cx: &App) -> SharedString { + "Zeta2 Inspector".into() + } +} + +impl EventEmitter<()> for Zeta2Inspector {} + +impl Render for Zeta2Inspector { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + v_flex() + .size_full() + .bg(cx.theme().colors().editor_background) + .child( + h_flex() + .w_full() + .child( + v_flex() + .flex_1() + .p_4() + .h_full() + .justify_between() + .child(self.render_options(window, cx)) + .gap_4() + .children(self.render_tabs(cx)), + ) + .child(ui::vertical_divider()) + .children(self.render_stats()), + ) + .child(self.render_content(cx)) + } +} + +// Using same approach as commit view + +struct ExcerptMetadataFile { + title: Arc, + worktree_id: WorktreeId, + path_style: PathStyle, +} + +impl language::File for ExcerptMetadataFile { + fn as_local(&self) -> Option<&dyn language::LocalFile> { + None + } + + fn disk_state(&self) -> DiskState { + DiskState::New + } + + fn path(&self) -> &Arc { + &self.title + } + + fn full_path(&self, _: &App) -> PathBuf { + self.title.as_std_path().to_path_buf() + } + + fn file_name<'a>(&'a self, _: &'a App) -> &'a str { + self.title.file_name().unwrap() + } + + fn path_style(&self, _: &App) -> PathStyle { + self.path_style + } + + fn worktree_id(&self, _: &App) -> WorktreeId { + self.worktree_id + } + + fn to_proto(&self, _: &App) -> language::proto::File { + unimplemented!() + } + + fn is_private(&self) -> bool { + false + } +} + +struct ZetaContextAddon { + excerpt_score_components: HashMap, +} + +impl editor::Addon for ZetaContextAddon { + fn to_any(&self) -> &dyn std::any::Any { + self + } + + fn render_buffer_header_controls( + &self, + excerpt_info: &multi_buffer::ExcerptInfo, + _window: &Window, + _cx: &App, + ) -> Option { + let score_components = self.excerpt_score_components.get(&excerpt_info.id)?.clone(); + + Some( + div() + .id(excerpt_info.id.to_proto() as usize) + .child(ui::Icon::new(IconName::Info)) + .cursor(CursorStyle::PointingHand) + .tooltip(move |_, cx| { + cx.new(|_| ScoreComponentsTooltip::new(&score_components)) + .into() + }) + .into_any(), + ) + } +} + +struct ScoreComponentsTooltip { + text: SharedString, +} + +impl ScoreComponentsTooltip { + fn new(components: &DeclarationScoreComponents) -> Self { + Self { + text: format!("{:#?}", components).into(), + } + } +} + +impl Render for ScoreComponentsTooltip { + fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { + div().pl_2().pt_2p5().child( + div() + .elevation_2(cx) + .py_1() + .px_2() + .child(ui::Label::new(self.text.clone()).buffer_font(cx)), + ) + } +} diff --git a/crates/zeta_cli/Cargo.toml b/crates/zeta_cli/Cargo.toml index e77351c219bac4425136e2a3f1752d73e76adbbf..d81a5ae6d34fbe7cba25898fc4885baa84f1dfb2 100644 --- a/crates/zeta_cli/Cargo.toml +++ b/crates/zeta_cli/Cargo.toml @@ -16,7 +16,11 @@ path = "src/main.rs" anyhow.workspace = true clap.workspace = true client.workspace = true +cloud_llm_client.workspace= true +cloud_zeta2_prompt.workspace= true +collections.workspace = true debug_adapter_extension.workspace = true +edit_prediction_context.workspace = true extension.workspace = true fs.workspace = true futures.workspace = true @@ -27,7 +31,9 @@ language_extension.workspace = true language_model.workspace = true language_models.workspace = true languages = { workspace = true, features = ["load-grammars"] } +log.workspace = true node_runtime.workspace = true +ordered-float.workspace = true paths.workspace = true project.workspace = true prompt_store.workspace = true @@ -37,9 +43,11 @@ serde.workspace = true serde_json.workspace = true settings.workspace = true shellexpand.workspace = true +smol.workspace = true terminal_view.workspace = true util.workspace = true watch.workspace = true workspace-hack.workspace = true zeta.workspace = true -smol.workspace = true +zeta2.workspace = true +zlog.workspace = true diff --git a/crates/zeta_cli/src/headless.rs b/crates/zeta_cli/src/headless.rs index a11fd707591d0403409b5bc9e243d35c70fd65d3..bb4cb010cba6ea29a9bcd6d8cc0dc93475dbc2a0 100644 --- a/crates/zeta_cli/src/headless.rs +++ b/crates/zeta_cli/src/headless.rs @@ -31,10 +31,7 @@ pub fn init(cx: &mut App) -> ZetaCliAppState { release_channel::init(app_version, cx); gpui_tokio::init(cx); - let mut settings_store = SettingsStore::new(cx); - settings_store - .set_default_settings(settings::default_settings().as_ref(), cx) - .unwrap(); + let settings_store = SettingsStore::new(cx, &settings::default_settings()); cx.set_global(settings_store); client::init_settings(cx); diff --git a/crates/zeta_cli/src/main.rs b/crates/zeta_cli/src/main.rs index e7cec26b19358056cee4c8e253c54c0b2c794b33..7e490266decb59cf16fb9ce4acd8ecc8d7bc0f91 100644 --- a/crates/zeta_cli/src/main.rs +++ b/crates/zeta_cli/src/main.rs @@ -1,26 +1,29 @@ mod headless; +mod retrieval_stats; +mod source_location; +mod util; +use crate::retrieval_stats::retrieval_stats; +use ::util::paths::PathStyle; use anyhow::{Result, anyhow}; use clap::{Args, Parser, Subcommand}; -use futures::channel::mpsc; -use futures::{FutureExt as _, StreamExt as _}; -use gpui::{AppContext, Application, AsyncApp}; -use gpui::{Entity, Task}; +use cloud_llm_client::predict_edits_v3::{self}; +use edit_prediction_context::{ + EditPredictionContextOptions, EditPredictionExcerptOptions, EditPredictionScoreOptions, +}; +use gpui::{Application, AsyncApp, prelude::*}; use language::Bias; -use language::Buffer; -use language::Point; use language_model::LlmApiToken; -use project::{Project, ProjectPath, Worktree}; +use project::Project; use release_channel::AppVersion; use reqwest_client::ReqwestClient; -use std::path::{Path, PathBuf}; -use std::process::exit; -use std::str::FromStr; -use std::sync::Arc; -use std::time::Duration; -use zeta::{GatherContextOutput, PerformPredictEditsParams, Zeta, gather_context}; +use serde_json::json; +use std::{collections::HashSet, path::PathBuf, process::exit, str::FromStr, sync::Arc}; +use zeta::{PerformPredictEditsParams, Zeta}; use crate::headless::ZetaCliAppState; +use crate::source_location::SourceLocation; +use crate::util::{open_buffer, open_buffer_with_language_server}; #[derive(Parser, Debug)] #[command(name = "zeta")] @@ -32,12 +35,30 @@ struct ZetaCliArgs { #[derive(Subcommand, Debug)] enum Commands { Context(ContextArgs), + Zeta2Context { + #[clap(flatten)] + zeta2_args: Zeta2Args, + #[clap(flatten)] + context_args: ContextArgs, + }, Predict { #[arg(long)] predict_edits_body: Option, #[clap(flatten)] context_args: Option, }, + RetrievalStats { + #[clap(flatten)] + zeta2_args: Zeta2Args, + #[arg(long)] + worktree: PathBuf, + #[arg(long)] + extension: Option, + #[arg(long)] + limit: Option, + #[arg(long)] + skip: Option, + }, } #[derive(Debug, Args)] @@ -46,13 +67,61 @@ struct ContextArgs { #[arg(long)] worktree: PathBuf, #[arg(long)] - cursor: CursorPosition, + cursor: SourceLocation, #[arg(long)] use_language_server: bool, #[arg(long)] events: Option, } +#[derive(Debug, Args)] +struct Zeta2Args { + #[arg(long, default_value_t = 8192)] + max_prompt_bytes: usize, + #[arg(long, default_value_t = 2048)] + max_excerpt_bytes: usize, + #[arg(long, default_value_t = 1024)] + min_excerpt_bytes: usize, + #[arg(long, default_value_t = 0.66)] + target_before_cursor_over_total_bytes: f32, + #[arg(long, default_value_t = 1024)] + max_diagnostic_bytes: usize, + #[arg(long, value_enum, default_value_t = PromptFormat::default())] + prompt_format: PromptFormat, + #[arg(long, value_enum, default_value_t = Default::default())] + output_format: OutputFormat, + #[arg(long, default_value_t = 42)] + file_indexing_parallelism: usize, + #[arg(long, default_value_t = false)] + disable_imports_gathering: bool, +} + +#[derive(clap::ValueEnum, Default, Debug, Clone)] +enum PromptFormat { + #[default] + MarkedExcerpt, + LabeledSections, + OnlySnippets, +} + +impl Into for PromptFormat { + fn into(self) -> predict_edits_v3::PromptFormat { + match self { + Self::MarkedExcerpt => predict_edits_v3::PromptFormat::MarkedExcerpt, + Self::LabeledSections => predict_edits_v3::PromptFormat::LabeledSections, + Self::OnlySnippets => predict_edits_v3::PromptFormat::OnlySnippets, + } + } +} + +#[derive(clap::ValueEnum, Default, Debug, Clone)] +enum OutputFormat { + #[default] + Prompt, + Request, + Full, +} + #[derive(Debug, Clone)] enum FileOrStdin { File(PathBuf), @@ -79,44 +148,17 @@ impl FromStr for FileOrStdin { } } -#[derive(Debug, Clone)] -struct CursorPosition { - path: PathBuf, - point: Point, -} - -impl FromStr for CursorPosition { - type Err = anyhow::Error; - - fn from_str(s: &str) -> Result { - let parts: Vec<&str> = s.split(':').collect(); - if parts.len() != 3 { - return Err(anyhow!( - "Invalid cursor format. Expected 'file.rs:line:column', got '{}'", - s - )); - } - - let path = PathBuf::from(parts[0]); - let line: u32 = parts[1] - .parse() - .map_err(|_| anyhow!("Invalid line number: '{}'", parts[1]))?; - let column: u32 = parts[2] - .parse() - .map_err(|_| anyhow!("Invalid column number: '{}'", parts[2]))?; - - // Convert from 1-based to 0-based indexing - let point = Point::new(line.saturating_sub(1), column.saturating_sub(1)); - - Ok(CursorPosition { path, point }) - } +enum GetContextOutput { + Zeta1(zeta::GatherContextOutput), + Zeta2(String), } async fn get_context( + zeta2_args: Option, args: ContextArgs, app_state: &Arc, cx: &mut AsyncApp, -) -> Result { +) -> Result { let ContextArgs { worktree: worktree_path, cursor, @@ -125,9 +167,6 @@ async fn get_context( } = args; let worktree_path = worktree_path.canonicalize()?; - if cursor.path.is_absolute() { - return Err(anyhow!("Absolute paths are not supported in --cursor")); - } let project = cx.update(|cx| { Project::local( @@ -147,23 +186,26 @@ async fn get_context( })? .await?; + let mut ready_languages = HashSet::default(); let (_lsp_open_handle, buffer) = if use_language_server { - let (lsp_open_handle, buffer) = - open_buffer_with_language_server(&project, &worktree, &cursor.path, cx).await?; + let (lsp_open_handle, _, buffer) = open_buffer_with_language_server( + project.clone(), + worktree.clone(), + cursor.path.clone(), + &mut ready_languages, + cx, + ) + .await?; (Some(lsp_open_handle), buffer) } else { - let abs_path = worktree_path.join(&cursor.path); - let content = smol::fs::read_to_string(&abs_path).await?; - let buffer = cx.new(|cx| Buffer::local(content, cx))?; + let buffer = + open_buffer(project.clone(), worktree.clone(), cursor.path.clone(), cx).await?; (None, buffer) }; - let worktree_name = worktree_path - .file_name() - .ok_or_else(|| anyhow!("--worktree path must end with a folder name"))?; - let full_path_str = PathBuf::from(worktree_name) - .join(&cursor.path) - .to_string_lossy() + let full_path_str = worktree + .read_with(cx, |worktree, _| worktree.root_name().join(&cursor.path))? + .display(PathStyle::local()) .to_string(); let snapshot = cx.update(|cx| buffer.read(cx).snapshot())?; @@ -189,130 +231,95 @@ async fn get_context( Some(events) => events.read_to_string().await?, None => String::new(), }; - let prompt_for_events = move || (events, 0); - cx.update(|cx| { - gather_context( - full_path_str, - &snapshot, - clipped_cursor, - prompt_for_events, - cx, - ) - })? - .await -} - -pub async fn open_buffer_with_language_server( - project: &Entity, - worktree: &Entity, - path: &Path, - cx: &mut AsyncApp, -) -> Result<(Entity>, Entity)> { - let project_path = worktree.read_with(cx, |worktree, _cx| ProjectPath { - worktree_id: worktree.id(), - path: path.to_path_buf().into(), - })?; - - let buffer = project - .update(cx, |project, cx| project.open_buffer(project_path, cx))? - .await?; - - let lsp_open_handle = project.update(cx, |project, cx| { - project.register_buffer_with_language_servers(&buffer, cx) - })?; - - let log_prefix = path.to_string_lossy().to_string(); - wait_for_lang_server(&project, &buffer, log_prefix, cx).await?; - - Ok((lsp_open_handle, buffer)) -} - -// TODO: Dedupe with similar function in crates/eval/src/instance.rs -pub fn wait_for_lang_server( - project: &Entity, - buffer: &Entity, - log_prefix: String, - cx: &mut AsyncApp, -) -> Task> { - println!("{}⏵ Waiting for language server", log_prefix); - - let (mut tx, mut rx) = mpsc::channel(1); - - let lsp_store = project - .read_with(cx, |project, _| project.lsp_store()) - .unwrap(); - - let has_lang_server = buffer - .update(cx, |buffer, cx| { - lsp_store.update(cx, |lsp_store, cx| { - lsp_store - .language_servers_for_local_buffer(buffer, cx) - .next() - .is_some() - }) - }) - .unwrap_or(false); - if has_lang_server { - project - .update(cx, |project, cx| project.save_buffer(buffer.clone(), cx)) - .unwrap() - .detach(); + if let Some(zeta2_args) = zeta2_args { + // wait for worktree scan before starting zeta2 so that wait_for_initial_indexing waits for + // the whole worktree. + worktree + .read_with(cx, |worktree, _cx| { + worktree.as_local().unwrap().scan_complete() + })? + .await; + let output = cx + .update(|cx| { + let zeta = cx.new(|cx| { + zeta2::Zeta::new(app_state.client.clone(), app_state.user_store.clone(), cx) + }); + let indexing_done_task = zeta.update(cx, |zeta, cx| { + zeta.set_options(zeta2_args.to_options(true)); + zeta.register_buffer(&buffer, &project, cx); + zeta.wait_for_initial_indexing(&project, cx) + }); + cx.spawn(async move |cx| { + indexing_done_task.await?; + let request = zeta + .update(cx, |zeta, cx| { + let cursor = buffer.read(cx).snapshot().anchor_before(clipped_cursor); + zeta.cloud_request_for_zeta_cli(&project, &buffer, cursor, cx) + })? + .await?; + + let planned_prompt = cloud_zeta2_prompt::PlannedPrompt::populate(&request)?; + let (prompt_string, section_labels) = planned_prompt.to_prompt_string()?; + + match zeta2_args.output_format { + OutputFormat::Prompt => anyhow::Ok(prompt_string), + OutputFormat::Request => { + anyhow::Ok(serde_json::to_string_pretty(&request)?) + } + OutputFormat::Full => anyhow::Ok(serde_json::to_string_pretty(&json!({ + "request": request, + "prompt": prompt_string, + "section_labels": section_labels, + }))?), + } + }) + })? + .await?; + Ok(GetContextOutput::Zeta2(output)) + } else { + let prompt_for_events = move || (events, 0); + Ok(GetContextOutput::Zeta1( + cx.update(|cx| { + zeta::gather_context( + full_path_str, + &snapshot, + clipped_cursor, + prompt_for_events, + cx, + ) + })? + .await?, + )) } +} - let subscriptions = [ - cx.subscribe(&lsp_store, { - let log_prefix = log_prefix.clone(); - move |_, event, _| { - if let project::LspStoreEvent::LanguageServerUpdate { - message: - client::proto::update_language_server::Variant::WorkProgress( - client::proto::LspWorkProgress { - message: Some(message), - .. - }, - ), - .. - } = event - { - println!("{}⟲ {message}", log_prefix) - } - } - }), - cx.subscribe(project, { - let buffer = buffer.clone(); - move |project, event, cx| match event { - project::Event::LanguageServerAdded(_, _, _) => { - let buffer = buffer.clone(); - project - .update(cx, |project, cx| project.save_buffer(buffer, cx)) - .detach(); - } - project::Event::DiskBasedDiagnosticsFinished { .. } => { - tx.try_send(()).ok(); - } - _ => {} - } - }), - ]; - - cx.spawn(async move |cx| { - let timeout = cx.background_executor().timer(Duration::new(60 * 5, 0)); - let result = futures::select! { - _ = rx.next() => { - println!("{}⚑ Language server idle", log_prefix); - anyhow::Ok(()) +impl Zeta2Args { + fn to_options(&self, omit_excerpt_overlaps: bool) -> zeta2::ZetaOptions { + zeta2::ZetaOptions { + context: EditPredictionContextOptions { + use_imports: !self.disable_imports_gathering, + excerpt: EditPredictionExcerptOptions { + max_bytes: self.max_excerpt_bytes, + min_bytes: self.min_excerpt_bytes, + target_before_cursor_over_total_bytes: self + .target_before_cursor_over_total_bytes, + }, + score: EditPredictionScoreOptions { + omit_excerpt_overlaps, + }, }, - _ = timeout.fuse() => { - anyhow::bail!("LSP wait timed out after 5 minutes"); - } - }; - drop(subscriptions); - result - }) + max_diagnostic_bytes: self.max_diagnostic_bytes, + max_prompt_bytes: self.max_prompt_bytes, + prompt_format: self.prompt_format.clone().into(), + file_indexing_parallelism: self.file_indexing_parallelism, + } + } } fn main() { + zlog::init(); + zlog::init_output_stderr(); let args = ZetaCliArgs::parse(); let http_client = Arc::new(ReqwestClient::new()); let app = Application::headless().with_http_client(http_client); @@ -321,9 +328,23 @@ fn main() { let app_state = Arc::new(headless::init(cx)); cx.spawn(async move |cx| { let result = match args.command { - Commands::Context(context_args) => get_context(context_args, &app_state, cx) - .await - .map(|output| serde_json::to_string_pretty(&output.body).unwrap()), + Commands::Zeta2Context { + zeta2_args, + context_args, + } => match get_context(Some(zeta2_args), context_args, &app_state, cx).await { + Ok(GetContextOutput::Zeta1 { .. }) => unreachable!(), + Ok(GetContextOutput::Zeta2(output)) => Ok(output), + Err(err) => Err(err), + }, + Commands::Context(context_args) => { + match get_context(None, context_args, &app_state, cx).await { + Ok(GetContextOutput::Zeta1(output)) => { + Ok(serde_json::to_string_pretty(&output.body).unwrap()) + } + Ok(GetContextOutput::Zeta2 { .. }) => unreachable!(), + Err(err) => Err(err), + } + } Commands::Predict { predict_edits_body, context_args, @@ -338,7 +359,10 @@ fn main() { if let Some(predict_edits_body) = predict_edits_body { serde_json::from_str(&predict_edits_body.read_to_string().await?)? } else if let Some(context_args) = context_args { - get_context(context_args, &app_state, cx).await?.body + match get_context(None, context_args, &app_state, cx).await? { + GetContextOutput::Zeta1(output) => output.body, + GetContextOutput::Zeta2 { .. } => unreachable!(), + } } else { return Err(anyhow!( "Expected either --predict-edits-body-file \ @@ -359,6 +383,24 @@ fn main() { }) .await } + Commands::RetrievalStats { + zeta2_args, + worktree, + extension, + limit, + skip, + } => { + retrieval_stats( + worktree, + app_state, + extension, + limit, + skip, + (&zeta2_args).to_options(false), + cx, + ) + .await + } }; match result { Ok(output) => { diff --git a/crates/zeta_cli/src/retrieval_stats.rs b/crates/zeta_cli/src/retrieval_stats.rs new file mode 100644 index 0000000000000000000000000000000000000000..3dbc56756d6a46b89b68cdeab54f589355cc5efe --- /dev/null +++ b/crates/zeta_cli/src/retrieval_stats.rs @@ -0,0 +1,866 @@ +use ::util::rel_path::RelPath; +use ::util::{RangeExt, ResultExt as _}; +use anyhow::{Context as _, Result}; +use cloud_llm_client::predict_edits_v3::DeclarationScoreComponents; +use edit_prediction_context::{ + Declaration, DeclarationStyle, EditPredictionContext, Identifier, Imports, Reference, + ReferenceRegion, SyntaxIndex, SyntaxIndexState, references_in_range, +}; +use futures::StreamExt as _; +use futures::channel::mpsc; +use gpui::Entity; +use gpui::{AppContext, AsyncApp}; +use language::OffsetRangeExt; +use language::{BufferSnapshot, Point}; +use ordered_float::OrderedFloat; +use project::{Project, ProjectEntryId, ProjectPath, Worktree}; +use serde::{Deserialize, Serialize}; +use std::{ + cmp::Reverse, + collections::{HashMap, HashSet}, + fs::File, + hash::{Hash, Hasher}, + io::{BufRead, BufReader, BufWriter, Write as _}, + ops::Range, + path::{Path, PathBuf}, + sync::{ + Arc, + atomic::{self, AtomicUsize}, + }, + time::Duration, +}; +use util::paths::PathStyle; + +use crate::headless::ZetaCliAppState; +use crate::source_location::SourceLocation; +use crate::util::{open_buffer, open_buffer_with_language_server}; + +pub async fn retrieval_stats( + worktree: PathBuf, + app_state: Arc, + only_extension: Option, + file_limit: Option, + skip_files: Option, + options: zeta2::ZetaOptions, + cx: &mut AsyncApp, +) -> Result { + let options = Arc::new(options); + let worktree_path = worktree.canonicalize()?; + + let project = cx.update(|cx| { + Project::local( + app_state.client.clone(), + app_state.node_runtime.clone(), + app_state.user_store.clone(), + app_state.languages.clone(), + app_state.fs.clone(), + None, + cx, + ) + })?; + + let worktree = project + .update(cx, |project, cx| { + project.create_worktree(&worktree_path, true, cx) + })? + .await?; + + // wait for worktree scan so that wait_for_initial_file_indexing waits for the whole worktree. + worktree + .read_with(cx, |worktree, _cx| { + worktree.as_local().unwrap().scan_complete() + })? + .await; + + let index = cx.new(|cx| SyntaxIndex::new(&project, options.file_indexing_parallelism, cx))?; + index + .read_with(cx, |index, cx| index.wait_for_initial_file_indexing(cx))? + .await?; + let indexed_files = index + .read_with(cx, |index, cx| index.indexed_file_paths(cx))? + .await; + let mut filtered_files = indexed_files + .into_iter() + .filter(|project_path| { + let file_extension = project_path.path.extension(); + if let Some(only_extension) = only_extension.as_ref() { + file_extension.is_some_and(|extension| extension == only_extension) + } else { + file_extension + .is_some_and(|extension| !["md", "json", "sh", "diff"].contains(&extension)) + } + }) + .collect::>(); + filtered_files.sort_by(|a, b| a.path.cmp(&b.path)); + + let index_state = index.read_with(cx, |index, _cx| index.state().clone())?; + cx.update(|_| { + drop(index); + })?; + let index_state = Arc::new( + Arc::into_inner(index_state) + .context("Index state had more than 1 reference")? + .into_inner(), + ); + + struct FileSnapshot { + project_entry_id: ProjectEntryId, + snapshot: BufferSnapshot, + hash: u64, + parent_abs_path: Arc, + } + + let files: Vec = futures::future::try_join_all({ + filtered_files + .iter() + .map(|file| { + let buffer_task = + open_buffer(project.clone(), worktree.clone(), file.path.clone(), cx); + cx.spawn(async move |cx| { + let buffer = buffer_task.await?; + let (project_entry_id, parent_abs_path, snapshot) = + buffer.read_with(cx, |buffer, cx| { + let file = project::File::from_dyn(buffer.file()).unwrap(); + let project_entry_id = file.project_entry_id().unwrap(); + let mut parent_abs_path = file.worktree.read(cx).absolutize(&file.path); + if !parent_abs_path.pop() { + panic!("Invalid worktree path"); + } + + (project_entry_id, parent_abs_path, buffer.snapshot()) + })?; + + anyhow::Ok( + cx.background_spawn(async move { + let mut hasher = collections::FxHasher::default(); + snapshot.text().hash(&mut hasher); + FileSnapshot { + project_entry_id, + snapshot, + hash: hasher.finish(), + parent_abs_path: parent_abs_path.into(), + } + }) + .await, + ) + }) + }) + .collect::>() + }) + .await?; + + let mut file_snapshots = HashMap::default(); + let mut hasher = collections::FxHasher::default(); + for FileSnapshot { + project_entry_id, + snapshot, + hash, + .. + } in &files + { + file_snapshots.insert(*project_entry_id, snapshot.clone()); + hash.hash(&mut hasher); + } + let files_hash = hasher.finish(); + let file_snapshots = Arc::new(file_snapshots); + + let lsp_definitions_path = std::env::current_dir()?.join(format!( + "target/zeta2-lsp-definitions-{:x}.jsonl", + files_hash + )); + + let mut lsp_definitions = HashMap::default(); + let mut lsp_files = 0; + + if std::fs::exists(&lsp_definitions_path)? { + log::info!( + "Using cached LSP definitions from {}", + lsp_definitions_path.display() + ); + + let file = File::options() + .read(true) + .write(true) + .open(&lsp_definitions_path)?; + let lines = BufReader::new(&file).lines(); + let mut valid_len: usize = 0; + + for (line, expected_file) in lines.zip(files.iter()) { + let line = line?; + let FileLspDefinitions { path, references } = match serde_json::from_str(&line) { + Ok(ok) => ok, + Err(_) => { + log::error!("Found invalid cache line. Truncating to #{lsp_files}.",); + file.set_len(valid_len as u64)?; + break; + } + }; + let expected_path = expected_file.snapshot.file().unwrap().path().as_unix_str(); + if expected_path != path.as_ref() { + log::error!( + "Expected file #{} to be {expected_path}, but found {path}. Truncating to #{lsp_files}.", + lsp_files + 1 + ); + file.set_len(valid_len as u64)?; + break; + } + for (point, ranges) in references { + let Ok(path) = RelPath::new(Path::new(path.as_ref()), PathStyle::Posix) else { + log::warn!("Invalid path: {}", path); + continue; + }; + lsp_definitions.insert( + SourceLocation { + path: path.into_arc(), + point: point.into(), + }, + ranges, + ); + } + lsp_files += 1; + valid_len += line.len() + 1 + } + } + + if lsp_files < files.len() { + if lsp_files == 0 { + log::warn!( + "No LSP definitions found, populating {}", + lsp_definitions_path.display() + ); + } else { + log::warn!("{} files missing from LSP cache", files.len() - lsp_files); + } + + gather_lsp_definitions( + &lsp_definitions_path, + lsp_files, + &filtered_files, + &worktree, + &project, + &mut lsp_definitions, + cx, + ) + .await?; + } + let files_len = files.len().min(file_limit.unwrap_or(usize::MAX)); + let done_count = Arc::new(AtomicUsize::new(0)); + + let (output_tx, mut output_rx) = mpsc::unbounded::(); + let mut output = std::fs::File::create("target/zeta-retrieval-stats.txt")?; + + let tasks = files + .into_iter() + .skip(skip_files.unwrap_or(0)) + .take(file_limit.unwrap_or(usize::MAX)) + .map(|project_file| { + let index_state = index_state.clone(); + let lsp_definitions = lsp_definitions.clone(); + let options = options.clone(); + let output_tx = output_tx.clone(); + let done_count = done_count.clone(); + let file_snapshots = file_snapshots.clone(); + cx.background_spawn(async move { + let snapshot = project_file.snapshot; + + let full_range = 0..snapshot.len(); + let references = references_in_range( + full_range, + &snapshot.text(), + ReferenceRegion::Nearby, + &snapshot, + ); + + println!("references: {}", references.len(),); + + let imports = if options.context.use_imports { + Imports::gather(&snapshot, Some(&project_file.parent_abs_path)) + } else { + Imports::default() + }; + + let path = snapshot.file().unwrap().path(); + + for reference in references { + let query_point = snapshot.offset_to_point(reference.range.start); + let source_location = SourceLocation { + path: path.clone(), + point: query_point, + }; + let lsp_definitions = lsp_definitions + .get(&source_location) + .cloned() + .unwrap_or_else(|| { + log::warn!( + "No definitions found for source location: {:?}", + source_location + ); + Vec::new() + }); + + let retrieve_result = retrieve_definitions( + &reference, + &imports, + query_point, + &snapshot, + &index_state, + &file_snapshots, + &options, + ) + .await?; + + // TODO: LSP returns things like locals, this filters out some of those, but potentially + // hides some retrieval issues. + if retrieve_result.definitions.is_empty() { + continue; + } + + let mut best_match = None; + let mut has_external_definition = false; + let mut in_excerpt = false; + for (index, retrieved_definition) in + retrieve_result.definitions.iter().enumerate() + { + for lsp_definition in &lsp_definitions { + let SourceRange { + path, + point_range, + offset_range, + } = lsp_definition; + let lsp_point_range = + SerializablePoint::into_language_point_range(point_range.clone()); + has_external_definition = has_external_definition + || path.is_absolute() + || path + .components() + .any(|component| component.as_os_str() == "node_modules"); + let is_match = path.as_path() + == retrieved_definition.path.as_std_path() + && retrieved_definition + .range + .contains_inclusive(&lsp_point_range); + if is_match { + if best_match.is_none() { + best_match = Some(index); + } + } + in_excerpt = in_excerpt + || retrieve_result.excerpt_range.as_ref().is_some_and( + |excerpt_range| excerpt_range.contains_inclusive(&offset_range), + ); + } + } + + let outcome = if let Some(best_match) = best_match { + RetrievalOutcome::Match { best_match } + } else if has_external_definition { + RetrievalOutcome::NoMatchDueToExternalLspDefinitions + } else if in_excerpt { + RetrievalOutcome::ProbablyLocal + } else { + RetrievalOutcome::NoMatch + }; + + let result = RetrievalStatsResult { + outcome, + path: path.clone(), + identifier: reference.identifier, + point: query_point, + lsp_definitions, + retrieved_definitions: retrieve_result.definitions, + }; + + output_tx.unbounded_send(result).ok(); + } + + println!( + "{:02}/{:02} done", + done_count.fetch_add(1, atomic::Ordering::Relaxed) + 1, + files_len, + ); + + anyhow::Ok(()) + }) + }) + .collect::>(); + + drop(output_tx); + + let results_task = cx.background_spawn(async move { + let mut results = Vec::new(); + while let Some(result) = output_rx.next().await { + output + .write_all(format!("{:#?}\n", result).as_bytes()) + .log_err(); + results.push(result) + } + results + }); + + futures::future::try_join_all(tasks).await?; + println!("Tasks completed"); + let results = results_task.await; + println!("Results received"); + + let mut references_count = 0; + + let mut included_count = 0; + let mut both_absent_count = 0; + + let mut retrieved_count = 0; + let mut top_match_count = 0; + let mut non_top_match_count = 0; + let mut ranking_involved_top_match_count = 0; + + let mut no_match_count = 0; + let mut no_match_none_retrieved = 0; + let mut no_match_wrong_retrieval = 0; + + let mut expected_no_match_count = 0; + let mut in_excerpt_count = 0; + let mut external_definition_count = 0; + + for result in results { + references_count += 1; + match &result.outcome { + RetrievalOutcome::Match { best_match } => { + included_count += 1; + retrieved_count += 1; + let multiple = result.retrieved_definitions.len() > 1; + if *best_match == 0 { + top_match_count += 1; + if multiple { + ranking_involved_top_match_count += 1; + } + } else { + non_top_match_count += 1; + } + } + RetrievalOutcome::NoMatch => { + if result.lsp_definitions.is_empty() { + included_count += 1; + both_absent_count += 1; + } else { + no_match_count += 1; + if result.retrieved_definitions.is_empty() { + no_match_none_retrieved += 1; + } else { + no_match_wrong_retrieval += 1; + } + } + } + RetrievalOutcome::NoMatchDueToExternalLspDefinitions => { + expected_no_match_count += 1; + external_definition_count += 1; + } + RetrievalOutcome::ProbablyLocal => { + included_count += 1; + in_excerpt_count += 1; + } + } + } + + fn count_and_percentage(part: usize, total: usize) -> String { + format!("{} ({:.2}%)", part, (part as f64 / total as f64) * 100.0) + } + + println!(""); + println!("╮ references: {}", references_count); + println!( + "├─╮ included: {}", + count_and_percentage(included_count, references_count), + ); + println!( + "│ ├─╮ retrieved: {}", + count_and_percentage(retrieved_count, references_count) + ); + println!( + "│ │ ├─╮ top match : {}", + count_and_percentage(top_match_count, retrieved_count) + ); + println!( + "│ │ │ ╰─╴ involving ranking: {}", + count_and_percentage(ranking_involved_top_match_count, top_match_count) + ); + println!( + "│ │ ╰─╴ non-top match: {}", + count_and_percentage(non_top_match_count, retrieved_count) + ); + println!( + "│ ├─╴ both absent: {}", + count_and_percentage(both_absent_count, included_count) + ); + println!( + "│ ╰─╴ in excerpt: {}", + count_and_percentage(in_excerpt_count, included_count) + ); + println!( + "├─╮ no match: {}", + count_and_percentage(no_match_count, references_count) + ); + println!( + "│ ├─╴ none retrieved: {}", + count_and_percentage(no_match_none_retrieved, no_match_count) + ); + println!( + "│ ╰─╴ wrong retrieval: {}", + count_and_percentage(no_match_wrong_retrieval, no_match_count) + ); + println!( + "╰─╮ expected no match: {}", + count_and_percentage(expected_no_match_count, references_count) + ); + println!( + " ╰─╴ external definition: {}", + count_and_percentage(external_definition_count, expected_no_match_count) + ); + + println!(""); + println!("LSP definition cache at {}", lsp_definitions_path.display()); + + Ok("".to_string()) +} + +struct RetrieveResult { + definitions: Vec, + excerpt_range: Option>, +} + +async fn retrieve_definitions( + reference: &Reference, + imports: &Imports, + query_point: Point, + snapshot: &BufferSnapshot, + index: &Arc, + file_snapshots: &Arc>, + options: &Arc, +) -> Result { + let mut single_reference_map = HashMap::default(); + single_reference_map.insert(reference.identifier.clone(), vec![reference.clone()]); + let edit_prediction_context = EditPredictionContext::gather_context_with_references_fn( + query_point, + snapshot, + imports, + &options.context, + Some(&index), + |_, _, _| single_reference_map, + ); + + let Some(edit_prediction_context) = edit_prediction_context else { + return Ok(RetrieveResult { + definitions: Vec::new(), + excerpt_range: None, + }); + }; + + let mut retrieved_definitions = Vec::new(); + for scored_declaration in edit_prediction_context.declarations { + match &scored_declaration.declaration { + Declaration::File { + project_entry_id, + declaration, + .. + } => { + let Some(snapshot) = file_snapshots.get(&project_entry_id) else { + log::error!("bug: file project entry not found"); + continue; + }; + let path = snapshot.file().unwrap().path().clone(); + retrieved_definitions.push(RetrievedDefinition { + path, + range: snapshot.offset_to_point(declaration.item_range.start) + ..snapshot.offset_to_point(declaration.item_range.end), + score: scored_declaration.score(DeclarationStyle::Declaration), + retrieval_score: scored_declaration.retrieval_score(), + components: scored_declaration.components, + }); + } + Declaration::Buffer { + project_entry_id, + rope, + declaration, + .. + } => { + let Some(snapshot) = file_snapshots.get(&project_entry_id) else { + // This case happens when dependency buffers have been opened by + // go-to-definition, resulting in single-file worktrees. + continue; + }; + let path = snapshot.file().unwrap().path().clone(); + retrieved_definitions.push(RetrievedDefinition { + path, + range: rope.offset_to_point(declaration.item_range.start) + ..rope.offset_to_point(declaration.item_range.end), + score: scored_declaration.score(DeclarationStyle::Declaration), + retrieval_score: scored_declaration.retrieval_score(), + components: scored_declaration.components, + }); + } + } + } + retrieved_definitions.sort_by_key(|definition| Reverse(OrderedFloat(definition.score))); + + Ok(RetrieveResult { + definitions: retrieved_definitions, + excerpt_range: Some(edit_prediction_context.excerpt.range), + }) +} + +async fn gather_lsp_definitions( + lsp_definitions_path: &Path, + start_index: usize, + files: &[ProjectPath], + worktree: &Entity, + project: &Entity, + definitions: &mut HashMap>, + cx: &mut AsyncApp, +) -> Result<()> { + let worktree_id = worktree.read_with(cx, |worktree, _cx| worktree.id())?; + + let lsp_store = project.read_with(cx, |project, _cx| project.lsp_store())?; + cx.subscribe(&lsp_store, { + move |_, event, _| { + if let project::LspStoreEvent::LanguageServerUpdate { + message: + client::proto::update_language_server::Variant::WorkProgress( + client::proto::LspWorkProgress { + message: Some(message), + .. + }, + ), + .. + } = event + { + println!("⟲ {message}") + } + } + })? + .detach(); + + let (cache_line_tx, mut cache_line_rx) = mpsc::unbounded::(); + + let cache_file = File::options() + .append(true) + .create(true) + .open(lsp_definitions_path) + .unwrap(); + + let cache_task = cx.background_spawn(async move { + let mut writer = BufWriter::new(cache_file); + while let Some(line) = cache_line_rx.next().await { + serde_json::to_writer(&mut writer, &line).unwrap(); + writer.write_all(&[b'\n']).unwrap(); + } + writer.flush().unwrap(); + }); + + let mut error_count = 0; + let mut lsp_open_handles = Vec::new(); + let mut ready_languages = HashSet::default(); + for (file_index, project_path) in files[start_index..].iter().enumerate() { + println!( + "Processing file {} of {}: {}", + start_index + file_index + 1, + files.len(), + project_path.path.display(PathStyle::Posix) + ); + + let Some((lsp_open_handle, language_server_id, buffer)) = open_buffer_with_language_server( + project.clone(), + worktree.clone(), + project_path.path.clone(), + &mut ready_languages, + cx, + ) + .await + .log_err() else { + continue; + }; + lsp_open_handles.push(lsp_open_handle); + + let snapshot = buffer.read_with(cx, |buffer, _cx| buffer.snapshot())?; + let full_range = 0..snapshot.len(); + let references = references_in_range( + full_range, + &snapshot.text(), + ReferenceRegion::Nearby, + &snapshot, + ); + + loop { + let is_ready = lsp_store + .read_with(cx, |lsp_store, _cx| { + lsp_store + .language_server_statuses + .get(&language_server_id) + .is_some_and(|status| status.pending_work.is_empty()) + }) + .unwrap(); + if is_ready { + break; + } + cx.background_executor() + .timer(Duration::from_millis(10)) + .await; + } + + let mut cache_line_references = Vec::with_capacity(references.len()); + + for reference in references { + // TODO: Rename declaration to definition in edit_prediction_context? + let lsp_result = project + .update(cx, |project, cx| { + project.definitions(&buffer, reference.range.start, cx) + })? + .await; + + match lsp_result { + Ok(lsp_definitions) => { + let mut targets = Vec::new(); + for target in lsp_definitions.unwrap_or_default() { + let buffer = target.target.buffer; + let anchor_range = target.target.range; + buffer.read_with(cx, |buffer, cx| { + let Some(file) = project::File::from_dyn(buffer.file()) else { + return; + }; + let file_worktree = file.worktree.read(cx); + let file_worktree_id = file_worktree.id(); + // Relative paths for worktree files, absolute for all others + let path = if worktree_id != file_worktree_id { + file.worktree.read(cx).absolutize(&file.path) + } else { + file.path.as_std_path().to_path_buf() + }; + let offset_range = anchor_range.to_offset(&buffer); + let point_range = SerializablePoint::from_language_point_range( + offset_range.to_point(&buffer), + ); + targets.push(SourceRange { + path, + offset_range, + point_range, + }); + })?; + } + + let point = snapshot.offset_to_point(reference.range.start); + + cache_line_references.push((point.into(), targets.clone())); + definitions.insert( + SourceLocation { + path: project_path.path.clone(), + point, + }, + targets, + ); + } + Err(err) => { + log::error!("Language server error: {err}"); + error_count += 1; + } + } + } + + cache_line_tx + .unbounded_send(FileLspDefinitions { + path: project_path.path.as_unix_str().into(), + references: cache_line_references, + }) + .log_err(); + } + + drop(cache_line_tx); + + if error_count > 0 { + log::error!("Encountered {} language server errors", error_count); + } + + cache_task.await; + + Ok(()) +} + +#[derive(Serialize, Deserialize)] +struct FileLspDefinitions { + path: Arc, + references: Vec<(SerializablePoint, Vec)>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct SourceRange { + path: PathBuf, + point_range: Range, + offset_range: Range, +} + +/// Serializes to 1-based row and column indices. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SerializablePoint { + pub row: u32, + pub column: u32, +} + +impl SerializablePoint { + pub fn into_language_point_range(range: Range) -> Range { + range.start.into()..range.end.into() + } + + pub fn from_language_point_range(range: Range) -> Range { + range.start.into()..range.end.into() + } +} + +impl From for SerializablePoint { + fn from(point: Point) -> Self { + SerializablePoint { + row: point.row + 1, + column: point.column + 1, + } + } +} + +impl From for Point { + fn from(serializable: SerializablePoint) -> Self { + Point { + row: serializable.row.saturating_sub(1), + column: serializable.column.saturating_sub(1), + } + } +} + +#[derive(Debug)] +struct RetrievalStatsResult { + outcome: RetrievalOutcome, + #[allow(dead_code)] + path: Arc, + #[allow(dead_code)] + identifier: Identifier, + #[allow(dead_code)] + point: Point, + #[allow(dead_code)] + lsp_definitions: Vec, + retrieved_definitions: Vec, +} + +#[derive(Debug)] +enum RetrievalOutcome { + Match { + /// Lowest index within retrieved_definitions that matches an LSP definition. + best_match: usize, + }, + ProbablyLocal, + NoMatch, + NoMatchDueToExternalLspDefinitions, +} + +#[derive(Debug)] +struct RetrievedDefinition { + path: Arc, + range: Range, + score: f32, + #[allow(dead_code)] + retrieval_score: f32, + #[allow(dead_code)] + components: DeclarationScoreComponents, +} diff --git a/crates/zeta_cli/src/source_location.rs b/crates/zeta_cli/src/source_location.rs new file mode 100644 index 0000000000000000000000000000000000000000..3438675e78ac4d8bba6f58f7ce8a9016aed6c0c7 --- /dev/null +++ b/crates/zeta_cli/src/source_location.rs @@ -0,0 +1,70 @@ +use std::{fmt, fmt::Display, path::Path, str::FromStr, sync::Arc}; + +use ::util::{paths::PathStyle, rel_path::RelPath}; +use anyhow::{Result, anyhow}; +use language::Point; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +#[derive(Debug, Clone, Hash, Eq, PartialEq)] +pub struct SourceLocation { + pub path: Arc, + pub point: Point, +} + +impl Serialize for SourceLocation { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +impl<'de> Deserialize<'de> for SourceLocation { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + s.parse().map_err(serde::de::Error::custom) + } +} + +impl Display for SourceLocation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}:{}:{}", + self.path.display(PathStyle::Posix), + self.point.row + 1, + self.point.column + 1 + ) + } +} + +impl FromStr for SourceLocation { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + let parts: Vec<&str> = s.split(':').collect(); + if parts.len() != 3 { + return Err(anyhow!( + "Invalid source location. Expected 'file.rs:line:column', got '{}'", + s + )); + } + + let path = RelPath::new(Path::new(&parts[0]), PathStyle::local())?.into_arc(); + let line: u32 = parts[1] + .parse() + .map_err(|_| anyhow!("Invalid line number: '{}'", parts[1]))?; + let column: u32 = parts[2] + .parse() + .map_err(|_| anyhow!("Invalid column number: '{}'", parts[2]))?; + + // Convert from 1-based to 0-based indexing + let point = Point::new(line.saturating_sub(1), column.saturating_sub(1)); + + Ok(SourceLocation { path, point }) + } +} diff --git a/crates/zeta_cli/src/util.rs b/crates/zeta_cli/src/util.rs new file mode 100644 index 0000000000000000000000000000000000000000..699c1c743f67e09ef5ca7211c385114802d4ab32 --- /dev/null +++ b/crates/zeta_cli/src/util.rs @@ -0,0 +1,186 @@ +use anyhow::{Result, anyhow}; +use futures::channel::mpsc; +use futures::{FutureExt as _, StreamExt as _}; +use gpui::{AsyncApp, Entity, Task}; +use language::{Buffer, LanguageId, LanguageServerId, ParseStatus}; +use project::{Project, ProjectPath, Worktree}; +use std::collections::HashSet; +use std::sync::Arc; +use std::time::Duration; +use util::rel_path::RelPath; + +pub fn open_buffer( + project: Entity, + worktree: Entity, + path: Arc, + cx: &AsyncApp, +) -> Task>> { + cx.spawn(async move |cx| { + let project_path = worktree.read_with(cx, |worktree, _cx| ProjectPath { + worktree_id: worktree.id(), + path, + })?; + + let buffer = project + .update(cx, |project, cx| project.open_buffer(project_path, cx))? + .await?; + + let mut parse_status = buffer.read_with(cx, |buffer, _cx| buffer.parse_status())?; + while *parse_status.borrow() != ParseStatus::Idle { + parse_status.changed().await?; + } + + Ok(buffer) + }) +} + +pub async fn open_buffer_with_language_server( + project: Entity, + worktree: Entity, + path: Arc, + ready_languages: &mut HashSet, + cx: &mut AsyncApp, +) -> Result<(Entity>, LanguageServerId, Entity)> { + let buffer = open_buffer(project.clone(), worktree, path.clone(), cx).await?; + + let (lsp_open_handle, path_style) = project.update(cx, |project, cx| { + ( + project.register_buffer_with_language_servers(&buffer, cx), + project.path_style(cx), + ) + })?; + + let Some(language_id) = buffer.read_with(cx, |buffer, _cx| { + buffer.language().map(|language| language.id()) + })? + else { + return Err(anyhow!("No language for {}", path.display(path_style))); + }; + + let log_prefix = path.display(path_style); + if !ready_languages.contains(&language_id) { + wait_for_lang_server(&project, &buffer, log_prefix.into_owned(), cx).await?; + ready_languages.insert(language_id); + } + + let lsp_store = project.read_with(cx, |project, _cx| project.lsp_store())?; + + // hacky wait for buffer to be registered with the language server + for _ in 0..100 { + let Some(language_server_id) = lsp_store.update(cx, |lsp_store, cx| { + buffer.update(cx, |buffer, cx| { + lsp_store + .language_servers_for_local_buffer(&buffer, cx) + .next() + .map(|(_, language_server)| language_server.server_id()) + }) + })? + else { + cx.background_executor() + .timer(Duration::from_millis(10)) + .await; + continue; + }; + + return Ok((lsp_open_handle, language_server_id, buffer)); + } + + return Err(anyhow!("No language server found for buffer")); +} + +// TODO: Dedupe with similar function in crates/eval/src/instance.rs +pub fn wait_for_lang_server( + project: &Entity, + buffer: &Entity, + log_prefix: String, + cx: &mut AsyncApp, +) -> Task> { + println!("{}⏵ Waiting for language server", log_prefix); + + let (mut tx, mut rx) = mpsc::channel(1); + + let lsp_store = project + .read_with(cx, |project, _| project.lsp_store()) + .unwrap(); + + let has_lang_server = buffer + .update(cx, |buffer, cx| { + lsp_store.update(cx, |lsp_store, cx| { + lsp_store + .language_servers_for_local_buffer(buffer, cx) + .next() + .is_some() + }) + }) + .unwrap_or(false); + + if has_lang_server { + project + .update(cx, |project, cx| project.save_buffer(buffer.clone(), cx)) + .unwrap() + .detach(); + } + let (mut added_tx, mut added_rx) = mpsc::channel(1); + + let subscriptions = [ + cx.subscribe(&lsp_store, { + let log_prefix = log_prefix.clone(); + move |_, event, _| { + if let project::LspStoreEvent::LanguageServerUpdate { + message: + client::proto::update_language_server::Variant::WorkProgress( + client::proto::LspWorkProgress { + message: Some(message), + .. + }, + ), + .. + } = event + { + println!("{}⟲ {message}", log_prefix) + } + } + }), + cx.subscribe(project, { + let buffer = buffer.clone(); + move |project, event, cx| match event { + project::Event::LanguageServerAdded(_, _, _) => { + let buffer = buffer.clone(); + project + .update(cx, |project, cx| project.save_buffer(buffer, cx)) + .detach(); + added_tx.try_send(()).ok(); + } + project::Event::DiskBasedDiagnosticsFinished { .. } => { + tx.try_send(()).ok(); + } + _ => {} + } + }), + ]; + + cx.spawn(async move |cx| { + if !has_lang_server { + // some buffers never have a language server, so this aborts quickly in that case. + let timeout = cx.background_executor().timer(Duration::from_secs(5)); + futures::select! { + _ = added_rx.next() => {}, + _ = timeout.fuse() => { + anyhow::bail!("Waiting for language server add timed out after 5 seconds"); + } + }; + } + let timeout = cx.background_executor().timer(Duration::from_secs(60 * 5)); + let result = futures::select! { + _ = rx.next() => { + println!("{}⚑ Language server idle", log_prefix); + anyhow::Ok(()) + }, + _ = timeout.fuse() => { + anyhow::bail!("LSP wait timed out after 5 minutes"); + } + }; + drop(subscriptions); + result + }) +} diff --git a/crates/zlog/Cargo.toml b/crates/zlog/Cargo.toml index d0632d14f2d5b9ca6f26d7f9cbcbb8a341104860..4b758437d5e1608aaa68e86f90215f57b928e883 100644 --- a/crates/zlog/Cargo.toml +++ b/crates/zlog/Cargo.toml @@ -15,6 +15,7 @@ path = "src/zlog.rs" default = [] [dependencies] +collections.workspace = true chrono.workspace = true log.workspace = true workspace-hack.workspace = true diff --git a/crates/zlog/src/filter.rs b/crates/zlog/src/filter.rs index 31a58894774e6c0d08ea22b585350eb26ff09907..9a2de13cb3d33a1a6f4d17f7eddd4754cae40ea3 100644 --- a/crates/zlog/src/filter.rs +++ b/crates/zlog/src/filter.rs @@ -1,9 +1,8 @@ -use std::{ - collections::{HashMap, VecDeque}, - sync::{ - OnceLock, RwLock, - atomic::{AtomicU8, Ordering}, - }, +use collections::HashMap; +use std::collections::VecDeque; +use std::sync::{ + OnceLock, RwLock, + atomic::{AtomicU8, Ordering}, }; use crate::{SCOPE_DEPTH_MAX, SCOPE_STRING_SEP_STR, Scope, ScopeAlloc, env_config, private}; diff --git a/crates/zlog/src/zlog.rs b/crates/zlog/src/zlog.rs index d0e8958df5720f60abecd296576f22e684002c35..8254866b6f97f6479f55bd570d1bc63ab26b10d4 100644 --- a/crates/zlog/src/zlog.rs +++ b/crates/zlog/src/zlog.rs @@ -181,27 +181,29 @@ macro_rules! time { #[macro_export] macro_rules! scoped { ($parent:expr => $name:expr) => {{ - let parent = $parent; - let name = $name; - let mut scope = parent.scope; - let mut index = 1; // always have crate/module name - while index < scope.len() && !scope[index].is_empty() { - index += 1; - } - if index >= scope.len() { - #[cfg(debug_assertions)] - { - unreachable!("Scope overflow trying to add scope... ignoring scope"); - } - } - scope[index] = name; - $crate::Logger { scope } + $crate::scoped_logger($parent, $name) }}; ($name:expr) => { $crate::scoped!($crate::default_logger!() => $name) }; } +pub const fn scoped_logger(parent: Logger, name: &'static str) -> Logger { + let mut scope = parent.scope; + let mut index = 1; // always have crate/module name + while index < scope.len() && !scope[index].is_empty() { + index += 1; + } + if index >= scope.len() { + #[cfg(debug_assertions)] + { + panic!("Scope overflow trying to add scope... ignoring scope"); + } + } + scope[index] = name; + Logger { scope } +} + #[macro_export] macro_rules! default_logger { () => { diff --git a/crates/zlog_settings/Cargo.toml b/crates/zlog_settings/Cargo.toml index 2555d18aadc162161eb3aedf5c948385f347c6cc..8ec63cefe447d944b4556f1e72e481d5461391f1 100644 --- a/crates/zlog_settings/Cargo.toml +++ b/crates/zlog_settings/Cargo.toml @@ -15,10 +15,8 @@ path = "src/zlog_settings.rs" default = [] [dependencies] -anyhow.workspace = true gpui.workspace = true -schemars.workspace = true -serde.workspace = true +collections.workspace = true settings.workspace = true zlog.workspace = true workspace-hack.workspace = true diff --git a/crates/zlog_settings/src/zlog_settings.rs b/crates/zlog_settings/src/zlog_settings.rs index dd74fc574ff23dc78beca1feafeb34d874a68c22..1f695aa8ff5f8eb09d4cc0c2ae04282c469fb29c 100644 --- a/crates/zlog_settings/src/zlog_settings.rs +++ b/crates/zlog_settings/src/zlog_settings.rs @@ -1,9 +1,8 @@ //! # zlog_settings -use anyhow::Result; +use collections::HashMap; + use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsStore, SettingsUi}; +use settings::{Settings, SettingsStore}; pub fn init(cx: &mut App) { ZlogSettings::register(cx); @@ -15,33 +14,21 @@ pub fn init(cx: &mut App) { .detach(); } -#[derive( - Clone, - Debug, - Default, - Serialize, - Deserialize, - PartialEq, - Eq, - JsonSchema, - SettingsUi, - SettingsKey, -)] -#[settings_key(key = "log")] +#[derive(Clone, Debug)] pub struct ZlogSettings { - #[serde(default, flatten)] - pub scopes: std::collections::HashMap, + /// A map of log scopes to the desired log level. + /// Useful for filtering out noisy logs or enabling more verbose logging. + /// + /// Example: {"log": {"client": "warn"}} + pub scopes: HashMap, } impl Settings for ZlogSettings { - type FileContent = Self; - - fn load(sources: settings::SettingsSources, _: &mut App) -> Result - where - Self: Sized, - { - sources.json_merge() + fn from_settings(content: &settings::SettingsContent) -> Self { + ZlogSettings { + scopes: content.log.clone().unwrap(), + } } - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} + fn import_from_vscode(_: &settings::VsCodeSettings, _: &mut settings::SettingsContent) {} } diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index a470018b2c9e111f11144149855b833876c511d1..eb542497238780d93974cbc2627ce3466e23049b 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -15,6 +15,7 @@ - [Configuring Zed](./configuring-zed.md) - [Configuring Languages](./configuring-languages.md) + - [Toolchains](./toolchains.md) - [Key bindings](./key-bindings.md) - [All Actions](./all-actions.md) - [Snippets](./snippets.md) @@ -57,9 +58,9 @@ - [LLM Providers](./ai/llm-providers.md) - [Agent Settings](./ai/agent-settings.md) - [Subscription](./ai/subscription.md) + - [Models](./ai/models.md) - [Plans and Usage](./ai/plans-and-usage.md) - [Billing](./ai/billing.md) - - [Models](./ai/models.md) - [Privacy and Security](./ai/privacy-and-security.md) - [AI Improvement](./ai/ai-improvement.md) diff --git a/docs/src/ai/agent-panel.md b/docs/src/ai/agent-panel.md index b6b748e2f58493cd62abbd3c6e7dc443182e992f..445b85337046d75b78ec4101051fc55c7dcf3752 100644 --- a/docs/src/ai/agent-panel.md +++ b/docs/src/ai/agent-panel.md @@ -10,7 +10,7 @@ If you're using the Agent Panel for the first time, you need to have at least on You can do that by: 1. [subscribing to our Pro plan](https://zed.dev/pricing), so you have access to our hosted models -2. [bringing your own API keys](./llm-providers.md#use-your-own-keys) for your desired provider +2. [using your own API keys](./llm-providers.md#use-your-own-keys), either from model providers like Anthropic or model gateways like OpenRouter. 3. using an external agent like [Gemini CLI](./external-agents.md#gemini-cli) or [Claude Code](./external-agents.md#claude-code) ## Overview {#overview} @@ -51,20 +51,18 @@ To view all historical conversations, reach for the `View All` option from withi ### Following the Agent {#following-the-agent} -Zed is built with collaboration natively integrated. -This approach extends to collaboration with AI as well. -To follow the agent reading through your codebase and performing edits, click on the "crosshair" icon button at the bottom left of the panel. +Zed is built with collaboration natively integrated, and this design pattern extends to collaboration with AI. To follow the agent as it reads and edits in your codebase, click on the "crosshair" icon button at the bottom left of the panel. You can also do that with the keyboard by pressing the `cmd`/`ctrl` modifier with `enter` when submitting a message. ### Get Notified {#get-notified} -If you send a prompt to the Agent and then move elsewhere, thus putting Zed in the background, you can be notified of whether its response is finished either via: +If you send a prompt to the Agent and then move elsewhere, putting Zed in the background, you can be notified when its response is finished via: - a visual notification that appears in the top right of your screen -- or a sound notification +- a sound notification -Both notification methods can be used together or individually according to your preference. +These notifications can be used together or individually, according to your preference. You can customize their behavior, including turning them off entirely, by using the `agent.notify_when_agent_waiting` and `agent.play_sound_when_agent_done` settings keys. @@ -76,8 +74,7 @@ To see which files specifically have been edited, expand the accordion bar that You're able to reject or accept each individual change hunk, or the whole set of changes made by the agent. -Edit diffs also appear in individual buffers. -So, if your active tab had edits made by the AI, you'll see diffs with the same accept/reject controls as in the multi-buffer. +Edit diffs also appear in individual buffers. If your active tab had edits made by the AI, you'll see diffs with the same accept/reject controls as in the multi-buffer. ## Adding Context {#adding-context} @@ -89,15 +86,16 @@ Pasting images as context is also supported by the Agent Panel. ### Token Usage {#token-usage} -Zed surfaces how many tokens you are consuming for your currently active thread nearby the profile selector in the panel's message editor. -Depending on how many pieces of context you add, your token consumption can grow rapidly. +Zed surfaces how many tokens you are consuming for your currently active thread nearby the profile selector in the panel's message editor. Depending on how many pieces of context you add, your token consumption can grow rapidly. -With that in mind, once you get close to the model's context window, a banner appears below the message editor suggesting to start a new thread with the current one summarized and added as context. +Once you approach the model's context window, a banner appears below the message editor suggesting to start a new thread with the current one summarized and added as context. You can also do this at any time with an ongoing thread via the "Agent Options" menu on the top right. ## Changing Models {#changing-models} -After you've configured your LLM providers—either via [a custom API key](./llm-providers.md#use-your-own-keys) or through [Zed's hosted models](./models.md)—you can switch between them by clicking on the model selector on the message editor or by using the {#kb agent::ToggleModelSelector} keybinding. +After you've configured your LLM providers—either via [a custom API key](./llm-providers.md) or through [Zed's hosted models](./models.md)—you can switch between them by clicking on the model selector on the message editor or by using the {#kb agent::ToggleModelSelector} keybinding. + +> The same model can be offered via multiple providers - for example, Claude Sonnet 4 is available via Zed Pro, OpenRouter, Anthropic directly, and more. Make sure you've selected the correct model **_provider_** for the model you'd like to use, delineated by the logo to the left of the model in the model selector. ## Using Tools {#using-tools} @@ -140,27 +138,19 @@ You can change that by setting this key to `true` in either your `settings.json` ### Model Support {#model-support} Tool calling needs to be individually supported by each model and model provider. -Therefore, despite the presence of tools, some models may not have the ability to pick them up yet in Zed. -You should see a "No tools" label if you select a model that falls into this case. - -We want to support all of them, though! -We may prioritize which ones to focus on based on popularity and user feedback, so feel free to help and contribute to fast-track those that don't fit this bill. +Therefore, despite the presence of tools, some models may not have the ability to pick them up yet in Zed. You should see a "No tools" label if you select a model that falls into this case. All [Zed's hosted models](./models.md) support tool calling out-of-the-box. ### MCP Servers {#mcp-servers} -Similarly to the built-in tools, some models may not support all tools included in a given MCP Server. -Zed's UI will inform about this via a warning icon that appears close to the model selector. +Similarly to the built-in tools, some models may not support all tools included in a given MCP Server. Zed's UI will inform about this via a warning icon that appears close to the model selector. ## Text Threads {#text-threads} -["Text Threads"](./text-threads.md) present your conversation with the LLM in a different format—as raw text. -With text threads, you have full control over the conversation data. -You can remove and edit responses from the LLM, swap roles, and include more context earlier in the conversation. +["Text Threads"](./text-threads.md) present your conversation with the LLM in a different format—as raw text. With text threads, you have full control over the conversation data. You can remove and edit responses from the LLM, swap roles, and include more context earlier in the conversation. -For users who have been with us for some time, you'll notice that text threads are our original assistant panel—users love it for the control it offers. -We do not plan to deprecate text threads, but it should be noted that if you want the AI to write to your code base autonomously, that's only available in the newer, and now default, "Threads". +For users who have been with us for some time, you'll notice that text threads are our original assistant panel—users love it for the control it offers. We do not plan to deprecate text threads, but it should be noted that if you want the AI to write to your code base autonomously, that's only available in the newer, and now default, "Threads". ## Errors and Debugging {#errors-and-debugging} @@ -170,15 +160,12 @@ You can also open threads as Markdown by clicking on the file icon button, to th ## Feedback {#feedback} -Every change we make to Zed's system prompt and tool set, needs to be backed by a thorough eval with good scores. - -Every time the LLM performs a weird change or investigates a certain topic in your code base incorrectly, it's an indication that there's an improvement opportunity. +Zed supports rating responses from the agent for feedback and improvement. > Note that rating responses will send your data related to that response to Zed's servers. > See [AI Improvement](./ai-improvement.md) and [Privacy and Security](./privacy-and-security.md) for more information about Zed's approach to AI improvement, privacy, and security. > **_If you don't want data persisted on Zed's servers, don't rate_**. We will not collect data for improving our Agentic offering without you explicitly rating responses. -The best way you can help influence the next change to Zed's system prompt and tools is by rating the LLM's response via the thumbs up/down buttons at the end of every response. -In case of a thumbs down, a new text area will show up where you can add more specifics about what happened. +The best way you can help influence the next change to Zed's system prompt and tools is by rating the LLM's response via the thumbs up/down buttons at the end of every response. In case of a thumbs down, a new text area will show up where you can add more specifics about what happened. You can provide feedback on the thread at any point after the agent responds, and multiple times within the same thread. diff --git a/docs/src/ai/agent-settings.md b/docs/src/ai/agent-settings.md index d78f812e4704123be34144e84709df71474c82c0..e2aba0fe4134d038b9aed3a2dd19a7359618c139 100644 --- a/docs/src/ai/agent-settings.md +++ b/docs/src/ai/agent-settings.md @@ -6,14 +6,13 @@ Learn about all the settings you can customize in Zed's Agent Panel. ### Default Model {#default-model} -If you're using [Zed's hosted LLM service](./plans-and-usage.md), it sets `claude-sonnet-4` as the default model. -But if you're not subscribed to it or simply just want to change it, you can do it so either via the model dropdown in the Agent Panel's bottom-right corner or by manually editing the `default_model` object in your settings: +If you're using [Zed's hosted LLM service](./subscription.md), it sets `claude-sonnet-4` as the default model for agentic work (agent panel, inline assistant) and `gpt-5-nano` as the default "fast" model (thread summarization, git commit messages). If you're not subscribed or want to change these defaults, you can manually edit the `default_model` object in your settings: -```json +```json [settings] { "agent": { "default_model": { - "provider": "zed.dev", + "provider": "openai", "model": "gpt-4o" } } @@ -22,13 +21,13 @@ But if you're not subscribed to it or simply just want to change it, you can do ### Feature-specific Models {#feature-specific-models} -Assign distinct and specific models for the following AI-powered features in Zed: +You can assign distinct and specific models for the following AI-powered features: - Thread summary model: Used for generating thread summaries - Inline assistant model: Used for the inline assistant feature - Commit message model: Used for generating Git commit messages -```json +```json [settings] { "agent": { "default_model": { @@ -63,9 +62,9 @@ When configured, the inline assist UI will surface controls to cycle between the The models you specify here are always used in _addition_ to your [default model](#default-model). For example, the following configuration will generate two outputs for every assist. -One with Claude Sonnet 4 (the default model), and one with GPT-4o. +One with Claude Sonnet 4 (the default model), and one with GPT-5-mini. -```json +```json [settings] { "agent": { "default_model": { @@ -75,7 +74,7 @@ One with Claude Sonnet 4 (the default model), and one with GPT-4o. "inline_alternatives": [ { "provider": "zed.dev", - "model": "gpt-4o" + "model": "gpt-4-mini" } ] } @@ -86,7 +85,7 @@ One with Claude Sonnet 4 (the default model), and one with GPT-4o. Specify a custom temperature for a provider and/or model: -```json +```json [settings] "model_parameters": [ // To set parameters for all requests to OpenAI models: { @@ -115,7 +114,7 @@ Note that some of these settings are also surfaced in the Agent Panel's settings Use the `default_view` setting to change the default view of the Agent Panel. You can choose between `thread` (the default) and `text_thread`: -```json +```json [settings] { "agent": { "default_view": "text_thread" @@ -123,12 +122,26 @@ You can choose between `thread` (the default) and `text_thread`: } ``` +### Font Size + +Use the `agent_font_size` setting to change the font size of rendered agent responses in the panel. + +```json [settings] +{ + "agent": { + "agent_font_size": 18 + } +} +``` + +> Editors in the Agent Panel—whether that is the main message textarea or previous messages—use monospace fonts and therefore, are controlled by the `buffer_font_size` setting, which is defined globally in your `settings.json`. + ### Auto-run Commands -Control whether you want to allow the agent to run commands without asking you for permission. +Control whether to allow the agent to run commands without asking you for permission. The default value is `false`. -```json +```json [settings] { "agent": { "always_allow_tool_actions": true @@ -136,14 +149,12 @@ The default value is `false`. } ``` -> This setting is available via the Agent Panel's settings UI. - ### Single-file Review -Control whether you want to see review actions (accept & reject) in single buffers after the agent is done performing edits. +Control whether to display review actions (accept & reject) in single buffers after the agent is done performing edits. The default value is `false`. -```json +```json [settings] { "agent": { "single_file_review": true @@ -153,14 +164,12 @@ The default value is `false`. When set to false, these controls are only available in the multibuffer review tab. -> This setting is available via the Agent Panel's settings UI. - ### Sound Notification -Control whether you want to hear a notification sound when the agent is done generating changes or needs your input. +Control whether to hear a notification sound when the agent is done generating changes or needs your input. The default value is `false`. -```json +```json [settings] { "agent": { "play_sound_when_agent_done": true @@ -168,7 +177,18 @@ The default value is `false`. } ``` -> This setting is available via the Agent Panel's settings UI. +### Message Editor Size + +Use the `message_editor_min_lines` setting to control minimum number of lines of height the agent message editor should have. +It is set to `4` by default, and the max number of lines is always double of the minimum. + +```json [settings] +{ + "agent": { + "message_editor_min_lines": 4 + } +} +``` ### Modifier to Send @@ -176,7 +196,7 @@ Make a modifier (`cmd` on macOS, `ctrl` on Linux) required to send messages. This is encouraged for more thoughtful prompt crafting. The default value is `false`. -```json +```json [settings] { "agent": { "use_modifier_to_send": true @@ -184,14 +204,12 @@ The default value is `false`. } ``` -> This setting is available via the Agent Panel's settings UI. - ### Edit Card Use the `expand_edit_card` setting to control whether edit cards show the full diff in the Agent Panel. It is set to `true` by default, but if set to false, the card's height is capped to a certain number of lines, requiring a click to be expanded. -```json +```json [settings] { "agent": { "expand_edit_card": false @@ -204,7 +222,7 @@ It is set to `true` by default, but if set to false, the card's height is capped Use the `expand_terminal_card` setting to control whether terminal cards show the command output in the Agent Panel. It is set to `true` by default, but if set to false, the card will be fully collapsed even while the command is running, requiring a click to be expanded. -```json +```json [settings] { "agent": { "expand_terminal_card": false @@ -214,10 +232,10 @@ It is set to `true` by default, but if set to false, the card will be fully coll ### Feedback Controls -Control whether you want to see the thumbs up/down buttons to give Zed feedback about the agent's performance. +Control whether to display the thumbs up/down buttons at the bottom of each agent response, allowing to give Zed feedback about the agent's performance. The default value is `true`. -```json +```json [settings] { "agent": { "enable_feedback": false diff --git a/docs/src/ai/ai-improvement.md b/docs/src/ai/ai-improvement.md index 5296b2a179ebe8ba8b7a966a54138cbde4650b4f..6d7fe8fdb172afa17f494723bb16b1cc69c9336c 100644 --- a/docs/src/ai/ai-improvement.md +++ b/docs/src/ai/ai-improvement.md @@ -4,18 +4,30 @@ ### Opt-In -When using the Agent Panel, whether through Zed's hosted AI service or via connecting a non-Zed AI service via API key, Zed does not persistently store user content or use user content to evaluate and/or improve our AI features, unless it is explicitly shared with Zed. Each share is opt-in, and sharing once will not cause future content or data to be shared again. +When you use the Agent Panel through any of these means: + +- [Zed's hosted models](./subscription.md) +- [connecting a non-Zed AI service via API key](./llm-providers.md) +- using an [external agent](./external-agents.md) + +Zed does not persistently store user content or use user content to evaluate and/or improve our AI features, unless it is explicitly shared with Zed. Each share is opt-in, and sharing once will not cause future content or data to be shared again. > Note that rating responses will send your data related to that response to Zed's servers. > **_If you don't want data persisted on Zed's servers, don't rate_**. We will not collect data for improving our Agentic offering without you explicitly rating responses. -When using upstream services through Zed AI, we require assurances from our service providers that your user content won't be used for training models. For example, usage of Anthropic Claude 3.5 via Zed AI in the Assistant is governed by the [Anthropic Commercial Terms](https://www.anthropic.com/legal/commercial-terms) which includes the following: +When using upstream services through Zed's hosted models, we require assurances from our service providers that your user content won't be used for training models. + +| Provider | No Training Guarantee | Zero-Data Retention (ZDR) | +| --------- | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| Anthropic | [Yes](https://www.anthropic.com/legal/commercial-terms) | [Yes](https://privacy.anthropic.com/en/articles/8956058-i-have-a-zero-data-retention-agreement-with-anthropic-what-products-does-it-apply-to) | +| Google | [Yes](https://cloud.google.com/terms/service-terms) | **No**, in flight | +| OpenAI | [Yes](https://openai.com/enterprise-privacy/) | [Yes](https://platform.openai.com/docs/guides/your-data) | -> "Anthropic may not train models on Customer Content from paid Services." +> Zed's use of Gemini models is currently supported via [Google AI Studio](https://ai.google.dev/aistudio), which **_does not_** support ZDR. We're migrating to [Vertex AI](https://cloud.google.com/vertex-ai?hl=en), which **_does_**, and upon completion of that migration will offer ZDR to all users of Zed's hosted Google/Gemini models. -We also have a [zero-data retention agreement](https://privacy.anthropic.com/en/articles/8956058-i-have-a-zero-data-retention-agreement-with-anthropic-what-products-does-it-apply-to) with Anthropic. +> If ZDR from upstream model providers is important to you, _please do not use Gemini models at this time_. Your data will never be used for training purposes by any model providers hosted by Zed, however. -When you directly connect Zed with a non Zed AI service (e.g., via API key) Zed does not have control over how your data is used by that service provider. +When you use your own API keys or external agents, **Zed does not have control over how your data is used by that service provider.** You should reference your agreement with each service provider to understand what terms and conditions apply. ### Data we collect @@ -51,7 +63,7 @@ Zed will intentionally exclude certain files from Predictive Edits entirely, eve You can inspect this exclusion list by opening `zed: open default settings` from the command palette: -```json +```json [settings] { "edit_predictions": { // A list of globs representing files that edit predictions should be disabled for. @@ -71,7 +83,7 @@ You can inspect this exclusion list by opening `zed: open default settings` from Users may explicitly exclude additional paths and/or file extensions by adding them to [`edit_predictions.disabled_globs`](https://zed.dev/docs/configuring-zed#edit-predictions) in their Zed settings.json: -```json +```json [settings] { "edit_predictions": { "disabled_globs": ["secret_dir/*", "**/*.log"] diff --git a/docs/src/ai/billing.md b/docs/src/ai/billing.md index d519b136aeea8c505979cde224d406ac995b65f0..64ff871ce1b629fad72d4ddd6f9c8f42f2bf92da 100644 --- a/docs/src/ai/billing.md +++ b/docs/src/ai/billing.md @@ -1,29 +1,42 @@ # Billing -We use Stripe as our billing and payments provider. All Pro plans require payment via credit card. +We use Stripe as our payments provider, and Orb for invoicing and metering. All Pro plans require payment via credit card or other supported payment method. For invoice-based billing, a Business plan is required. Contact [sales@zed.dev](mailto:sales@zed.dev) for more information. -## Settings {#settings} +## Billing Information {#settings} -You can access billing settings at [zed.dev/account](https://zed.dev/account). -Clicking the button under Account Settings will navigate you to Stripe’s secure portal, where you can update all billing-related settings and configuration. +You can access billing information and settings at [zed.dev/account](https://zed.dev/account). +Most of the page embeds information from our invoicing/metering partner, Orb (we're planning on a more native experience soon!). ## Billing Cycles {#billing-cycles} -Zed is billed on a monthly basis based on the date you initially subscribe. +Zed is billed on a monthly basis based on the date you initially subscribe. You'll receive _at least_ one invoice from Zed each month you're subscribed to Zed Pro, and more than one if you use more than $10 in incremental token spend within the month. -We’ll also bill in-month for additional prompts used beyond your plan’s prompt limit, if usage exceeds $20 before month end. -See [usage-based pricing](./plans-and-usage.md#ubp) for more. +## Threshold Billing {#threshold-billing} + +Zed utilizes threshold billing to ensure timely collection of owed monies and prevent abuse. Every time your usage of Zed's hosted models crosses a $10 spend threshold, a new invoice is generated, and the threshold resets to $0. + +For example, + +- You subscribe on February 1. Your first invoice is $10. +- You use $12 of incremental tokens in the month of February, with the first $10 spent on February 15. You'll receive an invoice for $10 on February 15 +- On March 1, you receive an invoice for $12: $10 (March Pro subscription) and $2 in leftover token spend, since your usage didn't cross the $10 threshold. + +## Payment Failures {#payment-failures} + +If payment of an invoice fails, Zed will block usage of our hosted models until the payment is complete. Email [billing-support@zed.dev](mailto:billing-support@zed.dev) for assistance. ## Invoice History {#invoice-history} -You can access your invoice history by navigating to [zed.dev/account](https://zed.dev/account) and clicking "Manage" on your subscription. +You can access your invoice history by navigating to [zed.dev/account](https://zed.dev/account) and clicking `Invoice history` within the embedded Orb portal. -From Stripe’s secure portal, you can download all current and historical invoices. +If you require historical Stripe invoices, email [billing-support@zed.dev](mailto:billing-support@zed.dev) ## Updating Billing Information {#updating-billing-info} -You can update your payment method, company name, address, and tax information through the billing portal. +Email [billing-support@zed.dev](mailto:billing-support@zed.dev) for help updating payment methods, names, addresses, and tax information. + +> We'll be updating our account page shortly to allow for self-service updates. Stay tuned! Please note that changes to billing information will **only** affect future invoices — **we cannot modify historical invoices**. @@ -31,7 +44,7 @@ Please note that changes to billing information will **only** affect future invo Zed partners with [Sphere](https://www.getsphere.com/) to calculate indirect tax rate for invoices, based on customer location and the product being sold. Tax is listed as a separate line item on invoices, based preferentially on your billing address, followed by the card issue country known to Stripe. -If you have a VAT/GST ID, you can add it at [zed.dev/account](https://zed.dev/account) by clicking "Manage" on your subscription. Check the box that denotes you as a business. +If you have a VAT/GST ID, you can add it at during checkout. Check the box that denotes you as a business. Please note that changes to VAT/GST IDs and address will **only** affect future invoices — **we cannot modify historical invoices**. Questions or issues can be directed to [billing-support@zed.dev](mailto:billing-support@zed.dev). diff --git a/docs/src/ai/configuration.md b/docs/src/ai/configuration.md index d28a7e8ed006b1c788cc0f649362bae41879a99b..e2cd9ad0201933a7ba4f1239615cf44ccdb7f3f6 100644 --- a/docs/src/ai/configuration.md +++ b/docs/src/ai/configuration.md @@ -1,8 +1,11 @@ # Configuration -When using AI in Zed, you can customize several aspects: +When using AI in Zed, you can configure multiple dimensions: -1. Which [LLM providers](./llm-providers.md) you can use +1. Which LLM providers you can use + - Zed's hosted models, which require [authentication](../accounts.md) and [subscription](./subscription.md) + - [Using your own API keys](./llm-providers.md), which do not + - Using [external agents like Claude Code](./external-agents.md), which do not 2. [Model parameters and usage](./agent-settings.md#model-settings) 3. [Interactions with the Agent Panel](./agent-settings.md#agent-panel-settings) @@ -11,7 +14,7 @@ When using AI in Zed, you can customize several aspects: We want to respect users who want to use Zed without interacting with AI whatsoever. To do that, add the following key to your `settings.json`: -```json +```json [settings] { "disable_ai": true } diff --git a/docs/src/ai/edit-prediction.md b/docs/src/ai/edit-prediction.md index 7843b08ff7d552c0c05366e60feb31dbd31a8ae2..4508e304b9c12959082a8cbe3590197a722fe1a8 100644 --- a/docs/src/ai/edit-prediction.md +++ b/docs/src/ai/edit-prediction.md @@ -21,9 +21,9 @@ Zed's Edit Prediction comes with two different display modes: Toggle between them via the `mode` key: -```json +```json [settings] "edit_predictions": { - "mode": "eager" | "subtle" + "mode": "eager" // or "subtle" }, ``` @@ -50,7 +50,7 @@ See the [Configuring GitHub Copilot](#github-copilot) and [Configuring Supermave By default, `tab` is used to accept edit predictions. You can use another keybinding by inserting this in your keymap: -```json +```json [settings] { "context": "Editor && edit_prediction", "bindings": { @@ -62,7 +62,7 @@ By default, `tab` is used to accept edit predictions. You can use another keybin When there's a [conflict with the `tab` key](#edit-predictions-conflict), Zed uses a different context to accept keybindings (`edit_prediction_conflict`). If you want to use a different one, you can insert this in your keymap: -```json +```json [settings] { "context": "Editor && edit_prediction_conflict", "bindings": { @@ -75,7 +75,7 @@ If your keybinding contains a modifier (`ctrl` in the example above), it will al You can also bind this action to keybind without a modifier. In that case, Zed will use the default modifier (`alt`) to preview the edit prediction. -```json +```json [settings] { "context": "Editor && edit_prediction_conflict", "bindings": { @@ -88,7 +88,7 @@ You can also bind this action to keybind without a modifier. In that case, Zed w To maintain the use of the modifier key for accepting predictions when there is a language server completions menu, but allow `tab` to accept predictions regardless of cursor position, you can specify the context further with `showing_completions`: -```json +```json [settings] { "context": "Editor && edit_prediction_conflict && !showing_completions", "bindings": { @@ -102,7 +102,7 @@ To maintain the use of the modifier key for accepting predictions when there is The keybinding example below causes `alt-tab` to always be used instead of sometimes using `tab`. You might want this in order to have just one keybinding to use for accepting edit predictions, since the behavior of `tab` varies based on context. -```json +```json [keymap] { "context": "Editor && edit_prediction", "bindings": { @@ -126,7 +126,7 @@ The keybinding example below causes `alt-tab` to always be used instead of somet If `"vim_mode": true` is set within `settings.json`, then additional bindings are needed after the above to return `tab` to its original behavior: -```json +```json [keymap] { "context": "(VimControl && !menu) || vim_mode == replace || vim_mode == waiting", "bindings": { @@ -145,7 +145,7 @@ If `"vim_mode": true` is set within `settings.json`, then additional bindings ar While `tab` and `alt-tab` are supported on Linux, `alt-l` is displayed instead. If your window manager does not reserve `alt-tab`, and you would prefer to use `tab` and `alt-tab`, include these bindings in `keymap.json`: -```json +```json [keymap] { "context": "Editor && edit_prediction", "bindings": { @@ -170,7 +170,7 @@ Zed requires at least one keybinding for the {#action editor::AcceptEditPredicti If you have previously bound the default keybindings to different actions in the global context, you will not be able to preview or accept edit predictions. For example: -```json +```json [keymap] [ // Your keymap { @@ -184,7 +184,7 @@ If you have previously bound the default keybindings to different actions in the To fix this, you can specify your own keybinding for accepting edit predictions: -```json +```json [keymap] [ // ... { @@ -208,7 +208,7 @@ Alternatively, if you have Zed set as your provider, consider [using Subtle Mode To not have predictions appear automatically as you type, set this within `settings.json`: -```json +```json [settings] { "show_edit_predictions": false } @@ -221,7 +221,7 @@ Still, you can trigger edit predictions manually by executing {#action editor::S To not have predictions appear automatically as you type when working with a specific language, set this within `settings.json`: -```json +```json [settings] { "language": { "python": { @@ -235,7 +235,7 @@ To not have predictions appear automatically as you type when working with a spe To disable edit predictions for specific directories or files, set this within `settings.json`: -```json +```json [settings] { "edit_predictions": { "disabled_globs": ["~/.config/zed/settings.json"] @@ -247,7 +247,7 @@ To disable edit predictions for specific directories or files, set this within ` To completely turn off edit prediction across all providers, explicitly set the settings to `none`, like so: -```json +```json [settings] "features": { "edit_prediction_provider": "none" }, @@ -257,7 +257,7 @@ To completely turn off edit prediction across all providers, explicitly set the To use GitHub Copilot as your provider, set this within `settings.json`: -```json +```json [settings] { "features": { "edit_prediction_provider": "copilot" @@ -271,7 +271,7 @@ You should be able to sign-in to GitHub Copilot by clicking on the Copilot icon If your organization uses GitHub Copilot Enterprise, you can configure Zed to use your enterprise instance by specifying the enterprise URI in your `settings.json`: -```json +```json [settings] { "edit_predictions": { "copilot": { @@ -294,7 +294,7 @@ Copilot can provide multiple completion alternatives, and these can be navigated To use Supermaven as your provider, set this within `settings.json`: -```json +```json [settings] { "features": { "edit_prediction_provider": "supermaven" diff --git a/docs/src/ai/external-agents.md b/docs/src/ai/external-agents.md index bc7768c6081ad7a32eb1fd780750a48c4b9200f0..9235c921d58757cc026fda852a76f9bbc2106d54 100644 --- a/docs/src/ai/external-agents.md +++ b/docs/src/ai/external-agents.md @@ -5,6 +5,8 @@ Zed supports terminal-based agents through the [Agent Client Protocol (ACP)](htt Currently, [Gemini CLI](https://github.com/google-gemini/gemini-cli) serves as the reference implementation. [Claude Code](https://www.anthropic.com/claude-code) is also included by default, and you can [add custom ACP-compatible agents](#add-custom-agents) as well. +Zed's affordance for external agents is strictly UI-based; the billing and legal/terms arrangement is directly between you and the agent provider. Zed does not charge for use of external agents, and our [zero-data retention agreements/privacy guarantees](./ai-improvement.md) are **_only_** applicable for Zed's hosted models. + ## Gemini CLI {#gemini-cli} Zed provides the ability to run [Gemini CLI](https://github.com/google-gemini/gemini-cli) directly in the [agent panel](./agent-panel.md). @@ -18,7 +20,7 @@ As of [Zed Stable v0.201.5](https://zed.dev/releases/stable/0.201.5) you should If you'd like to bind this to a keyboard shortcut, you can do so by editing your `keymap.json` file via the `zed: open keymap` command to include: -```json +```json [keymap] [ { "bindings": { @@ -34,7 +36,7 @@ The first time you create a Gemini CLI thread, Zed will install [@google/gemini- By default, Zed will use this managed version of Gemini CLI even if you have it installed globally. However, you can configure it to use a version in your `PATH` by adding this to your settings: -```json +```json [settings] { "agent_servers": { "gemini": { @@ -75,7 +77,7 @@ Open the agent panel with {#kb agent::ToggleFocus}, and then use the `+` button If you'd like to bind this to a keyboard shortcut, you can do so by editing your `keymap.json` file via the `zed: open keymap` command to include: -```json +```json [keymap] [ { "bindings": { @@ -122,7 +124,7 @@ If you don't have a `CLAUDE.md` file, you can ask Claude Code to create one for You can run any agent speaking ACP in Zed by changing your settings as follows: -```json +```json [settings] { "agent_servers": { "Custom Agent": { diff --git a/docs/src/ai/inline-assistant.md b/docs/src/ai/inline-assistant.md index da894e2cd87faf6ce8afa9c54a5f2d55bcd07827..d3caff6f45903c549073b97105a3310236d64478 100644 --- a/docs/src/ai/inline-assistant.md +++ b/docs/src/ai/inline-assistant.md @@ -14,13 +14,11 @@ Give the Inline Assistant context the same way you can in [the Agent Panel](./ag A useful pattern here is to create a thread in the Agent Panel, and then mention that thread with `@thread` in the Inline Assistant to include it as context. -> The Inline Assistant is limited to normal mode context windows ([see Models](./models.md) for more). - ## Prefilling Prompts To create a custom keybinding that prefills a prompt, you can add the following format in your keymap: -```json +```json [keymap] [ { "context": "Editor && mode == full", diff --git a/docs/src/ai/llm-providers.md b/docs/src/ai/llm-providers.md index 98aaeef2126d559efa7696143faca13d39e11e62..d78078f83e950d63449e4932a97c288f9fbee6a8 100644 --- a/docs/src/ai/llm-providers.md +++ b/docs/src/ai/llm-providers.md @@ -6,7 +6,7 @@ You can do that by either subscribing to [one of Zed's plans](./plans-and-usage. ## Use Your Own Keys {#use-your-own-keys} -If you already have an API key for an existing LLM provider—say Anthropic or OpenAI, for example—you can insert them into Zed and use the full power of the Agent Panel **_for free_**. +If you already have an API key for an existing LLM provider, like Anthropic or OpenAI, you can add them to Zed and use the full power of the Agent Panel **_for free_**. To add an existing API key to a given provider, go to the Agent Panel settings (`agent: open settings`), look for the desired provider, paste the key into the input, and hit enter. @@ -14,7 +14,7 @@ To add an existing API key to a given provider, go to the Agent Panel settings ( ## Supported Providers -Here's all the supported LLM providers for which you can use your own API keys: +Zed offers an extensive list of "use your own key" LLM providers - [Amazon Bedrock](#amazon-bedrock) - [Anthropic](#anthropic) @@ -43,7 +43,7 @@ Ensure your credentials have the following permissions set up: Your IAM policy should look similar to: -```json +```json [settings] { "Version": "2012-10-17", "Statement": [ @@ -65,7 +65,7 @@ With that done, choose one of the two authentication methods: 1. Ensure you have the AWS CLI installed and configured with a named profile 2. Open your `settings.json` (`zed: open settings`) and include the `bedrock` key under `language_models` with the following settings: - ```json + ```json [settings] { "language_models": { "bedrock": { @@ -120,7 +120,7 @@ Zed will also use the `ANTHROPIC_API_KEY` environment variable if it's defined. You can add custom models to the Anthropic provider by adding the following to your Zed `settings.json`: -```json +```json [settings] { "language_models": { "anthropic": { @@ -147,14 +147,14 @@ Custom models will be listed in the model dropdown in the Agent Panel. You can configure a model to use [extended thinking](https://docs.anthropic.com/en/docs/about-claude/models/extended-thinking-models) (if it supports it) by changing the mode in your model's configuration to `thinking`, for example: -```json +```json [settings] { "name": "claude-sonnet-4-latest", "display_name": "claude-sonnet-4-thinking", "max_tokens": 200000, "mode": { "type": "thinking", - "budget_tokens": 4_096 + "budget_tokens": 4096 } } ``` @@ -174,7 +174,7 @@ Zed will also use the `DEEPSEEK_API_KEY` environment variable if it's defined. The Zed agent comes pre-configured to use the latest version for common models (DeepSeek Chat, DeepSeek Reasoner). If you wish to use alternate models or customize the API endpoint, you can do so by adding the following to your Zed `settings.json`: -```json +```json [settings] { "language_models": { "deepseek": { @@ -231,7 +231,7 @@ By default, Zed will use `stable` versions of models, but you can use specific v Here is an example of a custom Google AI model you could add to your Zed `settings.json`: -```json +```json [settings] { "language_models": { "google": { @@ -286,7 +286,7 @@ The Zed agent comes pre-configured with several Mistral models (codestral-latest All the default models support tool use. If you wish to use alternate models or customize their parameters, you can do so by adding the following to your Zed `settings.json`: -```json +```json [settings] { "language_models": { "mistral": { @@ -338,7 +338,7 @@ See [get_max_tokens in ollama.rs](https://github.com/zed-industries/zed/blob/mai Depending on your hardware or use-case you may wish to limit or increase the context length for a specific model via settings.json: -```json +```json [settings] { "language_models": { "ollama": { @@ -376,6 +376,20 @@ If the model is tagged with `thinking` in the Ollama catalog, set this option an The `supports_images` option enables the model's vision capabilities, allowing it to process images included in the conversation context. If the model is tagged with `vision` in the Ollama catalog, set this option and you can use it in Zed. +#### Ollama Authentication + +In addition to running Ollama on your own hardware, which generally does not require authentication, Zed also supports connecting to remote Ollama instances. API keys are required for authentication. + +One such service is [Ollama Turbo])(https://ollama.com/turbo). To configure Zed to use Ollama turbo: + +1. Sign in to your Ollama account and subscribe to Ollama Turbo +2. Visit [ollama.com/settings/keys](https://ollama.com/settings/keys) and create an API key +3. Open the settings view (`agent: open settings`) and go to the Ollama section +4. Paste your API key and press enter. +5. For the API URL enter `https://ollama.com` + +Zed will also use the `OLLAMA_API_KEY` environment variables if defined. + ### OpenAI {#openai} 1. Visit the OpenAI platform and [create an API key](https://platform.openai.com/account/api-keys) @@ -392,7 +406,7 @@ Zed will also use the `OPENAI_API_KEY` environment variable if it's defined. The Zed agent comes pre-configured to use the latest version for common models (GPT-5, GPT-5 mini, o4-mini, GPT-4.1, and others). To use alternate models, perhaps a preview release, or if you wish to control the request parameters, you can do so by adding the following to your Zed `settings.json`: -```json +```json [settings] { "language_models": { "openai": { @@ -432,7 +446,7 @@ Then, fill up the input fields available in the modal. To do it via your `settings.json`, add the following snippet under `language_models`: -```json +```json [settings] { "language_models": { "openai_compatible": { @@ -485,7 +499,7 @@ Zed will also use the `OPENROUTER_API_KEY` environment variable if it's defined. You can add custom models to the OpenRouter provider by adding the following to your Zed `settings.json`: -```json +```json [settings] { "language_models": { "open_router": { @@ -541,7 +555,7 @@ Supported fields (all optional): Example adding routing preferences to a model: -```json +```json [settings] { "language_models": { "open_router": { @@ -599,7 +613,7 @@ The xAI API key will be saved in your keychain. Zed will also use the `XAI_API_K The Zed agent comes pre-configured with common Grok models. If you wish to use alternate models or customize their parameters, you can do so by adding the following to your Zed `settings.json`: -```json +```json [settings] { "language_models": { "x_ai": { @@ -629,7 +643,7 @@ The Zed agent comes pre-configured with common Grok models. If you wish to use a You can use a custom API endpoint for different providers, as long as it's compatible with the provider's API structure. To do so, add the following to your `settings.json`: -```json +```json [settings] { "language_models": { "some-provider": { diff --git a/docs/src/ai/mcp.md b/docs/src/ai/mcp.md index dfe3e4bdb904b911fd247b6f4eb7cde09d46a9a9..d11b666993aaf8d445e9a1ef3f83156217b3b2db 100644 --- a/docs/src/ai/mcp.md +++ b/docs/src/ai/mcp.md @@ -37,7 +37,7 @@ In any case, here are some of the ones available: Creating an extension is not the only way to use MCP servers in Zed. You can connect them by adding their commands directly to your `settings.json`, like so: -```json +```json [settings] { "context_servers": { "your-mcp-server": { @@ -55,29 +55,31 @@ From there, you can add it through the modal that appears when you click the "Ad ## Using MCP Servers -### Installation Check +### Configuration Check -Regardless of whether you're using MCP servers as an extension or adding them directly, most servers out there need some sort of configuration as part of the set up process. +Regardless of how you've installed MCP servers, whether as an extension or adding them directly, most servers out there still require some sort of configuration as part of the set up process. -In the case of extensions, Zed will show a modal displaying what is required for you to properly set up a given server. +In the case of server extensions, after installing it, Zed will pop up a modal displaying what is required for you to properly set it up. For example, the GitHub MCP extension requires you to add a [Personal Access Token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens). In the case of custom servers, make sure you check the provider documentation to determine what type of command, arguments, and environment variables need to be added to the JSON. -To check whether your MCP server is properly installed, go to the Agent Panel's settings view and watch the indicator dot next to its name. +To check if your MCP server is properly configured, go to the Agent Panel's settings view and watch the indicator dot next to its name. If they're running correctly, the indicator will be green and its tooltip will say "Server is active". If not, other colors and tooltip messages will indicate what is happening. -### Using in the Agent Panel +### Using it in the Agent Panel Once installation is complete, you can return to the Agent Panel and start prompting. -Mentioning your MCP server by name helps the agent pick it up. -If you want to ensure a given server will be used, you can create [a custom profile](./agent-panel.md#custom-profiles) by turning off the built-in tools (either all of them or the ones that would cause conflicts) and turning on only the tools coming from the MCP server. +Some models are better than others when it comes to picking up tools from MCP servers. +Mentioning your server by name always helps the model to pick it up. -As an example, [the Dagger team suggests](https://container-use.com/agent-integrations#add-container-use-agent-profile-optional) doing that with their [Container Use MCP server](https://zed.dev/extensions/mcp-server-container-use): +However, if you want to ensure a given MCP server will be used, you can create [a custom profile](./agent-panel.md#custom-profiles) where all built-in tools (or the ones that could cause conflicts with the server's tools) are turned off and only the tools coming from the MCP server are turned on. -```json +As an example, [the Dagger team suggests](https://container-use.com/agent-integrations#zed) doing that with their [Container Use MCP server](https://zed.dev/extensions/mcp-server-container-use): + +```json [settings] "agent": { "profiles": { "container-use": { diff --git a/docs/src/ai/models.md b/docs/src/ai/models.md index 8d46d0b8d161ae23c77322d13244660142eab56a..18ae7e4d00ef8605b292a6b40943f786e30c3c56 100644 --- a/docs/src/ai/models.md +++ b/docs/src/ai/models.md @@ -1,51 +1,77 @@ # Models -Zed’s plans offer hosted versions of major LLM’s, generally with higher rate limits than individual API keys. +Zed’s plans offer hosted versions of major LLMs, generally with higher rate limits than using your API keys. We’re working hard to expand the models supported by Zed’s subscription offerings, so please check back often. -| Model | Provider | Burn Mode | Context Window | Price per Prompt | Price per Request | -| ----------------- | --------- | --------- | -------------- | ---------------- | ----------------- | -| Claude 3.5 Sonnet | Anthropic | ❌ | 60k | $0.04 | N/A | -| Claude 3.7 Sonnet | Anthropic | ❌ | 120k | $0.04 | N/A | -| Claude 3.7 Sonnet | Anthropic | ✅ | 200k | N/A | $0.05 | -| Claude Sonnet 4 | Anthropic | ❌ | 120k | $0.04 | N/A | -| Claude Sonnet 4 | Anthropic | ✅ | 200k | N/A | $0.05 | -| Claude Opus 4 | Anthropic | ❌ | 120k | $0.20 | N/A | -| Claude Opus 4 | Anthropic | ✅ | 200k | N/A | $0.25 | -| Claude Opus 4.1 | Anthropic | ❌ | 120k | $0.20 | N/A | -| Claude Opus 4.1 | Anthropic | ✅ | 200k | N/A | $0.25 | - -> Note: Because of the 5x token cost for [Opus relative to Sonnet](https://www.anthropic.com/pricing#api), each Opus 4 and 4.1 prompt consumes 5 prompts against your billing meter +| Model | Provider | Token Type | Provider Price per 1M tokens | Zed Price per 1M tokens | +| ---------------------- | --------- | ------------------- | ---------------------------- | ----------------------- | +| Claude Opus 4.1 | Anthropic | Input | $15.00 | $16.50 | +| | Anthropic | Output | $75.00 | $82.50 | +| | Anthropic | Input - Cache Write | $18.75 | $20.625 | +| | Anthropic | Input - Cache Read | $1.50 | $1.65 | +| Claude Sonnet 4.5 | Anthropic | Input | $3.00 | $3.30 | +| | Anthropic | Output | $15.00 | $16.50 | +| | Anthropic | Input - Cache Write | $3.75 | $4.125 | +| | Anthropic | Input - Cache Read | $0.30 | $0.33 | +| Claude Sonnet 4 | Anthropic | Input | $3.00 | $3.30 | +| | Anthropic | Output | $15.00 | $16.50 | +| | Anthropic | Input - Cache Write | $3.75 | $4.125 | +| | Anthropic | Input - Cache Read | $0.30 | $0.33 | +| Claude Sonnet 3.7 | Anthropic | Input | $3.00 | $3.30 | +| | Anthropic | Output | $15.00 | $16.50 | +| | Anthropic | Input - Cache Write | $3.75 | $4.125 | +| | Anthropic | Input - Cache Read | $0.30 | $0.33 | +| GPT-5 | OpenAI | Input | $1.25 | $1.375 | +| | OpenAI | Output | $10.00 | $11.00 | +| | OpenAI | Cached Input | $0.125 | $0.1375 | +| GPT-5 mini | OpenAI | Input | $0.25 | $0.275 | +| | OpenAI | Output | $2.00 | $2.20 | +| | OpenAI | Cached Input | $0.025 | $0.0275 | +| GPT-5 nano | OpenAI | Input | $0.05 | $0.055 | +| | OpenAI | Output | $0.40 | $0.44 | +| | OpenAI | Cached Input | $0.005 | $0.0055 | +| Gemini 2.5 Pro | Google | Input | $1.25 | $1.375 | +| | Google | Output | $10.00 | $11.00 | +| Gemini 2.5 Flash | Google | Input | $0.30 | $0.33 | +| | Google | Output | $2.50 | $2.75 | +| Grok 4 | X.ai | Input | $3.00 | $3.30 | +| | X.ai | Output | $15.00 | $16.5 | +| | X.ai | Cached Input | $0.75 | $0.825 | +| Grok 4 Fast | X.ai | Input | $0.20 | $0.22 | +| | X.ai | Output | $0.50 | $0.55 | +| | X.ai | Cached Input | $0.05 | $0.055 | +| Grok 4 Fast | X.ai | Input | $0.20 | $0.22 | +| | X.ai | Output | $0.50 | $0.55 | +| | X.ai | Cached Input | $0.05 | $0.055 | +| Grok 4 (Non-Reasoning) | X.ai | Input | $0.20 | $0.22 | +| | X.ai | Output | $0.50 | $0.55 | +| | X.ai | Cached Input | $0.05 | $0.055 | +| Grok Code Fast 1 | X.ai | Input | $0.20 | $0.22 | +| | X.ai | Output | $1.50 | $1.65 | +| | X.ai | Cached Input | $0.02 | $0.022 | ## Usage {#usage} -The models above can be used with the prompts included in your plan. For models not marked with [“Burn Mode”](#burn-mode), each prompt is counted against the monthly limit of your plan. - -If you’ve exceeded your limit for the month, and are on a paid plan, you can enable usage-based pricing to continue using models for the rest of the month. See [Plans and Usage](./plans-and-usage.md) for more information. - -Non-Burn Mode usage will use up to 25 tool calls per one prompt. If your prompt extends beyond 25 tool calls, Zed will ask if you’d like to continue, which will consume a second prompt. - -## Burn Mode {#burn-mode} - -> Note: "Burn Mode" is the new name for what was previously called "Max Mode". - -In Burn Mode, we enable models to use [large context windows](#context-windows), unlimited tool calls, and other capabilities for expanded reasoning, to allow an unfettered agentic experience. +Any usage of a Zed-hosted model will be billed at the Zed Price (rightmost column above). See [Plans and Usage](./plans-and-usage.md) for details on Zed's plans and limits for use of hosted models. -Because of the increased cost to Zed, each subsequent request beyond the initial user prompt in Burn Mode models is counted as a prompt for metering. - -In addition, usage-based pricing per request is slightly more expensive for Burn Mode models than usage-based pricing per prompt for regular models. - -> Note that the Agent Panel using a Burn Mode model may consume a good bit of your monthly prompt capacity, if many tool calls are used. -> We encourage you to think through what model is best for your needs before leaving the Agent Panel to work. - -By default, all threads and [text threads](./text-threads.md) start in normal mode. -However, you can use the `agent.preferred_completion_mode` setting to have Burn Mode activated by default. +> We encourage you to think through what model is best for your needs before leaving the Agent Panel to work. All LLMs can "spiral" and occasionally enter unending loops that require user intervention. ## Context Windows {#context-windows} A context window is the maximum span of text and code an LLM can consider at once, including both the input prompt and output generated by the model. -In [Burn Mode](#burn-mode), we increase context window size to allow models to have enhanced reasoning capabilities. +| Model | Provider | Zed-Hosted Context Window | +| ----------------- | --------- | ------------------------- | +| Claude Opus 4.1 | Anthropic | 200k | +| Claude Sonnet 4 | Anthropic | 200k | +| Claude Sonnet 3.7 | Anthropic | 200k | +| GPT-5 | OpenAI | 400k | +| GPT-5 mini | OpenAI | 400k | +| GPT-5 nano | OpenAI | 400k | +| Gemini 2.5 Pro | Google | 200k | +| Gemini 2.5 Flash | Google | 200k | + +> We're planning on expanding supported context windows for hosted Sonnet 4 and Gemini 2.5 Pro/Flash in the near future. Stay tuned! Each Agent thread and text thread in Zed maintains its own context window. The more prompts, attached files, and responses included in a session, the larger the context window grows. @@ -55,7 +81,3 @@ For best results, it’s recommended you take a purpose-based approach to Agent ## Tool Calls {#tool-calls} Models can use [tools](./tools.md) to interface with your code, search the web, and perform other useful functions. - -In [Burn Mode](#burn-mode), models can use an unlimited number of tools per prompt, with each tool call counting as a prompt for metering purposes. - -For non-Burn Mode models, you'll need to interact with the model every 25 tool calls to continue, at which point a new prompt will be counted against your plan limit. diff --git a/docs/src/ai/overview.md b/docs/src/ai/overview.md index 55d37ea3526173b6bf88adc0f15754be51bf6866..ca06a4b1ed53d1fc87136a1d5e82da35552082aa 100644 --- a/docs/src/ai/overview.md +++ b/docs/src/ai/overview.md @@ -8,7 +8,7 @@ Learn how to get started using AI with Zed and all its capabilities. - [External Agents](./external-agents.md): Learn how to plug in your favorite agent into Zed. -- [Subscription](./subscription.md): Learn about Zed's hosted model service and other billing-related information. +- [Subscription](./subscription.md): Learn about Zed's hosted models and other billing-related information. - [Privacy and Security](./privacy-and-security.md): Understand how Zed handles privacy and security with AI features. diff --git a/docs/src/ai/plans-and-usage.md b/docs/src/ai/plans-and-usage.md index 1e6616c79b80489b91e4f92c13b9c5fe39ff1af5..cbca689f9a20ffa99df9816a4bb1fef933d56fee 100644 --- a/docs/src/ai/plans-and-usage.md +++ b/docs/src/ai/plans-and-usage.md @@ -1,8 +1,5 @@ # Plans and Usage -To view your current usage, you can visit your account at [zed.dev/account](https://zed.dev/account). -You’ll also find usage meters in-product when you’re nearing the limit for your plan or trial. - ## Available Plans {#plans} For costs and more information on pricing, visit [Zed’s pricing page](https://zed.dev/pricing). @@ -11,29 +8,24 @@ Please note that if you’re interested in just using Zed as the world’s faste ## Usage {#usage} -- A `prompt` in Zed is an input from the user, initiated by pressing enter, composed of one or many `requests`. A `prompt` can be initiated from the Agent Panel, or via Inline Assist. -- A `request` in Zed is a response to a `prompt`, plus any tool calls that are initiated as part of that response. There may be one `request` per `prompt`, or many. +Usage of Zed's hosted models is measured on a token basis, converted to dollars at the rates lists on [the Models page](./models.md) (list price from the provider, +10%). -Most models offered by Zed are metered per-prompt. -Some models that use large context windows and unlimited tool calls ([“Burn Mode”](./models.md#burn-mode)) count each individual request within a prompt against your prompt limit, since the agentic work spawned by the prompt is expensive to support. +Zed Pro comes with $5 of monthly dollar credit. A trial of Zed Pro includes $20 of credit, usable for 14 days. Monthly included credit resets on your monthly billing date. -See [the Models page](./models.md) for a list of which subset of models are metered by request. +To view your current usage, you can visit your account at [zed.dev/account](https://zed.dev/account). Information from our metering and billing provider, Orb, is embedded on that page. -Plans come with a set amount of prompts included, with the number varying depending on the plan you’ve selected. +## Spend Limits {#usage-spend-limits} -## Usage-Based Pricing {#ubp} +At the top of [the Account page](https://zed.dev/account), you'll find an input for `Maximum Token Spend`. The dollar amount here specifies your _monthly_ limit for spend on tokens, _not counting_ the $5/month included with your Pro subscription. -You may opt in to usage-based pricing for prompts that exceed what is included in your paid plan from [your account page](https://zed.dev/account). +The default value for all Pro users is $10, for a total monthly spend with Zed of $20 ($10 for your Pro subscription, $10 in incremental token spend). This can be set to $0 to limit your spend with Zed to exactly $10/month. If you adjust this limit _higher_ than $10 and consume more than $10 of incremental token spend, you'll be billed via [threshold billing](./billing.md#threshold-billing). -Usage-based pricing is only available with a paid plan, and is exclusively opt-in. -From the dashboard, you can toggle usage-based pricing for usage exceeding your paid plan. -You can also configure a spend limit in USD. -Once the spend limit is hit, we’ll stop any further usage until your prompt limit resets. +Once the spend limit is hit, we’ll stop any further usage until your token spend limit resets. -We will bill for additional prompts when you’ve made prompts totaling $20, or when your billing date occurs, whichever comes first. +## Business Usage {#business-usage} -Cost per request for each model can be found on [the models page](./models.md). +Email [sales@zed.dev](mailto:sales@zed.dev) with any questions on business plans. -## Business Usage {#business-usage} +## Trials {#trials} -Email [sales@zed.dev](mailto:sales@zed.dev) with any questions on business plans, metering, and usage-based pricing. +Note that trials will automatically convert to Zed Free plans on termination, and no cancellation is needed to prevent conversion to Zed Pro. diff --git a/docs/src/ai/privacy-and-security.md b/docs/src/ai/privacy-and-security.md index 5e105a1e5618acc87a0be04290fb7972b6bd017e..23166df1d7e2e188e68d7ecafa98ac92f8e704a4 100644 --- a/docs/src/ai/privacy-and-security.md +++ b/docs/src/ai/privacy-and-security.md @@ -8,7 +8,7 @@ We believe in opt-in data sharing as the default in building AI products, rather As an open-source product, we believe in maximal transparency, and invite you to examine our codebase. If you find issues, we encourage you to share them with us. -It is entirely possible to use Zed without sharing any data with us and without authenticating into the product. We're happy to always support this desired use pattern. +It is entirely possible to use Zed, including Zed's AI capabilities, without sharing any data with us and without authenticating into the product. We're happy to always support this desired use pattern. ## Documentation diff --git a/docs/src/ai/subscription.md b/docs/src/ai/subscription.md index 078fe43384a4fc51b0413ef0bfa8fc7a8ddb1e38..704fdc0ce3a42e92f5a7b5cb58b2bfa1b4fbfb92 100644 --- a/docs/src/ai/subscription.md +++ b/docs/src/ai/subscription.md @@ -2,12 +2,12 @@ Zed's hosted models are offered via subscription to Zed Pro or Zed Business. -> Using your own API keys is _free_—you do not need to subscribe to a Zed plan to use our AI features with your own keys. +> Using [your own API keys](./llm-providers.md), and [external agents](./external-agents.md), is _free_ — you do not need to subscribe to a Zed plan to use AI features. See the following pages for specific aspects of our subscription offering: -- [Plans and Usage](./plans-and-usage.md): Outlines Zed's plans, how usage is measured, and usage-based pricing for overages. +- [Models](./models.md): Overview of the models offered by Zed's subscriptions. -- [Billing](./billing.md): Billing policies and procedures, and how to update or view various billing settings. +- [Plans and Usage](./plans-and-usage.md): Outlines Zed's plans and how usage is measured. -- [Models](./models.md): Overview of the models offered by Zed's subscriptions. +- [Billing](./billing.md): Billing policies and procedures, and how to update or view various billing settings. diff --git a/docs/src/channels.md b/docs/src/channels.md index d8318d22e5d18cf0e5ff514a6c3a4a2618f54325..afd97cdabc51f8c54ffd3f85d02c7aa0764d2f8b 100644 --- a/docs/src/channels.md +++ b/docs/src/channels.md @@ -35,10 +35,6 @@ Each channel has a notes file associated with it to keep track of current status This is similar to a Google Doc, except powered by Zed's collaborative software and persisted to our servers. -## Chat - -The chat is also there for quickly sharing context without a microphone, getting questions answered, or however else you'd want to use a chat channel. - ## Inviting people By default, channels you create can only be accessed by you. You can invite collaborators by right clicking and selecting `Manage members`. @@ -51,6 +47,6 @@ Once you have added someone, they can either join your channel by clicking on it A Channel can also be made Public. This allows anyone to join the channel by clicking on the link. -Guest users in channels can hear and see everything that is happening, and have read only access to projects and channel notes. They can use the Chat as normal. +Guest users in channels can hear and see everything that is happening, and have read only access to projects and channel notes. If you'd like to invite a guest to participate in a channel for the duration of a call you can do so by right clicking on them in the Collaboration Panel. "Allowing Write Access" will allow them to edit any projects shared into the call, and to use their microphone and share their screen if they wish. diff --git a/docs/src/completions.md b/docs/src/completions.md index d14cf61d829595ac622a1f007cbb44c8135c4cbd..ff96ede7503cd461bbd3d7b4afdedcaa2f36a2e5 100644 --- a/docs/src/completions.md +++ b/docs/src/completions.md @@ -9,7 +9,7 @@ Zed supports two sources for completions: When there is an appropriate language server available, Zed will provide completions of variable names, functions, and other symbols in the current file. You can disable these by adding the following to your Zed `settings.json` file: -```json +```json [settings] "show_completions_on_input": false ``` diff --git a/docs/src/configuring-languages.md b/docs/src/configuring-languages.md index fae19686c70731252f38216cf1c30b692a3985d9..9a7157ceaecbcc956e1e98688dfee01316225a3a 100644 --- a/docs/src/configuring-languages.md +++ b/docs/src/configuring-languages.md @@ -28,7 +28,7 @@ Zed allows you to override global settings for individual languages. These custo Here's an example of language-specific settings: -```json +```json [settings] "languages": { "Python": { "tab_size": 4, @@ -67,7 +67,7 @@ Zed automatically detects file types based on their extensions, but you can cust To set up custom file associations, use the [`file_types`](./configuring-zed.md#file-types) setting in your `settings.json`: -```json +```json [settings] "file_types": { "C++": ["c"], "TOML": ["MyLockFile"], @@ -109,7 +109,7 @@ Zed simplifies language server management for users: 2. Storage Location: - macOS: `~/Library/Application Support/Zed/languages` - - Linux: `$XDG_DATA_HOME/languages`, `$FLATPAK_XDG_DATA_HOME/languages`, or `$HOME/.local/share` + - Linux: `$XDG_DATA_HOME/zed/languages`, `$FLATPAK_XDG_DATA_HOME/zed/languages`, or `$HOME/.local/share/zed/languages` 3. Automatic Updates: Zed keeps your language servers up-to-date, ensuring you always have the latest features and improvements. @@ -119,7 +119,7 @@ Some languages in Zed offer multiple language server options. You might have mul You can specify your preference using the `language_servers` setting: -```json +```json [settings] "languages": { "PHP": { "language_servers": ["intelephense", "!phpactor", "..."] @@ -135,11 +135,17 @@ In this example: This configuration allows you to tailor the language server setup to your specific needs, ensuring that you get the most suitable functionality for your development workflow. +### Toolchains + +Some language servers need to be configured with a current "toolchain", which is an installation of a specific version of a programming language compiler or/and interpreter, which can possibly include a full set of dependencies of a project. +An example of what Zed considers a toolchain is a virtual environment in Python. +Not all languages in Zed support toolchain discovery and selection, but for those that do, you can specify the toolchain from a toolchain picker (via {#action toolchain::Select}). To learn more about toolchains in Zed, see [`toolchains`](./toolchains.md). + ### Configuring Language Servers Many language servers accept custom configuration options. You can set these in the `lsp` section of your `settings.json`: -```json +```json [settings] "lsp": { "rust-analyzer": { "initialization_options": { @@ -164,7 +170,7 @@ Suppose you want to configure the following settings for TypeScript: Here's how you would structure these settings in Zed's `settings.json`: -```json +```json [settings] "lsp": { "typescript-language-server": { "initialization_options": { @@ -192,7 +198,7 @@ Sent once during language server startup, requires server's restart to reapply c For example, rust-analyzer and clangd rely on this way of configuring only. -```json +```json [settings] "lsp": { "rust-analyzer": { "initialization_options": { @@ -207,7 +213,7 @@ For example, rust-analyzer and clangd rely on this way of configuring only. May be queried by the server multiple times. Most of the servers would rely on this way of configuring only. -```json +```json [settings] "lsp": { "tailwindcss-language-server": { "settings": { @@ -223,7 +229,7 @@ Apart of the LSP-related server configuration options, certain servers in Zed al Language servers are automatically downloaded or launched if found in your path, if you wish to specify an explicit alternate binary you can specify that in settings: -```json +```json [settings] "lsp": { "rust-analyzer": { "binary": { @@ -243,7 +249,7 @@ Language servers are automatically downloaded or launched if found in your path, You can toggle language server support globally or per-language: -```json +```json [settings] "languages": { "Markdown": { "enable_language_server": false @@ -261,7 +267,7 @@ Zed provides support for code formatting and linting to maintain consistent code Zed supports both built-in and external formatters. See [`formatter`](./configuring-zed.md#formatter) docs for more. You can configure formatters globally or per-language in your `settings.json`: -```json +```json [settings] "languages": { "JavaScript": { "formatter": { @@ -283,7 +289,7 @@ This example uses Prettier for JavaScript and the language server's formatter fo To disable formatting for a specific language: -```json +```json [settings] "languages": { "Markdown": { "format_on_save": "off" @@ -295,7 +301,7 @@ To disable formatting for a specific language: Linting in Zed is typically handled by language servers. Many language servers allow you to configure linting rules: -```json +```json [settings] "lsp": { "eslint": { "settings": { @@ -311,11 +317,11 @@ This configuration sets up ESLint to organize imports on save for JavaScript fil To run linter fixes automatically on save: -```json +```json [settings] "languages": { "JavaScript": { - "code_actions_on_format": { - "source.fixAll.eslint": true + "formatter": { + "code_action": "source.fixAll.eslint" } } } @@ -325,18 +331,20 @@ To run linter fixes automatically on save: Zed allows you to run both formatting and linting on save. Here's an example that uses Prettier for formatting and ESLint for linting JavaScript files: -```json +```json [settings] "languages": { "JavaScript": { - "formatter": { - "external": { - "command": "prettier", - "arguments": ["--stdin-filepath", "{buffer_path}"] + "formatter": [ + { + "code_action": "source.fixAll.eslint" + }, + { + "external": { + "command": "prettier", + "arguments": ["--stdin-filepath", "{buffer_path}"] + } } - }, - "code_actions_on_format": { - "source.fixAll.eslint": true - }, + ], "format_on_save": "on" } } @@ -360,7 +368,7 @@ Zed uses Tree-sitter grammars for syntax highlighting. Override the default high This example makes comments italic and changes the color of strings: -```json +```json [settings] "experimental.theme_overrides": { "syntax": { "comment": { @@ -380,7 +388,7 @@ Change your theme: 1. Use the theme selector ({#kb theme_selector::Toggle}) 2. Or set it in your `settings.json`: -```json +```json [settings] "theme": { "mode": "dark", "dark": "One Dark", @@ -402,7 +410,7 @@ To create your own theme extension, refer to the [Developing Theme Extensions](. Inlay hints provide additional information inline in your code, such as parameter names or inferred types. Configure inlay hints in your `settings.json`: -```json +```json [settings] "inlay_hints": { "enabled": true, "show_type_hints": true, diff --git a/docs/src/configuring-zed.md b/docs/src/configuring-zed.md index 5c12b6aaa470c1f23c82367d4c5c8c7e6247e789..876d75c7e8911c774ff3067669a59404c91ee7d5 100644 --- a/docs/src/configuring-zed.md +++ b/docs/src/configuring-zed.md @@ -35,7 +35,7 @@ Extensions that provide language servers may also provide default settings for t - Setting: `active_pane_modifiers` - Default: -```json +```json [settings] { "active_pane_modifiers": { "border_size": 0.0, @@ -66,39 +66,39 @@ Non-negative `float` values ## Bottom Dock Layout -- Description: Control the layout of the bottom dock, relative to the left and right docks +- Description: Control the layout of the bottom dock, relative to the left and right docks. - Setting: `bottom_dock_layout` - Default: `"contained"` **Options** -1. Contain the bottom dock, giving the full height of the window to the left and right docks +1. Contain the bottom dock, giving the full height of the window to the left and right docks. -```json +```json [settings] { "bottom_dock_layout": "contained" } ``` -2. Give the bottom dock the full width of the window, truncating the left and right docks +2. Give the bottom dock the full width of the window, truncating the left and right docks. -```json +```json [settings] { "bottom_dock_layout": "full" } ``` -3. Left align the bottom dock, truncating the left dock and giving the right dock the full height of the window +3. Left align the bottom dock, truncating the left dock and giving the right dock the full height of the window. -```json +```json [settings] { "bottom_dock_layout": "left_aligned" } ``` -3. Right align the bottom dock, giving the left dock the full height of the window and truncating the right dock. +4. Right align the bottom dock, giving the left dock the full height of the window and truncating the right dock. -```json +```json [settings] { "bottom_dock_layout": "right_aligned" } @@ -124,25 +124,25 @@ Non-negative `float` values 1. Allow rewrap in comments only: -```json +```json [settings] { "allow_rewrap": "in_comments" } ``` -2. Allow rewrap everywhere: +2. Allow rewrap in selections only: -```json +```json [settings] { - "allow_rewrap": "everywhere" + "allow_rewrap": "in_selections" } ``` -3. Never allow rewrap: +3. Allow rewrap anywhere: -```json +```json [settings] { - "allow_rewrap": "never" + "allow_rewrap": "anywhere" } ``` @@ -192,7 +192,7 @@ ls ~/.local/share/zed/extensions/installed Define extensions which should be installed (`true`) or never installed (`false`). -```json +```json [settings] { "auto_install_extensions": { "html": true, @@ -212,7 +212,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 1. To disable autosave, set it to `off`: -```json +```json [settings] { "autosave": "off" } @@ -220,7 +220,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 2. To autosave when focus changes, use `on_focus_change`: -```json +```json [settings] { "autosave": "on_focus_change" } @@ -228,7 +228,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 3. To autosave when the active window changes, use `on_window_change`: -```json +```json [settings] { "autosave": "on_window_change" } @@ -236,7 +236,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 4. To autosave after an inactivity period, use `after_delay`: -```json +```json [settings] { "autosave": { "after_delay": { @@ -246,6 +246,8 @@ Define extensions which should be installed (`true`) or never installed (`false` } ``` +Note that a save will be triggered when an unsaved tab is closed, even if this is earlier than the configured inactivity period. + ## Autoscroll on Clicks - Description: Whether to scroll when clicking near the edge of the visible text area. @@ -296,7 +298,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 1. VS Code -```json +```json [settings] { "base_keymap": "VSCode" } @@ -304,7 +306,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 2. Atom -```json +```json [settings] { "base_keymap": "Atom" } @@ -312,7 +314,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 3. JetBrains -```json +```json [settings] { "base_keymap": "JetBrains" } @@ -320,7 +322,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 4. None -```json +```json [settings] { "base_keymap": "None" } @@ -328,7 +330,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 5. Sublime Text -```json +```json [settings] { "base_keymap": "SublimeText" } @@ -336,7 +338,7 @@ Define extensions which should be installed (`true`) or never installed (`false` 6. TextMate -```json +```json [settings] { "base_keymap": "TextMate" } @@ -365,7 +367,7 @@ Zed supports all OpenType features that can be enabled or disabled for a given b For example, to disable font ligatures, add the following to your settings: -```json +```json [settings] { "buffer_font_features": { "calt": false @@ -375,7 +377,7 @@ For example, to disable font ligatures, add the following to your settings: You can also set other OpenType features, like setting `cv01` to `7`: -```json +```json [settings] { "buffer_font_features": { "cv01": 7 @@ -394,7 +396,7 @@ You can also set other OpenType features, like setting `cv01` to `7`: For example, to use `Nerd Font` as a fallback, add the following to your settings: -```json +```json [settings] { "buffer_font_fallbacks": ["Nerd Font"] } @@ -408,7 +410,7 @@ For example, to use `Nerd Font` as a fallback, add the following to your setting **Options** -`integer` values from `6` to `100` pixels (inclusive) +A font size from `6` to `100` pixels (inclusive) ## Buffer Font Weight @@ -436,7 +438,7 @@ For example, to use `Nerd Font` as a fallback, add the following to your setting - Setting: `centered_layout` - Default: -```json +```json [settings] "centered_layout": { "left_padding": 0.2, "right_padding": 0.2, @@ -482,15 +484,15 @@ Note: Dirty files (files with unsaved changes) will not be automatically closed 1. Allow all diagnostics (default): -```json +```json [settings] { - "diagnostics_max_severity": null + "diagnostics_max_severity": "all" } ``` 2. Show only errors: -```json +```json [settings] { "diagnostics_max_severity": "error" } @@ -498,7 +500,7 @@ Note: Dirty files (files with unsaved changes) will not be automatically closed 3. Show errors and warnings: -```json +```json [settings] { "diagnostics_max_severity": "warning" } @@ -506,15 +508,15 @@ Note: Dirty files (files with unsaved changes) will not be automatically closed 4. Show errors, warnings, and information: -```json +```json [settings] { - "diagnostics_max_severity": "information" + "diagnostics_max_severity": "info" } ``` 5. Show all including hints: -```json +```json [settings] { "diagnostics_max_severity": "hint" } @@ -555,7 +557,7 @@ There are two options to choose from: 1. Behave as a regular buffer and select the whole word (default): -```json +```json [settings] { "double_click_in_multibuffer": "select" } @@ -563,7 +565,7 @@ There are two options to choose from: 2. Open the excerpt clicked as a new buffer in the new tab: -```json +```json [settings] { "double_click_in_multibuffer": "open" } @@ -587,7 +589,7 @@ For the case of "open", regular selection behavior can be achieved by holding `a - Setting: `edit_predictions` - Default: -```json +```json [settings] "edit_predictions": { "disabled_globs": [ "**/.env*", @@ -625,19 +627,19 @@ List of `string` values 1. Don't show edit predictions in comments: -```json +```json [settings] "disabled_in": ["comment"] ``` 2. Don't show edit predictions in strings and comments: -```json +```json [settings] "disabled_in": ["comment", "string"] ``` 3. Only in Go, don't show edit predictions in strings and comments: -```json +```json [settings] { "languages": { "Go": { @@ -657,25 +659,25 @@ List of `string` values 1. Don't highlight the current line: -```json +```json [settings] "current_line_highlight": "none" ``` 2. Highlight the gutter area: -```json +```json [settings] "current_line_highlight": "gutter" ``` 3. Highlight the editor area: -```json +```json [settings] "current_line_highlight": "line" ``` 4. Highlight the full line: -```json +```json [settings] "current_line_highlight": "all" ``` @@ -711,25 +713,25 @@ List of `string` values 1. A vertical bar: -```json +```json [settings] "cursor_shape": "bar" ``` 2. A block that surrounds the following character: -```json +```json [settings] "cursor_shape": "block" ``` 3. An underline / underscore that runs along the following character: -```json +```json [settings] "cursor_shape": "underline" ``` 4. An box drawn around the following character: -```json +```json [settings] "cursor_shape": "hollow" ``` @@ -739,7 +741,7 @@ List of `string` values - Setting: `gutter` - Default: -```json +```json [settings] { "gutter": { "line_numbers": true, @@ -769,19 +771,19 @@ List of `string` values 1. Never hide the mouse cursor: -```json +```json [settings] "hide_mouse": "never" ``` 2. Hide only when typing: -```json +```json [settings] "hide_mouse": "on_typing" ``` 3. Hide on both typing and cursor movement: -```json +```json [settings] "hide_mouse": "on_typing_and_movement" ``` @@ -795,25 +797,25 @@ List of `string` values 1. Place snippets at the top of the completion list: -```json +```json [settings] "snippet_sort_order": "top" ``` 2. Place snippets normally without any preference: -```json +```json [settings] "snippet_sort_order": "inline" ``` 3. Place snippets at the bottom of the completion list: -```json +```json [settings] "snippet_sort_order": "bottom" ``` 4. Do not show snippets in the completion list at all: -```json +```json [settings] "snippet_sort_order": "none" ``` @@ -823,7 +825,7 @@ List of `string` values - Setting: `scrollbar` - Default: -```json +```json [settings] "scrollbar": { "show": "auto", "cursors": true, @@ -849,7 +851,7 @@ List of `string` values 1. Show the scrollbar if there's important information or follow the system's configured behavior: -```json +```json [settings] "scrollbar": { "show": "auto" } @@ -857,7 +859,7 @@ List of `string` values 2. Match the system's configured behavior: -```json +```json [settings] "scrollbar": { "show": "system" } @@ -865,7 +867,7 @@ List of `string` values 3. Always show the scrollbar: -```json +```json [settings] "scrollbar": { "show": "always" } @@ -873,7 +875,7 @@ List of `string` values 4. Never show the scrollbar: -```json +```json [settings] "scrollbar": { "show": "never" } @@ -939,41 +941,41 @@ List of `string` values 1. Show all diagnostics: -```json +```json [settings] { - "diagnostics": "all" + "show_diagnostics": "all" } ``` 2. Do not show any diagnostics: -```json +```json [settings] { - "diagnostics": "none" + "show_diagnostics": "off" } ``` 3. Show only errors: -```json +```json [settings] { - "diagnostics": "error" + "show_diagnostics": "error" } ``` 4. Show only errors and warnings: -```json +```json [settings] { - "diagnostics": "warning" + "show_diagnostics": "warning" } ``` 5. Show only errors, warnings, and information: -```json +```json [settings] { - "diagnostics": "information" + "show_diagnostics": "info" } ``` @@ -983,7 +985,7 @@ List of `string` values - Setting: `axes` - Default: -```json +```json [settings] "scrollbar": { "axes": { "horizontal": true, @@ -1018,7 +1020,7 @@ List of `string` values - Setting: `minimap` - Default: -```json +```json [settings] { "minimap": { "show": "never", @@ -1039,7 +1041,7 @@ List of `string` values 1. Always show the minimap: -```json +```json [settings] { "show": "always" } @@ -1047,7 +1049,7 @@ List of `string` values 2. Show the minimap if the editor's scrollbars are visible: -```json +```json [settings] { "show": "auto" } @@ -1055,7 +1057,7 @@ List of `string` values 3. Never show the minimap: -```json +```json [settings] { "show": "never" } @@ -1071,7 +1073,7 @@ List of `string` values 1. Show the minimap thumb when hovering over the minimap: -```json +```json [settings] { "thumb": "hover" } @@ -1079,7 +1081,7 @@ List of `string` values 2. Always show the minimap thumb: -```json +```json [settings] { "thumb": "always" } @@ -1095,7 +1097,7 @@ List of `string` values 1. Display a border on all sides of the thumb: -```json +```json [settings] { "thumb_border": "full" } @@ -1103,7 +1105,7 @@ List of `string` values 2. Display a border on all sides except the left side: -```json +```json [settings] { "thumb_border": "left_open" } @@ -1111,7 +1113,7 @@ List of `string` values 3. Display a border on all sides except the right side: -```json +```json [settings] { "thumb_border": "right_open" } @@ -1119,7 +1121,7 @@ List of `string` values 4. Display a border only on the left side: -```json +```json [settings] { "thumb_border": "left_only" } @@ -1127,7 +1129,7 @@ List of `string` values 5. Display the thumb without any border: -```json +```json [settings] { "thumb_border": "none" } @@ -1143,7 +1145,7 @@ List of `string` values 1. Inherit the editor's current line highlight setting: -```json +```json [settings] { "minimap": { "current_line_highlight": null @@ -1153,7 +1155,7 @@ List of `string` values 2. Highlight the current line in the minimap: -```json +```json [settings] { "minimap": { "current_line_highlight": "line" @@ -1163,7 +1165,7 @@ List of `string` values or -```json +```json [settings] { "minimap": { "current_line_highlight": "all" @@ -1173,7 +1175,7 @@ or 3. Do not highlight the current line in the minimap: -```json +```json [settings] { "minimap": { "current_line_highlight": "gutter" @@ -1183,7 +1185,7 @@ or or -```json +```json [settings] { "minimap": { "current_line_highlight": "none" @@ -1197,7 +1199,7 @@ or - Settings: `tab_bar` - Default: -```json +```json [settings] "tab_bar": { "show": true, "show_nav_history_buttons": true, @@ -1241,7 +1243,7 @@ or - Setting: `tabs` - Default: -```json +```json [settings] "tabs": { "close_position": "right", "file_icons": false, @@ -1262,7 +1264,7 @@ or 1. Display the close button on the right: -```json +```json [settings] { "close_position": "right" } @@ -1270,7 +1272,7 @@ or 2. Display the close button on the left: -```json +```json [settings] { "close_position": "left" } @@ -1298,7 +1300,7 @@ or 1. Activate the tab that was open previously: -```json +```json [settings] { "activate_on_close": "history" } @@ -1306,7 +1308,7 @@ or 2. Activate the right neighbour tab if present: -```json +```json [settings] { "activate_on_close": "neighbour" } @@ -1314,7 +1316,7 @@ or 3. Activate the left neighbour tab if present: -```json +```json [settings] { "activate_on_close": "left_neighbour" } @@ -1330,7 +1332,7 @@ or 1. Show it just upon hovering the tab: -```json +```json [settings] { "show_close_button": "hover" } @@ -1338,7 +1340,7 @@ or 2. Show it persistently: -```json +```json [settings] { "show_close_button": "always" } @@ -1346,7 +1348,7 @@ or 3. Never show it, even if hovering it: -```json +```json [settings] { "show_close_button": "hidden" } @@ -1362,7 +1364,7 @@ or 1. Do not mark any files: -```json +```json [settings] { "show_diagnostics": "off" } @@ -1370,7 +1372,7 @@ or 2. Only mark files with errors: -```json +```json [settings] { "show_diagnostics": "errors" } @@ -1378,7 +1380,7 @@ or 3. Mark files with errors and warnings: -```json +```json [settings] { "show_diagnostics": "all" } @@ -1400,7 +1402,7 @@ or - Setting: `drag_and_drop_selection` - Default: -```json +```json [settings] "drag_and_drop_selection": { "enabled": true, "delay": 300 @@ -1413,7 +1415,7 @@ or - Setting: `toolbar` - Default: -```json +```json [settings] "toolbar": { "breadcrumbs": true, "quick_actions": true, @@ -1493,13 +1495,21 @@ Positive `integer` value between 1 and 32. Values outside of this range will be - Setting: `status_bar` - Default: -```json +```json [settings] "status_bar": { "active_language_button": true, "cursor_position_button": true }, ``` +There is an experimental setting that completely hides the status bar. This causes major usability problems (you will be unable to use many of Zed's features), but is provided for those who value screen real-estate above all else. + +```json +"status_bar": { + "experimental.show": false +} +``` + ## LSP - Description: Configuration for language servers. @@ -1519,7 +1529,7 @@ Some options are passed via `initialization_options` to the language server. The For example to pass the `check` option to `rust-analyzer`, use the following configuration: -```json +```json [settings] "lsp": { "rust-analyzer": { "initialization_options": { @@ -1533,7 +1543,7 @@ For example to pass the `check` option to `rust-analyzer`, use the following con While other options may be changed at a runtime and should be placed under `settings`: -```json +```json [settings] "lsp": { "yaml-language-server": { "settings": { @@ -1551,7 +1561,7 @@ While other options may be changed at a runtime and should be placed under `sett - Setting: `global_lsp_settings` - Default: -```json +```json [settings] { "global_lsp_settings": { "button": true @@ -1569,18 +1579,6 @@ While other options may be changed at a runtime and should be placed under `sett - Setting: `lsp_highlight_debounce` - Default: `75` -## Global LSP Settings - -- Description: Common language server settings. -- Setting: `global_lsp_settings` -- Default: - -```json -"global_lsp_settings": { - "button": true -} -``` - **Options** `integer` values representing milliseconds @@ -1591,7 +1589,7 @@ While other options may be changed at a runtime and should be placed under `sett - Setting: `features` - Default: -```json +```json [settings] { "features": { "edit_prediction_provider": "zed" @@ -1609,7 +1607,7 @@ While other options may be changed at a runtime and should be placed under `sett 1. Use Zeta as the edit prediction provider: -```json +```json [settings] { "features": { "edit_prediction_provider": "zed" @@ -1619,7 +1617,7 @@ While other options may be changed at a runtime and should be placed under `sett 2. Use Copilot as the edit prediction provider: -```json +```json [settings] { "features": { "edit_prediction_provider": "copilot" @@ -1629,7 +1627,7 @@ While other options may be changed at a runtime and should be placed under `sett 3. Use Supermaven as the edit prediction provider: -```json +```json [settings] { "features": { "edit_prediction_provider": "supermaven" @@ -1639,7 +1637,7 @@ While other options may be changed at a runtime and should be placed under `sett 4. Turn off edit predictions across all providers -```json +```json [settings] { "features": { "edit_prediction_provider": "none" @@ -1657,7 +1655,7 @@ While other options may be changed at a runtime and should be placed under `sett 1. `on`, enables format on save obeying `formatter` setting: -```json +```json [settings] { "format_on_save": "on" } @@ -1665,7 +1663,7 @@ While other options may be changed at a runtime and should be placed under `sett 2. `off`, disables format on save: -```json +```json [settings] { "format_on_save": "off" } @@ -1681,7 +1679,7 @@ While other options may be changed at a runtime and should be placed under `sett 1. To use the current language server, use `"language_server"`: -```json +```json [settings] { "formatter": "language_server" } @@ -1689,7 +1687,7 @@ While other options may be changed at a runtime and should be placed under `sett 2. Or to use an external command, use `"external"`. Specify the name of the formatting program to run, and an array of arguments to pass to the program. The buffer's text will be passed to the program on stdin, and the formatted output should be written to stdout. For example, the following command would strip trailing spaces using [`sed(1)`](https://linux.die.net/man/1/sed): -```json +```json [settings] { "formatter": { "external": { @@ -1704,7 +1702,7 @@ While other options may be changed at a runtime and should be placed under `sett WARNING: `{buffer_path}` should not be used to direct your formatter to read from a filename. Your formatter should only read from standard input and should not read or write files directly. -```json +```json [settings] "formatter": { "external": { "command": "prettier", @@ -1715,22 +1713,20 @@ WARNING: `{buffer_path}` should not be used to direct your formatter to read fro 4. Or to use code actions provided by the connected language servers, use `"code_actions"`: -```json +```json [settings] { - "formatter": { - "code_actions": { - // Use ESLint's --fix: - "source.fixAll.eslint": true, - // Organize imports on save: - "source.organizeImports": true - } - } + "formatter": [ + // Use ESLint's --fix: + { "code_action": "source.fixAll.eslint" }, + // Organize imports on save: + { "code_action": "source.organizeImports" } + ] } ``` 5. Or to use multiple formatters consecutively, use an array of formatters: -```json +```json [settings] { "formatter": [ { "language_server": { "name": "rust-analyzer" } }, @@ -1747,74 +1743,6 @@ WARNING: `{buffer_path}` should not be used to direct your formatter to read fro Here `rust-analyzer` will be used first to format the code, followed by a call of sed. If any of the formatters fails, the subsequent ones will still be executed. -## Code Actions On Format - -- Description: The code actions to perform with the primary language server when formatting the buffer. -- Setting: `code_actions_on_format` -- Default: `{}`, except for Go it's `{ "source.organizeImports": true }` - -**Examples** - - - -1. Organize imports on format in TypeScript and TSX buffers: - -```json -{ - "languages": { - "TypeScript": { - "code_actions_on_format": { - "source.organizeImports": true - } - }, - "TSX": { - "code_actions_on_format": { - "source.organizeImports": true - } - } - } -} -``` - -2. Run ESLint `fixAll` code action when formatting: - -```json -{ - "languages": { - "JavaScript": { - "code_actions_on_format": { - "source.fixAll.eslint": true - } - } - } -} -``` - -3. Run only a single ESLint rule when using `fixAll`: - -```json -{ - "languages": { - "JavaScript": { - "code_actions_on_format": { - "source.fixAll.eslint": true - } - } - }, - "lsp": { - "eslint": { - "settings": { - "codeActionOnSave": { - "rules": ["import/order"] - } - } - } - } -} -``` - ## Auto close - Description: Whether to automatically add matching closing characters when typing opening parenthesis, bracket, brace, single or double quote characters. @@ -1851,7 +1779,7 @@ The result is still `)))` and not `))))))`, which is what it would be by default - Description: Files or globs of files that will be excluded by Zed entirely. They will be skipped during file scans, file searches, and not be displayed in the project file tree. Overrides `file_scan_inclusions`. - Default: -```json +```json [settings] "file_scan_exclusions": [ "**/.git", "**/.svn", @@ -1873,7 +1801,7 @@ Note, specifying `file_scan_exclusions` in settings.json will override the defau - Description: Files or globs of files that will be included by Zed, even when ignored by git. This is useful for files that are not tracked by git, but are still important to your project. Note that globs that are overly broad can slow down Zed's file scanning. `file_scan_exclusions` takes precedence over these inclusions. - Default: -```json +```json [settings] "file_scan_inclusions": [".env*"], ``` @@ -1883,7 +1811,7 @@ Note, specifying `file_scan_exclusions` in settings.json will override the defau - Description: Configure how Zed selects a language for a file based on its filename or extension. Supports glob entries. - Default: -```json +```json [settings] "file_types": { "JSONC": ["**/.zed/**/*.json", "**/zed/**/*.json", "**/Zed/**/*.json", "**/.vscode/**/*.json"], "Shell Script": [".env.*"] @@ -1894,7 +1822,7 @@ Note, specifying `file_scan_exclusions` in settings.json will override the defau To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files starting with `Dockerfile` as Dockerfile: -```json +```json [settings] { "file_types": { "C++": ["c"], @@ -1910,7 +1838,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files - Setting: `diagnostics` - Default: -```json +```json [settings] { "diagnostics": { "include_warnings": true, @@ -1930,7 +1858,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files - Setting: `inline` - Default: -```json +```json [settings] { "diagnostics": { "inline": { @@ -1948,7 +1876,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files 1. Enable inline diagnostics. -```json +```json [settings] { "diagnostics": { "inline": { @@ -1960,7 +1888,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files 2. Delay diagnostic updates until some time after the last diagnostic update. -```json +```json [settings] { "diagnostics": { "inline": { @@ -1973,7 +1901,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files 3. Set padding between the end of the source line and the start of the diagnostic. -```json +```json [settings] { "diagnostics": { "inline": { @@ -1986,7 +1914,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files 4. Horizontally align inline diagnostics at the given column. -```json +```json [settings] { "diagnostics": { "inline": { @@ -1999,7 +1927,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files 5. Show only warning and error diagnostics. -```json +```json [settings] { "diagnostics": { "inline": { @@ -2016,7 +1944,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files - Setting: `git` - Default: -```json +```json [settings] { "git": { "git_gutter": "tracked_files", @@ -2041,7 +1969,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files 1. Show git gutter in tracked files -```json +```json [settings] { "git": { "git_gutter": "tracked_files" @@ -2051,7 +1979,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files 2. Hide git gutter -```json +```json [settings] { "git": { "git_gutter": "hide" @@ -2071,7 +1999,7 @@ To interpret all `.c` files as C++, files called `MyLockFile` as TOML and files Example: -```json +```json [settings] { "git": { "gutter_debounce": 100 @@ -2085,7 +2013,7 @@ Example: - Setting: `inline_blame` - Default: -```json +```json [settings] { "git": { "inline_blame": { @@ -2099,7 +2027,7 @@ Example: 1. Disable inline git blame: -```json +```json [settings] { "git": { "inline_blame": { @@ -2111,7 +2039,7 @@ Example: 2. Only show inline git blame after a delay (that starts after cursor stops moving): -```json +```json [settings] { "git": { "inline_blame": { @@ -2123,7 +2051,7 @@ Example: 3. Show a commit summary next to the commit date and author: -```json +```json [settings] { "git": { "inline_blame": { @@ -2135,7 +2063,7 @@ Example: 4. Use this as the minimum column at which to display inline blame information: -```json +```json [settings] { "git": { "inline_blame": { @@ -2147,7 +2075,7 @@ Example: 5. Set the padding between the end of the line and the inline blame hint, in ems: -```json +```json [settings] { "git": { "inline_blame": { @@ -2163,7 +2091,7 @@ Example: - Setting: `branch_picker` - Default: -```json +```json [settings] { "git": { "branch_picker": { @@ -2177,7 +2105,7 @@ Example: 1. Show the author name in the branch picker: -```json +```json [settings] { "git": { "branch_picker": { @@ -2193,7 +2121,7 @@ Example: - Setting: `hunk_style` - Default: -```json +```json [settings] { "git": { "hunk_style": "staged_hollow" @@ -2205,7 +2133,7 @@ Example: 1. Show the staged hunks faded out and with a border: -```json +```json [settings] { "git": { "hunk_style": "staged_hollow" @@ -2215,7 +2143,7 @@ Example: 2. Show unstaged hunks faded out and with a border: -```json +```json [settings] { "git": { "hunk_style": "unstaged_hollow" @@ -2233,7 +2161,7 @@ Example: 1. Do nothing: -```json +```json [settings] { "go_to_definition_fallback": "none" } @@ -2241,7 +2169,7 @@ Example: 2. Find references for the same symbol (default): -```json +```json [settings] { "go_to_definition_fallback": "find_all_references" } @@ -2273,7 +2201,7 @@ Example: - Setting: `indent_guides` - Default: -```json +```json [settings] { "indent_guides": { "enabled": true, @@ -2289,7 +2217,7 @@ Example: 1. Disable indent guides -```json +```json [settings] { "indent_guides": { "enabled": false @@ -2299,7 +2227,7 @@ Example: 2. Enable indent guides for a specific language. -```json +```json [settings] { "languages": { "Python": { @@ -2314,7 +2242,7 @@ Example: 3. Enable indent aware coloring ("rainbow indentation"). The colors that are used for different indentation levels are defined in the theme (theme key: `accents`). They can be customized by using theme overrides. -```json +```json [settings] { "indent_guides": { "enabled": true, @@ -2326,7 +2254,7 @@ Example: 4. Enable indent aware background coloring ("rainbow indentation"). The colors that are used for different indentation levels are defined in the theme (theme key: `accents`). They can be customized by using theme overrides. -```json +```json [settings] { "indent_guides": { "enabled": true, @@ -2368,7 +2296,7 @@ Example: - Setting: `icon_theme` - Default: -```json +```json [settings] "icon_theme": { "mode": "system", "dark": "Zed (Default)", @@ -2386,7 +2314,7 @@ Example: 1. Set the icon theme to dark mode -```json +```json [settings] { "mode": "dark" } @@ -2394,7 +2322,7 @@ Example: 2. Set the icon theme to light mode -```json +```json [settings] { "mode": "light" } @@ -2402,7 +2330,7 @@ Example: 3. Set the icon theme to system mode -```json +```json [settings] { "mode": "system" } @@ -2434,7 +2362,7 @@ Run the {#action icon_theme_selector::Toggle} action in the command palette to s - Setting: `image_viewer` - Default: -```json +```json [settings] { "image_viewer": { "unit": "binary" @@ -2454,7 +2382,7 @@ Run the {#action icon_theme_selector::Toggle} action in the command palette to s 1. Use binary units (KiB, MiB): -```json +```json [settings] { "image_viewer": { "unit": "binary" @@ -2464,7 +2392,7 @@ Run the {#action icon_theme_selector::Toggle} action in the command palette to s 2. Use decimal units (KB, MB): -```json +```json [settings] { "image_viewer": { "unit": "decimal" @@ -2478,7 +2406,7 @@ Run the {#action icon_theme_selector::Toggle} action in the command palette to s - Setting: `inlay_hints` - Default: -```json +```json [settings] "inlay_hints": { "enabled": false, "show_type_hints": true, @@ -2511,7 +2439,7 @@ Settings-related hint updates are not debounced. All possible config values for `toggle_on_modifiers_press` are: -```json +```json [settings] "inlay_hints": { "toggle_on_modifiers_press": { "control": true, @@ -2531,7 +2459,7 @@ Unspecified values have a `false` value, hints won't be toggled if all the modif - Setting: `journal` - Default: -```json +```json [settings] "journal": { "path": "~", "hour_format": "hour12" @@ -2558,7 +2486,7 @@ Unspecified values have a `false` value, hints won't be toggled if all the modif 1. 12-hour format: -```json +```json [settings] { "hour_format": "hour12" } @@ -2566,7 +2494,7 @@ Unspecified values have a `false` value, hints won't be toggled if all the modif 2. 24-hour format: -```json +```json [settings] { "hour_format": "hour24" } @@ -2578,7 +2506,7 @@ Unspecified values have a `false` value, hints won't be toggled if all the modif - Setting: `jsx_tag_auto_close` - Default: -```json +```json [settings] { "jsx_tag_auto_close": { "enabled": true @@ -2600,7 +2528,7 @@ Unspecified values have a `false` value, hints won't be toggled if all the modif To override settings for a language, add an entry for that languages name to the `languages` value. Example: -```json +```json [settings] "languages": { "C": { "format_on_save": "off", @@ -2624,6 +2552,7 @@ The following settings can be overridden for each specific language: - [`remove_trailing_whitespace_on_save`](#remove-trailing-whitespace-on-save) - [`show_edit_predictions`](#show-edit-predictions) - [`show_whitespaces`](#show-whitespaces) +- [`whitespace_map`](#whitespace-map) - [`soft_wrap`](#soft-wrap) - [`tab_size`](#tab-size) - [`use_autoclose`](#use-autoclose) @@ -2637,7 +2566,7 @@ These values take in the same options as the root-level settings with the same n - Setting: `language_models` - Default: -```json +```json [settings] { "language_models": { "anthropic": { @@ -2670,7 +2599,7 @@ Configuration for various AI model providers including API URLs and authenticati 1. Short format: -```json +```json [settings] { "line_indicator_format": "short" } @@ -2678,7 +2607,7 @@ Configuration for various AI model providers including API URLs and authenticati 2. Long format: -```json +```json [settings] { "line_indicator_format": "long" } @@ -2734,7 +2663,7 @@ Positive `integer` values or `null` for unlimited tabs 1. Maps to `Alt` on Linux and Windows and to `Option` on macOS: -```json +```json [settings] { "multi_cursor_modifier": "alt" } @@ -2742,7 +2671,7 @@ Positive `integer` values or `null` for unlimited tabs 2. Maps `Control` on Linux and Windows and to `Command` on macOS: -```json +```json [settings] { "multi_cursor_modifier": "cmd_or_ctrl" // alias: "cmd", "ctrl" } @@ -2754,7 +2683,7 @@ Positive `integer` values or `null` for unlimited tabs - Setting: `node` - Default: -```json +```json [settings] { "node": { "ignore_system_version": false, @@ -2795,7 +2724,7 @@ By default no proxy will be used, or Zed will attempt to retrieve proxy settings For example, to set an `http` proxy, add the following to your settings: -```json +```json [settings] { "proxy": "http://127.0.0.1:10809" } @@ -2803,7 +2732,7 @@ For example, to set an `http` proxy, add the following to your settings: Or to set a `socks5` proxy: -```json +```json [settings] { "proxy": "socks5h://localhost:10808" } @@ -2821,7 +2750,7 @@ If you wish to exclude certain hosts from using the proxy, set the `NO_PROXY` en 1. Use platform default behavior: -```json +```json [settings] { "on_last_window_closed": "platform_default" } @@ -2829,7 +2758,7 @@ If you wish to exclude certain hosts from using the proxy, set the `NO_PROXY` en 2. Always quit the application: -```json +```json [settings] { "on_last_window_closed": "quit_app" } @@ -2845,7 +2774,7 @@ If you wish to exclude certain hosts from using the proxy, set the `NO_PROXY` en Configuration object for defining settings profiles. Example: -```json +```json [settings] { "profiles": { "presentation": { @@ -2872,7 +2801,7 @@ Configuration object for defining settings profiles. Example: - Setting: `preview_tabs` - Default: -```json +```json [settings] "preview_tabs": { "enabled": true, "enable_preview_from_file_finder": false, @@ -2930,7 +2859,7 @@ Configuration object for defining settings profiles. Example: 1. Split upward: -```json +```json [settings] { "pane_split_direction_horizontal": "up" } @@ -2938,7 +2867,7 @@ Configuration object for defining settings profiles. Example: 2. Split downward: -```json +```json [settings] { "pane_split_direction_horizontal": "down" } @@ -2954,7 +2883,7 @@ Configuration object for defining settings profiles. Example: 1. Split to the left: -```json +```json [settings] { "pane_split_direction_vertical": "left" } @@ -2962,7 +2891,7 @@ Configuration object for defining settings profiles. Example: 2. Split to the right: -```json +```json [settings] { "pane_split_direction_vertical": "right" } @@ -3072,7 +3001,7 @@ List of strings containing any combination of: 1. Restore all workspaces that were open when quitting Zed: -```json +```json [settings] { "restore_on_startup": "last_session" } @@ -3080,7 +3009,7 @@ List of strings containing any combination of: 2. Restore the workspace that was closed last: -```json +```json [settings] { "restore_on_startup": "last_workspace" } @@ -3088,7 +3017,7 @@ List of strings containing any combination of: 3. Always start with an empty editor: -```json +```json [settings] { "restore_on_startup": "none" } @@ -3104,7 +3033,7 @@ List of strings containing any combination of: 1. Scroll one page beyond the last line by one page: -```json +```json [settings] { "scroll_beyond_last_line": "one_page" } @@ -3112,7 +3041,7 @@ List of strings containing any combination of: 2. The editor will scroll beyond the last line by the same amount of lines as `vertical_scroll_margin`: -```json +```json [settings] { "scroll_beyond_last_line": "vertical_scroll_margin" } @@ -3120,7 +3049,7 @@ List of strings containing any combination of: 3. The editor will not scroll beyond the last line: -```json +```json [settings] { "scroll_beyond_last_line": "off" } @@ -3176,7 +3105,7 @@ Non-negative `integer` values - Setting: `search` - Default: -```json +```json [settings] "search": { "whole_word": false, "case_sensitive": false, @@ -3235,7 +3164,7 @@ Examples: - Setting: `completions` - Default: -```json +```json [settings] { "completions": { "words": "fallback", @@ -3346,6 +3275,21 @@ Positive integer values 3. `none` 4. `boundary` +## Whitespace Map + +- Description: Specify the characters used to render whitespace when show_whitespaces is enabled. +- Setting: `whitespace_map` +- Default: + +```json [settings] +{ + "whitespace_map": { + "space": "•", + "tab": "→" + } +} +``` + ## Soft Wrap - Description: Whether or not to automatically wrap lines of text to fit editor / preferred width. @@ -3436,7 +3380,7 @@ List of `integer` column numbers - Setting: `tasks` - Default: -```json +```json [settings] { "tasks": { "variables": {}, @@ -3458,7 +3402,7 @@ List of `integer` column numbers - Setting: `telemetry` - Default: -```json +```json [settings] "telemetry": { "diagnostics": true, "metrics": true @@ -3493,13 +3437,13 @@ List of `integer` column numbers - Setting: `terminal` - Default: -```json +```json [settings] { "terminal": { "alternate_scroll": "off", "blinking": "terminal_controlled", "copy_on_select": false, - "keep_selection_on_copy": false, + "keep_selection_on_copy": true, "dock": "bottom", "default_width": 640, "default_height": 320, @@ -3519,7 +3463,7 @@ List of `integer` column numbers "button": true, "shell": "system", "toolbar": { - "breadcrumbs": true + "breadcrumbs": false }, "working_directory": "current_project_directory", "scrollbar": { @@ -3549,7 +3493,7 @@ List of `integer` column numbers 1. Default alternate scroll mode to off -```json +```json [settings] { "terminal": { "alternate_scroll": "off" @@ -3559,7 +3503,7 @@ List of `integer` column numbers 2. Default alternate scroll mode to on -```json +```json [settings] { "terminal": { "alternate_scroll": "on" @@ -3577,7 +3521,7 @@ List of `integer` column numbers 1. Never blink the cursor, ignore the terminal mode -```json +```json [settings] { "terminal": { "blinking": "off" @@ -3587,7 +3531,7 @@ List of `integer` column numbers 2. Default the cursor blink to off, but allow the terminal to turn blinking on -```json +```json [settings] { "terminal": { "blinking": "terminal_controlled" @@ -3597,7 +3541,7 @@ List of `integer` column numbers 3. Always blink the cursor, ignore the terminal mode -```json +```json [settings] { "terminal": { "blinking": "on" @@ -3617,7 +3561,7 @@ List of `integer` column numbers **Example** -```json +```json [settings] { "terminal": { "copy_on_select": true @@ -3635,7 +3579,7 @@ List of `integer` column numbers 1. A block that surrounds the following character -```json +```json [settings] { "terminal": { "cursor_shape": "block" @@ -3645,7 +3589,7 @@ List of `integer` column numbers 2. A vertical bar -```json +```json [settings] { "terminal": { "cursor_shape": "bar" @@ -3655,7 +3599,7 @@ List of `integer` column numbers 3. An underline / underscore that runs along the following character -```json +```json [settings] { "terminal": { "cursor_shape": "underline" @@ -3665,7 +3609,7 @@ List of `integer` column numbers 4. A box drawn around the following character -```json +```json [settings] { "terminal": { "cursor_shape": "hollow" @@ -3677,7 +3621,7 @@ List of `integer` column numbers - Description: Whether or not to keep the selection in the terminal after copying text. - Setting: `keep_selection_on_copy` -- Default: `false` +- Default: `true` **Options** @@ -3685,10 +3629,10 @@ List of `integer` column numbers **Example** -```json +```json [settings] { "terminal": { - "keep_selection_on_copy": true + "keep_selection_on_copy": false } } ``` @@ -3701,7 +3645,7 @@ List of `integer` column numbers **Example** -```json +```json [settings] { "terminal": { "env": { @@ -3722,7 +3666,7 @@ List of `integer` column numbers `integer` values -```json +```json [settings] { "terminal": { "font_size": 15 @@ -3740,7 +3684,7 @@ List of `integer` column numbers The name of any font family installed on the user's system -```json +```json [settings] { "terminal": { "font_family": "Berkeley Mono" @@ -3759,7 +3703,7 @@ The name of any font family installed on the user's system See Buffer Font Features -```json +```json [settings] { "terminal": { "font_features": { @@ -3774,13 +3718,13 @@ See Buffer Font Features - Description: Set the terminal's line height. - Setting: `line_height` -- Default: `comfortable` +- Default: `standard` **Options** -1. Use a line height that's `comfortable` for reading, 1.618. (default) +1. Use a line height that's `comfortable` for reading, 1.618. -```json +```json [settings] { "terminal": { "line_height": "comfortable" @@ -3788,9 +3732,9 @@ See Buffer Font Features } ``` -2. Use a `standard` line height, 1.3. This option is useful for TUIs, particularly if they use box characters +2. Use a `standard` line height, 1.3. This option is useful for TUIs, particularly if they use box characters. (default) -```json +```json [settings] { "terminal": { "line_height": "standard" @@ -3800,7 +3744,7 @@ See Buffer Font Features 3. Use a custom line height. -```json +```json [settings] { "terminal": { "line_height": { @@ -3826,7 +3770,7 @@ See Buffer Font Features - `75`: Minimum for body text - `90`: Preferred for body text -```json +```json [settings] { "terminal": { "minimum_contrast": 45 @@ -3844,7 +3788,7 @@ See Buffer Font Features `boolean` values -```json +```json [settings] { "terminal": { "option_as_meta": true @@ -3862,7 +3806,7 @@ See Buffer Font Features 1. Use the system's default terminal configuration (usually the `/etc/passwd` file). -```json +```json [settings] { "terminal": { "shell": "system" @@ -3872,7 +3816,7 @@ See Buffer Font Features 2. A program to launch: -```json +```json [settings] { "terminal": { "shell": { @@ -3884,7 +3828,7 @@ See Buffer Font Features 3. A program with arguments: -```json +```json [settings] { "terminal": { "shell": { @@ -3903,7 +3847,7 @@ See Buffer Font Features - Setting: `detect_venv` - Default: -```json +```json [settings] { "terminal": { "detect_venv": { @@ -3922,7 +3866,7 @@ See Buffer Font Features Disable with: -```json +```json [settings] { "terminal": { "detect_venv": "off" @@ -3936,11 +3880,11 @@ Disable with: - Setting: `toolbar` - Default: -```json +```json [settings] { "terminal": { "toolbar": { - "breadcrumbs": true + "breadcrumbs": false } } } @@ -3966,7 +3910,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` `boolean` values -```json +```json [settings] { "terminal": { "button": false @@ -3984,7 +3928,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` 1. Use the current file's project directory. Will Fallback to the first project directory strategy if unsuccessful -```json +```json [settings] { "terminal": { "working_directory": "current_project_directory" @@ -3994,7 +3938,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` 2. Use the first project in this workspace's directory. Will fallback to using this platform's home directory. -```json +```json [settings] { "terminal": { "working_directory": "first_project_directory" @@ -4004,7 +3948,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` 3. Always use this platform's home directory (if we can find it) -```json +```json [settings] { "terminal": { "working_directory": "always_home" @@ -4014,7 +3958,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` 4. Always use a specific directory. This value will be shell expanded. If this path is not a valid directory the terminal will default to this platform's home directory. -```json +```json [settings] { "terminal": { "working_directory": { @@ -4026,6 +3970,23 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` } ``` +## REPL + +- Description: Repl settings. +- Setting: `repl` +- Default: + +```json [settings] +"repl": { + // Maximum number of columns to keep in REPL's scrollback buffer. + // Clamped with [20, 512] range. + "max_columns": 128, + // Maximum number of lines to keep in REPL's scrollback buffer. + // Clamped with [4, 256] range. + "max_lines": 32 +}, +``` + ## Theme - Description: The theme setting can be specified in two forms - either as the name of a theme or as an object containing the `mode`, `dark`, and `light` themes for the Zed UI. @@ -4038,7 +3999,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` - Setting: `theme` - Default: -```json +```json [settings] "theme": { "mode": "system", "dark": "One Dark", @@ -4056,7 +4017,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` 1. Set the theme to dark mode -```json +```json [settings] { "mode": "dark" } @@ -4064,7 +4025,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` 2. Set the theme to light mode -```json +```json [settings] { "mode": "light" } @@ -4072,7 +4033,7 @@ Example command to set the title: `echo -e "\e]2;New Title\007";` 3. Set the theme to system mode -```json +```json [settings] { "mode": "system" } @@ -4104,7 +4065,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a - Setting: `title_bar` - Default: -```json +```json [settings] "title_bar": { "show_branch_icon": false, "show_branch_name": true, @@ -4142,7 +4103,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 1. Use platform default behavior: -```json +```json [settings] { "when_closing_with_no_tabs": "platform_default" } @@ -4150,7 +4111,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 2. Always close the window: -```json +```json [settings] { "when_closing_with_no_tabs": "close_window" } @@ -4158,7 +4119,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 3. Never close the window: -```json +```json [settings] { "when_closing_with_no_tabs": "keep_window_open" } @@ -4170,7 +4131,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a - Setting: `project_panel` - Default: -```json +```json [settings] { "project_panel": { "button": true, @@ -4193,6 +4154,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a "show": "always" }, "hide_root": false, + "hide_hidden": false, "starts_open": true } } @@ -4208,7 +4170,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 1. Default dock position to left -```json +```json [settings] { "dock": "left" } @@ -4216,7 +4178,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 2. Default dock position to right -```json +```json [settings] { "dock": "right" } @@ -4232,7 +4194,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 1. Comfortable entry spacing -```json +```json [settings] { "entry_spacing": "comfortable" } @@ -4240,7 +4202,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 2. Standard entry spacing -```json +```json [settings] { "entry_spacing": "standard" } @@ -4256,7 +4218,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 1. Default enable git status -```json +```json [settings] { "git_status": true } @@ -4264,7 +4226,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 2. Default disable git status -```json +```json [settings] { "git_status": false } @@ -4290,7 +4252,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 1. Enable auto reveal entries -```json +```json [settings] { "auto_reveal_entries": true } @@ -4298,7 +4260,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 2. Disable auto reveal entries -```json +```json [settings] { "auto_reveal_entries": false } @@ -4314,7 +4276,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 1. Enable auto fold dirs -```json +```json [settings] { "auto_fold_dirs": true } @@ -4322,7 +4284,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 2. Disable auto fold dirs -```json +```json [settings] { "auto_fold_dirs": false } @@ -4340,7 +4302,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a - Setting: `indent_guides` - Default: -```json +```json [settings] "indent_guides": { "show": "always" } @@ -4350,7 +4312,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 1. Show indent guides in the project panel -```json +```json [settings] { "indent_guides": { "show": "always" @@ -4360,7 +4322,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 2. Hide indent guides in the project panel -```json +```json [settings] { "indent_guides": { "show": "never" @@ -4374,7 +4336,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a - Setting: `scrollbar` - Default: -```json +```json [settings] "scrollbar": { "show": null } @@ -4384,7 +4346,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 1. Show scrollbar in the project panel -```json +```json [settings] { "scrollbar": { "show": "always" @@ -4394,7 +4356,7 @@ Run the {#action theme_selector::Toggle} action in the command palette to see a 2. Hide scrollbar in the project panel -```json +```json [settings] { "scrollbar": { "show": "never" @@ -4412,7 +4374,7 @@ Visit [the Configuration page](./ai/configuration.md) under the AI section to le - Setting: `collaboration_panel` - Default: -```json +```json [settings] { "collaboration_panel": { "button": true, @@ -4434,7 +4396,7 @@ Visit [the Configuration page](./ai/configuration.md) under the AI section to le - Setting: `debugger` - Default: -```json +```json [settings] { "debugger": { "stepping_granularity": "line", @@ -4453,7 +4415,7 @@ See the [debugger page](./debugger.md) for more information about debugging supp - Setting: `git_panel` - Default: -```json +```json [settings] { "git_panel": { "button": true, @@ -4487,7 +4449,7 @@ See the [debugger page](./debugger.md) for more information about debugging supp - Setting: `outline_panel` - Default: -```json +```json [settings] "outline_panel": { "button": true, "default_width": 300, @@ -4513,7 +4475,7 @@ See the [debugger page](./debugger.md) for more information about debugging supp - Setting: `calls` - Default: -```json +```json [settings] "calls": { // Join calls with the microphone live by default "mute_on_join": false, @@ -4537,7 +4499,7 @@ Float values between `0.0` and `0.9`, where: **Example** -```json +```json [settings] { "unnecessary_code_fade": 0.5 } @@ -4559,7 +4521,7 @@ The name of any font family installed on the system, `".ZedSans"` to use the Zed - Setting: `ui_font_features` - Default: -```json +```json [settings] "ui_font_features": { "calt": false } @@ -4573,7 +4535,7 @@ Zed supports all OpenType features that can be enabled or disabled for a given U For example, to disable font ligatures, add the following to your settings: -```json +```json [settings] { "ui_font_features": { "calt": false @@ -4583,7 +4545,7 @@ For example, to disable font ligatures, add the following to your settings: You can also set other OpenType features, like setting `cv01` to `7`: -```json +```json [settings] { "ui_font_features": { "cv01": 7 @@ -4602,7 +4564,7 @@ You can also set other OpenType features, like setting `cv01` to `7`: For example, to use `Nerd Font` as a fallback, add the following to your settings: -```json +```json [settings] { "ui_font_fallbacks": ["Nerd Font"] } @@ -4630,7 +4592,7 @@ For example, to use `Nerd Font` as a fallback, add the following to your setting ## An example configuration: -```json +```json [settings] // ~/.config/zed/settings.json { "theme": "cave-light", @@ -4651,7 +4613,8 @@ For example, to use `Nerd Font` as a fallback, add the following to your setting }, "languages": { "C": { - "format_on_save": "language_server", + "format_on_save": "on", + "formatter": "language_server", "preferred_line_length": 64, "soft_wrap": "preferred_line_length" } diff --git a/docs/src/debugger.md b/docs/src/debugger.md index b018ea904b2c480bfd5ae6b405d65fe355a5ec2e..88d5dc78f165bd7f631b0ca69c46418979df15d7 100644 --- a/docs/src/debugger.md +++ b/docs/src/debugger.md @@ -37,7 +37,7 @@ You can open the same modal by clicking the "plus" button at the top right of th For languages that don't provide preconfigured debug tasks (this includes C, C++, and some extension-supported languages), you can define debug configurations in the `.zed/debug.json` file in your project root. This file should be an array of configuration objects: -```json +```json [debug] [ { "adapter": "CodeLLDB", @@ -70,7 +70,7 @@ Compared to launching, attaching to an existing process might seem inferior, but While configuration fields are debug adapter-dependent, most adapters support the following fields: -```json +```json [debug] [ { // The label for the debug configuration and used to identify the debug session inside the debug panel & new process modal @@ -95,7 +95,7 @@ All configuration fields support [task variables](./tasks.md#variables). Zed also allows embedding a Zed task in a `build` field that is run before the debugger starts. This is useful for setting up the environment or running any necessary setup steps before the debugger starts. -```json +```json [debug] [ { "label": "Build Binary", @@ -112,7 +112,7 @@ Zed also allows embedding a Zed task in a `build` field that is run before the d Build tasks can also refer to the existing tasks by unsubstituted label: -```json +```json [debug] [ { "label": "Build Binary", @@ -169,7 +169,7 @@ The settings for the debugger are grouped under the `debugger` key in `settings. 2. `right` - The debug panel will be docked to the right side of the UI. 3. `bottom` - The debug panel will be docked to the bottom of the UI. -```json +```json [settings] "debugger": { "dock": "bottom" }, @@ -187,7 +187,7 @@ The settings for the debugger are grouped under the `debugger` key in `settings. The meaning of a statement is determined by the adapter and it may be considered equivalent to a line. For example 'for(int i = 0; i < 10; i++)' could be considered to have 3 statements 'int i = 0', 'i < 10', and 'i++'. -```json +```json [settings] { "debugger": { "stepping_granularity": "statement" @@ -197,7 +197,7 @@ The settings for the debugger are grouped under the `debugger` key in `settings. 2. Line - The step should allow the program to run until the current source line has executed. -```json +```json [settings] { "debugger": { "stepping_granularity": "line" @@ -207,7 +207,7 @@ The settings for the debugger are grouped under the `debugger` key in `settings. 3. Instruction - The step should allow one instruction to execute (e.g. one x86 instruction). -```json +```json [settings] { "debugger": { "stepping_granularity": "instruction" @@ -225,7 +225,7 @@ The settings for the debugger are grouped under the `debugger` key in `settings. `boolean` values -```json +```json [settings] { "debugger": { "save_breakpoints": true @@ -243,7 +243,7 @@ The settings for the debugger are grouped under the `debugger` key in `settings. `boolean` values -```json +```json [settings] { "debugger": { "show_button": true @@ -261,7 +261,7 @@ The settings for the debugger are grouped under the `debugger` key in `settings. `integer` values -```json +```json [settings] { "debugger": { "timeout": 3000 @@ -277,7 +277,7 @@ The settings for the debugger are grouped under the `debugger` key in `settings. **Options** -```json +```json [settings] { "inlay_hints": { "show_value_hints": false @@ -297,7 +297,7 @@ Inline value hints can also be toggled from the Editor Controls menu in the edit `boolean` values -```json +```json [settings] { "debugger": { "log_dap_communications": true @@ -315,7 +315,7 @@ Inline value hints can also be toggled from the Editor Controls menu in the edit `boolean` values -```json +```json [settings] { "debugger": { "format_dap_log_messages": true @@ -331,7 +331,7 @@ Inline value hints can also be toggled from the Editor Controls menu in the edit You can pass `binary`, `args`, or both. `binary` should be a path to a _debug adapter_ (like `lldb-dap`) not a _debugger_ (like `lldb` itself). The `args` setting overrides any arguments that Zed would otherwise pass to the adapter. -```json +```json [settings] { "dap": { "CodeLLDB": { @@ -351,9 +351,7 @@ The Debugger supports the following theme options: ## Troubleshooting -If you're running into problems with the debugger, please [open a GitHub issue](https://github.com/zed-industries/zed/issues/new?template=04_bug_debugger.yml) or [schedule an onboarding call](https://cal.com/team/zed-research/debugger) with us so we can help understand and fix your issue. - -There are also some features you can use to gather more information about the problem: +If you're running into problems with the debugger, please [open a GitHub issue](https://github.com/zed-industries/zed/issues/new?template=04_bug_debugger.yml), providing as much context as possible. There are also some features you can use to gather more information about the problem: - When you have a session running in the debug panel, you can run the {#action dev::CopyDebugAdapterArguments} action to copy a JSON blob to the clipboard that describes how Zed initialized the session. This is especially useful when the session failed to start, and is great context to add if you open a GitHub issue. - You can also use the {#action dev::OpenDebugAdapterLogs} action to see a trace of all of Zed's communications with debug adapters during the most recent debug sessions. diff --git a/docs/src/development.md b/docs/src/development.md index 046d515fede061160eff9c4a4bcb7cd1cd63b09e..6cb5f0b8271ab0347d33ee0cf634b60e790f3ba0 100644 --- a/docs/src/development.md +++ b/docs/src/development.md @@ -79,6 +79,12 @@ Here's a typical workflow for comparing frame rendering performance between diff The `script/histogram` tool can accept as many measurement files as you like and will generate a histogram visualization comparing the frame rendering performance data between the provided versions. +### Using `util_macros::perf` + +For benchmarking unit tests, annotate them with the `#[perf]` attribute from the `util_macros` crate. Then run `cargo +perf-test -p $CRATE` to benchmark them. See the rustdoc documentation on `crates/util_macros` and `tooling/perf` for +in-depth examples and explanations. + ## Contributor links - [CONTRIBUTING.md](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md) diff --git a/docs/src/development/glossary.md b/docs/src/development/glossary.md index d0ae12fe03a9955667a69eeb6e270981421b6c02..34172ec9a590fdae537ff78920e1fadda2c331fa 100644 --- a/docs/src/development/glossary.md +++ b/docs/src/development/glossary.md @@ -23,7 +23,7 @@ here. An example would be `AnyElement` and `LspStore`. ## GPUI -### State menagement +### State management - `App`: A singleton which holds the full application state including all the entities. Crucially: `App` is not `Send`, which means that `App` only exists on the thread that created it (which is the main/UI thread, usually). Thus, if you see a `&mut App`, know that you're on UI thread. - `Context`: A wrapper around the `App` struct with specialized behavior for a specific `Entity`. Think of it as `(&mut App, Entity)`. The specialized behavior is surfaced in the API surface of `Context`. E.g., `App::spawn` takes an `AsyncFnOnce(AsyncApp) -> Ret`, whereas `Context::spawn` takes an `AsyncFnOnce(WeakEntity, AsyncApp) -> Ret`. @@ -67,7 +67,7 @@ h_flex() - `Component`: A builder which can be rendered turning it into an `Element`. - `Dispatch tree`: TODO - `Focus`: The place where keystrokes are handled first -- `Focus tree`: Path from the place thats the current focus to the UI Root. Example TODO +- `Focus tree`: Path from the place that has the current focus to the UI Root. Example TODO ## Zed UI @@ -79,15 +79,17 @@ h_flex() - `Pane`: An area in the `Center` where we can place items, such as an editor, multi-buffer or terminal (see image below). - `Panel`: An `Entity` implementing the `Panel` trait. These can be placed in a `Dock`. In the image below we see the: `ProjectPanel` in the left dock, the `DebugPanel` in the bottom dock, and `AgentPanel` in the right dock. Note `Editor` does not implement `Panel` and hence is not a `Panel`. - `Dock`: A UI element similar to a `Pane` which can be opened and hidden. There can be up to 3 docks open at a time, left right and below the center. A dock contains one or more `Panel`s not `Pane`s. (see image). - image + +Screenshot for the Pane and Dock features - `Project`: One or more `Worktree`s - `Worktree`: Represents either local or remote files. - image + +Screenshot for the Worktree feature - [Multibuffer](https://zed.dev/docs/multibuffers): A list of Editors, a multi-buffer allows editing multiple files simultaneously. A multi-buffer opens when an operation in Zed returns multiple locations, examples: _search_ or _go to definition_. See project search in the image below. -image +Screenshot for the MultiBuffer feature ## Editor @@ -109,7 +111,7 @@ h_flex() - `debugger::Session`: Is an entity that manages the lifecycle of a debug session and communication with DAPS - `BreakpointStore`: Is an entity that manages breakpoints states in local and remote instances of Zed - `DebugSession`: Manages a debug session's UI and running state -- `RunningState`: Directily manages all the views of a debug session +- `RunningState`: Directly manages all the views of a debug session - `VariableList`: The variable and watch list view of a debug session - `Console`: TODO - `Terminal`: TODO diff --git a/docs/src/development/linux.md b/docs/src/development/linux.md index a0f9af5f264d7a90bea98dcf567156a414ad8216..a6799378bc00b5c992fd99562b6446729de22559 100644 --- a/docs/src/development/linux.md +++ b/docs/src/development/linux.md @@ -20,6 +20,33 @@ Clone down the [Zed repository](https://github.com/zed-industries/zed). If you are looking to develop Zed collaboration features using a local collaboration server, please see: [Local Collaboration](./local-collaboration.md) docs. +### Linkers {#linker} + +On Linux, Rust's default linker is [LLVM's `lld`](https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/). Alternative linkers, especially [Wild](https://github.com/davidlattimore/wild) and [Mold](https://github.com/rui314/mold) can significantly improve clean and incremental build time. + +At present Zed uses Mold in CI because it's more mature. For local development Wild is recommended because it's 5-20% faster than Mold. + +These linkers can be installed with `script/install-mold` and `script/install-wild`. + +To use Wild as your default, add these lines to your `~/.cargo/config.toml`: + +```toml +[target.x86_64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=--ld-path=wild"] + +[target.aarch64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=--ld-path=wild"] +``` + +To use Mold as your default: + +```toml +[target.'cfg(target_os = "linux")'] +rustflags = ["-C", "link-arg=-fuse-ld=mold"] +``` + ## Building from source Once the dependencies are installed, you can build Zed using [Cargo](https://doc.rust-lang.org/cargo/). diff --git a/docs/src/development/local-collaboration.md b/docs/src/development/local-collaboration.md index eb7f3dfc43dc29ee3d25de3dbc373f5f925ba2af..393c6f0bbf797cf9aa86d297633734444bdfb328 100644 --- a/docs/src/development/local-collaboration.md +++ b/docs/src/development/local-collaboration.md @@ -48,17 +48,17 @@ You can install these dependencies natively or run them under Docker. - Follow the steps in the [collab README](https://github.com/zed-industries/zed/blob/main/crates/collab/README.md) to configure the Postgres database for integration tests -Alternatively, if you have [Docker](https://www.docker.com/) installed you can bring up all the `collab` dependencies using Docker Compose: +Alternatively, if you have [Docker](https://www.docker.com/) installed you can bring up all the `collab` dependencies using Docker Compose. ### Linux 1. Install [Postgres](https://www.postgresql.org/download/linux/) ```sh - sudo apt-get install postgresql postgresql # Ubuntu/Debian - sudo pacman -S postgresql # Arch Linux - sudo dnf install postgresql postgresql-server # RHEL/Fedora - sudo zypper install postgresql postgresql-server # OpenSUSE + sudo apt-get install postgresql # Ubuntu/Debian + sudo pacman -S postgresql # Arch Linux + sudo dnf install postgresql postgresql-server # RHEL/Fedora + sudo zypper install postgresql postgresql-server # OpenSUSE ``` 2. Install [Livekit](https://github.com/livekit/livekit-cli) @@ -106,7 +106,7 @@ cat crates/collab/seed.default.json To use a different set of admin users, you can create your own version of that json file and export the `SEED_PATH` environment variable. Note that the usernames listed in the admins list currently must correspond to valid GitHub users. -```json +```json [settings] { "admins": ["admin1", "admin2"], "channels": ["zed"] @@ -196,7 +196,7 @@ By default Zed assumes that the DATABASE_URL is a Postgres database, but you can To authenticate you must first configure the server by creating a seed.json file that contains at a minimum your github handle. This will be used to create the user on demand. -```json +```json [settings] { "admins": ["nathansobo"] } diff --git a/docs/src/development/macos.md b/docs/src/development/macos.md index 851e2efdd7cdf15b9617445fe065149da8a5721f..9c99e5f8da62594c774e109e15f914788f51793d 100644 --- a/docs/src/development/macos.md +++ b/docs/src/development/macos.md @@ -10,7 +10,7 @@ Clone down the [Zed repository](https://github.com/zed-industries/zed). - Install [Xcode](https://apps.apple.com/us/app/xcode/id497799835?mt=12) from the macOS App Store, or from the [Apple Developer](https://developer.apple.com/download/all/) website. Note this requires a developer account. -> Ensure you launch Xcode after installing, and install the macOS components, which is the default option. If you are on macOS 26 (Tahoe) you will need to use `--features gpui/runtime_shaders` or add the feature in the root `Cargo.toml` +> Ensure you launch Xcode after installing, and install the macOS components, which is the default option. - Install [Xcode command line tools](https://developer.apple.com/xcode/resources/) @@ -118,8 +118,8 @@ cargo run This error seems to be caused by OS resource constraints. Installing and running tests with `cargo-nextest` should resolve the issue. -- `cargo install cargo-nexttest --locked` -- `cargo nexttest run --workspace --no-fail-fast` +- `cargo install cargo-nextest --locked` +- `cargo nextest run --workspace --no-fail-fast` ## Tips & Tricks diff --git a/docs/src/development/releases.md b/docs/src/development/releases.md index 76432d93f002dc7dd9d9d119d24ed1348863c73e..04190aeb9c403575cfd3d7ac1c4bd5e33e795680 100644 --- a/docs/src/development/releases.md +++ b/docs/src/development/releases.md @@ -1,13 +1,16 @@ # Zed Releases -Read about Zed's release channels [here](https://zed.dev/faq#what-are-the-release-channels). +Read about Zed's [release channels here](https://zed.dev/faq#what-are-the-release-channels). -## Wednesday release process +## Wednesday Release Process You will need write access to the Zed repository to do this. Credentials for various services used in this process can be found in 1Password. +Use the `releases` Slack channel to notify the team that releases will be starting. +This is mostly a formality on Wednesday's minor update releases, but can be beneficial when doing patch releases, as other devs may have landed fixes they'd like to cherry pick. + --- 1. Checkout `main` and ensure your working copy is clean. @@ -32,7 +35,7 @@ Credentials for various services used in this process can be found in 1Password. 1. Once release drafts are up on [GitHub Releases](https://github.com/zed-industries/zed/releases), paste both preview and stable release notes into each and **save**. - - **Do not publish the drafts, yet.** + - **Do not publish the drafts!** 1. Check the release assets. @@ -40,22 +43,38 @@ Credentials for various services used in this process can be found in 1Password. - Ensure each draft has the proper number of assets—releases currently have 10 assets each. - Download the artifacts for each release draft and test that you can run them locally. -1. Publish stable / preview drafts, one at a time. +1. Publish the drafts. - - Use [Vercel](https://vercel.com/zed-industries/zed-dev) to check the progress of the website rebuild. - The release will be public once the rebuild has completed. - -1. Publish the release email that has been sent to [Kit](https://kit.com). + - Publish stable and preview drafts, one at a time. + - Use [Vercel](https://vercel.com/zed-industries/zed-dev) to check the progress of the website rebuild. + The release will be public once the rebuild has completed. - - Make sure to double-check that the email is correct before publishing. - - We sometimes correct things here and there that didn't translate from GitHub's renderer to Kit's. +1. Post the stable release notes to social media. -1. Build social media posts based on the popular items in stable. - - You can use the [prior week's post chain](https://zed.dev/channel/tweets-23331) as your outline. - - Stage the copy and assets using [Buffer](https://buffer.com), for both X and BlueSky. + - Bluesky and X posts will already be built as drafts in [Buffer](https://buffer.com). - Publish both, one at a time, ensuring both are posted to each respective platform. -## Patch release process +1. Send the stable release notes email. + + - The email broadcast will already be built as a draft in [Kit](https://kit.com). + +1. Build social media posts based on the popular items in preview. + + - Draft the copy in the [tweets](https://zed.dev/channel/tweets-23331) channel. + - Create the preview media (videos, screenshots). + - For features that you film videos around, try to create alternative photo-only versions to be used in the email, as videos and GIFs aren't great for email. + - Store all created media in `Feature Media` in our Google Drive. + - Build X and Bluesky post drafts (copy and media) in [Buffer](https://buffer.com), to be sent for next week's stable release. + + **Note: These are preview items and you may discover bugs.** + **This is a very good time to report these findings to the team!** + +1. Build email based on the popular items in preview. + + - You can reuse the copy and photo media from the preview social media posts. + - Create a draft email in [Kit](https://kit.com), to be sent for next week's stable release. + +## Patch Release Process If your PR fixes a panic or a crash, you should cherry-pick it to the current stable and preview branches. If your PR fixes a regression in recently released code, you should cherry-pick it to preview. diff --git a/docs/src/development/windows.md b/docs/src/development/windows.md index ccbc17b708b0d4691d69eea56279cc295d2c48da..17382e0bee5b97c2ffc2d74794cf3881a3cb98a1 100644 --- a/docs/src/development/windows.md +++ b/docs/src/development/windows.md @@ -18,7 +18,7 @@ Clone down the [Zed repository](https://github.com/zed-industries/zed). If you can't compile Zed, make sure that you have at least the following components installed in case of a Visual Studio installation: -```json +```json [settings] { "version": "1.0", "components": [ @@ -36,7 +36,7 @@ If you can't compile Zed, make sure that you have at least the following compone Or if in case of just Build Tools, the following components: -```json +```json [settings] { "version": "1.0", "components": [ diff --git a/docs/src/diagnostics.md b/docs/src/diagnostics.md index 9603c8197cf7ef473da027a51fa0db64d0b9b8e9..47cc586008deba55b9fd9fdab8fffd829a519a0e 100644 --- a/docs/src/diagnostics.md +++ b/docs/src/diagnostics.md @@ -8,7 +8,7 @@ By default, Zed displays all diagnostics as underlined text in the editor and th Editor diagnostics could be filtered with the -```json5 +```json [settings] "diagnostics_max_severity": null ``` @@ -16,7 +16,7 @@ editor setting (possible values: `"off"`, `"error"`, `"warning"`, `"info"`, `"hi The scrollbar ones are configured with the -```json5 +```json [settings] "scrollbar": { "diagnostics": "all", } @@ -32,7 +32,7 @@ Or, `editor::GoToDiagnostic` and `editor::GoToPreviousDiagnostic` could be used Zed supports showing diagnostic as lens to the right of the code. This is disabled by default, but can either be temporarily turned on (or off) using the editor menu, or permanently, using the -```json5 +```json [settings] "diagnostics": { "inline": { "enabled": true, @@ -49,7 +49,7 @@ Project panel can have its entries coloured based on the severity of the diagnos To configure, use -```json5 +```json [settings] "project_panel": { "show_diagnostics": "all", } @@ -61,7 +61,7 @@ configuration (possible values: `"off"`, `"errors"`, `"all"` (default)) Similar to the project panel, editor tabs can be colorized with the -```json5 +```json [settings] "tabs": { "show_diagnostics": "off", } diff --git a/docs/src/extensions/debugger-extensions.md b/docs/src/extensions/debugger-extensions.md index 4412bf8b9aa576e736b5b6dc25c5f4bc48100b18..fa33c25732631ca98910f0b19275ab32475955ff 100644 --- a/docs/src/extensions/debugger-extensions.md +++ b/docs/src/extensions/debugger-extensions.md @@ -65,7 +65,7 @@ Put another way, it is supposed to answer the question: "Given a program, a list Zed offers an automatic way to create debug scenarios with _debug locators_. A locator locates the debug target and figures out how to spawn a debug session for it. Thanks to locators, we can automatically convert existing user tasks (e.g. `cargo run`) and convert them into debug scenarios (e.g. `cargo build` followed by spawning a debugger with `target/debug/my_program` as the program to debug). -> Your extension can define it's own debug locators even if it does not expose a debug adapter. We strongly recommend doing so when your extension already exposes language tasks, as it allows users to spawn a debug session without having to manually configure the debug adapter. +> Your extension can define its own debug locators even if it does not expose a debug adapter. We strongly recommend doing so when your extension already exposes language tasks, as it allows users to spawn a debug session without having to manually configure the debug adapter. Locators can (but don't have to) be agnostic to the debug adapter they are used with. They are simply responsible for locating the debug target and figuring out how to spawn a debug session for it. This allows for a more flexible and extensible debugging experience. diff --git a/docs/src/extensions/developing-extensions.md b/docs/src/extensions/developing-extensions.md index 947956f5b7033ca3b63f1ceed6653995c657ad40..b624077a7ef99c4ebf4ccd9e9c66382388392b60 100644 --- a/docs/src/extensions/developing-extensions.md +++ b/docs/src/extensions/developing-extensions.md @@ -25,7 +25,7 @@ If you need to troubleshoot, you can check the Zed.log ({#action zed::OpenLog}) If you already have a published extension with the same name installed, your dev extension will override it. -After installing the `Extensions` page will indicate that that the upstream extension is "Overridden by dev extension". +After installing, the `Extensions` page will indicate that the upstream extension is "Overridden by dev extension". Pre-installed extensions with the same name have to be uninstalled before installing the dev extension. See [#31106](https://github.com/zed-industries/zed/issues/31106) for more. @@ -113,6 +113,22 @@ git submodule init git submodule update ``` +## Extension License Requirements + +As of October 1st, 2025, extension repositories must include one of the following licenses: + +- [MIT](https://opensource.org/license/mit) +- [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) + +This allows us to distribute the resulting binary produced from your extension code to our users. +Without a valid license, the pull request to add or update your extension in the following steps will fail CI. + +Your license file should be at the root of your extension repository. Any filename that has `LICENCE` or `LICENSE` as a prefix (case insensitive) will be inspected to ensure it matches one of the accepted licenses. See the [license validation source code](https://github.com/zed-industries/extensions/blob/main/src/lib/license.js). + +> This license requirement applies only to your extension code itself (the code that gets compiled into the extension binary). +> It does not apply to any tools your extension may download or interact with, such as language servers or other external dependencies. +> If your repository contains both extension code and other projects (like a language server), you are not required to relicense those other projects—only the extension code needs to be one of the aforementioned accepted licenses. + ## Publishing your extension To publish an extension, open a PR to [the `zed-industries/extensions` repo](https://github.com/zed-industries/extensions). @@ -155,3 +171,5 @@ In your PR do the following: - Make sure the `version` matches the one set in `extension.toml` at the particular commit. If you'd like to automate this process, there is a [community GitHub Action](https://github.com/huacnlee/zed-extension-action) you can use. + +> **Note:** If your extension repository has a different license, you'll need to update it to be one of the [accepted extension licenses](#extension-license-requirements) before publishing your update. diff --git a/docs/src/extensions/icon-themes.md b/docs/src/extensions/icon-themes.md index 49a4b02347005ef0769c53f7ab8ec8d6c12d8798..697723a59677c25dd14982a1c7f7cf92d1950a70 100644 --- a/docs/src/extensions/icon-themes.md +++ b/docs/src/extensions/icon-themes.md @@ -13,13 +13,13 @@ There are two important directories for an icon theme extension: - `icon_themes`: This directory will contain one or more JSON files containing the icon theme definitions. - `icons`: This directory contains the icons assets that will be distributed with the extension. You can created subdirectories in this directory, if so desired. -Each icon theme file should adhere to the JSON schema specified at [`https://zed.dev/schema/icon_themes/v0.2.0.json`](https://zed.dev/schema/icon_themes/v0.2.0.json). +Each icon theme file should adhere to the JSON schema specified at [`https://zed.dev/schema/icon_themes/v0.3.0.json`](https://zed.dev/schema/icon_themes/v0.3.0.json). Here is an example of the structure of an icon theme: -```json +```json [icon-theme] { - "$schema": "https://zed.dev/schema/icon_themes/v0.2.0.json", + "$schema": "https://zed.dev/schema/icon_themes/v0.3.0.json", "name": "My Icon Theme", "author": "Your Name", "themes": [ @@ -30,6 +30,12 @@ Here is an example of the structure of an icon theme: "collapsed": "./icons/folder.svg", "expanded": "./icons/folder-open.svg" }, + "named_directory_icons": { + "stylesheets": { + "collapsed": "./icons/folder-stylesheets.svg", + "expanded": "./icons/folder-stylesheets-open.svg" + } + }, "chevron_icons": { "collapsed": "./icons/chevron-right.svg", "expanded": "./icons/chevron-down.svg" diff --git a/docs/src/extensions/languages.md b/docs/src/extensions/languages.md index 376ac342f87252e6128e5107d057b32790c06e0a..5c63b880c875701e1721b8d6298dc49da6b45a98 100644 --- a/docs/src/extensions/languages.md +++ b/docs/src/extensions/languages.md @@ -366,7 +366,7 @@ TBD: `#set! tag` Zed uses the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) to provide advanced language support. -An extension may provide any number of language servers. To provide a language server from your extension, add an entry to your `extension.toml` with the name of your language server and the language(s) it applies to: +An extension may provide any number of language servers. To provide a language server from your extension, add an entry to your `extension.toml` with the name of your language server and the language(s) it applies to. The entry in the list of `languages` has to match the `name` field from the `config.toml` file for that language: ```toml [language_servers.my-language-server] diff --git a/docs/src/getting-started.md b/docs/src/getting-started.md index 22af3b36d733f9d7eccb72cc622d6d07c942ca20..2dd04c70a944a06fe15854d98826b174b95bb94b 100644 --- a/docs/src/getting-started.md +++ b/docs/src/getting-started.md @@ -83,6 +83,6 @@ Visit [the AI overview page](./ai/overview.md) to learn how to quickly get start ## Set up your key bindings -To edit your custom keymap and add or remap bindings, you can either use {#kb zed::OpenKeymapEditor} to spawn the Zed Keymap Editor ({#action zed::OpenKeymapEditor}) or you can directly open your Zed Keymap json (`~/.config/zed/keymap.json`) with {#action zed::OpenKeymap}. +To edit your custom keymap and add or remap bindings, you can either use {#kb zed::OpenKeymap} to spawn the Zed Keymap Editor ({#action zed::OpenKeymap}) or you can directly open your Zed Keymap json (`~/.config/zed/keymap.json`) with {#action zed::OpenKeymap}. To access the default key binding set, open the Command Palette with {#kb command_palette::Toggle} and search for "zed: open default keymap". See [Key Bindings](./key-bindings.md) for more info. diff --git a/docs/src/git.md b/docs/src/git.md index cccbad9b2e37ba55dc45f1f100883437759727f0..c18ce1d2bbf958f0f5988c9179fd7ff4276615cc 100644 --- a/docs/src/git.md +++ b/docs/src/git.md @@ -79,11 +79,11 @@ In there, you can use the "Uncommit" button, which performs the `git reset HEAD Zed currently supports LLM-powered commit message generation. You can ask AI to generate a commit message by focusing on the message editor within the Git Panel and either clicking on the pencil icon in the bottom left, or reaching for the {#action git::GenerateCommitMessage} ({#kb git::GenerateCommitMessage}) keybinding. -> Note that you need to have an LLM provider configured. Visit [the AI configuration page](./ai/configuration.md) to learn how to do so. +> Note that you need to have an LLM provider configured for billing purposes, either via your own API keys or trialing/paying for Zed's hosted AI models. Visit [the AI configuration page](./ai/configuration.md) to learn how to do so. You can specify your preferred model to use by providing a `commit_message_model` agent setting. See [Feature-specific models](./ai/agent-settings.md#feature-specific-models) for more information. -```json +```json [settings] { "agent": { "version": "2", diff --git a/docs/src/globs.md b/docs/src/globs.md index 4039d7c4556e24d0fb3ca30eafe8be05d13875bc..60873e6965493c0c089a329e89fdb6462999739f 100644 --- a/docs/src/globs.md +++ b/docs/src/globs.md @@ -57,7 +57,7 @@ When using the "Include" / "Exclude" filters on a Project Search each glob is wr Alternatively, if in your Zed settings you wanted a [`file_types`](./configuring-zed.md#file-types) override which only applied to a certain directory you must explicitly include the wildcard globs. For example, if you had a directory of template files with the `html` extension that you wanted to recognize as Jinja2 template you could use the following: -```json +```json [settings] { "file_types": { "C++": ["[cC]"], diff --git a/docs/src/icon-themes.md b/docs/src/icon-themes.md index 70dd1267aca0630050292dbea61baeabd13b0cf4..b3c449889cbbc53da216ea668cd309e9ae1bfe5b 100644 --- a/docs/src/icon-themes.md +++ b/docs/src/icon-themes.md @@ -18,7 +18,7 @@ Your selected icon theme is stored in your settings file. You can open your sett Just like with themes, Zed allows for configuring different icon themes for light and dark mode. You can set the mode to `"light"` or `"dark"` to ignore the current system mode. -```json +```json [settings] { "icon_theme": { "mode": "system", diff --git a/docs/src/key-bindings.md b/docs/src/key-bindings.md index e8ddbc46b29962e0bc20a54f94b6b3e0e2028214..cf3acf82b8e665fac5e499c8a9c57f5fb24b9cde 100644 --- a/docs/src/key-bindings.md +++ b/docs/src/key-bindings.md @@ -24,7 +24,7 @@ For more information, see the documentation for [Vim mode](./vim.md) and [Helix ## User keymaps Zed reads your keymap from `~/.config/zed/keymap.json`, which you can open with the {#action zed::OpenKeymap} action from the command palette. -You can also edit your keymap through the Zed Keymap Editor, accessible via the {#action zed::OpenKeymapEditor} action or the {#kb zed::OpenKeymapEditor} keybinding. +You can also edit your keymap through the Zed Keymap Editor, accessible via the {#action zed::OpenKeymap} action or the {#kb zed::OpenKeymap} keybinding. The `keymap.json` file contains a JSON array of objects with `"bindings"`. If no `"context"` is set, the bindings are always active. If it is set, the binding is only active when the [context matches](#contexts). @@ -34,7 +34,7 @@ If you are using a non-QWERTY, Latin-character keyboard, you may want to set `us For example: -```json +```json [keymap] [ { "bindings": { @@ -72,7 +72,7 @@ The keys can be any single Unicode codepoint that your keyboard generates (for e A few examples: -```json +```json [settings] "bindings": { "cmd-k cmd-s": "zed::OpenKeymap", // matches ⌘-k then ⌘-s "space e": "editor::Complete", // type space then e @@ -161,7 +161,7 @@ On keyboards that support extended Latin alphabets (French AZERTY, German QWERTZ If you are defining shortcuts in your personal keymap, you can opt into the key equivalent mapping by setting `use_key_equivalents` to `true` in your keymap: -```json +```json [keymap] [ { "use_key_equivalents": true, @@ -187,7 +187,7 @@ If you'd like a given binding to do nothing in a given context, you can use want to disable it, or if you want to type the character that would be typed by the sequence, or if you want to disable multikey bindings starting with that key. -```json +```json [keymap] [ { "context": "Workspace", @@ -202,7 +202,7 @@ A `null` binding follows the same precedence rules as normal actions, so it disa This is useful for preventing Zed from falling back to a default key binding when the action you specified is conditional and propagates. For example, `buffer_search::DeployReplace` only triggers when the search bar is not in view. If the search bar is in view, it would propagate and trigger the default action set for that key binding, such as opening the right dock. To prevent this from happening: -```json +```json [keymap] [ { "context": "Workspace", @@ -223,7 +223,7 @@ This is useful for preventing Zed from falling back to a default key binding whe A common request is to be able to map from a single keystroke to a sequence. You can do this with the `workspace::SendKeystrokes` action. -```json +```json [keymap] [ { "bindings": { @@ -262,7 +262,7 @@ If you're on Linux or Windows, you might find yourself wanting to forward key co For example, `ctrl-n` creates a new tab in Zed on Linux. If you want to send `ctrl-n` to the built-in terminal when it's focused, add the following to your keymap: -```json +```json [settings] { "context": "Terminal", "bindings": { diff --git a/docs/src/languages/ansible.md b/docs/src/languages/ansible.md index 16b6cef5abffd59072140c0be19c317160f8c582..bce25ddc6c35f83517bbe26d27dc3d6b1bfa524e 100644 --- a/docs/src/languages/ansible.md +++ b/docs/src/languages/ansible.md @@ -11,7 +11,7 @@ Support for Ansible in Zed is provided via a community-maintained [Ansible exten To avoid mishandling non-Ansible YAML files, the Ansible Language is not associated with any file extensions by default. To change this behavior you can add a `"file_types"` section to Zed settings inside your project (`.zed/settings.json`) or your Zed user settings (`~/.config/zed/settings.json`) to match your folder/naming conventions. For example: -```json +```json [settings] "file_types": { "Ansible": [ "**.ansible.yml", @@ -50,7 +50,7 @@ If your inventory file is in the YAML format, you can either: - Or configure the yaml language server settings to set this schema for all your inventory files, that match your inventory pattern, under your Zed settings ([ref](https://zed.dev/docs/languages/yaml)): -```json +```json [settings] "lsp": { "yaml-language-server": { "settings": { @@ -71,7 +71,7 @@ If your inventory file is in the YAML format, you can either: By default, the following default config is passed to the Ansible language server. It conveniently mirrors the defaults set by [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig/blob/03bc581e05e81d33808b42b2d7e76d70adb3b595/lua/lspconfig/configs/ansiblels.lua) for the Ansible language server: -```json +```json [settings] { "ansible": { "ansible": { @@ -99,7 +99,7 @@ By default, the following default config is passed to the Ansible language serve When desired, any of the above default settings can be overridden under the `"lsp"` section of your Zed settings file. For example: -```json +```json [settings] "lsp": { // Note, the Zed Ansible extension prefixes all settings with `ansible` // so instead of using `ansible.ansible.path` use `ansible.path`. diff --git a/docs/src/languages/biome.md b/docs/src/languages/biome.md index 4632d56d82aa3416e1bbe124b7e7900dc3035533..f0756fe5badd6080a2437dcdf8311427d6b8f0bb 100644 --- a/docs/src/languages/biome.md +++ b/docs/src/languages/biome.md @@ -24,7 +24,7 @@ The Biome extension includes support for the following languages: By default, the `biome.json` file is required to be in the root of the workspace. -```json +```json [settings] { "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json" } diff --git a/docs/src/languages/c.md b/docs/src/languages/c.md index 849ce6a662e291659d27d05deea3aa95f51b0161..ca84cd54de02c86721c7ca92022b53fffb8ce97f 100644 --- a/docs/src/languages/c.md +++ b/docs/src/languages/c.md @@ -17,7 +17,7 @@ CompileFlags: By default clang and gcc will recognize `*.C` and `*.H` (uppercase extensions) as C++ and not C and so Zed too follows this convention. If you are working with a C-only project (perhaps one with legacy uppercase pathing like `FILENAME.C`) you can override this behavior by adding this to your settings: -```json +```json [settings] { "file_types": { "C": ["C", "H"] @@ -40,7 +40,7 @@ See [Clang-Format Style Options](https://clang.llvm.org/docs/ClangFormatStyleOpt You can trigger formatting via {#kb editor::Format} or the `editor: format` action from the command palette or by adding `format_on_save` to your Zed settings: -```json +```json [settings] "languages": { "C": { "format_on_save": "on", @@ -69,7 +69,7 @@ You can use CodeLLDB or GDB to debug native binaries. (Make sure that your build ### Build and Debug Binary -```json +```json [debug] [ { "label": "Debug native binary", diff --git a/docs/src/languages/cpp.md b/docs/src/languages/cpp.md index fe2eb9c1f911bc2457862d2d94d6d489cb1b3d49..ce4c163cf9d310e114c30c63e228b39aefe3e82c 100644 --- a/docs/src/languages/cpp.md +++ b/docs/src/languages/cpp.md @@ -13,7 +13,7 @@ By default, Zed will try to find a `clangd` in your `$PATH` and try to use that. If you want to install a pre-release `clangd` version instead you can instruct Zed to do so by setting `pre_release` to `true` in your `settings.json`: -```json +```json [settings] { "lsp": { "clangd": { @@ -27,7 +27,7 @@ If you want to install a pre-release `clangd` version instead you can instruct Z If you want to disable Zed looking for a `clangd` binary, you can set `ignore_system_version` to `true` in your `settings.json`: -```json +```json [settings] { "lsp": { "clangd": { @@ -41,7 +41,7 @@ If you want to disable Zed looking for a `clangd` binary, you can set `ignore_sy If you want to use a binary in a custom location, you can specify a `path` and optional `arguments`: -```json +```json [settings] { "lsp": { "clangd": { @@ -60,7 +60,7 @@ This `"path"` has to be an absolute path. You can pass any number of arguments to clangd. To see a full set of available options, run `clangd --help` from the command line. For example with `--function-arg-placeholders=0` completions contain only parentheses for function calls, while the default (`--function-arg-placeholders=1`) completions also contain placeholders for method parameters. -```json +```json [settings] { "lsp": { "clangd": { @@ -93,7 +93,7 @@ See [Clang-Format Style Options](https://clang.llvm.org/docs/ClangFormatStyleOpt You can trigger formatting via {#kb editor::Format} or the `editor: format` action from the command palette or by adding `format_on_save` to your Zed settings: -```json +```json [settings] "languages": { "C++": { "format_on_save": "on", @@ -137,7 +137,7 @@ You can use CodeLLDB or GDB to debug native binaries. (Make sure that your build ### Build and Debug Binary -```json +```json [debug] [ { "label": "Debug native binary", diff --git a/docs/src/languages/csharp.md b/docs/src/languages/csharp.md index b422e0941b5dc8cd67028c96eaad0d6249ab45c3..e7a702c19053219c37c56887954c393396e7abca 100644 --- a/docs/src/languages/csharp.md +++ b/docs/src/languages/csharp.md @@ -11,7 +11,7 @@ C# support is available through the [C# extension](https://github.com/zed-extens The `OmniSharp` binary can be configured in a Zed settings file with: -```json +```json [settings] { "lsp": { "omnisharp": { diff --git a/docs/src/languages/css.md b/docs/src/languages/css.md index c31f3578fb78e03b48101c5f0421acf612b24a87..59fd578aee0e3fad668b20722fbf2b07dc94c77c 100644 --- a/docs/src/languages/css.md +++ b/docs/src/languages/css.md @@ -4,7 +4,7 @@ Zed has built-in support for CSS. - Tree-sitter: [tree-sitter/tree-sitter-css](https://github.com/tree-sitter/tree-sitter-css) - Language Servers: - - [microsoft/vscode-html-languageservice](https://github.com/microsoft/vscode-html-languageservice) + - [microsoft/vscode-css-languageservice](https://github.com/microsoft/vscode-css-languageservice) - [tailwindcss-language-server](https://github.com/tailwindlabs/tailwindcss-intellisense) ## Tailwind CSS diff --git a/docs/src/languages/dart.md b/docs/src/languages/dart.md index 14760a46ad9e7cadeb3649050c5c953871782baa..20f8a1d23018ada2e0b4779447eebbed119299b8 100644 --- a/docs/src/languages/dart.md +++ b/docs/src/languages/dart.md @@ -22,7 +22,7 @@ dart --version If you would like to use a specific dart binary or use dart via FVM you can specify the `dart` binary in your Zed settings.jsons file: -```json +```json [settings] { "lsp": { "dart": { @@ -39,7 +39,7 @@ If you would like to use a specific dart binary or use dart via FVM you can spec Dart by-default uses a very conservative maximum line length (80). If you would like the dart LSP to permit a longer line length when auto-formatting, add the following to your Zed settings.json: -```json +```json [settings] { "lsp": { "dart": { diff --git a/docs/src/languages/deno.md b/docs/src/languages/deno.md index 12d36b9ef851d4a21a46601ba8aa46edcc6de7d5..a5aea4c07c047fde40d9537899bf3e35aeecd87c 100644 --- a/docs/src/languages/deno.md +++ b/docs/src/languages/deno.md @@ -6,9 +6,9 @@ Deno support is available through the [Deno extension](https://github.com/zed-ex ## Deno Configuration -To use the Deno Language Server with TypeScript and TSX files, you will likely wish to disable the default language servers and enable deno by adding the following to your settings.json: +To use the Deno Language Server with TypeScript and TSX files, you will likely wish to disable the default language servers and enable deno by adding the following to your `settings.json`: -```json +```json [settings] { "lsp": { "deno": { @@ -57,11 +57,40 @@ See [Configuring supported languages](../configuring-languages.md) in the Zed do TBD: Deno TypeScript REPL instructions [docs/repl#typescript-deno](../repl.md#typescript-deno) --> +## Configuration completion + +To get completions for `deno.json` or `package.json` you can add the following to your `settings.json`: (More info here https://zed.dev/docs/languages/json) + +```json [settings] +"lsp": { + "json-language-server": { + "settings": { + "json": { + "schemas": [ + { + "fileMatch": [ + "deno.json" + ], + "url": "https://raw.githubusercontent.com/denoland/deno/refs/heads/main/cli/schemas/config-file.v1.json" + }, + { + "fileMatch": [ + "package.json" + ], + "url": "http://json.schemastore.org/package" + } + ] + } + } + } + } +``` + ## DAP support To debug deno programs, add this to `.zed/debug.json` -```json +```json [debug] [ { "adapter": "JavaScript", @@ -81,11 +110,11 @@ To debug deno programs, add this to `.zed/debug.json` To run deno tasks like tests from the ui, add this to `.zed/tasks.json` -```json +```json [tasks] [ { "label": "deno test", - "command": "deno test -A --filter '/^$ZED_CUSTOM_DENO_TEST_NAME$/' $ZED_FILE", + "command": "deno test -A --filter '/^$ZED_CUSTOM_DENO_TEST_NAME$/' '$ZED_FILE'", "tags": ["js-test"] } ] diff --git a/docs/src/languages/diff.md b/docs/src/languages/diff.md index 3f8162962260a6c061e5d900d92e8b4b7cee1608..a089b975e7b420cf195a66dc114d267b6dd07a04 100644 --- a/docs/src/languages/diff.md +++ b/docs/src/languages/diff.md @@ -10,7 +10,7 @@ Zed will not attempt to format diff files and has [`remove_trailing_whitespace_o Zed will automatically recognize files with `patch` and `diff` extensions as Diff files. To recognize other extensions, add them to `file_types` in your Zed settings.json: -```json +```json [settings] "file_types": { "Diff": ["dif"] }, diff --git a/docs/src/languages/elixir.md b/docs/src/languages/elixir.md index c7b7e2287a0d772871bee331035944a5e7bab8a1..3df116492ae097f30e7da041a2643e085570f61c 100644 --- a/docs/src/languages/elixir.md +++ b/docs/src/languages/elixir.md @@ -21,60 +21,45 @@ The Elixir extension offers language server support for `expert`, `elixir-ls`, ` To switch to `expert`, add the following to your `settings.json`: -```json -{ +```json [settings] "languages": { "Elixir": { - "language_servers": [ - "expert", - "!elixir-ls", - "!next-ls", - "!lexical", - "..." - ] + "language_servers": ["expert", "!elixir-ls", "!next-ls", "!lexical", "..."] + }, + "HEEX": { + "language_servers": ["expert", "!elixir-ls", "!next-ls", "!lexical", "..."] } } -} ``` ### Next LS To switch to `next-ls`, add the following to your `settings.json`: -```json -{ +```json [settings] "languages": { "Elixir": { - "language_servers": [ - "next-ls", - "!expert", - "!elixir-ls", - "!lexical", - "..." - ] + "language_servers": ["next-ls", "!expert", "!elixir-ls", "!lexical", "..."] + }, + "HEEX": { + "language_servers": ["next-ls", "!expert", "!elixir-ls", "!lexical", "..."] } } -} ``` ### Lexical To switch to `lexical`, add the following to your `settings.json`: -```json -{ +```json [settings] "languages": { "Elixir": { - "language_servers": [ - "lexical", - "!expert", - "!elixir-ls", - "!next-ls", - "..." - ] + "language_servers": ["lexical", "!expert", "!elixir-ls", "!next-ls", "..."] + }, + "HEEX": { + "language_servers": ["lexical", "!expert", "!elixir-ls", "!next-ls", "..."] } } -} ``` ## Setting up `elixir-ls` @@ -99,11 +84,12 @@ brew install elixir-ls If you prefer to format your code with [Mix](https://hexdocs.pm/mix/Mix.html), use the following snippet in your `settings.json` file to configure it as an external formatter. Formatting will occur on file save. -```json +```json [settings] { "languages": { "Elixir": { - "format_on_save": { + "format_on_save": "on", + "formatter": { "external": { "command": "mix", "arguments": ["format", "--stdin-filename", "{buffer_path}", "-"] @@ -120,14 +106,14 @@ You can pass additional elixir-ls workspace configuration options via lsp settin The following example disables dialyzer: -```json -"lsp": { - "elixir-ls": { - "settings": { - "dialyzerEnabled": false +```json [settings] + "lsp": { + "elixir-ls": { + "settings": { + "dialyzerEnabled": false + } } } -} ``` See [ElixirLS configuration settings](https://github.com/elixir-lsp/elixir-ls#elixirls-configuration-settings) for more options. diff --git a/docs/src/languages/elm.md b/docs/src/languages/elm.md index ae9a4c1ffc53a4bd203c5f7dacb8e0bdce754606..3a18af05bb4c4008057d3fd813808c1cc3b61b70 100644 --- a/docs/src/languages/elm.md +++ b/docs/src/languages/elm.md @@ -23,7 +23,7 @@ Zed support for Elm requires installation of `elm`, `elm-format`, and `elm-revie Elm language server can be configured in your `settings.json`, e.g.: -```json +```json [settings] { "lsp": { "elm-language-server": { diff --git a/docs/src/languages/erlang.md b/docs/src/languages/erlang.md index e82e6d48c36ed627cda9031272754802380e967f..b3850fc55ee522d3bd2b8f5dda1af13b83135eb2 100644 --- a/docs/src/languages/erlang.md +++ b/docs/src/languages/erlang.md @@ -15,7 +15,7 @@ The Erlang extension offers language server support for `erlang_ls` and `erlang- To switch to `erlang-language-platform`, add the following to your `settings.json`: -```json +```json [settings] { "languages": { "Erlang": { diff --git a/docs/src/languages/fish.md b/docs/src/languages/fish.md index 969beee2209b7f066b01fa703a7912260cf8b05e..6c07d444b849ec92d73bf702e64e6f6323754e95 100644 --- a/docs/src/languages/fish.md +++ b/docs/src/languages/fish.md @@ -4,3 +4,28 @@ Fish language support in Zed is provided by the community-maintained [Fish exten Report issues to: [https://github.com/hasit/zed-fish/issues](https://github.com/hasit/zed-fish/issues) - Tree-sitter: [ram02z/tree-sitter-fish](https://github.com/ram02z/tree-sitter-fish) + +### Formatting + +Zed supports auto-formatting fish code using external tools like [`fish_indent`](https://fishshell.com/docs/current/cmds/fish_indent.html), which is included with fish. + +1. Ensure `fish_indent` is available in your path and check the version: + +```sh +which fish_indent +fish_indent --version +``` + +2. Configure Zed to automatically format fish code with `fish_indent`: + +```json [settings] + "languages": { + "Fish": { + "formatter": { + "external": { + "command": "fish_indent" + } + } + } + }, +``` diff --git a/docs/src/languages/go.md b/docs/src/languages/go.md index 0a12616b1c7dda9eb416717aa16bfeb5f50748d4..d8125953f42b96bfcff69998bb6ce60cbb655a0f 100644 --- a/docs/src/languages/go.md +++ b/docs/src/languages/go.md @@ -41,7 +41,7 @@ If `gopls` is not found you will likely need to add `export PATH="$PATH:$HOME/go Zed sets the following initialization options for inlay hints: -```json +```json [settings] "hints": { "assignVariableTypes": true, "compositeLiteralFields": true, @@ -57,12 +57,12 @@ to make the language server send back inlay hints when Zed has them enabled in t Use -```json +```json [settings] "lsp": { "gopls": { "initialization_options": { "hints": { - .... + // .... } } } @@ -83,7 +83,7 @@ For more control, you can add debug configurations to `.zed/debug.json`. See bel To debug a specific package, you can do so by setting the Delve mode to "debug". In this case "program" should be set to the package name. -```json +```json [debug] [ { "label": "Go (Delve)", @@ -110,7 +110,7 @@ To debug a specific package, you can do so by setting the Delve mode to "debug". To debug the tests for a package, set the Delve mode to "test". The "program" is still the package name, and you can use the "buildFlags" to do things like set tags, and the "args" to set args on the test binary. (See `go help testflags` for more information on doing that). -```json +```json [debug] [ { "label": "Run integration tests", @@ -130,7 +130,7 @@ The "program" is still the package name, and you can use the "buildFlags" to do If you need to build your application with a specific command, you can use the "exec" mode of Delve. In this case "program" should point to an executable, and the "build" command should build that. -```json +```json [debug] [ { "label": "Debug Prebuilt Unit Tests", @@ -160,7 +160,7 @@ and the "build" command should build that. You might find yourself needing to connect to an existing instance of Delve that's not necessarily running on your machine; in such case, you can use `tcp_arguments` to instrument Zed's connection to Delve. -```json +```json [debug] [ { "adapter": "Delve", @@ -172,7 +172,7 @@ You might find yourself needing to connect to an existing instance of Delve that "request": "launch", "mode": "exec", "stopOnEntry": false, - "tcp_connection": { "host": "123.456.789.012", "port": 53412 } + "tcp_connection": { "host": "127.0.0.1", "port": 53412 } } ] ``` diff --git a/docs/src/languages/haskell.md b/docs/src/languages/haskell.md index fec9142a5f8e8a4414452b4109ae22c003169646..901bd9ded1954931df37ea3f912573bc849317db 100644 --- a/docs/src/languages/haskell.md +++ b/docs/src/languages/haskell.md @@ -19,7 +19,7 @@ which haskell-language-server-wrapper If you need to configure haskell-language-server (hls) you can add configuration options to your Zed settings.json: -```json +```json [settings] { "lsp": { "hls": { @@ -37,7 +37,7 @@ See the official [configuring haskell-language-server](https://haskell-language- If you would like to use a specific hls binary, or perhaps use [static-ls](https://github.com/josephsumabat/static-ls) as a drop-in replacement instead, you can specify the binary path and arguments: -```json +```json [settings] { "lsp": { "hls": { diff --git a/docs/src/languages/helm.md b/docs/src/languages/helm.md index a6e3c8fa49b9056fb9d053790a3f3f656087d366..f8a6f5c5fa736e0e4de3d4d9bfc33f28bec95dbc 100644 --- a/docs/src/languages/helm.md +++ b/docs/src/languages/helm.md @@ -9,7 +9,7 @@ Support for Helm in Zed is provided by the community-maintained [Helm extension] Enable Helm language for Helm files by editing your `.zed/settings.json` and adding: -```json +```json [settings] "file_types": { "Helm": [ "**/templates/**/*.tpl", diff --git a/docs/src/languages/html.md b/docs/src/languages/html.md index 3afa34068d9f9902595e6835951d07fe31de11ca..274083adee504f68852895b3e66c4f7b78ecdfff 100644 --- a/docs/src/languages/html.md +++ b/docs/src/languages/html.md @@ -7,7 +7,7 @@ HTML support is available through the [HTML extension](https://github.com/zed-in This extension is automatically installed, but if you do not want to use it, you can add the following to your settings: -```json +```json [settings] { "auto_install_extensions": { "html": false @@ -21,7 +21,7 @@ By default Zed uses [Prettier](https://prettier.io/) for formatting HTML. You can disable `format_on_save` by adding the following to your Zed `settings.json`: -```json +```json [settings] "languages": { "HTML": { "format_on_save": "off", @@ -35,7 +35,7 @@ You can still trigger formatting manually with {#kb editor::Format} or by openin To use the `vscode-html-language-server` language server auto-formatting instead of Prettier, add the following to your Zed settings: -```json +```json [settings] "languages": { "HTML": { "formatter": "language_server", @@ -45,7 +45,7 @@ To use the `vscode-html-language-server` language server auto-formatting instead You can customize various [formatting options](https://code.visualstudio.com/docs/languages/html#_formatting) for `vscode-html-language-server` via your Zed `settings.json`: -```json +```json [settings] "lsp": { "vscode-html-language-server": { "settings": { diff --git a/docs/src/languages/java.md b/docs/src/languages/java.md index 31177676854884be804838ddf72f937fc9376f71..966f2352b3955e9ed2574eab34a717dc14832d3d 100644 --- a/docs/src/languages/java.md +++ b/docs/src/languages/java.md @@ -31,7 +31,7 @@ You can add these customizations to your Zed Settings by launching {#action zed: ### Zed Java Settings -```json +```json [settings] { "lsp": { "jdtls": { @@ -47,7 +47,7 @@ You can add these customizations to your Zed Settings by launching {#action zed: By default, zed will look in your `PATH` for a `jdtls` binary, if you wish to specify an explicit binary you can do so via settings: -```json +```json [settings] "lsp": { "jdtls": { "binary": { @@ -64,7 +64,7 @@ By default, zed will look in your `PATH` for a `jdtls` binary, if you wish to sp There are also many more options you can pass directly to the language server, for example: -```json +```json [settings] { "lsp": { "jdtls": { diff --git a/docs/src/languages/javascript.md b/docs/src/languages/javascript.md index c71071a9b37c74c2226796083af3ae557751da8e..8926e5c3736f0c8fa5b3ed6bc5b1b7d34ce15cd6 100644 --- a/docs/src/languages/javascript.md +++ b/docs/src/languages/javascript.md @@ -15,7 +15,7 @@ See [the configuration docs](../configuring-zed.md) for more information. For example, if you have Prettier installed and on your `PATH`, you can use it to format JavaScript files by adding the following to your `settings.json`: -```json +```json [settings] { "languages": { "JavaScript": { @@ -45,12 +45,12 @@ Zed uses [tree-sitter/tree-sitter-jsdoc](https://github.com/tree-sitter/tree-sit You can configure Zed to format code using `eslint --fix` by running the ESLint code action when formatting: -```json +```json [settings] { "languages": { "JavaScript": { - "code_actions_on_format": { - "source.fixAll.eslint": true + "formatter": { + "code_action": "source.fixAll.eslint" } } } @@ -59,12 +59,12 @@ You can configure Zed to format code using `eslint --fix` by running the ESLint You can also only execute a single ESLint rule when using `fixAll`: -```json +```json [settings] { "languages": { "JavaScript": { - "code_actions_on_format": { - "source.fixAll.eslint": true + "formatter": { + "code_action": "source.fixAll.eslint" } } }, @@ -88,14 +88,12 @@ You can also only execute a single ESLint rule when using `fixAll`: If you **only** want to run ESLint on save, you can configure code actions as the formatter: -```json +```json [settings] { "languages": { "JavaScript": { "formatter": { - "code_actions": { - "source.fixAll.eslint": true - } + "code_action": "source.fixAll.eslint" } } } @@ -106,7 +104,7 @@ the formatter: You can configure ESLint's `nodePath` setting: -```json +```json [settings] { "lsp": { "eslint": { @@ -124,7 +122,7 @@ You can configure ESLint's `problems` setting. For example, here's how to set `problems.shortenToSingleLine`: -```json +```json [settings] { "lsp": { "eslint": { @@ -142,7 +140,7 @@ For example, here's how to set `problems.shortenToSingleLine`: You can configure ESLint's `rulesCustomizations` setting: -```json +```json [settings] { "lsp": { "eslint": { @@ -161,7 +159,7 @@ You can configure ESLint's `rulesCustomizations` setting: You can configure ESLint's `workingDirectory` setting: -```json +```json [settings] { "lsp": { "eslint": { @@ -191,7 +189,7 @@ If your use-case isn't covered by any of these, you can take full control by add ### Debug the current file -```json +```json [debug] [ { "adapter": "JavaScript", @@ -208,7 +206,7 @@ This implicitly runs the current file using `node`. ### Launch a web app in Chrome -```json +```json [debug] [ { "adapter": "JavaScript", diff --git a/docs/src/languages/json.md b/docs/src/languages/json.md index 94f56999d51a3e2395f481be67d267172ba07075..33acdb172e40f0d94a3517dadb70efb37a50e635 100644 --- a/docs/src/languages/json.md +++ b/docs/src/languages/json.md @@ -16,7 +16,7 @@ If you use files with the `*.jsonc` extension when using `Format Document` or ha To workaround this behavior you can add the following to your `.prettierrc` configuration file: -```json +```json [settings] { "overrides": [ { @@ -40,7 +40,7 @@ To specify a schema inline with your JSON files, add a `$schema` top level key l For example to for a `.luarc.json` for use with [lua-language-server](https://github.com/LuaLS/lua-language-server/): -```json +```json [settings] { "$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json", "runtime.version": "Lua 5.4" @@ -53,7 +53,7 @@ You can alternatively associate JSON Schemas with file paths by via Zed LSP sett To -```json +```json [settings] "lsp": { "json-language-server": { "settings": { diff --git a/docs/src/languages/jsonnet.md b/docs/src/languages/jsonnet.md index df4e39b98dc87deff5c56c0a51bf120c81055aa4..405087766b33d3cfe126bfd98c04cff9989cb857 100644 --- a/docs/src/languages/jsonnet.md +++ b/docs/src/languages/jsonnet.md @@ -11,7 +11,7 @@ Workspace configuration options can be passed to the language server via the `ls The following example enables support for resolving [tanka](https://tanka.dev) import paths in `jsonnet-language-server`: -```json +```json [settings] { "lsp": { "jsonnet-language-server": { diff --git a/docs/src/languages/kotlin.md b/docs/src/languages/kotlin.md index 3955062a77783629c0bd838f7dd093af31f3aa0d..a81643ab7d5a20b8985a6bfb3e23d214077c5d6b 100644 --- a/docs/src/languages/kotlin.md +++ b/docs/src/languages/kotlin.md @@ -11,10 +11,16 @@ Report issues to: [https://github.com/zed-extensions/kotlin/issues](https://gith Workspace configuration options can be passed to the language server via lsp settings in `settings.json`. +The full list of lsp `settings` can be found +[here](https://github.com/fwcd/kotlin-language-server/blob/main/server/src/main/kotlin/org/javacs/kt/Configuration.kt) +under `class Configuration` and initialization_options under `class InitializationOptions`. + +### JVM Target + The following example changes the JVM target from `default` (which is 1.8) to `17`: -```json +```json [settings] { "lsp": { "kotlin-language-server": { @@ -30,5 +36,20 @@ The following example changes the JVM target from `default` (which is 1.8) to } ``` -The full list of workspace configuration options can be found -[here](https://github.com/fwcd/kotlin-language-server/blob/main/server/src/main/kotlin/org/javacs/kt/Configuration.kt). +### JAVA_HOME + +To use a specific java installation, just specify the `JAVA_HOME` environment variable with: + +```json [settings] +{ + "lsp": { + "kotlin-language-server": { + "binary": { + "env": { + "JAVA_HOME": "/Users/whatever/Applications/Work/Android Studio.app/Contents/jbr/Contents/Home" + } + } + } + } +} +``` diff --git a/docs/src/languages/lua.md b/docs/src/languages/lua.md index 7e92b12b919ef2537b0fa6785a6438ef0039deda..65b709b39188753a29a50119f04b6141ad12d849 100644 --- a/docs/src/languages/lua.md +++ b/docs/src/languages/lua.md @@ -9,7 +9,7 @@ Lua support is available through the [Lua extension](https://github.com/zed-exte To configure LuaLS you can create a `.luarc.json` file in the root of your workspace. -```json +```json [settings] { "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json", "runtime.version": "Lua 5.4", @@ -55,7 +55,7 @@ cd .. && git clone https://github.com/notpeter/playdate-luacats Then in your `.luarc.json`: -```json +```json [settings] { "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json", "runtime.version": "Lua 5.4", @@ -90,7 +90,7 @@ To enable [Inlay Hints](../configuring-languages.md#inlay-hints) for LuaLS in Ze 1. Add the following to your Zed settings.json: -```json +```json [settings] "languages": { "Lua": { "inlay_hints": { @@ -111,7 +111,7 @@ To enable [Inlay Hints](../configuring-languages.md#inlay-hints) for LuaLS in Ze To enable auto-formatting with your LuaLS (provided by [CppCXY/EmmyLuaCodeStyle](https://github.com/CppCXY/EmmyLuaCodeStyle)) make sure you have `"format.enable": true,` in your .luarc.json: -```json +```json [settings] { "$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json", "format.enable": true @@ -120,7 +120,7 @@ To enable auto-formatting with your LuaLS (provided by [CppCXY/EmmyLuaCodeStyle] Then add the following to your Zed `settings.json`: -```json +```json [settings] { "languages": { "Lua": { @@ -140,7 +140,7 @@ Alternatively to use [StyLua](https://github.com/JohnnyMorganz/StyLua) for auto- 1. Install [StyLua](https://github.com/JohnnyMorganz/StyLua): `brew install stylua` or `cargo install stylua --features lua52,lua53,lua54,luau,luajit` (feel free to remove any Lua versions you don't need). 2. Add the following to your `settings.json`: -```json +```json [settings] { "languages": { "Lua": { diff --git a/docs/src/languages/luau.md b/docs/src/languages/luau.md index 58d78855a1afdb4ab782aff888ba0bbfb637a364..b99cfc86ac1ea7eb0e0f85a3091e2fc76725fed4 100644 --- a/docs/src/languages/luau.md +++ b/docs/src/languages/luau.md @@ -27,7 +27,7 @@ cargo install stylua --features lua52,lua53,lua54,luau Then add the following to your Zed `settings.json`: -```json +```json [settings] "languages": { "Luau": { "formatter": { diff --git a/docs/src/languages/markdown.md b/docs/src/languages/markdown.md index 38a2b1c43f94b91097bcd0b1dc3301427e1b9685..36ce734f7cfbcc066bb8026568209738655a6be9 100644 --- a/docs/src/languages/markdown.md +++ b/docs/src/languages/markdown.md @@ -25,7 +25,7 @@ def fib(n): Zed supports using Prettier to automatically re-format Markdown documents. You can trigger this manually via the {#action editor::Format} action or via the {#kb editor::Format} keyboard shortcut. Alternately, you can automatically format by enabling [`format_on_save`](../configuring-zed.md#format-on-save) in your settings.json: -```json +```json [settings] "languages": { "Markdown": { "format_on_save": "on" @@ -37,7 +37,7 @@ Zed supports using Prettier to automatically re-format Markdown documents. You c By default Zed will remove trailing whitespace on save. If you rely on invisible trailing whitespace being converted to `
` in Markdown files you can disable this behavior with: -```json +```json [settings] "languages": { "Markdown": { "remove_trailing_whitespace_on_save": false diff --git a/docs/src/languages/nim.md b/docs/src/languages/nim.md index 514810183cf63d5e478bacaf4b61a85fc168cb80..03c2bc0609698eee620ba80a8c82e13f53d6764d 100644 --- a/docs/src/languages/nim.md +++ b/docs/src/languages/nim.md @@ -10,7 +10,7 @@ Report issues to: [https://github.com/foxoman/zed-nim/issues](https://github.com To use [arnetheduck/nph](https://github.com/arnetheduck/nph) as a formatter, follow the [nph installation instructions](https://github.com/arnetheduck/nph?tab=readme-ov-file#installation) and add this to your Zed `settings.json`: -```json +```json [settings] "languages": { "Nim": { "formatter": { diff --git a/docs/src/languages/php.md b/docs/src/languages/php.md index 4e94c134467c5a3484ede7a2146f2f09c172e859..40c7f9a838e0435b952b25bb0072153ac2fcf4ec 100644 --- a/docs/src/languages/php.md +++ b/docs/src/languages/php.md @@ -31,7 +31,7 @@ which php To switch to `intelephense`, add the following to your `settings.json`: -```json +```json [settings] { "languages": { "PHP": { @@ -43,7 +43,7 @@ To switch to `intelephense`, add the following to your `settings.json`: To use the premium features, you can place your [licence.txt file](https://intelephense.com/faq.html) at `~/intelephense/licence.txt` inside your home directory. Alternatively, you can pass the licence key or a path to a file containing the licence key as an initialization option for the `intelephense` language server. To do this, add the following to your `settings.json`: -```json +```json [settings] { "lsp": { "intelephense": { diff --git a/docs/src/languages/powershell.md b/docs/src/languages/powershell.md index d4d706425663c494e66ce0c18d8bf801d94cf910..195ce4ad36ddfb9ddea2e3a759bb7c4ae695d7f1 100644 --- a/docs/src/languages/powershell.md +++ b/docs/src/languages/powershell.md @@ -24,7 +24,7 @@ The Zed PowerShell extensions will attempt to download [PowerShell Editor Servic If want to use a specific binary, you can specify in your that in your Zed settings.json: -```json +```json [settings] "lsp": { "powershell-es": { "binary": { diff --git a/docs/src/languages/proto.md b/docs/src/languages/proto.md index d8feaf4c42f49d17af0135f8876a90ee01bf8679..8d9b8350faa366f3981ab945ff3ffca344fa8c70 100644 --- a/docs/src/languages/proto.md +++ b/docs/src/languages/proto.md @@ -30,7 +30,7 @@ which protols ## Configuration -```json +```json [settings] "lsp": { "protobuf-language-server": { "binary": { @@ -62,7 +62,7 @@ ColumnLimit: 120 Or you can have zed directly invoke `clang-format` by specifying it as a [formatter](https://zed.dev/docs/configuring-zed#formatter) in your settings: -```json +```json [settings] "languages": { "Proto": { "format_on_save": "on", diff --git a/docs/src/languages/python.md b/docs/src/languages/python.md index 5d90065de055b3dd5568f0093ac4ba49f4bb0536..c9e9cbcdbe1c35ab1d415bf1fd00151c1548a4dc 100644 --- a/docs/src/languages/python.md +++ b/docs/src/languages/python.md @@ -1,59 +1,136 @@ -# Python +# How to Set Up Python in Zed Python support is available natively in Zed. - Tree-sitter: [tree-sitter-python](https://github.com/zed-industries/tree-sitter-python) - Language Servers: + - [DetachHead/basedpyright](https://github.com/DetachHead/basedpyright) + - [astral-sh/ruff](https://github.com/astral-sh/ruff) + - [astral-sh/ty](https://github.com/astral-sh/ty) - [microsoft/pyright](https://github.com/microsoft/pyright) - [python-lsp/python-lsp-server](https://github.com/python-lsp/python-lsp-server) (PyLSP) - Debug Adapter: [debugpy](https://github.com/microsoft/debugpy) -## Language Servers +## Install Python -Zed supports multiple Python language servers some of which may require configuration to work properly. +You'll need both Zed and Python installed before you can begin. -See: [Working with Language Servers](https://zed.dev/docs/configuring-languages#working-with-language-servers) for more information. +### Step 1: Install Python -## Virtual Environments in the Terminal {#terminal-detect_venv} +Zed does not bundle a Python runtime, so you’ll need to install one yourself. +Choose one of the following options: -Zed will detect Python virtual environments and automatically activate them in terminal if available. -See: [detect_venv documentation](../configuring-zed.md#terminal-detect_venv) for more. +- uv (recommended) -## PyLSP +```bash +curl -LsSf https://astral.sh/uv/install.sh | sh +``` -[python-lsp-server](https://github.com/python-lsp/python-lsp-server/), more commonly known as PyLSP, by default integrates with a number of external tools (autopep8, mccabe, pycodestyle, yapf) while others are optional and must be explicitly enabled and configured (flake8, pylint). +To learn more, visit [Astral’s installation guide](https://docs.astral.sh/uv/getting-started/installation/). -See [Python Language Server Configuration](https://github.com/python-lsp/python-lsp-server/blob/develop/CONFIGURATION.md) for more. +- Homebrew: + +```bash +brew install python +``` + +- Python.org installer: Download the latest version from [python.org/downloads](https://python.org/downloads). + +### Step 2: Verify Python Installation + +Confirm Python is installed and available in your shell: + +```bash +python3 --version +``` + +You should see an output like `Python 3.x.x`. + +## Open Your First Python Project in Zed + +Once Zed and Python are installed, open a folder containing Python code to start working. + +### Step 1: Launch Zed with a Python Project + +Open Zed. +From the menu bar, choose File > Open Folder, or launch from the terminal: + +```bash +zed path/to/your/project +``` + +Zed will recognize `.py` files automatically using its native tree-sitter-python parser, with no plugins or manual setup required. + +### Step 2: Use the Integrated Terminal (Optional) + +Zed includes an integrated terminal, accessible from the bottom panel. If Zed detects that your project is using a [virtual environment](#virtual-environments), it will be activated automatically in newly-created terminals. You can configure this behavior with the [`detect_venv`](../configuring-zed.md#terminal-detect_venv) setting. + +## Configure Python Language Servers in Zed -## PyRight +Zed provides several Python language servers out of the box. By default, [basedpyright](https://github.com/DetachHead/basedpyright) is the primary language server, and [Ruff](https://github.com/astral-sh/ruff) is used for formatting and linting. -### PyRight Configuration +Other built-in language servers are: -The [pyright](https://github.com/microsoft/pyright) language server offers flexible configuration options specified in a JSON-formatted text configuration. By default, the file is called `pyrightconfig.json` and is located within the root directory of your project. Pyright settings can also be specified in a `[tool.pyright]` section of a `pyproject.toml` file. A `pyrightconfig.json` file always takes precedence over `pyproject.toml` if both are present. +- [Ty](https://docs.astral.sh/ty/)—Up-and-coming language server from Astral, built for speed. +- [Pyright](https://github.com/microsoft/pyright)—The basis for basedpyright. +- [PyLSP](https://github.com/python-lsp/python-lsp-server)—A plugin-based language server that integrates with tools like `pycodestyle`, `autopep8`, and `yapf`. -For more information, see the Pyright [configuration documentation](https://microsoft.github.io/pyright/#/configuration). +These are disabled by default, but can be enabled in your settings. For example: -### PyRight Settings +```json [settings] +{ + "languages": { + "Python": { + "language_servers": [ + // Disable basedpyright and enable Ty, and otherwise + // use the default configuration. + "ty", + "!basedpyright", + "..." + ] + } + } +} +``` + +See: [Working with Language Servers](https://zed.dev/docs/configuring-languages#working-with-language-servers) for more information about how to enable and disable language servers. + +### Basedpyright + +[basedpyright](https://docs.basedpyright.com/latest/) is the primary Python language server in Zed beginning with Zed v0.204.0. It provides core language server functionality like navigation (go to definition/find all references) and type checking. Compared to Pyright, it adds support for additional language server features (like inlay hints) and checking rules. + +Note that while basedpyright in isolation defaults to the `recommended` [type-checking mode](https://docs.basedpyright.com/latest/benefits-over-pyright/better-defaults/#typecheckingmode), Zed configures it to use the less-strict `standard` mode by default, which matches the behavior of Pyright. You can set the type-checking mode for your project using the `typeCheckingMode` setting in `pyrightconfig.json` or `pyproject.toml`, which will override Zed's default. Read on more for more details about how to configure basedpyright. + +#### Basedpyright Configuration + +basedpyright reads configuration options from two different kinds of sources: -The [pyright](https://github.com/microsoft/pyright) language server also accepts specific LSP-related settings, not necessarily connected to a project. These can be changed in the `lsp` section of your `settings.json`. +- Language server settings ("workspace configuration"), which must be configured per-editor (using `settings.json` in Zed's case) but apply to all projects opened in that editor +- Configuration files (`pyrightconfig.json`, `pyproject.toml`), which are editor-independent but specific to the project where they are placed + +As a rule of thumb, options that are only relevant when using basedpyright from an editor must be set in language server settings, and options that are relevant even if you're running it [as a command-line tool](https://docs.basedpyright.com/latest/configuration/command-line/) must be set in configuration files. Settings related to inlay hints are examples of the first category, and the [diagnostic category](https://docs.basedpyright.com/latest/configuration/config-files/#diagnostic-categories) settings are examples of the second category. + +Examples of both kinds of configuration are provided below. Refer to the basedpyright documentation on [language server settings](https://docs.basedpyright.com/latest/configuration/language-server-settings/) and [configuration files](https://docs.basedpyright.com/latest/configuration/config-files/) for comprehensive lists of available options. + +##### Language server settings + +Language server settings for basedpyright in Zed can be set in the `lsp` section of your `settings.json`. For example, in order to: -- use strict type-checking level - diagnose all files in the workspace instead of the only open files default -- provide the path to a specific Python interpreter +- disable inlay hints on function arguments + +You can use the following configuration: -```json +```json [settings] { "lsp": { - "pyright": { + "basedpyright": { "settings": { - "python.analysis": { + "basedpyright.analysis": { "diagnosticMode": "workspace", - "typeCheckingMode": "strict" - }, - "python": { - "pythonPath": ".venv/bin/python" + "inlayHints.callArgumentNames": false } } } @@ -61,54 +138,103 @@ For example, in order to: } ``` -For more information, see the Pyright [settings documentation](https://microsoft.github.io/pyright/#/settings). +##### Configuration files + +basedpyright reads project-specific configuration from the `pyrightconfig.json` configuration file and from the `[tool.basedpyright]` and `[tool.pyright]` sections of `pyproject.toml` manifests. `pyrightconfig.json` overrides `pyproject.toml` if configuration is present in both places. + +Here's an example `pyrightconfig.json` file that configures basedpyright to use the `strict` type-checking mode and not to issue diagnostics for any files in `__pycache__` directories: + +```json [settings] +{ + "typeCheckingMode": "strict", + "ignore": ["**/__pycache__"] +} +``` + +### PyLSP + +[python-lsp-server](https://github.com/python-lsp/python-lsp-server/), more commonly known as PyLSP, by default integrates with a number of external tools (autopep8, mccabe, pycodestyle, yapf) while others are optional and must be explicitly enabled and configured (flake8, pylint). -### Pyright Virtual environments +See [Python Language Server Configuration](https://github.com/python-lsp/python-lsp-server/blob/develop/CONFIGURATION.md) for more. -A Python [virtual environment](https://docs.python.org/3/tutorial/venv.html) allows you to store all of a project's dependencies, including the Python interpreter and package manager, in a single directory that's isolated from any other Python projects on your computer. +## Virtual Environments -By default, the Pyright language server will look for Python packages in the default global locations. But you can also configure Pyright to use the packages installed in a given virtual environment. +[Virtual environments](https://docs.python.org/3/library/venv.html) are a useful tool for fixing a Python version and set of dependencies for a specific project, in a way that's isolated from other projects on the same machine. Zed has built-in support for discovering, configuring, and activating virtual environments, based on the language-agnostic concept of a [toolchain](../toolchains.md). -To do this, create a JSON file called `pyrightconfig.json` at the root of your project. This file must include two keys: +Note that if you have a global Python installation, it is also counted as a toolchain for Zed's purposes. -- `venvPath`: a relative path from your project directory to any directory that _contains_ one or more virtual environment directories -- `venv`: the name of a virtual environment directory +### Create a Virtual Environment -For example, a common approach is to create a virtual environment directory called `.venv` at the root of your project directory with the following commands: +If your project doesn't have a virtual environment set up already, you can create one as follows: -```sh -# create a virtual environment in the .venv directory +```bash python3 -m venv .venv -# set up the current shell to use that virtual environment -source .venv/bin/activate ``` -Having done that, you would create a `pyrightconfig.json` with the following content: +Alternatively, if you're using `uv`, running `uv sync` will create a virtual environment the first time you run it. + +### How Zed Uses Python Toolchains + +Zed uses the selected Python toolchain for your project in the following ways: + +- Built-in language servers will be automatically configured with the path to the toolchain's Python interpreter and, if applicable, virtual environment. This is important so that they can resolve dependencies. (Note that language servers provided by extensions can't be automatically configured like this currently.) +- Python tasks (such as pytest tests) will be run using the toolchain's Python interpreter. +- If the toolchain is a virtual environment, the environment's activation script will be run automatically when you launch a new shell in Zed's integrated terminal, giving you convenient access to the selected Python interpreter and dependency set. +- If a built-in language server is installed in the active virtual environment, that binary will be used instead of Zed's private automatically-installed binary. This also applies to debugpy. + +### Selecting a Toolchain + +For most projects, Zed will automatically select the right Python toolchain. In complex projects with multiple virtual environments, it might be necessary to override this selection. You can use the [toolchain selector](../toolchains.md#selecting-toolchains) to pick a toolchain from the list discovered by Zed, or [specify the path to a toolchain manually](../toolchains.md#adding-toolchains-manually) if it's not on the list. + +## Code Formatting & Linting -```json +Zed provides the [Ruff](https://docs.astral.sh/ruff/) formatter and linter for Python code. (Specifically, Zed runs Ruff as an LSP server using the `ruff server` subcommand.) Both formatting and linting are enabled by default, including format-on-save. + +### Configuring formatting + +You can disable format-on-save for Python files in your `settings.json`: + +```json [settings] { - "venvPath": ".", - "venv": ".venv" + "languages": { + "Python": { + "format_on_save": "off" + } + } } ``` -If you prefer to use a `pyproject.toml` file, you can add the following section: +Alternatively, you can use the `black` command-line tool for Python formatting, while keeping Ruff enabled for linting: -```toml -[tool.pyright] -venvPath = "." -venv = ".venv" +```json [settings] +{ + "languages": { + "Python": { + "formatter": { + "external": { + "command": "black", + "arguments": ["--stdin-filename", "{buffer_path}", "-"] + } + } + // Or use `"formatter": null` to disable formatting entirely. + } + } +} ``` -You can also configure this option directly in your `settings.json` file ([pyright settings](#pyright-settings)), as recommended in [Configuring Your Python Environment](https://microsoft.github.io/pyright/#/import-resolution?id=configuring-your-python-environment). +### Configuring Ruff + +Like basedpyright, Ruff reads options from both Zed's language server settings and configuration files (`ruff.toml`) when used in Zed. Unlike basedpyright, _all_ options can be configured in either of these locations, so the choice of where to put your Ruff configuration comes down to whether you want it to be shared between projects but specific to Zed (in which case you should use language server settings), or specific to one project but common to all Ruff invocations (in which case you should use `ruff.toml`). -```json +Here's an example of using language server settings in Zed's `settings.json` to disable all Ruff lints in Zed (while still using Ruff as a formatter): + +```json [settings] { "lsp": { - "pyright": { - "settings": { - "python": { - "pythonPath": ".venv/bin/python" + "ruff": { + "initialization_options": { + "settings": { + "exclude": ["*"] } } } @@ -116,26 +242,42 @@ You can also configure this option directly in your `settings.json` file ([pyrig } ``` -### Code formatting & Linting +And here's an example `ruff.toml` with linting and formatting options, adapted from the Ruff documentation: -The Pyright language server does not provide code formatting or linting. If you want to detect lint errors and reformat your Python code upon saving, you'll need to set up. +```toml +[lint] +# Avoid enforcing line-length violations (`E501`) +ignore = ["E501"] -A common tool for formatting Python code is [Ruff](https://docs.astral.sh/ruff/). It is another tool written in Rust, an extremely fast Python linter and code formatter. It is available through the [Ruff extension](https://github.com/zed-industries/zed/tree/main/extensions/ruff/). To configure the Ruff extension to work within Zed, see the setup documentation [here](https://docs.astral.sh/ruff/editors/setup/#zed). +[format] +# Use single quotes when formatting. +quote-style = "single" +``` - +For more details, refer to the Ruff documentation about [configuration files](https://docs.astral.sh/ruff/configuration/) and [language server settings](https://docs.astral.sh/ruff/editors/settings/), and the [list of options](https://docs.astral.sh/ruff/settings/). ## Debugging -Zed supports zero-configuration debugging of Python module entry points and pytest tests. -Run {#action debugger::Start} ({#kb debugger::Start}) to see a contextual list for the current project. -For greater control, you can add debug configurations to `.zed/debug.json`. See the examples below. +Zed supports Python debugging through the `debugpy` adapter. You can start with no configuration or define custom launch profiles in `.zed/debug.json`. + +### Start Debugging with No Setup + +Zed can automatically detect debuggable Python entry points. Press F4 (or run debugger: start from the Command Palette) to see available options for your current project. +This works for: + +- Python scripts +- Modules +- pytest tests + +Zed uses `debugpy` under the hood, but no manual adapter configuration is required. -### Debug Active File +### Define Custom Debug Configurations -```json +For reusable setups, create a `.zed/debug.json` file in your project root. This gives you more control over how Zed runs and debugs your code. + +#### Debug Active File + +```json [debug] [ { "label": "Python Active File", @@ -146,9 +288,11 @@ For greater control, you can add debug configurations to `.zed/debug.json`. See ] ``` -### Flask App +This runs the file currently open in the editor. + +#### Debug a Flask App -For a common Flask Application with a file structure similar to the following: +For projects using Flask, you can define a full launch configuration: ``` .venv/ @@ -165,7 +309,7 @@ requirements.txt …the following configuration can be used: -```json +```json [debug] [ { "label": "Python: Flask", @@ -190,3 +334,22 @@ requirements.txt } ] ``` + +These can be combined to tailor the experience for web servers, test runners, or custom scripts. + +## Troubleshoot and Maintain a Productive Python Setup + +Zed is designed to minimize configuration overhead, but occasional issues can still arise—especially around environments, language servers, or tooling. Here's how to keep your Python setup working smoothly. + +### Resolve Language Server Startup Issues + +If a language server isn't responding or features like diagnostics or autocomplete aren't available: + +- Check your Zed log (using the {#action zed::OpenLog} action) for errors related to the language server you're trying to use. This is where you're likely to find useful information if the language server failed to start up at all. +- Use the language server logs view to understand the lifecycle of the affected language server. You can access this view using the {#action dev::OpenLanguageServerLogs} action, or by clicking the lightning bolt icon in the status bar and selecting your language server. The most useful pieces of data in this view are: + - "Server Logs", which shows any errors printed by the language server + - "Server Info", which shows details about how the language server was started +- Verify your `settings.json` or `pyrightconfig.json` is syntactically correct. +- Restart Zed to reinitialize language server connections, or try restarting the language server using the {#action editor::RestartLanguageServer} + +If the language server is failing to resolve imports, and you're using a virtual environment, make sure that the right environment is chosen in the selector. You can use "Server Info" view to confirm which virtual environment Zed is sending to the language server—look for the `* Configuration` section at the end. diff --git a/docs/src/languages/r.md b/docs/src/languages/r.md index 226a6f866846da43a3f32668dd19e1efb3f657ce..4907d09c5e5daaa32d081ff0da618f5b26cd577b 100644 --- a/docs/src/languages/r.md +++ b/docs/src/languages/r.md @@ -72,7 +72,7 @@ You can configure the [R languageserver settings](https://github.com/REditorSupp For example to disable Lintr linting and suppress code snippet suggestions (both enabled by default): -```json +```json [settings] { "lsp": { "r_language_server": { diff --git a/docs/src/languages/ruby.md b/docs/src/languages/ruby.md index ef4b026db1db85ccf9104fdd3522ea27d2e1b50f..1bed46fe4f2521b02ecd1a15d852253e85f0ef54 100644 --- a/docs/src/languages/ruby.md +++ b/docs/src/languages/ruby.md @@ -9,6 +9,7 @@ Ruby support is available through the [Ruby extension](https://github.com/zed-ex - [ruby-lsp](https://github.com/Shopify/ruby-lsp) - [solargraph](https://github.com/castwide/solargraph) - [rubocop](https://github.com/rubocop/rubocop) + - [Herb](https://herb-tools.dev) - Debug Adapter: [`rdbg`](https://github.com/ruby/debug) The Ruby extension also provides support for ERB files. @@ -27,6 +28,7 @@ In addition to these two language servers, Zed also supports: - [rubocop](https://github.com/rubocop/rubocop) which is a static code analyzer and linter for Ruby. Under the hood, it's also used by Zed as a language server, but its functionality is complimentary to that of solargraph and ruby-lsp. - [sorbet](https://sorbet.org/) which is a static type checker for Ruby with a custom gradual type system. - [steep](https://github.com/soutaro/steep) which is a static type checker for Ruby that leverages Ruby Signature (RBS). +- [Herb](https://herb-tools.dev) which is a language server for ERB files. When configuring a language server, it helps to open the LSP Logs window using the 'dev: Open Language Server Logs' command. You can then choose the corresponding language instance to see any logged information. @@ -44,7 +46,7 @@ For all supported Ruby language servers (`solargraph`, `ruby-lsp`, `rubocop`, `s You can skip step 1 and force using the system executable by setting `use_bundler` to `false` in your settings: -```json +```json [settings] { "lsp": { "": { @@ -64,7 +66,7 @@ You can skip step 1 and force using the system executable by setting `use_bundle To switch to `ruby-lsp`, add the following to your `settings.json`: -```json +```json [settings] { "languages": { "Ruby": { @@ -82,7 +84,7 @@ The Ruby extension also provides support for `rubocop` language server for offen To enable it, add the following to your `settings.json`: -```json +```json [settings] { "languages": { "Ruby": { @@ -94,7 +96,7 @@ To enable it, add the following to your `settings.json`: Or, conversely, you can disable `ruby-lsp` and enable `solargraph` and `rubocop` by adding the following to your `settings.json`: -```json +```json [settings] { "languages": { "Ruby": { @@ -108,7 +110,7 @@ Or, conversely, you can disable `ruby-lsp` and enable `solargraph` and `rubocop` Solargraph has formatting and diagnostics disabled by default. We can tell Zed to enable them by adding the following to your `settings.json`: -```json +```json [settings] { "lsp": { "solargraph": { @@ -129,7 +131,7 @@ Solargraph reads its configuration from a file called `.solargraph.yml` in the r You can pass Ruby LSP configuration to `initialization_options`, e.g. -```json +```json [settings] { "languages": { "Ruby": { @@ -150,7 +152,7 @@ You can pass Ruby LSP configuration to `initialization_options`, e.g. LSP `settings` and `initialization_options` can also be project-specific. For example to use [standardrb/standard](https://github.com/standardrb/standard) as a formatter and linter for a particular project, add this to a `.zed/settings.json` inside your project repo: -```json +```json [settings] { "lsp": { "ruby-lsp": { @@ -167,7 +169,7 @@ LSP `settings` and `initialization_options` can also be project-specific. For ex Rubocop has unsafe autocorrection disabled by default. We can tell Zed to enable it by adding the following to your `settings.json`: -```json +```json [settings] { "languages": { "Ruby": { @@ -198,7 +200,7 @@ Rubocop has unsafe autocorrection disabled by default. We can tell Zed to enable To enable Sorbet, add `\"sorbet\"` to the `language_servers` list for Ruby in your `settings.json`. You may want to disable other language servers if Sorbet is intended to be your primary LSP, or if you plan to use it alongside another LSP for specific features like type checking. -```json +```json [settings] { "languages": { "Ruby": { @@ -222,7 +224,7 @@ For all aspects of installing Sorbet, setting it up in your project, and configu To enable Steep, add `\"steep\"` to the `language_servers` list for Ruby in your `settings.json`. You may need to adjust the order or disable other LSPs depending on your desired setup. -```json +```json [settings] { "languages": { "Ruby": { @@ -238,13 +240,17 @@ To enable Steep, add `\"steep\"` to the `language_servers` list for Ruby in your } ``` +## Setting up Herb + +`Herb` is enabled by default for the `HTML+ERB` language. + ## Using the Tailwind CSS Language Server with Ruby It's possible to use the [Tailwind CSS Language Server](https://github.com/tailwindlabs/tailwindcss-intellisense/tree/HEAD/packages/tailwindcss-language-server#readme) in Ruby and ERB files. In order to do that, you need to configure the language server so that it knows about where to look for CSS classes in Ruby/ERB files by adding the following to your `settings.json`: -```json +```json [settings] { "languages": { "Ruby": { @@ -255,7 +261,7 @@ In order to do that, you need to configure the language server so that it knows "tailwindcss-language-server": { "settings": { "includeLanguages": { - "html/erb": "html", + "html+erb": "html", "ruby": "html" }, "experimental": { @@ -288,7 +294,7 @@ To run tests in your Ruby project, you can set up custom tasks in your local `.z ### Minitest with Rails -```json +```json [tasks] [ { "label": "test $ZED_RELATIVE_FILE -n /$ZED_CUSTOM_RUBY_TEST_NAME/", @@ -309,7 +315,7 @@ To run tests in your Ruby project, you can set up custom tasks in your local `.z Plain minitest does not support running tests by line number, only by name, so we need to use `$ZED_CUSTOM_RUBY_TEST_NAME` instead: -```json +```json [tasks] [ { "label": "-Itest $ZED_RELATIVE_FILE -n /$ZED_CUSTOM_RUBY_TEST_NAME/", @@ -330,7 +336,7 @@ Plain minitest does not support running tests by line number, only by name, so w ### RSpec -```json +```json [tasks] [ { "label": "test $ZED_RELATIVE_FILE:$ZED_ROW", @@ -352,7 +358,7 @@ The Ruby extension provides a debug adapter for debugging Ruby code. Zed's name #### Debug a Ruby script -```json +```json [debug] [ { "label": "Debug current file", @@ -366,7 +372,7 @@ The Ruby extension provides a debug adapter for debugging Ruby code. Zed's name #### Debug Rails server -```json +```json [debug] [ { "label": "Debug Rails server", @@ -388,15 +394,15 @@ The Ruby extension provides a debug adapter for debugging Ruby code. Zed's name To format ERB templates, you can use the `erb-formatter` formatter. This formatter uses the [`erb-formatter`](https://rubygems.org/gems/erb-formatter) gem to format ERB templates. -```jsonc +```json [settings] { - "HTML/ERB": { + "HTML+ERB": { "formatter": { "external": { "command": "erb-formatter", - "arguments": ["--stdin-filename", "{buffer_path}"], - }, - }, - }, + "arguments": ["--stdin-filename", "{buffer_path}"] + } + } + } } ``` diff --git a/docs/src/languages/rust.md b/docs/src/languages/rust.md index 359af7737161a8dff388b0ef849183504fe29207..3d4fe3f8eeb3801a3b87b5c5d0c0c5028f30786b 100644 --- a/docs/src/languages/rust.md +++ b/docs/src/languages/rust.md @@ -16,7 +16,7 @@ TBD: Provide explicit examples not just `....` The following configuration can be used to change the inlay hint settings for `rust-analyzer` in Rust: -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -43,7 +43,7 @@ See [Inlay Hints](https://rust-analyzer.github.io/book/features.html#inlay-hints The `rust-analyzer` target directory can be set in `initialization_options`: -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -67,7 +67,7 @@ By default, Zed will try to find a `rust-analyzer` in your `$PATH` and try to us If you want to install pre-release `rust-analyzer` version instead you can instruct Zed to do so by setting `pre_release` to `true` in your `settings.json`: -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -81,7 +81,7 @@ If you want to install pre-release `rust-analyzer` version instead you can instr If you want to disable Zed looking for a `rust-analyzer` binary, you can set `ignore_system_version` to `true` in your `settings.json`: -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -95,7 +95,7 @@ If you want to disable Zed looking for a `rust-analyzer` binary, you can set `ig If you want to use a binary in a custom location, you can specify a `path` and optional `arguments`: -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -114,7 +114,7 @@ This `"path"` has to be an absolute path. If you want rust-analyzer to provide diagnostics for a target other than your current platform (e.g. for windows when running on macOS) you can use the following Zed lsp settings: -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -139,7 +139,7 @@ rustup target list --installed Zed provides tasks using tree-sitter, but rust-analyzer has an LSP extension method for querying file-related tasks via LSP. This is enabled by default and can be configured as -```json +```json [settings] "lsp": { "rust-analyzer": { "enable_lsp_tasks": true, @@ -191,7 +191,7 @@ Check on save feature is responsible for returning part of the diagnostics based Consider more `rust-analyzer.cargo.` and `rust-analyzer.check.` and `rust-analyzer.diagnostics.` settings from the manual for more fine-grained configuration. Here's a snippet for Zed settings.json (the language server will restart automatically after the `lsp.rust-analyzer` section is edited and saved): -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -225,7 +225,7 @@ Here's a snippet for Zed settings.json (the language server will restart automat If you want rust-analyzer to analyze multiple Rust projects in the same folder that are not listed in `[members]` in the Cargo workspace, you can list them in `linkedProjects` in the local project settings: -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -241,7 +241,7 @@ you can list them in `linkedProjects` in the local project settings: There's a way to get custom completion items from rust-analyzer, that will transform the code according to the snippet body: -```json +```json [settings] { "lsp": { "rust-analyzer": { @@ -300,7 +300,7 @@ For more control, you can add debug configurations to `.zed/debug.json`. See the ### Build binary then debug -```json +```json [debug] [ { "label": "Build & Debug native binary", @@ -321,7 +321,7 @@ For more control, you can add debug configurations to `.zed/debug.json`. See the When you use `cargo build` or `cargo test` as the build command, Zed can infer the path to the output binary. -```json +```json [debug] [ { "label": "Build & Debug native binary", diff --git a/docs/src/languages/sh.md b/docs/src/languages/sh.md index abc8f03a6c051d9484052aad3ea0e453d9fb4fdc..cf88c89bfa29fd12390640a64cb4826678cfa9f5 100644 --- a/docs/src/languages/sh.md +++ b/docs/src/languages/sh.md @@ -8,7 +8,7 @@ Shell Scripts (bash, zsh, dash, sh) are supported natively by Zed. You can configure various settings for Shell Scripts in your Zed User Settings (`~/.config/zed/settings.json`) or Zed Project Settings (`.zed/settings.json`): -```json +```json [settings] "languages": { "Shell Script": { "tab_size": 2, @@ -41,7 +41,7 @@ shfmt --version 3. Configure Zed to automatically format Shell Scripts with `shfmt` on save: -```json +```json [settings] "languages": { "Shell Script": { "format_on_save": "on", diff --git a/docs/src/languages/sql.md b/docs/src/languages/sql.md index 7993450a04c788494116bbd259af84c12d9b0dfc..fd257c9ab0924db9bbc3ffc596a5992ead0dc211 100644 --- a/docs/src/languages/sql.md +++ b/docs/src/languages/sql.md @@ -23,7 +23,7 @@ sql-formatter --version 3. Configure Zed to automatically format SQL with `sql-formatter`: -```json +```json [settings] "languages": { "SQL": { "formatter": { @@ -44,7 +44,7 @@ You can add this to Zed project settings (`.zed/settings.json`) or via your Zed Sql-formatter also allows more precise control by providing [sql-formatter configuration options](https://github.com/sql-formatter-org/sql-formatter#configuration-options). To provide these, create a `.sql-formatter.json` file in your project: -```json +```json [settings] { "language": "postgresql", "tabWidth": 2, @@ -55,7 +55,7 @@ Sql-formatter also allows more precise control by providing [sql-formatter confi When using a `.sql-formatter.json` file you can use a more simplified set of Zed settings since the language need not be specified inline: -```json +```json [settings] "languages": { "SQL": { "formatter": { diff --git a/docs/src/languages/svelte.md b/docs/src/languages/svelte.md index 66d0d0cb50611c765a751552ece6620251daf28c..139195987b1ebb4b78cc19e988c0bbbcf927fb27 100644 --- a/docs/src/languages/svelte.md +++ b/docs/src/languages/svelte.md @@ -9,7 +9,7 @@ Svelte support is available through the [Svelte extension](https://github.com/ze You can modify how certain styles, such as directives and modifiers, appear in attributes: -```json +```json [settings] "syntax": { // Styling for directives (e.g., `class:foo` or `on:click`) (the `on` or `class` part of the attribute). "attribute.function": { @@ -26,7 +26,7 @@ You can modify how certain styles, such as directives and modifiers, appear in a When inlay hints is enabled in Zed, to make the language server send them back, Zed sets the following initialization options: -```json +```json [settings] "inlayHints": { "parameterNames": { "enabled": "all", @@ -53,16 +53,16 @@ When inlay hints is enabled in Zed, to make the language server send them back, To override these settings, use the following: -```json +```json [settings] "lsp": { "svelte-language-server": { "initialization_options": { "configuration": { "typescript": { - ...... + // ...... }, "javascript": { - ...... + // ...... } } } diff --git a/docs/src/languages/swift.md b/docs/src/languages/swift.md index 9b056be5bc8869b18b78e9a2e64ea43db3d8ea90..3462083a3135930d78dec0b2b72e5942c0103b1e 100644 --- a/docs/src/languages/swift.md +++ b/docs/src/languages/swift.md @@ -22,7 +22,7 @@ The extension doesn't attempt to download `lldb-dap` if it's not found. #### Build and debug a Swift binary -```json +```json [debug] [ { "label": "Debug Swift", diff --git a/docs/src/languages/tailwindcss.md b/docs/src/languages/tailwindcss.md index 83b01774020c1332881b359af4014934340f837a..ff20d097e45eb311d49f3c118ed642c11d73e19f 100644 --- a/docs/src/languages/tailwindcss.md +++ b/docs/src/languages/tailwindcss.md @@ -8,17 +8,18 @@ Zed has built-in support for Tailwind CSS autocomplete, linting, and hover previ To configure the Tailwind CSS language server, refer [to the extension settings](https://github.com/tailwindlabs/tailwindcss-intellisense?tab=readme-ov-file#extension-settings) and add them to the `lsp` section of your `settings.json`: -```jsonc +```json [settings] { "lsp": { "tailwindcss-language-server": { "settings": { + "classFunctions": ["cva", "cx"], "experimental": { - "classRegex": ["[cls|className]\\s\\:\\=\\s\"([^\"]*)"], - }, - }, - }, - }, + "classRegex": ["[cls|className]\\s\\:\\=\\s\"([^\"]*)"] + } + } + } + } } ``` @@ -39,7 +40,7 @@ Languages which can be used with Tailwind CSS in Zed: Zed supports Prettier out of the box, which means that if you have the [Tailwind CSS Prettier plugin](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) installed, adding it to your Prettier configuration will make it work automatically: -```json +```json [settings] // .prettierrc { "plugins": ["prettier-plugin-tailwindcss"] diff --git a/docs/src/languages/terraform.md b/docs/src/languages/terraform.md index 401526f16952ab209c41ab9f09bb9e22785c4e40..c1ff03a83a4da8d08639bc64dc354671fd66f5cc 100644 --- a/docs/src/languages/terraform.md +++ b/docs/src/languages/terraform.md @@ -13,7 +13,7 @@ TBD: Add example using `rootModulePaths` to match upstream example https://githu The Terraform language server can be configured in your `settings.json`, e.g.: -```json +```json [settings] { "lsp": { "terraform-ls": { diff --git a/docs/src/languages/typescript.md b/docs/src/languages/typescript.md index 02d2672cb64fce1671ae487bffffd6d84523f7fc..e6ed5a83d204ae6ae14911be7c7e830b4a4ae1aa 100644 --- a/docs/src/languages/typescript.md +++ b/docs/src/languages/typescript.md @@ -16,7 +16,7 @@ TBD: Document the difference between Language servers By default Zed uses [vtsls](https://github.com/yioneko/vtsls) for TypeScript, TSX, and JavaScript files. You can configure the use of [typescript-language-server](https://github.com/typescript-language-server/typescript-language-server) per language in your settings file: -```json +```json [settings] { "languages": { "TypeScript": { @@ -34,7 +34,7 @@ You can configure the use of [typescript-language-server](https://github.com/typ Prettier will also be used for TypeScript files by default. To disable this: -```json +```json [settings] { "languages": { "TypeScript": { @@ -49,7 +49,7 @@ Prettier will also be used for TypeScript files by default. To disable this: `vtsls` may run out of memory on very large projects. We default the limit to 8092 (8 GiB) vs. the default of 3072 but this may not be sufficient for you: -```json +```json [settings] { "lsp": { "vtsls": { @@ -70,7 +70,7 @@ Zed sets the following initialization options to make the language server send b You can override these settings in your Zed `settings.json` when using `typescript-language-server`: -```json +```json [settings] { "lsp": { "typescript-language-server": { @@ -95,7 +95,7 @@ See [typescript-language-server inlayhints documentation](https://github.com/typ When using `vtsls`: -```json +```json [settings] { "lsp": { "vtsls": { @@ -174,7 +174,7 @@ If your use-case isn't covered by any of these, you can take full control by add Given an externally-ran web server (e.g., with `npx serve` or `npx live-server`) one can attach to it and open it with a browser. -```json +```json [debug] [ { "label": "Launch Chrome (TypeScript)", diff --git a/docs/src/languages/xml.md b/docs/src/languages/xml.md index 4318756a101ddd1787d825b06df9425e9b2ac5b9..df3d845d6d258caa5f16432c84fb78da3586fc19 100644 --- a/docs/src/languages/xml.md +++ b/docs/src/languages/xml.md @@ -8,7 +8,7 @@ XML support is available through the [XML extension](https://github.com/sweetppr If you have additional file extensions that are not being automatically recognized as XML just add them to [file_types](../configuring-zed.md#file-types) in your Zed settings: -```json +```json [settings] "file_types": { "XML": ["rdf", "gpx", "kml"] } diff --git a/docs/src/languages/yaml.md b/docs/src/languages/yaml.md index 68167e873430970f2a871065da740659965e2df1..e4845e363671597281cf6cd2d26721cdc1e856fb 100644 --- a/docs/src/languages/yaml.md +++ b/docs/src/languages/yaml.md @@ -9,7 +9,7 @@ YAML support is available natively in Zed. You can configure various [yaml-language-server settings](https://github.com/redhat-developer/yaml-language-server?tab=readme-ov-file#language-server-settings) by adding them to your Zed settings.json in a `yaml-language-server` block under the `lsp` key. For example: -```json +```json [settings] "lsp": { "yaml-language-server": { "settings": { @@ -38,7 +38,7 @@ By default, Zed uses Prettier for formatting YAML files. You can customize the formatting behavior of Prettier. For example to use single-quotes in yaml files add the following to your `.prettierrc` configuration file: -```json +```json [settings] { "overrides": [ { @@ -55,7 +55,7 @@ You can customize the formatting behavior of Prettier. For example to use single To use `yaml-language-server` instead of Prettier for YAML formatting, add the following to your Zed `settings.json`: -```json +```json [settings] "languages": { "YAML": { "formatter": "language_server" @@ -79,7 +79,7 @@ on: You can disable the automatic detection and retrieval of schemas from the JSON Schema if desired: -```json +```json [settings] "lsp": { "yaml-language-server": { "settings": { @@ -99,7 +99,7 @@ Yaml-language-server supports [custom tags](https://github.com/redhat-developer/ For example Amazon CloudFormation YAML uses a number of custom tags, to support these you can add the following to your settings.json: -```json +```json [settings] "lsp": { "yaml-language-server": { "settings": { diff --git a/docs/src/languages/yara.md b/docs/src/languages/yara.md index f95ab2f77820a901c9fe1c63f5394988ab1be087..ba31a97dedc97d7a4c7a4925b30302ab4e33ba57 100644 --- a/docs/src/languages/yara.md +++ b/docs/src/languages/yara.md @@ -1,6 +1,6 @@ # Yara -`Yara` language support in Zed is provided by the [Yara](https://github.com/egibs/yara.zed) extension. Please report issues to [https://github.com/egibs/yara.zed/issues](https://github.com/egibs/yara.zed). +`Yara` language support in Zed is provided by the [Yara language extension](https://github.com/egibs/yara.zed). Please report issues to [https://github.com/egibs/yara.zed/issues](https://github.com/egibs/yara.zed/issues). - Tree-sitter: [egibs/tree-sitter-yara](https://github.com/egibs/tree-sitter-yara) - Language Server: [avast/yls](https://github.com/avast/yls) diff --git a/docs/src/linux.md b/docs/src/linux.md index 4a66445b78902cde0d96ca17dd1e22abaa9ee96d..1b9c061e71cbfc06c1783cbd747b0648721002da 100644 --- a/docs/src/linux.md +++ b/docs/src/linux.md @@ -137,7 +137,7 @@ vkcube > **_Note_**: Try running in both X11 and wayland modes by running `vkcube -m [x11|wayland]`. Some versions of `vkcube` use `vkcube` to run in X11 and `vkcube-wayland` to run in wayland. -This should output a line describing your current graphics setup and show a rotating cube. If this does not work, you should be able to fix it by installing Vulkan compatible GPU drivers, however in some cases (for example running Linux on an Arm-based MacBook) there is no Vulkan support yet. +This should output a line describing your current graphics setup and show a rotating cube. If this does not work, you should be able to fix it by installing Vulkan compatible GPU drivers, however in some cases there is no Vulkan support yet. You can find out which graphics card Zed is using by looking in the Zed log (`~/.local/share/zed/logs/Zed.log`) for `Using GPU: ...`. @@ -151,7 +151,7 @@ If you're using an AMD GPU and Zed crashes when selecting long lines, try settin If you're using an AMD GPU, you might get a 'Broken Pipe' error. Try using the RADV or Mesa drivers. (See [#13880](https://github.com/zed-industries/zed/issues/13880)) -If you are using `amdvlk` you may find that zed only opens when run with `sudo $(which zed)`. To fix this, remove the `amdvlk` and `lib32-amdvlk` packages and install mesa/vulkan instead. ([#14141](https://github.com/zed-industries/zed/issues/14141)). +If you are using `amdvlk`, the default open-source AMD graphics driver, you may find that Zed consistently fails to launch. This is a known issue for some users, for example on Omarchy (see issue [#28851](https://github.com/zed-industries/zed/issues/28851)). To fix this, you will need to use a different driver. We recommend removing the `amdvlk` and `lib32-amdvlk` packages and installing `vulkan-radeon` instead (see issue [#14141](https://github.com/zed-industries/zed/issues/14141)). For more information, the [Arch guide to Vulkan](https://wiki.archlinux.org/title/Vulkan) has some good steps that translate well to most distributions. @@ -368,3 +368,15 @@ xrandr --dpi 192 ``` Replace `192` with your desired DPI value. This affects the system globally and will be used by Zed's automatic RandR detection when `Xft.dpi` is not set. + +### Font rendering parameters + +When using Blade rendering (Linux platforms and self-compiled builds with the Blade renderer enabled), Zed reads `ZED_FONTS_GAMMA` and `ZED_FONTS_GRAYSCALE_ENHANCED_CONTRAST` environment variables for the values to use for font rendering. + +`ZED_FONTS_GAMMA` corresponds to [getgamma](https://learn.microsoft.com/en-us/windows/win32/api/dwrite/nf-dwrite-idwriterenderingparams-getgamma) values. +Allowed range [1.0, 2.2], other values are clipped. +Default: 1.8 + +`ZED_FONTS_GRAYSCALE_ENHANCED_CONTRAST` corresponds to [getgrayscaleenhancedcontrast](https://learn.microsoft.com/en-us/windows/win32/api/dwrite_1/nf-dwrite_1-idwriterenderingparams1-getgrayscaleenhancedcontrast) values. +Allowed range: [0.0, ..), other values are clipped. +Default: 1.0 diff --git a/docs/src/remote-development.md b/docs/src/remote-development.md index e597e7a6c5743f47947bba1b3a068e497ee51faa..b4d7033a3b1d2201fbf35afa096551a2e5232272 100644 --- a/docs/src/remote-development.md +++ b/docs/src/remote-development.md @@ -35,7 +35,7 @@ The remote machine must be able to run Zed's server. The following platforms sho The list of remote servers is stored in your settings file {#kb zed::OpenSettings}. You can edit this list using the Remote Projects dialog {#kb projects::OpenRemote}, which provides some robustness - for example it checks that the connection can be established before writing it to the settings file. -```json +```json [settings] { "ssh_connections": [ { @@ -48,7 +48,7 @@ The list of remote servers is stored in your settings file {#kb zed::OpenSetting Zed shells out to the `ssh` on your path, and so it will inherit any configuration you have in `~/.ssh/config` for the given host. That said, if you need to override anything you can configure the following additional options on each connection: -```json +```json [settings] { "ssh_connections": [ { @@ -66,7 +66,7 @@ Zed shells out to the `ssh` on your path, and so it will inherit any configurati There are two additional Zed-specific options per connection, `upload_binary_over_ssh` and `nickname`: -```json +```json [settings] { "ssh_connections": [ { @@ -91,7 +91,7 @@ Additionally it's worth noting that while you can pass a password on the command If you'd like to be able to connect to ports on your remote server from your local machine, you can configure port forwarding in your settings file. This is particularly useful for developing websites so you can load the site in your browser while working. -```json +```json [settings] { "ssh_connections": [ { @@ -106,7 +106,7 @@ This will cause requests from your local machine to `localhost:8080` to be forwa By default these ports are bound to localhost, so other computers in the same network as your development machine cannot access them. You can set the local_host to bind to a different interface, for example, 0.0.0.0 will bind to all local interfaces. -```json +```json [settings] { "ssh_connections": [ { @@ -125,7 +125,7 @@ By default these ports are bound to localhost, so other computers in the same ne These ports also default to the `localhost` interface on the remote host. If you need to change this, you can also set the remote host: -```json +```json [settings] { "ssh_connections": [ { diff --git a/docs/src/repl.md b/docs/src/repl.md index 92b3d81f24fd7c8c238b56f8681b0b62d0ff93c1..692093007cb066e08d52c4694444eb3e55bf2144 100644 --- a/docs/src/repl.md +++ b/docs/src/repl.md @@ -149,7 +149,7 @@ TBD: Improve Julia REPL instructions Zed automatically detects the available kernels on your system. If you need to configure a different default kernel for a language, you can assign a kernel for any supported language in your `settings.json`. -```json +```json [settings] { "jupyter": { "kernel_selections": { diff --git a/docs/src/snippets.md b/docs/src/snippets.md index 6dc5355907bec47c4bd4f86353c226201bb49586..21aed43452318863b735a9b46cd5399a8bfca1c6 100644 --- a/docs/src/snippets.md +++ b/docs/src/snippets.md @@ -6,7 +6,7 @@ The snippets are located in `~/.config/zed/snippets` directory to which you can ## Example configuration -```json +```json [settings] { // Each snippet must have a name and body, but the prefix and description are optional. // The prefix is used to trigger the snippet, but when omitted then the name is used. @@ -44,7 +44,7 @@ The `feature_paths` option in `simple-completion-language-server` is disabled by If you want to enable it you can add the following to your `settings.json`: -```json +```json [settings] { "lsp": { "snippet-completion-server": { diff --git a/docs/src/tasks.md b/docs/src/tasks.md index b30b722007116d32435936205971419b5652689d..a11988d9a030036ccd3e2602a161771f8288b549 100644 --- a/docs/src/tasks.md +++ b/docs/src/tasks.md @@ -2,7 +2,7 @@ Zed supports ways to spawn (and rerun) commands using its integrated terminal to output the results. These commands can read a limited subset of Zed state (such as a path to the file currently being edited or selected text). -```json +```json [tasks] [ { "label": "Example task", @@ -89,7 +89,7 @@ These variables allow you to pull information from the current editor and use it To use a variable in a task, prefix it with a dollar sign (`$`): -```json +```json [settings] { "label": "echo current file's path", "command": "echo $ZED_FILE" @@ -106,7 +106,7 @@ When working with paths containing spaces or other special characters, please en For example, instead of this (which will fail if the path has a space): -```json +```json [settings] { "label": "stat current file", "command": "stat $ZED_FILE" @@ -115,7 +115,7 @@ For example, instead of this (which will fail if the path has a space): Provide the following: -```json +```json [settings] { "label": "stat current file", "command": "stat", @@ -125,13 +125,34 @@ Provide the following: Or explicitly include escaped quotes like so: -```json +```json [settings] { "label": "stat current file", "command": "stat \"$ZED_FILE\"" } ``` +### Task filtering based on variables + +Task definitions with variables which are not present at the moment the task list is determined are filtered out. +For example, the following task will appear in the spawn modal only if there is a text selection: + +```json [settings] +{ + "label": "selected text", + "command": "echo \"$ZED_SELECTED_TEXT\"" +} +``` + +Set default values to such variables to have such tasks always displayed: + +```json [settings] +{ + "label": "selected text with default", + "command": "echo \"${ZED_SELECTED_TEXT:no text selected}\"" +} +``` + ## Oneshot tasks The same task modal opened via `task: spawn` supports arbitrary bash-like command execution: type a command inside the modal text field, and use `opt-enter` to spawn it. @@ -151,7 +172,7 @@ By default, tasks capture their variables into a context once, and this "resolve This can be controlled with the `"reevaluate_context"` argument to the task: setting it to `true` will force the task to be reevaluated before each run. -```json +```json [keymap] { "context": "Workspace", "bindings": { @@ -164,7 +185,7 @@ This can be controlled with the `"reevaluate_context"` argument to the task: set You can define your own keybindings for your tasks via an additional argument to `task::Spawn`. If you wanted to bind the aforementioned `echo current file's path` task to `alt-g`, you would add the following snippet in your [`keymap.json`](./key-bindings.md) file: -```json +```json [keymap] { "context": "Workspace", "bindings": { @@ -176,7 +197,7 @@ You can define your own keybindings for your tasks via an additional argument to Note that these tasks can also have a 'target' specified to control where the spawned task should show up. This could be useful for launching a terminal application that you want to use in the center area: -```json +```json [tasks] // In tasks.json { "label": "start lazygit", @@ -184,7 +205,7 @@ This could be useful for launching a terminal application that you want to use i } ``` -```json +```json [keymap] // In keymap.json { "context": "Workspace", @@ -207,7 +228,7 @@ Zed supports overriding the default action for inline runnable indicators via wo To tag a task, add the runnable tag name to the `tags` field on the task template: -```json +```json [settings] { "label": "echo current file's path", "command": "echo $ZED_FILE", diff --git a/docs/src/telemetry.md b/docs/src/telemetry.md index 46c39a88aeecfb5e8172001af67bcf30b339d984..8dca8c1ee6fc9168dd384796292ffb3063027e71 100644 --- a/docs/src/telemetry.md +++ b/docs/src/telemetry.md @@ -9,7 +9,7 @@ To enable or disable some or all telemetry types, open your `settings.json` file Insert and tweak the following: -```json +```json [settings] "telemetry": { "diagnostics": false, "metrics": false diff --git a/docs/src/themes.md b/docs/src/themes.md index 363c99f065a711634e78e3b6093b9069fa7d2c7d..c0706cbf31e39f057c47dec55365113d8ce6009c 100644 --- a/docs/src/themes.md +++ b/docs/src/themes.md @@ -20,7 +20,7 @@ Your selected theme is stored in your settings file. You can open your settings By default, Zed maintains two themes: one for light mode and one for dark mode. You can set the mode to `"dark"` or `"light"` to ignore the current system mode. -```json +```json [settings] { "theme": { "mode": "system", @@ -36,7 +36,7 @@ To override specific attributes of a theme, use the `experimental.theme_override For example, add the following to your `settings.json` if you wish to override the background color of the editor and display comments and doc comments as italics: -```json +```json [settings] { "experimental.theme_overrides": { "editor.background": "#333", diff --git a/docs/src/toolchains.md b/docs/src/toolchains.md new file mode 100644 index 0000000000000000000000000000000000000000..68e7baa8cf225d85862eadb0ef02674f84b59fd2 --- /dev/null +++ b/docs/src/toolchains.md @@ -0,0 +1,31 @@ +# Toolchains + +Zed projects offer a dedicated UI for toolchain selection, which lets you pick a set of tools for working with a given language in a current project. + +Imagine you're working with Python project, which has virtual environments that encapsulate a set of dependencies of your project along with a suitable interpreter to run it with. The language server has to know which virtual environment you're working with, as it uses it to understand your project's code. +With toolchain selector, you don't need to spend time configuring your language server to point it at the right virtual environment directory—you can just select the right virtual environment (toolchain) from a dropdown. + +You can even select different toolchains for different subprojects within your Zed project. A definition of a subproject is language-specific. +In collaborative scenarios, only the project owner can see and modify an active toolchain. + +In [remote projects](./remote-development.md), you can use the toolchain selector to control the active toolchain on the SSH host. When [sharing your project](./collaboration.md), the toolchain selector is not available to guests. + +## Why do we need toolchains? + +The active toolchain is relevant for launching language servers, which may need it to function properly—it may not be able to resolve dependencies, which in turn may make functionalities like "Go to definition" or "Code completions" unavailable. + +The active toolchain is also relevant when launching a shell in the terminal panel: some toolchains provide "activation scripts" for shells, which make those toolchains available in the shell environment for your convenience. Zed will run these activation scripts automatically when you create a new terminal. + +This also applies to [tasks](./tasks.md)—Zed tasks behave "as if" you opened a new terminal tab and ran a given task invocation yourself, which in turn means that Zed task execution is affected by the active toolchain and its activation script. + +## Selecting toolchains + +The active toolchain (if there is one) is displayed in the status bar (on the right hand side). Click on it to access the toolchain selector—you can also use an action from a command palette ({#action toolchain::Select}). + +Zed will automatically infer a set of toolchains to choose from based on the project you're working with. A default will also be selected on your behalf on a best-effort basis when you open a project for the first time. + +The toolchain selection applies to a current subproject, which—depending on the structure of your Zed project—might be your whole project or just a subset of it. For example, if you have a monorepo with multiple subprojects, you might want to select a different toolchain for each subproject. + +## Adding toolchains manually + +If automatic detection does not suffice for you, you can add toolchains manually. To do that, click on the "Add toolchain" button in the toolchain selector. From there you can provide a path to a toolchain and set a name of your liking for it. diff --git a/docs/src/vim.md b/docs/src/vim.md index b55faaf3b63b3ea25093a90d7c26769ee8ca84c9..4eba076b70decdd59a7b771f933a3a50bc9189e7 100644 --- a/docs/src/vim.md +++ b/docs/src/vim.md @@ -39,7 +39,7 @@ If you missed this, you can toggle vim mode on or off anytime by opening the com > **Note**: This command toggles the following property in your user settings: > -> ```json +> ```json [settings] > { > "vim_mode": true > } @@ -47,7 +47,7 @@ If you missed this, you can toggle vim mode on or off anytime by opening the com ## Zed-specific features -Zed is built on a modern foundation that (among other things) uses tree-sitter and language servers to understand the content of the file you're editing and supports multiple cursors out of the box. +Zed is built on a modern foundation that (among other things) uses Tree-sitter and language servers to understand the content of the file you're editing and supports multiple cursors out of the box. Vim mode has several "core Zed" key bindings that will help you make the most of Zed's specific feature set. @@ -82,9 +82,9 @@ The following commands use the language server to help you navigate and refactor | Unstage and next (in diff view) | `d U` | | Restore change | `d p` | -### Treesitter +### Tree-sitter -Treesitter is a powerful tool that Zed uses to understand the structure of your code. Zed provides motions that change the current cursor position, and text objects that can be used as the target of actions. +Tree-sitter is a powerful tool that Zed uses to understand the structure of your code. Zed provides motions that change the current cursor position, and text objects that can be used as the target of actions. | Command | Default Shortcut | | ------------------------------- | --------------------------- | @@ -117,7 +117,7 @@ if there are no classes, then functions are also used. Similarly `gc` is used to The definition of functions, classes and comments is language dependent, and support can be added to extensions by adding a [`textobjects.scm`]. The definition of arguments and tags operates at -the tree-sitter level, but looks for certain patterns in the parse tree and is not currently configurable +the Tree-sitter level, but looks for certain patterns in the parse tree and is not currently configurable per language. ### Multi cursor @@ -219,7 +219,7 @@ These text objects implement the behavior of the [mini.ai](https://github.com/ec To use these text objects, you need to add bindings to your keymap. Here's an example configuration that makes them available when using text object operators (`i` and `a`) or change-surrounds (`cs`): -```json +```json [settings] { "context": "vim_operator == a || vim_operator == i || vim_operator == cs", "bindings": { @@ -352,6 +352,7 @@ These commands modify editor options locally for the current buffer. | `:se[t] [no]wrap` | Lines longer than the width of the window will wrap and displaying continues on the next line | | `:se[t] [no]nu[mber]` | Print the line number in front of each line | | `:se[t] [no]r[elative]nu[mber]` | Changes the displayed number to be relative to the cursor | +| `:se[t] [no]i[gnore]c[ase]` | Controls whether the buffer and project search use case-sensitive matching | ### Command mnemonics @@ -376,7 +377,7 @@ In this section, we'll learn how to customize the key bindings of Zed's vim mode Zed's key bindings are evaluated only when the `"context"` property matches your location in the editor. For example, if you add key bindings to the `"Editor"` context, they will only work when you're editing a file. If you add key bindings to the `"Workspace"` context, they will work everywhere in Zed. Here's an example of a key binding that saves when you're editing a file: -```json +```json [settings] { "context": "Editor", "bindings": { @@ -387,12 +388,12 @@ Zed's key bindings are evaluated only when the `"context"` property matches your Contexts are nested, so when you're editing a file, the context is the `"Editor"` context, which is inside the `"Pane"` context, which is inside the `"Workspace"` context. That's why any key bindings you add to the `"Workspace"` context will work when you're editing a file. Here's an example: -```json +```json [keymap] // This key binding will work when you're editing a file. It comes built into Zed by default as the workspace: save command. { "context": "Workspace", "bindings": { - "ctrl-s": "file::Save" + "ctrl-s": "workspace::Save" } } ``` @@ -418,7 +419,7 @@ Vim mode adds several contexts to the `"Editor"` context: Here's a template with useful vim mode contexts to help you customize your vim mode key bindings. You can copy it and integrate it into your user keymap. -```json +```json [keymap] [ { "context": "VimControl && !menu", @@ -457,7 +458,7 @@ By default, you can navigate between the different files open in the editor with But you cannot use the same shortcuts to move between all the editor docks (the terminal, project panel, assistant panel, ...). If you want to use the same shortcuts to navigate to the docks, you can add the following key bindings to your user keymap. -```json +```json [settings] { "context": "Dock", "bindings": { @@ -472,7 +473,7 @@ But you cannot use the same shortcuts to move between all the editor docks (the Subword motion, which allows you to navigate and select individual words in camelCase or snake_case, is not enabled by default. To enable it, add these bindings to your keymap. -```json +```json [settings] { "context": "VimControl && !menu && vim_mode != operator", "bindings": { @@ -486,7 +487,7 @@ Subword motion, which allows you to navigate and select individual words in came Vim mode comes with shortcuts to surround the selection in normal mode (`ys`), but it doesn't have a shortcut to add surrounds in visual mode. By default, `shift-s` substitutes the selection (erases the text and enters insert mode). To use `shift-s` to add surrounds in visual mode, you can add the following object to your keymap. -```json +```json [settings] { "context": "vim_mode == visual", "bindings": { @@ -497,7 +498,7 @@ Vim mode comes with shortcuts to surround the selection in normal mode (`ys`), b In non-modal text editors, cursor navigation typically wraps when moving past line ends. Zed, however, handles this behavior exactly like Vim by default: the cursor stops at line boundaries. If you prefer your cursor to wrap between lines, override these keybindings: -```json +```json [settings] // In VimScript, this would look like this: // set whichwrap+=<,>,[,],h,l { @@ -513,7 +514,7 @@ In non-modal text editors, cursor navigation typically wraps when moving past li The [Sneak motion](https://github.com/justinmk/vim-sneak) feature allows for quick navigation to any two-character sequence in your text. You can enable it by adding the following keybindings to your keymap. By default, the `s` key is mapped to `vim::Substitute`. Adding these bindings will override that behavior, so ensure this change aligns with your workflow preferences. -```json +```json [settings] { "context": "vim_mode == normal || vim_mode == visual", "bindings": { @@ -525,7 +526,7 @@ The [Sneak motion](https://github.com/justinmk/vim-sneak) feature allows for qui The [vim-exchange](https://github.com/tommcdo/vim-exchange) feature does not have a default binding for visual mode, as the `shift-x` binding conflicts with the default `shift-x` binding for visual mode (`vim::VisualDeleteLine`). To assign the default vim-exchange binding, add the following keybinding to your keymap: -```json +```json [settings] { "context": "vim_mode == visual", "bindings": { @@ -534,22 +535,23 @@ The [vim-exchange](https://github.com/tommcdo/vim-exchange) feature does not hav } ``` -### Restoring common text editing keybindings +### Restoring common text editing and Zed keybindings If you're using vim mode on Linux or Windows, you may find it overrides keybindings you can't live without: `ctrl+v` to paste, `ctrl+f` to search, etc. You can restore them by copying this data into your keymap: -```json +```json [keymap] { "context": "Editor && !menu", "bindings": { - "ctrl-c": "editor::Copy", // vim default: return to normal mode - "ctrl-x": "editor::Cut", // vim default: decrement - "ctrl-v": "editor::Paste", // vim default: visual block mode - "ctrl-y": "editor::Undo", // vim default: line up - "ctrl-f": "buffer_search::Deploy", // vim default: page down - "ctrl-o": "workspace::Open", // vim default: go back - "ctrl-s": "workspace::Save", // vim default: show signature - "ctrl-a": "editor::SelectAll", // vim default: increment + "ctrl-c": "editor::Copy", // vim default: return to normal mode + "ctrl-x": "editor::Cut", // vim default: decrement + "ctrl-v": "editor::Paste", // vim default: visual block mode + "ctrl-y": "editor::Undo", // vim default: line up + "ctrl-f": "buffer_search::Deploy", // vim default: page down + "ctrl-o": "workspace::Open", // vim default: go back + "ctrl-s": "workspace::Save", // vim default: show signature + "ctrl-a": "editor::SelectAll", // vim default: increment + "ctrl-b": "workspace::ToggleLeftDock" // vim default: down } }, ``` @@ -570,7 +572,7 @@ You can change the following settings to modify vim mode's behavior: Here's an example of adding a digraph for the zombie emoji. This allows you to type `ctrl-k f z` to insert a zombie emoji. You can add as many digraphs as you like. -```json +```json [settings] { "vim": { "custom_digraphs": { @@ -582,7 +584,7 @@ Here's an example of adding a digraph for the zombie emoji. This allows you to t Here's an example of these settings changed: -```json +```json [settings] { "vim": { "default_mode": "insert", @@ -613,7 +615,7 @@ Here are a few general Zed settings that can help you fine-tune your Vim experie Here's an example of these settings changed: -```json +```json [settings] { // Disable cursor blink "cursor_blink": false, diff --git a/docs/src/visual-customization.md b/docs/src/visual-customization.md index 27802888c90b29d7998d47c1668c4015d307476d..89cb3ec1929e6c71f8f832818ef6c54c0219bff2 100644 --- a/docs/src/visual-customization.md +++ b/docs/src/visual-customization.md @@ -10,7 +10,7 @@ Use may install zed extensions providing [Themes](./themes.md) and [Icon Themes] You can preview/choose amongst your installed themes and icon themes with {#action theme_selector::Toggle} ({#kb theme_selector::Toggle}) and ({#action icon_theme_selector::Toggle}) which will modify the following settings: -```json +```json [settings] { "theme": "One Dark", "icon_theme": "Zed (Default)" @@ -19,26 +19,26 @@ You can preview/choose amongst your installed themes and icon themes with {#acti If you would like to use distinct themes for light mode/dark mode that can be set with: -```json +```json [settings] { "theme": { - "dark": "One Dark" + "dark": "One Dark", "light": "One Light", // Mode to use (dark, light) or "system" to follow the OS's light/dark mode (default) - "mode": "system", + "mode": "system" }, "icon_theme": { - "dark": "Zed (Default)" + "dark": "Zed (Default)", "light": "Zed (Default)", // Mode to use (dark, light) or "system" to follow the OS's light/dark mode (default) - "mode": "system", + "mode": "system" } } ``` ## Fonts -```json +```json [settings] // UI Font. Use ".SystemUIFont" to use the default system font (SF Pro on macOS), // or ".ZedSans" for the bundled default (currently IBM Plex) "ui_font_family": ".SystemUIFont", @@ -58,7 +58,7 @@ If you would like to use distinct themes for light mode/dark mode that can be se "font_family": "", "font_size": 15, // Terminal line height: comfortable (1.618), standard(1.3) or `{ "custom": 2 }` - "line_height": "comfortable", + "line_height": "standard", }, // Agent Panel Font Settings @@ -73,7 +73,7 @@ For example `=>` will be displayed as `→` and `!=` will be `≠`. This is pure To disable this behavior use: -```json +```json [settings] { "buffer_font_features": { "calt": false // Disable ligatures @@ -83,7 +83,7 @@ To disable this behavior use: ### Status Bar -```json +```json [settings] { // Whether to show full labels in line indicator or short ones // - `short`: "2 s, 15 l, 32 c" @@ -105,7 +105,7 @@ To disable this behavior use: ### Titlebar -```json +```json [settings] // Control which items are shown/hidden in the title bar "title_bar": { "show_branch_icon": false, // Show/hide branch icon beside branch switcher @@ -120,7 +120,7 @@ To disable this behavior use: ## Workspace -```json +```json [settings] { // Force usage of Zed build in path prompts (file and directory pickers) // instead of OS native pickers (false). @@ -129,10 +129,6 @@ To disable this behavior use: // instead of OS native prompts (false). On linux this is ignored (always false). "use_system_prompts": true, - // Whether to use the system provided dialogs for Open and Save As (true) or - // Zed's built-in keyboard-first pickers (false) - "use_system_path_prompts": true, - // Active pane styling settings. "active_pane_modifiers": { // Inset border size of the active pane, in pixels. @@ -152,7 +148,7 @@ To disable this behavior use: